суббота, 31 января 2009 г.

Черный ящик блогуна

Вот нет-нет да и попадаются вещи недоступные моему пониманию. В данном случае одна из них -- как сервис Блогун.руБлогун - монетизируем блоги перечисляет деньги блоггерам? Нет, я таки нашел. Но! Чтобы найти ответ на этот, казалось бы вполне предсказуемый вопрос, пришлось сделать целых ДВА клика! И это еще при том “know how”. Простыми буквами -- надо еще знать где ткнуть. И это в сервисе исключительно ориентированном на получение финансовой прибыли. По моему сугубо личному мнению отнюдь не претендующему на абсолютную истину, это должно сиять неоновыми буквами хотябы просто потому, что на такие сервисы люди приходят не ради «тусовки», а с конкретными вопросами:
  • Блогер: как я получу свои деньги?
  • Рекламодатель: как мне оплачивать услуги?
Читать дальше »

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

Eclipse PHP Development Tools (PDT 2.0)

Не так давно я тиснул заметку про Aptana PHP -- подключаемый модуль к оболочке Eclipse. И вот очередная новость из той же серии.


Eclipse PHP Development Tools (PDT 2.0)
Консорциум 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

Не в первый раз уже сталкиваюсь с задачей сортировки по цвету. То есть как произвольный набор цветов в 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
Читать дальше »

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

Radio group value с помощью Javascript

Недавно начал разрабатывать инструментарий для управления стилями шаблона пользователя, основанными на использовании переменных CSS. Задумал нечто похожее на реализацию в Blogger инструмента «Шрифты и Цвета».

В процессе написания 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-фреймворк Prototype.
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” -- это основанное на Flash облако тегов, использующее сконвертированные скрипты, с Roy Tanck's WP Cumulus plugin для Wordpress. Этот виджет использует комбинацию JavaScript и Flash-анимации для разбора и отображения ярлыков вашего блога.



Установка “Blobumus”


Установка этого виджета довольно проста:
  1. На панели управления вашего блога: Макет - Изменить HTML;
  2. Щелкните крыжик «Расширить шаблоны виджета» и найдите следующую строчку (или похожую):

  3. <b:section class='sidebar' id='sidebar' preferred='yes'>

  4. Сразу после этой строки вставьте следующий код:

  5. <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(&quot;http://halotemplates.s3.amazonaws.com/wp-cumulus-example/tagcloud.swf&quot;, &quot;tagcloud&quot;, &quot;240&quot;, &quot;300&quot;, &quot;7&quot;, &quot;#ffffff&quot;);
    // uncomment next line to enable transparency

    //so.addParam(&quot;wmode&quot;, &quot;transparent&quot;);
    so.addVariable(&quot;tcolor&quot;, &quot;0x333333&quot;);
    so.addVariable(&quot;mode&quot;, &quot;tags&quot;);

    so.addVariable(&quot;distr&quot;, &quot;true&quot;);
    so.addVariable(&quot;tspeed&quot;, &quot;100&quot;);
    so.addVariable(&quot;tagcloud&quot;, &quot;<tags><b:loop values='data:labels' var='label'><a expr:href='data:label.url' style='12'><data:label.name/></a></b:loop></tags>&quot;);

    so.addParam(&quot;allowScriptAccess&quot;, &quot;always&quot;);
    so.write(&quot;flashcontent&quot;);
    </script>

    <b:include name='quickedit'/>

    </div>
    </b:includable>
    </b:widget>

  6. Щелкните «просмотр»

  7. Если установленно корректно, вы должны увидеть ваше флеш-облако тегов в боковой панели Blogger;
  8. Сохраните шаблон.

Настройка “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(&quot;wmode&quot;, &quot;transparent&quot;);


Изменить цвет текста
Цвет текста задается в строке:
so.addVariable(&quot;tcolor&quot;, &quot;0x333333&quot;);

Замените 0x333333 например на 0xE3635C.

Изменить размер шрифта
Найдите следующую строку:
so.addVariable(&quot;tagcloud&quot;, &quot;<tags><b:loop values='data:labels' var='label'><a expr:href='data:label.url' style='12'><data:label.name/></a></b:loop></tags>&quot;);

Замените 12 на 14 или как захотите.


UPD: Добавлено обновленное

облако тегов с поддержкой русского языка

.

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

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


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

ICQ упало и пахнет

с ICQ на Google Talk
Компания 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. А сегодня история повторилась с теми же симптомами.

Обновление ICQ-Oscar протокола для Миранды (пока?) решило проблему.

В свете таких событий начинаю задумываться, а не перейти ли окончательно на сервисы Jabber? Тем более, что на базе использования технологии Jabber создано множество частных и корпоративных серверов. Среди них: QIP (QIP Infium), Google (Google Talk), Яндекс (Я.Онлайн), Gizmo и «Живой журнал».

Ссылки по теме:

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

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

Тюнингуем мета-тег Description для Blogger

Не так давно я делился советом, как изменить TITLE страницы Blogger. На очереди мета-тег description. Тег этот доносит краткое описание вашего сайта; в первую очередь -- до поисковых машин.

Ну для многих это не секрет. Оборотная сторона использования мета-тега 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. Простую реализацию для шаблонов XSLT я уже давал. Недавно нашел решение для 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 ADSL несколько компьютеров. Понятное дело, провайдер не спешит делиться «сокровенными знаниями». Поэтому пришлось все делать самому.

Вводные данные:
Провайдер: Webstream Омск
Модем: Интеркросс 5633 NE (4x Ethernet ADSL2+)

Модем Webstream 5633 NE

Настройки компьютеров


По настройке компьютеров как раз самое простое, поэтому останавливаться особо не буду.
В свойствах TCP/IP сетевого соединения (Компьютер-Модем):

Получить IP-адрес автоматически
Предпочитаемый DNS сервер: 192.168.1.1

Настройка модема


  1. В веб-браузере наберите http://192.168.1.1 (IP-адрес модема по умолчанию). Введите username: admin и password: admin (указаны в инструкции к модему). Вы попадете в главное меню “Device Info”

  2. Настройка 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

  3. Настройка 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


  4. Access Control -- Services

    Меню Management - Access Control - Services
    Рекомендую включить все службы

  5. Management - Save/Reboot

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

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

Переменные CSS с использованием XSLT

Недавно озадачился введением в пользовательские шаблоны переменных CSS. Для чего нужны CSS-переменные? Да чтобы пользователь мог задать фирменные цвета, шрифты для своего шаблона и хранить их в одном, определенном месте (как бы это ни звучало). Чтобы впоследствии, если ему захочется что-то изменить, он мог перезадать их там же, а не рыскать по всему файлу CSS. Примерно так сделано в настройках Blogger, в разделе Макет - Шрифты и цвета.

Вот, пожалуй, самый тривиальный способ задания переменных 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>

Выглядеть будет примерно так:


# Store home
def index
@store = Store.find(params[:id])
@title = "Home - #{@store.name}"
end

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

воскресенье, 18 января 2009 г.

Облако тегов для Blogger

tag cloudОдна из недоработок виджетов Blogger -- отсутствие виджета для Облака Тегов (Tag Cloud). В отличие от прочих решений для Облака Тегов, данное решение работает.

1. Сделайте резервную копию шаблона Blogger.

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 &gt; 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] &lt; cloudMin){
continue;
}
for (var i=0;3 &gt; 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. Никакой магии, только один файл HTML и около 800 файлов CSS.
Из серии «пища для глаз», рекомендуется для просмотра. Особенно полезно при творческом запоре застое.

CSS Zen Garden

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

Онлайн генератор разметки страницы CSS

И снова в копилку полезных ресурсов. Он-лайн генератор разметки страницы с использованием CSS (для ленивых). По завершении операции выдаст ссылки на два файла:
  • randomNumber.html -- собственно, сама страница с готовой разметкой HTML;
  • randomNumber.css -- «таблица стилей» CSS.

CSS Layout Generator

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

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

Изменить TITLE в Blogger

По-умолчанию заголовок страницы сообщения на движке 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-версию с 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 минут.
Читать дальше »

Sphinx инструмент для SQL полнотекстового поиска

SphinxSphinx -- это движок для полнотекстового поиска. В целом, это автономный поисковый инструмент, предоставляющий быстрые, эффективные и релевантные функции полнотекстового поиска другим приложениям. Sphinx был специально разработан для удобной интеграции с базами данных SQL и скриптовыми языками программирования.

www.sphinxsearch.com Читать дальше »

вторник, 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() -- Освобождает (очищает) буфер вывода и выключает буферизацию

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

Top-25 самых опасных ошибок программирования CWE/SANS

SANS

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

В понедельник группа из 35 уважаемых организаций, в число которых вошли Microsoft, Symantec, Министерство национальной безопасности США (DHS) и подразделение по защите информации Агентства национальной безопасности, опубликовала список из 25 самых серьезных ошибок, допускаемых при кодировании. Координаторами этой инициативы выступили SANS Institute и спонсируемый из федерального бюджета научно-исследовательский центр MITRE.

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


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

Две верхних строчки в рейтинге занимают недоработки, связанные с неподобающей проверкой вводимых значений и кодировкой вывода. В числе прочих перечислены ошибки в защите SQL-запросов и структуры веб-страниц, приводящие к SQL-инъекциям и уязвимостям межсайтового скриптинга. Упоминается также и об ошибках переполнения буфера и слишком подробных сообщениях о причинах возникновения сбоев. Ознакомиться с рейтингом можно на странице www.sans.org/top25.


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

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

Поддержка PHP в среде Eclipse

EclipseПодключаемый модуль к оболочке Eclipse под названием Aptana PHP позволяет разрабатывать в этой открытой среде программы на PHP с поддержкой вспомогательных продуктов и технологий: AJAX, MySQL, JavaScript и т. д.
Пользователю доступны современные возможности развитых оболочек разработки — редактор с подсветкой синтаксиса, всевозможные подсказки и ускорители ввода, средства визуализации структуры проекта и кода, а также встроенный отладчик и веб-сервер для тестирования приложений. Имеется режим эмуляции браузеров различных типов. Среда также поддерживает развертывание итогового продукта на «облачных» серверах. Читать дальше »

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-компонент предоставляет простой и удобный инструмент для выбора HSV цвета.

Как добавить ColorPicker


  1. включите файлы javascript в секции HEAD
  2. добавьте ссылку на файл стилей colorpicker.css в секции HEAD
  3. добавьте поле input для хранения/отправки 16-ричного значения цвета (без ведущего #)
  4. инициализируйте 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-методов, поэтому рекомендую вынести его в отдельную функцию, которую вызывать каждый раз, когда аяксовый метод отработал.

яваскрипт (javascript)


<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>

ajax_delete_label.rjs : Пример вызова функции для Ruby on Rails.


page.replace_html 'labels_container', :partial => 'custom_labels'
page.call 'activateColorPicker'

Скачать ColorPicker можно с его страницы в Google Code: colorpickerjs.
Читать дальше »

понедельник, 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

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