Заметка на полях - XCode сохраняет скриншоты с устройств в ~/Library/Application Support/Developer/Shared/Xcode/Screenshots
30 июля 2009
17 июля 2009
Colored svn diff
С подачи Тапа делаем svn diff а-ля гит - цветной и в less'е:
2 svn diff | awk '/^\+(.*)$/ { print "\033[32m" $0 "\033[0m"}; /^-(.*)$/ { print "\033[31m" $0 "\033[0m"}; /^[^+-].*$/ {print $0}' | less -r
на 13:39 0 коммент.
14 июля 2009
О моветоне в поведении моего блога
Обратил внимание после того, как мне пришёл комментарий. Внезапно в ленте руникса всплыли все (или многие, не суть) мои записи про линукс. Подозреваю в этом глюк гугла, который недавно заподозрил мой блог в спаме и заблокировал, вероятно происшедшее - результат разблокирования. Хотя в ридере лента этого блога не обновилась (да, я читаю себя и иногда даже нахожу опечатки и отправляюсь править пост), так что это может быть и глюк агрегатора руникса. Делайте выводы.
на 17:45 8 коммент.
Роутинг в Camping, Regexp'ы в Ruby
Если коротко - не следуйте документации в способе задания роутов для контроллеров. Документация советует так:
PS: если кто запамятовал, то %r!regexp! (где вместо ! может быть и другой символ) - это такой способ обрамить регексп, наряду с /regexp/
на 12:41 0 коммент.
12 июля 2009
Github'но-тестировочное
Смотрел я тут скринкаст на тему ObjC, было там немного про тестирование, и понял я - дальше так нельзя - тестировать. Полез в гугль (хотя кхе, туда я за этим давно залезал, руки не доходили применить), тот меня выкинул сначала на одного из коммитеров в Camping с его тестсьюитом 'camping/test', а потом и на mosquito в репозитарии автора того самого скринкаста. Скажу сразу, москит отстал от жизни и не работает, зато в том репозитории нашлось много полезного: ruby-style категории над основными Cocoa классами, скрипты для правильной максимизации окна (очень пригождается с MacVim) и куча пищи для размышлений.
Заодно накидал Rake task для дампа фикстур из используемого кемпингом (и только кемпингом, забудем про Rails, аминь) sqlite:
2
3 require 'rubygems'
4 require 'activerecord'
5
6 desc "Generate fixtures for all tables of current project"
7 task :generate_fixtures do
8 database = "#{ENV['HOME']}/.camping.db"
9 ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => database)
10 project = File.basename(File.expand_path('.')).downcase
11 tables = `sqlite3 #{database} ".tables"`.split(' ').reject{ |t| t.include?("sessions") || t.include?("schema_infos")}.collect{|t| t if t.include? project}
12 tables.each do |table_name|
13 File.open("test/fixtures/#{table_name}.yml", 'w') do |file|
14 data = ActiveRecord::Base.connection.select_all("SELECT * FROM #{table_name}")
15 rows = {}
16
17 data.each do |record|
18 rows["#{table_name}_#{record['id']}"] = record
19 end
20
21 file.write rows.to_yaml
22 end
23 end
24 end
Там много 'длиннострочников', но понять можно. Дампит все таблицы используя в качестве имени проекта имя текущей директории.
Не могу не пнуть попутно юродивый svn - перед тестированием всего и вся разложил сорцы по полочкам, так svn положенный в другое место файл считает новым, в то время как гит даже частично патченный и перемещённый после этого файл понимает и считает именно перемещённым.
Думается, пора покрыть тестами, оформить и выкинуть на гитхаб в виде библиотечки часть одного интересного проекта, но это уже как руки дойдут.
Stay tuned.
на 23:45 0 коммент.
05 июля 2009
ActiveSupport и Logger
NEVER Override Existing Methods.
Never, ever do this. Never override an existing method. Period, full stop, no excuse.
Rails Worst Practices: 13 Coding Nightmares You Should Avoid
Сначала грешил на Camping. А Camping использует ActiveSupport. И вот к чему это приводит.
ActiveSupport весь такой на белом коне приходит и превращает все сообщения стандартного логгера в абсолютно бесполезные puts без какой-либо полезной информации о времени и уровне сообщения. В документации способ отключения этого безобразия либо нерабочий либо нетривиальный - у меня не пошло. Ну так по рукам ему за это!
на 14:22 1 коммент.
04 июля 2009
ActionMailer с Gmail без Rails: Camping
В последнее время пишу прототип внутреннего сервиса на Camping. Попутно должен заметить, что это весьма хорошая штука от чокнутого _why для очень быстрого прототипирования - весь мой фронтэнд лежит в одном файле и занимает 150 строк.
И само собой, без отправки электронной почты не обошлось. А раз уж camping это такие очень маленькие рельсы - почему бы не встать на плечи ещё одного из гигантов мира рельс - ActionMailer. К условиям задачи добавилась и необходимость использования Google Apps for Domains.
Первым делом нужно научить Ruby <= 1.8.7 там авторизоваться:
sudo gem install openrain-action_mailer_tls -s http://gems.github.com
подробнее
и в корне проекта с camping приложением создаём mailer.rb
# for this example the folder structure should be as follow
#
# --+ camping_project_root
# |-- mailer.rb (this file)
# |--+ mailer
# |-- new_account.erb
require 'rubygems'
require 'action_mailer'
require "smtp_tls"
class Mailer < ActionMailer::Base
def new_account(bar)
recipients recipient
from "noreply@company.com"
subject "New account confirmation"
body :foo => bar
end
end
Mailer.template_root = File.dirname(__FILE__)
Mailer.smtp_settings = {
:address => "smtp.gmail.com",
:domain => "company.com",
:port => 587,
:user_name => "noreply@company.com",
:password => "noway",
:authentication => :plain,
:enable_starttls_auto => true
}
И в camping приложении подключаем этот мэйлер.
на 20:33 0 коммент.