LINUX.ORG.RU

Избранные сообщения Dr64h

Запил поискового движка на C++

Форум — Development

Да, можно взять elasticsearch, postgres, что-то ещё. Но мы тут не про «взять», а про «запилить», development же.

Так вот, я ищу слово «дур». Хочу, чтобы находилось как в телеграме:

дурь
дурью
дури
дуру
дура

Возможно, «дурка», но вряд-ли - корень другой.

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

Вот давайте по-простому на уровне объяснения алгоритма школьнику.

Что можно сделать ДЛЯ НАЧАЛА? При индексации, когда мы смотрим на документ 12345 и встречаем слово «придурью» то мы берём корень и само слово. Далее пишем в индекс 2 такие записи и казалось бы достаточно.

придурью -> 12345,position
дур -> 12345,position

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

 

lesopilorama
()

Приведение типа аргумента функции в С

Форум — Development

В С аргументы функции приводятся к типу указанному при объявлении т.е. если функция ожидает в качестве аргумента int, а передали, к примеру char, то произойдет неявное приведение char -> int

В С++ такой вариант уже не пройдет и компилятор выдаст ошибку.

Вопрос в следующем - существуют ли какие-то «стандартные» инструменты для С, запретить приведение, как в С++?

 ,

pavel_l
()

whisper.cpp 1.7.4

Новости — Open Source
whisper.cpp 1.7.4
Группа Open Source

6 января состоялся выпуск 1.7.4 высокопроизводительной системы автоматического распознавания речи whisper.cpp, реализующей модель Whisper от OpenAI, написанной на языках C и C++ и распространяемой по лицензии MIT.

( читать дальше... )

>>> Список изменений версии 1.7.4 на GitHub

 , , , ,

dataman
()

xxHash 0.8.3

Новости — Open Source
xxHash 0.8.3
Группа Open Source

После более года разработки состоялся выпуск 0.8.3 библиотеки xxHash, реализующей высокопроизводительные некриптографические хэш-алгоритмы xxHash. Библиотека и консольная утилита написаны на языке C и распространяются по лицензии BSD 2.

Что нового:

  • Исправлена ошибка в функции XXH3_128bits_withSecretandSeed(), приводящая к некорректным результатам в некоторых случаях.
  • Добавлена оптимизированная реализация для LoongArch SX.
  • Теперь консольная утилита xxhsum автоматически определяет и использует лучшее из доступных векторных расширений (SSE, AVX и т. д.). Ранее для этого требовалась явная опция сборки, но теперь она включена по умолчанию (отключается заданием DISPATCH=0).
  • Также в утилиту xxhsum добавлен ключ --filelist / --files-from, принимающего имена файлов из текстового файла или stdin, упрощая массовое хеширование.
  • Новый режим -H3 генерирует 64-битные хэши XXH3 с префиксом XXH3_, для отличия их от безпрефиксного XXH64. Симлинк xxh3sum по умолчанию использует этот режим.
  • Проверка сборки для AIX и процессоров SPARC.

>>> Подробности для версии 0.8.3 на GitHub

 , xxhash, ,

dataman
()

Перемножение двух чисел в дополнительном коде с обнаружением переполнения

Форум — Development

Вытащу сюда вопрос из темы.

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

Алгоритм, который мне известен:

1. Расширить операнды знаком в 2 раза. 2. Перемножить расширенные операнды алгоритмом беззнакового умножения, получив произведение, которое имеет в 4 раза больше бит, чем исходные операнды. 3. Трактуем произведение как число в дополнительном коде: если полученное значение укладывается в диапазон значений исходного типа, то переполнения нет, если не укладывается — значит переполнение.

Ну то есть, например: для перемножения 256-битных чисел нам придётся оперировать 1024-битным произведением. Что несколько дохрена.

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

(UPD: не, вроде херня какая-то)

 , , ,

wandrien
()

Qod. Опубликовал исходники компилятора, над которым работаю

Форум — Development

Финально определился с названием языка, подчистил разные хвосты и написал README. Теперь наконец-то можно посмотреть на нечто большее, чем просто фрагменты кода в постах на форуме: https://github.com/wandrien/qod/

Драфты по дизайну языка пока еще не готовы. Если перед НГ завала работы не будет, то может выложу их в течение пары недель. Черновики пишу на русском, осилить всё чётко сформулировать на английском в разумные сроки я точно не смогу. На русском-то не всегда получается.

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

А пока можно посмотреть на сам код вживую.

 , qod, ,

wandrien
()

СИ: enum VS #define

Форум — Development

У меня зачастую бывают такие ситуации, что я как осёл между двумя стогами сена стою и не могу для себя решить, что использовать в данном конкретном случае.

Напишите, чем вы руководствуетесь, когда решаете использовать дефайны или енумы.

P.S. Тема не имеет под собой какого-то конкретного случая. Просто хочу посмотреть на опыт других программистов.

 

u5er
()

Какие моноширинные шрифты — ваши любимые?

Голосования — Голосования

>>> Результаты

 

MrCookie
()

Офлайновая документация, поиск по ней и навигация

Форум — Development

Привет, ЛОР!

В какой-то момент поймал себя на мысли, что постоянно лазать в сеть за доками к языкам и библиотекам – какое-то полное дно, поэтому скачал большую часть нужного себе на диск. Возник вопрос: а как всё это удобным образом каталогизировать, обновлять и искать по этому?

Доки в основном в HTML (всякие CPP Reference, доки по Qt, Haddock и т.д.), но форматы вразнобой.

В общем, надеюсь на твою мудрость в этом вопросе, ЛОР. Вдруг тут кто-то нашёл волшебное средство, о котором я не знаю.

 , ,

hateyoufeel
()

Просадки FPS при движении мыши или использовании клавиатуры

Форум — Games

Пасаны, проблема такая. Запускаю любую игру через Steam, игра идет нормально минут 40, а потом в какой-то момент начинает дико лагать. Причем лаги появляются при движении мыши и использовании клавиатуры. Если просто стоять и не двигаться, то FPS нормальный, а как начинаешь двигаться, то все, пздц.

Стояла у меня свежая версия Ubuntu Использую ProtonGE 9.20 Параметры запуска «gamemoderun %command%»

Использовал разные драйвера для видеокарты, уменьшал настройки графики, менял даже графическую оболочку с gnome на xfce, пробовал другие девайсы, перезагружал 100500 раз, но ничего не помогало.

Раньше у меня стояла Manjaro, и там все работало хорошо, но решил сменить ОС на Ubuntu.

https://youtu.be/HfIrwMgrtck

 , , ,

TestAcc
()

Есть ли какие-то зависимости от архитектур в результате приведения большего типа к меньшему?

Форум — Development

Вот пример

unsigned i = string::npos;
assert(numeric_limits<unsigned>::max() == i)

На всех ли архитектурах (x86, arm, mips, прочие архитектуры с прямым и обратным порядком байт) справедливо i == numeric_limits<unsigned>::max() ?

 

bober
()

Calibre 7.20 с новым движком для конвертации PDF

Новости — Open Source
Calibre 7.20 с новым движком для конвертации PDF
Группа Open Source

Вышла новая версия каталогизатора электронных книг с открытым исходным кодом Calibre 7.20.

В этой версии появился новый движок для преобразования PDF-файлов в другие форматы электронных книг, такие как EPUB или MOBI. Теперь он способен автоматически определять заголовки и подзаголовки на основе анализа документа.

( читать дальше... )

>>> Подробности

 , , ,

fail2ban
()

FireJail — краткое и ознакомительное практическое руководство

Статьи — Desktop
FireJail — краткое и ознакомительное практическое руководство

Сейчас существует прорва механизмов изоляции приложений — от песочниц до виртуальных машин. Целей их применения тоже множество, но так или иначе всё сводится к тому что нужно ограничить доступ приложений к тем или иным ресурсам вычислительного устройства.

Ниже я хочу описать почти золотую середину в лице утилиты firejail в виде практических советов по использованию в первую очередь для обычных пользователей и (возможно) разработчиков.

( читать дальше... )

 , , , ,

LINUX-ORG-RU
()

Рефлексия в плюсах - обойти все поля структуры в рантайм?

Форум — Development

Хочется объявить поля в структуре/классе так, что бы потом иметь возможность обойти их в рантайм/иметь возможность обращаться по имени в рантайм. Ограничения:

  1. стандарт не свежее с++-17

  2. всякие толстые сторонние либы а-ля буст не подходят

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

  4. необходимо иметь возможность довешивать к полям комментарии (можно статические) и потом иметь к ним доступ в рантайм.

Хочется че то такое:

struct A{
    BEGIN();  // некий макрос
    int PAR(x, 0, "число рыбов");
    std::array<double, 2> PAR(y, {0., 0.}, "координаты главрыбы");
    END();
};

но как это сделать фантазии не хватает (есть варианты, но они все ужасно костыльные).

Можно легко сделать что то вроде

struct A{
   double x = 0;
   std::array<double, 2> y = {0., 0.};
   A(){ TABLE(x, "число рыбов")(y, "координаты главрыбы"); }
};

но нарушается п.3.

Можно на худой конец сделать

struct A{
   int x = 0; ///< число рыбов
   std::array<double, 2> y = {0., 0.}; ///< координаты главрыбы
};

и перед сборкой обрабатывать это питоньей утилитой, генерить хидер с какой то оберткой и его инклюдить, но выглядит несколько радикально…

Как бы такое сделать Ъ? @annulen, @fsb4000, @monk, @bugfixer


UPD. Решил чуть подробнее расписать зачем это нужно и что должно выйти в итоге. Есть приложение (HPC) в котором есть вычислительное ядро на плюсах. В ядре есть класс Model со 100500 параметров (входных и выходных содержащих результаты расчета) которые имеют значения по умолчанию, но нужно мочь их менять через конфиги/аргументы командной строки, куда то записывать (в json) и т.д. Если забиндить ядро в питон (через SWIG) то это все делается довольно легко, но такой биндинг не всегда возможен. Хочется иметь аналогичную функциональность на чистых C++. Т.е. в C++ я изначально пишу:

class Model{
...
   double J = 1;      ///< exchange integral
   double T = 2;      ///< temperature
   double c = 0.1;    ///< concentration
   double dt = 1e-2;  ///< time step
   double t = 0;      ///< time
...
   
   void init();
   void calc();
};

Пускач в питоне

model = Model()
config(model)  # это функция из моей либы накатывающая параметры из командной строки
model.init()
while model.t<t_max: model.calc()

при запуске я могу писать что то вроде

./run.py T=4 dt=1e3

хочется мочь писать аналогичный пуска на плюсах.

Для этого необходимо и достаточно иметь в плюсах некую обертку для модели которая:

  1. может перечислить все параметры
  2. может вернуть значение любого параметра в виде строки
  3. может задать значение любого параметра из строки
  4. бонусом (то чего в питоне пока нет, но хочется и туда пробросить) - может вернуть комментарий к любому параметру

 ,

AntonI
()

Новости FPDoom: поддержка монохромных экранов

Новости — Игры
Новости FPDoom: поддержка монохромных экранов
Группа Игры

FPDoom – проект, позволяющий запустить классический Doom, его дополнения и другие портированные игры на очень распространённом на дешевых кнопочных телефонах чипе Spreadtrum SC6531 и его модификациях. Проект содержит порты ванильного Doom, а также Duke3D, Shadow Warrior, Blood, Wolfenstein 3D и порт InfoNES.

Порты выполнены в виде приложений bare-metal, запускаемых через свой загрузчик (добавляется в прошивку, загружает игры с SD-карты). Устанавливается на современные кнопочные телефоны с чипами Spreadtrum SC6530/SC6531, что составляет более половины предложений на российском рынке. Список протестированных моделей и ссылка на описание загрузки приведены в Readme.

( читать дальше... )

>>> Исходный код

 , , , ,

jpegqs
()

Посоветуйте максимально простой и надёжный роутер

Форум — General

Интересует обычный бытовой Wi-Fi роутер. Что хочется: умеренная цена, максимально «тупой» способ настройки подключения без фирменных приложений и прочего шлака, в стиле старых D-Link'ов. Главное, чтобы поддерживал современные протоколы подключения и/или простую перешивку на DD-WRT / Open WRT .

 ,

LongLiveUbuntu
()

ищется туториал про nftables

Форум — Admin

Есть годный туториал про nftables — такого же качества, что и iptables tutorial v1.19? Если есть такое, просьба поделиться. Или же ссылка на бумажную книжку.

 ,

Infra_HDC
()

типы в c

Форум — Development

есть такая структурка:

struct x { int i; ... char buf[4096 - ???]; };

проблема в размере buf. должно быть так:

static_assert(sizeof(struct x) == 4096);

как написать там нужный размер без боли? очевидный вариант не проходит:

struct x { int i; ... char buf[4096 - offsetof(struct x, buf)]; }; // struct x is incomplete
struct x { struct { int i; ... } y; char buf[4096 - sizeof(y)]; }; // y is undeclared
struct x { struct y { int i; ... } y; char buf[4096 - sizeof(struct y)]; }; //это работает, но как и в предыдущем случае нужно будет писать x.y.i вместо x.i

лучшее, что придумал:

struct x { union { struct { int i; ... char buf[]; }; char _[4096]; }; };

но хочется иметь простой sizeof(buf), а не костылями. есть ли способ?

 ,

jsforever
()

В C++ добавят Rust

Форум — Development

Привет, ЛОР! Я тебе покушать принёс.

Опубликован черновик расширения Safe C++, представляющего собой надмножество языка с возможностью отключать в коде Undefined Behaviour и прочие небезопасные штуки. Safe C++ добавляет в язык также borrow checker, pattern matching и другие функции, знакомые и любимые программистами на Rust. unsafe блоки входят в комплект.

Пример кода:

#feature on safety
#include <std2.h>

int main() safe {
  std2::vector<int> vec { 11, 15, 20 };

  for(int x : vec) {
    // Ill-formed. mutate of vec invalidates iterator in ranged-for.
    if(x % 2)
      mut vec.push_back(x);

    std2::println(x);
  }
}

Ошибка при сборке этого кода:

$ circle iterator.cxx -I ../libsafecxx/single-header/
safety: during safety checking of int main() safe
  borrow checking: iterator.cxx:10:11
        mut vec.push_back(x);
            ^
  mutable borrow of vec between its shared borrow and its use
  loan created at iterator.cxx:7:15
    for(int x : vec) {

Чтение за пределами обычных массивов также станет невозможным:

#feature on safety
#include <cstdint>

int main() safe {
  int array[4] { 1, 2, 3, 4 };
  size_t index = 10;

  // Panic on out-of-bounds array subscript.
  int x = array[index];
}

Результат:

$ circle subscript_array.cxx
$ ./subscript_array
subscript_array.cxx:9:17
int main() safe
subscript is out-of-range of type int[4]
Aborted (core dumped)

Таким образом, сишники и плюсисты наконец научатся писать нормальный код, который не падает с сегфолтами и не портит стэк. Так заживём!

Ссылка: https://safecpp.org/draft.html

 , , ,

hateyoufeel
()

Mesa 24.2 с новой реализацией кэша шейдеров

Новости — Hardware and Drivers
Mesa 24.2 с новой реализацией кэша шейдеров
Группа Hardware and Drivers

Увидело свет второе мажорное обновление в 24-й ветке Mesa — графического стека для систем, основанных на Linux.

( читать дальше... )

>>> Подробности

 , , ,

CrX
()