Заметки в категории «Разное» :: Хранитель заметок

noteskeeper.ru

Персональный журнал для заметок Владимира Кузнецова

Заметки в категории «Разное»

Блоговский движок под системой контроля версий Git

Все файлы блоговского движка я храню в Git. Я не стану всем и каждому советовать сразу переходить на систему контроля версий. Очевидно, что для её развертывания потребуется как минимум VPS, навыки администрирования и, собственно, умение пользоваться ею. Иначе все плюсы обратятся в сплошные минусы.

Однако, преодолев все эти трудности можно получить некоторые преимущества.

Редактирование темы и плагинов

Благодаря Git редактировать файлы можно как на домашнем компьютере, так и прямо на сервере. При этом точно знаю, что ничего не «случайно» не потеряется или перезатрется.

Если один и тот же файл был изменен в разных местах, то система сама попробует решить конфликт. А если её это окажется не под силу, то предоставит вам эту возможность.

Обновление версии движка

Так уж получилось, что очень часто приходится вносить какие-то исправления в сами файлы блоговского движка. А когда выйдет новая версия, то все ваши правки затрутся.

Чтобы сохранить свои исправления я выработал такую схему работы

Дерево коммитов Git

В одной ветке (wp31) я храню исходные файлы дистрибутива и все новые версии разворачиваю только туда. А свои правки делаю в основной ветке (master).

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

Развертывание изменений на сервере

Все действия сводятся к одной простой команде.

git pull

Если вдруг обнаруживаются какие-то дефекты, то старая версия блога возвращается на прежнее место за несколько секунд.

Резервное копирование

Каждый Git-репозиторий может стать резервной копией для других. Фактически у меня 3 идентичных копии: продакшин, внешний репозиторий и локальный репозиторий на домашнем компьютере. В случае повреждения одной из них, восстановить её можно будет из двух других копий.

54307730.19286420.1324395758.c7d8ac3d6d9658c7c572ebaca98a9ceb

Работа с тегами в Git

Тегами в git-репозитории можно отмечать коммиты или, в общем случае, любые объекты. В нашей команде мы отмечаем тегами релизы, которые уходят в продакшин.

Создание тега

  1. Помечаем локальный коммит

    git tag 12345
    
  2. Отправляем его во внешний репозиторий

    git push origin 12345
    

Удаление тега из репозитория

  1. Удаляем тег локально

    git tag -d 12345
    
  2. Удаляем его во внешнем репозитории

    git push origin :refs/tags/12345
    
  3. Оповещаем каким-либо способом коллег, чтобы они сделали у себя команду из пункта 1

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

Перемещение тега на другой коммит

  1. Принудительно перезаписываем тег

    git tag -f 12345
    
  2. Отправляем во внешний репозиторий с принудительной перезаписью

    git push --force origin 12345
    
  3. Оповещаем коллег как и в случае удаления тега

Дополнение

Если не указан хеш-код объекта, то теггируется последний коммит в активном бранче. Чтобы отметить тегом произвольный коммит нужно последним аргументом передать весь его хеш-код.

git tag 12345 6ff87c4664981e4397625791c8ea3bbb5f2279a3

Отправить во внешний репозиторий все теги текущей ветки можно одной командой.

git push --tags

Убираем неоднородности на повторяющейся текстуре

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

Допустим у нас имеется повторяющаяся текстура. Она прекрасно стыкуется по краям.

Повторяющаяся текстура

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

Повторяющаяся текстура не стыкуется при наложении

Скопируем слой и применим к нему фильтр «Gaussian Blur». Параметры фильтра нужно выбрать такими, чтобы исчезли все детали текстуры и остались только паразитные пятна. В моем случае радиус размытия был равен 10 (чем он будет больше, тем больше деталей останется в результате). Понизим немного яркость этому слою. Это удобно сделать с помощью Adjustment Layer, так как аналогичную операцию придётся сделать ещё раз. Поместим оба слоя в отдельную группу.

Размытая текстура

Теперь создадим новый слой и зальем его сплошным цветом, который хотим получить в результате. Так же поместим его в отдельную группу и добавим туда копию корректирующего яркость слоя. Теперь первой группе с размытой текстурой назначаем режим смешивания «Subtract» (вычитаем его из оригинальной текстуры), а второй группе со сплошным цветом – «Linear Dodge» (добавляем его к разнице).

Слои и настройки

В результате получим оригинальную текстуру, но без неоднородностей.

Текстура без неоднородностей

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

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

Таким же образом можно исправить и темную текстуру. Только нужно внести два изменения:

  1. Группы с размытым слоем и сплошным цветом меняем местами — сначала добавляем, а потом вычитаем. Это важно сделать из-за зануления отрицательных значений.
  2. Корректирующие слои становятся не нужны, так как при их использовании есть вероятность потерять детали в самых темных участках.

Я.Субботник в Екатеринбурге

2 июля 2011 года состоялся очередной Я.Субботник. Местом его проведения выбран г. Екатеринбург, отель «Московская горка». Найти его по карте не составило труда, и я вместе с ребятами из «Стратегии Роста» без заминок добрались до него.

Мой бедж на Яндекс.Субботнике

На приветственном кофе мы встретились с Катей Черно (JetStyle) и Олегом Моховым (Яндекс), с которыми познакомились на UWDC-2011. Пока мы перекусывали эклерами к нашей компании подошли ещё ребята из Челябинска. Сделали групповое фото

Веб-разработчики из Челябинска на Яндекс.Субботнике в Екатеринбурге 2 июля 2011 года

Программа Я.Субботника в Екатеринбурге. Расскажу вкратце о впечатлениях от особо понравившихся докладов.

Как мы оцениваем качество поиска

Доклады начались с выступления Яны Нехорошевой об асессорах. Я, к своему стыду, ничего раньше не знал об этой службе Яндекса. Оказалось, что целый штат экспертов, которые оценивают поисковую выдачу на реальных запросах пользователей. В основном (90%) там работают женщины.

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

БЭМ, или как разрабатывать веб-проекты

Сергей Бережной (на сцене) и Виталий Харисов (в твиттере) рассказывали и отвечали на вопросы о технологии «Блок-Элемент-Модификатор». Сергей на слайдах показал пример простой страницы сделанной обычным способом в текстовом редакторе и генерацию аналогичной страницы из отдельных блоков.

Безусловно, у этой методики разработки есть свои плюсы. Они явно проявляются на больших проектах в больших командах. Для команд, работающих с классическими шаблонизаторами, и не привыкшими к процедурам «сборки» проекта, внедрение этой методики может быть проблематично.

Ребята активно отвечали на вопросы из твиттера по хеш тегу #bem или #бэм.

Куда идём мы с Пятачком, или о том, куда движется вёрстка и верстальщики Яндекса

Олег Мохов в своем докладе подтвердил, что Яндекс уже активно внедряет современные технологии верстки в своих проектах. Тестируется производительность и совместимость новых CSS3-свойств. Сейчас перед разработчиками Яндекса уже не ставится задача сделать идентичное макету отображение в старых браузерах. Вся разработка ориентирована на перспективу. Почти все проекты уже сейчас тестируются на touch-устройствах, хотя изначально такой задачи перед разработчиками не ставится.

Масштабируемые JavaScript-приложения

Михаил Давыдов рассказывал о проекте «Чат». Очень подробно прошелся по архитектуре приложения. Основной мыслью, мне показалось, стало то, что в масштабируемое приложение нужно строить на основе независимых модулей и связывать их через события с ядром приложения. Чем меньше будет зависимостей друг от друга у них, тем легче будет перейти с одного фреймворка на другой или внести изменения в API какого-то отдельного модуля.

В целом очень хороший доклад для общего представления о том, как стоит строить свои приложения с прицелом на их расширение.

Я задал вопрос об использовании какой-то динамической загрузке модулей и их зависимостей. Михаил ответил, что все скрипты собираются через БЭМ и подключаются статически. Меня этот аспект интересует в связи с тем, что не так давно исследовал параллельную загрузку ресурсов и написал небольшой фреймворк под кодовым названием «Скелет приложения»

HTML5 в Я.Почте

Очень впечатлила работа с применением WebSocket, localStorage и Cross-server XRH, о которой рассказывал Алексей Андросов. Эти технологии реально использовать уже сейчас для упрощения коммуникации между браузером и сервером, а так же ускорения загрузки статических ресурсов сайта.

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

Лично мне очень захотелось поэкспериментировать в этом направлении тоже.

Нагрузки в спорте высоких достижений. Как Python стал делать погоду в Яндексе. Python в инфраструктуре поиска

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

Кластеризация дубликатов в Яндекс.Картинках

Отслеживание дублей в картинках — это очень важная задача, о чем и поведал на Александр Крайнов.

Я попросил его поделить советом о том, как нужно изменить картинку, чтобы она перестала считаться дублей. Александр ловко отшутился, что обязательно расскажет, когда Яндекс выпустит новую версию движка. Далее из зала был вопрос о повороте картинки. Александр ответил, что они умеют отслеживать поворот и считают такие картинки дубликатами. Но что-то мне подсказывает, что он лукавит в этом вопрос.

Офлайн-поиск на основе MapReduce

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

Роботы и люди в Twitter-е

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

Заключение

Мне очень понравилась организация мероприятия в целом. Огромная благодарность всем, кто принимал в этом участие. Особое «мерси» хочется сказать Леночке Джетпыспаевой и Павлу Браславскому.

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

Конфигурация проектов в gitosis

После того, как gitosis установлен и настроен доступ к нему из вне, можно переходить к созданию отдельных хранилищ проектов.

Для конфигурирования gitosis используется инфраструктура git. При инициализации нового репозитория всегда создается проект gitosis-admin, где хранятся файлы конфигураций и ключи доступа. Как только в этот проект делается комит с изменениями настроек они сразу же применяются. Это обеспечивается скриптом post-update. Нужно убедиться, что он может выполняться.

sudo chmod 755 /Users/git/repositories/gitosis-admin.git/hooks/post-update

Сделаем копию этого проекта на рабочем компьютере

git clone git@repo.local:gitosis-admin.git

В файле gitosis.conf содержится описание проектов и прав доступа к ним, а в директории keydir — публичные ключи других пользователей репозитория.

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

git commit -a -m "Комментарий к комиту"
git push

Создание нового проекта

Исходная конфигурация в gitosis.conf

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = user1

В строке members перечисляются имена ключей (без расширения .pub), которые лежат в папке keydir.

По аналогии добавим еще одну группу:

[group project1]
writable = project1
members = user1

Эти правила задают группу project1, в которую входит пока только 1 пользователь user1. Все пользователи из этой группы имеют доступ для записи в проект project1.

Сохраним изменения и опубликуем их в удаленный репозиторий.

Теперь создадим сам проект. На рабочем компьютере выполним команды:

mkdir project1
cd project1
git init
git remote add origin git@repo.local:project1.git

Было бы хорошо, если к этому моменту у вас уже были какие-либо файлы, которые можно отправить в репозиторий. Если таковых нет, то нужно создать пусть даже пустой файл, чтобы его опубликовать (потом этот файл можно удалить или отредактировать).

touch file.txt

Отправляем проект в удаленный репозиторий:

git add .
git commit -a -m 'init commit'
git push origin master:refs/heads/master

Проект с названием project1 будет создан на сервере в директории /Users/git/repositories/

Установка и настройка git-репозитория на Mac OS X 10.6

Переустановка системы на домашнем сервере подтолкнула написать еще одну подробную инструкцию по настройке git-репозитория на Mac OS X 10.6 (Snow Leopard)

Установка и настройка gitosis

Предположим, что git-клиент уже установлен. В интернете можно с легкостью найти несколько готовых сборок. Он нам понадобится, чтобы загрузить gitosis

cd ~/Desktop
mkdir src
git clone git://eagain.net/gitosis.git
cd gitosis
sudo python setup.py install

Создадим пользователя, под которым мы будем подключаться к репозиторию. Это можно сделать из панели управления пользователями или из командной строки

Найдем не используемые uid и gui

sudo dscl . list /Users uid
sudo dscl . list groups gid

Предположим, что число 410 не используется в обоих случаях. Это будет нашим идентификатором.

Создаем группу git

sudo dscl . create groups/git
sudo dscl . create groups/git gid 410

Создаем пользователя git

sudo dscl . create users/git
sudo dscl . create users/git uid 410
sudo dscl . create users/git NFSHomeDirectory /Users/git
sudo dscl . create users/git gid 410
sudo dscl . create users/git UserShell /bin/bash
sudo dscl . create users/git Password '*'

Создаем домашнюю директорию пользователя

sudo mkdir /Users/git
sudo chown git /Users/git
sudo chgrp git /Users/git

Теперь для текущего пользователя на локальном компьютере сгенерируем ssh ключ, если его еще нет. Если ключ есть, то этот шаг пропускаем

ssh-keygen -t rsa

И копируем его на удаленный сервер

scp ~/.ssh/id_rsa.pub repo.local:/tmp/my_key.pub

Если же репозиторий создается на рабочем компьютере, то эта команда немного упрощается

cp ~/.ssh/id_rsa.pub /tmp/my_key.pub

Теперь на сервере выполним инициализацию репозитория

cd /Users/git
sudo -H -u git gitosis-init < /tmp/my_key.pub

При удачном раскладе вы должны увидеть сообщения вроде этих

Initialized empty Git repository in /Users/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /Users/git/repositories/gitosis-admin.git/

Устанавливаем переменную PATH для пользователя git

sudo su git
echo "export PATH=$PATH" > ~/.bashrc
exit

На этом настройку gitosis можно считать законченной. Проверим подключение к репозиторию из вне.

git clone git@repo.local:gitosis-admin.git

Если вы увидите сообщение

Cloning into gitosis-admin...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 5 (delta 0)
Receiving objects: 100% (5/5), done.

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

Потенциальные проблемы

Когда я настраивал gitosis в первый раз, то долго бился над тем, что подключение по SSH для пользователя git ни как не устанавливалось. Причина этому, как выяснилось позже, послужило ограничение доступа по SSH только администраторам.

Общий доступ → Удаленный вход

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

Восстановление очень большой MySQL базы

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

ERROR 2006 (HY000) at line 781: MySQL server has gone away

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

max_allowed_packet=16M

В MySQL версии 5.1 параметр max_allowed_packet стал динамическим и его можно менять без исправлений в my.cnf и перезапусков сервера. В mysql-консоли выполните команду

set global max_allowed_packet=16M

Поиск файлов из командной строки

Главным инструментом для поиска файлов служит утилита find. Она имеет множество параметров, которые позволяют задавать различные условия.

Поиск по имени файла

find ~ -name 'article.doc'
  • ~

    домашняя папка пользователя в качестве начального пути для поиска

  • -name

    поиск по имени файла

Так же можно делать поиск по части имени

find ~ -name 'article.*'
find ~ -name '*.doc'

У параметра name есть альтернатива iname — игнорирование регистра символов.

Поиск по дате и времени

У файлов учитывается время создания (create), доступа (access) и изменения (modification). Соответственно параметры поиска начинаются с первых букв соответствующих английских слов.

find -amin 30

Ищем файлы в текущей папке, которые открывались менее 30 минут назад.

find -ctime 2h

Ищем файлы в текущей папке, время создания которых отличается от текущего на 2 часа.

В единицах интервала времени можно использовать модификаторы + или -, чтобы обозначить условие больше или меньше соответственно.

Поиск по размеру

find -size +10M

Эта команда выдаст список файлов, размер которых больше 10 мегабайт.

find -size -10k

А эта — список файлов, размер которых меньше 10 килобайт.

Поиск по содержимому файла

Утилита find сама не осуществляет поиск по содержимому, но ее можно использовать, чтобы задать другие граничные условия поиска. А внутри файла можно найти строку с помощью утилиты grep.

Найдем файлы в домашней папке пользователя, размер которых меньше 10 килобайт и содержащих строку «hello»

find ~ -size -10k -print0 | xargs -0 grep "hello"
  • -print0

    имена файлов будет разделены символом \0

  • xargs

    специальная утилита, которая получает из стандартного ввода набор строк и передает их в качестве аргументов следующей утилите (в нашем случае утилите grep)

  • -0

    строки разделены символом \0

Подробнее о параметрах

Все параметры и их значения можно узнать из документации по соответствующим утилитам

Чистим информацию о ветках в Git

Если вы работаете в команде, любой член команды может создавать и загружать свои собственные ветки, которые будут получены с сервера Git во время git pull или git fetch. Если ветка будет удалена с сервера, она останется в вашем локальном репозитории навсегда. Для удаления таких веток используется команда:

git remote prune origin

О пользе карты сайта

Карта сайта (Sitemap) — это XML-файл с информацией о страницах сайта, которые нужно проиндексировать поисковым системам. Поисковые системы могут обнаружить все страницы сайта, на которые есть ссылки, но с помощью карты сайта ему эта информация предоставляется в явном виде. В этом файле указывается местонахождение страниц сайта, время их последнего обновления, частоту обновления и важность относительно других страниц сайта для того.

Например, Sitemap может быть таким:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://noteskeeper.ru/</loc>
        <lastmod>2010-03-20</lastmod>
        <changefreq>daily</changefreq>
        <priority>1</priority>
    </url>
</urlset>

Спецификацию протокола можно найти на сайте sitemaps.org

Как альтернатива карте сайта может использоваться канал синдикации RSS или ATOM. Однако на практике в этих файлах передаются далеко не все страницы.