Author: oraculum
Mascara de CPF para campos EditText no Android

Veja como fazer essa mascara ###.###.###-## no seu EditText
Veja a parte do código como fica:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | package lethus.socialdroid.core.widgets; import android.content.Context; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; import android.text.method.NumberKeyListener; import android.util.AttributeSet; import android.widget.EditText; public class CpfEditText extends EditText { private boolean isUpdating; /* * Maps the cursor position from phone number to masked number... 12345678912 * => xxx.xxx.xxx-xx */ private int positioning[] = { 0, 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14 }; public CpfEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initialize(); } public CpfEditText(Context context, AttributeSet attrs) { super(context, attrs); initialize(); } public CpfEditText(Context context) { super(context); initialize(); } public String getCleanText() { String text = CpfEditText.this.getText().toString(); text.replaceAll("[^0-9]*", ""); return text; } private void initialize() { final int maxNumberLength = 11; this.setKeyListener(keylistenerNumber); this.setText(" - "); this.setSelection(1); this.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { String current = s.toString(); /* * Ok, here is the trick... calling setText below will recurse * to this function, so we set a flag that we are actually * updating the text, so we don't need to reprocess it... */ if (isUpdating) { isUpdating = false; return; } /* Strip any non numeric digit from the String... */ String number = current.replaceAll("[^0-9]*", ""); if (number.length() > 11) number = number.substring(0, 11); int length = number.length(); /* Pad the number to 10 characters... */ String paddedNumber = padNumber(number, maxNumberLength); /* Split phone number into parts... */ String part1 = paddedNumber.substring(0, 3); String part2 = paddedNumber.substring(3, 6); String part3 = paddedNumber.substring(6, 9); String part4 = paddedNumber.substring(9, 11); /* build the masked phone number... */ String cpf = part1 + "." + part2 + "." + part3 + "-" + part4; /* * Set the update flag, so the recurring call to * afterTextChanged won't do nothing... */ isUpdating = true; CpfEditText.this.setText(cpf); CpfEditText.this.setSelection(positioning[length]); } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } }); } protected String padNumber(String number, int maxLength) { String padded = new String(number); for (int i = 0; i < maxLength - number.length(); i++) padded += " "; return padded; } private final KeylistenerNumber keylistenerNumber = new KeylistenerNumber(); private class KeylistenerNumber extends NumberKeyListener { public int getInputType() { return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; } @Override protected char[] getAcceptedChars() { return new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; } } } |
Veja a parte do XML como fica:
1 | <lethus.socialdroid.core.widgets.CpfEditText android:id="@+id/txtCpf" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" /> |
Mais informações sobre como implementar essa mascara consulte o artigo da mascara de telefone
Como descompactar arquivo .gz no Android

Você pode precisar carregar alguns arquivos na sua APP como por exemplo uma lista de todas as cidades e estados do brasil ou um banco com os ceps para isso você pode manter esses arquivos compactados em um arquivo .gz para não pessar muito na hora da instalação e dentro do projeto, daí na hora de fazer a instalação você descompacta esses arquivos na memoria e faz a inclusão deles no banco de dados principal.
No meu caso tenho um arquivo compactado chamado de municipios.gz, você pode colocar esses arquivos dentro da pasta ‘res’ do seu projeto aconselho criar uma sub-pasta chamada ‘raw’ e deixar esses arquivos lá.
Importante: Não sei porque mas a SDK do android acusa o arquivo ‘.gz’ como inexistente nesse caso é só você salvar o arquivo sem a extensão .gz depois de copiar para a pasta renomeie o mesmo no eclipse e tire a extensão. Fique tranquilo que de alguma forma a SDK sabe que ele é um .gz e vai descompacta-lo normalmente.
erro ao tentar acessar um arquivo com a extensão .gz na pasta res/raw
file 02-27 00:53:38.809: E/AndroidRuntime(399): Caused by: android.content.res.Resources$NotFoundException: File res/raw/municipios.gz from drawable resource ID #0x7f040001
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public JSONArray loadFile() throws IOException, JSONException { // pegando o arquivo gz da pasta res/raw e descompactando InputStream json = new GZIPInputStream( getHelper().getContext().getResources().openRawResource(R.raw.municipios)); // lendo o arquivo json e retornando um array StringBuilder builder = new StringBuilder(); BufferedReader reader = new BufferedReader( new InputStreamReader(json)); String line; while ((line = reader.readLine()) != null) { builder.append(line); } return new JSONArray(builder.toString()); } |
Nesse caso acima o arquivo que estava dentro do .gz era um json então precisava de retornar para a models um array em json, mas o importante para descompactar o arquivo é a linha:
1 | InputStream json = new GZIPInputStream(getHelper().getContext().getResources().openRawResource(R.raw.municipios)); |
Tive que colocar o getHelper e getContext pois o método de loadFile estava dentro da minha DAO, se você estiver usando o método GZIPInputStream de dentro de uma activity faça apenas:
1 | InputStream json = new GZIPInputStream(getResources().openRawResource(R.raw.municipios)); |
Nas linhas abaixo eu leio o arquivo json e salvo em uma StringBuilder para transforma-lo em um array, no caso acima ele descompacta o arquivo .gz e abre o arquivo json tudo dentro da memória do dispositivo.
Google Task via Desktop no Ubuntu

Eu usava antes o Wunderlist que até é uma boa app para Manager Task mas eu achava ele meio pesado para a minha necessidade, precisava de algo mais clean então resolvi usar o Google Task (Google Tarefas), veja como rodá-lo no seu linux em uma versão “desktop”
Para isso vamos precisar de ter o Chrome instalado na sua maquina se não tiver vá até a central de programas do ubuntu e mande instalar por lá, se tiver dúvida nesse processo veja aqui como fazer.
Depois é só você acessar pelo chrome essa url especial do Google Task >> https://mail.google.com/tasks/ig
Daí vamos fazer um atalho para ela no nosso desktop, clique em:
- Tools (ferramentas)
- Create applications shortcuts (criar atalho de aplicações)
<
p>
na tela seguinte deixe apenas “Desktop” marcada e não marque “Applications menu” ele vai salvar um arquivo no seu desktop abra esse arquivo no editor de texto de sua preferencia, por exemplo gedit e cole o texto abaixo.
#!/usr/bin/env xdg-open [Desktop Entry] Version=1.0 Name=Google Tarefas Exec=/usr/bin/chromium-browser --app=https://mail.google.com/tasks/ig Terminal=false X-MultipleArgs=false Type=Application Icon=/usr/share/icons/gtask.png Categories=Network;WebBrowser; StartupNotify=true StartupWMClass=mail.google.com__tasks_ig Name[en_US]=GTask |
você pode renomear o arquivo para um nome de sua preferencia eu usei GTask, mas isso fica a seu critério.
O campo Icon você vai indicar o caminho do ícone que você quer usar no app, se não tiver nenhum em mente use esse abaixo é só salvar essa imagens no seu pc e aplicar as permissões, mais a frente mostro como se faz isso no arquivo.
Você pode salvar essa imagem na pasta padrão de ícones do sistema que é onde eu coloquei o meu, lembrando que você deve copiar ele para lá como root (logo a seguir vou fazer um exemplo parecido com o arquivo que foi salvo pelo chrome)
Voltando ao nosso arquivo é só você pressionar ALT+f2 para abrir no ubuntu o run command ali você digita
gksu nautilus
ele vai abrir o nautilus em modo root só digitar a sua senha de root.
copie esse nosso arquivo com as configurações da app para essa pasta:
/usr/share/applications
Depois de copiar você precisa dar acesso a todos usuários a esse arquivo, clique com o botão direito sobre ele e vá em propriedades > permissions (permissões) e deixe conforme a imagem abaixo:
Faça essa atribuição de permissões no ícone e depois é só você digitar no dash GTask.
Veja ele funcionando logo abaixo:
FatRat melhor gerenciador de download para Ubuntu

Se está em busca de um bom gerenciado de Download para linux uma boa opção é o FatRat.
Open Source e escrito em C++ com QT4 ele é rico em recursos e é considerado um dos melhores gerenciadores de downloads para ubuntu. FatRat suporte quase todos os protocolos de download direto (HTTP / HTTPS), proxy, FTP, torrents, feed RSS e RapidShare.
- Segmentada * HTTP (S) / FTP downloads
- Imagens FTP
- Suporte para proxies HTTP e SOCKS5
- RSS feed apoio + funções especiais para programas de TV e podcasts
- Suporte BitTorrent (incluindo a criação de torrent, DHT, UPnP, criptografia, etc)
- Torrent search nos principais sites de torrent incl. The Pirate Bay, EZTV, BitTorrentMonster …
- RapidShare.com downloads grátis e premium
- Imagens RapidShare.com
- Verificação RapidShare.com link e extração de pasta
- RapidSafe ligação decodificação
- MD4/MD5/SHA1 computação de hash
- Controle remoto via Jabber (!)
- Controle remoto através de uma interface web AJAX *
- Subtitle pesquisa
- RAR / ZIP unpacker arquivo
- Scheduler
- Monitor de área de transferência
Instalação:
Mascara de CEP BR para campos EditText do Android

Bem se você quiser mais informações sobre como implementar essas mascaras pegue nesse primeiro artigo que escrevi sobre como criar a mascara de Telefone neste post.
Aqui vou postar só o código:
Site compara tarifas bancárias e lhe mostra as mais baratas

Essa história de que não temos que escolher o banco pelo valor de suas tarifas que temos que olhar o leque de serviços e benefícios, blá blá blá… isso é papo de gerente pra enrolar correntista.
Na verdade minha decisão de escolha para bancos é sempre o que oferecer as menores taxas, pois todos eles oferecem os mesmos serviços e benefícios e na hora que você mais precisar deles eles NUNCA estarão lá para ajuda-los, sem antes morder o seu bolso, não se engane quanto a isso.
Existe um site na internet que traz a lista das principais instituições e suas tarifas, assim facilita na hora de identificar o mais barato. Além disso é possível escolher duas ou mais instituições e compará-las para ver quem pratica a melhor taxa nos produtos lhe interessa mais.
Acesse o site da FERBRABAN ou clique sobre a imagem abaixo
Infelizmente eles só trazem as tarifas para pessoas físicas 🙁 tive que perder um tempo para levantar as taxas da jurídica quando fui trocar o banco se tivessem PJ lá teria economizado um bom tempo, mas mesmo assim me ajudou muito princialmente a um tempo atrás quando precisei de trocar de banco.
Hoje atualmente quando escrevo esse artigo o que me ofereceu as menores taxas foi a Caixa Econômica, já tenho conta lá a um tempo e realmente não vejo nenhuma diferença do outro banco que tinha conta (Itau) além do fato de que lá as gerentes não ficam pressionando para você fazer um seguro, ou previdência ou qualquer merda que eles sempre inventam pra você toda vez que vai à agencia.
A Caixa pra mim só teve um empecilho, que é não ter um Home Broker mas geralmente os outros bancos nunca conseguem chegar nas taxas de compra/venda que as corretoras especializadas no ramo oferecem, para essa necessidade eu escolhi a Mycap que tem custo fixo por operação na bolsa e literalmente não cobra taxa de custodia para as uas ações (mesmo que você não faça operação alguma no mês).
5 Coisas que nunca queremos ouvir dos clientes

Um mundo perfeito para um freelancer é não ter problemas no relacionamento com seus clientes, infelizmente não estamos em um mundo perfeito. Como freelancer você deve ter histórias de terror para contar. Segue abaixo 5 coisas que você nunca quer ouvir do seu cliente mas eles insistem em dizer:
1 – Nós realmente precisamos de um contrato?
Você negocia com seu cliente uma proposta ele lhe envia a aprovação e você diz que vai lhe enviar o contrato para iniciar o serviço, ele diz:
“Um contrato? não precisamos disso apenas confie em mim que vou lhe enviar o pagamento corretamente”
Você naturalmente deve dizer algo como: “Não… não é uma questão de desconfiança, é assim que eu trabalho e isso me deixa organizado.”
Cliente: “Escute, eu não tenho tempo para analisar um contrato, vamos começar a trabalhar e depois você me envia o seu contrato que eu assino ele”.
SOLUÇÃO
Se o cliente recusar a assinar o contrato primeiramente você deverá usar o seu próprio critério para analisar se a oportunidade em potencial vale o risco. É altamente recomendável que você use um contrato. Se o cliente ainda ficar inflexível você pode considerar rejeitar o projeto porque certamente você corre o risco do projeto se tornar num desastre e você não ser pago.
Para facilitar a situação faça um contrato curto e objetivo sem clausulas desnecessárias. O proposito de um contrato basicamente é abordar os termos, o prazo de entrega, os valores e formas de pagamento e evitar mal-entendidos. Deixe claro para o cliente que o contrato é util para proteger tanto você quanto ele mesmo e um contrato adequadamente formulado transmite a imagem a seu cliente que você é um profissional executando um negócio sério.
Remover branch remoto e local no github

Para remover um branch local você faz:
git branch -D branch_nome
Se quiser que essa remoção se reproduza no remoto faça:
git push origin :branch_nome
Se quiser apagar o branch remoto do github sem ter o branch localmente instalado faça:
git push origin --delete branch_nome
Se quiser renomear um branch local faça:
git branch -m branch_antigo branch_novo