June 29, 2011

Свои библиотеки в локальном Maven репозитории

      Используемые библиотеки вымышлены. В ходе экспериментов никто не пострадал.
    Если необходимо в приложение, использующее maven, "засунуть" свою или любую другую jar-библиотеку, то как обычно есть два пути: простой и правильный.
    Начнём с простого. Берём и нагло добавляем зависимость в свой pom.xml:

    com.ua.super.libs
    libx
    1.0
    system
    /home/alex/proj/com/ua/super/libs/libx-1.0.jar

   Что характерно: значение "system" для параметра "scope", а так же полный путь к библиотеке для параметра "systempath". После этого "докачиваем" все объявленные зависимости и успокаиваемся. До определённого момента. Что это за момент, станет ясно тогда, когда придет час жестокой расплаты компиляции. После коварного "SUCCESSFUL BUILD" придет ехидный "ОБЛОМИСЬ!", т.к. в скомпилированный архив библиотека включена не будет, а использовать надо было правильный способ добавления библиотеки. Именно его мы и выберем.
   Второй способ состоит из целых 2-х основных этапов и одного дополнительного.
    Этап 1. Добавить библиотеку в локальный репозиторый maven:
mvn install:install-file -Dfile=/home/alex/proj/com/ua/super/libs/libx-1.0.jar -DgroupId=ua.cn.stu.super.libs -DartifactId=libx -Dversion=1.0 -Dpackaging=jar
    Если внимательно посмотреть на список параметров и предыдущий листинг зависимости, то всё станет ясно и не так страшно.
    Этап 2. Описать зависимость. Зависимость в данном случае объявляется как и в предыдущем, только писать на целые 2 строки меньше. Да и к локальной машине жесткой привязки нет.

    com.ua.super.libs
    libx
    1.0

    Что изменилось: убежали параметры "scope" и "systempath".
    [Этап 3]. Если добавляемая библиотека обкатана, отлажена и готова окунуться в суровые будни, то дальше читать особого смысла нет. Если же её текущая версия находится на стадии разработки/доработки, то после каждой её компиляции, нужно будет обновлять её в репозитории. Можно испльзовать все тот же 'mvn install' или решить задачу "в лоб", а именно применить ручное копирование библиотеки на её законное место в репозитории:
cp -i /home/alex/proj/com/ua/super/libs/libx-1.0.jar /home/alex/.m2/repository/com/ua/super/libs/libx-1.0.jar
    Вот, собственно, и всё.

June 11, 2011

Установка выделенного сервера "Ил-2 штурмовик"

Update from 14.04.2017:
  • add link to 4.13.4;
  • update Wine in Docker images from 1.9-staging to 2.0-stable.

Update from 18.03.2017:
  • add link to 4.13.3;
  • add link to Docker images of server.

Update from 03.12.2016:
  • add link to 4.13.2;
  • add links to services of IL-2 Horus Team;
  • rename several sections.

Docker images: il2horusteam/il2ds.



0
Содержание
  1. Этап 1. Собрать сервер по частям
  2. Этап 2. Настройки сервера
  3. Этап 3. Обзор команд консоли
  4. Этап 4. Настройка сложности
  5. Этап 5. Пробный запуск
  6. Этап 6. Доступ к серверу из внешнего мира
  7. Этап 7. Адрес: имя вместо цифр

Сервер ставится по частям по принципу обновлений. Берём их отсюда, начиная с самой древней:
  1. v2.04 (410 MiB)
  2. v3.03m (245 MiB)
  3. v3.04m (20 MiB)
  4. v4.01 (73 MiB)
  5. v4.02m (28 MiB)
  6. v4.03m (45 MiB)
  7. v4.04m (23 MiB)
  8. v4.05m (88 MiB)
  9. v4.06m (192 MiB)
  10. v4.07m (221 MiB)
  11. v4.071m (19 MiB)
  12. v4.08m (128 MiB)
  13. v4.09m (396 MiB)
  14. v4.09m (шкурки) (260 MiB)
  15. v4.10m (72 MiB)
  16. v4.10.1m (32 MiB)
  17. v4.11 (60 MiB)
  18. v4.11 hotfix (27 KiB)
  19. v4.11.1 (28.4 MiB)
  20. v4.12 (92.8 MiB)
  21. v4.12.1 (34.0 MiB)
  22. v4.12.2 (24.9 MiB)
  23. v4.13 (242 MiB)
  24. v4.13.1 (138 MiB)
  25. v4.13.2 (30 MiB)
  26. v4.13.3 (89 MiB)
  27. v4.13.4 (57 MiB)
Итак, всё это счастье скачалось. Архивы (rar, zip) распаковали. Теперь всё это нужно установить (распаковать exe-шники, если есть) в одно и то же место в том же самом порядке, что и при скачивании.
Настройка сервера состоит из настройки собственно сервера (файл confs.ini) и настройки его консоли (файл confс.ini). Файлы с настройками лежат в корне той директории, куда сервер был установлен (далее просто "в корне"). Файлы настроек состоят из секций, имена которых помещены между квадратными скобками (например, [Console]), и помещенных в них пар "ключ=значение". Без указания секций ничего работать не будет. Также имена секций и ключей чувствительны к регистру букв.
1
Настройка консоли. Файл confc.ini
(Если вы собираетесь управлять сервером с помощью одной машины, то можете перейти к п.2.2)
Консоль - это такая штука, позволяющая удаленно напрямую общаться с сервером. Т.е., сервер может быть запущен в любой точке мира, а с помощью консоли вы к нему подключаетесь и управляете его работой. Для этого нужно на двух машинах иметь копии папок с сервером. На удаленной машине нужно запустить сервер (см. Этап 5), а на текущей - "il2sconsole.exe" с IP-адресом удаленной машины в качестве параметра.
# Например, подключение к серверу по адресу "192.168.1.33"
il2sconsole.exe 192.168.1.33
В файле настроек консоли нас интересует только ключ "IP" из секции [Console]. Это порт, который будет использоваться для подключения к серверу. По умолчанию он равен 20001. Значение должно соответствовать тому, которое указано на сервере в "confs.ini" (см. п. 2.2.3).
[Console]
IP=20001

2
Настройка сервера. Файл confs.ini
Перед просмотром не помешает заглянуть [сюда]. Там описываются настройки для самой игры на английском языке. Конечно, некоторые секции для сервера лишние.

1
Секция [NET]
# Номер порта, на котором сервер будет
# слушать клиентов. Именно это значение нужно будет
# вводить при подключении из игры
localPort=21002

# Если сервер ставится в локальной сети, то при просмотре
# списка доступных серверов могут быть отображены их имена
# и описание. Следующие два параметра отвечают за них
# соответственно. Так же различные коммандеры (например,
# il2 server commander) могут их использовать различным
# образом. Опять-таки, например, при использовании il2sc
# они отображаются игроку при подключении)
serverName=Nice server
serverDescription=Really nice server

# Разрешить (1) или запретить (0) подгрузку шкурок (скинов)
# на сервере. Если разрешено, то игроки смогут использовать
# любые шкурки и остальные будут эти шкурки видеть. Иначе,
# какую бы шкурку пилот не использовал, остальные увидят
# только те, которые есть на сервере.
SkinDownload=1

# Наибольшее количество подключений, которое сервер может
# удерживать одновременно. По сути это наибольшее 
# количество пилотов на сервере. Чем больше пилотов - тем
# больше траффик и расходов ресурсов системы.
serverChannels=32

# Пропускная способность канала сервера в байтах в секунду.
# По некоторым данным принято использовать такие значения:
# 5000 : модем 56000
# 25000 : кабель
# 3000 : модем 28800
# Лично я со значениями не баловался
speed=25000

# включить (1) или выключить (0) защиту от спидхака со стороны сервера
checkServerTimeSpeed=1

# включить (1) или выключить (0) защиту от спидхака со стороны клиента
checkClientTimeSpeed=1

# Очень важный параметр. Включает (1,2) или выключает (0)
# жесткий контроль версий. Если включено, по попасть на 
# сервер смогут только те, у кого версия игры совпадает с
# версией сервера. Иначе попасть смогут все как с модами
# так и без, как со старыми версиями, так и с новыми. 
# (хотя есть такие читеры, которые пролазят где угодно)
# Для включения в винде можно использовать как значение 1,
# так и 2. Обычно используют 2, хотя и не знают, чем 
# отличается от 1. В unix-системах под wine-ом значение
# 2 проходит туго, если проходит вообще и приходится
# использовать значение 1
checkRuntime=1

# Допустимое расхождение часов сервера сервера и клиента
checkTimeSpeedDifferense=0.3

# Интервал контроля расхождения часов
checkTimeSpeedInterval=10.0

# Пачка параметров для подключения через SOCKS Proxy.
# Не использовал и сказать ничего не могу, хотя названия
# параметров сами говорят за себя
socksEnable=
socksHost=
socksPort=
socksUser=
socksPwd=

# Настройки сложности. О них вспомним чуть позже
difficulty=2143289343

2
Секция [chat]
# События, отображаемые в чате. Принимает значения от 0 до 3.
# 0 - выкл. все сообщ. о статистике
# 1 - показывать инф. об убийствах только для пользователь-пользователь
# 2 - показывать инф. об убийствах для пользователь-пользователь и пользователь-бот
# 3 - максимум - отображать полностью все сообщения (кто сел, кто разбился, кому рули выбили и проч.)
autoLogDetail=3

3
Секция [Console]
# Номер порта консоли. Это значение порта, к которому можно будет присоединиться
# с помощью консоли (или через сокет в своей программе)
IP=20001

# Разрешенные адресa клиентов консоли. Это список адресов, с которых можно
# подключиться к консоли текущего сервера с помощью "il2sconsole.exe".
# Например, разрешить доступ только с той же машины, на которой запущен сервер:
IPS=127.0.0.1

# или разрешить доступ с нескольких машин (адреса разделяются пробелами)
IPS=192.168.1.33 192.168.1.34 192.168.1.35

# Включение (1) и выключение (0) ведение журнала консоли.
LOG=1

# Имя файла, куда журнал будет записываться.
LOGFILE=logs.lst

# Сохранять ли файл журнала при новом запуске сервера.
# 1 - сохранять, 0 - не сохранять.
LOGKEEP=1

# Насколько мне известно этот ключ называется "форсированное
# чтение журнала" или запись.. лично я не помню.
# 1 - вкл., 0 - выкл.
LOGTIME=1

# Сколько строк текста консоли запоминать
HISTORY=1024

# Сколько команд консоли запоминать
HISTORYCMD=1024

4
Секция [game]
# Использовать ли новые облака из версии 4.х
TypeClouds=1

# Сохранять ли файл журнала при новом запуске сервера.
# Журнал консоли и журнал событий - это совсем разные вещи.
# 1 - сохранять, 0 - не сохранять.
eventlogkeep=1

# Имя файла, куда журнал будет записываться.
eventlog=eventlog.lst

# Записывать (1) или не записывать (0) в журнал событий
# информацию об уничтоженных зданиях (деревья тоже здания). 
# Функция интересная, но скорее всего только, если вы 
# пишете свой коммандер.
eventlogHouse=1

5
Секция [MaxLag]
# Максимальное время задержки (в секундах) между пакетами,
# полученными от конкретного клиента. Интервал, больший данного 
# значения рассматривается как "нарушение".
farMaxLagTime=10

# Максимально допустимое время задержки, когда самолет атакован
# или же когда он представляет угрозу для вражеского самолета.
# При появлении задержки больше заданной сервер считает, что 
# было "нарушение".
nearMaxLagTime=2

# Минимальное время между сообщениями о двух нарушениях.
cheaterWarningDelay=5

# Количество предупреждений игроку до момента его 
# автоматического удаления с сервера. Значение -1 отключает 
# функцию авт. удаления
cheaterWarningNum=3

Описывать все команды не буду, хотя бы потому, что не все их знаю. Документации по ним не нашел. Есть только синопсис для команд, который можно получить прямо из консоли. В сети, на мой взгляд, ничего дельного нет, кроме документа "ServerIL2ReadMe.doc". Автор неизвестен, но в конце докуметна написано Novice, что скорее всего является подписью. Некоторую часть я буду брать оттуда, надеясь, что автор документа не обидится.
# Вывести краткую справку. Если не вводить имя команды,
# то будет выведен список всех команд.
# Например, "?" или "help" выводят
# ?         alias     ban       channel   chat      console  
# del       difficulty exit     extraocclusion f    file     
# help      history   host      kick      kick#     maxping  
# mission   mp_dotrange param   server    set       show     
# socket    speedbar  timeout   tod       user
[?|help] [имя_команды]

# отправить сообщение всем
chat текст_сообщения ALL

# отправить сообщение пилоту с номером N
# номер берется из списка, возвращаемого командой 
# "user" 
chat текст_сообщения TO# N

# отправить сообщение пилоту по имени
chat текст_сообщения TO# имя

# отправить сообщение красной армии 
chat текст_сообщения ARMY 1
chat текст_сообщения ARMY red

# в конце команды можно установить размер буфера
# в символах. По умолчанию = 80. 
chat текст_сообщения ALL 90

# полностью остановить и выгрузить сервер
exit

# загрузить файл с комадами и выполнить их
# после старта сервера автоматичестки выполняется
# f server.cmd. Обычно в этом файле вызывают файл
# gc.cmd, имеющий подобное содержимое:
# 
# GC
# GC
# GC
# timeout 3600000 f gc.cmd
# 
# где GC - вызов сборщика мусора для java-машины
# команда "timeout" будет описана ниже
# суть последней строки в том, что сборщик
# мусора вызывается каждый час
f gc.cmd
file gc.cmd

# отключить пилота от сервера по имени
kick Ваня

# отключить пилота от сервера с номером N
# номер берется из списка, возвращаемого командой 
# "user" 
kick# 1

# определить максимальный пинг на сервере. 
# параметры DELAY и WARNINGS это то же самое,
# что и cheaterWarningDelay и
# cheaterWarningNum в файле confs.ini
maxping 700 DELAY 5 WARNINGS 3

# загрузить миссию на сервер
mission LOAD Net/dogfight/TRAIN/tankColumn.mis

# начать загруженную миссию
mission BEGIN

# обычно миссию загружают и сразу начинают, делая так:
mission LOAD Net/dogfight/TRAIN/tankColumn.mis BEGIN

# настройки видимости точек (конов)
# FOE или FRIENDLY - настроки для врагов или союзников
# COLOR (км) - расстояние, с которого виден цвет
# DOT (км) - расстояние, с которого видна точка
# RANGE (км) - расстояние, с которого виден счетчик расстояния
# TYPE (км) - расстояние, с которого виден тип самолета
# ID (км) - расстояние, с которого виден бортовой номер
# NAME (км) - расстояние, с которого виден ник пилота
mp_dotrange FOE COLOR 0.005 DOT 12.5 RANGE 0.005 TYPE 0.005 ID 0.005 NAME 0.005

# NAME и DESCRIPTION это то же самое, что и
# serverName и serverDescription в файле
# confs.ini
# PWD - пароль для входа на сервер. Если ничего не указано,
# то пускать будет всех и всегда
server NAME Nice server DESCRIPTION Really nice server PWD

# показать (SHOW) или спрятать (HIDE) спидбар
speedbar SHOW

# вызвать команду с задержой
# в данном случае это выполнить "f gc.cmd"
# через 3600000 мс, т.е. через 1 час
timeout 3600000 f gc.cmd

# устанавливает "на лету" время в миссии в значение 17:45
tod 17.45

# установить сложность. задаётся числом, или указывается
# конкретный аргумент и число 0, если параметр выключен,
# или 1, если включен
difficulty 128
difficulty NoOutsideViews 1

# посмотреть список пилотов. При этом будет выведен номер
# пилота, есло позывной, пинг, кол-во очков, армия и 
# текущий самолёт
user

# посмотреть информацию о конкретном пилоте, указанному 
# по имени или по номеру N
user Ваня
user # N

# вывести статистику всех пилотов. показывает текущее
# состояние, кол-во сбитых, уничтоженная техника по
# классам (как вражеское, так и дружественное), кол-во
# выпущенных и попавших патронов, ракет, бомб, и,
# наверное, что-то еще
user STAT

# посмотреть статистику конкретного пилота, указанному 
# по имени или по номеру N
user Ваня STAT
user # N STAT

Если вы читали всё, что было написано до этого, то должны были заметить, что настройки сложности можно задать тремя способами: "зашить" код в confs.ini, выполнив команду сервера "difficulty", указав код или название одного из параметров. Ниже приведена таблица, по которой можно узнать код или название параметра сложности. парамерты сложности можно суммировать, чтобы получить именно те настройки, которые необходимы вам. Например, код легких настроек равен 1090682880, средних - 6704004351, как в жизни - 549755813887.

Update 26.11.2014: более простой и понятный вариант этой секции находится в статье на Github: читать секцию на Github.

Параметр Код Значение
WindTurbulence 1 Ветер и турбулентность
FlutterEffect 2 Флаттер
StallSpins 4 Штопор
BlackoutsRedouts 8 Перегрузка
EngineOverheat 16 Перегрев двигателя
TorqueGyroEffects 32 Гироскопический момент
RealisticLanding 64 Реалистичная посадка
TakeoffLanding 128 Взлёт-посадка
CockpitAlwaysOn 256 Вид только из кабины
NoOutSideViews 512 Отключить внешние виды
HeadShake 1024 Перемещения головы
NoIcons 2048 Отключить маркеры
RealisticGunnery 4096 Реализм стрельбы
LimitedAmmo 8192 Ограниченный боезапас
LimitedFuel 16384 Ограниченный запас топлива
Vulnerability 32768 Уязвимость
NoPadlock 65536 Отключить фиксацию взгляда
Clouds 131072 Облака
NoMapIcons 262144 Отключить маркеры на карте
SeparateEStart 524288 Раздельный запуск двигателей
NoInstantSuccess 1048576 Выполнение задания
NoMinimapPath 2097152 Без маршрута на карте
NoSpeedBar 4194304 Без индикатора скорости
ComplexEManagement 8388608 Полное управление двигателем
Reliability 33554432 Реальная надёжность двигателей
GLimits 67108864 Динамическое ограничение перегрузки
RealisticPilotVulnerability 134217728 Реалистичная уязвимость пилота
RealisticNavigationInstruments 268435456 Реалистичная навигация
NoPlayerIcon 536870912 Отключить маркер игрока на карте
NoFogOfWarIcons 1073741824 Отключить маркеры разведки на карте
BombFuzes 2147483648 Бомбовые взрыватели
RealisticTorpedoing 4294967296 Реалистичное торпедирование
RealisticMissilesVariation 274877906944 Реалистичный разброс ракет
NoSelfView 137438953472 Без собственного обзора
NoFoeView 8589934592 Без обзора противника
NoFriendlyView 17179869184 Без обзора союзника
NoPlanesView 68719476736 Без обзора самолетов
NoACarrierView 34359738368 Без обзора авианосцев

Под виндой пробный запуск осуществляется просто: достаточно выполнить "il2server.exe" из корневойдиректории сервера. Ключ checkRuntime в файле confs.ini может спокойно принимать значение от 0 до 2. Для unix-систем надо ещё кое-что сделать. Во-первых, установить Wine. Во-вторых, надо установить winetricks. Делается это так: после скачивания winetricks, например,
wget http://winetricks.org/winetricks
необходимо выполнить
winetricks corefonts vcrun6 wsh56
После этого выполняем
wine /ПУТЬ_К_СЕРВЕРУ/il2server.exe
Если в процессе запуска Вы не увидили ничего похожего на это:
fixme:msvcrt:MSVCRT__sopen : pmode 0x01b6 ignored
то значит, что всё прошло успешно. Хочется только заметить, что ключ checkRuntime должен быть равен или 0 или 1, т.к. при значении 2 постоянно выбрасывает при подключении в серверу.

В данный момент сервер уже может быть настроен и полностью готов к работе. К Вам однозначно можно подключиться через локальную сеть, но этого, наверное, Вам покажется мало. Вам нужен интернет. В этом случае очень вероятно, что придется покопаться в настройках модема, а именно пробросить порт (ссылка2, англ) через NAT. Всё это не так сложно и страшно, как звучит (главное вспомнить или знать пароль доступа к модему). Поможет Вам либо руководство пользователя к модему, либо вот эта страница, на которой можно найти свой модем (а если не найдете, по все равно принцип везде один и тот же). Выбрали модель модема, например, этот, нажали в самом верху справа на ссылку с названием "Click here to skip this advertisement..." и попали к списку программного обеспечения, для которого написаны инструкции. Все они одинаковы, но все же найдем на букву "I" наш "IL-2 Sturmovik - Forgotten Battles". В примере указан порт 21000. Вам же надо ввести то значение, которое присваивали ключу "localPort" в файле confs.ini. В некоторых модемах можно легко добавить целый диапазон портов, например от 21000 до 21010 или выше. Без необходимости большие диапазоны лучше не использовать, т.к. Вы врядли поставите одновременно несколько десятков серверов или даже хотя бы 2-3. Если в вашей локальной подсети несколько машин, использующих один модем для выхода в интернет (например, в доме, квартире или подъезде), то лучше еще и закрепить за собой статический IP в этой локальной подсети. Обычно модемы позволяют сделать такое. Для этого смотрите инструкцию к модему или спрашивайте кого-нибудь знакомого. Обычно вся процедура занимает не более 30 секунд, так что надеюсь, проблем не возникнет.

IP адрес - набор цифр, разделённых точками, трудно воспринимаемых и плохо запоминающихся. Эти неудобства можно обойти путём копирования и вставки адреса. Но что, если он у вас динамический? Разве удобно при каждой его смене сообщать всем его новое значение? Очевидно, что нет. В этом случае нам поможет DNS, который позволит обащаться к нашей машине по одному и тому же символьному имени. Самый простой способ его получить - зарегистрироваться на сайте dyndns.com и опять покопаться в настройках модема. О том, как это сделать писать не буду, т.к. информации в сети полно. Подойдёт, например, вот эта статья. Главное, чтобы вожможности модема позволили. Сама процедура не намного сложнее, чем проброс портов, и здесь я тоже надеюсь, что особых проблем возникнуть не должно.

June 10, 2011

Олимпиада по контроллерам глазами олимпиадника

     Одной из 4-х олимпиад, в которых я учавствовал с февраля по апрель, была олимпиада по микроконтроллерам. Проходила она с 15 по 17 апреля и проводилась фирмой "Оупен Систем" совместно с КПИ. Фирма проводит олимпиады каждый год уже не знаю, сколько лет подряд, меняя универ каждые 3 года. Поехал я в составе одной из двух команд от нашего универа. Немного позднее в универе сказали, что видели наши фотки на сайте "не все дома". О сайте я раньше ничего не слышал, и поэтому само название и смех информатора несколько настораживали. Потратив битые полчаса я все-таки нашел статью, где действительно были фотки. Правда, на фотках из всех участников наших 2-х команд я нашел только себя да и то один раз. Сама статья вот здесь, а фотка в самом низу. Может репортера в плохо проинформировали или он сам немного напутал, но в общем статья в некоторых местах искажает суть событий. Мне это долгое время не нравилось и решил несколько подправить то, что сказал автор стати.
    Сама олимпиада проводится в 2 этапа, разделённых во времени, на отладочных стендах, предоставляемых фирмой-организатором.
    1-й этап заочный и обычно проводится осенью. Это означает, что участники могут находиться в любой точке планеты и использовать любые подручные средства при выполнении заданий. Готовые задания отправляются на удалённый сервер, где они и проверяются.
    2-й этап уже очный и проводится он весной. Все участники съезжаются в один универ, рассаживаются по аудиториям и опять-таки выполняют задания, отправляя результаты на сервер. При этом пользоваться уже можно только макулатурой, любой, но принесенной с собой, плюс документацией к аппаратной части. Из всех доступных программных средств - только текстовый редактор, компилятор и ПО для программатора (калькулятор и просмотрщик PDF - не в счёт :) ). Библиотек для работы со стендом не дают. Обычно организаторы за день до начала олимпиады могут сообщить о том, что будет использоваться некоторая дополнительная аппаратная часть (например, ЭМ-катушка, которую самому смотать надо или, как было в этот раз, 2-хстрочный LCD-дисплей). В любом случае на очную олимпиаду надо тащить с собой пачку распечатанных исходников своих собственных библиотек, а потом тратить время на то, чтобы их набрать в редакторе, вместо того, чтобы решать задачи. Ну это бывает только тогда, если повезёт, и при решении заданий нужно будет использовать что-то, что уже придумалось, проверилось и распечаталось.
    В этот раз зимой нам сказали, что в этом году 2-й этап будет проводиться на роботах-танках, в которых стоит Atmega64. До этого мы долбили только стенды этой фирмы, на которых стоят древние i8051. Танки прислали уже весной. Пришлось в перерывах между 4-мя олимпиадами разбираться с AVR и с самим танком. Думали, что это будет основное задание и отнеслись к дело серьёзно. Потом за неделю до олимпиады стало известно, что это совсем не основной тур (наверное, многие отказались), а основным туром опять будут стенды. Стало несколько досадно, особенно потому, что к этому времени многое по стендам несколько забылось. А ещё через пару дней стало известно, что одна наша команда будет долбить стенды на тех же i8051, а вторая - на AVR. 2-ю команду это вообще убило, т.к. стенды на AVR никто долбить не собирался и нужно было за 4-5 дней со всем этим разобраться, параллельно добивая танк.
    Обычно олимпиада длится часов с 9 утра и до 16. Иногда где-то на полчаса могут продлить. В этот раз сделали так, что те, кто занимаются только стендами и те, кто занимаются только танками используют это время полностью. 1-е - для решения заданий, 2-е - для подготовки к конкурсу с танком. А такие команды как наша половину времени используют на работу со стендом, после чего один участник идет готовься к танкам, оставляя второго наедине с эти самым стендом. Где-то часов в 11-12 делают небольшой перерыв минут на 10-15. Эти 15 минут мы использовали сполна. Дело в том, что олимпиада проводилась в субботу, т.е. выходной. Распечатанных библиотек с собой мы не привезли - чисто физически не успели их подготовить. В ночь перед олимпиадой мы с одним из участников вообще не спали: он клепал эти библиотеки для 51-го и AVR, а я допиливал танк. И вот после бессонной ночи нам еще и не повезло: в субботу утром всякие печатные центры еще спят и возможности распечатать хоть что-нибудь не было. Несколько обрадовало то, что в универе был интересный автомат наподобие банкомата. Вставляешь в него флешку вместо карточки, выбинаешь на экране файлы для распечатки и печатаешь их, если есть бумага в лотке и деньги при себе. Штука довольно удобная, особенно учитывая её привлекательный дизайн в стиле, чем-то напоминающем Apple. Но именно идея удобства и привлекательност были чисто издевательством, поскольку стояла там винда, ужасно тупила и при открытии того файла, который нам надо было печатать она просто висла. Пришлось половину времени просто вспоминать всякое из библиотек и лазить по даташитам, для того, чтобы найти адреса устройств и хоть что-то написать.
    Дождавшись перерывая мне пришлось бегать по улице и искать центр распечатки, а напарнику моему нужно было бежать фиг знает куда, чтобы забрать свою паяльную станцию, которую он до этого еще дома заказал. После перерыва я пошел дальше мучить танк и готовиться к конкурсу. Но тут меня ожидал, наверное, самый большой провал. Всю ночь танк делал то, что я хотел. Ну или почти то, но во всяком случае прочентов 85-90 меня устраивало. А днём он взбесился, вернее взбесились датчики. Даже самые простые датчики линий, которые стоят на бамперах по бокам и смотрят вниз, отказывались работать. Причем это происходило даже, если поменять сами бамперы или использовать пограмму, тестирующую только их. На то, чтобы вернуть их к жизни ушло не меньше получаса (а времени на подготовку было всего часа 2). Дальше было веселей. 
   Больше всего проблем создавала катушка, составляющая часть миноискателя. Незная как, её намотать на предоставленное нам пластмассовое кольцо довольно-таки сложно. Сложность не в самом процессе намотки (тут мы прибегали к довольно эффективным извращениям), а том, чтобы правильно подобрать индуктивность. Металлодетектор должен определять копейки строго определённого номинала. Их можно различать исходя только из размеров копейки и металла, из которого она сделана. Поскольку все копейки похожи, то и различать их довольно сложно. Необходимо правильно подобрать толщину проволки и количество витков, добиваясь оптимальной индуктивности катушки. В программировании к программам нужно жестко применять 3 очень важных критерия: размер программы, быстродействие, объем используемых ресурсов. Размер программы и быстродействие - вещи обратнопропорциональные. С катушкой вышло примерно то же самое: необходимо обеспечить точность определения номинала копейки, сохраняя при этом скорость. Точность повышается путем увеличения индуктивности, что достигается добавлением количетсва витков. Точности при этом можно добиться очень хорошей, но при этом увеличивается время намагничивания и размагничивания катушки. Проходя в течении 200мс над монетой с ускорением 9g (от сервопривода HXT900) котушка с большой индуктивностью мало что успевает хотя бы засечь. К тому же в зависимости от толщины проволоки её масса может заметно возрастать и при тех же самых 9g сильно болтать танк, который имеет маленькую массу и на гладких поверхностях довольно легко скользит. Если количество витков уменьшать, то детектор начинает ловить всё подряд, включая различный фон. К тому же со временем котушка несколько намагничивается сама по себе и при малой индуктивности начинает заметно фонить. Но на этом веселье не заканчивалось. В танке металлодетектор и датчик света подключаются на одну плату. При этом певый начитает давать такие наводки, что это сводит с ума не только танк, но и меня в том числе. В конце-концов пришлось отнести плату, чтобы её немного изменили, но было уже слишком поздно. В конце-концов пришлось отказаться от участия. Честно говоря, до сих пор очень досадно, т.к. наблюдая за ходом соревнований часто посещала мысль, что если бы не эти катушка с датчиком света, то мы бы их... не буду говорить, что, а поправлю некоторые комментарии автора статьи на "не все дома".
  1. "Изучаем задание! На каждую команду по танку и компьютеру и программатору." :: С одним программатором далеко не уедешь. Там еще и этот пресловутый стенд был.
  2. "Задание выполняется на ассемблере или С++." :: Никаких ++. Чистый С. Лично я не знаю, зачем там можно было бы использовать С++.
  3. "Вот и сам программатор" :: Да это же стенд чистой воды.
  4. "Монетки.... на поле будет много 25-копеечных монет, которые нужно будет обойти, а на гривневые нужно будет наехать" :: Хочу добавить, что там и другие номиналы были. Например, 5 и 50.
  5. "Отдых программисту нужен. И точка!" :: Это "надзиратель". За день до олимпиады у него заспиной на доске было написано большими буквами  Х**, в общем то, что обычно на заборах можно увидеть. Фотка есть, но из морально-этических соображений показывать не буду:)
    Собственно вот та фотка, о которой писалось вначале. Я там с красным бэджиком между парнями в зелёном и оранжевом. Перед этим всю ночь не спал, так что вид у меня соответствующий.


Установка PostgreSQL+PostGIS

    Делали в универе командный курсовик и нужно было использовать PostGIS. Дело в том, что курсовик был взят не из списка стандартных заданий, а являлся частью одного разрабатываемого мной проекта. Так как курсовик командный, то не удивительно, что у членов команды ОС отличались. Я, конечно, не говорю, что в случае командной работы у всех должны быть разные ОС, но в нашем случае вышло именно так. В конечный список ОС попали следующие: Windows XP, Windows 7, Ubuntu и LinuxMint. Принципиальных различий в процессе установки нет. Что XP - винда, что семерка - винда. Что Ubuntu - GNU/Linux, что LinuxMint - GNU/Linux, еще и основанная на Ubuntu. И там, и там можно ставить как с бинарников, так и с исходников. К тому же в unix-подобных системах есть репозитории. В процессе работы я еще мучил с десяток дистрибутивов GNU/Linux в ознакомительных целях и как-то решил поставить PostGIS на Mandriva. Не помню почему, но почему-то пришлось повозиться несколько дольше, чем при работе с другими дистрибутивами. Исходя из этого писать про Mandriva не буду. Хотел еще поставить на Gentoo и написать об этом, но пока что совсем нет времени колупаться с ней.
   Итак, заканчивая лирическое вступление, скажу, в каких ОС будет рассмотрена установка PostGIS:
  1. Windows XP
  2. Ubuntu 11.04
  3. Arch Linux


    Windows XP 

    С виндой дела обстоят достаточно просто. Скачиваем 2 бинарника и запускаем их по очереди. Первый бинарник - это сам сервер постгрес. Его можно скачать на официальном сайте. Второй бинарник - это, как подсказывает Капитан Очевидность, сама примочка PostGIS. Её можно взять здесь. В случае с виндой разработчики PostgreSQL всё сделали на удивление хорошо. Устанавливая сам сервер, Вам еще прикрутят PgAdmin, дадут каких-то пряников и сверху положат StackBuilder. Эта штука позволяет не рыться в недрах интернета и не искать всякие другие штуки, типа PostGIS и Slony-I. Так что, возможно, Вы захотите скачать только инсталлятор сервера, а дальше заставить StackBuilder делать своё грязное дело. Вам так же никто не запрещал устанавливать всё из исходников:).
   О том, как всё это дело установить, разработчики уже написали и, как в детской книжке, все проиллюстрировали. Посмотреть на это можно прямо здесь. Единственное, что хочу заметить, так это то, что в процессе установки PostGIS галочку "Create spatial database" лучше не снимать, если Вам нравится, когда кто-то за Вас делает какую-то работу. Лично мне нравится, когда инсталлятор устанавливает за меня необходимые функции и прочее, а потом еще и делает шаблон, на основании которого можно в будущем создавать базы данных двумя-тремя щелчками мыши.
   Следует заметить, что установщик содержит версию 1.5 PostGIS (или свежее). Если после его установки необходимо обеспечить поддержку баз данных с более ранними версиями PostGIS, то скачать отсюда бинарники (архив) и добавить содежимое каталогов "lib" и "share" в одноимённые каталоги Postgres (например, C:\Program Files\PostgreSQL\8.4\)

    Ubuntu 11.04 

    Перед тем как читать данный пункт, посмотрите на всякий случай п.3 : установка для Arch Linux (даже если у Вы используете другой дистрибутив).

    В убунте далеко ходить не надо. Открыли терминал, ввели указанные ниже команды и получили то, что нам нужно, а именно: сервер, клиент, библиотеки, документацию, постгис, графическое приложение для администрирования.
sudo apt-get install postgresql-8.4 postgresql-client-8.4 postgresql-contrib-8.4 postgresql-doc-8.4 postgresql-8.4-postgis
sudo apt-get install pgadmin3
    Как видно из команд, версия сервера у нас выйдет 8.4. Если быть точнее, то выполнив sql-запрос
SELECT version();
    в моём случае версия определилась как 8.4.8.
    Дальше необходимо настроить сам сервер БД. Не желая заниматься копипастом, просто приведу ниже пару ссылок, где об этом написано вполне доходчиво.
  1. Англоязычная статья на hocuspokus.net.
  2. Её русскоязычный перевод с примечаниями на welinux.ru.
    Кое-что хочу добавить от себя. Во-первых, прописывая пути каталогов, будьте внимательны к версии сервера (у Вас же необязательно версия 8.3, как в примере)
    Во-вторых, в файле "pg_hba.conf" строка
# Database administrative login by UNIX sockets
local all postgres ident sameuser
    не понравилась серверу и пришлось заменить её на эту:
local all postgres md5
   Это то, что касалось установки и настройки самого сервера.

   Теперь нужно настроить PostGIS (вернее даже не настроить, а прикрутить к серверу).
    Создадим новый шаблон и зарегистрируем диалект на сервере:
sudo su postgres
createdb postgistemplate
createlang plpgsql postgistemplate
    При этом нас попросят ввести пароль пользователя.
    Далее необходимо наполнить шаблон функциями и информацией о типах данных.
psql -d postgistemplate -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql
psql -d postgistemplate -f /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql
psql -d postgistemplate -f /usr/share/postgresql/8.4/contrib/postgis-comments.sql
    Хочу заметить, что расположение скриптов может несколько отличаться, но обычно не больее, чем на 1-2 ветки. Теперь осталось перезапустить сервер и можно приступать к работе. Для наглядности создадим через pgAdmin новый сервер. Пример того, что получилось, представлен на рисунке ниже. Как видно, присутствуют два шаблона: postgres и созданный нами postgistemplate.


    Узнаем версию установленного PostGIS, выполнив запрос:
SELECT postgis_full_version();
    в моём случае версия определилась как 1.5.1.

    Arch Linux 

    Для Arch Linux процесс установки не очень-то отличается от описанного выше (линукс всюду одинаков) и отлично документирован на официальном сайте. Установку PostgreSQL можно посмотреть [тут] (есть даже русскоязычный вариант, по все-таки предпочитаю английский), а установку PostGIS - [тут]. Лично я рекомендую читать именно эти инструкции.
    Кстати, в репозиториях вполне свежие версии (в данный момент 9.1.2 для PostgreSQL и 1.5.3 для PostGIS).