вторник, 29 декабря 2009 г.

практика JRuby

Как вызвать ява класс из jruby


JString = java.lang.String
JString.new


Но если нужен ява Object ,то делаем так

['test'].to_java



Создаем JTable используя swing из jruby

# создание таблицы из 6 строк и 3 столбцов

@table = JTable.new(6,3)


# назначим в ячейке значение "значение"

@table.getModel.setValueAt("значение",номер_строки,номер_столбца)


#добавим строку

@table.getModel.addRow(['a','b','c'].to_java)


#удалим саму первую строку

@table.getModel.removeRow(0)


# или удалим выделеную строку

@table.getModel.removeRow(@table.getModel.getSelectedRow)



пятница, 11 декабря 2009 г.

Заведи себе обменник

Валют много.
Обменников не меньше.
Но конкуренция выгодна мне лично - будут снижать проценты.
Потому кому нужен обменник - качайте.
http://github.com/pronix/changer
в стандартной поставке - все вебмани и paypal
Надежный быстрый и можно посмотреть админку(typus)
Реализация на ruby-on-rails

пятница, 4 декабря 2009 г.

spree yandex.market

У всех приличных торговых организаций есть интернет магазин.
У которых нет - не приличные организации живущие в пещере.
Лучший интернет магазин конечно spree
Но когда ищу товар в интернете, я иду на яндекс.маркет.
Значит надо дать возможность с магазина выгружать товар в яндекс.маркет.
Эту возможность дает плагин spree-yandex-market


Расширение предназначено для выгрузки списка товара в Яндекс.Маркет.(http://partner.market.yandex.ru/legal/tt/) При экспорте передаеться следующая информация:

1. Название магазина и его url.
2. Валюты используемые в магазине.
3. Категории товара.
В качестве категорий выгружаемых в файл используется один из 'Таксонов', который задается в админке Яндекс.Маркет.
4. Список товара.
При выгрузке Товар может быть описан несколькими типами:
1. "vendor.model" - Основной тип описания, рекомендуемый
2. "book", "audiobook" - для книг и аудиокниг
3. "music", "video" - для музыки и видео
4. "event_ticket" - билеты на мероприятия
Определение типа описания происходит следующим образом: если в свойстве товара,которое определено
в "Типе продукции" (Wares Type), одно из следующих значений ["book", "audiobook", "music", "video",
"event_ticket"] то товар выгружается в соответствии с типом продукции, если свойство "тип продукции"
не определено или нет нужного значения ,то описыаеться по основному типу "vendor.model"

Формирование файла экспорта:

Файл формируется следующей командой: RAILS_ENV=#{RAILS_ENV} rake spree:extensions:yandex_market:generate_ym
Сформированные файлы сохраняются в папку ROOT_RAILS/public/yandex_market с формируемым именем
файла "yandex_market_%Y_%m_%d__%H_%M".
Для Яндекс.Робота создаться линк на самый последний файл ROOT_RAILS/public/yandex_market/yandex_market.gz,
который доступен по адресу http://[host]/yandex_market/yandex_market.gz
Формирование файла можно делать через крон или запуском команды из блока администрирования.

Установка

script/extension install git://github.com/pronix/spree-yandex-market.git
Для периодического формирования файла экспорта запишите в крон следущую команду:
cd #{ RAILS_ROOT } && RAILS_ENV=#{RAILS_ENV} rake spree:extensions:yandex_market:generate_ym

Настройка

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

воскресенье, 11 октября 2009 г.

QtRuby: Slots

Способы создания не стандартных слотов для обработки событий.

1. Очевидный

class CustomWidget < Qt::Widget
slots 'customslot()'
def customslot()
# действие
end
end
Qt::Object.connect(signalobject,SIGNAL('signal()'),
customwidget,SLOT('customslot()'))

2. Задание блока
Qt::Object.connect(signalobject,SIGNAL('signal()')) do
# необходимое действие
end
3. Слотом делаем сразу определенный метод
Qt::Object.connect(signalobject,SIGNAL('signal()'), &method(:custommethod))

def custommethod
# необходимое действие
end

среда, 6 мая 2009 г.

vim IDE

Каждый современный программист использует IDE.
Например Eclipse или KDevelop.А есть самая лучшая IDE - VIM .

Программирую я на ruby и большей частью проекты связаны с rails.
Расскажу какими плагинами к vim я пользуюсь



Любимая функция gf - по русски go_to_file.
Например наводите курсор на "render :file => 'app/views/test.test.html.erb'" - переходите в коммандный режим и жмете на gf. И вы переместились в файл 'app/views/test.test.html.erb'. Что б переместиться в исходный файл не закрывая текущий - жмем в коммандном режиме :bn. Переместитья закрыв :bd. Важно перед перемещением записать изменения.

При редактировании контроллера хочется перейти во вьюшку - на имени контроллера размещаем курсор и вводим :Rview .Редактируем код вьюшки и хочется часть кода вынести в отдельный файл - например со строки 10 до 25 - :10,25Rextract extracted_file. Автоматом строки уносятся в необходимый нам файл , а на их месте создается <%= render :partial => 'extracted_file'%>
Перемещение в определенную модель :Rmodel modelname
Подобным образом :Rmigration , :Rcontroller, :Rview

И еще отличная возможность автодописывания слов при нажатии на клавиши ctrl+p

Это маленькая частичка функционала - но используемого повседневно.Почитать подробней можно в :help - документации идущей вместе с плагином. Экономятся годы Вашего времени.

Следующий плагин настоящего лентяя Surround.vim .

Surround позволяет легко и удобно работать с тегами. Чем ужасен любой тег ? Тем что с двух сторон практически одно и тоже и набирать болго и cкучно.

Например хочу написать <%= @book.name %> пишем @book.name затем переходим в коммандный режим и жмем yss= .
Все получили <%= @book.name %>

Так же создается <% -%> yss-
Или <% -%>\n<% end -%> yss что по русски будет ctrl+shift+e (т.е. контрол плюс большая Е)


Это теги для рельсов , но есть и для HTML, например yss<b> создаст вокруг строки <b></b>

Что же делать если тег необходим не вокруг строки, а вокруг слова ?
Меняем на ysw<b>
Как можно догадаться s - string, w - word

И последняя из простых операций - замена тега
есть у нас <b>test</b> хотим получить <a>test</a>
Набираем cst<a> и все готово.

За подробностями отправляйтесь читать доки.

Ну и на последок - всегда необходимо знать что за функция и где она определена.
Это позволяем делать программка ctags.

Первым делом необходимо поставить эту программу.
Затем создаем индексный файл
Выполняем в папке проекта
ctags --recurse=yes --exclude=*.swp --exclude=*.js --exclude
Рекурсивно создать индексный файл исключая своп файлы , яваскрипт и файлы git'а
на выходе у нас файлик ./tags
Ставим плагин для вима для работы с файлом тегов ctags.vim

в ~/.vimrc вписываем найденные на просторах интернета строчки

let g:ctags_regenerate = 0
let g:ctags_statusline=1
let generate_tags=1
set tags+=./tags
map [I:let nr = input("Which one: ")exe "normal " . nr ."[\t"


Теперь можно работать.
Выбираем функцию , наводим на нее курсор и жмем g] - либо сразу переходим к месту ее определения либо выскакивает список где определяются одноименные с нашей функции.

И на последок - феноменальная функция вима - :split и :vsplit :)

Для начала вполне хватит.
Получаем экономию ресурсов компьютера и отличную IDE.

понедельник, 26 января 2009 г.

mysql-failover

описание создание файловера mysql с фильтром запросов

1.строим мастер-мастер репликацию
кроме стандартного mysql сервера ставим mysql-proxy и heartbeat
в конфиге my.cnf обязательные параметры
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
port=3307 # на стандартном 3306 будет слушать mysql-proxy
log-bin # писать обязательно бинарные логи
server-id=2 #у каждой ноды свой номер
[mysql.server]
user=mysql
basedir=/var/lib

запускаем обе ноды и сервера баз на них
пусть будет node1 192.168.50.151
и node2 192.168.50.152

шаг первый
сделаем node1 master а node2 slave
на каждой назначаем пользователя для репликаций
grant replication slave on *.* to 'replication_user'@192.168.50.152 identified
by 'replication_password';
192.168.50.152 - нода которая будет slave относительно данной

узнаем с какого файла и с какой операции реплицировать
show master status;
пример вывода:
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000009 | 411 | | |
+-------------------+----------+--------------+------------------+


на slave ноде назначаем мастер сервер
change master to master_host='192.168.50.151', master_user
= 'replication_user', master_password = 'replication_password', master_port =
3307, master_log_file = 'mysqld-bin.000009', master_log_pos = 411 ;


запускаем репликацию на slave запускаем
slave start;
проверяем все лиработает
show slave status\G;

основные записи
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
если хоть одна No то ищем почему сервера не могут общаться (файрвол,пароли и
пр.)

На данный момент у нас одна нода ведущая, вторая читает бинарный лог операций и
совершает их у себя.
второй шаг - делаем так что б одновременно node1 была и master для node2 и
slave для node2
операции те же - данные немного меняются

grant replication slave on *.* to 'replication_user'@192.168.50.151 identified
by 'replication_password';

change master to master_host='192.168.50.152', master_user
= 'replication_user', master_password = 'replication_password', master_port =
3307, master_log_file = 'mysqld-bin.000002', master_log_pos = 411 ;

flush privileges;
slave start;

и обязательно проверяем
show slave status/G;

2. mysql-proxy
тут все просто
mysql-proxy --proxy-lua-script=/root/big_query_filter.lua\
--proxy-address=:3306\
--proxy-backend-addresses=/var/lib/mysql/mysql.sock\ #локальную базу через
сокет потому как быстрее на 10% , в 0.6 версии не работало потому пришлось все гонять через lo
--proxy-read-only-backend-addresses=192.168.50.152:3307\ база на другой ноде
только для чтения
--pid-file=/var/run/mysql-proxy.pid
--daemon

скрипт big_query_filter.lua просто не пускает запросы с более чем 500
символами возвращая ошибку с комментарием

3. heartbeat
ставим heartbeat
задаем метод аутентификации /etc/ha.d/authkeys
auth 3
3 md5 secret_password

конфиг /etc/ha.d/ha.cf
logfile /var/log/ha-log
logfacility local0
keepalive 1 # интервал между проверками
deadtime 10 # время через которое вторая нода подхватит ip первой
warntime 4 # предупреждение чере 4 сек
udpport 694
bcast eth1
auto_failback on
node node1
node node2

описание ресурсов которые проверяются /etc/ha.d/haresources
mysql1 IPaddr::192.168.50.151/24/eth1

в случае отказа 192.168.50.151 ее адресс алиасом цепляется к второй ноде через
10сек(можно и меньше)
добивать отказавшую ноду не вижу смысла
ввод в строй отказавшей ноды руками - что б данные не потерялись

прикреплена файлы скриптов запуска mysql-proxy и скрипта big_query_filter.lua