Fullsix Engineering

Ciclo de formação Scrum em Junho de 2010

Monday, May 24th, 2010
Autor: Tiago Andrade e Silva


Em Junho haverá mais dois cursos Certified Scrum Master em Lisboa e no Porto.

Mais informações no site da comunidade em

http://scrumpt.com/content/Training.aspx

Log4net – SmtpAppender

Tuesday, May 4th, 2010
Autor: nuno.lourenco


Ao se configurar o log4net para usar um SmtpAppender, para envio de e-mails com os logs da aplicação, deixo uma nota de reparo no que concerne o envio para vários destinatários:

A documentação refere que para diversos destinatários dever-se-à configurar o log4net separando os endereços por (;). Se assim for surgirá o seguinte erro:

System.FormatException: The specified string is not in the form required for an e-mail address.
   at System.Net.Mime.MailBnfHelper.ReadMailAddress(String data, Int32& offset, String& displayName)
   at System.Net.Mail.MailAddressCollection.ParseValue(String addresses)
   at log4net.Appender.SmtpAppender.SendEmail(String messageBody)
   at log4net.Appender.SmtpAppender.SendBuffer(LoggingEvent[] events)

Isto porque

O SmtpAppender do log4net recorre ao tipo System.Net.Mail. MailAddressCollection da Framework .NET, que por sua vez usa o método Add(string) para adicionar os endereços. Ora acontece que na documantação está o seguinte:

If multiple e-mail addresses separated with a semicolon character (";") are passed in the addresses parameter. a FormatException exception is raised.

Portanto a documentação do log4net pode induzir em erro. Modificar a separação dos endereços por (,) resolverá o problema.

Happy codding :)

ref: Log4net’s SmtpAppender with multiple email addresses

C#, .NET and Diacritics

Monday, May 3rd, 2010
Autor: nuno.lourenco


Talvez se perguntem, hein? Pois a ideia é saber “converter” texto com acentuação e não só, pelo corresponde texto sem acentuação. Ora dito isto o que se quer:

  1. âãäåçèéêë –> aaaaceeee
  2. ìíîïðñòó –> iiiiðnoo
  3. ôõöùúûüý –> ooouuuuy

Ora então o código que possibilita a alteração:

 1:  public string RemoveDiacritics(string input)
 2: {
 3:  string stFormD = input.Normalize(NormalizationForm.FormD);
 4: var sb = new StringBuilder();
 5:  
 6:  for (int i = 0; i < stFormD.Length; i++)
 7: {
 8: UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[i]);
 9:  if (uc != UnicodeCategory.NonSpacingMark)
 10: {
 11: sb.Append(stFormD[i]);
 12: }
 13: }
 14:  
 15:  return (sb.ToString().Normalize(NormalizationForm.FormC));
 16: }

Happy Coding :)

ref: Michael Kaplan blog

Umbraco: Guardar dataypes complexos e navegar pelos parâmetros destes usando xslt

Tuesday, April 13th, 2010
Autor: gustavo.castelo


Para os que têm pressa, o que quero partilhar é que é possível guardar os dados de um DataType como XML e navegar pelas propriedades usando XPATH. Quem prefere usar UserControls talvez não sinta falta disto.

As vantagens que vejo nesta abordagem é que não precisamos de usar splits sobre os valores dos dataTypes, tanto em .Net como em XSLT, que para mais do que dois campos podem induzir em erros.

 

A história completa é assim:

Era uma vez um dataType do Umbraco chamado RelatedLinks, que permite adicionar links para conteúdos ou URLs:

RelatedLink datatype

Certo dia este DataType deixou de mostrar a informação guardada na árvore dos nós do site (ainda não resolvi este mistério) então criei o meu controlo. Não tão sofisticado, mas faz o que quero.

clip_image002[5]

Em vez de guardar os dados como string separada por | ou , ou ; queria ter um objecto que representasse o estado deste controlo em XML e guardá-lo na BD usando serialização de Xml.

E até aqui tudo bem. Usei o XMLSerializer e o Robbe D. Morri neste artigo, http://www.eggheadcafe.com/articles/xmlserializer_bulkload.asp, deu um toque ao relembrar que não precisamos de guardar os cabeçalhos de xml gerados por esta classe, visto que vamos encapsulá-los no xml do umbraco.

 

public partial class LinkPicker : System.Web.UI.UserControl, IUsercontrolDataEditor

{

       public class LinkPickerState

        {

            public string Title { get; set; }

            public string Url { get; set; }

            public string ContentId { get; set; }

            public string SelectedOption { get; set; }

        }

   /// <summary>

        /// Gets or sets the value.

        /// </summary>

        /// <value>The value.</value>

        public object value

        {

            get

            {

                LinkPickerState lps = new LinkPickerState() { Title = txtTitle.Text, Url = txtUrl.Text, SelectedOption = rblLinkUsed.SelectedValue, lps.ContentId = cpContentId.Text };  

                StringWriter Output = new StringWriter(new StringBuilder());

                new XmlSerializer(typeof(LinkPickerState)).Serialize(Output,lps);  

                //Cut down extra parameters (Credits to: http://www.eggheadcafe.com/articles/xmlserializer_bulkload.asp )   

                String ret = Output.ToString().Replace("xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"","");

                ret = ret.Replace("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"","");

                ret = ret.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>","").Trim();

                ret = ret.Replace(Environment.NewLine,"");                

                return ret;

            }

            set

            {

                string _raw = value as string;

                if (!string.IsNullOrEmpty(_raw))

                {

                    StringReader sr = new StringReader(_raw);  

                    LinkPickerState lps = (LinkPickerState)new XmlSerializer(typeof(LinkPickerState)).Deserialize(sr);  

                    txtTitle.Text = lps.Title;

                    txtUrl.Text = lps.Url;

                    cpContentId.Text = lps.ContentId;

                    rblLinkUsed.SelectedValue = lps.SelectedOption;

                }

            }

        }

}

   

E na árvore de nós do umbraco apareceu assim:

 

<node id="1255" level="4" nodeName="Link 1" urlName="link-1" nodeTypeAlias="relatedLink">

<data alias="url"><![CDATA[asdsa]]></data>

          <data alias="text"><![CDATA[ads]]></data>

<data alias="link"><![CDATA[<LinkPickerState  >

  <Title />

  <Url />

  <ContentId />

  <SelectedOption>url</SelectedOption>

</LinkPickerState>]]></data>

</node>

O próximo problema era como converter esta string de dados em XML navegável.

O Google dizia para usar o node-set, uma extensão do XSLT que converte string em XML, mas comigo não funcionou. Por isso procurei como fazer isto em código, mas não estando familiarizado com XPATH em .net ia demorar algum tempo. Felizmente para mim, já alguém o tinha feito (fiz algumas alterações ao original):

http://forum.umbraco.org/yaf_postst5730_Parsing-a-string-as-XML-using-XSLT.aspx (No fim)

public XPathNodeIterator ParseToXML(string data){

      if (string.IsNullOrEmpty(data)){

                data = @"<Empty />”;

            }  

            StringReader stringReader = new StringReader(data);

            XPathDocument xPathDocument = new XPathDocument(stringReader);

            XPathNavigator xPathNavigator = xPathDocument.CreateNavigator();

            XPathExpression xPathExpression = xPathNavigator.Compile("/"); 

            XPathNodeIterator xPathNodeIterator = xPathNavigator.Select(xPathExpression); 

            return xPathNodeIterator;

        }

Adicionei este método às extensões que estou a usar e assim consigo a partir disto:

...
<![CDATA[<LinkPickerState  >
  <Title />
  <Url />
  <ContentId />
  <SelectedOption>url</SelectedOption>
</LinkPickerState>]]>
 

obter xml válido, fazendo assim:

<xsl:variable name="linkParameters" select="XsltExtensions:ParseToXml(string($relatedLink/data[@alias='link']))/LinkPickerState" />

clip image006 thumb1 Umbraco: Guardar dataypes complexos e navegar pelos parâmetros destes usando xslt

E fiquei feliz :) Podem ver que a seguir é possível navegar como se fosse um xml normal.

Para quem usa mais XSLT esta abordagem podem simplificar o processo em XPATH para além de podermos a nível de código estruturar melhor o estado do nosso datatype e introduzir-lhe funcionalidades adicionais.

 

Code long and prosper

XNA, Yesterday – Now – Tomorrow

Saturday, April 10th, 2010
Autor: goncalo.chaves


xna1[1]

Once again Microsoft has invited a fullsix employee to be speaker on a great gamming event, so I would like share with all of you my presentation slide deck, from the last XNA Pizza night 2010 event.

It’s was great gathering about this growing technology. Although the game applications also it’s a great framework for other applications, such as medical image, 3D simulation and so on.

You can see more at the event page.

Download SlideDeck in pdf.

News: http://creators.xna.com/en-US/spotlight/MicrosoftPortugal


Better Tag Cloud