#if(DEBUG) – Executando Windows Service pelo Visual Studio

Faz um tempo que eu venho desenvolvendo, eventualmente, Windows Services para fazer processamentos esporádicos, para requisições assíncronas e tal.
Eu acho legal Windows Service, para caralho, é muito util. Mas tem uma coisa que realmente me deixa #chatiada: executá-lo no Visual Studio. Não dá.
Ontem precisei criar um Windows Service, com um timer que disparava um eventindo para chamar um serviço, simples como a vida. Queria executar para ver rolando, pesquisei um pouco e se liga nisso…

Essa é a classe do serviço, parecida com a que eu tenho, perceba que meu OnStart chama um método publico da classe, onde inicia o timer e seta o evento quando o intervalo for atingido.

public partial class ServiceOfDeath : ServiceBase
{
	System.Timers.Timer aTimer;
 
	public ServiceOfDeath()
	{
		InitializeComponent();
	}
 
	protected override void OnStart(string[] args)
	{
		IniciarTimer();
	}
 
	public void IniciarTimer()
	{
		aTimer = new System.Timers.Timer(Convert.ToInt32(ConfigurationManager.AppSettings["MilisegundosDeIntervalo"]));
		aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
		aTimer.Start();
	}
 
	private void OnTimedEvent(object sender, ElapsedEventArgs e)
	{
		aTimer.Stop();
		new Liquidificador().Misturar();
		aTimer.Start();
	}
 
	protected override void OnStop()
	{
		aTimer.Stop();
	}
}

Daí na classe que é executada quando a aplicação é executada (Program.cs), fazemos o seguinte.

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            #if (!DEBUG)
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
                { 
                    new ServiceOfDeath() 
                };
                ServiceBase.Run(ServicesToRun);
            #else
                ServiceOfDeath servicoDaMorte = new ServiceOfDeath();
                servicoDaMorte .IniciarTimer();
                //Thread eterna
                System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
            #endif
        }
    }

Ou seja, o #if(DEBUG) serve para o Visual Studio interpretar aquele código somente quando estiver em modo debug (não acredito que ainda não conhecia isso), dá um mundinho de possibilidades aí para quem quer debugar alguma coisa que o VS não executa. Acho melhor que ficar attachando processo, que é chatissimo.

Anotem essa para quando estiverem com um código macarronico em mãos! rs

soapUI (ou xml string): como enviar valor nulo?

Acrescente no seu cabeçalho:

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=”http://www.w3.org/2001/XMLSchema”

e na sua tag:

xsi:nil=”true”

E está prontim prontim.

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:privado="http://schemas.datacontract.org/2004/07/PRIVADA">
   <soapenv:Header xsi:nil="true"/>
   <soapenv:Body>
      <tem:Churros>
         <tem:Recheio>
            <privado:Cor xsi:nil="true"/>
         </tem:Recheio>
      </tem:Churros>
   </soapenv:Body>
</soapenv:Envelope>

Primeiro mês trampando por “conta” – freelancer

Faz uns 2 anos que eu não pensava na palavra freela, por puro medo de outro cliente chato invadir minha vida novamente. Fiz uns freelas legais sozinha e com dois amigos, mas ganhei pouca grana e muita mas MUITA dor de cabeça. O cliente não tinha o minimo respeito pela gente e a gente vivia atrasando os jobs, fora que eu fazia esses trampos extra um trampo de 8hrs, era uma qualidade de vida horrenda, HAHAHAHA. Mas deu para aprender bastante.

Hoje faz um mês que estou full time nesse estilo de vida, foi uma decisão dificil trocar a segurança de um salario legal todo fim do mês pela liberdade. Na teoria parece uma decisão fácil, mas com as contas na mão a pegada é outra. Atualmente tenho um trampo fixo mensal que faço da onde eu quiser, o que deu uma boa ajuda para eu tomar a decisão de sair dessa vida de 8hrs trancada no escritorio.

Eu, que não gostava muito de trabalhar de casa, tenho uma vaga fixa em um coworking próximo ao metro, para não ser dificil de chegar. E incrivelmente, ultimamente, tenho me achado mais produtiva de casa até do que do cow. Mas a opção de trabalhar de outros lugares é maravilhosa. Aquele dia arrastado que eu tinha no escritorio por não querer estar ali nao acontece mais, eu trabalho de outro local ou simplesmente deixo para trabalhar mais tarde ou compenso no outro dia. Sempre com a responsabilidade do cronograma passado.

Os aprendizados desde esse tempo e apos muitas pesquisas que fiz antes de largar o job que eu tenho colocado em prática hoje:

  • Dê noticias. Boas ou más, elas são necessárias. Melhor uma má notícia para restruturar o cronograma do que “silêncio no rádio”. Tenho passado um email com status das minhas tarefas pelo menos de 2 em 2 dias, até porque ainda estou me acostumando com esse negocio de estar longe do time.
  • Não seja o ligeirinho nos cronogramas. Dê um cronograma confortável. É absurdamente melhor você adiantar do que atrasar. Imprevistos acontecem.
  • Organize-se. É dificil, mas é necessario o minimo de organização. Saiba quanto tempo você vai trabalhar, se vai folgar feriados e conte isso nos seus prazos. Saiba onde está seus arquivos/coisas. Tenha backups. Se você tiver que se achar todo dia de antes de começar a trampar, você perde tempo.
  • Mantenha suas tarefas anotadas. Sua cabeça voa e você esquece o que precisa fazer. Tenho utilizado o Wunderlist para isso. Junto com o Google Calendar.

Há pessoas que não se acostumam com a falta de um lugar fixo para o trampo, aqueles “amigos fixos” que estão do seu lado diariamente. No meu ponto de vista o trampo é para trampar, se você não vai produzir e quer fumar e trocar uma ideia com o amigo, vá para o bar. É por essas que somos trancados legalmente no escritorio por 8hrs para produzir 6 ou 5hrs (sendo otimista).

Hoje eu ainda não consegui me organizar muito bem, quanto a horarios e tal. A idéia é que eu consiga me ajustar (quero muito trabalhar mais cedo), tente usar ferramentas online para nos atualizarmos e fazer daily meeting via Skype ou Hangout. Tô com um time nesse trampo e sinto falta de informacoes do que está acontecendo.

Mas até entao esse modelo de job está com saldo positivo.

Apareço com mais noticias!

Inspirações do post:

http://blog.ftofani.com/algumas-dicas-para-quem-quer-trabalhar-de-casa/

http://papodehomem.com.br/trabalhar-de-casa-e-uma-merda/

 

WCF – Propriedade Specified e serialização

Eu não sou expert em WCF, mas já mexi até que bastante com ele.
Tem uns negocio de serialização dele que se você deixar default o capeta incorpora e você perde o controle.

Eu utilizo o DataContract nos contratos dos serviços para a serialização por simplesmente a lista de tipos suportados ser maior que a do XmlSerializerFormat.

Aí o problema (?) que eu sempre tenho consumindo o serviço de terceiros é: eu adiciono a service reference e vem aqueles mil campos specified para eu setar se eu alterei uma propriedade ou não. Desagradável demais.
Isso acontece porque tem alguns tipos de dados que tem o valor default e coisa e tal, daí para a serialização saber que não é um valor default e que foi setado, é baseado nessa propriedade specified. Corrijam-me se eu estiver falando caquinha.
Setando o DataMember como IsRequired obrigatoriamente o valor sempre tem que vir, então não tem mais a opção de não ter valor setado e o specified morre. Não vejo nenhum problema, inicialmente, em utiliza-lo já que você ainda pode usar o System.Nullable.

[DataContract]
public class Cachorro
{
	[DataMember]
	public string Nome { get; set; }
 
	[DataMember(IsRequired = true)]
	public int? QuantidadeDeFilhotes { get; set; }
}

Usem-o! E facilite a vida do carinha que tá integrando no seu bendito serviço!

Settimeout e cleartimeout para um trilhão de utilidades

Tô temporariamente quase full time como dev front-end. Tenho muito a melhorar nisso ainda, rs.

Tava fazendo um formulario com muita validação chatinha em runtime e precisava rolar no server. Usei bonitamente o evento change dos inputs/selects para fazer a validação, com ajax.
Acontece que, nos inputs text o evento change era chamado 93248 vezes, fazendo varias chamadas no server e fazendo uma validação tosca. Delay. Tava péssimo.

Conversei com meu irmão, que é master of puppets em javascript, e ele sugeriu que colocasse a chamada ajax para validação em um settimeout de 1s e limpasse sempre que digitasse. Ou sejam: depois de 1s sem digitar que iriamos fazer a validação. Rolou. Olha essa belezura:

var validacaoTime = null;
$("input").keypress(function() {
    clearTimeout(validacaoTime);
    validacaoTime = setTimeout(function() {
        alert('VALIDACAO');
    }, 1000);
});

O focusout não era bacana pois eu dependeria do usuario sair do campo para conseguir validar.

Como é uma aplicação de usuarios que muito provavelmente digitam rápido, a idéia cai bem.
Depois faço um teste real com a minha mãe catando milho para ver um tempo médio para próximos projetos, rs!

Não esqueçam de validar no submit também! 🙂

Placeholder no select

Tem nada mais munito que aqueles formularios a la Twitter, com o nome dos campos dentro do input.
Todo mundo usa! Tá na moda tá na C&a. Ainda mais que agora é nativo no HTML5 e bibibi.
E os plugins para funcionar em browsers antigos ae são mamão com açucar.

Só tem UM problema. O cliente vai te pedir o placeholder no select, e lá.. lá o maledeto não funfa.
Fiz pog, observem..

O “placeholder” vai ser uma opção default:

<select id="opcoes" name="opcoes">
     <option value="" default class="select-default">Instituição</option>
</select>

E quando o select for aberto, a opção não será visualizada:

select.placeholder-select {
    color: #999;
}
 
select .select-default {
    display: none;
}

Essa opção default vai ter cor de placeholder, acinzentado, pela classe que colocamos no javascript (o estilo está acima):

$(function() {
      $("select").change(function () {
                $(this).removeClass('placeholder-select');
                if ($(this).val() == '') {
                    $(this).addClass('placeholder-select');
                }
            }).click(function () {
                $(this).removeClass('placeholder-select');
            }).focusout(function () {
                $(this).change();
        });
});

E vualáá!