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

Лидеры


Популярный контент

Показан контент с высокой репутацией 18.06.2022 в Сообщения

  1. 2 балла
    Обновление: Версия 1.3a Исправления: Небольшие баг-фиксы Менеджер сам создает конфиг-файл со стандартными настройками при его отсутствии Заменен почтовый адрес в справке (протух) Теперь используется новый установщик (WebWyse)
  2. 1 балл
    Думаю авторы, чьи программы состоят более чем из одного файла, задумываются о том, как все эти файлы грузить конечному пользователю. Этой проблемой задался и я, а потому изначально воспользовался слегка модифицированным установщиком Игоря. Однако данный инсталлятор. в силу своей простоты, не очень удобен и малофункционален. Поэтому возникло желание сделать свой. Сегодня я представляю вашему вниманию универсальный, удобный и легко конфигурируемый установщик WebWyse. Основной функционал: Возможность встроить лицензионное соглашение (не приняв его пользователь не установит софт) Проверка компьютерного оборудования на соответствие системным требованиям Возможность устанавливать (или не устанавливать) дополнительные компоненты Выбор папки, куда будет установлена программа Интерфейс, адаптированный под все три тира видеосистем Заготовки можно найти в Репозитории GitHub. В качестве примера также можно использовать конфигурации установщиков для других моих продуктов вроде Mempisto, TapFAT, ВычВыжПром и MC Plus.
  3. 1 балл
    Хотел заказать эту программу у других, но пришлось писать самому. Ничего, награду тоже выдам себе. Моя программа (https://github.com/ProgramCrafter/lua-utils/blob/a22e5e50ad46f130f6a7ec5959cd7282bb8a06df/beealyzer_v1oc.lua) служит компактным интерфейсом для сундука с пчёлами. Её возможности: 1. Сканирование сундука и вывод списка проанализированных пчёл с их характеристиками на экран (при запуске происходит автоматический скан); 2. Выдача любой пчелы кликом левой кнопкой по её описанию; 3. Принудительное обновление списка (если в сундуке что-либо появилось) правой кнопкой мыши; 4. Выход кликом по заголовку. Схема собирается таким образом: к компьютеру надо подключить транспозер, сверху на него поставить сундук с пчёлами, а с восточной стороны (правится в коде) выбрасыватель. Выбрасыватель требуется запитать от генератора импульсов (я использовал таймер из RedLogic из-за его компактности) - программа не подаёт самостоятельно импульс для выкидывания пчелы. Чтобы программа работала, не забудьте поменять в начале программы ник доверенного пользователя на свой. Программа воспринимает нажатия только от доверенного пользователя - то есть, по умолчанию, только от меня. Как выглядит интерфейс:
  4. 1 балл
    Обновление: Версия 0.03a Исправления: Переписана существенная часть кода Выкинута поддержка видеосистемы 2 уровня из-за недостаточной производительности Добавлен журнал сайтов (в пределах одного сеанса) и кнопки на панели для перемещения Добавлен просмотрщик OCIF картинок (в адресной строке укажите путь до картинки на сайте/диске и браузер ее откроет) Теперь используется новый установщик (WebWyse)
  5. 1 балл
    Я вижу три направления оптимизации: Оптимизация процесса взаимодействия с системой. Я не уверен, что это возможно в рамках имеющегося техзадания, но надо попытаться это сделать, т.к. именно оптимизация процесса даёт максимальный эффект. Оптимизировать работу с полный хаосом невозможно. Поэтому надо постараться максимально упорядочить работу своей системы, добавив какие-то правила взаимодействия с ней. Например, можно разрешить доступ игроков к единственному сундуку, а с остальными сундуками взаимодействовать исключительно через транспозеры. Такое решение снизит масштаб неопределённости. В общем, нужно упорядочить хаос. Оптимизация взаимодействия с периферией Количество запросов к периферии в этой программе не велико, но сами запросы обрабатываются крайне медленно. Поэтом они вносят значительный вклад в общее время выполнения программы. Главное правило работы с периферией — ограничить количество запросов к ней. В этой программе я вижу вызов getInventoryName и следом за ним getAllStacks. На выполнение каждого из этих запросов требуется по одному такту времени. Но зададим вопрос: какова роль каждого из этих запросов, и можно ли избавиться от какого-нибудь из них. Например, является ли необходимым вызов getInventoryName в каждом цикле? Может быть, достаточно однократной проверки при старте программы? Если так, то мы уменьшим частоту обращений к периферии в два раза. Но можно пойти ещё дальше. Роль вызова getInventoryName заключается лишь в том, чтобы оценить возможность вызова getAllStacksбез возникновения ошибки. Но зачем нужна эта проверка, если ошибку можно обработать по результату выполнения getAllStacks? Оптимизация обработки данных Тут основные правила: избегать повторной обработки уже обработанных данных и отдавать предпочтение более эффективным конструкциям. В этой программе я вижу циклический перебор всех предметов во всех инвентарях и полный перебор общий таблицы для каждого из предметов. Очевидно, такой алгоритм обработки неэффективен: local this = false for g,allItm in pairs(allItems) do if ((this==false) and (allItm.name == thisItm.name) and (allItm.label == thisItm.label)) then this = true allItm.count = allItm.count+thisItm.size end end if this == false then table.insert(allItems, {name = thisItm.name, count = thisItm.size, label = thisItm.label}) end Если работы с длинными циклами не избежать, то цикл надо останавливать сразу же, как достигнута цель. Для этого в Lua существует ключевое слово break. Заодно избавляемся от лишней проверки переменной this. for g,allItm in pairs(allItems) do if allItm.name==thisItm.name and allItm.label==thisItm.label then this = true allItm.count = allItm.count+thisItm.size break end end Но и этот цикл также работает слишком медленно. Полностью избавиться от цикла помогут ассоциативные свойства таблиц Lua. Для этого потребуется изменить структуру таблиц и обращаться к их элементам не по индексам, а по строковым идентификаторам. Учитывая, что в программе поиск осуществляется по строкам thisItm.name и thisItm.label, ключом к элементам таблиц может быть объединённая строка thisItm.name..thisItm.label. В этом случае код упростится: local key = thisItm.name .. thisItm.label if allItems[key] then allItems[key].count = allItems[key].count + thisItm.size else allItems[key] = {name = thisItm.name, count = thisItm.size, label = thisItm.label} end Пожалуй, я перечислил все основные способы оптимизации этой программы, дающие максимальный эффект и не снижающие читаемость кода.
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...