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

Fingercomp

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

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

  • Посещение

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

    283

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


  1. Минификатор занимается тем, что из кода делает эквивалентный, но короче в записи. Инлайнинг переменных — круто, но код будет не эквивалентный. С помощью debug.getlocal/debug.setlocal если попытаться прочесть эту переменную, можно очень удивиться, что её нет.

     

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

    • Нравится 3

  2. Не знаю, по какому принципу следует, что Lua и OpenComputers надо писать орущим капсом, но оставим это в стороне.

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

    • Одобряю 1
    • Ха-ха 1

  3. Я тоже качал программки напрямую с HTTP-сервера на локальном компе. А для отправки на сервер при наличии NAT можно заиспользовать какой-нибудь Stem. Сетап простой.

     

    На линуксе:

    • Вотчить файлы через inotifywait. Если хочется обновлять не при сохранении, а по команде вручную — тоже не проблема.
    • (Возможно, прогнать линтеры или ещё что-нибудь.)
    • Отправлять в стем файлы через ncat.

    На опенкомпе:

    • Читать сообщения стема через либу.
    • Стопать программу.
    • Обновлять файлы.
    • Запускать программу — в процессе, чтобы легко было стопать.

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


  4. Код верен, действительно. Проблема вот в чём. Таблицу arg добавляет стэндалонный интерпретатор. А в OpenOS не озаботились этим.

    Но есть другой способ. Путь к программе хранится в переменной окружения _. Получается она вызовом os.getenv("_"). Выдаст что-то вроде /bin/lua.lua.

     

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


  5. Ещё можно вызвать req.finishConnect(). Эта функция выдаст true только тогда, когда установится соединение. Если там ошибка будет, эта же функция ошибку эту выкинет. Очень удобно. Можно в цикле со слипом её вызвать и ждать, пока не установится. А потом уже читать можно будет.

     

    Заявления, что "никогда такого не было", ложны. Такое было давно, минимум три года. Я безумно счастлив за тех, кому не приходилось сталкиваться с этой проблемой, но на самом деле нормально работающая геталка с интернета выглядит весьма сложнее, чем код от @Alex. Если делать по-простому, то вы в свою программу добавляете бесплатное состояние гонки. Что, как известно, дебажить очень весело и интересно.

     

    Ещё замечание. Чтобы не нужно было в цикле нерационально расходовать процессорное время, лучше не слип делать, а event.pull("internet_ready"). Если совсем круто хочется, то можно даже event.pull("internet_ready", req.id()).

    internet_ready — это сигнал, который посылается компьютеру, если на сокете появляются новые непрочтённые данные. Например, прочла прога сначала 5 байтов с сокета, а потом на него сервер ещё двадцать отправил — тогда-то и получит прога ивент этот и снова считать данные сможет.

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

     

    P. S. Все эти функции доступны при создании соединения через компонент интернет-платы. Не через либу internet. Это предельно важно. Поэтому я советую всегда не юзать либу, а помучаться, но сделать нормальную считывалку через апи компонента.

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

  6. Говорить о ненужности программы, так как ею нельзя копать "картошечку", не ахинея ли великая? Проснись, народ! Майнкрафт не на одной картошке повязан! Не пропустили ли вы "sandbox" у игры в описании? Так можно говорить, что и OC не нужен, и кубики не нужны, и вообще всё не нужно и бессмысленно. А такое уже лечить нужно.

     

    Стримы нужны! Но не всякие:

    • Сеть должна иметь нормальную топологию. Работать внутри <=400 блоках модема — ненормально.
    • Потоки лучше тем, что юзеру не нужно мучаться с делением большого контента на пакеты, которые влезают в maxPacketSize. Если такого нет, это ненормально.
    • На получателе последовательность пакетов должна быть такой же, как и на сервере. Если сначала придут 3 байта конца, а потом 8192 байта начала, это ненормально.
    • Получатель должен получить все пакеты, которые отсылает отправитель. Если половина потеряется, а сеть не оповестит даже об этом получателя, это ненормально.
    • Получатель не должен получать дубликаты пакетов. Если сообщение вдруг вырастает в 2 раза по размеру, это ненормально.
    • В сети нужна какая-то защита от дудоса. Если кто-то в пещере делает вайл-тру-ду-сенд, и из-за этого никто другой не может юзать сеть, это ненормально.
    • Наконец, необходимость набирать огромную кучу лишнего кода, есть тоже ненормально. Если для ответа так или иначе надо создать свой стрим, так почему ж не сделать это сразу в либе и отдать аргументом функции-листнеру? Да и одним бы стримом можно было бы справиться, как мне кажется, смысла во втором не вижу.

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

     

    P. S. Если кто-то обижен тоном этого поста, прошу прощения. Очень понравилось это выступление.

    • Нравится 3

  7. Авторитетно заявляю, что запрос абсолютно непонятен, и требую переформулировки в развёрнутом виде.

     

    Дам пару поинтеров к тому, что, возможно, связано с предложениями в первом посте.

    • Компьютеры не могут устанавливать соединения с клиентами извне, работая как сервер. Понятнее говоря, нельзя поставить слушателя на порт из-под опенкомпьютера.
    • Компьютеры могут устанавливать соединения исключительно как клиент к серверу.
    • Внутри игры средствами OpenComputers нельзя получить любое из перечисленого:
      • список компьютеров;
      • список компьютеров с интернет-картой;
      • список компьютеров с интернет-картой, находящихся в загруженных чанках;
      • список работающих в текущее время компьютеров с интернет-картой;
      • список компьютеров с интернет-картой, которые установили хотя бы одно соединение со внешним сервером;
      • список установленных всеми компьютерами соединений со внешними серверами.

     


  8. В 26.05.2019 в 00:50, Alex сказал:

    кстати, никто не в курсе, что это за роботик маленький там сидит у Сангара на плече? И у ТехноСаппорта тоже.

    Это какой-то мод? Скин? Этот вопрос мне не давал покоя 5 лет:) Когда-то задавал его, никто не знал. Не выяснилось нигде, что это? Это Сангар себе сам забубенил модик на модификацию скина? Или что это?
     

      Показать содержимое

    78SL83v.png

    Это кусочек скрина на презентации мода ОС на импровизированном майнконе.


     

    Сэнгар выдал самому себе и некоторым друзьям из #oc этого роботика. А мод, который их добавляет, как ни странно, — OpenComputers.

    Сырцы.

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

  9. Отличный модик. Я, конечно, могу понять автора OC, который ограничился минисумочками в качестве сундуков и солнечной "батарейкой" из калькулятора (баланс соблюдать), но для удобства, особенно на, как я понимаю, кастомном компьютерном сервере с нетривиальной игрой этот мод действительно очень полезен. Иначе просто компы не составят конкуренции другим модам.

    • Спасибо 1

  10. А я костылял си апи в луа для опенкомпов. Нет, плюсы даже я костылять не стал — мне и си хватило.

    Ситуация была такова. Я тогда ещё пилил свою гуи-либу-убийцу-всего-живого-своей-охрененностью, и она как-то подозрительно тормозила. А когда программы подозрительно тормозят, юзают профилятор. Который желательно писать на си, дабы минимизировать задержки. Что я и сделал, после чего последовали долгие недели попыток прицепить си-модуль к луа на OC.

     

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

     

    Не получилось.

     

    Поэтому я взял сырцы луа, которые юзаются в OC. Я их взял, всунул туда свой профилятор и сцомпилировал их вместе так, будто профилятор был встроенной либой луа. Костыли страшные, да. Получившимся подменил то, что лежало стандартно внутри мода, и пересобрал последний.

     

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

     

    А можно без костылей? Не, без костылей не получится. Не потому, что плюсы — это уже костыль. Хотя это тоже справедливо (то есть, нет, конечно, не будем холивар разводить). А потому, что авторам мода и в голову не приходило, что кто-то чем-то подобным будет заниматься, и, более того, намеренно всяко-разно отрезали куски луа так, чтобы это оказалось в принципе невозможным. Потому как всем известно, как просто в си выстрелить в ногу вне зависимости от желаний владельца этой ноги, что недопустимо на публичных серверах всяких.

     

    Поэтому остаётся учить Луа. Язык это хороший, простой, минималистичный, красивый и полезный, хотя и чутка неудобный порою, как минимум, для заядлого заплюсневевшего программиста из-за динамической типизации.

    • Нравится 5

  11. Ну, ссылки я не постов набива ради кидал. Баг найден, пофикшен. bufferChanges=false — опция полезная, и ставить её вне зависимости от багов удобно бывает, но правильнее всё же будет скачать OC 1.7.4, вышедший дня три назад, и юзать его. Там бага этого нет — быть не должно, как минимум.

    • Нравится 2

  12. string.gsub, безусловно. Забудь про какие-то жутчайшие костыли с string.find и прочим. Гсаб тут просто рулит и педали от пола не отрывает.

    1. Он может поменять одно слово на другое.
      string.gsub("abc", "a", "d") == "dbc"

       

    2. Он может поменять один паттерн на что-то другое.
      string.gsub("hello world", "%w+", [["%1"]]) == [["hello" "world"]]

       

    3. Он может поменять один паттерн на табличное значение.
      local greek = {
        l = "λ",
        o = "ο",
        g = "γ",
        i = "ι",
        k = "κ",
        e = "ή",
      }
      
      string.gsub([[logic derives from Ancient Greek $l$o$g$i$k$e]], "$(%w+)", greek) == "logic derives from Ancient Greek λογική"

       

    4. И самое крутое: он может менять один паттерн по функции, вызывая её для каждого матча.

      string.gsub([[breaking news: title case considered stupid]], "(%w)(%w*)", function(head, tail)
        return head:upper() .. tail
      end) == [[Breaking News: Title Case Considered Stupid]]

       

    Читайте подробнее вот где-то тут.

    • Нравится 3

  13. 13 часов назад, kcalBxoF сказал:

    С остальным все понятно, а этот пункт заставил задуматься. Для файловых потоков есть какие-то маски для чтения?

    Продолжить позволю себе. Луа принимает спокойно сокращённые версии масок: `"*a"`, например. Окроме этого есть ещё и фича Lua 5.3: звёздочку можно не писать. В 5.2 работать не будет, разумеется.

     

    Помимо этого, слишком часто ты юзаешь `component.proxy`. Каждый вызов создаётся совершенно новая таблица, хоть и пустая. Не особо оптимальное использование. Для прямого вызова по адресу лучше использовать `component.invoke(address, methodName, arguments...)`.

     

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

    local function recurse(g)
      return (function(f)
                return g(function(x)
                           return f(f)(x)
                         end)
              end)(function(f)
                     return g(function(x)
                                return f(f)(x)
                              end)
                   end)
    end
    
    print(recurse(function(rec)
                    return function(n)
                      if n == 0 then
                        return 1
                      else
                        return n * rec(n - 1)
                      end
                    end
                  end)(10))
    --> 3628800
    while true do
      t.write("> ", true)
      local tcom = t.read()
    
      if not tcom then
        os.exit()
      end
    
      local com, arg = tcom:match("(%w+)%s(%w+)")
    
      if arg == "all" then
        turn(0, coms[com], at)
      else
        turn(at[tonumber(arg)], coms[com])
      end
    end

     

    • Нравится 3

  14. Предлагаю своё решение.

    local f = io.open("/etc/program.cfg", "r")
    local content = f:read("*a")
    f:close()
    
    local cfg = {}
    assert(load(content, "=program.cfg", "t", cfg))()
    
    print(cfg.player)

    Соответствующий конфиг будет выглядеть тогда так:

    player = "Robot"
    robot = "Player"
    age = 39
    alive = false

    С синтаксисом Луа. Что, согласитесь, выглядит приятно. И не надо запятые ставить, как в таблице сериализованной.

    • Нравится 5

  15. Можно наныть прав блоговодам? Я захожу в блог с целью навести там порядок и ещё что-то написать, а там такую печальку застал, что теперь даже скрыть запись нельзя (спасибо, что хоть кнопку добавления записи оставили). И, соответственно, всё уже скрытое мне тоже не видно. А здесь вообще в меню 4 пункта всего осталось.

     

    К слову, весь код, который я в блогпосты свои пихал, съехал в одну строку.


  16. Пробежался по коду и не нашёл где-либо маппинга адреса дисковода в адрес дискеты, из-за чего поставленная задача кажется невозможной. Отправил тикет на баг-трекер OC пока что. Возможно, там что-либо подскажут.

    • Нравится 2

  17. 9 минут назад, LexaDriver сказал:

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

    Я поражён, если честно, выдержке, которая потребовалась для написания такого. Я бы уже на втором энде запилил строку вроде [il]"#${}<>*?$!':@+`|="[/il], а потом делал бы [il]characters:find(gpu.get(4 + i, 3))[/il].

     

    По скриншотам выглядит неплохо. Вообще, круто, что проект до релиза доведён. Некоторые (глазами упираюсь в @LeshaInc) и такого не достигают.

     

    P. S. К слову — я, наверное, этим разочарую — но даже с таким крупным текстом, как в первых постах, без очков я не разгляжу толком что-либо, к сожалению. Укатились старания в вену.

    • Нравится 4
×
×
  • Создать...