Tuesday, December 15, 2009

Car trip from Phoenix to San Francisco


From Phenix to San Francisco car trip.
2210 miles (3556 km), 12 days (29 Nov to 9 Dec 2009).

Day 1
1 Phoenix [map, photos, info]
3. Sedona [map, photos, info]
4. Oak Creek Canyon [map, photos, info]
6. Navajo National Monument [map, photos, info]
7. Kayenta [map, photos, info]
8. Monument Valley [map, photos, info] 9. Page [map, photos, info]
Day 2
9.1 Horseshoe bend [map, photos, info]
9.2 Antilope Canyon [map, photos, info]
10. Grand Canyon National Park - South Rim [map, photos, info]
10.1 Helicopter tour [map, photos, info]
11. Peach Springs - Hualapai Lodge [map, photos, info]

Day 3,4
11.1 Havasu Falls 3 day Hike [map, photos, info]
Day 5
Return from Grand Canyon to Las Vegas
Hoover Dam [map, photos, info]
12. Las Vegas - Planet Hollywood [map, photos, info]
12.1 Cirque du Soleil - KA and "O" [map, photos, info]
Day 6
13. Beatty - Lunch [map, photos, info]
14. Death Valley - [map, photos, info]
14.1 Titus Canyon [map, photos, info]
14.2 North Crater [map, photos, info]
17. Bishop [map, photos, info]
Day 7
18. Mono Lake [map, photos, info]
21. Jackson [map, photos, info]
22. Yosemite - Evergreen [map, photos, info]
Day 8
22.1 Evergreen Yosemite tour [map, photos, info]
Day 9
23. Old Sacramento [map, photos, info]
24. Point Reyes [map, photos, info]
Day 10 and 11
25. San Francisco [map, photos, info]

Friday, October 16, 2009

"Como gerir projectos impossíveis com agilidade" - talk no 1º Ignite Portugal



Ontem, no 1º Ignite Portugal, fiz uma apresentação sobre as metodologias ágeis.





Ignite Portugal é um conjunto de eventos abertos à participação de todos que giram em torno de apresentações sobre temas como inovação, criatividade, empreendedorismo ou tecnologia, em que os apresentadores têm apenas 5 minutos para falar, com 20 slides que rodam automaticamente a cada 15 segundos.

A apresentação está no slideshare.



Mais detalhes aqui

Wednesday, September 09, 2009

BitmapEffects with WriteableBitmap

Folowing this post, here is another set of visual effects applied to a image. The effects are enabled by using the WriteableBitmap class of Silverlight 3.

Running Demo. Download of the source code.

Monday, September 07, 2009

“The world in 2015” – A world of content

Article writen for the newspaper Semanário Económico – outlook - (5 de Setembro de 2009) for the topic "The World in 2015". Article in Portuguese:

“Daqui a 6 anos estaremos em plena revolução ao nível de conteúdos, desde a produção e distribuição até ao seu consumo. Os conteúdos serão uma ‘commodity’, forçada pela sua desmaterialização e facilidade de acesso através das redes digitais, e a experiência de consumo será a componente fundamental.

A produção de conteúdos irá mudar. Aliás, está progressivamente a deixar de estar exclusivamente nas mãos das grandes editoras ou produtoras. Cada vez mais, qualquer pessoa pode ser o autor de um livro, de um filme ou de uma estação de rádio e facilmente disponibilizar esse conteúdo a quem quer que esteja interessado. As melhores bandas, os melhores escritores e produtores serão escolhidos directamente por nós, sem a interferência de grandes campanhas de marketing.

Mas o consumo de conteúdos também está a mudar. Estamos num ponto de inflexão onde deixaremos de consumir o que outros decidem para passarmos a ser nós próprios a decidir que conteúdos vamos consumir, quando e onde. Eu serei o editor da minha revista, as rádios tocarão a música que eu gosto, as televisões emitirão os meus programas favoritos e os filmes, mesmo ainda não os tendo visto, serão os que têm a maior probabilidade de eu gostar.

Já começamos a assistir a um movimento de convergência digital onde os formatos físicos estão a ser substituídos pelos digitais. As velhas fotografias são substituídas pelos álbuns no Flickr, os vinis e cd’s pelos mp3 no iTunes, os filmes de 8mm e vhs de família pelos filmes no Youtube, já para não falar das tradicionais cartas que foram substituídas pelo email e que em 2015 serão substituídos por aplicações mais interactivas como o Google Wave. Em 2015 haverá muito poucos formatos físicos. Não é a disquete, que essa já nem os jovens actuais sabem o que é. Refiro-me aos cds, dvds e eventualmente os livros tal como os conhecemos. Tudo passará a estar disponível na rede e através dela, a qualquer hora, a partir de qualquer sítio e em qualquer dispositivo. Porque razão é que eu tenho de pagar novamente os direitos de autor de um CD musical se o formato físico comprado se estragar e eu pretender um novo? Qual é a loja que recebe o meu CD antigo e me dá um novo cobrando apenas o custo do formato físico? A importância passa para os direitos de autor e deixa de ser a distribuição e produção.

Será possível assistir a um filme ao mesmo tempo que os meus amigos, comentado cada uma das cenas à medida que elas vão acontecendo estando, no entanto, cada um na sala de sua casa. A proximidade de comunicação vai ser muito maior apesar de estarmos fisicamente distantes. Os dispositivos estarão interligados na disponibilização da melhor experiência de consumo. Poderei estar a assistir a um concerto da minha banda preferida na televisão de casa, e ao ter de me deslocar para o carro a música segue sem interrupções para o meu ipod e passa do mesmo modo para a aparelhagem do carro sem qualquer corte de fluidez musical na troca dos dispositivos emissores.

Não acontecerá apenas uma mudança tecnológica mas sim industrial, cultural e social. Tal como dizia Charles Darwin, não são as espécies mais fortes ou mais inteligentes que sobrevivem mas sim aquela que tem uma maior capacidade de adaptação. As grandes empresas de media que não demonstrem capacidades de se adaptar desaparecerão do mercado. A batalha contra a troca ilegal de ficheiros na internet será ganha pelos prevaricadores e as empresas passarão a adaptar a sua oferta, não ao conteúdo em si, mas sim aos serviços e experiências dados para além do conteúdo. Todos temos a noção que, nos cinemas, o que dá lucro são as pipocas e não o filme em si!

Assim sendo, o grande dilema em 2015 será como é que os produtores de conteúdos irão ter dividendos para continuar a produzir. Como é que se evita sermos inundados por obras de amadores e não chegarmos a ver obras de profissionais pois não conseguem obter o sustento necessário? A experiência de consumo é a resposta. Para a indústria musical serão os concertos a dar essa experiência e a gerar retorno. Mais complicado será para os escritores ou produtores de filmes que terão que utilizar meios interactivos muito mais complexos. Mas isso é outra história…”

SemanarioEconomico_outlook_05.09.2009.mundo2015_tas

Wednesday, September 02, 2009

Sample WritableBitmap

the image to a random color. The image is being redraw regularly so it shows a notion of “rain”. Here is the initialization:

        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{

Screen.Width
= ScreenWidth;
Screen.Height
= ScreenHeight;

//Criaco do object writablebitmap com o tamanho indicado.
bitmap = new WriteableBitmap(ScreenWidth, ScreenHeight);
//Indicao de qual o elemento que ira fazer a visualizao do writable bitmap.
Screen.Source = bitmap;

//registar o evento para fazer o render regular
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
}


After initilization and on each frame we redraw the pixels randomly:

void CompositionTarget_Rendering(object sender, EventArgs e)
{
var index
= MaxScreen;

//Pintar cada pixel
while (--index > -1)
{
//cor aleatoria para cada pixel
var color = System.Convert.ToInt32(rnd.Next(0xffffff));
bitmap.Pixels[index]
= color > 0xffffff ? 0xffffff : color;
}

//força o bitmap a redesenhar
bitmap.Invalidate();
}


Regarding the XAML we use an image of a TV to give a more realistic effect:



    <Grid x:Name="LayoutRoot" Background="#FFFFFFFF">
<Image x:Name="tv" Source="tv.jpg" Margin="68,29.807,72,53.193" d:LayoutOverrides="Width, Height"/>
<Image x:Name="Screen" OpacityMask="{x:Null}" Margin="99,57,100,0" Opacity="1" VerticalAlignment="Top" Height="216" Width="390"/>
</Grid>


The result is:



clip_image002


You can download the source code here and the demo can be seen here.

We can also play with the mouse movement and make it create interferences on the TV. We need to capture the mouse movement event and act accordingly:

//Repaint the screen regularly
void CompositionTarget_Rendering(object sender, EventArgs e)
{
var index
= MaxScreen;

//Paint each bitmap pixel.
while (--index > -1)
{
if (index % (mouseLastPos.X/2 + mouseLastPos.Y/2)+rnd.Next(20) < 15)
bitmap.Pixels[index]
= 0xffffff;
//bitmap.Pixels[index] = Convert.ToInt32(mouseLastPos.X * mouseLastPos.Y+5000);
else
{
//Random color for each pixel.
var color = System.Convert.ToInt32(rnd.Next(0xffffff));
bitmap.Pixels[index]
= color > 0xffffff ? 0xffffff : color;
}
}

//force bitmap repaint
bitmap.Invalidate();
}

Final result can be seen here.

Microsoft Surface demos

I recently developed a series of tests and demos os Microsoft Surface to some clients and journalists. As a result there was some magazine coverage: Pc Guia, Bit (pg1 e pg2) and also a TV show "episódio 4 da Exame Informática TV" that was recorded at Fullsix and brodcasted by Sic Notícias.


The prototypes that I developed can be seen here. One of these prototypes was also showed at the keynote of Microsoft DevDays 09.

Wednesday, March 18, 2009

XAML PT community lauched

Today we lauch a new community that aims at Microsoft's Presentation Technologies: XAML PT. Namely the development of Silverlight, WPF and Surface applications that use XAML. The community is intended for Portuguese speaking people and will be formally released at the same time as the Keynote of MIX09 this afternoon (GMT).

I would like to thank Fullsix Portugal for sponsoring this community.

Saturday, February 21, 2009

Web site frontend performance

This week I presented at DevDays09 the session WUX303 – Optimização de Performance de Web Sites. This session had great feedback. It was ranked number 7 of the overall 75 sessions of the event.

It was an overview of the book “High Performance Web Sites” by Steve Souders. I presented the 14 rules and showed some demos and tools that help on optimizing your website.

Here are some of the tools I used:

Here are the slides of the presentation and the demos.

Sunday, February 15, 2009

Changing sound frequency for game

Hi!
I wanted to be able to change a sound frequency according to the strength applied to a element inside a game. Based on this thread I changed the sample to allow to change at real time the frequency of the sound being played.

The code that does the thing is:

   1: BufferDescription d = new BufferDescription();


   2: d.ControlFrequency = true;


   3: sound = new SecondaryBuffer("C:\\Windows\\Media\\ding.wav", d, applicationDevice);


   4: sound.Frequency = 0; //The default frequency


   5: sound.Play(0, BufferPlayFlags.Looping);


   6: if you want to change the frequency:


   7: sound.Frequency = <some value>;




Here is the complete code:



(you need to add a reference to Microsoft.DirectX.DirectSound)






   1: using System;


   2: using System.IO;


   3: using System.Drawing;


   4: using System.Collections;


   5: using System.ComponentModel;


   6: using System.Windows.Forms;


   7: using System.Data;


   8:  


   9: using Microsoft.DirectX.DirectSound;


  10:  


  11: namespace Noisey


  12: {


  13:     /// <summary>


  14:     /// Very simple test form


  15:     /// </summary>


  16:     public class MainForm : System.Windows.Forms.Form


  17:     {


  18:         private System.Windows.Forms.Button btnPlay;


  19:         /// <summary>


  20:         /// Required designer variable.


  21:         /// </summary>


  22:         private System.ComponentModel.Container components = null;


  23:  


  24:         Device applicationDevice;


  25:         SecondaryBuffer sound;


  26:         private BufferDescription d;


  27:  


  28:         private TrackBar trackBar1;


  29:         private TextBox txtFreq;


  30:         private Label label1;


  31:         private Label label2;


  32:         private Button btnStop;


  33:         private OpenFileDialog openFileDialog1;


  34:         private Button btnNewFile;


  35:         private Label lblFile;


  36:         private Label label3;


  37:         


  38:         


  39:  


  40:         public MainForm()


  41:         {


  42:             //


  43:             // Required for Windows Form Designer support


  44:             //


  45:             InitializeComponent();


  46:  


  47:             //


  48:             // Add any constructor code after InitializeComponent call


  49:             //


  50:             applicationDevice = new Device();


  51:             applicationDevice.SetCooperativeLevel(this, CooperativeLevel.Normal);


  52:             


  53:             d = new BufferDescription();


  54:             // Set descriptor’s flags


  55:             d.ControlPan = true;


  56:             d.ControlVolume = false;


  57:             d.ControlFrequency = true;


  58:             d.ControlEffects = false;


  59:  


  60:             //Load a default file


  61:             sound = new SecondaryBuffer("C:\\Windows\\Media\\ding.wav", d, applicationDevice);


  62:             sound.Frequency = 0; //The default frequency


  63:  


  64:             //Disable stop button because it's not playing yet.


  65:             btnStop.Enabled = false;


  66:         }


  67:  


  68:         /// <summary>


  69:         /// Clean up any resources being used.


  70:         /// </summary>


  71:         protected override void Dispose(bool disposing)


  72:         {


  73:             if (disposing)


  74:             {


  75:                 if (components != null)


  76:                 {


  77:                     components.Dispose();


  78:                 }


  79:             }


  80:             base.Dispose(disposing);


  81:         }


  82:  


  83:         #region Windows Form Designer generated code


  84:         /// <summary>


  85:         /// Required method for Designer support - do not modify


  86:         /// the contents of this method with the code editor.


  87:         /// </summary>


  88:         private void InitializeComponent()


  89:         {


  90:             this.btnPlay = new System.Windows.Forms.Button();


  91:             this.trackBar1 = new System.Windows.Forms.TrackBar();


  92:             this.txtFreq = new System.Windows.Forms.TextBox();


  93:             this.label1 = new System.Windows.Forms.Label();


  94:             this.label2 = new System.Windows.Forms.Label();


  95:             this.btnStop = new System.Windows.Forms.Button();


  96:             this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();


  97:             this.btnNewFile = new System.Windows.Forms.Button();


  98:             this.lblFile = new System.Windows.Forms.Label();


  99:             this.label3 = new System.Windows.Forms.Label();


 100:             ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();


 101:             this.SuspendLayout();


 102:             // 


 103:             // btnPlay


 104:             // 


 105:             this.btnPlay.Location = new System.Drawing.Point(18, 64);


 106:             this.btnPlay.Name = "btnPlay";


 107:             this.btnPlay.Size = new System.Drawing.Size(87, 20);


 108:             this.btnPlay.TabIndex = 0;


 109:             this.btnPlay.Text = "Play Sound";


 110:             this.btnPlay.Click += new System.EventHandler(this.btnPlay_Click);


 111:             // 


 112:             // trackBar1


 113:             // 


 114:             this.trackBar1.Location = new System.Drawing.Point(37, 124);


 115:             this.trackBar1.Maximum = 50000;


 116:             this.trackBar1.Minimum = 1000;


 117:             this.trackBar1.Name = "trackBar1";


 118:             this.trackBar1.Size = new System.Drawing.Size(190, 45);


 119:             this.trackBar1.TabIndex = 1;


 120:             this.trackBar1.Value = 30000;


 121:             this.trackBar1.ValueChanged += new System.EventHandler(this.trackBar1_ValueChanged);


 122:             // 


 123:             // txtFreq


 124:             // 


 125:             this.txtFreq.Enabled = false;


 126:             this.txtFreq.Location = new System.Drawing.Point(43, 185);


 127:             this.txtFreq.Name = "txtFreq";


 128:             this.txtFreq.Size = new System.Drawing.Size(100, 20);


 129:             this.txtFreq.TabIndex = 2;


 130:             // 


 131:             // label1


 132:             // 


 133:             this.label1.AutoSize = true;


 134:             this.label1.Location = new System.Drawing.Point(40, 108);


 135:             this.label1.Name = "label1";


 136:             this.label1.Size = new System.Drawing.Size(100, 13);


 137:             this.label1.TabIndex = 3;


 138:             this.label1.Text = "Frequency Change:";


 139:             // 


 140:             // label2


 141:             // 


 142:             this.label2.AutoSize = true;


 143:             this.label2.Location = new System.Drawing.Point(43, 166);


 144:             this.label2.Name = "label2";


 145:             this.label2.Size = new System.Drawing.Size(97, 13);


 146:             this.label2.TabIndex = 4;


 147:             this.label2.Text = "Current Frequency:";


 148:             // 


 149:             // btnStop


 150:             // 


 151:             this.btnStop.Location = new System.Drawing.Point(111, 61);


 152:             this.btnStop.Name = "btnStop";


 153:             this.btnStop.Size = new System.Drawing.Size(88, 21);


 154:             this.btnStop.TabIndex = 5;


 155:             this.btnStop.Text = "Stop";


 156:             this.btnStop.UseVisualStyleBackColor = true;


 157:             this.btnStop.Click += new System.EventHandler(this.btnStop_Click);


 158:             // 


 159:             // openFileDialog1


 160:             // 


 161:             this.openFileDialog1.FileName = "openFileDialog1";


 162:             this.openFileDialog1.FileOk += new System.ComponentModel.CancelEventHandler(this.openFileDialog1_FileOk);


 163:             // 


 164:             // btnNewFile


 165:             // 


 166:             this.btnNewFile.Location = new System.Drawing.Point(205, 61);


 167:             this.btnNewFile.Name = "btnNewFile";


 168:             this.btnNewFile.Size = new System.Drawing.Size(75, 23);


 169:             this.btnNewFile.TabIndex = 6;


 170:             this.btnNewFile.Text = "Open";


 171:             this.btnNewFile.UseVisualStyleBackColor = true;


 172:             this.btnNewFile.Click += new System.EventHandler(this.btnNewFile_Click);


 173:             // 


 174:             // lblFile


 175:             // 


 176:             this.lblFile.AutoSize = true;


 177:             this.lblFile.Location = new System.Drawing.Point(23, 30);


 178:             this.lblFile.Name = "lblFile";


 179:             this.lblFile.Size = new System.Drawing.Size(148, 13);


 180:             this.lblFile.TabIndex = 7;


 181:             this.lblFile.Text = "C:\\Windows\\Media\\ding.wav";


 182:             // 


 183:             // label3


 184:             // 


 185:             this.label3.AutoSize = true;


 186:             this.label3.Location = new System.Drawing.Point(23, 9);


 187:             this.label3.Name = "label3";


 188:             this.label3.Size = new System.Drawing.Size(63, 13);


 189:             this.label3.TabIndex = 8;


 190:             this.label3.Text = "Current File:";


 191:             // 


 192:             // MainForm


 193:             // 


 194:             this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);


 195:             this.ClientSize = new System.Drawing.Size(292, 260);


 196:             this.Controls.Add(this.label3);


 197:             this.Controls.Add(this.lblFile);


 198:             this.Controls.Add(this.btnNewFile);


 199:             this.Controls.Add(this.btnStop);


 200:             this.Controls.Add(this.label2);


 201:             this.Controls.Add(this.label1);


 202:             this.Controls.Add(this.txtFreq);


 203:             this.Controls.Add(this.trackBar1);


 204:             this.Controls.Add(this.btnPlay);


 205:             this.Name = "MainForm";


 206:             this.Text = "Sound Frequency Changer";


 207:             ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit();


 208:             this.ResumeLayout(false);


 209:             this.PerformLayout();


 210:  


 211:         }


 212:         #endregion


 213:  


 214:         /// <summary>


 215:         /// The main entry point for the application.


 216:         /// </summary>


 217:         [STAThread]


 218:         static void Main()


 219:         {


 220:             Application.Run(new MainForm());


 221:         }


 222:  


 223:         private void btnPlay_Click(object sender, System.EventArgs e)


 224:         {


 225:             


 226:             sound.Play(0, BufferPlayFlags.Looping);


 227:             btnPlay.Enabled = false;


 228:             btnStop.Enabled = true;


 229:         }


 230:  


 231:         private void trackBar1_ValueChanged(object sender, EventArgs e)


 232:         {


 233:             txtFreq.Text = trackBar1.Value.ToString();


 234:             sound.Frequency = trackBar1.Value;


 235:             btnPlay.Enabled = true;


 236:         }


 237:  


 238:         private void btnNewFile_Click(object sender, EventArgs e)


 239:         {


 240:             openFileDialog1.Filter = "wav files (*.wav)|*.wav|All files (*.*)|*.*";


 241:             openFileDialog1.ShowDialog();


 242:         }


 243:  


 244:         private void openFileDialog1_FileOk(object sender, CancelEventArgs e)


 245:         {


 246:             sound.Stop();


 247:             btnPlay.Enabled = true;


 248:             btnStop.Enabled = false;


 249:             lblFile.Text = openFileDialog1.FileName;


 250:             sound = new SecondaryBuffer(openFileDialog1.FileName, d, applicationDevice);


 251:             sound.Frequency = 0; //The default frequency


 252:  


 253:         }


 254:  


 255:         private void btnStop_Click(object sender, EventArgs e)


 256:         {


 257:             sound.Stop();


 258:             btnStop.Enabled = false;


 259:             btnPlay.Enabled = true;


 260:         }


 261:     }


 262: }


 263:  


 264:  







This will allow me to use a beam or phaser sound to create the appearance of strength applied on a element.