Category: Development
[lang_en]Dynamic Specifications with Rspec[/lang_en][lang_ru]Динамические спецификации в Rspec[/lang_ru]
11 May2007

[lang_en]

Sometimes you may need to create a set of rspec specifications with pretty similar structure and small differences. I’ve got such situation in my project and decided to try to use Ruby’s dynamic code generation features to make my spec file shorter.

I have some multiplexing helper in my templates which allows me to use the same template for different similar pages. This helper returns URL from the set of params and a type. It could accept 5 different url types and raises an Exception when requested URL type is invalid. Without this dynamic code generation feature I would need to create 5 different specifications (one for each URL type) to be able to see each URL type test as a separate line in test results log. But with this simple technique my code looks like following now:

[/lang_en]

[lang_ru]

Иногда бывают моменты, когда Вам может быть нужно создать набор спецификаций для rspec, отличающихся одним-двумя вызовами или параметрами. У меня в проекте сложилась такая ситуация, и я решил попробовать использовать возможности Ruby для динамической генерации кода чтобы, сделать spec-файлы короче и избежать дублирования.

У меня есть хелпер, который используется в нескольких универсальных темплейтах для генерации похожих страниц. Этот хелпер возвращвет URL по набору параметров и типу ссылки. Он может принимать 5 различных типов ссылок и выбрасывает исключение с случаях, когда тип ссылки не поддерживается. Без использования динамической генерации кода мне пришлось бы создать 5 различных спецификаций (по одной для каждого типа ссылок) для того, чтобы иметь возможность видеть каждый тип ссылок отдельной строкой в результатах теста. С использованием же динамической генерации код выглядит примерно так:

[/lang_ru]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
describe VideoHelper, 'when profile_video_url method called' do
  before do
    @user = mock('user')
  end
 
  url_types = {
    'personal_feed' => 'personal_feed',
    'favorites' => 'favorites',
    'voted' => 'voted_videos',
    'posted' => 'posted_videos',
    'commented' => 'commented_videos'
  }
 
  url_types.each do |url_type, route|
    it "should return #{route}_url for #{url_type} type urls" do
      @user.should_receive(:login).at_least(1).times.and_return('login')
      profile_video_url(url_type, @user, 2, 'expert').should == send("#{route}_url", @user, 2, 'expert')
    end
  end
 
  it 'should raise ArgumentError("Invalid feed type") on invalid url_types' do
    lambda { profile_video_url('crap', @user, 2, 'expert') }.should raise_error(ArgumentError, 'Invalid feed type')
  end
end

[lang_en]

This technique could be used even to create entire describe sections, but I would not like to show tons of code here. Anyways, the idea is pretty simple: you could use some loop with nested describe section and send() method calls to dynamically construct your code.

[/lang_en]

[lang_ru]

Эта техника может быть использована даже для целых describe-секций, но я не буду приводить здесь гору кода, который получился у меня. Так или иначе, идея предельно проста: вы можете использовать любые циклы с секцией describe внутри и вызовами метода send() для динамического конструирования Вашего кода.

[/lang_ru]


MMM Release 1.0-pre3
6 May2007

[lang_en]

MySQL Master-Master Replication Manager version 1.0-pre3 has been released today. Changes list is really short now:

  • Major fix in multiple clusters support – now you can use many clusters with one monitoring node (details are in mmmd_mon man page)
  • Man pages for mmmd_mon, mmmd_agent and mmm_control scripts
  • Startup scripts added/fixed for mmmd_mon and mmmd_agent
  • Installation script now requires iproute package to be installed on server.

As always, if you have any questions/suggestions, post them here or in mmm-devel mail list.

[/lang_en]

[lang_ru]

Очередной релиз MySQL Master-Master Replication Manager – сегодня версии 1.0-pre3. Список изменений в этой версии – совсем короткий:

  • Важное исправление в поддержке нескольких кластеров – теперь вы можете использовать один мониторинговый сервер для управления несколькими кластерами (детальнее – в man-странице для mmmd_mon)
  • Добавлены man pages для скриптов mmmd_mon, mmmd_agent и mmm_control
  • Стартовые скрипты для mmmd_mon and mmmd_agent
  • Инсталляционный скрипт теперь требует наличия пакета iproute на сервере.

Как всегда, если у вас есть какие-то дополнения/пожелания/комментарии, вы можете оставить их здесь или отправить в список рассылки mmm-devel.

[/lang_ru]


MySQL Conference 2007: First Impressions and Findings
25 Apr2007

So, first two days of mysqlconf’07 are finished now. What can I say is that without any doubts: It worth it! If you’re working on some high traffic projects, some high-loaded database driven systems, etc, you definitely should attend such conferences – you’d never be able to get such big amounts of information from the best people in the industry as you can get here.

I’ve been attending mostly practical MySQL scale-out sessions and BOFs and I’ve got really controversial impressions. No – everybody was great, controversial thing is my own level – I never before was so sure that I know nothing at all! I see people here for which most of new things for me (especially in MySQL scaling) are pretty obvious and it is hard to keep myself from some kind of self-beating because I don’t know these things.

Interesting thing happened today – I clearly realized why YouTube guys got their billion and we or someone else didn’t – IMHO – one of the major factors was their ability to handle all these users traffic efficiently. They’ve got one of the best (imho) technical people in their command. I was really impressed by one of their guys (sorry, but I’m too bad in remembering people’s names) – one of the two founders – who participated in MySQL replication and scale out BOF as attendee. He clearly showed me that they’re able to grow almost without any limits because of their skills which is one of the major requirements in today’s fast changung world.

Another interesting thing was that I realized that my spoken English could be really good when people speak clearly and I understand their questions. I spoke with some guys about our mmm project, about maby things and there was no problems at all!

So, its going pretty late and tomorrow going to be a long day so I want to repeat – if you have any chance to get on such conferences, DO IT! If your company can’t help you, spend your own money or find some other solutions, but DO IT! It is the best thing could happen to YOU as professional!

P.S. Just remembered – I saw some women-DBAs today! Really smart girls! I never thought that pretty girl can become such great IT prefessional and now I know – I was really wrong.

P.P.S. Sorry to russian-speaking readers – I will definitely translate my last posts later – just when I’ll come back home from this crazy (but the best) event with 14hrs of load a day


[lang_en]MySQL Master-Master replication manager released[/lang_en][lang_ru]Релиз ПО для управления кластерами с MySQL Master-Master репликацией[/lang_ru]
5 Apr2007

[lang_en]

So, I’s been a long time since I wrote my last post here. Lots of work and almost no new interesting technologies in my work caused such delay. But today I’m proud to announce release of really interesting project: MySQL Master-Master replication manager – set of flexible scripts for management different MySQL deployment schemes with master-master replication involved.

More information about this software could be found in detailed announce in Peter Zaitsev blog (actually this software was created by me for his company’s client) or at project page. All your questions and suggestions welcomed in MMM development group on Google Groups. If you’d like to support this software on Digg.com, you’re welcome. 😉

[/lang_en]

[lang_ru]

Очень много времени прошло с момента моего последнего поста здесь. Много работы и практически полное отсутствие новых технологий в работе – вот основные причины. Ео сегодня я с удовольствием хочу аннонсировать здесь очень интересный проект: MySQL Master-Master replication manager – набор очень гибких скриптов для управления различными схемами установки MySQL, в которых используется master-master репликация.

Более детальная информация о проекте может быть найдена в детальном обзоре в блоге Петра Зайцева (на самом деле, программа создавалась мной для одного из его клиентов) или на странице проекта. Все вопросы и замечания можно отправлять в группу MMM development на Google Groups. Если вы хотите поддержать данный анонс на Digg.com, я буду не против. 😉

[/lang_ru]


[lang_en]Bug in Perl’s Thread::Semaphore: Memory Leak (solution provided)[/lang_en][lang_ru]Ошибка в Perl’овом Thread::Semaphore: Утечка памяти (решение прилагается)[/lang_ru]
25 Jan2007

[lang_en]

I spent almost all day trying to find and fix really strange bug in one of our server-side applications written on Perl. And as I’ve figured out later, there is huge problem in Perl core libraries or, even, in interpreter.

Problem is following. If you are trying to use “threads” module with “Thread::Semaphore” module like it is mentioned in official Perl documentation (perlthrtut), you’ll get 4kb memory leak on every $semaphore->up call. So, simple test-case like following would cause huge memory leaks (100 Mbytes per second on my test server):
[/lang_en]

[lang_ru]

Я потратил сегодня почти весь день пытаясь найти и поправить очень странную ошибку в одном из наших серверных приложений, написанных на Perl. И, как выяснилось в процессе, в системных библиотеках Perl или, может быть, в его интерпретаторе, есть крайне неприятная ошибка.

Проблема в следующем. Если вы попытаетесь использовать модуль “threads” вместе с модулем “Thread::Semaphore”, как это описано в официальной документации по языку Perl (perlthrtut), вы получите утечку памяти размером около 4kb на каждый вызов $semaphore->up. Следовательно, следующий простой пример кода вызовет просто огромные утечки памяти (около 100 Mбайт в секунду на моем тестовом сервере):
[/lang_ru]

Read the rest of this entry