Urls com letra minúscula e hífen no AspNet Mvc3

O Asp.Net Mvc trás muitas facilidades para a programação web, dentre elas esta as Urls amigáveis.
Porém por padrão o Mvc Gera as Urls com letras maiúsculas (na verdade ele gera conforme o nome da Action que por convenção C# Pascal Case terá letra mainúscula).

Uma boa prática que se tornou padrão na internet é utilizarmos urls com letras minúsculas e separar as palavras por hifen, deixando mais legivel ao usuario final e dando uma ajudinha aos mecanismos de busca.

no arquivo Global.asax encontramos o seguinte metodo

  public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
        }

o que precisamos fazer é criar um método de extenção que sobreescreva o routCollection padrão;

    public static class RouteCollectionExtensions
    {
        public static void MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults)
        {
            routes.MapRouteLowercase(name, url, defaults, null);
        }

        public static void MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults, object constraints)
        {
            if (routes == null)
                throw new ArgumentNullException("routes");

            if (url == null)
                throw new ArgumentNullException("url");

            var route = new LowercaseRoute(url, new MvcRouteHandler())
                            {
                                Defaults = new RouteValueDictionary(defaults),
                                Constraints = new RouteValueDictionary(constraints)
                            };

            if (String.IsNullOrEmpty(name))
                routes.Add(route);
            else
                routes.Add(name, route);
        }
    }

como podem ver este metodo de extensão acaba retornando um objeto Rote que eu nomeie de LowercaseRoute, então e hora de criar esta classe

public class LowercaseRoute : Route
    {
        public LowercaseRoute(string url, IRouteHandler routeHandler)
            : base(url, routeHandler)
        {
        }

        public LowercaseRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
            : base(url, defaults, routeHandler)
        {
        }

        public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
                              IRouteHandler routeHandler)
            : base(url, defaults, constraints, routeHandler)
        {
        }

        public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
                              RouteValueDictionary dataTokens, IRouteHandler routeHandler)
            : base(url, defaults, constraints, dataTokens, routeHandler)
        {
        }

        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            RouteData rd = base.GetRouteData(httpContext);
            if (null != rd)
            {
                rd.Values.Decode();
            }
            return rd;
        }

        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            values.Encode();
            return base.GetVirtualPath(requestContext, values);
        }
    }

public static class UrlConverter
{
public static RouteValueDictionary Encode(this RouteValueDictionary aRoute)
{
return aRoute.ConvertToLowerWithHypen();
}

public static RouteValueDictionary Decode(this RouteValueDictionary aRoute)
{
return aRoute.ConvertToUpperHypenLess();
}

private static RouteValueDictionary ConvertToLowerWithHypen(this RouteValueDictionary aRoute)
{
var keys = (from kvp in aRoute where kvp.Key == "controller" || kvp.Key == "action" select kvp.Key).ToList();

foreach (string key in keys)
{
string value = ((string)aRoute[key]).Trim();

value = value.ToLowerWithHypen();

aRoute[key] = value;
}

return aRoute;
}

private static RouteValueDictionary ConvertToUpperHypenLess(this RouteValueDictionary aRoute)
{
var keys = (from kvp in aRoute where kvp.Key == "controller" || kvp.Key == "action" select kvp.Key).ToList();

foreach (var key in keys)
{
var value = ((string)aRoute[key]).Trim();

value = value.ToUpperHypenLess();

aRoute[key] = value;
}

return aRoute;
}
}[/code]

public static class ConvertString
{
public static string ToLowerWithHypen(this string value)
{
var result = new StringBuilder();
if (value.Length > 0)
{
result.Append(value[0]);

for (int i = 1; i 0)
{
result.Append(value[0].ToString().ToUpper());

for (int i = 1; i < value.Length; i++)
{
if (value[i] == '-')
{
i++;
result.Append(value[i].ToString().ToUpperInvariant());
}
else
{
result.Append(value[i]);
}
}
}
return result.ToString();
}
}[/code]

Diferenças Java C#

Postei no forúm Guj as principais coisas que eu queria que o java tivesse e que o c# já tem…

programo com c# faz um ano, e nunca programei com java fora da faculdade então talvês fale besteira…

Visual Studio + Resharper fica muito melhor que NetBeans ou Eclipse. Digo por experiencia própria e quem ja usou sabe, mas resharper tem pra intelliJ IDE que eu nunca usei, então mas talves seja tão bom quanto

Propriedades: muito mais elegante que os get e set do java, o codigo fica mais limpo e legivel
C#

public string Texto{ get; set; }

Java
        private string texto;

        public string getTexto()
        {
            return texto;
        }

        public void setTexto(string texto)
        {
            this.texto = texto;
        }

Var: o palavra reservada var é trocada em tempo de compilação pelo tipo correto, deixando o codigo mais limpo e com menos repetição
Anonymous: criar objetos Anonymous é muito pratico, e pra quem tava falando de Json, c# converte até Anonymous pra Json

C#

 public string testeJson()
        {
            var algo = new
                           {
                               ID = 0,
                               Texto = "oi"
                           };

            var jss = new JavaScriptSerializer();
            return jss.Serialize(algo);
        }

Linq e Lambda: realizar consultas em listas e coleções com um codigo extremamente limpo e garantia de maior eficiencia possivel

C#

var noticias =  Noticias.Where(x => x.Autor == "Fernado");

Java

         ArrayList<Noticia> n = new ArrayList<Noticia>();
         for (Noticia noticia : Noticias)
            {
                if (noticia.Autor == "fernando")
                    n.Add(noticia);
            }

         return n;

Delegate: muito mais fácil que ActionListener do java, quanto bem usado o código fica muito claro

//deu preguiça de fazer um exemplo :)

Extension Methods: Classes Estaticas com metodos estaticos podem ser chamados mais facilmente

public static class ExtensoesParaString
{

    public static string AlgoInutil(this string s)
    {
        return s.Substring(2);
    }
}

C#

  var texto = "oi pessoal";
            string texto2 = texto.AlgoInutil();

Java
 string texto = "oi pessoal";
            string texto2 = ExtensoesParaString.AlgoInutil(texto);

Fora o Asp.net Mvc 3 com Razor é que um Doce….

Bom, eu adoro java, e torço muito para a Oracle não ferrar com ele e implementar tudo isso que o c# tem a mais…

DevGames Parte 4 – As classes

Tentatei neste tempo apertado que tenho montar um raciocinio em cima de quais classes um game obrigatoriamente deve ter.

como comentei anteriormente todo game se baseia no looping princiapal:

</pre>
while (!Game.fimJogo) {
while (ticks && !Game.fimJogo) {

Game.logic();

if (key[KEY_ESC]) Game.setFimJogo(true);
}

Game.render();
frames++;

if (segundos) {
fps = frames / segundos;
frames = 0;
segundos = 0;
}
}
<pre>

logicamente, uma classe que não pode faltar é a classe Game.

GAME:
A Classe Game é o coração do jogo, em um projeto bem estruturado, será a classe que mais faremos alterações.

CONTAINER:

PLAYER:

ENEMY:

MAP:

Você Sabia?

Que Todos os Métodos em Java são virtuais ?

Se em C++ temos que explicitamente definir os métodos como virtuais para utilizá-los no polimorfismo, em Java está pré definido.

public class Pai {

 public String m(){
 return "pai";
 }

}

 public class Filho extends Pai{

 public String m(){
 return "filho";
 }

}

public class Main {

 public static void main(String[] args) {

 Pai x= new Filho();
 System.out.print(x.m()); //irá imprimir filho

 }

}

Calculadora Java – Netbeans

Ok vamos então fazer uma calculadora em java bem no estilo da Calc do Windows.

Para Isso vamos precisar logicamente de… Classes!
Nada melhor que nosso Velho Orientado a Objetos para nos facilitar a vida não é mesmo?

E o que uma calculadora faz de melhor?..

package calcDigital;

public abstract class Calculos {

 public double Soma(double a, double b){
 return (a+b);
 }

 public double Subtracao(double a, double b){
 return (a-b);
 }

 public double Multiplicacao(double a, double b){
 return (a*b);
 }
 public double Divisao(double a, double b){
 return (a/b);
 }
 public double Alterar(double a){
 return (a*(-1));

 }
 public double Inversao(double a){
 return (1/a);

 }
 public double Raiz(double a){
 return Math.sqrt(a);

 }
 public double Perc(double valor, double perc){
 return ((valor * perc) /100);

 }

}

se pegarmos a calculadora do Windows veremos os principais botões.

calc

calc

Continua…

DevGames Parte 1 – Escolhendo As Ferramentas de Trabalho

A primeira coisa que devemos pensar é na linguagem de programação.

Nos dias de hoje existem diversas Linguagem utilizadas, porém a que predomina principalmente nos consoles é o C++. Uma Linguagem Concorrente seria o Java,  que eu muito simpatizo, mas apesar de bons jogos como Jake2 (uma versão de Quake2 feita completamente em Java) o mercado, que tem crescido,  ainda é lento para ele.

Alternativamente temos o Flash e seu Action Script, correndo por fora. Você certamente já conhece os sites de jogos casuais como o PapaJogos ou ClicJogos. Estes jogos utilizam o Programa Flash da Abode (ex macromedia) como Ambiente de desenvolvimento e a Linguagem de programação Action Script.

Continuar a ler

DevGames Parte 2 – Usando Allegro e AllegroGl no Code Blocks

Para começarmos a colocar a mão na massa devemos primeiramente ter nossa IDE e nossa Biblioteca devida mente configuradas

A primeira coisa que se deve fazer é baixar os seguintes arquivos:

o copilador MinGW

http://sourceforge.net/projects/mingw/

o code:blocks ultima versão:

http://forums.codeblocks.org/index.php/board,20.0.html

a dll wxmsw28 requerida:

http://prdownload.berlios.de/codeblocks/CB_20100824_rev6527_win32.7z

e a dll para se trabalhar com o mingw:

http://prdownload.berlios.de/codeblocks/mingwm10_gcc441.7z

Continuar a ler

DevGames Parte 3 – O Game Looping

Para começar iremos partir do básico. Os jogos são programados segundo uma lógica de programação do looping principal.

Enquanto quem programa em linguagens visuais só se preocupa com os métodos saiba que internamente todo o programa tem um looping.

Enquanto voce está “Swingando” no seu eclipse certamente o java ta la num loopin constante de:

while (Programa Rodando) {

//executa as ações de todos os objetos

// um exemplo seria verificar se um botão foi clicado

// desenha todos os objetos na tela

}

Este lopping é executado constantemente de 30 a 60 vezes por segundos

Podemos separar então o looping em duas partes:

* as verificações  e ações que podemos chamar de Lógica do jogo

* o desenho deles na tela que podemos chamar de renderização.

Diferentemente de uma programação visual, onde a looping do programa fica implícito, na programação de jogos o negócio é mais embaixo, tendo que programar na raça essa parte também.

Abre o Code Blocks, conforme o tutorial que passei na parte anterior, link as bibliotecas do Allegro e cole o seguinte codigo:

Continuar a ler

DevGames Parte 0 – Programaçao de jogos De Verdade

Com o lançamento do Atari Msx, Nes e Master System surgiu os fãs de VideoGame, desde então uma parcela considerável  começara a  compartilhar o desejo de criar seus próprios jogos.  Dos jovens  japoneses que matavam aula para comprar um Dragon Quest no fim dos anos 80 (hoje em dia só é lançado Dragon Quest no Japão em feriado para evitar isso) até  os Fãn Boys que viraram Nerds pós – Final Fantasy VII esse sentimento só aumentou.

Quando eu tinha meus 12 ou 13 anos, ainda não era tão fã de Rpgs, eu meu sonho naquela época era criar meu próprio Resident Evil. Lembro de meu caderninho com personagens, armas, e historias, tão tolas agora mas tão boas na época.

Continuar a ler

Economia de Energia

Segundo estudos feitos com o Google Preto (http://www.blackle.com/), paginas escuras economizam em media 20% de energia

Hoje em dia que usa o computador no trabalho o utilizando umas 8 horas por dia tende a gastar uns R$5.00 por mês só no monitor (sem contar a cpu e as caixas de som) .

A economia de energia não é boa somente para seu bolso, mas para o planeta também. Ao economizarmos energias as hidrelétricas poderão distribuir para maiores regiões e assim as usinas nucleares não serão tão utilizadas tendo menos lixo radioativo destruindo o “LifeStream” do planeta .