1. Куча / Говнокод #25108

    0

    1. 1
    Type: Null

    https://bulbapedia.bulbagarden.net/wiki/Type:_Null_(Pok%C3%A9mon)

    Запостил: vistefan, 23 Ноября 2018

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

    • Type: Null
      Ответить
    • undefined undefined
      Ответить
      • Кстати, знаешь dwitter.net?

        Там уже джаваскриптеры новую демосцену нарождают вовсю. Прямо из останков сишной. )
        Ответить
        • Там люди с девиациями пишут демки на джаваскрипте?
          Ответить
          • Это типа твиттер. У тебя есть канвас, несколько глобальных переменных доступны, и 140 символов js кода на демку.
            Ответить
            • ОНОТОЛЕ ОДОБРЯЕ!!!11
              Ответить
            • А есть такой же для брейнфак?
              Ответить
              • А у брейнфака есть графон?
                Ответить
                • У языков не бывает графонов. У них бывают библиотеки. Если библиотеки нет, от ее пишут, иногда на языке более низкого уровня делая у ней интерфейс.

                  У брейнфака нету стандартной библиотеки, так что придется сначала изобрести для него возможность динамической загрузки библиотек, затем написать библиотеку грфики


                  Или можно так: у BF есть возможность записывать значения в ячейку памяти. Можно спроецировать на него видеопамять
                  Ответить
                  • > У языков не бывает графонов
                    Бля, мы превысили лимит пунктуальности из-за доёбов до похапешников и друг до друга )) Теперь нам неудобно разговаривать, приходится развернуто и с терминологией.
                    хотя правильно говорить GNU/Linux

                    > изобрести для него возможность динамической загрузки библиотек
                    С этим проблемы, надо придумать, как это сделать без изменения синтаксиса. Может попробовать выделить ячейки с отрицательным индексом под работу с библиотеками? Надо прикинуть, что вообще требуется.

                    P.S. Я сегодня доебался до Романа, и он подумал, что у меня зелёный цвет распознаваться перестал, в треде про интелперелетацию Си. Теперь ты мне рассказываешь, что у языков не бывает графонов.
                    Ответить
                    • Надо просто заранее знать смещения, по которым будут загружены эти библиотеки.
                      А дальше главное написать ">" правильное количество раз:)

                      Но вариант с мапингом памяти мне больше нравится.
                      Перешел (>) в нужное место, установил там нужный цвет (+++++++) и вот тебе и графон
                      Ответить
                      • Ну это получится конкретная ОДНА библиотека. А как можно наладить импорт произвольной. Ну грубо говоря питоний import.

                        По поводу графония, пожалуй нужно весь буффер в обратном порядке разместить в ячейках с отрицательными индексами, как раз по три ячейки на пиксель. Только боюсь, что демки сильно не напрограммируешь, за 140 символов ты даже до одного нужного пикселя не доедешь )) чтобы в pong отрисовать мячик.

                        А на dwitter есть понг¹, кстати, за 140 символов. Вот он:
                        c.width=192;A=Math.abs;Y=A(t*99%176-88);X=A(t*139%376-188);x.F=x.fillRect;x.F(X,Y+7,3,3);x.F(187,Y+C(X/39)*29,5,20);x.F(0,Y-S(X/29)*22,5,20)
                        ¹ — https://www.dwitter.net/d/135
                        Ответить
                        • Динамическая загрузка библиотек это довольно сложно: нужно уметь работать с внешними хранилищами.

                          Поскоку в BF у нас нету явно IO, то логично предположить что у нас MMIO, То-есть опять таки ячейки.

                          Допустим, по адресу 2048 у нас находится контроллер некоего диска (представим что у нас LBA адресация)
                          Мы идем (> 2048 раз) на этот адрес, и увеличиваем там ячейку на 1.
                          Это запускает мотор привода.
                          Зачем мы идем в ячейку 2050 и устанвливаем там значение, равное адресу блока. Пусть это будет блок 2, значит "++".
                          Далее идем обратно (<<) и увеличиваем значение еще на 1.

                          Это заставляет наш контроллер считать блок (пусть это будет блок размером 1 байт а не 512) по указанному адресу и поместить его в ячейку 2049. Вот так мы считали байт.

                          Осталось только реализовать файловую систему и можно грузить любые файлы память
                          Ответить
                          • зы: физически нас процессор просто выставляет адрес блока на шину и дает комманду "читать" или "писать" и данные.

                            К шине кроме оперативной памяти (точнее ее контроллера) подключен еще наш контроллер диска. У него дешифратор адреса настроен на эти адреса, потому он их читает он, а не память (контрорллер памяти значет что по этому адресу памяти нет)
                            Ответить
                            • Вот тут нихуя не понял.
                              Ответить
                              • Забудем на секунду про брейнфак.

                                У тебя есть некий аналог 8080. В его ассемблере программист может записать что-то в регистр или в память. Он может еще записать в IO, но мы притворимся что IO у нас нет.

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

                                Вот ты делаешь MOV, и процессору надо "записать число 42 по адресу 123".

                                Что он делает? Он выставляет на шину адреса этот адрес (если представить его в двоичной форме то становится понятно на какие дорожки этой шины процессор ставит единичнки (например +3V) а на какие нолик (например -3V).

                                Подключенные к шине устройства имеют дешифраторы ( https://en.wikipedia.org/wiki/Binary_decoder ) чтобы понять что выставили их адрес и включиться (или выключиться если адрес не их)

                                На часть адресов возбуждается контроллер оперативной памяти, на часть -- контроллер диска
                                Затем процессор выставляет на шину данных данные (опять таки в двоичной форме единички и нолики на дорожках) и устройство их читает

                                Так что с точки зрения ЦПУ пофиг с кем он работает -- с памятью или с контроллером. А программист может знать что у него по такому-то адресу память, а по секому -- устройство

                                Теперь представть что брейнфак компилируется в этот асемблер.Ты пишешь ">>>+" а процессор читает с адреса "3" один байт в регистр, увеличивает его и пишет обратно

                                Если по этому адресу память, то ты просто записал байт. А если там контроллер диска, то ты записал байт в него, а как он среагирует на запись -- это его дело.

                                Так софт управляет железом в самом примитивном случае
                                Ответить
                                • Отличное объяснение. У меня возник ряд вопросов.

                                  Устройства и память в одном адресном пространстве что ли? То есть какие-то адреса -- это адреса ячеек памяти, а какие-то -- адреса устройств?

                                  А по поводу общей концепции я понял, но это не то, мы же хотим добавить графон в брейнфак, а не компилировать его. То есть сделать возможность загрузить библиотеку, и реализовать библиотеку для графония.
                                  Ответить
                                  • >>Устройства и память в одном адресном пространстве что ли?

                                    Смотря где. Изначально x86 имеет два пространства: для памяти и для IO (устройств).

                                    Инструкции MOV работают с памятью, а OUT и IN с I/O.

                                    Физически у шины адреса была спец дорожка, говорящая что установленный адрес там IO и MEM (в зависимости от наличия там напруги).

                                    Распиновочка:
                                    http://ece-research.unm.edu/jimp/310/slides/8086_chipset.html

                                    Ножки AD* идут на адреса (на самом деле у них два значения адрес или дата в зависимости от ножки ALE), а ножка M/IO гвоорит что там I/O или MEM.

                                    Прочерк снизу значит что значение кодируетя отрицательным напряжением (если я верно помню).

                                    Там прямо под картинкой все оче подробно напаисано.

                                    Но почти сразу оказалось что когда тебе нужно передать много данных то удобнее и быстрее делать это через мапинг на память, и еще видеокарты (с CGA так точно) начали мапица на память

                                    [quote]
                                    Memory-mapped I/O uses the same address space to address both memory and I/O devices. The memory and registers of the I/O devices are mapped to (associated with) address values. So when an address is accessed by the CPU, it may refer to a portion of physical RAM, or it can instead refer to memory of the I/O device.
                                    [/quote]

                                    Современные устройства почти всегда работают через память (через ио порты разве что настраиваются легаси устройства), кроме того начиная с шины PCI (1993 г) все устройства могут быть мастерами: то-есть сами писать/читать в память.

                                    Твоя сетевая карта может сама писать в оперативку мимо проца (раньше так мог только DMA делать ну или процессор должен был явно брать из карты и класть в память).

                                    ЕМНИП PowerPC вообщзе не имел IO а только MEM.

                                    Кстати, в память точно так же с первых PC мапился BIOS. Процессор читал оттуда свою первую инструкцию.
                                    Ответить
                                    • >>Прочерк снизу значит что значение кодируетя

                                      наврал

                                      значит логический ноль
                                      когда 0 -- ио
                                      Ответить
                                      • Какой-то он маленький. И что, на таком линукс запускался?
                                        Ответить
                                        • На 8086 нет. Линукс вообще был изначально только под 386, за что Таненбаум ругал Торвальдса, дескать твоя ОС только для богатых (386 был дорогой)

                                          Торвальдс говорил что его задача была изучить 386, потому он под него и писал

                                          8086 не имел ни страничной адресации (она появилась в 386), ни защиты памяти (она появилась в 286) так что под него был только DOS.

                                          Под 286 уже пытались делать unix, но без страничной адресации это сделать сложно потому что у тебя нету свапа.

                                          Кроме того 8086 имел шину адреса в 20 ножек, и мог адресовать до 2^20 == 1 мегбайт памяти. Этого недостаточно для Linux

                                          Кто-то портировал линукс на процы без страничной адресации (процы без MMU)
                                          https://en.wikipedia.org/wiki/%CE%9CClinux

                                          но я не думаю что там всё хорошо
                                          Ответить
                                          • > 8086 не имел […] ни защиты памяти […] под него был только DOS

                                            И ниже читаем:
                                            > В ДОС […] через прерывания. В начале памяти была таблица адресов.

                                            То есть в эту таблицу можно было писать, если память не защищена? То есть можно сделать
                                            C:\>DIR
                                            TURBOPAS.EXE
                                            SEX.EXE
                                            NAKED.EXE
                                            GIRLS.EXE
                                            C:\>GIRLS.EXE
                                            И теперь все программы, которым понадобилось писать на диск, джампают не на код обработчика этого прерывания, а на код твоей main, которая, например, выводит это на экран?
                                            Ответить
                                            • А, нет, сначала надо в верхную память куда-то там к драйверам загрузиться, а то многозадачности-то нету, никто кроме тебя и прерываний-то не вызовет, разве что устройство.
                                              Ответить
                                              • Верхняя память (кстати, ее было много разной) не была обязательной.

                                                Ты мог загрузиться в обычную память. Можно было прописать в config.sys драйвер и дос сам его загружал

                                                А можно было вызвать .exe файл, он загружался в память, делал что хотел и потом делал
                                                https://en.wikipedia.org/wiki/Terminate_and_stay_resident_program
                                                Ответить
                                            • >>То есть в эту таблицу можно было писать, если память не защищена?

                                              Разумеется. Так работали вирусы. И драйверы (ставили свой обработчик на прерывание их устройства). И русификаторы (ставили свой обработчик на клавиатуру чтобы по ctrl+shift менять язык).

                                              И даже игры во время своей работы ставили свои обработчики на прерывания контроллера клавиаутры и мыши.

                                              >>джампают не на код обработчика этого прерывания, а на код твоей main

                                              Да. Вирусы так именно и делали. Надо было указать в таблице векторов прерываний адрес своего года и попросить дос "terminate state resident" чтобы дос вернул управление comand.com, но тебя не выгрузил.

                                              Теперь при вызове прерывания будет работать твоя программа.
                                              Ответить
                                  • >> мы же хотим добавить графон в брейнфак
                                    Разве спицификация языка Brainfuck требует что все 30 000 (или сколько их там) ячеек были памятью?
                                    Ответить
                                    • У брейнфака есть спецификация? 0_o
                                      Ответить
                                      • Ну какое-то описание языка же есть:)

                                        Кажется там сказано что у тебя есть 30 000 ячеек памяти.

                                        Если мы условимся что запись в ячейку 2212 запускает космический корабль, то можно будет сказать что мы написали на BF программу для запуска космического корабля
                                        Ответить
                                        • Ну, мы вернулись к прежнему моему вопросу, при таком подходе придётся либо патчить интерпретатор, либо вообще патчить окружение в котором он запускается (мапить память там или присматривать за каким-то адресом, и когда там поменяется — послать message по шине PCI Express). Придётся, например, установить соглашение о том, как мапятся адреса реальной памяти на ячейки внутри брейнфака. И получится либо корявая система, которая обеспечивает тебе, чтобы в какое бы место памяти ни загрузилась твоя программа, пропустив 2212 ячеек вправо, ты всегда попадал бы на контроллер диска, либо брейнфак действительно олжен быть ассемблером этой машины, и его ячейки должны непосредственно являться памятью, а не мапиться на них. И это всё ужасно, потому что тогда область кода и область данных смешаются.
                                          Ответить
                                          • Интерпретатор это всего лишь реализация, потому я и спросил про спецификацию.

                                            Если в любая реализация BF обязана все ячейки мапить только в оперативную память (точнее говоря если там сказано что запись в ячейку не должна иметь побочных эффектов) то мы никак не можем взаимодействовать с оборудованием, и тогда мы никак ничего не сможем загрузить.

                                            Но в других языках таких правил нет. Например программист на Borland C под DOS мог написать так:

                                            volatile char *foo = ADDRESS_OF_SOME_DEVICE;
                                            foo[0] = 'a'; //я записал 'a' в память устройства!


                                            Так что мы можем или создать нужный нам интерпретатор или запустить существующий в нужном окружении.

                                            >> И это всё ужасно, потому что тогда область кода и область данных смешаются.
                                            фон-неймановская архитектура же:)

                                            Процессор действительно не различает в общем случае память для кода и для данных, иначе как бы он мог загружать код с диска в память?:)

                                            У современных CPU часто можно пометить область памяти как "только для выполнения", но это уже навороты
                                            https://en.wikipedia.org/wiki/Memory_type_range_register
                                            https://en.wikipedia.org/wiki/Page_attribute_table
                                            Ответить
                                            • > программист на Borland C под DOS мог написать так

                                              Ну так и щас так же, только не на пц, а в интернет-оф-сингс. const SVETODIOD;
                                              Ответить
                                              • Ну вот видишь, это же не ставляет тебя ничего патчить
                                                Ответить
                          • То есть единственный способ добавлять в такое MMIO какие-либо "библиотеки" (поддержку устройств) — это патчить интерпретатор?

                            P.S. А хотя нет, надо просто реализовать сокеты, и по ним наружу с кем хочешь говорить, с сетью, с контейнерами, устройствами и другими программами.
                            Ответить
                            • Не обязательно. Интерпретатор просто пишет в память.

                              Ты говоришь +, а он говорит (в терминах того процессора, под который он скомпилирован) "считать байт по такому-то адресу, увеличить и писнуть обратно"

                              А что этот адрес связан с контроллером так это дело конкретного компа.


                              В машинных кодах у тебя тоже нету импорта_)
                              Ответить
                              • Типа как в контроллерах ты просто знаешь что для сложения надо класть в такой-то и такой-то регистр, а потом выполнять ADD а потом из такого-то регистра читать результат.
                                Ответить
                                • Совершенно верно.

                                  А у некоей абстрактной видеокарты ты знаешь что если положить в такой-то регистр (который может быть замаплен на память) то она переключится в графический режим из текствого например
                                  Ответить
                                  • А в DOS ты знаешь, что если положить что-то в такой-то адрес памяти, то у тебя разблокируется верхняя память, и пойдёт КВАКА. Ну или система сломается. Поэтому я за "DOS".
                                    Ответить
                                    • В ДОС "API" обычно был через прерывания.
                                      В начале памяти была таблица адресов.
                                      Когда ты делал INT N процессор шел по адресу таблица+N и выполнял указанный там код (делал туда JMP, его регистр указатель инструкицй IP начинал туда указывать и оттуда он загружал следующую инструкцыю)

                                      Эту таблицу заполняли ДОС и БИОС и через нее программист вызывал их функции

                                      через это же работали прерывания устройств. Устройство подавало знак на ножку контроллера пррываний, он дергал ножку INTR, процессор считывал с контроллера номер прерывания, шел в таблицу и выполнял его

                                      таким образом прерывания можно было дернуть софтварно (инструкция INT) и или хардварно (через контроллер прерывания)

                                      В современном мире вместо хардварных прерываний используются messages: процессору посылается комманда по шине PCI Express
                                      Ответить
                                      • > ПРОЦЕССОР ШЕЛ ПО АДРЕСУ ТАБЛИЦА+N И ВЫПОЛНЯЛ УКАЗАННЫЙ ТАМ КОД (ДЕЛАЛ ТУДА JMP

                                        НЕ JMP ТУДА, А ЧТО-ТО ТИПА CALL ПО АДРЕСУ КОТОРЫЙ ТАМ ЗАПИСАН. В РЕАЛЬНОМ РЕЖИМЕ ТАБЛИЦА НАХОДИЛАСЬ ПО АДРЕСУ 0000:0000, СОСТОЯЛА ОНА ИЗ 4-Х БАЙТОВЫХ ЗАПИСЕЙ —– АДРЕСОВ ОБРАБОТЧИКОВ В ВИДЕ СЕГМЕНТ:СМЕЩЕНИЕ. ПРИ ВЫЗОВЕ ПРЕРЫВАНИЯ ВЫБИРАЛАСЬ ЗАПИСЬ ПО АДРЕСУ 0000:N*4, В СТЕКЕ СОХРАНЯЛСЯ АДРЕС РАЗВРАТА, И УПРАВЛЕНИЕ ПЕРЕДАВАЛОСЬ ОБРАБОТЧИКУ ПРЕРЫВАНИЯ.
                                        А В ЗАЩИЩЁННОМ РЕЖИМЕ ВСЁ СЛОЖНЕЕ.
                                        Ответить
                                        • INT —– ЭТО ЧТО-ТО ТИПА PUSHF+CALL. ОНО КЛАДЁТ В СТЕК НЕ ТОЛЬКО АДРЕС РАЗВРАТА, НО И СОСТОЯНИЕ ВСЕХ ФЛАГОВ.

                                          СООТВЕТСТВЕННО IRET –— ЭТО ЧТО-ТО ТИПА RET+POPF, ТОЛЬКО ЗА ОДНУ ИНСТРУКЦИЮ. ТО ЕСТЬ ПОСЛЕ РАЗВРАТА ФЛАГИ БУДУТ ТАКИМИ ЖЕ, КАК ДО ВЫЗОВА ПРЕРЫВАНИЯ. ФУНКЦИИ ДОС ПАТЧАТ СЛОВО В СТЕКЕ, КОТОРОЕ ХРАНИТ ФЛАГИ, ПОЭТОМУ ОНИ МОГУТ, НАПРИМЕР, УСТАНОВИТЬ ФЛАГ ZERO ИЛИ CARRY ДЛЯ ИНДИКАЦИИ ОШИБКИ.
                                          Ответить
                                          • День воспоминаний о 8086?
                                            Ответить
                                            • Ностальгируешь?
                                              Ответить
                                            • Борманд, ты случайно не знаешь простого пиздатого белсптаного симулятора электрических схем? Именно электрических, без всякой сложной электроники. Ну чтобы там хуйнуть источник напряжения и резисторы и посмотреть где какое напряжение, сколько мощности выделилось итд
                                              Ответить
                                              • > белсптаного симулятора электрических схем
                                                Х.з., когда я последний раз смотрел, попадались только инструменты для любителей пердолинга и анальной боли (аля gEDA).

                                                Лучше погоняй electronics workbench на виртуалке, он вроде фриварный был.
                                                Ответить
                                              • SPICE
                                                http://ngspice.sourceforge.net/
                                                Ответить
                                                • > SPICE
                                                  Предлагаешь ему попердолиться с соснолькой и текстами?
                                                  Ответить
                                              • В последний KiCad вроде привернули поддержку спайсов.
                                                Ответить
        • >> Прямо из останков сишной.

          Чувак, демосцены были еще во времена спектрумов. Прямо на асме.
          Ответить
          • > демосцены были еще во времена спектрумов
            Демосцены были ещё во времена, когда люди на осциллографе в лаборантской определёнными усилиями получали бегущую строку FUCK YOU
            Ответить
            • Не знаю за факю, но первую игру (теннис) сделали на осцелографе
              Аналоговая электронная игра
              Ответить
            • > бегущую строку FUCK YOU
              Challenge accepted. Правда на цифровом осциллябре это может не проканать...
              Ответить
            • В режиме одного входа или двух?
              Ответить
              • С двумя не спортивно, получится просто векторный дисплей.
                Ответить
                • А каким меандром ты нарисуешь параллельные горизонтальные линии у F?
                  Ответить
                  • https://upload.wikimedia.org/wikipedia/ru/thumb/7/79/Прогрессивная_развёртка.svg/420px-Прогрессивная_развёртка.svg.png
                    Ответить
                    • Монитор/телевизор меняют яркость луча, поэтому можно прерывать линии. У осциллографа яркость постоянная (почти; на самом деле при быстром движении луча яркость получается меньше из-за сокращения времени экспозиции).
                      Ответить
                      • Можно просто луч увести резко вверх, и тогда яркость там будет как бы нулевая
                        Ответить
                  • Чередовать два кадра: в одном кадре нарисована одна перекладина F, в другом –— другая.
                    Ответить
                    • P.S. Или рисовать перекладины пунктиром. При подаче меандра вертикальных палок почти не видно (из-за малой экспозиции), будут видны два горизонтальных пунктира. По этой же причине вертикальную палку буквы F придётся сделать наклонной, чтобы её было видно.
                      Ответить
                      • Примерно так (тупая симуляция без моделирования экспозиции и без сглаживания):
                        https://i.imgur.com/gKGoLVF.gif

                        function h($x) {
                            return $x ? 1 : 0;
                        }
                        
                        $f = function($x) {
                            $x_F = 640 / 4;
                            $x_F1 = $x_F / 4;
                            $x_U = $x_F + 640 / 4;
                            $x_U1 = ($x_F + $x_U) / 2;
                            $x_C = $x_U + 640 / 4;
                            $x_K1 = $x_C + 640 / 4 / 4;
                            if ($x < $x_F1) {
                                return 640 - $x * 640 / $x_F1;
                            } else if ($x < $x_F) {
                                return 320 * h($x % 2);
                            } else if ($x < $x_U) {
                                return 640 - ($x - $x_U1) * ($x - $x_U1) / 10;
                            } else if ($x < $x_C) {
                                return 320 + 24 * sqrt($x - $x_U) * (1 - 2 * h($x % 2));
                            } else if ($x < $x_K1) {
                                return 640 - ($x - $x_C) * 640 / $x_F1;
                            } else {
                                return 320 + 3 * ($x - $x_K1) * (1 - 2 * h($x % 2));
                            }
                        };
                        Ответить
                        • Кого повсюду узнают,
                          Скажите, как его зовут?
                          F! (тара-тата-та)
                          U! (тара-тата-та)
                          C! (тара-тата-та)
                          K! (тара-тата-та)
                          Ответить
                          • Вот такая симуляция будет правдоподобнее:
                            https://i.imgur.com/VRQoYnz.png
                            Ответить
                            • А почему C и элемент K прерывистые?
                              Ответить
                              • Если осциллограф в режиме одного входа (т. е. на горизонтальную развёртку мы влиять не можем), то каждому значению X соответствует не более одного значения Y (т. е. Y(X) — сюръективное отображение). У букв C и K же линии одна над другой.

                                Вот я и предложил стробирование: модулируем меандр какой-нибудь функцией, чтобы получить пару прерывистых линий.

                                Хотя можно их сделать и непрерывными: разложить изображение на два кадра, в нечётном кадре показывать верхние линии, в чётном –– нижние.
                                Ответить
                                • А, теперь разглядел еле заметные линии между отрезками в центре С и К.
                                  Ответить
                                  • Офтопик. Вспомнил фразу: изоморфизм — это биективный гомоморфизм, а биекция — это сюръективная инъекция.
                                    Ответить
                                    • > изоморфизм — это биективный гомоморфизм, а биекция — это сюръективная инъекция

                                      ЗАЧЕМ ВСЁ ЭТО ЗНАТЬ ОБЫЧНОМУ СРЕДНЕСТАТИСТИЧЕСКОМУ ПРОГРАММИСТУ.
                                      Ответить
                                      • РУСНЯ, ВЫ ДО СИХ ПОР ГОТОВИТЕ МАТЕМАТИКОВ ВМЕСТО ПРОГРАММИСТОВ??? ПРЫЩЕБЛЯДИ СОСНУЛИ!!!
                                        Ответить
                                      • Аахахха, да ведь эта ваша монада это всего лишь моноид в категории эндофункторов
                                        Ответить
                                      • Школьник, ты-то у нас точно не среднестатистический. Расскажи, как тебе помогло это знание.
                                        Ответить
                                    • > Вспомнил фразу: изоморфизм — это биективный гомоморфизм, а биекция — это сюръективная инъекция.

                                      Почти как стихи маяковского.

                                      Гомоморфный образ группы,
                                      В честь победы коммунизма,
                                      Изоморфен факторгруппе
                                      По ядру гомоморфизма.
                                      Ответить
                                      • > Изоморфен факторгруппе
                                        но ведь это не маяковский?
                                        Ответить
                                        • > но ведь это не маяковский?

                                          Так это я про фразу, которую вспомнил гость. Я прям вижу её написанной капсом в разных направлениях.
                                          Ответить
                                      • > По ядру гомоморфизма.

                                        Гомоикон
                                        Ответить
                                      • https://i.imgur.com/HopNrVI.jpg
                                        Ответить
                                        • > катаморфизм

                                          это обычный обобщённый fold

                                          > анаморфизм

                                          это обычный обобщённый unfold

                                          > параморфизм

                                          fold с дополнительным параметром — частью структуры, которую уже свернули

                                          > иломорфизм

                                          Видимо, это hylomorphism
                                          Тупо фьюжен fold . unfold, чтобы избежать построения промежуточной структуры данных
                                          https://raw.githubusercontent.com/sellout/recursion-scheme-talk/master/cheat%20sheet.pdf
                                          Ответить
                                          • > Понял, петушок?

                                            Последнюю фразу забыл разъяснить.
                                            Ответить
                                          • https://i.imgur.com/Sr96Mvw.png
                                            Делаешь пандорический захват, лифтишь в монаду, потом строишь рекурсивную схему (здесь подойдёт зигохистоморфный препроморфизм) как монадический трансформер из категории эндофункторов, и метациклически вычисляешь результат. Любой второкурсник справится. А если делать на анафорических лямбдах — так задачка вообще на пять минут.
                                            Ответить
                                            • > зигохистоморфный препроморфизм

                                              https://wiki.haskell.org/Zygohistomorphic_prepromorphisms
                                              Ответить
                                            • P.S. https://www.linux.org.ru/forum/development/8450167
                                              Ответить
                                              • > P.S. https://www.linux.org.ru/forum/development/8450167

                                                Это довольно просто реализуется через GHC.Generics, который появился в сентябре 2012 года, незадолго до того, как задали этот вопрос.
                                                Сейчас QuickCheck сам умеет это делать, никаких библиотек добавлять не надо, кода писать тоже не надо.

                                                К слову, GHC.Generics это та самая компайл-тайм рефлексия, которой нет в крестах.
                                                Ответить
                                          • > это обычный обобщённый fold
                                            > это обычный обобщённый unfold
                                            > fold с дополнительным параметром — частью структуры, которую уже свернули
                                            > Тупо фьюжен fold . unfold, чтобы избежать построения промежуточной структуры данных

                                            вообще, если вникнуть, то все эти ваши зигогомоподхвостохуеизмоморфизмы это какое-то тупое говно для того чтобы хитровыебаным образом определить рекурсию, обход дерева рекурсивно, обход какого-то другого говна рекурсивно, схлопнуть какую-то хуйню через хуйню в хуйню рекурсивно (типа вот факториал(x) это как факториал(x-1)*x), и поэтому надо придумать этой поебени какие-то заумные названия, чтобы перед всеми выебываться
                                            Ответить
                                            • http://lib.ru/ANEKDOTY/FEINMAN/feinman.txt_with-big-pictures.html#45


                                              На конференции был один хаскелист социолог, который написал работу, чтобы ее прочитали все мы - он написал ее предварительно. Я начал читать эту дьявольщину, и мои глаза просто полезли из орбит: я ни черта не мог в ней понять! Я подумал, что причина в том, что я не прочел ни одной книги из предложенного списка. Меня не отпускало это неприятное ощущение "своей неадекватности", до тех пор пока я, наконец, не сказал себе: "Я остановлюсь и прочитаю одно предложение медленно, чтобы понять, что, черт возьми, оно значит".
                                              Итак, я остановился - наугад - и прочитал следующее предложение очень внимательно. Я сейчас не помню его точно, но это было что-то вроде: "Индивидуальный член социального общества часто получает информацию через визуальные, символические каналы". Я долго с ним мучился, но все-таки перевел. Знаете что это означает? "Люди читают".
                                              Затем я перешел к следующему предложению и понял, что его я тоже могу перевести. Потом же это превратилось в пустое занятие: "Иногда люди читают; иногда люди слушают радио", - и т.д. Но все это было написано так замысловато, что сначала я даже не понял, но, когда, наконец, расшифровал, оказалось, что это полная бессмыслица.
                                              Ответить
                                            • > чтобы перед всеми выебываться

                                              Нет, так делаешь тут только ты. Нахватаешься где-то умных слов и кидаешься ими, не понимая
                                              толком смысла.

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

                                              Если ты пишешь рекурсию сам, надо доказывать, что ты нигде не зациклился. В схемах рукурсия сидит в реализации схемы, и накосячить гораздо сложнее.

                                              Это как использовать foreach вместо goto.
                                              Ответить
                                              • > рукурсия
                                                https://ddfblog2011.files.wordpress.com/2011/10/recursion-1.jpg (перепиши на Haskell)
                                                Ответить
                  • > каким меандром
                    Вот таким, к примеру: https://imgur.com/5Sv3pdR

                    https://gist.github.com/bormand/0aedcabf0a344a12ed99416a537760a4
                    Ответить
                    • Осталось написать гомоикону кодогенератор, которому передается на вход черно-белый bitmap и который генерирует код на верилоге который это выводит в таком виде
                      Ответить
                      • Там битмап в файле, можно не генерить. Да и "пиксели" крупноватые получились. А если делать больше строк - они уже начинают выпадать периодически. Всё-таки аналоговый осцилл тут бы лучше подошёл - он бы рисовал каждый проход а не рандомные выборки как цифровой. Но аналоговый в другом городе остался :(
                        Ответить
                        • Ну то ж надо из этого битмапа читать(как из статической памяти), а так можно заанроллить по-царски. Или компилятор верилога сам анроллить умеет?
                          Ответить
                          • > анроллить умеет
                            Скорее не анроллить не умеет (циклы по-другому не синтезируются). Умеет по-жёсткому инлайнить всю схему в кашу. Таблички и свичи иногда в формулы конверит. У конечных автоматов стейты перенумеровывает.

                            Но он, сука, ленивый. Если в заданные тайминги уложилось без оптимизаций - и так сойдёт.
                            Ответить
                            • Поэтому надо писать на ассемблере напрямую писать ячейки на основе топологии FPGA (такие возможности вообще предоставляются в той IDE для FGPA которую ты юзаешь?)
                              Ответить
                              • ПЕРЕВЕДИ НА "РНР".
                                Ответить
                              • Да, можно юзать примитивы и прибивать их гвоздями к нужному месту.
                                Ответить
                              • З.Ы. Ну и есть карта чипа на которой можно разглядывать сконпелированный результат.
                                Ответить
                              • // y = a & b
                                cycloneive_lcell_comb #(
                                    .LUT_MASK(16'b1000100010001000)
                                ) comb1 (
                                    .combout(y),
                                    .dataa(a),
                                    .datab(b)
                                );
                                
                                set_location_assignment LLCOMB_X15_Y29_N0 -to comb1
                                Порты у ячейки местами переставляет, сцуко. Я заказывал A и B, а он сделал через B и D: https://imgur.com/a/zUtGipA
                                Ответить
                        • > А если делать больше строк - они уже начинают выпадать периодически. Всё-таки аналоговый осцилл тут бы лучше подошёл

                          вообще, эти цифровые осциллы для анскиллябр. Настоящие цари вот такие штуки юзают:
                          http://www.gage-applied.com/digitizers/12-bit/pci/compuscope-eon.htm
                          Ответить
                    • Изображение разложено на семь кадров, которые быстро чередуются?
                      Ответить
                    • Русня может осцилляторы с usb? Или просто этикетку переклеили? Оно может соединяться с компом?
                      Ответить
                      • > этикетку переклеили
                        Это китаец локализованный.

                        > соединяться с компом
                        Да, через LAN или задний USB (передний для флешки). Но там весьма унылая прога. Няшные крутилки и кнопочки намного удобней юзать, чем пердолиться мышкой с компа. Разве что протокол реверснуть да с питона рулить...
                        Ответить
                        • >Это китаец локализованный.
                          :))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))

                          А работать в качестве дигитализатора сигнала (того самого SDR) он не может?
                          Ответить
                          • Не, он только куски сигнала выхватывает по триггеру.

                            АЦП плату для компа выше j123123 кидал.
                            Ответить
                        • > Няшные крутилки и кнопочки намного удобней юзать, чем пердолиться мышкой с компа.

                          Можно еще сделать себе контроллер для осциллоргафа с крутилками и кнопочкам. Крутилки можно сделать из переменных резисторов, переменных конденсаторов или даже из переменных индуктивностей https://dic.academic.ru/pictures/enc_tech/i_290.jpg - или тупо по тому же принципу как в мышках сделано колесо прокрутки (в старых шариковых мышках оно кстати на оптопаре работало, в новых оптических туда начали ставить какое-то непонятное говно под названием "механический энкодер"
                          https://pikabu.ru/story/pomoshch_v_vyibore_kompyuternoy_myishi_5876570
                          )
                          Ответить
                          • >в новых оптических туда начали какое-то непонятное говно под названием "механический энкодер"
                            Шо-шо? Я у себя такой же энкодер видел.
                            Ответить
                            • https://cs9.pikabu.ru/post_img/2018/04/29/9/1525015316175474049.jpg такой?
                              Ответить
                              • Пикабушечка? :) Это с мышью с шариком, но конструкция такая же. Кстати с открытым корпусом он работал гораздо хуже.
                                Ответить
                                • На последней картинке энкодер на оптопаре. Надёжная вещь. Почти неубиваемая. Раньше такие были в мышах с шариком, потом стали ставить на колёсико, совмещённое со средней кнопкой.

                                  А вот эта хуета — механический энкодер:
                                  https://cs11.pikabu.ru/post_img/2018/04/29/9/1525014784152267732.jpg
                                  Мало того, что при работе он сыпет искрами, так у него ещё дорожка стирается и контакты ослабевают, так что в неожиданный момент он вообще перестаёт работать. Такие недавно стали ставить в дешёвые мыши.

                                  Ещё лет пять назад механических энкодеров не было даже в самых дешёвых мышах. Вообще качество товара упало шопиздец.

                                  P.S. Ещё немного такого «прогресса» и люди всерьёз будут мечтать о компах 2006 года, потому что в них такой хуеты не было.
                                  Ответить
                                  • Моей мыше лет 10+ (Logitech M-BT58). Набрал в родном институте. С середины 2000 было две таких мыши, одна сдохла (начала подглючивать клавиша, я на ней в старкрафт играл, думаю, там кликов было пару миллионов :))) - взял вторую. Так что ничего сказать не могу. :)
                                    А оптический энкодер - не почти, а неубиваемая штука. На старой мыши со временем трещотка на колесе ослабла, но в энкодере ломаться-то нечему.
                                    Ответить
                                  • Производителю не нужны неубиваемые мыши, ему нужны продажи. Ну и чтобы во время гарантии не успевало ломаться.

                                    З.Ы. Вспомнил отзыв про razer'овские мыши - "отличная мышь, уже третью покупаю"
                                    Ответить
                                    • В лохматые 90-е такой была двухкнопочная митсума. Как игровая была ничего (по тогдашним меркам), но шарик начинал через некоторое время размягчаться.

                                      А после таких отзывов имхо никто это г покупать не станет.

                                      Интересно, сколько стоила Logitech M-BT58 10 лет назад?
                                      Ответить
                                      • >> шарик начинал через некоторое время размягчаться

                                        Эх, какая тьма египетская...
                                        Ответить
                                      • У рейзеров ещё и экономия на флешке преподносится как фича. Типа конфиг мыши на другую машину удобней переносить через облако.

                                        Куда катится этот мир...
                                        Ответить
                                    • > отличная мышь, уже третью покупаю

                                      Я свою мышь тоже уже трижды купил: на работу, домой, и другу в подарок.
                                      Ответить
                                      • А ПОЧЕМУ МНЕ НЕ КУПИЛ?
                                        Ответить
                                        • > А ПОЧЕМУ МНЕ НЕ КУПИЛ?

                                          Потому что ты кричишь на меня.
                                          Ответить
                                          • ОН НЕ КРИЧИТ. У НЕГО РАСКЛАДКА КЛАВИАТУРЫ ТАКАЯ. ИЛИ ШИФТ СЛОМАЛСЯ.
                                            Ответить
                                  • механический энкодер не помню, а опто помню конечно

                                    о появления оптических крыс (первая половина нульвых) у всех такие точно мышы с шариками и были

                                    и с ковриком еще
                                    Ответить
                                  • Кстати, у механического энкокококодера довольно странная кодировка угла поворота. С относительным энкокококодером, кокококоторый в мышках, всё просто (он лишь детектирует направление поворота), а бывают ещё абсолютные, кокококоторые показывают абсолютный угол поворота. Чочобы полоска фольги на диске была непрерывной, для абсолютного энкокококодера пришлось изменить порядок чисел:
                                    0000
                                    0001
                                    0011
                                    0010
                                    0110
                                    0111
                                    0101
                                    0100
                                    1100
                                    1101
                                    1111
                                    1110
                                    1010
                                    1011
                                    1001
                                    1000


                                    Эта последовательность называется кокококодом Грея.

                                    Кто-нибудь знает ещё какие-нибудь странные кокококоды и где они применяются?
                                    Ответить
                                    • > чтобы полоска была непрерывной
                                      Не так. Чтобы в каждый момент переключалось не более одного разряда.
                                      Ответить
                                      • Спасибо. Уже нагуглил. Значит, связность контактной дорожки –— случайное полезное свойство кода.
                                        Ответить
                                        • К слову, код инкануса грея ещё юзали в картах карно.
                                          Ответить
                                  • > в дешевые мыши
                                    На днях начал глючить энкодер в G403. Так что уже и не в дешёвых это дерьмо ставят ;(
                                    Ответить
                    • >> https://imgur.com/5Sv3pdR

                      Какой хабар! Это сколько же маргарина можно за такой получить?
                      Ответить
                    • Борманд, сколько такой осцелябрик стоит?
                      Ответить
                      • Половину килобакса вроде сейчас.
                        Ответить
                        • Вроде и недохуя совсем.. Я чото думал что они дорогие. А как называ?
                          Ответить
                          • > недохуя
                            Дык это начальный уровень, всего гигасемпл да 100МГц полоса.

                            Так то чуваки напрямую из китая раньше вообще за копейки заказывали, но таможня бдит, а осциллябра явно не закосит под товары для домохозяек.

                            > как называ
                            На фотке глянь, не помню точные циферки.
                            Ответить
                            • А как таможня классифицирует осциллографы? Как товар для производства? Тогда для производства чего? Как товар для бизнеса? Тогда для какого бизнеса?
                              Ответить
                              • Измерительная техника какая-нибудь. Явно для производства или бизнеса по ремонту железа.
                                Ответить
                                • То есть они мне не поверят, если я скажу, что подключаю к осциллографу антенну, чтобы принимать сигналы от инопланетян?
                                  Ответить
                                  • > чтобы принимать сигналы от инопланетян

                                    Так это тоже бизнес. Секу можно, например, организовать. У саентологов тоже есть подобный прибор, что-то типа полиграфа, на котором они проверяются, правда там стрелочкой управляет то ли человек, то ли рандом. Но с осциллографом можно ещё круче секту сделать, можно со всей кащенки бабло рубить, защищая их от space invaders. Осциллограф -- это тебе не шапочка из фольги. Им можно половину инопланетян перехуярить.
                                    Ответить
                                    • А чем можно перехуярить оставшуюся половину?
                                      Ответить
                                      • Ну например мультивибратором на двух транзисторах и двух конденсаторах побольше, чтобы частота была низкая. Получится кривоватый меандр, который на динамике будет грязно гудеть. Этот звук идёт сразу в астрал, ты ведь знаешь про эксперименты американцев и инопланетян, которые наз низкочастотным звуком облучают? Так вот такой чтукой можно инопланетян оставить без тонкого тела, и летательные аппараты у них тоже отключаются на определённом радиусе от такого источника. Такие устройства можно продавать особо приближенным (то есть всем, кто состоит в ней более трёх месяцев) членам секты за 50-100 тысяч рублей.

                                        Однако полную победу над инопланетянами одерживать не рекомендую, это снизит приток денег организатору секты.
                                        Ответить
                                • А если для бизнеса, то что?
                                  Ответить
                                  • То стопнут на таможне с вероятностью 99.9%. И хуй ты пройдёшь эту процедуру без юрлица.

                                    З.Ы. Одному чуваку китаец сдуру написал "10000 резисторов" вместо "1 набор резисторов". И эту копеечную хуйню стопнули как оптовую партию, лол.
                                    Ответить
                                    • Кстати, некоторые продавцы с Алиэкспресса на посылке просто ставят галочку напротив Gift (подарок), а некоторые по-честному расписывают содержимое в деталях.
                                      Ответить
                                      • > подарок
                                        А подарок, который выглядит слишком большим и ценным, но стоит подозрительно мало всяко проебут на почте :)
                                        Ответить
                                        • >подарок стоит подозрительно мало
                                          Как это?
                                          Ответить
                                          • Объявленная стоимость посылки 10 центов (муриканских или евроцентов, пофигу) или один российский рубль. Ну чтобы графа не была пустой.
                                            Ответить
                                          • Кстати, конверт для письма, в который вложен лист картона, почти наверняка вскроют, потому что он до боли напоминает закладку для денег.

                                            Подсказка: если там действительно деньги, их можно проебать, а вместо них вернуть объявленную стоимость.
                                            Ответить
                                            • >объявленную стоимость.
                                              чТО ЭТО?
                                              Ответить
                                              • При повреждении, утрате или нарушении сроков доставки отправитель или получатель ценного отправления имеет право на компенсацию.

                                                Ценные отправления оформляются в почтовом отделении. Ценным может быть только регистрируемое отправление (вероятно, имеется в виду заказное письмо или типа того).

                                                Ценность содержимого отправления назначает отправитель. Сумму объявленной ценности нужно написать на упаковке (конверте, коробке, пакете); сумма пишется цифрами и дублируется прописью в скобках. Например: 100 (сто) руб. 00 коп.

                                                За объявленную ценность взимается дополнительная плата (указана без учета НДС) в размере:

                                                • для посылок – 3,39% от оценочной стоимости вложений,
                                                • для писем и бандеролей – 0,03 руб. за каждый рубль оценочной стоимости вложений,
                                                • для отправлений 1 класса – 3% от оценочной стоимости вложений,
                                                • для экспресс-отправлений EMS – 0,42% от оценочной стоимости вложений.

                                                Отправления с наложенным платежом и описью вложения можно оформить только ценным отправлением.
                                                При этом сумма наложенного платежа не может превышать сумму ценности.
                                                Ответить
                                                • асцылябры ваши в чип-и-дип лежат

                                                  причем там есть осцилографы электрика (мультиметры) чтобы зыркать на синусоиду переменного тока, так и для электронщика таки вот дорогие

                                                  нахуй их через гранитсу тащит?
                                                  Ответить
                                                  • Потому bormand и написа́л: «проще у местных купить вдвое дороже».
                                                    Ответить
                                                  • > чип-и-дип
                                                    Самый дорогой магазин выбрал? Но каталог на сайте у них классный, да.
                                                    Ответить
                                                    • Он был дешёвым лет 20 назад. Лет 10 назад они начали вкладываться в рекламу и в прочую ненужную хуету, и цены резко скакнули.
                                                      Ответить
                                    • Ращка-пидоращка :))) по быстрому погуглил у нас - ничего не нашел. Может великий знаток дойча Пузя чо нагуглит ещё.
                                      Ответить
                            • >таможня бдит
                              И сколько они берут?
                              Ответить
                              • Это неважно. Там столько ёбли, что проще у местных купить вдвое дороже...
                                Ответить
                                • Ебать спидорашка :)))))) У нас заплатил налоги - и спи спокойно.
                                  Ответить
                                  • У вас всё хорошо, пока груз не покидает пределы Евросоюза. При ввозе в Евросоюз или при вывозе из Евросоюза бывает ебля.
                                    Ответить
                                    • Да нихуя. Я именно про импорт с кетая и писал.
                                      Ответить
                                • На Х-ре один чувак писал, как пытался приобрести Reprap за границей. Тормознула таможня, заставили заполнять таможенную декларацию и платить сбор. Ему пришлось несколько дней искать юриста, который мог помочь заполнить декларацию, ибо никто не сталкивался с такой декларацией для физических лиц, а юридического лица у него не было. Пока добывал одну справку (требовалось техническое заключение эксперта, для чего предназначен этот прибор), у другой истекал срок, и ему приходилось заниматься сбором документов с нуля заново.

                                  Ещё ебля бывает при ввозе/вывозе животных и растений. Нужен ветеринарный или фитосанитарный сертификат соответственно, а как его получать физическому лицу тоже никто не знает.
                                  Ответить
                                  • А что там декларировать-то? Я знаю только что в зависимости от цены могут потребовать таможенный сбор/ндс.
                                    Ну животные/растения то другое.
                                    Ответить
                                  • >> заполнить декларацию
                                    а дефиницию когда?
                                    Ответить
    • >> bulbagarden

      Это картофельное поле что ли?
      Ответить
    • В следующем поколении будет покемон Bobby Tables.
      Ответить
      • Эволюционирует в форму DROP
        Ответить
        • ПУСТЬ ЭВОЛЮЦИОНИРУЮТ В УНДЕФИНЕД.
          Ответить
          • ХОТЕЛ ЗАРЕГИСТРИРОВАТЬ undefined, А МНЕ ГОВОРЯТ, ЧТО ПОЛЬЗОВАТЕЛЬ С ТАКИМ НИКНЕЙМОМ УЖЕ СУЩЕСТВУЕТ. КТО ЭВОЛЮЦИОНИРОВАЛ? ПРИЗНАВАЙТЕСЬ!
            Ответить
            • А в чём прикол регать какие-то ники и писать полтора сообщения с них, про проверку или про щёку?

              Это максимальный креатифф, на который ты способен? Тогда КГ/АМ. Давай лучше про программирование поговорим.
              Ответить
              • Давай. Почему в ECMAScript при всяком удобном случае неявно вызывается метод toString и выдаёт всякую фигню вроде 'undefined'? Кому это может понадобиться?
                Ответить
                • И всё же даже это лучше пхпшной пустой строки вместо логического значения ложь.
                  Ответить
                • Слабая типизация, это кстати удобно, особенно когда нет операций/функций поведение которых зависит от типа, а которые для всех типов работают одинаково.
                  Снобол гут:
                  BEGIN
                      A = "19"
                      B = "тысячобезьянвжопусунулибанан"
                      OUTPUT = A * 2 + 2 B
                  END
                  Ответить
              • А в чём прикол писать всё время с одного акка? Это же скучно.
                Ответить

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