
Pavel
27.12.2017
13:09:30
@mva_name сможешь подсказать по строке https://github.com/msva/lua-htmlparser/blob/master/doc/sample.lua#L17
она не выводит значение тэга h2
в выходе вот так
div id=[[index]]
h2
table width=[[100%]]

Google

Pavel
27.12.2017
13:10:57
хотя в html </script><div id="index"><h2>Топ торренты за последние 24 часа</h2><table width="100%"><tr class="back
это где-то нужно подкрутить чтобы парсил h2 как-то ?
я парсеру скормил вот этот html http://fast-bit.org/top
дернул wget-ом и отдал как sample.html

Philipp
27.12.2017
13:50:35
Есть тут кто-нибудь кто в TeX'е шарит?

Vsevolod
27.12.2017
13:52:39
а что за вопрос?

Philipp
27.12.2017
14:09:13
Нужна помощь в оформлении
По мелочи

Vsevolod
27.12.2017
14:10:20
ну, я писал диссер и некоторое количество статей и презентаций в техе
но "шарит" - это скользкий вопрос

Pavel
29.12.2017
06:29:46
мелкий вопрос.
elseif v:match("(.-)MGNT") then
local _tm = v:match("(.-)MGNT")
res = res..'"magnet" : "'.._tm..'"'
elseif v:match("(.-)GROUP_ID") then
local _th = v:match("(.-)GROUP_ID")
res = res..'"group_id" : "'.._th..'"'
вот кусок кода - тут match два раза зовется в if и ниж. lua так-же вызовет это 2 раза или сможет оптимизнуть на лету?

Google

Pavel
29.12.2017
06:31:20
как принято такие конструкции писать в lua?

Чай
29.12.2017
08:50:54
Два раза вызовет.

fgntfg
29.12.2017
08:52:43
local tmp = v:match("хуёмаё"); if tmp
elseif local _th = v:match("хуёмаё") then
по идее должно работать, но у меня, как обычно, нет lua компе

Pavel
29.12.2017
09:08:14
elseif local _th = v:match("хуёмаё") then - не пашет. lua53.exe: torrent-parser_2.lua:124: unexpected symbol near 'local'

fgntfg
29.12.2017
10:23:34
значи объяви переменную раньше или возьми в скобки

Pavel
29.12.2017
10:32:15
пробовал - тоже не пашет.

ShadoWalkeR
29.12.2017
10:35:58
Коллеги, подкиньте пример написания прослойки, для работы Lua с so библиотекой

fgntfg
29.12.2017
10:36:46
но если это не хайлоад, то разницы между 2мя вызовами и одним - никакой

Pavel
29.12.2017
10:40:50
нагрузки там нет просто думал что есть сахар в языке чтобы красивее написать
все считать вначале тоже не правильно - уменя таких блоков много. а сработает только один 0
но наверно так и сделаю - с дублированием есть риск - в if поменял условие а ниже забыл.
copy-paste зло в любом языке

fgntfg
29.12.2017
10:46:30
А сделай таблицу, в качестве ключа - твой матч, в качестве занчения - значение матча
for k,v in pairs(thiscrap) do v=match(k) end
или как-то так

ShadoWalkeR
29.12.2017
10:47:51
А может сделать так: local _th = v:match("(.-)(GROUP_ID|MGNT)") if _th then

fgntfg
29.12.2017
10:48:10
а там от _th зависит всякая логика

Google

ShadoWalkeR
29.12.2017
10:48:25
Ну так в нее же и сохраняется что найдено
Там же наверняка цепочка ifelse на тему "Если найдено то сохранить в перменную еще раз поиск регэкспа и дальше в res подставить"

fgntfg
29.12.2017
10:50:55
оставим это автору

ShadoWalkeR
29.12.2017
10:51:14
А теперь ответьте на мой вопрос ?

Pavel
29.12.2017
10:52:04
да. у меня цепочка.

fgntfg
29.12.2017
10:52:53
повезло что снус спит/ест
он бы объяснил что мы все не правы

Pavel
29.12.2017
10:57:13
мой кусок говно-кода выглядит так: https://pastebin.com/62z6Mju7

ShadoWalkeR
29.12.2017
10:59:13
Если программист, столкнувшись с проблемой, думает что решит её при помощи регулярок, то он получит 2 проблемы.
А если с помощью параллельного программирования, то 10 ?

fgntfg
29.12.2017
11:00:38
а зачем тебе матчить вообще? gsub во все поля
тебе, по идее, хватит сматчить что строка подходит под шаблон и дёрнуть из неё нужные подстроки
а дальше всё без условно перехреначивать

Pavel
29.12.2017
11:02:34
ну ког не совсем мой... я его просто немного правлю

fgntfg
29.12.2017
11:03:11
придумай свой :)
часто это проще, чем чужое ковырять

ShadoWalkeR
29.12.2017
11:03:46
Главное понять что надо сделать и как лучше это сделать

Pavel
29.12.2017
11:05:48
я в lua очень плохо разбираюсь - недавно только его стал использовать.

Mirocow
29.12.2017
13:04:12
Всех с наступающим http://img0.liveinternet.ru/images/attach/c/4/82/270/82270182_large_yerotika72786.jpg

Google


Snusmumriken
29.12.2017
15:44:48
elseif v:match("(.-)MGNT") then
local _tm = v:match("(.-)MGNT")
res = res..'"magnet" : "'.._tm..'"'
elseif v:match("(.-)GROUP_ID") then
local _th = v:match("(.-)GROUP_ID")
res = res..'"group_id" : "'.._th..'"'
Я бы цеплялся за что-то другое, вида:
-- регулярка '(bla-13:asd!) (bla_BLAH) ... any_sym'
local subj, mode = v:match'(%S+)%s([%w_]+)'
if mode == 'GROUP_ID' then subj = .. end
...
А если совсем красиво:
local mode_switch = {}
function mode_switch['GROUP_ID'](subj, full_data)
return subj..full_data..'bla-bla'
end
function mode_switch['MGNT'](subj, full_data)
return subj..full_data..'bla-bla-bla'
end
local subj, mode = v:match'(%S+)%s([%w_]+)'
if mode_switch[mode] then
mode_switch[mode](subj, v)
end
Подходит для хайлоада и просто добавлять новые реакции.
Если не получается цепляться - то же самое, только:
for key, func in pairs(mode_switch) do
local _tm = v:match('(.-)'..key)
if _tm then res = func(v); break end
end
Но это тебе уже давали, и это не настолько хорошо для хайлоада: многократные вызовы поиска, плодение кучи строк и т.п.


Pavel
29.12.2017
15:53:46
@Snusmumriken спасибо. у меня нет большой нагрузки. на вход подаетс 250кб html и это работает на клиентской машине

Snusmumriken
29.12.2017
15:54:19
Нормась, хватай какой-нибудь из вариантов, это просто самое рациональное, чтобы не плодить безумие с if-else.

Pavel
29.12.2017
15:54:35
я просто вижу что код пахнет )

Snusmumriken
29.12.2017
15:54:40
Чем? : )

Pavel
29.12.2017
15:55:20
ну не красивый он. про варианты посмотрю. спасибо
а в lua вызов функций дешевый?
там не так как в с++? по значению/ссылке
или там все inline?


Snusmumriken
29.12.2017
15:58:26
Смотря в какой луа и как вызывается.
Вызов глобальных фиговин где-то кроме luajit - не очень быстрый.
Вызов локальных-закешированных - быстрый в любом случае.
Карочи, значения в lua хранятся так:
По значению: строки, числа, булеаны
По ссылке: таблицы, функции, корутины, userdata.
То есть, можно переопределять функции.
-- сохранили ссылку на функцию в другую переменную
oldprint = print
function print(...) oldprint('Hai!', ...) end
print(1, 2, 3, 4, 5) --> 'Hai! 1 2 3 4 5'
Строки - особая фигня, в луа используется буфер строк, чтобы быстро передавать в функции даже огромные фиговины, но это делает дорогим обилие операций, изменяющих огромные строки, ибо иммутабельность. Но в быту - норм, плюс есть трюк:
local strbuf = {}
for i = 1, 10000 do
strbuf[#strbuf+1] = tostring(i):rep(100)
end
-- всё склеили в один присест, не плодились лишние строки и т.п.
str = table.concat(strbuf)


Pavel
29.12.2017
16:03:09
спасибо. у меня на вход идет строка - сырой html размер 200-300 к
получается если я буду ее прокидывать в другие локальные функции - будет создаваться копия?

Snusmumriken
29.12.2017
16:05:47
Нене, если ты будешь распиливать её, например, или дописывать в конец - будут создаваться новые строки, которые будут жрать почти столько же памяти сколько и оригинальная.
Вот такой вариант:
local str = ''
for i = 1, 10000 do
str = str..tostring(i):rep(100)
end
- очень жручий по памяти, а если ты заполнишь оперативку этими почти-копиями строки, оно будет ещё собираться мусорщиком, потом снова заполняться и снова собираться мусорщиком. Медленно.
В коротких строках - быстро. В длинных и с обилием конкатенаций - быстро, пока не заполнится память.

Pavel
29.12.2017
16:06:53
если не сложно можешь посмотреть на мой код сейчас ?
http://etc2.fly-server.ru/etc/flylinkdc-search-engine.lua

Snusmumriken
29.12.2017
16:06:56
Ага

Pavel
29.12.2017
16:07:02
вот мой скрипт
он зовется из С++ программы
и туда подается 250к

Google

Pavel
29.12.2017
16:07:34
function search(p_tracker_index,
p_body)
вот сюда
p_body - 250к

Snusmumriken
29.12.2017
16:10:54
1.
function get_url(i, srch, cat, page, w_word, sort, desc)
if p_tracker_index == 0 then
return 'http://fast-bit.org/search/'..page..'/0/300/2/'..srch
end
...
end
=>
local url_list = {}
url_list[0] = function(srch, cat, page)
return 'http://fast-bit.org/search/'..page..'/0/300/2/'..srch
end
url_list[1] = function(srch, cat, page)
return 'https://thepiratebay.org/search/'..srch..'/'..page..'/7//'
end
function get_url(i, ...)
return url_list and url_list(...) or ''
end

Pavel
29.12.2017
16:12:22
но эти функции не получают много данных.

Snusmumriken
29.12.2017
16:13:02
Превращаем однотипные if-else в табличку с функциями.
Это рационально, потому что добавляя 100500-if-else ты замучаешься, плюс это можно легко в модуль вытащить и легко оперировать.

Pavel
29.12.2017
16:13:53
модуль я такого не знаю еще.
я вытгиваю скрипт полностью на клиент

Snusmumriken
29.12.2017
16:15:16
2. в String2Lower очень часто используется string.char, если оно гонется на обычной lua - лучше закешировать:
String2Lower = function(s)
local char = _G.string.char
for i = 192, 223 do
s = s:gsub(char(i), char(i + 32))
end
...
Это ускоряет обработку в разы, ибо не надо каждый раз заново искать функцию в глобальном пространстве, и лучше читается.
Если на luajit - пофигу: скомпилирует в трассу и будет сразу машинным кодом гонять, без интерпретации.
3. Общепрограммистское: ты используешь табуляцию для форматирования.
Используй табуляцию только перед текстом строки, а после хоть какого-то не-табуляционного символа - только пробелы, иначе всё едет при изменении размеров табов:
[tab][tab]bla-bla[space][space]-- bla-bla
[tab][tab]bla-blah[space]-- bla-bla

Pavel
29.12.2017
16:19:31
кстати а для lua есть автоформатер?

Snusmumriken
29.12.2017
16:19:46
Частично работает js-форматирование, по крайней мере над таблицами.

Pavel
29.12.2017
16:22:06
вот так заменил по вашему совету- результат парсинга не поменялся

Snusmumriken
29.12.2017
16:22:42
Ну правильно что не поменялся, это чисто "ускорялка".

Pavel
29.12.2017
16:22:43
а как вы замеряеет ускорение или замедление кода?
профайлер есть?
или это опыт

Snusmumriken
29.12.2017
16:23:37
local time = require'socket'.gettime
local timestamp = time()
do_somethng()
print('Time: ', time() - timestamp)

Pavel
29.12.2017
16:23:56
понятно ) знакомый подход
счас попробую