lokin135 24 Опубликовано: 15 марта, 2017 (изменено) Привет тебе! Сейчас, я расскажу о своей библиотеки SC. Переводя - SecurityControl. Эта небольшая библиотека (но довольно гибкая) позволяет написать свою программу для сервера, а так-же для конечного пользователя.Сразу скажу - все сообщения проходят через сериализацию. Ну а теперь, давайте я расскажу ее API: SecurityControl.OpenPort():randomport Проверяет если-ли модем, да - открывает рандомный порт и возвращает его. SecurityControl.ReturnMess(Time):messege or "no" Ждет сообщения. В качестве аргумента нужно использовать цифру. Она определяет сколько нужно ждать ответа. Если всё-же ответа нет, возвращает "no" (без кавычек), а если ответ есть - вернет его SecurityControl.SendPort(Port,Messeger) Отправляет Сообщение. Так-же проверяет если модем. Вот и все. да, 3 функции... Ну да ладно. Хорошо, теперь о том, что я умудрился написать: http://pastebin.com/1sJk9frj - пример небольшого сервера. команды которые он принимает: /print <сообщение> просто выводит сообщение на экран сервера. /2send <порт> запоминает порт которому нужно обращаться. /help выводит список команд на экране клиента. необходим порт клиента. http://pastebin.com/edit/TVme8BTt - клиент для этого сервера. но он более-менее универсален. о нем думаю рассказывать нечего, т.к. он всего-то на 12 строчек ( ) есть удобный установщик, но есть 2 проблемы: он графический, и поддерживает 2 и 3-тию видюху и ставит мою библиотеку "simple gpu" о которой врядле буду рассказывать. вот он: http://pastebin.com/J7KHE1Zd или пиши в shell это (для новичков): pastebin run J7KHE1Zd а вот сама либа: http://pastebin.com/GCHSjkcR на этом вроде все, спасибо что посмотрел мой постик! (мой первый, критикуйте) заранее извиняюсь за нехороший код . кодил "это" давно, не на Sublime, и все как лепешка, не разборчиво... а скринов не будет, там и скринить нечего :P Изменено 15 марта, 2017 пользователем lokin135 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lokin135 Автор темы 24 Опубликовано: 15 марта, 2017 Все-же, я выложил сюда потомучто все "это", как я считаю, нужно доработать. Хотя стоило в раздел библеотек выкладывать... ну даладно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 15 марта, 2017 (изменено) Что-о? Изменено 15 марта, 2017 пользователем Fingercomp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 15 марта, 2017 а где сама либа?Чет ее не видно в посте нигде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 15 марта, 2017 Зашибись! Эта библеотека немногим более установщика, который требуется для ее установки. Она просто повторяет функции модема. Обязательно буду ее использовать, поскольку она может "целые функции передовать". 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 15 марта, 2017 критикуйте Окей :P сейчас, я расскажу библеотеке так-же так-что передовать расскажу её API Проверяет если-ли модем, да - открывает рандомный порт и возвращает его. messege всё-же А ещё: 1) Писать modem.send() короче и проще, чем SecurityControl.SendPort(Port,Mess). 2) Слово "mess" с английского означает "бардак", "путаница", "беспорядок". 3) Тащить кучу зависимостей и графический установщик, ради того, чтобы потом послать сообщение через модем - нонсенс. И это я до кода не добрался. Однако, хвалю за храбрость. 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 15 марта, 2017 Есть у меня ощущение, что топикстартер немного не рад будет такой встрече его либы 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 15 марта, 2017 критикуйте Давайте и до кода доберёмся. Сначала по стилю: Ни одного отступа в коде. Даже намёка на это нет. Функции используют BumpyCase вместо camelCase. То же с таблицами. Нет пробелов после запятых. То есть func(arg1,arg2,arg3) вместо положенного func(arg1, arg2, arg3). Теперь по самому коду. local mess = nil В окружении библиотеки задаётся локальная переменная mess. В данном случае = nil не нужно. Конструкция вида local var создаст локальную переменную var, которая будет иметь значение nil. Где же она используется? Поиском (напомню, отступов нет) находим единственное место: local _, _, _, _, dis, message = require("event").pull(arg[1],"modem_message") if message ~= nil then mess = serialization.unserialize(message) return mess else return "no" end Ну это шедеврально, конечно. Вместо объявления переменной невесть где достаточно сразу создать и проинициализировать переменную здесь. То есть убрать строку 2 и заменить mess = serialization.unserialize(message) на local mess = serialization.unserialize(message). Кроме того, эта переменная нигде, кроме return, не используется. Поэтому промежуточная переменная не нужна, можно сразу возвращать значение. Уберём строку 26 и заменим строку 25 на return serialization.unserialize(message). Сразу замечаем повторяющиеся сегменты кода: local serialization = require("serialization") local serialization = require("serialization") Удалим эти строки и скопируем наверх, на строку 2. В большинстве случаев гораздо лучше все запросы библиотек выносить в начало кода. То же есть на строках 11, 21, 38; 7-10, 34-37. Всех их нужно вытащить наверх. К функции returnMess претензий, кроме описанных выше стилевых, нет. Двигаемся дальше: function SecurityControl.ReturnMess(...) arg = {...} local modem = component.modem local serialization = require("serialization") local _, _, _, _, dis, message = require("event").pull(arg[1],"modem_message") if message ~= nil then mess = serialization.unserialize(message) return mess else return "no" end end Эта функция использует vararg (в аргументах ...) — количество аргументов может быть любым. На строке 23 все переданные аргументы собираются в таблицу. Однако в коде используется только первый переданный аргумент. Следовательно, использовать синтаксис vararg не нужно. Поэтому заменяем vararg на вполне конкретный аргумент timeout: function securityControl.returnMess(timeout) local _, _, _, _, dis, message = require("event").pull(timeout, "modem_message") if message ~= nil then return serialization.unserialize(message) else return "no" end end Переменная dis нигде дальше не используется, а потому её можно смело убирать. Условие message ~= nil может быть справедливым тогда и только тогда, когда есть значение false. Но это значение использовать не нужно: serialization.unserialize принимает только строки. Поэтому упрощаем условие до if message then. Функция может вернуть "no" даже по первой ветке условия (получив сообщение [["no"]]), что было бы нежелательно. Для того чтобы отличать это значение от других, лучше возвращать false или nil. Здесь проще поступать вторым путём, просто убрав ветку else. Итоговый код функции: function securityControl.returnMess(timeout) local _, _, _, _, _, message = require("event").pull(timeout, "modem_message") if message then return serialization.unserialize(message) end end Мы упростили двенадцать нечитабельных строк исходной функции до шести. Посему переходим к следующей функции: function SecurityControl.SendPort(...) local serialization = require("serialization") if not component.isAvailable("modem") then io.stderr:write("Modem not found!\n") os.exit() end local modem = component.modem arg = {...} modem.broadcast(arg[1],serialization.serialize(arg[2])) end Здесь те же ошибки, что и рассмотренные выше, поэтому сразу исправляем код: function securityControl.sendMessage(port, message) modem.broadcast(port, serialization.serialize(message)) end Неожиданно, не так ли? Всё, что делает функция, — это сериализует сообщение и вызывает другую. Немного смысла в ней. В итоге, вся либа сводится к этой: local component = require("component") local serialization = require("serialization") local securityControl = {} if not component.isAvailable("modem") then io.stderr:write("Modem not found!\n") os.exit() end local modem = component.modem function securityControl.openPort() math.randomseed(os.time()) local port = math.random(1, 65565) if modem.open(port) then return port end end function securityControl.receiveMessage(timeout) local _, _, _, _, _, message = require("event").pull(timeout, "modem_message") if message then return serialization.unserialize(message) end end function securityControl.sendMessage(port, message) modem.broadcast(port, serialization.serialize(message)) end return securityControl Сорок четыре строки сущего ада превращаются в 33 строки чистенького кода. Но вопрос не в коде, который мы здесь покритиковали и даже переписали — он теперь гораздо лучше; вопрос в другом: зачем нам библиотека, которая просто вызывает функции модема, ничего действительно полезного не делая? Есть небольшие программки типа копалки туннеля 3×3, часиков, кодового замка простого и прочее. Их раз сто уже написали все, кому не лень, но смысл не в этом: они дают полезный опыт программирования. Но даже для новичка постить 40 строчек кода — это моветон. Несмотря на название раздела, сюда надо отсылать что-то покрупнее. Оставь свои первые опыты на своём жёстком диске и выложи сюда что-то действительно полезное. Или хотя бы не раздувай слона из мухи. У меня ещё большие претензии к оформлению первого топика: перечитывай хотя бы, что ты написал. Сейчас невозможно что-либо понять из текста. 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 15 марта, 2017 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Laine_prikol 48 Опубликовано: 15 марта, 2017 Лучше сделал-бы библиотеку чтобы она умела, зашифровать сообщение - чтобы не перехватили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 722 Опубликовано: 15 марта, 2017 Лучше бы я не открывал код if mess ~= nil then Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lokin135 Автор темы 24 Опубликовано: 15 марта, 2017 Спасибо вам друзья! все, понял. Многое исправил. Но что сделать мне с этим постом-то? или Администраторы сами эту бяку удалят? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 15 марта, 2017 Но что сделать мне с этим постом-то? или Администраторы сами эту бяку удалят?После всех этих подробных комментариев получилась годная тема о том, какое творчество не будет принято на форуме. Я бы сохранил для потомков. 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lokin135 Автор темы 24 Опубликовано: 15 марта, 2017 После всех этих подробных комментариев получилась годная тема о том, какое творчество не будет принято на форуме. Я бы сохранил для потомков. понял 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
HixOff 102 Опубликовано: 15 марта, 2017 Я бы сохранил для потомков. нужно закрепить в разделе 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 15 марта, 2017 Вообще как бы данный раздел должен спокойно принимать и переваривать любые программки и попытки написать что-то. Игроки же не все программисты. БОльшая часть же просто играется в майн и в мод ОС. А какой-то свой "хелоуВорлд" должен попробовать написать каждый и попробовать что-то сделать самому. Ну и критику принять по делу. Иначе где, как не на форуме новичок узнает, что он делает что-то не так. Он так и будет до конца жизни думать, что написал супер либу для какого-то серверного и клиентского ПО=) Так что тут никаких непоняток и насмешек или обид не должно и даже быть, или страха у новичков выложить свое творение на форум. @@lokin135, так что не переживай, главное - прими во внимание то, что написали скилловые программисты нашего форума тебе и в дальнейшем учитывай свои ошибки. И все будет нормально 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lokin135 Автор темы 24 Опубликовано: 16 марта, 2017 Вообще как бы данный раздел должен спокойно принимать и переваривать любые программки и попытки написать что-то. Игроки же не все программисты. БОльшая часть же просто играется в майн и в мод ОС. А какой-то свой "хелоуВорлд" должен попробовать написать каждый и попробовать что-то сделать самому. Ну и критику принять по делу. Иначе где, как не на форуме новичок узнает, что он делает что-то не так. Он так и будет до конца жизни думать, что написал супер либу для какого-то серверного и клиентского ПО=) Так что тут никаких непоняток и насмешек или обид не должно и даже быть, или страха у новичков выложить свое творение на форум. @@lokin135, так что не переживай, главное - прими во внимание то, что написали скилловые программисты нашего форума тебе и в дальнейшем учитывай свои ошибки. И все будет нормально хорошо, спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах