Если хотите разозлить программиста, покажите ему эту картинку

Я не программист, но даже меня немного коробит. ))
Сохраняй посты, комментируй и ставь оценки

Я не программист, но даже меня немного коробит. ))
Многие новички в программировании совершают эту ошибку — пытаются написать всё и сразу. Говорю им, что нужно разбивать на подзадачи и писать маленькими порциями — всё равно пишут всё сразу, а потом ищут ошибки сразу по всему коду. Вместо того, чтобы отлавливать их на маленьких кусочках.
Начинающим вообще каждые 2-3 строчки лучше запускать. 10 строк кода уже много, уже тяжеловато в них ориентироваться. Но вот пишут, делают ошибки, искать их и исправлять ещё не умеют, поэтому при исправлении часто только ещё сильнее ломают... Сколько мучений на ровном месте.
К чему обычно приводит такая практика и почему ситуация не меняется с годами?

Несмотря на многолетние предупреждения и настойчивые рекомендации экспертов, многие разработчики по-прежнему не могут избежать включения конфиденциальных данных в свой открытый код.
Проблема возникает из-за незрелых практик кодирования, когда разработчики встраивают ключи шифрования, токены безопасности, пароли и другие учётные данные непосредственно в исходный код, чтобы упростить разработку и облегчить программам доступ к базам данных или облачным сервисам. Тем не менее, такой подход делает программные продукты уязвимыми для внешних атак.
Так, ещё в далёком 2013 году одним из независимых исследователей безопасности было обнаружено, что обычный поиск в Интернете выявляет десятки учётных записей с открытыми данными. Один из таких уязвимых аккаунтов давал привилегированный доступ к репозиториям Chromium.org, где хранится исходный код одноимённого открытого браузера.
А в 2015 году компания Uber на собственном горьком опыте убедилась, насколько разрушительной может быть эта практика. Один или несколько разработчиков сервиса Ride в то время внедрили в исходный код проекта уникальный ключ безопасности, а затем без задней мысли опубликовали этот код на общедоступной странице GitHub. Когда хакеры обнаружили, что в коде содержится ключ, они скопировали его и использовали для доступа к внутренней базе данных Uber. Злоумышленникам тогда удалось похитить множество конфиденциальной информации, принадлежащей 50 тысячам водителей Uber.
На этой неделе исследователи из компании GitGuardian сообщили о нахождении почти 4000 уникальных секретов в 450 тысячах проектах, отправленных в PyPI, официальный репозиторий кода для языка программирования Python. В их числе были ключи к API Azure Active Directory, учётные данные GitHub OAuth, ключи Dropbox, учётные данные SSH и многие другие. Отмечается, что количество таких утечек лишь растёт с течением времени.
Исследование показывает, что утечки происходят в различных типах файлов, включая основные «.py»-файлы, файлы README и тестовые папки. Специалисты GitGuardian протестировали утечки и обнаружили, что 768 из них остаются активными, что дополнительно увеличивает риски.
Для безопасного доступа к базам данных и облачным ресурсам теперь существуют различные механизмы, такие как файлы «.env», хранимые в частных средах, вне открытых репозиториев кода, а также инструменты, такие как AWS Secrets Manager, Google Cloud’s Secret Manager или Azure Key Vault. Разработчики также могут использовать разнообразные сканеры для проверки кода на случайно включенные учётные данные перед его публикацией.
Исследование GitGuardian ограничивается PyPI, одним из многих открытых репозиториев, но нет оснований полагать, что проблема не распространена и в других репозиториях.
Короткий познавательный пост, основанный на моей больной фантазии. Все совпадения случайны.
Обратился как-то один человек на профильном форуме с вопросом, как запустить (не сказать чтобы старую) игру на Windows 10. Игра (хотя я бы назвал это технодемо) была разработана на легендарном XNA 4.0 (земля пухом) и планировалась к выпуску через Steam Greenlight (и ему земля пухом) еще в далеком 2012, после чего заброшена и убрана со всех магазинов.
Игра была куплена тем человеком еще в тот момент, когда она легально продавалась. А спустя годы она просто перестала подавать признаки жизни. $5 за полную версию уплочены, а поиграть нельзя. Обидно.

Так как типовые решения по типу установки XNA Redistributable не помогли, то был предложен единственно возможный выход из ситуации - отладка через dnSpy.
Внимание: обратная разработка хоть прямо и не запрещена законодательно, но разрешенные случаи весьма ограниченны. В других странах разрешен явный запрет любых манипуляций через лицензию, превращающий это занятие во вполне наказуемое. Не повторяйте дома.
Так как ПО было приобретено легально и оно не работает, то этот теоретический случай допустим в соответствии со статьей 1280 гражданского кодекса.
Демонстрировать буду на бесплатной демоверсии, скачать можно здесь.

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

Ошибка. Открываем стек вызовов и ищем место, где произошел провальный запрос в сеть.

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

Если почитать документацию на XNA, то этот метод предназначен для загрузки контента и вызывается автоматически при запуске игры. Первым делом выполняется инициализация некоторых вещей, после чего открывается файл настроек (options.xml) и начинает последовательно считываться. Как только считываются параметры аккаунта для таблицы рекордов, то происходит отправка логина+пароля на официальный сайт и попытка получить ID. Если сервер возвращает Failure, то открывается диалог входа, который можно пропустить. Если сервер возвращает число, то игра запускается. А вот если сервер недоступен, то вылетает исключение, которое никак не обрабатывается и приводит к молчаливому вылету.

На этом этапе есть 2 варианта действий:
Нормальные герои всегда идут в обход, так что переходим к написанию небольшого патча. (На самом деле, о первом варианте я додумался не сразу. Более того, полная версия зависает при убирании этого пункта из настроек).
Выделяем строчку с запросом и нажимает "Изменить инструкции IL". Открывается окно с заголовком "Изменение тела метода".

Это - язык MSIL. Он очень прост и сильно напоминает Forth, на самом деле, но новичка может отпугнуть.
Ключевым элементом является стек. Что такое стек я уже когда-то рассказывал. Это некоторое место, на вершину которого можно последовательно добавлять значения (числа, строки и прочие объекты), а так же снимать их в обратном порядке.

Тут мы добавляем на стек:
Потом мы вызываем String::Concat(), принимающий в себя 4 строки и соединяющий их вместе. При вызове метода будут сняты 4 верхние строки со стека и добавлена новая строка.
Вызов следующего метода (WebClient::DownloadString()) снимает строку, полученную от String::Concat(), и веб-клиент. В результате должна остаться только 1 строка, возвращенная WebClient::DownloadString().
Следующим этапом мы должны снять эту строку со стека и сохранить её в локальную переменную 1, но этого не произойдет, так как WebClient::DownloadString() всегда будет проваливаться и выбрасывать исключение. Исключение, если его не обработать сразу, будет раз за разом проваливаться глубже по стеку вызовов, пока не достигнет обработчика или дна. Так как никаких обработчиков по пути нет, то исключение достигает дна и приводит к вылету.
Чтобы избежать получения исключения, мы можем убрать всё, что предназначено для запроса в сеть. Примерно вот так:

8 инструкций превратились в 2: загрузка строки с числом (которое может быть любым) и сохранение в локальную переменную под номером 1.
Сохраняем и проверяем результат.


Из декомпилированного кода полностью исчез кусок с запросом. Осталась лишь загрузка константной строки и сравнение с "Failure", которое всегда будет успешным.
Сохраняем модуль и пытаемся запускать опять.



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

Но не всё так просто. Если попытаться пройти любой уровень, то вылетит то же самое исключение.
Для исправления точно так же выделяем строку и опять редактируем инструкции в теле метода. Но так как отправка статистики нонче ни на что не влияет, то просто удаляем выделенные инструкции без остатка.
А для надежности выделяем WebClient, нажимаем "Анализировать" и смотрим, где еще может ждать нас подлянка.

В Finish.Update() мы ошибку только что исправили, в Game1.LoadContent() исправили в самом начале, а Login.button1_Click(), Program.Main() и Title.Update() нас не интересуют, так как достаточно просто не делать того, что приведет к обращению в сеть (а конкретно: не открывать диалог входа, не указывать никакие аргументы при запуске и не пытаться авторизоваться через главное меню (вроде бы не реализовано)).
Вуаля. Игра работает как прежде.
Привет. Я продолжаю разрабатывать сервер для Lineage 2 C1 на JavaScript Проект
Из-за ошибки в расчёте дистанции для атаки в поведении NPC произошёл сбой: он не может выбрать, атаковать ли ему или убегать.
Блог про разработку сервера для Lineage 2 в телеге https://t.me/lineage2js
Есть такая хрень в программировании как рекурсия. Можно сюдя приплесть и фрактал, но это больше к топологии, а не программированию.
И так, самый простой и понятный пример рекурсии - это берём зеркало впереди себя и сзади. и смотрим на картинку:

Но в программировании это выражается в вызовах функции самой себя, либо кругового вызова функций, например(для знающих Си-подобные языки):
int A(int a) {if(a & 1) a=a+1; return B(a); else return 17;}
int B(int a) {if(a > 500) a=a/3; return C(a); else return 113; }
int C(int a) {if(a ^ 1) return A(a); return -1;}
Грубо говоря, функция А, вызывает функцию Б, функция Б вызывает функцию С, а та уже снова вызывает функцию A. Вроде эти вызовы будут длиться бесконечно, но всегда должно быть условие выхода из рекурсии (под спойлером выше в каждой функции есть такое). Если что - писалось на коленке и практического, и математического смысла не имеет - чисто показать что да как.
А нафига такие сложности? Дело в том, что часто в программировании невозможно обойтись без рекурсий. Да, для понимания её надо сильно поломать свой мозг - именно ломать мышление, а не уставать от напряжённого мозгоштурма.
Однако есть определённый класс рекурсий (в него входят и так называемые "кольцевые", как в спойлере выше). И вот тут срабатывает "Ивент Вомбата", эти рекурсии называются ХВОСТОВЫМИ.
Фишка их в том, что их можно ВСЕГДА развернуть в цикл. Например вычисление числа Фиббоначи:
int Fibb(int a) {if (f<=0) return 1;/*условие выхода из рекурсии*/ return Fibb(a-1)+a;}
Тоже самое разворачивается в цикл вида
int a=123, result=1;
for(int i=0; i>a;;){result = result+a; a=a-1} /*тут мог ошибиться - просьба не пинать*/
return result;
Вроде бы много кода, строк и т.п. Но, рекурсия в общем виде использует стек (который не бесконечен), и дикие затраты на вызов функций внутри рекурсий (на i8086 надо было сохранять каждый процессорный регистр в стеке, а это 2 такта, в i80286 уже появилась pusha, но она так же требовала тактов, ну и переброс из стека в регистры переменных, возврат результата) - накладных расходов на рекурсию очень много, даже в современный процессорах.
Однако, всё что было описано выше прекрасно разворачивается в циклы "умными" компиляторами. Хотя многие алгоритмы с хвостовой рекурсией даже современные компиляторы не могут развернуть в цикл. Примером этого може служить сортировка бинарным жеревом. В рекурсивной форме эта сортировка - задачка студента второго курса (по моим старческим меркам), но компиляторы не способны её раскрутить в цикл, это делалось человеческими мозгами ещё в 80х годах прошлого века (сам разбирал борландовский алгоритм qsort(***) по запчастям обучаясь).
Так что не всё в мире нашем сводится к "хвостам", иногда приходится и сущности плодить поверх ненужного...
Решил я поиграться в ардуинки. Выбор пал на ESP32-C3 с 0,42-Дюймовым OLED-Модулем за какие-то там 200 руб. Пока оно едет из Китая думаю, дай потыкаюсь со средой разработки. Раньше дела с ней не имел.
Оказывается есть две версии под линухой. Одна на электроне v. 2.3.8 и старая 1.8.19 на Java. Но об ентом я ещё не знал, естественно выбрал поновее и получил засаду - вечно крутится на заставке. Думал наши разрабы АльтЛинухи накосячили с опакечиванием, перепробовал кучу сборок со стороны (не из репов Альта) - везде одно и тоже - вечно крутится заставка. Запустил иде из консоли и увидел туеву хучу ошибок с невозможностью чего-то там скачать. Направление гугления тут же изменилось и выяснилось, что www.arduino.cc лочит россиян из-за Cloudflare (эдакий сервис для защиты сайтов от хакерских атак). Что и и как произошло между Cloudflare и РФ вспоминать не стал и начал думать как пустить Ардуино-ИДЕ через тор-сеть. Придумать не удалось
Вот тогда я и узнал, что разница между старой и новой ИДЕ исключительно в интерфейсе, более того, настроек сети в новой версии я не нагуглил (возможно пальчиками где-то в конфигах и прописывается). А вот в старой версии пожалуйста Файл-->Настройки->Сеть:

При этом все библиотеки и "платы" начали загружаться. И да, версия из репозиториев Альта. Между прочим, ардуинки часто используются не только как хобби, но и в образовательных целях. Но политиканам насрать на это.
О проекте: Пишем один код - собираем на разные 8 бит МК!
https://vm5277.ru - это универсальное решение для embedded-разработки, которое позволяет сократить время создания прошивки для 8 бит микроконтроллеров в разы.
Как это работает?
Что входит в решение:
Ключевые преимущества:
Проект находится на ранней стадии, но я активно над ним работаю. Уже можно видеть, как высокоуровневый код на Java-подобном языке превращается в чистый и эффективный ассемблер! Это ещё не итоговый вариант, но прогресс уже есть.
Что уже работает в этом примере:



Также приведу одну из функций RTOS(код сырой, может содержать ошибки)

Ключевые фрагменты сгенерированного ассемблерного кода:
1. Метаданные класса:
Компилятор автоматически формирует структуру для поддержки RTTI (Run-Time Type Information), необходимую для instanceof.

2. Динамическое создание объекта в куче:
Код конструктора new Byte(0x08) транслируется в вызов менеджера динамической памяти (os_dram_alloc) и инициализацию полей.

3. Проверка типа (is / instanceof):
Оператор if(b1 is Byte) компилируется в вызов процедуры j8bproc_instanceof_nr, которая проверяет метаданные объекта.

4. Полиморфный вызов метода:
Вызов b1.toByte() через интерфейс Number преобразуется в универсальный механизм поиска и диспетчеризации метода.

5. Интеграция с системными сервисами:
Вывод в "консоль" (System.out) — это вызов системного сервиса ОСРВ.

Что это значит?
Это доказывает, что подход vm5277 работоспособен. Мы можем писать на высокоуровневом ООП-языке, а под капотом получать код, который:


Наверное невозможно найти человека, который бы никогда не встречал программ на Java. Сначала телефоны с J2ME, потом Android, который использует свои варианты реализации JVM и свой байткод. Даже многие сим-карты внутри используют свою оптимизированную разновидность Java.
Даже JavaScript обязан своим названием популярности Java, хотя и не имеет с ней прямого родства.
(При этом некоторый промежуток времени существовали Java-апплеты)

По официальной информации, 23 мая 1995 года, ровно 30 лет назад, Sun Microsystems выпустили первую бета-версию Java. Первая полноценная официальная версия JDK 1.0 выйдет только 23 января 1996.
Изначально язык должен был называться "Oak" (дуб, который рос рядом с офисом разработчиков), после чего был переименован "Green" (зеленый), а потом в честь кофе с острова Ява. А в качестве целей языка ставились:
Синтаксис был практически полностью позаимствован из C++, который уже был знаком многим программистам. Были выброшены процедурные артефакты C в виде "бродячих" глобальных переменных и функций, всё должно принадлежать классам. Также выбросили некоторые "неудачные" решения C++, к примеру дружественные классы, множественное наследование (его заменили интерфейсы), перегрузку операторов (зачем?!) и еще немного. Вместо ручного управления памятью было решено внедрить сборщик мусора, чтобы облегчить разработку и снизить количество ошибок и уязвимостей.
Главной особенностью языка стала концепция "напиши единожды, запускай везде" (хотя правильнее это будет назвать "напиши единожды, отлаживай везде" из-за различных реализаций и окружения), возможная благодаря тому, что код сначала компилируется в стандартизированный и независимый от процессора байткод для виртуальной машины (JVM), а в машинный код переводится только на машине потребителя, учитывая её архитектуру и особенности. Получается что-то среднее между интерпретируемым и компилируемым языком.

Язык получился... интересным.
То, что планировалось простым, в итоге превратилось в многословное нечто, а в сочетании со всякими архитектурными извращениями стало притчей во языцех о громоздкости корпоративного стиля. Потом появились совместимые с JVM альтернативы по типу Kotlin, ибо Java старательно игнорирует и не вводит ничего, что бы могло замазать многословность и неудобство. Android давно официально рекомендует использовать его вместо Java.
Добиться высокой скорости на интерпретируемом языке со сборкой мусора тоже проблемно. JIT замедляет запуск и жрет память, AOT поддерживается плохо и с ним невозможно реализовать некоторые вещи (кодогенерацию, к примеру), плюс остается сборщик мусора. Плюс некоторые не очень удачные решения и ограничения, тоже не способствующие высокой производительности (видно на контрасте с C#, в котором их исправили).
Тем не менее, Java на очень долгое время стала самым востребованным языком и отлично продолжает жить и сейчас, находясь на 4 месте популярности по версии TIOBE и дважды становясь языком года (в 2005 и 2015).


Давно сюда не писал, так как чего мельтешить. Но @vrom1990/streams с решением разных задачек продолжал каждый четверг в 20:15 по московскому времени. Вот плейлист со стримами по циклам:
https://youtube.com/playlist?list=PLmn7h9eyDeMNT1cF1tC_BbiRD...
Там далеко не всё разобрал, что можно было, будут запросы — продолжу. Там же, на самом деле, и разобрал многие типовые задачи и на списки, так как цикл for со списками очень связан.
Ещё немного видео на циклы и списки тут
https://www.youtube.com/playlist?list=PLmn7h9eyDeMPE7twjaYrT...
А вот и последний стрим, два простеньких забавных, но полезных проекта на списки

@vrom1990
https://archive.org/details/python-tupyh
https://www.youtube.com/c/ВячеславРоманьков
@vrom1990/
@vnrom1990
https://t.me/vrom1990pb
Новый инструмент для генерации кода на основе искусственного интеллекта, AlphaCodium , вдохновлённый разработками Google DeepMind AlphaCode (и недавно запущенным AlphaCode 2 на базе Gemini), теперь превзошёл их, вызвав бурное обсуждение в Twitter на этой неделе.
"Мы на шаг ближе к тому, чтобы ИИ начал генерировать код лучше, чем люди!" - написал Сантьяго Вальдаррама. "Результаты демонстрируют, что AlphaCodium - это лучший подход к генерации кода, который мы видели. Он опережает AlphaCode от DeepMind и их новый AlphaCode2, не требуя дополнительной настройки модели!"
Андрей Карпати, бывший директор по искусственному интеллекту в Tesla и сотрудник OpenAI, акцентировал внимание на методе "инженерии потока" в рамках нового инструмента для оптимизации генерации кода. Он описал этот подход как эволюцию от базовой модели "вопрос-ответ" к более продвинутой парадигме "потока", где ответы разрабатываются и уточняются посредством итеративного процесса.

Для улучшения работы моделей больших языковых моделей (LLMs) в задачах, связанных с кодированием, "инженерия потока" AlphaCode расширяет технологию цепочек мыслей, включая элементы архитектуры GAN (разработанной Яном Гудфеллоу в 2014 году), включающие модель, генерирующую код, и противоборствующую модель, обеспечивающую целостность кода через тестирование, размышления и соответствие спецификациям.
Процесс начинается с ввода данных и включает ряд предварительных шагов, где AlphaCodium размышляет над задачей и в итоге приходит к первому решению в виде кода. Затем генерируются дополнительные тесты, которые помогают уточнить решение, и достигается окончательное, действительно работающее решение.
Миссия компании , согласно её веб-сайту, - "помочь разработчикам создавать быстрее и без ошибок". AlphaCodium был протестирован на наборе данных CodeContests, содержащем около 10,000 задач по программированию. Его производительность на этом бенчмарке показала улучшение точности GPT-4 с 19 до 44%. "Этот результат - не просто числовое улучшение; это прорыв в возможностях LLMs в генерации кода, устанавливающий новый стандарт в этой области", - заявили в CodiumAI.
CodiumAI, основанная в 2022 году и привлекшая $10.6 миллионов в марте 2023 года, поделилась репозиторием AlphaCodium на GitHub и сопутствующим исследованием "Генерация кода с AlphaCodium: от инженерии запросов к инженерии потока"

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

Помимо стека, о котором было рассказано в прошлой статье и который содержит локальные переменные, в "потребительской" программе в среднестатистической ОС еще бывают глобальные переменные и динамическая память. Глобальные переменные описываются внутри сегментов .bss и .data, резервируясь в памяти сразу после загрузки образа программы (по-правильному это называется процессом).
Динамическая память иначе называется кучей, так как представляет из себя кучу динамических данных, который могут появляться и исчезать во время работы.
Для работы с динамической памятью в C существует malloc(size_t), запрашивающий (выделяющий, аллоцирующий) у ОС кусок памяти указанного размера и возвращающий указатель на первый байт, и free(void *), принимающий этот указатель и возвращающий (освобождающий) кусок назад в ОС.
В C++ есть операторы new и delete, они устроены гораздо сложнее и я не буду их рассматривать, ибо не пишу на нем. Помимо запроса памяти у ОС они занимаются ее инициализацией.
Если по какой-то причине стандартной библиотеки языка в наличии не имеется, то в Windows за память отвечает HeapAlloc и устаревшие GlobalAlloc и LocalAlloc из времен Windows 3.11 (malloc к ним и обращается внутри. Еще есть парные HeapFree, GlobalFree и LocalFree). Они предоставляют больше контроля над результатом, но проприетарны для Windows. А полный список функций для работы с памятью в WinAPI есть здесь, их сотни на любой случай жизни. Можно даже внутри контекста чужого процесса выделить или освободить кусок памяти (обычно такое используется вирусами и прочей нечистью).
А что будет, если постоянно выделять, но не освобождать? А еще лучше: выделять, но терять адреса выделенной памяти. ОС достаточно быстро подскажет правильный ответ.
В теории есть несколько возможных выходов, можно даже обработать подобный случай и, к примеру, экстренно освободить всё выделенное (только если не терять указатели) или попытаться спасти нужные данные из разваливающейся программы, но если никаких действий не предпринять, то ОС заставит процесс экстренно прекратить свою деятельность и существование.
Случай с потерей указателей на выделенную память называется утечкой памяти и ее последствия необратимы. Но как только ОС завершает выполнение процесса, то вся его память, даже утекшая, становится снова свободной.

Отслеживание правильности выделения и освобождения памяти является достаточно сложной и опасной задачей, особенно если требуется обеспечивать стабильность и безопасность (лучше даже не думать, что будет, если рукожопый программист забьет на MISRA и устроит утечку памяти в подсистеме тормозов в Тесле), и практически невыполнимой в некоторых парадигмах (особенно в функциональном программировании). Поэтому еще с древнейших времен (с 1959 года) существуют языки со сборкой мусора:
Но несмотря не это, практически все современные языки используют сборку мусора, кроме C++ и Rust. C++ по большей части перешел на умные указатели, которые тоже считают количество активных ссылок, но делают это без сборщика мусора. А Rust использует свой уникальный Borrow Checker, который понимают только растофилы.
На этом вроде у меня всё.
Всем доброго времени суток, с вами на связи Lis-ST. Это мой первый пост, не на данном сайте, а вообще, (не зря же я состоял в "Лиге лени"), но на общем фоне нейроистерии и всё большего распространения нейросетей кто-то должен хотя бы минимально объяснить, что же такое "Нейросеть", а так-же как правильно с ними работать и чего в принципе от них можно ожидать. В данном посте затронем только самые основы.
Здесь можно было бы надергать текста с вики, различных ресурсов, прогнать всё это через нейронку и вставить тысячи нудных строк на 2 часа чтения, но мне лень, поэтому пробежим вкратце по основным моментам.
Сама идея, создать что-то, что работало бы схожим образом с мозгом, как ни удивительно, появилась задолго до появления компьютеров. Первая математическая модель нейрона была создана ещё в 1943 году.
Первая же нейросеть появилась в 1950 году, примерно в это время начали появляться первые предшественники современных компьютеров. Умела она немного, могла только отличить круг от квадрата, или квадрат от круга, может ещё от треугольника, но ничего сложнее. И на этом всё развитие данной идеи практически остановилось по банальной причине - недостаток вычислительной мощности. Но, это не значит, что от идеи полностью отказались. Её постепенно развивали, предлагались новые модели, способы тренировки но очень существенный толчок в развитии нейронок я связываю с 2015 годом, именно в этот год была основана OpenAI и в 2016 году она положила начало нейроистерии, выпустив в публичный доступ, нет, не нейросеть, а платформу для разработки и обучения нейронок.
Тут определённо стоило бы начать с определения того, что такое нейрон, но чем больше будет определений, формул и подобного, тем хуже для восприятия будет текст, поэтому простыми словами - это то, что может принимать, обрабатывать, хранить и передавать информацию. Нейронная сеть - попытка повторить данные свойства нейрона.

На сегодняшний день придумано множество разных нейронок, разберём самую примитивную, как на картинке выше, она состоит из трёх слоёв: входной, скрытый и выходной.
Входной слой: на него в нейронку поступают какие либо данные - текст, числа, изображения, координаты и т.п.. Здесь данные приводятся к удобному для нейронки виду (обычно это числа от 0 до 1), чтобы слишком большие значения не «свели сеть с ума» или не спалили ваш компьютер. У вас закономерно возникнет вопрос, как можно фото котика представить в виде обычного числа? Всё просто, это не одно число, а тысячи, на каждый пиксель выделяется по входному нейрону, который просто задаёт удерживает числовый значения. Так, для картинки 1024 на 1024 пикселя нам потребуется 1 048 576 входных нейронов.
Скрытый слой, на нем остановимся намного подробней, так как он и ответственен за всю магию нейронных сетей. Это по сути «сито», которое фильтрует данные, чтобы найти в них смысл. Нейрон скрытого слоя берет данные на входе, преобразованные в числовые значения и умножает их на «важность» (вес). Например, при поиске кошки на фото — острые уши и хвост важны, а цвет фона — нет. Затем все результаты складывает в одно число, а полученная сумма сравнивается с порогом, который сформировался при обучении нейронки. Если число достаточно большое, нейрон «просыпается» и передает сигнал дальше. Если нет — молчит.
Выходной слой — это финал, где нейросеть выдает готовый ответ. Он превращает сложные вычисления скрытых слоев в понятный формат. Если в скрытых слоях нейроны «ищут признаки», то в выходном слое они просто «голосуют» за итоговый результат.
В попытках получить наилучший результат, уменьшить требуемые вычислительные мощности для работы нейронок, постоянно придумывались новые варианты их архитектуры, способов тренировки, обработки данных. Так появились на свет нейросети с несколькими скрытыми слоями, каскады нейросетей, свёрточные нейронки и многие другие.
Здесь всё очень сложно, пока на этом не будем заострять внимания, но для общего понимания вот очень краткий список основных архитектур и более подробная картинка для наглядности:

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

Я всегда работал в командах, где рядом были гики.
Они могли часами ковыряться в исходниках, спорить о фреймворках, разбирать архитектуры до последнего байта.
И я часто чувствовал себя самозванцем.
Я не получал удовольствия от бесконечного копания в технологиях.
Меня всегда больше заводила другая часть - продукт.
Чтобы было что показать людям. Чтобы оно работало и решало задачу.
И вот недавно я наткнулся на простую мысль: есть два типа разработчиков.
Когда я это понял — многое встало на свои места.
Я перестал сравнивать себя с теми, кто живёт кодом ради кода.
Я нашёл отдушину в пет-проектах и indie-hacking. Там как раз важнее другое — скорость, гипотезы, первые пользователи.
💡 Поэтому если ты тоже чувствуешь синдром самозванца — попробуй честно ответить себе: кто ты?
Гик или продуктовый.
И тогда сравнивать станет проще, а работать легче.
Я делюсь такими наблюдениями про код, проекты и indie-hacking у себя в телеге. Если эта тема отзывается — заглядывайте, ссылка в профиле
Говорят, что ни в коем случае нельзя озвучивать свои планы, надо держать их в секрете. А то господь Бог обязательно над этими планами посмеется и устроит какую-нибудь каверзу на пути к успеху. Я, однако, считаю, что это пустые суеверия. Бог не будет опускаться до такой мелкой работы, как строить препятствия обычному человеку. Впрочем, даже если и так, не буду упускать интересную возможность проверить эту версию на практике.
© 2024 - 2025 Константин Оборотов
===

*** Буду играть по плану ***
У шахматистов есть такое золотое правило: "лучше играть по плохому плану, чем вообще без плана". Почему бы не попробовать применить это правило к писательской деятельности?
Сказано - сделано. И вот перед вами примерный план моих творческих писательских работ на новый 2025 год. В течение года буду иногда в него поглядывать, а в конце года будет интересно сверить прекрасные мечты и суровую реальность.
*** Шахматы ***
Вот с шахмат, пожалуй, и начну набрасывать свои тезисы. Играть буду мало. В 2025 году хотелось бы сыграть всего лишь несколько партий, но сыграть так, чтобы они получились красивыми, и эта красота была доступна для широкого круга любителей. А потом сделать подробные обзоры в текстовом и видео форматах. Может, получится сыграть в каком-нибудь новогоднем турнире уже в начале года? И создать "жемчужину шахматного искусства"? Это было бы неплохо. Но торопиться не буду. Если не получится в ближайшие новогодние каникулы, то займусь шахматной игрой весной или летом. Как будет время и настроение.
Интересно было бы связаться с какой-нибудь шахматной стримершей и провести небольшой тематический шахматный матч. Примерно партий из десяти с контролем 5+0 или около того. Потом можно будет сделать обзор наиболее интересной партии, возможно, это будет интересно и поучительно.
Ранее я уже написал "Учебник шахматной игры для новичков". Он предназначен для тех, кто совсем не умеет играть в шахматы, но хотел бы научиться. Теперь у меня появилась идея сделать учебник шахмат для тех, кто уже умеет играть. Это будет учебник нового типа, его главной задачей будет сделать обучающегося умнее в общем смысле, а не только в плане улучшения навыков шахматной игры как таковой.
*** Компьютерные технологии ***
Я уже сделал ранее пару небольших бесплатных курсов для новичков: "Электронные таблицы Excel" и "Редактор текстов Word". Есть также небольшой урок для новичков с практическими примерами на JS.
В новом 2025 году планирую написать серьезный учебник для JS с отображением текущих современных реалий и попыткой предсказать, что ждет этот самый популярный язык программирования в будущем.
Что же касается серверных технологий, то планирую глубоко разобрать какой-нибудь популярный фреймворк на PHP с архитектурным шаблоном MVC (Model-View-Controller, Модель-Представление-Контроллер). Вероятно, это будет Laravel или Yii2. Хочу сделать эту новую книгу так, чтобы новичку было интересно погружаться в эту тему.
*** Дистанционная работа ***
Вообще, мой девиз для творчества будет такой: "больше произведений полезных, меньше развлекательных". Конечно, в идеале хотелось бы как-то совмещать пользу и развлечение, но, увы, во многих случаях это неподъемная задача.
Планирую написать несколько статей или книг с отображением текущих реалий взаимодействия работодателя и человека, ищущего работу. Конечно, тут под "работой" в основном следует понимать банальную прикладную разработку (программирование). Что испытал на себе, о том и буду вас информировать. Но я постараюсь также сделать некоторые общие выводы для всех профессий методом индукции (от частных случаев к общим выводам).
Думаю, что информация в этих статьях или книгах будет полезна для широкого круга читателей, слушателей, зрителей.
*** Мошенничество ***
О мошенниках я немного писал ранее, вы можете прочитать или перечитать такие опусы: "Мошенники: вчера, сегодня, завтра", "Развод скотины (новогодняя спектакля)", "Финансовый Централ".
В новом 2025 году тема также будет актуальной. Мошенники очень хитрые и коварные, все время придумывают новые схемы обмана. Обращаю внимание на пересечение тем "Дистанционная работа" и "Мошенничество". Одним из важных признаков, что "работодатель" является мошенником - отсутствие профессиональных требований к соискателю. Один из вариантов такой "работы" - работа дроппером. Схема простая. На банковскую карту нового работника поступают денежные средства из разных источников. Обычно, это обманутые физические лица. Далее "работник" перечисляет деньги "работодателю", часто через криптовалюту. Процент от таких операций и будет "заработной платой" нового доверчивого "сотрудника".
Осторожно! Это чистая уголовщина и откровенная подстава!
Ищите работодателей только по рекомендациям надежных знакомых или на солидных порталах поиска работы. Солидные порталы не работают с явным криминалом.
*** Фантастика спринт ***
Я люблю писать в стиле "фантастика на коротком поводке". Смысл такой. В журналистском стиле подробно описываются события, которые произойдут в ближайшем будущем (через месяц, год или два). Потом, когда подходит назначенный срок, интересно сравнить, насколько точно удались предсказания.
Вспоминаются такие истории.
"Русский разведчик в Киеве". События происходят летом 2023 года, а их подробное изложение сделано заранее, весной 2023 года.
"Внедряем робота президентом США 2024". Президента по факту выбрали в конце 2024 года. Но я весь процесс описал заранее, в начале 2024 года.
Планирую в таком стиле написать еще 1 или 2 опуса.
*** Человек или робот? ***
Проблема, которая "заострится" в ближайшем будущем, актуальна уже сегодня. Как отличить человека от робота? Например, вот этот текст, кто написал? Человек? А может нейросеть по запросу типа "Творческие планы писателя на 2025 год"?
Но это ладно. Как бы там не было, авторские права полностью мои. А представим себе ближайшее будущее, когда по городу шляются клоны людей, ПАКи (Программно-Аппаратные Комплексы). На вид этих клонов отличить от людей невозможно. У них живая мимика, они уверенно передвигаются пешком и управляют автомобилем. Они умеют логично и естественно отвечать на вопросы, а также вполне уместно эти вопросы задавать. Самые хитрые из них каким-то образом обзавелись человеческими паспортами. Проблему осложняет то, что некоторые клоны искренне считают себя людьми. А некоторые люди сошли с ума и считают себя роботами.
Единственное отличие человека от робота заключается в том, что у человека есть душа. А у робота ее нет. Но как определить, есть у конкретной сущности душа или нет? Хороший вопрос! И у меня есть на него четкий и однозначный ответ. Никак!
Интересное произведение по этой теме : "Год 2124. Убитый обвиняет". Тут фантастика на стайерскую дистанцию. Дано описание событий, которые произойдут через сто лет 22.07.2124, а описание сделано 22.07.2024. Чтобы узнать, насколько точно эти события описаны, осталось подождать девяносто девять с половиной лет.
*** Василий Пак и Ян Янов ***
Есть у меня парочка брендовых героев.
Василий Иванович Пак - этот тип живет уже сегодня. Шахматный бот в человеческой шкуре. Вполне нормально функционирует в автономном режиме, не вызывая особых подозрений у людей с которыми сталкивается. Себя называет иронически "нейросеть на двух ногах". Участник проектов "Первенство ветеранов России по шахматам" и "выборы президента США 2024". Практически не отличим от настоящего человека. Можно даже сказать, что он похож на настоящего человека больше, чем настоящий человек. Ибо, очень хитер и умеет мимикрировать во всех смыслах.
Ян Янович Янов - "космический волк", абсолютный рекордсмен по количеству дальних путешествий и по намотанным световым годам. В настоящее время пока еще не родился. С нетерпением ждем. В четверг 10.06.2224 года в музее "Космической Славы" будет лично проводить экскурсию и рассказывать о своих космических подвигах. Приходите, если будет время и желание. Будет интересно.
По обеим персонам планирую в 2025 году накатать по одной новой истории.
*** Соблазнение "бояркой" ***
Успешные в коммерческом плане писатели искренне советуют мне не заниматься всякой фигней, которую я описал выше, а заняться настоящим, серьезным делом, а именно, написать "боярку".
Что это такое? Я сам толком не знаю, а из прочитанных мною текстов, я понимаю так, что это такой модный литературный жанр. Действие происходит обычно в России (но не обязательно), при феодальном режиме (вероятно). Главный герой обладает волшебными свойствами (вот это обязательно), является хамом и циником, беспощадно убивая врагов разными способами. Но в душе он является добрейшим человеком, спасая по ходу произведения множество котиков и женщин.
Почему бы не попробовать?
На пробу я накатал несколько строк вот в таком духе.
- Кто такой и чьих будешь?
- Я - слуга князя Святослава, у меня послание для тебя, - ответил всадник и протянул кагану берестяную грамоту.
Каган быстро прочитал короткий текст: "Дорогой мой милый еврейский друг, каган лучшего в мире Хазарского каганата. Иду на Вы! С наилучшими пожеланиями, искренне Ваш князь Святослав". Каган раздраженно бросил грамоту в огонь и задумчиво молвил:
- Твой князь с катушек съехал. Ему пора обратиться к психотерапевту. Сколько он таких грамот послал в этом году?
- Эта десятая! - гордо заявил посланник, - статистика хорошая. Девять побед и ни одного поражения!
- А какая статистика по почтальонам? - поинтересовался каган.
- Тут сложнее, - грустно вздохнул посланник, - повесили троих, троих утопили. Двоих женили на своих женщинах. И только одному удалось спастись. Отпустили его. Пожалели. Кстати, это был я. Теперь дрожу и надеюсь, может, опять повезет?
- Увы! Не могу тебя обнадежить, - развел руками каган, - снаряд два раза в одну воронку не попадает.
Ну и далее все в таком духе.
Вам понравилось? Сообщайте. Если вам понравился этот кусок, то накатаю на пробу полное произведение килобайт на двести или даже на триста.
Но все эти "боярки", "псевдо-боярки", пародии на "боярки" по остаточному принципу. Если вдруг в голову ударит изнутри какое-нибудь вещество или снаружи на голову упадет какой-нибудь кирпич. Короче, по ситуации.
Вот и все мои творческие планы на 2025 год.
А у вас какие планы? Сообщайте, очень любопытно узнать.
...
Первоисточник:
===
Источники, упомянутые в произведении и ссылки по теме:
История 00088. "Новогоднее чудо 2025"
Шахматы, учебник шахматной игры для новичков.
Microsoft Excel. Майкрософт Эксель. Курс для новичков.
Microsoft Word. Майкрософт Ворд. Курс для новичков.
Маленькие локальные программы на JS, серия 1
История 00076. "Мошенники: вчера, сегодня, завтра"
История 00039. "Развод скотины (новогодняя спектакля)"
История 00049. "Финансовый Централ"
История 00004. "Русский разведчик в Киеве"
История 00002/005. "Внедряем робота президентом США 2024"
История 00024. "Год 2124. Убитый обвиняет"
История 00002. "Василий Иванович Пак"
История 00058. "Космический поход Яна Янова 001. Планета Бегемотов"
===
Удивительно, сколько людей по ходу обучения программированию упускают эту важную, но очень даже простую тему, и очень удивляются потом, когда натыкаются на флаги то тут, то там, пока не разберутся
Флагом называется переменная(или свойство/поле объекта), которая хранит данные логического (True/False) либо 1/0. Собственно, в математической логике как раз и обозначается истина числом 1, ложь числом 0.
Очень просто запомнить, почему такой вид переменных называется именно так — у флага на флагштоке ведь два состояние: поднят/опущен. Так и здесь. Хотя мне больше нравится думать о таких переменных, как о выключателях: две позиции — «вкл» или «выкл». Или о лампочках-индикаторах — горит или не горит. Иногда — о рычагах, у которых тоже два положения, или кнопках, которая при одном нажатии уходит вглубь корпуса, а при втором выходит обратно.
Как я выше написал, можно представлять переменные-флаги в виде индикаторов. Если код большой и в нём приходится управлять кучей разных объектов, важно уметь в любой момент посмотреть состояние того или иного объекта.
Флаг может показывать, можно или нельзя выполнять какое-то действие, например, открыть дверь(электронный запрограммированный замок, состояние заперт/не заперт).
Флаг может показать, включено или выключено какое-либо устройство, например, двигатель, робот-пылесос, опасный автоматический станок, автополив, охранная система.
Флаг может сигнализировать об опасности или проблеме — как лампочка(обычно красного цвета) может сигнализировать о какой-нибудь поломке в машине, нехватке топлива, о разгерметизации салона самолёта, о повышенном количестве газа рядом с газовой плитой и т.д.
Очень просто, такие переменные легко заметны, когда они стоят одиноко в условии справа от if — никакого оператора сравнения или чего-то ещё, просто переменная или поле объекта и всё. Часто это значит, что переменная или поле хранят именно True/False или 1/0.
Ну и, само собой, вы заметите, если в коде написано что-то вроде
is_in_black_list = True;
то есть присваивание переменной значения True/False или 1/0.
Вот такая вот простая по идее тема, которую многие при обучении пропускают и изучают уже самостоятельно — флаги в программировании.
Как известно,
для программирования было придумано много языков высокого уровня (ЯВУ, не путать с Java😏). Но есть ЯВУ,
созданный специально для обучения программированию.
Это Pascal (Паскаль). "Потомком" стал Delphi или, грубо говоря, визуальный Pascal.
Я уже писал, что изучал Бейсик в школьное время https://vombat.su/post/42636-ya-napisal-svoi-fotoshop
. А вот Паскаль изучал уже в студенческие, безответственные, годы.
Turbo Pascal по книгам Фроловых (вроде правильно фамилию помню).
Далее,
жизнь позволила начать работать и, первым делом, начал искать
бесплатную альтернативу Borland Delphi для рабочих целей. Попался
Lazarus IDE со своей версией Pascal, которая ничем не уступала
официальной.
Наклепал несколько прог в нём. И до сих пор тягаю этот легаси. Просто лень переписать на что-то более стоящее. Работает и ладно. Даже глюков и багов не замечено. Мне нраиться. 😎😊

Сегодня в 14.00 по московскому времени проведу стрим с Артёмом Яшиным (канал Onigiri). Поговорим про искусственный интеллект. Присоединяйтесь!