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


Фотография

Библеотека SC

OpenComputers Server Modem

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 16

#1 Оффлайн   lokin135

lokin135
  • Пользователи
  • Сообщений: 52
  • Уровень сигнала: 77,77%
  • В игре: 667 час. 39 мин.
  • ГородПсков

Награды

           

Отправлено 15 Март 2017 - 09:35

Привет тебе! Сейчас, я расскажу о своей библиотеки 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: 15 Март 2017 - 18:08


#2 Оффлайн   lokin135

lokin135
  • Автор темы
  • Пользователи
  • Сообщений: 52
  • Уровень сигнала: 77,77%
  • В игре: 667 час. 39 мин.
  • ГородПсков

Награды

           

Отправлено 15 Март 2017 - 09:38

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



#3 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 2 015
  • Уровень сигнала: 149,05%
  • В игре: 1279 час. 35 мин.

Награды

                                               

Отправлено 15 Март 2017 - 09:42

Что-о?


Сообщение отредактировал Fingercomp: 15 Март 2017 - 09:42


#4 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 15 Март 2017 - 09:43

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



#5 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 15 Март 2017 - 09:53

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



#6 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 750
  • Уровень сигнала: 0,26%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 15 Март 2017 - 11:06

критикуйте
 

Окей :P

 

 

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

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

 

А ещё:

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


#7 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 15 Март 2017 - 11:33

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


  • Totoro, qwertyMAN и Kartze это нравится

#8 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 2 015
  • Уровень сигнала: 149,05%
  • В игре: 1279 час. 35 мин.

Награды

                                               

Отправлено 15 Март 2017 - 13:37

критикуйте

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

 

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

  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 строчек кода — это моветон. Несмотря на название раздела, сюда надо отсылать что-то покрупнее. Оставь свои первые опыты на своём жёстком диске и выложи сюда что-то действительно полезное.

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

 

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



#9 Онлайн   NEO

NEO
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 15 Март 2017 - 14:40

Спойлер


  • qwertyMAN и Kartze это нравится

#10 Оффлайн   Laine_prikol

Laine_prikol
  • Пользователи
  • Сообщений: 133
  • Уровень сигнала: 0,48%
  • В игре: 4 час. 6 мин.

Награды

           

Отправлено 15 Март 2017 - 14:51

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



#11 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 458
  • Уровень сигнала: 0,22%
  • В игре: 1 час. 54 мин.
  • ГородCity17

Награды

                             

Отправлено 15 Март 2017 - 17:04

Лучше бы я не открывал код

if mess ~= nil then


#12 Оффлайн   lokin135

lokin135
  • Автор темы
  • Пользователи
  • Сообщений: 52
  • Уровень сигнала: 77,77%
  • В игре: 667 час. 39 мин.
  • ГородПсков

Награды

           

Отправлено 15 Март 2017 - 18:05

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



#13 Онлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 935
  • Уровень сигнала: 5,93%
  • В игре: 50 час. 55 мин.

Награды

                          

Отправлено 15 Март 2017 - 18:19

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

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

#14 Оффлайн   lokin135

lokin135
  • Автор темы
  • Пользователи
  • Сообщений: 52
  • Уровень сигнала: 77,77%
  • В игре: 667 час. 39 мин.
  • ГородПсков

Награды

           

Отправлено 15 Март 2017 - 19:41

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

 

понял :D 


  • eu_tomat это нравится

#15 Оффлайн   HixOff

HixOff
  • Пользователи
  • Сообщений: 162
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 15 Март 2017 - 21:17

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

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


  • lokin135 это нравится

#16 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 15 Март 2017 - 22:14

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

 

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

 

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


  • Totoro, eu_tomat, Litvinov и 2 другим это нравится

#17 Оффлайн   lokin135

lokin135
  • Автор темы
  • Пользователи
  • Сообщений: 52
  • Уровень сигнала: 77,77%
  • В игре: 667 час. 39 мин.
  • ГородПсков

Награды

           

Отправлено 16 Март 2017 - 10:22

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

 

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

 

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

 

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







Темы с аналогичным тегами OpenComputers, Server, Modem

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных