myDC.ru

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

 
53 страниц V  « < 4 5 6 7 8 > »   
Ответить в данную темуНачать новую тему

> Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы)

Wariner
сообщение 26.10.2008, 23:07
Сообщение #101


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Вот а ещё тут ломаю голову вот над каким вопросом:
есть две таблицы которые сводятся в одну временную после чего сортируется и выводится в чат(скрипт топпоисков)
так вот получается что во временной таблице некоторые поля дублируются!!! Например в одной ["фильмы"] = 5 а в другой ["фильмы"] = 10. Как перетрехнуть временную таблицу чтобы при нахождении дублирующие поля удалялись а их значения складывались?
Go to the top of the page
+Quote Post
Nickolya
сообщение 27.10.2008, 0:05
Сообщение #102


Главный ра******й тут...
*********

Группа: Главные администраторы
Сообщений: 1 727
Регистрация: 18.5.2008
Из: RF, 2la
Пользователь №: 1
Спасибо сказали: 776 раз




У тебя вот такая конструкция:
Код
    if num == "1" then
        for j,q in pairs(v) do     
            table.insert(tTemp,{j,q})
        end
    else
Думаю можно сделать так:
Код
    if num == "1" then
        local tTemp2 = {}
        for j,q in pairs(v) do
            tTemp2[j] = q + (tTemp2[j] or 0)
        end
        for k, l in pairs(tTemp2) do
            table.insert(tTemp,{k,l})
        end
    else

Думаю суть ясна, если код "1", тогда мы создаем доп. временнную талицу, в которой суммируются данные при проходе по всей таблице tSeachTop, затем они добавляются в исходную таблицу tTemp
Go to the top of the page
+Quote Post
Wariner
сообщение 30.10.2008, 19:53
Сообщение #103


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Проверил... этот код не работает...
Go to the top of the page
+Quote Post
Setuper
сообщение 30.10.2008, 22:27
Сообщение #104


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

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




тогда уж наверное так:
Код
local tTemp,tTemp2={},{}
for i,v in pairs(tTable) do
  if num=="1" then
    for j,q in pairs(v) do
      tTemp2[j]=q+(tTemp2[j] or 0)
    end
  else
    table.insert(tTemp,{i,v})
  end
end
if num=="1" then
  for i,v in pairs(tTemp2) do
    table.insert(tTemp,{i,v})
  end
end
table.sort(tTemp,function(a,b) return (a[2] > b[2]) end)
...
Go to the top of the page
+Quote Post
Setuper
сообщение 8.11.2008, 16:07
Сообщение #105


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

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




Переименовал тему в Вопросы разработчикам скриптов. Так название лучше отражает суть темы


Спасибо сказали:
Go to the top of the page
+Quote Post
Wariner
сообщение 8.11.2008, 17:09
Сообщение #106


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Цитата(Setuper @ 8.11.2008, 16:07) *
Переименовал тему в Вопросы разработчикам скриптов. Так название лучше отражает суть темы

+1

Есть такое дело пишу функцию бана, чтоб можно было вводить время. Я отталкивался от "сегодняшней" даты, т.е. если какманда бана на 1h то из сегодняшней даты выделяются часы к ним плюсуется единица и впихивается обратно. Плюс идёт проверка на то что если оказывается больше 24 часов то идёт плюс к дням и т.д а вот с месяцами возникли проблемы... там же не стандартное число дней(30 31 или вообще 29) Как решить эту проблему?!
Go to the top of the page
+Quote Post
Setuper
сообщение 8.11.2008, 17:26
Сообщение #107


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

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




привязку следует делать не к сегодняшнему дню, а к "началу эры юникс" 1.1.1970
для этого существует функция os.time(), которая выдаёт текущее время в секундах начиная с начала эры юникса.

Например функция установки временного бана по ip выглядит так:
Код
tTempBan={}
iMinutes=5
function TempBan(sIP)
  tTempBan[sIP]=os.time()+60*iMinutes
end


Функция проверки бана при входе выглядит так:
Код
function UserConnected(tUser)
  if os.time()<tTempBan[tUser.sIP] then
    Core.SendToUser(tUser,"*** Вы временно забанены. Вам осталось ждать "..(tTempBan[tUser.sIP]-os.time()).." сек.")
    Core.Disconnect(tUser)
  end
end


Если временный бан в несколько минут или даже часов, то для того, чтобы не было такого сообщения: "*** Вы временно забанены. Вам осталось ждать 16759 сек.", нужно предусмотреть перевод секунд в нормальный вид. Если надо, то могу предоставить такую функцию.
Go to the top of the page
+Quote Post
Wariner
сообщение 8.11.2008, 19:27
Сообщение #108


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Ок, спасибо, по поводу перевода из секунд в другие величины думаю разберусь))))


что то опять ступор...
60*5 - минуты
60*60*5 -часы
24*60*60*5 - дни
а как будут месяцы?! я в упор этого не понимаю. Надо писать блок который будет определять какой месяц или как то проще можно сделать?
Go to the top of the page
+Quote Post
Setuper
сообщение 8.11.2008, 19:35
Сообщение #109


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

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




просто положи, что в месяце 30 дней и всё))))))
Go to the top of the page
+Quote Post
Wariner
сообщение 8.11.2008, 21:24
Сообщение #110


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Код
function GetNormalTime(s)
    s=tonumber(s)
    if s>=31104000 then
        Y = math.floor(s/31104000)        
        M = math.floor((s-31104000*Y)/2592000)
        d = math.floor((s-31104000*Y-2592000*M)/86400)
        h = math.floor((s-31104000*Y-2592000*M-86400*d)/3600)
        m = math.floor((s-31104000*Y-2592000*M-86400*d-3600*h)/60)
        s = math.floor(s-31104000*Y-2592000*M-86400*d-3600*h-60*m)
        return Y.." г. "..M.." мес. "..d.." д. "..h.." ч. "..m.." мин. "..s.." сек."
    elseif s>=2592000 then  
        M = math.floor(s/2592000)
        d = math.floor((s-2592000*M)/86400)
        h = math.floor((s-2592000*M-86400*d)/3600)
        m = math.floor((s-2592000*M-86400*d-3600*h)/60)
        s = math.floor(s-2592000*M-86400*d-3600*h-60*m)
        return M.." мес. "..d.." д. "..h.." ч. "..m.." мин. "..s.." сек."        
    elseif s>=86400 then  
        d = math.floor(s/86400)
        h = math.floor((s-86400*d)/3600)
        m = math.floor((s-86400*d-3600*h)/60)
        s = math.floor(s-86400*d-3600*h-60*m)
        return d.." д. "..h.." ч. "..m.." мин. "..s.." сек."        
    elseif s>=3600 then
        h = math.floor(s/3600)
        m = math.floor((s-3600*h)/60)
        s = math.floor(s-3600*h-60*m)
        return h.." ч. "..m.." мин. "..s.." сек."
    elseif s>=60 then
        m = math.floor(s/60)
        s = (s-60*m)
        return m.." мин. "..s.." сек. "
    else return s.." сек."
    end
end


вот такая функция получилась. как вам?
Go to the top of the page
+Quote Post
Setuper
сообщение 8.11.2008, 21:52
Сообщение #111


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

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




я бы немного упростил и оптимизировал)))
Код
function GetNormalTime(s)
    s=tonumber(s) or 0
    local r=""
    if s>=31104000 then r=math.floor(s/31104000).." г. " s=math.fmod(s,31104000) end
    if s>=2592000 then r=r..math.floor(s/2592000).." мес. " s=math.fmod(s,2592000) end
    if s>=86400 then r=r..math.floor(s/86400).." д. " s=math.fmod(s,86400) end
    if s>=3600 then r=r..math.floor(s/3600).." ч. " s=math.fmod(s,3600) end
    if s>=60 then r=r..math.floor(s/60).." мин. " s=math.fmod(s,60) end
    return r..s.." сек."
end


или ещё более оптимизированный вариант (используя стандартные средства lua):
Код
function GetNormalTime(s)
    s=tonumber(s) or 0
    local r,t="",os.date("!*t",s)
    t.year,t.month,t.day=t.year-1970,t.month-1,t.day-1
    if t.year~=0 then r=t.year.." г. " end
    if t.month~=0 then r=r..t.month.." мес. " end
    if t.day~=0 then r=r..t.day.." д. " end
    if t.hour~=0 then r=r..t.hour.." ч. " end
    if t.min~=0 then r=r..t.min.." мин. " end
    if t.sec~=0 then r=r..t.sec.." сек. " end
    return r
end


Спасибо сказали:
Go to the top of the page
+Quote Post
Wariner
сообщение 9.11.2008, 19:53
Сообщение #112


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Написал я тут скриптик статистики поисковых запросов... никогда не интересовался сколько памяти жрёт скрипт, а тут вдруг промахнулся и попал в эту статистику, так оказалось хубба при 110 пользователях жрёт 5000 кб, но это не столь важно... Больше всего поразило что мой скрипт этих поисковых запросов жрёт 2000 кб. Можно ли как то это исправить? Может добавить или что то убрать из скрипта?

PS кажется это всё из за уже довольно большой базы...
Go to the top of the page
+Quote Post
Wariner
сообщение 11.11.2008, 23:09
Сообщение #113


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Вопрос почему не работает код?
Код
        if (sType ~= "main") or (sType ~= "pm") or (sType ~= "full") then
            Core.SendToUser(tUser,"<"..sBot.."> Вы неправильно ввели тип гага! (main, pm или full)")
            return true
        end

если оставить одно условие то всё пашет если нет то глухо... всегда пишет вы не правильно ввели!
Go to the top of the page
+Quote Post
Nickolya
сообщение 12.11.2008, 0:04
Сообщение #114


Главный ра******й тут...
*********

Группа: Главные администраторы
Сообщений: 1 727
Регистрация: 18.5.2008
Из: RF, 2la
Пользователь №: 1
Спасибо сказали: 776 раз




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

А про код могу вполне уверенно объяснить что он не логичен нихрена big_smile1.gif
Допустим, i = 10, а условие такое: если i не равно 1 то код такой-то, тут всё работает прекрасно, но при твоём усложнении ты допустил ошибку в духе юнной гениальности: если i не равно 1 ИЛИ i не равно 2 ИЛИ i не равно 3, то... этот код выполнится при любом i: даже если i равно 1, то оно не равно 2 и 3, и так далее, это как бы взаимоисключение группой условий друг друга big_smile.gif Используй И (and) и будет тебе счастье, так как тебе надо одновременное выполнение всех условий! Надеюсь доступно объяснил, спрашивай, если что-то непонятно.
Go to the top of the page
+Quote Post
district
сообщение 21.11.2008, 1:04
Сообщение #115


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

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




Дабы не плодить новых топиков, решил коротенький вопрос изложить ТУТ.
(Собственно сабж ждет своего часа для освоения, пока не готов морально, набираюсь знаний и опыта big_smile.gif )
Вот какая из этих функций оптимальнее? И чем они по сути различаются?
(Задача - запретить определенные сочетания символов в никах на стадии валидации)

Есть допустим таблица:
(Таблица может быть большой и развесистой, поэтому, думаю, вариант с проверкой ников самой Птокой тут непригоден)

Код
tFbdNick = { -- символы и сочетания, запрещенные в НИКАХ
")))",
"(((",
"-=",
"=-",
"!",
"=",
}


И есть две функции. Обе вроде работают, но хотелось бы понимать разницу.

Код
function NickCheck(user)
local tmp = string.lower(user.sName)
        for i = 1,table.maxn(tFbdNick) do
            if string.find( tmp , tFbdNick[i] , 1 , true ) then ...


и

Код
function NickCheck(user)
for i,v in pairs(tFbdNick) do
  if (string.find(user.sName, v, 1, true)) then ...
Go to the top of the page
+Quote Post
Setuper
сообщение 21.11.2008, 1:30
Сообщение #116


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

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




именно для такой таблице оптимальнее использовать следующий код:
Код
function NickCheck(user)
  for i,v in ipairs(tFbdNick) do
    if (string.find(user.sName:lower(),v,1,true)) then ...

Функция lower приводит латинские буквы ника к нижнему регистру.

Обрати внимание вместо pairs написано ipairs - это связано со структурой таблицы tFbdNick, так как индексы таблицы целочисленные (если индексы не указаны, то по умолчанию они целочисленны), то оптимальнее использовать функцию для целочисленных индексов ipairs.

Любые конструкции ipairs или pairs работают в цикле быстрее, из-за того, что перебор индексов происходит в порядке их хранения в памяти, а не в порядке возрастания целых чисел, как в случае цикла for i = 1,#tFbdNick do

По поводу порядка следования индексов в цикле можешь сам провести тест и сравнить порядки в обоих случаях big_smile.gif
Код
local sMsg=""
for i,v in ipairs(tFbdNick) do
  sMsg=i..", "
end
SendToAll("Порядок индексов данных в памяти: "..sMsg)

sMsg=""
for i=1,#tFbdNick do
  sMsg=i..", "
end
SendToAll("Заданный, возрастающий порядок индексов: "..sMsg)
Go to the top of the page
+Quote Post
district
сообщение 21.11.2008, 3:23
Сообщение #117


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

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




Охохо... осмыслим на свежую голову.

Последний вопрос на сегодня.
Допустим, хочу я сделать ряд функций, подчиненных NewUserConnected'у

Код
function NewUserConnected(user)
Check(user)
RepeatCheck(user)
Fuck(user)
end

Например, проверка на то, проверка на это...
Удобно: если функция не нужна, ее можно просто закомментировать и т. обр. отключить двумя дефисами...

А вопрос такой. Сильно ли это ужасно с точки зрения производительности?
Go to the top of the page
+Quote Post
Setuper
сообщение 21.11.2008, 7:32
Сообщение #118


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

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




Комментарии? Они никак не влияют на производительность. Интерпретатор просто игнорирует их при чтении кода.
Go to the top of the page
+Quote Post
Nickolya
сообщение 21.11.2008, 9:45
Сообщение #119


Главный ра******й тут...
*********

Группа: Главные администраторы
Сообщений: 1 727
Регистрация: 18.5.2008
Из: RF, 2la
Пользователь №: 1
Спасибо сказали: 776 раз




Скорее вопрос в передаче одного локального параметра в функцию. На сколько я понимаю (везде лишь мои предположения и наблюдения, если не прав - поправьте), при получении параметра функцией, он будет локальным, .т.е. создается еще нное количество локальных переменных. Потом, луа работает быстрее с локальными данными. Отсюда появляется 2 варианта: тот что выше и вариант с глобальной переменной конфигурации, что чуть удобнее в плане использования:
Код
tCfg = {}
tCfg.bCheck = true
tCfg.bRepCheck = true
tCfg.bFuck = true

function NewUserConnected(user)
    if tCfg.bCheck then
        Check(user)
    end
    if tCfg.bRepCheck then
        RepeatCheck(user)
    end
    if tCfg.bFuck then
        Fuck(user)
    end
end

Этот вариант, конечно, чуть медленне, чем просто закомментировать функцию, но более понятней в настройке.

Потом, у меня давно была такая идея: что если исходя из настройки скрипта, он сам будет писать функцию в файл и загружать ее без всех лишних вещей, создавая как бы самого себя?! Это довольно сложно, хотя еще не полное извращение, видал я и хуже...
Go to the top of the page
+Quote Post
district
сообщение 21.11.2008, 10:25
Сообщение #120


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

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




Пардон, вопрос был неверно сформулирован big_smile.gif

Вопрос заключался, конечно же, не в том, "будет ли интерпретатор пребывать в тягостных раздумьях, увидев закомментированное имя функции", и даже не в том, какой вариант удобнее для подключения/отключения функции. big_smile.gif
А вопрос заключался в следующем. Допустим, есть NewUserConnected в том виде, в котором привел ее я выше (с тремя подфункциями) и есть функция-монстр NewUserConnected, в которой все эти три уже встроены и априори последовательно исполняется. Вынося за скобки вопрос об удобстве подключения/отключения, насколько будет первый вариант тормознее второго, если вообще будет? (Имея в виду, что
Цитата
луа работает быстрее с локальными данными
?)

И еще один вопрос.
Возможно ли создать ряд типичных наборов условий (по русски напишу, и от балды, только для примера) например:
"если юзер не оператор
если юзер был хабтопером
если юзер был хабтопером но никогда не был VIPом" , что бы каждый такой набор условий был "вещью в себе"? Если не ошибаюсь, такая конструкция называется "макрос"?

тогда мы бы имели оговоренные в самом начале скрипта
макрос 1 = тыдыдыдыды -- комментарии
макрос2 = тыдыдыды --комментарии

и возможность подключать их в нужном месте, не загромождая скрипт однотипным перечислением одних и тех же наборов условий.
Go to the top of the page
+Quote Post

53 страниц V  « < 4 5 6 7 8 > » 
Ответить в данную темуНачать новую тему
9 чел. читают эту тему (гостей: 9, скрытых пользователей: 0)
Пользователей: 0

Collapse

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

  Тема Ответов Автор Просмотров Последнее сообщение
No new ВАЖНО: Topic has attachmentsМодули для скриптов RusHub
26 Setuper 45 394 21.3.2017, 17:31 Посл. сообщение: Alexey
No new ВАЖНО: Topic has attachmentsВаши Вопросы И Предложения По Поводу Форума
447 Svyat 322 163 20.10.2015, 19:39 Посл. сообщение: Ksan
No New Posts От: Вопросы Разработчикам Скриптов
От темы с ID: 173
0 MIKHAIL 4 337 23.1.2015, 0:56 Посл. сообщение: MIKHAIL
No new Topic has attachmentsВопросы по протоколу NMDC
Делаю программу
26 Master255 29 751 12.1.2015, 0:38 Посл. сообщение: Master255
No New Posts Вопросы к Phazeus по Экзекутору
Мастер может забанить мастера, как решить в Экзекуторе?
1 AndreiDC 5 373 31.10.2014, 19:20 Посл. сообщение: Ksan
No New Posts От: Установка скриптов
От темы с ID: 5657
0 MIKHAIL 4 800 29.7.2014, 23:37 Посл. сообщение: MIKHAIL
No New Posts Установка скриптов
Нужна помощь по установке
2 _wRz_ 7 309 29.7.2014, 16:11 Посл. сообщение: Артём
No new От: Вопросы Разработчикам Скриптов
От темы с ID: 173
29 Wariner 25 996 28.1.2014, 13:11 Посл. сообщение: Alexey
No new Topic has attachmentsВопросы по RusHub
Технические вопросы
316 Jaska 269 300 19.12.2013, 13:59 Посл. сообщение: mod
No new Topic has attachmentsМелкие вопросы
44 Wariner 50 989 19.9.2013, 12:34 Посл. сообщение: Alexey
No New Posts От: Ваши Вопросы И Предложения По Поводу Форума
От темы с ID: 753
3 anila 9 130 28.3.2013, 16:02 Посл. сообщение: настя
No New Posts Единая платформа для скриптов
Обсуждения вопроса создания единой платформы скриптов
5 Enyby 9 056 18.1.2012, 20:15 Посл. сообщение: Setuper
No new Topic has attachmentsПеределка скриптов
Прошу помощи
47 Fe(one)X 41 396 26.12.2011, 15:04 Посл. сообщение: Ksan
No new Topic has attachmentsВопросы Разработчикам Скриптов с SQL
вопросы по скриптам (мелкие вопросы)
101 Wariner 62 320 6.12.2011, 0:34 Посл. сообщение: Enyby
No New Posts От: Вопросы по RusHub
От темы с ID: 2902
4 Otshelnik-Fm 8 471 19.10.2011, 9:23 Посл. сообщение: Mangust

 



RSS Сейчас: 27.11.2024, 3:15