Um relatório do Escritório de Contabilidade do Governo Americano  (do inglês, US Government Accounting Office – GAO) destacou o perigoso estado da infraestrutura de TI do Tio Sam.

Três dos mais populares formatos de disquete: 8, 5¼ e 3½ polegadas.

Como um exemplo, o computador usado para coordenar a força nuclear americana é um IBM Series/1 que usa disquetes de 8 polegadas capazes de armazenar 80 KB de dados cada. Enquanto que o Departamento de Tesouro está calculando declarações fiscais em um Mainframe de 56 anos da IBM que usa programas escritos em Assembly. O departamento diz que não tem planos para atualizar o seu sistema.

IBM Series/1

No seu relatório, o GAO encontrou numerosos casos de hardware e software obsoletos. Alguns alertas do departamento de comércio utilizam sistemas em Fortran e possui computadores executando o Windows Server 2003 que não é mais suportado pela Microsoft.

O departamento de segurança nacional está usando um mainframe de 8 anos, o IBM System z10 usando Cobol para alguns sistemas pessoais, e o departamento de justiça também está usando um sistema feito na mesma linguagem para acesso ao seu principal banco de dados de presidiários.

IBM System z10

Vários dos sistemas apresentados pelo GAO serão substituídos em breve – as forças armadas americanas irão ter seu controle nuclear rodando em um servidor mais moderno até 2020, por exemplo – mas muitos dos departamentos relataram que não tem planos para realizar o atualização dos seus sistemas.

O governo americano gasta US$ 80 bilhões por ano em TI, 75% desse montante é usado para manter  os sistemas disponíveis e executando. O GAO relatou que encontrou que essa percentagem está aumentando, sendo 77% previstos para 2017, deixando menos recursos para novos sistemas que mais eficientes.

Para piorar as coisas, a geração de programadores e gurus de TI que podem manter esses sistemas ativos estão literalmente morrendo. Não existem muitos programadores de COBOL e Fortram existentes, e ninguém está aprendendo essas linguagens atualmente.

Traduzido de: http://www.theregister.co.uk/2016/05/25/us_nuclear_guidance_system_running_on_8inch_floppies/

Link para o relatório: http://www.gao.gov/assets/680/677454.pdf

 

Depois de um grande tempo em standby, eu retomei a minha busca pelo bot concurseiro. Resolvi tentar criar um bot bem simples (@RodrigoLiraBot no Telegram) só para testar a API do telegram.

bot

Para isso eu dei uma olhada no site do próprio Telegram . Nele eu encontrei um módulo para  Python chamada twx.botapi . Sua utilização é bem simples e por isso resolvi usá-la.

A instalação é usando o pip

$ sudo pip install twx.botapi

No próprio do github tem um exemplo que guiou o meu desenvolvimento.

from twx.botapi import TelegramBot, ReplyKeyboardMarkup

"""
Setup the bot
"""

bot = TelegramBot('')
bot.update_bot_info().wait()
print(bot.username)

"""
Send a message to a user
"""
user_id = int()

result = bot.send_message(user_id, 'test message body').wait()
print(result)

"""
Get updates sent to the bot
"""
updates = bot.get_updates().wait()
for update in updates:
    print(update)

"""
Use a custom keyboard
"""
keyboard = [
    ['7', '8', '9'],
    ['4', '5', '6'],
    ['1', '2', '3'],
         ['0']
]
reply_markup = ReplyKeyboardMarkup.create(keyboard)

bot.send_message(user_id, 'please enter a number', reply_markup=reply_markup).wait()

O API TOKEN é um token que é gerado polo BotFather na criação do Bot. Lembrando que isso é uma informação secreta do seu bot. O legal desse exemplo é que ele também mostra como o teclado do bot pode ser customizado para atender a um determinado bot.

Abaixo segue um exemplo de update que é retornado pela função get_updates(). Um update é uma interação com o bot. Ele contém a mensagem e o usuário que realizou a interação.

Update(update_id=194163476, message=Message(message_id=288, sender=User(id=31616677, first_name=u'Rodrigo Lira', last_name=None, username=u'rodrigoclira'), date=1458837621, chat=Chat(id=31616677, type=u'private', title=None, username=u'rodrigoclira', first_name=u'Rodrigo Lira', last_name=None), forward_from=None, forward_date=None, reply_to_message=None, text=u'teste', audio=None, document=None, photo=None, sticker=None, video=None, voice=None, caption=None, contact=None, location=None, new_chat_participant=None, left_chat_participant=None, new_chat_title=None, new_chat_photo=None, delete_chat_photo=None, group_chat_created=None, supergroup_chat_created=None, channel_chat_created=None, migrate_to_chat_id=None, migrate_from_chat_id=None), inline_query=None, chosen_inline_result=None)

No meu caso, eu modifiquei um pouco esse código para criar um bot que fica respondendo sempre a mesma mensagem independente do que foi escrito para ele. A cada 30 segundos, ele responde a quem falou com ele com uma mensagem determinada por mim.

Para evitar mensagens repetidas, eu coloquei uma funcionalidade que evita o envio de mensagem para o mesmo update. A cada resposta do bot é guardada os identificadores das mensagem que foram respondidas usando a biblioteca pickle de Python. Se por acaso o programa for encerrado, o arquivo será lido na sua inicialização. Essa foi a alternativa mais rápida que encontrei mas creio que haja formas melhores de contornar isso.

No momento esse script está sendo executando num servidor que tenho na Dreamhost, mas é possível executar ele em qualquer máquina que tenha acesso a internet. O código do final do @RodrigoLiraBot é o seguinte:


from twx.botapi import TelegramBot, ReplyKeyboardMarkup
from time import sleep
import pickle
from os import path

CURR_PATH = path.dirname(path.realpath(__file__))
DUMP_FILE = path.join(CURR_PATH, "data.pkl")


"""
Configurando o bot
"""

BOTAPI='API_AQUI'
bot = TelegramBot(BOTAPI)
bot.update_bot_info().wait()

print(bot.username)

if path.exists(DUMP_FILE): # Se existe, carregar a lista de mensagens respondidas
    pkl_file = open(DUMP_FILE)
    answered_messages = pickle.load(pkl_file)
else:
    answered_messages = []

bot_message = "Oi, eu sou um bot do http://blog.rodrigolira.net/. Em breve terei mais funcionalidades!"

while (True):
    print ("Getting updates".center(50, '-'))
    
    updates = bot.get_updates().wait()
    for pos, update in enumerate(updates):

        print(str(pos) +" "+  str(update) + "n")

        update_id = update.update_id
        if (update_id not in answered_messages): # Se a mensagem não foi respondida, responda o usuário
            sender_id = update.message.sender.id
            result = bot.send_message(sender_id, bot_message).wait()

            print(result)

            if (result):
                answered_messages.append(update_id)

    output = open(DUMP_FILE, 'wb') 
    pickle.dump(answered_messages, output) # persiste a lista de mensagens respondidas
    sleep(30)

Se você quiser usar com o seu bot simplesmente coloque o APITOKEN recebido na criação dele.
O resultado é algo assim:

bottelegram

| Criando um bot do Telegram (parte 1)
| Criando um bot do Telegram (parte 2)


Esse post não tem nada haver com maçonaria ou mitologia e essa imagem d”Olho que tudo vê” só está aí porque vou falar de algo preocupante que me deparei na semana passada. Fui surpreendido no último sábado com uma notificação diferente no meu celular. Para muitos poderia ser uma incrível funcionalidade, mas para mim foi uma invasão de privacidade. Esse post tenta alertar isso.

Bem… estava eu no aniversário da minha sobrinha fotografando o momento do parabéns, quando após algumas fotografias o Messenger para Android exibiu a seguinte notificação

 

Screenshot_2016-01-09-20-08-28
Calma lá! Como você sabe que essa Emanuelle tem interesse na foto? Pior, quem permitiu você olhar as minhas fotos? Os apoiadores da nova feature pode dizer que é um recurso comum no facebook, o reconhecimento facial, mas aqui é um pouco diferente. Quando você upa as imagens para o site você está concordando com tudo isso, mas eu estou no meu aparelho, usando um aplicativo de terceiro, câmera da motorola, e o facebook simplesmente vasculhou minhas fotos para me dizer que talvez alguém tenha interesse nessa foto que acabei de tirar. Não, não quero enviar foto para ninguém, nem quero que você saiba quem estão nas minhas fotos.

Imagina o poder que eles tem nas mãos,  agora é possível mapear a posição de qualquer um em real time. Saber com quem eu estava e quando isso ocorreu. Até quem não tem conta no facebook pode ser monitorado com essa funcionalidade. Já pensou?!

E essa imagem que surgiu nessa semana…

Eu imagino que se essa funcionalidade estivesse no celular do Sean Penn, ele estaria recebendo uma notificação e a NSA também! Brincadeiras a parte, eu acho que é um recurso extremamente invasivo e tem tudo para ser usado por entidades governamentais para rastrear pessoas. Como diria MoTrip,  Guten Morgen NSA!

Informações sobre o novo recurso PhotoMagic do Messenger:
http://www.techtudo.com.br/dicas-e-tutoriais/noticia/2016/01/como-usar-o-facebook-photo-magic-reconhecimento-facial-do-messenger.html

Passo a Passo para desabilitar esse recurso.

  • Nas configurações do app escolher “Fotos e Mídia”.

Screenshot_2016-01-11-16-58-53

  • Photo Magic

Screenshot_2016-01-11-16-59-04

  • Desmarcar o checkbox do “Photo Magic”

 

Screenshot_2016-01-11-16-58-24

Rodrigo Lira,

It is a repost. The original post is available on http://tex.stackexchange.com/questions/87650/dictionary-for-texstudio-no-dictionary-available

TeXStudio uses the OpenOffice spelling dictionaries (as well as thesaurus). You can download any number of them from the OpenOffice site. The OpenOffice files have the extension .oxt but are actually .zip files so just change the extension and extract the dictionary. You place the dictionary files in the Dictionary folder in your TeXstudio installation. The disctionary then appears in the list when you open the “Configure TeXstudio” under “Optons” in TeXstudio.EDIT: For weird reasons, the dictionaries link from the given link doesn’t work. Instead use the following link: List of dictionaries. So here is the steps:

  1. download your dictionary (.oxt)
  2. change the extension to .zip
  3. unzip the files in a folder
  4. In TeXstudio preference, under Spell Checking Dictionary, change the directory to the folder you put your dictionary in
  5. reset TeXstudio.
  6. You are all set!

http://extensions.openoffice.org/dictionaries

I didn’t changed the folder to the new dictionary folder, I just copied the new dictionary files (.aff and .dic) to the old folder. So I did:

cp -v pt_BR.* /usr/share/hunspell/

After that, I’ve reseted the TeXStudio and it worked!

Resolvi colocar um exemplo para demonstrar o funcionamento
do decorador @classmethod. Como se pode ver na execução,
nesse código, após chamar o método unpack, é criado um novo
objeto do tipo MinhaClasse.


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

class MinhaClasse:
    def __init__(self, raw, prev):
        print ("Criando a classe MinhaClasse")
        self.raw = raw
        self.prev = prev

    #Método estático unpack
    @classmethod
    def unpack(cls, raw, prev=None):
        print ("Tipo='%s' com o raw='%s' e prev='%s'" % (cls.__name__, raw, prev))
        return cls(raw=raw, prev=prev)

if __name__ == '__main__':
    MinhaClasse.unpack("raw content", "prev content") #Não precisa de instância, o método é chamado como o nome da classe
    #Não precisa informar o valor de cls porque implicitamente ele sabe que deve ser passado o tipo da classe, ou seja "MinhaClasse"

Rodrigo Lira,

Um amigo me mandou um email perguntando uma dúvida sobre um decorator de Python…

@classmethod
def unpack (cls, raw, prev=None):
  return cls(raw=raw, prev=prev)

Pode destrinchar isto para mim? classmethod é uma função built-in do Python. Significa que dentro do método eu substituo cls por classmetho?

Oi,

Segundo o que vi em algumas referências, o @classmethod
é igual ao @staticmethod, ambos são para definir um método estático dentro de uma classe[1][2]. Um método estático não é nada mais que uma função definida dentro de uma classe. Não precisa criar uma instância de uma classe para chamar ele.

Por exemplo, supondo essa classe:

class A:
    def __init__(self):
        pass

    def foo(self):
        pass

    @staticmethod
    def boo():
        pass

O método foo não é estático então deveria ser chamado a partir de uma instância:

obj = A()
# Chamando um método não estático a partir de uma instância
obj.foo()

#Chamando um método estático a partir de uma instância
obj.boo()

Já o método boo é estático então não precisa ser chamado de uma instância, mas pode ser, apesar que não seja uma boa prática.

obj = A()
# Chamando um método estático a partir de uma classe
A.boo()

# Chamando um método não estático a partir de uma classe
A.foo()
Traceback (most recent call last):
File "input", line 1, in
TypeError: unbound method foo() must be called with A instance as first argument
(got nothing instead)

Como pode ver, conseguimos chamar um método estático a partir da classe, mas não um não estático.

Voltando a @classmethod e @staticmethod… O decorador @staticmethod permite criar métodos estáticos e esses métodos não podem ser sobrescritos pelas subclasses. Ele é imutável.

Já os métodos com o decorador @classmethod permite criar métodos estáticos que podem ser sobrescritos pelas subclasses. Isto é porque o primeiro parâmetro das funções que tem o @classmethod tem que ser sempre cls (classe)[3].

Aparentemente esse método que você enviou é uma factory[4]. Métodos que são usados para criar instância de outras classes.

O exemplo que você me enviou:

   @classmethod
   def unpack (cls, raw, prev=None):
       return cls(raw=raw, prev=prev)

Segundo o que eu disse, cls é um tipo de classe e o método retorna uma instância dessa classe no qual é passado os outros dois parâmetros para o construtor dela.

Abraço.

[1] http://jfine-python-classes.readthedocs.org/en/latest/decorators.html
[2] http://stackoverflow.com/questions/12179271/python-classmethod-and-staticmethod-for-beginner
[3] http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python
[4] https://pt.wikipedia.org/wiki/Factory_Method

O meu último post sobre o Bot do Telegram mostrou minha ideia de criar um bot para ser utilizado como coletor de informações de concurso do site PCIConcursos. Desde daquele post não tive tempo livre para finalizar esse meu projeto particular. Contudo, eu consegui encontrar uma ferramenta que me ajudará na implementação desse projeto.

O objetivo desse post é apresentar o “import.io“, um site que  permite transformar uma web page em um repositório de dados. Acabei descobrindo-o visualizando uns slides sobre uma palestra de acesso a dados públicos, eu encontrei esse site.  A palestra a qual me refiro está aqui embaixo:

Bem, a mágica do import.io é transformar uma webpage com um certo padrão de visualização em uma fonte de dados. Então imagine criar uma api para acessar os posts do meu blog. Bem, só imagine porque com o import.io é bem simples. Inclusive, segue o link

https://magic.import.io/?site=http:%2F%2Fblog.rodrigolira.net%2F

Simples, não? Imagine a infinidade de sites que existem que podem ser facilmente exportados para uma API.

https://magic.import.io/?site=http:%2F%2Fwww.hardmob.com.br%2Fpromocoes%2Findex1.html

Você pode editar cada uma das colunas preestabelecidas pelo site. Abaixo segue uma imagem da interface de administração do site. Nesse caso, eu estou usando a url http://www.pciconcursos.com.br/ultimas

importio

Ainda no painel de administração, é possível escolher formas de acesso a base de dados criada.

importio2

No meu caso, eu pretendo que o bot utilize uma API. Por isso eu escolhi mostrar o “Simple API Integration”.  Utilizando o import.io, eu consegui gerar a seguinte fonte de dados para ser consumida (URL encurtada): https://goo.gl/lSgWIq . Através dela, o bot saberá me informar quais são os editais de concursos mais recentes.

Por enquanto, isso é tudo!

| Criando um bot do Telegram parte 3

 

Estava de passagem pelo hardmob e vi uma promoção interessante no qual um moto E 2ª G era vendido por $370 dilmas. Prontamente abri o site mas me deparei com $498,00.

DICA.: Clique na imagem e veja ela em uma nova janela.

motoe2g

Lendo alguns comentários, eu achei o seguinte procedimento, que permitia o aparecimento do desconto:

“Pra quem não está conseguindo:

1º Com o Chrome já aberto pressione CTRL + SHIFT + N (Incognito)
2º Aperte a tecla F12 e clique no ícone de um Smart na canto direito superior (Se estiver no note FN + F12)
3º Selecione APPLE IPAD, no canto esquerdo superior
4º Aperte F5 pra recarregar a página se não for automático
5º Calcule o frete e coloque o cupom

O valor do tópico é sem o frete, aqui deu 375,12″

Tentei reproduzir os passos no Firefox, sem sucesso. Até porque só depois de abrir o Chromium eu descobri o que seria esse tal ícone de um Smartphone.

Quando abri o Chromium, percebi que os passos descritos pelo usuário fazia com que fosse aberto as “Ferramentas de Desenvolvedor”.  Além disso descobri que o tal Smart era na verdade um Smartphone. Essa ferramenta do navegador do Google permitia emular a requisição de um determinado device.

Por exemplo, eu estou no meu notebook mas consigo fazer uma requisição me passando por um Ipad Mini. Essas informações são passadas na requisição http então não há nenhuma mágica aí, é uma relação de confiança entre o servidor e o browser.

Daí saquei a jogada.  Os e-commerces utilizam a informação do dispositivo do usuário para oferecer descontos.  Nós já sabemos que o histórico de busca e/ou cache de browser e/ou encaminhamento podem interferir no preço do produto, mas aqui o caso é diferente.

Modificando o dispositivo utilizado eu consegui um desconto de quase R$ 60,00. De fato não alcancei o mencionado no fórum, mas isso está relacionado a outras questões (duração da promoção, estoque… ).

Só pra exemplificar algumas requisições com diferentes dispositivos.(REPARE NO CAMPO “DEVICE” NO CANTO ESQUERDO SUPERIOR)

Comprando com um Galaxy SIII (R$ 438,24)

motoe2g4

Comprando com um Ipad Mini (R$ 438,24)

motoe2g2

Comprando com um Laptop com touchscreen (R$ 498,00)

motoe2g3

Fiz ainda algumas modificações com o tipo de conexão utilizada mas, como esperado, o preço do produto não depende disso.

Mais informações sobre a técnica utilizada podem ser encontradas no
https://en.wikipedia.org/wiki/Mobile_device_detection

RL

Apresentação criada para o curso de Android do Porto Digital.