Arquivo

Archive for the ‘Dicas / Tips’ Category

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:, , ,

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.

Evitando Bind Injection com ASP.NET MVC

O título do post é sensacionalista, mas o conteúdo é sério.
O recurso de model binding nativo do ASP.NET MVC, oferece um sério risco, dependendo da forma que o desenvolvedor utilize o binding automático.

Imaginemos o seguinte senário:

Uma action que grava alterações no nome e e-mail de um usuário do sistema.
Há diversas formas de capturar no servidor os dados enviados pelo cliente.

Exemplo 1: Declarando na assinatura do método os parâmetros correspondentes aos campos postados no form:

public ActionResult Gravar(string Nome, string Email)
{
   // código de persistência
}

Exemplo 2: Obtendo os dados pelo objeto Request que contém os dados postados:

public ActionResult Gravar()
{
   string nome = Request["Nome"];
   string email = Request["Email"];
}

Exemplo 3: Setando o tipo do parâmetro para a classe que contém esses membros.

[HttpPost]
public ActionResult Gravar(User usuarioPostado)
{
   // código de persistência
}

Classe de domínio:

public class User
{
  public int Id { get; set; }
  public string Nome { get; set; }
  public string Email { get; set; }
  public bool IsAdmin { get; set; }
}

imagine que você criou uma view fortemente tipada, usando o gerador automático do Visual Studio, e sua view contém um campo que permite alterar a propriedade IsAdmin.

</pre>
<div class="editor-label">@Html.LabelFor(model => model.IsAdmin)</div>
<div class="editor-field">@Html.EditorFor(model => model.IsAdmin)
 @Html.ValidationMessageFor(model => model.IsAdmin)</div>
<pre>

Certamente você vai remover esse campo, ou marcá-lo como read only e deixá-lo lá na view.

Vulnerabilidade:
Alguém mal-intencionado pode postar essa informação livremente via GET, ou com um pouquinho mais de trabalho via POST, basta saber que existe esse campo no BD, e que o campo tem o nome de “isAdmin”, setar IS ADMIN = TRUE, e OBTER PERMISSÃO DE ADMINISTRADOR no seu sistema quando os dados forem persistidos.

Possíveis defesas:

Defesa 1: Utilizar o atributo Bind na classe de domínio.

[Bind(Exclude = "IsAdmin")] // É possível usar a propriedade Include, que informa quais membros são permitidos, ao invés de quais serão excluídos.
public class User
{
  public int Id { get; set; }
  public string Nome { get; set; }
  public string Email { get; set; }
  public bool IsAdmin { get; set; }
}

Defesa 2: Utilizar o atributo Bind no método de gravação.

[HttpPost]
public ActionResult Gravar([Bind(Exclude = "IsAdmin")] User usuarioPostado)
{
   // código de persistência
}

Defesa 3: Utilizar uma ViewModel para trocar dados entre a view e o seu controller:

public class UserInputViewModel
{
  public int Id { get; set; }
  public string Nome { get; set; }
  public string Email { get; set; }
}

[HttpPost]
public ActionResult Gravar(UserInputViewModel usuarioPostado)
{
   // converte a classe UserInputViewModel => em User
   // Uma dica é usar a biblioteca AutoMapper: https://github.com/AutoMapper/AutoMapper
   // efetua a persistência.
}

Existem mais defesas possíveis, e uma dica interessante que aprendi é:
“Trate qualquer HTTP request como malicioso até que se prove o contrário.”.

Fontes:
IronShay | Mass Assignment Vulnerability in ASP.NET MVC

6 Ways To Avoid Mass Assignment in ASP.NET MVC

Conversão segura de strings com TryParse em C#

10 - 12 2 comentários

Para fazer conversões seguras de strings em algum outro datatype podemos utilizar o método TryParse.

Sintaxe

boolean tipodedado.TryParse(string_tentar_converter, out variavel_retorno)

No método TryParse, você informa uma string qualquer que será convertida, e uma variável de retorno com o argumento “out”. Se a conversão for bem sucedida é retornado true, caso contrário, false.

Conversão insegura:

Abaixo um trecho de código que vai gerar uma exceção:

object s = "5b"; // não é possível converter 5b para inteiro.
int a = (int) s; // Dá erro e gera uma exceção

 

object s = "3e"; // não é possível converter 5e para inteiro
int a = Convert.ToInt32(s); // Dá erro e gera uma exceção

Conversão segura:

int numero;
bool resultado = int.TryParse("5b", out numero);

Nesse trecho de código a variável “numero” tera o valor (0) zero, pois não é possível converter 5b para inteiro — o detalhe é que, não será disparada uma exceção.

Outras classes com métodos TryParse:

  • Char.TryParse
  • Guid.TryParse
  • DateTime.TryParse
  • Enum.TryParse
  • Decimal.TryParse
  • Double.TryParse
  • IPAddress.TryParse

Fica a dica.

Categorias:C#, Dicas / Tips Tags:

Impressora Virtual Bematech, Bemafi32, Windows 8 Enterprise 64 bits

09 - 12 6 comentários

Se você está trabalhando em algum sistema de automação comercial, ou com qualquer outro aplicativo que utilize um ECF (Emissor de Cupom Fiscal) e por algum acaso está tendo problemas com o Emulador de Impressora Fiscal da Bematech eis uma possível solução.

Fiz essa configuração no Windows 8 Enterprise 64 bits.

Possíveis mensagens de erro:

  • Conflito de DLLs BemaFI32.DLL
  • Não foi possível abrir a porta ECF.
  • Falha na comunicação.
  • BadImageFormatException: Foi feita uma tentativa de se carregar um programa com um formato incorreto. (Exceção de HRESULT: 0x8007000B)
  • DllNotFoundException was unhandled. Não é possível carregar a DLL ‘BemaFi32.dll’: Não foi possível encontrar o módulo especificado. (Exceção de HRESULT: 0x8007007E)

E por aí vai…

Foto da impressora virtual bematech com configuração de porta serial

Impressora virtual Bematech

Se você se deparou com algum desses problemas ei as,

Possíveis soluções:

  • Baixar novamente as DLLs no site oficial da bematech e colocar na pasta de sistema adequada a seu caso. No windows 32 bits vai para %systemroot\system32, e windows 64 bits vai para %systemroot%\SysWOW64.
  • Confirmar a existência da BemaFI32.ini na pasta da DLL, e setar o parâmetro “EmulMFD = 1”, isso informa que a memória fiscal da ECF será emulada. Caso não for imprimir cupons fiscais pode deixar com o valor padrão “0”.
  • Criar portas seriais virtuais para utilizar a impressora virtual Bematech.
    1. Baixar o programa “Free Virtual Serial Ports Emulator”.
    2. Após a instalação do programa, crie duas portas virtuais (New -> Connector) uma COM1 e a outra COM2, crie um Serial Redirect  entre as duas portas COM1 e COM2.
    3. Configura a impressora para utilizar a COM1 ou COM2  e pronto.

Esses procedimentos devem resolver a maioria dos problemas.

Link para download do Emulador:

http://arquivospartners.bematech.com.br/downloads/2013/12/BematechVirtualSerialPort_x64.zip

Referências:

http://www.devmedia.com.br/forum/problemas-de-comunicacao-com-o-emulador-ecf-bematech/390502

http://www.baixaki.com.br/download/free-virtual-serial-ports-emulator.htm

http://social.msdn.microsoft.com/Forums/pt-BR/geralpt/thread/f630da73-b55d-47d7-bb0e-7538dfbf130e

Traduzindo DevExpress para pt-br

08 - 12 1 comentário

Imagem

Quem utiliza a suíte DevExpress e não sabe como localizar os componentes visuais para Português – Brasil, com a cultura pt-BR, eis a solução:

Etapas:
Obter os assemblies localizados para pt-BR.

Acesse este link:  http://www.devexpress.com/Support/Center/KB/p/A421.aspx

Baixe o arquivo correspondente a sua versão da coletânea DevExpress.

Dentro do arquivo baixado, provavelmente um .RAR, existirá a pasta “DevExpress.DLL”.

Dentro desta pasta procure a pasta correspondente a cultura que deseja obter, no caso: “pt-BR”.

Copie essa pasta para o mesmo local onde está o executável da sua aplicação.

Execute a aplicação e voilá….

 

Mais informações:

http://www.devexpress.com/Support/Center/KB/p/A421.aspx

http://documentation.devexpress.com/#WindowsForms/CustomDocument5755

Categorias:Dicas / Tips

Acelerando desenvolvimento ASP.NET MVC com Twitter Bootstrap

Imagine o seguinte cenário:

Você precisa desenvolver um projeto web, mas não tem afinidade com CSS.

As possibilidades que imagino são:

1. Investir num designer profissional para o projeto.

2. Se aventurar no design.

3. Utilizar um template pronto.

4. Criar um novo design com o amigável Twitter Bootstrap.

Já estou utilizando em novos projetos. E é ótimo.

Há muitos pontos fortes como:

  • Sistema de grid. Muito fácil posicionar os elementos na página com ele.
  • Design responsivo: Suporte a tamanhos de tela diversos. (Mobile, Tablets etc.)
  • Tipografia
  • Blocos de Código: Facilita a inserção de blocos de código.
  • Tabelas: Estilização fácil de tabelas.
  • Formulários: Facilita a inserção de formulário com caixas de busca, checkboxes, selects etc. com estilos de validação dentre outros.
  • Botões: diversos estilos de botões.
  • Mini Ícones: mini ícones para utilizar livremente.
  • Componentes: Dentre diversos componentes para dropdowns, labels, badges, tipografia, thumbnails, alerts, progress bars, dentre outros.
  • Pugins Javascript: Bootstrap também acompanha atualmente 12 plug-ins jquery. * Requer a última versão do jQuery linkada na página.

Exemplo de tela construída com o Twitter Bootstrap:

 

Veja mais motivos pra utilizar o Twitter Bootstrap no Site Oficial

Conheça mais sites construídos com o bootstrap no tumblr Built with Bootstrap

 

Outros links:

Artigo em português sobre o Twitter Bootstrap: http://abruno.com/blog/twitter-bootstrap/

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

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: