пятница, 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


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

вторник, 23 июня 2009 г.

Google Chrome: баг с ифреймом

google chrome

Сегодня коллега попросил помочь разобраться со странным поведением браузера Chrome.


На странице два элемента <iframe>. В одном чат, в другом ротатор баннеров.

<!-- В этом фрейме работает флешевый чат -->
<iframe id="frame_chat" src="/userplane/chat" frameborder="no"></iframe>
<!-- В этом фрейме сторонний скрипт баннеро-ротатор -->
<iframe id="frame_ads" src="http://third_part_banner_rotator" frameborder="no"></iframe>


Скрипт приводить не буду. Действует так: через каждые 30 секунд создает frameset с фреймами. Во фреймах различные составные рекламные баннеры.


Все браузеры (даже IE!), как и задумано, перезагружают только содержимое ифрейма "frame_ads", а Chrome – страницу целиком.


Перекопано было все, что только можно, по ходу исправлено еще несколько неаккуратностей, а проблема решилась до безобразия просто. Переписал тег второго ифрейма в сокращенной XHTML форме:

<iframe id="frame_ads" src="http://third_part_banner_rotator" frameborder="no" />


И всё заработало :). Сыроват еще «Хром», сыроват...


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

MP-BIOS bug 8254 timer not connected. Исправление

Ubuntu

Проблема с убунтой все та же: MP-BIOS bug: 8254 timer not connected to IO-APIC и категорический отказ загружаться дальше. Прием, который я приводил по этому поводу в прошлый раз срабатывает так же часто, как сбываются лучшие ожидания.


Не так давно вычитал совет на одном из буржуйских форумов.

  1. На экране загрузки GRUB используй клавиши стрелок чтобы выбрать:
    kernel /boot/linuz-2.6.15-25-386 root=/dev/sda3 ro quiet splash
    (твои пути и цифры могут немного отличаться)
  2. Затем нажми “e” чтобы отредактировать опции загрузки. Ты перейдешь на другой экран;
  3. Добавь noapic в конец опций загрузки и жми “enter”;
  4. Жми “b” для загрузки.


У меня процедура немного отличалась от описанной, но все сработало.


Далее тот же камрад советует как сделать эти изменения постоянными:

  1. sudo gedit /boot/grub/menu.lst
  2. добавь noapic в строку “#defoptions=
  3. update grub
  4. перезагрузись.


Эту часть я пока не проверял.


Ссылка на исходное сообщение на убунтофоруме.


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

понедельник, 22 июня 2009 г.

Кошачья экспансия

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


Сегодня кошка родила. Или окотилась. Или что там кошки делают спустя пару месяцев после половых безумств? Впервые присутствовал на подобном мероприятии, да еще и в одного. Пришел из магазина, припер курицу суп сварить – сидит на пороге, мявчит. Типа «воды отошли, надо уже что-то делать» :).


Ну, бля, думаю, здрассьте; началось... Волновался конечно сначала, а потом прикинул хер к носу, да хули делов-то? – Справимся! Первым делом в темпе электрошвабры отπдарасил все полы в квартире. Обложил кошкин дом чистыми газетами, нульцевое полотенце внутрь застелил.


Кошка, зараза, никуда выходить не дает. Пойду на кухню бульон помешать, через минуту тут как тут «мяу-мяу». Типа пойдем обратно. Вернусь в комнату. Видит, что сел работать, вроде как рядом... сразу успокаивается и в домик залазит. Только выйду – снова та же история. Боится сама оставаться, нужно чтобы кто-то рядом был. Ну пес с тобой, пришлось быть молчаливой группой поддержки.


Вскоре началось. Мои худшие опасения не оправдались – сама управлялась. Оказывается, когда котенок рождается кошки съедают плаценту. Это связано с тем, что для диких кошек плацента является питанием на краткий период, пока они не могут охотиться после родов. Сегодня сам видел. Оно и к лучшему – убирать не придется.


Роды прошли успешно. Только пару раз пришлось подобосраться. Первый раз котенок на пуповине повис и не хотел дальше вываливаться. Пищит и болтается как Тарзан на лиане, а кошка дотянуться не может перекусить. Подождал я, смотрю – нет развития сюжета, Тарзан никак не стремится на встречу с Джейн. Поставил чайник, простерилизовал единственные ножницы в доме. Водкой и кипятком. Благо пол-бутылки водки еще с незапамятных времен в холодильнике лежит. Глянул с тоской на остывающий в тарелке суп и пошел прекращать эту «сказку джунглей». Прихожу, а всё уже тип-топ, следующий на подходе.


Вобщем, это не понадобилось:

Инструменты


Три первых котенка уже освоились. Ползают, пищат, сиську ищут. Когда появился четвертый πздюк я и не заметил. Как смотрю, лежит не шевелится, аудиосигналов не издает. А эта дурочка первых троих вылизывает, а на этого ноль на массу – валяется «в ногах» в режиме радиомолчания. А еще мордочка у него... и не видать, то ли он еще из своего пузыря не выбрался, то ли просто мокрый. «Дура, ты, блин, этого давай вылизывай! С этими-то все заебись уже – вон как шустро ползают, как солдаты в часть из увольнения.» – Ноль на массу. – «Задохнется ведь! Или типа троих забацала, а этот пусть дохнет? Вот уж хуй! Не в мою смену!» Взял кусок бинта (заранее бинтов нарезал на всякий случай). Начал этому πздюку мелкому мордочку вытирать. Вроде дышит злыдень, это он типа прикорнуть решил с дорожки :).


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


UPD: Эмоции по этому поводу строго положительные. Просто сильные.


Кстати, вот эта статья помогла так сказать войти в курс «чокаво»: Роды кошки.


Ну и по поводу этого знаменательного события... – так, кто там у меня из семейства кошачих в коннекте есть? – А вот: Кошка у камелька.


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

суббота, 20 июня 2009 г.

IE8 узнайте факты!

У Microsoft есть страничка для Internet Explorer 8 «Узнайте факты».


Таблица сравнения браузеров

Как видно из таблицы сравнения браузеров, IE 8 безопасен, конфиденциален, прост в использовании, а Firefox и Chrome – нет :). Лично я все еще сомневаюсь, что Microsoft наконец-то (в очередной раз) сделал нормальный браузер. Но старая добрая пропаганда рулит!


Хохму узнал отсюда: Microsoft’s Browser Comparison Chart


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

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

Путь Rails

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


Путь Rails

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


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

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


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

Miranda IM 0.8

Miranda IMИтак, увидел свет мультипротокольный мессенджер Miranda в своей 0.8-й инкарнации. Miranda – программа мгновенного обмена сообщениями для Microsoft Windows.


Радость по поводу выхода любимого клиента была недолгой.
Miranda 0.8 crash


А вот это всплыло при одном из запусков мессенджера. «ДОС фарева!» :)
Miranda DOS


Снос плагинов проблему решает. С другой стороны, очень уж вкусные были плагины; без них как-то скучно.


Новость узнал лично. Еще есть такое описание на Хабрахабре.

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

вторник, 9 июня 2009 г.

Определить IE6 с помощью JavaScript 2

Фактически это не второй скрипт, а фикс предыдущего.


Напоминаю задачу: определить, что браузер посетителя IE6 или более древний.


В Internet Explorer в navigator.appVersion первой идет версия движка, а потом уж все остальное. Примерно так:

4.0 (compatible; MSIE 6.0; Windows NT 5.2; Win64; x64; SV1; .NET CLR 2.0.50727)


Исправленная функция:

function detectIE6(){
var browser = navigator.appName;
if (browser == "Microsoft Internet Explorer"){
var b_version = navigator.appVersion;
var re = /\MSIE\s+(\d\.\d\b)/;
var res = b_version.match(re);
if (res[1] <= 6){
return true;
}
}
return false;
}


Для выборки части строки использовались регулярные выражения.


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

суббота, 6 июня 2009 г.

Изображения слева и справа от заголовка

Как разместить изображения слева и справа от заголовка блога?

– ответы на вопросы читателей.


Приведу пример с использованием абсолютного позиционирования (CSS).


Что должно получиться

Роботы



Первая часть похожа на размещение баннера в заголовке блога.



  1. В редакторе HTML шаблона найди строки:
    <div id='header-wrapper'>
    <b:section class='header' id='header' maxwidgets='1' showaddelement='no'>
    <b:widget id='Header1' locked='true' title='RBB (заголовок)' type='Header'/>
    </b:section>
    </div>

  2. Добавь блоки div с изображениями:
    <div id='header-wrapper'>
    <div id="head-left"><img src="public/robot1.jpg" /></div>
    <div id="head-right"><img src="public/robot2.jpg" /></div>
    <b:section class='header' id='header' maxwidgets='1' showaddelement='no'>
    <b:widget id='Header1' locked='true' title='RBB (заголовок)' type='Header'/>
    </b:section>
    </div>

  3. Задай стили CSS:
    #head-left {
    position:absolute;
    margin-left:-201px;/* ширина изображения + ширина бордюра шапки */
    _margin-left:-206px;/* IE fix */
    }
    #head-right {
    position:absolute;
    margin-left: 661px; /* ширина шапки + бордюр */
    }

  4. Сохрани шаблон.

Смотри так же: Баннера в заголовке блога;
Смешной текст про роботов взят из пасхалки Firefox.


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

Пушкин в Google

В честь Дня рождения Пушкина Google сменил логотип.


Пушкин Google Читать дальше »

среда, 3 июня 2009 г.

Гуглопоиск в действии. Первая кровь.

Недавно появился новый официальный гаджет для Bloggerгуглопоиск в блоге. Делюсь впечатлениями, что понравилось, а что нет. Опробовал на блоге Vault-Tec. Скриншот прилагается.


Поиск в блоге

Преимущества


  • Во-первых, поиск ищет не только точное написание слова, а еще и по склонениям;
  • Быстрый вывод и скрытие результатов (с использованием AJAX, – не иначе);
  • Хорошо вписывается в дизайн блога (используются переменные шаблона);
  • Различные и раздельные области поиска: по блогу, по связанным страницам (вот ЭТОТ термин надо было использовать!), по спискам ссылок и спискам блогов.

Недостатки


Можно, конечно, было бы написать «что не понравилось», или точнее: «что активно не понравилось»... или, используя стилистику дипломированных лингвистов Гугля: «что не понравилось настолько, что аж порой бесит до усрачки».


Вот именно формулировка «Страницы, связанные ссылками с этой страницей». Это клиника. Неужели среди сотрудников Google не нашлось ни одного «русскоязычного» специалиста, еще окончательно не разучившегося лаконично формулировать фразы на родном языке? Трудно было написать «связанные страницы»? А уж если хочется дать расшифровку для идиотов, то вывести ее с использованием атрибута title?


Или Гугль так увлекся набором маститых спецов, что над каждом участке у них трудятся исключительно узкопрофильные специалисты? Типа профессор лингвистики, доктор юзабилити, повелитель аякса и генерал HTML. А в спорных ситуациях все решают на «камень-ножницы-бумага-ящерица-Спок».


В общем, это мне непонятно.


Второе вытекает из первого – невозможность переименовать табы поиска.


Вердикт


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


P.S. Для создания скриншота использовалось дополнение FireShot.


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

вторник, 2 июня 2009 г.

Blogger гаджет Окно поиска

В Blogger стал доступен новый гаджет“Search Box” (Окно поиска). Этот гаджет позволяет искать не только в сообщениях блога, но и по страницам, на которые ссылается блог, по списку блогов и списку ссылок.


Чтобы добавить гаджет в блог, перейди в Макет, щелкни «Добавить гаджет» и выбери «Окно поиска». Настройка проста и прямолинейна как дорога в ад: просто выбери элементы, которые хочешь сделать доступными для поиска.


Окно поиска
Новость узнал на Blogger Buzz.
Читать дальше »

понедельник, 1 июня 2009 г.

Однако кризис

Free Music Sampler

Только что пришло предложение от Sun Microsystems типа «обновите свой профиль и получите бесплатные рингтоны в подарок». Это уже даже не смешно.

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

Баннер в заголовке блога

Blogger

Ответ на вопрос «Как вставить изображение (баннер) выше или ниже шапки в стандартном шаблоне», заданный Ingward.


Далее опишу самый простой способ, основанный на редактировании HTML шаблона Blogger.


Перво-наперво загрузи требуемое изображение, в свой альбом Picasa.


В редакторе HTML шаблона найди строки:

<div id='header-wrapper'>
<b:section class='header' id='header' maxwidgets='1' showaddelement='no'>
<b:widget id='Header1' locked='true' title='RBB (заголовок)' type='Header'/>
</b:section>
</div>


Чтобы добавить баннер выше заголовка блога (хедера), вставь тег изображения между открывающими тегами <div id='header-wrapper'> и <b:section ...>.

<div id='header-wrapper'>
<img style="width:660px; height:30px;" src="http://lh6.ggpht.com/_3_wwcvitlLc/SiNdo1x39WI/AAAAAAAABDU/0Iz7KmUOWDs/rbb_header.gif" />
<b:section class='header' id='header' maxwidgets='1' showaddelement='no'>
<b:widget id='Header1' locked='true' title='RBB (заголовок)' type='Header'/>
</b:section>
</div>


Баннер над заголовком

Чтобы вставить баннер ниже хедера, добавь код между закрывающими тегами </b:section> и </div>.

<div id='header-wrapper'>
<b:section class='header' id='header' maxwidgets='1' showaddelement='no'>
<b:widget id='Header1' locked='true' title='RBB (заголовок)' type='Header'/>
</b:section>
<img style="width:660px; height:30px;" src="http://lh6.ggpht.com/_3_wwcvitlLc/SiNdo1x39WI/AAAAAAAABDU/0Iz7KmUOWDs/rbb_header.gif" />
</div>


Баннер под заголовком

Так же можно добавлять изображение перед открывающим тегом <div id='header-wrapper'> (выше) или закрывающим тегом </div> (ниже) данного примера. С той лишь разницей, что в первом случае изображение будет находиться внутри контейнера header-wrapper, а во втором – за его пределами.


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