Blog Maurício Luís -

Tecnologia e programação web - Consultoria em análise e desenvolvimento de sistemas. Action Script, VB.NET, C#, ASP, PHP, MySQL, SQL Server. Magento, Drupal, Joomla, Wordpress e etc.

Quem usa o Orkut e não gostou muito das últimas atualizações do portal de relacionamentos mais famoso do mundo agora pode comemorar: O Orkut voltou atrás e retirou a opção de recado privado e público. Agora os scraps do Orkut voltaram a ser como eram antes.

Confira a matéria na íntegra no portal Imasters que descreve em detalhes o que ocorreu de fato com o gigante da Internet:
http://imasters.uol.com.br/noticia/17200/midiasocial/google_volta_atras_e_desativa_recados_privados_no_orkut/

0

Como criar uma página de erro customizada em PHP para Wordpress?

Para criar uma página default para o erro 404, é muito simples, basta você chamar o HEADER e o FOOTER do Wordpress, e entre essas duas chamadas, adicionar o HTML customizado a mensagem de erro.

Exemplo:

<?php get_header(); ?>

OOOPS! Não encontramos o que você estava procurando ...

<?php get_footer(); ?>

Como criar, mover, editar, excluir (apagar) arquivos com PHP?

Este breve código abaixo, descreve como manipular arquivos utilizando o PHP.

/*
	--------------------------------------------------
	Blog Maurício Luís
	--------------------------------------------------
	http://www.mauricio-luis.com/blog
	Gerenciando arquivos com PHP
*/

// String com o nome do arquivo que desejamos manipular
$meuArquivo = "pagina.php";

// String com o path de onde desejo gerenciar o arquivo
$path = "teste/";

// String com o path concatenado com o arquivo
$pathCompleto = $path . $meuArquivo;

// String com o conteúdo que desejamos escrever no arquivo
$conteudo = "Blog Maurício Luís www.mauricio-luis.com/blog - PHP simplificado";

// A função abaixo (fopen) cria um arquivo e abre-o para escrita. O stream é armazenado na variável criada por nós com o nome "$stream"
$stream = fopen($pathCompleto , "a");

// Escreve o valor da variável "conteudo" no arquivo criado por nós e atribui o texto escrito no arquivo, na variável criada por nós denominada "writter"
$writter= fwrite($stream, $conteudo); // na função fwrite(), basta passarmos o stream de abertura do arquivo e o conteúdo que desejamos escrever no mesmo

// Fecha o stream aberto pela função fopen para eliminar da instancia da memória do servidor
fclose($stream);

// Copiando o arquivo criado para o mesmo diretório com um novo nome
copy($pathCompleto,$path."pagina2.php"); // na função copy() passamos o path completo do arquivo original e o path completo da cópia

// Renomeando arquivo de "pagina2.php" para "pagina.php"
rename($path."pagina2.php",$pathCompleto);

// Excluindo o arquivo "pagina.php"
unlink($pathCompleto);

OBS: Certifique-se de que a pasta onde deseja criar o arquivo, possui permissão de escrita. Para verificar isto, você pode clicar com o botão direito, acessar as permissões do arquivo e verificar se os checkboxes de escrita estão marcados. Caso não estejam, deverá marcá-los.

Aplicação explicativa mostra criar uma simples lista de string, atribuir nomes de países a elas e escrever todos os seus valores na tela de um console application.

Código em C#:

 // Cria uma nova lista de strings
            var lista = new List();

            // Adiciona diversos nomes de países na lista
            lista.Add("Brasil");
            lista.Add("Equador");
            lista.Add("Argentina");
            lista.Add("Chile");
            lista.Add("Venezuela");

            // Percorre todos os itens da lista colocando cada elemento na variável "item"
            foreach (var item in lista)
            {
                // Escreve o valor do item na tela
                Console.WriteLine(item);
            }

            // Mantém a tela do console em aguardo
            Console.ReadKey();

Código em VB.NET:

' Cria uma nova lista de strings
Dim lista As string = New List(Of string)

' Adiciona diversos nomes de países na lista
lista.Add("Brasil")
lista.Add("Equador")
lista.Add("Argentina")
lista.Add("Chile")
lista.Add("Venezuela")

' Percorre todos os itens da lista colocando cada elemento na variável "item"
For Each item As var In lista
    ' Escreve o valor do item na tela
    Console.WriteLine(item)
Next
' Mantém a tela do console em aguardo
Console.ReadKey

Resultado final:
Como criar uma lista em csharp collection generics

Download da aplicação funcionando: www.mauricio-luis.com/blog/exemplos/lista.rar

O Entity Framework, mais conhecido como Linq to Entities,  apesar de estar em uma versão mais avançada e bem mais robusta que o Linq to Sql, ainda apresenta alguns problemas que no dia a dia acabam levando algum tempo dos programadores ao tentar descobrir a solução do problema.

Linq to Entities não mapeia no entity data model tabelas que não possuem Primary Key.

Resolução:

Você precisará criar uma nova coluna em sua tabela, com uma PrimaryKey e atualizar o seu Entity Data Model, clicando com o botão direito no mesmo e acessando a opção “Update Model from Database”.

Observação:

Em alguns casos a atualização através do “Update Model from Database” não funciona em sua totalidade. Ainda é um bug do Linq to Entities. Por isto, devemos então excluir o repositório criado, excluir a sua connection string do arquivo de configuração e recriá-lo do início.

Processo equivalente ao DELETE do SQL no Linq To Entities.

O método abaixo descreve todo o fluxo para deletar um objeto do contexto do banco de dados.

        // Recebe o ID de uma fruta para deletar e tenta excluir a mesma
        public void ExcluirItem(int frutaId)
        {
            // Instancia contexto do repositório
            using (var db = new banco1Entities())
            {
                // Obtém a fruta que contenha o ID igual ao ID recebido pelo método ou retorna nulo
                var fruta = (from f in db.FRUTAS
                             where f.FrutaID == frutaId
                             select f).FirstOrDefault();

                // Verifica se a fruta não é nula
                if (fruta != null)
                {
                    // Deleta a fruta do contexto
                    db.DeleteObject(fruta);

                    // Salva as alterações no banco de dados
                    db.SaveChanges();
                }
            }
        }

Este tópico tem como principal objetivo passar de maneira superficial o conceito do o framework de acesso a dados Entity Framework que consiste na abstração do banco de dados em entidades orientadas a objetos, dispensando assim o conhecimento - por parte do programador - da tecnologia SQL.

Basicamente precisaremos de um banco de dados MySQL. Mas caso não seja possível, poderá utilizar qualquer outro banco de dados, desde que tenha o provider devidamente instalado no Visual Studio (exceto no caso do SQL Server que já é nativo do Visual Studio).

Em um novo tópico, farei uma abordagem mais avançada do Entity Framework.

Aprenda a utilização básica do Linq to Entities, mas antes de iniciarmos, vamos criar uma tabela simples, em seu banco de dados MySQL para criarmos o GridView para listarmos as “frutas cadastradas no sistema”:

CREATE TABLE `FRUTAS` (
  `FrutaID` int(11) NOT NULL AUTO_INCREMENT,
  `Nome` varchar(30) NOT NULL,
  `Descricao` varchar(200) NOT NULL,
  PRIMARY KEY (`FrutaID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO `FRUTAS` (`FrutaID`, `Nome`, `Descricao`) VALUES
(1, 'Maçã', 'A maçã, além de saborosa, tem considerável valor nutritivo.'),
(2, 'Laranja', 'A vitamina C, elemento nutritivo mais importante da laranja, se oxida e se perde com facilidade.'),
(3, 'Banana', 'A banana é a fruta mais consumida no Mundo e no Brasil.'),
(4, 'Uva', 'A uva é o fruto da videira (Vitis sp.), uma planta da família das Vitaceae.'),
(5, 'Melancia', 'Melancia (Citrullus lanatus) é o nome de uma planta da família Cucurbitaceae e do seu fruto. ');

PASSO 1:

Crie uma nova aplicação web C#, e arraste dois controles para a página principal Default.aspx, sendo:

Button - instancie-o com o id “btnCriarFruta”
Gridview - instancie-o com o id “GridView1″

Aprendendo Ado.Net Entity Framework Linq to Entities

Basicamente o código deve ficar assim no ASP.NET:

PASSO 2:

Clique com o botão direito e adicione um novo repositório clicando em: ADD > New Item > “ADO.NET Entity Data Model” > e entre com o nome “Banco1.edmx”.

Adicionando um novo entity data model

Clique em ADD para criar o novo repositório.

PASSO 3:

Aparecerá então uma nova janela para você optar entre gerar um data model a partir do banco de dados que você informará, ou um data model vazio onde você irá criar todas as entidades.

Selecione a opção “Generate from database” e clique em “Next”.

Criando um novo Entity Data Model Linq To Entities a partir de um banco de dados MySQL

PASSO 4:

Na nova janela, clique na opção “New connection” e informe os dados de acesso ao seu banco de dados. Teste a conexão clicando no botão “Test connection” para se certificar de que as informações do banco estão corretas.

Criando conexão com banco de dados MySQL .NET C# Entity Framework

Em seguida, feche a janela de nova conexão e então marque a opção:

“No, exclude sensitive data from the connection string. I will set in my application code.”

Exclude sensitive data web applications

A partir do ASP.NET 2.0, um recurso chamado “Protected Configuration” foi disponibilizado para permitir a criptografia de informações confidenciais em arquivos de configuração - como é o caso da connection string criada pelo Entity Framework. Mas não iremos utilizá-la neste momento, por isso estamos descartando.

Coloque o nome do banco de entidades como “banco1Entities” e em sguida clique em “Next”.

PASSO 5:

Selecione a tabela desejada, no nosso caso, como o banco só possui uma tabela, selecionei todas as tabelas. Mas poderíamos selecionar apenas determinadas tabelas (assim como Views e StoredProcedures) para serem importados para o nosso entity data model.

Mantenha o nome do DataModel como “banco1Model” e em seguida clique em “Finish” para finalizar a construção do nosso data model.

Mapeando entidades repositório Entity Data Model

Ao clicar em “Finish”, verifique em sua solution que uma connection string diferenciada foi criada em seu web.config.

Visualização do nosso Entity Data Model com a entidade Frutas mapeada. Perceba que o visual é semelhante ao de visualização de diagrama de classes. Isto se deve ao fato de que ambos são quase a mesma coisa. Agora, uma fruta em nosso sistema é uma classe.

Entidade mapeada no entity data model

PASSO 6:

Criaremos agora em nosso arquivo code behind “Default.aspx.cs” um novo método para cadastrar uma nova fruta no repositório. Equivalente ao INSERT do SQL. Para isto, daremos dois cliques no botão criado anteriormente para que este método seja gerado.

Neste método criaremos uma instancia do contexto do banco de dados:

protected void btnCriarFruta_Click(object sender, EventArgs e)
        {
            using (var db = new banco1Entities())
            {

            }
        }

Utilizando o “using” no C# 4.0, não é necessário fechar o contexto pois a conexão e o objeto serão eliminados na chave que fecha o seu statement.

Agora, criaremos o equivalente ao insert do sql no linq to entities:

Utilizando intelesense para métodos do entity framework

Perceba que ao chamarmos o contexto (”db”) aparecerão métodos básicos para gerenciamento de dados no nosso banco de dados, ou melhor, no nosso contexto do banco de dados. As transações efetuadas até este momento, são simplesmente desconectadas e só valerão efetivamente quando chamarmos o método para salvar as modificações (utilizaremos mais a baixo).

Então, neste caso do “db.AddToTable“, percebe-se que basta adicionar um novo objeto normalmente:

 protected void btnCriarFruta_Click(object sender, EventArgs e)
        {
            using (var db = new banco1Entities())
            {
                db.AddToFRUTAS(new FRUTAS()
                {
                    Descricao = "Mamão, papaia ou ababaia é o fruto do mamoeiro ou papaeira.",
                    Nome = "Mamão"
                });
                db.SaveChanges();
            }
        }

Objeto inserido no contexto.

Agora precisamos apenas salvar a inserção feita, complementando nosso código com a seguinte instrução:

db.SaveChanges();

Nosso código ficando então finalmente da seguinte maneira:

 protected void btnCriarFruta_Click(object sender, EventArgs e)
 {
            using (var db = new banco1Entities())
            {
                db.AddToFRUTAS(new FRUTAS()
                {
                    Descricao = "Mamão, papaia ou ababaia é o fruto do mamoeiro ou papaeira.",
                    Nome = "Mamão"
                });
                db.SaveChanges();
            }
 }

Agora já temos a inclusão de um objeto no nosso contexto. Podemos então executar o projeto e testar a inclusão:

Passo 7:

O próximo passo, é fazermos o equivalente a

"SELECT * FROM FRUTAS"

Para isso, no método Page_Lod adicionaremos a seguinte instrução:

        protected void Page_Load(object sender, EventArgs e)
        {
            // Instancia contexto com o repositório
            using (var db = new banco1Entities())
            {
                // Seleciona todos os itens da tabela de frutas
                var lista = (from f in db.FRUTAS
                             select f).ToList(); // Transforma o resultado em uma lista

                GridView1.DataSource = lista; // Passa a lista para o DataSource do GridView
                GridView1.DataBind(); // Carrega os dados do DataSource no GridView
            }
        }

Agora basta testar a aplicação e ver funcionando. :)

Basicamente é isto.

Disponibilizei a solution completa no link abaixo para estudo:
http://www.mauricio-luis.com/blog/exemplos/linqtoentitiesbasico.rar

Como baixar o conteúdo de uma determinada página HTML em uma determinada URL e manipulá-lo?

O código abaixo faz o download através de um stream do conteúdo de uma determinada URL e obtém o código fonte do arquivo especificado renderizado em HTML.

Baixando arquivos da internet de forma automática:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Configuration;

namespace Downloads
{
    internal class URL
    {
        /// 
        /// Obtem o conteudo de um arquivo na web
        /// 
        /// Url a ser processada
        /// Conteúdo do arquivo
        public string ObterConteudo(string u)
        {
            byte[] buffer;
            Stream st;
            StringBuilder sb;

            CarregaObjetos(u, out buffer, out st, out sb);

            int iTotalBuffer = 0;

            iTotalBuffer = ProcessaStreamReader(buffer, st, sb, iTotalBuffer);

            string result = sb.ToString();

            return result;
        }

        /// 
        /// Instancia os objetos
        /// 
        /// Url a ser processada
        /// Objeto de buffer
        /// Objeto de stream
        /// Objeto de stringbuilder
        private static void CarregaObjetos(string u, out byte[] buffer, out Stream st, out StringBuilder sb)
        {
            WebRequest wr = WebRequest.Create(u);
            WebResponse wrp = wr.GetResponse();
            buffer = new byte[128];
            st = wrp.GetResponseStream();
            sb = new StringBuilder();
        }

        /// 
        /// Processa o stream reader
        /// 
        /// Objeto de buffer
        /// Objeto de stream
        /// Objeto de stringbuilder
        /// Contador de processos do buffer
        /// Quantidade de processos do buffer
        private static int ProcessaStreamReader(byte[] buffer, Stream st, StringBuilder sb, int iTotalBuffer)
        {
            iTotalBuffer = st.Read(buffer, 0, 128);

            while ((iTotalBuffer != 0))
            {
                sb.Append(Encoding.ASCII.GetString(buffer, 0, iTotalBuffer));
                iTotalBuffer = st.Read(buffer, 0, 128);
            }

            return iTotalBuffer;
        }
    }
}

Fazendo a chamada do método e obtendo o conteúdo em uma string em um console application:

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
using System.Net;

namespace Downloads
{
    class Program
    {
        static void Main(string[] args)
        {
            var downloads = new Downloads(); // instancia a classe
            string url = "http://www.mauricio-luis.com/blog"; // url a ser baixada
            string conteudoObtido = downloads.ObterConteudo(url); // obtém o conteúdo HTML em uma string
        }
    }
}
3

Como criar um diretório usando C# ou VB.NET?

A classe File, deriva do namespace System.File.IO que gerencia a manipulação de arquivos e pastas.
Para saber mais sobre o mesmo, acesse:  http://msdn.microsoft.com/en-us/library/system.io.file.aspx

Código C#:

/// 
/// Verifica se um diretório existe, caso não, cria
/// 
private void CriaDiretorio()
{
if (!Directory.Exists("C:\temp\Diretorio1"))
Directory.CreateDirectory(temp);
}

Código VB.NET:

   ''' 
    ''' Verifica se um diretório existe, caso não, cria
    ''' 
    Private Sub CriaDiretorio()
        If Not Directory.Exists("C:\temp\Diretorio1") Then
            Directory.CreateDirectory(temp)
        End If
    End Sub

Como excluir um arquivo com C# ou VB.NET de maneira ágil e organizada?

A classe File, deriva do namespace System.File.IO que gerencia a manipulação de arquivos e pastas.
Para saber mais sobre o mesmo, acesse:  http://msdn.microsoft.com/en-us/library/system.io.file.aspx

/// 
        /// Exclui o arquivo especificado
        /// 
        private static void ExcluiArquivo()
        {
            string arquivo = "F:\arquivo.txt";
            System.IO.File.Delete(arquivo);
        }

Em VB.NET o mesmo código ficaria da seguinte maneira:

    ''' 
    ''' Exclui o arquivo especificado
    ''' 
    Private Shared Sub ExcluiArquivo()
        Dim arquivo As String = "F:\arquivo.txt"
        System.IO.File.Delete(arquivo)
    End Sub