Крестики-нолики на DNS

    Изначально я хотел назвать этот пост «игра в 0 строк HTML, JS и CSS», вдохновлённый этим постом, но это было бы слишком громко. Так или иначе, сильно ухудшив UX, я получил крестики-нолики, работающие исключительно силой DNS протокола.



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

    Для того, чтобы зайти в игру, необходимо выполнить такую команду, которая подразумевает обращение к моему dns-серверу:

    $ dig @ns.f1remoon.com game.f1remoon.com. TXT
    

    Так же я сделал небольшую справку, которая доступна в TXT-записях по домену help.game.f1remoon.com:



    Как это работает?


    Сначала я пытался просто правильно настроить bind9, но был сильно огорчён: порядок выдачи TXT-записей был случайный. Это, конечно, приносило некоторую экзотику в игру, но было абсолютно неприемлемо. Пришлось отбросить идею и смотреть в сторону самописного DNS-сервера. Вооружившись желанием изучить что-то новое, я взял golang и библиотеку Go DNS и получился простой, не сильно отличающийся от примеров, сервер.

    Следующей сложностью были все комбинации игры. Тут большая благодарность Sirion: я взял его html-файлы и транслировал в угодный мне формат.

    Так как команда dig, в отличие от браузера, не хранит url и не даёт тыкать по полю, придётся оставить это пользователю. Для игры поле было размечено как numpad:

    7 8 9
    4 5 6
    1 2 3
    

    При запросе хода всегда нужно отдавать полную историю ходов в обратном, например, команда на третий ход в клеточку «9» будет выглядеть так:

    $ dig @ns.f1remoon.com 9.4.5.game.f1remoon.com. TXT
    

    Полный вывод трёх ходов
    $ dig @ns.f1remoon.com 5.game.f1remoon.com. TXT
    
    ; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @ns.f1remoon.com 5.game.f1remoon.com. TXT
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12656
    ;; flags: qr rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
    ;; WARNING: recursion requested but not available
    
    ;; QUESTION SECTION:
    ;5.game.f1remoon.com.           IN      TXT
    
    ;; ANSWER SECTION:
    5.game.f1remoon.com.    0       IN      TXT     "o" "_" "_"
    5.game.f1remoon.com.    0       IN      TXT     "_" "x" "_"
    5.game.f1remoon.com.    0       IN      TXT     "_" "_" "_"
    
    ;; Query time: 135 msec
    ;; SERVER: 159.65.145.145#53(159.65.145.145)
    ;; WHEN: Sun Aug 05 20:16:16 UTC 2018
    ;; MSG SIZE  rcvd: 148
    
    $ dig @ns.f1remoon.com 4.5.game.f1remoon.com. TXT
    
    ; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @ns.f1remoon.com 4.5.game.f1remoon.com. TXT
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9301
    ;; flags: qr rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
    ;; WARNING: recursion requested but not available
    
    ;; QUESTION SECTION:
    ;4.5.game.f1remoon.com.         IN      TXT
    
    ;; ANSWER SECTION:
    4.5.game.f1remoon.com.  0       IN      TXT     "o" "_" "_"
    4.5.game.f1remoon.com.  0       IN      TXT     "x" "x" "o"
    4.5.game.f1remoon.com.  0       IN      TXT     "_" "_" "_"
    
    ;; Query time: 131 msec
    ;; SERVER: 159.65.145.145#53(159.65.145.145)
    ;; WHEN: Sun Aug 05 20:16:23 UTC 2018
    ;; MSG SIZE  rcvd: 156
    
    $ dig @ns.f1remoon.com 9.4.5.game.f1remoon.com. TXT
    
    ; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @ns.f1remoon.com 9.4.5.game.f1remoon.com. TXT
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40450
    ;; flags: qr rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
    ;; WARNING: recursion requested but not available
    
    ;; QUESTION SECTION:
    ;9.4.5.game.f1remoon.com.       IN      TXT
    
    ;; ANSWER SECTION:
    9.4.5.game.f1remoon.com. 0      IN      TXT     "o" "_" "x"
    9.4.5.game.f1remoon.com. 0      IN      TXT     "x" "x" "o"
    9.4.5.game.f1remoon.com. 0      IN      TXT     "o" "_" "_"
    
    ;; Query time: 131 msec
    ;; SERVER: 159.65.145.145#53(159.65.145.145)
    ;; WHEN: Sun Aug 05 20:16:30 UTC 2018
    ;; MSG SIZE  rcvd: 164
    
    $
    


    Репозиторий с кодом: github.com/Firemoon777/tic-tac-toe-dns

    UPD: Prototik предлагает использовать более удобный для игры вариант с ключом +short:
    $ dig +short TXT @ns.f1remoon.com 9.4.5.game.f1remoon.com.
    "o" "_" "x"
    "x" "x" "o"
    "o" "_" "_"
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 47

      +1

      Интересно, спасибо, напомнило морской бой на BGP )

        +7
        Сильно, снимаю шляпу.
          +7
          Сильно снимаю шляпу!
            0
            Сильно снимаю, шляпу…
              0
              Сильно снимаю, шляпу…
                0
                Strongly take off my hat!
                  0
                  Сильно, надеваю шляпу.
          +1
          Занятная штука. Жаль, нельзя никак обыграть сервер)

          Может на досуге попробую форкнуть сервер и сделать на его основе 5х5 версию (только, не хардкодить ходы, а прикрутить полноценный алгоритм).
            0
            Тогда поднимается вопрос о том, как хранить ход для конкретного юзера х)
              0
              Ну, можно просто при старте игры выдавать id и добавить его в начало имени, а-ля 8.5.2.IDDQD.game.com
                0
                Мы ведь можем использовать IP в качестве ID
                  0
                  Не можем (точнее не всегда) — IP может менятся даже в рамках одной сессии.
                0
                Prototik опередил меня.
                В дополнение к его комментарию скажу, что в этом случае отпадает необходимость передавать всю цепочку. Достаточно будет только текущую цифру. Либо что-то вроде A1.id.domain.com
                  0

                  Да, выглядят неплохо.

                  +1

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

                0
                Думаю можно залить запись игры на asciinema.org
                  +7

                  btw с +short играть удобнее:


                  $ dig +short TXT @ns.f1remoon.com 9.4.5.game.f1remoon.com.
                  "o" "_" "x"
                  "x" "x" "o"
                  "o" "_" "_"
                    0
                    Добавил в статью, спасибо!
                    0
                    Под виндой (7) не потестировать, если bind и dig не установлены?
                    Только nslookup есть штатно жешь.
                      0

                      Винды под рукой нет, но что-то такое должно сработать:


                      nslookup -type=txt 9.4.5.game.f1remoon.com ns.f1remoon.com
                        0
                        Собственно, оно и работает, но хреновенько

                          +1
                          Можно использовать командлет Resolve-DnsName:

                          0
                          Вот так вывод получается кусочками 1*3, а не сразу 3*3:
                          image
                            0
                            Ну либо просите автора переделать вывод в одну строчку в записи, а не в три, либо ищите правосланый dig под винду. Больше ничем не могу помочь :D
                              0
                              А его особо искать не надо: nil.uniza.sk/linux-howto/how-install-dig-dns-tool-windows-10
                                0
                                Этот путь то ясен, но не всегда доступен. Есть штатные средства только, например, на ноуте, а потестировать функционал после прочтения интересно.
                                  0
                                  Эээ.
                                  Идём сюда: www.isc.org/downloads/bind
                                  Качаем дистр, унзипим и дастаём dig.exe, радуемся.

                                  P.S. нужен vcredist_x86.exe
                                0
                                для 10й винды просто ставим любой дистрибутив из маркета для wsl и не паримся
                          0
                          Мне эти статьи напомнили зарисовку, вроде где-то на Хабре видел. Там парень таскал камни по острову. И вот он ставит последний камень на место, картинка отдаляется, видно огромные хитросплетения из глыб и он говорит, что-то типа «Вот и готов процессор», и далее испаряется
                          Описал я конечно ужасно, но что помниться
                            +4
                            Возможно, вы говорите об этом?
                            +2
                            Интересно.
                            Только с шахматами такого не делайте.)
                              +2
                              Если Sirion сделает генератор состояний (искусственный интеллект?), а berezuev — подходящий dns-сервер, то нас уже ничего не остановит. :D
                              0
                              Не робит
                              image
                                0
                                >connection timed out
                                Сервер с игрушкой стоит на vps от digital ocean. Не повезло, твой провайдер блокирует этот ip'шник.
                                  0
                                  Да, есть такое. Из дома попробую ещё.
                                +2
                                Подумалось сделать крестики-нолики на ftp, но нет подходящего сервера. Поэтому сделал zip (ссылка).
                                Скриншот
                                image

                                Здесь алгоритм противника не идеальный и его можно обыграть :)

                                * Так как zip просмотрщики слишком умные и сортируют списки, в основном варианте правильная сортировка достигается засчёт малозаметных пробелов. Но некоторые ещё умнее (например, Windows Explorer) и не учитывают начальные пробелы при сортировке. На этот случай есть версия с индексами.
                                  0
                                  Максимум поле 16х16?
                                  +3

                                  Тут надо добавить, что это не просто "крестики-нолики" на DNS, а статические крестики-нолики без вычислительной части.


                                  Потому что в общем случае на DNS можно реализовать любое RPC...


                                  Кстати, интересная идея. Как насчёт dig -t TXT news.example.com, который отвечает заголовками текущих новостей в TXT?

                                    0
                                    Дойдёт до того, что NNTP воскресят!
                                      0
                                      А потом и на нём в крестики-нолики сыграют?
                                    0

                                    Какая увлекательная игра. Лучше могут быть только крестики-нолики на boot menu. Завтра напишу пост, как сделать крестики-нолики в 0 системных блоков, сетевых адаптеров и устройств ввода.

                                    0
                                    Не могу перестать думать об этом: github.com/asweigart/my_first_tic_tac_toe
                                      0
                                      Жесть.) 18205 строк в одном файле.
                                        0
                                        Шедеврально!
                                        0
                                        Мсье знает толк в извращениях!

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                        Самое читаемое