View Łukasz Herman's LinkedIn profileView my profile

statystyki www stat.pl

Programowanie

niedziela, 28 listopada 2010

Myślałem że skorzystam z IsolatedStorage w ASP.NET, ale wychodzi na to że nie działa to gdy korzystamy z WebService. No trudno...

Najprościej z rejestru. Potrzebowałem poznać jakie dostępne są na serwerze na któym mam wykupiony hosting. Znalazłem kod VB który to robi, przekonwertowałem go na C# (jakimś online'owym konwerterem) i trochę zmodyfikowałem, żeby zwracał mi w miarę czytelnego stringa.

Konwerter.

Oryginalny kod.

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Microsoft.Win32;


namespace DataManager
{
class Module1
{

public String CountASAS()
{
int i = 0;
DictionaryEntry[] de = SearchOleDbProviders();
string wynik = "";

// Displays the ProgID and name of each provider
for (i = 0; i <= de.Length - 1; i++)
{
wynik += de[i].Key + " - ";
wynik += de[i].Value + " ; ";
}

//Waits for user input
return wynik;
}

public DictionaryEntry[] SearchOleDbProviders()
{
DictionaryEntry[] Providers = null;
Int16 nProviders = 0;

nProviders = -1;
Providers = new DictionaryEntry[1];

// I am only interested in the CLSID subtree
RegistryKey keyCLSID = Registry.ClassesRoot.OpenSubKey("CLSID", false);
string[] keys = keyCLSID.GetSubKeyNames();
DictionaryEntry de = default(DictionaryEntry);
Int32 i = 0;

// Search through the tree just one level
for (i = 0; i <= keys.Length - 1; i++)
{
RegistryKey key = keyCLSID.OpenSubKey(keys[i], false);

// Search for OLE DB Providers
de = SearchKeys(key);
if ((de.Key != null))
{
// Found one, add it to the Dictionary
nProviders += 1;
Array.Resize(ref Providers, nProviders + 1);
Providers[nProviders] = de;
}
}
return Providers;
}

public DictionaryEntry SearchKeys(RegistryKey key)
{
Int32 i = default(Int32);
DictionaryEntry de = default(DictionaryEntry);

//Tries to find the "OLE DB Provider" key
RegistryKey key2 = key.OpenSubKey("OLE DB Provider");

if ((key2 != null))
{
// Found it, fills the DictionaryEntry
de = new DictionaryEntry();
string[] sValues = key2.GetValueNames();
de.Key = key.OpenSubKey("ProgID", false).GetValue(sValues[0]);
string[] sValues2 = key2.GetValueNames();
de.Value = key2.GetValue(sValues2[0]);
}
return de;
}
}
}

 

czwartek, 18 listopada 2010

ASP.NET oferuje nam specjalną izolatkę (przestrzeń dyskową) dla naszych aplikacji.

Potrzebując wrzucić na serwer jakiś plik, nie musimy przejmować się poziomem uprawnień użytkownika na którym działa proces IISa, tylko zapisujemy plik korzystając z tej funkcjonalności.

Taki krótki kodzik, który zapisuje przekazany plik, zwracając ścieżkę do katalogu gdzie został zapisany:

public string SaveFile(byte[] binaryFile, string path)
{
 IsolatedStorageFile isf = IsolatedStorageFile.GetStore(
IsolatedStorageScope.User | IsolatedStorageScope.Domain |
IsolatedStorageScope.Assembly, null, null);
 try
 {
 IsolatedStorageFileStream file = new IsolatedStorageFileStream(path, 
FileMode.Create, isf);
 file.Write(binaryFile, 0, binaryFile.Length);
 file.Close();
 }
 catch (Exception ex)
 {
 }

 string path2 = isf.GetType().GetField("m_RootDir", 
BindingFlags.Instance | BindingFlags.NonPublic).GetValue(isf).ToString();
 return path2;

Wrrrr, kto wymyślił wyświetlanie wyjątków w języku polskim? Przecież to się do niczego nie nadaje...

Jak się tego pozbyć? Chyba się nie da. Zmieniać ustawień regionalnych nie mam zamiarua

A zmiana ustawień z poziomu kodu jak to zostało przedstawione w wątku C# - Exception messages in English?, przy każdym wywołaniu przeraża mnie. No trudno, trzeba nauczyć się czytać polskie błędy.

PS. Błąd z tytułu oznacza, że korzystam ze starej wersji sterownika, która nie jest już kompatybilna z tym co chcę zrobić.

środa, 17 listopada 2010

Fajny i bardzo prosty sposób jak zbudować kontrolkę Menu, wraz z implementacją dodatkowych atrybutów które deklarujemy sobie w pliku web.sitemap

W tym wypadku jest to atrybut odpowiedzialny za wyświetlanie, bądź nie, pozycji z pliku mapy strony. Ja dopisałem sobie atrybut odpowiedzialny za klasę CSS. Działa wyśmienicie :)

I bet you didn't know that adding custom attributes to your web.sitemap was this easy!

poniedziałek, 15 listopada 2010

W pisanej aplikacji potrzebuję prostego sprawdzenia czy użytkownik wpisał dobrą zawartość pola. Dokładniej to robię upload plików, chcąc mieć pewność, że podano prawidłową nazwę pliku (lub dobry typ pliku).

Pomyślałem żeby zrobić to poprzez Visual Studio i kontrolkę Validate i sprawdzać wyrażenie regularne. Zalet jest sporo, nie martwimy się o to, jak działa to na różnych przeglądarkach, oraz mamy sprawdzanie kodu po stronie klienta (jeżeli sobie tego zażyczymy) oraz sprawdzanie po stronie serwera (czyli to co najważniejsze).

Minusy?

  • Sprawdzanie po stronie klienta wymaga umieszczania na stronie kodu JavaScript. Tylko kontrolka dodaje cały swój kod, a nie tylko ten, który będziemy wykorzystywać. Po co mi sprawdzanie czy wprowadza się dobrą liczbę, skoro ja sprawdzam tylko wyrażenie regularne?
  • Nawet jak wyłączymy sprawdzanie po stronie klienta, dodawanych jest mnóstwo JavaScriptów, które raczej nie są wykorzystywane.

Napisałem własnego JavaScripta sprawdzającego wyrażenie regularne. Cały kod związany z validacją po stronie klienta to ok. 20 linijek. Nie widzę żadnego sensu wrzucania masy niepotrzebnego kodu na stronę.

Swoją drogą, sprawdzenie tego samego wyrażenia regularnego po stronie serwera to ok. 5 linijek kodu, czyli mniej niż potrzeba na dodanie kontrolki Validator...

Bardzo obszerny post na jednym z blogów. Masa linków powiązanych z tematem uwierzytelniania w aplikacjach ASP.NET, wszystko co związane z tematami: Membership, Roles, Forms Authentication i Security Resources.

ASP.NET 2.0 Membership, Roles, Forms Authentication, and Security Resources

niedziela, 14 listopada 2010

Bardzo ciekawy wpis na jednym z SQLowych blogów. Dlaczego nie powinniśmy korzystać z typu money?

Otóż pociąga za sobą ogromne błędy obliczeniowe. Co prawda nie zawsze spotka to nas, ale lepiej dmuchać na zimne i korzystać ze sprawdzonego typu decimal ;)

Throw Your MONEY Away

Znalazłem fajny opis w jaki sposób dodać zewnętrzny kod JavaScriptowy do mojej kontrolki.

Jest kilka sposobów w jaki możemy odwoływać się do skryptów JS. Ja potrzebowałem aby mój zewnętrzny plik był ładowany zawsze tam, gdzie używam mojej kontrolki.

Rozwiązanie: Creating Custom ASP.NET Server Controls with Embedded JavaScript

Jedyna różnica jest taka, że musiałem ręcznie dodać "[assembly..."  na początku mojej kontrolki, żeby kod JS był widoczny. A dokładniej:

[assembly: WebResource("WI_Controls.Scripts.FileExtensionController.js", "java-script")]

zaraz przed namespace.

 

piątek, 05 listopada 2010

Jakiś czas temu w pracy natknąłem się na dziwną przypadłość w VB Scriptcie. Tworząc procedury lub funkcje, w żaden sposób interpreter nas nie pilnuje czy nie zadeklarowaliśmy tej samej procedury dwa (lub więcej) razy. Pamięta ostatnio zadeklarowaną wersję i z niej możemy korzystać.

Chyba, że skorzystamy z funkcji Execute. Przydaje sięona, gdy chcemy korzystać z funkcji zawartych w zewnętrznych plikach (repozytorium procedur lub coś w tym stylu). Wtedy za każdym razem VB Script wykonuje ostatnio wykonaną funkcję zadeklarowaną przez Execute.

Dim X ' Declare X in global scope.
X = "Global" ' Assign global X a value.

Sub Proc1
Dim X ' Declare X in local scope.
X = "Local" ' Assign local X a value.
' The Execute statement here creates a
' procedure that, when invoked, prints X.
' It print the global X because Proc2
' inherits everything in global scope.
Execute "Sub Proc2: WScript.Echo X: End Sub"
WScript.Echo Eval("X") ' Print local X.
Proc2 ' Invoke Proc2 in Proc1's scope.
End Sub

'Proc2 ' This line causes an error since
' Proc2 is unavailable outside Proc1.
Proc1 ' Invoke Proc1.
Execute "Sub Proc2: WScript.Echo X: End Sub"
Proc2 ' This invocation succeeds because Proc2
' is now available globally.

Warto sobie przeanalizować ten przykład (i trochę pomodyfikować).

Stanąłem przed zastanawiającą kwestią. Potrzebuje uploudować dwa pliki z dysku lokalnego na serwer poprzez WebServices. Wariantów jest sporo. Można skorzystać z kontrolekFileUpload, dodać ręcznie pola wyboru i przyciski, skorzystać z gotowych kontrolek (NeatUpload), albo napisać coś własnego.

Wybrałem (na razie) rozwiązanie bezpośrednie. Napiszę własną kontrolkę (warto się tego nauczyć), która będzie zbudowana z dwóch kontrolek FileUpload.

Teoretycznie najprostszym sposobem byłoby rozszerzenie kontrolki FileUpload o potrzebną mi funkcjonalność, ale potrzebuję co najmniej dwóch takich kontrolek. Wpadłem więc na pomysł, żeby stworzyć własną kontrolkę, która będzie zawierała w sobie inne kontrolki.

Po zrobieniu małego researchu udało mi się dojść do tego, że muszę stworzyć kontrolkę rozszerzając klasę CompositeControl zamiast WebControl (jak to się robi pisząc najprostszą kontrolkę) i to działa bardzo fajnie :)

Wystarczy nadpisać procedurę CreateChildControls i możemy dodawać do własnej kontrolki cokolwiek zapragniemy.

Więcej: http://www.joe-stevens.com/2010/04/16/creating-a-composite-server-control-with-asp-net/

poniedziałek, 01 listopada 2010

Które lepsze? Początkowo planowałem wykorzystać XML WebServices, bo już wcześniej miałem z nimi kontakt. Największą zaletą jest udostępnienie wszystkich danych w czytelnym formacie XML, który interpretować możemy w zasadzie dowolną technologią.

XML pomaga nam również utworzyć kilka różnych wersji aplikacji działających w różnych środowiskach, a opierających się na tych samych danych.

Niestety wadą jest szybkość. Generowanie kodu XML dla każdej, nawet najmniejszej odpowiedzi pociąga za sobą tworzenie wszystkich znaczników, które później trzeba przesłać przez sieć. Wyda się że nie jest tego dużo, ale może się uzbierać. Ponadto gdy pisałem projekt w Adobe FLEX z wykorzystaniem XML WebServices, działało to przerażająco wolno (chociaż łatwo było to oprogramować).

ASP.NET Web Services, albo raczej AJAX WebServices, bo w tym kierunku będę dążył, umożliwiają przesyłanie samych obiektów (więc narzut na przepustowość łącza dużo mniejszy) i od razu mogę działać na danych wyjściowych.

Ponadto przesyłanie plików jest prostsze. W XML WebServices aby przesłać plik, najpierw musiałem przekonwertować go do postaci base64. A później w drugą stronę żeby z tego pliku korzystać. Niestety funkcje dostępne w System.Convert mają ograniczenia, tak że konwersja z base64 dla dużych plików generowała błąd związany z brakiem pamięci. We FLEXie miałem ręcznie napisany algorytm i w ten sposób to działało, teraz nie chce mi się tego pisać na nowo.

Stanęło więc na ASP.NET (AJAX) WebServices.

sobota, 17 marca 2007

Zine .NET jest darmową gazetą dostępną do pobrania w formacie PDF, przeznaczoną dla wszystkich zainteresowanych programowanie w technologii .NET. To już drugi numer.

Pomimo tego, że został wydany dosyć długi okres czasu po numerze pierwszym, powinien pokazywać determinację jego twórców (która wymaga uznania, nie łatwo jest coś takiego poprowadzić).

Druga wersja Zine .Net dostępna jest do pobrania pod adresem http://zine.hostedwindows.pl/files/folders/zine2007/entry62.aspx 

Miejmy nadzieję że kolejne numery zaczną pojawiać się coraz częściej i regularniej. 

środa, 24 stycznia 2007

Microsoft zakończył już prace i udostępnił oficjalnie AJAXa. Pobrać go można pod adresem http://ajax.asp.net/

Z ważnych wiadomości należy powiedzieć o tym, że będzie on w pełni współpracował z przeglądarkami FireFox, Safari, IE i Opera.

Trochę wiej przeczytać możemy na blogu Scotta Guthrie: ASP.NET AJAX 1.0 Released

czwartek, 11 stycznia 2007

Od 10 stycznia można się rejestrować w Trzecich Ogólnopolskich Mistrzostwach Programistów .NET organizowanym przez Microsoft.

W tym roku rozgrywka podzielona została na 3 elementy:

  • test wiedzy (w 3 turach jak było w poprzednich edycjach)
  • stworzenie strony internetowej z wykorzystaniem technologii .NET
  • stworzenie szablonu projektu strony internetowej

Do wygrania wyjazd na konferencję Tech-Ed do Barcelony, Xbox, smartphone, Visual Studio Professional, Vista Ultimate i prenumeraty SDJ.

http://www.mistrz.net.pl/

niedziela, 07 stycznia 2007

Już od jakiegoś czasu dostępne są dodatki Service Pack 1 dla całej serii Express (jak mogłem to przegapić?). Pobrać je możemy na stronie Microsoft® Visual Studio® 2005 Express Editions Service Pack 1

Przy okazji, jeżeli będziemy instalowali SP1 na Viście, a mamy uruchomiony UAC, możemy spotkać się z pewnym opóźnieniem uruchomienia, ponieważ UAC sprawdza podpis cyfrowy wszystkich plików uaktualnienia.

czwartek, 07 grudnia 2006

Jakiś czas temu Microsoft wypuścił XNA. Rozszerzenie Visual Studio pozwalające tworzyć gry w dużo prostszy sposób. Dodatkowo możemy dzięki temu zyskać wieloplatformowość - gry napisane za pomocą XNA działać będą na Windowsie, oraz XBoxie.

Jakiś czas temu zainteresowałem się grafiką trójwymiarową, jak również wykorzystaniem pseudo trzech wymiarów. Myślę, że warto jest podzielić się kilkoma linkami, może się komuś one przydadzą. Oczywiście wszystko opiera się na C# .NET.

http://msdn.microsoft.com/directx/XNA/ - Oficjalna strona Microsoftu poświęcona technologii XNA

http://blogs.msdn.com/xna/

http://blogs.msdn.com/mitchw/ - XNA Framework

http://learnxna.com/default.aspx - bardzo fajny portal oferujący tutoriale wykorzystania XNA.

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=690814&SiteID=1 - wątek na forum MSDN poświęcony zbieraniu tutoriali w których korzystano z XNA.

http://xna.pl/ - polski portal poświęcony XNA.

Ale nie samym XNA człowiek żyje :) Zawsze wydawało mi się, że warto poznać technologię od początku. Używanie pomostów w stylu XNA nieco mnie odpycha, ponieważ zmniejsza nieco moje możliwości w wykonaniu projektu, a w szczególności dogłębniejsze poznanie technologii. Warto czasem zobaczyć jak coś się robi "normalnie".

http://www.gamedev.net/reference/list.asp?categoryid=24 - duży zbiór informacji na temat DirectX

http://www.developerfusion.co.uk/show/4387/3/ - przykład tworzenia gry z jednej z ciekawych książek poświeconych programowaniu w Managed DirectX.

http://www.codeproject.com/csharp/eptaxia.asp - przykład gry.

http://einfall.blogspot.com/2005/02/using-directx-and-c-sharp-to-create.html - Prawdziwy rodzynek. Obszerny, szczegółowy tutorial, prowadzący za rączkę po elementach tworzenia gry w C#. Niestety czasem można napotkać na drobne problemy z działaniem, ponieważ autor pominął jakiś szczegół, lub nie jest dostępna tekstura przez niego stworzona. Ale da się z tym poradzić samemu. Polecam ten tutorial każdemu kto jest zainteresowany wykorzystaniem DirectX w .NETcie.

http://hermanluk.blox.pl/2006/03/Beginning-Game-Development.html - seria artykułów o której już kiedyś pisałem. Również polecam.

Jak będzie to wyglądało w przyszłości? DirectX ma się dobrze, rynek zdominowany jest przez niego od dłuższego czasu. Ale DirectX 10 dostępny będzie tylko na Vistę, co wprowadzi nieco zamieszania. Nie można zawsze zapewniać kompatybilności wstecz, ponieważ utrudnia to znacznie możliwość rozwoju.

Więc osoby chcące grać w gry wykorzystujące DX 10, będą musiały migrować do Vista, albo do... Linuksa :) (OpenGL się rozwija!). Pojawia się niebywała szansa na rozwój OpenGLa, oraz popularyzację Linuksa. Wszystko leży w rękach programistów. Dobra organizacja może znacząco zmienić rozkład sił na rynku systemów operacyjnych! Więc może warto zainteresować się bliżej OGLem?...

An Overview of Microsoft's Direct3D 10 API

wtorek, 21 listopada 2006

Microsoft szykuje się do wprowadzenia nowej wersji bibliotek DirectX, dzięki którym programiści mogą stosować ciekawe efekty na przykład w swych grach. Wraz z Vistą ukaże się DircetX 10, (nie)stety według zapowiedzi dostępny będzie tylko w Viście. Co ma z tym wspólnego OpenGL?

Jak wiadomo MS mocno trzyma rynek, przez co OGL został strącony na margines. Długo nie rozwijany, wręcz w archaicznej wersji. Winić można zarówno Microsoft, ale również producentów kart graficznych. Na szczęście NVIDIA chce to zmienić.

NVIDIA wraz z komitetem standaryzacyjnym OpenGLa opracowały rozszerzenia bibliotek OGL umożliwiających pełne wykorzystanie potencjału kart graficznych zgodnych z DX 10.

Co to zmieni? Przede wszystkim producenci gier będą mogli tworzyć swoje produkcje korzystając z OGLa, co z kolei pociąga za sobą fakt, że gry te będą działały na starszych systemach, takich jak Windows XP (DX10 nie będzie na nim dostępny), oraz różnej maści linuksów i uniksów.

Dotąd niewielu producentów decydowało się na przepisywanie swoich gier aby działały na innej platformie, ale dzięki temu posunięciu NVIDII możliwe będzie większe zaangażowanie programistów na rynku OS, co pociąga za sobą popularyzację linuksa.

Ciekawe czy coś z tego wyniknie :)

źródło: DirectX 10 na Linuksie?

wtorek, 31 października 2006

Jeżeli ktoś chce dopiero rozpocząć swoją przygodę z pisaniem skryptów w systemie Windows, to bardzo dobrym wstępem będzie odwiedzenie strony Sesame Script. Bardzo przydatne przykłady i opisy, które w łatwy sposób będziemy w stanie rozszerzyć, zgodnie z naszymi potrzebami, po zapoznaniu się z tą serią artykułów.

Do tego wystarczy jeszcze dołożyć lekturę działu Hey, Scripting Guy! i mamy prawdziwe kompendium wiedzy o pisaniu skryptów vbs - The Hey, Scripting Guy! Archive. Archiwum dostępne jest również do pobrania (klik)

W pisaniu skryptów pomóc może nam jeszcze jedno narzędzie - Scriptomatic 2.0 

Scritpomatic 2.0

czwartek, 12 października 2006

Która wersja Visty spełni swoje zadania przy użytkowniku będącym programistą aplikacji internetowych? Oczywiście wszystko rozbija się o IIS i jego różnorodność w poszczególnych edycjach Windows Vista.

Już wcześniej pisałem o nowym IISie w kontekście jego dostępności w Windows Vista RC1.

Jednak nie będzie aż tak pięknie i przyjemnie jak się mogliśmy tego spodziewać. W poszczególnych wersjach Visty nie będzie dokładnie tego samego, w pełni funkcjonalnego produktu. W żadnej Viście np. nie będzie możliwości zdalnej administracji IISem, ze względu na przeznaczenie tego systemu.

Ponadto edycje Vista Starter i Vista Home (i jej odmiany z wyjątkiem Home Premium) pozbawione będą właściwego IISa. Będą tam co prawda pewne elementy, lecz nie umożliwiające uruchomienia serwera WWW lub FTP. W tych edycjach limit jednoczesnych żądań do IISa ustalony został tylko na 3.

Vista Premium Edition jest już przeznaczona dla entuzjastów i hobbystów interesujących się tworzeniem aplikacji internetowych. W tej wersji znajduje się IIS zdolny pełnić rolę serwera WWW, lecz pozbawiony funkcji normalnie nie przeznaczonych dla hobbystów (np. nie ma możliwości uruchomienia serwera FTP). W edycji Premium limit jednoczesnych żądań do IISa niestety jest taki sam jak w wersjach niższych (3).

A niby czemu hobbysta ma być gorszy od zawodowca?!

Edycje Vista Professional (czyli Vista Business, Enterprise i Ultimate) zaopatrzone są już we wszystkie składniki potrzebne profesjonalnym web deweloperom do projektowania, budowania i testowania aplikacji internetowych. W tych edycjach limit jednoczesnych żądań do IISa ustalony został na 10. Lecz jest to wciąż wersja nieco uboższa od pełnej, która znajdzie się w Windows Server "Longhorn".

Oczywiście Windows Server "Longhorn" Core pozbawiony będzie możliwości uruchomienia IISa ze względu na swoją specyfikę.

Szczegóły dotyczące wprowadzonych zmian i różnic w IISie pomiędzy poszczególnymi wersjami opisane zostały w artykule: IIS 7 Features and Vista Editions.

środa, 13 września 2006

Tak, to dzisiaj. W 256. dzień roku życzymy wszystkim programistom połamania klawiatur.

Dzień Programisty – święto programistów obchodzone w 256. dniu roku (2^8 = 256 to liczba wartości możliwych do uzyskania w jednym, najbardziej popularnym, czyli 8-bitowym, bajcie). Tradycyjnie, programiści starają się uczcić ten dzień w jakiś niekonwencjonalny sposób. Dzień Programisty wypada 13 września, a w latach przestępnych 12 września.

wtorek, 12 września 2006

Nazwa ATLAS pewnie już od razu mówi czym jest ta technologia, ze względu na bardzo popularne trendy web dwa.zerowate, chociaż nikt tak naprawdę nie wie czym jest web 2.0 :)

AJAX to możliwość asynchronicznego przesyłania danych XML pomiędzy klientem (przeglądarką) a serwerem, bez przeładowania strony. ATLAS jest następcą AJAXa.

Jakiś czas temu ludzie z MS pytali się jak powinna brzmieć oficjalna nazwa technologii będącej dotychczas pod nazwą kodowa "Atlas". Pisałem o tym w sierpniu przedstawiając kilka dziwnych przykładowych nazw - Atlas, czy nie Atlas?

Na szczęście żadna z nich nie jest już aktualna. Za to samego Atlasa nie będzie charakteryzowała jedna nazwa, lecz kilka:

  • Microsoft AJAX Library - czyli biblioteki javascriptowe po stronie przeglądarki
  • ASP.NET 2.0 AJAX Extensions - funkcjonalność po stronie serwera przyjemnie integrująca się z ASP.NET
  • ASP.NET AJAX Control Toolkit - kontrolki i komponenty pozwalające jak najwięcej wyciągnąć z ASP.NET 2.0 AJAX Extensions

"Atlas" 1.0 będzie działał na każdej platformie z każdą przeglądarką (z założenia, bo zawsze znajdzie się jakaś bez obsługi JS :)). Będzie on również działał z Visual Studio 2005, a w Visual Studio "Orcas" spodziewanym na przyszły rok będzie również intellisense dla JS, oraz wsparcie edytora WYSYWIG dla ASP.NET AJAX Extensions.

Premiera "Atlas" 1.0 możemy spodziewać się w okolicy końca roku, a wcześniej udostępniona zostanie jeszcze wersja beta i RC.

Więcej na blogu Scotta Guthrie - "Atlas" 1.0 Naming and Roadmap

czwartek, 07 września 2006

Programowanie gier było dotąd nieco skomplikowane. Aby coś zdziałać w grafice trójwymiarowej, było trzeba wiedzieć jak obsługuje się urządzenie graficzne, czy to chcąc pokazać cokolwiek na ekranie, albo zdecydować czy karta graficzna jest w stanie obsłużyć Vertex Shadery, etc. Dużo tego było, a w dodatku skomplikowane. Aby to zmienić Microsoft przygotował nowy framework - XNA. Jest to zestaw bibliotek znacząco ułatwiający programowanie gier.

XNA Game Studio to nie jest żaden osobny projekt obok Visual Studio, lecz dodatek do Visual C# 2005. Wystarczy zainstalować go i od razu możemy przystąpić do tworzenia naszego zamysłu. To co dotychczas się robiło długo i żmudnie, czyli stworzenie świata, mapa wysokości, kamery, licznik ramek, oświetlenie, itp., itd. w XNA Game Studio robi się bardzo szybko. Można nawet powiedzieć, że kilkoma kliknięciami myszki.

XNA to nie jest jednak tylko i wyłącznie zestaw bibliotek do tworzenia gier w systemach Windows XP i Vista, ale również na XBOXa. I w cale nie jest potrzebna żadna modyfikacja albo inna wersja gry. Wszystko dzięki XNA.

Aby zacząć korzystać z frameworka XNA należy pobrać Game Studio Express (Beta), oraz August 2006 DirectX SDK.

XNA Developer Center

XNA Team Blog

Dla zainteresowanych polecam również stronę http://www.learnxna.com/

A jeżeli ktoś nie chce się przekonywać do kolejnego frameworka (którego notabene będzie trzeba instalować), lecz chce się męczyć nad wszystkim samemu, to kiedyś pisałem o serii artykułów na Coding4Fun: Beginning Game Development

piątek, 25 sierpnia 2006

Mapa strony jest dosyć kluczowym (dzisiaj) elementem stron internetowych. Każdy deweloper i programista powinien wiedzieć co daje zaimplementowanie takiej funkcjonalności. Przede wszystkim jest to ułatwienie w nawigacji po serwisie internetowym. Jest to również sposób za pomocą którego możemy pomóc robotom przeszukującym internet w zaindeksowaniu wszystkich naszych stron. Jakiś czas temu pisałem o zmianie tytułu każdej strony na podstawie pliku web.sitemap: Tytuł strony rodem z web.sitemap

Czy na tym koniec? W zasadzie to co wymieniłem to są największe korzyści jakie możemy odczuć. Z drugiej strony jeżeli chcemy aby nasza strona była dostępna, spełniając twarde kryteria WAI AAA, powinna zawierać między innymi mapę strony. 

Budowanie mapy strony w ASP.NET może często pomóc nam w budowie menu, z którego korzystać będą użytkownicy. W celu ułatwienia tego zadania, Microsoft umożliwił budowanie pliku XML zawierającego całą strukturę menu w jednym miejscu - pliku web.sitemap. Wraz z dołączonymi kontrolkami pozwalającymi budowanie menu metodą przeciągnij i upuść, został zaprezentowany sposób na łatwą i szybką budowę całego menu i jeszcze paru innych rzeczy.

Format XML jest bardzo dobrze przemyślany i popularny przy przechowywaniu danych, oraz operowania na nich. Wielu osobom na pewno będzie się to podobało. Ale czy to jest naprawdę dobre rozwiązanie i nie można zrobić czegoś lepszego?

Dzisiaj chyba już nikt sobie nie wyobraża przechowywania danych, z których korzystać będą aplikacje internetowe, w plikach csv (oddzielonych przecinkami), czy w innych plikach na dysku fizycznym. Największym argumentem przeciwko nim jest ulotność danych. Należy zawsze je archiwizować i być pewnym, że w razie awarii nie stracimy naszej cennej pracy (dwuznaczność celowa). Plik XML również jest obarczony tą niedogodnością, utrudnieniem.

Bazy danych. To jest dzisiaj najpopularniejszy magazyn przechowywania danych wszelkiej maści. Możliwości dzisiaj są bardzo duże, przechowywanie danych w jednym miejscu jest również plusem i ułatwieniem przy archiwizacji. Więc może by tak przenieść mapę strony do relacyjnej bazy danych, ułatwiając sobie zarządzanie wszystkimi danymi wykorzystanymi w aplikacji?

Inna kwestia to budowanie dynamicznej strony. A strona dynamicznie generowana pociąga za sobą konieczność dynamicznego generowania mapy strony, menu, etc. Owszem, możemy to zrobić na wiele sposobów. Edycja plików XML nie jest bardzo skomplikowana, a edycję pliku web.sitemap możemy dokonać na sposób jaki został przedstawiony na MSDN, albo na ten opisany na blogu Danny'ego Chena.

Możemy również napisać własnego Providera, który na podstawie struktury fizycznych plików i katalogów będzie tworzył mapę strony, tak jak opisane to jest w artykule Scotta Mitchella (Examining ASP.NET 2.0's Site Navigation - Part 4). Polecam całą serię artykułów osobom pragnącym dowiedzieć się nieco więcej o budowie i wykorzystaniu pliku web.sitemap w ASP.NET. Takim sposobem możemy rozszerzyć funkcjonalność mapy strony, nie pozbawiając się integracji z kontrolkami korzystającymi z tego pliku (a dokładniej łącznika dającego dostęp do mapy strony).

Microsoft nie przewidział jednak przechowywania mapy strony w bazie danych, lecz tylko i wyłącznie w pliku XML - web.sitemap. Ale możemy uzupełniać plik web.sitemap na podstawie danych z bazy danych, jak zostało to opisane na CodeProject. Ten sposób jest już najbliższy mojego celu. Moim celem było znalezienie sposobu umieszczenia mapy strony w bazie danych, a dodatkowo nie tracąc dotychczasowej funkcjonalności idącej z wykorzystania ASP.NET. Ale czy to już szczyt marzeń? :)

Nie. Więc w czym problem, skoro jest tyle sposobów?

Czy nie lepiej byłoby mieć specjalnego providera, który czytałby bezpośrednio ze struktury w bazie, z pominięciem pliku w formacie XML? Na pewno tak. I nawet jest to już przedstawione w internecie. I to nawet u samego źródła, bo w MSDN Magazine, w numerze z początku tego roku.

Tak, o to mi dokładnie chodziło. Jest to najbardziej eleganckie rozwiązanie jakie udało mi się znaleźć. Ale ...

Rozwiązanie w większości przypadków zadowalające, ale zawsze musi być jakieś ale. Ten provider nie jest perfekcyjnie dopracowany, przydałoby się kilka zmian. Przede wszystkim problem możemy napotkać, jak zobaczymy z jaką strukturą tabeli w bazie danych on działa. Czy to problem stworzyć taką tabelkę? Nie, ale zapewne żaden administrator bazy danych nie powie, że duplikowanie tych samych danych w bazie jest dobrym rozwiązaniem, bo to nie jest dobre rozwiązanie. A takie niestety są ograniczenia w tej implementacji - potrzebna jest struktura tabeli o określonej budowie. Ja tworzę taką tabelę poprzez stored procedure w której korzystając z możliwości kursorów pobieram dane z innych tabeli. Uruchomianie takiej procedurki pewnie nie jest najlepszy z możliwych sposobów (bo to ciągłe odbudowywanie zawartości tabeli od zera, przy każdej zmianie), ale jest to przynajmniej jakiś sposób.

Przy wypełnianiu naszej tabelki danymi (najczęściej dynamicznymi, przy każdej zmianie) musimy zwracać baczną uwagę na to, by wszystkie komórki zostały wypełnione, bo inaczej... nie będą wyświetlane wszystkie dane z wierszy począwszy od tego z pustą zawartością!

Dużo się nasiedziałem zanim to wyśledziłem. Gdy tylko kawałek menu opierającego się na takiej mapie strony nie był uzupełniony, brakowało po prostu części menu. Każda komórka musi być wypełniona, a dodatkowo adresy URL, tytuły, czy opisy nie mogą się powtarzać, bo błędu nie zobaczymy, tak samo jak części menu ;)

Podsumowując. ASP.NET nie ma wbudowanego wygodnego mechanizmu umożliwiającego przechowywanie mapy strony w bazie SQL. Najbardziej eleganckim rozwiązaniem jest napisanie własnego providera, lub skorzystanie z tych dostępnych w internecie (codeproject, MSDN Magazine) i ich rozbudowanie bądź ulepszenie w miarę wymagań.

niedziela, 20 sierpnia 2006

Steven Smith na swoim blogu prosi o zabranie głosu w kwestii wyboru nowej nazwy dla produktu znanego dotychczas pod nazwą Atlas - będącego następcą już dzisiaj bardzo popularnej technologii Ajax (popularnej głównie dzięki Google).

Na początek proponuje on kilka przykładowych nazw:

Rich Web Programming Foundation - RWPF
Web Technology Framework - WTF (!)
AJAXX (aka let's just add an 'X' to the existing name to make it sound cooler)
Rich Language ASP Framework
Big ASP Rich Foundation - BARF
Active Client Pages - ACP

Prawda że bardzo ładne? Nie? Ja też myślę że to nie są nazwy łatwe do zapamiętania i łatwo wpadające w ucho. Za to Atlas byłby (i jest na razie) taką nazwą. Po co zmieniać coś takiego?

Pod wpisem na jego blogu wypowiedziało się już wiele osób. Może warto by wypowiedziało się więcej osób, również za propozycją pozostawienia dotychczasowej nazwy?

http://aspadvice.com/blogs/ssmith/archive/2006/08/16/Atlas_Naming_Game.aspx

 
1 , 2