myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему

> Бот-конвертер/калькулятор ( Ip,cidr,os.time,шара ), API1

district
сообщение 4.4.2009, 13:45
Сообщение #1


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Название скрипта: Georgian Calculator
Версия скрипта: v2 rev.27.05.09
Версия API: API 1, API2
Автор: district

Описание скрипта :
Хочу поделиться вот таким ботом-конвертером (калькулятором). Лично мне наличие такого бота помогло начать лучше ориентироваться в том, что такое "os.time", "IP-адрес", "CIDR-адрес" и вообще, вспомнить что такое "двоичный" (бинарный) код. Особо помогает разбираться в запутанных whois-данных диапазонов и роутов различных провайдеров.
Очень надеюсь, что бот пригодится и технически ориентированным админам, и любознательным юзерам.

Все функции бота видно из картинки.
Изменения :
Прикреплены файлы новой ревизии от 27 мая 2009

Изменение от 02.11.09 Поддержка скрипта прекращена


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 4.4.2009, 15:30
Сообщение #2


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Приятно, что хоть кто-то смотрит в тему "Функции Для Разработчиков" big_smile.gif
Go to the top of the page
+Quote Post
district
сообщение 4.4.2009, 21:55
Сообщение #3


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Найдена ошибка в функции NoSpareZeros (захотелось вот сделать такую, для убирания из IP нечаянно введенных нулей, просто для красоты, на вычисление они не влияют). Вроде исправил, передобавляю.
Попутно попробовали с товарищем сконвертировать под API2 - тоже вроде работает, но замечен эффект, при вводе os.time на его хабе выдается дата плюс один час, что-то связанное с летним временем. Не моем хабе прямое и обратное преобразование даты полностью бьются.

Изменения от 05.04.2009

Доработано. Покончено с мракобесием пошагового (погодового, помесячного и т.д.) подсчета секунд, прошедших от опорной даты, при вычислении os.time, использован стандартный метод os.time ([table]). Добавлено вычисление даты и вычисление os.time применительно ко Гринвичскому времени ( GMT ). Доведены наконец, вроде бы, до ума две функции "защиты от дурака" и коррекции неверного формата введенного IP-адреса.
Однако, нет гарантии, что скрипт вообще невозможно повесить каким-нибудь некорректным вводом... Тестирование продолжается.
Go to the top of the page
+Quote Post
степашка
сообщение 5.4.2009, 17:48
Сообщение #4


Продвинутый участник
****

Группа: Пользователи
Сообщений: 133
Регистрация: 18.9.2008
Из: Москва
Пользователь №: 555
Спасибо сказали: 5 раз




большое спасибо. очень прикольно. у народа пользуется спросом )))
Go to the top of the page
+Quote Post
district
сообщение 5.4.2009, 18:02
Сообщение #5


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Вот и здорово, не ожидал даже) Однако, бьюсь над закрытием существенных дырок в счислении дат... Еще оптимизирована защита от корявого ввода IP-адреса. Как только доделаю сразу выложу. Пока что нет должной защиты от некорректного ввода даты (предельно допустимого снизу и сверху).


Спасибо сказали:
Go to the top of the page
+Quote Post
D'aspid
сообщение 5.4.2009, 18:18
Сообщение #6


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 280
Регистрация: 4.6.2008
Из: Россия
Пользователь №: 10
Спасибо сказали: 42 раза




Будем ждать. Многим пользователям будет как нельзя кстати этот скрипт big_smile.gif
Go to the top of the page
+Quote Post
степашка
сообщение 5.4.2009, 19:29
Сообщение #7


Продвинутый участник
****

Группа: Пользователи
Сообщений: 133
Регистрация: 18.9.2008
Из: Москва
Пользователь №: 555
Спасибо сказали: 5 раз




в принципе можно типа этого туда добавить (прилагаю)
Прикрепленные файлы
Прикрепленный файл  Уравнения.lua ( 3.16 килобайт ) Кол-во скачиваний: 39
 


Спасибо сказали:
Go to the top of the page
+Quote Post
district
сообщение 5.4.2009, 21:37
Сообщение #8


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




За уравнения спасибо, правда, не знаю насколько это направление актуально для так сказать нашей дц- и интернет- тематики. На свежую голову посмотрю потом.

Ну вот, доведена наконец, вроде бы, до ума функция "защиты от дурака" и коррекции неверного формата введенного IP-адреса (кто успел скачать - NoSpareZeros признана вообще неактуальной и выброшена, все оказалось намного проще, извиняюсь).
Ну и насколько оказалось возможным, сделана подстраховка от ввода некорректной даты или некорректного значения os.time при получении даты. Формат выводимой даты сделан в точности таким, какой требуется для ввода даты, - для облегчения обратного вычисления (встречной проверки).

Ниже несколько слов для админов, начинающих разработчиков, всех тех, кто как и я захочет получше понять
что такое даты в Птоке, что такое os.date и os.time.

Цитата
os.time ([table])

Возвращает текущее время при вызове без аргументов, или время и дату, указанные в передаваемой таблице. Эта таблица должна иметь поля year, month, и day, и может иметь поля hour, min, sec, и isdst (описание этих полей см. в описании функции os.date).
Возвращаемое значание – это число, значение которого зависит от системы. В POSIX, Windows, и некоторых других системах, это число соответствует количеству секунд, отсчитываемому от некоторого заданного момента времени ("эпоха"). В других системах, значение не специфицировано, и число, возвращаемое функцией time, может быть использовано только как аргумент функций date и difftime.


Примечание. "Некоторый заданный момент" в нашем случае - это дата 01.01.1970 00:00:00 Гринвича, или 01.01.1970 (00 + смещение от Гринвича ):00:00 , если считаем применительно к локальной дате/времени.
Максимально возможное для перевода в форматированную дату значение os.time составило 2147505247 (для GMT !!!). Для локального времени в том случае, если ваш комп находится к востоку от гринвича, это значение будет соответственно меньше на разницу вашего локального времени и временем Гринвича в секундах. А вот попробовать "оказаться к западу от Гринвича" и посмотреть что получится, руки пока не дошли.

На всякий случай, если не сработают все предыдущие защиты, функция вычисления os.time вернет строку "Ошибка", если ей не удастся получить os.time(tDate).


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 5.4.2009, 21:51
Сообщение #9


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




http://mydc.ru/topic574.html
Go to the top of the page
+Quote Post
Ksan
сообщение 11.4.2009, 7:40
Сообщение #10


Белый Волк
*********

Группа: Пользователи
Сообщений: 1 723
Регистрация: 11.9.2008
Из: г.Томск
Пользователь №: 516
Спасибо сказали: 657 раз




Название - Грузинский калькулятор (так написано в самом скрипте) - откуда такое название? big_smile.gif
Просто интересно.
По теме думал, что имя автора такое - Георгий, но в скрипте русским по белому - Грузинский калькулятор.
Go to the top of the page
+Quote Post
district
сообщение 11.4.2009, 7:45
Сообщение #11


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Работаю над оптимизацией и расширением функций, почти готов очередной вариант. Возник вопрос : нет ли у кого под рукой стандартной функции раскодирования в строку представления больших чисел вида "2.8428972647776e+16 Байт" (результат для 25.25 Pb ). Чтобы не тратить время на изобретение велосипеда. Если уж сделан счет байты в петабайты, логично было бы и обратное преобразование иметь, пусть даже в длиннющем виде.

Trans
Попробуй заставить его посчитать, скажем, os.time для 01.01.1968_00:00:00 или допустим для 29.02.2001_00:00:00 - тогда сам увидишь почему big_smile.gif
Go to the top of the page
+Quote Post
степашка
сообщение 11.4.2009, 15:19
Сообщение #12


Продвинутый участник
****

Группа: Пользователи
Сообщений: 133
Регистрация: 18.9.2008
Из: Москва
Пользователь №: 555
Спасибо сказали: 5 раз




Цитата(Trans @ 11.4.2009, 8:40) *
Название - Грузинский калькулятор (так написано в самом скрипте) - откуда такое название? big_smile.gif
Просто интересно.
По теме думал, что имя автора такое - Георгий, но в скрипте русским по белому - Грузинский калькулятор.


=======================

почитай комментарии внутри самого скрипта и поймёшь
Go to the top of the page
+Quote Post
district
сообщение 11.4.2009, 18:54
Сообщение #13


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Подготовлена новая редакция бота.

Изменения и дополнения :

1.Добавлена функция расчета IP-адреса вида a.b.c.d+n и обратное преобразование.
2.Добавлен альтернативный метод счета шары : теперь можно переводить байты в Мб, Гб .. и т.д. с округлением вниз (до 3 знаков после запятой) или использовать "умный" метод ( предложен alex82 ). Разницу, как говорится, нужно просто "почувствовать" big_smile.gif
3.При переводе больших значений шары в байты (больше 90.9494... сколько-то там ТБ) в Байты калькулятор теперь просто отказывается считать, преобразование числового формата вида, например, "1.0000058254623e+14" в длинный ряд все-таки байтов пока не реализовано, да и актуальность этого дела под вопросом.
4.Менюшку топерь можно посылать или только зареганным, или всем юзерам, в развернутом виде (как на картинке), или с подпунктами.
5.Везде для преобразований связанных с IP-адресами сделан промежуточный показ IP-адресов в бинарном виде.
6.Сделан показ введенных значений для всех исходных преобразуемых величин в результатах счета.
7.Проведена общая оптимизация кода, насколько глаз хватило, большей частью путем замены вызова глобальных ЛУА-функций на вызов локальных методов.

Под вопросом остается алгоритм проверки валидности введенного CIDR-адреса при его преобразовании в привычный IP-диапазон, и алгоритм вычисления наиболее близкого введенному валидного значения, то же самое при обратном преобразовании. Чувствую что можно улучшить, но руки пока не дошли.

Файлы передобавлены.
Go to the top of the page
+Quote Post
степашка
сообщение 11.4.2009, 19:54
Сообщение #14


Продвинутый участник
****

Группа: Пользователи
Сообщений: 133
Регистрация: 18.9.2008
Из: Москва
Пользователь №: 555
Спасибо сказали: 5 раз




класс! спасибо
Go to the top of the page
+Quote Post
Setuper
сообщение 12.4.2009, 22:35
Сообщение #15


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Локальные методы - это конечно же оптимизация, но локальными могут быть так же и переменные. Я бы сказал, что в данном коде значительной оптимизацией будет перевод всех глобальных переменных в локальные.
Например:
Код
local Bot = "Грузинский.Калькулятор"
local bRegOnly = false -- доступ к функциям бота только для зареганных : по умолчанию отключено
local bUseFullMenu = false -- true если использовать развернутое меню, false - если с подпунктами
local iShareFormatIdx = 3 -- до скольки знаков после запятой округлять шару при "умном" округлении

local sMenuWay = "Грузинский калькулятор"

local sMove = false -- смещение от GMT в часах
local iDiff = false -- разница между локальным и Гринвичским временем в секундах

function OnStartup()
  local RTime = os.time(os.date("*t"))
  local GMTTime = os.time(os.date("!*t"))
  iDiff = RTime - GMTTime
  if iDiff >= 0 then
    sMove = "+"..tostring(iDiff/3600)
  else
    sMove = tostring(iDiff/3600)
  end
end
переменные RTime и GMTTime можно вовсе убрать. Зачем выделять лишнюю память под не используемые больше нигде переменные, когда можно написать так:
Код
iDiff = os.time(os.date"*t") - os.time(os.date"!*t")


По поводу оптимизации можно дискуссировать долго big_smile.gif

Вот, допустим, посмотрим на код функции UserConnected.
Кошмар сколько конкатенаций big_smile.gif . Ведь это всё выполняется при каждом входе пользователя на хаб.
Всё это дело можно же значительно оптимизировать, если написать это всё вне функции UserConnected, тогда это всё дело выполниться только один раз - при старте скрипта. То есть написать так:
Код
if not bUseFullMenu then
  bUseFullMenu = "$UserCommand ............"
else
  bUseFullMenu = "$UserCommand ............"
end

function UserConnected(user)
  if not bRegOnly or ( bRegOnly and RegMan.GetReg(user.sNick) ) then
    Core.SendToUser(user, bUseFullMenu)
  end
end
При этом можно одну переменную использовать 2 раза (а не заводить новую переменную). Переменная bUseFullMenu сначала используется для определения типа меню, а потом для хранения меню. (так как переменная фактически перестаёт иметь одну "роль", то её бы следует назвать как-то по-другому, например, просто Menu, и Венгерская нотация для такого рода переменных теряет свой смысл, поэтому спереди не пишем ни b, ни s big_smile.gif )

По поводу конкатенаций тут (пункт 3): http://mydc.ru/topic1018.html
Go to the top of the page
+Quote Post
district
сообщение 13.4.2009, 5:22
Сообщение #16


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




И насчет переменных времени, и насчет выработки вида меню однократно при старте - принято к сведению, спасибо. Две переменные были оставлены чисто интуитивно (для себя чтоб получше усвоить и затвердить).
Файлы передобавлены.

ЗЫ теперь я понял, откуда брался прирост расхода памяти, как часики тикал. Это, получается, меню создавалось с каждым входом нового юзера на хаб.
Go to the top of the page
+Quote Post
Setuper
сообщение 13.4.2009, 11:09
Сообщение #17


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Вот это:
Код
local sMove = false -- смещение от GMT в часах
local iDiff = false -- разница между локальным и Гринвичским временем в секундах
тоже не просто так написано. Если этого не написать, то эти переменные будут глобальными, так как переменная при первом использовании становится глобальной, если она не была до этого объявлена как локальная. Тоже самое касается и переменной sMenu. Она тоже глобальная, и для того, чтобы сделать её локальной нужно объявить её вне функции:
Код
local sMenu = false
Пишу везде false только для того, чтобы в случае если переменная не будет использоваться по каким-либо причинам, то она занимала по минимому памяти.

Код
local Bot = "Грузинский.Калькулятор"
local bRegOnly = false -- доступ к функциям бота только для зареганных : по умолчанию отключено
local bUseFullMenu = false -- true если использовать развернутое меню, false - если с подпунктами
local iShareFormatIdx = 3 -- до скольки знаков после запятой округлять шару при "умном" округлении

local sMenuWay = "Грузинский калькулятор"

-- объявления локальных переменных вместо глобальных!
local sMove = false
local iDiff = false
local sMenu = false

function OnStartup()
  iDiff = os.time(os.date("*t")) - os.time(os.date("!*t")) -- разница между локальным и Гринвичским временем в секундах
  if iDiff >= 0 then
    sMove = "+"..tostring(iDiff/3600) -- смещение от GMT в часах
  else
    sMove = tostring(iDiff/3600)
  end
  CreateMenu()
end


Далее...

Вместо
Код
local _,_,cmd = data:find("%b<>%s+%p(%S+)")
лучше писать так:
Код
local cmd = data:match"%b<>%s+%p(%S+)"
Однако, в условных операторах лучше использовать метод find:
Код
if s:find"^%d+$" then


Далее...

Посмотрим на код:
Код
Core.SendToUser(user,"<"..Bot.."> *** Ошибка ! Неверный формат числа!")
В данном коде используется переменная Bot, которая содержит имя бота, а под строки "<" и "> *** Ошибка ! Неверный формат числа!" выделяется память - под каждую! Получается что выделяется 4 байта на каждую строку, то есть 8 байт (так как 2 строки). Выделенная память очиститься со временем уборщиком мусора.
Тут я объяснил чем плоха конкатенация, поэтому её надо по возможности избегать.
Поэтому в данном случае лучше написать так:
Код
Core.SendToUser(user, ("<%s> *** Ошибка ! Неверный формат числа!"):format(Bot))
Тут 4 байта выделится только под 1 строку: "<%s> *** Ошибка ! Неверный формат числа!"

Код
Core.SendToUser(user, ("<%s> *** Результат подсчета для %s Байт : %s"):format(Bot, s, GetNormalSize(s,iShareFormatIdx)))
Go to the top of the page
+Quote Post
district
сообщение 26.5.2009, 23:38
Сообщение #18


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Обнаружена пара ошибок, допущенных при улучшайзинге. В первый пост передобавлены файлы новой ревизии.
Go to the top of the page
+Quote Post
((((F@UST))))
сообщение 28.3.2010, 15:50
Сообщение #19


Участник
**

Группа: Пользователи
Сообщений: 41
Регистрация: 24.3.2010
Из: Харьков
Пользователь №: 6 447
Спасибо сказали: 0 раз





district Так а где этот твой бот???Скинь плиз скрипт под API2
Go to the top of the page
+Quote Post
Артём
сообщение 10.12.2012, 22:22
Сообщение #20


Наруто на аваторке
***********

Группа: Пользователи
Сообщений: 2 606
Регистрация: 11.10.2008
Из: Харькова
Пользователь №: 771
Спасибо сказали: 773 раза




Исправлена ошибка, перезалит 10 февраля 2014 года big_smile.gif
Прикрепленный файл  Georgian_Calculator_API2__v3.0_rev.10.06.10.lua ( 32.36 килобайт ) Кол-во скачиваний: 8


Спасибо сказали:
Go to the top of the page
+Quote Post

2 страниц V   1 2 >
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts фейк шара
фейк
9 Dimon21 10 367 19.8.2011, 11:10 Посл. сообщение: Dimon21
No New Posts Topic has attachmentsМини калькулятор
Verlihub
0 Vizunchik 5 240 13.12.2010, 0:36 Посл. сообщение: Vizunchik
No new Topic has attachmentsОбманная шара
как бороться?
55 Otshelnik-Fm 54 321 1.12.2010, 22:57 Посл. сообщение: alcorp
No New Posts Topic has attachmentstime-based-message
Eximius
0 Артём 5 747 14.8.2010, 14:25 Посл. сообщение: Артём
No New Posts Topic has attachmentsLocal Hub Time
Eximus
1 Артём 6 917 28.7.2010, 9:41 Посл. сообщение: Ksan
No New Posts Topic has attachmentsКонвертер рег из YnHub в PtokaX 0.4.1.1
Помогите найти
7 НеуНейм 11 338 22.7.2010, 14:08 Посл. сообщение: Setuper
No New Posts От: Бот-конвертер/калькулятор ( Ip,cidr,os.time,шара )
От темы с ID: 1720
0 Артём 4 205 28.3.2010, 16:14 Посл. сообщение: Артём
No New Posts Topic has attachmentsTime
API2 | Показ времени в гл. чате
9 X-Sky 13 241 28.1.2010, 10:50 Посл. сообщение: Nickolya
Closed Бот, Щоб В Нього Була Шара З Файлами
Очень надо
1 Amidyshka 6 105 16.2.2009, 12:44 Посл. сообщение: dimetrius
Closed Анти Ложная Шара
3 _LorD_ 8 634 25.1.2009, 12:50 Посл. сообщение: Setuper
No New Posts Topic has attachmentsКалькулятор
8 Fislons 12 339 30.12.2008, 16:58 Посл. сообщение: Sephiroth_Lukaw
No New Posts Time Ban
2 Fislons 6 782 4.12.2008, 1:46 Посл. сообщение: Fislons
No new Ложная Шара
нельзя войти :)
15 FallenAngel 19 560 26.11.2008, 23:51 Посл. сообщение: FallenAngel
No New Posts Topic has attachmentsОп, Если Шара Самая Большая!
12 fixx 15 786 6.11.2008, 1:17 Посл. сообщение: fixx

 



RSS Сейчас: 19.3.2024, 11:28