Bastos

let’s code!


Quer aprender a programar?

Com a idéia do Fabio Akita e com a ajuda de muita gente saiu uma página na web para se aprender a programar! Eles usam Ruby para ensinar e o resultado tô olhando agora, está bem legal. Vejam e passem para frente a notícia para os quem almejam ser programadores :D

Link: http://aprendaaprogramar.rubyonrails.pro.br/introducao

Published by Bastos, on February 1st, 2008 at 10:42 am. Filled under: code, ruby, tips | No Comments

Perl on Rails

Acabei de ler no blog de desenvolvedores da BBC que eles apesar deles usarem e gostarem de Ruby on Rails, estão construindo um Perl On Rails. Talvez, se conseguirem, vamos ter um outro competidor para o Rails, até mesmo pq Ruby herdou de Perl muitas coisas. Eu não sei programar uma linha em Perl mas gostaria de ver um novo framework que compartilhasse da idéia do Rails. Infelizmente outros frameworks feitos em PHP por exemplo podem até tentar ser parecidos com RoR mas ai a diferença fica grande, muito grande, quando analisamos a linguagem e a plataforma. De novo o pensamento que o Pear deveria de fato funcionar como o ruby gems… Em Python temos o Django, que não é um Rails clone mas dá conta muito bem do recado. Porém infelizmente não temos plugins e apesar de termos as apps, elas não são numerosas e não temos o rake. Bem mas ai já poderia fazer um longo post sobre o que eu queria a mais no Django.

Published by Bastos, on December 3rd, 2007 at 9:18 am. Filled under: django, frameworks, perl, php, rails, ruby | No Comments

Akita fala sobre Ruby, Smalltalk e OOP

Recomendo a todos interessados em linguagens de programação lerem os posts no blog do Akita sobre SmallTalk, Ruby e OOP. Concordo com o fato de que discutir o quanto uma linguagem é ou não é OOP. Ele fala também outras coisas interessantes, leitura obrigatória. Inclusive leia esse comentário.

Published by Bastos, on September 5th, 2007 at 8:40 am. Filled under: oop, ruby, smalltalk | No Comments

Saindo do PHP

Estudo várias coisas ao mesmo tempo, entre elas, frameworks. Tendo já testado Django, Rails e o framework da Zend posso falar, PHP perde feio com o seu Zend. Zend está mais parecido com apenas mais um conjunto de bibliotecas que DEVERIAM estar no PEAR e não em um framework isoladas. E falando nisso, o PEAR é o grande problema do PHP, ninguém usa! Vejo muito e uso muito o gem install PACOTE ou o easy_install PACOTE, até mesmo o python setup.py install.

Os programadores (incluindo eu) do PHP tem a mania de jogar suas bibliotecas pela rede, sem padrão de instalação e dependências, tudo é refeito a cada nova biblioteca, Cake usa um ORM que é só dele e nem se dão o trabalho de por no PEAR, a Zend não se dá o trabalho de por no PEAR suas bibliotecas. Quer dizer, as bibliotecas PHP vivem em ilhas.

Quando fui usar a biblioteca do jabber para Ruby vi que em cima dela foi feita outras mais fáceis, isso é, programadores Ruby sabem como usar Programação Orientada a Objetos e usam todas as suas vantagens. Progamadores Python também, o TurboGears usa diferentes componentes para integrar ao seu Framework, isso é, muita coisa não é escrita do zero e já está ai faz um tempo, SqlObject e Kid por exemplo.

Problema maior se pensarmos que não existem modulos em php, não existem namespaces e nem mesmo o OO é bom. Se pegarmos o manual do PHP ( o melhor manual de linguagem existente ) podemos ver que existem 1000k de funções jogadas, que eu posso usar uma função de array em uma string e ver o circo pegar fogo! Deus, muito mais simples usar OO! implode(’;',$array) viraria $array.implode(’;'). Elegância!

Óbvio que PHP tem suas vantagens, isso é, PHP tem mod_php e apache! PHP é muito fácil de fazer rodar, o mod_php está em todos os shared hosts do mundo. Então com um simples FTP eu coloco um programa para rodar, isso é uma vantagem, mod_python nem mongrel ou outra coisa estrita para python ou ruby é tão difundida e fácil de se ver rodar estável como é mod_php, isso é um fato e conteste se quiser… Mas deployment não é tudo na vida e pode ser facilitado com uma ferramenta interessante chamada Capistrano.

Outra vantagem do PHP é que como o deployment é fácil, tem mod_php instalado na bodega perto de casa, então qualquer “programador” com apenas alguma experiência consegue colocar AQUELE formulário para rodar e salvar no Mysql, sem ORM claro… A linguagem também é fácil, não tanto quanto Python, mas é fácil e tem uma sintaxe roubada do C.

“Não sei instalar o apache” - Essa é uma frase corriqueira. Então criou-se instaladores de apache+mysql+php para o windows com um clique. Temos um ambiente de produção que podemos baixar naquele belo link encontrado no Superdownloads… Quer dizer, php é fácil para começar para web, é feito para web e algumas pessoas fizeram instaladores de um clique para ter um ambiente de desenvolvimento no seu pc com windows XP. PHP é fácil de começar para WEB. Nem python nem ruby são linguagens exclusivas para web, isso dificulta.

Concluido PHP tem suas vantagens, mas minha opinião pessoal é que a linguagem não vai evoluir muito e com um bom ritimo e que a comunidade de desenvolvedores tem sérios problemas, a Zend deveria apostar no PEAR e fazer com que mais e mais bibliotecas estejam no repositório. Mas como isso está longe de acontecer, dê uma chance a outras linguagens, Python, Ruby, Haskell, Scheme, Smalltalk ou qualquer outra coisa, abra sua mente, o mundo não é apenas PHP, JAVA ou C#, existem outras linguagens ai, com suas qualidades e defeitos, seja mais crítico quanto a que você usa e aprenda sempre alguma nova.

Published by Bastos, on August 16th, 2007 at 10:10 pm. Filled under: code, django, php, python, ruby | 14 Comments

Não use Java, use a JVM!

Eu não gosto de Java, é fato. Porém existem muito mais no mundo Java que simplesmente Java A Linguagem. Existem dezenas de linguagens que rodam na JVM, e isso é ótimo. Temos de Python à Scheme rodando em qualquer lugar que a JVM rode, temos uma “arquitetura padrão” e programas podem ser escritos em mais de uma linguagem, imagine Java com JavaScript usando Rhino ou Ruby com Python usando jRuby e Jython! Já estão falando de JavaScript ServerSide, na verdade existem o Helma, um framework serverside javascript. Certamente existem várias possibilidades se pensarmos nesse lado bom da JVM. Já no mundo java infelimente eles a cada dia complicam mais, criando siglas, frameworks e coisas esquisitas para resolver problemas que em Ruby ou Python resolvemos bem mais rápido. Estou estudando a possibilidade de usar a JVM e eventualmente Java para escrever aplicações, no momento estudando o Jetty, um servidor de servlets/http muito legal e até onde vi é possível fazer muitas coisas com ele e também estudando o Rhino. Bem é estudar e analizar até mesmo algumas coisas em java que parecem fazer algum sentido.

Published by Bastos, on August 8th, 2007 at 12:43 pm. Filled under: java, javascript, jvm, python, rhino, ruby | 4 Comments

Connector da Joynet vira GPL e Tamarin vai rodar Python e Ruby

Essa é muito legal, o Connector da Joynet vira GPL! Essa outra também é ótima, os desenvolvedores da Mozilla estão criando a nova engine JS usando a Tamarin, uma engine doada pela Adobe ( sim a engine do Flash! ), melhor que isso é que eles querem que a nova engine rode no IE sobrepondo a existente (ActiveX…) e eles vão além, Python e Ruby estarão dentro!

Published by Bastos, on July 31st, 2007 at 4:32 pm. Filled under: gpl, javascript, rails, ruby | 2 Comments

minimagick, uma alternativa ao Rmagick

Eu tinha um problema ( como sempre ) que era fazer uploads de images no rails e manipular essas imagens. A 1º solução seria o Rmagick, mas pesquisando vi que ele gasta muita memória, e isso eu não tenho no meu vps! Então procurando encontrei o minimagick, ele faz praticamente o que o Rmagick faz, só que ele é mais rápido pois executa os comandos do mogrify ao invés de manipular com o ruby e a biblioteca embutida. Então parece ser bem mais rápido!

require 'rubygems'
require 'mini_magick'
file = 'test.jpg'
i = MiniMagick::Image.from_file(file)
i.thumbnail "100x100>"
i.write('manipulated.jpg')

E para o rails vou usar o plugin attachment-fu que pode usar tanto o Rmagick quanto o minimagick.

Uma vez me lembro de ter lido que na 37signals se usa algo parecido, eles executam via linha de comando o programa parar redimensionar as imagens.

Published by Bastos, on July 18th, 2007 at 11:23 pm. Filled under: rails, ruby | No Comments

Remmember The Milk Mobile No seu Desktop :D

Eu preciso de uma maneira para me organizar, ai me lembrei do Remmember The Milk, um site que guarda as famosas TODO lists. Bem só que de vez em quando abrir o firefox ou uma aba só para entrar no RTM pode ser chato, então resolvi criar uma aplicação bem pequena que abre o RTM versão mobile em uma janelinha no desktop. Agora junto com o ALT+F2 do Gnome ou do Katapul eu tenho o rapidinho minha lista de tarefas!

Salve no diretório /usr/bin ou qualquer um que esteja no PATH. Sugiro o nome rtmtiny, depois um chmod +x rtmtiny

#!/usr/bin/ruby
#
# Remember The Milk Tiny by Tiago Bastos comechao@gmail.com
# Copyright (c) 2006 Tiago Bastos comechao@gmail.com
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

require 'gtkmozembed'

HOME_URL = 'http://m.rememberthemilk.com/'
Gtk::MozEmbed.set_profile_path(ENV["HOME"] +'/'+ ".rtmtiny", "mozilla")

class RtmTiny
    def initialize
        @w = Gtk::Window.new 'Rememmber The milk'
        @w.title = "Remmember the Milk"
        @w.set_default_size(180, 230)
        @w.signal_connect("destroy") { Gtk::main_quit }
        @w.set_gravity(Gdk::Window::GRAVITY_SOUTH_EAST)
        width, height = @w.get_size_request
        @w.move(Gdk.screen_width - width,Gdk.screen_height() - height)
        load_widget
        @w.show_all
    end

    def load_widget url='http://m.rememberthemilk.com/'
        @moz = Gtk::MozEmbed.new
        @box = Gtk::VBox.new false
        @box.pack_start @moz
        @w.add @box
        @moz.location = url
    end
end

# Main program
if __FILE__ == $0
  RtmTiny.new
  Gtk.init
  Gtk.main
end

Published by Bastos, on July 11th, 2007 at 6:16 pm. Filled under: code, gtk, produtividade, ruby | No Comments

Calculando a distância entre dois pontos no mapa usando Ruby

#Calculate distande of 2 latitude and longitude: get_distance(lat1,log1,lat2,log2)
def get_distance(a1,b1,a2,b2)
    r = 6378; #3963.1 statute miles; 3443.9 nautical miles; 6378 km
    pi = 3.14159265358979323846;
    a1 = a1*(pi/180)
    a2 = a2*(pi/180);
    b1 = b1*(pi/180);
    b2 = b2*(pi/180);
    ret = (Math::acos(Math::cos(a1)*Math::cos(b1)*Math::cos(a2)*Math::cos(b2) + Math::cos(a1)*Math::in(b1)*Math::cos(a2)*Math::sin(b2) + Math::sin(a1)*Math::sin(a2)) * r) ;
    return ret;
end

Estou estudando a API do Google Maps e fazendo uma aplicação, por isso precisei e encontrei aqui esse cálculo em php.

Published by Bastos, on June 27th, 2007 at 1:50 pm. Filled under: ruby | 2 Comments

Camping, a light ruby framework

Quando você precisa fazer uma simples aplicação, precisa de pouco código e muita produtividade, pensou em Rails? Pense em Camping também! Camping é um framework light, está para o Rails como o web.py está para o Django. Ele é simples, usa ActiveRecord para ORM e Markaby para linguagem de templates. Com uma estrutura simples você com um único arquivo faz sua aplicação toda, claro isso não é uma regra. Precisei criar uma ferramenta para editar arquivos php, a aplicação foi feita usando Ruby+Camping e tem até agora (1.0) 250 linhas. Ela roda usando Mongrel e um pequeno módulo para autenticação http. Usa menos recursos que o Rails e para uma aplicação que como essa não vai ter muitas requisições é perfeito, falta testar para aplicações com maio número de requisições.

Published by Bastos, on June 15th, 2007 at 4:49 pm. Filled under: camping, mongrel, rails, ruby | No Comments

Rake Task para backup de DB em Rails

Crie um backup.rake no lib/tasks :

require 'find'
namespace :db do
  desc "Backup the database to a file. Options: DIR=base_dir RAILS_ENV=production"
  task :backup => [:environment] do
    datestamp = Time.now.strftime("%Y-%m-%d")
    hourstamp = Time.now.strftime("%H-%M-%S")
    base_path = ENV["DIR"] || "db"
    backup_base = File.join(base_path, 'backup')
    backup_folder = File.join(backup_base, datestamp)
    backup_file = File.join(backup_folder, "#{RAILS_ENV}_#{hourstamp}_dump.sql")
    File.makedirs(backup_folder)
    db_config = ActiveRecord::Base.configurations[RAILS_ENV]
    sh "mysqldump -u #{db_config['username']} -p#{db_config['password']} #{db_config['database']} > #{backup_file} ; bzip2 -z #{backup_file}"
    dir = Dir.new(backup_base)
    all_backups = dir.entries[2..-1].sort.reverse
    puts "Created backup: #{backup_file}.bz2"
  end
end

Execute com:

rake db:backup

Levemente modificada dessa aqui.
A minha task usa bzip, não apaga backups antigos e coloca os backups do mesmo dia em uma mesma pasta, cada arquivo tem a hora/minuto/segundo do backup.

Todo: Apagar pastas antigas em certa data

[update]Melhorada aqui.[/update]

Published by Bastos, on June 12th, 2007 at 6:12 pm. Filled under: rails, rake, ruby, tips | No Comments

Rails Rodando Com Apache usando Mod_Proxy e mod_rewrite

Esta eu com um belo problema, fazer o deployment de uma aplicação escrita em Rails em um Fedora3, solução usando 2 servidores HTTP:

  • Mongrel
  • Apache

Ai veio outro problema, já existe um site rodando no apache e vai ser mantido várias partes dele, mas outras vão ser substituídas pelas páginas rodando no mongrel, isso é, eu queria continuar com a mesma base de URL para o Mongrel e para o APACHE, se fosse um arquivo que exista no servidor apache, o apache serve, se não ele passa para o Mongrel, solução: .htaccess, mod_proxy e mod_rewrite

Vi algumas outras soluções mas nenhuma tão bem elegante quanto essa:

RewriteEngine   on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule     (.*) http://localhost:3000/$1 [P]

Pronto, ele passa o que não existe (!-f) para o servidor Mongrel que já está rodando em outra porta ([P]). Me surpreendi, não esperava que fosse tão fácil assim. Parte dessa solução vi aqui.

O ruim é que não sei se dá para usar com o mongrel clustes, mas isso vejo depois…

Published by Bastos, on May 31st, 2007 at 11:04 am. Filled under: apache, rails, ruby, sysadmin, tips | 2 Comments

Rails, internacionalização etc

Estou trabalhando em um CMS para minha empresa, problema: O site será feito em várias línguas. Cheguei a instalar o plugin Globalize no rails mas foi frustrante mesmo usando o tutorial que tinha no wiki. Um plugin chamado globalize_extension simplesmente não funcionava e eu não tinha tempo, então resolvi usar o Globalize para strings como padrões como um simples “wellcome” e fazer eu mesmo o sistema para tradução de documentos, que pode não ter ficado 100% legal, mas ficou bom! Melhor que qualquer coisa feita por mim em PHP.

Rails arrasa, essa é minha primeira experiência profissional nele e estou feliz, basta agora o chefe aprovar o projeto em ruby ( mais custos com servidor, leia VPS ).

Published by Bastos, on May 10th, 2007 at 11:02 am. Filled under: code, php, plugins, ruby | 2 Comments

Rails me impressionando

Estou mudando de emprego e estou precisando fazer um sistema CMS rápido. Descartei PHP nesse novo emprego! Fui no rumo do Ruby on Rails, não me arrependo. O software está saindo rápido, coisas como acts_as_tree e acts_as_list fazem meu menu ficar fácil de manipular, não vira um order by title simpes.

Olhem esse model:

class Page < ActiveRecord::Base
  acts_as_tree :order => "position"
  acts_as_list :scope =>  :parent

  validates_presence_of  :title
end

Published by Bastos, on April 24th, 2007 at 11:31 pm. Filled under: cms, projetos, rails, ruby | No Comments

Brincando com Ruby

Estou voltando a me interessar por Ruby e suas coisas lindas, então fiz esse pequeno pedaço de código:

class Carro
    attr_reader :cor, :modelo
    attr_writer :cor
    def initialize cor, modelo
      puts "Carro " + cor + " criado"
      @cor = cor
      @modelo = modelo
    end

    def == c
      if self.modelo == c.modelo
          return true
      else
        return false
      end
    end
end    

x = Carro.new "branco", :golf
y = Carro.new "preto", :hilux
z = Carro.new "azul", :golf

if x == z
  puts 'x=y'
else
  puts 'x!=y'
end

Muito legal a sobrecarga de operadores, assim como os symbols e a sintaxe limpa, apesar de eu não gostar dos “end”. Estou de novo no Ruby pelo Rails, esse ótimo framework. Depois de experimentar o Django, outro ótimo framework, resolvi testar realmente o poder do Rails pra fazer alguns comparativos, depois falo sobre os dois.

Published by Bastos, on April 18th, 2007 at 2:23 pm. Filled under: ruby | 1 Comment