quarta-feira, 24 de junho de 2015

Phalcon PHP htaccess não funciona

Linux: Debian 7
Apache: 2.4.10 (Debian)
PHP: 5.6.9-0+deb8u1


Em minha empreitada com o framework Phalcon, esbarrei no problema do .htaccess da raiz do projeto não encaminhar a requisição para o public/index.php. Mesmo com o .htaccess na raiz do projeto, não funcionava. 
O problema estava no /etc/apache2/apache2.conf. Abra esse arquivo e certifique-se de que a diretiva AllowOverride esteja com o valor All e não None.

Segue o trecho de como está agora a configuração do meu apache2.conf:

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

Altere o arquivo e reinicie o apache, que no Debian você faz com o comando:

$ sudo service apache2 restart

Alterando a diretiva AllowOverride para All, permitirá que o apache2 possa ler as diretivas programadas nos arquivos .htaccess e substitua-as das diretivas programadas anteriormente. 


undefined symbol: php_pdo_get_dbh_ce in Unknown on line 0

Linux: Debian 7
Apache: 2.4.10 (Debian)
PHP: 5.6.9-0+deb8u1

A alguns dias iniciei meus estudos com o framework Phalcon PHP. De antemão já o achei prático e com uma estrutura simplista. Contudo, tive alguns problemas na instalação. 
O Phalcon PHP não é como os outros frameworks para PHP, o qual é só copiar a colar e sair programando. Com o Phalcon é necessário instalar e preparar o PHP da máquina para usar sua SO.
O problema que tive foi por conta de uma gafe que cometi por não seguir a risca as instruções do site do framework.


Fiz a besteira de colocar a instrução extension=phalcon.so dentro do /etc/php5/cli/php.ini. Se você fez isso, tire a instrução, certifique-se de que o diretório /etc/php5/apache2/conf.d esteja com o arquivo 50-phalcon.ini e dentro dele a instrução extension=phalcon.so

Veja a estrutura do meu diretório:

lucio@lucio:/etc/php5/apache2/conf.d$ ll
total 12
drwxr-xr-x 2 root root 4096 Jun 24 10:21 .
drwxr-xr-x 3 root root 4096 Jun 23 16:44 ..
lrwxrwxrwx 1 root root   32 Jun 22 16:16 05-opcache.ini -> ../../mods-available/opcache.ini
lrwxrwxrwx 1 root root   28 Jun 22 16:16 10-pdo.ini -> ../../mods-available/pdo.ini
lrwxrwxrwx 1 root root   29 Jun 22 16:16 20-json.ini -> ../../mods-available/json.ini
lrwxrwxrwx 1 root root   31 Jun 22 16:19 20-mysqli.ini -> ../../mods-available/mysqli.ini
lrwxrwxrwx 1 root root   30 Jun 22 16:19 20-mysql.ini -> ../../mods-available/mysql.ini
lrwxrwxrwx 1 root root   34 Jun 22 16:19 20-pdo_mysql.ini -> ../../mods-available/pdo_mysql.ini
lrwxrwxrwx 1 root root   33 Jun 22 16:16 20-readline.ini -> ../../mods-available/readline.ini
-rwxrwxrwx 1 root root   76 Jun 23 16:45 50-phalcon.ini

Certifique-se de que o número antes de phalcon.ini seja maior do que o número do arquivo pdo_mysql.ini - 50 > 20.

lucio@lucio:/etc/php5/apache2/conf.d$ cat 50-phalcon.ini 
extension=phalcon.so

Pronto, agora seu PHP funciona perfeitamente com o a extensão do Phalcon PHP.


quarta-feira, 27 de maio de 2015

Como saber a distruição linux que está usando


Esses são os comandos que podem nos ajudar a saber qual a distribuição linux que você está usando:

$ cat /proc/version

$ cat /etc/*release*

$ lsb_release -a

$ gcc --version

$ uname -a

$ python -c 'import platform; print(platform.dist()[0])'

segunda-feira, 18 de maio de 2015

Acentuação no Python


Recentemente, tive problemas ao fazer leitura de arquivos texto extraídos de um arquivo zipado. Obviamente, o fiz usando a função ZipFile, pelo import zipfile.

Ao fazer a leitura e inserir no banco, percebi que os caracteres especiais (aqueles acentuados) não estavam sendo lidos corretamente, retornado interrogações (?), ao invés dos próprios caracteres acentuados.

Fiz vários testes e a solução final, foi simples, como é da natureza Python...rs

Em cada linha do meu buffer, fiz um decode, usando o codec latin_1.

for line in lines:
print line.decode("latin_1")


Para saber de mais codecs, acesse a página https://docs.python.org/2/library/codecs.html

'ascii' codec can't decode byte


Por uma semana lutei contra esse erro procurando em muitos sites e fóruns uma solução. O que me ocorrei era que eu lia a partir de um zip os dados a serem inseridos em uma tabela, e o nome da tabela era retirado a partir do nome do arquivo em questão.

Para entender todo o cenário, vou tentar explicar usando meus os códigos:

def populateTable(data, tableName):
try:
lines = data.splitlines()

part1 = "insert into %s (" % tableName

for line in lines:
lineFields = ""
lineValues = ""

if len(line) == 0:
continue
elif len(line.strip()) == 0:
continue

for it1, it2 in self.table.iteritems():
lineFields += it1 + ","

if it2["tipo"] == "int":
lineValues += line[int(it2["inicio"])-1:int(it2["fim"])] + ","
else:
lineValues += "\"" + line[int(it2["inicio"])-1:int(it2["fim"])] + "\","

query = "insert into %s (%s) values (%s);" % (tableName, lineFields[:-1].lower(), lineValues[:-1])
self.executeQuery(query)

except ValueError as error:
raise

zf = zipfile.ZipFile(self.zipFile) # carrega o arquivo zip com todos os txts que precisarei ler e inserir no mysql

for filename in zf.namelist():
        dataToInsert = zf.read(filename)
        populateTable(dataToInsert, filename[:-4]) # retiro o .txt para sobrar apenas o que será o nome da tabela


Quando eu tentava concatenar o nome tabela (tableName) com os dados retirados desse arquivo, o python me dava o seguinte erro:

__main__:run.py:185 'ascii' codec can't decode byte 0xea in position 35: ordinal not in range(128)
Traceback (most recent call last):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xea in position 35: ordinal not in range(128)

Quando eu tentava concatenar o nome do arquivo com os dados retirados desse arquivo, o python me dava o seguinte erro:

__main__:run.py:185 'ascii' codec can't decode byte 0xea in position 35: ordinal not in range(128)
Traceback (most recent call last):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xea in position 35: ordinal not in range(128)


Após várias pesquisas, encontrei o erro, usando o seguinte teste. Procurei saber quais os tipos de objetos cada variável pertencia.

print type(tableName), repr(tableName)
<type 'unicode'> u' ... '

print type(lineValues), repr(lineValues)
<type 'str'> ' ... '

Assim, vi que a variável 'tableName' era do tipo 'unicode', e a 'lineValues' era do tipo 'str'. O problema era na hora de concatenar as duas variáveis. 

Para resolver foi simples, apenas fiz um cast para string na variável 'tableName' e tudo deu certo!

query = "insert into %s (%s) values (%s);" % (str(tableName), lineFields[:-1].lower(), lineValues[:-1])