Coisas sobre Linux que me chamaram a atenção recentemente

Coisas sobre Linux que me chamaram a atenção recentemente

LinuxVersions

Você pode não saber (ou esquecer às vezes), mas o Linux está muito presente na sua vida. Mesmo que você não o use diretamente como sistema operacional principal, mais da metade dos sites que você acessa está rodando em plataforma Linux. Isso inclui empresas gigantes como Google, Facebook, Twitter, Soundcloud, Amazon, Spotify, etc – a lista é muito, mas muito longa. A maioria dos filmes que você assiste utilizam Linux para renderizar cenas extremamente complexas que às vezes levam semanas ou mesmo meses para serem renderizados. O sistema móvel Android também é um Linux também caso você não saiba. E o seu roteador e a sua SmartTV provavelmente rodam Linux também!

Embora atualmente meu computador principal rode OS X, eu estou em contato com vários servidores que rodam Linux os quais acesso frequentemente. Além disso, utilizei Linux como S.O. principal de 2007 à 2011, através das distros Ubuntu e OpenSUSE (além de outras que utilizei por pouco tempo, como Slackware e Debian).

Na última semana várias coisas me chamaram a atenção no mundo Linux e esse é o motivo desse post:

1. O último episódio do podcast do Hack ‘n’ Cast (v0.3) foi uma introdução ao Linux e foi muito bom, vale a pena escutar: http://mindbending.org/pt/hack-n-cast-v03-introducao-ao-gnulinux.

2. Um amigo que é programador disse que nunca (palavra forte!) usaria Linux porque nem criar um script similar ao batch do “Janelas” ele conseguia. Bom, pensando que isso pudesse ser útil para mais pessoas, gravei um screencast ensinando como criar scripts no Linux e no Mac OS X: http://youtu.be/W84Ok6XGnow.

3. Assisti à uma ótima palestra chamada “Linux Sucks”: http://youtu.be/5pOxlazS3zs.

4. Lembrei e reli o excelente ponto de vista do Pothix sobre porque ele deixou o OS X e voltou a usar Linux: http://pothix.com/blog/development/menos-mac-e-mais-linux.

5. Pra finalizar (e descontraír), há um tempo atrás eu ganhei de um amigo que trabalha na RedHat um chapél vermelho (red hat, rá!), o qual foi parar na cabeca do Tux que eu tenho na minha estante, vide fotos abaixo. Ficou bem bacana! :-)

1

2

Bom, essa não é a primeira vez que eu escrevo sobre Linux e também não será a última. Linux é muito mais importante do que as pessoas pensam. Pense 3 vezes antes de subestimar o sistema do pinguim! ;)

Swift BR – grupo de discussão sobre a nova linguagem lançada pela Apple

Swift BR – grupo de discussão sobre a nova linguagem lançada pela Apple

swift-icon

A idéia desse grupo é fazer com que os usuários possam conhecer uns aos outros, compartilhando e discutindo idéias interessantes relacionadas à essa nova linguagem lançada pela Apple, para substituir o Objective C como linguagem padrão para desenvolvimento de aplicações tanto OS X quanto iOS.

https://groups.google.com/d/forum/swiftbr

Como aprender Ruby e Rails

Como aprender Ruby e Rails

ruby_rails

Vários amigos tem me perguntado como podem aprender a programar em Ruby e Rails. Vou postar aqui os mesmos vídeos e dicas que mandei pra eles, caso alguém tenha interesse também:

An awesome Wiki built with Ruby and Rails!

An awesome Wiki built with Ruby and Rails!

I’ve been worked on a small (but awesome) open-source project.

I’m talking about ruby_wiki – a simple wiki built with Ruby on Rails:
https://github.com/lucascaton/ruby_wiki

As I said before – it’s quite simple, although it works fine.
Anyway, would be nice to have more features in this project, so, if you’re a developer and have any interest in that, feel free to fork the project and contribute.

Some screenshots:


1


2


3


4


5


6

Have a Rails 2 app? You can run it on the newest Ruby!

Have a Rails 2 app? You can run it on the newest Ruby!

old_rails_with_new_ruby

Do you have a legacy Rails application which is still running on Rails 2?

There are several reasons to migrate your application to new Rails versions, like to improve the security, to be able to use a better syntax, to take advantage of new features and also because most of current gems will only work on Rails 3 or higher. However, sometimes it’s hard to do that, especially for big projects. And certainly today there’re many project still running on Rails 2.

But there’s one good thing you can (and should) do! I’m talking about to use the newest Ruby version. Yes, I’m serious. When I wrote this post, the current Ruby version was 2.1.1 – and it’s not so hard to get it working fine with Rails 2.

Obviously, would be better if you have a good test coverage.

That said, let’s do it in a few steps:

Replacements

1. Gemfile

Rails 2 apps don’t use Bundler by default, so if you don’t have Bundler managing your gems yet, you should check here how to do that.

# There's no way to ensure that the next Ruby versions will work,
# but so far the current one works fine:
ruby '2.1.1'

# The same for rake:
rake '10.1.1'

# You might need the iconv gem:
gem 'iconv'

2. Rakefile

# Replace:
# require 'rake/rdoctask'

# with:
require 'rake/task'

3. config.ru

# Replace:
# require 'config/environment'

# with:
require File.dirname(__FILE__) + '/config/environment'

4. FasterCSV => CSV

Replace all FasterCSV constant with CSV. Also, include require 'csv' to relevant files (or include this require to config/environment.rb).

Inclusions

5. config/environment.rb

# Include this before the `Rails::Initializer.run` line:
if RUBY_VERSION >= '2.0.0'
  module Gem
    def self.source_index
      sources
    end

    def self.cache
      sources
    end

    SourceIndex = Specification

    class SourceList
      # If you want vendor gems, this is where to start writing code.
      def search(*args); []; end
      def each(&block); end
      include Enumerable
    end
  end
end

6. config/initializers/paperclip.rb

# The patches below are needed when using an old version of PaperClip + Ruby 2.x
# https://github.com/thoughtbot/paperclip/issues/262
# https://github.com/thoughtbot/paperclip/commit/1bcfc14388d0651c5fc70ab9ca3511144c698903

module Paperclip
  class Tempfile < ::Tempfile
    def make_tmpname(basename, n)
      extension = File.extname(basename)
      sprintf('%s,%d,%d%s', File.basename(basename, extension), $$, n.to_i, extension)
    end
  end
end

module IOStream
  def to_tempfile
    name = respond_to?(:original_filename) ? original_filename : (respond_to?(:path) ? path : 'stream')
    tempfile = Tempfile.new(['stream', File.extname(name)])
    tempfile.binmode
    self.stream_to(tempfile)
  end
end

New files

7. config/initializers/ruby2.rb

# This is a very important monkey patch to make Rails 2.3.18 to work with Ruby 2+
# If you're thinking to remove it, really, don't, unless you know what you're doing.

if Rails::VERSION::MAJOR == 2 && RUBY_VERSION >= '2.0.0'
  module ActiveRecord
    module Associations
      class AssociationProxy
        def send(method, *args)
          if proxy_respond_to?(method, true)
            super
          else
            load_target
            @target.send(method, *args)
          end
        end
      end
    end
  end
end

8. config/initializers/rails_generators.rb

It'll prevent Rails migration generator from stop working, otherwise you'll receive the following error message:

undefined local variable or method `vars' for # Rails::Generator::Commands::Create

(Thanks to Mr. S and jnwheeler44 for helping me to fix this one)

# This is a very important monkey patch to make Rails 2.3.18 to work with Ruby 2+
# If you're thinking to remove it, really, don't, unless you know what you're doing.

if Rails::VERSION::MAJOR == 2 && RUBY_VERSION >= '2.0.0'
  require 'rails_generator'
  require 'rails_generator/scripts/generate'

  Rails::Generator::Commands::Create.class_eval do
    def template(relative_source, relative_destination, template_options = {})
      file(relative_source, relative_destination, template_options) do |file|
        # Evaluate any assignments in a temporary, throwaway binding
        vars = template_options[:assigns] || {}
        b = template_options[:binding] || binding
        # this no longer works, eval throws "undefined local variable or method `vars'"
        # vars.each { |k, v| eval "#{k} = vars[:#{k}] || vars['#{k}']", b }
        vars.each { |k, v| b.local_variable_set(:"#{k}", v) }

        # Render the source file with the temporary binding
        ERB.new(file.read, nil, '-').result(b)
      end
    end
  end
end

RSpec

9. Make sure you're using the last compatible version with Rails 2.3.18:

gem 'rspec', '1.3.2'
gem 'rspec-rails', '1.3.4'

10. Remove the file script/spec.

11. lib/tasks/rspec.rake

Remove all the following lines:

gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
rspec_gem_dir = nil

Dir["#{Rails.root}/vendor/gems/*"].each do |subdir|
  rspec_gem_dir = subdir if subdir.gsub("#{Rails.root}/vendor/gems/","") =~ /^(\w+-)?rspec-(\d+)/ && File.exist?("#{subdir}/lib/spec/rake/spectask.rb")
end

rspec_plugin_dir = File.expand_path(File.dirname(__FILE__) + '/../../vendor/plugins/rspec')

if rspec_gem_dir && (test ?d, rspec_plugin_dir)
  raise "\n#{'*'*50}\nYou have rspec installed in both vendor/gems and vendor/plugins\nPlease pick one and dispose of the other.\n#{'*'*50}\n\n"
end

if rspec_gem_dir
  $LOAD_PATH.unshift("#{rspec_gem_dir}/lib")
elsif File.exist?(rspec_plugin_dir)
  $LOAD_PATH.unshift("#{rspec_plugin_dir}/lib")
end

Ruby syntax

12. Some details has been changed in Ruby syntax, especially from 1.8.x to 1.9.x.

Example 1:

# Replace:
when 'foo': bar

# with:
when 'foo' then bar

Example 2:

The behaviour for protected methods in new Ruby versions is a little bit different. See more in this post.

# In some cases, you might need to replace:
respond_to?(:foobar)

# with:
respond_to?(:foobar, true)

Example 3 (Yaml files):

# Replace:
order: [ :day, :month, :year ]

# with:
order:
  - :year
  - :month
  - :day

Ruby changes

13. The default encoding for Ruby 2.0 (or higher) is UTF-8. So, remove all the code similar to:

# encoding: utf-8

Or:

$KCODE = 'UTF-8'

Important note (included on July 27, 2014)

Check the comments below: Gabriel Sobrinho, Kyle Ries and Greg made some useful comments.

Conclusion

Each project could have different issues, but I hope this little guide helps you to use new Ruby versions in legacy Rails applications!

How to improve your software development team’s communication

How to improve your software development team’s communication

I’ve just written another post on the NetEngine’s blog:

http://netengine.com.au/blog/how-to-improve-your-software-development-team-s-communication/

I hope you enjoy it.

Por que eu voltei a usar iOS / iPhone

Por que eu voltei a usar iOS / iPhone

Em agosto desse ano, eu escrevi sobre como estava sendo minha experiência com o Android. Quatro meses depois, voltei a usar iOS. Vamos aos fatos: eu pretendia ficar mais um tempo com ele, mas o derrubei e a tela parou de funcionar completamente. Como eu já estava bastante ansioso pra voltar a usar o iOS / iPhone, aproveitei a oportunidade e comprei um iPhone 5s.

hero_start__posterframe

Mas o Android estava tão ruim assim?

Não.

Antes de mais nada, vou ser sincero: Android é sim um excelente sistema.

android

Conforme o que eu escrevi, eu tinha um Samsung S4 e o Android estava me atendendo perfeitamente bem no começo, mas depois de um tempo comecei a ter alguns problemas com a ROM original (da Samsung): lentidão, o fato de eu não poder atualizar, etc. Essa imagem que mostra bem claramente o problema das atualizações do Android:

03-ios-android

Antes que o Jonas me xingue, algo que deve ficar claro: não devemos resumir a experiência de usar Android somente se baseando na experiência de usar um Samsung. Mas o fato é que o Samsung S4 é um dos aparelhos mais utilizados atualmente, por isso achei que eu não fosse ter esse tipo de problema.

Resolvi então colocar uma versão pura do Android (vale ressaltar que essa ROM não era oficial). Ficou bom no começo, mas depois de um tempo, ficou pior: as apps davam crash toda hora e o sistema como um todo ficou lento. Tentei voltar para a ROM da Samsung (ou até alguma outra – exemplo: Cyanogenmod), mas era tanta gambiarra que desisti.

O que eu ganhei voltando para o iOS / iPhone

ios

  • Podcasts – uma app decente para o que mais faço com o meu celular: escutar podcasts. Não encontrei nenhuma app (free ou paga) que me atendesse 100% no Android. E isso o Podcasts da Apple faz muitíssimo bem;
  • iOS 7 – o novo sistema está muito estável e muito bonito.
    O que mais eu posso querer? ¯\_(ツ)_/¯
  • Gerenciamento de arquivos – Não tenho mais que me preocupar em que diretório os arquivos estão (e não saber se estou desperdiçando espaço);
  • Find my friends – as opções do Android não eram muito boas (Testei o “Life360” e alguns outros);
  • Calandários perfeitamente sincronizados – Várias items do meu calendário estavam no iCloud. Agora calendários do iCloud, do Google e do Facebook estão perfeitamente sincronizados;
  • Sensação de controle do que está realmente acontecendo no aparelho – Em vários momentos você tem a noção de perder esse controle no Android;
  • Fluidez – Somando o processador A7 (64 bits \o/) e a boa integração entre hardware e software, a fluidez / estabilidade do sistema como um todo ficam fantásticas;
  • Camera com suporte à 120fps (slow motion) – simplesmente sensacional;
  • Earpods – os novos fones são ótimos;
  • Touch ID – Sem muito o que falar, é sensacional também.

touchid_hero

Uma coisa interessante e que antes era exclusivo do Android é o relatório de consumo da banda 4G separado por app, o qual agora está disponível também no iOS 7.

4g_usage

O que eu perdi deixando o Android

  • Notificações – O LED, os mini-ícones perto do relógio e a sincronia perfeita com as apps – tudo isso somados fazem as notificações do Android serem melhores que as do iOS;
  • Relatório de consumo da bateria – Isso simplesmenete não existe no iOS;
  • Instalar apps via web – sinto falta disso, funciona muito bem no Android;
  • Teclado swipe – fiquei mal acostumado com esse teclado também. Mais um ponto pro Android.

Conclusão

ios_hero

Das principais opções atuais, iOS / iPhone é o que me atende melhor.

RHOK Brisbane 2013

RHOK Brisbane 2013

“Random hacks of kindness” – ou simplesmente “RHOK” – que pode ser traduzido como “Hacks aleatórios de bondade” é um evento (aka. “hackathon”) sem fins lucrativos que acontece no mundo inteiro, onde profissionais de tecnologia ajudam a criar projetos e solucionar problemas de organizações que trabalham para um mundo melhor. Todos que participam não ganham nada, é uma contribuição como forma de boa ação.

Esse ano estou participando do evento de Brisbane (Austrália) e estamos ajudando a QueenslandKids, uma organização que ajuda crianças carentes e especiais.

Para saber mais sobre o evento: rhokbrisbane.org.

Fotos:

2013-12-07 09.41.32

2013-12-07 09.30.00

2013-12-07 09.35.53

2013-12-07 09.21.13

Agile methodologies for software development

Agile methodologies for software development

Yesterday, I wrote my first blog post on the NetEngine blog:

http://netengine.com.au/blog/agile_methodologies_for_software_development/

I hope you enjoy it.

Há um mês, eu troquei o iOS pelo Android

Há um mês, eu troquei o iOS pelo Android

android

Gostaria de começar esse post dizendo que vou tentar ser o mais imparcial possível, não sendo fanboy de nenhuma empresa / aparelho / sistema operacional. Eu não vou comparar somente os sistemas operacionais, mas sim a experiência do hardware com software, ou seja, a integração com o aparelho também.

Motivação

Eu parei de usar Windows quando o Vista foi lançado. Essa versão tinha muitos problemas e eu resolvi dar uma chance ao pinguim (aka. Linux), principalmente pelo fato de nunca ter usado ele full-time antes. Muitas coisas eram diferentes (hoje em dia essa diferença é menor), tive que aprender coisas novas e largar velhos costumes para trás. Mas depois de algum tempo, notei que valeu muito a pena e que eu não voltaria atrás. Alguns anos mais tarde, mudei novamente para o Mac OSX (o qual continuo usando até hoje) e vejo que essa experiência de ter usado os 3 sistemas diferentes só me trouxe benefícios.

Eu expliquei tudo isso para demonstrar que essa motivação foi basicamente a mesma com os sistemas operacionais móveis. Depois de quase 3 anos usando iOS e perto da versão 7 ser lançada, decidi que era hora de experimentar um outro mundo. E como eu nunca tinha usado Android full-time antes (apenas havia brincado com aparelhos de amigos), então era hora de mudar.

Hora de mudar

Decidi então comprar um Samsung Galaxy S4.

s4

Procurei pela versão com o Android puro (aka. “Google Play Edition”), mas como ela ainda não estava a venda aqui, comprei a versão com a rom da Samsung mas pouco tempo depois desisti e segui esse tutorial para instalar a rom pura do Google. A vantagem é que o sistema fica mais fluído (mais rápido, dá menos “travadas”) e não vem com vários aplicativos inúteis que a Samsung e a operadora do celular te obrigam a ter (uma vez que você não pode apagá-los).

O que eu gostei

1. Notificações + LED + atalhos rápidos

Vou começar com algo que eu uso muito em ambos os sistemas: notificações. Conheço pessoas que simplesmente não se importam muito com elas, mas esse definitivamente não é o meu caso. Esse é um ponto forte no Android: as notificações são muito boas. No iOS você pensa que isso funciona bem até ver como isso funciona no Android, principalmente porque as notificações e as aplicações são bem sincronizadas.

Para cada item você pode ter alguns botões de funções rápidas (exemplo: ao receber um email, você pode clicar nos botões “responder” ou “arquivar”) ou ainda pode ver mais detalhes sobre aquele item específico, tocando e deslizando o dedo para baixo naquele item. Outro exemplo legal é quando você tira um screenshot e recebe uma notificação, na qual você pode apenas tocar para já abrir a nova imagem.

Uma diferença muito boa são os ícones na barra superior, com um resumo das notificações:

2013-09-27 12.30.05

Outra coisa bem bacana é o “Pulse notification light”. Acredito que nem todo aparelho tenha isso, mas o S4 tem e faz muita diferença. Ao chegar uma nova notificação, ao invés de a tela ligar e mostrar o que chegou, você pode configurar seu aparelho para ele simplesmente piscar o LED. O mais legal é que você pode configurar o LED pra ficar de uma cor para cada tipo de notificação: chamada perdida, SMS, Email, Hangouts, Facebook, Twitter, WhatsApp, etc.

led

Algo bem últil e que agora o iOS 7 também tem (embora falte um atalho para o “Settings”) são os atalhos rápidos, que ficam na área de notificações:

notifications (atalhos)

2. Tela grande (5″) Full HD

Segundo a Apple, a vantagem de um aparelho um pouco menor é poder tocar todos os cantos da tela com a mesma mão que segura o aparelho. Sim, isso faz sentido, mas a vantagem de ter uma tela grande (5 polegadas) e com boa qualidade é ainda maior. E a adaptação é relativamente rápida.

3. Teclado swipe

Assunto polêmico: há quem ame, há que nem ligue. Apesar de eu não achar ele tão mais rápido assim, é mais prático e confortável digitar apenas deslizando o dedo. Mesmo você errando algumas letras, ele tem um algorítimo inteligente e corrige. Gostei muito!

swipe

4. Lookout

Uma app que faz toda a diferença: Lookout. Ele tem vários recursos: localizar seu celular (similar ao “Find my iPhone”), se alguém errar 3 vezes a senha de desbloqueio, ele tira uma foto da pessoa e manda no seu email (ele também faz isso quando sua bateria está quase acabando, só que usa o GPS pra saber sua localização e te manda essa informação também), faz backup de contatos, fotos, etc, é anti-virus. Ah, e sim, é free.

5. Botões “menu” e “voltar”

Antes eu achava besteira, mas usando diariamente você nota que os botões “menu” e “voltar” são bem práticos (principalmente o último). No S4 eles ficam melhor ainda, porque são dois sensores capacitivos, não botões físicos. E eles ficam apagados até que você toque neles, o que deixa o design do aparelho mais clean.

buttons

6. Customização, flexibilidade e liberdade

O Android é extremamente personalizável (às vezes mais do que deveria). Pra começar, a possibilidade de instalar launchers diferentes é sensacional. Launcher basicamente é a tela inicial do seu aparelho, o gerenciador de widgets, temas, etc. Estou usando o Apex e gostando muito.

É sempre bom poder customizar, embora minha tela inicial seja bem parecida com a default:

apex

Você também pode instalar gerenciadores de torrents, emuladores, terminal com acesso root (esse dá um pouco de trabalho, mas dá pra fazer), entre outras coisas. Isso é liberdade!

files

(Gerenciador de arquivos)

screen lock options

(Formas de desbloquear a tela)

utorrent

(uTorrent e emuladores são apps facilmente encontradas na Play Store)

7. Relatório de uso da bateria

No Android você pode configurar para receber notificações quando a bateria estiver totalmente carregada ou quando estiver acabando. Você também pode facilmente ver o que está consumindo mais bateria:

bateria

8. Relatório de uso do 3G / 4G

É possível ver quanto cada app está gastando na sua rede de dados 3G ou 4G. Essa funcionalidade é bastante flexível, permitindo configurar um limite de uso, configurar uma notificação quando você estiver perto de atingir limite, configurar em que dia a sua operadora vai recomeçar a contagem de uso e até mesmo ver quanto cada app gasta em “foreground” e em “background”, ou seja, quanto cada app usou enquanto você estava com ela aberta e quanto ela gastou enquanto ela estava fechada (usando “pull notifications”, por exemplo), respectivamente.

data_usage

9. Instalar apps remotamente

Você pode entrar no site do Google play (aka. App Store do Google) usando seu computador, buscar e escolher o aplicativo que quer instalar, selecionar o device no qual você quer instalar o app (no caso de você ter mais de um), clicar em “Instalar” e pronto. Depois de 3 segundos, o device começa a baixar e instalar a app sozinho. Muito útil.

instalar app remotamente

Depois, no device:

app instalada

10. Google Now

Ok, o Google mantém uma versão do Google Now pro iOS, mas é diferente. Digo isso porque no Android o Google Now é mais integrado e no geral funciona melhor.

google now

11. Quantidade de apps gratuitas

Até hoje, todas as apps que eu instalei foram gratuitas. Não vejo problema nenhum em pagar por apps, mas ao contrário do iOS, a maioria das apps não custam nada.

12. SD card

Não é algo imprescindivel, mas é interessante. Principalmente porque você configurar coisas como: todas as fotos e vídeo que você tirar podem ir automaticamente para o cartão SD e não para o armazenamento interno do aparelho.

13. Câmera

As duas câmeras (frontal e traseira) do S4 são muito boas. E o software nativo do Android também é bem bacana, contando com algumas opções avançadas na hora de tirar foto e modos interessantes, como fotos 360º e panorâmicas.

camera

14. Sistema inteligente

De vez em quando eu ainda me surpreendo com o Android. No geral, o sistema é muito inteligente e facilita algumas coisas. Um exemplo disso é: eu configurei meu device para subir todas as fotos que eu tiro automaticamente para minha conta do Dropbox. Mas quando ele nota que sua bateria está baixa, ele para de de fazer essas coisas para evitar que sua bateria acabe de vez.

sistema inteligente

15. Alguns detalhes interessantes

Para finalizar a lista de coisas que eu gostei, o Android é mais detalhista que o iOS:

  • Você pode configurar apps padrões: Chrome é meu navegador padrão, Gmail é meu cliente de email padrão e VLC é meu player de vídeo padrão, etc;
  • Exibição de detalhes de arquivos: extensão, tamanho, resolução de fotos, duração de vídeos, etc;
  • Exibição de quanto de memória cada app está usando de ram;
  • Exibição de quanto de memória cada app está usando de cache;
  • Gráfico de armazenamento interno / SD card: que tipo de arquivos está gastando mais espaço no seu device;
  • Etc.

apps manager

(Quanto cada app gasta de memória ram)

apps abertas

(Tela para visualizar e fechar apps que estão rodando)

app info

(Detalhes de um app específico)

storage

(Gráfico do armazenamento interno)

O que eu não gostei

1. Fluidez

Apesar de ter um hardware supostamente superior, o S4 perde no fator “fluidez” para o iPhone. Todas as animações, efeitos e o tempo de resposta dos iPhones são melhores na maioria dos casos. O pior de tudo é o rotação da tela: você vira o device e várias vezes a tela não vira junto. Aí você chacoalha um pouco e a tela vira. Isso chega a ser irritante às vezes.

2. Fones

Os fones que vem com o S4 são horríveis. Claro que isso é apenas a minha opnião. Acabei comprando um fone da Sony. A desvantagem é que você perde os controles de volume e play / pause que existem no fone que acompanha o S4. Pensei em comprar um da Apple, mas já os testei e tais controles também não funcionam.

3. Podcasts

Escutar podcasts no smartphone é uma das coisas que mais faço diariamente. Testei os 3 aplicativos mais famosos de podcasts no Android e nenhum é grande coisa. O único que é razoavelmente usável é o Podcast Addict. Ele tem dois problemas: o primeiro – não tão grave – é que ele oferece muitas opções e você tem que ver uma lista gigante de configurações para deixar do jeito que você gosta (convention over configuration – deveria ser o contrário). O segundo problema é pior: quando você está escutando um episódio, o áudio começa a falhar e às vezes para do nada. Isso é bem frequente, infelizmente.

4. Google Play – uma loja muito liberal

A Apple é burocrática e demora um pouco para autorizar a entrada de apps na sua loja. Mas isso tem o lado bom: raramente entram apps realmente ruins. Já na Google Play, tem muita porcaria, incluindo malwares. No geral não chega a ser um problema, mas você deve ser cuidadoso.

5. Updates

Como falei no começo do post, instalei uma rom com o Android puro e não estou usando a que a Samsung manda de fábrica. Isso significa que eu não posso simplesmente instalar as atualizações do Google quando elas saem. Pra ser sincero, eu não sei nem quando vou poder (não pesquisei como isso funciona). Mesmo se eu estivesse usando a rom da Samsung, ela demora (às vezes muito) pra liberar o update, como por exemplo agora que o Android 4.3 já foi lançado há mais de um mês e ainda não está disponível para quem usa a rom que já vem no device.

6. Apps no geral são mais feias e com UX mal pensado

Notem que estou generalizando. Já considerando as apps que eu mais uso, isso não chega a incomodar.

Coisas que não estão nas listas acima

Coisas que eu não comentei nas duas listas acima foi – ou porque são similares ao iOS / iPhone – ou não fazem diferença para mim.

Mitos

Alguns mitos sobre ambos os sistemas:

O Android não se integra tão bem com o Mac quanto o iPhone

Ok, essa integração pode não ser tão boa quando comparado com o iPhone, principalmente pelo fato de não ter iCloud, mas isso definitivamente foi um problema pequeno. Para tudo tem uma boa alternativa (sendo que maioria eu já usava). Nesse artigo, tem uma sessão chamada “Apple Lock-in?” que explica o que ele usa pra melhorar essa integração.

No Android, as apps fecham sozinhas frequentemente (crash)

Ouvi muita gente falando isso antes de eu começar a usar. Definitivamente não é verdade, é bem raro acontecer.

No iPhone / iOS você não tem liberdade

Ok, agora no Android você tem, inclusive tem acesso root ao sistema (que por baixo dos panos é um Linux). Grande coisa! O que você vai fazer agora? Basicamente nada demais :-)

Uma câmera com 90 megapixels é melhor que uma que tem 85

Obviamente é um mito. A câmera do novo iPhone 5S continua com os mesmos 8 megapixels do iPhone 5 mas é bem superior! E eu não acho que ela fica devendo pra nenhum smartphone que tenha 13 ou 20. Sério!

Conclusão

Já estou usando Android há pouco mais de um mês, o que foi suficiente para notar as vantagens e desvantagens. Gostei muito do iOS 7 (minha esposa tem um iPhone 5 e eu uso ele de vez em quando), mas por enquanto não pretendo voltar a usar iOS / iPhone; estou satisfeito com o meu Android.

Samsung-Galaxy-S4-vs-Apple-iPhone-5-01

(Galaxy S4 e iPhone 5)

Nesse post, eu basicamente listei o que gostei mais e menos em relação ao sistema operacional da Apple e no final das contas, ambos tem excelentes ecosistemas: conjunto de ferramentas, loja de aplicativos e design.

Então fica a dica: não tenha medo de experimentar o que você ainda não usou :-)

Atualização desse post

Em dezembro de 2013 eu voltei a usar iOS / iPhone e escrevi um post explicando o motivo:
“Por que eu voltei a usar iOS / iPhone”.

Iniciando uma vida completamente nova

Iniciando uma vida completamente nova

australia

Estou iniciando uma novíssima fase em minha vida. Me mudei há 10 dias para Brisbane – Austrália, onde vou viver e trabalhar. Vim com minha esposa, a Aline, que topou o desafio de viver em um país completamente novo, com uma nova língua, nova cultura, novas pessoas e novos amigos (claro, sem nunca esquecer os grandes que fiz no Brasil).

Eu escrevi um post no meu recém-criado blog pessoal (para separar das coisas que posto aqui) agradecendo à algumas pessoas e postando algumas fotos daqui.

Conforme prometido ao @cassiuspacheco_, eu ainda farei um post mais completo que esse, mas vou esperar mais tempo pra ter mais coisas interessantes pra falar.

Apresentação online sobre as novidades do Rails 4

Apresentação online sobre as novidades do Rails 4

Screen Shot 2013-07-02 at 10.22.18 PM

O Rails 4 acabou de ser lançado e tem várias novidades bacanas! Aprenda o que mudou, o que são Strong Parameters, turbolinks, etags, requests com streaming e outras coisas interessantes.

Hoje fiz uma apresentação online pela Eventials e pela Locaweb sobre as novidades do Rails 4. Quem quiser assistir, a palestra está gravada e disponível no link abaixo:

https://www.eventials.com/pt-br/locaweb/o-que-ha-de-novo-no-rails-4-com-lucas-caton/

Seguem os slides:


Contar a frequência de objetos em um array usando Ruby

Contar a frequência de objetos em um array usando Ruby

Às vezes precisamos contabilizar qual a frequência de objetos em um array usando Ruby.

Por exemplo, um array %w(dog dog cat) tem dois elementos 'dog' e um 'cat'.
Para transformar isso em um hash com os totais, podemos fazer:

words = %w(dog dog cat)
Hash[words.group_by(&:itself).map { |word, words| [word, words.size] }]

O retorno será:

{
  "dog" => 2,
  "cat" => 1
}

Ps.: Se você estiver usando Ruby 2.1 ou mais antigo, você precisa fazer dessa forma:

Hash[words.group_by{ |w| w }.map { |word, words| [word, words.size] }]
Slides da minha apresentação “What’s new in Rails 4”

Slides da minha apresentação “What’s new in Rails 4”

Quinta-feira passada apresentei um tech talk aqui na Locaweb sobre as novidades do Rails 4.

Seguem os slides:


[#IF] Screencasts de Ruby on Rails para iniciantes

[#IF] Screencasts de Ruby on Rails para iniciantes

ruby_rails

Pra quem não entendeu o que é a hashtag #IF, veja esse post do Fabio Akita.

No ano passado, eu comecei a gravar alguns vídeos pra ajudar quem gostaria de começar a programar com Ruby on Rails.

Por enquanto são 3 screencasts apenas, mas já é o suficiente pra quem gostaria de começar.


Linguagem de programação “Ruby” (para iniciantes)



Ruby on Rails (para iniciantes)



Ruby on Rails – introdução às rotas


Por favor, me mandem feedback, com sugestões, críticas ou até mesmo dúvidas. Espero que gostem e que seja útil ;-)

15º Encontro Locaweb de Profissionais de Internet

15º Encontro Locaweb de Profissionais de Internet

Screen Shot 2013-05-08 at 10.12.49 PM

Ontem participei do 15º Encontro Locaweb em Curitiba-PR. O evento foi interessante e bem organizado e não estou dizendo isso só porque trabalho aqui :-)

Assisti as seguintes palestras:

  • Fábio Ricotta – “Usando SEO para alavancar suas visitas e negócios”
  • Diego Eis – “Guia de Sobrevivência”
  • Murilo Gun – “O segredo do fracasso”
  • Silvio Meira – “Empreendedorismo Digital”
  • Luli Radfahrer – “Internet das coisas, computação em nuvem e tendências 2013”

Todas foram boas, mas as apresentações do Ricotta, do Eis e do Luli me surpreenderam, foram muito boas mesmo!

Tiramos essa foto aí na hora do almoço, no Jardim Botânico. Da esquerda pra direita: Ítalo Oliveira, Diego Eis, eu, Bruno Batalha e Marcos Oliveira:

jardim botanico curitiba

Que venha o 16º encontro! :-)

Screencast #2 – Interessante plugin “vim-abolish”

Screencast #2 – Interessante plugin “vim-abolish”

Esse é o segundo screencast que eu faço para o blog e novamente é sobre Vim.
Esse ficou bem mais curto (tem apenas 5 minutos) e vai direto ao ponto. Espero que gostem!

Se quiserem ver o primeiro, o link é: http://blog.lucascaton.com.br/index.php/2011/12/13/screencast-1-17-dicas-para-o-vim/

Links relevantes:

Screencast:

(caso não consiga ver o vídeo, clique aqui)

Por favor, mandem feedback sobre o que acharam!

Projeto “MyPodcasts.info”

Projeto “MyPodcasts.info”

Eu sou um cara que gosta muito de escutar podcasts. Escuto vários, sobre variados temas, alguns em português, outros em inglês, alguns sobre áreas totalmente diferentes da que eu trabalho, alguns nostálgicos, alguns pra melhorar meu inglês, etc. E sempre que encontro com alguém e descubro que a pessoa também escuta podcasts, rola as perguntas sobre qual escuta, sobre o que se trata, quais amigos em comum escutam, qual o nível de qualidade, entre outras dúvidas. Foi aí que surgiu a idéia de criar o site MyPodcasts.info, um site onde você pode cadastrar tudo isso e no final ter uma URL publica para passar para os interessados nos podcasts que você escuta.

Há 2 meses atrás eu o coloquei no ar e logo em seguida o liberei como open-source: github.com/lucascaton/mypodcasts.info. Então, sintam-se a vontade para usar o site e contribuir com ele.

Seguem alguns screenshots:

Screen Shot 2013-04-21 at 6.38.43 PM

Screen Shot 2013-04-21 at 6.44.15 PM

Screen Shot 2013-04-21 at 6.44.50 PM

Ah sim! O site é (mais ou menos) responsivo:

Screen Shot 2013-04-21 at 6.48.11 PM

Interesting script written in Ruby: “The Globe”

Interesting script written in Ruby: “The Globe”

Minutes ago I received this link from some friends. It’s very interesting (and crazy).

Create an empty ruby file, paste this content and save as a.rb.

v=0000;eval$s=%q~d=%!^Lcf<LK8,                  _@7gj*LJ=c5nM)Tp1g0%Xv.,S[<>YoP
4ZojjV)O>qIH1/n[|2yE[>:ieC       "%.#%  :::##"       97N-A&Kj_K_><wS5rtWk@*a+Y5
yH?b[F^e7C/56j|pmRe+:)B     "##%      ::##########"     O98(Zh)'Iof*nm.,$C5Nyt=
PPu01Avw^<IiQ=5$'D-y?    "##:         ###############"    g6`YT+qLw9k^ch|K'),tc
6ygIL8xI#LNz3v}T=4W    "#            #.   .####:#######"    lL27FZ0ij)7TQCI)P7u
}RT5-iJbbG5P-DHB<.   "              ##### # :############"   R,YvZ_rnv6ky-G+4U'
$*are@b4U351Q-ug5   "              #######################"   00x8RR%`Om7VDp4M5
PFixrPvl&<p[]1IJ   "              ############:####  %#####"   EGgDt8Lm#;bc4zS^
y]0`_PstfUxOC(q   "              .#############:##%   .##  ."   /,}.YOIFj(k&q_V
zcaAi?]^lCVYp!;  " %%            .################.     #.   "  ;s="v=%04o;ev"%
(;v=(v-($*+[45,  ":####:          :##############%       :   "  ])[n=0].to_i;)%
360)+"al$s=%q#{  "%######.              #########            "  ;;"%c"%126+$s<<
126}";d.gsub!(/  "##########.           #######%             "  |\s|".*"/,"");;
require"zlib"||  "###########           :######.             "  ;d=d.unpack"C*"
d.map{|c|n=(n||  ":#########:           .######: .           "  )*90+(c-2)%91};
e=["%x"%n].pack   " :#######%           :###### #:          "   &&"H*";e=Zlib::
Inflate.inflate(   "  ######%           .####% ::          "   &&e).unpack("b*"
)[0];22.times{|y|   "  ####%             %###             "   ;w=(Math.sqrt(1-(
(y*2.0-21)/22)**(;   " .###:             .#%             "   ;2))*23).floor;(w*
2-1).times{|x|u=(e+    " %##                           "    )[y*z=360,z]*2;u=u[
90*x/w+v+90,90/w];s[(    " #.                        "    ;y*80)+120-w+x]=(""<<
32<<".:%#")[4*u.count((     " .                   "     ;"0"))/u.size]}};;puts\
s+";_ The Qlobe#{" "*18+ (       "#  :#######"       ;"Copyright(C).Yusuke End\
oh, 2010")}";exit~;_ The Qlobe                  Copyright(C).Yusuke Endoh, 2010

After that, just run this script using:

while true; do clear; ruby a.rb | tee b.rb; sleep 0.2; mv -f b.rb a.rb; done
Tenha orgulho ou f…-se

Tenha orgulho ou f…-se

(Esse post é uma tradução (autorizada) do artigo “Take pride or f— it” do Rob Heaton)


O arquivo vazio “sem_titulo.txt” brilhando no seu editor de código só pode significar uma coisa. É hora de criar uma nova funcionalidade.

A última funcionalidade que você desenvolveu começou muito bem, com uma arquitetura esculpida tão elegante e requintada que te fez chorar um pouco quando ninguém estava olhando. Mas as coisas mudaram e no final ficou um lixo. Você não estava particularmente orgulhoso de nada e agora está feliz apenas porque isso vai sair do seu caminho. “Mas tudo vai ser perfeito dessa vez!” você diz a si mesmo e mais uma vez ansiosamente começa a trabalhar. Um pouco mais tarde você olha ao redor e sua funcionalidade que já está meio pronta já está caindo aos pedaços, está em chamas. “Droga!” – você diz.

Eu passei por isso em muitas funcionalidades e projetos. Estou cansado disso e eu sei por que isso acontece. Eu escrevo codigo bom e crio um bom produto quando eu me sindo orgulhoso do que eu estou fazendo. Esse sentimento pode vir por vários motivos – uma equipe que valoriza bom código, clientes os quais estão desesperados para testar uma nova funcionalidade ou uma sensação de habilidade e crença que estou me divertindo fazendo algo bom. Idependente de de qual seja o motivo, se ele não existir, o que eu estou fazendo ficará bem ruim.

Quando eu perco o orgulho de alguma coisa, eu paro de me preocupar se isso ficará bom ou não. O único valor que isso terá para mim é não ter mais que mexer nisso um dia. Isso sempre começa quando estragamos um pequeno trecho do código, mas apenas isso já é o suficiente. A caixa de Pandora foi aberta e a sua nova funcionalidade está infectada. Eu estrago o próximo trecho de código com apenas um pouco de remorso e a partir desse ponto, eu não vou mais vou me importar com isso.

Porque eu sei que você tem que ENTREGAR, que os usuários não se importam como está o seu código, que essa funcionalidade é REALMENTE CHATA e eu só quero começar outra. Então não importa se meus models conhecem a lógica das minhas views, porque levaria 20 minutos que NÓS NÃO TEMOS para resolver isso. Estou fugindo das regras, mas é somente em um ou dois métodos.

Mas isso nunca acaba aí. Essa funcionalidade, ou talvez o produto inteiro, estejam contaminados. Não existe mais nada para se ter orgulho. Não existe nenhuma demonstração de habilidade. Não existe uma forma de fazer que os dados parseados pelo módulo que eu acabei de escrever fiquem legíveis, porque quem vai ler com certeza não entenderá de onde os dados vem. Eu já liberei os cães do inferno e cobri todo o meu código com bacon.

Perder o orgulho do que você faz te transforma em um zumbi, cujo objetivo é, além de ingerir cérebros, é terminar logo a nova funcionalidade. Isso vai acontecer, de qualquer forma. E exceto se você conseguir ter orgulho novamente, esse código não vai ficar bonito. Você tem que lembrar como isso era antes, no começo, há muito tempo atrás. Quando seus controllers eram pequenos e seus models não foram cobertos por ácidos e cacos de vidros. Pense bastante. Pense novamente.

Para minha redenção mortos-vivos, eu tenho que fazer as pazes com o que eu fiz ou então levantar e fazer uma pausa. Então, com a cabeça limpa e reabastecido com bom senso, eu tenho que decidir se quero fazer as coisas direito. Se eu não puder ou não fizer, então essa nova funcionalidade estará condenada e eu devo levar uma estaca até o seu coração e começar uma próxima coisa. Deixar o monstro a crescer e sofrer mutações não é uma opção.

Frequentemente eu sinto que estou gastando meu tempo fazendo coisas direito ou pelo menos de uma forma justificavelmente errada e isso é perdoável. Termine! Entregue! Mas um código ruim reduz a velocidade das coisas muito mais do que um bom código o faria. É muito fácil escrever alguma porcaria, ser forçado a escrever várias camadas de lixo em cima disso, gritar “espirito de LEAN STARTUP” para qualquer um que o questionar sobre o que você está fazendo. Você precisa de uma razão muito boa e imediata para escrever código ruim, ou seja, uma vaga sensação de pressão ou apatia não são suficientes.

Porque isso nunca acaba aí. E tão cedo quanto o T-virus seja produzido, você terá um apocalipse de código-zumbi em suas mãos.

Projeto “time_clock”

Projeto “time_clock”

É comum na maioria das consultorias brasileiras de software, principalmente as que contratam funcionários através de regime PJ, solicitarem o relatório de horas trabalhadas mês a mês. Como esse era o meu caso no ano passado, eu criei um pequeno sistema para facilitar esse controle.

Eu havia criando essa funcionalidade dentro do próprio código do meu site, mas como várias pessoas gostaram e me pediram o código, eu extraí o código para um projeto a parte e o liberei como open-source.

Sinta-se à vontade para usar, melhorar e divulgar:
https://github.com/lucascaton/time_clock

Seguem alguns screenshots:
Screenshot browser
Screenshot iPhone

Ruby 2.0 lançado! O que há de novo?

Ruby 2.0 lançado! O que há de novo?

ruby2

A versão 2.0 do Ruby foi lançada há dois dias.

Eu pensei em escrever um post listando e comentando cada uma das novas features, alterações, melhorias e incompatibilidades (quase nenhuma, felizmente) da linguagem. Mas acabei encontrando dois posts muito bons que fazem exatamente isso. O primeiro utilizando exemplos de códigos e o segundo são os slides do Urabe Shyouhe. Então, não deixe de ler:

http://blog.marc-andre.ca/2013/02/23/ruby-2-by-example/
https://speakerdeck.com/shyouhei/whats-new-in-ruby-2-dot-0

Hellо, I am a compiler

Hellо, I am a compiler

robot

I copied this little text from a comment on the Stackoverflow website. I really enjoyed it ;)

Hellо, I am a compiler.
I just scanned thousands of lines of code while you were reading this sentence. I browsed through millions of possibilities of optimizing a single line of yours using hundreds of different optimization techniques based on a vast amount of academic research that you would spend years getting at. I won’t feel any embarrassment, not even a slight ick, when I convert a three-line loop to thousands of instructions just to make it faster. I have no shame to go to great lengths of optimization or to do the dirtiest tricks. And if you don’t want me to, maybe for a day or two, I’ll behave and do it the way you like. I can transform the methods I’m using whenever you want, without even changing a single line of your code. I can even show you how your code would look in assembly, on different processor architectures and different operating systems and in different assembly conventions if you’d like. Yes, all in seconds. Because, you know, I can; and you know, you can’t.

P.S. Oh, by the way you weren’t using half of the code you wrote. I did you a favor and threw it away.

Getting root permissions on a file inside of Vim

Getting root permissions on a file inside of Vim

Sometimes you open a file that you need root permissions to save it.
When it happen, you can close and reopen the Vim (with sudo) or you also can do:

:w !sudo tee %

Thanks to @dlisboa for the tip.

Vim Users BR

Vim Users BR

No mês passado, eu criei um grupo de discussões para usuários do editor Vim.

A idéia por trás da criação do grupo é que os usuários pudessem se envolver, compartilhar e discutir coisas interessantes relacionadas à esse fantástico editor. Comentar uma dica nova, um plugin interessante ou alguma técnica útil que pouca gente conheça, etc…

Segue o link do grupo:
https://groups.google.com/forum/?fromgroups=#!forum/vim-users-br