Павел Новицкий

Нерегулярные заметки

Время собирать камни

14 октября 2014, 1:47

Уже больше года что-то здесь вяло пописываю. Пришло время время подбить какую-то статистику.

Сайту 470 дней, 27 записей, т.е. 1 пост каждые 17,4 дней — вот такой я ленивый :-) Люди книги быстрее пишут. И 2 комментария ещё, да. Успех, я считаю. Захлопываем крышку ноута и уходим...

А потом залез-таки в аналитику. Больше года прошло, какая-никакая статистика собралась. Посмотрел и малость хм... удивился — ежедневно с яндекса приходит по 30-40 человек. В запросах определились 2 лидера — разные вариации на тему «что значит дьявол кроется в деталях?» и «как что-нибудь там сделать с купонами в Magento».

Я так понимаю, как-то весь трафик привлекают старые «Дьявол кроется в деталях» и «Отчёт о купонах в Magento».

С дьяволом пока ничего сделать не получится — не хочется пока писать пространный текст с цитатами, аллюзиями и метафорами (я ж ленивый, не забываем). А разобраться что конткретно там искали про купоны достаточно легко и не напряжно. Так что на горизонте понятно какие статьи, разбавленные всякой дребеденью.

Ещё один интересный момент — RSS. Открытия в ридерах радуют — 35-50 на статью. А вот GA и Метрика расходятся в показаниях переходов из ридеров 15 против 12 на статью (да, я и ga, и метрику установил поиграться).

Кстати, надо будет позже проверить не перебьёт ли эта заметка по количеству упоминаний дьявола прошлую (алярм! SEO-зараза на горизонте!).

Вконтакте
Отправить

Работает

16 сентября 2014, 15:15

Хорошая штука современный телефон. Звонки, фотографии, видео, чаты, игры, интернет — всё в одном гаджете. А ещё телефоном можно открывать пивные бутылки и забивать гвозди. Неудобно, да. Но можно же? Только никто телефон в качестве молотка не использует. Потому что глупо.

Но есть как минимум одна сфера деятельности, где понятие рациональности использования очень размыто. Разумеется, я говорю о нашем любимом программировании.

Для конкретной задачи всегда можно придумать несколько вариантов реализации. Единственное ограничения — уровень владения технологиями. Не знаю плохо это или хорошо, но при первом подходе мы всегда пытаемся найти решение «в лоб», основываясь на прошлом опыте. Позднее мозг переключается в режим «а что если» и, зачастую, находится более оптимальный способ. Но первоначально всё равно наша цель — «чтобы просто работало». Я не спорю, разуемется, кто-то способен выбрать верное направление и с первого раза, но таких людей, основываясь на личных ощущениях, где-то 1-2 на пару десятков. И дело не в том что кто-то лучше, а кому-то не дано. Просто так сложилось, наверно.

После первоначального «грубого» решения задачи возникает вопрос — переходить к следующей задаче или потратить ещё немного времени на эту? К сожалению, вернуться и подумать — не самый популярный вариант. Зачем менять, и так же работает?! Потом кто-нибудь проведёт рефакторинг и всё переделает. Это не существенно. Вот где-то здесь мне и видится тот самый телефон для забивания гвоздей.

Код как самоцель не важен, но и подход «работает — не меняй» — часовая бомба в фундаменте проекта.

Такое пафосное заключение. А началось всё с

SELECT `category_id`, 
(SELECT CONCAT(',', `product_ids`, ',')) AS 'like_ids'
FROM `ids` 
HAVING `like_ids` LIKE '%,9,%'
Вконтакте
Отправить

ETag vs Expires

8 сентября 2014, 21:46

Собираю знания, необходимые для «понимания клиент-серверной архитектуры HTTP протокола».

Умные дядьки в статьях по оптимизации советуют сокращать количество HTTP-запросов к элементам на странице. Основным инструментом для сего благого действия называют заголовки ETag (Entity Tag) и Expires. И как-то так получилось, что везде подробно объясняется принцип работы загловка Expires, а связка Last-Modified + If-Modified-Since и ETag добавляются как «ещё один параметр, который поможет контролировать кэширование элементов».

Etag и Last-modified — заголовки-валидаторы. Они помогают клиенту понять изменилось ли содержимое конкретного документа/файла со времени последнего посещения.

Первое посещение

запрос:
GET /style.css HTTP/1.1

ответ:
HTTP/1.1 200 OK
Last-Modified: Fri, 5 Sep 2014 09:27:36 GMT


Повторное посещение

запрос:
GET /style.css HTTP/1.1
If-Modified-Since:Mon, 08 Sep 2014 07:11:55 GMT

ответ:
HTTP/1.1 304 Not Modified
Первое посещение

запрос:
GET /style.css HTTP/1.1

ответ:
HTTP/1.1 200 OK
Etag: ddaabb3a2afd8d40


Повторное посещение

запрос:
GET /style.css HTTP/1.1
If-None-Match: ddaabb3a2afd8d40

ответ:
HTTP/1.1 304 Not Modified

В обоих случаях при повторном обращении браузер получает сообщение 304 Not Modified и не скачивает файл заново, а берёт старый из кэша.

Рекомендуется по возможности использовать совместно оба заголовка: ETag и Last-modified. Etag рассматривается как «сильный» валидатор (изменение значения влечёт за собой изменение связных валидаторов). Валидатор, чьё значение может не измениться при изменении документа, называется «слабым». В идеале, стоит посылать оба заголовка. Но совершенно свободно можно использовать Last-modified для часто изменяемых документов, а для статических и редко изменяющихся файлов — Etag.

Expires и Cache-control — заголовки, сообщающие о необходимости обновить документ. С помощью этих заголовков браузеры и промежуточные прокси узнают на какой срок можно сохранить документ в кэше.

Etag сам по себе не может сказать клиенту нужно ли запрашивать обновлённый файл снова при следующем посещении. Если основываться только на ETag, то клиент всегда будет вынужден делать запрос к серверу для уточнения ситуации. Сервер, основываясь на ETag из If-None-Match, принимает решение отправлять клиенту файл (200 OK) или разрешить использовать локальную копию (304 Not Modified). ETag по сути — это контрольная сумма документа, изменяющаяся при изменении содержимого самого документа.

Заголовок Expires указывает клиенту и промежуточными прокси надо ли обращаться к серверу за обновлённым файлом до указанной даты.

Вконтакте
Отправить

Назад к истокам

6 сентября 2014, 1:05

Восстановил прошлую версию блога. Как ни как пару лет пытался вести. Что-то полезное там было. Ну, я так думаю.

Так что e-luge.pavel-novitsky.com доступен в read-only mode.

А ещё, написанный для php 5.2, отлично завелся на 5.5.

Вконтакте
Отправить

Ненужный продукт

4 сентября 2014, 0:20

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

В начале любого продукта есть некая новая идея, основной принцип. И вот, на этапе зарождения этой самой новой идеи, ещё до начала реализации, продукт уже может стать ненужным.

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

Выбираем новый смартфон. Спросите себя: «так ли нужен новый телефон?». Разве эта модель не то же самое что и нынешняя, только дополненный парой улучшений и функций?

Никакой острой Необходимости в новом устройстве нет. Есть только Желание. Пара новых приложений, чуть лучше железо, сосед уже купил.

Хочу и нуждаюсь.

Постоянно мы путаем Желание и Нужду. Съесть последнюю конфету в коробке. Мозг говорит: «тебе это необходимо», в реальности же ты просто хочешь съесть последнюю конфету. Не более того. Желудок сам напомнит когда действительно пора перекусить.

Откуда берётся «хочу»?

При постоянном потреблении Желание подменяет собой Необходимость. Если новый проект в его нынешней форме не решает никакой насущной задачи пользователя, то всё что двигает нас к его выпуску — Желание. «Я хочу сделать это». Ну, и какой смысл тратить силы только ради того чтобы хоть что-то делать?

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

Выделиться в толпе

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

Разработчики настолько увлечены своей идеей, что не принимаю никакого другого видения, кроме своего собственного. Совершенно забывается, что продукт разрабатывается для конечного потребителя и удобство использования столь же важно, как и функциональное наполнение. Больше внимания к деталям — вот что может превратить откровенно слабый продукт в лидера рынка.

Чего люди ожидают от продукта?

Допустим, есть 2 продукта A и B одинаково хорошо вычисляющих стоимость доставки в Индонезию. Причём оба давно обошли конкурентов в скорости и стабильности. Какой из них выберет пользователь? А вот и нет, пользователь выберет продукт C. Не такой быстрый, менее стабильный, но с необычайно удобным интерфейсом и предоставляющий расчёт доставки ещё в 250 стран мира.

Такова природа человека — «выглядит хорошо, попробую его», «вроде, не сложно, беру».

Вместо заключения

Кроме функциональности и производительности не забывайте о том что продукт будет работать в некой инфраструктуре. Пользователю должно быть удобно.

Не надо зацикливаться на мысли, что людям нужен конкретно ваш продукт. Это не так. Если что-то вызовет смущение у пользователя — вы помогли конкуренту.

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

Превратите Необходимость в Желание и всё будет хорошо.

Вконтакте
Отправить

Пользователь MySQL root в панелях управления

2 сентября 2014, 15:22

За что не люблю панели управления серверами, так это за стремление переопределить стандартные переменные и ни в коем случае не показывать пользоватею пароли. Наверно, это правильно. Но жутко не удобно. Бывали случаи, когда без рута к MySQL никак. Наконец, дошли руки сделать этакую памятку для собственного удобства.

CPanel и WHM

В директории root лежит скрытый файл «.my.cnf»

~# cat /root/.my.cnf

[client]
password="password"
user=root

DirectAdmin

В системе создаётся свой пользователь «da_admin» со всеми правами рута. Доступы можно посмотреть в /usr/local/directadmin/conf/mysql.conf

~# cat /usr/local/directadmin/conf/mysql.conf

user=da_admin
passwd=password

Parallels Plesk Panel

После установки панели пользователь «root» переименовывается в «admin». Пароль тот же что и у пользователя «admin» при логине в панель управления.

Начиная с версии 8.0 пароль хранится в /etc/psa/.psa.shadow

~# cat /etc/psa/.psa.shadow

С десятой версии пароль в /etc/psa/.psa.shadow зашифрован.

~# /usr/local/psa/bin/admin --show-password

Так же в любой версии можно залогиниться в MySQL с данными root командой:

~# mysql -uadmin -p`cat /etc/psa/.psa.shadow`

ISPManager

Пароль можно посмотреть прямо в панеле:

Настройки сервера - Серверы баз данных - MySQL - Пароль root

ISPConfig 3

Пароль хранится в /usr/local/ispconfig/server/lib/mysql_clientdb.conf

~# cat /usr/local/ispconfig/server/lib/mysql_clientdb.conf

<?php
$clientdb_host = 'localhost';
$clientdb_user = 'root';
$clientdb_password = 'password';
?>

SysCP

~# cat /var/www/syscp/lib/userdata.inc.php | grep root_password

$root_password = 'password';

Будет дополняться по мере набивания новых шишек.

Вконтакте
Отправить

Им не встретиться никак

12 августа 2014, 18:05

Разработчики активно используют гитхаб, являющийся слишком гиковым для сферического заказчика. Заказчики с удовольствием смотрят демки на сайтах проприетарного ПО. И никак они не встретятся. Даже github.io не спасает.

Вконтакте
Отправить
← Раньше Позже →
© 2013-2024