domingo, 20 de novembro de 2011

ASP.NET: Menu Recursivo

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/11/20/ASPNET-Menu-Recursivo.aspx


Olá! Já tem algum tempo que não posto nada aqui, mas nessa semana vi um pessoal no trabalho fazendo um user control para criar um menu dinâmico. Eles chegaram numa solução, mas eu disse que tinha um outro caminho que provavelmente seria mais simples e que poderia seguir a 3NF no banco de dados. No final, acredito que o mais importante seja conseguir entregar a solução e que ela seja de fácil manutenção, mas vou mostrar aqui qual foi minha solução utilizando recursividade.

O diagrama abaixo representa a parte de banco de dados, utlizando SQL Server:



O código para geração da tabela e criação dos dados pode ser baixado aqui: http://dl.dropbox.com/u/20361010/menu_recursivo_tabelas.sql

Como podem ver, existe uma tabela para criação do menu em si, outra para os usuários e uma outra para a criação do relacionamento n:n entre essas duas tabelas, gerando assim as permissões para os itens de menu que cada usuário terá.

Com o campo "Ordem" na tabela "Menu" e com o relacionamento citado anteriormente, é possível buscar os dados na aplicação somente visíveis para um determinado usuário e também na ordem que os itens estão configurados para aparecer. Assim não existe a necessidade nem de baixar mais dados que o necessário e nem de um processamento extra para o caso das permissões.

A aplicação é bem simples e, no meu exemplo, está somente na tela, tendo ainda que ser divida em camadas. Um trabalho que vou deixar por conta de vocês, já que não é o foco desse post.

O foco da aplicação está somente no método recursivo criado para gerar uma lista em html, num controle Literal, utilizando os dados no formato que está no banco de dados. A parte de CSS e JavaScript necessária também ficará por conta de vocês.

Aqui pode ser baixada a parte web (nesse caso, criei um Web Site): http://dl.dropbox.com/u/20361010/Menu.rar

Note que é necessário colocar o ID do usuário no TextBox para carregar o menu dele.


Espero que tenha sido simples de entender e que tenha ajudado alguém com esse post.

Até o próximo!

domingo, 9 de outubro de 2011

Formatação do Código SQL

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/10/09/Formatacao-do-Codigo-SQL.aspx


Essa página é legal pra formatar o código SQL, fazendo a identação. Ela também mostra como ficaria o código html, caso você queira usar esse código no seu blog ou site.

URL: http://www.dpriver.com/pp/sqlformat.htm

Achei legal, o único problema é que ele gera espaços ao invés de tabs, então acho que é uma ferramenta mais pra entender o código quando ele vem todo em uma linha só do que pra fazer uma query do início.

SELECT: Ordem Lógica de Processamento

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/10/09/SELECT-Ordem-Logica-de-Processamento.aspx


A ordem de execução de um SELECT é:

1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
10. DISTINCT
11. ORDER BY
12. TOP

quarta-feira, 5 de outubro de 2011

Formatação de Código SQL

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/10/05/Formatacao-de-Codigo-SQL.aspx


Muitas vezes encontramos código SQL que faz um SELECT de várias colunas, tem WHERE, JOIN, etc, menos uma identação que ajude a entender o que aquela query realmente faz. Essa página ajuda a formatar o código que estiver em T-SQL, PL/SQL, entre outros:

http://www.dpriver.com/pp/sqlformat.htm

A página ainda fornece o código gerado em HTML para colocar no seu site, caso necessário.

Achei essa ferramente boa para quando a query já está feita e é necessário entendê-la. Para iniciar uma query é mais interessante já fazer ela formatada, pois essa ferramenta usa espaços para identação e não tabs.

sábado, 24 de setembro de 2011

SQL Server: ISNUMERIC retorna falso positivos

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/09/23/SQL-Server-ISNUMERIC-retorna-falso-positivos.aspx


A função ISNUMERIC retorna alguns falsos positivos em determinadas situações. Alguns dos casos são: para sinais de "$" (cifrão), "-" (menos), espaço e tab.

Uma maneira de evitar isso é adicionar "e0" ao final do dado que será testado. Isso fará o número ficar num formato científico, o que na prática multiplica o número por 1. Caso seja algum dos sinais citados acima, a função ISNUMERIC irá retornar 0, pois não é um número (por exemplo: "$e0").

Caso o número a ser testado já esteja num formato científico, ISNUMERIC retornará 0, pois, por exemplo "1.234e4e0" não é um valor numérico válido. Para lidar com isso, antes de adicionar "e0" ao número a ser testado, pode ser interessante testar antes para ver se o número contém a letra "E" nele. Caso contenha, basta colocar esse valor na função ISNUMERIC para fazer o teste. Caso contrário, então deverá ser adicionado "e0" após o valor.

SQL Server: Removendo a hora de um DATETIME

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/09/23/SQL-Server-Removendo-a-hora-de-um-DATETIME.aspx


Existem várias formas de remover a hora de um valor DATETIME, porém qual é a melhor delas? Existe uma resposta bem completa nessa página do Stack Overflow: http://stackoverflow.com/questions/2775/whats-the-best-way-to-remove-the-time-portion-of-a-datetime-value-sql-server

Resumindo, no SQL Server 2008, a melhor forma seria:

DECLARE @DATA AS DATETIME
SET @DATA = CONVERT(DATE, GETDATE())


Porém, nas outras versões não existe o tipo DATE. Então, na ordem do mais rápido para o mais demorado, ficaria:

DECLARE @DATA AS DATETIME

-- mais rápido
SET @DATA = CAST(GETDATE() - 0.50000004 AS int)

-- segundo mais rápido e mais fácil de entender e lembrar
SET @DATA = DATEDIFF(DAY, 0, GETDATE())

-- terceiro mais rápido
SET @DATA = FLOOR(CAST(GETDATE() as float))


Conclusão: o melhor de se usar, por não ter muita diferença do primeiro e não confundir tanto, seria a segunda opção.

sábado, 30 de julho de 2011

SQL Server: Tipos de Dados

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/07/30/SQL-Server-Tipos-de-Dados.aspx


Aí vão alguns artigos legais para entender melhor os tipos de dados do SQL Server, suas diferenças e as dúvidas mais frequentes sobre o assunto:

http://imasters.com.br/artigo/244/sql_server/tipos_de_dados_no_sql_server_-_parte_1/
http://imasters.com.br/artigo/245/sql_server/tipos_de_dados_no_sql_server_parte_2/
http://www.techrepublic.com/blog/10things/10-common-questions-about-sql-server-data-types/355

SQL Server: Indexes

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/07/30/SQL-Server-Indexes.aspx


Encontrei muitos artigos repetidos sobre o assunto e com uma explicação muito fraca, mas esse dá pra entender bem legal, achei bem interessante: http://odetocode.com/articles/70.aspx

domingo, 15 de maio de 2011

Classes Genéricas: Lista Ligada em C#

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/05/15/Classes-Genericas-Lista-Ligada-em-C.aspx


Estou lendo o livro da certificação em .NET e tem esse exercício no primeiro capítulo: criar uma lista ligada usando classses genéricas em C#. Fiz uma bem rápido e estou postando aqui como um exemplo de classes genéricas (não ligue muito para o algoritmo, por favor).

Essa classe aceita qualquer tipo, mas caso quisesse restringir os tipos que podem ser aceitos, usaria "public class ListaLigada where T : IDisposable", por exemplo, para aceitar somente tipos que implementem a interface IDisposable.

Abaixo, segue o código de exemplo:

public class ListaLigadaNo<T>
{
    private ListaLigadaNo<T> _Proximo;

    public ListaLigadaNo<T> Proximo
    {
        get { return _Proximo; }
        internal set { _Proximo = value; }
    }

    private T _valor;

    public ListaLigadaNo(T valor)
    {
        _valor = valor;
    }

    public override string ToString()
    {
        return _valor.ToString();
    }
}



public class ListaLigada<T>
{
    private ListaLigadaNo<T> _Primeiro;
    private ListaLigadaNo<T> _Ultimo;
    private int _Count;


    public int Count
    {
        get { return _Count; }
    }

    public ListaLigadaNo<T> Ultimo
    {
        get { return _Ultimo; }
    }

    public ListaLigadaNo<T> Primeiro
    {
        get { return _Primeiro; }
    }

    public ListaLigada()
    {
        _Primeiro = null;
        _Ultimo = null;
        _Count = 0;
    }

    public override string ToString()
    {
        StringBuilder _sbRetorno = new StringBuilder();

        ListaLigadaNo<T> _noAtual = _Primeiro;

        while (_noAtual != null)
        {
            _sbRetorno.AppendFormat("{0};", _noAtual.ToString());
            _noAtual = _noAtual.Proximo;
        }

        return _sbRetorno.ToString();
    }

    public void AdicionarPrimeiro(T valor)
    {
        ListaLigadaNo<T> _PrimeiroAux = _Primeiro;
        _Primeiro = new ListaLigadaNo<T>(valor);
        _Primeiro.Proximo = _PrimeiroAux;

        if (_PrimeiroAux == null)
            _Ultimo = _Primeiro;

        _Count++;
    }

    public void AdicionarUltimo(T valor)
    {
        ListaLigadaNo<T> _UltimoAux = _Ultimo;
        _Ultimo = new ListaLigadaNo<T>(valor);
        _Ultimo.Proximo = null;

        if (_UltimoAux == null)
            _Primeiro = _Ultimo;
        else
            _UltimoAux.Proximo = _Ultimo;

        _Count++;
    }

    public void AdicionarDepois(ListaLigadaNo<T> No, T valor)
    {
        if (_Primeiro == null)
        {
            _Primeiro = No;
            _Ultimo = new ListaLigadaNo<T>(valor);
            _Ultimo.Proximo = null;
            _Primeiro.Proximo = _Ultimo;
        }
        else
        {
            ListaLigadaNo<T> _ProxAux = No.Proximo;
            No.Proximo = new ListaLigadaNo<T>(valor);
            No.Proximo.Proximo = _ProxAux;

            if (_ProxAux == null)
                _Ultimo = No.Proximo;
        }

        _Count++;
    }
}


class Program
{
    static void Main(string[] args)
    {
        ListaLigada<int> _ListaLigada = new ListaLigada<int>();

        _ListaLigada.AdicionarUltimo(-2);
        _ListaLigada.AdicionarPrimeiro(0);
        _ListaLigada.AdicionarUltimo(-2);

        for (int i = 1; i <= 100; i++)
            _ListaLigada.AdicionarDepois(_ListaLigada.Ultimo, i);

        _ListaLigada.AdicionarPrimeiro(-1);
        _ListaLigada.AdicionarUltimo(-2);
        

        Console.WriteLine(_ListaLigada.ToString());
        Console.WriteLine("Primeiro: {0}", _ListaLigada.Primeiro.ToString());
        Console.WriteLine("Último: {0}", _ListaLigada.Ultimo.ToString());
        Console.WriteLine("Contagem: {0}", _ListaLigada.Count.ToString());

        Console.ReadLine();
    }
}

domingo, 8 de maio de 2011

Entendendo o maldito Delegate

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/05/08/Entendendo-o-maldito-Delegate.aspx


Estudando sobre o assunto percebi que o negócio é complicado, mas não é impossível de entender. Quando encontrar páginas que ensinem bem e de forma simples de entender irei postando aqui. Por enquanto o que achei foi:

Delegates in .NET
http://dotnetslackers.com/articles/net/Delegates-in-NET.aspx

sábado, 7 de maio de 2011

IIS 5 e Windows XP: Server Application Unavailable

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/05/07/IIS-5-e-Windows-XP-Server-Application-Unavailable.aspx


A situação é a seguinte: após configurar tudo no IIS, deixar acesso para usuários anônimos e tudo mais configurado certinho, ainda recebo o seguinte erro ao acessar minha página:

Server Application Unavailable

The web application you are attempting to access on this web server is currently unavailable.  Please hit the "Refresh" button in your web browser to retry your request.

No Event Viewer o erro começa assim: Exception: System.IO.FileLoadException...

Na maioria dos fóruns falam pra dar acesso para o usuário padrão do IIS e coisas do tipo. Eu não imaginava que a solução pra mim pudesse ser tão simples: Compartilhar a pasta na rede. Só isso e consegui acessar minhas páginas normalmente.

Erro: EXECUTE permission denied on object 'sp_sdidebug', database 'master', owner 'dbo'

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/05/07/Erro-EXECUTE-permission-denied-on-object-sp_sdidebug-database-master-owner-dbo.aspx


Ao debugar uma página ASP.NET eu estava obtendo esse erro: EXECUTE permission denied on object 'sp_sdidebug', database 'master', owner 'dbo'.

Vi várias opções de como arrumar isso, inclusive dando permissão para executar a stored procedure citada no erro (o que pra mim não funcionou). O fórum que realmente me ajudou foi esse:

http://forums.asp.net/t/1179952.aspx/1?Get+quot+EXECUTE+permission+denied+on+object+sp_sdidebug+database+master+owner+dbo+quot+error+when+debugger+attached

Pelo que entendi, o Visual Studio entende, por padrão, que estamos querendo debugar também as stored procedures, por isso "sp_sdidebug" seria necessária. Como não era essa minha intenção, então desabilitei isso: "Property Pages" do site, "Start Options" e abaixo de "Debugger" tirar a opção "SQL Server". Na hora de dar um Attach para debugar, por exemplo, direto do IIS, preste atenção também na opção "Attach to".

Screenshot de uma página web com Flash

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/05/07/Screenshot-de-uma-pagina-web-com-Flash.aspx


É uma tristeza ter que dar um Print Screen para uma parte da janela do navegador, depois rolar mais um pouco e dar mais um Print Screen, assim sucessivamente até conseguir o screenshot de cada parte da página web. Depois ainda ter que juntar cada pedaço pra gerar uma imagem só para enviar, por exemplo, por e-mail. Triste. Encontrei alguns programas que executam essa tarefa muito bem, menos quando a página tem partes em Flash.

Esses programas geralmente renderizam a página e já criam a imagem da mesma. Geralmente o Flash leva um tempo a mais pra carregar, apesar de já estar renderizado pelo HTML. O resultado é que toda a página aparece já carregada, mas o Flash aparece em branco ou com o vídeo padrão antes de carregar.

Depois de pesquisar um pouco, cito abaixo quatro soluções para esses casos específicos.


Web Shot

Esse programa é muito bom e tem ferramentas que são gratuitas. Ele pode ser baixado no site abaixo:

http://www.websitescreenshots.com/

O truque desse software é renderizar a página e esperar mais um tempo até o conteúdo em flash ser carregado para aí sim efetuar o screenshot. O padrão de espera é de 5 segundos, mas isso pode ser alterado na aba Process do programa. O grande problema nisso é que a ferramenta de renderização usada pelo programa não é tão rápida quanto o IE ou Firefox. Isso significa que 5 segundos de espera no Web Shot não é o mesmo que 5 segundos no Firefox, por exemplo. Na minha máquina (Core i3) 5 segundos no Firefox equivalem a 120 no Web Shot, o que é suficiente para carregar o conteúdo em Flash do FusionCharts. Dependendo da máquina em que for usado, algumas animações simplesmente não irão carregar totalmente e não adianta colocar mais tempo.


Screenshot Pimp

Esse é um add-on do Firefox que, entre outras funcionalidades, gera um screenshot da página. Ele e o FireShot são os únicos que encontrei que conseguem extrair todos os arquivos Flash na imagem, mesmo os que não estão na parte visível da página, apesar que em alguns lugares a imagem do Flash fica preta de qualquer maneira. Os outros add-ons (incluindo o PdfIt, que acho muito bom por gerar PDF também) geram as animações não visíveis na tela com tudo preto. Esse add-on pode ser baixado no link abaixo:

https://addons.mozilla.org/pt-BR/firefox/addon/screenshot-pimp-screengrab-scr/

A vantagem dessa abordagem é que a página já está carregada, assim como as animações em Flash, assim a transformação da página em imagem (.jpg ou .png) é praticamente instantânea. Já a desvantagem é que é necessário o Firefox para funcionar, diferente do Web Shot que é para Windows e não depende de navegador. Além disso, nem toda página fica igual no Firefox e no IE (por descuido do desenvolvedor ou designer).


FireShot

Esse add-on é interessante porque anula esse problema que até o Screenshot Pimp tem às vezes: gerar as imagens do Flash como um retângulo preto (no Firefox 4 fica branco). A idéia dele é rolar a página, assim as imagens em Flash sempre serão tiradas na parte visível da página, evitando o erro de ficarem pretas. Outra vantagem é que ele pode ser encontrado para o IE, Firefox e Chrome.

Ele pode ser encontrado na página dos criadores do plugin:

http://screenshot-program.com/fireshot/


Para Desenvolvedores .NET

Resolvi juntar os exemplos que vi na web e criar uma biblioteca .NET que facilitasse a vida de desenvolvedores que utilizam ASP.NET e querem criar um botão ou link em suas páginas para transformá-las em JPEG. Abaixo coloquei um link com um exemplo em ASP.NET 3.5 de como usar essa DLL:

http://dl.dropbox.com/u/20361010/blog/pagescreenshot/PageToJpg.zip

Assim como o Web Shot, essa biblioteca usa um objeto (nesse caso, o WebBrowser) para renderizar a página e é necessário usar um tempo de espera para carregar o conteúdo em Flash. Os problemas descritos na parte do Web Shot são praticamente os mesmos aqui. Se a página não tiver conteúdo em Flash, tudo funciona bem.

domingo, 24 de abril de 2011

TreeGrid: Parte 2 - ASP.NET

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/04/24/TreeGrid-Parte-2-ASPNET.aspx


No post anterior eu mostrei como deve ser o HTML retornado para o cliente para que o JavaScript crie a grid em árvore. Nesse post irei deixar para download três exemplos em ASP.NET para fazer essa tarefa, dependendo de como deseja-se o resultado e de como os dados estão sendo passados.

O primeiro exemplo é ideal para quando existem poucos níveis, pois obriga a criar um LinkButton para cada coluna que houver quebra. Ele também obriga a criação de uma coluna a mais informando o nível atual de quebra, que deve ser retornada do banco de dados ou então deve ser usada alguma lógica para retornar esse nível no programa. O programa do exemplo não acessa banco de dados, pois foi criada uma lista genérica com uma simulação de dados para popular o GridView.

Para o segundo exemplo não é necessário que seja retornada mais uma coluna para o nível, mas é necessário que para cada quebra de nível seja retornado NULL do banco de dados na coluna do próximo nível. Por exemplo: "NIVEL1; NIVEL2; NULL;" significa que nada será mostrado na coluna do nível 3. Outro fator é que os dados precisam ser repetidos, assim o código vai encontrar onde está a quebra quando não houver mais repetição. Por exemplo:

NIVEL1; NULL; NULL;
NIVEL1; NIVEL2; NULL;
NIVEL1; NIVEL2; NIVEL3;

O terceiro exemplo é igual no código de tratamento do GridView, porém a lógica de criar uma linha a mais com a coluna NULL fica por conta do .NET e não da mais da query.

Para o segundo e o terceiro exemplo, é usado o banco de dados Northwind. É necessário alterar a ConnectionString no web.config para o servidor correto. As queries estão na pasta Queries.

Os exemplos desse post são apenas idéias, mas existem diversas possibilidades. Eu mesmo já usei outras idéias para gerar o mesmo resultado.

sexta-feira, 22 de abril de 2011

TreeGrid: Parte 1 - HTML

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/04/22/TreeGrid-Parte-1-HTML.aspx


Tive que fazer no trabalho uma grid que tivesse a possibilidade de ser feito um drill down, para mostrar detalhes de uma determinada área. Seria como um GridView com aspecto de TreeView.

Cheguei a pesquisar um pouco sobre o assunto e cheguei a achar alguns exemplos legais, mas que não eram exatamente o que eu precisava (esse, por exemplo: http://www.obout.com/t2/ex_columns_aligned.aspx). Resolvi, então, treinar um pouco o JavaScript com JQuery que já estava um pouco enferrujado e fiz um código do início. A idéia era que esse código processasse a tabela em HTML resultante da GridView. Isso significa que o código em JavaScript pode ser usado independente da linguagem usada no server, como ASP.NET, PHP, ASP, etc (isso parece óbvio pra quem entende, mas só pra detalhar mesmo).

Observando o código HTML disponível no final do artigo é possível entender o que fazer com o código do lado servidor para obter uma tabela com os mesmos estilos (CSS) que a mostrada, para que então o JavaScript faça seu trabalho. A tabela no código HTML deve conter:

  • Classe CSS "treegrid" na tag da tabela ("table");
  • Cada linha ("tr") ) deve conter uma classe que identifique seu nível na hierarquia da árvore ("nivel-1" para o primeiro nível, por exemplo);
  • Hyperlink ("a") com o texto em branco e a classe "mostrar-esconder" na célula em que desejar mostrar o sinal de + ou - para dar o expand ou collapse da árvore;
  • Caso queira que algum nível fique amostra ao iniciar, é possível atribuir a classe CSS "mostrando" à tag "tr" e então um nível abaixo a esse será mostrado por padrão, na inicialização da página.

Código para download: http://dl.dropbox.com/u/20361010/blog/treegrid/treegrid_html01.rar

Nos próximos posts, vou mostrar exemplos para o código no lado servidor, dependendo de como os dados estiverem disponíveis e da forma que se deseja mostrar.

sábado, 12 de março de 2011

ASP.NET: Formatação de datas e números

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/03/12/ASPNET-Formatacao-de-datas-e-numeros.aspx


Muitas vezes desenvolvemos uma página numa máquina que está com tudo setado para o português do Brasil, mas depois essa página vai rodar num servidor com Regional Settings em inglês. Aí quando nos damos conta, o que era pra ser 26/02/2010 vira 02/26/2010 e o que era pra ser 2.011,54 vira 2,011.54.

É possível já cuidar disso desde o início, usando a tag no web.config. No caso de querer que o formato seja o português do Brasil, ficaria assim:



O parâmetro Culture irá definir os formatos de data e numéricos, por exemplo. Já o parâmetro uiCulture tem a ver com os recursos que serão carregados com a página.

Aí vão dois artigos mais completos sobre o assunto:

How to: Set the Culture and UI Culture for ASP.NET Web Page Globalization

Formatting Dates, Times and Numbers in ASP.NET

sexta-feira, 11 de fevereiro de 2011

Como fazer download sem passar o celular

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/02/11/Como-fazer-download-sem-passar-o-celular.aspx


Alguns blogs que disponibilizam links de download de sites como 4shared e FileServe, antes da pessoa poder acessar diretamente o link, ela é redirecionada para uma página onde tem que cadastrar geralmente o número do celular. Após cadastrar o celular, aí a pessoa pode acessar a página de download. A maioria das pessoas desiste logo que vê esse tipo de página de cadastro de celular.

Atualmente, eu encontrei três maneiras que essas páginas de cadastro de celular usam para saber qual página redirecionar o usuário depois que ele preencher o número do celular e todas estão na URL da página (veja na figura no final do post). Veja os exemplos de URL a seguir (com o nome do site trocado para xxx):

1) http://xxx.com/b/?url=http://goo.gl/M7iIB
Esse é o tipo mais simples de identificar, pois basta olhar a parte final do link (em vermelho no link acima) que lá está a nova url.

2) http://xxx.com/b/?url=BIi7M/lg.oog//:ptth
Esse exemplo é tão simples quanto o anterior, a diferença é que a url está ao contrário. Claro que é muito chato digitar caractere por caractere, então aqui vai um site para você poder fazer esse trabalho facilmente: http://textop.us/Text-tools/Reverse-Text.

3) http://xxx.com/b/?u=aHR0cDovL2dvby5nbC9NN2lJQg==
As três maneiras anteriores devem parecer óbvias pra maioria das pessoas, mas nessa acredito que a maioria desista. Não que seja muito complexo, não é nada disso, mas não parece logo de cara que a url que está aí nesse texto em vermelho acima. Nesse caso, a url está em base64. Não vou entrar muito em detalhes sobre como funciona a base64, mas posso dizer que é simples encontrar sites que transformam o texto de base64 para texto. Na minha opinião, esse é o melhor: http://www.motobit.com/util/base64-decoder-encoder.asp (use a opção decode). Ao decodificar, você provavelmente terá como resultado a url para baixar o que está procurando. É possível que após decodificar, a url ainda venha ao contrário. Nesse caso, é só utilizar esse link para arrumar: http://textop.us/Text-tools/Reverse-Text.


Existem outras maneiras que podemos encontrar na web, porém essas são as que eu mais tenho encontrado. As outras geralmente são pequenas variações. O importante é identificar onde está a url de download dentro da url da página que está pedindo para você cadastrar seu celular. Abaixo você encontra um print de uma dessas telas:



P.S.: Não sou eu quem fez o upload dos links de download. Esses links usados aqui são somente exemplos e caso tenham alguma validade é mera coincidência.

quinta-feira, 10 de fevereiro de 2011

Artigos sobre programação em N camadas

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/02/10/Artigos-sobre-programacao-em-N-camadas.aspx


A web é cheia de conteúdo dos mais variados assuntos. É conteúdo que não acaba mais, mas o difícil é encontrar conteúdo de qualidade.

Encontrei esses artigos que dão uma boa noção de programação em N camadas. Os artigos são do site DevBrasil, escritos pelo Felipe Pocchini:

http://devbrasil.net/profiles/blogs/aplicacoes-em-n-camadas-com

http://devbrasil.net/profiles/blogs/aplicacoes-em-n-camadas-com-1


http://devbrasil.net/profiles/blogs/aplicacoes-em-n-camadas-com-2

http://devbrasil.net/profiles/blogs/aplicacoes-em-n-camadas-com-3

quarta-feira, 9 de fevereiro de 2011

Editores XML

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/02/09/Editores-XML.aspx


Como é difícil encontrar um editor XML decente! Tentei vários e praticamente nenhum me agradou tanto no design quanto na facilidade de encontrar as ferramentas.

O único que me agradou até hoje, que eu já trabalhava antes, inclusive, foi o XML Spy. Ele pelo menos mostra um desenho simples de entender do XML, isso sem falar que as ferramentas para XSLT e XPath são simples de encontrar e usar.

A parte que não é tão legal do programa é que ele não é free.

XML: XPath

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/02/09/XML-XPath.aspx


Esse artigo é bem interessante para que mestá começando a usar XPath, com alguns exemplos em C#:

http://www.microsoft.com/brasil/msdn/Tecnologias/visualc/XPath.mspx

VirtualBox: Enxergar máquina virtual na rede

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/02/09/VirtualBox-Enxergar-maquina-virtual-na-rede.aspx


No VirtualBox existem algumas configurações da placa de rede para escolher. Escolhendo a opção NAT, você pode acessar a Internet através da sua máquina física, porém sua máquina virtual ainda não vai ser enxergada na rede pelas outras máquinas.

Para que a máquina virtual seja vista na rede como qualquer outra, podendo compartilhar arquivos e também acessar arquivos de outras máquina, impressoras, etc, basta mudar a configuração da placa de rede da máquina virtual para Bridge.

É óbvio que outras configurações também são necessários, como no meu caso. Eu não uso domínio, então é necessário que a máquina virtual esteja no mesmo grupo de trabalho que as outras da minha rede. Também é necessário configurar o compartilhamento de arquivos, o que é bem intuitivo clicando com o botão direito no diretório que se deseja compartilhar e depois na aba Compartilhamento.

Acesso de outro PC ao SQL Server em Window 7

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/02/09/Acesso-de-outro-PC-ao-SQL-Server-em-Window-7.aspx


Esse post é só um resumo dessa thread abaixo, onde a pessoa que postou a dúvida no forum resume muito bem os passos que fez no final, juntando todas as dicas dadas pelos outros usuários.

Thread: http://www.sevenforums.com/system-security/58817-remote-access-sql-server-express-2008-windows-7-a.html

Antes de mais nada, eu instalei só a parte client do SQL Server no Windows XP, que era a máquina que eu queria acessar o SQL Server do Windows 7. Pra isso é só instalar as Shared Features e não as Instance Features (aqui explica direitinho: http://www.mssqltips.com/tip.asp?tip=1807).

Passos para liberar a conexão com o SQL Server no Windows 7:

  1. Habilitar conexões remotas ao SQL Server: No SQL Server Configuration Manager, coloque a inicializaçao do SQL Server Browser como Automatic. Depois habilite o protocolo TCP/IP no SQL Server Network Configuration. Mais detalhes aqui: http://www.linglom.com/2009/03/28/enable-remote-connection-on-sql-server-2008-express/
  2. Criar regras de entrada e de saída TCP e UDP para permitir acesso às portas 1433 e 1434 (portas padrão) no Firewall: No Painel de Controle, no Firewall do Windows, acesse as Configurações Avançadas. Estando aí, basta adicionar as regras de entrada e de saída. Mais detalhes de como fazer isso em: http://www.dummies.com/how-to/content/how-to-open-a-port-in-the-windows-7-firewall.html
  3. Adicionar exceções no Firewall ao programa sqlservr.exe e ao programa sqlbrowser.exe: Voltando ao Firewall do Windows, no Painel de Controle, clique na esquerda em Permitir um programa ou recurso pelo Firewall do Windows. Agora basta adicionar e habilitar os programas. No meu PC, eles estão nos respectivos caminhos: C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\sqlservr.exe e C:\Program Files (x86)\Microsoft SQL Server\90\Shared\sqlbrowser.exe. Mais detalhes sobre como adicionar essas exceções em http://www.sevenforums.com/tutorials/542-windows-firewall-add-remove-exception.html

Depois de todos os passos, reinicie o Windows.

Acessando páginas do IIS de outro PC

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/02/09/Acessando-paginas-do-IIS-de-outro-PC.aspx


Acessar páginas que estão em um diretório virtual no IIS da própria máquina que ele está instalado é bem simples, mas acessar de outra máquina pode dar um pouco mais de trabalho.

No meu caso, não estou usando domínio e nem autenticação através do Windows para usuários de outras máquinas. Habilitei a opção de usuário anônimo e coloquei meu usuário (no meu caso, administrador da máquina) como o login a ser usado por esses usuários anônimos nesse diretório virtual. Para isso:

  1. Clique com o botão direito no diretório virtual e depois em Propriedades;
  2. Na aba Segurança do Diretório, clique em Editar em Controle de Acesso Anônimo e Autenticação;
  3. Habilite a opção Acesso anônimo e abaixo coloque o usuário e senha que serão usados para quando esse acesso anônimo for feito, lembrando que a senha não pode ser em branco para esse usuário;
  4. Os outros campos podem ficar desabilitados. Agora basta clicar em OK e depois OK novamente.

Após configurar essa parte, é necessário também configurar o firewall do Windows para aceitar acesso de fora à porta 80 (passos abaixo no Windows XP):

  1. No Painel de Controle, clique em Central de Segurança, depois Firewall do Windows;
  2. Na aba Avançado, clique em Configurações abaixo de Configurações de Conexão de Rede;
  3. Habilite a opção Servidor Web (HTTP), clique em OK e pronto.

Criando um novo usuário no SQL Server

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/02/08/Criando-um-novo-usuario-no-SQL-Server.aspx


Criar um usuário novo no SQL Server é bem simples. No MS SQL Server Management Studio, basta expandir a pasta Security, clicar com o botão direito na pasta Logins e depois em New Login. O resto (a parte básica) é bem intuitiva.

O link abaixo apresenta um vídeo ensinando passo a passo esse procedimento:

http://www.ehow.com/video_4982930_connecting-database-sql-server.html?cp=1&pid=1&wa_vlsrc=continuous&wa_vrid=33ce3d2d-6ed7-45d8-b05c-7c7ffe0c36e7

Habilitando SQL Authentication no SQL Server

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/02/08/Habilitando-SQL-Authentication-no-SQL-Server.aspx


Isso é algo bem simples, mas me tomou alguns minutos a mais hoje. Eu estava criando um usuário no SQL Server, mas após criá-lo, não conseguia usar. Esse usuário era criado como SQL Authentication e não como um usuário do Windows.

O meu SQL Server estava habilitado para aceitar somente usuários Windows, então alterei para aceitar tanto esse tipo de autenticação quanto SQL Authentication, para aceitar usuários criados por mim no SQL Server.

Para fazer isso no MS SQL Server Management Studio, basta clicar com o botão direito no server node e depois clicar em propriedades. Selecione a opção Security à esquerda e depois selecione SQL Server and Windows Authentication mode na direta.

Esse link explica passo a passo e com figuras:

http://kbase.gfi.com/showarticle.asp?id=KBID002804

segunda-feira, 31 de janeiro de 2011

.NET: Format Strings

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/01/31/NET-Format-Strings.aspx


Achei bem interessante e completa essa lista de format strings. Lembrando que elas podem ser usadas na propriedade "DataFormatString", por exemplo, dos campos de uma grid, ou então no método System.String.Format.


No site do John Sheehan: http://john-sheehan.com/blog/wp-content/uploads/msnet-formatting-strings.pdf

No meu DropBox: http://dl.dropbox.com/u/20361010/msnet-formatting-strings.pdf

sábado, 29 de janeiro de 2011

Registrando o Blogger em um domínio .br

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/01/29/Registrando-o-Blogger-em-um-dominio-br.aspx


Esse vídeo é bem simples e ensina passo a passo como registrar o seu blog feito no Blogger em um domínio .br.




Ingrid, valeu pelo domínio! Bem legal.