vitaly
Хеширование по сигнатуре Этот алгоритм описан в статье Бойцова Л.М. «Хеширование по сигнатуре». Он базируется на достаточно очевидном представлении «структуры» слова в виде битовых разрядов, используемой в качестве хеша (сигнатуры) в хеш-таблице. При индексации такие хеши вычисляются для каждого из слов, и в таблицу заносится соответствие списка словарных слов этому хешу. Затем, во время поиска, для запроса вычисляется хеш и перебираются все соседние хеши, отличающиеся от исходного не более чем в k битах. Для каждого из таких хешей производится перебор списка соответствующих ему слов. Процесс вычисления хеша — каждому биту хеша сопоставляется группа символов из алфавита. Бит 1 на позиции i в хеше означает, что в исходном слове присутствует символ из i-ой группы алфавита. Порядок букв в слове абсолютно никакого значения не имеет.
vitaly
вот теперь - кто нить может это реализовать на луа???
vitaly
https://habr.com/post/114997/
vitaly
тут все рассписано в теории
vitaly
https://code.google.com/archive/p/fuzzy-search-tools/source/default/source
vitaly
тут исходинки на джвае
Ivan
https://gist.github.com/wtsnjp/2b193a5b8096126050055f12ea90ee43
vitaly
да мне это нх не нужно
vitaly
это слишком сложно для порно сайта
vitaly
это искусство для всех
vitaly
http://lua-users.org/lists/lua-l/2008-01/msg00095.html
vitaly
function levenshtein(s, t) local s, t = tostring(s), tostring(t) if type(s) == 'string' and type(t) == 'string' then local m, n, d = #s, #t, {} for i = 0, m do d[i] = { [0] = i } end for j = 1, n do d[0][j] = j end for i = 1, m do for j = 1, n do local cost = s:sub(i,i) == t:sub(j,j) and 0 or 1 d[i][j] = math.min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+cost) end end return d[m][n] end end
vitaly
алгоритм вот есть - частное решение уже сам могу додумать 😀 - другое дело что сложно это все - но не безнадежно - поиски то сохранены в базе - анализ их можно проводить хоть месяцы никто не подгоняет
vvzvlad
Что-то я в регулярки не вкурю никак. Как сказать, что надо захватывать строку, в конце которой может быть "/", а может и не быть? "(.-)/?" не работает, "(.-)[/]* тоже
Snusmumriken
Мм. "(.-)/?$" .- == .*? (в PCRE), захватывает наименьшую последовательность. Если есть шанс не схомячить ничего - оно не схомячит ничего. Поэтому нужен правый ограничитель, если тебе всё таки нужно что-то схомячить. /? - плохой ограничитель, потому что с ним можно не считаться. $ - хороший ограничитель, с ним нельзя не считаться и он указывает на конец строки.
vvzvlad
ну вот * жадный же, а все равно не захватывает
Snusmumriken
Последовательность "ноль или более". То есть, (.-) пытается захватить наименьшую последовательность, а /* - думает что после этой наименьшей (например, после пустой строки) может быть и ноль символов /, поэтому можно не морочиться.
Snusmumriken
Хех.
Snusmumriken
Карочи, с /* можно не считаться точно так же как с /?.
Snusmumriken
Блин, тут надо моск чутка перестроить и много экспериментировать. Я сам регулярно проверяю-перепроверяю регулярки, на всяк случ, и иногда они меня ещё удивляют.
vvzvlad
Запутался. вот у меня строка "/wb/AN4SSJFL/wb-map12h/156/Frequency", которую я в цикле разбираю такой регуляркой: "/(.-)(/.*)", где первый захват — подстрока, а второй захват — новая строка, которая снова разбирается той же регуляркой. И все хорошо, но вот последнее значение не захватывается, потому что ожидается вида "/нечто/", а оно "/нечто". Не пойму как захватить.
vvzvlad
Я обходным путем разобрал нормально, но хочется понять, как это сделать красиво за одно действие
Snusmumriken
Ты не можешь делать такие конструкции: str:match('(/foo(/)bar/)'), чтобы из строки /foo/bar/ вычленялось /foo/ и /bar/. Приводить и нормализовать придётся в любом случае.
vvzvlad
Не, а мне и не надо. первый токен захватывается без разделителей, значит разделитель остается второму захвату
vvzvlad
просто на последней итерации мне надо захватить не "/(.-)(/.*)", а "/(.-)(.*)"
Snusmumriken
Карочи. function parse(url) local list = {} for block in (url .. '/'):gmatch('(.-)/+') do list[#list + 1] = '/' .. block .. '/' end return list end
Snusmumriken
Хм, ну довольно близко. Первый слеш убрать и ок.
vvzvlad
бгг
vvzvlad
ой
vvzvlad
А зачем добавлять "/"?
vvzvlad
Мне наоборот, надо без них захватить, только токены, без разделителей
Snusmumriken
Окей. Убери разделители при добавлении в список.
vvzvlad
На самом деле, к моему коду можно было тоже просто добавить topic = topic.."/", и все.
vvzvlad
Спасибо)
Александр
Подскажите: статически линкуюсь с liblua5.3.a (C++), получаю неотлаживаемый код, когда захожу во внутренности либы. Хочу слинковаться с каким-нибудь liblua5.3.a-debug, но в упор не нахожу у себя в системе (Debian 9) подобного. Вопрос - ЧЯДНТ?
mva
если вкратце, то всё
mva
во-первых, отсутствие debug-сборки проблема дебиана и с этим надо на их багтркер (впрочем, можно нарваться на мейнтейнера-упорка и выслушать что ты дурак и тебе это не нужно и он лучше знает как паковать)
mva
во-вторых - не стоит свято надеяться на бинарный дистрибутив при разработке. Собери Lua из исходников и будут тебе и дебаг либа и всё что хочешь
mva
как ни печально, но да
mva
правда, это было давно и с git-daemon'ом
Александр
раз уж зашёл.. никто не сталкивался с проблемой сегфолтов при использовании общего lua_State из разных shared library, где каждая имеет свой статически слинкованный lua (один и тот же)?
mva
маловероятно что кто-то ответит на это утвердительно
mva
т.к. попахивает чем-то, чего делать не стоит
mva
общий стейт для разных библиотек сам по себе выглядит опасно
mva
даже если принять за истинность утверждение о том, что все они слинкованы с одной и той же статической liblua (что может таки однажды оказаться и ложным утверждением)
mva
мне кажется, в этом случае, лучше линковать (и держать стейты) в основной бинарник, который и подгружает те динамические библиотеки, которые сейчас слинкованы с lua
mva
впрочем, допустимость общего стейта для разных библиотек всё равно зависит от контекста
Александр
разные либы дают разный вклад в прослойку C++ <-> lua
Александр
любопытно - собрал свежий lua из сорцов, проблема исчезла
vitaly
бугага - бугага
vitaly
6 лет работы с рести на практике и мучений с луа 😂
Snusmumriken
Ну, если ты борешься с технологией - происходит явно что-то не то : )
Snusmumriken
Луа рассчитана на непрограммистов : ) Это, конечно, может значить что "программистам будет тяжко", с таким-то синтаксисом (do-then-end) и индексацией массивов с единички, но за шесть лет-то можно давно перестать бороться с луями ))
Tadeusz
ну и с ~= тоже, ибо хотелось !=
Snusmumriken
Ну, нумерация с единицы подзадалбывает только в самом начале и в крайних случаях. Зато типа сразу видно сколько конкретно элементов будет внесено, после луёв переходить на нуль-индексацию задалбывает несколько больше, потому что надо напрягать моск в сторону вычислений "а скока элементов", особенно во всяких двухмерных-трёхмерных массивах.
vitaly
Луа рассчитана на непрограммистов : ) Это, конечно, может значить что "программистам будет тяжко", с таким-то синтаксисом (do-then-end) и индексацией массивов с единички, но за шесть лет-то можно давно перестать бороться с луями ))
После пхп луа просто отличный пример какой должен быть язык. Луа сам по себе бесполезен. Нужны конкретные реализации - в моем случае это нгинкс и модуль луа плюс луарести
vitaly
В данной связке много прелестей и много чего изобретать приходиться.
Snusmumriken
После пхп луа просто отличный пример какой должен быть язык. Луа сам по себе бесполезен. Нужны конкретные реализации - в моем случае это нгинкс и модуль луа плюс луарести
Луа сам по себе - "стандарт", без реализации это голая идея того как должен выглядеть язык. Голые реализации типа бинарей 5.1-5.3-luajit - аналог bat/sh/python-скриптов, в них можно много чего запаковать. Например, luarocks - это набор луа-скриптов и целый пакетный менеджер, вполне софтина. Ещё к чистым луям можно прикрутить winapi/qt/любую интерфейсную либу и мутить десктопные приложения с окошками и кнопочками. Замусоренные либами луи мало чем отличаются от любого другого языка программирования.
vitaly
Мне сайты делать нужно :). Мне парсеры контента нужны. Луа подходит.
Snusmumriken
Это просто один из способов. Ты просто уточняешь что "луа сам по себе бесполезен", а я тут типо на luajit делаю вендовые сервисы и кнопочно-окошечные приложули ))
Snusmumriken
Ну типа дополнительное вендовое окно, прикрученное к love2d, с обратной связью. Что характерно, winapi чисто через luajit. Никаких внешних dll-ок (кроме user32 и system32 из папки с:/windows/system32)
Snusmumriken
Ну, могу гифку записать ))
Andrei
Ну, могу гифку записать ))
не надо, мне уже норм))
Andrei
Snusmumriken
Поздно
Snusmumriken
На luajit можно писать всё что можно писать на сишке, поэтому лично я нежно люблю именно luajit (совершенно произвольные вещи). Там есть недостатки в виде "нельзя писать слишком сложное ПО из-за хреноватого стека jit-трасс", но сравнительно небольшие вещи - запросто, и скорость исполнения в данном случае близка к той же сишке. Если мы пишем "нормальную" прогу на плюсах/сишке - аналогично, сценарии эффективнее скриптовать луями (потому что легко переписать/модифицировать без компиляций-перекомпиляций). Фактически, мы делаем ядро, расширяющее синтаксис луа, и уже скриптиками дёргаем эти расширения. В общем, имхо, вполне можно практически полностью переходить на луа, за редким исключением (системный код/фронтенд), благо уже куча вещей используют луи за скрипто-основу (тарантул/редис/рести/игрушки). Если бы какой-нибудь андроид использовал луа вместо java, имхо, у него было бы значительно меньше проблем производительности/тормозов/проблем с написанием ПО (но это не точно) и не нужен был бы NDK, ибо сишка под луа ложится нативно, в отличии от. Но скорость разработки самой ОС, вероятно, замедлилась бы за отсутствием многих библиотек в поставке.
vitaly
я не против
vitaly
но мне кушать нада
vitaly
по этому порносайты
Yuriy
по этому порносайты
Я как то приватный webrtc чат делал для таких вещей ))
Yuriy
А еще делал call-center как оказалось потом для питерского борделя )
Yuriy
Я скидон деньгами забрал )
Yuriy
Зачем?)
Snusmumriken
Пожизненный. Приходишь такой в 80 лет, обслуживайте, мол.