Перейти к публикации
Форум - ComputerCraft
lokin135

Библеотека SC

Рекомендованные сообщения

Привет тебе! Сейчас, я расскажу о своей библиотеки SC. Переводя - SecurityControl.

Эта небольшая библиотека (но довольно гибкая) позволяет написать свою программу для сервера, а так-же для конечного пользователя.Сразу скажу - все сообщения проходят через сериализацию. Ну а теперь, давайте я расскажу ее API:

SecurityControl.OpenPort():randomport

Проверяет если-ли модем, да - открывает рандомный порт и возвращает его. 

SecurityControl.ReturnMess(Time):messege or "no"

Ждет сообщения. В качестве аргумента нужно ​использовать цифру. Она определяет сколько нужно ждать ответа. Если всё-же ответа нет, возвращает "no" (без кавычек), а если ответ есть - вернет его

SecurityControl.SendPort(Port,Messeger)

Отправляет Сообщение. Так-же проверяет если модем.

 

Вот и все. да, 3 функции... :mellow: Ну да ладно.

 

                                                                                                                                                                     

 

Хорошо, теперь о том, что я умудрился написать:

 

http://pastebin.com/1sJk9frj - пример небольшого сервера.

 

команды которые он принимает:

/print <сообщение>

просто выводит сообщение на экран сервера.

/2send <порт>

запоминает порт которому нужно обращаться.

/help

выводит список команд на экране клиента. необходим порт клиента.

 

                                                                                                                                                                     

 

 

http://pastebin.com/edit/TVme8BTt - клиент для этого сервера. но он более-менее универсален.

 

о нем думаю рассказывать нечего, т.к. он всего-то на 12 строчек ( :blink:)

 

есть удобный установщик, но есть 2 проблемы: он графический, и поддерживает 2 и 3-тию видюху и ставит мою библиотеку "simple gpu" о которой врядле буду рассказывать.

 

вот он: http://pastebin.com/J7KHE1Zd  

 

или пиши в shell это (для новичков):

pastebin run J7KHE1Zd

а вот сама либа:  http://pastebin.com/GCHSjkcR

 

на этом вроде все, спасибо что посмотрел мой постик! (мой первый, критикуйте) 

заранее извиняюсь за нехороший код :). кодил "это" давно, не на Sublime, и все как лепешка, не разборчиво... :( а скринов не будет, там и скринить нечего :P

Изменено пользователем lokin135

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все-же, я выложил сюда потомучто все "это", как я считаю, нужно доработать. Хотя стоило в раздел библеотек выкладывать... ну даладно) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а где сама либа?Чет ее не видно в посте нигде. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Зашибись! Эта библеотека немногим более установщика, который требуется для ее установки. Она просто повторяет функции модема. Обязательно буду ее использовать, поскольку она может "целые функции передовать". 

  • Like 6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

критикуйте
 

Окей :P

 

 

сейчас, я расскажу

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

 

А ещё:

1) Писать modem.send() короче и проще, чем SecurityControl.SendPort(Port,Mess).
2) Слово "mess" с английского означает "бардак", "путаница", "беспорядок".
3) Тащить кучу зависимостей и графический установщик, ради того, чтобы потом послать сообщение через модем - нонсенс.
 
И это я до кода не добрался.
 
Однако, хвалю за храбрость.  :D
  • Like 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть у меня ощущение, что топикстартер немного не рад будет такой встрече его либы :)

  • Like 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

критикуйте

Давайте и до кода доберёмся.

 

Сначала по стилю:

  1. Ни одного отступа в коде. Даже намёка на это нет.
  2. Функции используют BumpyCase вместо camelCase. То же с таблицами.
  3. Нет пробелов после запятых. То есть 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 строчек кода — это моветон. Несмотря на название раздела, сюда надо отсылать что-то покрупнее. Оставь свои первые опыты на своём жёстком диске и выложи сюда что-то действительно полезное.

Или хотя бы не раздувай слона из мухи.

 

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

  • Like 6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Лучше сделал-бы библиотеку чтобы она умела, зашифровать сообщение - чтобы не перехватили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо вам друзья! все, понял. Многое исправил. Но что сделать мне с этим постом-то? или Администраторы сами эту бяку удалят?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Но что сделать мне с этим постом-то? или Администраторы сами эту бяку удалят?

После всех этих подробных комментариев получилась годная тема о том, какое творчество не будет принято на форуме. Я бы сохранил для потомков.
  • Like 4

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

понял :D 

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Я бы сохранил для потомков.

нужно закрепить в разделе :D

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вообще как бы данный раздел должен спокойно принимать и переваривать любые программки и попытки написать что-то. Игроки же не все программисты. БОльшая часть же просто играется в майн и в мод ОС. А какой-то свой "хелоуВорлд" должен попробовать написать каждый и попробовать что-то сделать самому. Ну и критику принять по делу. Иначе где, как не на форуме новичок узнает, что он делает что-то не так. Он так и будет до конца жизни думать, что написал супер либу для какого-то серверного и клиентского ПО=)

 

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

 

@@lokin135, так что не переживай, главное - прими во внимание то, что написали скилловые программисты нашего форума тебе и в дальнейшем учитывай свои ошибки. И все будет нормально :)

  • Like 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вообще как бы данный раздел должен спокойно принимать и переваривать любые программки и попытки написать что-то. Игроки же не все программисты. БОльшая часть же просто играется в майн и в мод ОС. А какой-то свой "хелоуВорлд" должен попробовать написать каждый и попробовать что-то сделать самому. Ну и критику принять по делу. Иначе где, как не на форуме новичок узнает, что он делает что-то не так. Он так и будет до конца жизни думать, что написал супер либу для какого-то серверного и клиентского ПО=)

 

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

 

@@lokin135, так что не переживай, главное - прими во внимание то, что написали скилловые программисты нашего форума тебе и в дальнейшем учитывай свои ошибки. И все будет нормально :)

 

хорошо, спасибо. :) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×