18
Feb 10

Silverlight 4 Beta a VS 2010 RC

Ostatnio okazała się wersja Release Candidate nowego Visual Studio, która posiada wiele usprawnień w stosunku do drugiej bety, m.in. przyśpieszenie pracy środowiska. Niestety, nie wydano wraz z nią wersji RC narzędzi dla Silverlight 4, a te przeznaczone dla Beta 2 nie chcą działać z nowym VS. Alex Sorokoletov znalazł jednak sposób na ominięcie tego problemu – można go przedstawić w kilku krokach:

1. Ściągamy Microsoft Silverlight 4 Tools for Visual Studio 2010 Beta 2,

Instalator Silverlight 4 Tools2. Uruchamiamy instalator, który wyświetla komunikat o braku odpowiedniej wersji oprogramowania. Nie zamykamy jego okna, przechodzimy do następnego kroku.

3. Szukamy na dysku C folder o nazwie w postaci GUID (u mnie było to np. C:\1d7c45051ed4568772f991cb5e15), zawierającego plik SPInstaller.exe i kopiujemy cały katalog w inne miejsce. Po skopiowaniu można zamknąć okno instalatora.

4. Przechodzimy do skopiowanego folderu i edytujemy plik ParameterInfo.xml, umieszczając w komentarzu linijki, począwszy od 13 aż do 41:

12:      </BlockIf>
13: <!-- <BlockIf DisplayText="Visual Studio 2010 Beta 2 or Visual Web Developer Express 2010 Beta 2 that matches the language version of Silverlight Tools 4 must be installed before installation of Silverlight Tools can continue.  Silverlight Tools is available in other languages at &lt;A HREF=&quot;http://go.microsoft.com/fwlink/?LinkId=177432&quot;&gt;http://go.microsoft.com/fwlink/?LinkId=177432&lt;/A&gt;.">

 ...

41:      </BlockI> -->
42:    </StopBlockers>

i zapisujemy go.

5. Uruchamiamy instalator SPInstaller.exe i przeprowadzamy instalację narzędzi.

6. Uruchamiamy edytor rejestru (regedit.exe); w kluczach:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\DesignerPlatforms\Silverlight
  • HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0_Config\DesignerPlatforms\Silverlight

zmieniamy wartość SilverlightHost typu REG_SZ na v4.0

Od tej chwili można już korzystać z SL4 w VS 2010 RC.


13
Feb 10

Silverlight 4: obsługa mikrofonu

Odliczając dni do premiery pełnej wersji pakietu Visual Studio 2010, mamy okazję  zapoznać się z wersją beta tego oprogramowania oraz poznać nowe możliwości technologii Silverlight. Jej czwarta odsłona przynosi długo oczekiwaną funkcjonalność: obsługę mikrofonów oraz kamerek internetowych. Tradycyjnie dołożono starań, by interfejs był jak najbardziej przystępny dla programisty.

Pokażę tutaj typowy sposób na przechwytywanie dźwięku za pomocą mikrofonu. Korzystać będziemy z przestrzeni nazw System.Windows.Media, która udostępnia zestaw potrzebnych klas:

  • CaptureDeviceConfiguration - pozwala uzyskać listę dostępnych  urządzeń przechwytujących dźwięk (GetAvailableAudioCaptureDevices), poznać urządzenie domyślne (GetDefaultAudioCaptureDevice) oraz zażądać do nich dostępu  (RequestDeviceAccess),
  • CaptureSource - reprezentuje źródło dźwięku/obrazu,
  • AudioSink - klasa abstrakcyjna posiadająca metody związane z przepływem danych audio.

Nasze zadanie składa się z następujących kroków:

  1. Uzyskanie urządzenia przechwytującego dźwięk,
  2. Utworzenie źródła przechwytywania i powiązanie go z urządzeniem,
  3. Utworzenie własnego obiektu dziedziczącego po AudioSink i określenie jego źródła przechwytywania,
  4. Uzyskanie zgody na dostęp do mikrofonu i rozpoczęcie przechwytywania dźwięku,
  5. Przechwytywanie dźwięku,
  6. Zakończenie przechwytywania dźwięku.

Załóżmy że będziemy przechwytywać z domyślnego urządzenia – wtedy 3 pierwsze kroki można załatwić w kilku linijkach kodu:

AudioCaptureDevice audioCapDev = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();
CaptureSource capSrc = new CaptureSource();
capSrc.AudioCaptureDevice = audioCapDev;
MyAudioSink myAudioSink = new MyAudioSink();
myAudioSink.CaptureSource = capSrc;

MyAudioSink jest przykładową klasą pochodną AudioSink:

class MyAudioSink : AudioSink
{
    private MemoryStream m_stream; // strumień pamięciowy do przechowywania danych
    private AudioFormat m_format; // bieżący format audio
    public Stream DataStream
    {
        get { return m_stream; }
    }

    public AudioFormat CurrentAudioFormat
    {
        get { return m_format; }
    }

    protected override void OnCaptureStarted()
    {
        m_stream = new MemoryStream();
    }

   protected override void OnCaptureStopped()
    {
        // manipulacje na zarejestrowanych danych
    }

    protected override void OnFormatChange(AudioFormat audioFormat)
    {
        m_format = audioFormat;
    }

    protected override void OnSamples(long sampleTime, long sampleDuration, byte[] sampleData)
    {
        m_stream.Write(sampleData, 0, sampleData.Length);
    }
}

Prywatne pole m_stream jest strumieniem znajdującym się w pamięci do którego zapisujemy przechwycone próbki; m_format jest strukturą zawierającą informację o formacie materiału (częstotoliwość próbkowania, liczba kanałów, liczba bitów na próbkę itp.) – własności DataStream oraz CurrentAudioFormat udostępniają te pola na zewnątrz tylko do odczytu. Najważniejsze są tu jednak przeciążane metody: OnCaptureStarted, OnCaptureStopped, OnFormatChange i OnSamples. OnCaptureStarted jest wywoływana w odpowiedzi na rozpoczęcie przechwytywania – tworzymy tutaj nowy strumień do zapisu. Wywołanie OnCaptureStopped oznacza, że przechwytywanie zostało zakończone i można np. zająć się obróbką pozyskanych danych. OnFormatChange jest wywoływana co najmniej jeden raz w wyniku rozpoczęcia pierwszego przechwytywania i pozwala ostatecznie określić format danych audio, a także reagować na jego zmianę. OnSamples wykonuje się, gdy urządzenie przechwyci ramkę danych o odpowiedniej długości czasowej, określonej przez właściwość AudioFrameSize bieżącego urządzenia przechwytującego (AudioCaptureDevice) – domyślnie jest to 1000 ms. Tutaj można zapisać dane do wcześniej utworzonego strumienia – argumenty funkcji to kolejno czas przechwycenia ramki (w jednostce odpowiadającej 100 ns), jej długość (j/w) oraz tablica bajtów zawierająca dane.

Przejdźmy do kolejnych kroków. Musimy uzyskać zgodę użytkownika na korzystanie z urządzeń przechwytujących – służy do tego funkcja RequestDeviceAccess.Silverlight 4 Jej wywołanie powoduje wyświetlenie okienka dialogowego z zapytaniem, podobnego do tego na ilustracji – zwracana jest wartość logiczna określająca, czy użytkownik zezwolił na dostęp. Zezwolenie jest ważne na okres trwania sesji, a ponowne wywołanie funkcji w czasie danej sesji nie powoduje ponownego wyświetlenia okna. Zaleca się, by funkcja była wywoływana przez zdarzenie zainicjowane przez użytkownika.

Warto tu wspomnieć jeszcze o właściwości AllowedDeviceAccess (bool) klasy CaptureDeviceConfiguration - określa ona czy użytkownik udzielił wcześniej pozwolenia na wykorzystanie urządzeń.

Po wspomnianej weryfikacji można przejść do przechwytywania dźwięku, wywołując metodę Start obiektu typu CaptureSource – odpowiednie zdarzenia są obsługiwane przez powiązany obiekt dziedziczący po AudioSink. Do zakończenia przechwytywania służy metoda Stop. Stan przechwytywania można sprawdzić za pomocą własności State typu CaptureState, która może przyjmować trzy różne wartości:

  • Failed - przechwytywanie nie udało się lub nie zostało jeszcze wykonane,
  • Started - przechwytywanie jest w toku,
  • Stopped - wywołano metodę Stop, przechwytywanie zakończyło się sukcesem.

To wszystko. Obsługa mikrofonu w Silverlight 4 jest naprawdę prosta i daje dużo możliwości. Informacje które tutaj przedstawiłem stanowią jedynie wierzchołek góry lodowej – więcej można znaleźć oczywiście na MSDN.


21
Nov 09

ITAD na UAM

W tym tygodniu rozpoczął się tegoroczny cykl konferencji informatycznych IT Academic Day, poświęconych technologiom powszechnie znanej i (nie)lubianej firmy Microsoft. 19. listopada jedno z takich wydarzeń zostało zorganizowane na Wydziale Matematyki i Informatyki Uniwersytetu Adama Mickiewicza w Poznaniu przez tamtejszych studentów z uczelnianych grup .NET i IT. Niewielka grupa śmiałków, reprezentująca informatykę na wydziałach Politechniki Poznańskiej zdecydowała się postawić nogę na obcej ziemi. Byłem wśród nich także ja, a co widziałem i słyszałem, spisałem w tym krótkim, subiektywnym podsumowaniu.

Około godziny 11:40 nastąpiło uroczyste otwarcie, które trwało dość krótko. Następnie rozpoczął się wykład pt. “XNA Game Studio 3.1 i gry RPG” prowadzony przez p. Rafała Czupryńskiego z Microsoft Polska, prywatnie fana serii Baldur’s Gate. Przedstawione zostały podstawowe informacje nt. XNA: co to jest, skąd to wziąć i dlaczego to jest takie fajne. Nacisk był kładziony na pokazanie w jak prosty sposób można stworzyć własną grę za pomocą tego narzędzia. Omówiono budowę szkieletu programu, rysowanie obiektów 2D i modeli 3D oraz przemieszanie ich za pomocą joypada. Pojawiły się ogólne informacje o grach RPG i ich genezie; zaprezentowano także RPG Starter Kit. Reasumując, bardzo dobre wprowadzenie dla zupełnie początkujących, zachęcające ich do wgłębiania się w temat.

Kolejną prelekcję, “Niewidzialny wróg. Rootkity dla systemów Windows” wygłosiła p. Marta Janus z Kaspersky Lab Polska. Zdefiniowane zostało pojęcie rootkitu, omówiono podstawowe rodzaje szkodliwego oprogramowania działające w trybie systemu (Ring0) oraz użytkownika (Ring3) i sposoby jego działania, przedstawiono nowe koncepcje oparte na wirtualizacji i przejmowaniu kontroli od początku procesu ładowania systemu do pamięci operacyjnej. Pojawiły się także informacje o aplikacjach służących do wykrywania i usuwania rootkitów. Podsumowując: temat ostatnio na czasie, omówiony bardzo przystępnie. Do zgarnięcia były trzy pudełka z najnowszą wersją Kaspersky Internet Security, które przyznawano zgłaszającym się za poprawne odpowiedzi na pytania związane z prezentowanym zagadnieniem. Oprócz tego, każdy zarejestrowany uczestnik ITAD otrzymał przy rejestracji płytę z wersją OEM w/w programu i półroczną licencję.

Po przerwie na poczęstunek, p. Adam Niedbała z firmy itelligence przedstawił temat “Bezpieczne Datacenter. Technologia czy organizacja”, który był w praktyce omówieniem tego, czym reprezentowana przez niego firma się zajmuje. Przedstawiono pokrótce jej historię, zakres działalności, oferowane usługi, listę największych klientów. Omówiono wyposażenie i zabezpieczenia centrum danych w polskim oddziale oraz sposoby komunikacji z klientami i metody rozwiązywania ich problemów. Prezentacja miała na celu pokazanie, że w centrach danych technologia oraz organizacja są tak samo ważne. Wzrok wszystkich był jednak od samego początku skierowany w stronę okien sali, przy których znalazły się już nagrody dla uczestników konferencji – co, nie da się ukryć, rozpraszało trochę uwagę :D .

Ostatnim omawianym tematem było Imagine Cup. Ekipa Demoscene Spirit – zwycięzcy tegorocznego krajowego finału konkursu, przestawiła swoje osiągnięcia w poprzednich trzech edycjach oraz dała garść przydatnych wskazówek dla przyszłych uczestników. Można było się dowiedzieć, na co jury zwraca uwagę, jakie kryteria są brane pod uwagę w ocenianiu prac i jak to wszystko wygląda na szczeblu krajowym oraz międzynarodowym.

Na koniec to, na co wszyscy czekali, czyli losowanie nagród (a było ich całkiem sporo). Specjalnie napisany na tą okazję program, którego źródło miało kilka linijek i było nam wcześniej przestawione, losował liczby – osoba mająca określoną pozycję na liście zarejestrowanych uczestników musiała odpowiedzieć na proste pytanie związane z prezentowanymi wcześniej tematami. Do wygrania były m.in. pakiety Office 2007 w wersji domowej (byłem jednym ze szczęśliwców, którzy wygrali takie żółte pudełko :) ), myszki, książki informatyczne, pendrive’y, koszulki i podkładki pod myszki. Początkowo napięta atmosfera (kogo teraz wylosują?) szybko zaczęła się rozluźniać – naprawdę, było sporo śmiechu.

Organizacja całej imprezy stała na wysokim poziomie, za co należą się brawa gospodarzom z UAM. Wszystkie wykłady odbywały się w auli, która bez problemu pomieściła ok. 160 uczestników – mimo braku nagłośnienia, przekaz był czytelny. Nie można też mówić o opóźnieniach: poszczególne punkty programu odbyły się planowo. Prelegenci byli dobrze przygotowani, przedstawiali interesujące tematy. Muszę też wspomnieć o pudełku świetnych cukierków, które rozdawano podczas rejestracji :) .

Zachęcam wszystkich niezdecydowanych do uczestnictwa w najbliższym ITAD – pozostałych nie muszę namawiać na udział w następnej konferencji za rok.