Ычан: [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 размером до 5000 кБ.
  • Ныне 3536 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
Удалить сообщение []
Пароль  
[Mod]