вторник, 28 февраля 2017 г.

Бесплатные обои для iPhone

Однажды Дима Фитискин попросил меня нарисовать какие-нибудь красочные обои для своего iPhone. В голову пришла замечательная идея оформления. И вот теперь у тебя тоже есть возможность посмотреть и скачать эти обои.






понедельник, 27 февраля 2017 г.

Optiweb vs. Netcat

На конференции Сайт-2009 Дмитрий Васильев подарил Диме Фитискину коробочную версию небезызвестной CMS — Netcat. У меня, как у молодого и амбициозного технолога, возникло непреодолимое желание попробовать ее в деле, а заодно сравнить с нашей, студийной CMS — Optiweb.

О соперниках

Netcat, думаю, не нуждается в представлении. Это одна из наиболее популярных на сегодняшний день система управления сайтами. 11.5% сайтов рунета, по версии CMS Magazine используют Netcat.

Optiweb — неизвестная система, разработанная в стенах студии еще в 2003 году, и с тех пор ядро системы практически не изменялось.

Интерфейс

Netcat встретил меня приятным интерфейсом. Простым и понятным. Интерфейс для пользователя. Некоторые моменты, конечно, на большом экране смотрятся ущербно, например таблицы в базовых настройках системы, но в целом зачет. Особенно порадовало наличие дрэг-н-дроп в редактировании дерева.

В Optiweb не все так гладко. Верстка хромает, задний фон немного отвлекает внимание. В принципе, к этому быстро привыкаешь, но первое впечатление складывается не самое лучшее. Но если открыть админку в IE, то там Optiweb выглядит вполне нормально (парадокс).


Netcat выигрывает в плане интерфейса. Потянет, пожалуй, на твердую четверку. Отпугивает огромное количество бесполезных наворотов, типа встроенного php/html редактора. Зачем встраивать в CMS редактор с подсветкой кода? Ответ в следующем параграфе.

Базовая интеграция

Включает установку всех макетов дизайна на CMS и всех навигационных элементов (меню, хлебные крошки). Интеграцию я делал на примере корпоративного сайта компании Квадрат.



Макетирование

Вот тут случилось самое большое разочарование в Netcat. Я по привычке полез искать файл макета, но не нашел его. Пришлось открывать руководство для разработчика, из которого я понимаю, что, оказывается, никаких файлов макета нет вовсе. Все данные (как выяснилось позже, не только данные макета) хранятся в базе. Все редактирование происходит через небольшое окошко формы. Фу, плохая киса! Я опечалился и закрыл Эклипс. На мой взгляд — это ужасная, грубая ошибка — лишать разработчика возможности «играть на родном поле». Я постоянно был вынужден копировать код из поля в редактор, жать кнопку сохранить. Это отнимало у меня массу времени. Поначалу я даже хотел заплакать и прекратить дальнейшую работу с движком.

Проблем с назначением макета для главной и вторичных страниц не возникло, тут без нареканий.

У Optiweb проблемы излишнего использования базы нет. Файл макета загружается на сервер, выбирается в админке, и все. Удобное назначение использования макета для страниц сайта: выбирается макет для главной страницы, и для всех вторичных.

Структура формирования макета у подопытных движков разная. В Netcat он разбивается на 2 части: Хедер и Футер, а все что посередине — блок контента. Это знакомо тем, кто работал с Битриксом. Optiweb поступает иначе: шаблон не разбивается, а в него помещаются блоки. То есть прямо в файле макета вставляется конструкция вида:


< !--#block src='blockname'-->


Парсер распознает этот комментарий как блок. Чтобы создать поле контента в нужном месте на странице пишем:


< !--#block src='content'-->


И создаем в разделе «блоки и шаблоны» раздел «content». Преимущество этого метода в том, что если допускаешь ошибку в вызове блока, то он отобразиться как простой комментарий. Тут стоит отметить, что блоки бывают нескольких типов: статический (текстовый блок), шаблоный (вывод данных по заданному шаблону), и динамический (блок вывода модулей, например новостей, каталога или навигации). Content — обычный текстовый блок.

Установка навигации

С навигацией в Netcat ничего сложного. Вызываем блок меню в макете:


s_browse_level(0,$browse_sub[0])


и в шаблоне для вывода навигации работаем вот с такой конструкцией:


$browse_sub[0]['prefix'] = "<ul>";
$browse_sub[0]['suffix'] = "</ul>";
$browse_sub[0]['active'] = "<li><span class='selected'><a href=''>%NAME</a></span>".s_browse_level(1, $browse_sub[1])."</li>";
$browse_sub[0]['active_link'] = "<li><span class='selected'><a>%NAME</a></span>".s_browse_level(1, $browse_sub[1])."</li>";
$browse_sub[0]['unactive'] = "<li><span><a href='%URL'>%NAME</a></span></li>";
$browse_sub[0]['divider'] = "";

Здесь все, пожалуй, понятно. Навигация представляет собой список. Prefix — начало списка, suffix — окончание. Active — параметры родителя, когда активен потомок, ".s_browse_level(1, $browse_sub[1])." вывод навигации второго уровня. Аctive_link — параметры активного пункта, unactive — неактивного. Divider — разделитель, он мне не понадобился.

Аналогичным образом настраивается меню второго и выше уровней уровней. Без ложки дёгтя не получится. В Netcat нельзя настраивать несколько типов навигации (вернее можно, но для этого надо схитрить). А на сайте есть 2 разных навигации: главная, и каталог домов. Чтобы сделать 2 навигации в Netcat: мы создаем в дереве дополнительный пункт меню, скрываем его на сайте, и вызываем в шаблоне:


s_browse_sub(E,$browse_sub[2])

E — это номер элемента в дереве, который использует шаблон $browse_sub[2]. Для главной навигации первое число — 0, потому что отображаются все разделы сайта. Недостаток этого метода в том, что скрытый пункт меню отобразится в хлебных крошках, что нежелательно. В Optiweb можно создавать любое количество навигаций, и применять их к любому пункту в дереве. А настройка пунктов происходит аналогичным образом:


<!--#list src='root'-->
  <div id="nav">
  <ul>
  <!--#elem-->
    <!--#cond-->
      return $_ds->getParam('is_cur_active');
    <!--#endcond-->
    <li> <span class="selected"><a><!--#slot src='fullname'--></a></span><!--#slot link='suboptions'--></li>
  <!--#endelem-->
  <!--#elem-->
    <!--#cond-->
      return $_ds->getParam('is_active');
    <!--#endcond-->
    <li><span class="selected"><a href="<!--#slot src='url'-->"><!--#slot src='fullname'--></a></span><!--#slot link='suboptions'--></li>
  <!--#endelem-->
  <!--#elem-->
    <li><a href="<!--#slot src='url'-->"><!--#slot src='fullname'--></a></li>
  <!--#endelem-->
  </ul>
  </div>
<!--#endlist-->

Несколько громоздкая конструкция, но в целом понятная. List — это список, все, что находится внутри list, перед, или после elem — это аналог суффикса и префикса в Netcat. Elem — это элемент списка. Внутри <!--#cond--> — условие. Код внутри elem выполнится, если активен потомок элемент ('is_cur_active' -аналог Active в Netcat), если нет, то переходим к следующему элементу. Is_active — выполнится, если активен сам элемент <!--#slot link='suboptions'--> — второй уровень меню. Если ни одно из условий не выполняется, то выводится последний элемент списка, не имеющий условия. На мой взгляд, в Netcat таки удобнее реализован вывод меню.

Установка модулей и компонентов

Компоненты в Netcat ставить просто. При редактировании раздела выбираем список используемых компонентов, и вызываем нужный нам компонент на страницу, например Новости. Компонентов можно вызывать несколько, но все они оказываются в разделе контент. Чтобы вывести вне контента, и заодно сделать выборку 2-х последних новостей на главной странице, пишем в шаблоне:


s_list_class(№C,№R,"recNum=2")

Где №С — номер компонента, а №R — номер раздела.

Дальше заходим в раздел компонентов, и настраиваем шаблон как нам нужно. Тут, конечно, хорошо бы иметь представление хотя бы о синтаксисе PHP, потому что не экранированные кавычки (например в названии классов) приводят к ошибке.

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


<tr>
 <td>Площадь застройки m<sup>2</sup></td>
 <td>".opt_case( $f_sqr , '$f_sqr', "нет"; )."</td>
</tr>

И так для всех элементов, которые нам нужны. opt_case — Netcatовская функция условия. Буквально, если $f_sqr — существует, и не ноль, то выводить $f_sqr, иначе выводить «нет».

В Оптивебе задача вывода полей ложится на хрупкие плечи программиста. Технологу всего то и остается, что показать где быдет выводиться модуль, и настроить шаблон. Выглядит шаблон так же, как шаблон навигации, то есть имеет струкртуру list-elem-cond. List для вывода «Параметров дома» такой:


<!--#list src='item.paramList'-->
  <h3>Параметры дома</h3>
  <table>
  <tbody>
  <!--#elem-->
    <!--#cond-->
      return $elem->get('list.key') % 2 == 0;
    <!--#endcond-->
    <tr class="odd">
      <td><!--#slot src='name'--></td>
      <td><!--#slot src='value'--></td>
    </tr>
  <!--#endelem-->
  <!--#elem-->
    <tr>
      <td><!--#slot src='name'--></td>
      <td><!--#slot src='value'--></td>
    </tr>
  <!--#endelem-->
  </tbody>
  </table>
<!--#endlist-->

Красим табличку «зеброй»:

return $elem->get('list.key') % 2 == 0;

Берем номер эмемента, если остаток от деления на 2 = 0, то выводим код внутри <!--#elem-->, если не подходит, то переходит к следующему элементу. <!--#slot src='value'--> — аналог переменной (например: $f_sqr в Netcat), задается при наполнении внутри CMS.

Вместо эпилога

Сравнивать эти две системы не так просто, как кажется. Тут все как с китайцами. Они, конечно похожи, но на самом деле разные. Оптивеб — это ниндзя. Он чотко и быстро справляется с задачей. Технологу нужно приложить минимум усилий, соответственно затратив меньше времени. Netcat — супер-робот-убийца-разрушитель, обвешанный такой нереальной кучей примочек (например встроенный редактор с подсветкой кода прям в форме, или автоматический «экранирователь» спецсимволов), что пока он движется до цели — та уже постарела и умерла сама. Но Netcat более дружелюбен пользователю, а это позволит сократить время на наполнение сайта, что немаловажно.

The end


воскресенье, 26 февраля 2017 г.

Favicon

Случайно взбрела мысль подсчитать количество всех возможных иконок, тех что можно увидеть рядом с адресом сайта почти во всех браузерах, размер коих 16 на 16 точек, глубина цвета 24 бита.

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

Их наверное даже можно сгенерировать, но не хватит жизни, чтобы все просмотреть, хотя можно это количество изрядно сократить, перебирая не все оттенки цветов.


суббота, 25 февраля 2017 г.

Что влияет на стоимость сайта?

У бизнесмена, который решил сделать сайт своей фирмы, после обращения в десяток веб-студий резонно встаёт вопрос «Почему цены на мой будущий сайт у разных разработчиков отличаются в несколько раз?».

Попробую объяснить, почему это происходит. Стоимость сайта зависит от...

  1. Планируемой нормы прибыли. Одному хватит 0% (то есть он будет работать по стоимости своего рабочего часа), а у кого-то она больше.
  2. Организационно-правовой формы подрядчика. У фрилансера при прочих равных условиях цена будет меньше, чем у ООО или ЗАО. В последнем случае надо учитывать налоги на прибыль (самое простое 6% от суммы заказа), зарплатные налоги, аренду офиса, амортизацию рабочего места, хоз. расходы и прочее.
  3. Организационной структуры заказчика. Разработка сайта для фирмы, где всё согласуется только с директором, дешевле, чем для холдинга, где каждую запятую надо согласовать в нескольких местах.
  4. Степени проработанности ТЗ. Чем оно подробнее, тем лучше. Любой раздел сайта, например форум, новости, форму заказа, каталог товаров можно сделать абсолютно по-разному.
  5. Количества этапов разработки сайта. Полный цикл разработки сайта может включать в себя сбор информации, аналитику, разработку прототипа, разработку эскизов дизайна, дизайн, программирование, вёрстку шаблонов, наполнение информацией, написание текстов, внутреннюю seo-оптимизацию, корректорскую правку, юзабилити-тестирование, нагрузочное тестирование, документирование, обучение сотрудников заказчика. Пропуск различных этапов обычно ведёт к уменьшению цены и качества.
  6. Профессионализма подрядчика. Чем он выше, тем дороже стоимость его работ. Он опытнее теоретически и практически, он знает все подводные камни.
  7. Планируемой суточной и пиковой нагрузки. Сайт для 100 посетителей в день и для 10 000 — это совсем не одно и то же.
  8. Сроков. Сделать сайт за 2 недели, потому что у нас уже реклама оплачена, а предыдущие подрядчики подвели, — это дороже, чем за 2 месяца.
  9. Степени загруженности подрядчика. Если все ресурсы заняты, то скорее всего цена на сайт будет больше. Надо привлекать фрилансеров или передавать работу на субподряд, а это дополнительные издержки.
  10. Степени проработки мелких деталей. Можно проставлять title на ссылки и alt на картинки, типографировать текст, делать 301 редирект с www на без www, уникальные заголовки, robotx.txt и sitemap.xml и так далее. А можно этого не делать, тогда сайт будет дешевле. И, конечно, хуже.
  11. Региона. Один и тот же сайт в Москве будет стоить дороже, чем в Новосибирске.
  12. Бренда. Сайт от Лебедева дороже, чем от малоизвестного разработчика с таким же качеством работы.


пятница, 24 февраля 2017 г.

Как вспомнить забытую песню?

Как вспомнить забытую песню?

    Делюсь эмоциями :)

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

    Одно нажатие на экран, дал программе секунд 10-15 послушать музыку и – вуаля! – на экране не только название песни и исполнитель, но ещё и обложка альбома. Так просто :-)



четверг, 23 февраля 2017 г.

Техническое задание

Добрый вечер, мои дорогие! Сегодня мы поговорим об управлении проектами, а именно — о технических заданиях. Что такое техническое задание, наверное, знают все. А вот каким оно должно быть на самом деле, об этом в нашей программе.

Давным-давно, будучи молодым, я думал, что у техзадания есть какой-то свой определенный шаблон, некий ГОСТ. Я долго его искал, но безуспешно. Перерыл все ТЗ всех компаний, что мне попадались, и нигде не было идеала. Остался даже такой осадочек на время, что ТЗ — это просто «отписка», мини-этап, который нужно сделать, чтобы скорее начать проект. У веб-студии в голове уже сформирована модель будущего сайта, зачем ее описывать — тратить время! Да и кто у нас тут специалист эпистолярного жанра, многие и запятых-то не расставят.

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

«Идеологическое». Техническое задание, составленное скорее как «отписка». Содержит общие фразы. Конкретика отсутствует. В быту называется «подписать и забыть».
«Логическое». Хорошо составленное ТЗ, прописаны многие моменты. Дана общая логика работы проекта и его частей. Вполне подходит для разработки сайта и объяснений с Заказчиком.
«Физическое». Максимально полное, прописана логика, структуры баз, схем обмена данными и пр. Имея под рукой такое ТЗ, сделать сайт может уже даже школьник.
Зачем вообще нужно ТЗ, спросим себя? Все просто! ТЗ является неотъемлимым приложением к договору на разработку проекта, и именно в ТЗ определен объем работ. Если завтра Заказчик на этапе создания сайта придет к вам и скажет, что нужно добавить еще пару разделов, — вы тыкаете его в ТЗ и говорите: «А вот и нет!» Без смеха. Приходят и говорят. И если в ТЗ четко не прописано, вы попадаете на дополнительный объем работ в том же старом бюджете и сроках.

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

И другой пример. Почти месяц мы составляли техзадание для еще одного нашего клиента. Проведено несколько встреч, проработаны все моменты. В итоге ТЗ разместилось на 40 страницах. И это, мне кажется, еще не полный его вариант. Если бы позволяли сроки, можно было раскрыть его еще в полтора раза. Но сроки не позволяют. А они, кстати, таковы: ТЗ — один месяц, разработка проекта — полтора месяца. То есть этап разработки техзадания по длительности почти равен этапу разработки проекта. Way to go.

Как быть, ведь ТЗ обычно пишется после предварительной оценки проекта и сроков? Выход один — выделять составление техзадания в отдельный этап, который и оплачивается отдельно. Если Заказчика не устроит ваша оценка, то с этим ТЗ он сможет прийти в другую компанию и попробовать разработать проект у нее.

А тенденции таковы. Уже есть на рынке Новосибирска компании, занимающиеся составлением технических заданий и выдачей рекомендаций по выбору Разработчика. Да и сами компании готовы предложить такую услугу. Например, опять же, мы осуществляем такую деятельность. Не всегда же кодить и рисовать, нужно и проектированием заниматься.

Всем отличной погоды, увидимся на пляже!


среда, 22 февраля 2017 г.

Как браузер выбирает кодировку?

Сначала он смотрит в HTTP заголовках на Content-Type. Только в случае отсутствия упоминаний о charset, смотрит на тэг в HTML.