segunda-feira, 31 de outubro de 2016

Atualizar Sublime Text 3 no Linux Mint Debian


Caso você esteja tentando atualizar uma nova versão do Sublime, usando o Instalador de Pacotes e não está conseguindo, vai uma dica rápida:

Pela linha de comando, vá até o diretório que está o pacote.deb e entre com o comando:
$ sudo dpkg -i sublime-text_build-3xxx_amd64.deb

terça-feira, 23 de agosto de 2016

Formatar pendrive no NTFS usando Linux

Pelo linux, acesse o terminal e entre com o seguinte comando:
sudo mkntfs
Caso não tenha essa ferramenta instalada, instale-a digitando:
$sudo apt-get install ntfsprogs
Verifique a partição de sua pendrive:
sudo fdisk -l
A saída será similiar a essa:
$ sudo fdisk -l

Disk /dev/sda: 223.6 GiB, 240057409536 bytes, 468862128 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: BE38E239-B337-4CD5-BEC8-66F1E43FC9B3

Device         Start       End   Sectors   Size Type
/dev/sda1       4096    589823    585728   286M EFI System
/dev/sda2     591872  17778687  17186816   8.2G Linux filesystem
/dev/sda3   17778688 324978687 307200000 146.5G Linux filesystem
/dev/sda4  324978688 468860927 143882240  68.6G Linux filesystem

Disk /dev/sdb: 14.7 GiB, 15724707840 bytes, 30712320 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1  *     2048 30711807 30709760 14.7G  c W95 FAT32 (LBA)
Veja que no meu sistema a pendrive foi montada em /dev/sdb1, certifique-se corretamente aonde será montada a sua. Tenha certeza para que ocorra nenhum acidente e apague uma partição errada.

Agora iremos desmontar a pendrive antes de iniciar a formatação.
$sudo umount /dev/sdb1
Feito isso, iremos formatar a pendrive com o sistema de arquivos NTFS. Usarei o mkntfs, e antes que pergunte porque não o comando mkfs.ntfs é porque esse último é um link para o primeiro, veja:
$ locate mkfs.ntfs /sbin/mkfs.ntfs /usr/share/man/man8/mkfs.ntfs.8.gz $ ll /sbin/mkfs.ntfs lrwxrwxrwx 1 root root 6 May 26 2015 /sbin/mkfs.ntfs -> mkntfs*
Com o comando mkntfs usarei as seguintes flags:
-f, --fast Perform a quick format -v, --verbose Verbose execution -L, --label STRING Set the volume label
Explicando:

-f  para formatação rápida (quem usa ou já usou Windows sabe do que estou falando)
-v  para exibir na tela o passo a passo de todo o processo de formatação
-L para dar nome ao pendrive

Vamos ao comando propriamente dito:
$ sudo mkntfs -f -v -L minha_pendrive /dev/sdb1 Cluster size has been automatically set to 4096 bytes. Creating NTFS volume structures. Creating root directory (mft record 5) Creating $MFT (mft record 0) Creating $MFTMirr (mft record 1) Creating $LogFile (mft record 2) Creating $AttrDef (mft record 4) Creating $Bitmap (mft record 6) Creating $Boot (mft record 7) Creating backup boot sector. Creating $Volume (mft record 3) Creating $BadClus (mft record 8) Creating $Secure (mft record 9) Creating $UpCase (mft record 0xa) Creating $Extend (mft record 11) Creating system file (mft record 0xc) Creating system file (mft record 0xd) Creating system file (mft record 0xe) Creating system file (mft record 0xf) Creating $Quota (mft record 24) Creating $ObjId (mft record 25) Creating $Reparse (mft record 26) Syncing root directory index record. Syncing $Bitmap. Syncing $MFT. Updating $MFTMirr. Syncing device. mkntfs completed successfully. Have a nice day.
Terminado o processo é só checar sua pendrive.

Caso tenha problemas ao usar a pendrive no linux, e receba uma mensagem tal como essa:
NTFS is either inconsistent, or there is a hardware fault, or it's a
SoftRAID/FakeRAID hardware. In the first case run chkdsk /f on Windows
then reboot into Windows twice. The usage of the /f parameter is very
important! If the device is a SoftRAID/FakeRAID then first activate
it and mount a different device under the /dev/mapper/ directory, (e.g.
/dev/mapper/nvidia_eahaabcc1). Please see the 'dmraid' documentation
for more details."
Proceda dessa forma:
$ sudo apt-get install ntfs-3g
$ sudo ntfsfix /dev/sdb1
Lembrando que nesse caso minha pendrive foi montada em /dev/sdb1, certifique o local em que sua pendrive foi montanda com o comando fdisk -l.

That's all folks!








quinta-feira, 18 de agosto de 2016

Minha experiência com a iZettle


Vou reportar o que aconteceu comigo hoje, 18 de Agosto de 2016, e aproveitar para elogiar os serviços prestados pela iZettle.

Quando minha esposa precisou de um leitor de cartão, para usar em seu salão de cabelereiro, fiz uma vasta pesquisa das opções que tinha na atualidade, e em um blog, que já não me recordo qual, conheci essa leitora. Achei as taxas que empregava, ainda emprega, muito competitivas, além de  ser um aparelho bonito. O valor para aquisição era bom e bem parcelado, fiz em 12 vezes, e pasmem, isso tudo em 2014 e ainda hoje, 2016, continua com a mesma facilidade e preço.

Sua usabilidade cai bem ao meu gosto. Simplicidade, essa a palavra que mais descreve os serviços da iZettle. Com seu cadastro, acessando via browser, tem-se a visão de uma interface minimalista, objetiva e agradável. Você terá acesso aos seu extrato de transações, configuração de conta bancária, que pode ser alterada a qualquer momento (desde que seja uma conta bancária com o mesmo CPF do cadastro), e há também a opção de configurar o comprovante que é enviado ao cliente por email. Enfim, muita praticidade, que é justamente o que precisamos para os dias de hoje.

Bom, vamos ao foco desse artigo...

Usando mais de um cadastro para a mesma leitora


Minha esposa tinha a necessidade de que suas transações caissem em sua conta bancária. Como de ínicio fui eu que comprei a leitora e criei meu cadastro, usando meu CPF, não podia usar uma conta bancária dela, já que os CPFs são diferentes. Houve então, a necessidade de trocar o cadastro para os dados dela. Não encontrei no site iZettle nada que ajudasse nessa questão, e foi então que abri uma solicitação via email para eles.

Eis minha solicitação:


"Senhores, diante do fato de não conseguir cadastrar a conta bancária de minha esposa para os créditos, gostaria de solicitar a transferência de propriedade de minha máquina iZettle para o cadastro dela."

Resposta da iZettle:

"Lucio, em relação à sua dúvida enviada no e-mail anterior, informamos que não é possível alterar a titularidade de um cadastro. Sendo assim, se sua esposa passará à utilizar o Leitor, ela deve realizar o próprio cadastro dela informando dados pessoais e bancários, para que os depósitos caiam na conta da mesma. As vendas feitas no cadastro vinculado ao seu CPF, serão depositado somente na sua conta. Pois não efetuamos depósitos em contas de terceiros, somente na conta vinculada ao CPF do titular cadastrado."


Como nem tudo são flores, abro aqui um parênteses para reclamar do atendimento. As perguntas levam um dia para serem respondidas e ainda são evasivos.


Com a resposta que tive, levei um tempo para processar o que de fato era visível!

"A leitora de cartão não é vinculada a uma conta."

Pesquisei muito para encontrar essa resposta e é exatamente isso! Bastou criar um cadastro em nome na minha esposa, com a conta bancária dela. Em seguida ela configurou o aplicativo da iZettle com esse novo cadastro. A leitora vai usar o cadastro que estiver em operação no momento. Assim prova que de fato ela não é vinculada a um cadastro, ela apenas faz a leitura do cartão e processa com o cadastro que está configurado o aplicativo em uso no momento. 

Dessa forma, tenho em meu celular o aplicativo com meu cadastro e ela, com seu celular, o aplicativo com os dados dela.

E viva a liberdade de escolha!!!

segunda-feira, 8 de agosto de 2016

Adobe Brackets no LMDE2


Seguem orietações e dicas para instalação do Brackets no Linux Mint Debian Edition 2:

1. Baixe o pacote .deb do Brackets aqui

2. Vamos verificar as dependências do pacote .deb

dpkg -I Brackets.Release.1.7.64-bit.deb
(Esse é o pacote que está disponível no momento em que escrevo esse artigo)
(Esse é o pacote que está disponível no momento em que escrevo esse artigo)
Possivelmente terá problemas com a dependência libgcrypt11, mesmo você tendo a libgcrypt20 em seu sistema. Foi o que aconteceu comigo e com muitas outras pessoas, como pude ver pelos fóruns.

Para instalar a libgcrypt11 você precisará de outra dependência, a libgpg-error. Verifique se você a tem em seu ambiente:
dpkg -l | grep libgpg-error
Caso não tenha, vamos começar por ela.


Instalando a libgpg-error

Faça o download do pacote .bz2 por aqui.

Descompacte o pacote

tar xvjf libgpg-error-1.9.tar.bz2
(Neste exemplo estou usando a versão 1.9 da libgpg-error, certifique se não há uma versão mais nova e use-a)

Feita a descompactação vamos à instalação da lib

./configure
sudo make
sudo make install
(Execute um comando por vez, e verifique se houve algum erro antes de executar o próximo)

Certo, feito a instalação da libgpg-error voltemos para a instalação da libgcrypt11.

Instalando a libgcrypt11

Faça o download da libgcrypt11 por aqui.
No momento em que escrevo esse artigo o pacote disponível foi o libgcrypt11_1.5.0-5+deb7u4_amd64.deb.

Instale o pacote .deb

sudo dpkg -i libgcrypt11_1.5.0-5+deb7u4_amd64.deb

Dando tudo certo agora vamos ao prato principal, a instalação do Adobe Brackets


Instalando o Bracktes

sudo dpkg -i Brackets.Release.1.7.64-bit.deb
Pacote instalado com sucesso abra o editor e divirta-se!


Segue algumas extensões que acho bem úteis:



Para quem gosta de temas escuros, recomendo o tema Nova Dark.



quarta-feira, 27 de julho de 2016

Instalando MongoDB 3.2 no Linux Mint Debian Edition


Passo a passo seguindo as orientações do site do Mongo: link


1. Importar a chave pública usada pelo sistema de gerenciamento de pacotes

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

2. Adicione o repositório do MongoDB 3.2 no sourcelist do seu sistema

echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.2 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

3. Atualize a lista de pacotes dos repositórios

sudo apt-get update

4. Instale  os pacotes do MongoDB

4.1 Para instalar a última versão estável do MongoDB

sudo apt-get install -y mongodb-org

4.2 Para instalar uma versão específica

sudo apt-get install -y mongodb-org=3.2.8 mongodb-org-server=3.2.8 mongodb-org-shell=3.2.8 mongodb-org-mongos=3.2.8 mongodb-org-tools=3.2.8

5. Verifique o status do serviço do mongod

O daemon do MongoDB tem o nome de mongod e pode ser verificado em /etc/init.d/mongod
sudo service mongod status
Caso o serviço esteja parado, inicie-o
sudo service mongod start
Por padrão os arquivos do mongo ficam em /var/lib/mongodb e o log em /var/log/mongodb

Caso queira alterar os caminhos, modifique em /etc/mongod.conf
Veja em systemLog.path e storage.dbPath para maiores informações.

6. Entre no shell do mongo

mongo

Para sair

Entre com o comando quit() no shell do mongo ou Ctrl + c
> quit()

Aviso do transparent_hugepage

Caso recebe o seguinte aviso ao entrar no shell do mongo, siga as orientações propostas no site do mongoBD. Fonte: link

** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
**        We suggest setting it to 'never'

1. Crie o seguinte script no /etc/init.d

sudo vim /etc/init.d/disable-transparent-hugepages

2. Cole o seguinte conteúdo no script

#!/bin/sh
### BEGIN INIT INFO
# Provides:          disable-transparent-hugepages
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    mongod mongodb-mms-automation-agent
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description:       Disable Linux transparent huge pages, to improve
#                    database performance.
### END INIT INFO

case $1 in
  start)
    if [ -d /sys/kernel/mm/transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/transparent_hugepage
    elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/redhat_transparent_hugepage
    else
      return 0
    fi

    echo 'never' > ${thp_path}/enabled
    echo 'never' > ${thp_path}/defrag

    unset thp_path
    ;;
esac

3. Torne o script executável

sudo chmod 755 /etc/init.d/disable-transparent-hugepages

4. Configure o iniciar o script no boot do sistema

Para Debian/Ubuntu:

sudo update-rc.d disable-transparent-hugepages defaults

Para SUSE:

sudo insserv /etc/init.d/disable-transparent-hugepages

Para Red Hat, CentOS, Amazon Linux, and derivatives:

sudo chkconfig --add disable-transparent-hugepages


Para remover o MongoDB


1. Pare o serviço do mongod

sudo service mongod stop

2. Remova os pacotes

sudo apt-get purge mongodb-org*

3. Remova os diretórios dos arquivos do MongoDB

sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongodb





quarta-feira, 20 de julho de 2016

Criar usuário no MySql

Para criar um novo usuário no MySql proceda da seguinte forma:

- Faça o acesso a área do MySql.

$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43
Server version: 5.5.49-0+deb8u1 (Debian)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

- Agora pelo shell do MySql vamos criar o novo usuário.

mysql> CREATE USER 'novousuario'@'localhost' IDENTIFIED BY 'pass';
Query OK, 0 rows affected (0.00 sec)

- Vamos dar permissão total ao novo usuário.

mysql> GRANT ALL PRIVILEGES ON * . * TO 'novousuario'@'localhost';
Query OK, 0 rows affected (0.00 sec)

- Pronto, agora é só carregar os privilégios do novo usuário.

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

Repita o processo para o mesmo usuário para caso ele precise acessar remotamente a base. Para isso use 'novousuario'@'%' no lugar de 'novousuario'@'localhost'.

quinta-feira, 19 de maio de 2016

Apache + PHP + Virtual Host


Vi como grande vantagem vhosts em meus projetos PHP, sendo uma excelente forma de criar subdominios para cada projeto e evitar riscos de varreduras indesejadas a outros sistemas no diretório padrão do apache.
Suponhamos que o domínio para o sistema seja subdominio.dominio.com.br

Podemos usar o diretório padrão do apache ou outro, como por exemplo /srv/www, fique ao seu critério.

Estou tomando como base a estrutura de diretórios do Debian, sistema operacional que uso.

Em /var/www:

$ sudo mkdir subdominio.dominio.com.br 

Em /etc/apache2/sites-available:

$ sudo vim subdominio.conf 

Dentro de subdominio.conf cole:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
ServerName subdominio.dominio.com.br
        DocumentRoot /home/lucio/sites/subdominio.dominio.com.br
        <Directory /home/lucio/sites/subdominio.dominio.com.br/>
                Options Indexes FollowSymLinks MultiViews Includes ExecCGI
                AllowOverride All
                Order allow,deny
                allow from all
                Require all granted
            AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/subdominio.dominio.com.br.error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/subdominio.dominio.com.br.access.log combined
</VirtualHost>

Veja que coloquei em Document Root e Directory o seguinte diretório:
/home/lucio/sites/subdominio.dominio.com.br

Criei um diretório sites, e dentro dele crio links simbólicos das minhas vhosts. Isso é um capricho meu, apenas para organização. Fica como sugestão, mas caso não queira pode colocar o caminho real do projeto.


Após toda configuração, entre com os comandos:

$ sudo a2ensite subdominio.conf 
$ sudo service apache2 restart 


That's all folks!

sexta-feira, 15 de abril de 2016

Cannot set LC_ALL to default locale: No such file or directory


lucio@workstation:~$ locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=pt_BR.UTF-8
LC_TIME=pt_BR.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=pt_BR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=pt_BR.UTF-8
LC_NAME=pt_BR.UTF-8
LC_ADDRESS=pt_BR.UTF-8
LC_TELEPHONE=pt_BR.UTF-8
LC_MEASUREMENT=pt_BR.UTF-8
LC_IDENTIFICATION=pt_BR.UTF-8
LC_ALL=

Para corrigir essa mensagem de erro no Debian, execute os seguintes comandos:

$ locale-gen en_US en_US.UTF-8 pt_BR.UTF-8
$ dpkg-reconfigure locales

Após isso, faça o login novamente e execute o comando locale para certificar de que foi o problema foi corrigido.

Até!

sábado, 9 de abril de 2016

Legendas .srt + Smart TV Sony Bravia + interrogações


Se você está tendo problemas de legendas com sua TV Sony Bravia, e ao invés de aparecer os textos aparecem interrogações (????), fique tranquilo pois é fácil de resolver esse problema.

Com toda certeza, seu arquivo de legenda (.srt) não está com a codificação correta. A codificação certa tem que ser a Unicode Big Endian, em outras palavras UTF-16 BE.

Eu usei o Sublime Text para mudar a codificação. Simplesmente fui em File >> Save with Encoding >> UTF-16 BE .  

Pronto, volte lá para sua TV e bom filme!

quinta-feira, 3 de março de 2016

PHP + MySQL blob fields and UTF-8

I had problems with graphic accentuation using a blob field in MySQL. When I was a select, the accentuation was not recognized by PHP, but in the others fields, like VARCHAR, CHAR or TEXT were recognized.

The solution was use the PHP function utf8_encode.

 $query = mysql_query("SELECT blob_field FROM table");  
 $arr = mysql_fetch_array($query);  
 echo $arr['field'];  
 >> m�e  
 echo utf8_encode($arr['blob_field']);  
 >> mãe  


segunda-feira, 22 de fevereiro de 2016

Python and Google Gmail API


Hi guys, I will try write this post in english, sorry about some erros, cause I'm studying and improving bit a bit.

Firstly, let me tell you what I intended to do. I'd like built a bot to monitor prices in some sites, if the bot find prices that wourthwhile it send me an email. I could do this using smtplib library, see below:

 import smtplib  
 gmail_user = 'emailFrom@gmail.com'  
 gmail_pwd = 'emailFrom@gmail.com password'  
 FROM = 'emailFrom@gmail.com'  
 TO = ['emailTo@gmail.com'] #recipient if type(recipient) is list else [recipient]  
 SUBJECT = 'subject text'  
 TEXT = 'body text'  
 # Prepare actual message  
 message = """\From: %s\nTo: %s\nSubject: %s\n\n%s""" % (FROM, ", ".join(TO), SUBJECT, TEXT)  
 try:  
     server = smtplib.SMTP('smtp.gmail.com', 587)  
     server.ehlo()  
     server.starttls()  
     server.login(gmail_user, gmail_pwd)  
     server.sendmail(FROM, TO, message)  
     server.close()  
     print 'Successfully sent the mail to emailTo@gmail'  
 except:  
     print 'Failed to send mail'  

But, you need enable access for less secure apps. I didn't like to do this, feeling me unsafe and I would want to use what the Google recomends, and I went study how could use the Google API for Gmail.

I started following the process step by step, as this tutorial Google asks to do. The quickstart script inside this tutorial enable you only read emails, not send or make other things. When I tried to send an email I received this answer:

HttpError 403 when requesting https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "Insufficient Permission"

Reading many forums looking for the answer to that message that I could know what was happening.

Note that in quickstart.py, at the line SCOPES = 'https://www.googleapis.com/auth/gmail.readonly', makes it the only permission is for reading, for another thing you do not have permission.


Here begins the purpose of this post !!!


For it works, follow the steps...

In your Google Developers Console, click in Credentials >> Create credentials and choice OAuth client ID. Check de option Other and put any Name, like gmail. Click Create and click OK to dismiss the resulting dialog. Click the to download (Download JSON) button to the right of the client ID and move this file to your working directory and rename it gmail.json.

Note that this step is very similar to Google tutorial.

Now, following the script to send e-mail, it is a mix between quickstart.py and other Google script:


 import httplib2  
 import os  
 from httplib2 import Http  
   
 from apiclient import discovery  
 from apiclient import errors  
   
 import oauth2client  
 from oauth2client import client  
 from oauth2client import tools  
   
 import base64  
 from email.mime.audio import MIMEAudio  
 from email.mime.base import MIMEBase  
 from email.mime.image import MIMEImage  
 from email.mime.multipart import MIMEMultipart  
 from email.mime.text import MIMEText  
 import mimetypes  
   
 try:  
   import argparse  
   flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()  
 except ImportError:  
   flags = None  
   
 # If modifying these scopes, delete your previously saved credentials  
 # at ~/.credentials/gmail-python-quickstart.json  
 SCOPES = 'https://mail.google.com/'  
 #SCOPES = 'https://mail.google.com/'  
 CLIENT_SECRET_FILE = 'gmail.json'  
 APPLICATION_NAME = 'Gmail API Python'  
   
   
 def SendMessage(service, user_id, message):  
     """Send an email message.  
   
     Args:  
         service: Authorized Gmail API service instance.  
         user_id: User's email address. The special value "me"  
         can be used to indicate the authenticated user.  
         message: Message to be sent.  
   
     Returns:  
         Sent Message.  
     """  
     try:  
         message = (service.users().messages().send(userId=user_id, body=message).execute())  
         print ('Message Id: %s' %message['id'])  
         return message  
     except errors.HttpError, error:  
         print ('An error occurred: %s' % error)  
   
   
 def CreateMessage(sender, to, subject, message_text):  
     """Create a message for an email.  
   
     Args:  
         sender: Email address of the sender.  
         to: Email address of the receiver.  
         subject: The subject of the email message.  
         message_text: The text of the email message.  
   
     Returns:  
         An object containing a base64 encoded email object.  
     """  
     message = MIMEText(message_text)  
     message['to'] = to  
     message['from'] = sender  
     message['subject'] = subject  
     return {'raw': base64.b64encode(message.as_string())}  
   
 def get_credentials():  
     """Gets valid user credentials from storage.  
   
     If nothing has been stored, or if the stored credentials are invalid,  
     the OAuth2 flow is completed to obtain the new credentials.  
   
     Returns:  
         Credentials, the obtained credential.  
     """  
     home_dir = os.path.expanduser('~')  
     credential_dir = os.path.join(home_dir, '.credentials')  
     if not os.path.exists(credential_dir):  
         os.makedirs(credential_dir)  
     credential_path = os.path.join(credential_dir, 'gmail-python-gmail.json')  
   
     store = oauth2client.file.Storage(credential_path)  
     credentials = store.get()  
     if not credentials or credentials.invalid:  
         flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)  
         flow.user_agent = APPLICATION_NAME  
         if flags:  
             credentials = tools.run_flow(flow, store, flags)  
         else: # Needed only for compatibility with Python 2.6  
             credentials = tools.run(flow, store)  
         print('Storing credentials to ' + credential_path)  
     return credentials  
   
 def main():  
     credentials = get_credentials()  
     http = credentials.authorize(httplib2.Http())  
     service = discovery.build('gmail', 'v1', http=http)  
   
     msg = CreateMessage('emailFrom@gmail.com', 'emailTo@gmail.com', 'subject', 'body email')  
     print SendMessage(service, 'me', msg)  
   
 if __name__ == '__main__':  
     main()  


When running for the first time this script opens a tab in your browser requesting permission for this new json. Next time do not need anymore.

I hope this helps, and if it did not work, talk to me.

May the force be with you!







quinta-feira, 11 de fevereiro de 2016

Converter kmv para mp4 no linux


Usando ffmpeg pode-se converter arquivos kmv para mp4 assim:

$ ffmpeg -i file.mkv -c:v copy -c:a copy file.mp4