Перейти к содержимому

Fingercomp

Гуру
  • Публикации

    1 629
  • Зарегистрирован

  • Посещение

  • Победитель дней

    283

Сообщения, опубликованные пользователем Fingercomp


  1. 20 минут назад, rootmaster сказал:

    лан больше пиариться так не буду, ну что поделаеш та если некому мой софт не интересен....

    Причину и, более того, даже решение ты уже сам написал:

    В 13.04.2022 в 21:39, rootmaster сказал:

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

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

    • Нравится 5

  2. Потому что в кодеке DFPWM сэмплы однобитовые. Вообще, если раздуть каждый бит в файле DFPWM до байта (то есть чтобы были байты либо 255, либо 0), то выход вполне можно будет сыграть, но придётся ещё фильтр низких частот ставить перед FFT. Собственно, три буквы PWM в названии кодека уже описывают принцип работы, а ещё DF говорит, что там параметры фильтра меняются в процессе декодирования.

    • Нравится 2

  3. Советую матчасть покурить, раз уж матметоды такие применять решено. Можно даже мой пост. Там поверхностно рассказывал про всякие параметры. complex к этому всему отношение имеет посредственное, и если понимаешь, что значит e, то и без complex.lua можно всё провернуть.

    • Нравится 1

  4. Всё в Lua сделать можно, я даже статью про это писал. Там про table.pack в основном, но хочу вдобавок напомнить здесь про функцию select, которая умеет как число переданных аргументов возвратить, так и вытащить нужный:

    select('#', 2, 4, nil, 8, nil, nil, nil, nil) --> 8
    select(2, 2, 4, nil, 8, nil, nil, nil, nil) --> 4       nil     8       nil     nil     nil

    Никакие nil ему не помеха.

    • Нравится 1

  5. За форумом я в последнее время слежу через RSS-читалку, и недавно мне начали попадаться какие-то настолько огромные стены безграмотного текста, что решил заглянуть, что тут творится. В общем, это были посты @rootmaster: с ошибками в словах, которые третьеклассник не допустит, желанием материться в каждом третьем посте, без форматирования, без точек, запятых, всё сплошняком, зато с излишними самоуверенностью и невежеством.

     

    Тут вот заверяется защита от замены биоса изнутри запущенной системы. За фичу эту много людей берётся, но постоянно делают всё не так от незнания. Напомню: достаточно просто подменить component.invoke именно в таблице, которую получает биос в окружении.

     

    И мне стало интересно: может, зря я осуждаю непризнанного гения. Вдруг хоть он смог понять и сделать всё по уму и красоте. Тем более, что сам код биоса не читабелен непосредственно, то есть вишней на торте даже до обфускации какой-то автор дошёл. Ещё и функционалы какие-то определил и тут же расширил.

     

    ...Ну да, если бы. И саспенса не получилось даже: были б ум да красота, я бы пост этот в принципе не писал.

     

    Код напичкан костылями.

    • Было решено скопировать component в отдельную таблицу, в которой покрыть влоб бронёй прокси, отдаваемый методом component.proxy для компонента eeprom.
    • Затем пришлось переопределить поле invoke в копии, чтобы он работал через component.proxy, а не внутренние механизмы machine.lua.
    • И это всё работает на одной сопле в форме локальной переменной со ссылкой на эту прокси: без неё все изменения бы откатились при следующем же collectgarbage, потому что возвращаемые прокси лежат в эфемерной (__mode = "v") табличке-кэше.

    Хотя я наврал со словом "работает". Если хоть немного вдаться в работу machine.lua, сразу должно стать понятным, что "защита" элементарно обходится. Например, вот так.

    getmetatable(component.eeprom.getSize).__call({address = component.eeprom.address, name = "set"}, "lol")

    И без перепрошивки комп больше не запустится.

     

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

     

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

    • Одобряю 2
    • Спасибо 1
    • Ха-ха 1
    • Грусть 3

  6. 34 минуты назад, Belzebub сказал:

    Ничего не понимаю, в OpenComputers удалили thread либу?
    Документация имеется https://ocdoc.cil.li/api:thread а вот реквайр либы не робит ¯\_(ツ)_/¯
    Или это внешняя зависимость?

    Этой версии OC уже пять лет. Пять. Если не заметили, пять лет этой версии. А, да, забыл сказать, уже 5 лет прошло с релиза 1.6.1. Ну, в заключение отмечу, что версия устарела на пять лет. 5 лет. Five years. 五年.

     

    Зачем?

    • Ха-ха 1

  7. 2 часа назад, Bs0Dd сказал:

    Странное дело, на 20 убунте все ок. А какой она разрядности? Если 32-бит, то причина в этом. Компилятор под 64-бит системы, насколько ппомню.

    Тогда б с SIGILL падал, по идее.

     

    Можно в coredumpctl debug покопаться и посмотреть, отчего SIGSEGV выпал.


  8. LE-церты — вообще не туда, тогда б он про PKIX заваленный писал, и лечить надо было это обновлением Java (до 8u2** какой-то, например), и ни до какого HTTP 403 Forbidden бы дело не то что не дошло, веб-сервер бы запрос прочесть не смог физически.

     

    Здесь сам прокси Cloudflare блочит. Скорее всего, его удовлетворит просто выставленный User-Agent какой-нибудь свой при отправке запроса.

    local request = internet.request(url, nil, {["User-Agent"] = "OpenComputers 1.7.5"})

     

    • Нравится 2

  9. В 28.09.2021 в 12:54, Zer0Galaxy сказал:

    Вот мне просто интересно, каждый раз при вызове функции двойка будет четыре раза возводиться в степень? Не будет ли эффективнее сделать так?

    Посмотрим на байт-код:

    $ echo 'local function round(nul) return nul + (2 ^ 52 + 2 ^ 51) - (2 ^ 52 + 2 ^ 51) end' | luac5.3 -l -l -
    
    main <stdin:0,0> (2 instructions at 0x55f08348ca20)
    0+ params, 2 slots, 1 upvalue, 1 local, 0 constants, 1 function
            1       [1]     CLOSURE         0 0     ; 0x55f08348cc60
            2       [1]     RETURN          0 1
    constants (0) for 0x55f08348ca20:
    locals (1) for 0x55f08348ca20:
            0       round   2       3
    upvalues (1) for 0x55f08348ca20:
            0       _ENV    1       0
    
    function <stdin:1,1> (4 instructions at 0x55f08348cc60)
    1 param, 2 slots, 0 upvalues, 1 local, 1 constant, 0 functions
            1       [1]     ADD             1 0 -1  ; - 6.7553994410557e+15
            2       [1]     SUB             1 1 -1  ; - 6.7553994410557e+15
            3       [1]     RETURN          1 2
            4       [1]     RETURN          0 1
    constants (1) for 0x55f08348cc60:
            1       6.7553994410557e+15
    locals (1) for 0x55f08348cc60:
            0       nul     1       5
    upvalues (0) for 0x55f08348cc60:
    

    Видно, что ADD и SUB тут работают с константой. Обращение к константе быстрое, доступное, лёгкое, воздушное. В предложенном варианте появляется upvalue, к которым доступ будет дольше. Так что эффективнее не станет.

    • Нравится 4
    • Спасибо 1

  10. 7 часов назад, Wolframoviy сказал:

    А Линукс получится переконвертировать в луа?

    Ну, я надеюсь, осознание имеется, что линукс — это несколько необычная программа, правильно? Она общается с девайсами более-менее напрямую. Можем ли из луа мы взять и отключить прерывания, сбросить флаги из-под floating-point-операций? Если мы говорим про OC*, то я что-то сомневаюсь.

     

    Единственный реальный вариант — это собрать полноценный эмулятор какого-то SoC: проц, серийка, память, таймеры, остальные девайсы. Тогда можно потенциально написать для этой системы драйверы, собрать их вместе с ядром для процессора и радоваться жизни.

     

    * Отдельные наркоманы, впрочем, делают мини-ядра вроде eLua, где есть низкоуровневый доступ к железу.

    • Спасибо 1
    • Ха-ха 1

  11. Вот полное решение.

    local function processEscapes(str)
      return (str:gsub("\\u{(%x+)}", function(hex) return utf8.char(tonumber(hex, 16)) end)
      	:gsub("\\(%d%d?%d?)", function(dec) return string.char(tonumber(dec, 10)) end)
      	:gsub("\\x(%x%x)", function(hex) return string.char(tonumber(hex, 16)) end)
      	:gsub("\\z%s*", "") -- skip whitespace
        :gsub("\\\n", "\n")
        :gsub("\\([abfnrtv\\\"'])", {
          a = "\a",
          b = "\b",
          f = "\f",
          n = "\n",
          r = "\r",
          t = "\t",
          v = "\v",
          ["\\"] = "\\",
          ['"'] = '"',
          ["'"] = "'",
        }))
        :gsub("\\(.)", function(c) error("invalid escape sequence: \\" .. c) end)
    end

    P. S. Форум убивает форматирование, не спрашивая меня.

    • Спасибо 2

  12. Я задал 4 вопроса и ни на один не получил вразумительного ответа. А они мне нужны, потому что без них совершенно неясно, "как это пофиксить".

     

    За других говорить не могу и не буду. Но я не атакую встречными вопросами из-за вредности, злости (ну, если немного только) или чувства собственного величия. Наоборот, иногда пытаюсь угадать по неполной информации ответ, что, вообще говоря, не надо делать. Здесь я бессилен. Что творится, никто не понимает. Задаю вопросы — прояснения не получаю.

     

    К слову. Для оформления кода есть кнопка VQXNQyJ.png. Просьба ею пользоваться. Можно даже выбрать подсветку Lua, если настроение очень щедрое.

    • Спасибо 1

  13. Это весь код? motd — это глобалка? Исходя из чего было установлено, что оно работает? И как оно в принципе работать может, когда в либе internet функции write подавно нету и не было никогда?

     

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

    • Нравится 1
    • Спасибо 1

  14. Только байты интересуют? С сокетами проблем нету? У меня сомнения, потому что вопрос элементарный. Тем не менее.

     

    В питоне строка str хранит последовательность символов (codepoint) юникода каким-то абстрактным образом, потому что закодировать их можно по-разному: utf-8, utf-1, utf-16, utf-32, ucs-2 или какая-то другая, самопальная кодировка. bytes же — это набор байтов, как можно догадаться, а не символов. Если мы хотим из str сделать bytes, нужно абстрактный набор юникод-символов превратить в конкретную последовательность байтов — этим и занимается кодировка.

     

    Здесь bytes("PING", encoding="utf8") вернёт то же, что и литерал b'PING' в utf8-кодированном исходнике, например: последовательность из 4 байтов с номерами 90, 73, 78, 71.

     

    Теперь про Луа. В Луа никакого абстрактного набора символов нет. Строка в Луа — это не набор символов юникода, как str, а конкретная последовательность из произвольных байтов. То есть такая же вещь, как и bytes в Питоне.

     

    Поэтому аналог bytes("PING", encoding="utf8"), или же b'PING' (если исходник в кодировке utf-8), — просто "PING" (впрочем, опять-таки, в utf8-кодированном коде)

    sock:write("PING")

     

    • Спасибо 1

  15. 21 час назад, Bs0Dd сказал:

    Да я посчитал, что юзер будет достаточно умен и не попытается поставить программу на readonly файловую систему. Но у новичков, как оказывается, бывает все((((.

    Программу в общем следует писать так, чтобы она в любой ситуации выстояла. Программе никогда никто не рад. Её все будут тестировать, потрошить, разрывать на части, ругать и пытаться взорвать. Поэтому ошибки нужно обработать, отрапортовать, ввод отвалидировать; надеяться, что у проги всё будет прекрасно, нельзя.
     

    Как здесь: кто-то не узнал, что файл не открылся, потому что ошибка съелась. Проблема не его.

    • Грусть 2

  16. 8 часов назад, ProgramCrafter сказал:

    1. Сделать подсветку сторон компьютера в зависимости от сигнала редстоуна.

    2. Заменить стандартные значения входов редстоуна с -1 на 0.

    3. Сделать ограничения на выход редстоуна (я только что поставил выход с силой -161, это почему-то работает).

    4. Создать компонент "лампа", светящийся при сигнале красной пыли.

    С такими запросами я могу предложить поиграть в SHENZHEN I/O. Там уже есть всё из перечисленного, только не редстоуном зовётся.

    • Нравится 5

  17. Я хочу сразу извиниться за то, что буду дальше писать. Потому что это будет критика и не по коду.

     

    Тема оформлена странно. По описанию в первом посте я решительно ничего не понял. Как будто я какую-то книжку начал читать, которая 4 тома неспешно длиться будет. Это меня огорчает: я же вижу, что это какая-то крутая программа.

     

    Всё становится логичным, если признать, что истинная цель — это "продать" программу. Заинтересовать читателей. Принципы: всё главное — вверх; что можно делать пикчей — сделать пикчей, не текстом; а текст же делать последовательным и легкодоступным. Дальше я перечислю, что конкретно можно исправить, чтобы офигенной проге сопутствовал офигенный пост.

     

    1. Описание

    Нет ни одного абзаца, который бы сказал, что делает программа. Абзац это должен быть первый и прямо под картинкой:

    Цитата

    HoverHelm — сетевые диски для тех, у кого нет жёсткого: дронов, микроконтроллеров. Вставляем диски в сервер — через модемы клиенты получают к ним доступ. И пару вкусных фич вдобавок.

     

    Идея — это, конечно, интересно, но уже второстепенно. Это не главный контент, потому что ни на какой вопрос читателя не отвечает: автору просто не терпится высказаться, хотя его никто не просил. Умные люди это называют лирическим отступлением. Начинать с него пост не нужно.

     

    2. Список фич

    Есть пункт "Преимущества". Я скажу прямо: у этой программы конкурентов нет. Соответственно, преимуществ перед кем-то нет тоже. Можно или перечислить фичи, или сказать зачем.

    В оригинальном посте ближе второй вариант. Тогда назвать пункт своим именем: "Зачем", — и переписать список. Схема каждого пункта: что за фича, запятая (или тире, или двоеточие), комментарий (какая проблема решается). Кратко и ёмко — подробнее можно дальше написать.

     

    Пример:

    Цитата

    Зачем:

    • неограниченный размер файлов, чтобы забыть про 4 кБ;
    • прозрачная эмуляция диска: в программе не придётся ничего менять;
    • легко обновить программу: не нужно перешивать каждого дрона;
    • не нужны клава и моник.

    Список дополнить, разумеется. 4 пункта не предел.

     

    3. Минимальные требования

    Пункт можно переименовать в "Железо". Это короче и удобоваримее. И ради кода, делайте требования картинкой. Это в пятьсот раз нагляднее, чем список. Уже ведь даже майнкрафт не нужен для пикч: в десктопном оцелоте можно склеить пикчи.

     

    У форума уродские инструменты форматирования, но таблицы вставлять он умеет. Откроем редактор HTML, пропишем:

    <html>
      <head>
        <meta charset="utf-8">
      </head>
      <body>
        <table>
          <thead>
            <tr>
              <th>Клиент</th>
              <th>Сервер</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td><img src="..." alt="Клиентская сборка"></td>
              <td><img src="..." alt="Серверная сборка"></td>
            </tr>
          </tbody>
        </table>
      </body>
    </html>

    Копипастим, вставляем в адресную строку, в начало добавляем data:text/html,, жмём Enter. Ctrl-A, Ctrl-C и копируем сюда.

    Цитата
    Клиент Сервер
    Клиентская сборка Серверная сборка

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

     

    4. Команды

    Команды надо выделять. Или курсивом, или в блок кода, или вот так, но не плейнтекстом. Особенно команды с кучей аргументов.

     

    5. Использование

    Это же не просто библиотека. Инструкция по использованию — это полезно, но опять второстепенно. Нужен новый пункт, назвать "Практика". Здесь можно сделать короткое и ёмкое видео (скорее всего, придётся кадрировать, снимать в несколько дублей).

     

    План сценария:

    1. Надпись "Установка".
    2. Запускаем сервер, ставим программу.
    3. Собираем биос.
    4. Открываем гуи ассемблера, в котором уже выложен рецепт дрона. Пихаем биос.
    5. Жмём по кнопке, получаем результат (делать в креативе, чтоб не ждать).
    6. Включаем дрона и запускаем что-нибудь цветастое. Например, мерцанием лампой дрона под такт музяке. Или что-нибудь ещё.

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

     

    Если видео не хочется делать, то переписать инструкции. Вернее, дополнить их примерами. Разберём один пункт.

    В 18.08.2020 в 03:19, hohserg сказал:

    Выполните команду prepare_eeprom <имя устройства> <адрес сетевой карты со стороны сервера или ее тип(если она одна)> <порт> <адрес сетевой карты со стороны клиента, необязательно если карта одна>

    Не знаю, как вам, а я ничего так и не понял. А теперь следите за руками:

    Цитата

    Пропишите:

    
    $ prepare_eeprom <имя устройства> <адрес серверного модема> <порт> <адрес клиентского модема>

    Если на сервере одна сетевая карта, вместо адреса её можно вписать тип (modem или tunnel).

    Адрес клиентского модема можно убрать вообще, если на клиенте только одна сетевая карта.

    Пример:

    
    $ prepare_eeprom Вася modem 31337

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

     

    6. Слишком мелкие придирки, чтобы выделять на каждую по пункту

    • По-русски logging лучше назвать логированием. Или просто логами.
    • Перед открывающей скобкой ставить пробел (вот так).
    • Сделать форматирование команд однородным. Сейчас там где-то цвет особый, где-то курсив, а где-то ни того, ни другого. Хотя семантически элементы не отличаются.
    • Причастие прошедшего времени глагола read пишется так же. @Fingercomp reads manuals. — Yesterday I read manuals. — The manual was read.

     

    7. Что в топике хорошо

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

    1. Пикча в начале. Самое главное — странная пикча в начале. Это интереснее.
    2. Принцип работы умещён в информативную картинку. Дополнительный текст не потребовался.
    3. Есть ссылка на код. Во многих постах авторы ограничиваются командой загрузки. Мне интересно почитать и сырцы.
    4. Охрененная идея, которая побудила меня писать это.

    8. Живой пример

    Я писал этот пост для Cyan на oc.cil.li: https://oc.cil.li/topic/2350-cyan-bios/. Там люди очень скупы на лайки, а здесь их целых 3. Оформление оказалось очень важным.

     

    9. Почему я написал пост здесь, а не стукнул автору в ЛС

    Принципы здесь применимы не только к HoverHelm. На форуме программки страдают от ужасной подачи материала. Но здесь я не смог сдержать чувство справедливости: не должна отличная программа быть преподнесена так, чтобы отпугивать читателя.

     

    Если же этот пост покажется оффтопом, прошу модераторов перетащить пост в мой блог. Я дальше сам поправлю контекст.

    • Нравится 6
    • Одобряю 1
    • Спасибо 2
    • Грусть 2
×
×
  • Создать...