1. Kotlin / Говнокод #27436

    0

    1. 001
    2. 002
    3. 003
    4. 004
    5. 005
    6. 006
    7. 007
    8. 008
    9. 009
    10. 010
    11. 011
    12. 012
    13. 013
    14. 014
    15. 015
    16. 016
    17. 017
    18. 018
    19. 019
    20. 020
    21. 021
    22. 022
    23. 023
    24. 024
    25. 025
    26. 026
    27. 027
    28. 028
    29. 029
    30. 030
    31. 031
    32. 032
    33. 033
    34. 034
    35. 035
    36. 036
    37. 037
    38. 038
    39. 039
    40. 040
    41. 041
    42. 042
    43. 043
    44. 044
    45. 045
    46. 046
    47. 047
    48. 048
    49. 049
    50. 050
    51. 051
    52. 052
    53. 053
    54. 054
    55. 055
    56. 056
    57. 057
    58. 058
    59. 059
    60. 060
    61. 061
    62. 062
    63. 063
    64. 064
    65. 065
    66. 066
    67. 067
    68. 068
    69. 069
    70. 070
    71. 071
    72. 072
    73. 073
    74. 074
    75. 075
    76. 076
    77. 077
    78. 078
    79. 079
    80. 080
    81. 081
    82. 082
    83. 083
    84. 084
    85. 085
    86. 086
    87. 087
    88. 088
    89. 089
    90. 090
    91. 091
    92. 092
    93. 093
    94. 094
    95. 095
    96. 096
    97. 097
    98. 098
    99. 099
    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")
            [email protected] = 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, 22 Мая 2021

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

    • ЕБАТЬ ТУПОЙ ГОВНОКОД

      пол кода обрезал

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

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

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

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

                          Я погуглил, нашел релевантной только эту ссылку. Что такое "ротоняк"?
                          Ответить
                          • Привет, ты не то нагуглил. Вот релевантный видео-курс по теме «Rotonyak»:

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

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

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

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



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



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

                                Прожектор

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

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

                                Миксер

                                Одометр

                                Спидометр

                                Марсоход

                                Чистюля

                                Следопыт

                                Нехочуха

                                Прилипала

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

                                        Вместо

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

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

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

                            Ротоняк это някнутое сокращение от ротоеб, что в данном контексте значит примерно "васян"
                            Ответить
      • > тормозит

        Перепиши на няшную.
        Ответить
    • > private suspend fun processUserInput(nick: String)

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



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

      Платформа Iskra JS

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

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

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

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

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

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

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

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

      Светодиод

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

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

      USB-кабель

      Отвёртка

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

      Роботрасса

      Буклет
      Ответить
      • > компьютер, говорящий на JavaScript

        - надо устроить баттл с Эллочкой-людоедкой
        Ответить
      • Ну всё, скоро бойлеры будут на жс программировать...
        Ответить

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