Showing posts with label Программирование. Show all posts
Showing posts with label Программирование. Show all posts

Saturday, September 27, 2008

Apache on Rails

Основным рецептом развертывания Ruby On Rails приложений всегда был mongrel cluster в связке с nginx.
Этот способ вполне сносно работал, однако сейчас  ему появилась реальная альтернатива: passenger - плагин (мод) для apache.

Он обладает следующими преимуществами:
 - Очень просто конфигурируется
 -  стартуется/рестартится в одну строчку
 - работает быстрее
 - есть столько ресурсов сколько нужно в данный момент (новые инстансы обработчика делаются через fork когда нужно)

На мой взгляд переход в существующих проектах является сомнительным, однако новые проекты я бы рекомендавал запускать сразу под ним.

В дополнение можно отметить его удобство при разработке на локальной машине, особенно под OS X

ПС
У меня заняло около 10 минут на все. Есть HOWTO на railscasts 

Monday, August 18, 2008

Добавление google translate к TextMate

ставим 

sudo gem install google_translate

Добавляем следующую комманду для всех типов фаилов. Результат - tooltip, Источник - selected text or word. Сначала смотрим если слово уже искалось, если нет - идем в гугл.

#!/usr/bin/env ruby
require 'rubygems'
require 'google_translate'
dict = "~/dict"
space=" - "
text= STDIN.read
local_trans = `cat #{dict} | grep '#{text.strip}#{space}'`
if(local_trans.empty?())
trans = Google::Translate.new().translate(:from => "en", :to => "ru", :text =>text)
`echo '#{[text,space,trans].join}' >> ~/dict`
puts(trans)
else
puts("local:"+local_trans.split("-").last.strip)
end

горячую клавишу я повесил на CMD+J (было свободно)
работает очень бысто (менее секунды на поиск, если локально - тогда мгновенно)

Tuesday, August 12, 2008

Лекарство от регулярно падающего mongrel

При развертывании любого RoR проекта приходиться иметь дело с mongrel, а в случае серьезного проекта и с mongrel cluster. Как извесно, mongrel вещь сильно глюканутая: немногопоточная, часто память течет. В следствии этого появилась идея объединить несколько экземпляров в один кластер и привизать его к балансировщику nginx/apache. После этого жить стало лучше, но и кластер склонен к падению (в зависимости от типа запросов, монгрил может осилить от 500 до 1000 запросов, а потом утекает память или еще что случается), следовательно дела все равно плохо. Проблема заключается в том чтобы не доводить никого до плачевного состояния и последовательно рестартить по одному экземпляру за раз. 

Решение: каждые экземпляр рестартим раз в 10 минут, в случае с сервером работающем под высокой нагрузкой рекомендую каждые 5 минут. Кроме всего прочего скрипт живет в виде демона, которого не сложно положить в автостарт.

#!/usr/bin/ruby

pid = fork do
  cluster_size = `echo $CLUSTER_SIZE`.to_i
  life_time = 600 #10 mins
  span = life_time.to_f / cluster_size
  intance = 0 # mongrel id
  loop do
    mongrel_id = 3000+intance
    `mongrel_rails stop --pid log/mongrel.#{mongrel_id}.pid `
    sleep 10
    `mongrel_rails start -d -p #{mongrel_id} --pid log/mongrel.#{mongrel_id}.pid`
    intance+=1
    intance=0 if intance == cluster_size
    sleep span.to_i
  end
end
puts pid
Process.detach(pid)

Monday, November 19, 2007

Rails: scope_out plugin

Тестирование flash в функциоальных тестах в связке с cacheable_flash

При использование плагина cacheable_flash который сохраняет объект flash в cookies на клиента в связке с функциональными тестами приходиться использовать нестандартный подход при тестировании содержимого это объекта, в связи с тем что после загрузки в кэш, flash становиться пустым.

решение:
 в test_helper.rb  кладем метод:
def get_flash_message(key)
key = key.to_s
begin
JSON.parse(cookies["flash"].value.first)[key]
rescue Exception => e
""
end
end

теперь в тесте пишем:
assert_equal "Thanks for you comment", get_flash_message(:notice)

проблема решена!

Monday, September 24, 2007

Какой же линукс мне подходит

http://www.zegeniestudios.net/ldc/index.php - тут есть незатейливый тест на то какой дистриб линукса мне подходит. Мне подходит..... а вот и не правда: мне линукс не подходит:
"Жаль, но ни одного соответствия не найдено. Измените ваши требования и попытайтесь ещё раз."

Еще бы - мне только мак подходит =)

Sunday, September 23, 2007

Анимация как сесть в позу лотуса или стукнуть себя

Любому программисту бывает необходимо сесть в позу лотуса, медитируя над индуским кодом, если вы еще не знаете как это сделать - тут все объяснено с помощью анимации:
http://www.flashmavi.com

Saturday, September 22, 2007

TextMate 1.5.1 - Разум и Гугл победили

http://rs59gc2.rapidshare.com/files/10179568/1553554/TextMate_1.5.1.dmg - можно качать смело: кряка не требуется, работает стабильно. Одним словом - то что доктор прописал

Wednesday, August 15, 2007

MySql for Mac

Поставился как родной: никаких лишних вопросов - пару раз кликнул - вот и готово. Прописал коннекшн в database.yml в Рельсовом приложении - уже и работает. Под Windows MySql ставиться гораздо с большим геммороем: кнопку Next устаешь давить.

Что касается других настроек мака - тут тоже все просто и плавает в System Preferences или Application/Utilities. Больше ничего не требуется. При этом лишнии опции напросто отсутсвуют, в отличии от Windows. Про Linux я вообще молчу

Wednesday, July 11, 2007

Руби по .NET Framework или .NET on Rails

Ради интереса посмотрел как можно писать на руби под .NET фреймворк. Оказывается сделали нормальный компилятор совместимый с CLS (Common Language Specification) и Ruby 1.8.5. По крайней мере формочки из руби заработали с пол пинка. Так что скоро буду писать и под .NET на руби.

Компилятор и Ран-таим библиотеки можно взять отсюда (есть исходник парсера, который дает нормалый AST)

Thursday, June 28, 2007

Разработка плаггинов для Ride-Me

Вчера я писал про новую IDE для Ruby. Удивительно что все разрабочики живущие на Windows не используют ее. По сравнению с ней RoRED мягко говоря похож на блокнот. Про Scite - я молчу, сравнивать тут не с чем. Оказвается в Ride Me есть и навигация на метод, открытие фаила по имени и пр. Одним словом, есть почти вся функциональность Visual Studio 2002. Присутствует нормальный интерфейс к script/generate, старт веб-сервера, прогон тестов. Однако кое-чего не хватает:
1. Сниппетов - есть управления ими, но нет клавиши которая их вставляет (странно, но факт).
2. Отсутсвует автодополнение контрол-пробел не работает - а это совсем не приятно.
3. Нет нормального отладчика.

В результате я решил написать небольшой плаггин, который по крайней мере будет включать в себя фиксы для #1 и #2. Потратив пару часов - у меня получилось что-то похожее на желаемое - не идеально, но жить можно.

Если кто-то хочет посмотреть что из этого получилось - кидайте в комменты - выложу с исходниками на C#.

В дальнейшем планирую сделать парсер для Ruby ( нормальный с помощью antlr), сделать нормальный автокомплит, парсер для require "file.rb" (содержимого ссылок).

Под нормальным автокомлитом я подразумеваю следующее:
def test_method1
Message.| #тут получить список статических методов класса Message (разрешимо).
end


def test_method2
user = User.new()
....
user.| # здесь по-идеи можно сделать автокомплит, т.к. тип известен всегда (User)
end

def test_method3 my_arg
my_arg.| # тут его уже не сделать в принципе, только если искать ссылки и пытаться найти инициализацию объекта который оказывается в качестве параметра.
end

def test_method4
a = "hello" #тип - String
test_method3 a # по-идее теперь в методе test_method3 можно предугадать тип параметра my_arg, однако это уже не тривиально.
end

Еще бы хотелось иметь рефакторинг.... rename, выделить интерфейс, метод и пр...

Wednesday, June 27, 2007

Очередная IDE для Руби

Наткнулся на очередную адешку для руби. Из того что я видел на настоящий момент, я использую только Scite и RoRED. Несмотря на всю неизощеренность первого и глючность второго, пришиходиться жить с ними. Не спорю: для мелких изменениях в отдном фаиле - логичные выбор Scite - маленький шустрый, есть автодополнение и подстветка. Все. В RoRED есть сниппеты (аналог вижуа студийным). Но нет даже элементарного комплита. Не радует. Жить можно, но очень скромно.

Вот наконец нашел нечто, что смело можно назвать IDE - Ride Me:
- Полностью написан на .NET 2.0
- Использует текстый компонент от известной .NET IDE - #Develop
- Поддерживает Rails
- Интегрируется с Rake'ом
- Старт-Стоп проекта из IDE
- Есть API для создания плагинов (далеко не полный)
- Есть пара плагинов (SVN интеграция и еще один)
- Сурцы лежат в SVN
- Кусок сниппетов (не работает пока)

В качестве вечернего отдыха написал небольшой плаггин, который делает автокомплит бокс со всеми словами из фаила. Ушло на это часа 2... не слишком долго. Постараюсь подогнать его под свои нужды:
1. Автокомплит (парсить весь проект)
2. Быстрая навигация по проекту
3. Студийные сниппеты.

В любом случае всегда ходел сделать свою IDE, а тут уже и движок есть.
Занятия на вечера теперь нашел...

Единственный минус - автор на это дело тихо забил.

Tuesday, May 29, 2007

30 Дней - 30 Приложений

Уже почти пол года назад один зарубежный товарищ начал (и через месяц закончил) каждый день писать по одной малелькой и простой программке на C# 2.0.
Среди совсем простых, есть и достаточно интересные:
взять окно и вставить его в внутрь своего приложения. Честно признаю, я решения сходу не знаю. А есть простое шедулеры (scheduler)

Особо стоит отметить работу с воспроизведением текста (String) в виде аудопотока - судя по иерахии классов (интерфейс к стандартным возможностьм ОС), половина Windows нужна чтобы читать вслух.

Все исходники открыты, лицензия GPL + если еще полезные обертки над Windows

Thursday, May 24, 2007

Экспорт данных ввиде SQL Dump с сайта на Ruby

Наконец-то совершилось! Это юбилейный, сотый пост в моем блоге. не прошло и пол года с момента создания, как наступил этот юбилей. Т.е. в среднем я пишу 0.75 поста в день.. не очень много, но если вычесть выходные, то получиться ровно 1 (выходных у нас много), так что почти приближаюсь к общеинтернетовскому стандарту: 1 день - 1 пост (или больше). Ладно не буду писать оффтоп. перейду к теме поста.

Иногда, в целях быстрого бекапа и переноса данных требуется сгенерить полный дамп базы, при этом дамп должен быть в формате SQL - запустил и работает. Обычно для таких целей используют phpMyAdmin (для MySql, разумеется. Все сказанное ниже применимо только к нему). Но вот если требуется сделать это в адинистративной части? и на Ruby? тут уже copy-paste не прокатит.

Решение

В поставку стандартного MySql входит утилита mysqldump - умеет генетить то что нам надо, но вот только ей еще и параметры нужно дать правильные, да и еще и вызвать , и пот ом результ работы с диска снести...
итого имеем (работает везьде, под любой проект и ос - с этим больше всего гемморился):

require 'yaml' #Для чтения database.yaml
require 'pathname' #Для определения абсолютных путей (требуется для Unixов)

class DumpManagerController <>
def index
response.headers['Content-type'] = 'text/sql' #правильный MIME тип
response.headers['Content-Disposition'] = "attachment; filename=dump.sql" #Чтобы сразу можно было качать
rebuild_dump_file()
dump_sql_file = File.open(output_file)
dump_content = ""
dump_sql_file.each { |line|
dump_content +=line
}
dump_sql_file.close #Чистим мусор
File.delete(output_file)
render :text=>dump_content #Пишем в поток
end

protected
def rebuild_dump_file
command = build_mysqldump_command()
system command #Вызываем комманду
end

def output_file
rails_directory+"/dump.sql"
end

def rails_directory
Pathname.new(__FILE__).realpath.dirname.dirname.dirname.to_s #Главная директория рельсов
end

def build_mysqldump_command
env = ENV['RAILS_ENV'] || 'development'
database = YAML::load_file( rails_directory+'/config/database.yml')
password = ""
password = "--password=#{database[env]['password']}" if (database[env]['password'])
"mysqldump -u #{database[env]['username']} #{password} #{database[env]['database']} > #{output_file()}"
end
end


В последнем методе генерим комманду, для этого нам нужен логин, пароль и имя базы (можно еще и хост, ну ладно его пропустим, но можно было бы и настроить)
Данные читаем из конфига (благо ЯМЛ поддерживается)

Вот вообщем и все. Надеюсь будет полезно.
П.С.
Сделать в Sql Server подбную штуку штатными средствами нельзя.. потому что Microsoft думает что это никому не нужно. Приходиться мучаться и делать генераторы SQL на основе мапперов.

MySql - респект

Sunday, May 6, 2007

Кросс-платформенные приложения с GUI на Ruby

Ради и интереса решил разобраться с тем как можно создать обычное приложение с формочками с Ruby. Сделать это можно с с помощью 2-х библиотек:
Tk и Gtk. Первая - шутка изначально сделана под язык Tcl (с ним я не сильно знаком, и использовать его мне не доводилось). Вторая - кросс-платформенная библиотека. Обе позволяют абстрагироваться от ОС. Не то чтобы я решил писать оконные приложения под Linux и пр, откозавшишь от .NET. Просто интересно.

И так, для начала я решил посмотреть на Tk. Ставиться вместе с Ruby. Сначала немного о внутреннем устройстве. В сердце библиотеки лежит иерахия классов лежат TkEntry и TkFrame. Остальное наследуется от них. Есть Layout Manager'ы, как в Swing под Java.
Так же есть около 30 элементов управление, но нет combobox (извесный как drop down list), я не нашел, зато есть уже готовый контрол, но не являющиейся частью библиотеки и входит в примеры. Есть Grid(TkGrid, в .NET аналог DataGrid и GridView), это очень удивило. В плане готовых компонентов, проблем нет. К тому же есть библиотека красивых расширений - iwidget - там много всего интресного есть.

Теперь немного практики:
сначала делаем
require 'tk'
TkFrame.new(){|f|
label = TkLabel.new(f, :text=>'Hello, World').pack(:fill=>:x)
}
Tk.mainloop

Все! есть формочка c надписью, растянутой на весь экран по ширине.
Как это работает:
сначала делаем главной элемент - саму формочку (f)
дальше на нее (первый аргумент конструктора TkLabel) кладем созданый объект у которого свойство текста установленно в "Hello, World". После этого располагаем созданную надпись на окне с соотвестующим Layout

Вот в общем и все. В заключение могу порекомендовать посмотреть на это собственными глазами.
Примеры можно найти в папке, куда установлен Ruby: samples/tk

П.С.
Если Вы заметили неточность или ошибку - пишите в комменты плз


Friday, April 27, 2007

Яндеск пульс

Наконец-то нашел штуку- Яндекс Пульс в которую просто интересно тыкать, хотя и с пользой...
Основная идея:
Посмотреть статистику по поиску по запросу и сравнить его с другими.

Например:
Ruby:
за день: 8 запрос в день
максиум: 140 за день.

и т.д.

Есть предчувствие что в среднем 5-7 человек по этому запросу доходят до моего блога...

Wednesday, April 25, 2007

Ruby Development with IntelliJ IDEA

Не так давно была выпушена новая версия IntelliJ Idea (7.0, но пока только бета). Оценить ее нововведения в плане Java я пока не успел (уже почти год ничего под Джаву не писал и не планирую). На днях узнал что под нее был сделан плагин для разработки под Ruby (в том числе и реилсы). О том как это дело ставить см здесь.
Что касается советов: на забудьте установить в пассы путь к инстант реилсу (%Instant Rails%\ruby - это должно быть в путях). В остальном ставиться и запускается без проблем.

Что касается моих замечаний:
(-)
1. Рефакторингами и не пахло, а жаль.
2. Код-комплит работает не слижком хорошо
3. Парсер не идеален:
class Parser
def parse(query)
result = ""
result<<"select * from '" # с этим не справился
result<
4. Нет дебага
5. если после "<%" нажать пробел появиться "%>" в не зависимости от того что впереди
6. Кушает это дело 200 Мб памяти, так что не сильно разгуляешься.
7. Открытие проекта занимает 2-3 минуты на не самом старой машине
8. Не знает по загруженные модули (на ctrl+пробел не беруться)

(+)
1. Есть интеграция с generate. Можно сказать генери котроллер, мигрейт и пр.
2. По рану запускается webrick
3. Кое-где есть нормальный код-компит
4. Автозакрывание "end"-ом
5. Древовидная структура проекта (это не табы из Total Commander!)
6. После загрузки быстро работает
7. Есть поиск места определения (класса, метода).

Вердикт: буду использовать. надеюсь что польза от этого дела будет.

Tuesday, April 24, 2007

Веб Сервисы в Ruby on Rails

Как известно, web-службы (веб-сервисы) являются частью концепции Web 2.0. Ruby on Rails специально создавался для разработки приложений в этом стиле. Разумеется, его создатели не обошли вниманием и эту полезную функциональность: поддержка есть. Сделаны они очень добротно и просто. Постараюсь в крации описать процесс создания простой службы.


1. Выполняем: rails MyApp
2. Выполняем: ruby script/generate web_service MyService
3. в app/apis/my_service_api.rb прописываем в теле класса следующее api_method :get_config
4. в app/controllers/my_service_controller.rb прописываем тело нашего метода:
def get_config
#do something
end


Вот и все! теперь у нас есть WSDL веб-служба, которую можно использовать, например, из .NET (работает, однако).


что касается быстроты написания - не сложно заметить, что пишется это моментально...

Ну а вот безопасности этого дела, этим я еще не занимался.

Thursday, April 12, 2007

Применение Экстримального Программирования на практике

3 Недели назад начал применять практики из экстримального программирования (ныне плавно эволюционировавшего в Шуструю разработку - Agile Development. Просто название у первого более красивое... как раз для заголовка) в проекте, над которым я работаю уже почти год (9.5 месяцев). Проект представляет из себе нечто похожее на небольшую ERP систему, которая должна сменить в производстве старую версию системы, для решения проблем автоматизации некого заграничного предприятия.

Причины которые, подтолкнувшие меня к этому шагу:
- Необходимость в автоматическом тестировании (С ручным, я просто не мог справиться)
- Большое количество новых фунциональностей, необходимостить в которых возникла в последнее время
- Переработка существующего кода, что более 3м клиентского и серверного кода - Рефакторинг (Refactoring). Часть которого использует достаточно не стабильный компонент, от которого со временим придеться избавиться (в следующей версии... через год)
- Короткие релизы - раз в неделю, чтобы конечный пользователь мог оценивать результаты и выдыигать свои пожелания.
- Постоянное общение с заказчиком.


От работы не более 40 часов в неделю пришлось отказаться - сроки...

Как показала практика, идея себя оправдала:
В последнем релизе не было обнаруженно ни одного изъяна (тестировали его под нагрузкой в реальных условиях, с самыми произвольными данными).
До этого, в 3-х недельных релизах находили по 20-25 проблем.

В результате, основной упор был сделан на Test-Driven Development (по-русски: пишешь тест - потом уже код логики) и рефакторинг (приписал тест ко компоненту и рефакторишь его). При этом в паре эти практики оказались гораздо более эффективными, нежли поодиночке.

При этом, это далеко не первый мой опыт работы в стиле Agile, но подобных результатов он мне еще не приносил.

Осталось пересилить в себе свинью, и начать писать тесты всегда и с самого начала.

В дальнейшми постараюсь поделиться своим опытом более развёрнуто, с конкретными примерами.

П.С.
Сегодня будет первая ночь за последнюю неделю, когда я могу спать спокойно.