Я тут хочу написать о другом. Допустим есть у нас 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 то логично потеряете прозрачность.
# для файла совсем просто md5sum file.txt # для строки чуть замороченнее echo -n 'string ololo jj' | md5sumЧтобы понять почему так и что за ключи смотрим man md5sum и man echo.
Рассматривается такя ситуация: надо заставить 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 restartREM ещё такой вариант есть, для 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Ну вот примерно так. Прошу не воспринимать эту заметку как полное руководство к действию, вполне возможно что для вашего случая все будет значительно отличаться. Но возможно это как-то поможет или хотя бы наведет на мысли в нужном направлении :) Успехов!
Пользовался вот этим источником. Рекомендую на него взглянуть, надеюсь он ещё дышит.
find /path/to/directory -type d -exec chmod g+s {} \;Вики: http://ru.wikipedia.org/wiki/Suid
UPD: Таже самая цель, но меньшей кровью — настройка dnsmasq
Зачем это надо.
Надо это затем что есть например 10 локально поднятых проектов на рабочей станции разработчика. Этот разработчик
- Для работы с локальной копией проекта редактирует конфиг своего веб сервера (apache, lighttpd etc.) и указывает в конфиге имя хоста для этого локального проекта.
- Потом перезапускает веб сервер.
- Потом тащится редактировать /etc/hosts Прописывает там имя хоста и локальный ip.
- Потом выясняет что этот прописанный хост перекрывает тот который был в интернете или он ошибся когда прописал имя в конфиге веб-сервера или в hosts.
В итоге всего этого занудства как правило тратится драгоценная нервная энергия которую можно потратить более эффективно на что-то поинтереснее.
Что я предлагаю сделать.
Я предлагаю сделать локальный домен (в примере .mydev) и сократить процедуру выше до двух шагов:
- Прописываем конфиг веб-сервера с хостом вида projectname.mydev
- Перезапускаем веб-сервер.
И всё. И радостно начинаем допиливать наш проект по заданному имени.
Что будем делать, TODO
- Установим DNS сервер.
sudo apt-get install bind9 - Идем разглядывать собственно конфиги. Принцип нашей этой гадости состоит в том что на данный момент при обращении к какому-либо хосту (это грубая схема) наша машинка ломится на провайдерский DNS выданный ему провайдером или прописанный иным образом это не суть. Получает собственно у DNS-а айпишник хоста ну и соответственно отправляется за данными в его сторону. Дальше нам не интересно.
Как будет. Будет так: при обращении к какому-либо хосту, мы будем обращаться к локальному DNS серверу, который будет проверять наши правила и если запрос не попадает под наши правила, то наш локальный DNS идет и спрашивает тоже самое у провайдерского DNS-а. И отдает нам уже собственно его (провайдера) ответ. Итак, идем к конфигам
cd /etc/bind
Я пользуюсь mc, это удобно, рекомендую. Нам понадобятся права суперпользователя, так что либо sudo mc, либо sudo mcedit filename при редактировании каждого файла, вопрос с правами я далее затрагивать не буду. - Открываем на редактирование named.conf.options
Тут нас интересует секция forwarders её нам нужно раскомментировать и указать IP адрес(а) DNS сервера провайдера (или может быть роутера, смотря как организован выход в интернет). Сохраняем, выходим. - Открываем на редактирование named.conf.default-zones
Тут нам вниз нужно добавить новую зону. Выглядеть новая секция будет вот так:zone "mydev" { type master; file "/etc/bind/db.mydev"; };
- По указанному пути создаем файлик
sudo cp /etc/bind/db.local /etc/bind/db.mydev
То есть просто делаем копию описания локальной зоны. Нам нужно будет в ней кое-что отредактировать. Итак копию сделали, теперь: - Открываем на редактирование 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 для того чтоб было понятно что произошло. По сути ничего особенного. - Теперь остается только перезапустить наш DNS
sudo /etc/init.d/bind9 restart - Ну и проверяем теперь как эта карусель работает.
ping 11.mydev
ping 22.mydev
Если работает то IP должен быть тот что вы указали (в примере 127.0.0.1) Но сейчас ничего не работает. Потому что.. - Забыл рассказать про грабли. Наш уважаемый NetworkManager автоматом прописывает в /etc/resolv.conf адрес DNS провайдера. Если там будет прописан внешний DNS то наша поделка пролетит как фанера над Парижем. Обращения в сеть просто пойдут мимо неё. Чтобы это дело устранить, нужно зайти в свойства текущего подключения к интернету, "Изменить соединения" => Выбираем наше соединение => "Параметры IPv4". Тут указываем IP нашего локального DNS (в примере 127.0.0.1), сделать это можно выбрав метод "DHCP, только адрес". Этого должно быть достаточно. После этого через NetworkManager соединение разрываем и снова устанавливаем. Если все ок, то в /etc/resolv.conf мы должны увидеть наш искомый IP, тот что прописали как DNS в NetworkManager.
- Вот теперь проверяем результат.
Вот собственно и всё. Теперь можно не трогать /etc/hosts. Прошу обратить внимание, что решение я нашел сам и возможно оно неоптимальное или даже неправильное, но однозначно рабочее. Ничего подходящего я в интернете по форумам не нашел.