Уже больше года что-то здесь вяло пописываю. Пришло время время подбить какую-то статистику.
Сайту 470 дней, 27 записей, т.е. 1 пост каждые 17,4 дней — вот такой я ленивый :-) Люди книги быстрее пишут. И 2 комментария ещё, да. Успех, я считаю. Захлопываем крышку ноута и уходим...
А потом залез-таки в аналитику. Больше года прошло, какая-никакая статистика собралась. Посмотрел и малость хм... удивился — ежедневно с яндекса приходит по 30-40 человек. В запросах определились 2 лидера — разные вариации на тему «что значит дьявол кроется в деталях?» и «как что-нибудь там сделать с купонами в Magento».
Я так понимаю, как-то весь трафик привлекают старые «Дьявол кроется в деталях» и «Отчёт о купонах в Magento».
С дьяволом пока ничего сделать не получится — не хочется пока писать пространный текст с цитатами, аллюзиями и метафорами (я ж ленивый, не забываем). А разобраться что конткретно там искали про купоны достаточно легко и не напряжно. Так что на горизонте понятно какие статьи, разбавленные всякой дребеденью.
Ещё один интересный момент — RSS. Открытия в ридерах радуют — 35-50 на статью. А вот GA и Метрика расходятся в показаниях переходов из ридеров 15 против 12 на статью (да, я и ga, и метрику установил поиграться).
Кстати, надо будет позже проверить не перебьёт ли эта заметка по количеству упоминаний дьявола прошлую (алярм! SEO-зараза на горизонте!).
Хорошая штука современный телефон. Звонки, фотографии, видео, чаты, игры, интернет — всё в одном гаджете. А ещё телефоном можно открывать пивные бутылки и забивать гвозди. Неудобно, да. Но можно же? Только никто телефон в качестве молотка не использует. Потому что глупо.
Но есть как минимум одна сфера деятельности, где понятие рациональности использования очень размыто. Разумеется, я говорю о нашем любимом программировании.
Для конкретной задачи всегда можно придумать несколько вариантов реализации. Единственное ограничения — уровень владения технологиями. Не знаю плохо это или хорошо, но при первом подходе мы всегда пытаемся найти решение «в лоб», основываясь на прошлом опыте. Позднее мозг переключается в режим «а что если» и, зачастую, находится более оптимальный способ. Но первоначально всё равно наша цель — «чтобы просто работало». Я не спорю, разуемется, кто-то способен выбрать верное направление и с первого раза, но таких людей, основываясь на личных ощущениях, где-то 1-2 на пару десятков. И дело не в том что кто-то лучше, а кому-то не дано. Просто так сложилось, наверно.
После первоначального «грубого» решения задачи возникает вопрос — переходить к следующей задаче или потратить ещё немного времени на эту? К сожалению, вернуться и подумать — не самый популярный вариант. Зачем менять, и так же работает?! Потом кто-нибудь проведёт рефакторинг и всё переделает. Это не существенно. Вот где-то здесь мне и видится тот самый телефон для забивания гвоздей.
Код как самоцель не важен, но и подход «работает — не меняй» — часовая бомба в фундаменте проекта.
Такое пафосное заключение. А началось всё с
SELECT `category_id`, (SELECT CONCAT(',', `product_ids`, ',')) AS 'like_ids' FROM `ids` HAVING `like_ids` LIKE '%,9,%'
Собираю знания, необходимые для «понимания клиент-серверной архитектуры 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 указывает клиенту и промежуточными прокси надо ли обращаться к серверу за обновлённым файлом до указанной даты.
Восстановил прошлую версию блога. Как ни как пару лет пытался вести. Что-то полезное там было. Ну, я так думаю.
Так что e-luge.pavel-novitsky.com доступен в read-only mode.
А ещё, написанный для php 5.2, отлично завелся на 5.5.
Тезис прост — большинство выпускаемых программ, сервисов и девайсов не нужны конечному пользователю. Потраченные на разработку силы уходят впустую. Обидно, согласен. Но так и есть.
В начале любого продукта есть некая новая идея, основной принцип. И вот, на этапе зарождения этой самой новой идеи, ещё до начала реализации, продукт уже может стать ненужным.
По сути, любая новая идея — это улучшение уже существующего процесса или инструментов, используемых при достижении конечной цели.
Выбираем новый смартфон. Спросите себя: «так ли нужен новый телефон?». Разве эта модель не то же самое что и нынешняя, только дополненный парой улучшений и функций?
Никакой острой Необходимости в новом устройстве нет. Есть только Желание. Пара новых приложений, чуть лучше железо, сосед уже купил.
Постоянно мы путаем Желание и Нужду. Съесть последнюю конфету в коробке. Мозг говорит: «тебе это необходимо», в реальности же ты просто хочешь съесть последнюю конфету. Не более того. Желудок сам напомнит когда действительно пора перекусить.
При постоянном потреблении Желание подменяет собой Необходимость. Если новый проект в его нынешней форме не решает никакой насущной задачи пользователя, то всё что двигает нас к его выпуску — Желание. «Я хочу сделать это». Ну, и какой смысл тратить силы только ради того чтобы хоть что-то делать?
В проектах, где единственным движущим мотивом является «хочу», стоит задать себе вопрос «зачем?». При выборе «звонилки» мы практически не ображаем внимание на саму функцию звонка. Скорее всего, мы с одинаковой лёгкостью позвоним как со своего старого телефона, так и с последней новинки, вчера появившейся на рынке. Внимание привлекает дополнительный функционал. Так же, само собой, не последнюю роль играют лояльность бренду, гиковость, посыл от производителя к потребителю и т.п.
С нынешним уровнем развитием IT любой человек может запустить новый проект призванный изменить мир. Часто на работе я сталкиваюсь с новыми задумками — начиная от маленьких плагинов и заканчивая огромными сервисами. И каждая такая идея ни как не менее чем тот самый долгожданный прорыв в индустрии.
Разработчики настолько увлечены своей идеей, что не принимаю никакого другого видения, кроме своего собственного. Совершенно забывается, что продукт разрабатывается для конечного потребителя и удобство использования столь же важно, как и функциональное наполнение. Больше внимания к деталям — вот что может превратить откровенно слабый продукт в лидера рынка.
Допустим, есть 2 продукта A и B одинаково хорошо вычисляющих стоимость доставки в Индонезию. Причём оба давно обошли конкурентов в скорости и стабильности. Какой из них выберет пользователь? А вот и нет, пользователь выберет продукт C. Не такой быстрый, менее стабильный, но с необычайно удобным интерфейсом и предоставляющий расчёт доставки ещё в 250 стран мира.
Такова природа человека — «выглядит хорошо, попробую его», «вроде, не сложно, беру».
Кроме функциональности и производительности не забывайте о том что продукт будет работать в некой инфраструктуре. Пользователю должно быть удобно.
Не надо зацикливаться на мысли, что людям нужен конкретно ваш продукт. Это не так. Если что-то вызовет смущение у пользователя — вы помогли конкуренту.
Сделайте так чтобы покупатели сами захотели именно ваше решение. Постоянно совершенствуйте продукт, деайте его лучше и удобнее для пользователя.
Превратите Необходимость в Желание и всё будет хорошо.
За что не люблю панели управления серверами, так это за стремление переопределить стандартные переменные и ни в коем случае не показывать пользоватею пароли. Наверно, это правильно. Но жутко не удобно. Бывали случаи, когда без рута к MySQL никак. Наконец, дошли руки сделать этакую памятку для собственного удобства.
В директории root лежит скрытый файл «.my.cnf»
~# cat /root/.my.cnf [client] password="password" user=root
В системе создаётся свой пользователь «da_admin» со всеми правами рута. Доступы можно посмотреть в /usr/local/directadmin/conf/mysql.conf
~# cat /usr/local/directadmin/conf/mysql.conf user=da_admin passwd=password
После установки панели пользователь «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`
Пароль можно посмотреть прямо в панеле:
Настройки сервера - Серверы баз данных - MySQL - Пароль root
Пароль хранится в /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'; ?>
~# cat /var/www/syscp/lib/userdata.inc.php | grep root_password $root_password = 'password';
Будет дополняться по мере набивания новых шишек.
Разработчики активно используют гитхаб, являющийся слишком гиковым для сферического заказчика. Заказчики с удовольствием смотрят демки на сайтах проприетарного ПО. И никак они не встретятся. Даже github.io не спасает.