четверг, 2 марта 2017 г.

Простые решения сложных задач от Антона Шнайдера


Антон Шнайдер, бывший ведущий дизайнер студии Лебедева, рассказывает и показывает примеры так называемого читерства и элегантности — решения сложных задач простыми способами. Поначалу некоторые из них покажутся совсем уж шуточными, но в этом как раз и простота :)

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

http://seoded.blogspot.ru/2017/03/blog-post_2.html


Склонение существительных с цифрами

Склонение существительных с цифрами

http://www.seoded.ru/webmaster/sozdanie-saita/sklonenie-suschestvitelnykh-s-ciframi.html



Как мы придумывали и организовывали 404fest

В один прекрасный летний день Диме пришла замечательная идея собрать самарских веб-разработчиков на ОпенЭир. Сказано – сделано, в загородном парке собралось 60 человек. Так в далеком 2007 было положено начало преодоления феодальной раздробленности между веб-студиями Самары.

В следующем году мы основательно подошли к предстоящему мероприятию – придумали название «Фестиваль 404» и сделали сайт. Появилась программа, как на больших конференциях, но наша тяга к неформальному общению определила формат проведения. Это должен быть фестиваль, а не скучная конференция! Так было положено начало ежегодному 404fest. Гостиница Азимут в своих стенах вместила 250 веб-разработчиков из Самары, Тольятти, Ульяновска и других городов. Над организацией фестиваля в течение месяца трудилась уже целая команда сотрудников Доминиона. Особенно хочется выделить и еще раз поблагодарить Диму Фитискина, Катю Азарову, Таню Симдянову, Алексея Литвиненко и Максима Старожилова.

Вдохновленные успехами первого 404 феста, мы принялись за второй. Хорошее мероприятие зависит от участников и докладов – именно этому мы уделяли главное внимание. Работа над фестивалям началась еще в мае – запустили сайт с онлайн конференциями, завели твиттер. Месяц моральной подготовки и 3 месяца плотных работ сопровождались еженедельными онлайн-конференциями с известными веб-разработчиками. Длинные вечера и бессонные ночи не прошли даром. На новом сайте стали собираться участники и доклады. За один месяц зарегистрировалось 900 человек, а заявку успели подать 666.

В фестивале приняли участие такие легендарные личности, как Сергей Чикуёнок, Петр Диденко, Алексей Пелевин, Платон Днепровский, Алексей Копылов, Никита Филиппов, Дамир Халилов и Мария Подоляк.

Как нельзя кстати оказалась поддержка ребят из Турбомилка. Спасибо!

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


среда, 1 марта 2017 г.

Как нарисовать цветную гравюру в «Photoshop»

    Делаем эскиз рыси карандашом (по клику — картинка откроется в полный размер):

как нарисовать рысь в фотошопе

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



вторник, 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 бита.

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

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