terça-feira, 19 de abril de 2016

Sessões e lentidão no Magento


Uma das maiores plataformas de lojas online é sem dúvida a Magento, apesar do meu contacto com esta plataforma não ter passado de instalação e configurações iniciais, desta vez foi me pedido para analisar e solucionar um problema nesta plataforma.

Foi reportado uma instabilidade na plataforma, dificuldades de acesso, extrema lentidão em resumo algo que não é compatível com quem pretende usar a 100% da plataforma.

Motivo:
O sistema Magento, guarda as sessões dos utilizadores em ficheiros, sessões essas que neste caso, nunca foram apagadas desde que o sistema ficou online, ficando a pasta com +/- 200,000 ficheiros.

Tentou-se eliminar os ficheiros via FTP, via FileExplorer dentro do Plesk mas devido ao numero elevado de ficheiros tornava qualquer ideia um fiasco.

Ainda surgiu a possibilidade de um acesso por terminal, mas a empresa de alojamento não cedeu acessos em tempo útil.

Tentei ainda usar um ficheiro .php com a função unlink que já resolveu outros casos, mas ao requisitar o ficheiro, o próprio browser entrava em colapso.

Solução:

Ao fim de todas estas tentativas frustradas, surge a solução repartida em duas partes:

  • ficheiro .php para ser invocado pelo browser
  • ficheiro .py para executar a acção de remover dentro do servidor (S.O. Linux)

Nota: Deixo apenas as linhas gerais dos ficheiros iniciais, no fim deixo o download de versões melhoradas.
Nota 2: Não me responsabilizo pelo uso destes ficheiros indevidamente ou sem saber o que está a fazer.

Fazer upload para a pasta de root_site (www, http_docs, ...)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
// mag_session_rm.php simplified
// Retorn path real do servidor
$fp = realpath(dirname(__FILE__))."/var";
// Confirma que o ficheiro python esta na pasta "var"
if(file_exists($fp."/session_rm.py")){
  // Troca para o pasta "var"
  chdir($fp);
  // Executa o shell_exec para iniciar rm_sessions.py
  shell_exec("python session_rm.py");
}

Fazer upload para a pasta root_site/var
1
2
3
4
5
6
7
8
"""
USE THIS SCRIPT CAREFULLY - mag_session_rm.py
"""
#!/usr/bin/python
import os

# Chama as funções de sistema operativo para remover
os.popen("rm -f ./session/*")


O caminho que pretendemos afetar fica em root_site/var/sessions
Fiz ficheiros em locais diferentes, para tentar minimizar tentativas de acessos/adulteração dos ficheiros.

Por fim pelo browser aceder ao url do site ex: www.lojaonline.com/mag_session_rm.php

Aguardar uns segundos/minutos dependendo da quantidade de ficheiros e em pouco tempo a sua loja Magento está de novo em pleno.

[Download] Neste ficheiro vai encontrar os dois ficheiros, mas o de php tem implementado um formulário onde pede uma password que deve ser definida pelo leitor.


1
20
21
22
<?php
// Minimal Security - SHA1 Password 
// Get One in www.sha1-online.com
$safePasswd = "22bf5d4a65ff0792ed773c17fa7178ed1cf76aa6";

Obrigado pela atenção

quarta-feira, 13 de abril de 2016

IDE Atom by GitHub

Qualquer pessoa interessada em começar ou que já tenha alguma experiência em programação, sabe que, a uma determinada altura vai precisar de utilizar um IDE.

Existe uma grande quantidade de ofertas, e até à poucos dias tinha como IDE de trabalho o NetBeans, é um ótimo IDE a última versão consome menos recursos, mas, senti-me obrigado a trocar.

Já passou algum tempo desde que testei as primeiras versões do Atom by GitHub e tenho que admitir, neste momento é o meu preferido.



Tem como vantagem, ser rápido a iniciar, consigo trabalhar do mesmo modo no Windows, OSX e Ubuntu e tem muitos pacotes de plugins de boa qualidade prontos a adicionar, e são esses pacotes que vou partilhar aqui nesta publicação.

Tema (Theme):


Pacotes (Packages) - Aspecto

  • Seti Iconshttps://atom.io/packages/seti-icons - Implementa pequenos icons relacionados com o tipo de ficheiro, tornando rápido a identificação do mesmo sem ler a extensão;
  • Minimap https://atom.io/packages/minimap - Permite uma visualização do código numa barra ao alto, o que torna além de mais rápido saltar no código, acabamos por associa blocos/coloração do código e rápidamente estamos no sitio que precisamos;

Pacote (Package) - Código

Caso tenha packages/themes que não esteja a usar é melhor desinstalar para não tornar o IDE pesado.


quinta-feira, 19 de dezembro de 2013

LG E500 (S.AP32P) - Windows 7, reboots constantes

Caros leitores (poucos mas bons),

Já à um tempo que não escrevo nada neste espaço, mas esta semana apareceu-me um problema desta vez em hardware.

Equipamento: Portail
Marca: LG
Modelo: E500




Problema: 
O objectivo inicial era compreender o porque do portátil ter deixado de entrar no  Microsoft Windows 7, o qual iniciava normalmente até à janela do Aguarde, onde acabava por bloquear e ao fim de um tempo, reiniciar.

Soluções:
Tendo em conta que em modo de segurança funcionava, a minha primeira suspeita foi problemas de arranque de algum componente de hardware.

E após uma nova formatação que correu tudo às mil maravilhas, passo para as actualizações automáticas, que fizeram com que volta-se ao circuito de bloqueios.

Comecei então por desligar tudo o que era periféricos (modem, wireless, bluetooth, teclado, rato) e nada resolvia. Fiz testes de memoria com o memtest e tudo estava a 100%.

O motivo, e solução final:
Após tudo removido, sobrava a placa gráfica, entrei em modo de segurança, e removi os drivers da NVidia pois estes foram instalados pelo windows update, e foi a solução.

Depois nos updates do windows, é preciso marcar como não pretendemos que a actualização da NVidia seja feita permanentemente, e ficamos exclusivamente a trabalhar com o driver PnP Genérico, o que funciona sem problemas, com a definição do ecrã no máximo (1280x800).

Nota:
Caso alguém tenha questões sobre problemas de hardware ou software, sinta-se à vontade para enviar um email.

segunda-feira, 24 de setembro de 2012

PHP , SMTP - Função email autenticado

A função mail() no PHP, é uma função simples e usada largamente por quem deixa ao critério do servidor o envio de emails de dentro dos projecto, e esta função usa o servidor de envio de emails interno para o fazer.

No entanto, recentemente (não sei precisar o tempo) um dos maiores revendedores de serviços de alojamento do nosso país a esotérica, passo a não permitir o envio de email de dentro dos clientes sem que estes se autenticassem via SMTP.

Foi por este motivo que alguém me contacto, e me pediu para resolver o problema.

Pois bem, para começar tive que converter todos os ficheiros que enviavam emails, e retirar a função mail.

PHP - Email autenticado

o PHPMailer é uma classe de php que trata da ligação e de enviar os emails autenticados, por isso bastou importar o ficheiro e tratar do resto.

Para não andar sempre a importar o PHPMailer, decidi criar um ficheiro de envio de email, ao qual chamei smtpMailConfig.php o qual deverá ser adicionado com include() a cada inicio de página onde possa ser necessário.

Ficheiro.php
<?php

# Ficheiro de configurações de SMTP e ligação com PHPMailer
include("smtpMailConfig.php");

?>
smtpMailConfig.php

<?php
require("phpmailer/class.phpmailer.php");

/*
 * Função de Enviar o email
 * $vFrom - Email de Origem
 * $vFromNome - Nome de Origem
 * $vTo - Email de destino
 * $vToNome - Nome de destino
 * $vAssunto - Assunto do Email
 * $vEmail - Texto do Email
 * $vCC - Parametro CC (separados por ;)
 */
function fcEnviarEmail($vFrom,$vFromName,$vTo,$vToName,$vAssunto,$vEmail,$vCC){
global $mail;
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPAuth = true;

# Dados de Ligação
$mail->Host = "127.0.0.1";
$mail->Username = "info@byteajudarblog.pt";
$mail->Password = "emailpassword";

# Dados Gerais
$mail->From = $vFrom;
$mail->FromName = $vFromName;
$mail->AddAddress($vTo, $vToName);

if(!empty($vCC)){
$vCCArr = explode(';',$vCC);
foreach($vCCArr as $key){
$mail->AddCC($key);
}
}


$mail->IsHTML(true);
$mail->Subject = $vAssunto;
$mail->Body = $vEmail;

if(!$mail->Send()){
return 0;
//echo $mail->ErrorInfo;
}else{
  return 1; //echo "Email Enviado";
}
}

?>

Enviar email pela função

Após a aplicação dos passos acima, basta chamar a função e passar os parâmetros:

Ficheiro.php
<?php
$assunto = "Email Online";
$texto = "Texto.......texto";


$mailOk = fcEnviarEmail("info@blog.pt","Nome Blog","email@destino.com",'Destino',$assunto,$texto,'cc1@destino.com;cc2@destino.com');

if($mailOk==1)
  echo "Email enviado com sucesso"; # Ou mais código php
else
  echo "Erro a enviar email";
?>


Autenticação nos serviços Esotérica

Para quem tenha mesmo assim erro a enviar email pelo serviço desta empresa, (e esta situação aconteceu comigo) basta no painel de controlo do domínio (s) verificar se no servidor de DNS existe indicação do localhost (IP: 127.0.0.1), caso não exista tem que adicionar.

======================
Nota: As minhas desculpas pelo código não estar com coloração, mas o blogger não tem essa ferramenta.


sexta-feira, 21 de setembro de 2012

MySQL Multi-Premissões em servidores remotos

No seguimento da publicação anterior, foi-me sugerido uma situação um pouco diferente, que é quando necessitamos de fazer exactamente a mesma operação mas com recurso à consola.

É verdade que é possível conectar um software de gestão de base de dados ao servidor remoto, mas também é verdade que nem sempre que tem servidor disponibiliza esse acesso assim como pode aumentar o risco de ataque ao sistema.

A informação que se segue foi testada e elaborada com recurso um MySQL Server instalado num computador com Ubuntu Linux, mas o importante é existir um acesso ao servidor.

Aceder ao MySQL

 mysql -u root -p 
após o enter aguarda que se escreva a password de acesso.
Nota: exemplo com root, mas pode ser qualquer utilizador desde que tenha acesso total

Após aceder com sucesso ao mysql a consola passa ter a informação que passa a aceitar comandos para o mysql aparecendo no inicio mysql> 



Criar novo utilizado

 CREATE USER 'blogUser'@'localhost' IDENTIFIED BY 'uma_password'; 

CREATE USER - É o comando principal
- Entre plicas ( ' ) o nome do utilizador seguido de um at (arroba) @ e entre plicas o localhost
Nota: se quiser acesso exterior em vez de localhost deverá usar o símbolo de percentagem (%) 
IDENTIFIED BY - Refere que o utilizador vai ter uma password de acesso
- Entre plicas a password
- Não esquecer de terminar com ponto e virgula (;) se não a consola ao carregar no enter vai passar para uma linha com o simbolo -> se isto acontecer, basta aplicar o ; e enter.

No fim deverá receber a seguinte mensagem na janela
 Query OK, 0 rows affected (0.00 sec) 

Agora saia da consola do MySQL
 quit 

Mais informações aqui

Criar ficheiro de SQL

Para usar o código de criar as permissões referido na publicação anterior  pode fazer de várias maneiras:
- Usar um editor de texto na consola (vi, nano, pico),
- Enviar o ficheiro por SSH ou FTP

Nota: Garanta que sabe a localização de onde coloca o ficheiro.

Executar ficheiro SQL e exportar o resultado

Para executar o ficheiro escreva o seguinte comando:
 mysql -u root -p 'blogBD' < /dir/sql/ficheiro.sql > /dir/sql/resultado.sql 

- Sendo 'blogBD' o nome da base de dados de destino

A consola volta a pedir a password, e se tudo estiver correcto volta à condição inicial, sendo que o ficheiro resultado.sql foi criado na directoria indicada.

Verificar ficheiro SQL

Agora é necessário dar uma vista de olhos no ficheiro, navegue até à pasta, e edite o ficheiro, neste caso é mesmo necessário porque o titulo da coluna também é exportada, logo tem que remover a 1ª linha do ficheiro.

Para tornar o processo mais rápido, pode adicionar no fim do ficheiro o comando:
 FLUSH PRIVILEGES; 

Executar ficheiro SQL

Por fim, com o ficheiro já operacional, basta indicar o seguinte comando:
 mysql -u root -p 'blogBD' < /dir/sql/resultado.sql; 

- Sendo 'blogBD' o nome da base de dados que vai receber a informação

Testar novo utilizador

Agora que o novo utilizador foi criado e os privilégios atribuídos, pode fazer o teste fazendo login e acedendo à base de dados, com os seguintes comandos:
 mysql -u blogUser -p 
 USE blogBD 
 SHOW TABLES 

--------------------------------------------
Bom Fim de Semana, se tiverem questões disponham e comentar ou enviar email.

quarta-feira, 19 de setembro de 2012

MySQL - Permissões em várias tabelas

Como diz o titulo esta publicação refere-se ao motor de base de dados MySQL,  e a situação que surgiu tinha como base a atribuição de permissões a um determinado utilizador a várias tabelas, mas não todas.

Esta operação mesmo com programa de gestão de bases de dados como o MySQL Workbench  é um operação que se torna penosa, visto que usa sistemas de árvore para navegar e vistos para marcar as permissões.

A maneira mais rápida então que arranjei de resolver isto, é através da criação de um script para atribuir as permissões ao utilizador por tabela dentro da base de dados.

Execute o seguinte SQL.
Nota: Garanta que o seu utilizador tem permissões totais dentro do MySQL, porque o script vai consultar tabelas de controle do motor.

Antes de prosseguir, já deve ter o utilizador criado no MySQL

-- Cria a linha a utilizar na próxima execução, atribuía mais permissões se assim se justificar 

SELECT CONCAT("GRANT SELECT, INSERT, UPDATE, DELETE ON ", TABLE_NAME," TO 'testeUser'@'localhost' ;") AS ex
-- Aqui vai ao motor requisitar todas as tabelas
FROM INFORMATION_SCHEMA.TABLES
-- Indica que só quer as tabelas da base de dados indicada no WHERE
WHERE TABLE_SCHEMA = "NomeBaseDados"
-- Se pretender excluir algumas tabelas indique o nome das mesmas
AND TABLE_NAME NOT IN ('tblPagamentos','tblBancos');    


Nota: se pretender incluir apenas algumas tabelas as linha acima deverá ser:
AND TABLE_NAME IN ('tblPagamentos','tblBancos');      

O resultado final, deverá ser exportado para ficheiro de texto.



Próximo passo, executar o que está no ficheiro de texto.

E por fim executar o commando :
FLUSH PRIVILEGES;

Para que todas as permissões se tornem activas.


terça-feira, 18 de setembro de 2012

Importar Contactos para Outlook via CSV

Quem lida com a área da informática muita vez depara-se com questões que nem sempre está à espera, e como tudo na vida, ninguém sabe tudo, e algumas coisas carecem de alguma pesquisa e outras apenas olhar para as ferramentas que já existem.

Para primeira publicação (a apresentação não conta), decidi partilhar convosco uma situação que me foi pedida por um cliente meu.

Situação:

O cliente em questão, estava a trabalhar com a plataforma HORDE para gerir os seus emails e a sua lista de contactos, no entanto existiam pormenores que ele pretendia nos quais esta plataforma não o podia ajudar. Foi então que me pediu se era possivel fazer ligação ao servidor e usar o Microsoft Outlook 2007 e deveria também importar os contacto da sua lista que já estava com mais de 1000 contactos.

Resolução:


Como esta publicação é sobre a importação, vou deixar a configuração para descarregar os emails de lado, se alguém pretender, pode pedir que farei uma publicação a explicar essa parte.

Primeiro é necessário exportar os dados da plataforma para o nosso computador.


  • No menu lateral escolha a opção "Address Book" (livro de endereços) 

  • Seleccione na barra superior do HORDE existe a opção Import/Export
  • No grupo de opções Exportar, escolha a opção "Comma separated values (Microsoft Outlook)"
Nota: No tipo de exportação já podem verificar o que quer dizer CSV, traduzido para português é um ficheiro em que os valores são separados por virgulas.

  • Clique em export ... aguarde algum tempo (desde segundos a minutos dependendo da quantidade de dados)

Agora dependendo do seu navegar um ficheiro "contacts.csv" deverá ser guardado.

Iniciei o Microsoft Outlook
  • Dependendo da versão (2003/2007/2010) no menu ficheiro procure a opção Importar/Exportar
  • Na nova janela escolha a opção "Importar de outro programa ou ficheiro" - Seguinte
  • Nas opções disponíveis procure a opção "Valores separados por virgulas (Windows)" - Seguinte
  • Indique a localização do ficheiro que fez o download, e verifique das opções abaixo qual a que melhor se adapta a sua situação
  • A próxima janela pergunta para onde são os dados, deverá escolher a opção de "Contactos" - Seguinte
  • Agora é a fase final, mas mais importante, deverá escolher a opção "Mapear Campos", porque muitas vezes os títulos dos campos não são iguais, e no fim poderá não ter nada importado.
  • Para tal, basta arrastar os campos do lado esquerdo para os títulos do lado direito e largar - OK

  • Por fim, botão Concluir e aguardar que a importação seja feita.