четверг, 5 февраля 2026 г.

запускаю нейросети локально

 


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

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

  Я бы хотел запустить нейросеть локально на своем ПК. у меня стоит на нем 2 системы windows 10 и ubuntu, предпочтительнее виндовз. Карта на ноуте 1650. хотелось бы узнать какие неросети LLM можно запустить чтобы работало быстро и хорошо

И она посоветовала то что мне нужно, я удивлен. Это нейросеть Zai - китайская и работает бесплатно. Я чаще пользуюсь qwen - но там у меня уже слишком много контекста в соседних чатах, думаю он опять поведет по ложному следу. В общем я дошел своими силами и теперь при помощи Zai до того что нужно использовать LM Studio - в ней автоматически предлагаются доступные модели которые будут работать хорошо, и в моем случае нейронка правильно ответила что для 4гб памяти лучше выбирать 4b - 4 млрд параметров. Но начну по порядку как я дошел до этого

Изначально так как я хотел скормить журналы с работы нейросети, она предложила использовать Питон и кучу разных библиотек, в питоне почему-то пошла по принципу компилирования библиотек для llamacpp - была куча ошибок, пришлось выкачивать гигабайты всякой хрени просто чтобы запустиьт нейронку. Потом я плюнул и спросил что-то проще, она посоветовала опять не LMstudio а ollama - по сути тоже норм, но там формат скаченной нейронки не gguf - сложнее перенести с машины на машину. В общем по итогу пришел к LM studio. Можно еще кстати довольно просто и главно это даже занимает меньше места и ресурсов запустить llamacpp из скомпилированных exeшников - качать последний релиз (vulkan) - и запускать gguf файл из cmd:

 llama-server -m "C:\путь до нейронки\Qwen3-4B-Instruct-2507-Q4_K_M.gguf" --jinja -c 4096 --host 0.0.0.0 --port 8080 --flash-attn on --kv-offload

 запускается вебсервер и по адресу 127.0.0.1:8080 - откроется чат с нейронкой. Я протестировал на своей системе vulkan, cuda12, cuda13, cpu - лучше всего вулкан, около 10токенов в секунду, отальные 5-7 - это довольно медленно. Возможно я не правильные флаги добавляю, позаимствовал их у одного знакомого. Надо проверить другие. 

Однако, я нестировал и LM studio, и ровно эта же модель выдавала уже 30-39 токенов в секунду (почему второй раз быстрее еще не понял) - это уже очень хороший результат - довольно быстро. На малых моделах 1,7b - скорость на моей карте была до 99т/с - это прям супер шустро, но получалась фигня - вот таблица тестов которые я проводил, у всех один запрос:

 мне нужна веб страница на html, css и js которую можно сохранить одним файлом index.html и открыть его в браузере. Приложение содержит три поля для ввода чисел и должно автоматически вычислять пропорцию: результат = (число3 * число2) / число1 сами поля распологаются в виде таблицы из двух строк и двух столбцов:
число1 - число2
число3 - результат

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


 UPD: в общем выяснилось что нужно запускать llamacpp с другими флагами, и тогда она дает те же 40 токенов, а то и больше. поэтому очень важно обратить на это внимание, но это лишь еще раз доказывает мое предположение, что для новичка без заморочек лучше LMstudio - это и запуск без заморочек, это и предложенные модели для вашей системы, кроме того чат в браузере тоже доступен, нужно в настройках сервера включить CORS - это важно. 

И да флаги для зупасука llama на моей машине выглядят так:

 llama-server -m C:\model\Qwen3-4B-Instruct-2507-Q4_K_M.gguf -ngl 99 -c 4096 --host 0.0.0.0 --port 8080

UPD2: добавил прикол в начале - классика жанра: могу печатать 1000 символов в минуту, но такая хрень получается. Не ожидал что нейронка может выдавать такой отборный бред. Это модель GLM4.7-Distill-LFM2.5-1.2B.i1-Q6_K - пожалуй для супер малых моделей нужно добавить свой тест -  но тот же lfm 2.5 в моем тесте выдал не супер ужасный результат - эта конечно никуда не годится

UPD3: конечно нужно выбирать правильные можели под свои задачи. пока что лучше всего qwen3, думаю покачаю еще пару штук и потестирую, потом потестирую в уюунту, скажу результат, предположительно скорость должна быть выше. 

понедельник, 2 февраля 2026 г.

Пробую разбираться в Множестве Мандельброта

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



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

Кто такой Мандельброт и зачем ему фракталы

Бенуа Мандельброт — польско-французский математик, который в 1970-х годах буквально изобрёл слово «фрактал». До него подобные структуры считались «монстрами» математики — слишком сложными, чтобы быть полезными. Но Мандельброт увидел в них порядок: береговые линии, облака, ветвление деревьев — всё это нельзя описать прямыми и окружностями, но можно приблизить фрактальной геометрией. Множество, названное его именем, стало визитной карточкой этой идеи — не потому что «красивое», а потому что показывает: хаос и порядок живут рядом.
Практическая польза? Не в том, чтобы рисовать обои для рабочего стола. Фрактальный анализ сегодня применяется в сжатии изображений, моделировании антенн, изучении турбулентности и даже в финансовой математике — там, где классические модели ломаются о сложность реального мира.
Ну все это лирика, важно то что это тупо математика - есть формула, которая закрашивает пиксели определенным цветом в зависимости от условий, упрощенно если кол-во итераций больше заданной то ярким, если меньше то менее ярким. Вот еще нейронка описала эту формулу для меня:

Множество Мандельброта — кратко

Множество Мандельброта — это набор комплексных чисел c, для которых последовательность, заданная формулой zₙ₊₁ = zₙ² + c при z₀ = 0, не уходит в бесконечность. На практике мы проверяем, не превысит ли модуль |zₙ| значение 2 за фиксированное число шагов.

Как строится изображение

Для каждого пикселя с целочисленными координатами (x, y), где 0 ≤ x < W и 0 ≤ y < H, вычисляется комплексное число:

c = cre + cim·i

где:

  • Вещественная часть:
    cre = 1.5 · (x − W/2) / (0.5 · zoom · W) + moveX
  • Мнимая часть:
    cim = (y − H/2) / (0.5 · zoom · H) + moveY

Затем выполняется итерационный процесс:
z₀ = 0 + 0·i
zₙ₊₁ = zₙ² + c

Итерации продолжаются, пока не выполнится одно из условий:

  • Модуль zₙ превысит 2;
  • Достигнуто максимальное число итераций MAX_ITER.

Модуль комплексного числа z = a + b·i вычисляется как:
|z| = √(a² + b²)
Пример: для z = -2 − i → |z| = √(4 + 1) = √5 ≈ 2.236.

Цвет определяется числом итераций n:
hue = (n % 256) × 360 / 256 → используется в hsl(hue, 100%, 50%).

Цветовой круг HSV: 0°=красный, 60°=жёлтый, 120°=зелёный, 180°=голубой, 240°=синий, 300°=фиолетовый.

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

https://boolkin.github.io/html/Vibe/mand+zhu.html - красивые генерации

https://boolkin.github.io/html/Vibe/mand-pix.html - попиксельный расчет

воскресенье, 14 сентября 2025 г.

Смена программы на табло BX-05 через WinCC

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

Имеется светодиодное табло, Onbon BX-05 - куда можно вывести любой текст, время, температуру. У табло есть свой вайфай, подключившись к которому в него можно заливать программы (экраны) через специально приложение на Андроид. Несколько лет назад я нарыл сайт и API на JAVA для этого табло, но тогда не разобрался сразу что экраны можно менять просто переключая программы, а не каждый раз записывая экран в EEPROM. Причем там написано что циклы записи в EEPROM ограничены (как и в любом другом оборудовании), а в моем случае переключение экрана предполагалось каждые 5 минут 24/7, то есть в таком темпе EEPROM сдох бы уже через год. Но в этот раз я целенаправленно искал такую опцию чтобы налету менять экран (программу) и нашел. На странице с документацией (JAVA - ONBON Docs (onbonbx.com)) есть такая строка

// 锁定指定节目 screen.lockProgram(programId, lockDuration); // 解除节目锁定 screen.unlockProgram(programId);

У меня уже были наработки в прошлый раз, я научился компилировать Java и запускать тестовый скрипт из командной строки, и добавив в него строку screen.lockProgram(1,0); научился включать в данном случае первую программу (пример onbon_bx05/SimpleCommand.java). Чтобы запустить Java программу нужно запустить команду 

java -cp lib/*;bin SimpleCommand

при этом в каталоге bin должны быть заранее скомпилированные классы. Компилил я их командой

javac -source 8 -target 8 -encoding UTF-8 -cp lib/* -d bin p1.java

мне было необходимо компилировать в 8 версию java для поддержки 32 битной винды. 

Интереснее то как запустить потом все это через WinCC. Как я и говорил ранее, можно было легко нагуглить и даже спросить у нейросети как создать vbs скрипт для переключения экрана, но почему-то он не пошел на WinCC сразу хотя из файла vbs переключение работало. А все дело в том что я забыл объявить переменные в самом начале через ключевое словоDim - виндовый интерпретатор игнорировал это и сам объявлял, а вот Винсисишный не захотел. И я потратил очень много времени чтобы запускать скрипты через C-action и внешние проги. И в итоге это не работало так как было нужно мне, а нужно было чтобы переключение происходило незаметно, без открытия окна консоли. Но в итоге все решилось довольно просто - исправил ошибку с объявлением переменных, и узнал что java может запускаться в скрытом режиме через команду javaw. 

В итоге создал такой глобальный скрипт:

Option Explicit
Function action
    Dim testprohod
    Set testprohod = HMIRuntime.Tags("testprohod")
    Dim WshShell,cmd
    Set WshShell = CreateObject("WScript.Shell")
    cmd = "javaw -cp ""C:\bx\bin;C:\bx\lib\*"" p"&testprohod.Read
    WshShell.Run cmd, 1
End Function

Этот скрипт запускает по триггеру - изменение тега testprohod - число от 1 до 5, например. Соответственно подготавливаются заранее java классы с названием p1, p2, p..., и кладутся в папку C:\bx\bin. Еще с чтением тега были проблемы -я забыл Read - без этого значение не читалось. Добавил Reafd и все заработало: теперь при каждом изменении тега меняется программа на табло, соответствующая тому номеру число которое есть в теге. Стрелочкой на скрине показана кнопка для выбора тега, при этом автоматом добавляется объявление и функция присваивание объекта тегу, значение которого потом считывается всторенной функцией Read


 Вот такой получился кейс - в нем и то как надо писать скрипты на WinCC и как добавилять абсолютные пути для java и vbs и как запускать триггеры. Сейчас переключение экранов бесшовное и незаметно пользователю

Кстати совсем забыл что что нейросеть посоветовала в конце использовать конструкцию 
Set WshShell = Nothing
чтобы освободить объект. 

вторник, 12 августа 2025 г.

Вайб кодинг

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

нужно разработать игру mastermind для удобного игрового процесса на мобильном устройстве. нужно сделать 6 развноцветных кругов которые будут добавляться в игровую зону просто по клику на круге, заполняя игровую зону последовательно друг за другом, что означает что если щелкнул например красный круг первым, то он встает в угадываемую последовательность на первое место. 6 разноцветных кругов расположить в 2 строки по 3 в ряд. В верхней строке в правой части должна быть кнопка проверить, во второй строке кнопка убрать, чтобы убрать последний добавленный кружок. Внизу страницы кнопка новая игра и помощь с инструкцией к игре. Угадываемые последовательности цветов в игровой зоне нужно заполнять сверху вниз в игровой зоне, это означает что последняя угадываемая последовательность цветов должна находиться всегда внизу, прикреплена к нижнему краю игрового поля. Попытки пронумеровать и расположить так чтобы первая была вверху, последняя внизу. Нужно добавить полосу прокрутки в игровом поле чтобы можно было прокрутить до первой попытки. при победе выдавать сообщение с количеством попыток и просмотром правильной комбинации Нужно использовать только javascript html и css - все в одном файле чтобы запустить локально

Чтобы понимали о чем речь вот 2 проекта, мой и нейросетевой: визуально видно разницу хорошо, + добавлены еще и уровни сложности, а все сообщения выводятся в модальном окне. работал кстати в нейросети от алибабы - Qwen. 

На этой игре пытался тестить другие нейросети, должен сказать что они может и чуток получше, вероятно запросов придется сделать меньше чтобы получить нужный вариант, хотелось бы максимально приближенный к тому что получилос у меня в первый раз при помощи нейросети (за несколько часов и с десятка 2 уточнений) - расположение кнопок, цветовая схема, функционал как задумано. Допустим Lovable - там есть несколько запросов в день бесплатных и по такому запросу, с 4-мя уточнениями удалось воссоздать играбельную игру с нормальным визуалом. Qwen с таким же запросом в итоге все же не справился за даже 6 уточнений, но можно так пытать до бесконечности, поэтому пофиг. Хотя и не совсем - иногда нейросети тупо не понимают что ты видишь и не могут это починить. Я так пытался исправить некруглые кнопки, и хрен бы их исправил, потому что как и положено в css задан стиль для кнопки круглый, но Хром подставляет свой стиль, поэтому пришлось конкретно просить заменить кнопки на элемент div.

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

Ну и да ссылка на проекты от нейросети: https://github.com/boolkin/html


пятница, 30 мая 2025 г.

WinCC ошибка SQL

Как-то раз у нас на работе пропало питание и отключился комп, с запущенной на нем WinCC. После запуска компа WinCC отказалось запускать проект, ссылаясь на ошибку: «SQL сервер не может получить доступ к базе данных». После долгих мытарств пришло понимание что похерилась база данных самой WinCC, которая создается при ее установке. Находится такая она по пути C:\Program Files\Microsoft SQL Server\MSSQL10_50.WINCC\MSSQL\DATA и там лежит несколько файлов. Мы просто взяли такие же файлы с другой работающей WinCC такой же версии и заменили их на те что были повреждены, тупо все скопом. На всякий случай решил сохранить эти файлы на будущее, вдруг такая ситуация когда-нибудь повторится у нас или у кого еще.  Версия WinCC в данном случае была 7.2.0.2

Архив с файлами в папке DATA

четверг, 6 марта 2025 г.

Управление умной лампой с помощью виджетов Android

Я как-то писал статью статью о том, как сделал приложение для управления умной лампой через яндекс алису https://boolkin.blogspot.com/2023/09/Yandex-station-android-apk.html

Проблема этого способа в том, что коды пропысываются жестко и если что-то поменяется (срок действия уодов которые генерировал яндекс для меня составлял один год) то придется заново пересобирать приложение и мало того для того чтобы включить или выключить лампу надо сначала запустить свое приложение и уже потом нажимать нужную кнопку. Именно поэтому пришла идея отказаться от своего приложения и воспользоваться сторонними разработками - виджеты с http запросами. Конкретно речь идет о приложении в моем случае Ярлыки HTTP запросовЯрлыки HTTP запросов 

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




Пишу со смарта, поэтому оформление немного храмает, но я думаю примерно понятно. Добавляется ярлык, добавляется http post запрос на адрес api.iot, в заголовок добавляется авторизация, а сам запрос делается как json:

{
  "devices": [
    {
      "id": "",
      "actions": [
        {
          "type": "devices.capabilities.on_off",
          "state": {
            "instance": "on",
            "value": true
          }
        }
      ]
    }
  ]
}
Естественно id должно быть айди вашей лампы, а авторизация та что даст яндекс.

Если включить то value true, а если лампу выключить то value false

воскресенье, 19 января 2025 г.

Статистика википедии

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

Статистика находится по этому адресу Можно прокрутить статистику по месяцам начиная с 2018 года, и посмотреть как менялась активность украинцев в российской википедии, для чего был написан простейший скрипт. Фишка в том что эти данные по редакторам можно смотреть и в табличном виде, для чего нужно нажать на кнопку "глобуса" над картой справа. После формирования таблицы все числа с редакторами будут отсортированы по правой стороне и это поможет выделить нужные цифры. Сам скрипт такой:

tds = document.getElementsByTagName("td");
total = 0;
numb = 0;

for (let i=0;i<tds.length;i++) {
    if (tds[i].className =="right aligned") {
    total = total +parseInt(tds[i].innerHTML);
    numb++;
    }
}
x = parseInt(tds[0].innerHTML);
proc = x *100 / total;
console.log(total +" из " + numb + " стран; УКР=" + Math.round(proc) + "%");

И вот результат сравнений по годам для правок от 100 штук:

янв 2018: 380 из 29 стран; УКР=18% 

дек 2018: 350 из 27 стран; УКР=20%

дек 2019: 360 из 29 стран; УКР=17% 

дек 2020: 340 из 25 стран; УКР=21%

дек 2021: 370 из 30 стран; УКР=19% 

дек 2022: 320 из 27 стран; УКР=16%

дек 2023: 390 из 31 стран; УКР=13%

дек 2024: 400 из 34 стран; УКР=10%

Вот по годам для правок до 99 штук:

янв 2018: 1760 из 60 стран; УКР=36%

дек 2018: 1640 из 60 стран; УКР=34%

дек 2019: 1510 из 54 стран; УКР=36%

дек 2020: 1730 из 60 стран; УКР=35%

дек 2021: 1570 из 53 стран; УКР=36%

дек 2022: 1650 из 57 стран; УКР=24%

дек 2023: 1510 из 60 стран; УКР=24%

дек 2024: 1510 из 56 стран; УКР=24% 

Как видно активность снижается, что не может не радовать)