воскресенье, 4 мая 2014 г.

Rails file_column изменить имя загруженного файла

How to rename a file with file_column plugin.

Ruby on Rails

Собственно, понадобилось… Время от времени изменять имя файла, загруженного с помощью file_column. Например так: stylesheet.cssstylesheet_1399194798.css.

Вот, что получилось.

Читать дальше »

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

Ruby, 1000 чертей!

Ruby

Случается, что число чертей или других сущностей (и не обязательно – зловредных) переваливает далеко за 1000+. В моем случае это было количество товаров в тестовом приложении. Ровно 40305. Отобразить такое большое число на странице, не поломав при этом верстку, бывает довольно проблематично. Поэтому я сегодня добавил пару методов для сокращения размера оного.


Читать дальше »

среда, 11 ноября 2009 г.

Мини-сборка Ubuntu для Ruby on Rails

Rails TurnKey Linux

Проект TurnKey Linux представил подборку из 40 готовых минималистичных сборок Ubuntu 8.04.3 LTS для быстрого развертывания в Cloud-окружениях Amazon EC2 или для использования в качестве гостевых ОС в системах виртуализации VMware, Xen HVM, KVM или VirtualBox.


И в частности, – полностью работоспособную сборку с Ruby on Rails. Которая помимо стандартного ядра TurnKey, включает в себя следующее:


  • Поддержку SSL
  • Модули Webmin для конфигурирования Apache2 и MySQL
  • Конфигурацию Ruby on Rails
    • Развертывание посредством Phusion Passenger для Apache (mod_rails)
    • Предустановленный пример Rails приложения, расположенный в /var/www/railsapp
    • Установка баз данных MySQL для production, development и testing
  • RubyGems менеджер пакетов
    • APT и RubyGems обе являются системами управления пакетами и могут конфликтовать
    • Мы рекомендуем использовать RubyGems для управления Rails компонентами (называются gems), и APT для всего остального
    • Необходимые build-essentials пакеты включены для помощи в создании gems.

Сборка представлена в виде VM (221MB) и ISO-образа (195MB).


Узнал на OpenNews.


Читать дальше »

понедельник, 5 октября 2009 г.

Топ 10 Rails плагинов и gem-ов

Ruby Gems

Практически каждый разработчик имеет собственные предпочтения в выборе сторонних компонентов и библиотек, используемых в приложении. Не так давно мне попался такой топ-лист плагинов и gem-ов для разработки на Ruby on Rails.


10 “must-have” Rails плагинов и gem-ов


  • Inherited Resources: устраняет большую часть шаблонного кода в контроллерах;

  • Formtastic: избавляет от лишней головной боли при создании разметки HTML форм. (Используемые вместе, Inherited Resources и Formtastic составляют хорошую альтернативу scaffold-фреймворкам вроде Streamlined и ActiveScaffold);

  • CapGun: предоставляет простые уведомления о развертывании (deploy);

  • Faker: помогает создавать фиктивные данные. Может использоваться как для тестирования (test) приложений, так и для создания демонстрационных данных в режиме разработки (development) и постановки (staging);

  • Clearance: многофункциональная регистрация и аутентификация;

  • Safe ERB: помогает убедиться, что приложение неуязвимо для XSS-атак;

  • RedHill on Rails Core: в основном, используется для декларирования “foreign key”-отношений в схеме БД;

  • RPM Rails Performance Management: замечательно для обнаружения и диагностики проблем производительности;

  • will_paginate: самый хороший и самый простой из плагинов постраничной разбивки (pagination);

  • hoptoad: великолепные «кастомер-френдли» уведомления об исключениях (exceptions) возникающих в приложении.

Существует множество плагинов, которые мы используем для специальных нужд, как то генерирование PDF или обработка вложений (attachment). Однако это список наших избранных плагинов, которые мы используем практически в каждом проекте.

Это был список лучших 10 Rails плагинов и gem-ов от Глена Вандербурга (Glenn Vanderburg), опубликованный им в своем блоге: 10 Must-Have Rails Plugins and Gems (2009 Edition).


Читать дальше »

вторник, 22 сентября 2009 г.

Вебинар: Развертывание Rails приложений на GlassFish

Новости из почтового ящика.


Sun Microsystems приглашает на вебинар по развертыванию Rails приложений на сервере GlassFish. Вебинар расскажет об использовании GlassFish в качестве надежной платформы для разработки, развертывания и управления Rails приложениями.


Вебинар охватит следующие темы:

  • Сценарии развертывания для Rails на GlassFish
  • Как Rails приложение развернуто на GlassFish без модификаций
  • Как GlassFish v3 Gem может быть использован в качестве эффективной альтернативы WEBrick и Mongrel
  • Советы по настройке производительности, руководства по масштабированию и рецепты Capistrano


Вебинар состоится в среду 23 сентября 2009, 10:00 am PDT (21:00 по московскому времени). Ознакомиться с деталями вебинара и подать заявку на участие: Webinar: Deploy Your Rails Apps on GlassFish.


---
Для развертывания собственных веб-приложений можно арендовать выделенный сервер требуемой конфигурации и с выбранной операционной системой.


Читать дальше »

вторник, 25 августа 2009 г.

Установка Ruby on Rails на Ubuntu

Небольшая подборка руководств (на английском языке) по установке Ruby on Rails на Ubuntu разных версий. Две статьи из приведенного списка в свое время мне уже доводилось использовать «по назначению» :). Замечу, что руководства небезупречны в том плане, что:

  1. устанавливаемые пакеты с различной периодичностью обновляются;
  2. в текст прокрадываются опечатки;
  3. они все-таки на английском языке.

В случае чего – звони в рельсу читай комменты. Как правило, там уже все озвучено откнопано.



Все статьи, как я понял, одного автора. Установку Ruby on Rails на Ubuntu 7.04 Feisty Fawn и Ubuntu 8.10 Intrepid Ibex я уже использовал; свое отработали.


Читать дальше »

воскресенье, 19 июля 2009 г.

Rails Plugin подсветки синтаксиса

Rails Plugin для «клиентской» подсветки синтаксиса.


Установка


script/plugin install git://github.com/antono/sh2.git
rake -T sh2
rake sh2:install

Helpers


Подключение скриптов и стилей для плагина.

include_syntax_highlighter_assets(:themes => :midnight, :brushes => :all)

Поместить в layout, в тег head


Следующий хелпер запускает подсветку синтаксиса для полностью загруженной страницы.

sh2_highlight_code

Должен размещаться в конце страницы.


Пример использования


<pre class="brush:ruby">
1000.times { puts 'Руби Руби Руби Руби' }
</pre>

Ссылка: Client-side Syntax Highlighter для Rails
Читать дальше »

пятница, 26 июня 2009 г.

Sitemap на Ruby on Rails

Пару дней назад озадачился генерированием файла sitemap.xml на Ruby on Rails для пользовательских торговых площадок. Приведу упрощенный пример без блогов, форумов и специальных страниц. В файле Sitemap будут url для:

  • индексной страницы магазина (index)
  • страницы описания (about)
  • страницы контактов (contact)
  • всех страниц товаров (item)


Контроллер (store_controller.rb)

def sitemap
@store = Store.find(params[:id])
@items = @store.items.find :all,
:conditions => "available_for_sale = 1",
:order => "updated_at DESC",
:limit => 49997
end


В соответствии с концепцией MVC, процедуру выборки товаров лучше вынести в модель.


В рекомендациях по файлам Sitemap для Google оговаривается, что файл Sitemap может содержать не более 50000 URL. За вычетом страниц индекса, описания и контактов, остается 49997 позиций для URL товаров.


Представление (sitemap.xml.builder)

xml.instruct! :xml, :version => "1.0", :encoding=>"UTF-8"
xml.urlset(:xmlns => "http://www.sitemaps.org/schemas/sitemap/0.9") {
# Index
xml.url {
xml.loc(url_for :controller => :store, :action => :index, :id => @store.id, :format => :xml, :only_path => false)
lastmod = @items.first.updated_at.strftime("%Y-%m-%d") unless @items.nil?
lastmod = lastmod || Time.now.strftime("%Y-%m-%d")
xml.lastmod(lastmod)
xml.changefreq("daily")
xml.priority(1)
}
# About
xml.url {
xml.loc(url_for :controller => :store, :action => :about, :id => @store.id, :format => :xml, :only_path => false)
xml.lastmod(@store.updated_at.strftime("%Y-%m-%d"))
xml.changefreq("monthly")
xml.priority(0.7)
}
# Contact
xml.url {
xml.loc(url_for :controller => :store, :action => :contact, :id => @store.id, :format => :xml, :only_path => false)
xml.lastmod(@store.updated_at.strftime("%Y-%m-%d"))
xml.changefreq("monthly")
xml.priority(0.5)
}
# Items
@items.each do |item|
xml.url {
xml.loc(url_for :controller => 'store', :action => 'item', :id => item.id, :format => :xml, :only_path => false)
xml.lastmod(item.updated_at.strftime("%Y-%m-%d"))
xml.changefreq("weekly")
xml.priority(0.9)
}
end
}


Страницы пользовательских магазинов у меня выводятся в формате XML с (XSL трансформацией) и при генерации url я использую параметр :format => :xml. В стандартном выводе этот параметр не нужен.


Для каждого URL адреса тег <loc> является обязательным; остальные теги являются дополнительными.

  • loc – адрес страницы;
  • lastmod – дата последнего обновления;
  • changefreq – частота изменения страницы;
  • priority – приоритет.


Главная страница магазина (index) и страницы товаров (item) являются наиболее важными страницами, поэтому имеют более высокий приоритет. Страница описания и страница контактов, имхо уже «на интерес». Следовательно, имеют приоритет более низкий.


Индексная страница обновляется довольно часто за счет добавления новых товаров и выбывания товаров из листинга. Поэтому обновляется ежедневно (daily).


Страницы товаров тоже обновляются довольно часто. За счет добавления отзывов, комментариев клиентов. Но эта информация не особо важна. Спокойно могу задать им еженедельное (weekly) обновление.


Информация о магазине и контактах, как правило, изменяется крайне редко, и обновлять ее стоит не чаще, чем раз в месяц (monthly).


Успехов на рельсах! © dotrb.blogspot.com


Читать дальше »

четверг, 18 июня 2009 г.

Путь Rails

Сегодня (точнее уже «вчера») приобрел такую вот книженцию.


Путь Rails

Путь Rails. Подробное руководство по созданию приложений в среде Ruby on Rails


“The Rails Way”
Оби Фернандес
Среда Ruby on Rails стремительно занимает ведущее место в ряду наиболее популярных платформ для разработки веб-приложений. Она основана на одном из самых элегантных языков программирования, Ruby, и доставляет истинное удовольствие своим приверженцам. Хотите оказаться в первых рядах? Тогда эта книга для вас! Ее автор, Оби Фернандес, и целая группа экспертов подробно описывают основные возможности и подсистемы Rails: контроллеры, маршрутизацию, поддержку стиля REST, объектно-реляционное отображение с помощью библиотеки ActiveRecord, применение технологии AJAX в Rails-приложениях и многое другое. Отталкиваясь от своего уникального опыта и приводя подробные примеры кода, Оби демонстрирует, как с помощью инструментов и рекомендованных методик Rails добиться максимальной продуктивности и получать наслаждение от создания совершенных приложений.

Уже даже начал потихоньку читать. «Потихоньку» буквально означает, что дочитал только до «Введения». Просто сегодня и так хватало работы с этими самыми рельсами.


Читать дальше »

суббота, 30 мая 2009 г.

MVC в Rails

Разработкой на рельсах занимаюсь уже три года, решал различные сложные и комплексные задачи... А вот поди ж ты, – теорию тоже поднатаскать надо. Хотя бы в качестве программы подготовки к экзаменам, собеседованиям. В общем, «Здравствуй, школа!» :).

Из википедии:
Model-view-controller (MVC, «Модель-представление-поведение», «Модель-представление-контроллер») – архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты.

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

  • Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контроллера), изменяя свое состояние;
  • Представление (View). Отвечает за отображение информации (пользовательский интерфейс);
  • Поведение (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.

Model


Модель – это представление определенного участка данных, в общем случае – таблицы базы данных. В модели определяются требования и расчеты необходимые для взаимодействия с этими данными. Обычно требования для формата данных, связи и отношения между данными, методы создания (create), обновления (update), удаления (destroy), поиска (find) и пр.


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


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


Правило controller-model: “fat model, skinny controller”, «жирная модель, тощий контроллер».


Controller


Контроллер – логика между моделью и представлением. Контроллеры содержат методы, которые напрямую относятся к действиям (actions) выполняемым пользователем. Назначение контроллера – отвечать на действия, запрошенные пользователем. Как то: принять параметры, заданные пользователем, обработать эти параметры, задействовать модель, и затем передать запрошенные данные в обработанной форме представлению (view).


Методы контроллера обычно краткие; это небольшие куски кода, выполняющие специфические задачи. Если они содержат более 9-10 строк, это должно тебя насторожить: возможно, ты делаешь слишком много в контроллере и недостаточно в модели (см. правило controller-model).


View


View (Вид/Представление) – это где данные, обработанные контроллером, получают вывод в формате, запрошенным пользователем. В rails это обычно html, но может быть xml, js, json или другой. Разделение между контроллером и представлением еще более понятное, чем между контроллером и моделью.


Правило controller-view: никакого вывода данных в контроллере, никакой обработки данных в представлении.


По материалам статьи Rails and MVC.
Читать дальше »

среда, 11 февраля 2009 г.

Pastie подсветка синтаксиса

Самый первый пост, опубликованный мной с тегом JavaScript освещал такую интересную для любого «кодоблоггера» тему, как Динамическая подсветка синтаксиса с помощью javascript.

Если же по каким-то причинам вам лень добавлять javascript к вашему шаблону, вы можете воспользоваться сервисом Pastie.

Pastie код
Pastie «умеет» подсвечивать код ActionScript, C/C++, CSS, Diff, HTML (ERB / Rails), HTML / XML, Java, Javascript, Objective C/C++, Pascal, Perl, PHP, Plain text, Python, Ruby, Ruby (on Rails), Shell Script (Bash), SQL, YAML. Вставьте полученный код javascript в ваш блог и подсветка кода готова.

Код Pastie в блоге
Второй, неявный способ применения Pastie -- обмен фрагментами кода. Удобно при удаленной разработке в команде.

P.S. Pastie написан на Ruby on Rails.


Читать дальше »

четверг, 29 января 2009 г.

Сортировка по цвету на Ruby

Не в первый раз уже сталкиваюсь с задачей сортировки по цвету. То есть как произвольный набор цветов в 16-ричном формате сортировать по насыщенности цвета. Сегодня я кажется решил эту задачу.

Сортировка по цвету
Итак, произвольный набор цветов в виде хеша (Hash). Кому понравится -- берите не стесняйтесь.

Код ruby


simple_colors = {
:aliceblue => "f0f8ff",
:antiquewhite => "faebd7",
:aqua => "00ffff",
:aquamarine => "7fffd4",
:azure => "f0ffff",
:beige => "f5f5dc",
:bisque => "ffe4c4",
:black => "000000",
:blanchedalmond => "ffebcd",
:blue => "0000ff",
:blueviolet => "8a2be2",
:brown => "a52a2a",
:burlywood => "deb887",
:cadetblue => "5f9ea0",
:chartreuse => "7fff00",
:chocolate => "d2691e",
:coral => "ff7f50",
:cornflowerblue => "6495ed",
:cornsilk => "fff8dc",
:crimson => "dc143c",
:cyan => "00ffff",
:darkblue => "00008b",
:darkcyan => "008b8b",
:darkgoldenrod => "b8860b",
:darkgray => "a9a9a9",
:darkgreen => "006400",
:darkkhaki => "bdb76b",
:darkmagenta => "8b008b",
:darkolivegreen => "556b2f",
:darkorange => "ff8c00",
:darkorchid => "9932cc",
:darkred => "8b0000",
:darksalmon => "e9967a",
:darkseagreen => "8fbc8f",
:darkslateblue => "483d8b",
:darkslategray => "2f4f4f",
:darkturquoise => "00ced1",
:darkviolet => "9400d3",
:deeppink => "ff1493",
:deepskyblue => "00bfff",
:dimgray => "696969",
:dodgerblue => "1e90ff",
:feldspar => "d19275",
:firebrick => "b22222",
:floralwhite => "fffaf0",
:forestgreen => "228b22",
:fuchsia => "ff00ff",
:gainsboro => "dcdcdc",
:ghostwhite => "f8f8ff",
:gold => "ffd700",
:goldenrod => "daa520",
:gray => "808080",
:green => "008000",
:greenyellow => "adff2f",
:honeydew => "f0fff0",
:hotpink => "ff69b4",
:indianred => "cd5c5c",
:indigo => "4b0082",
:ivory => "fffff0",
:khaki => "f0e68c",
:lavender => "e6e6fa",
:lavenderblush => "fff0f5",
:lawngreen => "7cfc00",
:lemonchiffon => "fffacd",
:lightblue => "add8e6",
:lightcoral => "f08080",
:lightcyan => "e0ffff",
:lightgoldenrodyellow => "fafad2",
:lightgrey => "d3d3d3",
:lightgreen => "90ee90",
:lightpink => "ffb6c1",
:lightsalmon => "ffa07a",
:lightseagreen => "20b2aa",
:lightskyblue => "87cefa",
:lightslateblue => "8470ff",
:lightslategray => "778899",
:lightsteelblue => "b0c4de",
:lightyellow => "ffffe0",
:lime => "00ff00",
:limegreen => "32cd32",
:linen => "faf0e6",
:magenta => "ff00ff",
:maroon => "800000",
:mediumaquamarine => "66cdaa",
:mediumblue => "0000cd",
:mediumorchid => "ba55d3",
:mediumpurple => "9370d8",
:mediumseagreen => "3cb371",
:mediumslateblue => "7b68ee",
:mediumspringgreen => "00fa9a",
:mediumturquoise => "48d1cc",
:mediumvioletred => "c71585",
:midnightblue => "191970",
:mintcream => "f5fffa",
:mistyrose => "ffe4e1",
:moccasin => "ffe4b5",
:navajowhite => "ffdead",
:navy => "000080",
:oldlace => "fdf5e6",
:olive => "808000",
:olivedrab => "6b8e23",
:orange => "ffa500",
:orangered => "ff4500",
:orchid => "da70d6",
:palegoldenrod => "eee8aa",
:palegreen => "98fb98",
:paleturquoise => "afeeee",
:palevioletred => "d87093",
:papayawhip => "ffefd5",
:peachpuff => "ffdab9",
:peru => "cd853f",
:pink => "ffc0cb",
:plum => "dda0dd",
:powderblue => "b0e0e6",
:purple => "800080",
:red => "ff0000",
:rosybrown => "bc8f8f",
:royalblue => "4169e1",
:saddlebrown => "8b4513",
:salmon => "fa8072",
:sandybrown => "f4a460",
:seagreen => "2e8b57",
:seashell => "fff5ee",
:sienna => "a0522d",
:silver => "c0c0c0",
:skyblue => "87ceeb",
:slateblue => "6a5acd",
:slategray => "708090",
:snow => "fffafa",
:springgreen => "00ff7f",
:steelblue => "4682b4",
:tan => "d2b48c",
:teal => "008080",
:thistle => "d8bfd8",
:tomato => "ff6347",
:turquoise => "40e0d0",
:violet => "ee82ee",
:violetred => "d02090",
:wheat => "f5deb3",
:white => "ffffff",
:whitesmoke => "f5f5f5",
:yellow => "ffff00",
:yellowgreen => "9acd32"
}

А вот и метод сортировки:

Код ruby: сортировка по насыщенности


ordered_colors = simple_colors.sort{|a,b| ( a[1][0,2].to_i(16)+a[1][2,2].to_i(16)+a[1][4,2].to_i(16) )<=>(b[1][0,2].to_i(16)+b[1][2,2].to_i(16)+b[1][4,2].to_i(16))}

Внимание: метод sort класса Hash возвращает массив (Array).

Пример: hsh.sort -> anArray


h = { "a" => 20, "b" => 30, "c" => 10  }  
h.sort » [["a", 20], ["b", 30], ["c", 10]]

И вывод отсортированного набора цветов в виде (.rhtml):
<style type="text/css">
.colorPick {
width:16px; height:16px; float:left;
border:2px solid #FFF;
margin:1px;
}
</style>
<!-- ... -->
<%
ordered_colors.each do |color|
name = color[0]
value = color[1]
%>
<div class="colorPick"
style="background-color: #<%= value %>"
title="<%= name %>">
</div>
<% end %>


В итоге у вас должно получиться нечто похожее, как на картинке в начале поста.

© dotrb.blogspot.com 2009
Читать дальше »

пятница, 23 января 2009 г.

CSS переменные на Ruby on Rails

В посте про реализацию CSS переменных на PHP я вкратце упоминал про мою адаптацию этого способа для Ruby on Rails. Похоже, звезды уже выстроились нужным образом, что не забегая к гадалке, можно уже выложить коды.

Для реализации переменных CSS я использовал CSS-SSC от Shaun Inman. С некоторыми поправками исходя из особенностей моего приложения:
  1. Стили CSS у меня находятся внутри шаблона, а не в отдельном файле;
  2. Реализация разделения на переменные и константы мне не нужна;
  3. У меня только один тег style в шаблоне.

В отличие от оригинального CSS-SSC я решил определение переменных делать без значка доллара ($), а подстановку значений переменных -- с ним. Блажь у меня такая.
@server constants {
variableName: variableValue;
}

body {
color: $variableName;
}

Пример: необработанный HTML


<style type="text/css">
@server constants {
bodyBackgroundColor: #FFF;
bodyFaceColor: #000;
bodyFont: 11px/1.5em Arial, Helvetica, sans-serif;
}

body {
font: $bodyFont;
background-color: $bodyBackgroundColor;
color: $bodyFaceColor;
}
</style>

Перво-наперво, следует получить сами правила CSS, расположенные внутри тега <style type="text/css"></style>.

Для этого я создал следующую функцию.

Ruby-модуль css_ssc_module.rb


def ssc_get_style_contents(pattern, text)
matches = text.scan(pattern)
str_out = matches.to_s
return str_out
end

  • pattern (regular expression) -- шаблон RegExp по которому будет осуществляться выбор;
  • text (String) -- текст страницы, где будет осуществляться поиск и выборка.

Функция вернет текст, внутри элемента <style type="text/css"></style>.

Почему я не описал pattern внутри самой функции? Это регулярное выражение нам еще раз понадобится при подстановке сгенерированного CSS обратно на страницу. Правильнее будет ее определить только в одном месте.

Следующая функция выполнит следующие операции:
  1. Выберет все пары значений [variableName, variableValue] внутри блока @server constants {}
  2. Заменит в тексте CSS переменные $variableName их значениями variableValue;
  3. Удалит блок @server constants {}.

Ruby-модуль css_ssc_module.rb


def ssc_process_server_variables(css)
pattern = /@server\s+(?:variables|constants)\s*\{\s*([^\}]+)\s*\}\s*/i
pattern2 = /([^:\}\s]+)\s*:\s*([^;\}]+);/
str_out = css
if ( matches = css.scan(pattern) )
matches.each do |match|
vars = match[0].scan(pattern2)
vars.each{|var, value| css.gsub!("$#{var}", value)}
end
css = css.gsub!(pattern, '')
str_out = css unless css.nil?
end
return str_out
end

  • css (String) -- текст CSS.

Функция возвращает обработанный CSS.

Последняя функция объединяет две предыдущих. На вход получает «сырой» текст шаблона (страницы) и возвращает шаблон с обработанным CSS.

Ruby-модуль css_ssc_module.rb


def ssc_serve_styles(text)
pattern = /^\<style\ \b[^>]*>((\s|.)+?)\<\/style\>/i
css = ssc_get_style_contents(pattern, text)
css_out = ssc_process_server_variables(css)
text.gsub!(pattern, "<style type='text/css'>#{css_out}</style>")
return text
end

  • text (String) -- «сырой» текст страницы.


В результате обработки шаблона с переменными CSS функцией ssc_serve_styles(text), получим следующий код HTML.

Пример: обработанный HTML


<style type="text/css">
body {
font: 11px/1.5em Arial, Helvetica, sans-serif;
background-color: #FFF;
color: #000;
}
</style>


Читать дальше »

среда, 14 января 2009 г.

Установка Sphinx на Ubuntu

Устранение проблем с geodata


Sphinx не работает корректно с geodata если он был скомпилирован с gcc версии > 3.4 Чтобы избежать проблемы с geodata установите gcc версии 3.4 и поставьте на него симлинки.
aptitude install g++-3.4 gcc-3.4

cd /usr/bin
rm cpp gcc g++
ln -s g++-3.4 g++
ln -s gcc-3.4 gcc
ln -s cpp-3.4 cpp

Установка Sphinx


cd /usr/src/
wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8-rc2.tar.gz
tar -zxf sphinx-0.9.8-rc2.tar.gz
cd sphinx-0.9.8-rc2

cd /usr/src/sphinx-0.9.8-rc2
./configure CC=gcc-3.4
make
make install
# for grid only
mkdir /mnt/ferret/sphinx
ln -sf /mnt/ferret/sphinx /var/db/sphinx
#

mkdir -p /var/db/sphinx/log
chmod -R 777 /var/db/

Пользователи Windows могут скачать windows-версию с http://www.sphinxsearch.com/downloads.html

Установка gem Chronic


gem install chronic

После установки вы можете использовать конфигурацию Ultrasphinx по умолчанию default.base или создать собственный файл development.base и поместить его в RAILS_APP/config/ultrasphinx/.
Перейдите в каталог своего rails-приложения и запустите:
RAILS_ENV=development rake ultrasphinx:bootstrap

или
RAILS_ENV=development rake ultrasphinx:configure
RAILS_ENV=development rake ultrasphinx:daemon:start

Sphinx -- асинхронный поисковый движок, поэтому необходимо периодически заново индексировать ваши данные.
Можете добавить строку в cronjob.
00-59/10 * * * * www-data cd $RAILS_ROOT && RAILS_ENV=$RAILS_ENV rake ultrasphinx:index >/dev/null 2>&1

Это строка задает переиндексирование каждые 10 минут.
Читать дальше »

вторник, 13 января 2009 г.

Загрузить файл PHP в строку

Небольшой пример, как загрузить PHP файл в переменную. Думаю, пригодится для AJAX рендеринга в духе Ruby on Rails.
page.replace_html "element_id", :partial => "file.rhtml"

В примере используются Output Control Functions с командой include().
<?php
$string = get_include_contents('somefile.php');

function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
return false;
}

?>

  • ob_start() -- Включает буферизацию вывода
  • ob_get_contents() -- Возвращает содержимое буфера вывода
  • ob_end_clean() -- Освобождает (очищает) буфер вывода и выключает буферизацию

Читать дальше »

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

Год бесплатного хостинга для разработчиков web-приложений Bebo

BeboSun Microsystems, совместно с провайдером Joyent предоставляют разработчикам Web-приложений для Bebo один год бесплатного хостинга. Это предложение будет основываться в бесплатном размещении их приложений для социальной медийной сети с поставляемым пользователями наполнением. Кроме того, разработчикам будут доступны инструменты Java, PHP, Ruby on Rails, а также Sun Web 2.0 Scalable Performance Toolkit и Apache Olio, находящиеся на стадии разработки, с помощью которых разработчики смогут создавать, отлаживать и развертывать социальные Bebo-приложения.

Разрабатываемый инструмент Sun Web 2.0 Scalable Performance Toolkit призван отвечать за генерирование рабочей нагрузки, а Apache Olio - за оценку пригодности, функциональности и производительности размещаемых Web-приложений.

Кроме того, разработчикам будет доступен набор инструментов от самой Bebo. В него войдет анализ всего времени, которое было затрачено на создание приложения. Следовательно, пользователи смогут в точности до секунд рассчитывать и распределять свое время при создании Web-приложений для социальной медийной сети Bebo.
Читать дальше »

Сортировка Ruby on Rails с Associated Model

Сортировка (:order, ORDER BY) в Ruby on Rails с использованием Associated Model.

@files = File.find(:all, :include => :label, :order => "labels.name ASC, files.name")

# files belongs_to :label
# labels has_many :files

Или даже так:
@store = Store.find(params[:id])
@files = @store.files.find(:all, :include => :label, :order => "labels.name ASC, files.name")

# files belongs_to :store
# stores has_many :files

Читать дальше »

четверг, 11 декабря 2008 г.

Руководство по безопасности Rails

Ruby on RailsНа сайте guides.rails.info опубликовано наиболее полное руководство по безопасности Rails приложений -- Ruby On Rails Security Guide.

Это руководство описывает наиболее распространенные проблемы безопасности web-приложений и методы их устранения в Rails.

Ruby On Rails Security Guide (English)
Читать дальше »

среда, 3 декабря 2008 г.

Генератор веб-кнопок

Еще один полезный веб-инструмент -- генератор кнопок. Несколько наборов шаблонов кнопок, возможность задавать текст кнопки, порядка 15+ шрифтов, возможность изменять цвета текста и кнопки, использовать эффекты -- «тень» (Drop Shadow), «свечение» (Outer Glow) и пр. То же самое и для rollover-кнопки.
Генератор веб-кнопок


Читать дальше »

воскресенье, 30 ноября 2008 г.

XSLT атрибуты дочерних элементов

Как в XSLT использовать атрибуты дочерних элементов. Не так давно я описывал как в XSLT создавать новые элементы и атрибуты. Теперь приведу пример посложнее.

Для основного шаблона я генерирую ссылку-кнопку с помощью rails-методов:
xml.tag!("advanced"){
xml << link_to(image_tag("/images/template/buttons/search-advanced.gif", {:alt => "advanced", :class => "imagebutton"}),
:controller => '/search', :seller => @store.id)
}

В другом шаблоне, вместо ссылки и изображения, мне нужна просто ссылка. Вот примерный XSLT-код.
<xsl:element name="a">
<xsl:attribute name="href" >
<xsl:value-of select="advanced/a/@href" />
</xsl:attribute>
<xsl:text>Advanced Search</xsl:text>
</xsl:element>

Я просто создал новый элемент-ссылку(<a>) и присвоил ей атрибут href дочернего элемента <advanced>: "advanced/a/@href".
Читать дальше »