Ычан: [d | au / b / bro / hr / l / m / mu / o / s / tran / tu / tv / vg / x | a / aa / c / fi / jp / rm / tan / to / vn]
[Назад] [Вся нить] [Первые 100 сообщений] [Последние 50 сообщений]
Ответ в нить
Имя
Animapcha image [@] [?]
Тема   ( ответ в 25965)
Сообщение flower
Файл 
Пароль  (для удаления файлов и сообщений)
Параметры   
  • Прежде чем постить, ознакомьтесь с правилами.
  • Поддерживаются файлы типов 7Z, BZ, BZ2, GIF, GZ, JPG, MO, MP3, MP4, OGG, OGV, PDF, PNG, PSD, RAR, SVG, SWF, TXT, WEBM, WEBP, XCF, ZIP размером до 5120 кБ.
  • Ныне 3638 unique user posts. Посмотреть каталог
  • Предельное количество бампов нити: 500
junior_developer_nene.png - (648.30KB, 720×720)
25965
No. 25965  
Здесь можно получить помощь и консультацию по любому языку программирования, в любой сфере разработки. Не важно, программируете ли вы собственного робота, пишете серверную приблуду, интегрируете чужие API, ковыряете игру, или пытаетесь сделать сайт на Wordpress - если аноним что-то об этом знает, он обязательно поможет.

Пополняемая база знаний: http://pastebin.com/AGhLZppH

Не знаете, какой язык и библиотеки взять для вашей задачи? Вам сюда.
Не знаете, где клиент, а где сервер? Вам сюда.
Не понимаете, что такое ООП? Вам сюда.
Написали код, и не понимаете, почему не работает? Вам сюда.
Обнаружили кусок кода, и не понимаете, как оно вообще могло работать? Вам тоже сюда.
Не знаете, как подступиться к проблеме? Вам обязательно сюда.

Другие тематические нити (иногда обновляется): https://pastebin.com/psy43ibG

Примеры кода лучше выкладывать в виде ссылок на http://pastebin.com или http://ideone.com
Фронтендные вещи лучше выкладывать на http://jsfiddle.net

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

Чтобы не сбивать новичков с толку, а также не разбавлять полезную информацию мусором, беспредметные споры типа "какой язык / парадигма / библиотека / етц лучше" здесь запрещены. Для подобных вещей теперь есть отдельная диспутов нить >>/dev/21353

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

Архив нитей:
http://410chan.org/dev/arch/res/14160.html
http://410chan.org/dev/arch/res/15681.html
http://410chan.org/dev/arch/res/17424.html
http://410chan.org/dev/arch/res/19666.html
http://410chan.org/dev/arch/res/21641.html
http://410chan.org/dev/arch/res/23830.html

Прошлая нить пока тонет тут: >>/dev/23830
No. 25966  
>>25965
В процессе систематизация прошлой нити для пополнения базы знаний.
No. 25968  
>>25965
Из прошлой пока собралось вот такое:

>REPL и их подобия без регистрации и смс
>>/dev/23844

>Помогите, директивы mod_rewrite не наследуются на уровне <Directory> виртуалхоста!
>>/dev/23886

>Как выбрать между обобщенной и специфичной реализацией?
>>/dev/23911

>Форматируем код онлайн
>>/dev/23935

>Как засендбоксить скрипт на странице через iframe?
>>/dev/23949
>>/dev/23950
>>/dev/23955

>Я начинающий программист, как сделать чтобы взяли на работу джуниором? (2020)
>>/dev/23977
>>/dev/23980

>А как попасть на собеседование? (2020)
>>/dev/23982

>Особенный способ получить вечный бан на Upwork (2020)
>>/dev/23999

>Введение в модульную архитектуру приложений
>>/dev/24255

>Посоветуйте хорошую книгу по Python
>>/dev/24261
>>/dev/24263
>>/dev/24916

>Посоветуйте учебники по Python с задачами
>>/dev/24302

>Поясните за NodeJS, Angular, и вот это все
>>/dev/24381
>>/dev/24384

>Как управлять зависимостями в Go?
>>/dev/24461

>Помогите подавить вывод ошибок при загрузке DLL через LoadLibrary (Win32)
>>/dev/24465

>Существует ли плагин на WordPress который позволяет преобразовать PDF в форму?
>>/dev/24586

>Играемся с нейросетями в COLAB
>>/dev/24670

>Гайды по консольным языкам
>>/dev/24673

>Хочу пересобрать готовый .exe файл под конкретные инструкции процессора
>>/dev/24953
>>/dev/24955

>Как парсить сайты с JS и динамическим контентом?
>>/dev/24982
>>/dev/24987

>Как спроектировать мобильное приложение по канонам ООП?
>>/dev/25051

>Помогите понять разницу между поверхностным и глубоким копированием в Python
>>/dev/25082

>Особенность оптимизации литералов в Python
>>/dev/25086

>Хочу гайды по Boost.Graph
>>/dev/25165

>Как в Python отличить ввод/вывод из файла от stdin/stdout?
>>/dev/25189

>Как в Python использовать одно локальное окружение везде, где оно нужно?
>>/dev/25318

>Рекламируем игровой движок Godot
>>/dev/25353
>>/dev/25393

>Роадмапы для разработчиков, настоящих, прошлых и будущих
https://roadmap.sh/roadmaps

>Бесплатные видео-курсы всем и каждому, чтоб никто не ушел обиженный
https://www.youtube.com/c/Freecodecamp/videos

>Гайды по кластерному анализу и дата-майнингу в целом
>>/dev/25708

>Как быстро изучить Python для пользования openCV?
>>/dev/25719

>Помогите понять разницу между прикладным и аналитическим созданием алгоритма
>>/dev/25720

>Как в LaTeX / XeLaTex сделать греческий алфавит шрифтом Times New Roman?
>>/dev/25863

>Стоит ли будущему специалисту делать упор на функциональные языки программирования? (2021)
>>/dev/25878

>Что нужно уметь, чтобы парсить сайты?
>>/dev/25905

>Как примерно хранятся пользовательские ресурсы и тексты на форумах?
>>/dev/25962
>>/dev/25963
No. 25970  
Umaru-chan 061.png - (1.67MB, 1920×1080)
25970
С новым тредом! Вы молодцы.

А как на форумах обычно организуют защиту паролей и записей в базе данных? Ведь злоумышленнику достаточно получить доступ к записи модератора или администратора, чтобы редактировать/удалять записи других пользователей и их посты, простые хеши с соленьями теряют смыл. Для важных записей наверное делается какое-нибудь отдельное шифрование?
No. 25971  
>>25970
>Ведь злоумышленнику достаточно получить доступ к записи модератора или администратора, чтобы редактировать/удалять записи других пользователей и их посты
Да. А ещё, если у тебя доступ к руту, то ты можешь делать что угодно в системе.
No. 25972  
>>25971
Лучше промолчать если у тебя там ничего кроме эмоций.
No. 25973  
>>25970
В общем и целом форумы достаточно примитивны в плане кибербезопасности, отчасти именно поэтому они часто становятся целью для угона аккаунтов.

Аккаунты на форумах обычно лежат в отдельной табличке основной базы данных.
Хотя безопаснее было бы хранить в отдельной базе, желательно так чтобы сам форум не подключался к ней напрямую, т.е. работать через внутренний сервис для аутентификации.

>Как на форумах обычно организуют защиту паролей и записей в базе данных?
Защита паролей на форумах обычно достигается хранением исключительно хеша от иногда посоленного пароля в колонке пароль. Сама соль, естественно, не должна лежать в базе данных. Еще соли лучше бы быть подлиннее.

По задумке, это должно защитить от ситуации когда у форума крадут бэкап базы данных и потом подбирают пароли к хешам. Но вычислительных мощностей сейчас хоть отбавляй, и даже длинные соления не всегда спасают. Чтобы усложнить задачу злоумышленнику, администраторы настраивают шифрование БД и бэкапов, называется это в общем случае Data at Rest Encryption.

>защиту записей в базе данных
Под записями, ты имеешь в виду данные учетных записей? Логины, и прочее?
Если да, то обычно форумы таким не заморачиваются, потому что не хранят много данных.
Это могло измениться с приходом GDPR, если здесь кто в курсе, подскажите пожалуйста.

>для важных записей наверное делается какое-нибудь отдельное шифрование?
Обычно форумы таким не заморачиваются.
Но самое простое что можно сделать - настроить таким пользователям аутентификацию по данным из операционки, а не по данным из БД самого форума, если движок форума и хостинг это позволяют. Но это само по себе может сделать сервер более уязвимым.

>Злоумышленнику достаточно получить доступ к записи модератора или администратора, чтобы редактировать/удалять записи других пользователей и их посты
То о чем ты говоришь, на самом деле широко обсуждаемая в среде кибербезопасности проблема - как знать, что админ действительно ваш админ, и как знать что у пользователя Х действительно должны быть админские права, которые он получил. Пока ничего лучше мониторинга событий типа админ вдруг залогинился не оттуда, откуда раньше и пользователь вдруг стал админом не придумали. Еще стараются уменьшать возможный ущерб - делать мягкое удаление, хранить версии при редактировании, и т.д.

Надеюсь, смог хотя бы чуть-чуть прояснить ситуацию.
No. 25974  
>>25973
В догонку допишу, что двухфакторная аутентификация по задумке снижает риск успешного использования угнанного аккаунта, но это и отдельная банка червей, и опять же, мало кто пользуется ей на форумах.
No. 25975  
>>25972
Примните свой совет к себе лично. А никаких магических второстепенных защит, когда хакер уже в системе, нет. См >>25973
No. 25976  
KonoSuba 028.png - (2.07MB, 1920×1080)
25976
>>25973
>>25974
Спасибо за такой развёрнутый обзор. Тема безопасности это такая интересная кроличья нора. Но простому рабочему программисту ведь достаточно иметь общие представления? Дизайном таких систем наверное должен отдельный специалист с образованием заниматься.
No. 25977  
>>25976
И да и нет. По-хорошему, безопасник должен быть и регулярно проводить аудит систем. На практике, это твоя задача понимать, какие данные обрабатывает система, кто может получить к ним доступ, не использовать мд5 и слать людей как минимум к юристам когда они захотят хранить в БД имя фамилию человеков. Да и разница между вами наверстывается за полгода чтения литературы на старте.
No. 25978  
>>25976
>Но простому рабочему программисту ведь достаточно иметь общие представления? Дизайном таких систем наверное должен отдельный специалист с образованием заниматься.
В целом солидарен с >>25977
Не всегда есть человек на которого можно это сгрузить / положиться.
Особенно остро проблема стоит в стартапах, где данные уже хранят, а никакого безопасника пока в планах нет. Поэтому важно иметь достаточно знаний просто чтобы не наделать глупостей и заведомо уязвимых мест, а где надо - настоять на введении элементарных мер безопасности и защиты информации. Да, формально это не твоя ответственность, и не твоя головная боль, но если ваш софт работает с чувствительной информацией или не дай бог с деньгами, лучше не ждать пока вы окажетесь в центре крупного скандала и начнут искать крайних, лучше или внедрить самостоятельно, или поднять вопрос повыше / отправить людей к юристам.

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

>Да и разница между вами наверстывается за полгода чтения литературы на старте.
Более того, есть возможность самому стать специалистом в этой сфере с фактическим опытом работы. Что позволит продолжить карьеру в этом ключе, если тебе будет интересно.

>Спасибо за такой развёрнутый обзор.
Рад, что смогли помочь, заходи если что.
No. 25982  
Umaru-chan 037.png - (1.81MB, 1920×1080)
25982
>>25977
>>25978
Интересности!
No. 26007  
k-on! 163.png - (1.19MB, 1920×1080)
26007
А объясните, почему так редко можно использовать пробелы в именах и паролях, кому так мешает жить 00100000? Зачем другие символы исключают? Вроде же нет разницы из чего состоит последовательность бит.
No. 26008  
xkcd_exploits_of_a_mom.png - (31.16KB, 666×205)
26008
>>26007
>Зачем пробелы и другие символы исключают?
Одна из причин - санитайзинг вводимых данных "на всякий случай".
Например, чтобы не переживать как обработаются или закодируются сервером символы отсутствующие в стандартной ASCII таблице. Еще исключают символы, которыми можно воспользоваться, чтобы превратить ввод в исполняемую команду, вызвать переполнение, или воспользоваться другой уязвимостью, или просто вызвать ошибку в неграмотном коде. Это всё, естественно, полумеры которые не должны заменять грамотной работы с вводимыми данными.

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

>Вроде же нет разницы из чего состоит последовательность бит
До того как данные станут последовательностью бит, они пройдут много мест в коде и запросов к БД. Именно в надежде избежать проблем в этих местах используют такую меру предосторожности.

Пикрелейтед иллюстрирует.
No. 26009  
>>26008
Блин, я подумал что это из-за каких-то технических проблем, или остатки древности может быть. Я так хорошо запомнил правило, что никакому вводу нельзя доверять, и не подумал что кто-то может просто ограничивать ввод вместо проверки.

Вижу что фреймворки делают чистку чуть ли не автоматически, или тыкают носом в нужные функции и библиотеки.
No. 26017  
Булочки, извините если политика безопасности банка не пускает на 410chan.ru, теперь буду только очень иногда заходить через 410chan.org что бы и его не забанило. Сумимасен!!
No. 26039  
>>26017
А сейчас разбанили.
No. 26042  
Есть задача сделать сайт-каталог по типу World-art'а. Ну или MAL'а на минималочках.

То есть, т.з. примерно следующего плана:
  • в первую очередь нужно "красиво" во фронтэнде выводить данные из БД, с возможностью поиска/сортировки по полям БД;
  • нужна регистрация пользователей. Пользователи могут добавлять публичные комментарии и добавлять записи БД себе в избранное;
  • важное замечание: редактировать или создавать новые записи в БД пользователи не могут, это прерогатива администратора сайта, т.е. меня. Личных сообщений тоже не предполагается;
  • опционально для зарегистрированных пользователей в дальнейшем можно прикрутить простейший публичный форум, но это задача с наименьшим приоритетом;
  • нужны обязательно кукисы, т.к. сайт предполагается мультиязычным (eng/рус) - нужно хранить хотя бы языковые настройки.
БД сама по себе небольшая, меньше 1000 записей. Наполнять БД я могу хоть через phpmyadmin или импортом CVS, для этого мне фронтэнд особо не нужен (т.е. иметь его хорошо, но не обязательно).

Собственно, вопрос: подскажите стек актуальных технологий для решения задачи (языки/фреймворки). С учётом того, что что бы вы не назвали, я буду изучать это с нуля (или почти с нуля).

p.s. готовых CMS, по крайней мере со свободными лицензиями, для этих целей не нашёл, но если таковые имеются, то подскажите.

Заранее домо аригатоу.
No. 26043  
>>26042
Clojure
ClojureScript
No. 26044  
>>26042
Раз уж у тебя есть БД, то логично было бы и пользовательские данные с комментариями хранить в той же самой БД (хоть это и нарушает пункт про то что пользователи не могут редактировать БД)

>стек актуальных технологий
Актуальные технологии в смысле не тухлые или в смысле требуемые на рынке?

алсо https://learnbchs.org/
No. 26045  
>>26044
>https://learnbchs.org/
Evil as is.
No. 26046  
>>26044
> Раз уж у тебя есть БД, то логично было бы и пользовательские данные с комментариями хранить в той же самой БД
Да, это понятно. Про редактирование я немного не то имел в виду. Я имел в виду, что пользователи не могут редактировать/изменять основной контент сайта.

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

В связи с этим, разумеется, всякая экзотика вроде >>26043 мне не кажется хорошим выбором. Мне нужно что-то прямо очень распространённое ультра-популярное, вроде Python/Node.js/Ruby on Rails. Потому что по этим инструментам давно есть все гайды, есть сообщество, где можно спросить совета, etc. Но я не могу выбрать что-то конкретное исходя из своих задач. Понятное дело, что лучшей стратегией было бы попробовать каждый вариант, и затем уже решить, с каким больше всего понравилось работать. Но это потребует много времени и усилий в пустоту (без видимого результата).
No. 26047  
>>26046
Пишу тут я помогу на кложе.
No. 26053  
Подскажите как принять инпут пользователя в Жабаскрипте. Знаю что есть prompt(), но он только для браузеров, а мне нужно все сделать через терминал VSCODE.
No. 26056  
>>26053
Ты делаешь с использованием Node.js? Если да, то:

1. Переключи console указанную в launch.json на integratedTerminal, как советуют тут:
https://stackoverflow.com/a/66850526

2. Подключи модуль readline:
https://nodejs.org/api/readline.html

3. Воспользуйся модулем как-то так:
>const readline = require('readline');
>const { stdin: input, stdout: output } = require('process');

>const rl = readline.createInterface({ input, output });

>rl.question('What do you think of Node.js? ', (answer) => {
> // TODO: Log the answer in a database
> console.log('Thank you for your valuable feedback: ' + answer);

> rl.close();
>});

Должно сработать.
No. 26060  
image_2022-03-27_21-30-16.png - (149.36KB, 757×863)
26060
Вскрыл новеллку от Nitro+, файлы с кодом имеют расширение .nss, при открытии их через VS получается пикрил, комменты и определенные фрагменты кода заменились кракозябрами.
Посоветуйте, что сделать/скачать, чтобы можно было спокойно и без лишних проблем просматривать код в этих файлах.
No. 26063  
1648013947045.jpg - (220.28KB, 960×720)
26063
>>26060
Тот файл в кодировке euc-jp, скорее всего. Если редактор поддерживает работу с файлами в ней, укажи использование именно этой кодировки. Если нет, сконвертируй файлы в utf-8.
No. 26065  
>>26063
Спасибо за наводку в нужное русло. Кодировка Shift-JIS.
Хочется убивать за переменные на японском.
No. 26074  
>>26065
Когда имеешь дело с японским кодом, названия переменных в Shift-JIS — меньшая из проблем. Индусы по сравнению с ними — гении от программирования.
Вполне можно ожидать чего-то такого:

if(a == 1) return 2;
if(a == 2) return 3;
if(a == 3) return 4;
if(a == 4) return 5;
... и так далее 100500 раз.

А return а+1 — это позорное гайдзинкое читерство, свидетельствующее о том, что гайдзины не способны проявить настоящее усердие!
No. 26077  
А у меня порнография с немецкими комментариями.

Может кто-то знает готовую C++ библиотеку для работы с устаревшими .doc файлами? А то я уже готов хищнически вырвать ее из кода опенофиса.
No. 26079  
>>26065
>>26074
>Shift-JIS
Палю годноту:
https://github.com/vickyorlo/SHIFTJIS-B-Gone
No. 26081  
>>26077
Пропатченная (так как upstream проект с SourceForge давно заброшен) wv2 https://sources.debian.org/src/calligra/1:3.2.1 dfsg-5/filters/words/msword-odf/wv2/, используемая в Calligra Suite, не подойдёт? Ещё есть чисто сишная libwv из AbiWord.
No. 26083  
>>26081
> wv2, используемая в Calligra Suite
Бро, благодарю, это самое то.
No. 26085  
Привет, Стивы.
На работе стал довольно часто попадаться Питон, поэтому надо бы его выучить в дополнение к основному языку. Посоветуйте хорошую книгу по нему. Желательно, чтобы ее можно было купить в бумажном виде, у меня книги плохо получается с экрана читать.
No. 26091  
>>26085
Из бумажных книг что советовали в прошлой нити
>Посоветуйте хорошую книгу по Python

Думаю стоит начать с
>Билл Любанович
>Простой Python. Современный стиль программирования
>>/dev/24916
https://books.google.com/books?id=9dW8DwAAQBAJ&lpg=PP1&dq=inauthor:"Bill Lubanovic"&pg=PP1#v=onepage&q&f=false

Или с Лутца
>Марк Лутц
>Изучаем Python, том 1
>>/dev/24263
https://books.google.com/books?id=4pgQfXQvekcC&lpg=PA1&dq=inauthor:"Mark Lutz"&pg=PA1#v=onepage&q&f=false

c:python
No. 26092  
>>26091
Спасибо.
No. 26093  
>>26092
Надеюсь, подойдут. Заходи, если что.
No. 26096  
Стив, посоветуй бумажных книг по юнит-тестированию для самых маленьких. Я ими никогда не занимался, ничего о них не знаю, приходится на работе отказываться от связанных с ними задач. Надо устранить недостаток.
No. 26097  
По Питону вообще надо нам анонимные контесты с конкурсами устраивать и обсуждать. Если три человека будут писать - уже будет весело. Все это от лица комьюнити "разработка 410", разумеется.
No. 26099  
>>26096
>книг по юнит-тестированию
Ты тот же аноним, что в >>26085 просил книг по Питону? Тогда может:

>Гарри Персиваль
>Python. Разработка на основе тестирования
https://books.google.com/books?id=2CgvDwAAQBAJ&lpg=PP1&pg=PP1#v=onepage&q&f=false

Книга про Test Driven Development и проходится по тому как все поднимается, настраивается, пишется и запускается. Что по идее как раз то что ты хочешь в плане тестов. Или тебе надо что-то более академичное?

опять c:python лул
No. 26102  
>>25973
> Сама соль, естественно, не должна лежать в базе данных.
Простите, а где она должна лежать?
No. 26103  
>>26102
Проясним параноидальность.

Пароли солят, чтобы украденная база с хешами этих паролей была бесполезна для подбора паролей к хешам.

Но разработчики применяют очевидные хеш-функции и очевидные методы соления.
А возможности перебирать сильно возросли с ростом вычислительных мощностей.

Представим, что пароли посолили очевидно, по туториалу, SHA256, 1 раз, от пароля + соли в конце. Тогда если соль находится прямо в соседней колонке в БД, польза от ее применения под большим вопросом, если не нивелируется вообще. Потому что такой алгоритм будет одним из первых который попробует злоумышленник.

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

Если система с открытым или доступным исходным кодом, злоумышленник может получить алгоритм соления прямиком из исходника, понадеявшись что эту часть никто не менял. Например, в >>25973 обсуждаются форумы, их движки обычно используют готовыми, код их доступен всем, и заморачиваться форком и сменой алгоритма хеширования действительно мало кто станет.

Для систем с закрытым кодом подобная информация может быть получена от инсайдеров.

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

Как-то так.
No. 26104  
maxresdefault.jpg - (157.17KB, 1280×720)
26104
Жив ли Delphi? Вопрос, как ни странно , серьезный. Возможно ли без профильного в/о устроиться в какую-либо контору? Может быть есть фриланс варианты какие-то? Интересно.
No. 26106  
>>26099
Да, я тот анон.
Спасибо за совет. А есть что-то аналогичное для плюсов?
No. 26108  
>>26106
>А есть книга по юнит-тестированию для плюсов?
Тут бы знать, какие тестовые фреймворки в ходу у плюсов.
Например, вижу книгу нужного тебе содержания (кажется, издавалась только на английском):

>Джефф Лангр
>Modern C++ Programming with Test-Driven Development
https://books.google.com.ua/books?id=GA9QDwAAQBAJ&lpg=PA1&pg=PA1#v=onepage&q&f=false

Но тут всё строится на базе Google Test + Google Mock.
А я не знаю, насколько они широко распространены в плюсовом сообществе.

Подозреваю, ты её уже видел сам, скажи подходит или нет.
No. 26110  
>>26108
> Google Test + Google Mock
> А я не знаю, насколько они широко распространены в плюсовом сообществе

Очень распространены, считаются нормой.
No. 26113  
Учу питон. Начал читать про flask. В книжке на каждом этапе в примерах новые сторонние библиотеки. В итоге к концу книги будет овер 900 зависимостей от кучи библиотек. Так и должно быть или лучше сменить книжку?
No. 26114  
>>26113
Не знаю на счёт книжки, но вообще для питона это нормально.
No. 26115  
>>26113
А что за книга?
No. 26116  
>>26115
No. 26121  
Привет, Стив. Решаю простенькие задачки и встретился с некоторыми, которые не могу решить.
Вот такая, например.
Непонятно, что желает эта функция. Нужно найти, какие в ней дефекты и как ее можно улучшить.
https://onlinegdb.com/EWoRTQ9rI - онлайн-компилатор с этой функцией

int myfunc(int* a)
{
    int x = 0;
    for (size_t i = 0; i < MASS_SIZE; i++)
    {
        for (size_t j = i; j < MASS_SIZE; j++)
        {
            if (a[j] != a[i])
            {
                if (j - i > x)
                {
                    x = j - i;
                }
                i = j - 1;
                break;
            }
        }
    }
    return x;
}

No. 26123  
>>26121
Еще вот такая задача. Надо написать функцию, которая принимает массив строк, и возвращает массив, в котором из исходного массива удалены все строки, которые встречаются четное число раз. При этом, функция должна быть оптимизирована по скорости работы.
У меня получилось такое - https://www.onlinegdb.com/TWTCxMZCi . Непонятно, оптимально ли это? Если нет, как оптимизировать?
std::vector<std::string> remove_even_strings(std::vector<std::string> & ref)

{
    std::vector<std::string> result;
    std::map<std::string, size_t> srch;
    
    for (auto & r : ref)
    {
        auto t = srch.insert(std::make_pair(r, 1));
        if (t.second == false)
        {
            srch.at(r) = srch.at(r) + 1;
        }
    }
    
    for (auto & r : ref)
    {
        if (srch.at(r) % 2 == 1)
        {
            result.push_back(r);
        }
    }
    
    return result;
}

No. 26124  
>>26121
Было бы хорошо в pastebin всё это. и ссылку дать.
No. 26125  
>>26124
А зачем Пастребин, если есть ссылки на онлайн-компилятор?
No. 26126  
>>26123
Строки с 49 по 53 можно заменить простым ++srch[r]; Это ускорит тебя в два раза.
No. 26128  
>>26125
Да лишь бы не прямо сюда.
No. 26129  
>>26126
Не понял. Как это должно работать? Как можно сделать инкремент по индексу, если элемент с этим индексом еще не создан?
No. 26130  
Есть у кого на примете курсы или тренинги по сетям и по многопоточке? Желательно на плюсах. По многопоточке я нашел вот это https://stepik.org/course/149/syllabus Но это очень сложный курс, хотелось бы чего попроще.
No. 26131  
>>26129
Существуют два метода для получения значения по ключу: .at() и оператор [].

Метод .at() константный и в случае отсутствия нужного элемента кидает исключение.

Оператор [] неконстантный, при отсутствии необходимого элемента он создает сам с дефолтным значением - в нашем случае с нулем.
No. 26133  
>>26131
> Метод .at() константный
Может использоваться как константный - при вызове у константной мапы он возвращает константную ссылку на значение, при вызове у неконстантной - неконстантную.

В противоположность ему оператор [] может вызываться только у неконстантной мапы, а при работе с константной создает ошибку на этапе компиляции.
No. 26134  
>>26131
> Оператор [] неконстантный, при отсутствии необходимого элемента он создает сам с дефолтным значением - в нашем случае с нулем.
Интересная особенность, не знал о ней. Спасибо, буду теперь этим пользоваться.
No. 26135  
>>26103
Можно ссылки на источники, в которых можно об этом всем почитать? Про бесполезность соления известным алгоритмом из соседней колонки и про использование отдельного сервера особенно интересно.
No. 26138  
>>26130
>Есть у кого на примете курсы или тренинги по сетям и по многопоточке? Желательно на плюсах.
Вот тут одновременно и сети, и многопоточка, и на плюсах, на примере сервера и клиента для MMO, с доступными рабочими примерами по ссылкам из описания.

>Часть 1
https://www.youtube.com/watch?v=2hNdkYInj4g
>Часть 2
https://www.youtube.com/watch?v=UbjxGvrDrbw
>Часть 3
https://www.youtube.com/watch?v=hHowZ3bWsio
>Часть 4
https://www.youtube.com/watch?v=f_1lt9pfaEo

Скажи, насколько это сложнее / проще чем бы тебе хотелось.
No. 26139  
1495071594281.png - (652.42KB, 660×888)
26139
Привет, Чио–чан!

Как сделать так, чтобы в программке на C++ время было не в секундах от сотворения Unix, а в более человекочитаемом формате? Чтобы пользователь его мог вводить, а потом оно так же выводилось. А если сделать тупо строкой, то сортировка не будет работать же.

Вот мой код: https://files.catbox.moe/ysw18s.cpp
No. 26141  
>>26139
Весь ввод на самом деле является набором символов, просто для числовых переменных у оператора >> реализовано преобразование в нужный тип под капотом.
Соответственно, для даты/времени нужно преобразовать ввод в нужный формат вручную (опционально реализовав перегрузку operator<< для используемого типа).
При выводе пользователю естественно придется преобразовывать все обратно.

Судя по всему функция, которая парсит поток в структуру даты-времени, есть в стандартной библиотеке: https://en.cppreference.com/w/cpp/io/manip/get_time
No. 26144  
>>26141
Спасибо за ответ!

> опционально реализовав перегрузку operator<<
Видимо, мне тут не хватает знаний.

Допустим, пользователь вводит время в формате hh/mm или hh:mm, а далее требуется провести сортировку по времени. Отсюда следует, что логичнее всего время перевести в формат от сотворения Unix, а потом снова в строку. И вот само преобразование типов я немного не понимаю — в том же VBA при сравнении времени можно вообще не париться, ЕМНИП.
No. 26145  
Хотя, наверное, в случае времени можно попробовать сначала посимвольно считывать строку и, исходя из этого, прибавлять что-то к переменной времени, где один час будет равен 3600 секундам. Аналогичным образом потом из времени сделать строку. Наверное, это будет несколько циклов и куча условий.

Только данные, наверное, лучше вводить не в строку, а в массив символов? Вроде так проще будет.
No. 26146  
>>26144
Если честно, не очень понял, в чем проблема. Хранишь у себя время в виде числа, преобразуешь в строку/из строки при выводе/вводе. Пользуешься готовой библиотекой как указал >>26141 по ссылке. Там даже с примерами.
No. 26148  
>>26146
> Там даже с примерами.
Тяжелочитаемо, из-за всяких std::

И почему, кстати, в примерах не используется using namespace std?
No. 26151  
>>25965
Одна дѣвочка ставить ; после закрытия фигурных скобок в C++. Правильно или гладить кота?
No. 26152  
>>26151
Есть случаи, когда точка с запятой после фигурной скобки необходима - например, при определении класса или структуры. Без нее код не скомпилируется. В других случаях гладь кота.
No. 26153  
>>26148
Есть мнение, что using namespace нельзя использовать в заголовочных файлах из-за возможных конфликтов. В .cpp файлах такая проблема стоит не так остро, но я все равно не видел таких примеров в работе.

Зато часто используют что-то такое:

using DocumentId = std::int32_t;
No. 26154  
Привет, Стив.
Есть такая задача, не знаю, как к ней подступиться.
На вход подается очень большой текстовый файл, в котором на каждой строке по слову. Надо найти в этом файле 10 наиболее часто встречающихся слов. Загвоздка в том, что надо при этом использовать не более 1 Кб памяти, то есть, не получится хранить массив всех слов со счетчиком сколько раз одни встретились. Есть у этой задачи какое-то решение, кроме как использовать еще один файл как буфер или внешнее хранилище данных? Писать надо на Си, без плюсов, но это не особо важно, мне именно алгоритмически непонятно как решать.
No. 26155  
>>26154 Если честно, странное начальное условие
использовать не более 1 Кб памяти
, это 8-битный embedded? Сейчас более-менее стандартный bootstrap будет больше 1кб.

Если здесь все таки ошибка, и памяти немного побольше, то уже наверно проще будет предложить варианты.
No. 26156  
>>26155
Да, почти так и есть. Ошибки никакой нет, 1 КБ памяти. Если собирать голым gcc без сторонних библиотек, то должно вместиться.
При чем тут bootstrap? Это не под веб разработка.
No. 26157  
>>26156
P.S. Возможно, стоит начать с вариантов, которые в принципе не потребляют много памяти, а потом попытаться их оптимизировать.
И, да, нельзя использовать сторонние библиотеки. Только стандартная, только хардкор.
No. 26158  
>>26152
Понял, спасибо. Наверное, лучше тогда ставить их везде при закрытии фигурных скобочек — компилятор пропускает же. На читаемость кода это вроде особо не влияет.

>>26153
Понял, спасибо.

P.S.

Могу читать ранобэ в анлейте, но если зайти на какой–нибудь англоязычный программерский форум, то становится тяжело. Хотя та же справка по Python'у читается легко. Почему так?
No. 26159  
space_saving_frq_algorithm.png - (14.90KB, 284×273)
26159
>>26154
>Есть у этой задачи какое-то решение, кроме как использовать еще один файл как буфер или внешнее хранилище данных? Писать надо на Си, без плюсов, но это не особо важно, мне именно алгоритмически непонятно как решать.

Да, есть. Это на самом деле очень популярная задача, и для неё периодически предлагают новые алгоритмы. Вот в этой статье рассматривают все основные алгоритмы, которые можно для этого использовать:
http://dimacs.rutgers.edu/~graham/pubs/papers/freqcacm.pdf

Для алгоритмов указаны формулы сложности как по времени, так и по памяти, так что по идее ты сможешь выбрать тот который подойдет под ограничение в 1 кб. Также указана максимальная погрешность алгоритмов в подсчетах.

>Не знаю, как к ней подступиться.
Лично я бы представлял эту задачу как подсчет слов в бесконечном потоке, где заведомо не хватит ни памяти, ни диска, и воспользовался бы алгоритмом 3, Space Saving пикрелейтед. Если в двух словах, там тебе надо иметь буфер на k слов, и когда он заполнится - начать вытеснять из него самые редкие слова.

Скажи, получится ли разобраться и правильно ли я понял проблему.
No. 26160  
>>26159
Да, это именно то, что нужно. Обязательно почитаю статью в ближайшем времени, когда освобожусь немного.
>погрешность
Там вероятностные алгоритмы что ли?
No. 26161  
>>26160
Среди прочего есть и вероятностные, если я тем местом читал. Но вообще там погрешность по идее есть у всех алгоритмов, которые не сохраняют все данные.
No. 26162  
Яхалло, стотт читать "искусство программирования" Кнута?
No. 26163  
Чии, насколько хорошо можно жить в какой–нибудь стране и работать в сфере IT, не зная местного языка, только английский? Тем более, что айтишники просто обязаны знать английский — это как немецкий для шахтёров XIX-го века.
No. 26164  
>>26163
Я в Израиле так 4 года жил.
No. 26165  
>>26164
Но в Израиль вроде сложно переехать, если не еврей.
No. 26167  
А поясните, как работает сишный fgets. В спецификации сказано, что он считывает строку или num-1 символов. Но нигде не написано, что он он делает, если num-1 меньше длины строки. Допустим, в файле строки по 60 символов. Мы говорим считать 50 символов. Следующий вызов будет работать уже с новой строки или с 51 символа?
No. 26169  
>>26167
Следующий вызов будет с 51 символа, в твоём примере.
Раз ничего не написано про оставшиеся символы в строке, то он ничего с ними и не делает.

Можешь написать простенькую программку да проверить самостоятельно, так-то (или даже исходники почитать)

А вообще сишные волшебники вроде бы рекоменуют не пользоваться всеми этими fgets'ами, а оперировать fread/fwrite и выковыривать потом строки из буфера самостоятельно.
No. 26170  
Привет, Стив.
Я хочу стать разработчиком компиляторов. Не просто потому, что за это много платят, а потому, что мне хочется быть достаочно редким и востребованным узким специалистом.
Тем не менее я открыл вакансии связанные с разработкой компиляторов и в большинстве случаев там обязательно указан бэкенд компиляторов LLVM.
С сайта llvm.org можно узнать[1], что llvm написан на С++ с STL.
Откуда вопрос: надо ли знать C++ для того, чтобы заниматься разработкой компиляторов (как любительски, так и профессионально) ?
Второй вопрос: нужно ли специальное образование для того, чтобы этим заниматься ?
Спрашиваю скорее про магистратуру, потому что бакалавриат на специальности инженер по радиоэлектронике мне ещё предстоит окончить.

[1]: https://llvm.org/docs/FAQ.html#in-what-language-is-llvm-written

>>26167
У меня работает со следующего символа, а не с новой строки. Код[2], файл[3], вывод:
12222222222
OpenBSD 7.0 , clang 11.1.0
[2]: https://termbin.com/8o0w
[3]: https://termbin.com/xv3v
No. 26171  
>>26154
Если нужно точное решение в крайних случая (все кроме одного слова разные) и соответственно варианты из >>26159 не подходят, можно делать много проходов по файлу, считая за каждый проход количество только для одного/нескольких слов и обновляя после каждого прохода список самых частых.
No. 26173  
>>26170
за это много платят?
No. 26174  
>>26170
парой параграфов ниже в llvm FAQ'е пишут:
>https://llvm.org/docs/FAQ.html#i-d-like-to-write-a-self-hosting-llvm-compiler-how-should-i-interface-with-the-llvm-middle-end-optimizers-and-back-end
-code-generators
>1. Call into the LLVM libraries code using your language’s FFI (foreign function interface).
>2. Emit LLVM assembly from your compiler’s native language.
>3. Emit LLVM bitcode from your compiler’s native language.

Т.е. для пользования LLVM знать C++ не обязательно. Менее известный компилерный бэкенд QBE работает примерно так же. А можно вообще весь тулчейн самому написать с нуля на коленке (golang вроде бы так делают).

Но раз уж ты собрался писать компиляторы, то наверное надо бы знать не только C++, но и вообще как можно больше всего представленного в мире языков программирования, хотя бы поверхностно.
No. 26175  
>>26173
Ну, судя по тем вакансиям, которые я видел, да. Но я же уже упомянул, что причина моего интереса не в этом.
No. 26177  
>>26174
Справедливо, спасибо за ответ.
Про QBE слышал. У его автора — mpu, был ещё список литературы для компиляторщиков любителей.
https://c9x.me/compile/bib/
No. 26178  
>>26170
Нужно знать yacc, виртуальные машины и очень, очень много байтоебли.
>нужно ли специальное образование для того, чтобы этим заниматься?
Если ты задаёшь этот вопрос, то тебе да.
No. 26179  
Чии, как я понимаю, указатели в C++ лучше использовать везде, где только можно? Ведь они же память экономят.
No. 26180  
>>26179
Они могут инвалидироваться в самый неожиданный для тебя момент. Указателями и ссылками нужно пользоваться очень внимательно, следить за временем жизни объектов, перестройкой контейнеров и так далее.
No. 26181  
>>26180
Но ведь они всё равно прилично экономят ресурсы компьютера.
No. 26182  
>>26181
Еще посмотри на std::string_view, эта штука позволяет экономить при работе со строками, но подвержена тем же проблемам, что и указатели.
No. 26183  
>>26159
> получится ли разобраться
Нашел для этого алгоритма презентацию с объяснениями для самых маленьких. https://imoumoulidou.github.io/SpaceSaving_Presentation.pdf
Но и с ее помощью я не смог разобраться с одной мелочью, без которой ничего не работает.
В алгоритме есть overestimations, которые как-то используются для того, чтобы счетчики правильно увеличивались. Как это реализовать, я не очень понимаю.
Мои наработки (некорректно работающие) - https://github.com/sltrs1/space_saving_alg_data_stream
No. 26184  
>>26182
Спасибо.
No. 26193  
Пытаюсь написать внешнюю сортировку слиянием.
Вот что получилось - https://github.com/sltrs1/external_merge_sort
Но есть одна проблема. В функции merge после первой итерации перестают читаться файлы.
То есть, на первой итерации
sprintf(file_to_merge1, "%u.txt", num_done);
F1 = fopen(file_to_merge1, "r");
работает и
buf1 = fgets(buf1, max_str_len, F1);
возвращает из файла строку.
fclose(F1);
возвращает 0, то есть, старый файл успешно закрывается.
Но на второй и дальнейших итерациях fgets возвращает NULL. В errno и ferror(F1) - нули.
Причем в конце цикла вызов
remove(file_to_merge1);
отрабатывает успешно и файл удаляется.

Что за магия, где я делаю ошибку?
No. 26194  
>>26193
Мда, ошибка была совсем не там, где я думал.
Оказывается, делать
buf1 = fgets(buf1, max_str_len, F1);
было очень плохой идеей.
No. 26197  
>>26183
>Мои наработки (некорректно работающие)
А насколько некорректно? На первый взгляд ты вроде все правильно делаешь.
У оригинального алгоритма же есть неизбежная погрешность из-за вытеснения данных из буфера и добавления новому слову авансом вхождений от старого слова.

Я даже нашел на гитхабе еще одну реализацию, чтобы посмотреть:
https://github.com/rozap/spacesaving

И оно таким же способом работает, и автор указывает:
>The inaccuracy starts to come into play when an element is kicked out,
>The estimate is the upper bound on the element's actual count.
Там и последнее частое слово может оказаться неправильным, и точного совпадения количества вхождений с реальным не будет.

>Нашел для этого алгоритма презентацию с объяснениями для самых маленьких.
Это скорее чья-то презентация собственного оригинального подхода к, или модификации этого алгоритма, для Apache Storm.

>В алгоритме есть overestimations, которые как-то используются для того, чтобы счетчики правильно увеличивались.
Вот у них в презентации есть пример, поток из 6 элементов, X, Y, Y, Z, Y, Y. Буфер в 2 элемента, и результат в буфере:
>Y: 4 (0)
>Z: 2 (1)
На том этапе что они показывают в этом примере, у них та же ситуация с погрешностью что и у автора выше.
Возможно, они используют overestimations чтобы скорректировать результаты в самом конце?
По их схеме это может происходить где-то внутри компонента FreqItemEstimator. Исходники бы.
No. 26198  
>>26197
>насколько некорректно?
Максимально некорректно. Вместо ответа, который должен быть и лежит в репозитории, получаются рандомные слова со счётчиками в 150к.
No. 26200  
>>26198
А если пошагово дебаггером походить, никаких явных ошибок и аномалий поведения нет? Всё считается как задумано? Вдруг действительно какая-нибудь банальная ошибка в коде, при работе с указателями например
No. 26201  
>>26198
> рандомные слова со счётчиками в 150к
Где-то память перед использованием не обнулил, поди.
No. 26202  
>>26200
Вроде нету.
>>26201
Нет. Это ровно количество слов деленное на количество счетчиков. Если мы на каждой итерации гарантировано делаем инкремент одного счетчика, то ровно это и должно поучиться. Как при этом алгоритм должен работать - непонятно.
No. 26204  
>>26202
А если запустить с буфером в 2 слова на потоке из 12 элементов:
>X, Y, Y, Z, Y, Y, X, Y, Y, Z, Y, Y
Будет результат
>Y: 8
>Z: 4
Или какой-то другой?
No. 26205  
>>26204
Если слов меньше, чем размер буфера, то нормально посчитает.
No. 26206  
>>26205
В смысле, разновидностей слов. Набор первоначального буфера и последующие итерации у меня в реализации разделены.
No. 26207  
>>26206
Предлагается 3 разновидности слова и буфер в 2 слова, просто чтобы сравнить с тем что в презентации.
No. 26208  
>>26207
Мне тоже непонятно. Вот код, на питоне https://pastebin.com/FaBT0WrJ
Выводит Y:8, Z: 4, на данных из задания результат аналогичен >>26198.
Если рассчитать длину словаря, достаточную для получения top10 на данных из задания по формулам из презентации - выходит 33к, но с таким количеством моя реализация не справляется, потому что min() дает суммарную квадратичную сложность.
No. 26214  
Столкнулся с очень странным поведением одного древнего проекта на джаве.
Собственно, это мод к майнкрафту, и мне понадобилось слегка подкорректировать его поведение.

Нашел сорцы (с трудом)https://github.com/Zeno410/UndergroundBiomesConstructs1.7
Скомпилировал (с помощью кувалды и такой-то матери). То, что скомпилировалось — работает нормально.

А дальше начались чудеса. При попытке изменения любого из двух методов класса BiomeUndergroundDecorator с именем replaceChunkOres (и только их, другие места менять можно) всё компилируется, но при генерации мира майн вылетает с сообщением, что этот самый BiomeUndergroundDecorator — java.lang.NoClassDefFoundError, то бишь нету его.

Сами методы вот: https://github.com/Zeno410/UndergroundBiomesConstructs1.7/blob/master/src/exterminatorJeff/undergroundBiomes/worldGen/BiomeUndergroundDecorator.java — строки 218 и 275 (Прямые ссылки на строки слишком длинные, их местная кусаба портит)

Это случается, если, например, добавить туда новую переменную, пусть даже неиспользуемую. Или, скажем, переименовать какой-нибудь из этих методов (я думал, что ему могут их одинаковые имена не нравиться, мало ли...).
Имена существующих переменных оно менять дозволяет, но меня это как-то не радует.

Кто-нибудь сталкивался с похожим поведением java-проектов? Есть идеи, от чего такая чертовщина может происходить?
No. 26223  
>>26214
А можешь закинуть полный стектрейс на pastebin, на всякий случай?
Просто вижу что сам код этого декоратора в нескольких местах ловит java.lang.NoClassDefFoundError в пустой catch. Вдруг ошибка не в том что класса декоратора нет, а просто ты внес какие-то изменения, при которых ее тоже нужно ловить.
No. 26224  
>>26208
Можно воспроизвести проблему и отладить алгоритм на маленькой последовательности, сделав схожее распределение часто встречающихся слов среди мусора. Глядя на то как распределены частые слова в input_words_100k.txt я разбавил тестовый ввод буквами латинского алфавита через одну, с хвостом в конце:
>SEQ = 'AXBYCYDZEYFYGXHYIYKZLYMYNOP'

Встроенный алгоритм не смутился:
>[build_in]
>{'Y': 8, 'X': 2}

Не встроенные алгоритмы сломались:
>[frequent]
>{}
>[space_saving]
>{'O': 13, 'P': 14}
На вид получились те самые рандомные слова с огромными значениями, о которых ты упоминал.
Насколько я могу судить, сами слова не совсем рандомные, а коррелируют с последними K уникальными словами в потоке. В нашем очень простом случае K=2, последние 2 уникальных слова - O и P, они и присутствуют в результатах. Огромные значения на вид - действительно результат добрасывания счетчика без учета overestimations.

Т.к. если просто добавить overestimations рядом, как описано в презентации:
>counters = {}
>overs = {}
>...
>least_frequent_item = min(counters, key=counters.get)
>least_frequent_item_count = counters.pop(least_frequent_item)
>least_frequent_item_over = overs.pop(least_frequent_item, 0)
>
>counters[item] = least_frequent_item_count + 1
>overs[item] = least_frequent_item_count

Получим такие результаты:
>counters: {'O': 13, 'P': 14}
>overestimations: {'O': 12, 'P': 13}
По которым видно, что большая часть итогового огромного значения припадает именно на overestimation.

Теперь надо понять:
а) Overestimations используются для коррекции в конце, и проблема только в маленьком K?
б) Overestimations используются для коррекции на ходу, и проблема - понять как это делать?
в) Совокупность двух этих проблем?
No. 26225  
>>26224
Также существует вероятность, что такой алгоритм в принципе ложится на лопатки если все слова в потоке кроме искомых часто встречающихся - уникальны или очень редки. А с input_words_100k.txt на вид дела обстоят именно так.
No. 26226  
>>26223
О, здесь есть живые. А я уж думал, что всё...

>А можешь закинуть полный стектрейс на pastebin, на всякий случай?

Могу и полный крашрепорт (один из, их там много накопилось): https://pastebin.com/tH4jp5X7
Стектрейс там с самого верху.
Как можно видеть, исключение возникает при попытке создания экземпляра этого самого BiomeUndergroundDecorator.

>Просто вижу что сам код этого декоратора в нескольких местах ловит java.lang.NoClassDefFoundError в пустой catch.

Он таким извращенным способом проверяет наличие в сборке модов BiomesOPlenty и Highlands. Спасибо еще, что он хотя бы делает это в процессе инициализации, а не всякий раз при обработке каждого блока во всём мире.

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

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

Конечно, некоторые минимальные изменения мне потребовалось внести, чтобы оно скомпилировалось. Изменил струкруру директорий, сложил ему в libs dev-версии помянутых выше модов, добавил build.gradle (утащенный уже забыл откуда). И оно в таком режиме скомпилировалось и работало.

Правда есть один момент, который меня смущает. При использовании этого build.gradle (всегда, с любыми модами) вылезает вот такое предупреждение:
warning: [options] bootstrap class path not set in conjunction with -source 1.6
Что оно значит, имеет ли отношение к проблеме (меня беспокоит слово classpath) и как от него избавиться — без понятия.
Сам build.gradle вот: https://pastebin.com/6EsZEJEe
Другие моды (например GrimoireOfGaia) компиляются с ним без проблем (но warning вылезает тоже).

Вообще, путь даже не решения, а обхода этой проблемы я за это время нашел. Если не довавлять новых сторчек, а всего лишь поменять терминальный символ внутри выражения — оно это съест. Так что мы можем внутри for заменить int y = 1 на int y = this.minWgY, без проблем инициализировать эту переменную в конструкторе и даже добавить в конфиг мода. Что, собственно мне от него и было нужно.
А вот определить эту переменную как локальную внутри метода — низзя.

Соственно, на уровне класса ее раполагать правильнее, и по-хорошему, втрорую переменную, которая определяет максимальную высоту, тоже стоило бы туда вынести — но вот это оно мне уже сделать не даст...

В принципе, в рамках текущей задачи меня такой результат более-менее устраивает. Хотелось бы конечно еще кое-что в этом моде подправить. Но если нельзя, то сойдет и так.
Хотя если удастстя понять, что происходит и получить возможность дальше править мод — это было бы лучше...
No. 26227  
>>26226
>вылезает вот такое предупреждение
Так, с этим разобрался.
Оно всего лишь означает, что оно компилируется для java 6. Как поправить на java 8 — сказано здесь: https://stackoverflow.com/questions/18487406/how-do-i-tell-gradle-to-use-specific-jdk-version
Собственно, это всплыло в другом моде, где потребовались фичи из этой самой 8.

Но вот для UndergroundBiomes повышение версии жабы ровным счетом ничего не даёт. Если тронуть любую из тех двух "заколдованных" функций — оно по-прежнему крашится.
No. 26230  
Насколько актуально в 2022 изучать Flask, если иметь в виду дальнейшее трудоустройство либо фриланс? По сравнению с джангой порог вхождения кажется мне минимальным, с другой стороны вакансий в которых требуется Django вроде бы значительно больше чисто количественно. Специфика использования также не вполне понятна . Не могу решить во что углубляться, помогите Дуре!
P.s. Потроха у Django конечно страшные.
No. 26231  
>>26226
>>26227
Спасибо за полный краш репорт.

>Как можно видеть, исключение возникает при попытке создания экземпляра этого самого BiomeUndergroundDecorator.
Да, тут сказано
>Caused by: java.lang.ClassNotFoundException: exterminatorJeff.undergroundBiomes.worldGen.BiomeUndergroundDecorator
>at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191)
>at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

Но тут же ниже сказано, почему именно оно не нашло класс:
>Caused by: java.lang.RuntimeException: java.lang.RuntimeException: Error at instruction 191: Expected I, but found R replaceChunkOres
>...
Это говорит в сторону того, что класс не нашли не потому что его нет, а потому что JVM не смогла его собрать из байткода. Точнее, с байткодом что-то пытался сделать некий IETransformer где-то вот здесь:
>at ru.fewizz.idextender.asm.IETransformer.transform(IETransformer.java:74)
>at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279)
>...
>at ru.fewizz.idextender.asm.IETransformer.transform(IETransformer.java:70)
Но каким-то образом класс собрался так, что IETransformer, который пытается как-то преобразовать этот класс, спотыкнулся о несовпадение инструкций из байткода со своими ожиданиями. Теперь надо понять, откуда у него эти ожидания взялись. Можно добыть исходники IETransformer?

Сама инструкция 191 там ниже, но она ни о чем особо не скажет:
>00191 R I I R R R I I R R R I I R I I I R I R I . . . . . . : R : ILOAD 10
Кроме того что там есть эта пресловутая R, которая скорее всего появилась когда ты добавил сточку в класс.
Можно попробовать собрать байткод класса до твоих изменений и после, и посмотреть чем там отличается инструкция 191.
На всякий случай, ликбез по байткоду с примером: https://examples.javacodegeeks.com/introduction-to-java-bytecode/

Похожая проблема которую удалось нагуглить случилась у JetBrains, и у них насколько я могу судить, анализатор класса детектировал несовпадение итогового байткода с ожидаемым по исходному коду, со схожим результатом:
https://youtrack.jetbrains.com/issue/KT-28920
No. 26271  
>>26230
Лучше сразу в асинхронку по типу fastapi вкладываться, чем вот во всё это.
No. 26275  
>>26271
Почему?
No. 26277  
>>26231
>класс не нашли не потому что его нет, а потому что JVM не смогла его собрать из байткода.
Мда. Мне нужно было внимательнее эти репорты самому читать.

>>ru.fewizz.idextender.asm.IETransformer.transform(IETransformer.java:70)

Это мод NotEnoughIDs.
https://www.curseforge.com/minecraft/mc-mods/notenoughids
Позволяет превышать лимит IDшников. Необходим, поскольку у меня этот лимит превышен давно и прочно.

>Можно добыть исходники IETransformer?
А вот с этим проблема. Ссылка на исходники ведет на 404. Автор удалил репозитарий. Или его удалили.
И обновление мода со стабильной 1.4.3.4 на 1.4.3.5 alpha ничего не дало. А дальнейших обновлений, понятное дело, ждать не приходится...
В принципе, к версии 1.4.2 прилагается деобфуцированный код, который, вроде бы, должен хорошо поддаваться декомпиляции:
https://www.curseforge.com/minecraft/mc-mods/notenoughids/files/2275081
Для него краш тоже имеет место быть, единственное отличие — IETransformer.java:65, а не 74.

>На всякий случай, ликбез по байткоду с примером: https://examples.javacodegeeks.com/introduction-to-java-bytecode/
Хм... спасибо, попробую с этим разобраться...
No. 26278  
>>26277
Пока что вижу единственное отличие:
      31: iconst_1

      32: istore        5
...т.е. то самое добавление переменной.
И да, еще — "правильный" (без лишней переменной) класс javap не хотел компилять, если он был отдельно от остального дерева.
Возможно я, конечно, что-то не так понял и сравниваю не то. Буду разбираться дальше
No. 26280  
1569002633866.jpg - (327.09KB, 1000×1400)
26280
>>26271
Присоединяюсь к вопросу.
No. 26281  
>>26277
>>26278

>Это мод NotEnoughIDs
Расковыряв предложенный тобой жарник версии 1.4.2, выяснилось:

>1. Почему проблема возникает только если менять метод replaceChunkOres?
Потому что внутри мода есть
>UndergroundBiomesBiomeUndergroundDecorator.java
в котором есть метод transformReplaceChunkOres, который очевидно трогает специфично replaceChunkOres в твоем BiomeUndergroundDecorator.java
Изменения делаются на лету в байткоде класса, средствами фреймворка ASM: https://asm.ow2.io/

>2. Откуда несовпадение инструкций из байткода с ожиданиями?
Конечно RuntimeExcpetion может прилететь откуда хочешь, но в IETransformer.transform есть два места откуда он летит намеренно:
>final ClassEdit edit = ClassEdit.get(transformedName);
>final ClassNode cn = new ClassNode(327680);
>final ClassReader reader = new ClassReader(bytes);
>final int readFlags = 0;
>reader.accept((ClassVisitor)cn, 0);
>...
>//Первое место - трансформация класса
>edit.getTransformer().transform(cn, isObfuscated());

и чуть ниже

>//Второе место - запись и проверка трансформированного класса
>final ClassVisitor check = (ClassVisitor)new CheckClassAdapter((ClassVisitor)writer);
>cn.accept(check);

Согласно жавадоку ASM о CheckClassAdapter:
https://asm.ow2.io/javadoc/org/objectweb/asm/util/CheckClassAdapter.html
>CheckClassAdapter can be used to verify bytecode transformations in order to make sure that the transformed bytecode is sane.
>If the bytecode has errors, the output text shows the erroneous instruction number, and a dump of the failed method with information about the type of the local variables and of the operand stack slots for each instruction.
И похоже, в твоем случае RuntimeExcpetion летит именно отсюда, даже внешне операнд-стеки похожи.
Если это действительно так, то когда UndergroundBiomesBiomeUndergroundDecorator.transform дергает transformReplaceChunkOres над байткодом после твоих изменений, байткод портится из-за кривой логики трансформации, что вылазит при записи класса с проверкой.
А если не так, то та же логика спотыкается еще на самой попытке внести изменения в байткод твоего класса

Получается, что тебе надо будет декомпилировать, модифицировать и собрать обратно еще и мод NotEnoughIDs.
Или же делать свои изменения так, чтобы они были совместимы с тем, что потом делает UndergroundBiomesBiomeUndergroundDecorator и результат понравился ASM.
В любом случае, предварительно придется курить жавадок и мануал к ASM:
https://asm.ow2.io/developer-guide.html
https://asm.ow2.io/javadoc

Но возможно есть альтернатива.
>Автор удалил репозитарий. Или его удалили.
Автор говорит:
> Recommending to use JEID
Который вот тут:
https://github.com/DimensionalDevelopment/JustEnoughIDs

И еще есть вот такое:
https://github.com/FalsePattern/EndlessIDs
>EndlessIDs is a modern rewrite of NotEnoughIDs which increases the limit even more

Может эти моды меняют классы иначе, и не будут так конфликтовать с твоим кодом.
Или может их проще модифицировать.
Но может быть и все то же самое, конечно.
No. 26285  
>>26281
>И похоже, в твоем случае RuntimeExcpetion летит именно отсюда, даже внешне операнд-стеки похожи.
>Если это действительно так, то когда UndergroundBiomesBiomeUndergroundDecorator.transform дергает transformReplaceChunkOres над байткодом после твоих изменений, байткод портится из-за кривой логики трансформации, что вылазит при записи класса с проверкой.

Вот оно как... Костыль для кривого кода, который сразу же перестал работать, стоило этот код чуть тронуть. Ясно...
Сам бы я этот клубок вряд ли распутал бы. Спасибо!

>> Recommending to use JEID
>Который
...не работает под 1.7.10

>https://github.com/FalsePattern/EndlessIDs
А вот это, кажется, работает. Спасибо, будем смотреть.
No. 26295  
>>26280
>>26275
Простите, дорогие мои. В отпуске был в деревне.

Ну, джанга или фласк это по умолчанию подозрительные конторы. Не то что бы плохие, но так как эти технологии примитивные, то и core разработчики там не плещут профессионализмом. Хотя, может быть это только для меня весомый аргумент. Да, новичкам там может быть проще, но если есть время, лучше потратить его на что-то интересное, на что-то, что выделит на рынке труда. Асинхронка учит думать о более странных возможных ситуациях, что очень полезно. Очень глупые аргументы (если их так можно назвать).

Если всё же выбирать, то лучше наверно фласк, чем джанга. Хотя опять таки это мой взгляд, после фласка код у программистов мне нравится больше, в джанге человек учится каким-то слишком глупым шаблонам.
No. 26298  
Unique.jpg - (70.68KB, 795×596)
26298
>>26295
>лучше потратить его на что-то интересное, на что-то, что выделит на рынке труда

Учите, ребята, МВЦ и Джангу.
No. 26299  
>>26298
Я не хочу жить в мире, где меньше интересных собеседников, поэтому уходи со своим вот этим всем. Да и Джанге из View можно делать запросы к моделям, так что сомневаюсь что это совместимо. Совместимо, конечно, но от всего этого энтерпрайзного у меня живот скручивает
No. 26304  
Мявствуйте-котявствуйте.

Есть мне лично совершенно непонятная проблема: пк (x64_86) с Fedora 36 Server и Jellyfin в docker-контейнере (и jellyfin/jellyfin пробовал, и linuxserver/jellyfin), но тот отказывается запускаться вообще, жалуясь на
"Unhandled exception. System.UnauthorizedAccessException: Access to the path '/config/data' is denied."
Я пользовался docker-compose.yml из linuxserver/jellyfin ( https://hub.docker.com/r/linuxserver/jellyfin - Usage - docker-compose), изменив только volumes:

- /home/meow/jellyfin/config:/config
- /mnt/320gb:/data/tvshows

Всё остальное без изменений. Получил чуть больше информации:

jellyfin | chown: changing ownership of '/config': Permission denied
jellyfin | [cont-init.d] 10-adduser: exited 0.
jellyfin | [cont-init.d] 30-config: executing...
jellyfin | mkdir: cannot create directory ‘/config/log’: Permission denied
jellyfin | mkdir: cannot create directory ‘/config/data’: Permission denied
jellyfin | mkdir: cannot create directory ‘/config/cache’: Permission denied
jellyfin | chown: changing ownership of '/config': Permission denied
jellyfin | chown: cannot access '/config/*': No such file or directory
jellyfin | chown: cannot access '/config/data/transcodes': No such file or directory

Остальные способы поставить jellyfin заканчивались exception'ом выше (в начале сообщения).

Что самое странное, так это то, что я буквально вчера поставил Fedora 36 Server без каких-либо дополнительных настроек, предварительно отформатировав SSD, где стояла до этого Fedora 35 (с ней проблем с Jellyfin не было вообще, но я, кажется, права root'овые группе docker давал). Выполнил команды sudo dnf install docker и sudo dnf install docker-compose, создал /home/meow/jellyfin и внутри docker-compose.yml по инструкции, sudo systemctl start docker, sudo docker-compose up и уже получал ошибку. Такое впечатление, что проблема в правах, но разве sudo docker-compose up не даёт права root'овые для процесса?

Понимаю, что проблема в правах и что скорее всего она решается как-то очевидно, но у меня идей нет пока что, поиски в интернете и чтение документации ни к чему новому не натолкнули.
No. 26305  
>>26304
>Разве sudo docker-compose up не даёт права root'овые для процесса?
Процессу докера - дает. А вот процессу который крутится уже внутри самого контейнера - не дает. Сами авторы пишут:

Если верить прямо страничке jellyfin:
https://hub.docker.com/r/linuxserver/jellyfin

>User / Group Identifiers
>When using volumes permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user PUID and group PGID.

>Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic.

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

Меняется выставляется через энв-переменные:
>environment:
> - PUID=1000
> - PGID=1000

Ты пробовал этот авторский рецепт?
No. 26308  
>>26305
Да, я пробовал указывать user id:group id в docker-compose, но результат тот же. Указывал я uid:gid пользователя meow, который собственно создан был при установке Fedora 36 Server как администратор (ну и root тоже есть запароленный).
Пойду дальше копать, в общем. Спасибо, кстати.
No. 26311  
>>26308
>Я пробовал указывать user id:group id в docker-compose, но результат тот же.
Учти, что эти энвы передаются внутрь всего один раз, когда первый раз создается контейнер. Если ты их меняешь после этого, контейнер нужно пересоздавать.
No. 26316  
Чио, чан, как правильно делать?

Я вот написал простенькую, но немного полезную, программку в Lazarus и хочу выложить её на GitHub. Как правильно сделать лицензионное соглашение, файл Readme и всё в этом роде?
No. 26317  
wtfpl-strip.jpg - (297.32KB, 1200×1500)
26317
>>26316
No. 26318  
>>26317
В России, кстати, GNU GPL не работает, поскольку требует, чтобы производные продукты были тоже по этой лицензии, что идёт в разрез с законом об авторском праве, где автор волен выбирать любой тип лицензии для своего ПО.
No. 26319  
Чиочан, смотри, есть такая штука для обхода блокировок рыбнадзора https://antizapret.prostovpn.org/
Всем хороша, но хотелось бы добавить туда несколько ресурсов, которые сами огородились от России. Можно это как-то сделать, отредактировать конфиги, наример, я не знаю?
No. 26325  
>>26319
Я так понимаю, там просто публичный список прокси, а настройки где-то на их стороне. Так что не выйдет, наверное.
No. 26339  
Delphi или Lazarus?
No. 26342  
faptcha_php.png - (1.70KB, 90×50)
26342
>>26339
Rust.
Вообще, такое скорее для диспутов нити.
No. 26343  
Все так, диспутов нить >>/dev/21353
No. 26349  
Зачем нужно override в C++? Переопределение виртуальных методов в наследника и без него же работает.
No. 26351  
>>26349
Чтобы быть уверенным, что ты действительно переопределяешь метод, существовавший в родительском классе. Например, ты можешь опечататься в его названии, тогда компилятор создаст новый метод в добавление к старому, а ты при этом будешь свято уверен, что его переопределил. С override же это выдаст ошибку компиляции.
No. 26352  
>>26351
Понятно, спасибо.
No. 26361  
>>26351
А предупреждение пишет, если перегружается виртуальный метод, но нет override?
No. 26362  
>>26361
Если собирать с опцией -Wsuggest-override, то да.
No. 26363  
>>26362
А virtual обязательно писать, если есть override (статические же не перегрузишь)?
No. 26367  
>>26363
Лучше использовать слово "переопределение". Перегрузка (overloading) - это совсем другое действие: создание нескольких методов/функций с одинаковым названием но отличающихся принимаемыми аргументами.

virtual достаточно писать только в родительском классе. Важно понимать, для чего это слово вообще используется - если класс имеет хотя бы один виртуальный метод, то при каждом создании объекта этого класса выделяется место для его "таблицы виртуальных методов", хранящей указатели на его виртуальные методы и позволяющей не "забывать" их при приведении типов. Пример: https://onlinegdb.com/BC-j-PG5B
No. 26377  
Вопрос отменяется, наверно, не стоит спрашивать то что есть в SO/Google/сам можешь решить
No. 26379  
>>26367
У вас тут уютно.

Емнип, в книгах пишут перегрузка операторов, так что логично называть это именно перегрузкой. Как считаешь?

Буквальный перевод overload может спутать, это минус. Разве в си есть ключевое слово overload?
No. 26390  
>>26379
Перегрузка операторов в С++ – это именно overloading. Например, у тебя есть функция string operator+(const string& lhs, const string& rhs) для конкантенации строк, которая перегружает обычный оператор + для арифметических операций. Ты можешь дополнительно определить свой operator+ для кастомных классов простых дробей, относительных путей или чего-то еще. В результате, в одной области видимости у тебя будет находиться несколько реализаций этого оператора, и компилятор будет выбирать подходящую, исходя из используемых аргументов.

Вообще, в литературе я также видел использование слова "перекрытие", но мне оно чем-то не нравится.
No. 26421  
lain_6.jpg - (7.13KB, 150×150)
26421
Что скажете про awesome-lists с гитхаба? Какие-нибудь из них стоят внимания? Где ещё найти подобные списки?

Пример: github.com/trimstray/the-book-of-secret-knowledge
Список списков (да): github.com/jnv/lists
No. 26422  
photo_2022-07-18_11-12-40.jpg - (109.95KB, 1280×853)
26422
>>26304-кун-кун залетает с припозднившимся ответом.

>>26305
Решилось переустановкой ОС (глупо, но да) с Fedora 35 на Proxmox и поверх Fedora 36. Похожая история была с Deluge, там решил указанием явно user:password где-то в конфигах, созданных контейнером.

В общем, я не знаю, странная история.
No. 26425  
>>26422
Действительно, странная, спасибо что сообщил как в итоге все разрешилось.
No. 26456  
>>25965
Чио-тян, как ты читаешь документацию не засыпая?
No. 26459  
Чио-чан, помоги подружить Vscode с Makefile. Есть корректный Мейкфайл, который нормально собирает проект из консоли. Но по F5 студия собирает черти что с кучей ошибок линковки. Как это починить?
No. 26462  
>>26456
Читаю нужное в данный момент и иду использовать. Мне проще запоминать, когда ты сразу же повторяешь это своими руками.
No. 26463  
>>26462
А если нужно освоить что-то с нуля? Если пробовать всё сразу, то это же много времени.
No. 26464  
>>26463
Без практики будет не в коня корм, имхо.
No. 26468  
В шаблонном классе есть указатель
T * pointer

В конструкторе через него создается массив
pointer = (T*)malloc(sizeof(T)*size);

В деструкторе надо эту память освободить. Как это лучше сделать? Через free(pointer) или все же лучше delete [] pointer?
No. 26470  
>>26468
Выделяешь malloc - освобождай через free, new - delete, new[] - delete[].

Только так.
No. 26473  
>>26470
Ясно, спасибо. А как перераспределять память, выделенную под массив с помощью T * pointer = new T[size]? Использовать realloc, как в C, или это тоже не рекомендуется, и единственный выход - через временный массив и полное перевыделение памяти?
No. 26475  
>>26473
Если размер массива увеличится, то только копировать. Если ты уверен, что места хватит, то можешь пикрелейтед. Это называется placement new.
No. 26476  
Вот что на эти вопросы отвечает Страуструп: https://www.stroustrup.com/bs_faq2.html#realloc
No. 26480  
>>26464
Тратить время так по полной! Лучше тогда сделать два прохода по докам: первый - ознакомительный, второй - практический.
No. 26487  
>>26480
Это круто только если ознакомление не задерживается на миллионы лет.
No. 26507  
Всем привет! Решил вкатиться в бэкенд разработку на ноде, ибо работаю девопсом, а нихуя кроме баша и базы питона не знаю, подскажите пожалуйста, с чего лучше начинать? Писал программы последний раз лет 6 назад, на C# и ABC.Pascal лол, писал всякую прикладнуху, решал задачи по оптике или матмоделированию.
No. 26508  
>>26507
>Подскажите пожалуйста, с чего лучше начинать бэкенд разработку на Node.js
Тут бы знать, насколько ты уже продвинулся.
Если совсем еще не брался, то учитывая что последний раз программы ты писал 6 лет назад, начать предлагаю с установки всей оснастки:
https://nodejs.dev/learn/how-to-install-nodejs

И затем пройти быстротуториал:
https://nodejs.org/en/docs/guides/getting-started-guide/
Очень маленький туториал, а в конце уже рабочий сервер!

Потом стоит разобраться с npm, node package manager, считай внутренняя утилита для установки JS-библиотек в твой проект, как pip в Питоне:
https://nodejs.dev/learn/an-introduction-to-the-npm-package-manager
По умолчанию npm тянет библиотеки отсюда:
https://www.npmjs.com/
Они тут есть на все случаи жизни.
Попробуй подключить что-то к своему сервачку.
Если ничего в голову не приходит, научи его отдавать и принимать файлы в CSV:
https://www.npmjs.com/package/csv

Тебе естественно понадобится эти данные где-то хранить, т.е. нужна будет работа с базой данных.
Можно пойти по пути NoSQL базы, например вкатившись в Mongo DB: https://www.npmjs.com/package/mongodb
Или пойти традиционным путем и пользуватся SQL-базами, например MySQL: https://www.npmjs.com/package/mysql
Возможно, тебе захочется повозиться с ORM, но мне кажется это в начале пути будет слишком муторно

Путем этих нехитрых манипуляций с данными ты научишься добавлять эндпоинты, принимать на них данные, складывать данные в базу, доставать их из базы, и отдавать назад на эндпоинт. А это считай и есть 99% суть бэкенда. Разве что работы с очередями, стриминга данных, кеширования, авторизации, и контроля доступа не хватает

После этого надо решить, что же собственно ты хочешь написать чтобы руку набить, и дергать из гайдов вещи предметно для себя:
https://nodejs.org/en/docs/guides/
https://nodejs.dev/learn
https://nodejs.org/api/

Это если вот так совсем базово.
Уточняй, если что-то конкретнее интересует.

>нихуя кроме баша и базы питона не знаю
А почему не посмотреть в сторону бэкенд разработки на Питоне?
No. 26510  
1622237188421.png - (396.39KB, 712×712)
26510
>>26508
>советовать носкуль в наше время
>>>советовать Мускуль в наше время
No. 26511  
>>26510
Сразу PostgreSQL тоже не хотелось советовать, мне кажется с ней больше мороки начинающему. А перейти можно всегда.

>>26507
>>26508
Впрочем, вот клиент и для нее тоже:
https://www.npmjs.com/package/postgres
No. 26513  
>>26508
>Тут бы знать, насколько ты уже продвинулся.
У нас на галере 95% проектов на ноде, обычно на несте с тайпормом (постгря и редис ещё, на одном проекте есть сцилла), но есть приколы с graphql и аполло. Я например могу спокойно установить какой-нибудь пакет и инициализировать его внутри кода, проверить как работает вариация переменных (на бэке через joi, фронт вообще не трогал), но вот ума чтобы запиздячить нормальное логирование и сделать так чтобы APM агент NewRelic отправлял логи из приложения в контейнере - пока не могу.

Конечная цель - понимать как и что работает в любом бэковом приложении, уметь дебажить основные проблемы с производительностью и писать нагрузочные тесты, такие дела.
No. 26514  
>>26513
>вариация переменных
Конечно же валидация. простите за сумбурный стиль
No. 26515  
>>26513
>могу спокойно установить какой-нибудь пакет и инициализировать его внутри кода
Отлично, значит с оснасткой уже справляешься.

>сделать так чтобы APM агент NewRelic отправлял логи из приложения в контейнере
Судя по этой документации все должно быть достаточно прямолинейно с этим:
https://docs.newrelic.com/docs/apm/agents/nodejs-agent/installation-configuration/install-nodejs-agent-docker
https://docs.newrelic.com/docs/apm/agents/nodejs-agent/installation-configuration/nodejs-agent-configuration
Или оно у тебя не может из контейнера достучаться в сеть?

>запиздячить нормальное логирование
Тут надо знать, каким ты представляешь себе нормальное логгирование.
Просто чтобы приложение твое светило метриками и логами на дашборде NewRelic?

>понимать как и что работает в любом бэковом приложении, уметь дебажить основные проблемы с производительностью и писать нагрузочные тесты
Принимая все сказанное во внимание, первое приложение на Node кажется очевидным, взять пример сервера выше, снабдить реликовским агентом, добавить эндпоинтов, и сделать так, чтобы агент репортил не только CPU, MEM и диск, но и количество запросов в секунду, запросы на конкретный эндпоинт, время обработки запросов на разных этапах, логи событий, результаты обработки запросов, и все остальное что ты хотел бы видеть. Потом можно начать искусственно добавлять в приложение боттлнеки и ошибки с целью увидеть их на дашборде с помощью данных от агента. Это будет полезно, чтобы научиться определять нужную гранулярность этих данных для других приложений которые ты захочешь мониторить и нагружать.

Ты уже делал что-то такое в качестве упражнения?
No. 26516  
>>26515
>Или оно у тебя не может из контейнера достучаться в сеть?
В стандартной установке вне контейнера APM агент работает в связке с инфраструктурным агентом, пересылая логи в него, в случае с использованием контейнера этого не происходит, можно конечно отдельным контейнером рядом поднимать ещё инфраструктурный агент, но хочется без оверхеда такого обойтись, вот линк где раскрываются некоторые вопросы логирования
https://docs.newrelic.com/docs/logs/logs-context/configure-logs-context-nodejs/

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

>Ты уже делал что-то такое в качестве упражнения?
https://www.udemy.com/course/nodejs-start/ Начал с этого курса, но пока не было времени уйти дальше первого занятия. За советы большое спасибо, очень круто! Жму руку, целую в попу.
No. 26519  
>>26516
Заходи, если что.
No. 26521  
Все гайды в интернете напоминают инструкцию Как нарисовать сову.
No. 26527  
Привет, Стив.
У меня вопрос по алгоритмам.
Дано: набор точек с целочисленными координатами и радиус круга, тоже целый. Надо найти координаты центра круга, покрывающего максимальное количество точек.
Я пытался искать, нашел задачу Гаусса и задачу частичного покрытия круга, но ничего не понял. Есть у тебя на примете что-нибудь понятное по этой теме?
No. 26528  
В общем, задача такая:
Есть 500гб фотографий, в основном jpeg, есть 65-70гб .tiff (600мб макс) и равки (35мб макс) на компьютере (Fedora 35).
Есть сервер на линупсе (Fedora 36), где есть 1.2гб свободного места (ssd) и 3гб RAM, два ядра (12th gen intel), подключён и замонтирован 1tb hdd.
Я пытаюсь скопировать 30 фотографий с клиента на сервер (оба в локальной сети), но скопировалось файлов 20, потом... закончилось место на ssd на сервере, а на hdd сервера были 30 файлов, только 20 имели корректный размер, а остальные 10 - 0мб.
Мне, эээ, как копировать, имея сейчас 3.2гб места на ссд? Пользовался sftp, надо скопировать желательно всё без ошибок.
No. 26530  
>>26527
А какой размер входных данных? Я так сходу об этой задаче сказать не могу, но по входным данным можно прикинуть требуемую сложность.
No. 26532  
>>26530
Самый большой файл - 600мб (.tiff). Папка весит 550гб, в ней по папкам с 2016 по 2022 года разложены по месяцам фотографии.
No. 26533  
>>26532
Бака, я >>26527 отвечал!
No. 26534  
>>26533
Да, бака, да ещё и сильно пожёванная, ты прав. Сорян.
No. 26535  
>>26528
>>26532

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

Инфа по теме:
https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories
No. 26536  
durr.jpg - (52.45KB, 640×480)
26536
Heroku кинуло своих юзеров: больше никаких бесплатных сервисов. Платите бабки за пользование или идите нах. Мне на почту только что пришло.
No. 26537  
>>26536
Так из РФ и не заплатишь вроде?
No. 26538  
>>26537
В смысле, после СВО.
No. 26540  
>>26538
Х.з., она у меня года два или три уже с бесплатной машиной — тут в архиве где-то есть обсуждение, на чём хостить жабо-ентырпрайз. Теперь халяву обещают прикрыть в ноябре. Видимо слишком много стало хитрожопых, кто базу подгружал со стороннего файлообменника.
No. 26588  
Привет, Стив.
Продолжение вопроса >>26527, вдруг кто все-таки поможет.
Мои наработки вот тут - https://github.com/sltrs1/angular_sweep
На Стековерфлоу мне подсказали решение https://ru.stackoverflow.com/questions/1444499/ и я попытался его реализовать.
Сначала я реализовал наивный алгоритм, то есть, просто посчитал расстояние от каждой точки плоскости по каждой точки входных данных и посмотрел, какие точки удовлетворяют условиям.
Потом я попытался реализовать angular sweep алгоритм, описанный вот тут - https://www.geeksforgeeks.org/angular-sweep-maximum-points-can-enclosed-circle-given-radius/
Я его немного модифицировал - исходный алгоритм исполнялся только для каждой точки входных данных, я же сделал так, чтобы он исполнялся для всех точек плоскости.
И тут появилась проблема. Наивный и угловой алгоритмы дали разные результаты. Я не могу понять, в чем проблема. То ли я где-то ошибся в реализации, то ли угловой алгоритм делает не то, что я думаю.
Помоги, Стив, пожалуйста, это важно.
No. 26589  
>>26588
Я правильно понимаю, что до модификации углового алгоритма, результат совпадал с результатом наивного алгоритма?
No. 26590  
>>26589
Нет. Наивный алгоритм нашем максимум не точке, не входящей в множество входных данных. До модификации угловой алгоритм в принципе не мог найти эту точку.
No. 26591  
>>26590
>Наивный алгоритм нашем максимум на точке, не входящей в множество входных данных
>Посчитал расстояние от каждой точки плоскости до каждой точки входных данных и посмотрел, какие точки удовлетворяют условиям.

Извини, если трачу твое время зря, но вроде же наивный алгоритм работает попарно по точкам из входных данных, а не по всей плоскости. По крайней мере твоя статья в GeeksForGeeks дает такую информацию:
>Naive Algorithm
>For an arbitrary pair of points in the given set (say A and B), construct the circles with radius ‘R’ that touches both the points. There are maximum 2 such possible circles.
Т.е. ты строишь две окружности радиуса R, зная координаты хорды.
>For each of the constructed circle, check for each point in the set if it lies inside the circle or not.
>The circle with maximum number of points enclosed is returned.
Потом считаешь сколько точек попадает в каждую такую окружность, и возвращаешь ту, где точек больше. Повторяешь это для каждой пары, в конце выбираешь самую вместительную окружность.

Может я тоже неправильно что-то понял, конечно.
No. 26592  
>>26591
> но вроде же наивный алгоритм работает попарно по точкам из входных данных
Посмотри, что я сделал в репозитории https://github.com/sltrs1/angular_sweep/blob/master/main.c строки 117-134.
На Гиксфоргикс наивным называют не очень-то и наивный и очевидный алгоритм. Я по крайней мере наивной называю свою реализацию, где просто считаются расстояния до точек.
No. 26593  
>>26592
>Посмотри, что я сделал в репозитории
Смотрю
1. Ты берешь точку плоскости. Принимаешь ее за центр окружности
2. Затем берешь точку из входных данных. Меряешь расстояние до нее из "центра"
3. Если расстояние меньше радиуса, считаешь что точка попала в окружность

Мелкая проблема: ты выпускаешь случай, когда точка будет лежать ровно на радиусе, надо dist <= radius

Вопрос:
А тебе надо, чтобы вся окружность помещалась в пространство от 0 до MAX_POINTS?
Потому что сейчас не помещается.
Например, если центр окружности у тебя в (0,0), то помещается заведомо только четверть окружности. Решение с таким центром может быть заведомо неверным?
No. 26594  
>>26593
> dist <= radius
Да, не заметил. Спасибо, исправлю.
> А тебе надо, чтобы вся окружность помещалась в пространство от 0 до MAX_POINTS?
Нет. Она может лежать где угодно.
No. 26595  
>>26594
Тогда других особых проблем в этом подходе не вижу, кроме того что он долгий.

Интересно, повлияет ли как-то фикс на совпадение результатов с угловым алгоритмом до / после модификации?
No. 26596  
>>26595
Результаты немного изменились, но все равно не совпали.
No. 26598  
>>26596
Вот сравниваю твой подход со стандартным угловым из туториала.
И действительно, на наборе из первых 10 пар координат при радиусе 10 результаты не совпадают таким образом:
>The maximum number of points (sweep) are: 9
>The maximum number of points (custom-naive) are: 7
Может так быть, что угловой подход может найти центр с большим количеством попаданий, просто потому что ему доступно больше координат (double), в то время как твоему подбору доступны только целые координаты (int)?
No. 26599  
>>26598
Количество координат везде одинаковое. И обоих подходах берутся центры окружностей с целыми координатами от 0 до 99 по оси X и от 0 до 99 по оси Y, всего 100*100 точек и потом для рассчетов все инты приводятся к даблам.
No. 26601  
>>26599
Я скорее о том что сам угловой алгоритм использует большее пространство координат когда заметание угла считает. Ты можешь выяснить, какие итоговые координаты центра окружности выдает угловой алгоритм, и сравнить с координатами центра от твоего собственного алгоритма?
No. 26602  
Вот например, если взять первые 10 точек из твоих данных
https://github.com/sltrs1/angular_sweep/blob/master/coords.txt

Если я все правильно сделал, получается что
>The maximum number of points (sweep) are: 9
>P: (0,23)
>Theta: -0.31756
Т.е. максимальная окружность проходит через точку P(0,23), но эта точка не является центром окружности (!), центр окружности отстоит от этой P на вектор длиной R пущенный под углом Theta. Надеюсь не напутал в определении лучшего Theta
Есть подозрение, что итоговая координата центра такой окружности не будет целочисленной.

При этом твой вариант алгоритма по определению может иметь только целочисленную координату центра окружности.
Интересно, что лучшим центром он считает ту же точку, вокруг которой поворачивает окружность угловой алгоритм:
>The maximum number of points (custom-naive) are: 7
>C: (0, 23)
No. 26637  
Дано: два целых числа. Потенциально неограниченного размера.
Задача: упаковать их в одно целое число. Обратимо.

Самый тупой способ, который сразу приходит в голову — записать в виде строки, и числом считать последовательность ее байт. Или еще как кодировать пробел между координатами через старшие разряды цифр в какой-нибудь N-ричной системе.
Но что-то мне подсказывает, что есть более вменяемые алгоритмы.
No. 26639  
>>26637
Пишем два числа рядом (сперва большее, затем меньшее), затем приписываем длину большего числа. При восстановлении отмерь с конца столько цифр, чтобы полученное десятичное (хотя в двоичной тоже сработает) число было не меньше половины количества оставшихся цифр. Если важно восстановить исходный порядок, то придется потратиться на еще один символ его обозначающий.
No. 26644  
>>26637
Переведи свои числа в систему счисления с основанием 2^31 (2^63), 32(64)-й бит старшего разряда каждого числа установи в единицу.
No. 26645  
>>26644
Круто!
No. 26652  
>>26637
Сделай их одинаковой длины путём добавления нулей слева, попеременно выписывай цифры, чётные из первого, нечёоные из второго.
No. 26655  
Наткнулся в lua вот на такую непонятную хрень:
local function foo(...)

    local str = 'text:'
    local txt = {...}
    for s=1, #txt do
        str = str .. ' ' .. tostring(txt[s])
    end
    print(str)
end

local function bar(a, b, c, d, e, f, g, h, i, j, k)
    foo(a, b, c, d, e, f, g, h, i, j, k)
end

local tt = nil
foo('foo test', 1, foo, 2, nil, 3, tt, 4, 'fin')
bar('bar test', 1, foo, 2, nil, 3, tt, 4, 'fin')
выводит
text: foo test 1 function: 0xb370c0 2 nil 3 nil 4 fin

text: bar test 1 function: 0xb370c0 2
T.e. если у нас nil передаётся в многоточие напрямую или из переменной, то оно нормально проходит. А вот если он берется из аргументов функции, то на этом всё обрывается.
Это что — баг в луа? Или я что-то не понимаю? Можно ли это как-то обойти?
No. 26657  
>>26655
…опытным путем установил, что такая фигня наблюдается, только если выражение оканчивается на аргументы функции, которые не были в нее переданы.
Т.е., если обрезать до foo(a, b, c, d, e, f, g, h, i) — то всё проходит, какие бы там нули внутри не были.
Если добавить foo(a, b, c, d, e, f, g, h, i, j, k, 'end') — тоже всё работает.
А вот foo(a, b, c, d, e, f, g, h, i, j) — обрывается на первом nil.
Такие дела…
No. 26659  
>>26657
Чтобы всё работало, в начало foo, после перевода многоточия в таблице, можно добавить:
repeat

    local sz = #txt
    table.insert(txt, '(nil)')
until(#txt == sz + 1)
Оно заткнет дырки в таблице, и #txt начнет считаться правильно. Правда если два нуля идут подряд, такой фокус не пройдет…
No. 26723  
20211031-DSCF7844-resize.jpg - (3.94MB, 2285×3428)
26723
Можно запостить материалы для вкатывания в C#, которые я за полгода собрал?

1. https://ulearn.me/ - хорошее повторение университетского курса. Ещё упоминает про хорошие практики в программировании.
2. https://metanit.com/ - говорят, есть неточности, но курс по ASP .NET там понятный.
3. https://docs.google.com/spreadsheets/d/1xRdCFNC4iffknGyiUCVYnKYdbkNFt2TUn-iFecOCELo/ - вопросы на собеседование. Примерные, конечно.
4. Есть очень хорошие материалы по Linux, в частности, канал на ютубе tutorialLinux (https://www.youtube.com/c/tutoriaLinux) и курсы CBT Nuggets от Shawn Powers. Я отсмотрел его курсы подготовки к LPIC-201 и, считаю, что понятно, интересно и не скучно (есть на рутрекере).

Если хочется кодить, то есть codewars и leetcode. Если хочется потренироваться в Linux, то можно поставить себе какой-нибудь популярный серверный (чтоб привыкнуть к командной строке) дистрибутив (в них особо не разбираюсь, но пользуюсь Fedora) и развернуть там в docker-контейнерах сервисы вроде Jellyfin (стрим медиафайлов), Kavita (читалка манги), Nextcloud или Seafile (файлохранилище). Умение работать с Linux, как я понимаю, является большим плюсом.
No. 26725  
>>26723
Конечно можно, спасибо! Добавим в общую базу знаний. Вопросы на собеседование надо будет отдельно на pastebin в перекинуть.
No. 26731  
>>26725
Оке, я попробую сделать удобоваримый документ (копию того, что по ссылке на гуглодоке) на пастебине и каком-нибудь текстовом файле и выложу тут.
No. 26732  
>>26731
Спасибо!
No. 26736  
Привет, Чиочан.
Мне в руки попали драйвера некоего свича, и надо в них найти, как настраивается MAC-адрес. Подробностей дать не могу, железо немного закрытое.
Может кто по аналогии с другими подобными драйверами сказать, в каком направлении копать? Если тут, конечно, кто-то залезал внутрь подобных драйверов.
No. 26738  
>>26723
>C#
>Linux
А как сейчас C# дружит с Linux? По слухам, под Linux там всё не очень хорошо, версии неактуальные или совместимость хромает. Сам я с .net не работаю, поэтому не могу оценить. У кого нибудь есть более актуальная информация? Имеет ли смысл вкатываться в C# именно под Linux?
No. 26739  
>>26738
Я так начинал шарпы учить (как раз по ulearn, годнота), но забил на них именно из-за необходимости иметь винду. Впрочем, это было несколько лет назад.
No. 26740  
>>26738
>>26739
Я сам вкатывался в дотнет именно с прицелом на будущую миграцию платформы на линь и это случилось где-то в 2019 - с тех пор везде, где я работал, вся вебня на шарпах деплоилась в лялиховых контейнерах, а разрабы, в основном, пилили её в райдере под убунточкой. Конечно, по-прежнему есть куча проектов (большей частью десктоп), прибитых гвоздями к венде, но я их успешно избегаю, чего и другим советую.
No. 26743  
>>26740
>везде, где я работал, вся вебня на шарпах деплоилась в лялиховых контейнерах
А внутри контейнеров что? wine? mono?

>вебня
Приложения уровня считал запрос - распарсил - сделал запрос к базе - ответил? Что было самое нетривиальное?

>будущую миграцию платформы на линь
>успешно избегаю, чего и другим советую
Миграция так и не произошла? Какие тогда остаются преимущества у C# перед обычными php+mysql для вебни?
No. 26744  
Почему крутые программисты во всех if-ах при сравнении переменной с константой пишут константу первой?
No. 26745  
>>26744
Это из-за убогости языка Си, если писал на нём - поймёшь. Не стоит называть их крутыми, тут скорее опыт.
No. 26746  
>>26745
Раз уж это нить начинающих программистов, имеет смысл пояснить хотя бы в двух словах или поделиться ссылкой.
No. 26747  
>>26746
Согласен, было бы здорово, если бы тут было больше осмысленных ответов.
No. 26748  
>>26744
Потому что при таком порядке при опечатке "=" вместо "==" компилятор выдаст сообщение об ошибке (так как присваивание константе невозможно) и не скомпилирует такой код. Если же присваивание возможно и тип значения (rvalue) выражения присваивания может быть неявно преобразован к булевому, то такой код компилятор посчитает корректным, хотя и может выдать предупреждение.
No. 26749  
>>26748
Наруходо!
No. 26781  
Чиочан, какие есть способы проверки четности числа, кроме остатка от деления на 2 и проверки последнего бита?
No. 26782  
>>26781
>кроме остатка от деления на 2
В языках в которых результатом деления на int будет int, можно поделить и умножить обратно на 2:
> if ((n / 2)) * 2 == n)
В иных случаях не сработает.

>кроме проверки последнего бита
Другие сорта проверки бита, сместить число на один бит вправо, а потом сместить на один бит влево:
> if ((n >> 1) << 1 == n)
No. 26783  
>>26782
Понял, спасибо!
No. 26784  
>>26783
Если узнаешь еще способы - приноси, делись, будем рады.
No. 26788  
>>26781
Побитовое умножение.
if (i & 1)
No. 26789  
Чем отличается мьютекс от семафора? Кроме того, что у семафора больше двух значений.
No. 26791  
>>26789
>Чем отличается мьютекс от семафора?
Мьютекс - тоже сорта семафора, собственно взаимно-исключающий семафор.
Отличие от других семафоров - в эксклюзивности доступа к семафору. Если ты взял мьютекс, то все, тебе его и отпускать, никто другой отпустить его за тебя и забрать уже не сможет.

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

Надеюсь получилось понятно.
No. 26796  
>>26744
Не сталкивался с таким. В частности и в Сях.
>>26745
Бред какой-то пишите.
No. 26797  
junior_developer_nene_2.png - (450.16KB, 720×720)
26797
Тем временем, аноним наконец-то перенес последние ссылки из прошлой нити в базу знаний: http://pastebin.com/AGhLZppH
No. 26798  
>>26791
То есть, менять значения семафора может кто угодно? А в чем смысл его тогда? Он же тогда ничего не ограничивает.
No. 26800  
>>26798
Семафор это полотенце на кабинке переодевалки, которое люди вешают, чтобы обозначить, что там занято. Его можно украсть, его можно забыть и уйти. Зато не нужен охранник с турникетом, который по две минуты переписывает у всех номер паспорта
No. 26804  
>>26744
Чтобы случайно не потерять равно и не получить присваивание вместо сравнения в C/C++. 5=x - ошибка компиляции, x=5 - всегда true (и потенциально ещё много проблем из-за изменения x).

Олдскул олдскульный и многим не нравится, в том числе и мне. Первоисточник не знаю, в продакшене не видел.
No. 26807  
>>26791
Семафоры могут меж абсолютно левыми процессами работать, их ещё в System V придумали.
No. 26808  
2012-04-20-linus-torvalds.webp - (28.64KB, 984×997)
26808
>>26789
https://yarchive.net/comp/linux/semaphores.html
キタ━━━(゚∀゚)━━━!!
No. 26811  
1515915234434.jpg - (53.55KB, 508×494)
26811
Sup, /dev/. Пишу на Ruby с использованием библиотеки RMAgick (https://rmagick.github.io/) небольшой скриптик для обработки изображений. Собственно, весь скрипт представляет собой загрузку изображения из файла, его обработку через последовательный вызов методов RMAgick и сохранение полученного результата в новый файл.

Проблема в том, что почти все методы в RMagick возвращают не self, а новый объект. Лично для меня это жутко неудобно, т.к. я хочу писать так:

#
# тут читаем изображение из файла в объект img
# обрабатываем изображение:
img.
   method_1!
   method_2!
   #…
   method_n!
   write('result.png')


Но вместо этого приходится делать так:
img = img.method_1

img = img.method_2
#…
img = img.method_n
img.write('result.png')


Т.е. постоянно переопределять объект img. Что некрасиво (бесит). Хуже того, что некоторые методы таки имеют аналоги, возвращающие self, но в итоге код вообще выглядит жутко некрасиво, потому что часть методов с восклицательными знаками, часть без:

img = img.method_1

img.method_2!
img.method_3!
img = img.method_4
#…
img = img.method_n
img.write('result.png')


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

Собственно, вопрос: возможно ли как-то заставить методы RMagick возвращать мне всегда self, а не новый объект? Как-то переопределить их и т.п.?
No. 26812  
>>26811
>Собственно, вопрос: возможно ли как-то заставить методы RMagick возвращать мне всегда self, а не новый объект? Как-то переопределить их и т.п.?
С точки зрения ООП - возможно, и ничего не мешает.
Самый простой способ - сделать класс-обертку над RMagick, он же "декоратор", который обернет тебе нужные методы RMagick так, чтобы возвращать всегда оригинальный объект (в твоем случае img)

Пример как это делается: https://www.rubyguides.com/2018/04/decorator-pattern-in-ruby/
No. 26813  
Си
Почему вот такая конструкция при вводе некорректного аргумента в scanf, например буквы, уходит в бесконечный цикл?

while(scanf("%d", &str_len) == 0)
{
puts("Некорректный ввод. Введите длину еще раз");
}
No. 26814  
>>26813
https://en.cppreference.com/w/c/io/scanf
>Return value
>Number of receiving arguments successfully assigned
>(which may be zero in case a matching failure occurred before the first receiving argument was assigned)
У тебя не заассайнился единственный аргумент, поэтому оно возвращает 0, поэтому уходит в цикл.
No. 26816  
1523019999300.png - (125.53KB, 880×960)
26816
>>26812
Спасибо за ответ! Мне товарищ тоже рассказывал про делигаторы полтора месяца назад, я тогда попробовал через СимплДимпл SimpleDelegator сделать, но у меня ничего не получилось.

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

В любом случае, спасибо за совет!
No. 26817  
>>26816
Надеюсь решение подойдет и все получится, заходи если что.
No. 26823  
16428684542002.jpg - (669.37KB, 1300×1600)
26823
Кто-нибудь хочет вместе вкатыватсья в программирование? Сам хорошо знаю Python, сейчас учу C# и C++, так же немного ковыряюсь в линуксе. В принципе ваш стек не так важен, главное чтобы была взаимная мотивация для вката. Ну или просто общение на около айтишные темы, очень не хватает общения с людьми из этой сферы...

Пишите в дс, потом в телегу если что можно: wh1te#6615

Всем добра
No. 26824  
>>26817
Спасибо за напутствие! Пока, как обычно это бывает в процессе работы, придумались новые фичи и выявились более приоритетные задачи. Операции над картинкой пока оставил с костылями, это low-priority task на текущий момент. Но позже к нему вернусь.
No. 26825  
good-menhera.gif - (147.77KB, 278×283)
26825
>>26824
No. 26833  
>>26823
Это что за айди такое?
No. 26845  
163490563547.jpg - (245.09KB, 1440×810)
26845
>>26823
> Сам хорошо знаю Python
Так ты уже вкатился, если ХОРОШО знаешь Python.
No. 26846  
Он ответил мне. Мы съехались и собираемся уехать в казахстан, открыть там студию по производству порноквестов про свиноорков и эльфов.
No. 26847  
captcha.png - (9.71KB, 90×50)
26847
>>26846
Ну и вкусы у вас.
No. 26851  
>>26833
Дискордовское
No. 26852  
>>26851
У меняего нет. Слишком молодежный. В нем Белуга чатится.
No. 26853  
>>26852
Это кто?
No. 26855  
>>26853
https://www.youtube.com/channel/UCmSp4bDxS9R0jpeZEvkut2g
No. 26859  
Так написал кто-нибудь?
No. 26864  
nene.png - (945.51KB, 3444×3444)
26864
>>26862
>>26863
Не смотря на низкую активность нити, не нужно устраивать здесь личный чат.
No. 26877  
>>26864
100 сообщений и переносить уже!
No. 26892  
164170946852.jpg - (968.52KB, 2000×1432)
26892
С новым годом в этом году никто не поздравлял... Перечитал все нити, очень классно и весело, спасибо всем тем кто поддерживал это, особенно Куратору и Джависту Фосфилит, очень увлекательно было с ним DOM деревья обходить! Надеюсь это всё не умрет совсем.
No. 26893  
nene.png - (790.99KB, 720×720)
26893
>>26892
Будем надеяться. Спасибо на добром слове.
В этом году настроения поздравлять не было от слова совсем.
No. 26897  
Чиочан, расскажи про исключения в конструкторе и деструкторе в плюсах. Чем чревато, стоит ли использовать?
No. 26898  
>>26897
Не спец по плюсам, но думаю, если ты кидаешь исключение в деструкторе до того, как освобождаешь все ресурсы, возможны утечки памяти.
No. 26903  
>>26897
Хорошее ЧаВО по теме исключений в плюсах:
https://isocpp.org/wiki/faq/exceptions

>Исключения в конструкторе
>стоит ли использовать?
Официально рекомендуют использовать для зафейлившихся конструкторов:
https://isocpp.org/wiki/faq/exceptions#ctors-can-throw
>Constructors don’t have a return type, so it’s not possible to use return codes. The best way to signal constructor failure is therefore to throw an exception.
>чем чревато?
Не вызовется деструктор, т.к. он не вызывается для объектов которые нормально не инициализировались, а это потенциально ведет к утечке памяти. Нужно не забыть все сделать правильно, и заранее почистить самому что там нужно почистить. Альтернатива - иметь легкий конструктор, а все тяжелое размещать в init-методе, откуда и кидаться исключениями. Формально объект будет инициализован и деструктор вызовется. Также нужно не забыть организовать все так, чтобы твое исключение поймал и обработал хотя бы main().

>Исключения в деструкторе
>стоит ли использовать?
Официально просят никогда так не делать:
https://isocpp.org/wiki/faq/exceptions#dtors-shouldnt-throw
>Write a message to a log-file. Terminate the process. Or call Aunt Tilda. But do not throw an exception!
>чем чревато?
Прибитием твоего процесса сразу:
>since C++11 destructors are implicitly noexcept
Или, если ты указал noexcept(false) - прибитием твоего процесса в случае, когда исключение не обрабатывается тут же, в самом деструкторе, и вылетает в неудачный для процесса момент, например во время размотки стека при обработке другого исключения. Также >>26898 верно указывает, что преждевременная эвакуация из деструктора у мужчин потенциально ведет к утечке памяти.

Дополнительно, для приложений реального времени с жесткими гарантиями отклика, пользоваться исключениями не рекомендуется в принципе.
No. 26904  
>>26903
> т.к. он не вызывается для объектов которые нормально не инициализировались
А кто за этим следит? Компилятор добавляет в класс пометку, что он не инициализирован, которая проверяется по выходу и скоупа?
No. 26905  
>>26904
На концептуальном уровне - если конструктор не завершился, то объект не создался, а если объект не создался, то и деструктора у него нет - вызывать не у кого и нечего.

Вот небольшая статья по этому поводу:
http://www.gotw.ca/publications/mill13.htm
>(a) The constructor returns normally by reaching its end or a return statement, and the object exists.
>(b) The constructor exits by emitting an exception, and the object not only does not now exist, but never existed as an object.

>А кто за этим следит?
За этим следит среда исполнения (рантайм).

>Компилятор добавляет в класс пометку?
Чтобы ответить на вопрос как это устроено технически, нужно нырнуть в код компилятора и код среды исполнения, а я к своему стыду не нырял. Не хочу спекулировать. Может тут кто-то нырял и знает?
No. 26906  
Понятно, спасибо.
No. 26909  
>>26906
Заходи если что, и рассказывай если выяснишь подробности.
No. 26912  
Чиочан, встретил в продуктовом коде вот такую штуку

#define X( a, b ) b,
static const char* mas_name[] = { "some_string" };
#undef X
Никто не помнит, что это, откуда взялось и что делает.
Есть идеи, что это за пляски с дефайнами?
No. 26916  
>>26912
>что это за пляски с дефайнами
Это препроцессорный макрос:
https://cplusplus.com/doc/tutorial/preprocessor/
>When the preprocessor encounters this directive, it replaces any occurrence of identifier in the rest of the code by replacement. This replacement can be an expression, a statement, a block or simply anything.
>The preprocessor does not understand C++ proper, it simply replaces any occurrence of identifier by replacement.
>The preprocessor examines the code before actual compilation of code begins and resolves all these directives before any code is actually generated by regular statements.

В твоем случае объявлен макрос, который будет менять в строчке с объявлением массива mas_name все пары аргументов заключенные в X со скобками, типа
>X(arg1, arg2)
на второй аргумент из пары, причем вот прямо с запятой в конце:
>arg2,

Например
#define X( a, b ) b,

static const char* mas_name[] = { X("Rei", "Hino") X("Rei", "Ayanami") };
#undef X

Превратится в
static const char* mas_name[] = { "Hino", "Ayanami", };

Скорее всего в каких-то таких целях макрос и использовался.
Просто предварительная обработка данных, которую проще было сделать еще до компиляции, и не тратить на нее время при исполнении.
No. 26919  
>>26916
Понятно, спасибо.

Такой еще вопрос. Зачем вкладывать анонимный неймспейс в не анонимный?

namespace name1 {
namespace {

// something something

}
}
No. 26920  
>>26919
Для того чтобы дополнительно ограничить видимость содержимого анонимного неймспейса тем файлом, в котором он объявлен:
https://www.learncpp.com/cpp-tutorial/unnamed-and-inline-namespaces/
>The content of an unnamed namespace can’t be seen outside of the file in which the unnamed namespace is defined.
Т.е. мало того что ты скрываешь что-то в именном неймспейсе, ты еще дополнительно скрываешь вещи от других файлов в этом же именном неймспейсе.
No. 26921  
>>26919
Чаще всего это встречается у имплементаций абстрактных классов. В хедере ты объявляешь порождающий метод/функцию, возвращающий указатель на интерфейс, а конкретную реализацию интерфейса скрываешь от пользователя.
No. 26923  
>>26920
А разве анонимный неймспейс и так не ограничен своим файлом?
No. 26924  
>>26923
Да, все верно, я просто плохо выразился. Речь про то что заключением в анонимный неймспейс дополнительно ограничивают видимость текущим файлом для куска содержимого именного неймспейса, например так как иллюстрирует >>26921
No. 26926  
super_hash.png - (304.56KB, 500×282)
26926
Решил написать многопоточный парсер на питоне воспользовавшись модулем threading но столкнулся с довольно очевидной проблемой. Разные потоки очевидно выполняют ту же самую работу, последовательно проходя по ссылкам в моем случае, и в частности пишут в бд одно и то же, создавая одинаковые записи. Конечно это можно некоторым образом обойти сделав лишний запрос к бд и проверив содержимое поля но мне кажется что алгоритмически это как-то не сильно хорошо. К тому же совершается лишний http запрос. Можно ли теоретически как-то это обойти? Заранее спасибо.
No. 26927  
>>26926
Складывать ссылки в одну общую очередь, а уже затем разбирать их через несколько потоков?

Кстати, threading - это не настоящая многопоточность а херня, потому что питоновский GIL все равно выполняет все потоки по очереди в одном процессе.

> If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing or concurrent.futures.ProcessPoolExecutor. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously.

Используй multiprocessing, и лучше с пулом - не уверен, сильно ли это заметно в питоне, но переиспользование процессов в общем случае уменьшает число системных вызовов и нагрузку.
No. 26928  
>>26927
Еще один вариант - выбирать поток для обработки ссылки в зависимости от ее хеша, например четные хеши отправлять в один поток пула, нечетные в другой. Это не застрахует от повторной обработки ссылки одним и тем же потоком (если они у тебя повторяются), но гарантирует, что разные потоки всегда работают с разными ссылками.
No. 26929  
>>26927
Спасибо, я разобрался что у меня неверно в принципе была реализована многопоточность. Без предварительного помещения ссылок в некую структуру и их последующего разбора разными тредами/процессами в принципе никак не обойтись. Но у меня проблема была даже не в этом. Я попытался сделать некий кэш который хранил бы уже посещенные страницы с целью быстрого рестарта парсера в случае обрыва или другого некорректного завершения работы. И этот кэш хранился в таблице SQLite. Меня крайне удивил тот факт что каждый отдельный тред видит только то что он записал в эту таблицу сам, что естественно и привело к многократному повторению записи кэшируемых страниц. Оказалось что это вполне штатное поведение этой БД, не поддерживающей одновременный доступ разных потоков в принципе(можно костыльно как-то это решить, но лучше не стоит как я понял).

>Кстати, threading - это не настоящая многопоточность

Уже уперся в это. Все это замышлялось в основном для распараллеливания затратной работы с изображениями и естественно GIL намертво блокировал треды и ставил в очередь видимо.

>Еще один вариант - выбирать поток для обработки ссылки в зависимости от ее хеша

В два потока т.е. разбирать?
No. 26931  
>>26929
> В два потока т.е. разбирать?
Ну или находить остаток от деления хеша на какое-то большее число и распеределять на это же число потоков. Не уверен будет ли подобное достаточно эффективно на практике, но сама по себе идея очень нравится

Да, если хочешь быстродействия, то по возможности старайся использовать нативные библиотеки - к примеру numpy вместо ручной итерации по массивам. Для питона это основной способ оптимизации.
No. 26932  
>>26931
> к примеру numpy вместо ручной итерации по массивам

А разве "ручная итерация по массивам" не супероптимизирована в питоне? У NumPy есть какой-то выигрыш?
No. 26934  
>>26932
Нет, с оптимизизацией там грустно, циклы for-in всегда медленные, поэтому по возможности рекомендуется использовать встроенные функции навроде map или же генераторы списков (хотя они тоже так себе). NumPy предназначен специально для массивов со статической типизацией, и по ощущениям быстрее в разы, если не десятки раз.
No. 26935  
А что за тип такой - const char const ?
No. 26938  
>>26935
Вероятно, у вас звездочки потерялись в разметке, и на самом деле это const char ★ const ★?

Если const идет после звездочки (char ★ const), значит const относится к звездочке, и это константный указатель на неконстантный тип - мы можем изменить символ по адресу, на который он указывает, но не сможем изменить само значение указателя.
char * const p = ...;

*p = 'a'; // сработает
p += 1; // ошибка компиляции


Если const идет до зездочки (char const ★ или же const char ★, они эквиваленты, и хотя первая запись выглядит логичнее, вторая почему-то чаще используется), значит const - это про char, и мы имеем изменяемый указатель на неизменяемый символ - мы сможем присвоить указателю другое значение, но не сможем поменять символ на который он указывает.
char const * p = ...; // равносильно const char * p = ...;

*p = 'a'; // ошибка компиляции
p += 1; // сработает


Здесь у тебя мы видим неконстантный указатель на константный указатель на константный символ. Я практически уверен, что твои указатели обозначают начало массива, и здесь мы видим указатель на массив константных указателей на строку.
No. 26940  
>>26938
Вообще, существует даже переводчик с сишных типов на человеческий: https://cdecl.org/
No. 26941  
>>26938
>>26940
Понятно, спасибо.
No. 26947  
>>26941
Заходи, если что
No. 26950  
Чиочан, что лучше: стрингвью или константкая ссылка на стринг? И почему.
No. 26951  
>>26950
Я бы сказал, что за и против хорошо рассмотрены здесь:
https://www.learncpp.com/cpp-tutorial/stdstring_view-part-2/
В частности под заголовками:
>Prefer to pass by std::string_view (over const std::string&)
>Ownership issues
>The data() function and non-null-terminated strings
>Incomplete implementation
Тлдр, string_view новый (с С++ 17) и более универсальный инструмент (пикрелейтед), но этими же факторами и обусловлены его текущие недостатки, включая вот такой:
>If your function needs to call some other function that takes a C-style string or std::string parameter, then const std::string& may be a better choice, as std::string_view is not guaranteed to be null-terminated (something that C-style string functions expect) and does not efficiently convert back to a std::string.
Но хотелось бы узнать мнение основанное на практике пассажиров.
No. 26952  
>>26950
Почти всегда первое.

Если ты работаешь с подстроками (метод std::str::substr возвращает именно string_view), строковыми литералами или же другими вещами, хранящими непосредственно массив символов, string_view позволяет избежать создания нового объекта типа string. Удобно, красиво, эффективно.
Адовый бенчмарк: https://quick-bench.com/q/8s876sepuNcNxnB9g4whbE-q96g

Хотя при желании можно придумать и случаи, когда ссылка на строку будет лучше и логичнее: https://quick-bench.com/q/qo9EyAbjYo4orVWJ2nulUjfsUAc
(Но еще лучше тут было бы pass by value + std::move)

Вдобавок, string_view может вызывать непонятки и дискомфорт у менее привычных коллег (серьезно, и даже от std::move кто-то оказывается в диссонансе).
No. 26953  
>>26951
>>26952
Интересно, интересно. Спасибо.
No. 26955  
Кто-то пробовал собираться с санитайзерами (ubsan) под винду+cmake+clang? Я пару часов пытался, но получил только ошибки линковки от несовпадения каких-то специфических флагов.
No. 26958  
Чиочан, смотри, есть такой код: https://onlinegdb.com/pspGBOF4_
Он падает с сегфолтом при разрушении мапы на двойном освобождении памяти. Мне сказали, что в цикле каким-то образом создается временная копия, которая и портит указатель. Почему она там создается? Вроде же быть такого не должно, там же передача по ссылке, а не по значению.
При этом это как-то по разному работает. В онлайнгдб, все работает корректно. На локальной машине в Qt+MinGW происходит сегфолт.
Что за магия?
No. 26959  
>>26958
Да, интересный и поучительный случай. Здесь нам поможет отладчик GDB, удобно встроенный прямо в сайт (его голубая кнопочка Debug появляется после нажатия на Fork this).

Ставим брейкпоинт в твой деструктор (команда в консоль "b 32", хотя можно было просто нажать мышкой слева от 32 строчки кода)

Запускаем программу (и здесь создатели сайта радуют нас кнопочкой start, хотя я привык вводить в консоль "r" или "run").

Программа останавливается на первом деструкторе, и хотя справа всплыли наглядные таблицы со стеком вызовов и локальными переменными (там еще и строчки в Call stack кликабельные, до чего техника дошла!), я их не заметил и рефлекторно ввел "bt", отобразив этот же бэктрейс в консоли.

Видно, что деструктор SmartPtr::~SmartPtr был вызван из деструктора std::pair<SmartPtr, int>::~pair что в свою очередь сработал в функции main() на строке main.cpp:59
No. 26960  
>>26959
Оказалось что 59 строка - это выход из итерации цикла, и там действительно удаляется временно созданная пара ключ-значение.

Вводом в консоль "с" мы продолжаем выполнение и ловим еще два деструктора на двух следующих итерациях цикла, а затем появляется четвертый - на строке 62: мы выходим из функции main() и уничтожаем мапу wordMap со всем содержимым.

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

И правда, как же так - почему деструктор трех указателей вызывается четыре раза? Может они где-то копируются?
No. 26961  
>>26960
Скопироваться оно может двумя способами: через оператор присваивания (operator= с аргументом по ссылке) и через конструктор копирования. И в том, и в другом случае владеть указателем начнут сразу два объекта, что и приведет к конфузам. Но мы ведь вроде ничем таким не занимаемся, да?

Вспоминаем, что в STL-аналоге твоего умного указателя (std::unique_ptr) эти методы специально удалены в целях безопасности. Давай тоже попробуем их явно удалить (по дефолту компилятор пытается придумать их сам) и скомпилируемся...

Хоба - удаление оператора присваивания ни на что не повлияло, а вот удаление конструктора копирования внезапно ломает сборку:
main.cpp:59:48: error: invalid initialization of reference of type ‘const std::pair&’ from expression of type ‘std::pair’


Как и водится с сообщениями компилятора - нихрена не понятно. И правда, он зачем-то создает объект, чтобы получить на него ссылку. Разве нельзя просто сослаться? Сложно, не очевидно.
No. 26962  
>>26961
А что, если попробовать заменить std::pair<SmartPtr, int> const& в объявлении цикла на auto const&? Может там какой-то другой тип возвращается?

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

Ставим брейкпоинт внутри цикла, запускаем отладчик. Попадаем в нужную точку и хотим посмотреть на переменную kv. Командой "frame 0" выбираем фрейм, обозначенный в бэктрейсе как #0. Других, правда, и не было, но это сейчас, а например в прошлых постах раз бэктрейс состоял из трех или даже десяти уровней-фреймов

Выводим локальные для этого места переменные через "i local". Видим значения наших переменных:
kv = {first = {m_target = 0x55555556eeb0}, second = 1}

...
(хотя можно было посмотреть и через "print kv", да)

Ок, {first=, second=} - выглядит именно как пара. Попробуем погуглить запрос gdb type of variable и пастим команду "ptype kv". Ах, вот оно что...
type = const struct std::pair<SmartPtr const, int>


Мы вручную вписывали тип const std::pair<SmartPtr, int>, а мапка хранит и возвращает нам в итераторе const std::pair<SmartPtr const, int>. Похоже, компилятор решил, что не может привести ссылку на второй тип к ссылке на первый (и это логично, ведь нельзя просто так взять и снять константность) и решил дать ссылку на временную, но очень похожую копию. Чертова константность. Опять.

Выводы: удаляйте либо переопределяйте копирование и присваивание, если владеете чем-то эксклюзивным. Пользуйтесь auto в foreach-циклах.
No. 26963  
>>26958
> При этом это как-то по разному работает. В онлайнгдб, все работает корректно. На локальной машине в Qt+MinGW происходит сегфолт. Что за магия?
А это называется волшебным словом Undefined Behaviour. Предполагается, что о некоторых проблемах программист обязан заботиться сам, а машина под его чутким руководством никогда с этим не столкнется, и ее поведение в таких случаях никак не регламентируется. Хорошо, если она просто упадет - программист узнает что он где-то налажал, и его заставят чинить. А ведь оно может молча испортить какие-то свои или чужие данные. Или даже поменять свою логику работы - некоторые компиляторы считают, что если при некоторых будет происходить UB, то такие условия никогда не наступят, а значит можно лихо соптимизировать целые ветки кода! Хотя может и повезти - и на определенных комбинациях платформы и версии компилятора все будет работать как ты хотел. А потом ты обновишь компилятор или поменяешь строчку кода в другом месте, и все взорвалось.

>>26955
Собственно поэтому я и искал здесь санитайзер ubsan - он предназначен для обмазывания работающего кода всевозможными проверками (за счет многократного увеличения объема бинаря и замедления его работы) и выявления всех таких неожиданных случаев. Коллеги сделали чудо-ML-проект на винде, но жизнь заставила их собрать его под линукс - и по загадочным причинам точность работы их кода упала с 99.9% до просто 99%. Неопределенное поведение как оно есть.

Поэтому очень полезно запускаться под санитайзерами, а еще лучше прогонять под ними все автотесты. И не игнорировать предупреждения компилятора. И вообще навечно выставить флаг -Werror (с дополнительными проверками вроде -Wextra -Wall) и не думать ни о чем.
No. 26965  
>>26955
>Кто-то пробовал собираться с санитайзерами (ubsan) под винду+cmake+clang?
Я сам не пробовал, но увидел в интернете людей которые пробовали:
https://stackoverflow.com/questions/55480333/
Они подсказывают что если ты просто хочешь поймать undefined behavior как таковое, то можно попробовать обойтись тем репортером что в стандартной поставке:
>-fsanitize=undefined -fsanitize-undefined-trap-on-error
>This flag is supported by both GCC and Clang.
>The -fsanitize-undefined-trap-on-error option instructs the compiler to report undefined behavior using __builtin_trap rather than a libubsan library routine.
Ты наверняка про это все уже в курсе, пощу просто на всякий случай.

Надеюсь кто-то из пассажиров подскажет как саму ubsan заставить работать.
No. 26966  
>>26962
Спасибо за подробное объяснение.
>const std::pair<SmartPtr const, int>
А почему тут возникает const у SmartPtr?
No. 26971  
>>26966
Алгоритм поиска полагается на то, что содержимое этой мапки отсортировано по ключу. Если кто-то изменит уже сохраненный ключ, поиск сломается.
No. 26975  
>>26971
Ничего не понял. Какой алгоритм, какого поиска? Разве при изменении ключа мапа автоматом не пересортируется?
No. 26976  
>>26975
Пересортируется, если ты вызовешь правильный метод вроде insert. А если будешь злодействовать с ссылкой на ключ - мапа и не догадается, что в ней кто-то побывал.

https://onlinegdb.com/asXDxzPHF
No. 26977  
>>26975
Ну и если быть точным, то по правде там не совсем сортировка, а сложная структура с ссылками на соседей. Хотя проще говорить про сортировку, чтобы не погружаться, да.
https://ru.wikipedia.org/wiki/Красно-чёрное_дерево
No. 26980  
unknown.png - (4.15MB, 1200×1645)
26980
Ну што, булочки и булочкессы. Напишу небольшой репорт касательно своего пути на становлении дотнекой.

Я весь декабрь разгребал дела в реальном ИРЛ мире. Где-то в середине месяца разгрёб завал, взялся за решение пока что задач, которые относят к классу "олимпиадных". Взял Advent of Code 2022, порешал задачек пять. Codewars потыкал немного (5 kyu), но, если честно, смысла особо не видел, т.к. я не сильно плохо решаю. Потом вспомнил про ту гуглотабличку с вопросами на собеседовании, ну и понял, что я плохо понимаю основы языка вообще. Всякие стэк и кучи, ссылочные и значимые типы, классы, интерфейсы и далее. Весь январь я читал Троелсена, параллельно смотрел в Metanit и видео у https://www.youtube.com/@IAmTimCorey , конкретно плейлисты Getting started with C# и Advanced Topics in C#. И ulearn.me ещё советую, хороший ресурс.

В феврале первую неделю (и последнюю неделю января) потратил на решение проблем с глазами (сухой глаз), а так недавно взялся за ASP.NET Core, параллельно заглядываю в SQL (на Степике хороший курс) и пользуюсь .NET CLI на линуксе.

Самая главная проблема у меня - это собрать себя в кучу и сесть за учёбу. Заставлять себя не так тяжело оказалось, но трудно было собирать себе программу обучения (что сначала учить, что потом...) и найти понятные и глубокие при этом ресурсы.

>>26723-кун
No. 26981  
>>26980
А у тебя в посте указана твоя итоговая программа обучения, или ты какую-то другую в итоге составил? Если да, можешь ей тоже поделиться?
No. 26992  
А кто-нибудь тут шарит в Erlang?
No. 26996  
teenager_lina_sticker.png - (179.32KB, 421×512)
26996
>>26992
Проработал испытательный срок.
В OTP не погружался, но чутка попилил.
Самый простой в мире язык, как говорят.
Писал балансер, поднимал кластеры, крутил на них юнит и интеграционные тесты.
Щас все забыл, но спрашивай, может и помогу.
No. 27009  
Ни у кого не на примете примера сервера-демона на плюсах? Или просто гайда, как писать демоны.
No. 27010  
>>27009
>Гайд как писать демоны
Типа такого?
https://netzmafia.ee.hm.edu/skripten/unix/linux-daemon-howto.html
No. 27013  
А как отправить и принять большой файл по tcp в си? Больше, чем любой возможный размер буфера. Отправить, допустим, можно по кускам. А получать как? Как приемник поймет, что файл кончился и начался другой файл и надо сменить место, куда его писать?
No. 27014  
>>27013
Есть разные варианты, но самый простой наверное такой:

>Как приемник поймет что начался другой файл
Перед файлом придет заголовок, в котором будет сказано что сейчас будет файл, размер столько-то байт. У заголовка будут признаки по которым его можно будет отличить от всего остального.

>Как приемник поймет, что файл кончился
Когда вычитает указанное в заголовке количество байт.
Можно еще отправить какой-нибудь концевик, в пику заголовку.
No. 27018  
delphi_11_3.png - (39.86KB, 551×193)
27018
>>26104
>Жив ли Delphi?
А Delphi-то не просто жив, а живее всех живых! https://www.embarcadero.com/products/delphi
No. 27019  
Чиочан, ты когда-нибудь пользовался VS Code + cmake под линукс?
Нажимаю F5, но почему-то компилируется только активный файл, а не весь проект, все, что написано в CMakeLists.txt игнорируется. Если собирать руками из консоли, то все нормально. Причер когда-то давно все нормально работало. Что делать, как чинить?
No. 27023  
>>27019
>VS Code + cmake под линукс
>почему-то компилируется только активный файл
Есть вариант, что так просто указано в твоем tasks.json:
>You can modify your tasks.json to build multiple C++ files by using an argument like "${workspaceFolder}/✱.cpp" instead of ${file}.This will build all .cpp files in your current folder.

Пример tasks.json который дают человеку со схожей проблемой:
https://stackoverflow.com/a/59236875
No. 27024  
>>27023
Да, это помогло. Но при этом все равно для сборки используется не cmake и CMakeLists.txt. Можно как-то заставить среду использовать их?
No. 27027  
>>27024
>Можно как-то заставить среду использовать cmake?
По идее ты можешь просто сделать
>(Ctrl+Shift+P) and run CMake: Build

Но вообще нужно чтобы проект был сконфигурен под CMake, для чего нужно три вещи
>Select a kit
>(Ctrl+Shift+P) and run CMake: Select a Kit

>Select a variant
>(Ctrl+Shift+P) run the CMake: Select Variant command

>CMake: Configure
>(Ctrl+Shift+P) and run the CMake: Configure
или даже
>(Ctrl+Shift+P) and run the CMake: Delete Cache and Reconfigure

Все из этого сделано?

>If you don't see the compiler you're looking for, you can edit the cmake-tools-kits.json file in your project.
Наличие этого файла в проекте наверное хороший индикатор.
No. 27028  
faptcha_php.png - (2.89KB, 90×50)
27028
>>27018
Так это жизнь или предсмертная агония? А может уже посмертное существование...
No. 27029  
Вопрос начинающего по гиту.

Пусть в репозитарии имеется некоторое количество файлов в определенном формате, например — file1.xml, file2.xml, file3.xml. На самом деле их, конечно, куда больше.
Допустим, я решаю поменять избыточный для данной задачи формат, создаю ветку xml2csv, прогоняю их через скрипт, получаю, соответственно file1.csv, file2.csv, file3.csv.
А тем временем в master добавились новые коммиты, изменился file2.xml, удалился file3.xml, добавился file4.xml. Ну и, конечно, куча других изменений, которые этого формата не касающихся.

Внимание, вопрос. Как теперь это дело мержить?
Причем так, чтобы сохранилась история изменений в file2.csv?

Ниже описываю мою ламерскую попытку (только не смейтесь):
1. Создал ветку xml2csv2 из текущего master,
2. В ней merge с предыдущей, куча ругани, git add для всех csv, git rm для всех xml. Commit.
3. За пределами гита сконвертировал в csv все взятые из master xml, удалил все csv в своей ветке, заменил на эти, git add для всех csv.
4. Теперь гит ругается на удаленные файлы, как заставить git rm удалить все те файлы, которые удалены фактически (и только их) — не нашел. Пришлось делать git commit -a...

Это в примере там один файл удален, на самом деле — полсотни. Более того, часть конвертируемых файлов — бинарные, а еще файлы с метаданными, у которых имя не меняется, а merge пришлось делать с хитрыми опциями, иначе оно фейлилось...

В общем ясно, что этот способ никуда не годится. Результат я так, конечно, получил, историю изменений сохранил, но какой ценой?
Причем только грубую историю изменений — между теми точками, в которых я утягивал их к себе.
Как сделать правильно?
No. 27030  
>>27029
Тоже хочу узнать, как поступить правильно в такой ситуации. Как бы сделал я:

1. Начал бы хранить CSV-файлы в отдельной новой папке. Это помогло бы избежать конфликтов и хранить историю изменений как старых, так и новых файлов.
2. Поменял бы код / конфигу, чтобы проект работал с CSV-файлами из этой новой папки.
3. Примержился бы с этим в мастер, чтобы поймать момент внешних изменений в старые XML файлы и чтобы все были в курсе, что теперь надо пользоваться CSV (ха-ха)
4. Добавил бы старые XML файлы в .gitignore, чтобы в них нельзя было внести изменения случайно, и примержился бы в мастер еще раз. Рецепты как правильно заигнорить ранее затреканные файлы в зависимости от пожеланий:
https://stackoverflow.com/a/54481162 (оставить файлы только себе)
https://stackoverflow.com/a/936290 (оставить файлы всем)
5. Перенес бы пойманные на данный момент изменения XML файлов в CSV
6. Примержился бы в последний раз

После чего можно в принципе и грохать папку с XML.
По идее, можно действовать агрессивнее и первым сделать пункт 4, т.е. сначала антрекнуть все старые файлы, а потом уже их конвертировать.
No. 27032  
>>27029
git rebase
No. 27033  
>>27030
>Примержился бы с этим в мастер,
>(ха-ха)

Именно что ха-ха, никот мне не даст туда примержиться, у меня свой форк, у них свой (на самом деле "их" там как минимум три разных команды и у каждой свой форк и свое видение развития проекта. А я, видимо, стану четвертым...)

Но в целом за идею спасибо. Со сменой путей к данным там всё грустно, но можно раскидать разные варианты форматов по разным директориям, а ту, которая захардкодена у них в коде, делать ссылкой на одну из них.

>>27032
Эээ... А как его можно использовать в этой ситуации?
No. 27034  
>>27033
>Можно раскидать разные варианты форматов по разным директориям, а ту, которая захардкодена у них в коде, делать ссылкой на одну из них
Это наверное был бы лучший выход из ситуации, главное чтобы по гиту все опять сошлось с этой папкой, когда изменения из апстрима будешь тащить.
No. 27035  
>>27033
Сначала все их коммиты, затем все твои коммиты, затем мерж с deprecation notice, затем удаление.
Если у файлов разное расширение, впрочем, там и так не должно быть никаких конфликтов, потому что это разные файлы.
No. 27037  
rzFrTvDMhEA.png - (2.23MB, 960×1280)
27037
Итак. C# + ASP .NET, работа с SQL и NoSQL, Redis и Memcached, ORM (EF Core, Dapper), Docker. Нет коммерческого опыта, есть опыт работы в IT сисадминством (работа с серверами, linux, windows, виртуалки, ad dc...).
367 просмотров, 49 откликов, 5 созвонов с работодателем и 2 тестовых. Ищу не очень активно (не веерная рассылка, а точечная, пишу понравившимся и подходящим работодателям), но долго, с февраля 2023 года.

Два тестовых:
1. Сделать REST Web API магазина автозапчастей с возможностью заказа, разных запросов к разным эндпоинтам (запчасти, клиенты, заказы) с возможностью кастомизировать выдачу (выдать запчасти только в наличии и отсортировать их по порядкам, выдать запчасти из определённой группы и/или с определённой ценой...) и "другие необходимые для нормального функционирования сервиса функции". Использовать MS SQL, EF Core, кэширование, Basic Auth, Swagger.
Сделал за неделю, было... немного тяжеловато, справился. Месяц долбал HRку для получения хоть каких-то ответов касательно вакансии (та умудрилась сходить в отпуск на неделю, но всё равно видно, что им не особо нужен я). Отказ из-за "неправильной архитектуры", "лишних функций, не входящих в ТЗ" и "грязного кода" (согласен, кстати).
Региональный автомагазин. Зарплата не указана, грейд не указан.

2. Описать словами и разобраться в выводе SQL-запроса (110 строчек и 4300 символов, рекурсивные и оконные функции и много забавных штук). Разобрался, всё ок. Прошёл на собес (о нём чуть ниже).
МТС. От 80000 рублей.

Собес: пообщался с HR по телефону до и после тестового, та пригласила на собес очный.
Общался час с 3 людьми в одной комнате, должности не сказали, но, судя по всему, они не связаны с технической частью. Искали человека, который будет поддерживать и документировать чужой древний код (без документации и программистов, работавших над кодом). 20к строк, ado .net, ms sql. И фронт, и backend, и сисадминство в том числе.
Спрашивали про мои проекты, я рассказываю про тестовое (описывал выше) на гитхабе, плюс разбираюсь в коде Jellyfin на github, хочу помочь, мне нравится программа и т.д. Ну и упомянул всколзь, что пишу давно на шарпе, с универа.

Вопросы:
Какие интересные проекты я делал в последние 3 года (когда начал говорить про web api, те сказали, мол, не, нам интересен университет, который я окончил в 2018 году)?
Есть ли опыт работы с чужим кодом (рассказ про чтение и разборку в коде Jellyfin был 10 минут назад)?
Есть ли опыт фриланса (нет)?
Как я, например, буду переводить проект с одной субд на другую. Отвечаю: смотрю на требования, смотрю, в чём могут быть различия и примерно думаю, где должны быть проблемы и т.д. Собеседующий: не, не это, вот например, субд на сервере, а сервер переехал, как ты будешь искать, где подключение к базе данных?
Я ничего не понимаю, говорю, что connection string в конфигах, смотрю на database context и прочее, это не проблема. Начинаю рассказывать про DI-контейнер, appsettings.json, MyDBContext : DbContext и прочее. Мужчина говорит, что ожидал ответа про то, как я найду в коде часть, которая отвечает за общение с базой данных. Я честно сдаюсь и прошу рассказать, какой ответ они хотят от меня. Оказывается, надо было отвечать про "взгляд сверху на код", про "общую картину и детали", прочую ерунду. Потом получаю всё тот же вопрос, но сбоку, мол, как бы ты работал с базой данных в программе и коде, как бы ты понял, что "именно эта строчка делает запрос".
Вздыхаю, мысленно прощаюсь с оффером. Говорю, что дал им ответ, но, раз они не поняли, то, наверное, у них какой-то хитрый способ общаться с базой данных? Отвечают: ADO .NET. Спрашиваю: а кто вам вообще нужен? Что за задачи, что за умения, навыки?
Ответ: мы не знаем многое про проект, потому что программе 6+ лет, программист ушёл, документации нет, всё плохо работает. Есть веб-сервис с фронтом и бэком, который что-то делает с запросами.

Устал, прошу или прислать мне тестовое, или написать отказ, желательно с фидбэком. Обещают дать задачку: на вход даётся табличка (excel?), а мне надо на фронте нарисовать график двухмерный.

пойду спать, к чёрту это всё.
No. 27041  
Чиочан, два вопроса:
1) Когда и как можно левелапнуться из джуна в мидла и что для этого нужно? Нормально ли для этого менять работу?
2) Какие Анонимус может посоветовать компании, где пишут на плюсах?
No. 27042  
>>27041
>Когда и как можно левелапнуться из джуна в мидла и что для этого нужно?
Цитирую HR: "Если 2 года опыта есть, то уже миддл"
Т.е. если будешь подаваться в другую компанию, то с таким опытом они тебя уже миддлом будут считать, если ты сам не укажешь обратное.
No. 27045  
>>27037
> Отказ из-за "неправильной архитектуры", "лишних функций, не входящих в ТЗ" и "грязного кода" (согласен, кстати).
Они твой код с минимальными правками себе на сервер задеплоили, и пользуются. Не думаешь так?
No. 27046  
>>27045
Я думал, но вообще в таком случае я буквально уклонился от пули, когда получил отказ. Тип, если ребята просят написать CRUDы у джуна без опыта работы под видом тестового, то это гнилая и тухлая контора, и хорошо, что я узнал до того, как поработал у них месяц или два.

В целом же я получил опыт решения рабочей задачи, кое-что устоялось в голове во время планирования решения, профит я получил заметный. Ну и проект в портфолио заинтересовал одну зарубежную конторку, может, возьмут.
No. 27047  
>>27037
> 2)
Я бы повесился от такой команды и таких задач. И зп скромная.

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

К первым отнеслись Яндекс и конторы поменьше, завязаные на ML / компьютерном зрении или подобных вещах (они меня брали), ко вторым - Вконтакт и всяческие писатели запросов в базу (разумеется, они меня не брали, лол).

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

>>27041
> компании где пишут на плюсах
Яндекс же. Главное решить алгоритмы, остальному научат. Из минусов - у них своя закрытая экосистема (даже STL заменен на свои велосипеды), так что на выходе ты приобретешь опыт только в языке как таковом (и, быть может, в проектировании).
No. 27051  
Чиочан, нужен простой и понятный гайд, как с нуля прикрутить с тестовой программке на C++ простенькие юнит-тесты, желательно Gtest, желательно в VScode
No. 27054  
>>27051
По идее для VSCode тебе надо воспользоваться вот этим:
https://github.com/matepek/vscode-catch2-test-adapter

А обычная Visual Studio вроде как поддерживает эти тесты из коробки.
No. 27061  
Clipboard06.webp - (49.89KB, 811×1036)
27061
На днях увидел как анончик играет в ВНку Sunrider и встал вопрос о линейности новелок. Существуют ли готовые инструменты для построения графа диалогов женерик игры на ренпае? Если готовых нет, в какую сторону стоит думать для его написания?

С одной стороны, это тьюринг-полный скриптовый язык с возможностью пайтон-вставок, а значит, предполагаю, нужно строить какое-нибудь синтаксическое дерево. Никогда подобного не делал, поможет ли в этом модуль ast из стандартной библиотеки? Или, может, будет проще переиспользовать ast.py самого движка?

С другой стороны, пока осилил только банальный построчный проход по https://raw.githubusercontent.com/vaendryl/Sunrider/master/script.rpy с сохранением лейблов и джампов. Сначала получилась совсем ерунда, потому что многие переходы сделаны через запись имени лейбла в переменную и последующий джамп на метод dispatch. Добавил костыль, стало гораздо лучше, можно проследить ветвление диалогов в рамках отдельных миссий, но всё же хотелось бы нечто более универсальное.

// при попытке приаттачить большую svg, мускуль упал с ошибкой Out of range value for column 'image_w' at row 1 - залью отдельно на кошкокоробку https://files.catbox.moe/91r4mu.svg
No. 27062  
>>27061
>Существуют ли готовые инструменты для построения графа диалогов женерик игры на ренпае?
Знаю как минимум один, но не знаю насколько он тебя устроит:
https://github.com/EwenQuim/renpy-graphviz
No. 27063  
>>27062
Спасибо, красивенько! Автор подошёл более основательно, но, по сути, делает то же, что и я: читает построчно, складывает лейблы и джампы в граф, потом рисует графвизом. Только там, где я запоминаю всего лишь предыдущую строку, он накапливает весь контекст – таким образом у него больше информации, на каком уровне вложенности находится и что ему повстречалось раньше. Здорово придумал, утащу к себе. Но, всё же, не AST.
No. 27065  
>>27063
>Спасибо, красивенько!
Рад что удалось помочь, заходи!
No. 27069  
>>27041
Повысили до сеньора, когда я освоил алгоритм, с которым до меня не справились два балбеса. Никаких в своем скилле я при этом не чувствую, видимо лучший путь к повышениям - чаще менять работу.
No. 27070  
Чиочан, а расскажи про static_cast, dynamic_cast и reinterpret_cast. Когда использовать, какие особенности, какие подводные камни.
No. 27071  
>>27070
static_cast - производится на этапе компиляции: работает на примитивных типах, при приведении дочернего типа к родительскому, либо если у класса определен метод вида "operator other_type() const". Самое простое и понятное - например int к bool, std::ifstream к bool, std::ifstream& к std::istream&.

dynamic_cast - попытка приведения ссылки или указателя родительского типа к выбранному дочернему. Выполняется в рантайме, срабатывает, если наш объект изначально создавался с дочерним типом. Если нет - вернет nullptr или кинет исключение. Необходимость в использовании бывает редко, сам видел только однажды.

reinterpret_cast - самое грубое. Просто интерпретирует байты одного типа как байты другого. Нередко так делают на указателях, на практике я так доставал чиселки из блоба бинарных данных - например у тебя есть куча байт в векторе "std::vector<unsigned char> data", и ты ты уверен, что байты с 100 по 103 кодируют число типа uint32 - тогда делаешь reinterpret_cast<uint32_t*>(&data[100]) (если уверен в порядке байтов)

Подводных камней есть, я сам мог о чем-то не вспомнить, а то и вспомнить неправильно - но уверен, что на https://en.cppreference.com/ должно быть достаточно подробно расписано.
No. 27072  
>>27071
Понятно, понятно.

Такой еще вопрос попался.
Была определена через дефайн константа. Решили, что это неправильно и ее заменили на static constexpr в private секции класса. Спрашивается, как сэкономить эти 4 байта в статической памяти и не хранить там вообще ничего, но чтобы константой можно было пользоваться? Это какие-то фокусы с using?
No. 27073  
>>27072
Ты хочешь алиас для литерала, но более адекватный чем макрос? У меня даже идей нет: using точно этого не умеет.

Всегда делал это через static constexpr, хотя иногда требовалось указывать static inline constexpr, если литерал строковый.
No. 27074  
>>27073
А нет, придумал. Нужно определить constexpr-функцию, возвращающую твоё число. Она будет вычислена на этапе компиляции, но храниться нигде не должна. Прикольно.
No. 27076  
>>27033
>Со сменой путей к данным там всё грустно, но можно раскидать разные варианты форматов по разным директориям, а ту, которая захардкодена у них в коде, делать ссылкой на одну из них.

Как показала практика, это была очень плохая идея. В результате merge гит попытался добавить новые файлы в директорию, обнаружил на месте нее симлинк, стал творить какую-то херню (я так и не понял, какую именно), получил переполнение renameLimit и выдал fatal error. На попытку откатить это через merge --abort он тоже выдавал fatal error. В итоге пришлось через git rm -rf удалить все проблемные директории, сделать коммит, а потом reset --hard. И только так удалось откатиться.

Вообще, это, похоже, часть более общей проблемы. Гит как я понял, не умеет отслеживать перемещение директорий. В результате может быть, например, такое:

1. В ветке master имеем директории foo и bar.
2. Создаем ветку slave, в ней переименовываем bar в baz, а foo в bar.
3. В ветке master добавляем в bar новые файлы.
4. В ветку slave сливаем последние изменения из master и получаем в директории bar левые файлы, которые должны быть в baz.

Если их там парочка, это еще можно поправить ручками… А представим, что у нас в проекте over 9000 директорий, в slave переименовали 3000 из них и у 500 названия совпали, а в master в каждую директорию добавили новых файлов десятка так два-три… inb4: такое и без новых файлов выдаст 100500 конфликтов слияния и сдохнет (Впрочем, суть проблемы, полагаю, ясна)

Сейчас пробовал гуглить, как с этим бороться — ничего путного не нашел. Зато нашел кучу заявлений в стиле отслеживать перемещение не нужно, этим страдают лишь пришедшие с svn нубы… Да уж, под svn такой фигни не было, это точно. При всех его недостатках, работа с директориями там была налажена на отлично…
No. 27077  
>>27076
>Сейчас пробовал гуглить, как с этим бороться — ничего путного не нашел.
UPD. Таки нашел.
Вот это: https://blog.palantir.com/renaming-and-deep-directory-hierarchies-in-git-f8e96d5e39a9?gi=ce6cdf83ec9f

Там и про глюки с переполнением renameLimit, и много чего еще. Пишут, что проблема, вроде бы решена в git-2.22.0. Правда не ясно, сработает ли это с репами, созданными в более старых версиях…
No. 27080  
>>27076
>Гит как я понял, не умеет отслеживать перемещение директорий
man git-mv

>стал творить какую-то херню
А что, по-вашему, он должен был начать делать?
No. 27081  
>>27076
>>27077
>В результате merge гит попытался добавить новые файлы в директорию, обнаружил на месте нее симлинк, стал творить какую-то херню (я так и не понял, какую именно)
Мог ты столкнуться с вот этим багом?
>Note that with Git 2.24 (Q4 2019), a bug in merge-recursive code that triggers when a branch with a symbolic link is merged with a branch that replaces it with a directory has been fixed.
https://stackoverflow.com/a/48483797
No. 27082  
>>27080
>>стал творить какую-то херню
>А что, по-вашему, он должен был начать делать?
Нормальная система контроля версий должна в подобной ситуации понять, что директорию переименовали, и при слиянии для новых файлов следует использовать новый путь.

И тот факт, что гиту, если верить ссылке из >>27077, потребовалось почти полтора десятка лет, чтобы этому хоть как-то научиться, вызывает некоторые вопросы…
No. 27098  
Чиочан, как начать учить Qt? Какие книжки и курсы посоветуешь? Хотелось бы именно онлайн курсы, а не книгу. Может, есть хороший плейлист на Ютубе с уроками?
No. 27100  
>>27098
>Как начать учить Qt?
>Может, есть хороший плейлист на Ютубе с уроками?
Коллеги из С++ нити >>/dev/17934 рекомендуют сборник материалов https://github.com/fffaraz/awesome-cpp

Этот сборник в свою очередь указывает на такие плейлисты по Qt:

>C++ Qt Programming by VoidRealms
https://www.youtube.com/playlist?list=PL2D1942A4688E9D63
Выглядит очень внушительно (200+ видео!), начинается с самих азов, и в том числе включает в себя превью онлайн-курса по Qt на Udemy.

>C++ GUI with Qt Playlist
https://www.youtube.com/playlist?list=PLD0D54219E5F2544D
Здесь изложение более краткое, "всего" 14 видео, что может быть лучше для восприятия.

Сообщай подходит тебе такое, или нет.
No. 27101  
>>27100
Спасибо, буду пробовать.
No. 27102  
>>27101
Сообщай потом о результатах.
No. 27104  
На чем можно написать свой имиджборд?
No. 27105  
>>27104
Интереснее, на каком языке имиджборд еще не писали.
No. 27106  
>>27105
Ну я вообще просто хочу написать свой имиджборд. На чем обычно это пишут? И выучить какой-нибудь яп для этого.
No. 27107  
>>27106
>На чем можно написать свой имиджборд?
>На чем обычно это пишут?
Классические движки имиджборд (начало нулевых) писались на Perl.
Следующее поколение движков (середина нулевых) писали уже на PHP.
Текущие энтузиасты (середина десятых и далее) пишут свои движки на Python и Node.js
No. 27108  
>>27107
Если у тебя задача "выучить язык" – просто пиши на любом, который хотел бы выучить.
И лучше, мне кажется, писать то, что решает какую-то твою проблему, для которой не подходят существующие продукты.
No. 27109  
>>27108
Знать бы какие у меня проблемы. А так языков, которые вызывают интерес много.
No. 27110  
>>27109
Хочешь рандомный язык - пиши на расте.
No. 27111  
Что лучше: сделать массив глобальным или сделать его статическим? Или сразу и то и другое? Имеет это смысл делать для увеличения быстродействия?
No. 27112  
>>27111
> Что лучше: сделать массив глобальным или сделать его статическим
Второе - чем меньше область видимости, тем меньше возможных проблем.
> Имеет это смысл делать для увеличения быстродействия?
Если многократно создаешь одни и те же данные - возможно. В общем же случае не стоит. Вообще, когда ты думаешь о быстродействии, лучше полагаться не на теорию, а на замеры - так ты поймешь, действительно ли это так работает и заметен ли эффект.
No. 27113  
>>27110
Вот раст не хочу. Выбор из PHP, Ruby, Visual Basic.
No. 27114  
faptcha.png - (1.26KB, 90×50)
27114
>>27113
> VB
Бери C#.
No. 27115  
>>27113
>Выбор из PHP, Ruby
Если движок писать как упражнение - Ruby
Если как готовое решение "на сейчас" - PHP
No. 27129  
Мне кажется, что я самый тупенький программист на планете.
No. 27130  
faptcha_php.png - (1.23KB, 90×50)
27130
>>27129
Мне тоже
No. 27131  
>>27129
Я тоже так думал, пока не сменил место работы. Теперь меня перестали окружать сверхлюди, а на фоне новых коллег я и сам умный и знающий (что, конечно, тот еще лол).
No. 27140  
Вопрос по наследованию в java. Предупреждаю сразу, язык знаю весьма скверно, можно считать, почти не знаю (он, конечно, похож на все остальные, но...)

Так вот. Я столкнулся с ситуацией, когда метод тупо не наследуется. И хочу понять, что это за фигня.

Ситуация такова. Я захотел немного пропатчить трубы в одном широко известном в узких кругах моде к майнкрафту.
Взял вот этот метод: https://github.com/BuildCraft/BuildCraft/blob/7.1.x/common/buildcraft/transport/pipes/PipeItemsClay.java#L48
Перенес его в соседний класс: https://github.com/BuildCraft/BuildCraft/blob/7.1.x/common/buildcraft/transport/pipes/PipeItemsWood.java
Изменил там приоритеты направлений на противоположенные, т.е. для контейнеров не максимальные, а минимальные. Оно там напрашивается, странно, что разработчики сами так не сделали.

Для деревянных труб всё заработало. А вот для производных от них (PipeItemsEmerald и PipeItemsEmzuli) — нихрена. Причем если тупо скопипастить этот код в те два класса тоже — всё начитает работать.
А сам по себе метод тупо не наследуется. Как такое может быть?
Не, чтобы просто мне самому поиграть в майн, конечно, сойдет и такой грязый хак с продублированным 4 раза кодом, но я хочу понять, что происходит...

Там первой строчкой для метода устанавливаются какие-то метаданные. Может быть дело в них? Допустим, метод наследуется, метаданные нет, обработчик событий их не видит и метод игнорирует. Может такое быть? Если да — как это можно поправить?
No. 27142  
>>27140
>Там первой строчкой для метода устанавливаются какие-то метаданные. Может быть дело в них?
Эти метаданные - аннотация. Да, дело скорее всего в ней.
Вот ее объявление:
https://github.com/BuildCraft/BuildCraft/blob/7.1.x/common/buildcraft/transport/pipes/events/PipeEventPriority.java

>Допустим, метод наследуется, метаданные нет, обработчик событий их не видит и метод игнорирует. Может такое быть?
Думаю, именно это и происходит.
>Java, by default, does not allow the custom annotations to be inherited.
>@Inherited is a type of meta-annotation used to annotate custom annotations so that the subclass can inherit those custom annotations.
И, как можно видеть, такой мета-аннотации на @PipeEventPriority нет.
Но! Фигня в том, что даже если бы она и была, это ничем бы не помогло, потому что @PipeEventPriority выставлена на метод, а не на класс:
>Note that @Inherited meta-annotation type has no effect if the annotated type is used to annotate anything other than a class.
Наглядно и в примерах наследование аннотаций показано тут:
https://medium.com/@alvinlkk0409/do-you-know-annotation-in-java-can-be-inherited-da300e614b30

>Как это можно поправить?
В лоб вижу два пути:

1. Правильный. Добавить к аннотации @Inherited, а затем дополнительно поменять механизм внутри мода, который достает аннотацию @PipeEventPriority так, чтобы он мог ее и для метода достать. Пример кода-доставатора: https://stackoverflow.com/a/10673761

2. Простой. Сделать в производных классах метод-прокладку, который будет дублировать cаму аннотацию, но не код:
>public class PipeItemsEmerald extends PipeItemsWood implements ISerializable, IGuiReturnHandler {
>...
>@Override
>@PipeEventPriority(priority = -100)
>public void eventHandler(PipeEventItem.FindDest event) {
> super.eventHandler(event);
>}
>...
>}

Интересно, можно ли это решить элегантнее?

На всякий случай, проверить аннотацию для класса можно вот так:
>PipeItemsWood.class.getMethod("eventHandler").getAnnotation(PipeEventPriority.class)
>PipeItemsEmerald.class.getMethod("eventHandler").getAnnotation(PipeEventPriority.class)
Не забудь завернуть в try {} catch {}
No. 27144  
lambda.png - (19.70KB, 1259×311)
27144
Чиочан, помоги.
https://paste.ofcode.org/KURH65fFQZTNgcgkPjDZWH
Написал лямбду для рекурсивного удаления папок, но не смог сделать ее рекурсивной без передачи аргумнета self. Если его убрать и вызывать лямбду по имени, то получается ошибка Variable 'removeDir' declared with deduced type 'auto' cannot appear in its own initializer.
Что я делаю не так? Я видел примеры рекурсивных лямбд без селфа, но у меня они не работают.
No. 27145  
>>27142
Спасибо!

>1. Правильный. Добавить к аннотации @Inherited, а затем дополнительно поменять механизм внутри мода, который достает аннотацию @PipeEventPriority так, чтобы он мог ее и для метода достать.

В общем, если форкать BuildCraft всерьёз (а там, вообще, вещей, которые стоило бы поменять, довольно много...), то курить нужно именно это.
Ясно, будем трясти...

>2. Простой. Сделать в производных классах метод-прокладку, который будет дублировать cаму аннотацию, но не код

Ну, до такого я уже и сам додумался.
Лишь немного сгладить то безобразие, которое там у меня сейчас...
No. 27146  
>>27144
Проблема в том что компилятор не может взять и узнать тип твоей рекурсивной лямбды заранее. Надо ему помочь.
Прочитав вот эту статью там кстати склоняются в пользу self:
https://artificial-mind.net/blog/2020/09/12/recursive-lambdas

Мне удалось помочь компилятору вот таким способом:
>using removeDir_t = bool(*)(const QString&);
>static removeDir_t removeDir = [](const QString &dirName) {
>...
>}
Что убирает ошибку при компиляции, но не уверен что в твоем случае этот способ применим.
Ждем советов от людей лучше понимающих в С++
No. 27148  
>>27145
>Спасибо!
Заходи, если что.
No. 27152  
>>27146
Спасибо за ответ.
No. 27153  
Почему sizeof объекта, содержащего только методы, возвращает 1, хотя если сделать sizeof указателя на метод объекта, будет возвращен валидный размер указателя? Разве указатели на методы не в классе хранятся?
No. 27155  
>>27153
Потому что если метод не виртуальный, то соответствующая функция точно известна уже на этапе компиляции и держать какую-то дополнительную информацию в объекте не нужно.

Если же класс будет иметь хотя бы один виртуальный метод, то объекты класса станут хранить указатель на соответствующую таблицу виртуальных методов, определяющую вызываемую функцию во время исполнения. Тогда размер объекта будет больше ровно на один указатель.
No. 27156  
>>27155
Кстати, я не учел выравнивание, поэтому слова про ровно один указатель - в некоторых случаях неправда.

Например, класс
class A {
сhar c;
};

будет иметь размер один байт, а класс

class B {
char c;
virtual void foo();
}

может иметь размер не 9 байт, а 16, чтобы быть кратным 8.

Сложно, да.
No. 27157  
>>27152
Надеюсь, от ответа была польза.
No. 27158  
>>27155
То есть, обычные методы класса хранятся не в классе, а как обычные функции? А как тогда разграничивается доступ этих функций к данным, которые private?
No. 27160  
>>27158
Да, в документации их так и называют - функциями-членами (member function).

Разграничивается ошибками компиляции.
No. 27161  
>>27160
Нет, я имею в виду, как компилятор узнает, что какие-то данные для такой-то функции доступны или нет, если функция никак не привязана к классу?
No. 27162  
>>27161
Ты путаешь происходящее на этапе компиляции и выполнения.

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

Если же ты уже в процессе работы твоей программы каким-нибудь хитрым путем получишь указатель на приватный метод — ты сможешь его вызвать. И никто тебя не остановит.
Другой разговор, что такой "хитрый путь" наверняка будут неопределенным поведением [нe]работающим совершенно по-разному в зависимости от компилятора, системы, фазы луны и т.д. Но это к делу не относится.

А вот с виртуальными функциями компилятор не может знать, какую из них вызвать. Это должна решать сама программа. Потому таблица указателей на них сохраняется в самом классе и используется программой. Уже на этапе исполнения.
No. 27163  
>>27162
Теперь понятно, спасибо.
No. 27217  
Безымянный.png - (32.84KB, 909×388)
27217
>>25965
Здрасьте, инкогнито!

Я использую flecs (ecs -- entity component system https://www.flecs.dev/flecs/ ), и там нужно задавать компоненты сущности (аналог в ООП -- создать поле классу/структуре) типом данных, а не переменной.
Пример:
flecs::entity e = world.entity();

e.set<float>(33.f);
*e.get<float>(); // вернёт 33.0f // с другими типами данных, в том числе и с классами и указателями, всё аналогично.


Цель: хранить две разных инфы с одинаковым простым типом.
Сейчас я использую в качестве компонентов
float
и
struct { float value; };
.

Есть ли способ решить эту проблему более простым (менее громоздким/неудобным) ?
C++
No. 27218  
>>27217
>пикрил
*типы структур (два разных класса), а не их экземпляры.
No. 27221  
>>27217
>>27218
>Цель: хранить две разных инфы с одинаковым простым типом.
Не уверен, что в этом контексте фреймворк как-то разделяет простые типы и составные.

Пока нашел вот такую дискуссию на счет мультивхождений:
https://github.com/SanderMertens/flecs/discussions/971

Но в целом ждем подсказку от кого-нибудь кто хорошо знает этот фреймворк.
No. 27222  
>>27221
>Не уверен, что...
Не в этом суть.

Просто два разный класса -- два разных класса, и проблем с хранением данных проблем нет:
struct vel {float x; float y;};

struct pos {float x; float y;};

entity.set<vel>({5; 0;});  //  теперь компонент типа vel равен {5; 0;}
entity.set<pos>({0; 0;});  //  теперь компонент типа pos равен {0; 0;}

Но как быть с простыми типами, которым нельзя сделать "копию":
int month = 13;
int day = 28;

//add<typename>() -- добавить компонент ("поле" сущности) типа 'typename'.
//set<typename T>(T value) -- добавить компонент (если отсутствует) типа 'T' и установить в него значение.

entity.add<day>(); // ошибка: переменная -- не тип данных.
entity.set<int>(day); // теперь компонент типа int равен перем. day.
entity.set<int>(month); // теперь компонент типа int равен month.


Есть ли способ получше, чем прибегать к созданию 
struct month {int v;};
 для возможности хранить и 
int day
 и 
int month
?


Впрочем, можете забить.
Я просто интересовался, можно ли сделать копию простого типа, наподобие 
class myclass : float` или иным способом.
No. 27224  
>>27222
А, я неправильно понял, подумал что тебе не хотелось придумывать каждый раз новый класс под новое поле.

>Есть ли способ получше, чем прибегать к созданию struct
Вижу несколько.
Первый - подключить BOOST_STRONG_TYPEDEF:
https://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/strong_typedef.html

>BOOST_STRONG_TYPEDEF(int, year)
>BOOST_STRONG_TYPEDEF(int, month)
>BOOST_STRONG_TYPEDEF(int, day)

Второй - попробовать enum class:
https://stackoverflow.com/a/52495164

>enum class year : int;
>enum class month : int;
>enum class day : int;
No. 27226  
>>27224
Спасибо большое, Синьор!
No. 27227  
>>27226
Си, Синьор! Заходи если что.
No. 27254  
Безопасно ли в скрипте делать инкремент апдейтом в MySQL Innodb без транзакции?

INSERT IGNORE INTO mycounters (идентификатор, counter) VALUES ('$id', 0);
UPDATE mycounters SET counter = counter + 1 WHERE условиеПоИдентификатору;

Если одновременно два человека зайдут, что произойдёт? Могут ли два одновременных апдейта заинкрементить счетчик только один раз?

Никаких SET SESSION TRANSACTION ISOLATION LEVEL и т.п. перед апдейтом не делается.
Подключение к базе стандартное: dbi:mysql:название:localhost:3306.
Вроде бы, при таком подключении работает автокоммит с уровнем изоляции REPEATABLE READ.
No. 27258  
>>27254
Насколько я понимаю, для счетчика ты просто выделил отдельную табличку, и инкрементишь там колонку. Если так, то без транзакции:

>Если одновременно два человека зайдут, что произойдёт?
Счетчик заинкрементится 2 раза

>Могут ли два одновременных апдейта заинкрементить счетчик только один раз?
Насколько я знаю, в твоем случае - нет, вот такой инкремент как у тебя указан это атомарная операция

Тебе так и нужно, или ты хочешь чтобы было как-то по-другому?
No. 27259  
>>27258
>Счетчик заинкрементится 2 раза
>это атомарная операция
>Тебе так и нужно, или ты хочешь чтобы было как-то по-другому?
Так и нужно, спасибо.
No. 27263  
Дорогие пассажиры, я, желая стать фронтендеромна реакте, написал калькулятор и даже залил его на гитхаб. Где и как мне получить оценку своего умения?
No. 27264  
>>27263
Я вот, мечтая стать знаменитым автором популярного опенсурс проекта, вливаю реальные деньги в Директ, считая конверсией переходы в гитхаб, PyPI, страницу документации. Нормален ли я? Не думаю. Не будьте как я. Наверно в твоем случае лучше вкинуть сюда ссылку на свой гитхаб, смирившись с легким деаноном.
No. 27265  
>>27264
>Директ, считая конверсией переходы в гитхаб, PyPI, страницу документации.
ЯННП.
>Наверно в твоем случае лучше вкинуть сюда ссылку на свой гитхаб, смирившись с легким деаноном.
Что ж, я надеюсь, не зря.
https://github.com/Apusqispay/calculator
No. 27266  
>>27265
>ЯННП
Реклама в Яндекс.Директе с оплатой за конверсии, а конверсии у меня — это onmousedown и ontouchstart на некоторых гиперссылках на странице моего сайта, куда ведут рекламные объявления.

Пока один привлеченный человек, который хотя бы клонировал репозиторий, примерно в 500 рублей выходит.
No. 27267  
>>27266
В какой области проект? прост интересно
No. 27268  
>>27265
/dev совсем опустел?
No. 27269  
>>27267
Небольшой скрипт-обёртка над FFmpeg, который хорош в том, чтобы без присмотра объединять папку или папки с последовательностями кадров в видеоролики. Это был такой необычный способ организовывать видеонаблюдение, который возник скорее из-за того, что фиксируемые процессы были достаточно медленными, чтобы видеопоток с камер стал горой лишней информации. Однако даже редкие кадры потом надо хранить, и кидеокодеки идеально для этого подходят.
No. 27270  
>>27265

По поводу организации коммитов:

Ты создал приложение скорее всего как-то автоматически, получив много бойлерплейтного кода, затем внёс туда изменения и всё это выложил одним комитом. Теперь сложно сказать, где твои изменения, а где бойлерплейтный код. Это усложняет ревью. Хоть делать миллион коммитов также плохо, на будущее, лучше разделять комиты под автоматически созданный код, рефакторинг (какие-то переименования в проекте, особенно если их много сразу и есть возможность сделать это отдельно, что бывает не всегда), целевые изменения. С целевыми изменениями сложнее всего, ведь часто есть соблазн либо сделать две задачи параллельно, либо фиксировать каждое микроскопическое изменение. От второго помогает git rebase (действие называется squash, squashing).
No. 27272  
>>27270
Всё, написанное мной относится только к компоненту Calc.
Не понял про rebase, какой в нём толк, если я это один всё делал без веток?
No. 27273  
>>27272
Я просто его упомянул про обратную ситуацию, когда кто-то делает много коммитов (как раз без веток, просто подряд), а потом хочется некоторые коммиты (идущие подряд) объединить. Вот это как раз делается командой squash.
No. 27274  
photo_2023-09-18_13-51-11.jpg - (163.57KB, 1280×997)
27274
Я пилю свой проект, и столкнулся со странной штукой.
C# + .NET 7 + EF Core, Code First.

У меня есть БД SQLite, в которой хранятся сущности:

GUID ObjId
string BirdName
DateTime DetectionDate
double Confidence

Если я делаю через Web API реквест, мол, дай (или удали) мне запись с таким-то string ID, то при совпадении я получаю null в кач-ве ответа. Если поменять в модели тип ObjId с GUID на string и подкорректировать код, то всё работает корректно.

Нашёл issue на гитхабе похожее: https://github.com/dotnet/efcore/issues/19651

Так вот, какие проблемы с производительностью в плане поиска я встречу, если поменяю GUID на string? В базе 50000 записей, скажем. Железо - одноплатник на aarch64, 4 * Cortex-A53 1.2GHz, оперативки мало, 1 гигабайт. Диск - MicroSD карта.

И хочу получить советы, как лучше парсить, ну, 25к текстовых файлов весом до 10кб? Собирать в единый файл и парсить, или лучше по очереди? Или пофиг, всё равно не замечу разницы?
No. 27275  
>>27274
Ну, в SQLite нет типа GUID, и такое значение хранится скорее всего итак как строка или blob (сравнивается через memcmp).

При использовании строк, оверхед будет скорее всего по памяти, но я не уверен на 100%. Возможно у текстовых столбцов по умолчанию сравнение не binary, а более сложное и зависящее от кодировки базы.

Так или иначе, любой первичный ключ в SQLite, кроме INTEGER, будет колонкой с уникальным индексом B-Tree, которая возможно при построении запросов будет дергать еще внутренний rowid, который суть тоже B-Tree.

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

А вот если преобразовывать между строкой и массивом двух long'ов для миллионов записей в сишарпе, возможно почувствовается, но загружать в ORM миллионы записей из базы вообще нежелательно. Если можно провести какую-то логику простым апдейтом на стороне СУБД, производительнее делать так.
No. 27276  
>>27274
> как лучше парсить, ну, 25к текстовых файлов весом до 10кб? Собирать в единый файл и парсить, или лучше по очереди?

Это шутка наверно? Конечно, бывают разные парсеры. Например, для XML есть SAX-парсеры, которые делают потоковый разбор и не требуют загрузки всего файла в память перед разбором. Допустим, у нас что-то вроде этого. В чем потенциальный профит объединения мелких файлов в один большой перед разбором? Разгрузить файловую систему?
No. 27277  
>>27273
Хорошо.
Но что насчёт самого кода?
No. 27278  
>>27276
Да нет, почему шутка? У меня обработка результатов (текстовые файлы мелкие от нейронки) за сутки и закидывание их в БД занимает секунд 8-10 на моём одноплатнике. Я делаю средствами языка чтение, хотя ради мемов сделал чтение вывода cat filename - конечно, быстрее средствами языка (streamReader и потом ReadToEnd) примерно в 2.5 раза.
А потенциальный профит, если подумать, никакой - всё равно что так заглядывать во все файлы и собирать в один, что так заглядывать внутрь файлов (только не парсить потом целый текстовый файл).

>>27275
Спасибо. Я вообще попробую к весне доделать приложение (фронтэнд хоть какой-то) и уже "в поле" его потестить весной ранней (март) - оставить в деревне с микрофоном у крыши на пару недель, чтоб слушало птичек и распознавало их по голосу. Но сначала надо сделать норм интерфейс, обработку результатов, инструкцию написать норм, все дела. Бэкенд есть, но вот использовать его крайне тяжело.
No. 27288  
У меня вопрос не сколько по языкам, сколько по треку самообучения и тому, в какую сторону двигаться сейчас.

Я изучаю .NET, C#. У меня есть проект личный, который мне интересен - ASP.NET Core + EF Core, но идея проекта не супер заезженная. А ещё у меня есть опыт работы сисадмином в 2.5 года, и интерес к ковырянию в линуксах и вообще железках - дома небольшой сервер крутится на aarch64: сервисы в контейнерах, всё за nginx, https, фаерволл. Как считаю, неплохо всё сделал.

И... я не знаю, куда двигаться, чтоб взяли какможно быстрее. В DevOps я знаю, что это не роль податься, или продолжать искать работу дотнетчиком?

Чот я прям в тупике: мне всё интересно, но куда именно двигаться, я не понимаю. Всё одинаково интернсно.

Пока что у меня такая мысль: я допиливаю до определённого состояния свой проект на дотнете и парралельно пишу резюме под DevOps, вкидываю на hh, а там как повезёт. Возьмут девопсом - будет супер, возьмут разработчиком - тоже неплохо.
No. 27289  
>>27288
>чтоб взяли какможно быстрее
Чтоб взяли как можно быстрее на работу.

По хорошему, мне Ansible надо попробовать и CI/CD поглубже изучить для того, чтобы попасть на позиции в городе/удалёнке.

Искать работу - это больно.
No. 27290  
>>27288
А дотнетите вы на линуксах? Если да, то как оно?
No. 27291  
>>27290
Дотнечу на линуксах, да.

Вроде боли нет особой. VSCode + dotnet cli для всего остального. Потом пушу в гитхаб, потом деплою себе на одноплатничек на армбиане.
No. 27298  
Побегал на собесы на сисадмина.
По сути, именно эникея: обслуживание компьютеров, немного серверов, которые уже настроены до меня. Тупая, монотонная работа, в общем. Но я её знаю, поэтому будет время учиться дальше и искать работу дальше.

Собесы делятся на три вида:
1. С тупыми вопросами.
>Чем отличается расшареный принтер у ПК от принтера, который подключён через сетевой кабель
Тем, что принтеру без ПК не нужен человек.
>Зачем нужен BIOS
Чтобы включить компьютер! Ответы про самодиагностику железок, настройки, boot order встречали ответ в духе "слишком глубоко копаешь"
>Чем отличается NTFS от FAT32
Ожидали получить ответ в духе "NTFS на дисках, FAT32 на флешках"
2. С вопросами уровня "почему были изобретены IP, ведь есть MAC-адреса?"
мой ответ про разделение и удобство не прошли, хотя, конечно, странный вопрос на техподдержку. и "Опиши, как идёт запрос к сайту от сетевой карты до DNS-сервера у провайдера? Считай, что попадание в кэш есть." Не помню, какой ответ ожидался, но там что-то про MAC в IP, потом как роутер общается с оборудованием провайдера и т.д.
3. С тупыми и умными вопросами вперемешку.
Таких собесов больше всего.%%

Пока что взял перерыв просто придти в себя, а так устраиваюсь на норм предложенную работку, пусть и эникеем. Сейчас джуном найти работу нереально, у меня просто кончились деньги.
No. 27299  
>>27298
> Зачем нужен BIOS
Это устаревшая технология, на смену которой пришла UEFI. Купить в случайном магазине компьютер с BIOS (без UEFI) нельзя уже лет десять.
No. 27301  
168728502991.webp - (446.68KB, 800×800)
27301
>>27299
>Это устаревшая технология, на смену которой пришла UEFI.
И это упоминал, но только толку... На глупый вопрос ожидают глупый ответ. Доказывать что-то на собесе человеку, который не хочет дискуссию вести - лучший способ провалить собеседование.

А так предложили эникеем на 45 тыс рублей/70 тыс рублей пойти, решил согласиться. Но вообще оставаться крутить хвосты компьютерам смысла нет, как и идти в DevOps не очень хочу, так что качать скиллы и прочее буду, как освоюсь.
No. 27302  
Чиочан, как в Дебиане задать переменные окружения, чтобы они были видны для всех пользователей и процессов?
Для рута работает прописать в .bashrc, для пользователей - нет, если пытаться удаленно через файловый менеджер пытаться подключаться и работать.
Куда-нибудь в rc.d, может быть?
No. 27303  
>>27302
https://help.ubuntu.com/community/EnvironmentVariables#System-wide_environment_variables

Скорее всего тебе нужен
/etc/environment
.
No. 27304  
>>27303
Пробовал, но почему-то не подхватывается.
No. 27305  
>>27304
В новой сессии-то пробовал? Уже работающие процессы, в том числе оболочки, никак не могут это подхватить.
No. 27309  
>>27305
Пробовал, конечно. Что я только не пробовал, не работает.
No. 27310  
Чиочан, на что делать упор при сборке пк для 3д моделирования? Проц, видяха, память? Понимаю, что хорошо бы иметь все сразу топовое, но кошелек не резиновый, увы.
No. 27319  
Чиочан, ты копался в исходниках Qt? Мне надо найти, где именно в QSharedMemory реализован подсчет ссылок. У самого не получается, слишком запутано там все.
No. 27320  
>>27319 Просто держись oт любых классов Qt не-GUI назначения подальше. Когда неадекватным программерам нечего делать - они иногда делает монстров вроде Qt, Boost, dlib, https://github.com/facebook/folly , https://github.com/abseil , https://github.com/burner/sweet.hpp , https://github.com/attractivechaos/klib и т. п. Только немногие из них не имеют зависимостей между своими недоделками, что приводит к необходимости тащить всю либу, даже если нужен один компонент из неё. И в большинстве из них многие вещи делаются жля галочки, с единственной целью - чтобы программист взял что-то из уже установленной либы и стал зависеть от неё. Boost тут - один из лучших по качеству, где компоненты изначально сделаны с прицелом на возможность отдельной установки.

Так что держись подальше от таких помоек. Нужна либа под задачу - бери независимую либу, опирающуюся исключительно на стандартную библиотеку и на другие независимые либы. являющиеся де-факто стандартом.
No. 27321  
>>27320
> Только немногие из них не имеют зависимостей между своими недоделками, что приводит к необходимости тащить всю либу
Так ли это страшно? В век, где SSD на 2TB стоит $200. Не под микроконтроллер же пишется, и не под low-end VPS.
No. 27322  
>>27321 Страшно. Индустрия превращается в говно из-за этого. Вместо 1-2 качественных мелких либ, которыми пользуются все и которые всё сообщество совместно улучшает, становится 100500 помоек, которые вызовут проблемы у всех, кроме хозяев этих помоек и нескольких недоумков, которые додумались взять помойки как зависимость потому что они у них уже установлены в системе для чего-то другого, помойные решения им подошли, а непомойные - лень искать и ставить.

А свой аргумент про flash-SSD-хлам откинь. Никогда не юзал SSD и не буду. Как минимум пока их не будут делать на магниторезистивной памяти, или прочей прорывной технологии.
No. 27323  
>>27319
На Unix-системах оно работает через POSIX shared memory objects, см. shm_open(3). В деструкторе происходит shmctl(id, IPC_STAT, &shmid_ds), после чего проверяется, равен ли shmid_ds.shm_nattch нулю. Если равен, то происходит удаление сегмента общей памяти. Таким образом, ссылки подсчитывает ядро ОС.

https://codebrowser.dev/qt5/qtbase/src/corelib/kernel/qsharedmemory_systemv.cpp.html#_ZN20QSharedMemoryPrivate6detachEv
No. 27325  
>>27322
> проблемы у всех
> flash-SSD-хлам
Судя по всему, чуть менее, чем на половину, это всё-таки лично твои тараканы.
No. 27326  
>>27310
Проц и памаять
No. 27331  
Тупой вопрос.

Дано: есть 3 системы: Windows XP, Linux + X11 + KDE + colord, и Apple iOS. На всех установлен монитор с широким гамутом, установлена видеокарта, установлены для неё драйвера, монитор подключён по DVI. В систему установлен цветовой профиль монитора и система как-то привела цвета sRGB в соответствие c тем, как они должны выглядеть, загрузив куда-то в видеокарту как-то посчитанные LUTы. В системе также предустановлены цветовые профили для различных цветовых пространств. Также у нас есть набор файлов с
1. кривыми чувствительности типов колбочек глаза к различным длинам волн;
2. CIE color matching functions.

Задача: написать кроссплатформенный код, с помощью OpenGL 3.0 рисующий квадрат цвета, максимально соответствующего тому, который увидит глаз, если в него посветить расходящимся лазерным пучком, имеющим задаваемую спинбоксом длину волны.

Мне кажется, что алгоритм такой:
1. как-то кроссплатформенно получить от системы цветовой профиль монитора
2. засунуть (у нас - на одной длине волны ненулевая интенсивность, для остальных - нулевая) спектр излучения в переменную OpenGL.
2. в фрагментном шейдере перевести спектр источника в цвета в пространстве LMS, посчитав скалярные произведения с кривыми чувствительностей колбочек.
3. в фрагментном шейдере перевести цвет из LMS в цветовое пространство монитора, задавемое профилем
4. как-то кроссплатформенно указать системе, что у нас OpenGL viewport не в sRGB, а в цветовом пространстве полученного профиля. Как-то заставить систему не применять загруженные LUT к нашему viewportу, но продолжать применять ко всем остальным окнам.
5. как-то отрендерить нашу картинку.

Я погуглил-погуглил, и только для винды+DirectX нашёл хоть какое-то API.
No. 27332  
Вернее для всего остального я и не искал, ведь писать некроссплатформенное решение смысла не имеет.
No. 27333  
Во что нашёл, но на вопрос это не отвечает. https://www.jcline.org/blog/fedora/graphics/hdr/2021/06/28/hdr-in-linux-p2.html
No. 27334  
Чиочан, мне надо в линуксе задать переменную отружения для всех юзеров, причем желательно из одного места. Пишут, что для этого надо прописать их в /etc/environment. Это работает для всех пользователей, кроме почему-то рута. В интернетах разное пишут: у кого-то работает это для рута, у кого-то нет.
Вопрос, что делать? Не хочется каждому пользователю индивидуально прописывать в .bashrc, это сложно будет менять в случае чего. Хотелось бы из одного места всем управлять.
No. 27340  
>>27331

Задача гораздо проще, чѣмъ интегрирование спектра лазера, матрично умноженного на массив откликов колбочек.

Цвѣтъ лазернаго луча — такой же видимый цвѣтъ, как и всякий другой.

Въ цвѣтовом пространстве CIE 1931 xy этому цвѣту соѿвѣтствуетъ единственная точка, расположенная на внешнем (подковообразном) периметре области видимых цвѣтовъ (диаграмму из Википедии прилагаю). Формулы, переводящие длину волны лазера в координаты CIE (сперва в XYZ, а затѣмъ — и в xy), извѣстны съ прошлаго вѣка и оттого буквально лежат по адресу https://en.wikipedia.org/wiki/CIE_1931_color_space#Color_matching_functions в Википедии.

Единственная оставшаяся трудность состоит в том, что эта точка располагается за предѣлами RGB-пространства экрана, поэтому её собственные RGB-координаты в этом пространстве напрямую использовать нельзя (величина как минимум одной из координат ожидается отрицательною), и наивно обрѣзать их до подходящих также нельзя (то движение точки вдоль координатной оси, которое получилось бы в результате тупого зануления отрицательной координаты, не только уменьшило бы ея цвѣтность, но и, в общем случае, исказило бы цвѣтовой тон, что недопустимо).

Правильное рѣшеніе задачи перевода произвольного цвѣта в наэкранный рассматривается по адресу https://www.w3.org/TR/css-color-4/#gamut-mapping (то есть в §13 спецификации CSS Color Module Level 4), рекомендуемым является (грубо говоря) снижение цвѣтности (по возможности не затрагивающее ни яркость, ни цвѣтовой тон), совершаемое въ цвѣтовомъ пространстве Oklch.

То есть задача раслагается на три послѣдовательных шага:

① Найти координаты цвѣта лазера в пространстве Oklch.

② Найти в том же пространстве координаты ближайшей точки области цвѣтовъ, способных отображаться на экране средствами OpenGL. (Это, по-видимому, цвѣта sRGB?)

③ Перегнать координаты найденной точки въ наэкранныя.

Так как CIE XYZ-координаты исходной точки извѣстны (по вышеупомянутым википедическим формулам), а перевод XYZ-координат в пространство Oklch — это задача, рѣшённая создателем пространства, то для первого шага достаточно использовать формулы, на странице https://bottosson.github.io/posts/oklab/ приведённыя (въ раздѣлѣ «Converting from XYZ to Oklab»).

Для третьего шага формулы для перевода из Oklch в линейное пространство sRGB лежат там же (чуть ниже). Здѣсь «линейное» означает, что передаточная функция (гамма) ещё не накладывалася (то есть, напримѣръ, цвѣтъ 444 всё ещё ровно вдвое тусклѣе, чѣмъ 888).

Для второго шага по адресу https://www.w3.org/TR/css-color-4/#binsearch изложен псевдокод двоичного поиска.
No. 27342  
>>27334
Что за дистрибутив-то? У меня вот Debian testing, /etc/environment работает и для рута и для остальных пользователей (при новом логине, конечно).

Вангую, что под рутом ты понимаешь получение привилегий рута с помощью sudo. С sudo у меня не работает. По умолчанию sudo убирает все переменные окружения, кроме PATH, кажется. Можно написать что-то вроде
Defaults env_keep += "MY_ENV_VAR"

в sudoers.
No. 27343  
>>27342
У меня, прости господи, Астра Линукс. Он на Дебиане основан.
Прописал переменные в /etc/profile, все стало работать, через sudo тоже.
No. 27344  
Я пытаюсь научиться использовать прекомпилированные заголовки через Qt.
Есть несколько проектов, test1, test2 и т.д. Они все используют заголовок pch.h, который лежит в общей папке.
Я добавляю в .pro файл одного из проектов следующее:
CONFIG += precompile_header
PRECOMPILED_DIR = $$DIR_SRC/Tools
PRECOMPILED_HEADER += $$DIR_SRC/Tools/dp_pch.h
После чего делаю qmake и затем make.
После чего в Tools появляется директория test1.gch, в которой лежит файл c++. Я так понимаю, это и есть прекомпилированный заголовок. Но, так как он лежит в отдельной директории, другие проекты его не видят.
Как сделать так, чтобы вместо этого рядом с pch.h создавался pch.gch?
No. 27345  
smush.webp - (47.94KB, 821×2337)
27345
Свою предшествующую рекомендацию >>27340 я желаю дополнить упоминанием того, что для перевода длины волны монохромнаго цвѣта (в том числе лазернаго) в координаты CIE XYZ можно воспользоваться не одними только формулами, но и табличными данными CIE, изложенными в четвёртой таблице документа https://web.archive.org/web/20170712203603/http://cie.mogi.bme.hu/cie_arch/kee/div1/tc148.pdf в Архиве Интернета.

Изложены они там с высокою точностью — до шестого знака опосля запятой.

Скриншот первых двух страниц этой таблицы (то есть без данных для 775 нанометров и 780 нанометров) прилагаю.
No. 27346  
>Цвѣтъ лазернаго луча — такой же видимый цвѣтъ, как и всякий другой.
>Въ цвѣтовом пространстве CIE 1931 xy этому цвѣту соѿвѣтствуетъ единственная точка, расположенная на внешнем (подковообразном) периметре области видимых цвѣтовъ
>Формулы, переводящие длину волны лазера в координаты CIE (сперва в XYZ, а затѣмъ — и в xy), извѣстны съ прошлаго вѣка

Пространство XYZ получено заданием 3х базовых цветов с длинами волн 700 nm, 546.1 nm и 435.8 nm и экспериментах на людях путём визуального сравнения. Отсюда возникают ограничения этого цветового пространства. Оно измеряет не цвет, не активации видов колбочек, а их отклики на заданные базовые длины волн. Color mapping functions не являются откликами колбочек на длины волн, а лишь интенсивностями источников базовых длин волн, вызвавших субъективно близкие ощущения у подопытных. Каждая из базовых длин волн, предоставляемых подопытным, активировала сразу несколько видов колбочек. Поэтому при самом измерении color mapping функций информация была потеряна. Поэтому при переходе от длин волн источника к CIE XYZ через color mapping functions мы теряем информацию. Так как измерения проводились путём подстройки живыми людьми реостатов по субъективным ощущениям, то промерить эти color matching functions с низкой погрешностью и высоким разрешением на практике невозможно.

В 90е годы спектральные отклики колбочек были измерены напрямую путём спектроскопии https://pubmed.ncbi.nlm.nih.gov/6140680/ . Отсюда появилось пространство LMS, в котором информация о цвете не теряется из-за невозможности активировать различные типы колбочек раздельно.

>Изложены они там с высокою точностью — до шестого знака опосля запятой.

Спасибо за ссылку на таблицу, но ограничения самого принципа формирования цветового пространства они не отменяют. Сама таблица скорее всего получена не измерениями на людях, а расчётом исходя из данных для LMS.

>Единственная оставшаяся трудность состоит в том, что эта точка располагается за предѣлами RGB-пространства экрана
> Правильное рѣшеніе задачи перевода произвольного цвѣта в наэкранный рассматривается по адресу https://www.w3.org/TR/css-color-4/#gamut-mapping

Всё гораздо хуже. Точка может быть в пределах гамута экрана, но RGB-значения, которые мы высчитываем в OpenGL, или в любом другом приложении - они в sRGB - в кастрированном стандартизированном гамуте. Поэтому придётся пересчитывать из LMS в sRGB и вносить искажения, отображая точки вне гамута sRGB внутрь него. После чего по LUTам, загруженным в видеокарту, карта пересчитает уже искажённый и отклипанный цвет в sRGB обратно в цветовое пространство монитора, опять внеся искажения.

В Линуксе, судя по ссылкам, вывод в цветовом пространстве монитора только планируется, причём только для вяленого и HDR-мониторов, подключённых по HDMI, и на деле нихрена не реализовано. И разумеется, ни о каких кроссплатформенных либах даже речи не идёт.
В Винде (которую я почти не использую, использую только хрюшу и на виртуалке) и макоси (которую я не использую совсем) по-видимому есть нужные механизмы и API управления цветом ещё начиная с 90х, когда ни HDR, ни HDMI не было, потому что иначе бы эти платформы не взлетели у художников. Налицо банкротство линуксного десктопа и всей "швабодной" экосистемы.

>① Найти координаты цвѣта лазера в пространстве Oklch.

Нахрена какой-то Oklch, если есть LMS?

>② Найти в том же пространстве координаты ближайшей точки области цвѣтовъ, способных отображаться на экране средствами OpenGL. (Это, по-видимому, цвѣта sRGB?)

У нас задача - максимально достоверно вывести цвет, соответствующий длине волны, на конкретном мониторе. То есть не в sRGB, а в пространстве с гамутом монитора.

>③ Перегнать координаты найденной точки въ наэкранныя.

Я под "наэкранным" понимаю то, которое соответствует пикселам монитора, а никак не sRGB. sRGB - это общий подгамут аппаратуры участников консорциума. Перевод туда из sRGB делается автоматически видеокартой, когда в неё загружены LUTы.
No. 27347  
Теперь пути решения.
1. X11 будет в пролёте, ибо типа старьё, зачем на подюержку старья ресурсы тратить, переходите на вяленый не смотря на то, что до сих пор всё через жопу работает, и наверное так будет ещё десятелетия, а к этому моменту и преемника для вяленого придумают и опять всё через жопу будет.
2. у меня есть подозрение, что в композиторах управление цветом реализуют как не-использование LUTов для всего экрана и пересчёт фрагментным шейдером каждого окна в цветовое пространство экрана.
3. у меня есть подозрение, что когда LUTы не загружены, то в линуксе RGB-значения будут уже в пространстве монитора.
4. загрузить/выгрузить LUT можно только от рута
5. отсюда костыльная идея:
а) запускается демон от рута, выгружающий/загружающий LUTы по запросу и слушающий сокет
б) при активации цветоуправляемого окна LUTы выгружаются и цвет всего нецветоуправляемого искажается
в) при деактивации цветоуправляемого окна LUTы опять загружаются.
г) костыльно и хрупко.

Насколько эта идея соответствует действительности?
No. 27348  
>>27344
>Я пытаюсь научиться использовать прекомпилированные заголовки через Qt.
>.pro файл

В Qt QBS давно дропнута в пользу CMake. Рекомендую не страдать фигнёй с этим хламом (QBS), а тоже переходить на CMake. Предкомпилированные заголовки не нужны, используй модули C++.
No. 27349  
>>27348
Модули это из 20 стандарта. Я ограничен 14-м. Использовать другую систему сборки возможности тоже нет.
No. 27350  
>>27349 Это кто решил? Насяльника? Ну так и пойди и поговори со своим насяльника на эту тему, что на говне 10летней давности без доступа к compile-time вычислениям и ranges он пусть сам пишет. Ещё бы на сишке без плюсов предложил написать. Или на algol68.
No. 27351  
>>27350
Мы на работе пишем на сишке. Проблемы?
No. 27352  
>>27350
Это решает не насяльника, а наличие огромной легаси-базы, которая должна работать в том числе и на железе и операционных системах, под которое новые фичи просто не реализованы, а реализованы никогда не будут. Это обычное дело, если ты пишешь что-то сложнее калькулятора для курчаса в универе.

А на сишке без плюсов успешно пишут и для микроконтроллеров, и драйвера, и ядро линкуса. И будут писать. Предлагаешь от всего этого отказаться? Тогда ты попадешь в каменный век, где твои compile-time вычисления и ranges тебе уже не пригодятся.
No. 27360  
>>27352
>Это решает не насяльника, а наличие огромной легаси-базы, которая должна работать в том числе и на железе и операционных системах, под которое новые фичи просто не реализованы

Your mileage may vary. PDP-11 Clang не поддерживает, да. К сожалению 8051 тоже не реализована, но в SDCC C++ вообще нет. В принципе можно реализовать бэкенд для llvm, но этим кто заниматься будет? Без конкретики сказать нельзя. Если в Clang есть поддержка архитектуры, то даже если нет C++, то проблема в принципе решается небольшими трудозатратами с огромным выигрышем в виде возможности писать на распоследнем C++.

>А на сишке без плюсов успешно пишут и для микроконтроллеров, и драйвера, и ядро линкуса.
А некоторые - и мышей едят.

>И будут писать. Предлагаешь от всего этого отказаться? Тогда ты попадешь в каменный век, где твои compile-time вычисления и ranges тебе уже не пригодятся.

Пока другие пердолятся с C++11 и Си, я пишу на C++26. Пришлось пропатчить пару хэдеров правда и наваять скрипт, компонующий тулчейн из двух разнородных, но ничего. Уже на отладочном выводе время, потраченное на налаживание тулчейна, себя окупило. Ну а если нравится кому-то пердолиться - ну пусть пердолятся со своим Си.
No. 27362  
>>27360
А потом выпустят C++29 и окажется, что со своим C++26 ты тоже пердолился, представляешь?

Программирование существует, чтобы решать задачи бизнеса. Какие задачи бизнеса ты решаешь своими «compile-time вычислениями» и «ranges»?
No. 27363  
>>27362
>А потом выпустят C++29 и окажется, что со своим C++26 ты тоже пердолился, представляешь?

Как в шланге появится - так и у меня появится :)

>Программирование существует, чтобы решать задачи бизнеса.

А рабы существуют - чтобы служить хозяину. Пшёл работать сверхурочно за плошку риса.

>Какие задачи бизнеса ты решаешь своими «compile-time вычислениями» и «ranges»?

Снижение издержек на поддержку кода.
No. 27364  
>>27363
Со смайликами, «пердоленьем», «рабами» и прочим вызывающе-хамским поведением, делающим затруднительной какую-либо разумную дискуссию, предлагаю пройти на другой ресурс (я не модератор).
No. 27365  
Я работал в Мотороле и в Нокии. Крупные конторы, выпускающие конкурентоспособные продукты на Запад. И нигде не гнались за использованием всего самого последнего только ради самого факта его использования. Как-то обходились без переписывания миллионов строк кодовой базы каждый раз, когда выходит новая фича. И издержки на поддержку кода всех устраивали. А итогом были клиенты, которые решали платить сотни миллионов долларов именно моей конторе, а не кому-то еще. И растущие каждый год зарплаты и годовые премии, потому что с каждым годом все больше денег зарабатывали.

>>27364
Поддерживаю этого Стива.
No. 27366  
>>27365 Вот поэтому рынок и просрали в том числе, что вместо полезной работы клиентов на бабло разводили, премии получали, да зряплаты увеличивали. Напоминает одного разработчика браузеров.
No. 27367  
>>27301-кун и вообще часто заглядывающий сюда вкатун на связи!

Я пилю свой проектик на .NET 7, который по сути выглядит как Web API для нейронки, которая распознаёт птиц ( https://github.com/kahst/BirdNET-Analyzer ).

Умеет:
1. Хранить и выдавать результаты распознанных аудиофайлов (SQLite + CRUDы)
2. Умеет работать стабильно долгое время (месяц беспрерывной работы и последующий парсинг результатов; это без перебоев питания - увы, автоматическое возобновление пока не сделал, на очереди).
3. Умеет записывать с нескольких микрофонов одновременно (общую очередь для 2<= микрофонов делаю прямо сейчас на работе) + можно выбирать нужное устройство ввода и для него свои настройки для нейронки.
Минусы:
1. Нет красивого Web UI.
2. Возможны баги
3. Не продолжает воспроизведение после перебоя питания
4. Нет логов и анализа производительности

Есть аналоги: https://github.com/mmcc-xx/BirdCAGE и BirdNET-Pi. Моей целью было сделать максимально легковесный с точки зрения ресурсов web API, т.к. стоять будет на бюджетных одноплатниках с 512мб RAM и 4 ядрами Cortex A-53. Ну и попрактиковаться, конечно.

Собственно, весной и летом буду тестить уже полностью, т.е. оставлю в деревне, раз в пару недель приезжать буду. Будет несколько микрофонов на одном одноплатнике, будет импровизированный бесперебойник на батарейках с алиэкспресса.

Пока что не сделал релиз, сегодня залью свежие собранные версии для linux-arm64, linux-arm, linux-x86_64.
https://github.com/okazaki0yumemi1/Bird-Box

Вопросов нет, хотел попросить примеры хороших readme на гитхабе. У меня с письменным английским туговато из-за отсутствия практики, но всё же допишу + сделаю на русском языке тоже.
No. 27368  
>>27366
Рынок мобилок - да. К счастью, я работал не с мобилками, а с базовыми станциями связи. Третье место по миру с 20% рынка она вполне себе держит много лет.
Эх, жаль, что из России им пришлось уйти. Менеджеры из финского офиса буквально плакали на созвоне, когда объявляли, что вынуждены закрыть наш филиал.
No. 27370  
>>27368 как будто ранок 5G базовых станций тоже не просрали Huaweю.
No. 27373  
share.png - (85.09KB, 950×489)
27373
>>27370
У Хуавея 30% мирового рынка, у Нокии - 20. Это не очень похоже на просирание.
No. 27374  
Как проверить, что предкомпилированные заголовки действительно используются при сборке?
Согласно документации https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html имеется возможность иметь несколько вариантов одного предкомпилированного заголовка. Для этого надо создать каталог с именем типа all.h.gch и указать на него компилятору, после чего он автоматически выберет подходящий.
Я, с помощью отдельных makefile, создаю в каталоге all.h.gch несколько заголовков тпа all1.h.gch, all2.h.gch, и т.д.
После этого, в makefile проекта, который должен использовать заголовок, я указываю путь до этого каталога: -I/path/to/all.h.gch.
Согласно документации, это должно привести к использованию предкомпилированного заголовка, но, судя по тому, что время компиляции изменяется в пределах статистической погрешности, этого не происходит.
Каким способом можно гарантированно проверить, компилируется ли заголовок каждый раз заново, либо же используется предкомпилированный, не измеряя время компиляции?
No. 27376  
>>27373
Ладно, вы правы, 150% - это ещё не полный просир.
No. 27377  
>>27376
Был бы у Хуавея рост до хотя бы до 50% за несколько - тогда можно было бы говорить о просере. Но доли рынка не меняются много лет. Тут уместнее говорить о том, что каждый занял свою нишу.
No. 27383  
Чиочан, а зачем нужен mutable? В чем смысл делать метод константным, а потом все равно в нем что-то менять? Это же не логично?
No. 27385  
>>27383
  • Какой-нибудь кэш элементарный:

private:
  mutable std::map<int, int> cache_;
public:
  int get(int key) const
  { 
    auto it = cache_.find(key);
    if (it != cache_.end()) {
      return it->second;
    }   
    return cache_[key] = get_value_for_key_costly_(key);
  } 


No. 27387  
Стив, привет! Что почитать / посмотреть / порешать по сетям и протоколам вонаби go бэкенду?
No. 27388  
Чиочан, такая ситуация. Собирается экзешник X, который зависит от самосборной статической библиотеки L1, которая зависит от самосборной статической библиотеки L2. Возможно ли так собрать L1, чтобы в нее включилась L2, и при сборке X надо было подключать только L1, не указывая L2?
No. 27389  
>>27388
ar r libL1.a l1.o l2.o

Объектник из libL2.a можно вытащить так, если надо:
ar x libL2.a
No. 27400  
Здесь кто-нибудь на ruby пишет?
У меня такой (нубский) вопрос:

Имеется, допустим, класс A, в нем метод foo. Имеется класс B, с классом A никак (кроме общих предков) не связанный. Задача — добавить в B точно такой же foo.

Ограничения.
1. Мы не можем редактировать исходный код классов A и B, только менять их динамически в результате выполнения нашего кода.
2. Более того, нам вообще неизвестен исходный код метода foo, поскольку на момент исполнения нашего кода он может быть произвольным образом изменен другим сторонним кодом.
3. Код метода foo никак не связан с другими методами и полями класса A. И вообще ему там не место, но рефакторить мы ничего не можем, см. п1. Вероятностью, что такая связь будет добавлена сторонним кодом, можно пренебречь.
4. Версия ruby — 1.9.2 (и нет, мы не можем поменять ее на более новую)

Пока что идеи такие:
1. Kак-то (как?) переместить текущее содержимое foo в отдельный модуль, после чего добавить его обоим классам в качестве миксина. Ну или вообще напрямую скопировать метод из одного класса в другой, как-то манипулируя с их внутренним устройством.
2. Kак-то подменить контекст вызова (скажем, в lua мы можем из B:foo вызвать A:foo как A.foo(self) — и контекст поменяется). В ruby есть UnboundMethod, но он требует близкородственных связей между классами, которых нет. (Их хваленая "утиная типология" не работает)
3. Как-то преобразовать содержимое A.foo в блок, который затем вызвать из B.foo. Есть Method.to_proc, но он жестко привязан к объекту (а нам объект класса A не нужен).

Поиск по stackoverlow не радует:
https://stackoverflow.com/questions/33708250/what-is-the-point-of-rubys-method-unbinding-mechanism
https://stackoverflow.com/questions/14132782/assign-a-method-from-one-class-to-an-instance-of-another
Возможно ли это вообще, или я слишком много хочу от этого языка?
No. 27403  
>>27400

> а нам объект класса A не нужен

Насколько это критично? Класс А настолько тяжелый?

Выглядит так, что совсем без аллокации объекта A не получится вытащить метод. Но можно избежать вызова A#initialize хотя бы:

A.allocate.method(:foo)

> (Их хваленая "утиная типология" не работает)

Иначе можно было бы взять нативный метод, типо Array#push, забиндить его на произвольный объект, и все, аварийный останов! Не типобезопасно... Думаю, это компромисс между утиной типизацией и строгой.
No. 27404  
faptcha_php.png - (4.47KB, 90×50)
27404
>>27403
>Но можно избежать вызова A#initialize хотя бы:
>A.allocate.method(:foo)
О, похоже, то что нужно. Вызов цепочки конструкторов был бы катастрофой, а всего лишь бессмысленное выделение памяти под фальшивый объект... некрасиво конечно (внутренний слаанешит плачет кровавыми слезами), но пережить можно.

Собственно, при таком подходе никакой перенос методов не нужен, хватит простого вызова
A.allocate.foo

Спасибо!
О, и пикрелейтед на капче
No. 27407  
И снова я, снова то же ruby 1.9.2 (RPGmaker VX ACE)

Наткнулся на странное поведение Exception.backtrace в случае наличия eval в цепочке вызовов. Имеем такой пример кода:
def foo

    raise "shit"
end
def bar
    foo
end
def baz
    eval('bar')
end

Перехватываем исключение, смотрим этот самый backtrace и видим такую хрень:
  • test.rb:10:in 'eval'
  • test.rb:6:in 'bar'
  • (eval):1:in 'baz'
  • test.rb:10:in 'eval'
  • test.rb:10:in 'baz'
Вместо верхней строчки стека — тот самый eval.
Если убрать eval и вызывать bar напрямую, то всё работает корректно:
  • test.rb:2:in 'foo'
  • test.rb:6:in 'bar'
  • test.rb:10:in 'baz'
Понимаю, что скорее всего это баг древней версии, с которым мне никто не поможет, но всё-таки... Может есть какой-нибудь известный способ вытащить верхнюю (и самую важную) строчку стека, которую этот eval собой затирает?

Движок, всё-таки, широко известен, игрушек на нем было сделано много, наверняка не я один в нем до сих пор копаюсь. И наверняка не я первый на этот баг наткнулся. Но в гугле, увы, ничего путного не нашел...
No. 27408  
>>27407 UPD
Костыльное решение (вполне очевидное, но весьма кривое): перехватывать исключения до того, как они прошли через в eval.

В листинге выше это можно сделать, например, в bar. Или даже внутри эвала, которой в baz.
Если обернуть передаваемый ему код в begin/rescue, то внутри этого rescue стек, пока еще, будет в порядке. И можно его где-нибудь сохранить или записать в лог.

А как исключение пройдет через eval, то всё, в стеке мусор.
No. 27409  
>>27407
А если

eval 'bar'

заменить на

instance_eval { bar }

то все равно поломанный бектрейс будет?
No. 27410  
>>27409
Не, с instance_eval, тьфу-тьфу, всё нормально.
Но, к сожалению, не всегда одно можно так просто заменить на другое.

По крайней мере я таких способов не вижу. Хотя может я просто не в курсе, язык пока знаю плохо.
Если нам пришел код в виде строки, то можно ли как-то сделать его блоком и запихать в этот instance_eval?
No. 27411  
>>27410

> Если нам пришел код в виде строки, то можно ли как-то сделать его блоком и запихать в этот instance_eval?

Так-то instance_eval принимает строку тоже. Еще мне пришли в голову две вещи:

1) Сделать процедуру из строки (чтоб отложить выкидывание исключения до исполнения процедуры) каким-нибудь таким образом:
block = &eval("proc {#{str}}")

instance_eval &block


2) Если у тебя там MRI руби, то поэксперементирвать с этим:
RubyVM::InstructionSequence.compile(str).eval


>Но, к сожалению, не всегда одно можно так просто заменить на другое.

А что за задача? Вообще, я очень редко пользовался eval, единственное место, где я его нашел у нас, так это в самодельном обфускаторе для руби.
No. 27412  
>>27411
Фикс:

block = eval("proc {#{str}}")

instance_eval &block

No. 27413  
>>27411
>Так-то instance_eval принимает строку тоже.
И в случае со строкой его поведение ничем не отличается от eval, т.е. имеем ту же проблему.
Что вообще-то логично, потому что код обе эти функции скорее всего используют один и тот же.

Пока что я использую вот такую вот затычку: https://pastebin.com/Fy5Uc82L
И соответственно, буду подключать этот EvalFixer во все места, где такая неоходиость возникнет. Их там не так много, вроде. Помимо этого Game_Interpreter еще 2-3.
Сперва хотел вообще глобальный eval переопределить, но полезли какие-то странные ошибки и я решил не связываться.
Кстати, на пастебине тоже фейлится подсветка синтаксиса. Сколько я бился, чтобы поправить ее у себя в редакторе, так до конца и не. Хотя сейчас уже гораздо реже, чем вначале.

>block = eval("proc {#{str}}")
Э... но какой в этом смысл, если мы всё равно вызываем тот самый эвал?

>RubyVM
Посмотрю, но кажется там такого нет.

>А что за задача?
Копаюсь в RPGmaker, если кратко.
Эвенты. Всё хрантся у него в базе, а потом обрабатывается этим самым Game_Interpreter (и еще в нескольких местах), если там код, то вызывается через этот самый эвал.
Привожу это всё к такому виду, чтобы можно было с ним нормально работать внешними средствами, потому что его внутренняя среда это тихий ужас. Соответственно, возникла задача логирования и обработки ошибок, в процессе которой это всё и вылезло.
Движок сильно недооценен, между прочем. Среда позволяет его использовать где-то на 10%. И абсолютное большинство игрушек на этом и останавлвается.

Вообще, то решение, к которому я сейчас пришел, меня пока устраевает. Так что, если в нем не обнаружится каких-нибудь подводных камней, то на этом видимо и остановлюсь.
No. 27414  
>>27413
>>block = eval("proc {#{str}}")
>Э... но какой в этом смысл, если мы всё равно вызываем тот самый эвал?

Хм... Смысл, похоже, есть. Потому что в таком исполнении оно, внезапно, работает правильно.

(немного подумав)
А, ну да. Мы же в эвале лишь создаём блок. Наши эксепшены через эвал не проходят. Всё понял, был неправ.
Это решение лучше, чем то, что я там нагромоздил.
Пошел переписывать EvalFixer.
No. 27416  
>>27413

Понятно.

>И соответственно, буду подключать этот EvalFixer во все места, где такая неоходиость возникнет. Их там не так много, вроде. Помимо этого Game_Interpreter еще 2-3. Сперва хотел вообще глобальный eval переопределить, но полезли какие-то странные ошибки и я решил не связываться.

Вообще, разница между eval и instance_eval может проявится в том случае, если у тебя есть определения методов в эвалюируемых скриптах.

До фикса, как я понимаю, исполнение скрипта 'def f; end' определяло метод Game_Interpreter#f. Однако же instance_eval создаст "собственный" метод f для инстанса Game_Interpreter. Разница проявится, если в RPGMaker создается несколько инстансов Game_Interpreter. В первом случае метод f будет доступен для всех инстансов, во втором - только для того конкретного инстанса, который выполнял скрипт с определением f.

Наверное, проблему можно будет решить созданием глобального объекта ctx, и исполнением ctx.instance_eval { ... } вместо просто instance_eval.

>>27414

>Мы же в эвале лишь создаём блок. Наши эксепшены через эвал не проходят.

Ага. Я еще пытался придумать такой str, чтобы "proc { #{str} }" сломанный код произвело, но не придумал.
Удалить сообщение []
Пароль  
[Mod]