Python/Django – Cálculo de frete dos correios

Estavamos desenvolvendo nossa loja virtual com Django quando precisei do cáculo de frete dos correios. Várias pessoas disseram ter feito isso com o WEbService mas ninguém passou qualquer código ou referência que se adequasse. O w21studio oferece uma solução mas esta mostrou diferenças (muito grandes) em nossos testes em relação ao serviço dos correios. Para solucionar o problema criamos uma integração com o serviço utilizando o XML dos correios. Não posso explicar muito mas segue as funções (criei em português já que o serviço é brasileiro, contrariando o que faço normalmente apesar do meu Inglês não ser assim tão bom… Os métodos não relacionados aos correios estão em inglês. Eu sei, meu inglês precisa ganhar uns músculos ainda). Alguns métodos busquei em outros lugares. Os links estão na doc da função:

def find_key(dic, val):
    """
    return the key of dictionary dic given the value
    Source: http://www.daniweb.com/software-development/python/code/217019
    """
    return [k for k, v in dic.iteritems() if v == val][0]

## {{{ http://code.activestate.com/recipes/534109/ (r8)
import re
import xml.sax.handler

def xml2obj(src):
    """
    A simple function to converts XML data into native Python object.
    """

    non_id_char = re.compile('[^_0-9a-zA-Z]')
    def _name_mangle(name):
        return non_id_char.sub('_', name)

    class DataNode(object):
        def __init__(self):
            self._attrs = {}    # XML attributes and child elements
            self.data = None    # child text data
        def __len__(self):
            # treat single element as a list of 1
            return 1
        def __getitem__(self, key):
            if isinstance(key, basestring):
                return self._attrs.get(key,None)
            else:
                return [self][key]
        def __contains__(self, name):
            return self._attrs.has_key(name)
        def __nonzero__(self):
            return bool(self._attrs or self.data)
        def __getattr__(self, name):
            if name.startswith('__'):
                # need to do this for Python special methods???
                raise AttributeError(name)
            return self._attrs.get(name,None)
        def _add_xml_attr(self, name, value):
            if name in self._attrs:
                # multiple attribute of the same name are represented by a list
                children = self._attrs[name]
                if not isinstance(children, list):
                    children = [children]
                    self._attrs[name] = children
                children.append(value)
            else:
                self._attrs[name] = value
        def __str__(self):
            return self.data or ''
        def __repr__(self):
            items = sorted(self._attrs.items())
            if self.data:
                items.append(('data', self.data))
            return u'{%s}' % ', '.join([u'%s:%s' % (k,repr(v)) for k,v in items])

    class TreeBuilder(xml.sax.handler.ContentHandler):
        def __init__(self):
            self.stack = []
            self.root = DataNode()
            self.current = self.root
            self.text_parts = []
        def startElement(self, name, attrs):
            self.stack.append((self.current, self.text_parts))
            self.current = DataNode()
            self.text_parts = []
            # xml attributes --> python attributes
            for k, v in attrs.items():
                self.current._add_xml_attr(_name_mangle(k), v)
        def endElement(self, name):
            text = ''.join(self.text_parts).strip()
            if text:
                self.current.data = text
            if self.current._attrs:
                obj = self.current
            else:
                # a text only node is simply represented by the string
                obj = text or ''
            self.current, self.text_parts = self.stack.pop()
            self.current._add_xml_attr(_name_mangle(name), obj)
        def characters(self, content):
            self.text_parts.append(content)

    builder = TreeBuilder()
    if isinstance(src,basestring):
        xml.sax.parseString(src, builder)
    else:
        xml.sax.parse(src, builder)
    return builder.root._attrs.values()[0]
## end of http://code.activestate.com/recipes/534109/ }}}

def call_url(url, method='get', values=None):
    '''
    Call some external URL. It uses urllib and is a Shortcut
    @param String url: the full url with protocol (without get data. If you need, use as 'values')
    @param String method: the method between 'get' and 'post'
    @param Dict values: an dict containing the data to send
    @return: string Full content from url
    '''
    import urllib
    import urllib2

    if values is not None:
        # convert values to url defaults
        values = urllib.urlencode(values)

        if method == 'get':
            # if method is get, add values to url
            url = url + "?" + values
            req = urllib2.Request(url)

        elif method == 'post':
            # if method is post, add user agent to request
            user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
            headers = { 'User-Agent' : user_agent }
            req = urllib2.Request(url, values, headers) 

        else:
            # if not in conditions return null value
            return None

    # if no value to send
    else:
        req = urllib2.Request(url)

    # open url using requested object
    response = urllib2.urlopen(req)

    # return page's content
    return response.read()

def digits_only(string):
    '''
    This function get all numbers from a string and creates an Integer with it
    Indicated to prices and adresses
    @return Int number: the number from string
    '''
    return int(''.join(i for i in string if i.isdigit()))

def correios_frete(nCdEmpresa='', sDsSenha='', nCdServico=None,sCepOrigem='99999999', sCepDestino='99999999',
                  nVlPeso='1', nCdFormato=1, nVlComprimento=0, nVlAltura=0, nVlLargura=0, nVlDiametro=0,
                  sCdMaoPropria='N', nVlValorDeclarado=0, sCdAvisoRecebimento='N', StrRetorno='XML'):
    '''
    Este método utiliza a API dos correios enviando os dados via POST e recebendo um XML com as informações.
    Todos os dados são obrigatórios no formato da declaração.
    @param String nCdEmpresa: Seu código administrativo junto à ECT. O código está disponível no corpo do
                              contrato firmado com os Correios.
    @param String sDsSenha: Senha para acesso ao serviço, associada ao seu código administrativo.
                            A senha inicial corresponde aos 8 primeiros dígitos do CNPJ informado no contrato.
                            A qualquer momento, é possível alterar a senha no endereço

http://www.corporativo.correios.com.br/encomendas/servicosonline/recuperaSenha.

    @param List nCdServico: código de serviço para o cálculo seguindo a seguinte tabela(Pode ser mais de um
                            numa consulta separados por vírgula):
                            40010 : SEDEX sem contrato
                            40045 : SEDEX a Cobrar, sem contrato
                            40126 : SEDEX a Cobrar, com contrato
                            40215 : SEDEX 10, sem contrato
                            40290 : SEDEX Hoje, sem contrato
                            40096 : SEDEX com contrato
                            40436 : SEDEX com contrato
                            40444 : SEDEX com contrato
                            40568 : SEDEX com contrato
                            40606 : SEDEX com contrato
                            41106 : PAC sem contrato
                            41068 : PAC com contrato
                            81019 : e-SEDEX, com contrato
                            81027 : e-SEDEX Prioritário, com conrato
                            81035 : e-SEDEX Express, com contrato
                            81868 : (Grupo 1) e-SEDEX, com contrato
                            81833 : (Grupo 2) e-SEDEX, com contrato
                            81850 : (Grupo 3) e-SEDEX, com contrato
    @param String sCepOrigem: CEP de Origem sem hífen.Exemplo: 05311900
    @param String sCepDestino: CEP de Destino Sem hífem
    @param String nVlPeso: Peso da encomenda, incluindo sua embalagem. O peso deve ser informado em quilogramas.
                           Máximo de 30kg. Ex.: 0.300, 1, 2, 3
    @param Int nCdFormato: Formato da encomenda (incluindo embalagem). Valores possíveis:
                           1: Formato caixa/pacote - 2: Formato rolo/prisma
    @param Int nVlComprimento: Comprimento da encomenda (incluindo embalagem), em centímetros.
    @param Int nVlAltura: Altura da encomenda (incluindo embalagem), em centímetros.
    @param Int nVlLargura: Largura da encomenda (incluindo embalagem), em centímetros.
    @param Int nVlDiametro: Diâmetro da encomenda (incluindo embalagem), em centímetros. (somente para rolo/prisma)
    @param String sCdMaoPropria: Indica se a encomenda será entregue com o serviço adicional mão própria.
                                 Valores possíveis: S ou N (S – Sim, N – Não)
    @param Int nVlValorDeclarado: Indica se a encomenda será entregue com o serviço adicional valor declarado.
                                  Neste campo deve ser apresentado o valor declarado desejado, em Reais.
    @param String sCdAvisoRecebimento: Indica se a encomenda será entregue com o serviço adicional aviso de recebimento.
                                       Valores possíveis: S ou N (S – Sim, N – Não)
    @param String StrRetorno: Indica a forma de retorno da consulta. XML  Resultado em XML Popup 
                              Resultado em uma janela popup   Resultado via post em uma página do requisitante
    @return String: Conteúdo vindo da página dos correios como retorno da chamada
    '''
    url_correios = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx'

    # Apesar da documentação oficial declarar que a chamada deve ser via POST os dados são enviados via GET
    method='get'

    # ajusta valores em um dicionário
    values = {
              'nCdEmpresa':nCdEmpresa,
              'sDsSenha':sDsSenha,
              'nCdServico':nCdServico,
              'sCepOrigem':sCepOrigem,
              'sCepDestino':sCepDestino,
              'nVlPeso':nVlPeso,
              'nCdFormato':nCdFormato,
              'nVlComprimento':nVlComprimento,
              'nVlAltura':nVlAltura,
              'nVlLargura':nVlLargura,
              'nVlDiametro':nVlDiametro,
              'sCdMaoPropria':sCdMaoPropria,
              'nVlValorDeclarado':nVlValorDeclarado,
              'sCdAvisoRecebimento':sCdAvisoRecebimento,
              'StrRetorno':StrRetorno
              }

    # busca o conteúdo da URL gerada
    return call_url(url=url_correios,method=method, values=values)
# End correios_frete

def correios_frete_simples(cep_origem, cep_destino, comprimento, largura, altura, peso,
                           metodos='sedex, pac',codigo='', senha=''):
    '''
    Este método faz a chamada de página dos correios com as informações mais comuns e retorna um dicionário com os valores
    @param String cep_origem: cep de origem sem hifens. Caso haja hifens eles serão retirados
    @param String cep_destino: cep de destino sem hifens. Caso haja hifens eles serão retirados
    @param Int comprimento: comprimento da caixa em cm
    @param Int largura: largura da caixa em cm
    @param Int altura: altura da caixa em cm
    @param String peso: peso da encomenda em Kg(0.300, 1, 2, 3)
    @param String metodos: listagem dos serviços para calculo do frete. Use somente minusculas e palavras separadas por hifens.
                           Separe os métodos com vírgulas. Insira '-c' nos serviços com contrato (sedex-c, sedex-hoje-c)
    @param String codigo: codigo de servico caso exista
    @param Srtring senha: senha de servico caso exista
    @
    @return: Dict: dicionario de dados de metodos de entrega
    '''
    # códigos dos métodos para associação
    c_metodos = {
                 'sedex' : '40010',
                 'sedex-c' : '40096',
                 'sedex-a-cobrar' : '40045',
                 'sedex-a-cobrar-c' : '40126',
                 'sedex-10' : '40215',
                 'sedex-hoje' : '40290',
                 'pac' : '41106',
                 'pac-c' : '41068',
                 'e-sedex' : '81019',
                 'e-sedex-c' : '81035',
                 }

    # remove espaços da string com os métodos
    metodos = metodos.replace(' ', '').split(',')

    # verifica se existem dados para o cálculo
    if len(metodos) < 1:
        return None

    # varre o métodos enviados deixando somente os métodos válidos
    v_metodos = []

    for m in metodos:
        if m in c_metodos.keys():
            v_metodos.append(str(c_metodos[m]))

    # se nenhum metodo válido é encontrado retorna nulo
    if len(v_metodos) < 1:
        return None

    # faz a consulta de valores e adiciona para uma variavel
    v_metodos=','.join(v_metodos)
    cep_origem = digits_only(cep_origem)
    cep_destino = digits_only(cep_destino)
    xml_correios = correios_frete(nCdEmpresa=codigo, sDsSenha=senha, nCdServico=v_metodos, sCepOrigem=cep_origem, sCepDestino=cep_destino, nVlPeso=peso, nCdFormato=1, nVlComprimento=comprimento, nVlAltura=altura, nVlLargura=largura, nVlDiametro=0, sCdMaoPropria='N', nVlValorDeclarado=0, sCdAvisoRecebimento='N', StrRetorno='XML')

    # erifica se há dados da consulta aos correios
    if xml_correios is not None:
        #transforma a resposta (pagina XML) em DOM
        data = xml2obj(xml_correios)

        if data:
            # cria um array limpo com os dados retornados
            data = data['cServico']
            retorno = {}
            for d in data:
                retorno[find_key(c_metodos, d['Codigo'])] = {'valor':d['Valor']}
            return retorno

    return None
Publicado em Dicas em geral, Django | 2 comentários

HostGator Brasil – Uma aula sobre hospedagem de sites

Dias atrás um de nossos clientes ficou com todo o conteúdo do seu site inacessível. Isso foi causado por uma aparente quebra no banco (corrompimento de dados). O que transcrevo abaixo é um pouco da minha saga tentando colocar o site novamente no ar contando com o maravilhoso suporte HostGator Brasil

HostGatorBR: Seja bem vindo ao atendimento ao vivo HostGator. Como podemos ajudar?
 Guilherme: Boa tarde HostGatorBR. Um de nossos clientes parece estar com um problema no banco de dados.
 Guilherme: http://www.yyy.zzz.br/notícias
 HostGatorBR: Boa tarde Guilherme!
 HostGatorBR: que tipo de hospedagem é a dele senhor Guilherme?
 HostGatorBR: Está no ar senhor.
 Guilherme: essa área é preenchida desde o começo do ano passado. Tem mais de 200 notícias acredito eu. Percebi quedas no banco de dados nos ultimos dias (inclusive apresentando um site a um cliente, foi bem vergonhoso). Acredito que isso seja resultado dessas quedas (o site está em drupal)
 Guilherme: mas ele tem notícias, preciso saber o que aconteceu pra que isso sumice simplesmente (por que ninguém apagou)
 Guilherme: se foi uma invasão preciso dos logs de acessos ao banco e http, pra tentar descobrir de onde partiu (e também precisaremos restaurar o banco na ultima versão de vocês, acredito que isso seja possível)
 HostGatorBR: Senhor, a sua senha é bem protegida?
 Guilherme: (você perguntou qual era a hospedagem. Nós temos uma revenda e ele é nosso cliente)
 Guilherme: (plano linux)
 Guilherme: sim, a senha é bem protegida
 Guilherme: mas não sei do comportamento do cliente. Por isso preciso dos logs
 HostGatorBR: Para eles passarem esses dados terei que abrir um ticket, pois o assunto passa a ser sério!
 HostGatorBR: qual o e-mail do senhor e seu dominio principal?
 Guilherme: o email é lalallalala@xxxyyyzzz.com.br
 Guilherme: o domínio principal é xxxyyyzzz.com.br
 Guilherme: e o domínio do qual eu preciso dos logs é yyyxxxzzz.com.br
 HostGatorBR: O ticket foi aberto senhor,
 HostGatorBR: basta aguardar!
 HostGatorBR: Posso ajudá-lo em algo mais?
 Guilherme: sim. Preciso de um prazo
 HostGatorBR: Não existe prazo senhor, mais acredito que se o ticket for recebido pelo senhor, poderá ter uma resposta em breve!
 Guilherme: ok.
 Guilherme: obrigado.

Aviso da Host Gator sobre o recebimento do chamado (27/01 as 17:04):

lalallalala@xxxyyyzzz.com.br,
Sua solicitação foi recebida. Em breve, lhe responderemos com uma análise de suas necessidades.
Verifique que o número de seu ticket (ticket ID), está no assunto da mensagem e deve ser mantido desta forma cada vez que responder o e-mail. Ou seja, o "assunto" deve permanecer inalterado, independente do número de interações.
Seguem os detalhes do seu ticket de solicitação:Assunto: Perda de postagens no banco de dados!
Departamento: Suporte-L2
Prioridade: Média
Status do Ticket: Aberto

Prioridade média. Nenhum conteúdo do site acessível e a prioridade é média…


Em resposta à criação do chamado enviei o que eu acredito ser o motivo do problema(27 de janeiro de 2012 17:04):
A tabela node_revisions não está acessível. O sistema não me permite consultar nem alterar e ela tem o conteúdo do site todo. Nós não alteramos a tabela, por isso não posso entender o que ocorreu. Interessante é que isso ocorreu após uma queda no banco ontem à tarde, mas não tenho noção exata do horário. O banco de dados realmente não está vazio, mas a tabela de conteúdos (node_revisions) está inacessível.
Por favor, precisamos da máxima prioridade para resolução do problema. O responsável pelo chamado na nossa é o Guilherme que está em cópia neste email.
Obrigado.
Resposta da HostGator ao chamado dia 27/01/2012 as 21:00h:
Hostgator Brasil
Caro Cliente,
Poderia checar novamente por favor?
Atenciosamente

Minha resposta a eles as (27/01/2012 – 21:03):

O problema continua.
Sexta-feira, 27/01/2012 - 21:03
Estamos aguardando.

Resposta da HostGator(28 de janeiro de 2012 02:42):

Prezado Cliente,
Se você nos autorizar, podemos tentar restaurar o backup mais recente da base de dados.
Atenciosamente,

Minha resposta a eles(28 de janeiro de 2012 10:17):

Qual a data do último backup?

Respondida em 29/01/2012 10:22 pela HostGator

Prezado cliente,
O backup foi realizado no dia 28. Reparamos o banco de dados e verificamos que o site está acessível - http://xxxyyyzzz.com.br/ - poderia confirmar?
Atenciosamente,

Claro que o site não estava acessível (não nas página que é o real problema) ao que respondi (já sem paciencia em 29/01/2012 11:08):

José (nome fictício), acredito que o título do ticket não foi lido por você. O site realmente está acessível mas as postagens na sessão editorial e em qualquer outro lugar estão inacessíveis. Isso por que a tabela responsável por isso no banco de dados foi corrompida (não faço ideia de como isso foi possível, mas, como disse antes, foi após a últimafrequente queda de vocês.
Por favor, restaure o banco na última versão antes do dia 27/01. Após restaurar peço que abra esta página: http://xxxyyyzzz.com.br/editorial . Ela deve conter uma lista de mais de 10 notícias com várias páginas na paginação. Após abrir a listagem abra, por favor uma notícia. Essa notícia deverá ser exibida normalmente (e não dar acesso negado). Infelizmente algum dado pode ser perdido, mas teremos a restauração real do serviço.
Só uma dúvida: 24 horas pra responder qual é a data do ultimo backup do banco é o padrão da empresa? Pergunto por que tenho que dar um prazo para o meu cliente, se precisarmos confirmar dados na troca de emails vou dar uns 40 dias a ele...
Obrigado.

Eis que vem mais uma resposta da HostGator que sequer verificou segundo minhas instruções e ainda fechou o chamado(29 de janeiro de 2012 11:53):

Prezado cliente,
Foi restaurado um backup do dia 26, único existente da base xxx. Verifique outra vez e nos retorne.

Atenciosamente,
Departamento: Suporte-L2
Prioridade: Média
Status do Ticket: Fechado

E minha resposta desesperançoso (29 de janeiro de 2012 18:05):

Ainda não. O problema continua.
Temos os logs que eu pedi? Precisamos de uma restauração anterior ainda. Essa página precisa estar acessível (não é problema da aplicação. É problema de banco): http://xxx.com.br/editorial/aa-bb-cc-dd-ee-ff
Obrigado.

E olha a resposta que recebo agora (30 de janeiro de 2012 10:11) do suporte da HostGator:

Prezado cliente,
Não encontramos nos logs como a tabela foi danificada. A mensagem que existe ao acessar a url informada é: Você não está autorizado a acessar esta página.
Atenciosamente,

Não consigo entender como uma empresa que usa o nome da HostGator, considerada uma das melhores empresas de hospedagem do mundo pode fazer trabalho tão porco e infantil. Desde o começo eu disse que o problema era esse. O chat nunca consegue resolver qualquer problema, e o suporte chamado de nível 2 demora séculos para dar respostas, o que torna o trabalho impossível. Meu cliente está sem site desde a última quinta-feira com todo seu conteúdo inacessível. Quer uma indicação sobre empresa de hospedagem? Eu tenho uma contra indicação.

Publicado em Dicas em geral, hospedagem, hostgator | 4 comentários

Não adicionar Repositórios PLF no Mandriva 2011.0. IMPORTANTE !

Foi Publicado no Forum Mandriva Brasil pelo Manoel Pinho (o papai), uma nota com um aviso importante: não adicionar repositórios PLF ao Mandriva 2011. Não vou me alongar na informação por que ele já deixa tudo bem explicado. LEITURA OBRIGATÓRIA AOS MANDRIVEIROS:

http://www.mandrivabrasil.org/site/forum/index.php?topic=13098.0

Publicado em Dicas em geral, Mandriva Linux | Comentários desativados

Procedimentos Pós-Instalação para o Mandriva “Hydrogen” 2011

Foi publicado no Cotidiano Linux um post bem legal com procedimentos Pós -instalação para o Mandriva Linux 2011 (Hydrogen).

Fala um pouco sobre configurações e algumas perfumarias bem interessantes, mesmo para usuários mais experientes.

Segue o link: http://cotidianolinux.com.br/guest-post-procedimentos-pos-instalacao-para-o-mandriva-%E2%80%9Chydrogen%E2%80%9D-2011/

Agradeço Raphael Oliveira que escreveu o post muito bem detalhado e explicado. Indico a leitura.

Até.

Publicado em Dicas em geral, Mandriva Linux | 1 comentário

Lançado Mandriva 2011 (Hydrogen)

Foi lançado ontem o Mandriva 2011 (Hydrogen) com todas as novidades comentadas aqui nos últimos meses. Tenho usado a distro no meu computador nos últimos dois dias e posso dizer que está excelente. Muito estável e simples, como é a cara da Mandriva.

Enviamos alguns comentários no Cotidiano Linux em http://cotidianolinux.com.br/lancado-o-mandriva-2011-hydrogen/. Digo que vale a pena o download com apenas uma ressalva: se a temperatura dubir demais, desabilite o nepomuk.

Parabéns Mandriva e equipe de desenvolvedores e boas vindas ao Mandriva 2011!

Publicado em Mandriva Linux | Comentários desativados

O Mandriva 2011 está quase pronto!

Retirado do blog oficial da mandriva

Publicado em 23 de agosto de 2011 por Izabella

As notícias de hoje são ótimas. E para provar isso decidi postar uma foto do quadro de notas da sala de desenvolvimento principal.

Como vocês podem ver, os pontos vermelhos marcam a reta final…

Lembrem-se, a nossa ISO de teste mais recente, pode ser baixada aqui

Nota originalmente postado em inglês por multik

Publicado em Dicas em geral, Mandriva Linux | Com a tag , , , | Comentários desativados

O Mandriva 2011 está na linha final!

Retirado do blog oficial da Mandriva

Hoje, conforme prometido na sexta, nós temos duas grandes notícias.

Primeiro, Oden Eriksson atualizou todos os php stack dos repositoritórios do Mandriva 2011. E mais de 100 pacotes foram refeitos. Ótimo trabalho Oden!

Em segundo lugar, nós deixaremos o Mandriva 2011 no Kernel 2.6.38. Sim, o Kernel não é tão moderno, mas é estável. E para aqueles que precisam de kernel “mais moderno”, nós faremos dois adicionais com ISOs, de “teste” com o Kernel 2.6.39 e não-oficiais com o Kernel 3.0 da MIB. Estas ISOs, serão colocadas perto da oficial.

Lembrem-se, a nossa última ISO de teste pode ser baixado  aqui.

Nota postada originalmente em inglês por multik

Publicado em Mandriva Linux | Com a tag , , , | 3 comentários

Entrevista com Eugeni Dodonov

Publicamos na semana passada a entrevista com Eugeni Dodonov, gerente de desenvolvimento da Conectiva no blog Cotidiano Linux.

Ia comentar antes, mas tive problemas de tempo. É muito bom ver essas mudanças todas na Mandriva, com ferramentas mais organizadas e ambientes independentes. Os softwares mudando para o modelo de 3 camadas parece tardio, mas infelizmente a maioria do que existe hoje ainda é duro e específico.
A mudança para o Network Manager é excelente, ja estou ficando perdido quando uso o 2010.2. Outras mudanças que eu gostei são referentes ao ambiente de trabalho ROSA. Muito bonito e funcional. Claro que algumas coisas precisam ser melhoradas ainda, mas o sistema está evoluindo de forma muito rápida.
Tenho expectativas muito boas em relação ao MCC que ainda não está pronto mas que acredito que vá estar até a versão final.
Boas também são as notícias em relação à app store e outras que a empresa divulgou recentemente (novo build system, parcerias com sistemas nas nuvens, MES5). É uma pena que não tenhamos ainda notícias sobre as versões Power Pack, mas temos uma versão de instalação completíssima e a possibilidade de compra de suporte estendido. Acho que nunca quis tanto usar uma versão final como essa do Mandriva 2011. Parabéns sincero ao Eugeni e a todos os desenvolvedores da Mandriva. No próximo RC lanço uma visão de usuário sobre o sistema. Aguardem.

Link para a entrevista: http://cotidianolinux.com.br/entrevista-com-eugeni-dodonov-gerente-de-desenvolvimento-da-conectiva/

Publicado em Dicas em geral, Mandriva Linux | Com a tag , , , , , | Comentários desativados

Mandriva 2011 RC1 está à porta

… e esperando para ser lançado em algumas horas.

Foi postado pelo Eugeni no Blog Oficial da Mandriva em Inglês o anúncio, segue o texto abaixo:

——————————————————————————————-

Mandriva 2011 RC1 is at the door..
Posted on June 29, 2011 by Eugeni Dodonov

..and waiting to be released in the coming hours!

as promised some weeks ago, we told you that Mandriva 2011 RC1 should be expected this week. The images are built and are undergoing an internal testing right now, and unless any critical issues are discovered, they will be pushed to the mirrors in the coming hours!

Those additional testings for RC1 images before their release to the mirrors was intended in order to certify that the final changes for the RC-stage of Mandriva 2011 release, containing the (almost) final UI and Desktop experience, do not result in any unexpected issues. The ones following us on cooker and changelog mailing lists have noticed that there was a huge number of changes between Mandriva 2011 beta3 and RC1, and we want to make sure that you will have the most adequate experience with this first release candidate.

To give you a preview of what to expect in Mandriva 2011 RC1, the following items (in no particular order) are worth of notice in this release:

- integration of (almost) final UI, new login manager, desktop themes, plasma widgets, icons, backgrounds, splash screens, launcher, boot screens and desktop settings developed by ROSA Labs
- initial version of Mandriva Sync and Sphere helpdesk clients, developed by ROSA Labs
- new version of Improver testing application, developed by ROSA Labs
- firefox 5.0, together with optionally installable beta and aurora versions
- x.org server 1.10.2 with most up-to-date video and input drivers
- mesa 7.10.3 and libdrm 2.4.26 for most up-to-date 3D experience
- pidgin 2.9.0
- kdepim 4.6.0 fully integrated into KDE
- OpenStack packages integrated into cooker
- iptables 1.4.11.1
- chromium browser 12 and 13 (unstable) available for installation
- updated gfxboot which should improve booting process on some uncommon hardware
- wireshark 1.6.0
- new mandriva-control-center based on QT, integrated into KDE system settings
- vlc 1.1.10
- shotwell 0.10.1
- clementine 0.7.1
- latest grub2 available in contrib for the ones willing to test it
- opera 11.50
- samba 3.5.9
- gcc 4.6.1
- octave 3.4.2
- git 1.7.6
- rsyslog 5.8.2
- ffmpeg 0.7.1
- kdevelop 4.2.3
- wine 1.3.23
- horde 3.3.11
- sqlite 3.7.7
- pulseaudio 0.9.23
- coreutils 8.12
- python 2.7.2
- blender 2.58
- thunderbird 3.1.11
- drizzle 2011.06.19
- systemd 29
- hugin 2011.0.0
- webkit 1.4.1

Among many other updated packages available both on the main media and in the repositories. Once again, we would like to thank the community for this amazing work – most of those changes were done by you, and we cannot thank you enough for that!

So, hold your breath and in some hours you will be able to see it all for yourselves.

——————————————————————————————

Aguardemos! Eu soube que está lindo.

Replicado de http://www.mandrivabrasil.org/site/forum/index.php?topic=12931.0

Update: as isos já estão em: ftp://distrib-coffee.ipsl.jussieu.fr/pub/linux/MandrivaLinux/devel/iso/2011/

Publicado em Dicas em geral, Mandriva Linux | Comentários desativados

Post Rápido – instalar Firefox 5 no Mandriva (e outros linux)

Post bem rápido só pra direcionar quem não sabe o que fazer pra instalar o firefox 5 no Mandriva e outros linux. Caso sua distro trabalhe com “sudo” substitua “su” por “sudo su” quando solicitado. Para proceder a instalação faça o seguinte (Veja sua arquitetura):

32 bits:

Baixe o firefox 5 do site da Mozilla:

wget ftp://ftp.mozilla.org/pub/firefox/releases/5.0/linux-i686/pt-BR/firefox-5.0.tar.bz2

Descompacte no seu diretório corrente:

tar -xjvf firefox-5.0.tar.bz2

Agora vamos mover o diretório, você PRECISA ESTAR COMO ROOT

su

Caso sua distro use sudo:

sudo su

Agora como root mova o diretório do firefox para o diretório “opt” que é usado em geral para programas fora do ciclo oficial da distro e alternativos (skype, LibreOffice, etc)

mv firefox/ /opt/

Agora mova o executável corrente do firefox para um backup, apenas por garantia caso algo dê errado:

mv /usr/bin/firefox /usr/bin/firefox_old

Agora crie um link do executável do novo firefox no diretório de binários:

ln -s /opt/firefox/firefox /usr/bin/

Só falta linkar os plugins:

ln -s /usr/lib/mozilla/plugins/ /opt/firefox/

Pronto. É pra funcionar.

64 bits:

Baixe o firefox 5 do site da Mozilla:

wget ftp://ftp.mozilla.org/pub/firefox/releases/5.0/linux-x86_64/pt-BR/firefox-5.0.tar.bz2

Descompacte no seu diretório corrente:

tar -xjvf firefox-5.0.tar.bz2

Agora vamos mover o diretório, você PRECISA ESTAR COMO ROOT

su

Caso sua distro use sudo:

sudo su

Agora como root mova o diretório do firefox para o diretório “opt” que é usado em geral para programas fora do ciclo oficial da distro e alternativos (skype, LibreOffice, etc)

mv firefox/ /opt/

Agora mova o executável corrente do firefox para um backup, apenas por garantia caso algo dê errado:

mv /usr/bin/firefox /usr/bin/firefox_old

Agora crie um link do executável do novo firefox no diretório de binários:

ln -s /opt/firefox/firefox /usr/bin/

Só falta linkar os plugins:

ln -s /usr/lib64/mozilla/plugins/ /opt/firefox/

Pronto. É pra funcionar.

Publicado em Dicas em geral, Mandriva Linux | Com a tag , , , , | 4 comentários