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

Fingercomp

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

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

  • Посещение

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

    283

Все публикации пользователя Fingercomp

  1. Начнём с того, что хранить двочиные числа надо... как ни странно, в обычных числах Луа. Последняя умеет в битовые операции. Кроме того, есть string.char (из числа от 0 до 255 делает символ с аналогичным кодом) и string.byte (из данного символа возвращает значение первого байта строки: число от 0 до 255). Напоследок, вот так для меня выглядит пост: Я не собираюсь даже пытаться разобраться в этом цветастом месиве. Просьба использовать кнопки очистить форматирование и тег кода: .
  2. По первому пунтку: это уже будет помощь потенциальному конкуренту (хотя ), ты слишком неопытен для такого. Вон, даже про таблицы не знаешь, а ведь без них ничегошеньки не сделаешь. Наберёшься опыта — и комментарии не нужны будут. Таблица — это переменная, хранящая переменные. С твоим подходом на каждый телефонный номер ты бы издавал по тиражу книг. Таблица — как телефонный справочник: хранит сотни, тысячи номеров. Про многозадачность уже ответили. Для начала надо уяснить разницу между аналоговым и цифровым сигналами. Через кабель никакими судьбами ты не передашь аналоговые данные, только цифровые. Цифровой — это та же последовательность бит, аналоговый, например, — звуковая волна. Когда это понятно, ответь на вопрос, а каким образом, и главное, зачем ты собрался передавать аналоговые данные. И непонятны ни язык, ни сами данные, ни окружение. В общем, неотвечаемый вопрос. Первый, третий и четвёртый пункты — это вообще для тебя рано. Разберись с работой Lua хотя бы и попиши банальные программки. Обязательно продумай досконально архитектуру проекта. И задавай конкретные вопросы.
  3. Fingercomp

    BuMPGold // завершён

    С утра немного пошаманил со стилями, теперь страничка выглядит более опрятненько :P
  4. Я рискну :P 320 байт, Python 3.5 #coding=utf-8 import sys a=open(sys.argv[1],'rb').read() f=lambda x:int.from_bytes(x,'little') o,s,w,h=[f(a[x:x+4])for x in range(10,26,4)] d=a[o:] print('\n'.join(''.join('█▓▒░ ·'[int((max(d[x],d[x+1],d[x+2])+1)//51.2*d[x+3]/255)if d[x+3]>0 else 5]for x in range(y*w*4,(y+1)*w*4,4))for y in range(h-1,-1,-1))) По строчкам, потому что и пеернос строки, и ; занимают одинаковое число байт: один. Файл задавать аргументом: python3.5 ./reader.py ~/img/16x16.bmp Вот что получается:
  5. Fingercomp

    BuMPGold // завершён

    Обновил задание! Теперь непрозрачность может принимать значения от 0 до 255, и её надо будет учитывать перед рисованием.
  6. Fingercomp

    BuMPGold // завершён

    Я имел в виду директивы подключения модулей. Но учти, опять же, что только из списка модули разрешены. Если будет какой-нибудь читатель little-endian чисел (не включённый, как в Питоне, в изначальное окружение), это решением не будет.
  7. Одно дело — увидеть минифицированный код бещ комментариев или пояснений, а другое — получить само объяснение механизма, и в нужном разделе. Разные вещи, нет?
  8. Начнём сразу с кода. Пихнём в файл ./lib.lua local a = "Hi" local b = "World" return { a = a, b = b } Вполне себе нормальный, имеющий право на жизнь, код. Не то, что бы он делал что-то полезное, но как пример нашей дискусси вполне сгодится. Итак, этот небольшой файлик будет возвращает таблицу с двумя ключами. Подключим его (./test.lua): local test = require("test") print(test.a, test.b) Выведет это "Hi World" и успокоится. Вроде всё нормально. Допишем в этот файл ещё немного кода: test.a = "Goodbye" b = "Cruel World" test2 = require("lib") print(test2.a, test2.b) Выведет это, однако, Goodbye Cruel World. Упс. Если в таблице будет реализация бомбёжки ракетами по союзникам (а как же), изменять что-то не хотелось бы совсем. Вот об неизменяемости речь и пойдёт. Заметим, что в таблице либы ключам значение присваивается не напрямую, а через переменную. Локальную. Доступа к ним (проигнорим debug) ни у кого другого нет. С другой стороны, у Луа есть метатаблицы с метаметодом __index. Воспользуемся этим, прямолинейно: local a = "Hi" local b = "World" return setmetatable({}, { __index = function(self, k) if k == "a" then return a elseif k == "b" then return b end end }) Код ./test.lua можно даже не менять. Результат всё равно будет тот же. Ибо __index вызывается только для несуществующих значений основной таблицы. Когда мы присвоим какое-то значение, вызываться не будет уже метаметод. Ага, значит, давайте запретим заменять таблицу. При tbl.keyname = value вызывается метаметод __newindex. Окей: local a = "Hi" local b = "World" return setmetatable({}, { __index = function(self, k) if k == "a" then return a else return b end end, __newindex = function(self, k, v) print("No way!") end }) Теперь, если мы запустим код тот же, получим что-то вроде этого: Hi World No way! No way! Hi World Воооот, вроде бы цель достигнута. Как бы не так. Заменим файл ./test.lua этим: local test = require("test") print(test.a, test.b) rawset(test, "a", "Goodbye") rawset(test, "b", "Cruel World") test2 = require("lib") print(test2.a, test2.b) Угадайте, что получится. Конечно же, большой и длинный "ууупс". Hi World Goodbye Cruel World Более того, теперь эти значения сидят в обычной таблице и больше не вызывают __newindex. Вот печаль-то. Но тем не менее, именно такой код мы и оставим. Для решения проблемы нам потребуется переопределить rawget и rawset, добавив проверку на наши любимые таблицы и не давая ничего изменить. Получится это сделать только для систем с доступом к контролю над _G. Есть ещё вариант докопаться до сути: getmetatable и setmetatable. Их, как можно догадаться, тоже требуется переопределить. Туда же debug.getmetatable и debug.setmetatable. После этого можно будет, наконец, сказать. что мы полностью уверены, что наши таблицы константны. Как видно, Луа всеми силами пытается забрать право на забирание динамичности структур. Позволяя стандартно переопределять внутри VM стандартные функции для своих нужд, И просто так отплясаться не получится. Шмактус, однако.
  9. Fingercomp

    BuMPGold // завершён

    Здрассьте! Я тут прогуливался по StackExchange, и нашёл интересную штуку: Code Golf. В общем-то, это программистский конкурс, который цель ставит эффективно расходовать ресурсы... только жёсткго диска. Надо любыми судьбами на любом языке сделать программу с наименьшим числом даже не символов, а байт! Мне показалось это очень интересным занятием. Посмотрев на вопросы, которые по той ссылке доступны, у меня и идейка пришла тоже. Я всё расписал по идейке здесь: https://znc.hanvix.ru:1308/vori_zolota.htm — и правила, и задание, и полезные ресурсы вообще. Тут вкратце объясню. Слушали про BMP, что как BitMaP расшифровывается? Так вот это есть формат картиночек такой от Microsoft. Не то, что бы я как-то безудержно фанател от этой корпорации, просто формат картиночек простой, как бревно липовое. Никаких заморочек с компрессиями и прочей интересной очень дрянью! Немного метаданных — и набор пикселей, как он есть! Парсить там нечего совершенно, в общем. И, значит, берём такую картиночку. Задача: за минимальное число байт исходников написать работающую программу, которая будет рисовать различные символы в зависимости от цвета и прозрачности. Это не сложно, это просто. Итак, за неделю жду программочки, будем мерить байтики :P Я настоятельно рекомендую поучаствовать, хотя бы почитать в Wikipedia про формат: это достаточно интересная тема. Тем более, что язык программирования абсолютно любой, выбирайте любимый и дерзайте! Выбирать победителей будем по размеру программы и по количеству лайков. В комментариях опишите работу программы, как её использовать, какой язык, что для неё нужно, приложите саму программу. И можно будет надеяться на призы: от медальки на форуме до игрушки в Steam. Ещё раз советую заглянуть на https://znc.hanvix.ru:1308/vori_zolota.htm — там всё подробнейшим образом расписано, чтобы облегчить написание в разы. Если и там непонятно что-то — задавайте вопросы в нашей всеми любимой IRC Будем, как обычно, рады ответить и помочь. Удачи!
  10. Вот так у ребят с тёмным фоном (которым моим):
  11. Омфигеть. Серьёзно. Однако, потеря совместимости с сотнями, тысячами! Программ для OpenOS. Это явный отталкивающий фактор: я не хочу переписывать более 8-10 тысяч строк кода моих программ под новую OS. Да и никто не собирается, очевидно. Желаю удачи и мотивации. Много мотивации. Много амбициозных проектов померло на земле бренной.
  12. @Krutoy, опеннет повязан на c9 весь, обновления и прочее. Проблема в том, что устанавливаются они не в те директории (нужно ставить в /usr/lib, а не /lib, например), к тому же, для скачивания надо использовать preview.c9users.io, а не preview.c9.io. Учитывая, что мне никак не починить пакет, ибо он сломается сразу же после первого обновления, прошу немного починить структуру файлов и сами файлы.
  13. В общем, думал я о том, что программ тут много, а огромное число нерусских игроков их использовать просто физически не может: русский не поддаётся гугл транслейту нормально, а про английские версии никто не заморачивается почему-то. Ну а про то, что их толком-то скачать нормально нельзя, я уже просто промолчу. Видимо, один я тут пекусь об i18n, ну там ещё @Totoro публиковал что-то на английском. Так что решено было покончить с этой глупостью невиданной. Самые интересные и полезные программы будут потихоньку перетаскиваться мною на OpenPrograms, откуда их можно будет скачать через стандартную программу oppm, которая есть на дискете в OpenComputers! Занятие это очень интересное, хоть и довольно трудозатратное: нужно перевести на английский описание программы, перевести на английский саму программу, включая коментарии, ну и запаковать это дело всё. В общем, это занимает от 30 минут до 3 часов в среднем на один пакет. Условия публикации: У автора нет репозитория на OpenPrograms. Программа может работать на английском языке без переписывания половины всего кода (возьмёр в пример майноось от @ECS). Имеется человеческое описание программы. Желательно прикрепить скриншоты на https://imgur.com/ — используйте по возможности именно этот сервис для хранения изображений! Код на гитхабе, гисте или пастбине. Никаких яндекс-дисков или недообменников!! Программа интересна и полезна. Это субъективно, конечно же, но по популярности на форуме вполне можно судить тоже. Программу можно включить в пакет размером не более 1 мегабайта. Та же ось не поддаётся никак включению, например. Отдельным плюсом будет человеческое оформление кода (отступы, комментарии). Все зависимые библиотеки удовлетворяют условиям выше или доступны на OpenPrograms. Программа не пишет ничего в папки /bin и /lib сама, и не зависит от директории, в которую установлена. На самом деле, уже три четверти этих пунктов наверняка выполнены. На текущий момент опубликованы следующие программы: mc — Midday Commander от @Zer0Galaxy, @NEO, @Totoro. holo-editor — Hologram Editor от @Totoro, @NEO. obj — OBJ от @Totoro. libforms — Forms, GUI библиотека от @Zer0Galaxy. lava-runner — Lava Runner, игра от @electronic_steve. geomine — Спиральный геокоп от @Doob. geoglasses — Геосканер для очков от @electronic_steve. camera — Применение камеры бла-бла-бла от @Doob. libthread — Библиотека многопоточности от @Zer0Galaxy. libqr — Генератор QR-кодов от @1Ridav. libvector — Векторная библиотека от @Ktlo. Планируются к опубликованию: ocbf — OCBF от @LeshaInc. Если интересует добавление своей программы, какие-то вопросы, тыры-пыры, всё по поводу этой темы — спрашивайте в IRC. Форум я не обновляю судорожно каждые 5 секунд, а в чате я мгновенно получаю сообщения. Используйте команду .tell fingercomp <сообщение>, если что. Доверенным людям, если они готовы заниматься этим делом, могу дать write-доступ к репозиторию. Опять же, IRC. А, самое главное-то. Ссылка на сам репозиторий.
  14. Ненутычо ©, покупаешь заяву на размещение рекламы и всем показывается. И админам тоже! Хм, а как бы реализовать такое?.. Это как-то сложно, надо ещё и передачу рекламы н... Есть идея! Админу самому вводить рекламу, чтобы ему же её и показывать!!! Это гениально!!
  15. Просто, если обратишь внимание на дату, увидишь, что там уже под вайп ИТ создана была, онлайн никакующий был, ну а потом отбили желание играть на серверах здесь. Мне интересно было узнать реакцию... Ну, её-то я и увидел: никто не знает, зачем OpenNet нужен. И это верно. Это довольно интересный проект, но не для основной массы игроков. Ну а потом я познал дзен и теперь тоже задаю вопросы: а зачем это надо? Если и заморачиваться этим, то только на приватном сервере с друзьями.
  16. Eternal stuff incrementing

  17. Килограмм (кг) — это 10³ грамм. Килоампер (кА) — это 10³ ампер. Килоньютон (кН) — это 10³ ньютонов. Но почему килобайт (кБ) — это, вдруг, 2¹⁰ байт-то?! Для двоичной системы счисления есть свои приставки: киби (КиБ), меби (МиБ), гиби (ГиБ), etc. Но это если по СИ. А так, конечно, никто не определяет конкретно.
  18. Неожиданно для себя! Напилил HTTP/HTTPS 1.1 (во второй версии разбираться лень) либу. Работает она абсолютно идентично функции component.request(), вот только поддерживает HTTPS и принимает четвёртый параметр: метод запроса (GET по умолчанию, если не посылается тело запроса, и POST в противном случае). Кроме того, она превращает все хедеры в формат Train-Case, так что можно спокойно получать данные хедеров в своих программах. Однако всё это делается за счёт меньшей производительности, так что лучше использовать стандартные функции, если ничего из вышеперечисленного не требуется. Библиотека возвращает функцию отправки запроса: http(url: string[, body: string[, headers: table[, method: string]]]): table — посылает запрос на сервер. http(url: string, kwargs: table): table — делает то же самое, но принимает таблицу с аргументами, чтобы не путаться. В таблице аргументов все параметры опциональны. Вот пример полной таблички: { body = "Hello here\n", headers = { connection = "close" }, method = "PUT" } Возвращают обе функцию таблицу с теми же функциями, что у компонента (и да, тут не надо ставить двоеточие, как и в OC'шном реквесте): response.read([n: number]): string or nil — прочесть некоторое количество данных. Вообще, вся информация читается сразу же, но можно ограничить вывод аргументом. Можно отдать math.huge (или вообще не указывать аргумент), и тогда возвратится все данные полученные. response.close() — закрыть соединение. response.finishConnect(): boolean — возвращает, открыто ли соединение (в стандартном OC немного по-другому работает, там не буля, а nil с причиной, ну и ладно). response.response(): number, string, table — возвращает код статуса (204 или 404, например), текстовое описание статуса ("No Content", "Not Found") и хедеры таблицей таблиц (ибо хедеров одинаковых может быть несколько). Вот так может выглядеть выхлоп response.response(): 200 "OK" {["Content-Length"]={"12"}, ["Content-Type"]={"application/octet-stream"}, Date={"Fri, 05 Aug 2016 15:35:34 GMT"}, ["Last-Modified"]={"Fri, 05 Aug 2016 14:56:08 GMT"} Server={"SimpleHTTP/0.6 Python/2.7.12"}} Установка из OPPM: oppm install libhttp. Ну и исходный код.
  19. Увеличил скорость чтения в 1⅓, а соединения — в 2.5 раза. Подключил возможность задавать собственные расширения, ибо без этого, например, не работает HTTPS. В общем, пользоваться либой уже можно.
  20. Секурнокриптографически — вот как!

  21. Обёртка сокетов. Piece of cake, а не задача. Уже доступно. Вот затравочная картинка с ГУГОЛЕМ: D:
  22. Нет. Просто сам сокет хранится в локальной переменной функции, которая возвращает обёртку. Таблица функций создаётся в функции, и получается, что имеет доступ к сокету в переменной. Дело в том, что в OC обычные сокеты тоже работают через точку, и чтобы не ломать ничего, я сделал так же.
  23. Ну, надо прикрутить обёртку уже имеющегося сокета, добавить передачу ключа через ECDH-RSA (в карте данных вроде-то что-то было с эллиптическими кривыми и диффихеллманом, не уверен), и, может быть, если очень захочется мне вдруг, проверку валидности сертификатов. Кроме того, хочется как-нибудь ускорить библиотеку — к гитхабу подключался я 10 секунд, а считывал 27 килобайт минуту. Пока что не смотрел, что там так долго пыхтит. Какие делать программки, я пока не знаю. Может быть, сделать библиотеку HTTPS, но пока что не особо хочется с ней возиться. Тыкаю @LeshaInc, чтобы в свой фтп-клиент прикрутил сфтп.
  24. Не так давно @LeshaInc выкладывал свою программку, фтп клиент-то, и кто-то сказал про ssh. Это, конечно, задача интересная, но речь не об этом. Уже тогда на протяжении дней трёх я изучал вот этот документец. И с тех пор, добавив более 4 тысяч, удалив более двух тысяч строк кода, перечитав этот RFC вдоль и поперёк, исписав 22 страницы моего настольно-напольного блокнота, погуглив 183 запроса про тлс (надо же, гугловская статистика иногда бывает полезна для себя), чуть не потратив 2500 рублей на 12 страниц, описывающих формат десятичных чисел ( ) и даже найдя один баг в Computronics, который мне не давал покоя часов двенадцать, а то и больше, в общем случае... Я наварил TLS сокеты в OpenComputers. Что такое TLS? В нашей ирке спрашивавшим я отвечал так: это такая штука, из-за которой появляется замочек в адресной строке браузера. Фактически, это корректно, и им этого достаточно, но позволю немного поглубже объяснить. В девяностых годах компания Netscape разработала концепцию и реализацию безопасной передачи данных через недоверенное соединение. Назвалось это чудо SSL, что означает Secure Sockets Layer — слой безопасных сокетов, и выпущено было две версии: 2.0 и 3.0. Версия 1.0 была настолько дырявой, что даже не была никогда выпущена в публичный доступ. Но и, как это неудивительно, ни 2.0, ни 3.0 сейчас мало того, что не считаются безопасными, их поддержку уже исключают из всяких популярных подуктов типа Firefox или Chrome. Netscape, впрочем, недолго держала это изобретение. Ребята из Internet Engineering Task Force (IETF) в 1999 году выпустили свою, 3.1 версию SSL, которая хоть и имела некоторую совместимость с прошлой версией, но имела много нового и исправляла некоторые проблемы безопасности в прошлом протоколе. Версия SSL от IETF с тех пор называется TLS. Все версии, для справки: ?: SSL 1.0 1992: SSL 2.0 1995: SSL 3.0 1999: SSL 3.1 // TLS 1.0 2006: SSL 3.2 // TLS 1.1 2008: SSL 3.3 // TLS 1.2 И хоть сейчас SSL и TLS используются взаимозаменяемо, правильнее, всё же, говорить TLS. И всё же, что это за штука такая? TLS и его предшественник, SSL, — это протокол-прослойка между слоем данных приложений и слоем TCP. Как-то так: Слой данных приложений [Application Data]. Слой безопасности [Transport Layer Security, TLS]. Слой протокола контроля передачи данных [TCP]. Таким образом, переход на TLS не требует огромных изменений в код, достаточно заменить обычную имплементацию сокетов на защищённую и сгенерировать ключи. Данные с верхнего слоя шифруются и передаются по низшему слою к адресату, где данные снова расшифровываются, сверяются и обрабатываются. Как работает TLS. Перед тем, как передавать данные, неплохо было бы договориться с другим концом соединения, какой набор шифрования использовать, передать некоторые дополнительные данные, подтвердить подлинность сервера (для защиты от встраивания в соединение) и, конечно, обменяться ключами, которыми будет шифроваться информация. Для этого предназначена процедура рукопожатия — Handshake. Клиентом генерируется рандомная информация, шифруется асимметричным шифратором (ECDH-RSA или RSA) и передаётся серверу. Перед этим сервер предоставляет цепочку сертификатов, каждый последующий сертификат которого подтверждает предыдущий. В конце цепочки получается самоподписанный сертификат, которому надо доверять (есть целые списки таких корневых сертификатов). После того, как рандомные байты переданы, сервер и клиент из них генерируют ключи: два ключа проверки валидности информации (на сервер и клиент отдельно для защиты от атаки), два ключа симметричного шифрования данных и, если того требует шифратор, два инициализирующих вектора. В конце рукопожатия отправляют финальное сообщение, которое уже шифруется. Оно содержит хэш всех сообщений рукопожатия, чтобы предотвратить перехват трафика. Каждое шифрованное сообщение имеет специальный код авторизации (MAC), который включает хэш пересылаемых данных и номер последовательности, который имеется отдельно для приёма и отдачи, начинается с 0 и увеличивается на 1 с каждым отосланным сообщением. Таким образом, если сообщение было перехвачено и позже отослано, или трафик был перепутан, то и сервер, и клиент после проверки кода авторизации закрывают соединение. Как видно, протокол этот отнюдь не простой, а потому я ещё больше ценю свою программку. Она не полностью соответствует стандартам, в ней нет проверки сертификата, да и сиферы пока только с RSA, но уже позволяет создать соединение с GitHub, Google, да и другими HTTPS-сайтами. Оно работает для меня как-то нестойко, шатко, долго, в общем, неустойчиво. Но ведь работает! На скрине выше успешно была получена информация длиной в 27763 байта. Библиотека предоставляет таблицу с одной функцией: tlsSocket(host: string[, port: number]). Возвращает она обёрнутый сокет: таблицу с функциями: socket.write(data: string) — посылает данные на сервер. socket.read(): string or nil, string — читает данные с сокета. socket.close() — закрывает сокет (делает это правильным способом, оповещая сервер). socket.id(): string — возвращает ID сокета. socket.isClosed(): boolean — говорит, закрыт ли сокет. socket.setTimeout(to: number) — устанавливает предельное время ожидания данных с сокета, в общем, таймаут соединения. Все функции вызываются с ., не с :! Зависимости: Компоненты Карта данных второго уровня. Она предоставляет получение рандомных данных и HMAC. Улучшенный шифратор (Advanced Cipher Block) из Computronics. RSA шифрование. Интернет-карта, чтобы, очевидно, посылать запросы. Библиотеки libder-decoder — моя собственная библиотека, которая парсит сертификаты. libbigint — либа БОЛЬШИХ чисел (сначала была библиотека от @Zer0Galaxy, но работала она жутчайше медленно: более минуты против пары секунд). lua-lockbox — либа с криптофункциями. К сожалению, не все они работают на Lua 5.3, но есть рабочий AES-128 шифратор. Lua 5.3. На прошлой версии работать не будет! OpenOS 1.6. OpenComputers 1.6. Установка из OPPM: oppm install libtls. Исходный код. P. S. Прошло достаточно много времени, и теперь уже на дворе (с 2018) выкачен TLS 1.3, который как-то слишком разительно отличается от TLS 1.2, который я изучал и имплементировал. Но 1.2 должен пока (минимум ещё годов 4-5) работать.
  25. Два раза шифткликнуть? Три? Попробуй покликать. Должен смениться. Тултип явно говорит, что сменить можно, и версия не древняя годовой давности. В чат ещё должно писаться.
×
×
  • Создать...