Наверное многие знают что такое запускатор для сервера майнкрафт, но не многие знают как его сделать. Делается он очень просто, сейчас я расскажу как.
- Скачиваем архив c CraftBukkit сервером для нужной вам версии На официальном сайте Craftbukkit.org
- Скачанный файл должен быть формата .jar. Если он в архиве, распаковываем его.
- Создаем папку. Здесь нужно обратить внимание, чтобы в пути не было русских символов, ибо некоторые сервера просто отказываются работать
- Скидываем в эту папку файл, который вы скачали. Повторюсь, он должен быть формата .jar.
- В этой-же папке создаём текстовый документ с именем starter.txt.
- Открываем его и копируем следующее:
Если у вас 32-битная система:
Если у вас 64-битная система:
Подключение к серверу с Windows
1. Чтобы подключиться к серверу под управлением Windows, требуется запустить ”Подключение к удаленному рабочему столу”, что расположен в меню “Пуск” → ”Программы” → ”Стандартные” 2. Ввести IP-адрес сервера 3. В появившемся окне приветствия, выбрать учетную запись и ввести пароль.
Как создать сервер с помощью bat файла!|Создание сервера №1|
Установка Java
1. Запустите ближайший интернет-браузер. 2. Перейдите на страницу Java. 3. В появившемся окне нажмите на большую красную кнопку “Скачать Java бесплатно”. 4. Следуя указаниям, скачайте и установите Java.
Установка сервера Minecraft
1. Перейдите на официальном сайте в раздел Download. 2. Скачайте Minecraft_Server.exe. 3. Поместите его в директорию, где будут размещаться файлы сервера. 4. Запустите файл. 5. После первого запуска будут созданы все требуемые для работы и настройки файлы.
Некоторые хитрости
По умолчанию, сервер Minecraft использует всего 100 Мб ОЗУ, что несомненно мало, для увеличения выделяемой памяти (при условии, что на сервере есть требуемое количество памяти) следует создать пакетный файл следующего вида: 1. Создайте и откройте файл .. в блокноте и поместите туда следующее содержимое «C:Program FilesJavajre6binjavaw.exe» -Xmx2G -Xms2G -jar «Minecraft_Server.exe» где 2G это размер ОЗУ в Гб. Укажите на свое усмотрение.
2. Сохраните его, назвав, к примеру, start.bat и поместите в директорию, откуда запускается Minecraft_Server.exe При работе без нагрузки сервер потребляет около 50 Мб ОЗУ из выделенных и сама Java — не менее 170 Мб. Для экономии ресурсов выделенного сервера можно воспользоваться режимом установки Windows 2008 — Server Core (консольный режим, облегченный для выполнения специфических задач, тем не менее, позволяющий запускать Блокнот и некоторые другие элементы управления).
И запустить сервер в консольном режиме. Строка запуска будет выглядеть следующим образом: Единственное отличие от запуска .exe — параметр nogui. Создайте пакетный файл minecraft_start.bat с содержимым (Зависит от того, в консольном или графическом режиме вы будете запускать сервер игры). И поместите его в директорию с файлами сервера.
К примеру, Этот файл будет запускать непосредственно сам сервер Minecraft. Далее создайте второй файл, который будет содержать следующие строки И поместите его в директорию Этот файл будет инициировать запуск загрузочного скрипта сервера Minecraft при старте системы.
Автоматический перезапуск сервера Minecraft при его “падении” Данное решение придумал пользователь HooKed с одного из форумов, посвященным Minecraft. Это содержимое можно поместить в файл Вышеописанного решения с автоматическим запуска сервера Minecraft. Единственное, что требуется отредактировать — IP-адрес, на котором запущен сервер Minecraft в строке Работает несколько месяцев без сбоев. Система Win 7 x64. 4 GB RAM.
Папка .minecraft лежит в «d:localgamesminecraft_1.2.5». Запускаю через пуск->выполнить, когда нужна консоль (например для отлова ошибки при старте), добавляю слово console: Аналогичные батники для других клиентов (1.1, 1.2.3, 1.2.5 FTB edition) бббррр. меня аж трясёт при упоминании этого сочетания. плохие были времена.
И почему я не вижу ни одного перенаправления на d:localgames(я конечно не шарю в данном коде, но по идее оно должо быть)? Куда в беседку? В моддинг!
И почему я не вижу ни одного перенаправления на d:localgames(я конечно не шарю в данном коде, но по идее оно должо быть)?
Какое еще перенаправление? я «обманываю» игру, говоря что папка AppDataRoaming (ранее известная под названием Application Data) у меня в d:localgamesminecraft_1.2.5, переопределяя переменную %appdata% Ай. Я не посмотрел на вторую строчку.
А разве переопределение папки как апдата не делает её обьектом скида отбросов, которые скидуются в апдату? :3 Туплю чуток.
И как мне сделать в Пуске Выполнялку? Она пропала куда то блжад. это ссылка на яву? То есть мне надо поставить пусть к своей, да?
А разве переопределение папки как апдата не делает её обьектом скида говница отбросов, которые скидуются в апдату? :3
А тебе ничего не говорит понятие переменная окружения ?
В рамках сессии командной строки переменные окружения можно менять как хочешь, изменения не влияют на остальные программы (но влияют на программы, которые ты запустишь в этой сессии).
И как мне сделать в Пуске Выполнялку? Она пропала куда то блжад.
А тебе ничего не говорит понятие переменная окружения ?
В рамках сессии командной строки переменные окружения можно менять как хочешь, изменения не влияют на остальные программы (но влияют на программы, которые ты запустишь в этой сессии).
Если клавиатура Windows совместимая, то нажми +R. 1) Я же уже понял.
2) Спасибо.
3) Так то ссылка на яву? АПД: Ладно. Сделал. Консоль закроется или останется при ошибке(я не умею симулировать ошибки :3)? «В конце концов, людям ведь не так уж и нужно чужое добро. Им всего лишь нужно, чтобы никто не мешал им творить их собственное.»
Источник: minecraft-kak.ru
Что писать в start bat minecraft
По сайту много статей по поднятию сервера, но. Многие сталкиваются с разными проблемами такими как открытие портов , различные ошибки клиента при входе. В статье я постараюсь максимально описать все шаги и клиентские ошибки. Так же я постараюсь дать четкое и внятное решение проблемы.
И так все делаем внимательно!
2. Далее. Помещаем файл в любую папку и создаем там-же файл start.bat или start.cmd
Для этого создаем файл с расширением .txt и переименовываем его в любое вышеуказанное имя.
3. Затем открываем его блокнотом либо ПКМ(правой кнопкой мыши) по файлу -> изменить.
4. Пишем в него :
Для систем x32 :
«%ProgramFiles%Javajre6binjava.exe» -Xmx1024M -Xms1024M -jar craftbukkit.jar
«%ProgramFiles(x32)%Javajre6binjava.exe» -Xmx1024M -Xms1024M -jar craftbukkit.jar
5. Сохраняем
6. Запускаем start.bat который должен находиться в папке с сервером.
Должно появиться что-то вроде этого, я даже порт поменял чтобы все было точь-в-точь =) Белым выделено то что должно высветиться в конце. Если высветилось *** FAILED TO BIND TO PORT — не беда! Это нам выдает о том что не порт не может быть использован. Об открытии порта ниже.
7. Если все ок и нету ошибки использования порта то в нашей папке появится несколько файлов и папок. А именно нам нужен server.propetries лежащий в корне.
Открываем его блокнотом
И так подробно о строках:
allow-nether= Разрешить ли ад на сервере (доступ к нему и генерацию в общем)
level-name=world Имя мира можно не менять
enable-query=false Честно? Сам не разобрался, но лучше не трогать
allow-flight=false Разрешить полет? тоже лучше не трогать
server-port=25561 Порт
level-type=DEFAULT Тип уровня стандарт
enable-rcon=false Тоже незнаю, и как-то живу без этого =)
level-seed= Символы и так далее для генерации уровня. Можно не трогать
server-ip= Ip сервера тоже лучше не трогать
spawn-npcs=true Спавнить ли NPC — людей я так понимаю
white-list=false White list — вкл или откл
spawn-animals=true Спавнить ли животных
online-mode=true Онлайн режим (соединение с офф сервером для получени данных)
pvp=true Включить ли PvP — можно ли драться
difficulty=1 Сложность
gamemode=0 Игровой режим 0 — простой 1 — творческий
max-players=20 Максимальное кол-во игроков на сервере
spawn-monsters=true Спавнить ли монстров
generate-structures=true Генерировать ли здания?
view-distance=10 Дистанция обзора
motd=A Minecraft Server Имя сервера
Точнее нам нужна строка online-mode= Чтобы могли играть с пиратскими клиентами заменяем true на false. Далее motd= Пишем желаемое имя. Настраиваем максимальное кол-во игроков. Например у меня железо Intel core I5, RAM 4gb — две самых важных вещей и OS Windows 7 x64 — Тянет свободноь без лагов 40 человек, но многое и зависит от расположения, страны и т.д. игрока и вашей скорости интернет-отдачи
Все. Сохраняем файл иии! Настройка сервера заверена.
Теперь открытие порта.
1. Скачиваем программу Simple port forwarding : Simple port forwarding
2. Распаковываем и открываем файл spf.exe
Далее перед нами появятся 2 окна. Второе которое с галочкой смело закрываем.
И так в пункте 1 мы должны выбрать свой роутер. Если вы не знаете чот у вас за модель посмотрите на дне или верхушке роутера. Или же в мануале к роутеру должно быть подробное описание.
Во 2 пункте мы заполняем IP адрес роутера имя по стандарту admin и пароль по стандарту admin или 1234 . Внимание во избежание проблем советую перед запуском людей на сервер изменить пароль роутера. Так идем у пункту 3. Жмем на «+» рядом с кнопкой выполнить, должно появится такое окно
3. Жмем кнопку обведенную красным
4. Заполняем так. IP адрес НЕ ТРОГАЕМ !! Если не знаете своего локального ip (программа выставит его сама)
Жмем добавить и закрываем окно. В первом окне жмем выполнить! Ждем . если роутер выбран правильно и пароль с логином введены правильно то напишет что-то вроде «Все команды выполнены».
Все с портами окончено. ПОЧТИ
Один из этапов это отключение брандмауэра.
1. Идем пуск -> панель управления
В Windows XP тоже самое
2. В строке поиска вводим брандмауэр. Открываем «брандмауэр Windows»
3. Идем во включение и отключение . Ставим галки везде отключить. Ок!
Таак. Теперь завершающий этап. Отключение firewall антивируса. Для этого идем в Яндекс и вводим поисковый запрос Отключение firewall в (Имя вашего антивируса).
После того как отключите зовем друзей, а для этого даем им ip который написан тут: 2ip
А сами заходим на сервер с помощью своего локального IP или вместо ип пишем localhost.
Если что-то не работает в яндексе ищем (отключение firewall «имя своего роутера»)
Частые ошибки:
Not egnouht resources и warning system change . Это означает нехватка ресурсов ПК.
Можем сделать файл подкачки больше. Для этого идем в Java, java -> runtime parametres
Ставим в пустом поле -Xms минимальное кол-во выделяемой оперативной памяти и -Xmx максимальное кол-во. Лучше брать 3/4 от общего кол-ва
User not premium — исправить в файле server.propetris : online-mode= true на false
Bad login — Либо кто то играет с таким ником, либо попробуйте использовать ник типа «Abcd» или «abcd»
Если возникнут вопросы или проблемы пишите в комментариях — постараюсь помочь!
Источник: survival-minecraft.ru
Идеальный скрипт запуска сервера Minecraft
Автор очень любит игру, и сам является администратором небольшого сервера «чисто для друзей». Как водится среди любителей, на сервере замодировано все, а это влечёт за собой нестабильность работы и как следствие падения. Так как Powershell автор знает лучше, чем расположение магазинов на своей улице, он принял решение сделать «Лучший Скрипт Для Запуска Майнкрафт 2020».
Этот же скрипт послужил основой для шаблона в маркетплейсе Ruvds. Но все исходники уже есть в статье. Сейчас по порядку, как это все производилось.
Нужные нам команды
Альтернативное логирование
Однажды поставив еще пару модов я обнаружил, что сервер, судя по всему, падает без объявления войны. Сервер не писал ошибки в latest.log или в debug, а консоль, которая по идее эту ошибку должна была написать и остановиться, была закрыта.
Не хочет писать – не нужно. У нас есть Powershell с командлетом Tee-Object, который берёт объект и выводит его в файл и в консоль одновременно.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Таким образом, Powershell будет забирать StandardOutput и записывать его в файл. Не пытайтесь использовать Start-Process, потому что он вернет System.ComponentModel.Component, а не StandardOutput, а -RedirectStandardOutput сделает невозможным ввод в консоль, чего мы хотим избежать.
Аргументы запуска
Поставив ту самую пару модов, автор заметил, что на сервере к тому же не хватает оперативной памяти. А это нужно менять аргументы запуска. Вместо того чтобы каждый раз менять их в start.bat, который все используют просто используйте этот скрипт.
Так как Tee-Object читает StandardOutput, только когда исполняемый файл вызывается «Прямо так», придется сделать еще один скрипт. Этот скрипт будет запускать сам майнкрафт. Начнем с аргументов.
Чтобы в будущем предаваться ультимативной лени, скрипт должен собирать аргументы запуска на лету. Для этого начнем с поиска последней версии forge.
$forge = ((Get-ChildItem | Where-Object Name -Like «forge*»).Name | Sort-Object -Descending) | Select-Object -last 1
С помощью sort-object мы всегда будем брать объект с самой большой циферкой, сколько бы вы туда их не положили. Ультимативная лень.
Теперь нужно назначить серверу память. Для этого берем количество системной памяти и записываем его сумму в string.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb) $xmx = «-Xms» + $ram + «G»
Правильный автоматический перезапуск
Автор видел .bat файлы от других людей, но они не учитывали причину, по которой сервер был остановлен. Это неудобно, что если нужно просто поменять файл мода или удалить что-то?
Теперь сделаем правильный перезапуск. Автор ранее натыкался на странные скрипты, которые перезапускали сервер не смотря на то, почему сервер завершил работу. Мы же будем использовать exitcode. Java использует 0 как успешное завершение, отсюда и будем плясать.
Сначала создадим функцию, которая будет перезапускать сервер в случае его неудачного завершения его работы.
function Get-MinecraftExitCode < do < if ($global:Process.ExitCode -ne 0) < Write-Log Restart-Minecraft >else < Write-Log >> until ($global:Process.ExitCode -eq 0) >
Скрипт останется в цикле до тех пор, пока сервер из своей же консоли не завершит работу штатно, с помощью команды /stop.
Если мы все решили автоматизировать, то неплохо бы и собирать дату запуска, завершения, а также, причину завершения.
Для этого мы записываем результат Start-Process в переменную. В скрипте это выглядит так:
$global:Process = Start-Process -FilePath «C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe» -ArgumentList «$xmx -server -jar $forge nogui» -Wait -NoNewWindow -PassThru
А дальше записываем результаты в файл. Вот что возвращается нам в переменную:
$global:Process.StartTime $global:Process.ExitCode $global:Process.ExitTime
Все это с помощью Add-Content можно добавить в файл. Немного причесав, получаем такой скрипт, а на зовем его handler.ps1.
Add-Content -Value «Start time:» -Path $Logfile $global:Process.StartTime Add-Content -Value «Exit code:» -Path $Logfile $global:Process.ExitCode | Add-Content $Logfile Add-Content -Value «Exit time:» -Path $Logfile $global:Process.ExitTime | Add-Content $Logfile
Теперь давайте оформим скрипт с запуском handler’a.
Правильная автозагрузка
Автор хочет одним модулем запускать майнкрафт различных версий из любых путей, а также иметь возможность складывать логи в конкретную папку.
Проблема заключается в том, что процесс должен запустить пользователь, который находится в системе. Это можно делать через рабочий стол или WinRm. Если запускать сервер от имени системы или даже администратора, но не входить в систему, то Server.jar не сможет даже прочитать eula.txt и запуститься.
Включить автовход в систему мы можем с помощью добавления трех записей в реестр.
New-ItemProperty -Path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon» -Name DefaultUserName -Value $Username -ErrorAction SilentlyContinue New-ItemProperty -Path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon» -Name DefaultPassword -Value $Password -ErrorAction SilentlyContinue New-ItemProperty -Path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon» -Name AutoAdminLogon -Value 1 -ErrorAction SilentlyContinue
Это небезопасно. Логин и пароль указываются тут плейнтекстом, поэтому под запуск сервера нужно заводить отдельного пользователя, который имеет доступ на уровне пользователя, или в еще более узкой группе. Использовать стандартного администратора для этого категорически не рекомендуется.
С автовходом разобрались. Теперь нужно зарегистрировать новую таску под сервер. Запускать будем команду из Powershell, поэтому выглядеть это будет так:
$Trigger = New-ScheduledTaskTrigger -AtLogOn $User = «ServerAdmin» $PS = New-ScheduledTaskAction -Execute ‘PowerShell.exe» -Argument «Start-Minecraft -Type Forge -LogFile «C:minecraftstdout.txt» -MinecraftPath «C:minecraft»‘ Register-ScheduledTask -TaskName «StartSSMS» -Trigger $Trigger -User $User -Action $PS -RunLevel Highest
Собираем модуль
Теперь давайте оформим все в модули, которые можно будет потом использовать. Весь код готовых скриптов тут, импортируйте и пользуйтесь.
Все описанное выше вы можете использовать отдельно, если не хотите заморачиваться с модулями.
Start-Minecraft
Сначала сделаем модуль, который только и будет делать, что запускать скрипт, который будет слушать и записывать standardoutput.
В блоке параметров он запрашивает из какой папки запускать майнкрафт и куда складывать лог.
Set-Location (Split-Path $MyInvocation.MyCommand.Path) function Start-Minecraft < [CmdletBinding()] param ( [Parameter()] [ValidateNotNullOrEmpty()] [string] $LogFile, [Parameter(Mandatory)] [ValidateSet(‘Vanilla’, ‘Forge’)] [ValidateNotNullOrEmpty()] [string] $Type, [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string[]] $MinecraftPath ) powershell.exe -file .handler.ps1 -type $type -MinecraftPath $MinecraftPath | Tee-Object $LogFile -Append >Export-ModuleMember -Function Start-Minecraft
А запускать майнкрафт нужно будет так:
Start-Minecraft -Type Forge -LogFile «C:minecraftstdout.txt» -MinecraftPath «C:minecraft»
Теперь перейдем к готовому к употреблению Handler.ps1
Чтобы наш скрипт мог принимать параметры при вызове, также нужно указывать блок параметров. Обратите внимание, он запускает Oracle Java, если вы используете другой дистрибутив, нужно будет изменить путь до исполняемого файла.
param ( [Parameter()] [ValidateNotNullOrEmpty()] [string]$type, [Parameter()] [ValidateNotNullOrEmpty()] [string]$MinecraftPath, [Parameter()] [ValidateNotNullOrEmpty()] [string]$StandardOutput ) Set-Location $MinecraftPath function Restart-Minecraft < Write-host «=============== Starting godlike game server ============» $forge = ((Get-ChildItem | Where-Object Name -Like «forge*»).Name | Sort-Object -Descending) | Select-Object -first 1 $ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb) $xmx = «-Xms» + $ram + «G» $global:Process = Start-Process -FilePath «C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe» -ArgumentList «$xmx -server -jar $forge nogui» -Wait -NoNewWindow -PassThru >function Write-Log < Write-host «Start time:» $global:Process.StartTime Write-host «Exit code:» $global:Process.ExitCode Write-host «Exit time:» $global:Process.ExitTime Write-host «=============== Stopped godlike game server =============» >function Get-MinecraftExitCode < do < if ($global:Process.ExitCode -ne 0) < Restart-Minecraft Write-Log >else < Write-Log >> until ($global:Process.ExitCode -eq 0) > Get-MinecraftExitCode
Register-Minecraft
Скрипт, практически, повторяет Start-Minecraft, за исключением того, что только регистрирует новую задачу. Принимает те же самые аргументы. Имя пользователя, если не было указано, берет текущего.
function Register-Minecraft < [CmdletBinding()] param ( [Parameter()] [ValidateNotNullOrEmpty()] [string] $LogFile, [Parameter(Mandatory)] [ValidateSet(‘Vanilla’, ‘Forge’)] [ValidateNotNullOrEmpty()] [string]$Type, [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$MinecraftPath, [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$User, [Parameter(Mandatory)] [string]$TaskName = $env:USERNAME ) $Trigger = New-ScheduledTaskTrigger -AtLogOn $arguments = «Start-Minecraft -Type $Type -LogFile $LogFile -MinecraftPath $MinecraftPath» $PS = New-ScheduledTaskAction -Execute «PowerShell» -Argument «-noexit -command $arguments» Register-ScheduledTask -TaskName $TaskName -Trigger $Trigger -User $User -Action $PS -RunLevel Highest >Export-ModuleMember -Function Register-Minecraft
Register-Autologon
В блоке параметров скрипт принимает параметр Username и Password. Если Username не был указан, используется имя текущего пользователя.
function Set-Autologon < param ( [Parameter( HelpMessage=»Username for autologon»)] $Username = $env:USERNAME, [Parameter(Mandatory=$true, HelpMessage=»User password»)] [ValidateNotNullOrEmpty()] $Password ) $i = Get-ItemProperty -Path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon» if ($null -eq $i) < New-ItemProperty -Path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon» -Name DefaultUserName -Value $Username New-ItemProperty -Path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon» -Name DefaultPassword -Value $Password New-ItemProperty -Path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon» -Name AutoAdminLogon -Value 1 Write-Verbose «Set-Autologon will enable user auto logon.» >else < Set-ItemProperty -Path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon» -Name DefaultUserName -Value $Username Set-ItemProperty -Path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon» -Name DefaultPassword -Value $Password Set-ItemProperty -Path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon» -Name AutoAdminLogon -Value 1 >Write-Verbose «Autologon was set successfully.» >
Запуск этого скрипта выглядит так:
Set-Autologon -Password «PlaintextPassword»
Как пользоваться
Сейчас рассмотрим то, как сам автор пользуется всем этим. Как правильно нужно разворачивать публичный сервер Minecraft на Windows. Начнем с самого начала.
1. Создаем пользователя
$pass = Get-Credential New-LocalUser -Name «MinecraftServer» -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Регистрируем задание по запуску скрипта
Можете зарегистрировать с помощью модуля, так:
Register-Minecraft -Type Forge -LogFile «C:minecraftstdout.txt» -MinecraftPath «C:minecraft» -User «MInecraftServer» -TaskName «MinecraftStarter»
Или воспользоваться стандартными средствами:
$Trigger = New-ScheduledTaskTrigger -AtLogOn $User = «ServerAdmin» $PS = New-ScheduledTaskAction -Execute ‘PowerShell.exe» -Argument «Start-Minecraft -Type Forge -LogFile «C:minecraftstdout.txt» -MinecraftPath «C:minecraft»‘ Register-ScheduledTask -TaskName «StartSSMS» -Trigger $Trigger -User $User -Action $PS -RunLevel Highest
3. Включаем автовход в систему и перезагружаем машину
Set-Autologon -Username «MinecraftServer» -Password «Qw3»
Завершение
Автор делал скрипт, в том числе и для себя, поэтому, с удовольствием выслушает ваши предложения по улучшению скрипта. Автор надеется, что весь этот код был для вас хотя бы минимально полезен, а статья интересна.
Источник: temofeev.ru