среда, 11 июня 2008 г.

Офигеть!

Офигеть! Сегодня узнал, что в C++ можно прямо в описании класса задавать значение статических членов.


class Foo
{
static int comeData = 10;
};

вторник, 10 июня 2008 г.

Rails и XML

Любая модель(ActiveRecord) в Rails умеет сохраняться в виде xml. Это позволяет без проблем в зависимости от запроса выдавать результат в html или xml виде. А это значит, что появляется возможность прикрутить клиент отличный от браузера.
Сделать это можно следующим образом.


class TestController < ApplicationController
def get_data
res = FooObject.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @res}
end
end
end

По запросу http://localhost:3000/test/1 будет получена html-страница, созданная в по соответствующему шаблону, а вот по запросу http://localhost:3000/test/1.xml получится xml-представление объекта FooObject. Что именно окажется в xml-файле опредляется строчкой

format.xml { render :xml => @res}

Без проблем сериализуются как отдельные объекты, так их объекты, находящиеся в контейнере.
Программу для запроса xml-файла я написал на C#.


//создаём запрос
WebRequest request = WebRequest.Create(queryUrl);
request.ContentType = "text/xml";
WebResponse myWebResponse = request.GetResponse();
long len = myWebResponse.ContentLength;
byte[] buff = new byte[len];
//считываем результат в буффер
myWebResponse.GetResponseStream().Read(buff, 0, (int)len);
string responseXml =
new String(System.Text.Encoding.ASCII.GetString(buff).ToCharArray());

Таким образом в responseXml окажется интересующий нас xml-файл, с которым можно делать всё, что душе угодно.

пятница, 18 апреля 2008 г.

IDE для Ruby

Удобная IDE в состоянии сильно облегчить жизнь программисту. Для C++ и C# я практически всегда использую Visual Studio. Для Ruby я пробовл использовать несколько других редакторов.


  1. SciTE
    Достаточно простой и легковесный редактор кода, не заточенный под какой-либо конкретный язык или набор языков. SciTE подсвечивает код и умеет заканчивать некоторые языковые конструкции. Список поддерживаемых языков очень велиек и при необходимости можно добавить и описание своих языков. Отлаживать код с помощью SciTE нельзя. Зато этит редактор без проблем работает на моём стареньком ноуте со 128 метрами памяти.

  2. Komodo Edit

  3. Гораздо более продвинутый редактор. Он поддерживает ограниченый набор языков, но делает это в более полной степени, чем SciTE. Для Ruby есть автодополнение, показ списка доступных методов. Кроме Ruby поддерживаются Tcl, Pyton, Php, JavaScript. Есть возможность отладки кода. Komodo годаздо тяжеловеснн SciTE.
  4. NetBeans

  5. Это наиболее развороченная система из этих трёх. NetBeans написана нак Java, вследствие чего жрёт немало памяти. NetBeans - одна из самых используемых Java-разработчиками IDE. Интеграция с RubyOnRails сделана очень мощно - в контексте можно посмотреть не только список функций, но и описание к ним. В сэмплах Rails-проктов лежит Depot =)

среда, 16 апреля 2008 г.

Rails Depot

Ну вот я и осилил первую часть книги Agile Web Development, в которой описывается, как создать простейший интернет-магазин. Далее идёт более детальное описание того, почему всё делается так, как делается. По объёму это примерно половина книги. Параллельно с чтением я решил попробовать написать свой небольшой проектик. Дело пошло, но оказалось, что значительные затруднения у меня вызвала собственно вёрстка страничек. Всё ж таки программирую я постоянно(на разных языках), а вот с html'ем я в последний раз работал года этак 3 назад. А CSS вообще выглядит магией =). Не говоря уже о всяких AJAX'ах.

пятница, 7 марта 2008 г.

Ruby On Rails

После того, как я начал разбираться и использовать Ruby, я пришёл к мысли, что было бы неплохо разобраться и с Ruby On Rails - вэб-фрэймворком, который является важной движущей силой распространения языка. Как оказалось, разобраться с RoR совсем не просто. Этот фреймворк обладает значительным когнитивным сопротивлением. Хотя в определённой степени проблемы возникают из-за того, что для последней версии Rails ещё не появилось достаточно хороших туториалов, а старые не работают. Удалось найти только одну книгу, ориентированную на RoR 2.0 - Rails Way by Obie Fernandez. Это примерно 900 страниц на английском. На следующей неделе попробую взяться за эту книгу.

вторник, 19 февраля 2008 г.

Оптимизация кода

Сегодня удалось добиться примерно десятикратного ускорения работы моего парсера. Проблема вообще возникла из-за того, что я относился к обработке строк в С/С++ стиле - преобразовывал строку с массив символов и переберал их для нахождения начала и окончания блоков. Делать это на Ruby - далеко не лучшая идея. На языке высокого уровня нет смысла использовать низкоуровневый подход. Если в С при переборе символов строки достаточно инкрементировать значение указателя, то здесь будет создан(а затем и уничтожен) объект для каждого символа. В общем совершенно ничего хорошего. Поэтому использовавние функции String#index с простейшим регекспом даёт значительный эффект. Что конечно же не может не радовать.
Для обзначения начала и окончания блоков используются символы '{' и '}'. Для поиска конца блока использовалась следующая функция


def find_end(str)
arr = str.split(//)
open_count = 0
close_count = 0
pos = 0
arr.each do |x|
open_count += 1 if(x == "{")
close_count += 1 if(x == "}")
if(open_count == close_count)
return pos
end
pos += 1
end
nil
end


Теперь эта функция выглядит так:

def find_end(str)
open_count = 0
close_count = 0
pos = 0
while(pos != nil)
pos = str.index(/\{|\}/, pos)
if(pos != nil)
open_count += 1 if str[pos] == 123
close_count += 1 if str[pos] == 125
end
if(open_count == close_count)
return pos
end
pos += 1
end
nil
end


Вероятно этот код можно ещё ускорить, но я пока не знаю как. Кроме ускорения за счёт оптимального использования возможностей языка, значительного эффекта можно добиться за счёт применения более эффективного алгоритма. Здесь у меня тоже есть над чем поработать. =)

пятница, 15 февраля 2008 г.

Проблемы с производительностью

В проекте, над которым я сейчас работаю, достаточно активно используются файлы в xml-подобном формате. И я решил написать для него парсер на Ruby. Сделать это оказалось достаточно просто, но вылезла другая проблема - проблема производительности. Файл в 650 строк на моём стариньком ноутбуке (500 МГц P3) парсится примерно 20 секунд. В Ruby есть очень полезаная библиотека profiler, позволяющая посмотреть сколько именно времени занимает каждая из частей программы. Причём для того, чтобы её применить не нужно ничего менять в своём коде, а достаточно только подключить профайлер. Так вот использование профайлера показало мне, что больше всего работы происходит внутри Array#each. Сейчас думаю, каким образом можно всё ускорить. Возможность сделать всё быстро доказывается наличием парсера rexml, полностью написаного на Ruby.