Skip to content

Category Archives: windows

Analogias às propagandas da Microsoft na Linux Magazine

13-May-08

Eu estava debatendo hoje com o meu amigo Marcos Miklos no GTalk a respeito das propagandas da Microsoft na Revista Linux Magazine. Na opinião dele isso está completamente errado, uma vez que a Microsoft não apóia/pratica o Software Livre, e portanto a Linux Magazine não deveria permitir esse tipo de coisa… Eu não concordei e contra-argumentei:

Nesse caso é diferente, é como você entrar na torcida do Flamengo e dizer que o Vasco é o melhor… Não vai adiantar nada! Você só vai perder tempo (e dinheiro, no caso deles) e ainda correr um grande risco de ser enxovalhado. Deixa eles lá, financiando o linux, nem que seja somente a revista… é bom para a gente.

E então eis que surge a pérola:

Imagina você comprando uma Playboy, uma revista para homens, com mulheres nuas, e vendo uma propaganda da G Magazine com um homem mostrando o bilau e dizendo: “Venha para o lado rosa da força, é muito mais legal”.

Hahaha… Simplesmente sensacional a analogia!

Depois ele me disse que essa discussão já estava rolando há algum tempo na Comunidade Linux Brasil e que esse comentário foi feito pelo Gabriel Pnordico. Leiam a discussão porque vale a pena, está bem engraçada! Depois lendo o tópico na íntegra eu encontrei outra pérola como:

É como se você tivesse uma namorada e ela usasse uma camiseta dizendo que ama o padeiro da esquina

dita pelo Lord Heizel.

Django, download e o problema no Internet Explorer 7

09-May-08

Há pouco tempo atrás eu postei aqui no blog como forçar o download de arquivos com Django.

Na época eu havia testado o sistema em todos os navegadores que estavam ao meu alcance (Firefox, Iceweasel, Opera, Epiphany, IE6 e IE7) porém mesmo assim não precisou de muito tempo em ambiente de produção para me contactarem dizendo que o sistema não estava funcionando no IE7 (ué, como assim!? mas eu tinha testado isso!).

Testei novamente e então descobri que na verdade ele funcionava e não funcionava. Hm, ok… mas como assim!? Na verdade ele funcionava perfeitamente no IE7 do Windows 2003 Server, mas não funcionava em nenhum outro e eu dei o azar (ou sorte) de testar justamente nele… no Windows 2003 Server. Nos Windows com problemas (pleonasmo?) o erro que ocorria era o seguinte:

Internet Explorer was not able to open this Internet site.
The requested site is either unavailable or cannot be found. Please try again later.

Ok, um erro muito explicativo… Então vamos ao Google! Depois de muito procurar no Google sem encontrar nenhuma solução, um colega de empresa decidiu comparar os headers de uma aplicação escrita em .NET e que funcionava em qualquer IE, com os headers gerados pela minha aplicação. Chegamos a conclusão de que o problema estava no campo Vary, que aparecia nos headers do Django mas não existia no header da aplicação .NET.

A primeira idéia foi remover o campo manualmente, antes de retornar o response da página:


from django.http import HttpResponse, Http404
from os import path
import mimetypes

def index(request, file=''):
    abspath = path.join('/your/absolute/path', file)
    if not (file and path.exists(abspath)):
        raise Http404()
    mimetype, encoding = mimetypes.guess_type(abspath)
    if mimetype is None:
        mimetype = 'application/force-download'
    response = HttpResponse(open(abspath, 'r').read())
    response['Content-Disposition'] = 'attachment; filename=%s' % file
    response['Content-Type'] = mimetype
    response['Content-Length'] = str(path.getsize(abspath))
    del response['Vary']
    return response

* As linhas em negritos são as linhas que foram alteradas na solução inicial.

Mas não funcionou… O campo Vary continuava aparecendo e com o mesmo valor de antes. Lendo um pouco de documentação, descobrimos que essa diretiva não pode ser alterada diretamente no header da página e também qual era a forma correta de remover esse campo:


from django.views.decorators.cache import cache_control
from django.http import HttpResponse, Http404
from os import path
import mimetypes

@cache_control(private=True)
def index(request, file=''):
    abspath = path.join('/your/absolute/path', file)
    if not (file and path.exists(abspath)):
        raise Http404()
    mimetype, encoding = mimetypes.guess_type(abspath)
    if mimetype is None:
        mimetype = 'application/force-download'
    response = HttpResponse(open(abspath, 'r').read())
    response['Content-Disposition'] = 'attachment; filename=%s' % file
    response['Content-Type'] = mimetype
    response['Content-Length'] = str(path.getsize(abspath))
    return response

* As linhas em negritos são as linhas que foram alteradas na solução inicial.

Ok, agora sim! Tudo funcionando direitinho e em todos os (pseudo-)navegadores!

Como eu não achei nada na internet que ligasse esse problema aos campos Vary do header, acredito que esse post possa ajudar alguém mais que esteja passando pelo menos problema! :)

UPDATE: Em alguns casos a conexão terminava antes de ter baixado todo o arquivo. Esse é um problema do servidor, e para corrigi-lo basta definir a diretiva EnableSendfile do Apache como On. Com essa configuração, também houve uma melhora significativa na taxa de download do servidor (pelo menos no meu caso).

Modulo python para o modem D-Link 500G

11-Mar-08

No meu último post eu falei sobre como acessar via telnet a interface modo texto (aka CLI) do modem D-Link 500G. Para quem gosta de trabalhar no terminal só isso já é uma maravilha, porém essa descoberta tem algumas outras vantagens…

E se nós pudéssemos controlar/manipular o modem através de scripts? Isso sim seria legal… Mas como criar um shell script para interagir com telnet é um tanto quanto chato, eu criei um módulo python para fazer isso. Então seguindo os exemplos do posts passado, vamos ver como fazer a mesma coisa porém dessa vez através do módulo Python:

Imprimir o help

Observe que foram criadas constantes para os valores padrão de configuração do modem, portanto se você usa o aparelho da maneira como ele lhe foi entregue, provavelmente não precisará alterar nada no códgo abaixo.


#!/usr/bin/env python
# -*- coding: utf-8 -*-

from dlink500g import *

try:
    modem = DLink500G(DEFAULT_ADDRESS, DEFAULT_PORT)
    modem.connect(DEFAULT_USERNAME, DEFAULT_PASSWORD)
    print modem.command('help')
    modem.command('quit')
except Exception, ex:
    print 'Error:', str(ex)

Reiniciar o modem


#!/usr/bin/env python
# -*- coding: utf-8 -*-

from dlink500g import *

try:
    modem = DLink500G(DEFAULT_ADDRESS, DEFAULT_PORT)
    modem.connect(DEFAULT_USERNAME, DEFAULT_PASSWORD)
    modem.command('reboot')
except Exception, ex:
    print 'Error:', str(ex)

Código fonte

Abaixo está o conteúdo da primeira versão deste módulo, que provavelmente sofrerá alterações e/ou bugfixes, portanto para se você deseja obter uma versão mais atualizada acesse o código fonte disponível no meu repositório svn do Google Code.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# This module provides a python interface to D-Link 500G CLI.
#
# written by Arthur Furlan <arthur.furlan@gmail.com>

import re, telnetlib

# default configuration
DEFAULT_ADDRESS  = '10.0.0.1'
DEFAULT_PORT = 23
DEFAULT_USERNAME = 'admin'
DEFAULT_PASSWORD = 'admin'

class DLink500G:
    def __init__(self, address, port):
        self.address = address
        self.port = port
        self.connected = False

    def __del__(self):
        if self.connected:
            self.command('quit')
        self.telnet.close()

    def connect(self, username, password):
        self.telnet = telnetlib.Telnet(self.address, self.port)
        self.telnet.read_until('login: ')
        self.telnet.write("%s\n" % username)
        self.telnet.read_until('password: ')
        self.telnet.write("%s\n" % password)
        response = self.telnet.expect(['\$'], 5)
        if response[0] == -1:
            raise Exception('Login failed.')
        self.connected = True

    def command(self, cmd):
        if not self.connected:
            raise Exception('Not logged in.')
        self.telnet.write("%s\n" % cmd)
        self.connected = not (cmd == 'quit')
        if self.connected:
            response = self.telnet.read_until('$').replace('\r', '').split('\n')
            if re.match('^Error: ', response[1]):
                raise Exception(re.sub('^Error: ', '', response[1]))
            return '\n'.join(response[1:len(response)-1])

Sinta-se a vontade para enviar-me crítricas e/ou sugestões. :)

UPDATE1: Seguindo o “conselho” do Eduardo Willians, alterei a visibilidade dos atributos para público.

UPDATE2: Aproveitei o embalo para criar um projeto no Google Code, cuja a intenção é criar um pacote com módulos para vários dispositivos da D-Link que seguem a mesma linha. Lá você poderá encontrar as versões mais recentes desse módulo.

UPDATE3: Notícia divulgada também no br-linux.org

Acessando seu modem D-Link 500G pelo console

09-Mar-08

Quem tem modems da marca D-Link e modelo 500G já está acostumado a acessar sua interface web sempre que precisa acertar alguma configuração ou mesmo reiniciar o aparelho. Porém o que muita gente não sabe é que o mesmo modem também disponibiliza uma interface em modo texto (aka CLI) respondendo na porta 23, podendo ser acessada tanto pelo Windows como pelo Linux via telnet.

Em geral o modem vem configurado para responder no endereço 10.0.0.1, mas eu alterei a minha máscara de rede aqui em casa e utilizo o endereço 192.168.0.1. Portanto talvez você tenha que alterar os exemplos abaixo para conseguir conectar no seu modem.


$ telnet 192.168.0.1 23
    ...
login: <USUARIO>
password: <SENHA>
Login Successful
$

Caso você não saiba o usuário e senha do seu modem, o padrão é usuário admin e senha admin.
Depois de conectado, você tem acesso ao help que ajuda a enteder um pouco como funciona a aplicação:


$ telnet 192.168.0.1 23
    ...
login: <USUARIO>
password: <SENHA>
Login Successful
$ help
Command        Description
-------        -----------
alias          To Alias a command
apply          Apply configuration/image file
commit         Commit the active config to the flash
create         Create a new entry of specified type
delete         Delete the specified entry
download       Download a file on to the Device
exit           To exit the CLI shell
get            Display info for the search
help           Provides help
list           List files
modify         Modify information for specified entry
passwd         To modify user password
ping           The normal ping command
prompt         Change the user prompt
reboot         Reboot the device
remove         Remove file
reset          Reset info for the specified entry
size           ATM Sizing Information
traceroute     The normal traceroute command
trigger        To set trigger
unalias        To undefine previously defined alias
verbose        Switch ON/OFF the verbose mode

Quer saber como reiniciar o seu modem?


$ telnet 192.168.0.1 23
    ...
login: <USUARIO>
password: <SENHA>
Login Successful
$ reboot

E é isso ae… Agora brinquem com seus modems. :)

UPDATE1: Por fim eu acabei criando um módulo python para facilitar o gerenciamento do modem.

UPDATE2: Para aqueles que são clientes da Telemar, o Israel Pereira Costa disponibilizou nos comentários deste post algumas informações importantes sobre como acessar seu modem.

Engenharia social

05-Dec-07

Conversa com um amigo que cursa Ciência da Computação na UFPR junto comigo:

Amigo: cara
Amigo: c manja aonde configura a parada de abrir pdf no firefox?
Arthur Furlan: o que você quer configurar?
Amigo: tipo
Amigo: eu clico num pdf
Amigo: ele abre no browser
Amigo: mas não aparece nada
Arthur Furlan: é porque ele ainda não terminou de baixar o arquivo
Amigo: se eu esperar infinito n abre tbm
Amigo: se eu pegar e for em abrir arquivo e abrir um local aqui n abre tbm
Arthur Furlan: então é problema do plugin
Arthur Furlan: você usa windows?
Amigo: aham
Arthur Furlan: então é esse o problema
Arthur Furlan: hahaha… brincadeira!
Arthur Furlan: tenta desinstalar o plugin e reinstalar
Amigo: esse eh o problema, nem sei qual o plugin que faz isso
Arthur Furlan: digita isso na barra de endereços: about:plugins
Amigo: ok
Amigo: qq eu faço agora?
Arthur Furlan: vai em: Iniciar > Executar e dae digita: cmd
Amigo: ok
Arthur Furlan: agora digita: format \q C:
Amigo: ok
Amigo: caralho
Amigo: tah aparecendo aqui uma msg de que vai formatar o meu pc
Amigo: tah certo isso?
Arthur Furlan: ¬¬
Arthur Furlan: não cara…. eu tava te zuando
Amigo: =D