Kto mówi “Lubię to”

Popularność portali społecznościwych zapewne przerosła najśmielsze oczekiwania ich tworców. Od jakiegoś czasu obserwujemy w Polsce ogromny wzrost popularności Facebooka, który intensywnie odbiera “rynek” odchodzącej powoli w niepamięć (przynajmniej moją) Naszej-Klasie. Dla osób, które prowadzą blogi jest to bardzo dobre miejsce do umieszczania informacji o nowych blogach. Chcąc dotrzeć do coraz to większej ilości czytelników należy szukać wielu różnych kanałów dystrybucji. Agregatory blogów takie jak .NET Blogs PL lub Dotnetomaniak, czy też ciekawa inicjatywa, którą zaproponował Fones, a mianowicie wyszukiwarka szukajo.net, to świetne miejsce, aby poszerzyć grono odbiorców.

Facebook jako platforma daje też ciekawe możliwości. Należy do nich między innymi znany wszystkim przycisk “Lubię to”. Wiele osób oprócz tego, że go znają, to również umieszczają go na swoich stronach. Ciekawe jednak ile osób zdaje sobie sprawę z tego, że facebook oferuje do tego przycisku również statystyki.

Zacznijmy jednak od początku, czyli od założenia aplikacji na facebook. W tym celu udajemy się na stronę http://www.facebook.com/developers/ na której podajemy swoją domenę i rejestrujemy nową aplikację. W zamian otrzymujemy szereg informacji, z których bardzo ważną jest “Identyfikator aplikacji”.  Posłuży nam on jako parametr do skryptu i metadanych. Teraz przystępujemy do modyfikacji strony:

1. Do znacznika html dodajemy

1
xmlns:fb="<a href="http://www.facebook.com/2008/fbml">http://www.facebook.com/2008/fbml</a>"

2. W sekcji head dodajemy

1
<meta name="fb:app_id" content="id_aplikacji"/>

3. W kodzie strony dodajemy fragment odpowiedzialny za załadowanie skryptów facebooka

1
2
3
4
5
6
7
8
9
10
11
12
13
<div id="fb-root"></div>
<script>
    window.fbAsyncInit = function() {
        FB.init({ appId: '127737573958912', status: true, cookie: true,
            xfbml: true
        });
    };
    (function() {
        var e = document.createElement('script'); e.async = true;
        e.src = document.location.protocol + '//connect.facebook.net/pl_PL/all.js';
        document.getElementById('fb-root').appendChild(e);
    } ());
</script>

4. Teraz w dowolnym miejscu umieszczamy nasz przycisk.

1
<fb:like href="adres" layout="button_count" width="40" show_faces="false" ></fb:like>

W związku z faktem, że korzystam z platformy WordPress zamiast adresu wystarczy, że wpiszę

1
<?php the_permalink() ?>

Możemy również odpowiednio modyfikować parametry przycisku – szczegóły znajdują sie na stronie naszej aplikacji, gdzie również jest dostępny kod odpowiednich elementów strony.

Bliższe spojrzenie
Wypadałoby jednak dowiedzieć się kto i kiedy “lubi” lub udostępnia na swojej tablicy adres do naszej strony. W tym celu wystarczy udać się na http://www.facebook.com/insights, gdzie mamy dostęp do tych informacji. Do dyspozycji mamy wykresy ilościowe jak i “jakościowe” jeżeli tam można to nazwać. Chodzi tu o profil naszych czytelników. Informacje te nie są bardzo szczegółowe, jednakże dają pewien pogląd i orientację :) Daje to mam dodatkowe źródło wiedzy na temat naszych czytelników i ich preferencji, co moim zdaniem jest bardzo przydante gdy chcemy dotrzeć do coraz to większej ilości czytelników.


3. 2. 1. Start. Windows Phone 7 na Channel 9 i codeguru.pl

Od dziś rozpoczynają się dwa równoległe cykle poświęcone programowaniu w technologii mobilnej Windows Phone 7. Pierwszy z nich będzie dostępny na portalu Channel9. Autorami webcastów są Barłomiej Zass, Michał Korzunowicz, Daniel Plawgo oraz ja :) Pierwszy odcinek, którego jestem autorem dostępny jest pod tym adresem. Jest on poświęcony ogólnemu wprowadzeniu w tematykę Windows Phone 7 jako platformy dla programistów, opowiadam o narzędziach. Pokazuję rowniez jak stworzyć swoją pierwszą aplikację na tą platformę korzystając z Silverlight oraz XNA.

Jednocześnie z webcastami na Channel 9 będą ukazywały się artykułu na portalu codeguru.pl. Będą one w ścisły sposób nawiązywać do tematyki poszczególnych webcastów. Powiązanie to będzie tym silniej widoczne, że na końcu każdego artykułu bedzie dostępny link do odpowiedniego nagrania na Channel9. Pierwszy artykuł możecie znaleźć tutaj.

Materiały do pierwszego odcinka

Mamy nadzieję, że dzięki takiemu podejściu i dywersyfikacji każdy znajdzie coś dla siebie. Oczywiście dla lepszego poznania tematu polecam zapoznanie się zarówno z webcastem jak i z artykułem :) Kolejne odcinki serii będą ukazywały się co tydzień zarówno na CG jak i CH9 (a stosowny news będzie zawsze dostępny również tutaj).
artykuł

Odcinek 1


Kolejna książka o WP7 – tym razem w kontekście Silverlight

Puya Paymudya z Indonezyjskiego Centrum Innowacji Microsoft udostępnił książkę o Windows Phone 7 za darmo. Można ją pobrać ze stron Microsoft Feed. Jest to kolejna książka o Windows Phone 7 udostępniona w formie bezpłatnego ebooka. Jak widać firma Microsoft stara się dotrzeć do jak największego grona deweloperów, dzięki czemu możemy się spodziewać dynamicznego rozwoju Marketplace dla WP7. Oby tak dalej, bo więcej aplikacji zrobionych w “dobry” sposób to korzyść nie tylko dla Microsoft, ale przede wszystkim dla użytkowników urządzeń z najnowszym systemem mobilnym MS.


XNA + Modele 3D = Blender

Dziś postanowiłem podzielić się swoimi początkami jeżeli chodzi o platformę XNA oraz wykorzystanie modeli 3D. Na rynku mamy wiele programów do modelowania 3D, natomiast jednym z popularniejszych, a dodatkowo bezpłatnych programów jest Blender. Aktualnia stabilna wersja to 2.49b i to właśnie ona posłuży nam do przygotowania i wyeksportowania modelu.

Wersja podstawowa

Uruchamiamy zatem Blendera (wymagany jest w tym zainstalowany Python 2.6). Widzimy domyślny układ okna, na którym znajduje się sześcian, lampa i kamera. Do XNA będziemy eksportować pojedyncze modele, zatem pozbywamy się kamery i lampy, lub usuwamy wszystko (klawisz A, następnie Del) i dodajemy sześcian na nowo (Spacja -> Add -> Mesh -> Cube). Co do samego modelu pozostawiam wam pole do popisu. Ja w tym momencie pozostanę przy sześcianie :)

XNA potrafi korzystać z modeli zapisanych między innymi w formacie FBX. Blender w ostatniej stabilnej wersji wspiera eksport do takiego właśnie formatu. Jezeli korzystacie z jakiejś starczej, to również nie ma problemu, gdyż istnieją gotowe skrypty, które umożliwiają eksport do takiego właśnie formatu.
Klikamy zatem Menu File -> Export -> Autodesk FBX (.fbx). W tym momencie nie korzystamy z animacji, zatem możemy odznaczyć pole Enable Animation, a następnie zapisujemy plik na dysku.

Aby móc skorzystać z tak wyeksportowanego modelu w XNA najpierw musimy stworzyć projekt. W tym celu skorzystamy z szablonu Windows Game. Równie dobrze można skorzystać z projektu dla Windows Phone 7. Jedyna różnica jaka tu będzie, to inne współrzędne dla ustawień kamery, ale ich dopasowanie nie jest problemem.


W przeciwieństwie do wcześniejszych wersji XNA mamy tu do czynienia z oddzielnym projektem.


Dla zachowania porządku dodajemy sobie katalog Models, do którego następnie dodajemy wyeksportowany przed chwilą obiekt w formacie fbx.
Teraz pora na kawałek kodu. W pliku Game1.cs dodajemy zmienne:

1
2
3
private Model _model;
float aspectRatio;
Vector3 cameraPosition = new Vector3(10.0f, 10.0f, 10.0f);

W metodzie LoadContent musimy zainicjować ww zmienne w taki oto sposób:

1
2
_model = Content.Load<Model>("Models/sampleModel");
aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio;

Teraz przechodzimy do metody Draw, która jest odpowiedzialna za idświeżanie widoku. Naszym zadaniem jest narysowanie każdej powierzni po uwczesnym nadaniu jej odpowiednich wartości oświetlenia i projekcji. Gotowy kod wygląda następująco.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// Draw the model.
foreach (ModelMesh mesh in _model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.View = Matrix.CreateLookAt(cameraPosition,
Vector3.Zero, Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(20.0f), aspectRatio,
1.0f, 50.0f);
}
 
mesh.Draw();
}
 
base.Draw(gameTime);
}

W tym momencie jesteśmy gotowi do uruchomienia projektu, którego efekt powinien prezentować się jak na poniższym screenie:

Scena jest trochę statyczna, więc możemy jeszcze dodać rotację. W tym celu tworzymy dodatkową zmienną, która będzie przechowywała aktualny kąt obrotu (float modelRotation) oraz uaktualniamy ją w metodzie Update:

1
modelRotation += (float)gameTime.ElapsedGameTime.TotalMilliseconds * MathHelper.ToRadians(0.1f);

Teraz w metodzie Draw dodajemy kod odpowiedzialny za zaaplikowanie odpowiedniego obrotu (na przykład względem osi OY). Pamiętajmy, że XNA to świat macierzy, dlatego korzystamy z takiego kawałka kodu:

1
effect.World = Matrix.CreateRotationY(modelRotation);

Jeżeli chcemy zastosować więcej obrotów musimy przemnożyć przez siebie odpowiednie macierze. Teraz po uruchomieniu projektu nasz sześcian ożył :)

Teksturowanie

Jednolite obiekty to nie jest szczyt marzeń, dlatego przydałoby się wykorzystać jakąś teksturę. Tutaj sprawy się nieznacznie komplikują. Tak jak w kwesti modelowania i eksportowania modeli ze standardowymi materiałami nie ma tu większej magii, tak w przypadku wykorzystywania tekstur są pewne (czasem spore) różnice w każdej wersji Blendera. W internecie można znaleźć różne posty, jednakże nie wpadł mi w ręce żaden odpowiadający tej właśnie wersji. Zatem metodą prób i błędów z małą pomocą dokumentacji przedstawiam kolejne ktoki, jakie musimy podjąć aby przygotować taki model.

  • Tworzymy w blenderze nowy projekt.
  • Dodajemy sześcian
  • Dzielimy ekran na dwie części
  • Przenosimy się do trybu Edit
  • W zakładce Editing (F9) wybieramy UV texture -> New
  • W jednej z części zostawiamy widok 3D, a w drugiej przełączamy się na UV/Image Editor
  • Przełączamy się w tryb edycji powierzchni i Wybieramy jedną z nich.
  • Wybieramy plik graficzny, który ma być teksturą danej powierzchni
  • Przełączamy w tryb Textured, dzięki któremu mamy podgląd tego co zrobiliśmy

Analogiczne operacje wykonujemy dla kolejnych powierzchni (w tym przypadku dla ścian sześcianu). Jeżeli zaznaczymy kilka wówczas załadowanie pliku graficznego spowoduje, że zostanie on wczytany dla wszystkich ścian.

Teraz czas zapisać pracę i ponownie wyeksportować model do formatu fbx, który następnie przenosimy do projektu. Jest jednak jedna rzecz, którą musimy zmienić. W pliku modelu mamy zapisane informacje o teksturach w postaci relatywnych ścieżek. Musimy je pozmieniać na odpowiednie wartości. Jednocześnie w projekcie tworzymy katalog Textures, do którego przenosimy wykorzystane przez nas tekstury. Otwieramy plik FBX przy pomocy edytora tekstowego (notatnik, lub dwuklik w Visual Studio) i wyszukujemy wystąpień RelativeFilename a następnie je uaktualniamy:
RelativeFilename: “..\Textures\sampleTexture.png” oraz RelativeFilename: “..\Textures\sampleTexture2.png” Teraz po wykorzystaniu nowego modelu możemy się cieszyć sześcianem z teksturami.

To koniec. Analogicznie postępujemy z bardziej złożonymi obiektami i teksturami, dzięki czemu dużo łatwiej możemy tworzyć niesamowitą grafikę na platformie XNA przy użyciu intuicyjnego programu do modelowania jakim jest Blender.

Projekt do pobrania.


Nowy NHibernate na TGD.NET

Toruńska Grupa Deweloperów .NET ma przyjemność zaprosić na 25 spotkanie, które będzie miało formę warsztatów. Łukasz Dams przedstawi nam najnowszą odsłonę NHibernate.

O czym będzie:
Z okazji premiery trzeciej już odsłony NHibernate, chciałbym przybliżyć uczestnikom ten popularny ORM i sposoby jego praktycznego wykorzystania. Osoby posiadające już doświadczenie z NHibernate, będą mogły dowiedzieć się o nowościach, jakie zostały udostępnione w wersji trzeciej, oraz o wielu mało znanych, ale przydatnych funkcjonalnościach dostępnych w wersjach wcześniejszych.
Agenda:

  1. Krótki wstęp do frameworka i jego konfiguracji.
  2. Obiektowy model domeny vs. relacyjna baza danych – czyli (prawie) cała prawda o mapowaniach .
  3. Transakcje – jak z nich korzystać, optymistyczne i pesymistyczne rozwiązywanie transakcji, integracja z TransactionScope.
  4. QueryOver – nowy, szybki i wygodny sposób tworzenia zapytań, nietrywialne przykłady użycia.
  5. Przegląd dostępnych API interakcji z bazą danych – wady, zalety i ograniczenia, dobór właściwego narzędzia do zadania.
  6. Optymalizacje na poziomie mapowań i zapytań, najczęściej popełniane błędy.
  7. Wzorce i antywzorce użycia.
  8. Przykłady wykorzystania wbudowanego modelu zdarzeń i interceptorów.
  9. Bardzo krótkie porównanie z Entity Framework i Linq2Sql.
  10. Wybrane rozszerzenia.

O prelegencie:
Łukasz Dams – Absolwent Wydziału Fizyki, Astronomii i Informatyki Stosowanej w Toruniu. Obecnie, starszy programista w toruńskiej firmie AIS.PL, gdzie tworzy aplikacje w ASP.NET MVC. Od roku zaangażowany w projekty intensywnie korzystające z NHibernate. Zainteresowany wszelkimi nowinkami technicznymi w zakresie programowania, architektury aplikacji i wzorców projektowych oraz metodami, i narzędziami optymalizacji operacji bazodanowych.

Z racji na warsztatową formę spotkania liczba miejsc jest ograniczona!!!
Gdzie i kiedy:
Spotkanie odbędzie się 1 lutego od godziny 17:00 w LABOLATORIUM L4 na Wydziale Matematyki i Informatyki UMK (ul. Chopina 12/18) . Wstęp na wykład jest wolny. Rejestracja na spotkanie jest obowiązkowa.
(Link dla osób korzystających z Codeguru: Rejestracja na spotkanie)


WP7 – Silverlight + XNA != InvalidOperationException

Dziś po małej przerwie mała podpowiedź dla osób zajmujących się Windows Phone 7.

Jak wiadomo (lub też nie :) ) platformy, przy pomocy których możemy pisać własne aplikacje na WP7 to Silverlight 4 Windows Phone (nie piszę samego Silverlight, bo są tu pewne różnice w stosunku do pełnej wersji) oraz XNA 4.0. Nie oznacza to jednak, że musimy zamykać się tylko w jednym ze światów. Istnieje możliwość korzystania w jednym projekcie z przestrzeni nazw, klas i funkcjonalności dostępnych w obu tych technologiach. Zapewne najczęstsze “wymieszanie” technologii następuje gdy tworzymy w Silverlight. Dlaczego? Między innymi dlatego, że XNA oferuje nam wiele funkcjonalności multimedialnych takich jak odtwarzanie dźwięków, nagrywanie przy pomocy mikrofonu, MediaPlayera, ale również udostępnia rozpoznawanie gestów przy pomocy TouchPanel (tak – wiem, że Silverlight mamy Silverlight Control Toolkit i GestureListener, ale tak naprawdę jest on nakładką na TouchPanel z XNA :) ).

Tak czy inaczej, może okazać się, że w momencie gdy dodamy do projektu referencję do klas z XNA i będziemy korzystać z zawartych tam obiektów może się okazać, że otrzymujemy błąd widoczny na screenie poniżej, czyli InvalidOperationException, FrameworkDispatcher.Update has not been called.

Dispatcher

Oznacza on tyle, że korzystamy z elementów, które wymagają wywołania metody “odświeżenia stanu XNA” . Aby to zrobić wystarczy użyć takiego oto fragmentu kodu w konstruktorze strony SL:

1
2
3
4
DispatcherTimer dt = new DispatcherTimer();
dt.Interval = TimeSpan.FromMilliseconds(33);
dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
dt.Start();

W tym momencie przy uruchomieniu aplikacji błąd ten się nie pojawi. Warto jeszcze zauważyć, że nie ma sensu ustawiać częstszego odświeżania (czyli interwału dla DispatcherTimer), gdyż platforma Windows Phone 7 wspiera maksymalnie 30 klatek na sekundę (co daje odświeżenie do 33 milisekundy), w przeciwieństwie do pełnego XNA, które wspiara standardowo 60 fps.


Windows Phone 7 – porównanie urządzeń

Pewnego dnia siedząc przed komputerem i studiując lekturę dotyczącą Windows Phone 7 trafiłem na porównanie urządzeń pod względem rozmiarów, wagi, baterii, pamięci RAM/ROM itp. Niestety gdy chciałem jeszcze raz sięgnąć do tego zestawienia nie mogłem go znaleźć…
Przypadkiem porównanie ponownie wpadło mi w ręce, a właściwie pojawiło się na moim ekranie i tym razem, zamieszczam je na blogu. Robię to z dwóch powodów:
1 – w razie potrzeby będę wiedział gdzie szukać :)
2 – może komuś też się to przyda, lub kogoś zainteresuje

Windows Phone 7 comparision

Źródła:
ElectricForest
Microsoft News Center


Prawda o SqlCommand.Parameters

Czy zastanawialiście się kiedyś jak dodawać parametry do SqlCommand? Klasa ta zawiera pole Parameters typy SqlParameterCollection, na którym możemy wykonać między innymi metodę AddWithValue(string, object). W internecie jak i w dokumentacji w nazwach parametrów na początku jest zawsze użyty znak “@”.

Przy okazji jednego z projektów musiałem odpowiedzieć sobie na pytanie: Czy muszę zadbać o “@” przy nazwie parametru? Nie zastanawiając się długo postanowiłem, zgodnie duchem empiryzmu, sprawdzić co się stanie w poszczególnych sytuacjach.

Baza danych.

Dla testów mała baza danych z jedną procedurą pobierającą dwa parametry:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE DATABASE SqlCmdParametersTest
USE [SqlCmdParametersTest]
CREATE PROCEDURE [dbo].[spTest]
	@Param1 INT,
	@Param2 INT
AS
BEGIN
	SET NOCOUNT ON;
	SELECT
 		@Param1 Col1,
		@Param2 Col2END
GO
-- TEST
EXEC [dbo].[spTest] 1, 2
EXEC [dbo].[spTest] @Param1=1, @Param2=2
EXEC [dbo].[spTest] @Param2=1, @Param1=2

Aplikacja testowa

Teraz nie pozostaje nic innego jak przygotować małą aplikację konsolową, która skorzysta z tej procedury. Wiadomo, że podstawowym sposobem dodawania parametrów jest użycie “@” na początku nazwy, zatem będzie to pierwszy sposób użycia. Jako drugi przypadek weźmiemy parametr bez tego znaku. Czy to wszystkie możliwości? Nie – można to przecież jeszcze połączyć i użyć raz z “@” a raz bez – ot tak, żeby było trudniej. Zatem do dzieła:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Data;
using System.Data.SqlClient;
 
namespace SqlCmdParametersTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SqlConnection sqlConn = new SqlConnection(@"Data Source=localhost;Initial Catalog=SqlCmdParametersTest;Integrated Security=SSPI;Persist Security Info=true"))
            {
                sqlConn.Open();
                using (SqlCommand sqlCmd = new SqlCommand())
                {
                    sqlCmd.CommandType = CommandType.StoredProcedure;
                    sqlCmd.Connection = sqlConn;
                    sqlCmd.CommandText = "[dbo].[spTest]";
 
                    //call with @
                    Console.WriteLine("With @");
                    sqlCmd.Parameters.Clear();
                    sqlCmd.Parameters.AddWithValue("@Param1", 1);
                    sqlCmd.Parameters.AddWithValue("@Param2", 2);
                    using (SqlDataReader reader = sqlCmd.ExecuteReader())
                    {
                        ReadResult(reader);
                    }
 
                    //call without @
                    Console.WriteLine("Without @");
                    sqlCmd.Parameters.Clear();
                    sqlCmd.Parameters.AddWithValue("Param1", 1);
                    sqlCmd.Parameters.AddWithValue("Param2", 2);
                    using (SqlDataReader reader = sqlCmd.ExecuteReader())
                    {
                        ReadResult(reader);
                    }
 
                    //call mixed
                    Console.WriteLine("Mixed");
                    sqlCmd.Parameters.Clear();
                    sqlCmd.Parameters.AddWithValue("@Param1", 1);
                    sqlCmd.Parameters.AddWithValue("Param2", 2);
                    using (SqlDataReader reader = sqlCmd.ExecuteReader())
                    {
                        ReadResult(reader);
                    }
                }
            }
 
            Console.ReadLine();
        }
 
        private static void ReadResult(SqlDataReader reader)
        {
            if (reader.Read())
            {
                Console.WriteLine("Result:");
                Console.WriteLine("{0} {1}", reader["Col1"], reader["Col2"]);
            }
            else
            {
                Console.WriteLine("Result is empty");
            }
        }
    }
}

Wynik dziąłania aplikacji widać na rysunku poniżej:

SqlCmdParametersTestResult

Jak widać wynik jest zgodny z oczekiwaniami – wszystko działa poprawnie, nawet “mix”. Warto jeszcze sprawdzić co dociera do SQL Servera, bo może to on jest tą “sprytną stroną”… Po uruchomieniu SQL Profilera widzimy, że jednak krok ku wygodzie a przede wszystkim swobodzie jest po stronie .NET Framework.

SqlCmdParametersTestSqlProfiler

Wniosek

Z SqlCommand.Parameters można korzystać swobodnie i bez martwienia się o “@” lub jej brak.

Paczka do pobrania


Czas podsumować rok 2010

Wielkimi krokami zbliża się koniec roku 2010, zatem trzeba by go z tej okazji podsumować… Chciałem podzielić ten post na dwie części – praca i po pracy, ale na dobrą sprawę, to w pracy nie dużo się zmieniło – pracuję w toruńskim oddziale QXL. Inne jest tylko miejsce, gdyż jakiś czas temu zmieniliśmy siedzibę na większą. Podobnie jak poprzednio siedzę w bardzo fajnym pokoju, z dużą ilością światła (czasem trochę zbyt dużą, bo mamy bardzo pokaźne okno 😛 ), zatem przeprowadzkę uznaję za sukces :)

Dużo więcej zmian można zaobserwować w działalności poza pracą. Zacznijmy od samego początku.

W tym roku postanowiłem zmigrować bloga na nową domenę i własny hosting. Plusem jest na pewno większa kontrola niż w stosunku do live.spaces.com, które niedługo przestaną funkcjonować. Opublikowałem w sumie 60 posów – całkiem nieźle moim zdaniem. Tematyka różna, choć najwięcej poświęconych było Windows Communication Foundation. Od momentu uruchomienia statystyk (2010-10-11) mam ponad 3000 odsłon. Dziękuję wszystkim odwiedzającym i mam nadzieję, że będziecie odwiedzać mnie jeszcze częściej.

W tym roku w ramach TGD.NET poprowadziłem trzy prezentacje. O zwinnych metodykach (SCRUM), o wzorcu Service Oriented Architecture (SOA + .NET = WCF) oraz awaryjna prezentacja o Windows Phone7. Dlaczego awaryjna? Z powodu nagłych i obfitych opadów śniegu na początku grudnia jeden z prelegentów nie mógł do nas dotrzeć. Szybka ankieta z jednym pytaniem: “Chcecie posłuchać o WP7?” – na sali las rąk :)
W maju wspólnymi siłami zorganizowaliśmy Visual Studio 2010 Community Launch zakończone sukcesem dzięki wytężonej pracy całego zespołu. Po drodze zostałem zaproszony na Toruński Dzień Informatyka z prezentacją o Silverligth, a Artur Boryczko zaproponował poprowadzenie sesji na IT Academic Day na PJWSTK, gdzie postanowiłem podjąć tematykę SOA i WCF.

Największym jednak osiągnięciem w dziedzinie prowadzenia prezentacji był mój udział, a w rezultacie wygrana w konkursie Speaker Idol odbywającym się w ramach Microsoft Technology Summit.

W tym roku przysiadłem też trochę do projektów, które możecie znaleźć na dedykowanej stronie mojego bloga. Przygotowałem ShipBattleChallenge, MassMail oraz Windows Phone 7 Accelerometer Emulator,  który to spotkał się z dużym zainteresowaniem wśród deweloperów WP7.

Zaktywizowałem się również jeżeli chodzi o pisanie. Od września przygotowuję cykl artykułów poświęcony Windows Communication Foundation, który możecie znaleźć na portalu codeguru.pl. Ich aktualna lista znajduje się na stronie Artykuły i publikacje. Na dzień dzisiejszy artykuły te mają sporo ponad 10000 odsłon!

Idąc krok dalej postanowiłem również spróbować swoich sił na CodeProject.com opisując wymieniony wyżej emulator akcelerometru, który w ciągu dwóch tygodni odwiedziło prawie 4000 czytelników.

Jak widać trochę się działo, i mam nadzieję, że będzie się dziać również w 2011 roku: w planach webcasty, organizacja konferencji, prelekcje (w tym MTS oraz Silesian CodeCamp), artykuły, książka(i).

Jednocześnie z tego miejsca chciałbym złożyć wam życzenia na nadchodzący rok:

Aby każda chwila przy ekranie monitora była związana z pasją tworzenia i zdobywania wiedzy, a przede wszystkim dobrą zabawą, która z tego płynie. Żeby codziennie móc do siebie powiedzieć – jestem zadowolona/zadowolony z dzisiejszego dnia.


Windows Phone 7 Accelerometer Emulator

Windows Phone 7 Accelerometer Emulator
W dziale projektów dodałem najnowszy projekt, który ma na celu ułatwienie tworzenia aplikacji opartych o akcelerometr. Jak wiadomo emulator WP7 nie wspiera takiej funkcjonalności, dlatego postanowiłem przygotować odpowiedni projekt, który pozwala uporać się z tym problemem bez wykorzystania dodatkowych urządeń.

Aby z niego skorzystać wystarczy dosłownie kilka linijek kodu:

1
2
3
4
5
6
7
8
9
10
11
var acc = new WP7AccelerometerProvider();
acc.ReadingChanged += OnAccelerometerProviderReadingChanged;
 
try
{
    acc.Start();
}
catch (Exception exc)
{
    //txtblk.Text = exc.Message;
}

oraz obsłużenie pojawienia się nowych informacji:

1
2
3
4
5
private void OnAccelerometerProviderReadingChanged(object sender, WP7AccelerometerReadingEventArgs args)
{
    //do what you want with data
    ProcessAccelerometerData(args.X, args.Y, args.Z, args.Timestamp);
}

Przykładowy screen wykorzystania emulatora:

WP7 Accelerometer Emulator UI

Jest to pierwsza wersja emulatora, jednakże w wolnym czasie będę starał się ją rozwijać o czym możecie przeczytać na stronach:

Strona projektu w języku polskim
Strona projektu w języku angielskim


  • O mnie

    Maciej Grabek

    Moje profile na:

    MVP

    Codeguru.pl GoldenLine
    Twitter CodeProject

  • english version
  • Polecam

  • Copyright © Maciej Grabek. All rights reserved.
    Powered by WordPress
    %d bloggers like this: