+  HandyCache форум
|-+  Главная категория» Общие вопросы» Расширения на языке Lua в HandyCache
Имя пользователя:
Пароль:
Страниц: 1 ... 20 21 [22] 23 24 ... 29   Вниз
  Отправить эту тему    Печать  
Автор Тема: Расширения на языке Lua в HandyCache  (Прочитано 437549 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #420 : 10 октября 2012, 19:33:31 »

Цитировать
не плохо работает такой вариант
Хороший вариант. Забыли дописать, что делать при отсутствии активных пользователей.
Цитировать
хотелось бы узнать что это за "подводный камень", и есть ли он в этом варианте?
В этом варианте он тоже есть.
Многие сайты оставляют соединение активным, даже когда по нему ничего (или почти ничего) не передается. К примеру, если у 'local' включено ICQ, то 'idle' будет постоянно ограничен в скорости, хотя у 'local' 99,9% времени канал простаивает. Еще пример, на многих сайтах (http://my.opera.com/desktopteam/blog/) есть обращения по https, висящие неоправданно долго после выполнения. Некоторые сайты оставляют постоянно висящее соединение, по которому изредка передаются изменения в обстановке - это odnoklassniki.ru, vkontakte.ru и т.п.
Чтобы это все учитывать и не ограничивать 'idle' понапрасну, требуется более сложный алгоритм.
Сообщить модератору   Записан
olDjeka
Постоялец
***

Репутация: +6/-0
Offline Offline

Сообщений: 117


« Ответ #421 : 11 октября 2012, 10:58:53 »

Цитировать
что делать при отсутствии активных пользователей

Это обязательно? Не подумал об этом, и не очень представляю как реализовать.
Пробовал разные комбинации - в отладочном логе ошибок не было, расширение срабатывало.

Про "висящие" соединения - спасибо, понял.
Сейчас больше неудобства доставляют задержки реального переключения (в логе и на графике HC показывает почти сразу, а реально, на графике модема - когда как), но это как я понимаю не от HC зависит.

P.S. Маленькая задачка и столько проблем.
Наверное лучше сделать расширение для переключения по горячей клавише.
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #422 : 11 октября 2012, 12:13:44 »

Цитировать
Это обязательно? Не подумал об этом, и не очень представляю как реализовать.
Пробовал разные комбинации - в отладочном логе ошибок не было, расширение срабатывало.
Вместо
if not t['local'] then
написать
if t and not t['local'] then
Нынешний вариант при отсутствии активных пользователей (таблица t при этом не существует) будет раз в секунду выдавать в лог НС сообщение об ошибке - попытке индексирования несуществующей таблицы.
Цитировать
Сейчас больше неудобства доставляют задержки реального переключения (в логе и на графике HC показывает почти сразу, а реально, на графике модема - когда как), но это как я понимаю не от HC зависит.
Странно, откуда задержка. Она большая? С моим вариантом расширения тоже возникает задержка?
Кстати есть еще один недостаток. Если пользователь 'local' работает в оффлайне (внешний канал свободен), то Idle все равно ограничен.
Цитировать
Наверное лучше сделать расширение для переключения по горячей клавише.
Тут свои недостатки:
- если Вас нет у компьютера, что-то большое качается, и тут Idle активно вступает и забивает канал, оперативно отреагировать не получится;
- если даже Вы у компьюетра, задержка будет большая, пока поймете, что включился Idle;
- забудете вовремя отключить вручную - и Idle будет несправедливо страдать;
- не будете постоянно активно использовать канал - и Idle снова страдает.

Можно выбирать за показатель активности пользователя 'local' не наличие соединения, а ненулевое количество скачанных им за секунду байт.
Код:
function Timer1s()
local t = hc.get_users_stat('#all')
local trafic_local = t['local'].from_internet - (hc.get_global('_local_') or 0)
if trafic_local>0 then
if t['Idle'].speed_limit==0 then hc.set_user_speed('Idle', 2048) end
elseif t['Idle'].speed_limit~=0 then hc.set_user_speed('Idle', 0)
end
hc.set_global('_local_', t['local'].from_internet)
end
Мне кажется, такой вариант лучше прежнего. Все указанные недостатки ушли.
« Последнее редактирование: 11 октября 2012, 12:24:54 от Михаил » Сообщить модератору   Записан
olDjeka
Постоялец
***

Репутация: +6/-0
Offline Offline

Сообщений: 117


« Ответ #423 : 11 октября 2012, 18:29:38 »

Всё больше проясняется  Улыбка
В промежуточных вариантах я пробовал использовать
        if t['local'].connections_number > 0 then
вместо
        if t and t['local'].connections_number > 0 then
и в этом случае в лог действительно постоянно писалось:
# Авторегулировка скорости для клиента "Idle" "Timer1s" ERROR:
[string "--[[ <HCExtension>..."]:10: attempt to index local 't' (a nil value)


Сейчас, когда использую
        if not t['local'] then
даже при отключении всех пользователей в Настройки -> Доступ и остановке всех соединений, в логе не появляется ничего подобного.

Возникающая задержка небольшая (секунды), но первые запросы от "local" терпят фиаско (превышено время ожидания и страницу приходится обновлять).
Незнаю как HC ограничивает скорость, но предполагаю что посылкой соответствующей команды серверу, а как он отреагирует - другой вопрос.
Во вложении отладочный лог: каждое из соединений (7592, 7593, 7613, 7631, 7637, 7639, 7649, 7650) идёт на свой сервер, ограничение включалось вручную (установкой галочки) где-то на 20 сек.

Цитировать
Если пользователь 'local' работает в оффлайне (внешний канал свободен), то Idle все равно ограничен.
Тоже не учёл Смущен А вот у переключения по HotKey есть и преимущество: переключаем и ждём, наблюдая когда начнёт освобождаться канал.

Ваш вариант попробую позже и отпишусь. Спасибо!

* Log.txt (5.35 Кб - загружено 24 раз.)
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #424 : 11 октября 2012, 18:52:09 »

Цитировать
Сейчас, когда использую
        if not t['local'] then
даже при отключении всех пользователей в Настройки -> Доступ и остановке всех соединений, в логе не появляется ничего подобного.
Т.е. таблица t = hc.get_users_stat('#active') существует даже при отсутствии активных пользователей? Если так, то похоже на баг НС. Сообщите автору.
Сообщить модератору   Записан
olDjeka
Постоялец
***

Репутация: +6/-0
Offline Offline

Сообщений: 117


« Ответ #425 : 11 октября 2012, 21:12:31 »

Попробовал и получил ошибку:

"Timer1s" ERROR:
[string "--[[ <HCExtension>..."]:10: attempt to index local 't' (a nil value)

Заменил
   local trafic_local = t['local'].from_internet - (hc.get_global('_local_') or 0)
на
   if t and local trafic_local = t['local'].from_internet - (hc.get_global('_local_') or 0)
и получил ошибку:

"Timer1s" ERROR:
[string "--[[ <HCExtension>..."]:10: unexpected symbol near 'local'

Заменил на
   if t and trafic_local = t['local'].from_internet - (hc.get_global('_local_') or 0)
и получил ошибку:

"Timer1s" ERROR:
[string "--[[ <HCExtension>..."]:10: 'then' expected near '='
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #426 : 11 октября 2012, 22:14:46 »

А Вы в точности скопировали расширение или вносили туда изменения? Дело в том, что такая ошибка не должна возникать в принципе.
После замены расширения давили "Перечитать расширение"?
« Последнее редактирование: 11 октября 2012, 22:23:24 от Михаил » Сообщить модератору   Записан
olDjeka
Постоялец
***

Репутация: +6/-0
Offline Offline

Сообщений: 117


« Ответ #427 : 11 октября 2012, 22:48:50 »

Скопировал, вставил, сохранил, перечитал.
Ни одного соединения нет.
Очистил лог, включил "Вести лог", открыл лог, и там несколько однотипных строчек:

11.10.12 22:42:04,778 # Авторегулировка скорости для клиента "Idle" (3) "Timer1s" ERROR:
[string "--[[ <HCExtension>..."]:10: attempt to index field 'local' (a nil value)
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #428 : 11 октября 2012, 23:38:00 »

Так это совсем другая ошибка, чем та, которую Вы приводили выше. В переводе значит, что в НС нет такого пользователя 'local'. Расширение написано исходя из того, что у Вас два пользователя - 'local' и 'Idle'. Если имена другие, переименуйте соответственно.
Сообщить модератору   Записан
olDjeka
Постоялец
***

Репутация: +6/-0
Offline Offline

Сообщений: 117


« Ответ #429 : 12 октября 2012, 01:38:44 »

Прошу извинить, поспешил и перепутал.

Пользователя два - 'local' и 'Idle'. Запустил еще раз, строчки появляются каждую секунду.
Как только появляется соединение от 'local' - ошибки прекращаются, но после разрыва всех соединений 'local' они вновь лезут.
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #430 : 12 октября 2012, 02:22:19 »

а строка точно выглядит так:
local t = hc.get_users_stat('#all')
а не так:
local t = hc.get_users_stat('#active')

Если ошибка не здесь, тогда остается, что написание имени пользователя 'local' в расширении и в разделе "Доступ" НС разное. Надо привести в соответствие.

Других причин появления этой ошибки не вижу.
« Последнее редактирование: 12 октября 2012, 02:47:06 от Михаил » Сообщить модератору   Записан
olDjeka
Постоялец
***

Репутация: +6/-0
Offline Offline

Сообщений: 117


« Ответ #431 : 12 октября 2012, 13:45:25 »

Проверил - ничего не нашёл.
Ограничение по скорости в самом HC отключено, расширение перечитано и стоит первым (два прежних варианта отключены).
Во вложении используемое расширение и список пользователей - может что-то не вижу?

* AutoLimited-3.lua (0.49 Кб - загружено 81 раз.)
* users.lst (0.09 Кб - загружено 46 раз.)
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #432 : 12 октября 2012, 14:07:52 »

Разобрался. Это баг НС 1.0.0.377, который был исправлен автором в январе 2012. Я использую бета-версию 1.0.0.392, где это давно исправлено, поэтому расширение у меня работает как надо. У Вас оно правильно работать не будет.
Сообщить модератору   Записан
LordMerlin
Старожил
****

Репутация: +12/-8
Offline Offline

Сообщений: 488


« Ответ #433 : 12 октября 2012, 17:55:36 »

Блин. Ну почему автор не выкладывает беты по принципу "Как есть". На совесть пользователей. Глядишь, намного больше бетатестеров стало бы.
Сообщить модератору   Записан
Влад22
Пользователь
**

Репутация: +2/-9
Offline Offline

Сообщений: 97


« Ответ #434 : 12 октября 2012, 19:51:44 »

Блин. Ну почему автор не выкладывает беты по принципу "Как есть". На совесть пользователей. Глядишь, намного больше бетатестеров стало бы.
Поддерживаю. Какой смысл обсуждать баги версии 377, когда часть их исправлена более полугода назад?
Сообщить модератору   Записан
mirny
Пользователь
**

Репутация: +11/-1
Offline Offline

Сообщений: 84


« Ответ #435 : 14 октября 2012, 23:56:36 »

Погрузился в Луа, пишу расширение; отладил, все работает. Выключаю комп, наутро включаю снова — расширение не пашет.
Скрипт расширения перестал видеть подключенный через require модуль, который лежит рядом в этой же папке.
Переложил модуль в другое место из прописанных в LUA_PATH — расширение стало видеть модуль.
Вернул модуль обратно — опять не видит.
Удалил расширение из списка расширений и добавил его снова — всё опять заработало.
На следующий день всё повторилось.

В системе установлен Lua for Windows, если это имеет значение, и прописаны переменные среды:

LUA_DEV=c:\Lua
LUA_PATH=.\?.lua;.\?\init.lua;%LUA_DEV%\lua\?.lua;%LUA_DEV%\lua\?\init.lua;

Путь к папке с расширением выглядит так: d:\Progs\HandyCache\Extensions\my_extension

Я где-то косячу или это таки баг?
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #436 : 15 октября 2012, 00:25:00 »

Насчет бага разбираться не хочется - мне неизвестно, как Windows и LUA устанавливают/считывают переменные среды.
Попробуйте расширение делать независимым от переменных среды.
В СМ я обрамляю require такой оберткой:

local old_cpath = package.cpath
package.cpath = hc.script_name:match('.*\\') .. '?.dll'
require('vcl')
package.cpath = old_cpath

Вместо красного вставить свое. Вместо package.cpath может потребоваться использование package.path
« Последнее редактирование: 15 октября 2012, 00:29:29 от Михаил » Сообщить модератору   Записан
mirny
Пользователь
**

Репутация: +11/-1
Offline Offline

Сообщений: 84


« Ответ #437 : 15 октября 2012, 00:38:06 »

Oh shi~  Шокирован

Михаил, спасибо.
Сообщить модератору   Записан
olDjeka
Постоялец
***

Репутация: +6/-0
Offline Offline

Сообщений: 117


« Ответ #438 : 12 ноября 2012, 02:10:20 »

В заголовке ответа (для передачи клиенту) расширение должно менять URL,
заменяя httр://https.. на http://.
Поясните, почему расширение срабатывает (видно в мониторе), но отдаваемый URL не меняет?

Код:
--[[ <HCExtension>
@name          Меняет заголовок ответа
@description   Изменяет заголовок ответа по заданным правилам
@rule          ^http://https\.\.
@event         BeforeAnswerHeaderSend/Answer
</HCExtension> ]]

function Answer()
hc.answer_header = re.replace(hc.answer_header, [[https\.\.]], '')
        hc.monitor_string = hc.monitor_string..'A-CH '
end
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #439 : 12 ноября 2012, 09:26:49 »

Как Вы узнали, что не меняет? Если по колонке монитора URL, то он и не должен меняться. Чтобы увидеть измененный заголовок, выведите содержимое hc.answer_header в лог НС.
Сообщить модератору   Записан
Страниц: 1 ... 20 21 [22] 23 24 ... 29   Вверх
  Отправить эту тему    Печать  

 
Перейти в: