Mostrando postagens com marcador MySQL. Mostrar todas as postagens
Mostrando postagens com marcador MySQL. Mostrar todas as postagens

quinta-feira, 28 de dezembro de 2017

sexta-feira, 6 de dezembro de 2013

App de cidades e estados brasileiros

Vez ou outra é necessário cadastrar a cidade e o estado em um formulário de algum projeto, seja para cadastro de perfis, pedidos, etc.

Quando tem endereço envolvido ainda é mais fácil, pois existem diversos webservices que fornecem o nome da forma correta, como consta nos correios. O problema acontece quando desejamos apenas cidade e estado.

Sempre aparece alguns "espertinhos" (pra não dizer outra coisa), que escrevem sua cidade cada hora de um jeito, abreviando das mais diversas maneiras, e com isso, o banco fica uma bagunça quando precisa-se filtrar ou tirar um relatório baseado em cidades.

Por isso, resolvi montar um banco com base nas informações dispostas no site do IBGE (http://www.cidades.ibge.gov.br/xtras/home.php - atualizado em 2010) para ajudar com esta tarefa.

Espero que ajude outros programadores.

Segue o link: https://github.com/zejuniortdr/cidades-br

hasta!

quinta-feira, 7 de novembro de 2013

Como instalar o MySQL no OS X 10.9 Mavericks

Estava ocorrendo o erro:

EnvironmentError: mysql_config not found
ao tentar instalar o mysql com o comando:

pip install mysql-python

com o ENV ativo, então resolvi reinstalar o MySQL Achei um tutorial  (disponivel neste link) com 1 linha de comando que ajudou muito:

bash <(curl -Ls http://git.io/eUx7rg)

Pro caso de sair do ar, replico o conteúdo aqui:

#!/bin/bash
#############################################
# AUTHOR: JONATHAN SCHWENN @JONSCHWENN      #
# MAC MINI VAULT - MAC MINI COLOCATION      #
# MACMINIVAULT.COM - @MACMINIVAULT          #
# VERSION 1.05 RELEASE DATE OCT 11 2013     #
# DESC:  THIS SCRIPT INSTALLS MySQL on OSX  #
#############################################
#REQUIREMENTS:
#  OS X 10.7 or newer
#############################################
# CHECK FOR OS X 10.7+
if [[  $(sw_vers -productVersion | grep '10.[7-9]')  ]]
then
# CHECK FOR EXISTING MySQL
if [[ -d /usr/local/mysql && -d /var/mysql ]]
then
echo "It looks like you already have MySQL installed..."
echo "This script will most likely fail unless MySQL is completley removed"
echo "..."
 while true; do
  read -p "DO YOU WANT TO CONTINUE? [y/N]" yn
  case $yn in
  [Yy]* ) break;;
  [Nn]* ) exit ;;
  * ) echo "Please answer yes or no.";;
  esac
 done
fi
# LOOKS GOOD, LETS GRAB MySQL AND GET STARTED ...
echo "Downloading MySQL Installers ... may take a few moments"
curl -s -o ~/Downloads/MySQL.dmg http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.14-osx10.7-x86_64.dmg
hdiutil attach -quiet ~/Downloads/MySQL.dmg
cd /Volumes/mysql-5.6.14-osx10.7-x86_64/
echo "..."
echo "..."
echo "Installing MySQL, administrator password required ..."
sudo installer -pkg mysql-5.6.14-osx10.7-x86_64.pkg -target /
echo "..."
echo "..."
echo "Installing MySQL start up items..."
sudo installer -pkg MySQLStartupItem.pkg -target /
echo "..."
echo "..."
echo "Click Install to install the MySQL preferance pane"
echo "..."
echo "..."
# MOVING PREFPANE TO DOWNLOADS FOLDER SO IT CAN STILL BE INSTALLED
# AFTER THE SCRIPT COMPLETES AND REMOVES THE INSTALLER FILES
# AS SCRIPT DOESN'T WAIT FOR USER TO CLICK "INSTALL" FOR PREFPANE
cp -R MySQL.prefPane ~/Downloads/MySQL.prefpane
open ~/Downloads/MySQL.prefPane/
echo "..."
sleep 15
sudo /usr/local/mysql/support-files/mysql.server start
echo "export PATH=$PATH:/usr/local/mysql/bin" >> ~/.bash_profile
sudo mkdir /var/mysql; sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock
if [[  $(sudo /usr/local/mysql/support-files/mysql.server status | grep "SUCCESS") ]]
then
mypass="$(cat /dev/urandom | base64 | tr -dc A-Za-z0-9_ | head -c8)"
echo $mypass > ~/Desktop/MYSQL_PASSWORD
echo "Setting MySQL root Password to $mypass"
echo "Placing password on desktop..."
/usr/local/mysql/bin/mysql -uroot -e "GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY '$mypass' WITH GRANT OPTION;"
echo "..."
echo "..."
cd ~/
hdiutil detach -quiet /Volumes/mysql-5.6.14-osx10.7-x86_64/
sleep 2
rm ~/Downloads/MySQL.dmg
# NEW MY.CNF PERFORMANCE OPTION START
echo "BASE PERFORMANCE MY.CNF IS JUST A GENERIC SUGGESTION FOR PERFORMANCE"
echo "YOUR RESULTS MAY VARY AND YOU MAY WANT TO FURTHER TUNE YOUR MY.CNF SETTINGS"
echo "BASE PERFORMANCE MY.CNF INCREASES BUFFERS/MEMORY USAGE"
echo "8GB+ RAM IS RECOMMENDED FOR BASE PERFORMANCE MY.CNF"
echo "..."
sudo cp /usr/local/mysql/my.cnf /usr/local/mysql/mmv.cnf
sudo tee -a /usr/local/mysql/mmv.cnf > /dev/null  << EOF

# CUSTOMIZED BY MMVMySQL SCRIPT - JUST GENERIC SETTINGS
# DO NOT TREAT AS GOSPEL

skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
thread_concurrency = 4
EOF
        while true; do
                read -p "DO YOU WANT TO LOAD A BASE PERFORMANCE MY.CNF FILE? [y/N]" cnf
                case $cnf in
                [Yy]* ) sudo cp /usr/local/mysql/mmv.cnf /etc/my.cnf; sudo /usr/local/mysql/support-files/mysql.server restart; break  ;;
                [Nn]* ) break;;
                * ) echo "Please answer yes or no.";;
                esac
        done
# NEW MY.CNF PERFORMANCE OPTION END
# NEW SEQUEL PRO INSTALL OPTION START
while true; do
                read -p "DO YOU WANT TO AUTOMATICALLY INSTALL SEQUEL PRO? [Y/n]" sp
                case $sp in
                [Yy]* ) curl -s -o ~/Downloads/SequelPro.dmg https://sequel-pro.googlecode.com/files/sequel-pro-1.0.2.dmg; hdiutil attach -quiet ~/Downloads/SequelPro.dmg;cp -R /Volumes/Sequel\ Pro\ 1.0.2/Sequel\ Pro.app/ /Applications/Sequel\ Pro.app/; hdiutil detach -quiet /Volumes/Sequel\ Pro\ 1.0.2/;sleep 5; rm ~/Downloads/SequelPro.dmg; echo "Sequel Pro is now in your Applications folder!";  break  ;;
                [Nn]* ) break;;
                * ) echo "Please answer yes or no.";;
                esac
        done
# NEW SEQUEL PRO INSTALL OPTION END
echo " "
echo " "
echo "ALL DONE!  Install Sequel Pro or phpmyadmin to administer MySQL"
echo "Log off and log back in for 'mysql' to be recognized as a command in terminal"
else
"SORRY, MySQL IS NOT RUNNING ... THERE MUST BE A PROBLEM"
fi
else
echo "ERROR: YOU ARE NOT RUNNING OS X 10.7 OR NEWER"
exit 1
fi

Para instalar abra o terminal e execute o comando:

bash <(curl -Ls http://git.io/eUx7rg)

Siga os passos conforme forem aparecendo. Quando pedir a senha, coloque a senha do usuário do mac, será gerado uma senha nova para o usuario root do mysql e ela estará disponivel tanto no terminal quanto num arquivo direto na Mesa.

Se por ventura quando for rodar o syncdb, pegar o erro:

Library not loaded: libmysqlclient.18.dylib
Reason: image not found

faça um link simbolico para essa lib com o comando:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib




terça-feira, 8 de janeiro de 2013

Autenticação do Django utilizando old_password do mysql

No mesmo diretório do seu arquivo settings.py crie um arquivo chamado hashers.py com o seguinte conteúdo:

from django.contrib.auth.hashers import BasePasswordHasher, mask_hash

from django.utils.datastructures import SortedDict
from django.utils.crypto import constant_time_compare
from django.utils.translation import ugettext_noop as _

class MySQLOldPasswordHasher(BasePasswordHasher):
    """
    Classe para criptografar as senhas utilizando o modelo da funcao old_password do mysql 4.x
    Class to encrypt the passwords using the model of mysql 4.x  old_password function
    """
    algorithm = "mysql_old_password"

    def salt(self):
        return ''

    def encode(self, password, salt):
        nr = 1345345333
        add = 7
        nr2 = 0x12345671

        for c in (ord(x) for x in password if x not in (' ', '\t')):
            nr^= (((nr & 63)+add)*c)+ (nr << 8) & 0xFFFFFFFF
            nr2= (nr2 + ((nr2 << 8) ^ nr)) & 0xFFFFFFFF
            add= (add + c) & 0xFFFFFFFF

        password = "%08x%08x" % (nr & 0x7FFFFFFF,nr2 & 0x7FFFFFFF)
        return "%s$%s" % (self.algorithm, password)

    def verify(self, password, encoded):
        encoded_2 = self.encode(password, '')
        return constant_time_compare(encoded, encoded_2)

    def safe_summary(self, encoded):
        return SortedDict([
            (_('algorithm'), self.algorithm),
            (_('hash'), mask_hash(encoded, show=3)),
        ])

Adicone esse novo hasher no início da setting PASSWORD_HASHERS no seu arquivo settings.py:

PASSWORD_HASHERS = (
    'app.hashers.MySQLOldPasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.SHA1PasswordHasher',
    'django.contrib.auth.hashers.MD5PasswordHasher',
    'django.contrib.auth.hashers.CryptPasswordHasher',
)

A função de login fica como de costume:

from django.contrib.auth import authenticate, logout, login as authlogin
from django.core.context_processors import csrf
def logar(request):
 if request.POST:
  c = {}
  c.update(csrf(request))
  r = request.POST

  usuario = r.get('usuario')
  senha = r.get('senha')

  u = authenticate(username=usuario, password=senha)

  if u is not None:
   c = u.get_profile()
   if c:
    if c.ativo:
     if u.is_active:
      authlogin(request, u)
      # USUARIO LOGADO COM SUCESSO
      return HttpResponse('1')
    # USUARIO INATIVO     
    return HttpResponse('-3')
  # USUARIO NAO ENCONTRADO / SENHA INCORRETA
  return HttpResponse('0')
 # REQUISICAO SEM POST
 return HttpResponse('-1')


Da mesma forma pode ser feito com outros hashers. Basta adicioná-los ao arquivo hashers.py e listá-los na ordem desejada no settings como vimos acima.

Uma coisa notada analisando os algoritmos de hash disponível no Django (disponíveis em django.contrib.auth.hashers), o password gerado automático que é salvo no banco possui 3 partes separadas pelo simbolo "$":

  • Algoritmo de criptografia utilizado
  • Número de iterações
  • Hash da senha
No exemplo acima que a função old_password() do mysql não possui iterações, a segunda parte é omitda.



hasta!

quarta-feira, 15 de agosto de 2012

utf8_general_ci vs utf8_unicode_ci


Execução


utf8_general_ci é muito mais rápido em comparação e classificação, porque só os tipos de cada carácter como um único valor, isto é, para comparação e seleção, cada carácter é convertido em um único valor numérico e, em seguida, estes valores são comparados.

utf8_unicode_ci usa um algoritmo de comparação muito mais complexo, onde até 4 parâmetros devem ser levados em conta para cada carácter.

Precisão de classificação em vários idiomas


utf8_unicode_ci é baseado no padrão Unicode para a classificação. utf8_general_ci é bem próximo, mas não é compatível com Unicode, porque foi adaptado para se tornar mais rápido.

Unicode define conjuntos de regras para como os caracteres devem ser classificados. Estas regras devem ter em conta as convenções locais, nem todos os tipos de seus caracteres no que poderíamos chamar de 'ordem alfabética'. Quanto a idiomas latinos, não há muita diferença entre a triagem e a classificação Unicode utf8_general_ci simplificado no MySQL, mas ainda existem algumas diferenças.

Por exemplo, os tipos de agrupamento Unicode "ß" como "ss", e "Œ" como "OE", enquanto que os tipos utf8_general_ci agrupa como caracteres únicos como "s" e, presumivelmente, "e", respectivamente.

Em línguas não latinas, tais como idiomas asiáticos ou idiomas com alfabetos diferentes, utf8_unicode_ci pode ou não fazer diferença ou muita diferença dependendo do idioma.

Alguns caracteres Unicode são definidos como ignorável, o que significa que eles não devem contar para a ordem de classificação, e você deve passar para o próximo caractere em vez. utf8_unicode_ci lida com estes de forma adequada, que, por razões de desempenho utf8_general_ci não, e uma palavra com o carácter ignorável, serão classificados de forma diferente para uma palavra sem.

Se você quiser, você poderia usar utf8_general_ci maior parte do tempo, e só usar utf8_unicode_ci quando a classificação ia ser importante o suficiente para justificar o custo de desempenho.

Agora, no entanto, eu recomendo usar utf8_unicode_ci o tempo todo. No mundo real, o custo de desempenho vai ser irrisório (e se não for, você vai saber). E é melhor para o seu aplicativo para classificar corretamente em mais idiomas.

hasta!