LINUX.ORG.RU

Метапрог-прототип, версия 7 + графические диалоги на Метапроге

 , ,


0

3

Скачать (перед запуском читайте !Русский.txt или !Українська.txt):

https://www71.zippyshare.com/v/dNcHIgzD/file.html

Новая версия принесла несколько новых фич интерфейса пользователя. Добавлено выделение прямоугольником для вырезания и копирования части диаграммы (в прошлой версии было только копирование и вставка одного блока по щелчку колесом мыши). После копирования куска диаграммы (с проводками с данными и жесткими последовательностями) его можно вставить кликом колесом мыши на пустом месте диаграммы. Есть план реализовать в будущий версиях также создание подфункций из выделенного куска - аналог Create SubVI из LabVIEW (так была сделана немалая часть функций в прототипе Метапрога).

Однако самая интересная фича новой версии - сериализация в base64 координат блока на диаграмме с цепочкой функций. Этому есть как минимум два возможных применения. Можно «ткнуть пальцем» на нужный блок (меню блоки - ткнуть пальцем на блок). Будет сгенерирована строка такого вида:

metaprog_debug:AAAAAAAAAAAAAAAHAAAAAFBUSDAAAAAEAAAAAAAAAAAAAAAAAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAU4fPk6Ov87ejqIO3gIOfg7+jy4PUAAAAK0+rw4L/t8fzq4AAAABXh8+To6/zt6Oog7eAg5+Dv8O7x4PUAAAAH0PPx8ero6VBUSDEAAAAxcmVsIAAr0LHRg9C00LjQu9GM0L3QuNC6INC90LAg0LfQsNC/0LjRgtCw0YUubXBiZBNiCtNfkRABAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAT9rPr7vfo8evu4ujpIOSz4Ovu4wAAAArT6vDgv+3x/OrgAAAAFPbl6+736PHr5e3t++kg5Ojg6+7jAAAAB9Dz8fHq6OlQVEgxAAAANXJlbCAAA25rYwAq0YbRltC70L7Rh9C40YHQu9C+0LLQuNC5INC00ZbQsNC70L7Qsy5tcGJkP/rfBI32qgEAAAADAAAAB01QTCAyLjAAAAAHTElDRU5TRQAAABDy5erx8u7i6Okg5LPg6+7jAAAACtPq8OC/7fH86uAAAAAQ8uXq8fLu4vvpIOTo4Ovu4wAAAAfQ8/Hx6ujpUFRIMQAAAC9yZWwgAANua2MAJNGC0LXQutGB0YLQvtCy0LjQuSDQtNGW0LDQu9C+0LMubXBiZFbEp7cIT2gBAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAV5+Dv8/HqIOKz6u3gIE51a2xlYXIrAAAACtPq8OC/7fH86uAAAAAU5+Dv8/HqIO7q7eAgTnVrbGVhcisAAAAH0PPx8ero6VBUSDAAAAAWAAEAAgNua2MNbmtjIGluaXQubXBiZFQc/+kgVZgBAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAO+PDo9PIg7fPq6+Xg8CsAAAAK0+rw4L/t8fzq4AAAAA748Oj08iDt8+rr5eDwKwAAAAfQ8/Hx6ujpUFRIMQAAADpyZWwgAANua2MAL9GW0L3RltGG0ZbQsNC70ZbQt9Cw0YbRltGPINC90YPQutC70LXQsNGAKy5tcGJkaxMcpv873AEAAAAAUFRIMAAAAAQAAAAAdcftGC2ZsAE=:metaprog_debug

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

Вместо тысячи слов:

https://i.postimg.cc/gd7RZD9Q/image.png

Там будет явно показан конечный блок, на который «ткнули пальцем», либо подфункция, по которой до него следует добираться.

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

https://postimg.cc/hQVLBcHp

Дебаг-строку выводит оранжевый блок.

В новой версии прототипа Метапрога было исправлено множество багов. Теперь метапроговские массивы и СУВТ можно помещать под указатели и вставлять в структуры, не боясь багов. Это позволило добавить к будильнику, реализованному в прошлой версии, диалоги, запрашивающие час и минуту срабатывания будильника.

Для компиляции надо скачать https://sourceforge.net/projects/tinyfiledialogs/

Распаковать в папке с Си-файлом так, чтобы работал соответствующий инклюд.

Код:

https://pastebin.com/5NW30tQx

Введя нужное число, закрываете окошко. После ввода часа и минуты в консоль будет выведено время срабатывания. Теперь будильником можно пользоваться и для повседневных нужд (звук пронзительный, хорошо слышный, sound.wav больше не нужен), однако завершать его работу надо еще через диспетчер задач или Ctrl+C в консоли, когда не идет звук. Также нет проверки введенных чисел, если введете не то число - будильник никогда не сработает.

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

Предыдущая версия:

Метапрог-прототип, версия 6 + будильник на Метапроге



Последнее исправление: metaprog (всего исправлений: 2)
Ответ на: комментарий от AntonI

Да без проблем, недавно я для себя открыл Mbed – RTOS от ARM. Написана на крестах. Вся ОС вместе с библиотеками и кодом вполне влезает в мою STMку с 64К памяти.

Unicode4all ★★★★★
()
Ответ на: комментарий от abcq

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

provaton ★★★★★
()
Ответ на: комментарий от AntonI

Да некоторой степени да, но и я не системный программист, чтобы дать вам прямо 100% ответ. Скажем так, в теории лично для меня это выглядит вполне осуществимым, просто не использовать ничего из плюсов и писать как на си, по идеи это должно сработать, т.е. для примера каким-нибудь new тоже пользоваться нельзя, не говоря уже о чем-то более плюсовом. Если я не прав, системщики меня поправят.

Относительно ассемблеров, там по сути ничего особо интересного и нет, вводишь команды, гоняешь туда сюда условные нули и единички, делаешь условные переходы, мучаешь регистры, интересно конечно, но уж очень утомительно. Да и не верю я вам :) по любому вы пробовали какой-нибудь ассемблер.

abcq ★★
()
Ответ на: комментарий от CryNet

А Делфи?

Неплохая вещь, я на нем писал чуток. Но потом познакомился с Лабвью - и оно все же лучше.

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

metaprog
() автор топика
Ответ на: комментарий от provaton

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

Я предлагаю уже давно ТС либо учить С и вообще программирование перед тем как делать то что он делает, либо хотя бы для прототипа и обучения в процессе написания взять что-то менее безжалостное чем С. Но он пока вертел на одном месте все мои доводы и не только мои, молодо-зелено :)

abcq ★★
()
Ответ на: комментарий от AntonI

Ассемблера кстати не знаю, но я правда не программист.

Наконец-то чистосердечное признание. Благодарю за честность.

metaprog
() автор топика
Ответ на: комментарий от metaprog

это возможно шутка и скромность, не будьте так наивны ) Особенно учитывая рассказы @AntonI о калькуляторах и советских эвм, там вообще ничего кроме ассемблера обычно не водилось, а то и что еще похуже, реальные «проводки-жгутики» шашечки контактные и прочая экзотика.

abcq ★★
()
Последнее исправление: abcq (всего исправлений: 1)
Ответ на: комментарий от abcq

т.е. для примера каким-нибудь new тоже пользоваться нельзя,

new дергает конструктор (иногда это бонус), но у него беда с выравниванием;-(

Вообще если готовить плюсы чистыми руками то все там хорошо, а с шаблонами так вообще песня. Беда в том, что нужно следить за тем что бы не свалится в какой нить факап типа возврата по значению сложного объекта с кучей вызовов new и пр. Ну и некоторые фишки STL меня до сих пор бесят;-(

Да и не верю я вам :) по любому вы пробовали какой-нибудь ассемблер.

Не, мамой клянусь! Несколько раз сравнивал выхлопы g++ -S для разных фрагментов кода и это все;-( Как правило у нас оптимизирующий компайлер делает лучше чем ты сам мог бы сделать, ну по словам старших товарищей. Хотя некоторые мегагуру внимательно изучают выхлоп с -S, да.

AntonI ★★★★★
()
Ответ на: комментарий от metaprog

Дрянью нечитаемой я могу назвать почти любой текстовый ЯП тупо потому что я их не знаю и не собираюсь учить.

Не просто написать for, а еще и кое-что в скобочках, точки с запятыми и все такое.

AntonI ★★★★★
()
Ответ на: комментарий от metaprog

«Волны перекатывались через мол и падали вниз стремительным домкратом»

Что бы означала эта фраза в данном контексте?

Ну, это опять цитата из одного литературного произведения.

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

cluge
()
Ответ на: комментарий от abcq

советских эвм, там вообще ничего кроме ассемблера обычно не водилось

Ну не надо вот… на всех советских ЭВМ с которыми я работал (было в школьные годы чудесные) был бейсик;-) Была какая то шня с разделением времени ку чей терминалов, бейсик там был без графики и я в текстовой моде сделал построитель графиков функций звездочками.

Ну и был у меня еще на бейсике растровый графический редактор для корвета (машина такая).

А калькулятор да, там чистый асм.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

ну да, но это и не только проблема С или С++ возврат по значению в принципе есть везде, понятно что будет больно и медленно.

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

abcq ★★
()
Последнее исправление: abcq (всего исправлений: 1)
Ответ на: комментарий от AntonI

ну это уже были более-менее современные, я умеренно опустил этот факт, но да любовь к бейсику в нашей стране народная :)

abcq ★★
()
Последнее исправление: abcq (всего исправлений: 1)
Ответ на: комментарий от metaprog

Для бипа, а не диалогов. Смотри диаграммы.

Ты бы хотя бы скриншоты готовой программы предоставил

Есть в цепочке вызовов.

Какой на хрен бип, какая цепочка вызовов, как посмотреть скриншоты в «цепочке вызовов»?

У Котечки получилось, а у тебя?

Еще не пробовал. С дивана встану, может быть попробую.

cluge
()
Ответ на: комментарий от abcq

хотя более чем уверен что в жизни оно вам вообще вряд ли пригодится

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

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

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

abcq ★★
()
Ответ на: комментарий от provaton

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

Уже есть простые обертки, превращающие нуль-терминированые строки в метапроговские массивы:

https://postimg.cc/hJLbV2cz

и метапроговские массивы - в нуль-терминированные строки:

https://i.postimg.cc/g2zBv8Rv/image.png

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

Нужны абстракции, которые позволяют гарантировать безопасность работы с памятью

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

В расте, вами столько презираемом, есть концепция «владения», «времени жизни», «изменяемости».

Жаль что Царя банят, он бы раст на ноль помножил:)

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

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

metaprog
() автор топика
Ответ на: комментарий от abcq

хотя бы для прототипа и обучения в процессе написания взять что-то менее безжалостное чем С

LabVIEW я уже взял и на нем все и пилю.

metaprog
() автор топика
Ответ на: комментарий от abcq

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

Метапрог-прототип, Метапрог онлайн с многокомнатным чатом и VCS под Метапрог, сервер под это дело - и это только то, чем я хвастаюсь на ЛОРе. Пока не захлебнулся. Да, меня не устраивает низкая скорость и копирастическая закрытость Лабвью - иначе смысл делать Метапрог?

я бы даже калькулятор писать не стал на лабвью

Это то что обычно делают студенты, изучая Лабвью.

metaprog
() автор топика
Ответ на: комментарий от metaprog

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

abcq ★★
()
Ответ на: комментарий от anonymous

Можете вы LabView подружить с QT?

Пропатчить LabView под QT? Это какой-то новый уровень говноедства.

rupert ★★★★★
()
Ответ на: комментарий от anonymous

Он это быстро сделает, метапрог-же в тыщу сто раз продуктивнее тексто-клавиатурного программирования.

rupert ★★★★★
()
Ответ на: комментарий от metaprog

Жаль что Царя банят, он бы раст на ноль помножил:)

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

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

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

Это, как говорится, легко сказать. А на практике все сложнее. Что если мы указатель на массив передали в библиотеку? Как быть с перекрёстными ссылками (ваши метапроговские диаграммы, кстати, яркий пример структуры данных с перекрёстными ссылками)? Как быть с асинхронностью или многопоточностью, где мы вообще не знаем последовательность исполнения кода до запуска?

provaton ★★★★★
()
Ответ на: комментарий от metaprog

И ее надо лечить по мере эволюции сишных библиотек в метапроговские.

Интересно у вас концепт поменялся, кстати. Раньше вы говорили, что выбрали си для легкой интеграции с существующими библиотеками. Теперь говорите, что сишные библиотеки говно, и их нужно заменить на метапроговские. Остерегитесь Царя, вы покушаетесь на святое для него)))

provaton ★★★★★
()
Ответ на: комментарий от metaprog

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

Разве это проблема?

(С) Вы - насчёт сборки мусора (да-да, речь именно о ней).

«Нет ничего практичнее хорошей теории»(с) - но для необучаемых дворников сие недоступно.

AntonI ★★★★★
()
Ответ на: комментарий от provaton

Только не рассказывайте ему про std::string и пр. аналоги. Сам, все сам, шевеля жгутиками и псевдоподиями

AntonI ★★★★★
()
Ответ на: комментарий от ossa

Спасибо, любопытно. Правда я не уверен что его хватит…

AntonI ★★★★★
()
Ответ на: комментарий от provaton

Жаль что Царя банят, он бы раст на ноль помножил:)

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

Кстати да, в С++ есть lifetime: https://github.com/isocpp/CppCoreGuidelines/blob/master/docs/Lifetime.pdf

Правда пока только в экспериментальной ветки clang(-Wlifetime) и Visual Studio 2019 с включенными правилами C++ Core Check Lifetime Rules

fsb4000 ★★★★★
()
Ответ на: комментарий от AntonI

Развивая тему - не помню кто именно сказал: Хороший программист пишет в среднем 50 строчек кода в день. Все остальное время он думает, читает, смотрит как сделано у других.

saibogo ★★★★
()
Ответ на: комментарий от provaton

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

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

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

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

В целом, больинство проблем с безопасностью в Си - из-за нуль-терминированных строк, так ведь?

metaprog
() автор топика
Ответ на: комментарий от provaton

Что если мы указатель на массив передали в библиотеку? Как быть с перекрёстными ссылками (ваши метапроговские диаграммы, кстати, яркий пример структуры данных с перекрёстными ссылками)? Как быть с асинхронностью или многопоточностью, где мы вообще не знаем последовательность исполнения кода до запуска?

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

metaprog
() автор топика
Ответ на: комментарий от metaprog

lifetime

И шо он дает?

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

Пример: https://gcc.godbolt.org/z/92owCW

Кстати, видел мой комент?: Метапрог-прототип, версия 6 + будильник на Метапроге (комментарий)

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от abcq

скромнее надо быть

Детей своих учи этому.

Для хвастовства пока нет причин

Есть:)

все что вы наваяли без С не работает

Ну и что? То же можно сказать почти обо всех нынешних ЯП. Если намекаешь на то, что это «не язык», то я и не делаю какой-то очередной скриптушный недоязык в традиционном текстовом понимании, ибо незачем. Что может быть лучше сишной системы типов?

а приложения собранные из них дырявые и протекают

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

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

Зачастую советы там даются вредные. Царь где-то писал, что в книгах очень часто пишут ерунду.

metaprog
() автор топика
Ответ на: комментарий от fsb4000

lifetime

И шо он дает?

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

Если в плюсах можно статически анализировать память, то и в Метарпоге, полагаю, можно будет. Однако как lifetime ведет себя, скажем, в многопоточных приложениях, когда указатели на указатели на указатели и не совсем понятно когда надо деструктить объекты?

Кстати, видел мой комент?: Метапрог-прототип, версия 6 + будильник на Метапроге (комментарий)

Много написали, мог проскипать. Во сколько раз ускоряется код?

metaprog
() автор топика
Ответ на: комментарий от metaprog

Много написали, мог проскипать. Во сколько раз ускоряется код?

У меня на AMD FX8300(типа 8 ядерный) примерно в 5 раз

fsb4000 ★★★★★
()
Ответ на: комментарий от metaprog

Детей своих учи этому

Да, Вас ничему обучить невозможно.

Что может быть лучше сишной системы типов?

Много что, но Вы об этом никогда не узнаете - ведь что бы это узнать придется учиться

Да и утечки - не самое страшное, их несложно устранить - куда хуже уязвимости, от которых метапроговские массивы защищают

Так и представил метапроговских массивы которые жгутиками отбиваются от злых уязвимостей!

Царь где-то писал, что в книгах очень часто пишут ерунду

Ну далеко не так часто как вы с Царем и котей.

AntonI ★★★★★
()
Ответ на: комментарий от metaprog

Ещё про лайфтаймы: это лишь правила, соблюдая которые у тебя будет корректное приложение. Но если ты нарушаешь какие-то правила, то приложение не обязательно на 100% содержит ошибку.

Вот пример:

https://developercommunity.visualstudio.com/content/problem/611663/c26486-false-positive-with-stdstring-view.html

fsb4000 ★★★★★
()
Ответ на: комментарий от saibogo

Я слышал про двадцать:-)

Ну теперича революция, метапрог-программист будет рисовать 500 жгутиков в день! И ни на что больше у него не останется времени…

AntonI ★★★★★
()
Ответ на: комментарий от metaprog

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

Зачастую советы там даются вредные. Царь где-то писал, что в книгах очень часто пишут ерунду.

Что-то подобное припоминаю, с другой стороны база какая-то нужна, и царь тоже так думает, нашёл вот такой комент:

https://i.imgur.com/xuuqhTn.png

fsb4000 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.