Zappier – Integrando sistemas

Após conhecer a ferramenta TypeForm que cria os mais incríveis formulários de preenchimento que já conheci, vi no blog da equipe typeform, que havia uma integração com Zappier.

Então fui conhecer o que era o Zappier, e descobri que é uma ótima ferramenta para integrar sistemas no modelo:
Quando isso acontecer -> Faça isso!!!

E o melhor: Você não precisa entender nada de programação para programar essas ações!

Exemplo de ações que o Zappier pode executar:

  • Quando eu receber um novo e-mail no Gmail, envie-me um SMS para o smartphone.
  • Sempre que um novo formulário for preenchido no TypeForm, envie-me um e-mail.
  • E assim por diante.
Exemplo de um Zap

Exemplo de um Zap

Preços da plataforma

Tabela de Planos e Preços

Amostra de serviços populares compatíveis com Zappier

Amostra de serviços populares compatíveis com Zappier

Tenho certeza que em breve vou encontrar várias aplicações práticas no meu dia-a-dia para a ferramenta.

Unique Constraint – Entity Framework 6 – WTF

Iniciei um projeto em C# Windows Forms utilizando o Entity Framework 6 (última versão até o momento 05/01/2014).

Tenho um campo que armazena “e-mail”, e esse campo deve ser único na tabela.

Estou mapeando minhas classes utilizando FLUENT API.

e quando fui mapear a coluna E-MAIL fiquei assustado em descobrir que,

a versão 6 desse ORM  não tem esse recurso básico implementado na interface de mapeamento fluente.

Tem uma issue aberta no Codeplex para o tema:
https://entityframework.codeplex.com/workitem/57

Nesse momento reconsidero continuar o projeto em EF ou migrar urgentemente para NHIBERNATE que está anos-luz mais maduro.

2013 in review

The WordPress.com stats helper monkeys prepared a 2013 annual report for this blog.

Here’s an excerpt:

The concert hall at the Sydney Opera House holds 2,700 people. This blog was viewed about 17,000 times in 2013. If it were a concert at Sydney Opera House, it would take about 6 sold-out performances for that many people to see it.

Click here to see the complete report.

Categorias:Novidades / News

Typeform – Reinventando os formulários

Recentemente acessei um convite para responder uma pesquisa de faculdade de alguém.

Já esperava um link com o costumeiro: Google Docs, e suas enquetes.

Mas não. Tive a grata surpresa de encontrar algo totalmente diferente!

Se chama: TypeForm, e o mote do serviço é: Goodbye forms, hello typeforms → Build a Typeform

Mudou totalmente o meu conceito de formulários.

Recomendo a todos conhecerem a ferramenta!

Da próxima vez que precisar perguntar algo pra alguém de forma eletrônica, vou usar TypeForm com certeza!

 

SpinKit – Indicador de carregamento em CSS

Por acaso encontrei essa biblioteca na web. Feita por um dos funcionários do GitHub.

SpinKit  https://github.com/tobiasahlin/SpinKit

Substitui os tradicionais GIFs nas telas de carregamento, por um design minimalista feito em CSS3.

Exemplo:

Imagem estatica da animação de "loading"

Clique para visualizar a animação

Categorias:Dicas / Tips Tags:, , ,

Conversão de número e porcentagem para extenso em C#

12 - 13 1 comentário

A partir da necessidade de converter valores em Reais R$ para extenso, encontrei na internet um código que fazia essa conversão.

Artigo original: http://ivanmeirelles.wordpress.com/2012/10/27/escrever-valores-por-extenso-em-c/

Posteriormente, precisei fazer uma conversão de porcentagem %% para extenso, e fiz uma pequena modificação no código para suportar essa conversão.

O Snippet de código está no link abaixo:

A classe suporta a conversão de decimal, valor monetário e porcentagem para extenso, em PT-BR.

public static class Extenso
    {
        public enum TipoValorExtenso
        {
            Monetario,
            Porcentagem,
            Decimal
        }

        public static string toExtenso(double Valor, TipoValorExtenso tipoValorExtenso)
        {
            decimal valorEscrever = new decimal(Valor);

            return toExtenso(valorEscrever, tipoValorExtenso);
        }

        // O método toExtenso recebe um valor do tipo decimal
        public static string toExtenso(decimal valor, TipoValorExtenso tipoValorExtenso)
        {
            if (valor <= 0 | valor >= 1000000000000000)
                throw new ArgumentOutOfRangeException("Valor não suportado pelo sistema. Valor: " + valor);

            string strValor = String.Empty;
            strValor = valor.ToString("000000000000000.00#");
            //strValor = valor.ToString("{0:0.00#}");
            string valor_por_extenso = string.Empty;
            int qtdCasasDecimais =
                strValor.Substring(strValor.IndexOf(',') + 1, strValor.Length - (strValor.IndexOf(',') + 1)).Length;
            bool existemValoresAposDecimal = Convert.ToInt32(strValor.Substring(16, qtdCasasDecimais)) > 0;

            for (int i = 0; i <= 15; i += 3)
            {
                var parte = strValor.Substring(i, 3);
                // se parte contém vírgula, pega a substring com base na quantidade de casas decimais.
                if (parte.Contains(','))
                {
                    parte = strValor.Substring(i+1, qtdCasasDecimais);
                }
                valor_por_extenso += escreva_parte(Convert.ToDecimal(parte));
                if (i == 0 & valor_por_extenso != string.Empty)
                {
                    if (Convert.ToInt32(strValor.Substring(0, 3)) == 1)
                        valor_por_extenso += " TRILHÃO" +
                                             ((Convert.ToDecimal(strValor.Substring(3, 12)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                    else if (Convert.ToInt32(strValor.Substring(0, 3)) > 1)
                        valor_por_extenso += " TRILHÕES" +
                                             ((Convert.ToDecimal(strValor.Substring(3, 12)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                }
                else if (i == 3 & valor_por_extenso != string.Empty)
                {
                    if (Convert.ToInt32(strValor.Substring(3, 3)) == 1)
                        valor_por_extenso += " BILHÃO" +
                                             ((Convert.ToDecimal(strValor.Substring(6, 9)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                    else if (Convert.ToInt32(strValor.Substring(3, 3)) > 1)
                        valor_por_extenso += " BILHÕES" +
                                             ((Convert.ToDecimal(strValor.Substring(6, 9)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                }
                else if (i == 6 & valor_por_extenso != string.Empty)
                {
                    if (Convert.ToInt32(strValor.Substring(6, 3)) == 1)
                        valor_por_extenso += " MILHÃO" +
                                             ((Convert.ToDecimal(strValor.Substring(9, 6)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                    else if (Convert.ToInt32(strValor.Substring(6, 3)) > 1)
                        valor_por_extenso += " MILHÕES" +
                                             ((Convert.ToDecimal(strValor.Substring(9, 6)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                }
                else if (i == 9 & valor_por_extenso != string.Empty)
                    if (Convert.ToInt32(strValor.Substring(9, 3)) > 0)
                        valor_por_extenso += " MIL" +
                                             ((Convert.ToDecimal(strValor.Substring(12, 3)) > 0)
                                                  ? " E "
                                                  : string.Empty);

                if (i == 12)
                {
                    if (valor_por_extenso.Length > 8)
                        if (valor_por_extenso.Substring(valor_por_extenso.Length - 6, 6) == "BILHÃO" |
                            valor_por_extenso.Substring(valor_por_extenso.Length - 6, 6) == "MILHÃO")
                            valor_por_extenso += " DE";
                        else if (valor_por_extenso.Substring(valor_por_extenso.Length - 7, 7) == "BILHÕES" |
                                 valor_por_extenso.Substring(valor_por_extenso.Length - 7, 7) == "MILHÕES" |
                                 valor_por_extenso.Substring(valor_por_extenso.Length - 8, 7) == "TRILHÕES")
                            valor_por_extenso += " DE";
                        else if (valor_por_extenso.Substring(valor_por_extenso.Length - 8, 8) == "TRILHÕES")
                            valor_por_extenso += " DE";

                    if (Convert.ToInt64(strValor.Substring(0, 15)) == 1)
                    {
                        switch (tipoValorExtenso)
                        {
                            case TipoValorExtenso.Monetario:
                                valor_por_extenso += " REAL";
                                break;
                            case TipoValorExtenso.Porcentagem:
                                if (existemValoresAposDecimal == false)
                                    valor_por_extenso += " PORCENTO";
                                break;
                            case TipoValorExtenso.Decimal:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("tipoValorExtenso");
                        }
                    }

                    else if (Convert.ToInt64(strValor.Substring(0, 15)) > 1)
                    {
                        switch (tipoValorExtenso)
                        {
                            case TipoValorExtenso.Monetario:
                                valor_por_extenso += " REAIS";
                                break;
                            case TipoValorExtenso.Porcentagem:
                                if (existemValoresAposDecimal == false)
                                    valor_por_extenso += " PORCENTO";
                                break;
                            case TipoValorExtenso.Decimal:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("tipoValorExtenso");
                        }
                    }

                    if (Convert.ToInt32(strValor.Substring(16, 2)) > 0 && valor_por_extenso != string.Empty)
                    {
                        switch (tipoValorExtenso)
                        {
                            case TipoValorExtenso.Monetario:
                                valor_por_extenso += " E ";
                                break;
                            case TipoValorExtenso.Porcentagem:
                                valor_por_extenso += " VÍRGULA ";
                                break;
                            case TipoValorExtenso.Decimal:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("tipoValorExtenso");
                        }
                    }
                }

                if (i == 15)
                    if (Convert.ToInt32(strValor.Substring(16, qtdCasasDecimais)) == 1)
                    {
                        switch (tipoValorExtenso)
                        {
                            case TipoValorExtenso.Monetario:
                                valor_por_extenso += " CENTAVO";
                                break;
                            case TipoValorExtenso.Porcentagem:
                                valor_por_extenso += " CENTAVO";
                                break;
                            case TipoValorExtenso.Decimal:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("tipoValorExtenso");
                        }
                    }

                    else if (Convert.ToInt32(strValor.Substring(16, qtdCasasDecimais)) > 1)
                    {
                        switch (tipoValorExtenso)
                        {
                            case TipoValorExtenso.Monetario:
                                valor_por_extenso += " CENTAVOS";
                                break;
                            case TipoValorExtenso.Porcentagem:
                                valor_por_extenso += " PORCENTO";
                                break;
                            case TipoValorExtenso.Decimal:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("tipoValorExtenso");
                        }
                    }
            }
            return valor_por_extenso;
        }

        private static string escreva_parte(decimal valor)
        {
            if (valor <= 0)
                return string.Empty;
            else
            {
                string montagem = string.Empty;
                if (valor > 0 & valor < 1)
                {
                    valor *= 100;
                }
                string strValor = valor.ToString("000");
                int a = Convert.ToInt32(strValor.Substring(0, 1));
                int b = Convert.ToInt32(strValor.Substring(1, 1));
                int c = Convert.ToInt32(strValor.Substring(2, 1));

                if (a == 1) montagem += (b + c == 0) ? "CEM" : "CENTO";
                else if (a == 2) montagem += "DUZENTOS";
                else if (a == 3) montagem += "TREZENTOS";
                else if (a == 4) montagem += "QUATROCENTOS";
                else if (a == 5) montagem += "QUINHENTOS";
                else if (a == 6) montagem += "SEISCENTOS";
                else if (a == 7) montagem += "SETECENTOS";
                else if (a == 8) montagem += "OITOCENTOS";
                else if (a == 9) montagem += "NOVECENTOS";

                if (b == 1)
                {
                    if (c == 0) montagem += ((a > 0) ? " E " : string.Empty) + "DEZ";
                    else if (c == 1) montagem += ((a > 0) ? " E " : string.Empty) + "ONZE";
                    else if (c == 2) montagem += ((a > 0) ? " E " : string.Empty) + "DOZE";
                    else if (c == 3) montagem += ((a > 0) ? " E " : string.Empty) + "TREZE";
                    else if (c == 4) montagem += ((a > 0) ? " E " : string.Empty) + "QUATORZE";
                    else if (c == 5) montagem += ((a > 0) ? " E " : string.Empty) + "QUINZE";
                    else if (c == 6) montagem += ((a > 0) ? " E " : string.Empty) + "DEZESSEIS";
                    else if (c == 7) montagem += ((a > 0) ? " E " : string.Empty) + "DEZESSETE";
                    else if (c == 8) montagem += ((a > 0) ? " E " : string.Empty) + "DEZOITO";
                    else if (c == 9) montagem += ((a > 0) ? " E " : string.Empty) + "DEZENOVE";
                }
                else if (b == 2) montagem += ((a > 0) ? " E " : string.Empty) + "VINTE";
                else if (b == 3) montagem += ((a > 0) ? " E " : string.Empty) + "TRINTA";
                else if (b == 4) montagem += ((a > 0) ? " E " : string.Empty) + "QUARENTA";
                else if (b == 5) montagem += ((a > 0) ? " E " : string.Empty) + "CINQUENTA";
                else if (b == 6) montagem += ((a > 0) ? " E " : string.Empty) + "SESSENTA";
                else if (b == 7) montagem += ((a > 0) ? " E " : string.Empty) + "SETENTA";
                else if (b == 8) montagem += ((a > 0) ? " E " : string.Empty) + "OITENTA";
                else if (b == 9) montagem += ((a > 0) ? " E " : string.Empty) + "NOVENTA";

                if (strValor.Substring(1, 1) != "1" & c != 0 & montagem != string.Empty) montagem += " E ";

                if (strValor.Substring(1, 1) != "1")
                    if (c == 1) montagem += "UM";
                    else if (c == 2) montagem += "DOIS";
                    else if (c == 3) montagem += "TRÊS";
                    else if (c == 4) montagem += "QUATRO";
                    else if (c == 5) montagem += "CINCO";
                    else if (c == 6) montagem += "SEIS";
                    else if (c == 7) montagem += "SETE";
                    else if (c == 8) montagem += "OITO";
                    else if (c == 9) montagem += "NOVE";

                return montagem;
            }
        }
    }

Hospedagem grátis de código fonte – Team Foundation Service

05 - 13 1 comentário

TFS Grátis

Isso mesmo.

A microsoft está oferecendo gratuitamente, por tempo indeterminado, hospedagem grátis de projetos no TEAM FOUNDATION SERVICE, serviço de hospedagem de source code, que funciona totalmente online.

Incluso:

* Até 5 usuários.

* Número ILIMITADO de projetos.

* Versionamento com (TFVC ou GIT)

* Rastreamento de work itens

* Ferramentas de planejamento ágil.

* Gerenciamento de feedback.

* Build (ainda em preview)

* Gerenciamento de testes (ainda em preview)

-> Com um preço especial para assinantes MSDN no caso de optarem por um plano pago.

Assine já GRÁTIS.

 

Achei a solução perfeita para hospedar aqueles nossos projetos pessoais, ou projetos que envolvam um número pequeno de colaboradores.

Show!

Lembrando que também existe o Assembla, com seus repositórios privados free, e repositórios pagos, com várias ferramentas integradas. Vale a pena conferir: https://www.assembla.com/home

Extendendo o Twitter Bootstrap

03 - 13 2 comentários

Na busca de estilização para um input file encontrei algumas novidades que melhoram e extendem o framework twitter bootstrap.

Jasny Bootstrap

JasnyBootstrapExtended JasnyBootstrapHeroUnit

Diferenciais:

Bootsnipp

bootsnipp

Snippets, códigos prontos de layout com twitter bootstrap.

jQuery DataTables obtendo dados no Api Controller com ASP NET MVC

Conhecimentos necessários:

* Ter conhecimento prévio de como funciona o data tables.

* Referenciar scripts e css necessários.

Página oficial jQuery Data Tables

grid jquery data tables

Grid do jQuery DataTables

Etapas:

  • Criar método para retornar os dados para o jquery data tables no seu controller. A assinatura do método é a seguinte.
  • Código no lado do servidor:
public class DataController : ApiController
{
public dynamic GetJdt(int sEcho,
int iDisplayStart,
int iDisplayLength,
string sSearch,
int iSortCol_0,
string sSortDir_0)
{
// Utilizando LINQ para fazer a consulta em uma Session do NHibernate</pre>
var consulta = sessao.Query<Objeto>().AsQueryable();

 // Seta os termos da busca
 if (!String.IsNullOrEmpty(sSearch))
 {
 consulta =
 consulta.Where(
 wh =>
 wh.Coluna1.ToLower().Contains(sSearch.ToLower()));

 }

// Total de registros para cálculo de paginação
 var quantidadeRegistrosSemFiltro = consulta.Count();

// Ordenação
 string colunaOrdenacao = "Id";
 switch (iSortCol_0)
 {
 case 0:
 colunaOrdenacao = "Id";
 break;
 case 1:
 colunaOrdenacao = "Coluna1";
 break;
 case 2:
 colunaOrdenacao = "Coluna2";
 break;
 case 3:
 colunaOrdenacao = "Coluna3";
 break;
 case 4:
 colunaOrdenacao = "Coluna4";
 break;
 case 5:
 colunaOrdenacao = "Coluna5";
 break;
 }

consulta = consulta.OrderByField(colunaOrdenacao, sSortDir_0 == "asc");
// Aqui eu usei um método de extensão para converter strings em uma expression linq:

//<a href="http://ronniediaz.com/2011/05/24/orderby-string-in-linq-c-net-dynamic-sorting-of-anonymous-types/">http://ronniediaz.com/2011/05/24/orderby-string-in-linq-c-net-dynamic-sorting-of-anonymous-types/</a>

// Adiciona paginação e já faz uma projeção dos dados através do select
 var resultadoConsulta = consulta.Skip(iDisplayStart).Take(iDisplayLength).Select(
 sel =>
 new
 {
 Id = sel.Id,
 Coluna1 = sel.Coluna1,
 Coluna2 = sel.Coluna2,
 Coluna3 = sel.Coluna3,
 Coluna4 = sel.Coluna4,
 Coluna5 = sel.Coluna5
 }
 ).ToArray();

var quantidadeTotalRegistrosAposPaginacao = resultadoConsulta.Count();

// pega o retorno e coloca em uma variável
var retorno = new
 {
 sEcho = sEcho,
 iTotalRecords = quantidadeRegistrosSemFiltro,
 iTotalDisplayRecords = quantidadeTotalRegistrosAposPaginacao,
 aaData = resultadoConsulta
 };

// retorna o objeto que é automaticamente convertido para JSON pelo API controller
return retorno;
}

}
  • Código no lado do cliente:
<script type="text/javascript">// <![CDATA[
 $(document).ready(function(){
 $('.dataTable').dataTable({
 "bJQueryUI": true,
 "bProcessing": true,
 "bServerSide": true,
 "sAjaxSource": "/api/produtos/getjdt",
 "aoColumns": [
 { "mDataProp": "Coluna1" },
 { "mDataProp": "Coluna2" },
 { "mDataProp": "Coluna3" },
 { "mDataProp": "Coluna4" },
 { "mDataProp": "Coluna5"}
 ]
 });
 });

// ]]></script>

Dessa forma o jQuery Data Table vai carregar os dados dinamicamente, com AJAX.

Importante:

  • Número de colunas da tabela deve ser o mesmo retornado nos dados e na criação da data table especificar as colunas através da propriedade aoColumns como mostrado acima., para evitar um erro semelhante a esse:

DataTables warning (table id = ‘myTable’): Requested unknown parameter ‘2’ from the data source for row 0

Referências:
JQuery Datatables warning: Requested unknow parameter…

Using MVC 4 Web Api with jQuery DataTables

Alinhamento de Código no Visual Studio

Procurando uma extensão que facilitasse o alinhamento de código no visual studio encontrei uma ferramenta ótima.

Extensão CodeAlignment

codealignment

Logo da extensão codealignment

Baixe aqui: http://visualstudiogallery.msdn.microsoft.com/7179e851-a263-44b7-a177-1d31e33c84fd

A extensão é compatível com:

  1. Visual Studio 2010/2012
  2. Notepad++
  3. Sublime Text
  4. Expression Blend

 

Compare:

Código desalinhado versus Código alinhado:

  person.FirstName = "Chris";                =>  person.FirstName  = "Chris";
  person.Surname = "McGrath";                =>  person.Surname    = "McGrath";
  person.Age = 24;                           =>  person.Age        = 24;
  person.Occupation = "Software Developer";  =>  person.Occupation = "Software Developer";
  person.HomeTown = "Brisbane";              =>  person.HomeTown   = "Brisbane";

 private string m_firstName = string.Empty;   =>  private string  m_firstName = string.Empty;
  private string m_surname = string.Empty;     =>  private string  m_surname   = string.Empty;
  private int m_age = 18;                      =>  private int     m_age       = 18;
  private Address m_address;                   =>  private Address m_address;

  public string FirstName { get; set; }        =>  public  string  FirstName { get; set; }
  public string Surname { get; set; }          =>  public  string  Surname   { get; set; }
  public int Age { get; private set; }         =>  public  int     Age       { get; private set; }
  private Address Address { get;  set; }       =>  private Address Address   { get; set; }

  Assert.AreEqual("expected", person.Name);    =>  Assert.AreEqual   ("expected", person.Name);
  Assert.AreEqual(21, person.Age);             =>  Assert.AreEqual   (21,         person.Age);
  Assert.AreNotEqual(other, person);           =>  Assert.AreNotEqual(other,      person);

  switch (state)                               =>  switch (state)
  {                                            =>  {
     case State.QLD: city = "Brisbane"; break; =>      case State.QLD : city = "Brisbane"; break;
     case State.WA: city = "Perth"; break;     =>      case State.WA  : city = "Perth";    break;
     case State.NSW: city = "Sydney"; break;   =>      case State.NSW : city = "Sydney";   break;
     default: city = "???"; break;             =>      default        : city = "???";      break;
  }                                            =>  }

 

A leitura do código se torna muito mais nítida quando alinhado.

 

A extensão cria uma barra de ferramentas no visual studio que facilita o acesso aos recursos de alinhamento de código:

Barra de Ferramentas Code Alignment no Visual Studio

Clique para ampliar

 

 

Fica a dica.

Abraços e até mais.

dotnettips.wordpress.com/

Helping Programmers Since 1994

Viagem e Voo

Dicas para viagens, férias e voos nacionais e internacionais

Ivan Guimarães Meirelles

Analista Desenvolvedor

Void Podcast

Vazio e sem retorno de valor

Elemar DEV

Negócios, tecnologia e desenvolvimento

2,000 Things You Should Know About WPF

Everything a WPF Developer Needs to Know, in Bite-Sized Chunks

blog

so long

Fernando Franzini Blog

Engenharia de Software e Arquitetura Ágil

Gabriel RB.net

Blog técnico, com dicas, códigos, novidades e problemas do dia-a-dia programando.

Alexandre Valente's Blog

Experiências em tecnologia e assuntos diversos

%d blogueiros gostam disto: