воскресенье, 18 ноября 2012 г.

Bash скрипт для useradd/userdel, mysql, apache

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

какиой мне нужен был функционал:

1. указываем только имя пользователя (пароль генерирует сам скрипт)
2. скрипт должен создать такого пользователя в системе с домашней директорией (ругаться - если существует такой юзверь).
3. у него в домашней директории (доступной по FTP) создать поддиректории htdocs - для сайта и logs - для логов апача.
4. создать базу данных - такуюже как и имя пользователя. завести MySQL пользователя с таким же именем и таким же паролем как и на FTP
5. добавить в апач виртуальных хость ИМЯ_ПОЛЬЗОВАТЕЛЯ.mysite.com - для доступа к сайту извне
6. должен уметь удалять все что надобавлял - если захотим пользователя удалить

понедельник, 23 июля 2012 г.

Настройки postfix и sendmail при внешней MX записи. Debiad, Ubuntu

Проблема

У меня, на моем сервере example.com (допустим), MX запись почты указывает на почтовые сервера google. С недавнего времени возни кла проблема, MTA sendmail, который стоял на сервер по умолчанию, перестал отправлять почту на адреса вида username@example.com. Дело в том, что MTA при отправке почты на example.com видит, что это же он сам!, т.к. домен с которого почта отсылается и вправду example.com. В результате он и не думает смотреть DNS на предмет MX записей, а пытается отправить локальному пользователю. В результате или ошибка, если пользователя нет, или складывается в локальную директорию пользователя.

суббота, 21 июля 2012 г.

Давайте сделаем рогалик. Глава 28: Ювелирные изделия

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

Давайте сделаем рогалик. Глава 27: Балансируем уровень сложности

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

Давайте сделаем рогалик. Глава 26: Зелья


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

воскресенье, 22 апреля 2012 г.

Давайте сделаем рогалик. Глава 25: Обобщаем атрибуты персонажа

В следующей главе мы будем добавлять зелья в нашу игру. Зелья будут влиять на атрибуты персонажа, но в данный момент доступ к атрибутам не очевиден. Если вы помните, для каждого атрибута мы создали массив размерностью в 3 элемента. Значение с индексом 0 содержит базовое значение характеристики, 1 — бонус и 2 — время действия бонуса заданное в ходах. И хотя это работает, возможно спустя некоторое время увидев в коде программы число 0 мы не будем знать, что это за значение и что оно означает. Вместо использования 0-ля мы можем использовать мнемоническое значение, например idxAttr, которое будет указывать на базовое значение атрибута. Это гораздо яснее и позволяет изменять программу очень легко, просто изменив значение idxAttr.

Давайте сделаем рогалик. Глава 24: Волшебные жезлы

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

Давайте сделаем рогалик. Глава 23: Балансируем атаки монстров

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

Давайте сделаем рогалик. Глава 22: Дистанционный бой

При первом рассмотрении, кажется, что добавить дистанционные атаки достаточно просто. Мы должны выбрать цель, запустить снаряд и проверить — попали ли мы им куда либо. Рассмотрев задачу более подробно, мы можем разложить ее на несколько простых подзадач, которые нам необходимо реализовать:

  • Система выбора цели
  • Боеприпасы и их количество
  • Система перезарядки оружия
  • Анимация атаки
  • Расчет повреждений

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

пятница, 16 марта 2012 г.

Давайте сделаем рогалик. Глава 21: Прокачка персонажа

Еще одна вещь, которая поможет персонажу выжить в подземелье, это улучшение его характеристик. У нас уже есть описание клавиши для этого действия на основном экране, клавиша "х". Так что нам нужно просто добавить функциональность.

четверг, 15 марта 2012 г.

Давайте сделаем рогалик. Глава 20: Суть отдыха

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

Давайте сделаем рогалик. Глава 19: Ближний бой

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

Давайте сделаем рогалик. Глава 18: Движение монстров

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

среда, 14 марта 2012 г.

Мультиязычное приложение на gcc при помощи gettext

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

Рассмотрим локализацию приложения пр помощи GNU утилит gettext на конкретном примере. В качестве препарируемого приложения я выбрал roguelike игру Cataclysm (git-hub: https://github.com/Whales/Cataclysm, forum: http://whalesdev.com/forums/). Код написан на c++ и открыт. Текстовые сообщения в ней безобразно размазаны по всему коду, так что код отлично подойдет для примера :)

среда, 7 марта 2012 г.

Давайте сделаем рогалик. Глава 17: Монстры

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

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

вторник, 6 марта 2012 г.

Давайте сделаем рогалик. Глава 16: Оружие

Прежде чем перейти к реализации оружия, давайте взглянем на некоторые изменения в коде. Вместе с последним обновление появилась странная ошибка, в результате которой на карте появлялись фантомные предметы. На карту добавлялся идентификатор предмета и ничего больше. Глядя на код генерации предметов питания я обнаружил, что перечисление, используемое в генераторе случайных чисел, было изменено. Вместо того, чтобы верхняя граница задавалась supBottleOil (бутылка с маслом), почему то была указана броня armPlate. Я не знаю как это произошло, но это и являлось причиной создания фантомных предметов. Я исправил эту проблему и добавил в нескольких местах кода проверки, чтобы сразу знать что происходит нечто странное, если такая же ситуация повторится. (Примечание: бутылка масла была удалена из кода последующих глав, так как у нас не будет темных подземелий. Смотри раздел примечаний, где описаны идеи того, как можно добавить темные подземелья в игру).

воскресенье, 4 марта 2012 г.

Давайте сделаем рогалик. Глава 15: Броня и щиты

Следующим нашим шагом будет добавление в игру предметов брони и щитов. Также, чтобы они у нас работали, нам необходимо реализовать команду инвентаря «Взять в руки/Одеть». Тут мы сталкиваемся с небольшой проблемой, так как нам нужно уметь не только одевать предметы, но и снимать их. Так как мы имеем дело с двумя действиями, то имеет смысл реализовать для них две команды: «Взять в руки/Одеть» и «Снять». Этим мы и займемся в этой главе.

суббота, 3 марта 2012 г.

Давайте сделаем рогалик. Глава 14: Инвентарь персонажа, ч. II

В этой главе мы закончим код обработки наших предметов питания. Так что можно будет отбросить команды «Съесть/Выпить» и «Осмотреть». До этого момента, различные участки кода нашей программы работали, в основном, в изоляции. Теперь мы подошли к моменту, где участки кода, начинают взаимодействовать друг с другом, особенно в команде «Съесть/Выпить». Употребление лечащих трав вылечит персонажа, кусок мяса добавит здоровья и, возможно, даст временный бонус к атрибуту силы, а у хлеба есть возможность вылечить отравление ядом. С этой точки зрения, различные модули программы будут начинать все больше взаимодействовать друг с другом, по мере того, как мы будем развивать динамическую систему описывающую наш игровой мир. Это захватывающая часть процесса программирования, когда вы будете видеть, как различные модули начинают работать вместе, и мир, который мы создали, начинает оживать.

Давайте сделаем рогалик. Глава 13: Инвентарь персонажа

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

Давайте сделаем рогалик. Глава 12: Генерация вещей

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

Давайте сделаем рогалик. Глава 11: Устройство инвентаря

Создание модели структуры данных для рогалика, или любой другой игры, которая должна манипулировать с различными предметами, представляет интересную задачу для программиста. Структура данных должна быть в состоянии хранить предметы обладающие различными свойствами и характеристиками, сохранять эти элементы в коллекции и давать возможность легко всем этим управлять на протяжении всего игрового процесса. Также нам необходима эффективная и самодостаточная структура данных, которая могла бы содержать в себе и манипулировать совершенно разными структурами данных — для организации списков предметов разных типов. Задача кажется почти невозможной, но на самом деле все достаточно просто. Мы создадим составной тип данных, в котором будем хранить информацию о различных параметрах различных предметов используя определения типов Type Defs и объединения Union.

Давайте сделаем рогалик. Глава 10: Главный интерфейс

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

Давайте сделаем рогалик. Глава 09: Бродим

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

Давайте сделаем рогалик. Глава 08: Подземелье

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

Давайте сделаем рогалик. Глава 07: Строим подземелье

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

Давайте сделаем рогалик. Глава 06: Вступление

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

Давайте сделаем рогалик. Глава 05: Генерация персонажа

Теперь, когда у нас есть основная идея того, что нам нужно для нашей ролевой системы, мы можем приступить к описанию нашего игрового персонажа. Мы боавим новый файл в проект, называющийся character.bi. В нем мы опишем тип characterinfo, который содержит все атрибуты и навыки нашего персонажа, а также некоторую дополнительную информацию.

Давайте сделаем рогалик. Глава 04: Ролевая система

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

Давайте сделаем рогалик. Глава 03: Главное меню

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

Давайте сделаем рогалик. Глава 02. Улучшаем код

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

Давайте сделаем рогалик. Глава 01. Титульный экран

Создание рогалика предполагает некоторое планирование, но есть одна вещь, которую мы можем сделать в самом начале: создать титульный экран. Это позволит нам начать проект, что иногда, бывает очень трудно. Легко застопориться на шаге «С чего же мне начать?», но кодирование экрана заставки позволит сдвинуться с мертвой точки. Делается это просто, позволит создать нам несколько файлов для будущего проекта, а также, настроит наше мышление на дальнейшее программирование.

вторник, 28 февраля 2012 г.

Делаем систему массовой рассылки. Удаление "плохох" адресов.


Итак. Сама система генерации и рассылки писем на кучу адресов - дело элементарное. Давайте сейчас рассмотрим вопрос по исключению из последующих рассылок емайл адресов, которые вернулись назад, т.к. такого адреса не существует (ну или по какой либо другой причине). Изначально я хотел писать скрипт, который бы по pop3 протоколу соединялся бы с сервером почты, забирал ее и дальше парсил, но, как известно, лень - двигатель прогресса. В результате немного гугла и организовалось простое и, главное, быстрое решение этой задачи.

пятница, 10 февраля 2012 г.

Шлюз в интернет через OpenVPN

Думаю, ни для кого не секрет, что интернет в Объединенных Арабских Эмиратах порезан еще больше чем то, что у местных в штанах. Так как мне некоторое время приходилось работать в ОАЭ (несколько лет), то меня такая позиция монопольного интернета не устраивала совершенно. Некоторые мои знакомы пользовались платными и условно бесплатными сервисами для выхода в интернет в обход ограничений провайдера. Но у меня уже был купленный в германии выделенный сервер, так почему бы не приспособить его для свободного доступа в интернет. Наиболее просто решение, это настроить на нем OpenVPN сервер, который бы использовался в качестве шлюза интернет трафика между внешним миром и подключенными к нему клиентами.