- Блогер: как я получу свои деньги?
- Рекламодатель: как мне оплачивать услуги?
суббота, 31 января 2009 г.
Черный ящик блогуна
пятница, 30 января 2009 г.
Eclipse PHP Development Tools (PDT 2.0)
Не так давно я тиснул заметку про Aptana PHP -- подключаемый модуль к оболочке Eclipse. И вот очередная новость из той же серии.
Консорциум Eclipse Foundation, ведущий разработку открытой среды разработки Eclipse, сегодня выпустила вторую версию набора средств для разработки приложений на популярном языке веб-программирования PHP. Новая версия Eclipse PHP Development Tools (PDT 2.0) является совместным продуктом Eclipse и Zend Technologies.
По словам разработчиков Eclipse, с релизом второй версии среды для PHP, этот язык стал таким же основным для Eclipse IDE, как Java или C++.
В обновленной версии PHP-среды появились новшества, которые наверняка будут оценены программистами: полная поддержка объектно-ориентированного программирования, поддержка последних новшеств PHP 5.1, а также общая повышенная производительность набора софта, интегрируемого в Eclipse. Кроме того, в PDT 2.0 появились обучающие материалы для новичков.
Вторая версия несколько изменила интерфейс, что, по словам представителей Zend, повышает удобство создания кода.
Добавлен и новый движок для индексирования кодов и их поиска, движок базируется на Eclipse DLTK (Dynamic Languages Toolkit).
Читать дальше »
четверг, 29 января 2009 г.
Сортировка по цвету на Ruby
Итак, произвольный набор цветов в виде хеша (Hash). Кому понравится -- берите не стесняйтесь.
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"
}
А вот и метод сортировки:
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).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
Читать дальше »
среда, 28 января 2009 г.
Radio group value с помощью Javascript
В процессе написания javascript класса столкнулся с проблемой: как получить значение группы радио переключателей (radio group)?
Дело в том, что каждый переключатель имеет собственный
id
и собственное значение value
. В группу же они объединяются по атрибуту name
(name
у них одинаковый).<input type="radio" name="font-face" id="font-face-georgia" value="Georgia, Times, serif" />
<label for="font-face-georgia" style="font-family: Georgia;" class="font-label">Georgia</label>
<input type="radio" name="font-face" id="font-face-arial" value="Arial, sans-serif" />
<label class="font-label" style="font-family: Arial;" for="font-face-arial">Arial</label>
<input type="radio" name="font-face" id="font-face-courier" value="Courier, monospace" />
<label for="font-face-courier" style="font-family: Courier;" class="font-label">Courier</label>
При обработке/отправке формы (
form
) отправляется value
переключателя, у которого установлен атрибут checked
или checked="checked"
.Radio group value на «чистом» javascript
var radioGrp = document['forms']['form_name_or_id']['radio_grp_name'];
for(i=0; i < radioGrp.length; i++){
if (radioGrp[i].checked == true){
var radioValue = radioGrp[i].value;
}
}
В данном случае вы должны знать
name
или id
формы и name
группы переключателей.Radio group value с использованием Prototype javascript
Внимание: в данном примере используется javascript-фреймворк
function $RF(el, radioGroup) {
if($(el).type && $(el).type.toLowerCase() == 'radio') {
var radioGroup = $(el).name;
var el = $(el).form;
} else if ($(el).tagName.toLowerCase() != 'form') {
return false;
}
var checked = $(el).getInputs('radio', radioGroup).find(
function(re) {return re.checked;}
);
return (checked) ? $F(checked) : null;
}
В этом случае вы получаете доступ к элементу или через
form
(id
или object) и radio group name
, или посредством radio button (id
или object).var value = $RF('radio_btn_id');
var value = $RF('form_id', 'radio_grp_name');
Лично мне этот способ помог. Надеюсь, еще кому-нибудь пригодится.
Копирайты
Читать дальше »
понедельник, 26 января 2009 г.
Flash облако тегов
Установка Blobumus
Установка этого виджета довольно проста:
- На панели управления вашего блога: Макет - Изменить HTML;
- Щелкните крыжик «Расширить шаблоны виджета» и найдите следующую строчку (или похожую):
- Сразу после этой строки вставьте следующий код:
- Щелкните «просмотр»
- Сохраните шаблон.
<b:section class='sidebar' id='sidebar' preferred='yes'>
<b:widget id='Label99' locked='false' title='Labels' type='Label'>
<b:includable id='main'>
<b:if cond='data:title'>
<h2><data:title/></h2>
</b:if>
<div class='widget-content'>
<script src='http://halotemplates.s3.amazonaws.com/wp-cumulus-example/swfobject.js' type='text/javascript'/>
<div id='flashcontent'>Blogumulus by <a href='http://www.roytanck.com/'>Roy Tanck</a> and <a href='http://www.bloggerbuster.com'>Amanda Fazani</a></div>
<script type='text/javascript'>
var so = new SWFObject("http://halotemplates.s3.amazonaws.com/wp-cumulus-example/tagcloud.swf", "tagcloud", "240", "300", "7", "#ffffff");
// uncomment next line to enable transparency
//so.addParam("wmode", "transparent");
so.addVariable("tcolor", "0x333333");
so.addVariable("mode", "tags");
so.addVariable("distr", "true");
so.addVariable("tspeed", "100");
so.addVariable("tagcloud", "<tags><b:loop values='data:labels' var='label'><a expr:href='data:label.url' style='12'><data:label.name/></a></b:loop></tags>");
so.addParam("allowScriptAccess", "always");
so.write("flashcontent");
</script>
<b:include name='quickedit'/>
</div>
</b:includable>
</b:widget>
Если установленно корректно, вы должны увидеть ваше флеш-облако тегов в боковой панели Blogger;
Настройка Blobumus
По умолчанию, flash-облако тегов Blobumus использует следующие установки:
- Ширина: 240px;
- Высота: 300px;
- Цвет фона: белый (
#FFFFFF
); - Цвет текста: темно-серый (
#333333
); - Размер шрифта: 12.
Настройка размеров
Размеры заданы в следующей строке кода:
var so = new SWFObject("http://halotemplates.s3.amazonaws.com/wp-cumulus-example/tagcloud.swf", "tagcloud", "240", "300", "7", "#ffffff");
Где
240
и 300
-- соответственно, ширина и высота.Настройка фона
В предыдущем фрагменте кода цвет фона задан как "
#ffffff
" (белый). Для примера вы можете изменить его на "#C61B1B
". Чтобы сделать фон прозрачным, раcкомментируйте (уберите "//" в начале строки) следующую строчку кода://so.addParam("wmode", "transparent");
Изменить цвет текста
Цвет текста задается в строке:
so.addVariable("tcolor", "0x333333");
Замените
0x333333
например на 0xE3635C
.Изменить размер шрифта
Найдите следующую строку:
so.addVariable("tagcloud", "<tags><b:loop values='data:labels' var='label'><a expr:href='data:label.url' style='12'><data:label.name/></a></b:loop></tags>");
Замените
12
на 14
или как захотите.- Blobumus основан на оригинальном WP Cumulus plugin by Roy Tanck, и сконвертирован для использования в Blogger by Amanda
- Этот туториал основан на посте Blogumus: a flash animated label cloud for Blogger!
UPD: Добавлено обновленное
облако тегов с поддержкой русского языка
.Читать дальше »
пятница, 23 января 2009 г.
CSS переменные на Ruby on Rails
Для реализации переменных CSS я использовал CSS-SSC от Shaun Inman. С некоторыми поправками исходя из особенностей моего приложения:
- Стили CSS у меня находятся внутри шаблона, а не в отдельном файле;
- Реализация разделения на переменные и константы мне не нужна;
- У меня только один тег style в шаблоне.
В отличие от оригинального CSS-SSC я решил определение переменных делать без значка доллара (
$
), а подстановку значений переменных -- с ним. Блажь у меня такая.@server constants {
variableName: variableValue;
}
body {
color: $variableName;
}
<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>
.Для этого я создал следующую функцию.
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 обратно на страницу. Правильнее будет ее определить только в одном месте.Следующая функция выполнит следующие операции:
- Выберет все пары значений
[variableName, variableValue]
внутри блока@server constants {}
- Заменит в тексте CSS переменные
$variableName
их значениямиvariableValue
; - Удалит блок
@server constants {}
.
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.
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
.<style type="text/css">
body {
font: 11px/1.5em Arial, Helvetica, sans-serif;
background-color: #FFF;
color: #000;
}
</style>
CSS variables using Ruby onRails by JCDen is licensed under a Creative Commons Attribution 3.0 Unported License.
Читать дальше »
ICQ упало и пахнет
Компания AOL продолжает бороться с альтернативными ICQ-клиентами. 21 января владельцы ICQ предложили большинству российских пользователей альтернативных программ перейти на авторизованные клиенты ICQ 6.5 и ICQ Lite. Соответствующее сообщение пользователи получили при попытке подключения к сети от контакта с номером 1.
Первой ласточкой в борьбе компании AOL со сторонними клиентами стала замена протокола 9 декабря прошлого года, по которому происходит обмен сообщениями в ICQ.
Стали известны некоторые подробности нововведенного протокола. Кроме проверки идентификатора программы-клиента, сервер запрашивает у программы – какие функции она поддерживает. Если в приведенном ответе отсутствуют характерные признаки функциональности ICQ 6.5, то авторизация отклоняется. Именно это усложнило процесс создания новых версий популярных интернет-месседжеров QIP и Pidgin, которые появились лишь сутки спустя.
Причиной такой страстной ненависти AOL к программам-альтернативам заключается в том, что они, в отличие от оригинальных версий ICQ, не содержат встроенную рекламу. Именно деньги с баннерных показов составляют основной заработок AOL на сервисе мгновенных сообщений.
Ряд экспертов предполагают, что далее AOL будет бить своих оппонентов «ниже пояса». Среди предполагаемых мер называется даже публикация в открытом доступе всей history ICQ всех сообщений, отправленных не через «родную» ICQ.
Любопытно, что акция AOL направлена в первую очередь против российских пользователей, среди которых альтернативные клиенты наиболее распространены. С другой стороны, именно в России сосредоточенно большинство пользователей ICQ – в других странах мира предпочтение отдается другим сервисам.
Интересное наблюдение: вчера вечером Miranda успешно подключилась к сервису ICQ без каких-либо обновлений. Как и некоторые клиенты QIP. А сегодня история повторилась с теми же симптомами.
В свете таких событий начинаю задумываться, а не перейти ли окончательно на сервисы Jabber? Тем более, что на базе использования технологии Jabber создано множество частных и корпоративных серверов. Среди них: QIP (QIP Infium), Google (Google Talk), Яндекс (Я.Онлайн), Gizmo и «Живой журнал».
Ссылки по теме:
Читать дальше »
четверг, 22 января 2009 г.
Тюнингуем мета-тег Description для Blogger
Ну для многих это не секрет. Оборотная сторона использования мета-тега
description
в том, что он полезен, скорее, только для главной страницы вашего блога. На целевых страницах он будет лишь «загораживать» основной текст. И для пользователя, просматривающего результат поиска в том же google ссылки на страницы вашего блога будут различаться только заголовками. Всё остальное «съест» Гомер Симпсон Description.Как бороться? Зайдите в редактор шаблона и добавьте следующим образом мета-тег
description
сразу после тега title
. Как вставлять тег TITLE я уже рассказывал. Ссылка вверху поста.<b:if cond='data:blog.pageType != "item"'>
<meta name="description" content="Краткое описание вашего блога" />
</b:if>
Теперь мета-тег description будет отображаться только на главной («индексной») странице вашего блога.
Читать дальше »
среда, 21 января 2009 г.
CSS переменные: реализация на PHP
В нижеприведенном случае, CSS-переменные обрабатываются на стороне сервера. Меня это вполне устраивает. Более того -- я уже адаптировал этот способ для Ruby on Rails. Ну да не всё сразу.
Итак, CSS-SSC, что я понял примерно как CSS Server Side Constants
Константы
Могут быть заданы как индивидуально:
@server constant constantName: constantValue;
так и в группе:
@server constants {
constantName1: constantValue;
constantName2: constantValue;
constantName3: constantValue;
}
Например, для такой записи CSS-SSC:
@server constants {
linkColor: #003366;
linkDecoration: underline;
}
a {color: linkColor; text-decoration: linkDecoration;}
Получим следующий CSS:
a {color: #003366; text-decoration: underline;}
Переменные
Переменные обрабатываются подобно константам, но из значение так же может передаваться через строку запроса:
sample.css?variableName=variableValue
Имена переменных начинаются со значка доллара (
$
).Индивидуально:
@server variable $variableName: defaultVariableValue;
И всем табуном:
@server variables {
$variableName1: defaultVariableValue;
$variableName2: defaultVariableValue;
$variableName3: defaultVariableValue;
}
Пример CSS-SSC:
@server variable $bodyBgColor: #333;
body { background-color: $bodyBgColor; }
Даст такой CSS:
body { background-color: #333; }
Читать дальше »
вторник, 20 января 2009 г.
Webstream. Настройка ADSL роутера для нескольких компьютеров
Вводные данные:
Провайдер: Webstream Омск
Модем: Интеркросс 5633 NE (4x Ethernet ADSL2+)
Настройки компьютеров
По настройке компьютеров как раз самое простое, поэтому останавливаться особо не буду.
В свойствах TCP/IP сетевого соединения (Компьютер-Модем):
Получить IP-адрес автоматически
Предпочитаемый DNS сервер: 192.168.1.1
Настройка модема
- В веб-браузере наберите http://192.168.1.1 (IP-адрес модема по умолчанию). Введите username: admin и password: admin (указаны в инструкции к модему). Вы попадете в главное меню Device Info
Настройка DHCP
DHCP -- это служба автоматического присвоения IP адресов. Позволяет автоматически назначать IP адрес в свойствах подключения к локальной сети на компьютере при подключении.
В меню Advanced Setup - LAN выставьте следующие настройки:- IP Address:
192.168.1.1
- Subnet Mask:
255.255.255.0
- Enable UPnP
- Enable DHCP Server
- Start IP Address:
192.168.1.2
- End IP Address:
192.168.1.254
- Leased Time (hour):
24
Save- IP Address:
Настройка PPPoE (PPP over Ethernet RFC2516)
PPPoE также обозначается как RFC 2516. Это метод инкапсуляции пакетов PPP поверх Ethernet. PPP или Point-to-point protocol -- это метод установления сетевого соединения между конечными хостами. Он обычно используется как механизм аутентификации пользователей интернет.
Выберите меню Advanced Setup - WAN
Edit
Отредактируйте настройки:
ATM PVC Configuration- VPI:
0
- VCI:
35
- Service Category:
UBR Without PCR
- Quality of Service
- Next
Connection Type- PPP over Ethernet (PPPoE)
- Encapsulation Mode:
LLC/SNAP-BRIDGING
- Next
PPP Username and Password- PPP Username:
ваш логин
(указан в договоре) - PPP Password:
ваш пароль
(указан в договоре) - PPPoE Service Name:
имя службы или нифига
(в моем случаеpppoe_8_35_1
) - Authentication Method:
AUTO
- Next
Network Address Translation Settings- Enable NAT
- Enable Firewall
- Enable WAN Service
- Servce Name:
имя службы
(у меняpppoe_8_35_1
) - Next
WAN Setup - Summary- Save
- VPI:
Access Control -- Services
Меню Management - Access Control - Services
Рекомендую включить все службы- Management - Save/Reboot
© dotrb.blogspot.com 2009
Читать дальше »
понедельник, 19 января 2009 г.
Переменные CSS с использованием XSLT
Вот, пожалуй, самый тривиальный способ задания переменных CSS с использованием XSLT. В-частности
xsl:variable
. Для HTML этот способ не подходит.Внутри HTML элемента head шаблона определите переменные и стили.
<!-- CSS Variables -->
<xsl:variable name="consoleEntityColor" select="'#B00080'" />
<xsl:variable name="consoleStringColor" select="'#7F007F'" />
<xsl:variable name="consoleKeywordColor" select="'#00007F'" />
<xsl:variable name="consoleActionColor" select="'#007F7F'" />
<xsl:variable name="consoleParamColor" select="'#C0A030'" />
<xsl:variable name="consoleCommentColor" select="'#007F00'" />
<xsl:variable name="consoleFont" select="'font-family: Courier New, Courier, monospace; font-size: 10pt'" />
<!-- Additional CSS -->
<style type="text/css">
.console {
width:300px; height:200px; border:1px solid <xsl:value-of select="$consoleActionColor"/>;
overflow:auto;
<xsl:value-of select="$consoleFont"/>;
}
.console .entity {
color: <xsl:value-of select="$consoleEntityColor"/>;
}
.console .string {
color: <xsl:value-of select="$consoleStringColor"/>;
}
.console .keyword {
color: <xsl:value-of select="$consoleKeywordColor"/>;
}
.console .action {
color: <xsl:value-of select="$consoleActionColor"/>;
}
.console .param {
color: <xsl:value-of select="$consoleParamColor"/>;
}
.console .comment {
color: <xsl:value-of select="$consoleCommentColor"/>;
}
</style>
Выведите HTML с использованием полученных стилей CSS:
<pre class="console">
<span class="comment"># Store home</span><br />
<span class="keyword">def</span> <span class="action">index</span><br />
<span class="entity">@store</span> = Store.find(params[<span class="param">:id</span>])<br />
<span class="entity">@title</span> = <span class="string">"Home - #{@store.name}"</span><br />
<span class="keyword">end</span>
</pre>
Выглядеть будет примерно так:
def index
@store = Store.find(params[:id])
@title = "Home - #{@store.name}"
end
Читать дальше »
воскресенье, 18 января 2009 г.
Облако тегов для Blogger
1. Сделайте
2. У вас уже должно быть несколько сообщений с тегами (ярлыками). Добавьте элемент Ярлыки на странице Макет - Элементы страницы.
3. Добавьте стили CSS для отображения тегов. На странице Макет - Изменить HTML сразу перед закрывающим тегом
]]></b:skin>
./* Label Cloud Styles */
#labelCloud {text-align:center;font-family:arial,sans-serif;}
#labelCloud .label-cloud li{display:inline;background-image:none !important;padding:0 5px;margin:0;vertical-align:baseline !important;border:0 !important;}
#labelCloud ul{list-style-type:none;margin:0 auto;padding:0;}
#labelCloud a img{border:0;display:inline;margin:0 0 0 3px;padding:0}
#labelCloud a{text-decoration:none}
#labelCloud a:hover{text-decoration:underline}
#labelCloud li a{}
#labelCloud .label-cloud {}
#labelCloud .label-count {padding-left:0.2em;font-size:9px;color:#000}
#labelCloud .label-cloud li:before{content:"" !important}
4. Вставьте следующий код сразу после
]]></b:skin>
, но перед тегом </head>
.<script type='text/javascript'>
// Label Cloud User Variables
var cloudMin = 1;
var maxFontSize = 20;
var maxColor = [122,109,85];
var minFontSize = 10;
var minColor = [0,0,0];
var lcShowCount = false;
</script>
5. Сохраните шаблон.
6. Включите опцию расширить шаблоны виджета и найдите примерно такую строчку:
<b:widget id='Label1' locked='false' title='Labels' type='Label'/>
7. Удалите все строки между
<b:widget id='Label1' locked='false' title='Labels' type='Label'/>
и следующим тегом </b:widget>
8. Вставьте следующий код вместо удаленного.
<b:widget id='Label1' locked='false' title='Модное облако тегов' type='Label'>
<b:includable id='main'>
<b:if cond='data:title'>
<h2><data:title/></h2>
</b:if>
<div class='widget-content'>
<div id='labelCloud'/>
<script type='text/javascript'>
// Don't change anything past this point -----------------
// Cloud function s() ripped from del.icio.us
function s(a,b,i,x){
if(a > b){
var m=(a-b)/Math.log(x),v=a-Math.floor(Math.log(i)*m)
}
else{
var m=(b-a)/Math.log(x),v=Math.floor(Math.log(i)*m+a)
}
return v
}
var c=[];
var labelCount = new Array();
var ts = new Object;
<b:loop values='data:labels' var='label'>
var theName = "<data:label.name/>";
ts[theName] = <data:label.count/>;
</b:loop>
for (t in ts){
if (!labelCount[ts[t]]){
labelCount[ts[t]] = new Array(ts[t])
}
}
var ta=cloudMin-1;
tz = labelCount.length - cloudMin;
lc2 = document.getElementById('labelCloud');
ul = document.createElement('ul');
ul.className = 'label-cloud';
for(var t in ts){
if(ts[t] < cloudMin){
continue;
}
for (var i=0;3 > i;i++) {
c[i]=s(minColor[i],maxColor[i],ts[t]-ta,tz)
}
var fs = s(minFontSize,maxFontSize,ts[t]-ta,tz);
li = document.createElement('li');
li.style.fontSize = fs+'px';
li.style.lineHeight = '1';
a = document.createElement('a');
a.title = ts[t]+' Posts in '+t;
a.style.color = 'rgb('+c[0]+','+c[1]+','+c[2]+')';
a.href = '/search/label/'+encodeURIComponent(t);
if (lcShowCount){
span = document.createElement('span');
span.innerHTML = '('+ts[t]+') ';
span.className = 'label-count';
a.appendChild(document.createTextNode(t));
li.appendChild(a);
li.appendChild(span);
}
else {
a.appendChild(document.createTextNode(t));
li.appendChild(a);
}
ul.appendChild(li);
abnk = document.createTextNode(' ');
ul.appendChild(abnk);
}
lc2.appendChild(ul);
</script>
<noscript>
<ul>
<b:loop values='data:labels' var='label'>
<li>
<b:if cond='data:blog.url == data:label.url'>
<data:label.name/>
<b:else/>
<a expr:href='data:label.url'><data:label.name/></a>
</b:if>
(<data:label.count/>)
</li>
</b:loop>
</ul>
</noscript>
<b:include name='quickedit'/>
</div>
</b:includable>
</b:widget>
6. Сохраните шаблон
Если все сделали правильно, то ваш виджет «Ярлыки» будет заменен «Облаком тегов».
Настройки виджета:
var cloudMin = 1; // количество отображаемых тегов. Если 1, то все.
var maxFontSize = 20; // максимальный размер шрифта
var maxColor = [122,109,85]; // максимальный цвет
var minFontSize = 10; // минимальный размер шрифта
var minColor = [0,0,0]; // минимальный цвет
var lcShowCount = false; // показывать/не показывать количество записей с тегом. false - не показывать.
Обновлено: Решение для ошибки с сохранением XML нашел блоггер 256, за что ему и спасибо.
Проблема заключалась в знаках «больше», «меньше». Коды в этой статье уже исправлены.
Облако тегов от Blogger
Читать дальше »
CSS Zen Garden
Из серии «пища для глаз», рекомендуется для просмотра. Особенно полезно при творческом запоре застое.
Читать дальше »
Онлайн генератор разметки страницы CSS
randomNumber.html
-- собственно, сама страница с готовой разметкой HTML;randomNumber.css
-- «таблица стилей» CSS.
Читать дальше »
четверг, 15 января 2009 г.
Изменить TITLE в Blogger
Название блога Заголовок страницы
что далеко не всегда удобно (чтобы не сказать «совсем неудобно») как для пользователей, так и для поисковых машин. Куда логичнее бы выглядела запись:
Заголовок страницы – Название блога
Дальше для наглядности открой редактор шаблонов своего блога (Настройки – Макет – Изменить HTML) и найди там строчку:
<title><data:blog.pageTitle/></title>
Чтобы исправить это досадное недоразумение, воспользуемся условным CSS. Просто замени эту строчку на следующее:
Читать дальше »
среда, 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-версию с
Установка 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 минут.
Читать дальше »
Sphinx инструмент для SQL полнотекстового поиска
вторник, 13 января 2009 г.
Загрузить файл PHP в строку
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() -- Освобождает (очищает) буфер вывода и выключает буферизацию
Читать дальше »
Top-25 самых опасных ошибок программирования CWE/SANS
Большинство уязвимостей, которые хакеры используют при атаках на веб-сайты и корпоративные серверы, являются следствием распространенных и хорошо известных ошибок программирования.
В понедельник группа из 35 уважаемых организаций, в число которых вошли Microsoft, Symantec, Министерство национальной безопасности США (DHS) и подразделение по защите информации Агентства национальной безопасности, опубликовала список из 25 самых серьезных ошибок, допускаемых при кодировании. Координаторами этой инициативы выступили SANS Institute и спонсируемый из федерального бюджета научно-исследовательский центр MITRE.
Список подразделяется на три класса, в каждом из которых перечислены сходные по типу ошибки. Первые девять из них попадают в категорию «небезопасного взаимодействия между компонентами», вторые девять – в раздел «рискованного управления ресурсами», а оставшимся, по мнению авторов, присуща «проницаемая защита».
Недочеты выстроены в списке исходя из частоты упоминания и серьезности последствий для безопасности.
Две верхних строчки в рейтинге занимают недоработки, связанные с неподобающей проверкой вводимых значений и кодировкой вывода. В числе прочих перечислены ошибки в защите SQL-запросов и структуры веб-страниц, приводящие к SQL-инъекциям и уязвимостям межсайтового скриптинга. Упоминается также и об ошибках переполнения буфера и слишком подробных сообщениях о причинах возникновения сбоев. Ознакомиться с рейтингом можно на странице
Читать дальше »
пятница, 9 января 2009 г.
Поддержка PHP в среде Eclipse
Пользователю доступны современные возможности развитых оболочек разработки — редактор с подсветкой синтаксиса, всевозможные подсказки и ускорители ввода, средства визуализации структуры проекта и кода, а также встроенный отладчик и веб-сервер для тестирования приложений. Имеется режим эмуляции браузеров различных типов. Среда также поддерживает развертывание итогового продукта на «облачных» серверах. Читать дальше »
Yahoo Samsung Internet@TV
Компания Samsung совместно с крупнейшим порталом Yahoo объявили о сотрудничестве по разработке нового интернет-сервиса “Internet@TV - Content Service”, который будет запущен весной 2009. Для этого отдельные модели телевизоров Samsung HDTV будут оснащены встроенным програмным комплектом Yahoo! Widget Engine, который позволит зрителям осуществлять интерактивный просмотр программ при помощи набора “TV Widgets”.
TV Widgets дадут возможность управлять пользователям интернет-контентом и расширить возможности просмотра телевизионных каналов за счет программ и каналов в сети Интернет. Сервис, разработанный с использованием Javascript и XML позволит осуществлять поиск по видеороликам, просматривать видеоконтент и участвовать в работе социальных сетей и приложений. Таким образом обыкновенный телевизор превратится в интерактивное устройство для глобальной сети.
Набор TV Widgets позволит работать также с такими порталами как с Flickr, Yahoo! News, Yahoo! Weather и Yahoo! Finance и просматривать видео на ряде других сервисолв, к примеру USA TODAY, YouTube, eBay и Showtime Networks.
Читать дальше »
ColorPicker - инструмент для выбора цвета
Как добавить ColorPicker
- включите файлы javascript в секции
HEAD
- добавьте ссылку на файл стилей
colorpicker.css
в секцииHEAD
- добавьте поле input для хранения/отправки 16-ричного значения цвета (без ведущего #)
- инициализируйте ColorPicker
<script type="text/javascript">
new Control.ColorPicker("colorFieldName");
</script>
Внимание: Не вызывайте "
new Control.ColorPicker()
" пока не закроете все окружающие форму (form) блочные элементы (напр. div). В противном случае это вызовет ошибку IE Operation Aborted в IE 6/7. Вместо этого используйте:Event.observe(window, "load", function() {
new Control.ColorPicker("colorfield4", { "swatch" : "colorbox4" })
});
Этот способ в «чистом» виде непригоден для AJAX-методов, поэтому рекомендую вынести его в отдельную функцию, которую вызывать каждый раз, когда аяксовый метод отработал.
<script type="text/javascript">
//<![CDATA[
function activateColorPicker(){
cp_Label = new Control.ColorPicker("label_color", { "swatch" : "inside_color1" });
}
// first time Run (for IE)
Event.observe(window, "load", function() {
activateColorPicker();
});
//]]>
</script>
page.replace_html 'labels_container', :partial => 'custom_labels'
page.call 'activateColorPicker'
Скачать ColorPicker можно с его страницы в Google Code: colorpickerjs.
Читать дальше »
понедельник, 5 января 2009 г.
Год бесплатного хостинга для разработчиков web-приложений 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
Читать дальше »