Koko / Говнокод #27436 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
package com.example

import kotlinx.coroutines.*
import io.ktor.network.selector.*
import io.ktor.network.sockets.*
import io.ktor.utils.io.*
import kotlinx.coroutines.channels.BroadcastChannel
import kotlinx.coroutines.channels.ClosedReceiveChannelException
import kotlinx.coroutines.channels.ConflatedBroadcastChannel
import kotlinx.coroutines.channels.ReceiveChannel
import java.io.IOException
import java.lang.StringBuilder
import java.nio.ByteBuffer

suspend fun ByteReadChannel.readString(): String {
    val result = StringBuilder()
    val decoder = Charsets.US_ASCII.newDecoder()
    val buffer = ByteBuffer.allocate(1)
    while (!isClosedForRead) {
        val byte = readByte()
        if (byte > 127 || byte < 0) {
            continue
        }
        val c = decoder.decode(buffer.also {
            it.put(byte)
            it.rewind()
        })[0]
        result.append(c)
        if (c == '\n') {
            return result.toString().trim('\r', '\n')
        }
        buffer.rewind()
        decoder.reset()
    }
    return ""
}

suspend fun ByteWriteChannel.println(text: String) {
    writeStringUtf8(text)
    writeStringUtf8("\r\n")
}

class Client(private val clientSocket: Socket, private val room: BroadcastChannel<String>) {
    private val output = clientSocket.openWriteChannel(autoFlush = true)
    private val input = clientSocket.openReadChannel()
    var nick: String? = null
        private set

    suspend fun start() = coroutineScope {
        input.discard(input.availableForRead.toLong())

        output.writeStringUtf8("Welcome! And your name: ")
        val nick = input.readString()
        room.send("$nick is here")
        output.println("Welcome $nick")
        <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f5819d9c86b5b6999c909b81db9b9c969e">[email protected]</a> = nick
        val roomSubscription = room.openSubscription()
        launch {
            for (message in roomSubscription) {
                output.println(message)
            }
        }
        launch {
            processUserInput(nick)
        }.join()
        roomSubscription.cancel()
    }

    private suspend fun processUserInput(nick: String) {
        while (!clientSocket.isClosed) {
            val text = input.readString()
            room.send("$nick: $text")
            if (text == "bye") {
                room.send("$nick left")
                return
            }
        }
    }
}


suspend fun stdoutRoomProcessor(input: ReceiveChannel<String>) {
    for (message in input) {
        println(message)
    }
}

suspend fun server(port: Int) = coroutineScope {
    val serverSocket = aSocket(ActorSelectorManager(coroutineContext)).tcp().bind(port = port)
    val room = ConflatedBroadcastChannel<String>()
    launch {
        stdoutRoomProcessor(room.openSubscription())
    }
    while (coroutineContext.isActive) {
        val clientSocket = serverSocket.accept()
        room.send("Client connected ${clientSocket.remoteAddress}")
        launch {
            val client = Client(clientSocket, room)
            try {
                client.start()

Запостил: MAKAKA MAKAKA, (Updated )

Комментарии (44) RSS

    • Там же написано, не больше 100 строчек!!! Ты куда 200 строчек пихаешь, хотел, чтобы говнокодик порвался??
      Ответить
      • Хотел разработать его так, чтобы он без труда мог вместить в себя sendmail.cf
        Ответить
  • короче, это попытка завязать разговор про асинхронность, корутины и каналы в котлине

    чат реально работает, хотя и тормозит
    Ответить
    • А почему тормозит? Потому что джава? Или потому что корутины? Они анскильные? Программа, кстати, 90% времени занята выполнением синхронного кода, поэтому асинхронщина не нужна особо.
      Ответить
      • потому что корутины

        как это не нужна? как ты напишешь чат на 20 человек в один поток?
        Ответить
          • Так там и есть epoll под капотом

            epoll, kqueue, CompletionPorts, you name it
            Ответить
              • Медленный диспатчер котлиновых корутин вокруг него
                И билиотека Ktor видимо тоже
                Ответить
                • Потому что Котлин – это пристройка к старому и дряхлому курятнику, а не самодостаточная питушня. Вместо решения проблем создатели котлина превозмогали JVM. Отсюда лапки растут?
                  Ответить
                      • Здравствуйте.
                        Я спросил на "Говнокоде" что такое "ротоняк", мне ответили "погугли":
                        https://govnokod.ru/27445#comment631983

                        Я погуглил, нашел релевантной только эту ссылку. Что такое "ротоняк"?
                        Ответить
                            • Вы уже что то знаете о Ардуино, немного умеете собирать устройства и программировать их. Значит настала пора двигаться дальше и сделать крупный проект-РОБОТ. Ваш первый робот из набора Робоняша может очень многое. Что? Узнайте все возможности пройдя все эксперименты описанные в буклете.
                              Ответить
                              • помню, играл пару лет назад в Detroir: Become PHPuman

                                так ржал: типа андроиды, вся херня, но мало того, что роботиня-роботесса моет посуду руками, так она ещё РУКАМИ включает робот-пылесос.

                                я понимаю, что эта игра не про дроидов, а про угнетение, на самом деле, но сцук так обосраться

                                gay of the year edition!
                                Ответить
                                • Превосходный электронный робот, он жил и работал в семье профессора Изидоро Корти, преподавателя истории в Римском университете. Катерино умел стряпать, стирать и гладить белье, убирать комнаты и кухню. Он сам ходил за покупками, вел тетрадь расходов, включал и выключал телевизор, печатал на машинке письма профессора, разрезал ножиком-закладкой страницы новых книг, водил машину и вечерами пересказывал домашним все сплетни соседей. Словом, он был совершенным механизмом.
                                  Ответить
                                  • Изидор - всичко за банята, плочки, мебели за баня, смесители
                                    Ответить
                            • Мы рекомендуем конструктор «Робоняша» робототехникам с 12 лет. Будь ваш юный инженер новичком в электронике или закалённым в соревнованиях робототехником, в этой коробке он найдёт для себя не только увлекательное хобби, но и, возможно, будущую профессию. Разобраться в основах робототехники и программирования поможет красочный буклет — минимум теории, максимум практики. Конструктор безопасен — напряжение питания в модулях робота не превышает 9 вольт, а сборка не требует пайки и дополнительных инструментов.
                              Ответить
                            • Полная сборка Робоняши занимает около двух часов. Чтобы превратить её в увлекательное приключение и рассказать начинающему инженеру об основах робототехники, мы разбили процесс на 12 экспериментов: от самых простых — вроде сборки сенсорных выключателей, к более сложным — роботу-марсоходу или борцам сумо. Каждый эксперимент сопровождается цветной схемой сборки, необходимой теорией и готовыми программами. Постепенно мы рассказываем обо всех электронных модулях, а робот становится всё сложнее и умнее.



                              Конечно лучше разабратся в програмировании самому, но если чтото не получантся посмотрите информацию в ШПАРГАЛКЕ



                              Этапы сборки:

                              Прожектор

                              Сигнальная колонна

                              Сенсорный выключатель

                              Миксер

                              Одометр

                              Спидометр

                              Марсоход

                              Чистюля

                              Следопыт

                              Нехочуха

                              Прилипала

                              Робо-сумо
                              Ответить
                              • Обращаем внимание: Набор Робоняша содержит детали которыми комплектуется набо "Йодо". Если он уже есть у вас, то для использования "Йодо" в строительстве робота воспользуйтесь абгрейдом для расширения возможностей "Робоняша — продолжение набора «Йодо»
                                Ответить
                                  • Муж уезжает в длительную командировку и прощается с женой:
                                    - Не могу оставить тебя на такой длительный период без секса, поэтому всекс-шопе купил тебе робота.
                                    Жена:
                                    - Да как ты мог подумать!…да я никогда ни с кем тебе не изменю! Даже с роботом!
                                    Муж:
                                    - Ну, как знаешь… Если вдруг передумаешь просто крикни «ЛЁЛИК, КО МНЕ!» и он всё сделает.
                                    Муж уезжает. Проходит две недели, жене на глаза всё время попадается ЛЁЛИК.
                                    Жена думает:
                                    - Жалко, конечно, денег потраченных на ЛЁЛИКА…может попробовать… чего даром стоит?
                                    Жена решается:
                                    - …ЛЁЛИК, КО МНЕ!!!!
                                    ЛЁЛИК включается. 8 часов безумного, беспрерывного секса, её покидают силы, но одна проблема…жена не знает как его выключить. Изнеможенная подползает к окну,выглядывает и видит во дворе дворника Михалыча, который подметает двор.
                                    Жена:
                                    -Михалыч! Есть дело на бутылку! Крикни «ЛЁЛИК, КО МНЕ!!!»
                                    Михалыч, не долго думая:
                                    - ЛЁЛИК, КО МНЕ!!!!…
                                    Прошло полтора месяца, муж возвращается из командировки, во дворе кучи мусора,в доме выбиты стёкла, людей на улице не видно. Из-за угла появляется Михалыч с винтовкой вместо метлы, небритый, с красными глазами…
                                    Муж:
                                    - Михалыч, а что произошло? Где ВСЕ????…
                                    Михалыч:
                                    - Тихо!!!!!!!! Бл...ь… Я не знаю, ГДЕ ВСЕ!!!!… НО… ЛЁЛИК ГДЕ-ТО РЯДОМ!
                                    Ответить
                                    • Уважаемые читатели, в выпуске номер корень квадратный из мнимой единицы была допущена АБИДНАЯ опечатка.

                                      Вместо

                                      "Михалыч! Есть дело на бутылку!"

                                      следует читать

                                      "Михалыч! Есть дело! На бутылку!"
                                      Ответить
                        • Здравствуйте. Вас, очевидно, затролили.

                          Ротоняк это някнутое сокращение от ротоеб, что в данном контексте значит примерно "васян"
                          Ответить
  • > private suspend fun processUserInput(nick: String)

    Рядовой, прекратить веселье! Обработать пользовательский ввод! Позывной: стринги.
    Ответить
  • Мозг набора — Iskra JS, миниатюрный компьютер, говорящий на JavaScript. Лаконичные скрипты управляют внешними электронными модулями. Соединяйте модули шлейфами с платой Troyka Shield. К хабу одновременно подключатся все модули набора и ещё останется место под будущие доработки. Соберите корпус и голову робота из элементов #структора. Вставьте сервопривод и моторы, закрепите колёса — ваш робот готов исследовать Вселенную. А чтобы постоянно не искать новые батарейки, мы добавили роботу аккумулятор — его хватит на целый вечер. Что в коробке В коробку с набором мы положили всё необходимое для сборки автономного робота: контроллер, аккумулятор, датчики, моторы и сервопривод, пульт дистанционного управления и конструктор с колёсами для крепления всего этого.



    Комплектация:

    Платформа Iskra JS

    Плата расширения Troyka Shield

    Плата управления моторами Motor Shield

    Литий-ионный аккумулятор Power Bank

    50 деталей #структора, включая колёса и шаровые опоры робота 2 микромотора с редуктором 1:100 и припаянными проводами микросервопривод FS90

    2 аналоговых датчика линии

    2 цифровых датчика линии

    ИК-приёмник ИК-пульт управления

    Ультразвуковой дальномер

    Светодиод

    8 трёхпроводных шлейфов

    Четырёхпроводной шлейф

    USB-кабель

    Отвёртка

    Наклейки Робоняша

    Роботрасса

    Буклет
    Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8