Как быстро сделать спрайт? Ubuntu

Спрайт (в вебмастерской терминологии) есть фиговина призванная уменьшить количество запросов к серверу путем аккамулирования в себе кучи картинок которые используются в верстке. При помощи "хитрых" приемов верстки в нужном месте появляется нужный кусочек изображения из спрайта и выглядит как полагается, но при этом на 100 показанных картинок (например) реально у сервера запрашивается только одна - спрайт который всю эту мелочевку содержит. Как ими правильно пользоваться, как верстать и как не злоупотреблять ими - читайте у настоящих Верстальщиков. "Я не настоящий сварщик" ©

Я тут хочу написать о другом. Допустим есть у нас NN картинок для спрайта. Как спрайт сделать. Ну как, берём открываем там фотошоооп или гимп или ещё какой-нибудь графический редактор и начинаем все засовывать туда и записывать координаты где чего лежит. Теоретически все так и должно быть, профессионалы я думаю так примерно и делают. Я не профессионал-верстальщик и вообще не верстальщик, но зато я большой лентяй. Поэтому рассмотрим лентяйский пример ниже :)

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

В общем суть примера. Есть NN картинок одинакового разрешения и типа. У меня это было 4 png-шки 128x128. Когда я поставил и открыл Gimp мне сделалось нехорошо. Опять надо все это вспоминать, считать, двигать подгонять.. Пошел гуглить на предмет того как бы это в гимпе сделать автоматически а нагуглил вот что. Есть консольная утилитка convert, часть пакета imagemagick, я даже когда-то давно ей пользовался но забыл уже про это. Она замечательно с этой задачей справляется.

ставим imagemagick
sudo apt-get install imagemagick
это у нас ман по конверту, ага
man convert
идем в папку с файлами из которых будем лепить спрайт
cd 4sprite-test/
ls
facebook.png  github.png  google.png  twitter.png
теперь берем и все эти файлы склеиваем вот так
convert *.png +append sp-big.png
ls
facebook.png  github.png  google.png  sp-big.png  twitter.png
если надо ещё и изменить размер исходных файлов то делаем так
convert *.png -resize 64x64 +append sp-med.png
Думаю даже не надо пояснять что к чему, все понятно из ключей к конверту. Единственное что в примере под маску попадают все файлы *.png в папке. И если оттуда не убрать сгенеренный спрайт то при повторном запуске в новый созданный спрайт он попадет тоже. Повнимательнее с рекурсией и маской:)

з.ы. Ещё стоит помнить что конверт умный, по расширению результирующего файла определяет результирующий тип файла, соот-но если вы например из png склеите jpg то логично потеряете прозрачность.

Как получить md5 хэш строки или файла в консоли, Ubuntu

Это полная ерунда понятное дело, но я забываю постоянно. Поэтому законспектирую.
# для файла совсем просто
md5sum file.txt

# для строки чуть замороченнее
echo -n 'string ololo jj' | md5sum
Чтобы понять почему так и что за ключи смотрим man md5sum и man echo.

Базовая настройка sendmail, Ubuntu

Я не администратор, поэтому относитесь к этой заметке с осторожностью.
Рассматривается такя ситуация: надо заставить sendmail сервера отправлять почту, но ничего в ответ не принимать. Строго для оповещений с сайтов. У меня вдс-ка с предустановленным exim4 на который, насколько я понимаю, "ссылается" sendmail. Т.е. фактически работает exim4.

Сначала настраиваем хост (my-host-name это имя нашего хоста с которого все будет ездить)
sudo mcedit /etc/hosts
В файле должны быть строки вида
127.0.0.1 localhost
111.111.111.111 hostname.my-hoster.net my-host-name
Далее меняем имя хоста в файле
sudo mcedit /etc/hostname
Файл должен выглядеть вот так (полностью, т.е. только имя хоста и все)
my-host-name
Теперь перегружаем службу которая грубо говоря обновляет имя хоста глобально
sudo /etc/init.d/hostname.sh stop
sudo /etc/init.d/hostname.sh start
# если такого скрипта нет, то пробуем иначе:
sudo service hostname restart
REM ещё такой вариант есть, для Debian 9 (stretch)
hostnamectl set-hostname my-host-name
Теперь выполняем команды
hostname
hostname -f
Если все правильно сделано, то они обе должны вернуть значение my-host-name (т.е. имя вашего хоста)

Теперь надо настроить сам sendmail. В моем случае, нужно перенастроеить exim4. Делается это примерно так:
sudo dpkg-reconfigure exim4-config
После этого в мастере просто нужно выбирать значения (именно для exim4)
  • internet site..
  • вводим название вашего хоста (my-host-name)
  • ip для smtp устанавливаем только 127.0.0.1 т.к. нам не нужны внешние подключения по smtp
  • другие допустимые назначения оставляем по умолчанию
  • домены для разрешенного релея - оставляем пустым
  • машины для релея - оставляем пустым
  • кол-во днс запросов на ваше усмотрение, я не ограничивал
  • метод доставки я оставил тот же который был, т.е. /var/mail
  • разделять не разделять файлы конфигурации - на ваше усмотрение, аргументы там описаны, я разделять не стал
Теперь, чтобы проверить ходит ли почта делаем так
sendmail -i my-email@my-host.com
Далее вводим тект тестового сообщения. И по готовности нажимаем Ctrl+d
Идем проверяем свою почту. Если письмо пришло - все ок и ура. Если нет - идем гуглить дальше :)

Дальше надо убедиться что на нашем сервере недоступен smtp, для этого нам надо сходить с локальной машины постучаться в 25 порт сервера и получить отлуп. Делается это например так:
telnet my-host-name 25
Trying 111.111.111.111...
telnet: Unable to connect to remote host: Connection refused
Если все так, то все тип-топ. Порт закрыт.

Ещё маленькая фишка. Бывает так что по каким-то причинам, сервис рулящий веб-приложением надо перезапускать регулярно. В моем случае это node.js и делаю я это по крону раз в N времени. Так вот если перезапустить процесс кроном, то sendmail перестает работать, потому как приложение не знает где он, в path пути до него просто нет и соот-но он просто не находится. Точно так же можно передавать любые другие настройки переменных окружения. Как это делать смотрим ниже.

Сначала посмотрим где sendmail
which sendmail
/usr/local/bin/sendmail
Ок, видим путь. Если вдруг не видим то идем смотреть тоже самое но под sudo. Теперь идем в кронтаб и добавляем переменные окружения там.
crontab -e
Откроется редактирование заданий для текущего пользователя. То есть все задания будут выполнены с правами текущего пользователя и сервис запустится с правами этого пользователя, если он запускается конечно согласно вашему плану :)

# это переменная которая рассказывает где искать sendmail,
# другие нужные пути можно писать через разделитель - двоеточие
# там будут искаться необходимые нам утилиты
PATH=/usr/local/bin

# это пример переменной окружения которую будет использовать само приложение
NODE_ENV=production

# это собственно само задание, гуглим по формату crontab чтобы понять что к чему
# в данном случае скрипт будет срабатывать в 30 минут каждого четного часа
*/30 */2 * * * /home/user/blog/scripts/restart.sh
Ну вот примерно так. Прошу не воспринимать эту заметку как полное руководство к действию, вполне возможно что для вашего случая все будет значительно отличаться. Но возможно это как-то поможет или хотя бы наведет на мысли в нужном направлении :) Успехов!

Пользовался вот этим источником. Рекомендую на него взглянуть, надеюсь он ещё дышит.

setuid и setgid на папках

Стыдно не знать таких вещей. Биты setuid и setgid, установленные для папок (chmod g+s) заставляет новые папки и файлы, созданные в ней, наследовать ID группы этой папки вместо ID группы пользователя создавшего файл. Новые подпапки также наследуют бит setgid. Это позволяет создать общее рабочее пространство для группы без неудобств членам группы явно менять их текущую группу для создания новых файлов и папок. Наследование устанавливается только для новых файлов и папок. Уже существующим файлам и папкам этот бит нужно устанавливать вручную, например:
find /path/to/directory -type d -exec chmod g+s {} \;
Вики: http://ru.wikipedia.org/wiki/Suid

Ubuntu настройка локального DNS сервера

UPD: Таже самая цель, но меньшей кровью — настройка dnsmasq

Зачем это надо.
Надо это затем что есть например 10 локально поднятых проектов на рабочей станции разработчика. Этот разработчик

  1. Для работы с локальной копией проекта редактирует конфиг своего веб сервера (apache, lighttpd etc.) и указывает в конфиге имя хоста для этого локального проекта.
  2. Потом перезапускает веб сервер.
  3. Потом тащится редактировать /etc/hosts Прописывает там имя хоста и локальный ip.
  4. Потом выясняет что этот прописанный хост перекрывает тот который был в интернете или он ошибся когда прописал имя в конфиге веб-сервера или в hosts.

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

Что я предлагаю сделать.
Я предлагаю сделать локальный домен (в примере .mydev) и сократить процедуру выше до двух шагов:

  1. Прописываем конфиг веб-сервера с хостом вида projectname.mydev
  2. Перезапускаем веб-сервер.

И всё. И радостно начинаем допиливать наш проект по заданному имени.

Что будем делать, TODO

  1. Установим DNS сервер.
    sudo apt-get install bind9
  2. Идем разглядывать собственно конфиги. Принцип нашей этой гадости состоит в том что на данный момент при обращении к какому-либо хосту (это грубая схема) наша машинка ломится на провайдерский DNS выданный ему провайдером или прописанный иным образом это не суть. Получает собственно у DNS-а айпишник хоста ну и соответственно отправляется за данными в его сторону. Дальше нам не интересно.
    Как будет. Будет так: при обращении к какому-либо хосту, мы будем обращаться к локальному DNS серверу, который будет проверять наши правила и если запрос не попадает под наши правила, то наш локальный DNS идет и спрашивает тоже самое у провайдерского DNS-а. И отдает нам уже собственно его (провайдера) ответ. Итак, идем к конфигам
    cd /etc/bind
    Я пользуюсь mc, это удобно, рекомендую. Нам понадобятся права суперпользователя, так что либо sudo mc, либо sudo mcedit filename при редактировании каждого файла, вопрос с правами я далее затрагивать не буду.
  3. Открываем на редактирование named.conf.options
    Тут нас интересует секция forwarders её нам нужно раскомментировать и указать IP адрес(а) DNS сервера провайдера (или может быть роутера, смотря как организован выход в интернет). Сохраняем, выходим.
  4. Открываем на редактирование named.conf.default-zones
    Тут нам вниз нужно добавить новую зону. Выглядеть новая секция будет вот так:
    zone "mydev" {
        type master;
        file "/etc/bind/db.mydev";
    };
    
  5. По указанному пути создаем файлик
    sudo cp /etc/bind/db.local /etc/bind/db.mydev
    То есть просто делаем копию описания локальной зоны. Нам нужно будет в ней кое-что отредактировать. Итак копию сделали, теперь:
  6. Открываем на редактирование db.mydev
    Там нам нужно исправить всего несколько строк. В итоге наш db.mydev будет выглядеть вот так:
    $TTL    604800
    @       IN      SOA     mydev. root.mydev. (
        2 ; Serial
        604800 ; Refresh
        86400 ; Retry
        2419200 ; Expire
        604800 ) ; Negative Cache TTL
    
    @       IN      NS      mydev.
    @       IN      A       127.0.0.1
    *        IN      A       127.0.0.1
    @       IN      AAAA    ::1
    
    Жирным отмечены строки которые были отредактированы или добавлены. Сравните с оригинальным db.local для того чтоб было понятно что произошло. По сути ничего особенного.
  7. Теперь остается только перезапустить наш DNS
    sudo /etc/init.d/bind9 restart
  8. Ну и проверяем теперь как эта карусель работает.
    ping 11.mydev
    ping 22.mydev
    Если работает то IP должен быть тот что вы указали (в примере 127.0.0.1) Но сейчас ничего не работает. Потому что..
  9. Забыл рассказать про грабли. Наш уважаемый NetworkManager автоматом прописывает в /etc/resolv.conf адрес DNS провайдера. Если там будет прописан внешний DNS то наша поделка пролетит как фанера над Парижем. Обращения в сеть просто пойдут мимо неё. Чтобы это дело устранить, нужно зайти в свойства текущего подключения к интернету, "Изменить соединения" => Выбираем наше соединение => "Параметры IPv4". Тут указываем IP нашего локального DNS (в примере 127.0.0.1), сделать это можно выбрав метод "DHCP, только адрес". Этого должно быть достаточно. После этого через NetworkManager соединение разрываем и снова устанавливаем. Если все ок, то в /etc/resolv.conf мы должны увидеть наш искомый IP, тот что прописали как DNS в NetworkManager.
  10. Вот теперь проверяем результат.

Вот собственно и всё. Теперь можно не трогать /etc/hosts. Прошу обратить внимание, что решение я нашел сам и возможно оно неоптимальное или даже неправильное, но однозначно рабочее. Ничего подходящего я в интернете по форумам не нашел.