<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
	<channel>
		<title>Lily Software</title>
		<link>https://lily-software.com</link>
		<description>Создание интернет сайтов в Краснодаре, web дизайн, web консалтинг</description>
		<generator>Cotonti</generator>
		<language>ru</language>
		<pubDate>Sun, 05 Apr 2026 04:01:07 +0300</pubDate>

		<item>
			<title>Конфиг Nginx для Cotonti</title>
			<description><![CDATA[<p>Если Вам нужно установить сайт на Cotonti на web-сервер <strong>Nginx</strong> без Apache. В этом случае у Вас не будет возможности обрабатывать файлы <strong>.htaccess</strong>, но это и не нужно.</p>

<p>Вы можете использовтаь приведенный ниже конфиг.</p>

<p>Предположим, что домен Вашего сайта <strong>your_domain.com</strong>, а <strong>/path/to/your/site/public_html</strong> - путь к корневой папке Вашего сайта.</p>

<p> </p>

<pre class="brush:bash;">
# Редирект с www.your_domain.com на урл без www
# Это же можно сделать и для https:
server {
    listen 80;
    server_name www.your_domain.com;
    return 301 $scheme://your_domain.com$request_uri;
}

server {

    # HTTP Auth
    # Нужна http авторизация?
    #auth_basic "Hello, Admin, please login";
    #auth_basic_user_file /path/to/your/site/my_site/.htpasswd;
    
    # Domains
    # Домен Вашего сайта
    server_name your_domain.com;

    # Ports
    # Порты
    # HTTP
    listen 80;
    # HTTPS
    # listen 443 ssl;

    # Logs
    # Логи. Access лог не особо нужен. 
    #    access_log /path/to/your/site/logs/access.log;
    # Error log, по большому счету, можно включать только по необходимости 
    error_log /path/to/your/site/logs/error.log;
    
    # Root
    root /path/to/your/site/public_html;
    index index.php;
    
    # SSL
    #ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
    #ssl_ciphers             HIGH:!RC4:!aNULL:!MD5:!kEDH;
    #ssl_certificate         /path/to/ssl/sertificate.crt;
    #ssl_certificate_key     /path/to/ssl/ssl/ertificate.key;
    #ssl_session_cache       shared:SSL:10m;
    #ssl_session_timeout     10m;

    
    # Сonvince user that we have no Git
    # Скрываем присутсвие Git
    location ~ /\.git { 
        return 404; 
    } 

    # Deny access to .htaccess files
    location ~ /\.ht {
        deny all;
    }
    
    # Specifically disable the execution of PHP files in any directory containing user uploads:
    # Запрещаем исполнение php-скриптов в папках, куда пользователи могут загружать файлы
    location ~ /datas/(users|avatars|defaultav|exflds|files|photos|thumbs) {
        location ~ \.php$ {return 403;}
    }
    location /public {
        location ~ \.php$ {return 403;}
    }
    
    # File protection
    # Эти файлы пользователю читать ни к чему
    location ~ \.(tpl|dat)$ {
        #deny all;
        return 404;
    }
    
    location / {
        index index.php index.html index.htm;
        
        # Language selector
        # Выбор языка сайта
        rewrite "^/(en|ru|de|nl)/(.*)" /$2?l=$1;

        # Sitemap shortcut
        # Ссылка на карту сайта (при включенном плагине Sitemap)
        rewrite ^/sitemap\.xml$ /index.php?r=sitemap last;

        # Admin area and message are special scripts
        # Админка и некоторые специальные скрипты
        rewrite "^/admin/([a-z0-9]+)" /admin.php?m=$1 last;
        rewrite "^/(admin|login|message)(/|\?|$)" /$1.php last;
        
        # System category has priority over /system folder
        # Категория System. Да и пользователю нечено делать в папке "system"
        rewrite "^/system/?$"  /index.php?rwr=system last;
        
        # All the rest goes through standard rewrite gateway
        # Остальные урлы перезаписываем
        try_files $uri $uri/ /index.php?rwr=$uri&amp;$args;
        
        # Если Ваш сайт умеет обрабатывать 404 ошибки
        error_page 404 /404.html;
    }
    
    location ~ \.php$ {
        # upstream name или soсket или IP:port
        fastcgi_pass php_upstream;
		
        fastcgi_index index.php;
		
        # Если Вы используете chroot - то путь следует указывать относительно корня chroot
        fastcgi_param SCRIPT_FILENAME     /path_to_site_from_chroot/public_html$fastcgi_script_name;
		
        include fastcgi_params;
		
        # 2 строки ниже нужны при использовании chroot и путь следует указывать 
        # относительно корня chroot
        # Иначе их можно опустить. Соотвествующие параметры должны быть в подключаемом 
        # файле fastcgi_params
        fastcgi_param  DOCUMENT_ROOT     /path_to_site_from_chroot/public_html;
        fastcgi_param  PATH_TRANSLATED   /path_to_site_from_chroot/public_html$fastcgi_script_name;
		
        # Если Ваш сайт умеет обрабатывать 404 ошибки
        error_page 404 /404.html;
    }
}
</pre>
]]></description>
			<pubDate>Thu, 17 Nov 2016 09:53:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/nginx-config-dlya-cotonti]]></link>
		</item>
		<item>
			<title>Хранение не целых чисел в MySQL</title>
			<description><![CDATA[<p style="text-align:justify;">В <strong>MySQL</strong> существует множество типов данных для хранения чисел как целых, так и с плавающей точкой.<br />
Рассмотрим существующие форматы:</p>

<p style="text-align:justify;">Для целых используются: <strong>TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT</strong>. Эти типы используются для хранения целых чисел и занимают от 1 до 8 байт памяти соответственно.</p>

<p style="text-align:justify;">Для чисел с плавающей точкой используются: <strong>FLOAT, DOUBLE</strong>. Главный минус чисел с плавающей точкой (или вещественных чисел) – принцип их представления и хранения. Такие числа хранятся как степени двойки. Так как не все десятичные числа имеют точное представление в виде двоичной дроби, результаты хранения получаются округленными. Даже при элементарных математических операциях возможны расхождения. Более подробно про это можно прочитать на хабре</p>

<p style="text-align:justify;">При хранении важных данных (к примеру, банковский счет) важен каждый символ даже в последнем разряде после точки, поэтому использовать числа с плавающей точкой нельзя.<br />
Избежать проблем хранения и поиска данных можно при помощи типов: <strong>DECIMAL, NUMERIC</strong>.</p>

<p style="text-align:justify;">До версии 5.03 эти типы хранились как строки, при этом использовалось по одному символу строки для каждого разряда числа (при необходимости, тратились дополнительно по одному символу на знак числа и на десятичный разделитель), также была возможна потеря точности из-за некорректной реализации арифметики таких чисел.</p>

<p style="text-align:justify;">Начиная с 5.03, в MySQL появилась новая библиотека для арифметики чисел с фиксированной точкой и изменился подход к хранению таких чисел. Теперь целая часть и часть после точки хранятся как 2 отдельных, целых числа. Оценить расход места можно на основании следующей таблицы:</p>

<table border="1"><tbody><tr><td><strong>Оставшиеся цифры</strong></td>
			<td><strong>Число байт</strong></td>
		</tr><tr><td>0</td>
			<td>0</td>
		</tr><tr><td>1-2</td>
			<td>1</td>
		</tr><tr><td>3-4</td>
			<td>2</td>
		</tr><tr><td>5-6</td>
			<td>3</td>
		</tr><tr><td>7-9</td>
			<td>4</td>
		</tr></tbody></table><p style="text-align:justify;"> </p>

<p style="text-align:justify;">Расчет ведется очень просто: к примеру, нам надо сохранить <strong>DECIMAL</strong>(10,2) – целая часть имеет 8 цифр и занимает 4 байта, часть после точки – 2 цифры и занимает 1 байт. Итого на хранение будет потрачено 5 байт.</p>

<p style="text-align:justify;">В ранних версиях <strong>MySQL</strong> типы <strong>DECIMAL</strong> и <strong>NUMERIC</strong> вели себя по-разному. SQL-стандарт требует, чтобы точность NUMERIC(M,D) была точно M цифр. Для DECIMAL(M,D) стандарт требует точности не меньше M цифр, но позволяет хранить больше. Это означает, что если бы вы захотели сохранить число 1,00005 в DECIMAL(6,4) и NUMERIC(6,4), то по стандарту NUMERIC сохранит 1.0000, а DECIMAL может сохранить 1.00005. Такое поведение при большом количестве математических операций может дать небольшую погрешность.</p>

<p style="text-align:justify;">В последних версиях MySQL DECIMAL и NUMERIC оба типа имеют точность ровно M цифр.</p>

<p style="text-align:justify;">Чтобы переварить все вышеизложенное, рассмотрим пару примеров (Server version: 5.0.77 Gentoo Linux).</p>

<p style="text-align:justify;">Создадим таблицу test с 4 полями разных типов. Внесем одинаковые данные и посмотрим, как будет вести себя MySQL</p>

<pre class="brush:sql;">
CREATE TABLE test (a FLOAT, b DOUBLE, c DECIMAL (6,4), d NUMERIC(6,4)) ENGINE = MyISAM;
INSERT INTO test(a,b,c,d) VALUES (0.3, 0.3, 0.3, 0.3), (0.00003, 0.00003, 0.00003, 0.00003);
 
SELECT a, b, c, d FROM test;
+-------+-------+--------+--------+
| a     | b     | c      | d      |
+-------+-------+--------+--------+
|   0.3 |   0.3 | 0.3000 | 0.3000 |
| 3e-05 | 3e-05 | 0.0000 | 0.0000 |
+-------+-------+--------+--------+</pre>

<pre class="brush:sql;">
SELECT a*1000, b*1000, c*1000, d*1000 FROM test;
+-------------------+--------+----------+----------+
| a*1000            | b*1000 | c*1000   | d*1000   |
+-------------------+--------+----------+----------+
|   300.00001192093 |    300 | 300.0000 | 300.0000 |
| 0.029999999242136 |   0.03 |   0.0000 |   0.0000 |
+-------------------+--------+----------+----------+</pre>

<p>Наглядный пример, почему не стоит доверять важные данные числам с плавающей точкой. Но не стоит думать, что DOUBLE – панацея. FLOAT и DOUBLE – одинаковы по принципу хранения. Оба типа одинаково не точны, просто в DOUBLE неточности появляются при бОльшем числе знаков.</p>

<p>Проблемы могут всплыть даже в более безобидных случаях. Предположим, мы храним данные о балансе клиента с точностью до копеек:</p>

<pre class="brush:sql;">
CREATE TABLE test (money FLOAT) ENGINE = MyISAM;
INSERT INTO test(money) VALUES (123.34),(8691.00),(0.01);
 
SELECT money, 1+money, 1*money FROM test;
+--------+-----------------+--------------------+
| money  | 1+money         | 1*money            |
+--------+-----------------+--------------------+
| 123.34 | 124.33999633789 |    123.33999633789 |
|   8691 |            8692 |               8691 |
|   0.01 | 1.0099999997765 | 0.0099999997764826 |
+--------+-----------------+--------------------+</pre>

<p>Если я вас еще не убедил отказаться от FLOAT , приготовьтесь к проблемам при поиске.</p>

<p>Проблема с поиском:</p>

<pre class="brush:sql;">
SELECT money FROM test WHERE money = 123.34;
Empty set (0.00 sec)</pre>

<p>Если же у вас назрела необходимость в поиске по полю FLOAT – используйте границы для поиска.</p>

<pre class="brush:sql;">
SELECT money FROM test WHERE money &gt; 123.33 AND money &lt;123.35;
+--------+
| money  |
+--------+
| 123.34 |
+--------+
1 row in set (0.00 sec)</pre>

<p> </p>

<p>Вопрос остается открытым. Как же хранить данные?<br />
Предположим, перед нами стоит задача сохранить число с двумя знаками после запятой. Это можно реализовать следующими способами:</p>

<p>1. FLOAT – забиваем на точность, вспоминаем про проблемы с поиском и все равно используем. Диапазон хранимых чисел очень большой: [-3,402823466E+38 .. -1,175494351E-38], 0, и [1,175494351E-38 .. 3,402823466E+38]. Занимает 4 байта.</p>

<p>2. DOUBLE – как уже упоминалось выше, ни чем не отличается от FLOAT, рано или поздно – всплывет погрешность. Диапазон больше, чем звезд во Вселенной: [-1,7976931348623157E+308 .. -2,2250738585072014E-308], 0, и [2,2250738585072014E-308 .. 1,7976931348623157E+308]. Занимает 8 байтов.</p>

<p>3. DECIMAL(X,2) – точное число с десятичной точкой. В зависимости от требуемого числа знаков до точки, меняем X. К примеру, нам надо хранить числа до 10 миллионов. Тогда инициализация поля будет иметь вид DECIMAL(9,2), поле – занимать 5 байтов и хранить числа в диапазоне [-9999999.99 .. 9999999.99].</p>

<p>4. INT – храним сразу в «копейках», а всеми преобразованиями занимаются хранимые процедуры, триггеры, PHP или другой язык программирования. При таком подходе мы сможем сохранить числа в диапазоне: [-21474836.48 .. 21474836.47], или при использовании UNSIGNED [0 .. 42949672.95]. Если вдруг нужен больший диапазон, всегда можно использовать 8 байтовый BIGINT.</p>

<p> </p>

<p><em><strong>Выводы:</strong></em></p>

<p>1. Для хранения важных данных <strong>нельзя использовать типы FLOAT и DOUBLE</strong>;</p>

<p>2. Оптимальный способ для хранения – DECIMAL. В крайнем случае – INT или BIGINT (особенно, если у вас используется ORM или DAO для доступа к данным, и все операции для перевода из целого в дробное и обратно будут прозрачны);</p>

<p>3. <strong>DECIMAL</strong> и <strong>NUMERIC</strong> – идентичны;</p>

<p>4. Если вы используете версию <strong>MySQL до 5.0.3</strong>, настоятельно <strong>рекомендуется обновиться</strong> до что-нибудь посвежее;</p>
]]></description>
			<pubDate>Wed, 08 Oct 2014 15:44:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/xranenie-ne-celyx-chisel-v-mysql]]></link>
		</item>
		<item>
			<title>3D облако тегов на базе TagCanvas</title>
			<description><![CDATA[<p style="text-align:justify;">Подключаем 3D облако тегов используя плагин jQuery TagCanvas на примере Cotonti Siena.</p>

<p style="text-align:justify;">Мы решили отказаться от плагина "<a href="https://lily-software.com/sozdanie-internet-sajtov/arhiv/cotonti_3d_tag_cloud">3D облако тегов</a>" на базе WP-Cumulus т.к. последний использует флеш, что накладывает некоторые ограничения. Использование флеш требует наличие flash плеера на машине пользователя. Кроме того флеш не поддерживается на Apple iPhone и iPad, а количество посетителей моего сайта использующих эти устройства довольно велико.</p>

<p style="text-align:justify;">Для создания облака тегов будем использовать плагин <a href="https://lily-software.com/go.php?goat1000.com/tagcanvas.php" target="_blank">jQuery TagCanvas</a>.</p>

<p style="text-align:justify;"><a href="https://lily-software.com/go.php?www.goat1000.com/tagcanvas.php#links" target="_blank">Скачиваем TagCanvas</a>. Качаем <strong>jQuery plugin version</strong>. Поскольку этот плагин использует элемент <strong>Canvas</strong>, который не поддерживается Internet Explorer версии 8 и ниже, <a href="https://lily-software.com/go.php?https://code.google.com/p/explorercanvas/source/browse/excanvas.js" target="_blank">скачиваем excanvas.js</a></p>

<p style="text-align:justify;">В нужной теме открываем файл <strong>header.tpl</strong> и в конце раздела &lt;head&gt; подключаем скаченные файлы:</p>

<pre class="brush:xml;">
&lt;!-- IF {PHP.env.location} == 'home' --&gt;
    &lt;!--[if lt IE 9]&gt;
    &lt;script type="text/javascript" src="https://lily-software.com/{PHP.cfg.mainurl}/{PHP.cfg.themes_dir}/{PHP.theme}/js/excanvas.js?1"&gt;&lt;/script&gt;
    &lt;![endif]--&gt;
    &lt;script src="https://lily-software.com/{PHP.cfg.mainurl}/{PHP.cfg.themes_dir}/{PHP.theme}/js/jquery.tagcanvas.min.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;!-- ENDIF --&gt;</pre>

<p>В данном случае они будут загружены только для главной страницы.</p>

<p>Далее нам нужно не много подправить вывод тегов на главной странице. Открываем файл <strong>index.tpl</strong>.</p>

<p>В месте, куда нужно вывести теги, создадим для них контейнер:</p>

<pre class="brush:as3;">
&lt;div id="3d_tagCloudContainer" style="font-size: 84%"&gt;
    &lt;canvas width="260" height="260" id="3d_tagCloud"&gt;&lt;/canvas&gt;
&lt;/div&gt;</pre>

<p>Само облако тегов спрячем:<br />
 </p>

<pre class="brush:xml;">
&lt;div id="tagCloud" style="display: none"&gt;
   {INDEX_TAG_CLOUD}
&lt;/div&gt;</pre>

<p>Инициализируем 3D облако.</p>

<p>В итоге получем примерно такой код:</p>

<pre class="brush:xml;">
&lt;div id="3d_tagCloudContainer" style="font-size: 84%"&gt;
    &lt;canvas width="260" height="260" id="3d_tagCloud"&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;div id="tagCloud" style="display: none"&gt;
    {INDEX_TAG_CLOUD}
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
    if( !$('#3d_tagCloud').tagcanvas({
        outlineColour: '#999999',
        outlineThickness: '1',
        outlineOffset: 2,
        textFont: null,
        textColour: null,
        weight: true
    },'tagCloud')) {
        // TagCanvas failed to load
        $('#3d_tagCloudContainer').hide();
        $('#tagCloud').css('display', 'block')
    }
&lt;/script&gt;
{INDEX_TAG_CLOUD_ALL_LINK}
</pre>

<p> </p>

<p>Все достаточно просто.</p>

<p>Образец работы можно понаблюдать на главной странице этого сайта.</p>
]]></description>
			<pubDate>Fri, 10 May 2013 11:28:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/3d-oblako-tegov-na-baze-tagcanvas]]></link>
		</item>
		<item>
			<title>Внедрение Flash при помощи SWFObject 2</title>
			<description><![CDATA[<p style="text-align:justify;">SWFObject - соответствующий стандартам и легкий в использовании способ внедрения Flash, использующий один небольшой JavaScript-файл.</p>

<p style="text-align:justify;">Скачать библиотеку и получить дополнительную информацию можно на странице проекта <a href="https://lily-software.com/go.php?code.google.com/p/swfobject/">SWFObject в Google Code</a>.</p>

<h3 style="text-align:justify;"> </h3>

<h3 style="text-align:justify;">Что такое SWFObject?</h3>

<p style="text-align:justify;">SWFObject 2:</p>

<ul><li style="text-align:justify;">Предоставляет два оптимизированных метода внедрения Flash: основанный на разметке и использующий JavaScript</li>
    <li style="text-align:justify;">Предоставляет <a href="https://lily-software.com/go.php?code.google.com/p/swfobject/wiki/api">JavaScript API</a> со всеми возможностями необходимыми для внедрения SWF файлов и получения информации о Flash плеере.</li>
    <li style="text-align:justify;">Использует один небольшой JavaScript файл (10Кб / GZIPed: 3.9Kb)</li>
    <li style="text-align:justify;">Является преемником <a href="https://lily-software.com/go.php?blog.deconcept.com/swfobject/">SWFObject 1,5</a>, <a href="https://lily-software.com/go.php?www.bobbyvandersluis.com/ufo/4">UFO</a> и <a href="https://lily-software.com/go.php?www.adobe.com/products/flashplayer/download/detection_kit/">Adobe Flash Player Detection Kit</a></li>
    <li style="text-align:justify;">Объединяет все существующие методы внедрения Flash и обеспечивает новый стандарт внедрения Flash.</li>
</ul><p style="text-align:justify;">Итак: SWFObject 2 не только позволяет внедрять Flash динамически, с помощью JavaScript, но и статически, когда для внедрения используется стандартная HTML разметка, а JavaScript только исправляет неразрешимые с помощью разметки проблемы, при этом даже если JavaScript отключен пользователи все равно увидят Flash.</p>

<h3 style="text-align:justify;"> </h3>

<h3 style="text-align:justify;">Почему следует использовать SWFObject?</h3>

<ul><li style="text-align:justify;">Наиболее оптимизированный и гибкий по сравнению с другими методами внедрения Flash плеера.</li>
    <li style="text-align:justify;">Это универсальное решение для всех: будь вы HTML, Flash или JavaScript разработчик, это решение подходит для всех.</li>
    <li style="text-align:justify;">Прекращает затянувшееся использование специфичной разметки, зависимой от разработчиков конкретного браузера и позволяет использовать стандартную разметку и альтернативный контент.</li>
    <li style="text-align:justify;">Использует ненавязчивый JavaScript.</li>
    <li style="text-align:justify;">Прост в использовании.</li>
</ul><p style="text-align:justify;">Более подробное обоснование необходимости использования SWFObject 2 вы можете найти в статье <a href="https://lily-software.com/go.php?www.alistapart.com/articles/flashembedcagematch/">Flash Embedding Cage Match</a> опубликованной на A List Apart.</p>

<h3 style="text-align:justify;"> </h3>

<h3 style="text-align:justify;">Почему SWFObject использует JavaScript?</h3>

<p style="text-align:justify;">В первую очередь SWFObject 2 использует JavaScript для решения проблем, непреодолимых при помощи одной разметки:</p>

<ul><li style="text-align:justify;">Определяет версию Flash-плеера и в зависимости от результата отображает Flash либо альтернативный контент, чем предотвращает искажение Flash в плеерах устаревших версий.</li>
    <li style="text-align:justify;">Позволяет вернуться к альтернативному контенту с помощью манипуляций DOM в случае, если используется устаревший плагин Flash (примечание: если Flash плагин не установлен то вместо элемента object автоматически отображается вложенный альтернативный контент).</li>
    <li style="text-align:justify;">Позволяет использовать Adobe Express Install для установки последней версии Flash плеера</li>
    <li style="text-align:justify;">Предоставляет интерфейс JavaScript API для выполнения распространенных действий с Flash плеером и Flash контентом.</li>
</ul><h3 style="text-align:justify;"> </h3>

<h3 style="text-align:justify;">Какой из методов публикации предпочтительнее, статический или динамический?</h3>

<p style="text-align:justify;">SWFObject 2 позволяет внедрять Flash двумя различными методами:</p>

<p style="text-align:justify;">1. При <strong>статическом методе публикации</strong> Flash и альтернативный контент внедряются с помощью стандартной разметки, а JavaScript используется для решения проблем непреодолимых с помощью разметки.<br />
    2. <strong>Динамический метод публикации</strong> основан на замене альтернативного контента Flash контентом в случае если у пользователя установлена достаточно новая версия Flash плеера и поддержка JavaScript. <span lang="ru" xml:lang="ru"><span title="Нажмите, чтобы увидеть альтернативный перевод">(аналогично</span> <span title="Нажмите, чтобы увидеть альтернативный перевод">как и предыдущей</span> <span title="Нажмите, чтобы увидеть альтернативный перевод">версии</span> <span title="Нажмите, чтобы увидеть альтернативный перевод">SWFObject</span> <span title="Нажмите, чтобы увидеть альтернативный перевод">и</span> <span title="Нажмите, чтобы увидеть альтернативный перевод">UFO</span><span title="Нажмите, чтобы увидеть альтернативный перевод">)</span></span></p>

<p style="text-align:justify;">Преимущества <strong>статического метода публикации</strong>:</p>

<p style="text-align:justify;">1. Используется стандартная разметка.<br />
    2. Большая производительность этого метода внедрения.<br />
    3. Механизм внедрения Flash контента не зависит от JavaScript благодаря чему Flash будет доступен значительно большей аудитории:</p>

<ul><li style="text-align:justify;">Если у вас установлен Flash плагин, но отключен JavaScript, либо Ваш браузер не поддерживает JavaScript, вы все равно увидите Flash контент.</li>
    <li style="text-align:justify;">Flash будет отображен на устройствах со слабой поддержкой JavaScript, например Sony PSP</li>
    <li style="text-align:justify;">Приложения вроде RSS ридеров смогут отобразить Flash</li>
</ul><p style="text-align:justify;"> </p>

<p style="text-align:justify;">Преимущества <strong>динамического метода публикации</strong>:</p>

<p style="text-align:justify;">1. Хорошо интегрируется с серверными скриптами (php, perl и т.д.) позволяя использовать динамические данные (flashvars).<br />
    2. Позволяет обойти механизмы активации активного контента в Internet Explorer 6/7 и Opera 9+. Обратите внимание, что Microsoft <a href="https://lily-software.com/go.php?blogs.msdn.com/ie/archive/2007/11/08/ie-automatic-component-activation-changes-to-ie-activex-update.aspx">прекратила использование этого механизма</a> в браузерах Internet Explorer</p>

<h3 style="text-align:justify;"> </h3>

<h3 style="text-align:justify;">Статический метод публикации Flash с помощью SWFObject</h3>

<p> </p>

<p style="text-align:justify;"><strong>Шаг 1: Внедрение Flash и альтернативного контента с помощью стандартной разметки.</strong></p>

<p style="text-align:justify;">SWFObject использует метод вложенных объектов (с условными комментариями для Internet Explorer) (<a href="https://lily-software.com/go.php?www.alistapart.com/articles/flashembedcagematch">http://www.alistapart.com/articles/flashembedcagematch</a>) documentation это оптимальная кроссбраузерная разметка, соответствующая стандартам и позволяющая задать альтернативный контент. (<a href="https://lily-software.com/go.php?www.bobbyvandersluis.com/flashembed/testsuite">http://www.bobbyvandersluis.com/flashembed/testsuite</a>):</p>

<pre class="code" style="text-align:justify;">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"&gt;
&lt;head&gt;
  &lt;title&gt;SWFObject - step 1&lt;/title&gt;
  &lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;
&lt;/head&gt;
&lt;body&gt;
   &lt;div&gt;
    
     &lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420"&gt;
        &lt;param name="movie" value="myContent.swf" /&gt;
        &lt;!--[if !IE]&gt;--&gt;
        &lt;object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420"&gt;
        &lt;!--&lt;![endif]--&gt;
        &lt;p&gt;Alternative content&lt;/p&gt;
        &lt;!--[if !IE]&gt;--&gt;
        &lt;/object&gt;
        &lt;!--&lt;![endif]--&gt;
     &lt;/object&gt;

  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>

<p style="text-align:justify;">Примечание: Метод вложенных объектов требует двойного объявления объекта object (внешний object предназначен для Internet Explorer а внутренний object для остальных браузеров), поэтому если вам нужно определить атрибуты или необходимые параметры для object то их нужно продублировать для внешнего и внутреннего объектов.</p>

<p style="text-align:justify;">Обязательные атрибуты:</p>

<ul><li style="text-align:justify;">classid (только для внешнего object, значение всегда clsid:D27CDB6E-AE6D-11cf-96B8-444553540000)</li>
    <li style="text-align:justify;">type (только для внутреннего object, значение всегда application/x-shockwave-flash)</li>
    <li style="text-align:justify;">data (только для внутреннего object, определяет URL SWF файла)</li>
    <li style="text-align:justify;">width (для обоих элементов object, определяет ширину SWF)</li>
    <li style="text-align:justify;">height (для обоих элементов object, определяет высоту SWF)</li>
</ul><p style="text-align:justify;">Обязательные элементы param:</p>

<ul><li style="text-align:justify;">movie (только для внешнего элемента object, определяет URL SWF файла)</li>
</ul><p style="text-align:justify;">Примечание: Мы не рекомендуем использование атрибута codebase для указания URL установщика Flash с серверов Adobe, поскольку это противоречит спецификации которая ограничивает доступ доменом текущего документа. Вместо этого используйте альтернативный контент с сообщением о том, что пользователь может посмотреть весь контент, установив Flash плагин.</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;"><strong>Как использовать HTML для конфигурирования Flash контента?</strong></p>

<p style="text-align:justify;">Вы можете использовать <a href="https://lily-software.com/go.php?www.w3schools.com/tags/tag_object.asp">дополнительные атрибуты</a> элемента object:</p>

<ul><li style="text-align:justify;">id</li>
    <li style="text-align:justify;">name</li>
    <li style="text-align:justify;">class</li>
    <li style="text-align:justify;">align</li>
</ul><p style="text-align:justify;">Вы можете использовать специфичные для Flash элементы param (<a href="https://lily-software.com/go.php?www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_12701">подробнее</a>):</p>

<ul><li style="text-align:justify;">play</li>
    <li style="text-align:justify;">loop</li>
    <li style="text-align:justify;">menu</li>
    <li style="text-align:justify;">quality</li>
    <li style="text-align:justify;">scale</li>
    <li style="text-align:justify;">salign</li>
    <li style="text-align:justify;">wmode</li>
    <li style="text-align:justify;">bgcolor</li>
    <li style="text-align:justify;">base</li>
    <li style="text-align:justify;">swliveconnect</li>
    <li style="text-align:justify;">flashvars</li>
    <li style="text-align:justify;">devicefont (<a href="https://lily-software.com/go.php?www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_13331">подробнее</a>)</li>
    <li style="text-align:justify;">allowscriptaccess (<a href="https://lily-software.com/go.php?www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_16494">подробнее</a> и <a href="https://lily-software.com/go.php?www.adobe.com/go/kb402975">тут</a> )</li>
    <li style="text-align:justify;">seamlesstabbing (<a href="https://lily-software.com/go.php?www.adobe.com/support/documentation/en/flashplayer/7/releasenotes.html">подробнее</a>)</li>
    <li style="text-align:justify;">allowfullscreen (<a href="https://lily-software.com/go.php?www.adobe.com/devnet/flashplayer/articles/full_screen_mode.html">подробнее</a>)</li>
    <li style="text-align:justify;">allownetworking (<a href="https://lily-software.com/go.php?livedocs.adobe.com/flash/9.0/main/00001079.html">подробнее</a>)</li>
</ul><p style="text-align:justify;"> </p>

<p style="text-align:justify;"><strong>Зачем нужен альтернативный контент?</strong></p>

<p style="text-align:justify;">Элемент object может содержать альтернативный контент который будет показан если Flash плеер не установлен или не поддерживается. Альтернативный контент доступен поисковикам, поэтому он может быть хорошим инструментом при оптимизации сайта для поисковиков. Итак, альтернативный контент используется для показа пользователям у которых в <a href="https://lily-software.com/go.php?www.adobe.com/devnet/flashplayer/articles/alternative_content_02.html">браузере не установлен плагин Falsh</a>, для создания <a href="https://lily-software.com/go.php?www.adobe.com/devnet/flashplayer/articles/alternative_content_04.html">SEO контента</a> или чтобы сказать пользователям о том, что они могут получить дополнительные возможности <a href="https://lily-software.com/go.php?http://www.adobe.com/devnet/flashplayer/articles/alternative_content_03.html">установив плагин Flash</a>.</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;"><strong>Шаг 2: Подключение библиотеки SWFObject</strong></p>

<p style="text-align:justify;">Библиотека SWFObject состоит из одного внешнего JavaScript файла. Код SWFObject выполняется сразу после его загрузки, манипуляции с DOM выполняются после загрузки DOM, в браузерах которые это поддерживают, таких как IE, Firefox, Safari и Opera 9+ или по onload в остальных случаях:</p>

<pre class="code" style="text-align:justify;">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"&gt;
&lt;head&gt;
   &lt;title&gt;SWFObject - step 2&lt;/title&gt;
   &lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;

   &lt;script type="text/javascript" src="https://lily-software.com/swfobject.js"&gt;&lt;/script&gt;

&lt;/head&gt;
&lt;body&gt;
  &lt;div&gt;
   &lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420"&gt;
      &lt;param name="movie" value="myContent.swf" /&gt;
      &lt;!--[if !IE]&gt;--&gt;
      &lt;object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420"&gt;
      &lt;!--&lt;![endif]--&gt;
      &lt;p&gt;Alternative content&lt;/p&gt;
      &lt;!--[if !IE]&gt;--&gt;
      &lt;/object&gt;
      &lt;!--&lt;![endif]--&gt;
   &lt;/object&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;"><strong>Шаг 3: Зарегистрируйте ваш Flash контент в библиотеке SWFObject и настройте параметры</strong></p>

<p style="text-align:justify;">Для начала добавьте уникальный id внешнему элементу object определяющему Flash контент, потом нужно вызвать метод swfobject.registerObject со следующими аргументами:</p>

<p style="text-align:justify;">1. Первый аргумент (Строка, обязательный) id используемый в разметке.<br />
    2. Второй аргумент (Строка, обязательный) необходимая версия Flash плеера. Если установлена более старая версия Flash плеера, SWFObject принудительно отобразит альтернативный контент используя манипуляции DOM). Номер версии Flash плеера обычно содержит четыре элемента <strong>major.minor.release.build</strong>, SWFObject работает только с первыми 3 числами, поэтому и "WIN 9,0,18,0" (IE) и "Shockwave Flash 9 r18" (все остальные браузеры) будут преобразовано в "9.0.18". Если Вы хотите проверить только основной номер (<strong>major</strong>), то можно опустить <strong>minor </strong>и<strong> release</strong>. Например указать "<strong>9</strong>" вместо "<strong>9.0.0</strong>".<br />
    3. Третий аргумент (Строка, не обязательный) используется для активации <a href="https://lily-software.com/go.php?www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75">Adobe express install</a> и должен указывать на URL вашего express install SWF файла. Express install отображает стандартный диалог загрузки Flash плагина вместо Flash контента, если требуемая версия плагина не установлена. В архиве проекта уже есть готовый expressInstall.swf. Кроме того он содержит соответствующие expressInstall.fla и AS файлы (в директории SRC) на случай если вам нужно будет модифицировать имеющийся или создать свой express install. Обратите внимание, что express install срабатывает только один раз (при первом обращении), требует Flash плеер версии 6.0.65 или более старшей версии для Win или Mac платформ, минимально возможный размер SWF для его работы 310x137px.<br />
    4. Четвертый аргумент (функция JavaScript, не обязательный) используется для определения callback функции, вызываемой как в случае успешного, так и неуспешного внедрения SWF файла (см. <a href="http://code.google.com/p/swfobject/wiki/api">документацию по API</a>)</p>

<pre class="code" style="text-align:justify;">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"&gt;
  &lt;head&gt;
    &lt;title&gt;SWFObject - step 3&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;
    &lt;script type="text/javascript" src="https://lily-software.com/swfobject.js"&gt;&lt;/script&gt;
  
    &lt;script type="text/javascript"&gt;
    swfobject.registerObject("myId", "9.0.115", "expressInstall.swf");
    &lt;/script&gt;

&lt;/head&gt;
&lt;body&gt;
  &lt;div&gt;
    
    &lt;object id="myId" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420"&gt;
    
      &lt;param name="movie" value="myContent.swf" /&gt;
      &lt;!--[if !IE]&gt;--&gt;
      &lt;object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420"&gt;&lt;!--&lt;![endif]--&gt;    
      &lt;p&gt;Alternative content&lt;/p&gt;
      &lt;!--[if !IE]&gt;--&gt;
      &lt;/object&gt;
      &lt;!--&lt;![endif]--&gt;
    &lt;/object&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;"><strong>Советы</strong></p>

<ul><li style="text-align:justify;">Используйте <a href="https://lily-software.com/go.php?code.google.com/p/swfobject/wiki/generator">SWFObject HTML и JavaScript генератор</a> для автоматического создания кода</li>
    <li style="text-align:justify;">Чтобы вставить несколько SWF на одной странице просто повторите шаги 1 и 3</li>
    <li style="text-align:justify;">Простейший способ получать ссылку на активный элемент object — это использовать <a href="https://lily-software.com/go.php?code.google.com/p/swfobject/wiki/api">JavaScript API</a>: swfobject.getObjectById(objectIdStr)</li>
</ul><h3 style="text-align:justify;"> </h3>

<h3>Динамический метод публикации с помощью SWFObject</h3>

<p> </p>

<p style="text-align:justify;"><strong>Шаг 1: Создание альтернативного контента с помощью стандартной разметки</strong></p>

<p style="text-align:justify;">Динамический метод публикации использует современные средства и заменяет альтернативный HTML контент на Flash в случае если необходимая поддержка Flash и JavaScript. При использовании динамического метода публикации нужно создать HTML контейнер с альтернативным контентом и задать для него id:</p>

<pre class="code" style="text-align:justify;">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"&gt;
&lt;head&gt;
  &lt;title&gt;SWFObject dynamic embed - step 1&lt;/title&gt;
  &lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;
&lt;/head&gt;
&lt;body&gt;
  
  &lt;div id="myContent"&gt;
    &lt;p&gt;Alternative content&lt;/p&gt;
  &lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;"><strong>Шаг 2: Подключение библиотеки SWFObject</strong></p>

<p style="text-align:justify;">Библиотека SWFObject состоит из одного внешнего JavaScript файла. Код SWFObject выполняется сразу после его загрузки файла, манипуляции с DOM выполняются после загрузки DOM, в браузерах которые это поддерживают, таких как IE, Firefox, Safari и Opera 9+ или по onload в остальных случаях:</p>

<pre class="code" style="text-align:justify;">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"&gt;
&lt;head&gt;
  &lt;title&gt;SWFObject dynamic embed - step 2&lt;/title&gt;
  &lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;
	
  &lt;script type="text/javascript" src="https://lily-software.com/swfobject.js"&gt;&lt;/script&gt;

&lt;/head&gt;
&lt;body&gt;
  &lt;div id="myContent"&gt;
    &lt;p&gt;Alternative content&lt;/p&gt;
 &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;"><strong>Шаг 3: Внедрение SWF с помощью JavaScript</strong></p>

<p style="text-align:justify;">swfobject.embedSWF(swfUrl, id, width, height, version, expressInstallSwfurl, flashvars, params, attributes) у данного метода пять обязательных и пять опциональных параметра:</p>

<p style="text-align:justify;">1. swfUrl (Строка, обязательный) URL SWF файла<br />
    2. id (Строка, обязательный) id HTML элемента (содержащего альтернативный контент) который должен быть заменен на Flash.<br />
    3. width (Строка, обязательный) ширина SWF<br />
    4. height (Строка, обязательный) высота SWF<br />
    5. version (Строка, обязательный) версия Flash плеера необходимого для данного SWF (формат: "major.minor.release" или "major")<br />
    6. expressInstallSwfurl (Строка, не обязательный) задает URL вашего express install SWF и активирует <a href="https://lily-software.com/go.php?www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75">Adobe express install</a>. Обратите внимание, что express install срабатывает только один раз (при первом обращении), требует Flash плеер версии 6.0.65 или выше для Win или Mac платформ, минимально возможный размер SWF для его работы 310x137px.<br />
    7. flashvars (Строка, не обязательный) переменные передаваемые Flash в виде пар <strong>имя:значение</strong><br />
    8. params (Строка, не обязательный) элементы params вложенные в object в виде пар <strong>имя:значение</strong><br />
    9. attributes (Строка, не обязательный) атрибуты элемента object в виде пар <strong>имя:значение</strong><br />
    10. callbackFn (функция JavaScript, не обязательный) используется для определения callback функции, вызываемой как в случае успешного, так и неуспешного внедрения SWF файла (см. <a href="http://code.google.com/p/swfobject/wiki/api">документацию по API</a>)</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">Примечание: Вы можете опустить необязательные параметры, не изменяя порядок параметров. Если вы не хотите использовать опциональный параметр, но хотите использовать параметр следующий за ним, просто задайте для него значение false. Параметры flashvars, params и attributes являются объектами JavaScript, их можно пропустить не только вышеуказанным методом, но и передав пустой объект: {}.</p>

<pre class="code" style="text-align:justify;">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"&gt;
&lt;head&gt;
  &lt;title&gt;SWFObject dynamic embed - step 3&lt;/title&gt;
  &lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;
  &lt;script type="text/javascript" src="https://lily-software.com/swfobject.js"&gt;&lt;/script&gt;

  &lt;script type="text/javascript"&gt;
  swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0");
  &lt;/script&gt;

&lt;/head&gt;
&lt;body&gt;
  &lt;div id="myContent"&gt;
    &lt;p&gt;Alternative content&lt;/p&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;"><strong>Конфигурирование Flash контента</strong></p>

<p style="text-align:justify;">Вы можете использовать <a href="https://lily-software.com/go.php?www.w3schools.com/tags/tag_object.asp">опциональные атрибуты</a> элемента object:</p>

<ul><li style="text-align:justify;">id (Если id не определен элемент object автоматически наследует id контейнера с альтернативным контентом)</li>
    <li style="text-align:justify;">name</li>
    <li style="text-align:justify;">styleclass (используется вместо class, поскольку это зарезервированное ключевое слово в ECMA4)</li>
    <li style="text-align:justify;">align</li>
</ul><p style="text-align:justify;">Вы можете использовать специфичные для Flash элементы param (<a href="https://lily-software.com/go.php?www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_12701">подробнее</a>):</p>

<ul><li style="text-align:justify;">play</li>
    <li style="text-align:justify;">loop</li>
    <li style="text-align:justify;">menu</li>
    <li style="text-align:justify;">quality</li>
    <li style="text-align:justify;">scale</li>
    <li style="text-align:justify;">salign</li>
    <li style="text-align:justify;">wmode</li>
    <li style="text-align:justify;">bgcolor</li>
    <li style="text-align:justify;">base</li>
    <li style="text-align:justify;">swliveconnect</li>
    <li style="text-align:justify;">flashvars</li>
    <li style="text-align:justify;">devicefont (<a href="https://lily-software.com/go.php?www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_13331">подробнее</a>)</li>
    <li style="text-align:justify;">allowscriptaccess (<a href="https://lily-software.com/go.php?www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_16494">подробнее</a> и <a href="https://lily-software.com/go.php?www.adobe.com/go/kb402975">тут</a> )</li>
    <li style="text-align:justify;">seamlesstabbing (<a href="https://lily-software.com/go.php?www.adobe.com/support/documentation/en/flashplayer/7/releasenotes.html">подробнее</a>)</li>
    <li style="text-align:justify;">allowfullscreen (<a href="https://lily-software.com/go.php?www.adobe.com/devnet/flashplayer/articles/full_screen_mode.html">подробнее</a>)</li>
    <li style="text-align:justify;">allownetworking (<a href="https://lily-software.com/go.php?livedocs.adobe.com/flash/9.0/main/00001079.html">подробнее</a>)</li>
</ul><p style="text-align:justify;"><strong>Как используя объекты JavaScript установить переменные, параметры и атрибуты?</strong></p>

<pre style="text-align:justify;">
Лучше всего  создавать объекты JavaScript используя объектный литерал, например:
</pre>

<pre class="code" style="text-align:justify;">
&lt;script type="text/javascript"&gt;
  
  var flashvars = {};
  var params = {};
  var attributes = {};
  
  swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
&lt;/script&gt;</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">Пары <strong>имя:значение</strong> можно добавить при создании объекта (примечание: не ставьте запятую после последней пары имя:значение):</p>

<pre class="code" style="text-align:justify;">
&lt;script type="text/javascript"&gt;

  var flashvars = {
    name1: "hello",
    name2: "world",
    name3: "foobar"
  };
  var params = {
    menu: "false"
  };
  var attributes = {
    id: "myDynamicContent",
    name: "myDynamicContent"
  };
  
  swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
&lt;/script&gt;</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">Или можете добавить свойства и их значения после создания объектов, используя точечную нотацию:</p>

<pre class="code" style="text-align:justify;">
&lt;script type="text/javascript"&gt;
   
   var flashvars = {};
   flashvars.name1 = "hello";
   flashvars.name2 = "world";
   flashvars.name3 = "foobar";
   
   var params = {};
   params.menu = "false";
   
   var attributes = {};
   attributes.id = "myDynamicContent";
   attributes.name = "myDynamicContent";
  
   swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
&lt;/script&gt;
</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">То же самое можно записать так: (самый трудночитаемый но короткий вариант. Для любителей писать код в одну строку)</p>

<pre class="code" style="text-align:justify;">
&lt;script type="text/javascript"&gt;
  swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf", {name1:"hello",name2:"world",name3:"foobar"},  {menu:"false"}, {id:"myDynamicContent",name:"myDynamicContent"});
&lt;/script&gt;</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">Если вы не хотите использовать необязательный аргумент можно передать false или пустой объект (Примечание: начиная с <strong>SWFObject 2.1</strong> можно использовать также и <strong>null</strong> или <strong>0</strong>):</p>

<pre class="code" style="text-align:justify;">
&lt;script type="text/javascript"&gt;

  var flashvars = false;
  var params = {};
  var attributes = {
    id: "myDynamicContent",
    name: "myDynamicContent"
  };
  
 swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
&lt;/script&gt;</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">Объект flashvars предназначен для упрощения работы с переменными передаваемыми в Flash при желании вы можете игнорировать его и передавать flashvars через объект params:</p>

<pre class="code">
&lt;script type="text/javascript"&gt;

  var flashvars = false;
  var params = {
    menu: "false",
    flashvars: "name1=hello&amp;name2=world&amp;name3=foobar"
  };
  var attributes = {
    id: "myDynamicContent",
    name: "myDynamicContent"
  };
  
  swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);
&lt;/script&gt;</pre>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;"><strong>Советы</strong></p>

<ul><li style="text-align:justify;">Используйте <a href="https://lily-software.com/go.php?code.google.com/p/swfobject/wiki/generator">SWFObject HTML и JavaScript генератор</a> для автоматического создания кода</li>
    <li style="text-align:justify;">Чтобы вставить несколько SWF просто повторите шаги 1 и 3</li>
</ul><h3 style="text-align:justify;"> </h3>

<h3 style="text-align:justify;">Переход c SWFObject 1.5 к SWFObject 2</h3>

<p style="text-align:justify;">1. В SWFObject 2 НЕТ обратной совместимости с SWFObject 1.5<br />
    2. Предпочтительно чтобы весь код JavaScript был в разделе head вашей HTML страницы. Добавление скриптов в тело страницы может вызвать нежелательные визуальные эффекты (например, заметная для пользователя замена альтернативного контента на флеш), поскольку в этом случае код JavaScript выполняется на более позднем этапе.<br />
    3. Имя библиотеки теперь в нижнем регистре: swfobject вместо SWFObject<br />
    4. Методы доступны только через библиотеку (вместо экземпляра SWFObject в SWFObject 1.5)<br />
    5. <a href="https://lily-software.com/go.php?code.google.com/p/swfobject/wiki/api">JavaScript API</a> абсолютно новое и более сложное.<br />
    6. SWFObject 2 заменяет указанный HTML блок с альтернативным контентом полностью, включая элемент контейнер, в случае если есть необходимая поддержка Flash и JavaScript, тогда как SWFObject 1.5 заменяет только содержимое указанoго контейнера. Если вы явно не указали атрибут id, элемент object автоматически наследует id указанного HTML контейнера с альтернативным контентом.</p>

<h3 style="text-align:justify;"> </h3>

<h3 style="text-align:justify;">Переход от UFO к SWFObject 2</h3>

<p style="text-align:justify;">1. SWFObject 2 заменяет указанный HTML блок с альтернативным контентом полностью, включая элемент контейнер, в случае если есть необходимая поддержка Flash и JavaScript, тогда как UFO заменяет только содержимое указанoго контейнера. Если вы явно не указали атрибут id, элемент object автоматически наследует id указанного HTML контейнера с альтернативным контентом.<br />
    2. setcontainercss отсутствует в SWFObject 2, похожий функционал обеспечивает <a href="https://lily-software.com/go.php?code.google.com/p/swfobject/downloads/list">SWFObject JavaScript API</a>: swfobject.createCSS(selStr, declStr).</p>

<h3 style="text-align:justify;"> </h3>

<h3 style="text-align:justify;">Поддерживает ли SWFObject 2 MIME тип application/xhtml+xml?</h3>

<p style="text-align:justify;">SWFObject 2 НЕ поддерживает XML MIME типы, это сознательное решение.</p>

<p style="text-align:justify;">На то есть несколько причин:</p>

<ul><li style="text-align:justify;">их использует очень малая часть веб-разработчиков</li>
    <li style="text-align:justify;">Разработчики SWFObject не уверены, что веб пойдет этим путем. Internet Explorer его не поддерживает и все остальные основные производители браузеров больше склоняются к новому стандарту парсинга HTML (в HTML 5), отходя от парсинга HTML как XML, каким его сейчас видит W3C.</li>
    <li style="text-align:justify;">отказавшись от поддержки XML MIME типов разработчики уменьшили размер файла и упростили тестирование и поддержку</li>
</ul><h3 style="text-align:justify;">Учебники (для начинающих):</h3>

<ul><li style="text-align:justify;"><a href="https://lily-software.com/go.php?www.adobe.com/devnet/flashplayer/articles/swfobject.html">Определение версии Flash плеера и внедрение SWF файлов при помощи SWFObject 2</a></li>
    <li style="text-align:justify;"><a href="https://lily-software.com/go.php?www.adobe.com/devnet/flashplayer/articles/alternative_content.html">Использование альтернативного контента для SWF файлов </a></li>
    <li style="text-align:justify;"><a href="https://lily-software.com/go.php?www.gotoandlearn.com/play?id=77">Внедрение Flash при помощи SWFObject 2.0</a> (видео учебник) by Lee Brimelow</li>
</ul><p style="text-align:right;"> </p>

<p style="text-align:right;"><em>Оригинал статьи: <a href="https://lily-software.com/go.php?code.google.com/p/swfobject/wiki/documentation">http://code.google.com/p/swfobject/wiki/documentation</a></em></p>
]]></description>
			<pubDate>Wed, 26 Jan 2011 01:02:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/vnedrenie-flash-pri-pomoshhi-swfobject-2]]></link>
		</item>
		<item>
			<title>Условные комментарии для Internet Explorer</title>
			<description><![CDATA[<p style="text-align:justify;">Каждый верстальщик, пишущий html-css под несколько браузеров, сталкивается с тем, что в браузере Internet Explorer что-то работает не так, как в других популярных браузерах (Opera, Mozilla Firefox). Более того, часто бывает и такое, что ваш код неодинаково воспринимается версиями 6, 7 и 8. Из-за этого приходится заново верстать некоторые элементы страницы или же отказываться от использования некоторых приемов.</p>

<p style="text-align:justify;">Для решения этой проблемы и написания специальных инструкций, которые будут работать только в Internet Explorer (не ниже 5-ой версии) можно использовать т.н. Условные комментарии.</p>

<p> </p>

<p>Условный комментарий выглядит следующим образом:</p>

<p class="code">&lt;!­­--[if IE]&gt; Специальные инструкции для IE здесь. &lt;![endif]--&gt;</p>

<p> </p>

<p style="text-align:justify;">Структура похожа на обычный комментарий в HTML, поэтому остальные браузеры будут воспринимать его как обычный комментарий. Explorer распознаёт специальный синтаксис &lt;!--[if IE]&gt;, решает условие if и парсит содержимое условного комментария так, как если бы это было содержание нормальной страницы. Условные комментарии используют синтаксис HTML комментариев, поэтому они могут быть включены только в HTML страницу. Удобно бывает сделать отдельные стили для IE и вставить тег link в условный комментарий.</p>

<p> </p>

<p>Ниже написаны несколько условных комментариев, которые показывают версию Internet Explorer, которую вы используете.</p>

<p class="code">&lt;!--[if IE]&gt; Инструкции для Internet Explorer &lt;![endif]--&gt;<br />
&lt;!--[if IE 5]&gt; Инструкции для IE 5 &lt;![endif]--&gt;<br />
&lt;!--[if IE 5.0]&gt; Инструкции для IE 5.0 &lt;![endif]--&gt;<br />
&lt;!--[if IE 5.5]&gt; Инструкции для IE 5.5 &lt;![endif]--&gt;<br />
&lt;!--[if IE 6]&gt; Инструкции для IE 6 &lt;![endif]--&gt;<br />
&lt;!--[if IE 7]&gt; Инструкции для IE 7 &lt;![endif]--&gt;</p>

<p> </p>

<p style="text-align:justify;">В условных комментариях можно использовать операторы, с помощью которых можно задать более комплексное условие. В таблице ниже приведены все операторы.</p>

<table border="1" class="cells" width="90%"><tbody><tr><td align="center" class="coltop">Оператор</td>
			<td align="center" class="coltop">Описание</td>
		</tr><tr><td align="center">lt</td>
			<td>меньше чем</td>
		</tr><tr><td align="center">lte</td>
			<td>меньше или равно</td>
		</tr><tr><td align="center">gt</td>
			<td>больше чем</td>
		</tr><tr><td align="center">gte</td>
			<td>больше или равно</td>
		</tr></tbody></table><p> </p>

<p>Вот несколько примеров:</p>

<p class="code">&lt;!--[if ! IE 5]&gt; Инструкции для IE 5.5, 6 или 7 &lt;![endif]--&gt;<br />
&lt;!--[if gt IE 5.0]&gt; Инструкции для IE 5.5, 6 или 7 &lt;![endif]--&gt;<br />
&lt;!--[if lte IE 5.5]&gt; Инструкции для IE 5.0 или 5.5 &lt;![endif]--&gt;<br />
&lt;!--[if gte IE 6]&gt; Инструкции для IE 6 или 7 &lt;![endif]--&gt;<br />
&lt;!--[if lt IE 7]&gt; Инструкции для IE 5.0, 5.5 или 6 &lt;![endif]--&gt;</p>
]]></description>
			<pubDate>Tue, 21 Dec 2010 22:55:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/uslovnye-kommentarii-dlya-internet-explorer]]></link>
		</item>
		<item>
			<title>О создании «Простых сайтов»</title>
			<description><![CDATA[<p style="text-align:justify;">Зачастую при поиске разработчика потенциальные заказчики говорят, что им нужен совсем простой и дешёвый сайт. Как показывает опыт, в большинстве случаев, на самом деле их интересуют сайты настолько сложные, что разрабатывать их можно месяцами.</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">Случается, что задания звучат и так:</p>

<p style="text-align:justify;">- Нам нужен очень простой сайт-визитка с каталогом товаров (фирм или недвижимости), с возможностью поиска сравнения и подбора объектов из базы.<br />
- В интернете заявки на создание сайтов чаще всего выглядят так: Нужно сделать простенький сайт. Ваши цены и сроки? Предпочтение будет отдано наиболее не дорогому предложению.<br />
- Нужен несложный сайт для кадрового агентства с поиском соискателей и работодателей. Сайт должен быть похож по функционалу на Job.ru или HeadHunter. С небольшими отличиями.<br />
- Можете разработать для нас недорогой сайт примерно как www.yandex.ru, с поиском, почтой, социальной сетью и конструктором сайтов. Другие сервисы не нужны.</p>

<p style="text-align:justify;">Да, не поверите, но примерно так звучат задания на разработку «простых» сайтов, объем работы по созданию которых сразу и оценить - то сложно.</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">Иногда же изначальные задания на сайты бывают действительно несложными. Но, аппетит приходит во время еды! И запросы заказчиков начинают расти по мере разработки сайта — появляются всё новые и новые требования и пожелания, которые нужно реализовать. Хорошо, если клиент хотя бы понимает, что любое увеличение объёмов работ сопровождается соответствующими изменениями в сроках разработки и величине бюджета.</p>

<p style="text-align:justify;">Тут же напрашивается вопрос: «Уважаемые заказчики! По каким же характеристикам Вы определяете сложность разработки будущего сайта и его стоимость?»</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">Полистайте наше портфолио — все представленные сайты выглядят по разному и решают чётко поставленные перед ними задачи. Такие сайты не делаются за один день!</p>

<p style="text-align:justify;">Разработка сайта — это достаточно сложный творческий и технологический процесс, а не конвейерное производство! Даже, на первый взгляд, простой сайт-визитка может разрабатываться месяцами при определённых требованиях, предъявляемых к дизайну и наполнению.</p>

<p style="text-align:justify;">Согласитесь, что каждый из нас должен заниматься своим делом. Просто расскажите, зачем Вам нужен сайт? Какие задачи он должен решать? Что Вы хотите от него получить и т. п.? Разработчики сами определят реальную сложность сайта, сроки и затраты на его разработку, укажут Вам на возможные ошибки и предложат подходящее решение.</p>
]]></description>
			<pubDate>Mon, 20 Dec 2010 19:48:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/o-sozdanii-prostyx-sajtov]]></link>
		</item>
		<item>
			<title>Проблема с z-index в IE 6-7</title>
			<description><![CDATA[<p style="text-align:justify;">
	Известно, что согласно спецификации <a href="https://lily-software.com/go.php?www.w3.org/TR/CSS21/visuren.html#z-index">CSS 2.1</a> каждый позиционируемый блок имеет значение z-index (по умолчанию z-index: auto, что эквивалентно z-index: 0). Чем больше это значение, тем выше элемент по z-оси. При равных значениях z-index, будет показан тот элемент, который по HTML коду ниже. В Internet Explorer версий 6-7 элементы, находящиеся в блоках с position: absolute/relative, не воспринимают z-index. IE6-7 и их Mac версии это правило просто игнорируют:</p>
<p style="margin-left:40px;text-align:justify;">
	* z-index элемента зависит от z-index родителя (и не может быть больше значения родителя в общем потоке);<br />
	* z-index с заданным числом может перекрываться z-index: auto.</p>
<p style="text-align:justify;">
	Например, возьмем 2 блока, идущих друг за другом с position:relative — header и content. В header у нас есть выпадающее меню(menu), которое позиционируется с помошью position:absolute; , и частично перекрывает блок content. Присваиваем menu z-index:1000 (чтобы явно было больше, чем у других блоков) — menu должно быть поверх блока content.</p>
<p>
	 </p>
<p>
	Код HTML:</p>
<p class="code">
	&lt;div class="header"&gt;&lt;div class="menu"&gt;&lt;/div&gt;&lt;/div&gt;<br />
	&lt;div class="content"&gt;&lt;div&gt;</p>
<p>
	Соответствующий код CSS:</p>
<p class="code">
	.headaer {<br />
	    [...]<br />
	    position: relative;<br />
	}<br />
	.menu {<br />
	    [...]<br />
	    position: absolute;<br />
	    z-index: 1000;<br />
	}<br />
	.content {<br />
	    [...]<br />
	    position: relative;<br />
	}</p>
<p>
	 </p>
<p style="text-align:justify;">
	Для того, чтобы меню «выпадало» требуется еще и соответствующий JavaScript, управляющий меню. Будем считать, что он у нас уже есть.</p>
<p>
	 </p>
<p>
	<strong>Результат:</strong></p>
<p>
	 </p>
<p style="text-align:justify;">
	В данном примере в браузерах IE6 и IE7 блок menu не перекрывает блока контента, так как IE принимает во внимание z-index родителей, при чём z-index родителя важнее, чем у данного элемента.</p>
<p>
	В IE меню не перекрыло контент - z-index проигнорирован:</p>
<p>
	<img alt="В IE меню не перекрыло контент - z-index проигнорирован" height="275" src="https://lily-software.com/User_Files/a-n_Files/image/illustratcii/web/z-index-ie.png" width="410" /></p>
<p>
	 </p>
<p>
	В Opera, FireFox с z-index все нормально</p>
<p>
	<img alt="В IE меню не перекрыло контент - z-index проигнорирован" height="275" src="https://lily-software.com/User_Files/a-n_Files/image/illustratcii/web/z-index-ff.png" width="410" /></p>
<p>
	 </p>
<p>
	<strong>Решение:</strong></p>
<p>
	 </p>
<p style="text-align:justify;">
	Явно задаем z-index родителям. При чем z-index родителя, в котором будет всплывающий элемент, должен быть больше, блока, который будет перекрываться:</p>
<p>
	<img alt="Выпадающее меню отображается нормально" height="275" src="https://lily-software.com/User_Files/a-n_Files/image/illustratcii/web/z-index-good.png" width="410" /></p>
<p>
	 </p>
<p>
	Для menu можно и не задавать z-index, но для уверенности все же можно указать.</p>
<p>
	 </p>
<p>
	CSS код:</p>
<p class="code">
	.headaer{<br />
	    [...]<br />
	    position: relative;<br />
	    z-index: 2;<br />
	}<br />
	.menu{<br />
	    [...]<br />
	    position: absolute;<br />
	    z-index: 3;<br />
	}<br />
	.content {<br />
	    [...]<br />
	    position: relative;<br />
	    z-index: 1;<br />
	}</p>
<p>
	 </p>
<p style="text-align:justify;">
	А теперь рассморим ситуацию, когда идет ряд блок друг за другом и в каждом есть появляющийся блок, например в строки таблицы. Придется учитывать чтобы у каждого последующего блока z-слой был ниже, чем у предыдущего:</p>
<p>
	<img alt="" height="275" src="https://lily-software.com/User_Files/a-n_Files/image/illustratcii/web/z-index-lot-blocks.png" width="410" /></p>
<p>
	 </p>
<p style="text-align:justify;">
	Вручную не всегда удастся задать z-index, особенно в тех случаях, когда на перед неизвестно сколько будет блоков. В тах случаях можно использвать javascript.</p>
<p>
	 </p>
<p>
	Ниже пример подобного решения с применением jQuery:</p>
<p class="code">
	$(function() {<br />
	    var zIndexNumber = 1000;<br />
	    $('div').each(function() {<br />
	        $(this).css('zIndex', zIndexNumber);<br />
	        zIndexNumber -= 10;<br />
	    });<br />
	});</p>
<p>
	 </p>
<p>
	Существует и <strong>вариант решения без jQuery</strong>:</p>
<p>
	 </p>
<p>
	Все нормальные браузеры расставят слои и так нормально, а для Internet Explorer можно использовать такой expression:</p>
<p>
	 </p>
<p>
	CSS код:</p>
<p class="code">
	div{<br />
	    behavior:expression(onmouseover=function(){this.className +=" zindex"},onmouseout=function()     this.className=this.className.replace("zindex","")},style.behavior=null);}<br />
	.zindex {<br />
	    z-index:1000;<br />
	}</p>
<p style="text-align:justify;">
	Смысл его в том, что родителю, на который навели мышью, присваиваем z-index больше, чем у остальных блоков. У этого способа есть плюс - не нужно подключать библиотеки или внешние js-файлы.</p>
<p style="text-align:justify;">
	 </p>
]]></description>
			<pubDate>Thu, 11 Nov 2010 12:39:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/problema-s-z-index-v-ie-6-7]]></link>
		</item>
		<item>
			<title>CSS свойство «min-height» в IE6</title>
			<description><![CDATA[<p style="text-align:justify;">Во время верстки очередного сайта снова столкнулся со старой проблемой. <strong>Internet Explorer</strong> v.6 (когда же им перестанут пользоваться?) не поддерживает CSS свойство <strong>«min-height»</strong>. Начиная с <strong>IE 7</strong> beta 2 включили поддержку браузером свойств <em>min-height, min-width, max-height, max-width.</em></p>

<p style="text-align:justify;">К счастью у этой проблемы есть (как и у <a href="https://lily-software.com/articles/jquery_ie6_png_fix">проблемы с прозрачностью PNG</a>) есть очень элегантное и простое решение:</p>

<p>CSS-код:</p>

<p class="code">#element {<br />
    min-height:400px;<br />
    height:auto !important;           /* значение для других браузеров */<br />
    height:400px;                        /* значение для IE6 и ниже */<br />
}</p>

<p> </p>

<p>Принцип действия такой:</p>

<p style="text-align:justify;"><strong>Internet Explorer 5 и 6</strong> игнорируют декларацию «<strong>!important</strong>», если одно и тоже свойство объявлено в правиле дважды. А другие браузеры нет. А поведение свойства «height» в IE 6 сходно со свойством «min-height».</p>
]]></description>
			<pubDate>Wed, 15 Sep 2010 16:14:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/css-svojstvo-min-height-v-ie6]]></link>
		</item>
		<item>
			<title>Использование PHP в CSS файлах</title>
			<description><![CDATA[<p style="text-align:justify;">Как многие из Вас уже наверное знают, CSS3 обещает нам такие возможности как <strong>CSS переменные</strong>. Но это чудо это светит нам к сожалению совсем не в ближайшем будущем. Однако в этой ситуации выход есть. В файлах каскадные таблиц стилей (CSS) Вы можете использовать PHP код. Эта возможность дает Web-мастеру нечто большее, чем использование CSS переменных. Все довольно легко и просто.</p>

<p> </p>

<h3>Style.php</h3>

<p> </p>

<p>Вместо привычного нам файла с расширением .CSS, мы подключим к страничке php-файл:</p>

<p class="code">&lt;link rel='stylesheet' type='text/css' href='https://lily-software.com/css/style.php' /&gt;</p>

<p>Тип документа</p>

<p>В самом начале файла style.php необходимо указать, что на выходе нам все-таки нужен файл стилей, т.е. указываем тип документа:</p>

<p class="code">&lt;?php<br />
      header("Content-type: text/css; charset: UTF-8");<br />
    ?&gt;</p>

<p> </p>

<h3>Установка переменных</h3>

<p> </p>

<p>Теперь установим значения для нескольких переменных, например такие:</p>

<p class="code">&lt;?php<br />
      header("Content-type: text/css; charset: UTF-8");<br /><br />
      $brandColor = "#990000";<br />
      $linkColor = "#555555";<br />
      $CDNURL = "http://cdn.blahblah.net"<br />
    ?&gt;</p>

<p> </p>

<h3>Использование переменных</h3>

<p> </p>

<p>Достаточно просто вывести обозначенные переменные в необходимых местах стилей:</p>

<p class="code">#header {<br />
      background: url("&lt;?php echo $CDNURL; ?&gt;/images/header-bg.png") no-repeat;<br />
    }<br /><br />
    a<br />
      color: &lt;?php echo $linkColor; ?&gt;;<br />
    }<br />
    ...<br />
      ul#main-nav li a {<br />
      color: &lt;?php echo $linkColor; ?&gt;;<br />
    }</p>

<p> </p>

<h3>Другие идеи использования CSS файла сгенерированного с помощью PHP</h3>

<p> </p>

<p style="text-align:justify;">1. Сжатие CSS файла с помощью PHP<br />
    2. Теоретически, вы даже можете использовать информацию о User-agent для вывода стилей под конкретный браузер.<br />
    3. В зависимости от сезона года, вы можете менять стили, используя информацию о текущей дате.<br />
    4. Генерировать различные цвета, устанавливать фон случайным образом, и в конце-концов, просто тестировать.<br />
    5. Использовать функции и любые другие возможности PHP для формирования стилевых таблиц.</p>

<p> </p>

<h3>Не работает?</h3>

<p> </p>

<p style="text-align:justify;">В некоторых случаях (например для реализации нашей идеи в Wordpress), вам возможно потребуется прописать следующие строчки в файле <strong>.htaccess</strong> (только для Apache):</p>

<p class="code">&lt;FilesMatch "^.*?style.*?$"&gt;<br />
        SetHandler php5-script<br />
    &lt;/FilesMatch&gt;</p>

<p>При этом файл стилей оставляем с расширением <strong>.css</strong>, а <strong>.htaccess</strong> кладем в туже папку, где и стили.</p>

<p> </p>

<p> </p>

<p><a href="https://lily-software.com/go.php?css-tricks.com/css-variables-with-php">Оригинал статьи... </a></p>

<p> </p>

<p><a href="https://lily-software.com/forums">Обсудить на форуме...</a></p>
]]></description>
			<pubDate>Sat, 11 Sep 2010 21:04:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/ispolzovanie-php-v-css-fajlax]]></link>
		</item>
		<item>
			<title>Переезд с Joomla! 1.0.x с Virtuemart на Joomla! 1.5.x</title>
			<description><![CDATA[<p style="text-align:justify;">
	Статья будет полезна скорее специалистам, Web-мастерам. Если Вы владелец интернет магазина на базе Joomla 1.0.x и хотите перейти на Joomla 1.5.x, но не обладаете соответствующими навыками, я рекомендую Вам обратиться к специалисту во избежание возможной потери данных.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	Итак, у нас есть интернет магазин <strong>VirtueMart, установленный на Joomla 1.0.x. Пришла пора <span style="color:#ff0000;">обновиться</span></strong>.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	Обычно я это делаю на локальной машине, а не на действующем сайте. Так что будем считать, что все происходит на "Денвере". Скачаем и установим на него наш сайт на Joomla 1.0.x и приступим к переходу:</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	1) Не удаляем с сервера только что скачаный и установленный сайт на Joomla 1.0.x, пока....</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	2) Для корректного перехода у Вас на Joomla 1.0.х должен стоять интернет магазин <strong>VirtueMart 1.1.5</strong>. По-этому, если необходимо, обновляем сначала VirtueMart.<br />
	Это просто. Скачиваем с сайта <a href="https://lily-software.com/go.php?virtuemart.net">virtuemart.net</a> последнюю версию для Joomla 1.0.x и содержимое архива распаковываем в наш сайт с заменой файлов. Входим в панель управления магазином и видим сообщение:<br />
	 Welcome to VirtueMart 1.1.5 stable!. Нажимаем кнопку "<strong>UPDATE FROM VERSION 1.0.x &gt;&gt;</strong>". Тем самым мы обновим базу данных до последней версии.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	3) Для перехода нам понадобится выгрузить дамп БД.<br />
	 Для этих целей скачиваем последнюю версию <a href="https://lily-software.com/go.php?extensions.joomla.org/extensions/migration-&amp;-conversion/joomla-migration/4223/details">Joomla Migrator</a> <br />
	И устанавливаем его через установщик компонентов.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	4) Понадобятся некоторые Virtuemart-плагины для Migrator'а. <strong>Virtuemart ETL Plugins</strong> <a href="https://lily-software.com/go.php?extensions.joomla.org/extensions/migration-a-conversion/migrator-extensions/7415">скачиваем отсюда</a><br />
	Устанавливаем его на Migrator в панели администратора: <strong>Компоненты &gt; Migrator</strong>, выбираем "<strong>add 3rd party Migrators</strong>" внизу экрана. Хотя у меня не вышло.<br />
	 Я просто распаковал архив в папку "<strong>administrator/components/com_migrator/plugins</strong>".</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	5) Вернемся в панель управления <strong>"Компоненты &gt; Migrato"</strong>, и затем <strong>"list plugins"</strong> внизу страницы. Убедимся, что VirtuMart там присутствует.<br />
	Если все ОК, возврящаемся назад и жмем "<strong>Create Migration SQL File</strong>" внизу страницы.<br />
	Увидим снова список плагинов используя которые будет создан SQL дамп. Внизу страницы кликнем по ссылке <strong>"Start Migration &gt;&gt;"</strong><br />
	По окончании процесса видим сообщение <strong>"MIGRATION COMPLETE"</strong>. Не стоит обольщаться. Наша миграция на Joomla 1.5.x еще далека от завершения, но теперь у нас есть дамп базы данных. Скачаем его кликнув по <strong>"Download"</strong>.</p>
<p style="text-align:justify;">
	6) Выходим из Joomla 1.0.x. Нам тут больше делать нечего.</p>
<p style="text-align:justify;">
	 </p>
<h3 style="text-align:center;">
	Теперь сам переход на Joomla 1.5.x</h3>
<p>
	 </p>
<p style="text-align:justify;">
	1) <a href="https://lily-software.com/go.php?www.joomla.org/download.html">Скачиваем последнюю версию отсюда</a><br />
	Нас интересует <strong>full package</strong>, не upgrade.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	2) Создадим на "Денвере" новый сайт, распакуем в него свежескаченный архив. Перезапустим Денвер. <span style="color:#ff0000;"><strong>Не пытайтесь перезаписать старый сайт с Joomla 1.0.x!</strong></span>. И для нового сайта создадим новую базу данных.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	3) Переходим в браузере на вновь созданный сайт, запустится установщик Joomla!</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	4) Когда дойдем до шага установки, где требуется <strong>ввести имя сайта</strong>.<br />
	Прокручиваем вниз и выбираем "<strong>Загрузить скрипт миграции</strong>". Указываем перфикс таблиц старого сайта. Обычно это "<strong>jos_</strong>" (без кавычек). <strong>Правильно ставим кодировку старого сайта</strong>. Для кирилицы это "<strong>windows-1251</strong>". Укзазываем скрипт, полученный "Мигратором" от joomla 1.0. Ставим галочку "<strong>Это скрипт миграции с Joomla! 1.0</strong> ". Нажимаем "<strong>Загрузить и выполнить</strong>".</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	Если все ОК, то видим сообщение "<strong>Миграция успешно завершена, нажмите Далее для продолжения</strong>". Жмем далее.<br />
	По новой просит ввести название сайта, e-mail и пароль. Не отказываем. Вводим необходимую информацию.</p>
<p style="text-align:justify;">
	На этой стадии Вы уже можете зайти на сайт или в панель администратора нового сайт. Не пугайтесь, если что-то не так. Скин будет установлен по-умолчанию.</p>
<p style="text-align:justify;">
	Загруженный дамп базы данных перенес весь контент со старого сайта на новый.<br />
	Теперь нам нужно установить VirtueMart.</p>
<p style="text-align:justify;">
	Предстоящий процесс установки несколько спецефичный.</p>
<p style="text-align:justify;">
	 </p>
<h3 style="text-align:center;">
	Итак, VirtueMart</h3>
<p>
	 </p>
<p style="text-align:justify;">
	1) Скачиваем VirtueMart Complete Package for Joomla! 1.5 <a href="https://lily-software.com/go.php?virtuemart.net/index.php?option=com_content&amp;task=view&amp;id=54&amp;Itemid=147">отсюда</a><br />
	Распаковываем архив на жесткий диск.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	2) Устанавливаем файл <strong>com_virtuemart_1.1.5.j15.zip</strong> при помощи установщика Joomla.<br />
	После окончания первого шага <span style="color:#ff0000;"><strong>НЕ устанавливаем демонстрационные данные</strong></span>, иначе данные, полученные при миграции будут стерты. Жмем "<strong>Go directly to the Shop &gt;&gt;</strong>".<br />
	 Оказавшись в Административной части магазина кликаем <strong>Admin &gt; Configuration</strong>, потом <strong>Save</strong>.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	3) Следующий шаг может показаться сложноватым. По какой-то причине мне так и не удалось получить через Migrator все данные старого Virtuemart'a: товары, цены, пользователей и т.д. Чтобы перенести все данные создадим еще один дамп.<br />
	Для этого используем <strong>phpMyAdmin</strong>.</p>
<p style="text-align:justify;">
	В phpMyAdmin выберем базу данных старого сайта. Выберем <strong>"Экспорт"</strong>.<br />
	Выберем все таблицы, которые начинаются с <strong>"jos_vm_"</strong> кликая по ним удерживая клавишу <strong>CTRL.</strong> Их будет примерно половина от общего количества таблиц. После того, как выбрали все необходимые таблицы, нежно убедиться, что в перечне ниже выбрано <strong>SQL</strong>. Также справа в разделе "<strong>Структура</strong>" нужно отметить "<strong>Добавить DROP TABLE / VIEW / PROCEDURE / FUNCTION</strong>" и нажать <strong>ОК</strong> в правом нижнем углу.</p>
<p style="text-align:justify;">
	На следующей странице получите Ваш SQL запрос.Скопируйте его в блокнот. В нем нужно везде, где создается таблица заменить <strong>CHARSET=cp1251</strong> на <strong>CHARSET=utf8</strong>.</p>
<p style="text-align:justify;">
	Теперь выберете базу данных нового сайта. В верхнем меню выберем <strong>SQL</strong>. В полученном окне в текстовую область вставим полученный SQL-запрос и жмем ОК.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	4) Закрываем phpMyAdmin. Теперь все данные со старого VirtueMart перенесены в новый.</p>
<p style="text-align:justify;">
	Почти все готово...</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	5) Вернемся в панель управления сайтом. Нужно установить некоторые составляющие <strong>VirtueMart Complete package</strong>, распакованные нами ранее из скачаного архива.<br />
	В панели управления выберем <strong>Extensions &gt; Install/Uninstall. (расширения &gt; Установить/Удалить)</strong>.<br />
	Устанавливаем файл <strong>mod_virtuemart_1.1.3.j15.zip</strong> из папки "<strong>modules</strong>".<br />
	Установите другие необходимые модули и плагины.<br />
	Можно установить русскую локализацию для Joomla.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	6) Включите необходимые модули и плагины.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	7) Переносим изображения товаров, категорий и т.п.<br />
	Скопируем папку: <strong>components/com_virtuemart/shop_image/product</strong> на новый сайт заменяя существующие файлы.</p>
<p style="text-align:justify;">
	 </p>
<h3 style="text-align:center;">
	Готово!!!</h3>
<p style="text-align:justify;">
	Если все сделано верно, то магазин работает.<br />
	Осталось сконвертировать скин, настроить модули.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	Когда все сделано, можете удалять Ваш старый сайт на Joomla 1.0.x, а новый переносить на сервер.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	Если эта статья помогла хоть 1 человеку. Значит я не зря потратил время :)</p>
]]></description>
			<pubDate>Fri, 23 Jul 2010 07:49:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/migrate_to_joomla_1_5_bringing_virtuemart_too]]></link>
		</item>
		<item>
			<title>IE6 Png Fix с помощью jQuery</title>
			<description><![CDATA[<p style="text-align:justify;">
	Internet Explorer 6-ой версии (лучший Web-браузер 2000 года <img alt=":)" src="https://lily-software.com/images/smilies/smile.gif" title=":)" /> ) входит в состав WindowsXP вплоть до SP3 (возможно и в SP4 ничего не изменится), а это значит что <strong>он установлен у большого количества пользователей</strong>. А они потециальные посетители Вашего сайта.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	Как известно, один из главных недостатков этого браузера - он не умеет отображать прозрачность PNG-изображений. Вместо прозрачности он отображает красивую серую область. Существует несколько способов справиться с этой напастью. Сегодня мы рассмотрим один из самых простых способов. При помощи известной JavaScript библиотеки <a href="https://lily-software.com/go.php?jquery.com">jQuery</a>.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	Предположим, что для JavaScript'ов на Вашем сервере отведена папка <strong>js</strong> в корне сайта, а изображения в папке <strong>images, </strong>также в корне сайта.</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	Если у Вас на сайте не установлена библиотека jQuery - устанавливаем ее. Для этого нужно скачать с сайта http://jquery.com последнюю версию и скопировать в вышеуказанную папку <strong>js.</strong><br />
	Между тегами &lt;head&gt; и &lt;/head&gt; на странице сайта добавим следующий код:</p>
<p class="code">
	&lt;script type="text/javascript" src="https://lily-software.com/js/jquery.js"&gt;&lt;/script&gt;</p>
<p>
	 </p>
<p>
	В папку <strong>images</strong> поместим gif-изображение состоящего из 1 прозрачного пиксела. Прозрачность gif-изображений Internet Explorer 6 поддерживает :). Имя файла с изображением blank.gif. <a href="https://lily-software.com/User_Files/a-n_Files/image/blank.gif">Скачать можно отсюда</a>.</p>
<p>
	 </p>
<p>
	Теперь в папке js создадим файл с именем <strong>jqie6pngfix.js</strong> следующего соделжания:</p>
<p class="code">
	// *********************************************<br />
	// * jQuery IE6 PNG fix by Alex<br />
	// * JavaScript<br />
	// * Alex &amp; Natty studio<br />
	// * http://portal30.ru<br />
	// *<br />
	// * Alex &amp; Natty Studio 2010<br />
	// *********************************************<br /><br />
	/*<br />
	* Фиксим PNG для конкретного изображения<br />
	*/<br />
	function fixPng(png) {<br />
	    // get src<br />
	    var src = png.src;<br />
	    // set width and height<br />
	    if (!png.style.width) { png.style.width = $(png).width(); }<br />
	    if (!png.style.height) { png.style.height = $(png).height(); }<br />
	    // replace by blank image<br />
	    png.onload = function() { };<br />
	    png.src = blank.src;<br />
	    // set filter (display original image)<br />
	    png.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='scale')";<br />
	}<br /><br /><br />
	/*<br />
	*<br />
	*/<br />
	$(document).ready(function() {<br />
	    // =========== Фиксим PNG ==============<br />
	    var badBrowser = (/MSIE ((5\.5)|6)/.test(navigator.userAgent) &amp;&amp; navigator.platform == "Win32");<br />
	    if (badBrowser) {<br />
	        // get all pngs on page<br />
	        $('img[src$=.png]').each(function() {<br />
	        if (!this.complete) {<br />
	            this.onload = function() { fixPng(this) };<br />
	    } else {<br />
	        fixPng(this);<br />
	    }<br />
	    });<br />
	    }<br />
	// ========= Конец: Фиксим PNG ==============<br /><br />
	});</p>
<p>
	 </p>
<p>
	Между тегами &lt;head&gt; и &lt;/head&gt;, после добаленной выше строки, подключающей jQuery, на странице сайта добавим следующий код:</p>
<p class="code">
	&lt;script type="text/javascript" src="https://lily-software.com/js/jqie6pngfix.js"&gt;&lt;/script&gt;</p>
<p>
	 </p>
<p>
	Вот и все.</p>
]]></description>
			<pubDate>Thu, 22 Jul 2010 20:41:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/jquery_ie6_png_fix]]></link>
		</item>
		<item>
			<title>Создаем погодный информер</title>
			<description><![CDATA[<p>Вероятно, многие Web мастера, хотя бы раз в жизни задавались вопросом о том, как бы отображать погоду на своем сайте или на сайте закзчика. Можно использовать готовые погодные информеры. Но они не всегда вписываются в дизайн сайта.</p>

<p>Сейчас мы посмотрим как можно сделать свой погодный информер с необходимым нам дизайном. Будем для этого использовать Google Weather API. Он достаточно легок в использовании. Если Вы разбираетесь в PHP, проблем возникнуть не должно.</p>

<p>Для начала обратимся к Google Weather API через браузер:</p>

<p><a href="https://lily-software.com/go.php?www.google.com/ig/api?weather=%D0%90%D1%81%D1%82%D1%80%D0%B0%D1%85%D0%B0%D0%BD%D1%8C">http://www.google.com/ig/api?weather=Краснодар</a></p>

<p>Тем самым мы запрашиваем погоду для города Краснодар. И тут же получим ответ в формате XML. Взглянем на него поближе:</p>

<p class="code">&lt;xml_api_reply version="1"&gt;<br />
    &lt;weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0"&gt;<br />
        &lt;forecast_information&gt;<br />
            &lt;city data="Astrakhan, Province of Astrakhan"/&gt;<br />
            &lt;postal_code data="Астрахань"/&gt;<br />
            &lt;latitude_e6 data=""/&gt;<br />
            &lt;longitude_e6 data=""/&gt;<br />
            &lt;forecast_date data="2010-04-03"/&gt;<br />
            &lt;current_date_time data="2010-04-03 11:30:00 +0000"/&gt;<br />
            &lt;unit_system data="SI"/&gt;<br />
        &lt;/forecast_information&gt;<br />
        &lt;current_conditions&gt;<br />
            &lt;condition data="Ясно"/&gt;<br />
            &lt;temp_f data="59"/&gt;<br />
            &lt;temp_c data="15"/&gt;<br />
            &lt;humidity data="Влажность: 26 %"/&gt;<br />
            &lt;icon data="/ig/images/weather/sunny.gif"/&gt;<br />
            &lt;wind_condition data="Ветер: В, 6 м/с"/&gt;<br />
        &lt;/current_conditions&gt;<br />
        &lt;forecast_conditions&gt;<br />
            &lt;day_of_week data="Сб"/&gt;<br />
            &lt;low data="2"/&gt;<br />
            &lt;high data="16"/&gt;<br />
            &lt;icon data="/ig/images/weather/mostly_sunny.gif"/&gt;<br />
            &lt;condition data="Преимущественно солнечно"/&gt;<br />
        &lt;/forecast_conditions&gt;<br />
        &lt;forecast_conditions&gt;<br />
            &lt;day_of_week data="Вс"/&gt;<br />
            &lt;low data="1"/&gt;<br />
            &lt;high data="15"/&gt;<br />
            &lt;icon data="/ig/images/weather/cloudy.gif"/&gt;<br />
            &lt;condition data="Облачно с прояснениями"/&gt;<br />
        &lt;/forecast_conditions&gt;<br />
        &lt;forecast_conditions&gt;<br />
            &lt;day_of_week data="Пн"/&gt;<br />
            &lt;low data="2"/&gt;<br />
            &lt;high data="16"/&gt;<br />
            &lt;icon data="/ig/images/weather/mostly_sunny.gif"/&gt;<br />
            &lt;condition data="Преимущественно солнечно"/&gt;<br />
        &lt;/forecast_conditions&gt;<br />
        &lt;forecast_conditions&gt;<br />
            &lt;day_of_week data="Вт"/&gt;<br />
            &lt;low data="3"/&gt;<br />
            &lt;high data="17"/&gt;<br />
            &lt;icon data="/ig/images/weather/sunny.gif"/&gt;<br />
            &lt;condition data="Ясно"/&gt;<br />
        &lt;/forecast_conditions&gt;<br />
    &lt;/weather&gt;<br />
&lt;/xml_api_reply&gt;</p>

<p>Все достаточно просто. Выбираем место, нажимем Enter и видим прогноз погоды. Данные допускается вводить как на Английском, так и на Руcском языке. Конечно строка быть закодирована для передачи данных через URL. Теперь осталось разобрать XML и вывести в удобном для нас виде.</p>

<p> </p>

<p>Пример использования на языке PHP:</p>

<p class="code">&lt;?php<br />
function getWeather() {<br />
    $requestAddress = "http://www.google.com/ig/api?weather=astrakhan&amp;hl=ru";<br /><br />
    // скачиваем данные о погоде<br />
    $ch = curl_init();<br />
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);<br />
    curl_setopt ($ch, CURLOPT_URL, $requestAddress);<br />
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);<br />
    curl_setopt ($ch, CURLOPT_TIMEOUT, 60);<br />
    $xml_str = curl_exec ($ch);<br />
    curl_close ($ch);     // парсим XML<br />
    $xml = @simplexml_load_string($xml_str);<br /><br />
    // обрабатываем XML<br />
    echo '&lt;div id="weather"&gt;';<br />
    foreach($xml-&gt;weather as $item) {<br />
        foreach($item-&gt;forecast_conditions as $new) {<br />
            echo '&lt;div class="weatherIcon"&gt;';<br />
            echo '&lt;img src="http://www.google.com/' .$new-&gt;icon['data'] . '"/&gt;&lt;br/&gt;';<br />
            echo $new-&gt;day_of_week['data'];<br />
            echo '&lt;/div&gt;';<br />
        }<br />
    }<br />
    echo '&lt;/div&gt;';<br />
}<br />
getWeather();<br />
?&gt;</p>

<p> </p>

<p style="text-align:justify;">В этом коротком примере мы организовали вывод иконок прогноза погоды на 4 дня. Для понимания принципа этого достаточно. Написание более сложного скрипта оставим читателю. Добавлю, что в приведенном выше XML-ответе в теге <strong>&lt;current_conditions&gt;</strong> содержится текущая сводка погоды: облачность, влажность, скорость ветра, иконка облачности и температура. В тегах <strong>&lt;forecast_conditions&gt;</strong> - прогноз облачности и его иконка на близайшие 4 дня. Google Weather API быстро работает, но на сайтах с большой посещаемостью данные лучше кешировать.</p>

<p> </p>

<p>Образец использования Google Weather API Вы можете наблюдать на главной странице этого сайта.</p>

<p> </p>

<p>Также можно <a href="https://lily-software.com/sozdanie-internet-sajtov/free-scripts/cotonti_weather">скачать плагин прогноза погоды</a> для CMS Cotonti.</p>

<p> </p>

<p> </p>

<p align="left">У нас Вы можете заказать создание интернет сайта любой сложности.<br />
От сайта-визитки до портальной системы, корпоративного сайта или интернет магазина.</p>

<p align="left"><br />
По всем вопросам просьба обращаться: тел. +7-964-930-50-29 (Краснодар)<br />
e-mail: <a href="https://lily-software.com/mailto:kalnovalexey@yandex.ru">kalnovalexey@yandex.ru</a><br /><img alt="ICQ" height="16" src="https://lily-software.com/go.php?status.icq.com/online.gif?icq=245848856&amp;img=5" width="16" /> <a href="https://lily-software.com/go.php?www.icq.com//people/webmsg.php?to=245848856&amp;action=message">245848856</a><br />
Мы находимся в г. Краснодар</p>
]]></description>
			<pubDate>Sat, 03 Apr 2010 13:44:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/make_weather_informer]]></link>
		</item>
		<item>
			<title>Использование WYSIWYG редактора CKEditor</title>
			<description><![CDATA[<p>Использование WYSIWYG редактора CKEditor для плагинов для <strong>CMF Cotonti</strong>.</p>

<p style="text-align:justify;"><em><strong>WYSIWYG</strong> (является аббревиатурой от англ. <strong>W</strong>hat <strong>Y</strong>ou <strong>S</strong>ee <strong>I</strong>s <strong>W</strong>hat <strong>Y</strong>ou <strong>G</strong>et, «что видишь, то и получишь») — программа, в которой содержание отображается в процессе редактирования и выглядит очень похоже на конечную продукцию, которая может быть печатным документом, веб-страницей, слайд-презентацией или даже использоваться для освещения театральных событий.</em></p>

<p style="text-align:justify;">Сам же CKEditor представляет собой приложение JavaScript. Плагин, подключающий этот редактор с CMF Cotonti и позволяющий с его помощью редактировать страницы <a href="https://lily-software.com/sozdanie-internet-sajtov/arhiv/cotonti_ckeditor">можно скачать тут</a>. Помимо редактирования страниц, он дает разработчику возможность использовать этот редактор в своих плагинах.</p>

<p style="text-align:justify;">Эту возможность мы сейчас и рассмотрим.</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">В настройках плагина в панели администратора сайта нам нужно опцию « «ckeditor.js» только для редактирования страниц» перевести в положение «Нет», чтобы CKEditor стал доступным на всех страница сайта (не только при редактировании страниц).</p>

<p> </p>

<h3>Создание экземпляра редактора</h3>

<p style="text-align:justify;">На Вашей странице CKEditor работает как элемент <strong>&lt;textarea&gt;</strong>. При этом он предоставляет пользователю интерфейс, позволяющий легко набирать текст с использованием форматирования. Что сделать без использования редактора для обычного пользователя не так легко, т.к. для этого потребовалось бы от пользователя знание HTML, которое и потребовалось бы ввести в &lt;textarea&gt;.</p>

<p style="text-align:justify;">Фактически CKEditor использует элемент &lt;textarea&gt; для передачи данных на сервер. Во время работы редактора «textarea» не видна для пользователя. Но для создания экземпляра редактора, Вам нужно сначала создать элемент &lt;textarea&gt;.</p>

<p class="code">&lt;textarea name="editor1"&gt;&lt;p&gt;Initial value.&lt;/p&gt;&lt;/textarea&gt;</p>

<p> </p>

<p style="text-align:justify;">Обратите внимание, если Вы хотите загрузить данные в редактор, например редактируемую страницу из базы данных, Вам нужно просто поместить данные внуть элемента &lt;textarea&gt;. Как в примере выше.</p>

<p style="text-align:justify;">Мы назвали нашу текстовую область «editor1». Это имя в последующем следует использовать на стороне сервера для того, чтобы прочитать данные, которые будут набраны (отредактированы) в редакторе.</p>

<p style="text-align:justify;">И вот, используя JavaScript CKEditor API мы превращаем текстовую обрасть в полнофункциональный редактор. Это делается всего одним обращением к JavaScript.</p>

<p class="code">&lt;script type="text/javascript"&gt;<br />
        CKEDITOR.replace( 'editor1' );<br />
&lt;/script&gt;</p>

<p>Этот блок кода может быть включен в любом месте страницы после заменяемого тега «textarea».</p>

<p>Вы также можете вызвать метод replace() из заголовка страницы (внутри тега &lt;head&gt;), но это следует делать из обработчика события «window.onload». Например:</p>

<p class="code">&lt;script type="text/javascript"&gt;<br />
    window.onload = function()<br />
    {<br />
        CKEDITOR.replace( 'editor1' );<br />
    }<br />
&lt;/script&gt;</p>

<p> </p>

<h3>Сохранение данных из редактора</h3>

<p>Как уже упоминалось выше, CKEditor работает как элемент &lt;textarea&gt;. Так при отправке формы на сервер, содержащей редактор, его данные отправляются на сервер используя имя замещенного элемента &lt;textarea&gt; как ключ для доступа к ним.</p>

<p>К примеру, следующий PHP код примет данные из редактора, созданного в предыдущем примере:</p>

<p class="code">&lt;?php<br />
$editor_data = $_POST[ 'editor1' ];<br />
?&gt;</p>

<p>Это был общий пример.<br />
Создавая плагин для Cotonti, следует использовать такой код:</p>

<p class="code">&lt;?php<br />
$editor_data = sed_import( 'editor1', 'P', 'HTM' );<br />
?&gt;</p>

<p> </p>

<h3>Обработка данных на стороне клиента</h3>

<p> </p>

<p>Иногда требуется бработка данных на стороне клиента, например в проложениях Ajax. Используя CKEditor API данные из редактора, также достаточно легко прочитать, например:</p>

<p class="code">&lt;script type="text/javascript"&gt;<br />
    var editor_data = CKEDITOR.instances.editor1.getData();<br />
&lt;/script&gt;</p>

<p> </p>

<h3>Полный пример</h3>

<p class="code">&lt;html&gt;<br />
&lt;head&gt;<br />
        &lt;title&gt;Sample - CKEditor&lt;/title&gt;<br />
        &lt;script type="text/javascript" src="https://lily-software.com/ckeditor/ckeditor.js"&gt;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
        &lt;form method="post"&gt;<br />
                &lt;p&gt;<br />
                        My Editor:&lt;br /&gt;<br />
                        &lt;textarea name="editor1"&gt;&lt;p&gt;Initial value.&lt;/p&gt;&lt;/textarea&gt;<br />
                        &lt;script type="text/javascript"&gt;<br />
                                CKEDITOR.replace( 'editor1' );<br />
                        &lt;/script&gt;<br />
                &lt;/p&gt;<br />
                &lt;p&gt;<br />
                        &lt;input type="submit" /&gt;<br />
                &lt;/p&gt;<br />
        &lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
]]></description>
			<pubDate>Sat, 20 Mar 2010 12:48:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/using_ckeditor]]></link>
		</item>
		<item>
			<title>Совместное использование CKEditor'а и jQuery</title>
			<description><![CDATA[<p style="text-align:justify;"><a href="https://lily-software.com/go.php?ckeditor.com">CKEditor</a> - полнофункциональный визуальный (Wysiwyg) HTML редактор страниц. Позволяет редактировать страницу как в режиме Wysiwyg, так и в режиме непосредственного редактирования HTML-кода.</p>

<p style="text-align:justify;">К CMF Cotonti подключается при помощи плагина <a href="https://lily-software.com/sozdanie-internet-sajtov/arhiv/cotonti_ckeditor">Cotonti.CKEditor</a>.</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">В этой статье мы кратко рассмотрим, как можно использовать CKEditor совместно с библиотекой jQuery при разработки плагинов.</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">Для интеграции редактора с jQuery, в настройках плагина нужно включить опцию «Включить адаптер jQuery?», также понадобится опцию « «ckeditor.js» только для редактирования страниц» перевести в положение «Нет», чтобы CKEditor стал доступным на всех страница сайта (не только при редактировании страниц).</p>

<p style="text-align:justify;"> </p>

<h3>Создание экземпляра редактора</h3>

<p>Любой элемент <strong>textarea</strong>, <strong>p</strong> или <strong>div</strong> может быть превращен в текстовый редактор, просто используя метод <strong>ckeditor()</strong>:</p>

<p class="code">$('Textarea.editor').сkeditor();</p>

<p>Также могут быть использованы <strong>цепочки вызовов</strong> jQuery</p>

<p class="code">$( '.section-x' )<br />
    .find( 'textarea.editor' )<br />
       .ckeditor()<br />
    .end()<br />
    .find( 'a' )<br />
       .addClass( 'mylink' )<br />
    .end();</p>

<p><strong>ckeditor()</strong> является основным методом jQuery адаптера. Он принимает два необязательных параметра:</p>

<ul><li><strong>Функция обратного вызова</strong>, которая будет выполнена после создания редактора</li>
	<li><strong>Настройки конфигурации</strong>, спецефичные для создаваемого экземпляра редактора</li>
</ul><p><a href="https://lily-software.com/go.php?docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html">Настройки конфигурации</a> передаются через простой объект, содержащий свойства, каждое из которых связано с конкретной настройкой редактора.</p>

<p class="code">$('.jquery_ckeditor')<br />
    .ckeditor( function() { /* callback code */ }, { skin : 'office2003' } );<br />
    .ckeditor( callback2 );</p>

<p style="text-align:justify;">Приведенный пример не создаст 2 редактора, т.к. один экземпляр уже в процессе создания, после завершения первой функции обратного вызова будет запущена вторая. Каждая из этих функций обратного вызова будет выполняться в контексте объекта <a href="https://lily-software.com/go.php?docs.cksource.com/ckeditor_api/symbols/CKEDITOR.editor.html">CKEDITOR.editor</a> (так что «this» будет указывать на экземпляр редактора) и элемент объекта DOM будет им передан в качестве параметра.</p>

<p style="text-align:justify;"> </p>

<h3>Операции над экземпляром редактора</h3>

<p> </p>

<p style="text-align:justify;">Как только экземпляр редактора создан (после завершения работы функции обратного вызова), можно использовать метод <strong>ckeditorGet()</strong> для получения доступа к редактору. Например:</p>

<p class="code">var editor = $('.jquery_ckeditor').ckeditorGet();<br />
alert( editor.checkDirty() );</p>

<p style="text-align:justify;">Поскольку операции получения данных, набраных в редакторе, и установка этих данных являются общими операциями, адаптер jQuery позволяет делать это с помощью метода <strong>val()</strong>.</p>

<p class="code">// Читаем данные, набранные пользователем в редакторе.<br />
var data = $( 'textarea.editor' ).val();<br />
// Устанавливаем новый тект в редакторе.<br />
$( 'textarea.editor' ).val( 'my new content' );</p>

<p style="text-align:justify;">Эта возможность может быть отключена установкой настройки <strong>CKEDITOR.config.jqueryOverrideVal</strong> в значение <strong>false</strong>, до того как будет загружен адаптер jQuery. Его Cotoni в свою очередь загружает при исполнении хука <strong>header.main</strong>. Учитывайте эту особенность при написании плагинов, использующих этот адаптер.</p>

<p style="text-align:justify;">Для элемента <strong>textarea</strong> редактор автоматически вернет свои данные в форму при отправке. CKEditor также работает с официальным плагином <a href="https://lily-software.com/go.php?jquery.malsup.com/form/">jQuery Form Plugin</a> для Ajax форм. Для взаимодействия с этим плагином не требуется никаких дополнительных доработок.</p>

<p style="text-align:justify;"> </p>

<h3 style="text-align:justify;">Обработка событий</h3>

<p> </p>

<p style="text-align:justify;">CKEditor имеет свою систему событий. Она состоит из четырех основных событий:</p>

<ul><li style="text-align:justify;"><strong>instanceReady.ckeditor</strong> : возникает в момент завершения создания экземпляра редактора, но до начала выполнения функции обратного вызова</li>
	<li style="text-align:justify;"><strong>setData.ckeditor</strong> : возникает когда данные передаются в редактор</li>
	<li style="text-align:justify;"><strong>getData.ckeditor</strong> : возникает в момент получения данных из редактора</li>
	<li style="text-align:justify;"><strong>destroy.ckeditor</strong> : возникает в момент уничтожения экземпляра редактора. Это событие можно использовать, например для обработки полученных от редактора данных, когда работа с ним завершена или очистки страницы.</li>
</ul><p style="text-align:justify;">Экземпляр редактора всегда передается первым параметром обработчику событий. События <strong>setData</strong> и <strong>getData</strong> часто используются самим редактором, так, что использовать их нужно с осторожностью.</p>

<p style="text-align:justify;">События jQuery поддерживают т.н. «bubble up»</p>
]]></description>
			<pubDate>Fri, 19 Mar 2010 19:32:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/jquery_ckeditor]]></link>
		</item>
		<item>
			<title>Cамописный движок?</title>
			<description><![CDATA[<p style="text-align:justify;">Очень часто в последнее время на разных форумах и блогах встречаю советы заказывать непременно т.н. <strong>самописный движок</strong>. Т.е. программное обеспечение <strong>Вашего сайта</strong> (CMS), которое исполнитель <strong>создаст "с нуля"</strong>, не используя при этом никаких готовых решений.</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">так в чем их преимущество перед коробочными версиями (CMS)? Давайте попробуем разобраться.</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;"><strong>Основное преимущество любого самописного движка</strong> по мнению тех кто их рекомендует - безопасность. Аргумент такой: если никто не сможет увидеть внутренности движка то и взломать его никто не сможет. Это утверждение весьма спорное. Все зависит в большой степени от того какими стандартными функциями воспользуется создатель такого движка и насколько он предусмотрит основные требования к безопасности любого скрипта.</p>

<p style="text-align:justify;">Даже если потенциальный вредитель не знает устройство движка, это не помешает ему протестировать уязвимости всеми доступными способами. Вот пример из <a href="https://lily-software.com/articles/podmena_argumeta_order_b" title="Безопасность. Подбор паролей методом дихотомического поиска.">нашего прошлого разговора</a>. <strong>Различных способов атаки существует масса</strong>. Конечно то, что движок самописный и в единственном экземпляре несколько затруднит поиск уязвимостей. Однако один - два создателя врядли смогут предусмотреть 100% защиту от всех типов уязвимостей.</p>

<p style="text-align:justify;">Есть еще один серьезный недостаток такого решения: это отсутствие документации, сложная расширяемость функционала. Наш движок в едиснственном экземпляре и все модули нужно заказывать разработчику, т.к. нет готовых решений.</p>

<p style="text-align:justify;">А если, например, Вы для своего проекта заказываете у Web-студии или фрилансера сайт под который они создадут движок то кто может дать гарантию что этот фрилансер или студия будут обслуживать этот движок столько времени сколько Вам надо? Сдадут сайт, предоставят инструкцию по использованию, поднастроят всё как надо и вуаля! А понадобяться со временем какие то доработки или усовершенствования? Искать другого разработчика который несколько дней будет разбираться в устройстве этого движка только ради 2-х, 3-х строчек кода который нужно добавить? Не слишком ли дорогое удовольствие?</p>

<p style="text-align:justify;">Давайте рассуждать дальше. "Коробочные" версии CMS (движков) как правило разрабатывает не один-два человека, а группы программистов. А те движки, у которых версия не уже v1.0, разрабатываются уже не один год. Такие системы, как правило, хорошо документированы. Они имеют целую армию пользователей, которые сообщают разработчикам о найденных ошибках и уязвимостях. Именно по-этому такие системы являются устойчивыми к большинству типу "стандартных" способов взлома. Но и здесь нет 100% гарантии. Хотя безопасность "коробочных" систем несомненно выше, нежели у "самописных". И ошибок в "коробках" бывает намного меньше.<br />
Группа программистов за длительное время в состоянии сделать то, что совсем не под силу одному-двум разработчикам за короткое время. Это факт. И тот, кто говорит Вам, что сможет сделать для Вас, например интернет магазин "с нуля" за 2 недели, на самом деле использует либо какие-то готовые решения, либо просто лукавит. Вы только представте себе, что это тысячи и тысячи строк программного кода...</p>

<p style="text-align:justify;">Вот по этим причинам я и советую никогда не использовать самописные движки. Исключение, если Вы Web-разработчик и делаете его для использования исключительно на своем сайте либо в целях практики в программировании.</p>

<p style="text-align:justify;">А если, допустим, нужен функционал, которого нет ни в одном из существующих движков, то всё же лучше всего заказать доработку какого то готового движка у самих разработчиков - уверен что деньги будут потраченны с большей пользой.</p>

<p style="text-align:justify;">И несколько аналогий: никому же приходит в голову изобретать колесо, смотреть самоспаянный телевизор (Pioneer, например) или ездить на самосбороном Audi. (хотя и тут возможны исключения).</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">Если же кто то считает я не прав (или наоборот, согласен со мной, но есть что сказать), прошу в комменты!</p>

<p style="text-align:justify;"> </p>

<p style="text-align:justify;">P.S. Добавлю как разработчик, что я тоже занимался созданием движка для сайта. Ради практики. Одно время он даже применялся на одном из моих сайтов. А еще в бытность студентом написал текстовый редактор, медиа проигрыватель, рисовалку (типа Paint). Были и другие работы. Но последнюю никак нельзя предлагать в качестве альтернативы PhotoShop или мой плеер как альтернативу тому же Aimp.</p>
]]></description>
			<pubDate>Mon, 25 Jan 2010 03:48:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/samopicnij_dvizok_vs_gotovij]]></link>
		</item>
		<item>
			<title>Безопасность. Подбор паролей методом дихотомического поиска.</title>
			<description><![CDATA[<p style="text-align:center;">
	<strong>Основная идея</strong></p>
<p style="text-align:justify;">
	Предположим, мы имеем скрипт users.php, который выводит список пользователей атакуемого веб-сайта. Обычно, подобные скрипты выводят этот список в виде таблицы, содержащей имя пользователя, дату его регистрации, статус на сайте и т.п. информацию. Кроме того данный скрипт позволяет сортировать вывод этой информации по каждому из этих параметров. Например, передав скрипту параметры "?orderby=name&amp;direct=ASC", мы получаем список пользователей отсортированный в нисходящем порядке по параметру name, т.е. по имени пользователей. Обычно, таблица БД к которой обращаются подобные скрипты, помимо выводимых ими данных, содержит также секретные данные: например, пароли или хеши паролей юзерских аккаунтов.<br /><br />
	Вот тут разработчиков веб-движков и может подстерегать опасная ошибка. Если передаваемый скрипту параметр "orderby", подставляется в SQL-запрос, без проверки его на "адекватность" его значения, то мы можем передать параметр "orderby" равный, к примеру, 'password' (или равный номеру колонки 'password' в таблице с пользователями), получив таким оразом вывод списка пользователей, отсортированный по полю 'password'. Дело в том, что тут действует одна важная особенность конструкции "ORDER BY" SQL-опертора SELECT: сортировка с помощью нее возможна по любому полю таблицы из которой извлекается информация, а не только по тем полям, по которым производится выборка SELECT'ом. Причем в данном случае никакой роли не сыграют различные защиты от sql-инъекций. Фактически, в случае обнаружения подобной уязвимости, мы имеем хоть и косвенное, но все же раскрытие секретной информации, что уже можно считать дырой в безопасности.<br /><br />
	Является ли эта уязвимость распространенной? Нет. В серьезных движках с солидной историей обновлений ее трудно будет повстречать, но вот <strong>в разного рода самописных сайтовых движках, "фирменных" двигах всяких мелких веб-студий,</strong> <strong>вероятность обнаружить подобную багу всегда есть</strong>. </p>
<p style="text-align:justify;">
	Является ли данная уязвимость действительно опасной? Да, в случае, если атакующий имеет доступ к аккаунту пользователя уязвимого сайта и имеется возможность изменять пароль данного юзера, или же есть возможность создавать некоторое количество новых юзеров, при этом нет возможности менять их пароли. Кроме того необходимое условие для атаки: пароли в БД хранятся либо в plain-text виде, либо в виде хеша, но без соли. Следует отметить, что в случе с хешами возможен подбор только криптографически слабых паролей.</p>
<p style="text-align:justify;">
	Подробности <a href="https://lily-software.com/go.php?cr0w-at.blogspot.com/2009/05/order-by-sql-1.html">прочитать можно тут</a>.<br /><a href="https://lily-software.com/go.php?https://blackhole.cih.ms:13000/showthread.php?t=727">О подобной уязвимости в Fireboard</a><br /><a href="https://lily-software.com/go.php?www.neocrome.ru/page.php?al=ujazvimost_sedit">Фикс уязвимости в Seditio</a> и <a href="https://lily-software.com/go.php?cr0w-at.blogspot.com/2009/05/seditio-v121-user-password-dichotomic.html">скрипт для атаки на Seditio</a></p>
]]></description>
			<pubDate>Wed, 07 Oct 2009 07:14:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/podmena_argumeta_order_b]]></link>
		</item>
		<item>
			<title>Чем отличается дорогой сайт от дешевого?</title>
			<description><![CDATA[<p style="text-align:justify;">
	<img align="left" alt="Создание интернет сайтов" border="0" height="104" hspace="3" src="https://lily-software.com/User_Files/a-n_Files/image/illustratcii/MyNetwork.png" vspace="3" width="120" /> Я, особенно в последнее время, часто слышу фразы: «Цену не ломите, в стране кризис» или «Нам нужен интернет магазин, у нас дизайн уже есть, осталось установить корзину - там делать нечего по этому бюджет 200 USD», «Да там работы-то, не смешите! На любом конструкторе можно сделать, просто у нас нет специалиста, вот и решили обратиться к Вам».</p>
<p style="text-align:justify;">
	Имея уже достаточный опыт общения с заказчиками, прихожу к выводу, что значительная часть людей, решивших заказать себе интернет сайт не знает или не хочет знать откуда берутся цены на создание, или же твердо уверены, что это дешевая работа и те кто «ломит цену» просто обманывают доверчивых простаков. Эту статью пишу главным образом для первых из них с целью помочь разобраться в ситуации. Вторым и третьим она вряд ли поможет.</p>
<p style="text-align:justify;">
	В качестве небольшого отступления, давайте вернемся к первому абзацу и попытаемся проанализировать приведенные аргументы: «Цену не ломите, в стране кризис» - т.н. кризис, к сожалению провоцирует неконтролируемую инфляцию и рост цен, а не их снижение. «Нам нужен интернет магазин, у нас дизайн уже есть, осталось установить корзину - там делать нечего...» - можно перефразировать «Фантик у нас уже есть, какая проблема сделать конфету», но мне больше нравится такой вариант: «Обои у нас уже есть, там осталось то - стены возвести». Если обратимся к словарю, то можем найти определение слова «Дизайн» - оформление. Соответственно дизайнер - это художник оформитель. Думаю не нужно объяснять, что нарисованная дизайнером картинка так ей и останется без программной части.</p>
<p style="text-align:justify;">
	С дизайном и программным обеспечением мы уже определились. Так в чем же разница между дешевым и дорогим сайтом? К тому же нередки случаи, когда «дешевый» после «правильного пиара» продается клиенту достаточно дорого...Сначала давайте попробуем разобраться по аналогиям. Думаю все (или большинство) прекрасно понимают чем отличается дорогое авто от дешевого. Например AUDI последней серии от жигулей. На первый взгляд и та и другая машины ездят, но разница очевидна. Или дорогой телевизор, например Pioneer от недорогого Elenberga или аккустика английской B&amp;W от, простите меня, SVEN'а.То же самое и здесь. Рассмотрим несколько примеров.</p>
<p style="text-align:justify;">
	<strong>Дизанер</strong>. Человек с художественным образованием, со вкусом с опытом работы, неоднократный участник различных выставок, знающий не по наслышке о юзабилити (англ. буквально "возможность быть использованым", означ. удобство использования в сочетании с эргономикой). Понятно, что работа такого человека не может стоить дешево. С другой стороны, человек, который только научился пользоваться фотошопом, закончил курсы дизайнера. Работа и того и другого имеет право на жизнь. Но, думаю, Вы без труда сможете отличить работу первого от второго.</p>
<p style="text-align:justify;">
	<strong>Верстальщик</strong> (человек, превращающий работу дизайнера в HTML-код, понимаемый интернет браузерами). С результатами его работы в дальнейшем будет работать программист. Первый после создания макета тестирует его в разных браузерах, IE7, FireFox, Safari, мобильных браузерах, старой «Опере» на самых разных разрешениях. Макет не разваливается при изменении размера шрифта. Второй в лучшем случе тестирует макет в самых популярных браузерах с разрешением 1024х768 и 1280х1024 со стандартным размером шрифта. Думаю уже не нужно пояснять разницу.</p>
<p style="text-align:justify;">
	<strong>Программист</strong>. Человек с высшим техническим образованием по соответвующей специальности (а оно весьма не дешево), с практикой разработок в этой области. Имеет хорошее портфолио, где представлены выполненные им работы. При создании Вашего сайта учтет именно Вашу специфику. Создаст программные модули необходимые именно для решения Ваших задач, которые органично впишутся в грамотно выбраную CMS (Система управления сайтом, ядро программного обеспечения Вашего сайта). Кроме того этот человек позаботится о безопасности Вашей системы. С другой стороны - человек, который уже научился устанавливать windows, поработал продавцом компьютеров или настройщиком, узнал о том есть php (один из языков программирования, применяемый при разработке CMS), прочитал в интернете о разных CMS, понял как все просто и быстро, решил «заработать на сайтах». Понятно, что работа первого специалиста будет дороже, чем у второго. Но и результат тоже будет сильно разниться. Во втором случае сайт «собирается» из того что есть. CMS берется не та, что лучше в данном случае, а потому, что разработчик именно с ней умеет работать. Естественно тут не может быть речи о создании модулей или учете какой-то конкретной специфики. Функционал ограничен лишь возможностью самой CMS и теми модулями, которые можно скачать в интернете.</p>
<p style="text-align:justify;">
	Но вот у Вас уже есть сайт. Что дальше? Еще один небольшой пример:</p>
<p style="text-align:justify;">
	<strong>Наполнение</strong><br />
	Дешевый вариант: заказчик своими силами наполняет сайт. Что-то пишет на нем ради демонстрации, копирует туда тексты с презентаций и рекламных буклетов. Можно переписать текст с сайтов конкурентов, адаптировав их под себя. Фотографии тоже сделаны самим заказчиком. Их мало. Качество фото оставляет желать лучшего. Цена такого варианта 0 рублей.<br />
	Дорогой вариант: наполнением занимается специалист. Он выяснит у заказчика все необходимые данные. Добросовестно напишет статьи с учетом специфики заказчика, предполагаемой аудитории. Не забудет и про поисковые машины. Фотографии сделаны профессионалом. Они качественные, привлекательные, стильные. Такой сайт привлекает больше посетителей, часть которых становится клиентами.</p>
<p style="text-align:justify;">
	И на последок приведу последний пример: в Астрахани цена на создание интернет магазинов колеблется от 6 000 до 60 000 рублей. Выбор безусловно остается за заказчиком...</p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	 </p>
<p style="text-align:justify;">
	Студия Alex &amp; Natty, г. Астрахань. Разработка и создание интернет сайтов любой сложности. Web - дизайн. SEO. Продвижение интернет сайтов.</p>
]]></description>
			<pubDate>Sat, 11 Apr 2009 15:34:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/a_n_site_deshovij_dorogo]]></link>
		</item>
		<item>
			<title>Внутренняя SEO (search engine optimisation) оптимизация</title>
			<description><![CDATA[<p style="text-align:justify;">Данная статья рассчитана не на профессионалов в области <strong>SEO</strong> которые это все уже знают и применяют в своей работе, а на новичков чей сайт уже изготовлен и которые хотят повысить его посещаемость. Здесь я приведу несколько полезных советов которые помогут <strong>оптимизировать</strong> ваш <strong>сайт</strong>, под поисковые системы (SEO). Следование следующим рекомендациям, является неплохим инструментом для продвижения сайта в сети интернет и достижения неплохих результатов. Здесь мы затронем аспекты только внутренней оптимизации.<br /><br /><strong>1. robots.txt</strong><br />
Файл <strong>robots.txt</strong>: <a href="https://lily-software.com/go.php?http://robotstxt.org.ru/">читаем основы и делаем правильно</a>.<br /><br /><strong>2. Ненужный javascript</strong><br />
Очень важный момент при SEO оптимизации, это местоположение контента и мета тега <strong>&lt;title&gt;</strong> в коде страницы. Чем выше находятся эти разделы в коде, тем лучше происходит индексация поисковиками. Для того что бы они занимали главенствующее положение, располагаем код JavaScript ниже тега <strong>title</strong><strong>, </strong>либо вообще вынесем его в отдельный файл.<br /><br /><br /><strong>3. Имена страниц в строке </strong><strong>URL</strong><br />
Возьмите за правило прописывать внятные ссылки (URL) у страниц, хоть это и не играет особой роли для поисковых систем. Здесь играет роль чисто человеческий фактор - визуальное восприятие ссылки человеком в результатах выдачи по ключевому слову в поисковике. Я, например, в выдаче Яндекса, кроме заголовка (Title), смотрю еще и на ссылку под ним. Согласитесь, приятней наблюдать нечто вроде site.ru/page.php?name=SEO_MANUAL, чем ссылку с таким интригующим и загадочным текстом, site.ru/page.php?id=3bf4d8a&amp;do=b6&amp;sess=f17d6ece211. Вот и выносите основное ключевое слово относящееся к содержимому страницы в строку URL.<br /><br /><strong>4. Заголовки страниц</strong><br />
Строим правильные мета теги <strong>&lt;title&gt; </strong>на страницах страниц для поисковиков. Отличный и очень правильный подход - выводить в Title сначала - "заголовок страницы", а затем "имя сайта". Нужно только написать правильные названия с ключевым словом (словом, по которому Вы бы хотели чтобы Вас находили) или словосочетаниями взятыми из контента (содержимого) страницы.<br /><br /><strong>5. Внутренняя перелиновка</strong><br />
Внутреняя перелиновка, иначе - перекрестные ссылки внутри сайта на материалы схожей тематики. Во первых помогает роботам поисковиков быстрее найти и проиндексировать страницы и как следствие помогает попасть в базу поисковиков большему количеству страниц сайта. Во вторых происходит передача веса страницы (посредством ссылки) на страницы со схожей тематикой (ревалентный контент).<br /><br /><strong>6</strong><strong>. Передача веса страницы</strong><br />
Препятствуем утеканию "веса страниц" по внешним ссылкам - прячем ссылки. Например посредством скрипта, которому через URL-запрос передадим ссылку, которую надо спрятать, а он перенаправит браузер на нужную страницу. Например вместо &lt;a href=https://lily-software.com/”http://privetmir.ru”&gt;, можно сделать &lt;a href=https://lily-software.com/”go.php?http://privetmir.ru”&gt; - ссылка уже не внешняя, а скрипт go.php отправит пользователя на http://privetmir.ru.</p>

<p style="text-align:justify;"><br /><strong>7. Карта сайта</strong><br />
Внутренняя карта сайта. Очень нужный и полезный для индексации механизм на сайте. Желательно, чтобы она вела на каждую страницу сайта и при этом была удобна для людей.</p>

<p style="text-align:justify;"> </p>

<p><br /><strong>8. Содержимое страницы </strong>(наполнение)<br />
В тексте на страницах нужно употреблять ключевые слова. Постарайтесь построить текст так, чтобы они там были в достаточном количестве.<br /><br /><strong>9. Итоги</strong><br />
Ничего из выше сказанного вам не поможет если у вас нет:</p>

<ol><li>уникального контента с разумным акцентом на ключевые слова по тексту.</li>
	<li>ясной головы.</li>
	<li>прямых рук.</li>
</ol><p>Вопросы интернет программирования, дизайна, SEO оптимизации обсуждаем <a href="https://lily-software.com/forums">на форуме</a>.</p>
]]></description>
			<pubDate>Fri, 23 May 2008 16:11:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/a_n_SEO_inside]]></link>
		</item>
		<item>
			<title>Доменные имена. Как выбрать хорошее имя для своего сайта?</title>
			<description><![CDATA[<p style="text-align:right;">
	 Web-дизайн, разработка интернет сайтов<br />
	Астрахань</p>
<p style="text-align:right;">
	<strong>Автор:</strong> NunDesign,<br />
	Источник: <a href="https://lily-software.com/go.php?url=www.i2r.ru/">Библиотека сайтостроительства</a></p>
<p style="text-align:justify;">
	Известный маркетолог Dr. Ralph F. Wilson сформулировал 4 критерия для правильного выбора доменного имени. Присвойте по 1 очку за соответствие предполагаемого доменного имени каждому из критериев. Если получилось 4 из 4 возможных - Вы на правильном пути.</p>
<h4 style="text-align:justify;">
	1. Краткость</h4>
<p style="text-align:justify;">
	Доменное имя должно быть коротким, чем короче, тем лучше. Неспроста 1999 году «правильный» домен art.com выставили на продажу с «правильной» ценой в 0 000. Доменное имя должно быть коротким по 2 причинам: меньше шансов ошибиться при написании и лучше запоминаемость.</p>
<h4 style="text-align:justify;">
	2. Запоминаемость</h4>
<p style="text-align:justify;">
	Не все короткие имена хорошо запоминаются. Например, домен rprg.ru, принадлежащий Russian Public Relations Group, безусловно, короткий, но человеку, никогда ранее не встречавшему эту аббревиатуру, запомнить сразу будет тяжело. Естественно, если Ваша компания – IBM, то использование инициалов в доменном имени имеет очевидный смысл, именно под такой аббревиатурой Ваши клиенты и знают Вас. Однако в большей части случаев использование инициалов нежелательно, поскольку запомнить нагромождение согласных нелегко.<br />
	Некий канадец, Dr. Michel Fortin, провел мини-исследование по запоминаемости доменных имен. В результате выяснилось, что очень сильно на запоминаемость влияют ритм и рифмуемость слогов – так же, как и в стихах. Допустим, что Вы – ООО «Дальневосточная компания РыбЭкспорт». Варианты доменного имени:</p>
<ol type="1"><li style="text-align:justify;">
		<a href="https://lily-software.com/go.php?url=www.dcre.ru">www.dcre.ru</a> - не запоминается</li>
	<li style="text-align:justify;">
		<a href="https://lily-software.com/go.php?url=www.dcfe.ru">www.dcfe.ru</a> - не запоминается</li>
	<li style="text-align:justify;">
		<a href="https://lily-software.com/go.php?url=www.dafish.ru">www.dafish.ru</a> - и короткое, и рифмуется, и прямо указывает на деятельность компании. (кстати, странно, что оно до сих пор свободно).</li>
</ol><h4 style="text-align:justify;">
	3. Доменное имя должно соответствовать названию Вашей фирмы, или в названии должны присутствовать ключевые слова Вашего бизнеса</h4>
<p style="text-align:justify;">
	Безусловно, хорош тот домен, который пользователи просто угадывают. Бин-Банк ( <a href="https://lily-software.com/go.php?url=www.binbank.ru">www.binbank.ru</a>) , АльфаБанк (<a href="https://lily-software.com/go.php?url=www.alfabank.ru">www.alfabank.ru</a>). Однако, если название Вашей фирмы слишком длинное или латинское, и написание не вызывает доверия, то попробуйте использовать в имени домена ключевые слова из Вашего бизнеса. Можно использовать как переводной вариант (ковер = carpet), так и транслитеральный (ковер = kover).</p>
<h4 style="text-align:justify;">
	4. Домен должен безошибочно читаться и не вызывать сомнений в написании</h4>
<p style="text-align:justify;">
	Четвертый критерий всем понятен. Тем не менее, в Сети достаточно доменов, которые тяжело записать на слух. Для латинских доменов это болезнь сдвоенных букв (internettrade , rosevilleelectric). Для транслита характерно многообразие в написании одного и того же слова (ковёр = kover , cover, KOBEP). Лучше заранее представить, насколько просто/непросто будет объяснить, например, по телефону, как правильно пишется Ваш домен.</p>
<h4 style="text-align:justify;">
	Покупайте альтернативные доменные имена</h4>
<p style="text-align:justify;">
	Для русскоязычной части это - наиболее эффективный метод защиты от ошибок пользователей в написании имени домена. Например: <a href="https://lily-software.com/go.php?url=www.auto.ru">www.auto.ru</a> и <a href="https://lily-software.com/go.php?url=www.avto.ru">www.avto.ru</a>. (Старожилы также помнят весьма некрасивую историю с <a href="https://lily-software.com/go.php?url=www.apostrof.ru">www.apostrof.ru</a> и <a href="https://lily-software.com/go.php?url=www.apostroff.ru">www.apostroff.ru</a>).<br />
	Для начала достаточно базового набора .ru , .com и .net. Однако по мере роста популярности Вашего ресурса, конкуренты могут выкупить сходные по написанию домены и тем самым легальным способом увести у Вас часть клиентов. Поэкспериментируйте с ошибками в написании на примере крупных Интернет-ресурсов <a href="https://lily-software.com/go.php?url=www.microsoft.com">www.microsoft.com</a> и <a href="https://lily-software.com/go.php?url=www.yahoo.com">www.yahoo.com</a>. Как Вам <a href="https://lily-software.com/go.php?url=www.mikrosoft.com">www.mikrosoft.com</a> и <a href="https://lily-software.com/go.php?url=www.yaahoo.com">www.yaahoo.com</a>?<br />
	Второй вариант альтернативного домена – имена, содержащие ключевые слова Вашего бизнеса. В этом случае, кстати, Вы получаете преимущество по приоритету на некоторых поисковых машинах.<br />
	Не беспокойтесь, что много доменных имен вызовет недоумение у посетителей, рекламировать-то Вы будете только одно из них, а остальные используете для переадресации на основной домен.<br />
	Итак, если Вы уже думаете, как должно выглядеть доменного имя Вашего ресурса, сопоставьте его написание с 4 критериями:</p>
<ol><li style="text-align:justify;">
		Краткость</li>
	<li style="text-align:justify;">
		Запоминаемость</li>
	<li style="text-align:justify;">
		Наличие ключевых слов Вашего бизнеса или соответствие имени фирмы</li>
	<li style="text-align:justify;">
		Отсутствие сомнений в написании и произношении.</li>
</ol>]]></description>
			<pubDate>Wed, 07 May 2008 13:21:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/a_n_domain_name]]></link>
		</item>
		<item>
			<title>Модель веб-сайта нового поколения</title>
			<description><![CDATA[<div style="line-height:normal;text-align:right;">
	<span style="font-size:12px;">Web дизайн Астрахань, дизайн вообще<br />
	Вибираем дизайнера </span></div>
<div style="line-height:normal;">
	 </div>
<div style="line-height:normal;text-align:justify;">
	<span style="font-size:9pt;color:#000000;">Рано или поздно любая компания сталкивается с вопросом поиска <strong>грамотного специалиста</strong>, который должен разработать (придумать, нарисовать) фирменный стиль, сайт, буклет и т.д., одним словом, — дизайнера.<br /><br />
	Держать <strong>дизайнера в штате </strong>неудобно по нескольким объективным причинам:</span></div>
<ul style="margin-top:0cm;" type="disc"><li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">прежде всего, как часто бывает, объем выполняемой работы не соответствует требуемому уровню оклада. Основной костяк "средней руки" специалистов держит свою планку на определенном уровне и опускать ее не собирается. Не буду приводить конкретные цифры, но они отнюдь не маленькие для компании со штатом 20—30 человек. Если ваш бизнес не связан напрямую с индустрией, требующей полной отдачи от дизайнера, то по итогам года за сумму около 10 тысяч условных единиц вы получаете "человека под рукой", видимость кропотливой работы, огромный интернет-трафик и… реальную занятость человека около 10-ти часов в неделю. Кроме того, необходимо дать человеку рабочее место, обеспечить его техникой и прочими административными благами;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">далее идет вопрос квалификации специалиста. Назваться дизайнером, веб-мастером и системным администратором сейчас могут четверо из пяти студентов 2-го курса любого ВУЗа. Едва человек научился увеличивать и растягивать картинку, накладывать пару фильтров в Photoshop, он начинает называть себя дизайнером. Подобного рода сотрудники ставят низшую планку по заработной плате, чем нередко подкупают работодателя, да и по манере держаться на собеседовании они не сильно отличаются от хороших специалистов, профессия ведь творческая. Результат деятельности подобных сотрудников зачастую можно встретить на выставках в виде синих буклетов с текстом красного цвета и фотографиям, заставляющими задуматься о здоровье собственных глаз. Но, конечно, не стоит сгущать краски — не все дизайнеры работают спустя рукава. Прежде всего, нанимая творческого сотрудника в штат, нужно четко понимать, какие именно задачи будут поставлены перед ним и в каком объеме;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">довольно часто случается так, что, приходя на собеседование, дизайнер показывает вам свое портфолио, макеты работы, готовые образцы, рисунки и т.д. Просматривая работы, работодатель приходит в полный восторг и под впечатлением увиденного часто принимает положительное решение буквально прямо за столом переговоров. Проблема тут в том, что редко кто, если только это не большая компания со своей службой безопасности, будет проверять эти работы на принадлежность именно этому автору. Нужно сделать несколько десятков звонков, разыскать массу людей, вступить в затяжной обмен е-мейлами и факсами с изображениями. Обычно ничего этого не происходит, если ложь сильно не бросается в глаза и не упомянуты мировые бренды. Работодатель верит на слово, а дизайнер показывает чужие работы, твердо уверовав в то, что "я могу не хуже". В результате получается "почти то же самое", а ответом на претензии является "я так вижу", "я художник, а не математик" и т.д.;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">ремесло дизайнера схоже с другими профессиями еще и количественным выражением. Если дизайнер в течение нескольких лет выполнял какую-то определенную работу, связанную только со спецификой своей компании, то, возможно, ему будет трудно быстро перестроиться под новый профиль работ, особенно если они должны отличаться большим разнообразием. Можно наблюдать некий странный эффект, если внимательно смотреть на макеты, сделанные новым дизайнером, и его же макеты с прошлой работы. Они будут отличаться шрифтом, цветом и картинками, но при этом будут одинаковыми! Причина подобного явления — это "замыленные" глаза. Если специалист долго работает над одними и теми же материалами, над одной и той же темой, то при всем желании ему будет очень трудно придумать что-то принципиально новое — получается просто "штамповка" материалов. </span></li>
</ul><div style="text-align:justify;">
	<span style="font-size:9pt;color:#000000;">Вот несколько основных аргументов против зачисления дизайнера в штат. Но вопрос остается открытым — нужно выполнить работу. Так кому же ее поручить?<br /><br />
	Тут есть два пути: либо <strong>обращаться в дизайн-студию, либо искать сдельного работника</strong>.<br /><br /><strong>Дизайн-студии </strong>несут полную ответственность при работе с клиентом, они связаны договором, и в любом случае оговоренный результат вы получите, но тут, естественно, встает вопрос цены. Студия помимо дизайнеров вынуждена содержать еще массу прочих сотрудников, поэтому величина цены будет во многом зависеть от амбиций этих самых сотрудников, раскрученности бренда студии и месторасположения офиса в городе. Общается заказчик с дизайнером обычно через менеджера, и от того, насколько хорошо поймет вас менеджер, а менеджера — дизайнер, во многом будет зависеть конечный результат сотрудничества. Никто в студии не будет работать с заказчиком бесконечно, до достижения идеального во всех деталях результата, каким хочется видеть его в деталях. Обычно предлагается какой-то оплаченный лимит вариантов, исчерпав который заказчик будет вынужден платить за каждое внесенное изменение, а этот процесс как раз стремится к бесконечности. Если не брать во внимание вопрос о деньгах, то на деле у студии масса плюсов.<br /><br />
	Они тщательно подбирают свой творческий персонал — в этом вопросе они профессионалы, даже в студиях среднего уровня халтурщиков и дилетантов практически не бывает. Дизайнеры, как правило, имеют большой опыт, хорошую техническую базу, обладают знанием полиграфических нюансов (что порой может помочь сэкономить несоизмеримо большие средства, по сравнению с ценой заказа) и стараются быть в курсе тенденций мировой индустрии дизайна.<br /><br />
	Другой вариант — это поиск частного мастера, который берется делать разовые заказы.<br /><br /><strong>Частный мастер </strong>обладает практически всеми теми же плюсами, что и студийные дизайнеры.<br /><br />
	Но, подбирая подобного человека, нужно иметь некоторый навык в работе с подобным персоналом и, по крайней мере, проверить несколько контактов из представленного <strong>портфолио</strong>, поговорить с другими его заказчиками, послушать отзывы о работе.<br /><br />
	Основная опасность при работе с таким наемным работником в том, что он может просто пропасть. К сожалению, это распространенная практика. И основная неприятность состоит не в потере денег, выплаченных авансом, а в сорванных сроках, когда уже не остается времени на поиск нового человека и выполнение работы. Тут необходимо сохранять бдительность и хотя бы немного проверять человека.<br /><br />
	Итак, предположим, что мы остановились на одном из вариантов и перешли непосредственно к выполнению заказа.<br /><br />
	"Если хочешь, чтобы сделано было хорошо — сделай это сам", — известное высказывание и, к сожалению, на сто процентов справедливое. Естественно, что самому рисовать ничего не нужно, хотя если вы это умеете делать, то эскизы заказчика могут очень сильно помочь в работе.<br /><br />
	Как и в любом другом деле, чем лучше вы представляете, что именно хотите увидеть в конечном результате, тем больше вероятность качественного исполнения заказа. Именно в этот момент и происходит "стык интересов" заказчика и исполнителя.<br /><br />
	Возьмем самый простой пример — обычную цветную двустороннюю листовку.<br /><br />
	В идеальном случае заказчик должен написать развернутое техническое задание, в котором будут оговорены все нюансы расположения и содержания этой листовки, письменно зафиксированы все пожелания по исполнению. От дизайнера потребуется лишь четко и профессионально выполнить инструкцию, после чего на готовом макете совместно будут внесены окончательные штрихи, и его уже можно отправлять в печать. Это — в идеальном случае.<br /><br />
	Если же заказчик еще точно не знает, чего именно он хочет (а так бывает в большинстве случаев), начинается бесконечный диалог и поиск решения. Когда клиент не требует какой-то особенной оригинальности от своего буклета, то заказ выполняется на основе уже имеющихся образцов (почему-то обычно заказчик приводит пример конкурента), просто меняются картинки, цвет, шрифт и содержание. Тут дизайнеру тоже не очень сложно работать, т.к. он уже видит перед глазами результат и просто доводит одну из своих заготовок под нужный шаблон.<br /><br />
	И самый трагический вариант — это когда заказчик вообще не знает, чего он хочет, и при этом не может даже приблизительно сформулировать, что ему нужно. В этом случае дизайнер обычно предлагает три кардинально разных варианта макета, после чего выбирается основной, и по нему ведется доработка. При таком подходе часто возникают скандалы, где заказчик называет исполнителя "лодырем" и "халтурщиком", а исполнитель упрекает заказчика в полном отсутствии "художественного взгляда" и "понятий о красоте". Что примечательно, оба они будут правы! Просто конечный результат каждый видит по-своему, а слова для объяснения тут искать очень сложно, процесс-то творческий.<br /><br />
	Вот наши рекомендации заказчику для <strong>выбора хорошего частного дизайнера</strong>:</span></div>
<ul style="margin-top:0cm;" type="disc"><li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">попробуйте начать поиск среди своих знакомых. Поинтересуйтесь, кто в последнее время заказывал подобную работу, и спросите рекомендации. Проверенный человек, скорее всего, внезапно не пропадет;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">не останавливайтесь на одном варианте, как бы сильно вам его ни расхваливали. Просмотрите портфолио не менее трех исполнителей.<br />
		Проверьте не менее двух контактов исполнителя. Поговорите с его клиентами, поинтересуйтесь результатами работы и течением самого рабочего процесса;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">цены на услуги берутся исключительно из головы исполнителя, никаких объективных критериев тут не существует. Это один из тех случаев, где дороже не значит лучше. Используйте пространство для маневра;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">получаемый результат не находится в прямой зависимости от пола, внешнего вида и психического здоровья исполнителя. Беспокоиться скорее стоит, если к вам пришел человек в дорогом костюме;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">четко оговорите этапы и сроки работы. Если требуется много этапов, оплату по ним лучше строить по возрастающей. Например, 20%-30%-50%;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">не давайте больших авансов, насколько бы привлекательным ни казалось бы предложение. Человек может быть очень хорошим дизайнером, но может запросто и уйти в длительный запой;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">не допускайте вымогательства в форме: "Да у меня и так работы полно, на меня очередь стоит. Я еще подумаю, браться ли за ваш заказ. Давайте предоплату, тогда поговорим";</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">контролируйте работу на каждом этапе ее выполнения, старайтесь не перепоручать это другим сотрудникам;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">крайне важно подготовить хорошее техническое задание, не упуская мелочей. Конечный продукт сотрудничества должен учитывать все необходимые маркетинговые ходы, правильно расставлять рекламные акценты, соблюдать приоритет подачи информации. Исполнитель этого всего учесть не может, он лишь создает "красивую обертку" и будет всеми силами стремиться добиться хорошего внешнего вида, совершенно не осознавая, что случайно может похоронить в дебрях дизайна ваше лучшее рекламное предложение.</span></li>
</ul><div style="text-align:justify;">
	<span style="font-size:9pt;color:#000000;">При работе с дизайнером вы услышите массу новых технических терминов, и поначалу будет очень сложно понять, почему та или иная фотография не может быть куда-то вставлена, почему нельзя что-то расположить именно так, как вам хочется, а все, что было синим, нельзя просто поменять на зеленый.<br /><br />
	Не поленитесь изучить основы полиграфии. Это не отнимет много времени, но позволит разговаривать с исполнителем на "одной волне" и избавит от непонимания технических нюансов в совместной работе. К тому же станет немного понятней, из чего складывается цена, за что именно вы будете платить. А знания основ печати будут скорей занимательными, нежели напомнят учебник по "сопромату".</span></div>
<div>
	 </div>
<div>
	<em><span style="font-size:11px;"><span style="color:#000000;">Дмитрий Агутин</span></span></em></div>
<div>
	<em><span style="font-size:11px;"><span style="color:#000000;">Источник:</span></span></em><span style="font-size:9pt;color:#000000;"><a href="https://lily-software.com/go.php?url=lab.advertology.ru/"><em><span style="font-size:11px;"><font color="#800080">lab.advertology.ru</font></span></em></a></span></div>
]]></description>
			<pubDate>Wed, 07 May 2008 13:16:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/a_n_site_new_generation]]></link>
		</item>
		<item>
			<title>Как выбрать дизайнера и получить нужный результат?</title>
			<description><![CDATA[<div style="line-height:normal;text-align:right;">
	<span style="font-size:12px;">Web дизайн Астрахань, дизайн вообще<br />
	Вибираем дизайнера </span></div>
<div style="line-height:normal;">
	 </div>
<div style="line-height:normal;text-align:justify;">
	<span style="font-size:9pt;color:#000000;">Рано или поздно любая компания сталкивается с вопросом поиска <strong>грамотного специалиста</strong>, который должен разработать (придумать, нарисовать) фирменный стиль, сайт, буклет и т.д., одним словом, — дизайнера.<br /><br />
	Держать <strong>дизайнера в штате </strong>неудобно по нескольким объективным причинам:</span></div>
<ul style="margin-top:0cm;" type="disc"><li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">прежде всего, как часто бывает, объем выполняемой работы не соответствует требуемому уровню оклада. Основной костяк "средней руки" специалистов держит свою планку на определенном уровне и опускать ее не собирается. Не буду приводить конкретные цифры, но они отнюдь не маленькие для компании со штатом 20—30 человек. Если ваш бизнес не связан напрямую с индустрией, требующей полной отдачи от дизайнера, то по итогам года за сумму около 10 тысяч условных единиц вы получаете "человека под рукой", видимость кропотливой работы, огромный интернет-трафик и… реальную занятость человека около 10-ти часов в неделю. Кроме того, необходимо дать человеку рабочее место, обеспечить его техникой и прочими административными благами;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">далее идет вопрос квалификации специалиста. Назваться дизайнером, веб-мастером и системным администратором сейчас могут четверо из пяти студентов 2-го курса любого ВУЗа. Едва человек научился увеличивать и растягивать картинку, накладывать пару фильтров в Photoshop, он начинает называть себя дизайнером. Подобного рода сотрудники ставят низшую планку по заработной плате, чем нередко подкупают работодателя, да и по манере держаться на собеседовании они не сильно отличаются от хороших специалистов, профессия ведь творческая. Результат деятельности подобных сотрудников зачастую можно встретить на выставках в виде синих буклетов с текстом красного цвета и фотографиям, заставляющими задуматься о здоровье собственных глаз. Но, конечно, не стоит сгущать краски — не все дизайнеры работают спустя рукава. Прежде всего, нанимая творческого сотрудника в штат, нужно четко понимать, какие именно задачи будут поставлены перед ним и в каком объеме;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">довольно часто случается так, что, приходя на собеседование, дизайнер показывает вам свое портфолио, макеты работы, готовые образцы, рисунки и т.д. Просматривая работы, работодатель приходит в полный восторг и под впечатлением увиденного часто принимает положительное решение буквально прямо за столом переговоров. Проблема тут в том, что редко кто, если только это не большая компания со своей службой безопасности, будет проверять эти работы на принадлежность именно этому автору. Нужно сделать несколько десятков звонков, разыскать массу людей, вступить в затяжной обмен е-мейлами и факсами с изображениями. Обычно ничего этого не происходит, если ложь сильно не бросается в глаза и не упомянуты мировые бренды. Работодатель верит на слово, а дизайнер показывает чужие работы, твердо уверовав в то, что "я могу не хуже". В результате получается "почти то же самое", а ответом на претензии является "я так вижу", "я художник, а не математик" и т.д.;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">ремесло дизайнера схоже с другими профессиями еще и количественным выражением. Если дизайнер в течение нескольких лет выполнял какую-то определенную работу, связанную только со спецификой своей компании, то, возможно, ему будет трудно быстро перестроиться под новый профиль работ, особенно если они должны отличаться большим разнообразием. Можно наблюдать некий странный эффект, если внимательно смотреть на макеты, сделанные новым дизайнером, и его же макеты с прошлой работы. Они будут отличаться шрифтом, цветом и картинками, но при этом будут одинаковыми! Причина подобного явления — это "замыленные" глаза. Если специалист долго работает над одними и теми же материалами, над одной и той же темой, то при всем желании ему будет очень трудно придумать что-то принципиально новое — получается просто "штамповка" материалов. </span></li>
</ul><div style="text-align:justify;">
	<span style="font-size:9pt;color:#000000;">Вот несколько основных аргументов против зачисления дизайнера в штат. Но вопрос остается открытым — нужно выполнить работу. Так кому же ее поручить?<br /><br />
	Тут есть два пути: либо <strong>обращаться в дизайн-студию, либо искать сдельного работника</strong>.<br /><br /><strong>Дизайн-студии </strong>несут полную ответственность при работе с клиентом, они связаны договором, и в любом случае оговоренный результат вы получите, но тут, естественно, встает вопрос цены. Студия помимо дизайнеров вынуждена содержать еще массу прочих сотрудников, поэтому величина цены будет во многом зависеть от амбиций этих самых сотрудников, раскрученности бренда студии и месторасположения офиса в городе. Общается заказчик с дизайнером обычно через менеджера, и от того, насколько хорошо поймет вас менеджер, а менеджера — дизайнер, во многом будет зависеть конечный результат сотрудничества. Никто в студии не будет работать с заказчиком бесконечно, до достижения идеального во всех деталях результата, каким хочется видеть его в деталях. Обычно предлагается какой-то оплаченный лимит вариантов, исчерпав который заказчик будет вынужден платить за каждое внесенное изменение, а этот процесс как раз стремится к бесконечности. Если не брать во внимание вопрос о деньгах, то на деле у студии масса плюсов.<br /><br />
	Они тщательно подбирают свой творческий персонал — в этом вопросе они профессионалы, даже в студиях среднего уровня халтурщиков и дилетантов практически не бывает. Дизайнеры, как правило, имеют большой опыт, хорошую техническую базу, обладают знанием полиграфических нюансов (что порой может помочь сэкономить несоизмеримо большие средства, по сравнению с ценой заказа) и стараются быть в курсе тенденций мировой индустрии дизайна.<br /><br />
	Другой вариант — это поиск частного мастера, который берется делать разовые заказы.<br /><br /><strong>Частный мастер </strong>обладает практически всеми теми же плюсами, что и студийные дизайнеры.<br /><br />
	Но, подбирая подобного человека, нужно иметь некоторый навык в работе с подобным персоналом и, по крайней мере, проверить несколько контактов из представленного <strong>портфолио</strong>, поговорить с другими его заказчиками, послушать отзывы о работе.<br /><br />
	Основная опасность при работе с таким наемным работником в том, что он может просто пропасть. К сожалению, это распространенная практика. И основная неприятность состоит не в потере денег, выплаченных авансом, а в сорванных сроках, когда уже не остается времени на поиск нового человека и выполнение работы. Тут необходимо сохранять бдительность и хотя бы немного проверять человека.<br /><br />
	Итак, предположим, что мы остановились на одном из вариантов и перешли непосредственно к выполнению заказа.<br /><br />
	"Если хочешь, чтобы сделано было хорошо — сделай это сам", — известное высказывание и, к сожалению, на сто процентов справедливое. Естественно, что самому рисовать ничего не нужно, хотя если вы это умеете делать, то эскизы заказчика могут очень сильно помочь в работе.<br /><br />
	Как и в любом другом деле, чем лучше вы представляете, что именно хотите увидеть в конечном результате, тем больше вероятность качественного исполнения заказа. Именно в этот момент и происходит "стык интересов" заказчика и исполнителя.<br /><br />
	Возьмем самый простой пример — обычную цветную двустороннюю листовку.<br /><br />
	В идеальном случае заказчик должен написать развернутое техническое задание, в котором будут оговорены все нюансы расположения и содержания этой листовки, письменно зафиксированы все пожелания по исполнению. От дизайнера потребуется лишь четко и профессионально выполнить инструкцию, после чего на готовом макете совместно будут внесены окончательные штрихи, и его уже можно отправлять в печать. Это — в идеальном случае.<br /><br />
	Если же заказчик еще точно не знает, чего именно он хочет (а так бывает в большинстве случаев), начинается бесконечный диалог и поиск решения. Когда клиент не требует какой-то особенной оригинальности от своего буклета, то заказ выполняется на основе уже имеющихся образцов (почему-то обычно заказчик приводит пример конкурента), просто меняются картинки, цвет, шрифт и содержание. Тут дизайнеру тоже не очень сложно работать, т.к. он уже видит перед глазами результат и просто доводит одну из своих заготовок под нужный шаблон.<br /><br />
	И самый трагический вариант — это когда заказчик вообще не знает, чего он хочет, и при этом не может даже приблизительно сформулировать, что ему нужно. В этом случае дизайнер обычно предлагает три кардинально разных варианта макета, после чего выбирается основной, и по нему ведется доработка. При таком подходе часто возникают скандалы, где заказчик называет исполнителя "лодырем" и "халтурщиком", а исполнитель упрекает заказчика в полном отсутствии "художественного взгляда" и "понятий о красоте". Что примечательно, оба они будут правы! Просто конечный результат каждый видит по-своему, а слова для объяснения тут искать очень сложно, процесс-то творческий.<br /><br />
	Вот наши рекомендации заказчику для <strong>выбора хорошего частного дизайнера</strong>:</span></div>
<ul style="margin-top:0cm;" type="disc"><li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">попробуйте начать поиск среди своих знакомых. Поинтересуйтесь, кто в последнее время заказывал подобную работу, и спросите рекомендации. Проверенный человек, скорее всего, внезапно не пропадет;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">не останавливайтесь на одном варианте, как бы сильно вам его ни расхваливали. Просмотрите портфолио не менее трех исполнителей.<br />
		Проверьте не менее двух контактов исполнителя. Поговорите с его клиентами, поинтересуйтесь результатами работы и течением самого рабочего процесса;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">цены на услуги берутся исключительно из головы исполнителя, никаких объективных критериев тут не существует. Это один из тех случаев, где дороже не значит лучше. Используйте пространство для маневра;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">получаемый результат не находится в прямой зависимости от пола, внешнего вида и психического здоровья исполнителя. Беспокоиться скорее стоит, если к вам пришел человек в дорогом костюме;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">четко оговорите этапы и сроки работы. Если требуется много этапов, оплату по ним лучше строить по возрастающей. Например, 20%-30%-50%;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">не давайте больших авансов, насколько бы привлекательным ни казалось бы предложение. Человек может быть очень хорошим дизайнером, но может запросто и уйти в длительный запой;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">не допускайте вымогательства в форме: "Да у меня и так работы полно, на меня очередь стоит. Я еще подумаю, браться ли за ваш заказ. Давайте предоплату, тогда поговорим";</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">контролируйте работу на каждом этапе ее выполнения, старайтесь не перепоручать это другим сотрудникам;</span></li>
	<li style="color:#000000;line-height:normal;text-align:justify;">
		<span style="font-size:9pt;">крайне важно подготовить хорошее техническое задание, не упуская мелочей. Конечный продукт сотрудничества должен учитывать все необходимые маркетинговые ходы, правильно расставлять рекламные акценты, соблюдать приоритет подачи информации. Исполнитель этого всего учесть не может, он лишь создает "красивую обертку" и будет всеми силами стремиться добиться хорошего внешнего вида, совершенно не осознавая, что случайно может похоронить в дебрях дизайна ваше лучшее рекламное предложение.</span></li>
</ul><div style="text-align:justify;">
	<span style="font-size:9pt;color:#000000;">При работе с дизайнером вы услышите массу новых технических терминов, и поначалу будет очень сложно понять, почему та или иная фотография не может быть куда-то вставлена, почему нельзя что-то расположить именно так, как вам хочется, а все, что было синим, нельзя просто поменять на зеленый.<br /><br />
	Не поленитесь изучить основы полиграфии. Это не отнимет много времени, но позволит разговаривать с исполнителем на "одной волне" и избавит от непонимания технических нюансов в совместной работе. К тому же станет немного понятней, из чего складывается цена, за что именно вы будете платить. А знания основ печати будут скорей занимательными, нежели напомнят учебник по "сопромату".</span></div>
<div>
	 </div>
<div>
	<span style="font-size:9pt;color:#000000;">Дмитрий Агутин</span></div>
<div>
	<span style="font-size:9pt;color:#000000;">Источник:<a href="https://lily-software.com/go.php?url=lab.advertology.ru/"><span style="font-size:12px;"><font color="#800080">lab.advertology.ru</font></span></a></span></div>
]]></description>
			<pubDate>Wed, 07 May 2008 12:00:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/articles/a_n_select_designer]]></link>
		</item>
	</channel>
</rss>