Ычан: [d | au / b / bro / hr / l / m / mi / mu / o / r / s / sci / tran / tu / tv / vg / x | a / aa / c / fi / jp / rm / tan / to / vn / vo]
[Назад] [Вся нить] [Первые 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 размером до 5000 кБ.
  • Ныне 3674 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
Спасибо!
Удалить сообщение []
Пароль  
[Mod]