Dica rápida: PHP + BYTEA
Fala galera! Estava aqui tentando exibir imagens armazenadas em um campo bytea do PostgreSQL e apanhei feito mala velha usando o par de funções pg_escape_bytea e pg_unescape_bytea.
Consegui achar a solução em um comentário no manual do PHP: “To prevent any problems with encoding you could use hexadecimal or base64 input to save and retrieve data to the database”
Usei base64_encode/base64_decode e tudo funcionou perfeitamente. Então, se você está tentando usar pg_escape_bytea($content) e pg_unescape_bytea($content) mude para base64_encode($content) para inserir no banco e base64_decode($content) para exibir no browser.
Valeu Mike-RaWare!
Para quem quiser ver o post: http://php.net/manual/en/function.pg-escape-bytea.php
Forçar o WebBrowser Control a usar IEX(7,8 ou 9)
Desenvolvi um aplicativo que possui um navegador integrado com webbrowser control que insistia em renderizar as páginas como IE7. O IE instalado na máquina, estava renderizando normalmente como IE8 sem estar usando o modo de compatibilidade. Pesquisando com um amigo aqui do trampo, descobrimos que o webcontrol rendereza por padrão como IE7 e precisamos modificar o registro do windows para força-lo a usar o IE8 ou IE9 se for o caso.
Para, tal .. abra o regedit e localize a chave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION e adicione um valor DWORD com o nome do seu aplicativo, browser.exe por exemplo e coloque o valor 7000 em decimal para rodar como IE7, 8000 para rodar como IE8 e 9000 para rodar como IE9.
Existem outros modos de compatibilidade, veja aqui o material oficial da Microsoft.
Abrasss
Dica rápida: Otimizar navegação do pfsense com squid transparent
Está precisando melhorar o tempo de resposta do squid no pfsense?
Achei a solução aqui
Abrasss!!!!
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
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.
- JSON
Crie um método em seu model que realiza a consulta de cidadespublic 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.
- 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. - 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