@ProLua

Страница 218 из 307
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
пробовал - тоже не пашет.
просто посчитай все matchи до ifов

но если это не хайлоад, то разницы между 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
понятно ) знакомый подход

счас попробую

Страница 218 из 307