My Sublime Text Config

on December 05, 2014 17:00

Read this article listening to: 'Sublime - Santeria' (I had to put up 4 years with my former boss singing that) =P

DISCLAIMER 1: I won't get into the battle 'What is the ideal IDE/text editor?'. I use Sublime Text, I'm happy with it, so get over it.

DISCLAIMER 2: These tips apply to Sublime Text only. Some of them apply only to OS X. I'm sure you can find a way on other systems.

Sublime Text is my favorite text editor and the one I use everyday. It is a great piece of software, I make money from it, and it is just fair that the developer gets something in return. Register it!

Sublime can be highly customizable, and it takes some time to perfect it to one's needs. I've been using it for a few years, so I'm sharing my configuration so everyone can benefit from it.

First things first: I really, really, REALLY hate that logo. It's orange on gray, it is 3D, anyway, I don't like it at all. So I replaced it for a more comforting one.

My Sublime Text Logo

How to replace the logo

Get a nice logo from the internetz (this is a great one) and download the .icns file. Then, open up the Applications folder in Finder, right-click 'Sublime Text' and select 'Show Package Contents'; open 'Contents -> Resources' and replace your Sublime Text.ics file there.

Shell symlink

$ sudo ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" /bin/subl

for OS X. Adjust the path if you're using GNU/Linux.

Then you can use it to open your current directory:

$ subl .

Package Control

If you don't use it, go ahead and install it! Inside Sublime Text, type

ctrl-`

and paste the following code (don't worry, it's safe).

import urllib.request,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

Packages

Use super + shift + P and type 'Install package' to bring the package list.

General usage

  • Advanced New File: creates new files with a better interface
  • DashDoc: searches documentation in Dash
  • Emmet: creates HTML elements
  • GitGutter: marks changes in files
  • Prefixr: adds prefixes for browsers in CSS files
  • Markdown Preview
  • SidebarEnhancements: adds a lot of options when you right-click the sidebar
  • TrailingSpaces: shows trailing spaces in bright red

Language/syntax specific

  • AngularJS
  • HTML5
  • Puppet
  • RSpec
  • SCSS
  • SublimeERB: adds a shortcut for <%= %> (see below)
  • Vagrant

Code linter

Sublime Linter package with the following linters:

  • annotations
  • csslint
  • jshint
  • json
  • ruby

Note: you may run into some problems due to linter executable location. You might have to change your PATH environment variable a bit.

Preferences

This is my user preferences file. You can take this as a start for yours. I'm using Cobalt 2 theme, so you should change it to yours.

{
  "auto_complete_commit_on_tab": true,
  "bold_folder_labels": true,
  "color_scheme": "Packages/User/Color Highlighter/themes/cobalt2 (SL).tmTheme",
  "draw_white_space": "all",
  "file_exclude_patterns":
  [
    ".DS_Store",
    ".tags*",
    "*.pyc",
    "*.pyo",
    "*.exe",
    "*.dll",
    "*.obj",
    "*.o",
    "*.a",
    "*.lib",
    "*.log",
    "*.so",
    "*.dylib",
    "*.ncb",
    "*.sdf",
    "*.suo",
    "*.pdb",
    "*.idb",
    "*.class",
    "*.psd",
    "*.db",
    "*.pdf"
  ],
  "folder_exclude_patterns":
  [
    "data",
    ".git",
    ".svn",
    ".hg",
    "CVS",
    ".sass-cache",
    ".bundle",
    "bundle",
    ".rbx",
    "tmp",
    ".tmp",
    "htdocs"
  ],
  "font_face": "Monaco",
  "font_size": 18.0,
  "highlight_line": true,
  "highlight_modified_tabs": true,
  "ignored_packages":
  [
    "AdvancedNewFile",
    "Gutter Color",
    "Vintage"
  ],
  "tab_size": 2,
  "theme": "Cobalt2.sublime-theme",
  "translate_tabs_to_spaces": true,
  "trim_trailing_white_space_on_save": true,
  "use_tab_stops": true,
  "word_wrap": true
}

Keybindings

  // ERB - prints <%=  %>
  { "keys": ["ctrl+shift+."], "command": "erb" },

  // Reveals the current file in sidebar
  { "keys": ["ctrl+super+r"], "command": "reveal_in_side_bar" },

Your turn

Do you use Sublime Text and want to share your tips, suggest packages, share alternate icons? Use the comments!

References

Comments

Salvando SQL views no schema em aplicações Rails

on October 13, 2014 14:51

Se você usa views na sua aplicação Rails, seja porque ela é uma aplicação legada, ou elas são usadas para simplificar as consultas para relatórios, por exemplo, pode ter alguns problemas na hora de fazer o setup do projeto em uma máquina nova.

Eu não sabia (até hoje), mas o schema.rb não guarda as informações de criação das views, que você provavelmente fez em uma migration. Afinal, a não ser que tenha usado uma gem específica pra isso, você usou SQL puro para criar a migration.

Quando tive esse problema, pensei em fazer isso no db/seeds.rb, e mandar executar o SQL, mas não parecia uma solução muito elegante, afinal eu não estava criando dados de seed, mas criando estrutura. Daí eu encontrei a solução perfeita.

Para fazer a migration exportar as views, devemos mudar o formato dessa exportação para SQL. Você pode fazer isso no application.rb:

# config/application.rb
config.active_record.schema_format = :sql

ou, se você estiver numa aplicação Rack qualquer, pode colocar no seu Rakefile:

# Rakefile
ActiveRecord::Base.schema_format = :sql

Quando você executar a migration, gerará um arquivo structure.sql em vez do schema.rb.

Para carregar, em vez de rake db:schema:load, use:

# console
$ rake db:structure:load

E as views serão criadas.

Fonte: Using Rails and SQL Views for a Report

Comments

Migrando dados entre sistemas de bancos de dados com ActiveRecord

on September 22, 2014 12:13

Recentemente migrei este blog de MySQL para PostgreSQL.

Um dos problemas que tinha que resolver era migrar os posts existentes sem perder dados. Como os formatos de dump podem ser incompatíveis, resolvi usar o próprio ActiveRecord para me ajudar a migrar os dados.

Baixei um dump do MySQL, carreguei num BD local, e criei um banco novo no PostgreSQL.

Como eu refiz todo o código (a versão do Rails estava em 2.3.x :p), já configurei o database.yml para usar o adapter do PostgreSQL:

# config/database.yml
development:
  adapter: postgresql
  encoding: unicode
  database: blog_development
  pool: 5
  username: root
  password:
  socket: /var/pgsql_socket/.s.PGSQL.5432

Então o que eu tive que fazer foi configurar uma nova conexão para o banco legado em MySQL:

# config/database.yml
legacy_development:
  adapter: mysql2
  database: blog_development
  username: root
  password:
  port: 3306
  host: localhost

A partir daí criei um model temporário, usando a conexão MySQL:

# app/models/legacy_post.rb
class LegacyPost < ActiveRecord::Base
  establish_connection :legacy_development
  self.table_name = "posts"
end

Daí foi só entrar no console e rodar o script:

# console
LegacyPost.all.each do |legacy_post|
  Post.create(legacy_post.attributes)
end

A partir daí você pode apagar o model e editar a configuração do banco legado.

Comments

Organizando textos para leitura

on August 27, 2014 17:44

Faz anos que acabei a faculdade, mas nunca parei de estudar. No mundo de TI manter-se atualizado é obrigatório (a não ser que você queira fazer a mesma coisa pelo resto da sua vida – não recomendo). Foi assim que descobri Ruby, a ascensão do JavaScript e os inúmeros esquemas de deployment e virtualização que existem hoje.

As informações estão por todo lado na internet, mas vêm de muitos lugares diferentes, e nem sempre dá pra ler aquele artigo naquela hora que você o encontrou. Então como guardar este texto e salvá-lo para ler depois? Que ferramentas usar?

Há muitas opções por aí, muitas free, outras pagas. Depois de muito experimentar, acabei chegando num esquema que considero adequado. Lógico, as coisas podem mudar (RIP Google Reader), então é sempre bom estar atento a todas as ferramentas.

As ferramentas

Vou explicar detalhadamente como uso cada uma delas, mas segue aí a lista do que uso atualmente:

  • Pocket
  • Evernote
  • Feedly
  • Kindle (ou iPad mini)
  • IFTTT

Fontes de informação

Além do Feedly, onde assino os feeds que mais me interessam, as informações podem vir do Twitter (siga-me!), do Facebook ou mesmo de uma busca por algo específico no Google.

Para textos simples

Se é um texto simples, mando direto para o Pocket. Praticamente todas as fontes de informação têm suporte para envio para o Pocket (extensões para browsers cobrem o resto), então é algo realmente simples. Depois de lido posso arquivar ou enviar para o Evernote. Daí o próximo tópico.

Para arquivar

O Evernote é ótimo para manter um arquivo de absolutamente tudo. Eu faço backup das fotos do Instagram, checkins do Foursquare Swarm (via IFTTT – ver abaixo), tiro fotos de contas para pagar depois e principalmente arquivo tudo o que me é relevante para ter a informação sempre que eu precisar. Você pode organizar as notas em notebooks e tags. Especificamente, eu uso um notebook chamado ‘Bookmarks’, que posteriormente posso organizar por assunto que eu esteja estudando. As tags ajudam a (excelente) busca.

Leituras longas

Nada bate o Kindle e seu e-ink para leituras mais longas. Eu tenho um Kindle Paperwhite e adoro. Então se vejo que um texto é muito grande, já mando pro Kindle (via email ou extensão de browser) e também pro Evernote. Lógico que livros entram nessa categoria. Já livros em PDF, que talvez não fiquem bem no Kindle eu mando para o iBooks, daí eu leio no iPad mini. Também é possível mandar a partir do Pocket (ver abaixo).

Integrando com o IFTTT

O IFTTT (If This Then That) é uma excelente ferramenta para automatizar coisas. As receitas que utilizo para organizar meus textos:

  • From Pocket to Kindle – às vezes salvo um artigo no Pocket mas reparo que ele é meio longo, e seria melhor ler no Kindle. Sem problemas, aplico a tag ‘kindle’ no Pocket e ele envia para o meu email registrado no Kindle para receber textos
  • From Pocket to Evernote
  • Save favourite tweets to Evernote

E você? Como faz para organizar os seus textos para leitura? Descreva nos comentários.

PS: este post faz parte de uma iniciativa do @rafaelrosafu chamada #ClubeDosPosts de incentivar as pessoas a escreverem pelo menos um post por mês relacionado a TI. Se quiser participar, acesse a planilha e inclua seu twitter handle.

Comments

RailsConf 2011, here I go

on May 15, 2011 14:00

Primeiro post do ano, como o tempo passou. Não foi nem falta de tempo, mas falta do que escrever mesmo. Mas agora (hoje) parto para a "RailsConf 2011":http://railsconf.org em Baltimore, e espero ter muitas coisas para escrever depois de voltar.

Destaco algumas palestras que devo assistir:

  • From 1,000 Transactions a Month to 1 million in a Day: Lessons in Credit Card Processing from LivingSocial

  • Keeping Rails on the Tracks

  • Solving Performance Problems with Horizontal Scale. (The Worker Pattern)

  • Beyond MVC -- DCI

Antes da RailsConf, também participarei da Ignite RailsConf, com palestras de 5 minutos, 20 slides.

Depois da conferência, tiro alguns dias de férias para visitar Nova York, e realizar um de meus sonhos: assistir a um jogo no Yankee Stadium.

Agradeço à "Bio Ritmo":http://www.bioritmo.com.br por possibilitar essa experiência que será muito importante para minha vida e carreira.

Até a volta!

Comments