Arch Linux Review

Hi Folks!!!

Nesse post vou passar as minhas impressões sobre a distro Arch Linux: uma distro enxuta, leve e simples de manter mas que é voltada para usuários avançados ou pelo menos fuçadores.

Eu fui durante muito tempo usuário do Slackware, mas acabei migrando para o Ubuntu pela comodidade e facilidade de uso. O projeto comandado por Patrick Volkerding anda a passos de tartaruga … demora muito para lançar releases … sem falar na falta de um gerenciador de pacotes no estilo apt-get e o fato de retirar o gnome e deixar apenas o KDE. Tirando esses pormenores, é melhor distro que já usei.

O Ubuntu é uma ótima distro mas não é leve e customizavel como o Slack. Foi ai que meu amigo e ídolo Joenio Marques me falou sobre o Arch. Eu já tinha ouvido falar mas não conhecia nada do projeto.

Baixei e instalei … virei fan!

A distro é muito boa, muito parecida com o Slack, estrutura do sistema … filosofia …robustez. Possui um ótimo gerenciador de pacotes (pacman), consegui instalar tudo que precisei sem problemas .. incluindo o gnome e GDM.

A instalação foi rápida, em torno de 10 min usando a opção Core (offiline) 330MB.

Configurar também não foi diferente, tudo fica armazenado em um arquivo central, o /etc/RC.conf … módulos, daemons, configuração de interfaces de rede, teclado, etc … tudo é centralizado tornando as coisas bem mais práticas. Caso tenha dúvidas, eles possuem um Wiki do projeto com bastante material.

Outro ponto bom é a atualização do sistema … como se trata de uma distro rolling release, o sistema está em constante atualização … para atualizar, basta executar: pacman -Syu ou pacman -Su

Aqui vai um post que compara o Slackware e o Arch pra quem ficou em dúvida como eu hehehe: http://www.osnews.com/story/8761/Arch_Linux_Vs_Slackware_The_Best_of_All_Worlds/page1/

É isso ai … Quem gosta de deixar o linux com a sua cara e/ou gosta de Slackware, vai adorar o Arch.

Abraço e até o próximo post

PHP-GTK2 + Glade 3 = fatal error

Você já viu esse erro?

(php.exe:4416): libglade-WARNING **: Expected <glade-interface>.  Got <interface>.
(php.exe:4416): libglade-WARNING **: did not finish in PARSER_FINISH state

Fatal error: Uncaught exception 'PhpGtkConstructException' with message 'could n
ot construct GladeXML object' in E:\Nodo3\PHP-GTK\Sample\Sample.phpw:6
Stack trace:
#0 E:\Nodo3\PHP-GTK\Sample\Sample.phpw(6): GladeXML->__construct('Sample.glade')

#1 {main}
  thrown in E:\Nodo3\PHP-GTK\Sample\Sample.phpw on line 6

Pois é, o erro é causado pelo formato do arquivo glade: o GtkBuilder, substituto do GladeXML que foi depreciado.

É muito difícil encontrar informações sobre php-gtk2, mas pelo que pude entender, ele não tem suporte total ao padrão GtkBuilder, logo .. é melhor continuar usando GladeXML.

Para resolver o problema, abra o menu Editar > Preferências, e altere o formato de saída do arquivo para Libglade.
Se alguém tiver informações mais precisas sobre o suporte do GtkBuilder no php-gtk2 compartilha aqui ok??

Abrasss

IEOptLib – Internet Explorer Options Library

Fala meu povo!! Criei uma lib em C# para manipular as opções de internet do Windows. É possível modificar as zonas de segurança ou criar um nível personalizado. É bem útil para utilizar em conjunto com o componente WebBrowser (System.Windows.Forms.WebBrowser).

Basicamente a classe modifica as chaves do registro HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\[0-4], onde [0-4] é zona que deseja modificar.

  • 0 – Meu computador
  • 1 – Intranet local
  • 2 – Sites confiáveis
  • 3 – Internet
  • 4 – Sites restritos

Seguindo a regra acima, HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3 representa as opções da zona de internet. Cada valor DWORD dentro dessa chave, representa um item das opções de internet.

Usar a lib é muito fácil, basta fazer a chamada ao método estático que representa a função que você deseja modificar e passar a zona e o novo valor que será atribuído.

InternetOptions.SetSecurityLevel(InternetOptions.INTERNET, InternetOptions.MEDIUM_LOW_LEVEL);

O exemplo acima altera o nível de segurança da zona de internet para médio-baixo.

Como a maioria das opções requer que o Internet Explorer seja reiniciado, é uma boa prática chamar o método antes de renderizar o componente WebBrowser (se esse for o seu foco). faça as chamadas na classe Program, antes de inicializar o Main Form.

O projeto encontra-se no source forge (http://sourceforge.net/projects/ieoptlib/) e é GPL.
Usei como referência um artigo da Microsoft (http://support.microsoft.com/kb/182569/pt-br) que explica muito bem como funciona a gestão das opções de internet.

Espero ter ajudado
Abrassss

Dica rápida: Permitir “.” no login dos usuários do USVN

O USVN (http://www.usvn.info/) é uma ótima ferramenta de administração de repositórios SVN. Só achei uma coisa ruim, não permite que eu use “.” como separador do nome de usuário.

É muito comum se usar como padrão de login primeironome.sobrenome, e nós usamos essa nomenclatura pra tudo: AD, ftp, banco, aplicativos, controle de versão, etc.

Para liberar esse e qualquer outro char que esteja desativado basta alterar o script: USVN_HOME/library/USVN/Db/Table/Row/User.php
Procure pelo método “checkLogin”, acrescente “\.” no final da expressão regular da linha ” if (!preg_match(‘/^[0-9a-zA-Z_\-]+$/’, $login))” como no código abaixo:

protected function checkLogin($login)
{
    if (empty($login) || preg_match('/^\s+$/', $login)) {
        throw new USVN_Exception(T_('Login empty.'));
    }

    if (!preg_match('/^[0-9a-zA-Z_\-\.]+$/', $login)) {
        throw new USVN_Exception(T_('Login invalid.  The login can only include alpha-numeric characters and \'-\' or \'_\'.'));
    }
}

Pronto

Abrasss e até o próximo post

CodeIgniter: Associação de controllers e grupo de regras no config/Form_validation

O codeigniter permite criar uma associação do ‘controller/método’ no arquivo de configuração form_validation para facilitar e centralizar a validação de formulários. É realmente excelente, desde que você não tenha parâmetros em seu método 😐 … meio estranho mas blz.

Tive esse problema e achei esse post: http://codeigniter.com/forums/viewthread/104425/ que relata o problema e indica uma solução que consiste em alterar a classe form_validation. Essa solução funciona perfeitamente mas pode causar problemas se você decidir atualizar a versão do CI e esqueceu que mudou algo lá dentro.

Segui a idéia dele e fiz o ‘patch’ no próprio config/form_validation.
Ficou algo assim:

$CI =& get_instance();

$config = array(
	"blog/post/{$CI->uri->segment(3)}" => array(
		array(
				'field' => 'titulo',
				'label' => 'Título',
				'rules' => 'required'
			 ),
		array(
				'field' => 'conteudo',
				'label' => 'Conteúdo',
				'rules' => 'required'
			 )
		)
);

Espero ter ajudado.

Abrassss!!!

Codeigniter + jqTransform + Combos dinâmicos

Esse post é em homenagem a meu amigo Ubiracy mais conhecido como Bira-bira-birô hehehehe, que junto comigo, se mordeu todo pra tentar resolver esse problema. Depois de muito pesquisar e nada encontrar, conseguimos criar elementos options em tempo de execução no jqTransform, que é um plugin jquery pra customizar a cara dos formulários. Bonitinho mas ordinário.

Pois bem, vamos precisar de:

  • jqTransform
  • Algum conhecimento em JSON
  • Algum conhecimento em Ajax
  • Codeigniter (opcional)

A solução funciona da seguinte forma, você vai criar dois combos, um de estados e outro de cidades. Os itens do combo de cidades vão ser carregados dinamicamente via ajax a depender do que foi selecionado no combo de estados.

  1. JSON
    Crie um método em seu model que realiza a consulta de cidades
    public function lista_cidades($id_estado)
    {
        $this->db->select("id, nome");
        $this->db->where("id_estado", $id_estado);
    
        return $this->db->get("cidades");
    }
    

    Em seu controller, crie um novo método público que escreva no browser o resultado da consulta no padrão json.

    public function cidades($id_estado)
    {
        header('Content-type: application/json');
        $this->load->model("cidade_model");
        $cidades = $this->cidade_model->lista_cidades($id_estado)->result_array();
        $json = "[";
        foreach ($cidades as $cidade) {
    	$json.= '{"value": "{$cidade['id']}", "label": "{$cidade['nome']}",';
        }
        $json = preg_replace("/,$/", "", $json);
        $json.= "[";
    }
    

    Pronto, agora você já tem um método em seu controller que filtra as cidades por estado e gera um documento json.

  2. HTML
    <tr>;
    	<td>Estado:</td>
    	<td><div id="div_cmb_estado" class="select-menus"><?php echo form_dropdown('cmb_estado', $cmb_estado); ?></div></td>;
    	<td>Cidade:</td>
    	<td>
    		<div id="container">
    			<div id="div_cmb_cidade" class="select-menus"><select id="cmb_cidade" name="cmb_cidade"></select></div>
    		</div>
    	</td>
    </tr>
    


    Crie o combo de estados normalmente, se você estiver usando form helper como eu, chame a função form_dropdown passando os dados que irão compor este combo. Observe que a variável $cmb_estado contém o array de dados que popula o combo de estados.
    Já o combo cidades (neste nosso exemplo), não terá nenhum registro inicialmente. Ele será preenchido dinamicamente como falei anteriormente. O pulo do gato é a div container. Os elementos que irão compor o combo devem ficar dentro dessa div.

  3. Ajax
    Finalmente, o ajax para criar o options. Basta chamar a url do seu método que cria o json e fazer o parser no resultado.
    $(document).ready(function() {
    
    	// Aplica o skin com jqTransform
    	$("form.jqtransform").jqTransform();
    
             // OnClick no item do combo de estados
    	$("#div_cmb_estado div.jqTransformSelectWrapper ul li a").click(function(){
    
    	// Recupera o valor do item selecionado
    	var index = $(this).attr('index');
    	var value = $('#div_cmb_estado div.jqTransformSelectWrapper option:eq(' + index + ')').attr('value');
    
    	// Chamada ao método criado no controller via ajax
    	$.ajax({
    	    type: "GET",
    	    async: true,
    	    url: "/exemplo/cidades/" + value,
    	    dataType:"json",
    	    error: function(XMLHttpRequest, textStatus, errorThrown) {
    		   alert(textStatus);
    	    },
    	    success: function(resposta){
    
    		// Limpa o "combo" de cidades
    		var html_combo = '<div id="div_cmb_cidade" class="select-menus"><select id="cmb_cidades" name="cmb_cidades"></div>';
    		$("#container").html(html_combo);
    
    		// Faz o parser no json e cria os elementos
    		for (i = 0; i < resposta.length; i++) {
    		   $("#cmb_cidades").append('<option selected value="' + resposta[i].value + '">' + resposta[i].label + '</option>');
    		}
    
    		// Chama novamente o jqTransform para o select. Funciona como um refresh no layout
    	         $("#cmb_cidades").jqTransSelect();
    		}
    	    });
    	});
    });
    

Espero ter ajudado, até o próximo post.

obs: Esse editor do wordpress é muito bom, ¬¬

Blob do SQL Server truncados no PHP

Hello folks, depois de um bom tempo sem postar nada vai ai uma dica de configuração do PHP com SQL Server. Essa dica é para quem está recuperando um blob (varbinary, image, etc) e quando é exibido pelo PHP vem truncado… exibindo parte da imagem e o resto em cinza indicando que ali teria que ter algo =]. Para resolver basta alterar o valor das propriedades mssql.textlimit e mssql.textsize no php.ini. Lembrando que os valores estão em bytes.

Abrasss

Alternar CSS (Toggle)

Uma função simples para alternar css com PHP. Essa dica é útil para por exemplo, alternar cor de linhas de uma grade. E com essa função você leva inteiramente grátis uma outra para definir várias caso elas não existam, algo como a tag <CFPARAM> do ColdFusion.

Segue o código abaixo:


if ( ! function_exists('def')) {

	function def(&$var, $default = "", $type = NULL, $pattern = NULL)
	{
		if (empty($var) || !isset($var)) {
			$var = $default;
		}

		if (! is_null($pattern)) {

			if (preg_match($pattern, $default) === 0) {
				throw new Exception("The default value assigned is incorrect");
			}
		}

		if (! is_null($type)) {
			settype($var, $type);
		}
	}
}

/**
 * Alterna estilos css
 *
 * @param string
 * @param string
 * @param string
 * @return string
 */
if ( ! function_exists('toggle_css') ) {

	function toggle_css(&$class, $class_1, $class_2)
	{
		def($class, '');

		$class = ( $class == $class_1) ? $class_2 : $class_1;
		return $class;
	 }
}

Pronto, para usar, siga o exemplo abaixo:

// Loop
<div class="<?php echo toggle_css($css, 'class1', 'class2');?>">Linha 1</div>

Abrasss

PHP 5.2.13 + Apache 2.2.15 (Windows)

Eu e algumas muitas pessoas, estão encontrando muita dificuldade para instalar o PHP 5.2.13 com Apache 2.2.15. Páginas em branco, erro no php5ts.dll ao tentar iniciar o apache são alguns dos sintomas.

Consegui com muito custo resolver o problema. Vamos a solução!

Ingredientes

  • PHP 5.2.13
  • Apache 2.2.15
  • msvcr71.dll (em alguns casos)

Instale normalmente o Apache e o PHP. Depois vá até o prompt de comando e execute (se o PHP não estiver no path do sistema, acesse o diretório de instalação do PHP):

C:\php -v

Provavelmente você receberá algumas mensagens de erro sobre extensões. Desabilite as extensões que estão dando erro e que você não utiliza. No meu caso desabilitei as extensões do oracle, snmp, sqlite e sybase.

Em alguns casos o PHP reclama da biblioteca msvcr71.dll, se for o seu caso, baixe aqui e salve-a na pasta windows/system32.

Salve suas alterações no php.ini e rode novamente o comando php -v. Desabilite as extensões até que nenhuma mensagem de erro seja exibida.

Crie um script php com o conteúdo <?php phpinfo();?> e coloque no document root. Inicie o apache e acesse essa página. Ficou em branco? Algum extensão que está habilitada não apareceu? Abra o seu httpd.conf e adicione a diretiva PHPIniDir apontando para o caminho do seu php.ini. Algo como PHPIniDir “C:/PHP/php.ini”.

Reinicie o apache e tente executar o script novamente.

Até o próximo post.