Archive

Archive for the ‘Tutorial’ Category

HTC Magic Hax

November 5th, 2009

Det viser sig at HTC ikke er super fede til at opdatere deres telefoner. For Android telefoner som HTC Magic er det op til operatøren og producenten at lave et nyt build og pushe den ud på folks telefoner.

HTC og 3 har tilsyneladende helt undladt at gøre noget ved dette i Danmark. Så jeg har set mig nødsaget til at tage tingene i egen hånd!

Det var egentlig ud fra et ønske om at få tethering på min telefon nu jeg får en lille ny laptop i hjemmet. Der viser det sig at for at kunne bruge bluetooth til det skal man have root access og det kan man kun hvis man flasher sin ROM.

Hvis jeg alligevel skal igang med det, så flasher vi lige en nyere version på tænkte jeg så! Da Android jo er open-source så har folk jo super meget styr på hvordan man klarer det så det er faktisk skide let.

Jeg kan referere til denne fantastiske wiki/guide: http://wiki.xda-developers.com/index.php?pagename=HTC_Sapphire_Hacking af Radix999. Følger man den er det så let som ingenting at få sin HTC Magic up to date! Husk bare det der nandroid backup step, bare hvis nu den skal sendes ind og man ikke vil have problemer med dem. Hvis man f.eks. vælger at installere CyanogenMOD så er det endda 100% lovligt.

Sidst vil jeg lige påpege at det MEGET VEL kan anbefales at opdatere. Min egen kan nu følgende ting den ikke kunne før:

  • Ikke køre skide langsomt og “hakke” ligeså meget
  • Tethering (mangler jeg lige at teste!)
  • HTC Sense UI!
  • Finde ud af at gætte sig frem til ord med danske bogstaver så som “så” og “gå” (Det  var bare RØV irriterende før)
  • Synkronisere med Facebook

Og en masse mere! Det der er bare lige dem jeg lige har fundet og skulle bruge!

felizk Personal, Tips, Tutorial

Vista Media Center SDK Guide 2

April 21st, 2008

Dette er anden del af min Vista Media Center SDK Guide. Første del omhandler at sætte Visual Studio op med et projekt så det kan debugges direkte i Vista Media Center.

Into the belly of the beast: MCML Part One!

Hvis du har fulgt første del af min guide korrekt (og jeg har skrevet den korrekt) så skulle du nu have et projekt der kan compiles og køres i vista media center. Når du gør det får du forhåbentlig denne skærm:

image

Folkene bag SDK’et har været så flinke at give os nogle sample filer at lege med.

Dem vil vi så gerne lægge til siden så vi kan tage tingene fra bunden af :)

Første trin er hvordan vi bruger vores egne MCML filer. MCML kan loades direkte fra en url/uri eller gemmes i projektets resources. Vi vil gøre som de fine herrer hos Microsoft og lægge vores MCML filer i Resources.

Lav en nyt mcml dokument under Markup med Add->New Item…->Mcml File, kald det Forside.mcml. Nu skal filen tilføjes til Resources. Det kan gøres ved at åbne projektets properties og vælge Resources eller dobbelt klikke Resources.resx. Med resources åben, træk Forside.mcml fra Solution Exploreren over i resources vinduet. Vinduet vælger nu at vise dig hvilke Files der er tilføjet til resources incl. Forside.mcml.

Nu sætter vi lige vores add-in til at starte med vores forside istedet for Menu.mcml. Det gøres i Application.cs under GoToMenu():

public void GoToMenu()
{
    Dictionary<string, object> properties = new Dictionary<string, object>();
    properties["Application"] = this;
 
    if (session != null)
    {
        ///////////////////////////////////////////////////Menu    //stod der før
        session.GoToPage("resx://MCTest2/MCTest2.Resources/Forside", properties);
    }
    else
    {
        Debug.WriteLine("GoToMenu");
    }
}

 

Med den ændring kan projektet compiles og køres:

image

Resources i MCML

Der er flere forskellige måder at referere til resources i MCML. (Med Content menes billeder, strenge, mcml filer mm.) Man kan som vi lige har gjort gemme resources i Resources.resx, det er smart for MCML filer og billeder, som addin’et skal bruge. Man kan derud over bruge:

  • .res filer, som jeg ikke ved så meget om
  • http, ved at bruge en ganske normal url
  • file, file://DriveLetter:\FolderName\IdentifierName, for eksempel

    file://E:\MyButton.mcml

Når man bruger .resx, som her er adressen man bruger resx://AssemblyName/ResourceContainerName/IdentifierName. Den lille finurlighed man skal holde øje med er ResourceContainerName, som inkluderer namespace som prefix (det rodede jeg en del med).

Du kan læse mere om dette i Windows Media Center SDK under Using Resources in MCML.

MCML

Åben nu Forside.mcml igen. Som du kan se er MCML blot et XML dokument. Den nemmeste måde at se på et mcml dokument er at se det, som et projekt for sig selv. Komplet med assembly referencer, klasser, objekter, lokale variabler, events og metoder. Metaforet passer selvfølgelig ikke 100% på men som du vil se er der mange paralleler.

<Mcml>

Top elementet indeholder referencer til andre Mcml dokumenter og .NET assemblies (Yep, man kan direkte fra MCML instanciere objekter og kalde metoder fra .NET). Den første attribut xmlns=”http://schemas.microsoft.com/2006/mcml” definerer blot at dette er et mcml dokument og at der findes et xml skema, der skal overholdes. Det er rigtig nice fordi så kan Visual Studio bruge Intellisense :)

Efter det har vi en reference til System: xmlns:cor=”assembly://MSCorLib/System” dette definerer cor som et synonym for namespacet System i assemblien MSCorLib. Hvilket vil sige at hvis vi skal bruge en streng vil vi skulle skrive cor:String som type.

Lad os på dette tidspunkt tilføje en reference til vores projekt, så vi kan tilgå det kode vi laver senere. tilføj en ny attribut

<Mcml xmlns="http://schemas.microsoft.com/2006/mcml"
      xmlns:cor="assembly://MSCorLib/System"
      xmlns:a="assembly://MCTest/MCTest" >

Hvor MCTest skal være navnet på dit projekt.

<UI>

UI svarer til at lave en klasse i C#. Faktisk svarer det lidt til at lave en User Control, som kendt fra Windows Forms. Name attributten er påkrævet, ligesom det er påkrævet at navngive sine klasser. Som med klasser kan man nedarve UI elementer med BaseUI attributten, men det går jeg ikke lige ind i her.

<Properties>

Properties er ligesom public properties i C#. Det er variabler der er mulige at sætte fra andre UI elementer. I det her eksempel har vi MyColor som en property. Dvs. at hvis jeg ville instanciere Forside fra en anden UI med en anden farve i MyColor ville jeg gøre sådan:

<f:Forside MyColor="Black" />

Givet at jeg har lavet en reference til Forside.mcml i <Mcml>

<Mcml xmlns="http://schemas.microsoft.com/2006/mcml"
      xmlns:cor="assembly://MSCorLib/System"
      xmlns:a="assembly://MCTest/MCTest"
      xmlns:f="resx://MCTest/MCTest.Resources/Forside">

Hvis jeg ville have at man skulle selv definere MyColor istedet for at den har en default værdi, så ville jeg skrive:

<Color Name="MyColor" Color="$Required"/>

$Required er et keyword i Properties.

Application.cs sender i GoToMenu() en reference til sig selv i en property kaldet Application, hvis vi vil have adgang til den fra Forside skal vi have defineret den property:

<a:Application Name="Application" Application="$Required"/>

Linjen definerer en property af typen Application fra namespacet a giver propertien et navn, som den kan refereres via i dette UI element, og at værdien af den nye property skal gives som input til UI elementet når det bliver brugt.

<Locals>

Locals er som det lyder, lokale variable, dette kan være alle former for objekter og de er kun tilgængelige i dette <UI>. Locals er som instans variable så hver instans af en UI har sin egne Locals.

<Rules>

Rules er hvor ting bliver sjovere og hvor klasse metaforet falder lidt fra hinanden. Her kan man lave regler for hvad der skal ske når events bliver affyret. Man kan definere hvad der skal ske når objekter’s properties bliver ændret, dog kun hvis man har lavet de properties korrekt ;)

Rules er lidt mere avanceret og kun sjovt hvis vi har nogle meningsfyldte rules at lave, så indtil videre springer vi lige dette over. Jeg vil dog lige hurtigt forklare <Default>. Default reglen sætter værdien af Target til værdien i Value hvis ingen andre regler definerer hvad Target skal være. I eksemplet:

<Default Target="[MyText.Content]" Value="[MyString]"/>

Her bliver Mytext.Content sat til strengen MyString som er defineret i Locals. Hvis der ikke er andre regler der sætter MyText.Content til noget andet. Med det menes at vi kunne have lavet en Condition rule der hvis et bestemt krav er overholdt sætter MyText.Content til noget andet. Hvis det krav på et tidspunkt ikke længere er opfyldt vil MyText.Content få værdien MyString igen, pga Default reglen.

Når man bruger variable som parametre i attributter skal der klammer rundt om.

<Content>

Content er hvor selve interfacet skal defineres. Her bruges predefinerede og egne UI elementer til at beskrive hvordan dette UI element skal se ud. Der kan kun være et element under <Content> men heldigvis kan det element være et sammensat element som <Panel>, <ColorFill> eller <Clip>. I Forside.mcml er der kun et <Text> element i Content, Text er indbygget og er stortset en label, sæt den et sted med en font og farve så skriver den noget tekst.

En knap

Vi vil starte med at lave en simpel knap, så når vi trykker på den vises en dialog boks. Vi tager selvfølgelig udgangspunkt i Forside.mcml.

Knappen vi laver skal have et fint lille ikon og noget tilhørerende tekst, og så må den egentlig gerne være centreret på skærmen.

Først skal vi have et <Panel>, <ColorFill> eller <Clip> ind fordi vi skal bruge mere end det ene <Text>. Så det første vi gør er at putte <Text> ind i en <ColorFill>. Vi bruger en color fill for så er det åbentlyst hvor stor knappen er :)

<ColorFill Content="Gray">
  <Layout>
    <FlowLayout ItemAlignment="Center" Orientation="Horizontal"/>
  </Layout>
  <Children>
    <Text Name="MyText" Color="[MyColor]" Font="Calibri, 24"/>
  </Children>
</ColorFill>

Alle container elementerne som colorfill har 2 vigtige under elementer, det er layout og children. Layout bestemmer hvordan containerens children skal positioneres ifht hinanden, hvis man ikke bruger noget layout vil alle bare blive tegnet ovenpå hinanden. Den jeg har valgt her er FlowLayout, som tegner alle elementer i en række enten horizontalt eller vertikalt. I dette tilfælde horizontalt og ItemAlignment siger hvordan elementerne skal positioneres på det andet led, her er center valgt for så er elementer centreret ifht det største element.

Nu vil vi gerne have et ikon på vores knap, dette gøres ved at lægge et billede i projektets resources, det er under Project-> Properties-> Resources -> Vælg Images (Ctrl+2). Her kan man trækket et billede over i eller bruge Add Resource -> Existing File. Du kan evt bruge dette billede(*hint til fremtidige guides*):

harddisk

Med billedet i resouces kan vi tilføje det til vores color panel. Lige før Text elementet skriv:

<Graphic Content="resx://MCTest/MCTest.Resources/harddisk" />

Hvis du starter debugging nu vil der være en “knap” i øverste venstre hjørne. Men vi vil egentlig gerne have den centreret, så vi lægger ColorFill ind i et Panel:

<Content>
  <Panel Layout="Center">
    <Children>
      <ColorFill Content="Gray" Name="Baggrund">
        ...
      </ColorFill>
    </Children>
  </Panel>
</Content>

Dette panel bruger en Inline Layout parameter, som jeg ikke vil komme ind på nu, blot at dette Center layout lægger alle underelementer direkte i midten af Panelet (oven på hinanden) så den er bedst at bruge hvis man kun har et element under <Children>. Hvis du har gjort sådan som jeg har forestillet mig du ville vil du nu have denne skærm hvis du starter debugging:

image

Nu har vi en dødkedelig knap man faktisk ikke kan noget med. For at få lidt gang i denne knap skal vi til at lave nogle rules.

Først og fremmest vil vi gerne have knappen til at kunne få fokus. Under <Rules> tilføjer vi:

<Default Target="[Input.KeyInteractive]" Value="true" />

Som betyder sæt denne UI til at være interaktiv! Input er en indbygget variabel. Når knappen kan få focus kan vi gøre så den kan klikkes på, til det skal vi bruge en Input handler, nemlig ClickHandler. Sådan en oprettes under <Locals>:

<ClickHandler Name="Clicker"/>

Desuden skal der oprettes en Command, som blot er et objekt der forstår konceptet af at blive Invoked. (Til tider bruges interfacet ICommand istedet så man kan sende en command som parameter under Properties, men det kommer vi tilbage til). Nu skal vi bare bruge en Command under <Locals>:

<Command Name="Kommando" />

Nå man klikker med vores Clicker skal Kommando Invokes. Det beskriver man ved at binde Kommando til Clicker.Command under <Rules>:

<Binding Target="[Clicker.Command]" Source="[Kommando]" />

Dette er stortset synonym for Clicker.Command = Kommando;. Nu kan vi faktisk klikke på vores knap. Men da Kommando stadig ikke gør noget sker der heller ikke noget. For at gøre det lidt sjovere vil vi kalde en funktion fra vores C# kode i Application.cs, der er der allerede en funktion:

public void DialogTest(string strClickedText)

Som vi vil kalde. Det gør man også med en Rule:

<Changed Source="[Kommando.Invoked]">
  <Actions>
    <Invoke Target="[Application.DialogTest]"
            strClickedText="Uhh, gør det igen!" />
  </Actions>
</Changed>

Denne siger: Hvis Kommand.Invoke ændrer sig (eller i dette tilfælde, da Invoked faktisk er et event, bliver affyret) så udfør alle opgaver under <Actions>. <Invoke> kalder en funktion på et eller andet objekt. Da Application er defineret i vores Properties kan vi kalde DialogTest på den direkte ved navn. De parametre DialogTest tager skal tilføjes som attributter til <Invoke> disse er case-sensitive!, i dette tilfælde er det strClickedText. som selvfølgelig er den tekst der skal stå i dialogboksen.

Nu skulle det være muligt at klikke knappen og få følgende fine besked:

image

Till next time

Det var det for denne del af guiden. I del 3 vil jeg begynde at lave en Filbrowser, hvor der skal laves lister og disse skal bindes til filbrowser C# kode.

Sidst får du lige her min kilde kode for Forside.mcml.

felizk Programming, Tips, Tutorial, Vista Media Center

Vista Media Center File Browser

April 13th, 2008

Mens jeg legede rundt og sugede information til mig om hvordan man laver Addins til Media Center, fik jeg lavet noget som er bare en lille smule brugbart ^^

Introducerer: Vista Media Center File Browser

image

Til alle de folk som er trætte af den indbyggede video browser. Den er hardcoded til at finde ogm,mp4,avi og mpg.

Af kendte bugs er at man nogle gange har svært ved at komme over i Drive listen, det tager et par klik og så at jeg har overridet BACK knappen til at være gå et directory op.

Download

felizk Programming, Tutorial, Vista Media Center

Vista Media Center SDK Guide 1

April 11th, 2008

Kravet for at følge med i denne guide er at man har Visual Studio af en eller anden slags og Vista Media Center SDK installeret.

Oprettelse af et nyt projekt

Det første vi vil gøre er at lave et projekt vi kan arbejde på og konfigurere det så vi kan køre det i Vista Media Center.

Efter at have installeret SDK’et så skulle være dukket nogle nye project templates op i Visual Studio’s New Project Dialog:

image

De nye project tempates er:

  • Windows Media Center Application
  • Windows Media Center Application – Background Application
  • Windows Media Center Application – Fundamental

Til denne del af guiden skal du bruge Windows Media Center Application.

Sign the assembly

Efter at have lavet et nyt projekt, skal der laves en strong key til assembliet. Det gør man ved at tage properties for projektet og gå under signing. Hvor "Sign the assembly" krydses af og "New…" vælges i dropdown boksen. I "Key file name" skrives nøglens navn (kan være hvad som helst, men jeg kalder den bare det samme som projektet hedder), hvor efter man kan sætte password på nøglen, gør jeg ikke.

Assemblien skal signes fordi, for at vista media center kan bruge plugin’et skal det lægges i Global Assembly Cache, og det kræver at den er signet.

Generer public key

Den strong key der er genereret skal herefter indsættes i Registration.xml. Det gør man ved at generere en public key til den med programmet "sn.exe".

  • Først skal assemblien buildes, Build -> Build Solution
  • Derefter tilføjes sn.exe i Tools -> External Tools…
  • I External Tools dialogen tilføjes blot et nyt tool C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe med argumentet -Tp "$(TargetPath)" hvorefter Use Output Window markeres som det eneste af fluemærkerne
  • Kør nu sn.exe ved Tools -> Get Public Key
  • Kopier public key token
  • Åben Registration.xml og indsæt keyen istedet for insert_public_key_token_here

image

Kør i Vista Media Center

Hvis du compiler nu og starter debugging (F5) vil du få programmet MCMLPad.exe hvor du kan se dit MCML. Det er dog ikke så fedt når du skal debugge. Derfor vil vi gerne køre det i Vista Media Center og så debugge der.

Det skal dog lige nævnes at man ikke kan debugge direkte fra vista media center hvis ikke man har Visual Studio Professional eller højere. Det er fordi man skal bruge "Attach to process…" under Tools. Dog kan vi stadig gøre så man kan køre projektet direkte i vista media center ved debug start.

Lad os først få den til at køre plugin’et direkte i vista media center når der compiles release version.

Gå under Properties for projektet under Build Events. Her skal vi køre DevInstall.cmd efter at have buildet. I Post-build event tilføjes disse 2 linjer:

cd $(ProjectDir)
$(ProjectDir)DevInstall.cmd

Dette vil installere vores projekt i GAC’en.

Nu skal vi have Visual Studio til at køre Media Center istedet for MCMLPad. Først skal vi bruge 2 ID’er, vores plugin’s og det entrypoint den skal bruge (det kommer jeg lige tilbage til i en senere guide). Disse står i Registration.XML. Det første er den id attribut der er på application, og den anden er id attributten på entrypoint.

Gå derefter under Debug i project Properties. Sørg for at Configuration er sat til Release. Sæt Start external program til "C:\Windows\ehome\ehshell.exe", og command line arguments til:

/entrypoint:app_id\entrypoint_id

Det skal være uden krølle parenteser eg:

image

Gå nu i File->Save All og tryk F5 eller Debug->Start Debugging… (husk at sætte konfigurationen til Release)

Sidst og klart fedest: Real-time debug i Media Center

Det er denne del der kræver Visual Studio Pro eller højere.

Nu kan vi køre vores plugin i Media Center, men vi har ingen breakpoints og crasher skidtet får vi da en exception print out, men vi vil da hellere have rigtig debugging som vi kender det fra windows forms.

Det kan også lade sig gøre, man skal dog lave nogle krumspring. Først og fremmest skal vi i registrerings databasen og tilføje:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Media Center\Settings\Extensibility]
"EnableAddInLaunchDebugging"=dword:00000001

Det kan du gøre manuelt eller via denne .reg fil: EnableVMCDebugging.reg. Det kan slås fra igen med denne: DisableVMCDebugging.reg

Det næste vi gør er at sørge for at Vista Media Center også bliver startet for Debug konfigurationen. Under project Properties skal du under Debug vælge Debug konfigurationen og så sætte de samme ting som vi gjorde for at starte med Release.

Derefter skal vi lige ændre på Build Events for at sørge for at Debug installeres i GAC’en istedet for Release versionen. Det er bare at ændre:

$(ProjectDir)DevInstall.cmd til $(ProjectDir)DevInstall.cmd /debug

Build og Start Debugging…, nu starter Vista Media Center op med en dialog boks der siger "Debug Application". Det er nu vi skal tilføje processen til Visual Studio’s debugger. Gå i Tools -> Attach to process eller tryk (CTRL+ALT+P), find ehexthost.exe og tryk attach.

Gå ind i Launch.cs og sæt et break point på app.GoToMenu(); vælg Media Center og tryk OK, visual studio skulle nu gerne breake :D

Jeg har ikke fundet nogen automatisk måde at attache processen når man debugger desværre :/

Slut

Nu har vi et projekt igang og kan starte og debugge det. Så skal vi bare lære hvad man gør herfra. Der er et monster der hedder MCML, der skal tæmmes og garanteret et par sære finurligheder ved at lave Vista Media Center plugins, men det gemmer jeg til de næste guides :)

Kilder:

felizk MSP, Programming, Tutorial, Vista Media Center

Creating a game from Scratch in XNA

February 7th, 2008

Dan Waters made a guitar controlled game from scratch and recorded videos of every step from conception to the final game! He made 12 segments detailing everything from 3d modelling to code and audio authoring. Go check it out here!

felizk Tutorial, XNA