Сообщество - Программирование на python

Программирование на python

929 постов 11 940 подписчиков

Популярные теги в сообществе:

15

Инструкция по сборке домашней оффлайн нейросети (экспертной системы) с возможностью обучения

Итак, вы прочитали мой пост: Глаза боятся, а руки из.. плеч :) и поняли - "я тоже такое хочу". И тут я с вами совершенно согласен :) Приступим!

Часть 1. Системные требования и подготовка к сборке.

Системные требования:

  • ОС: Windows 10/11 (x64)

  • Python: 3.12.0 (точный номер версии!)

  • Видеокарта: NVIDIA с драйвером ≥ 535 и CUDA Toolkit 12.6

  • RAM: ≥ 8 ГБ

  • VRAM: ≥ 6 ГБ (для загрузки 32 слоёв на GPU)

Важно:

  • если у вас не видеокарта Nvidia, то смысла читать дальше нет! На других видеокартах эта программа работать не будет!

  • программы нужно ставить точно такой же версии (!), как я указал. Разработчики часто меняют список поддерживаемых команд от версии к версии, у меня указаны версии, которые подобраны методом перебора на максимальную совместимость!

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

  • данная программа тестировалась и работает на Windows 10 (64-bit), работать должна и на Windows 11 (64-bit). Остальные версии не проверял!

Список необходимых программ для работы:

  • Скачайте и установите Python 3.12.0 (64-bit) (на 32-bit не тестировалось, потому что я счастливый владелец системы 64-bit)

    ОБЯЗАТЕЛЬНО поставьте галочку "Add Python to PATH" во время установки!

  • Скачайте и установите CUDA Toolkit 12.6

    Галочка "Add to PATH" обычно по умолчанию включена, но необходимо в этом убедиться и поставить, если нужно.

  • Скачайте и установите Visual Studio 2022 Build Tools (с C++ и CMake)

    При установке Visual Studio 2022 выберите в меню "Разработка классических программ на C++" и справа в окошечке обязательно проставьте галочки напротив:

    • C++ CMake tools for Windows

    • C++ MSVC 143 (Visual Studio 2022)

    • Windows 10/11 SDK (в зависимости от вашей установленной системы)

  • Скачайте и установите Cmake 4.2.0 for Windows-x86-64

После того, как всё скачали и установили, открываем CMD (Command Prompt) и проверяем установленные версии необходимых компонентов (копируем команду и вставляем её, жмём Enter для выполнения).

1. Python 3.12.0 (64-bit)

python --version

Должно быть: Python 3.12.0

python -c "import platform; print(platform.architecture())"

Должно быть: ('64bit', 'WindowsPE')


2. CUDA Toolkit 12.6

nvcc --version

→ В выводе ищите строку вроде: release 12.6, V12.6.85


3. CMake 4.2.0

cmake --version

Должно быть: cmake version 4.2.0

4. Дополнительно: проверка GPU и драйвера

nvidia-smi

Покажет версию драйвера и список GPU. Важно! Драйвер должен быть ≥ 535.xx для корректной работы CUDA 12.6. Если у вас версия ниже требуемой, обновите драйвера видеокарты.

Если после всех проверок у вас всё так же, как и у меня - база для сборки готова.

Часть 2. Формируем структуру программы.

Создаём папку на диске С:\ с названием car_expert и формируем внутри следующую структуру файлов и папок:

Папка knowledge_base

Папка models

Файл app.py

Файл requirements.txt

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

Часть 3. Скачиваем необходимые установочные пакеты и языковую модель.

Открываем в режиме редактирования файл requirements.txt в Блокноте. Копируем в него и сохраняем следующий текст в кодировке UTF-8 (обычно стоит по умолчанию):

aiofiles==23.2.1

annotated-doc==0.0.4

annotated-types==0.7.0

anyio==4.12.0

certifi==2025.11.12

charset-normalizer==3.4.4

click==8.3.1

colorama==0.4.6

contourpy==1.3.3

cycler==0.12.1

diskcache==5.6.3

fastapi==0.124.0

ffmpy==1.0.0

filelock==3.20.0

fonttools==4.61.0

fsspec==2025.12.0

gradio==4.44.1

gradio_client==1.3.0

h11==0.16.0

hf-xet==1.2.0

httpcore==1.0.9

httpx==0.28.1

huggingface-hub==0.26.5

idna==3.11

importlib_resources==6.5.2

Jinja2==3.1.6

kiwisolver==1.4.9

llama_cpp_python==0.3.16

markdown-it-py==4.0.0

MarkupSafe==2.1.5

matplotlib==3.10.7

mdurl==0.1.2

numpy==1.26.4

orjson==3.11.5

packaging==25.0

pandas==2.3.3

pillow==10.4.0

pydantic==2.12.5

pydantic_core==2.41.5

pydub==0.25.1

Pygments==2.19.2

pyparsing==3.2.5

python-dateutil==2.9.0.post0

python-multipart==0.0.20

pytz==2025.2

PyYAML==6.0.3

requests==2.32.5

rich==14.2.0

ruff==0.14.8

semantic-version==2.10.0

shellingham==1.5.4

six==1.17.0

starlette==0.50.0

tomlkit==0.12.0

tqdm==4.67.1

typer==0.20.0

typer-slim==0.20.0

typing-inspection==0.4.2

typing_extensions==4.15.0

tzdata==2025.2

urllib3==2.6.1

uvicorn==0.38.0

websockets==12.0

Это список всех пакетов, которые нужны для корректной работы нашей программы. Обратите внимание на символы == в каждом пакете, это означает "найти и скачать именно этот номер версии". Это важно! Другие версии этих пакетов будут конфликтовать между собой, потому что список внутренних команд может отличаться от версии к версии. Данный список - стабильная сборка, которая прекрасно взаимодействует между собой.

После того, как мы скопировали этот список в файл requirements.txt, открываем консоль CMD и вводим следующие команды по очереди:

cd C:\car_expert

python -m venv venv_gpu_fresh

venv_gpu_fresh\Scripts\activate

pip install -r requirements.txt

Смысл команд:

  1. cd C:\car_expert

    Переходим к папке C:\car_expert

  2. python -m venv venv_gpu_fresh

    Создаём виртуальное окружение и папку venv_gpu_fresh в корневой папке car_expert.

  3. venv_gpu_fresh\Scripts\activate

    Активируем локальную версию Python для нашей папки venv_gpu_fresh.

  4. pip install -r requirements.txt

    Начинаем установку пакетов из файла requirements.txt

Зачем мы создаём виртуальное окружение? Для того, что бы Python, установленный в нашей системе работал только с теми пакетами, которые нужны для нашей программы. И что бы любые другие пакеты, которые могут установиться в процессе его работы (например, точно такие же, как в нашем файле requirements.txt, но другой версии) никак не влияли на дальнейшую работоспособность нашей программы. Т.е. наша программа всегда будет запускаться в "виртуальной капсуле", на которую больше ничего не будет влиять "извне". Это гарантирует стабильность работы при любых условиях.

Установка пакетов из файла requirements.txt может занять некоторое время, во время этого процесса нельзя закрывать окно консоли CMD.

После того, как процесс установки закончится, скачиваем языковую модель phi-3-mini-4k-instruct.Q4_K_M.gguf. Это "мозг" нашей программы и именно эта модель будет "думать" и находить ответы на ваши вопросы. После скачивания помещаем её в папку models/.

Часть 4. Компилируем (собираем) платформу для работы с языковыми моделями llama-cpp-python.

Это важный этап нашей работы, именно платформа определяет каким способом будет происходить "мыслительный процесс" нашей языковой модели phi-3 : будет она думать медленно CPU (процессором) или быстро GPU (видеокартой). Самое печальное во всём этом, что официальных предсобранных .whl с CUDA для llama-cpp-python на Windows больше не публикуются ни на pypi.nvidia.com, ни в надёжных GitHub-репозиториях. Т.е. просто скачать и установить, как обычный пакет, уже не выйдет. Где-то её нет, а где-то стоят пароли на скачивание (жадины говядины). Но всегда есть возможность локальной сборки. Именно ей мы и займёмся.

Закрываем окно CMD, если оно было у вас до этого открытым, и запускаем заново (делаем сброс сессии).

Опять переходим в активированное виртуальное окружение, по очереди вводя команды:

cd C:\car_expert

venv_gpu_fresh\Scripts\activate

Признаком того, что вы вошли внутрь "виртуального окружения" и работаете в "капсуле", является надпись в скобочках (venv_gpu_fresh) перед C:\car_expert>. Если у вас всё так же как и у меня, продолжаем водить команды:

pip uninstall llama-cpp-python -y

set CMAKE_ARGS=-DLLAMA_CUBLAS=ON

set FORCE_CMAKE=1

pip install llama-cpp-python --no-cache-dir --verbose

Смысл команд:

  1. ip uninstall llama-cpp-python -y

    Удаляем предыдущую версию  llama-cpp-python, у нас её пока вообще нет, но на всякий случай делаем очистку, что бы не было проблем.

  2. set CMAKE_ARGS=-DLLAMA_CUBLAS=ON

    Задаём переменную окружения CMAKE_ARGS в Windows CMD, чтобы передать параметр сборки в CMake при установке пакета llama-cpp-python. Без этого флага llama-cpp-python собирается только для CPU. С этим флагом — включается поддержка GPU (CUDA), и модель сможет использовать видеокарту NVIDIA.

  3. set FORCE_CMAKE=1

    в контексте установки пакета llama-cpp-python означает: «Принудительно запустить сборку через CMake, даже если pip или scikit-build-core считают, что это не нужно» Мы хотим собрать из исходников с поддержкой CUDA (работа именно на видеокарте), но pip может попытаться установить CPU-версию. Поэтому, "действуй строго по инструкции" :)

  4. pip install llama-cpp-python --no-cache-dir --verbose

    Эта команда гарантирует чистую установку: всё будет скачано и собрано заново. Показывает все этапы: загрузку, конфигурацию CMake, компиляцию, ошибки. Без этого флага pip может "молчать" при ошибках сборки или показывать только общее сообщение.

Важно! Процесс сборки займёт 10–25 минут — не прерывайте (не закрывайте окно CMD)!

Если в процессе сборки в окне консоли CMD не появились ошибки, то самую важную и трудоёмкую часть работы мы уже сделали. Если вы дошли до этого этапа и у вас всё получилось, я горжусь вами, вы молодцы! :)

Часть 5. Пишем код программы, которая заставит работать всё что мы сделали.

Открываем в Блокноте файл app.py, копируем этот код и сохраняем:

# app.py — авто-экспертная система БЕЗ векторной БД (только LLM + контекст в промпте)

import os

import glob

from llama_cpp import Llama

import gradio as gr

# === Конфигурация ===

KNOWLEDGE_DIR = "knowledge_base"

MODEL_PATH = "models/phi-3-mini-4k-instruct.Q4_K_M.gguf"

MAX_CONTEXT_LENGTH = 2000 # ограничение на длину контекста (токенов)

# === Загрузка всей базы знаний в строку ===

def load_knowledge_base() -> str:

files = glob.glob(os.path.join(KNOWLEDGE_DIR, "*.txt"))

if not files:

return "Нет доступных инструкций по ремонту."

all_text = []

for file_path in sorted(files):

try:

with open(file_path, "r", encoding="utf-8") as f:

content = f.read().strip()

if content:

header = f"\n\n=== {os.path.basename(file_path).replace('.txt', '').title()} ===\n"

all_text.append(header + content)

except Exception as e:

all_text.append(f"\n\n[Ошибка при загрузке {file_path}: {e}]")

full_context = "".join(all_text)

# Ограничиваем длину, чтобы не превысить контекст модели

if len(full_context) > MAX_CONTEXT_LENGTH:

full_context = full_context[:MAX_CONTEXT_LENGTH] + "\n... (контекст усечён)"

return full_context.strip()

# === Загрузка модели ===

def load_model():

return Llama(

model_path=MODEL_PATH,

n_ctx=4096,

n_threads=os.cpu_count(),

n_gpu_layers=999,

verbose=True # ← ВАЖНО: включите!

)

# === Ответ от модели с контекстом ===

def get_answer(query: str, knowledge: str) -> str:

prompt = f"""<|user|>Ты — опытный автослесарь. Ответь на вопрос, используя ТОЛЬКО информацию из приведённого ниже контекста.

Если в контексте есть несколько причин или пунктов, перечисли их ВСЕ через дефис.

Если в контексте нет ответа, скажи: "Я не знаю".

Контекст:

{knowledge}

Вопрос: {query}<|end|>

<|assistant|>"""

output = llm(

prompt,

max_tokens=128,

temperature=0.3,

top_p=0.9,

repeat_penalty=1.1,

stop=["<|end|>", "<|user|>", "</s>"],

echo=False

)

return output["choices"][0]["text"].strip()

# === Gradio интерфейс ===

def chat_interface(user_query: str) -> str:

knowledge = load_knowledge_base()

return get_answer(user_query, knowledge)

# === Запуск (для Gradio 4.x) ===

if __name__ == "__main__":

llm = load_model()

demo = gr.Interface(

fn=chat_interface,

inputs=gr.Textbox(

lines=2,

placeholder="Например: Почему скрипят тормоза?",

label="🔧 Ваш вопрос по ремонту авто"

),

outputs=gr.Textbox(label="🛠 Ответ автоэксперта", max_lines=20),

title="🚗 Локальная авто-экспертная система",

description="""

<div style='text-align: center; margin: 10px 0;'>

<b>Полностью оффлайн. Работает на GPU.</b><br>

Знания из папки <code>knowledge_base/</code>.

</div>

""",

examples=[

["Почему двигатель троит на холостых?"],

["Что делать, если сел аккумулятор?"],

["Почему АКПП пинается при переключении передач?"],

],

theme=gr.themes.Soft(primary_hue="red").set(

body_background_fill="*neutral_50",

block_background_fill="white",

),

css="footer { display: none !important; }"

)

print("🧠 Модель загружена. Запуск GUI...")

demo.launch(server_name="127.0.0.1", server_port=7860)

Проверяем, что бы в строке

MODEL_PATH = "models/phi-3-mini-4k-instruct.Q4_K_M.gguf"

было записано точное название вашей языковой модели из папки models/. Если название вашего файла отличается, от того что записано в коде файла app.py, то скопируйте ваше и вставьте в эту строку вместо старого. Или, что ещё проще, переименуйте ваш файл phi-3-.....gguf в тот, который указан в коде (на работоспособность это никак не повлияет).

Часть 6. Наполняем базу данных knowledge_base/

Открываем папку knowledge_base/ и создаём в Блокноте несколько пустых файлов:

electrical.txt

engine_issues.txt

transmission.txt

Теперь открываем их в Блокноте и заполняем их примерами:

Для electrical.txt

[Аккумулятор сел]

- Напряжение <12.2 В — разряжен

- Утечка тока в бортовой сети (>50 мА)

- Генератор не заряжает (менее 13.8 В на холостых)

- Окисленные клеммы — зачистите и смажьте

[Фары тускло горят]

- Плохая масса на кузов.

- Низкое напряжение в сети (генератор неисправен)

Для engine_issues.txt

[Двигатель троит на холостом ходу]

- Проверьте свечи зажигания — износ или нагар

- Пробой катушек зажигания

- Подсос воздуха во впускном коллекторе

- Ошибки по OBD2: P0300 (пропуски зажигания)

- Низкая компрессия в цилиндре

Для transmission.txt

[АКПП пинается при переключении]

- Низкий уровень ATF

- Старое или грязное масло — замените

- Износ фрикционов — требуется ремонт

- Неисправность соленоидов или гидроблока

[МКПП скрежет при включении передачи]

- Износ синхронизаторов

- Не выжимается сцепление (воздух в приводе или износ выжимного подшипника)

Это начало вашей лично базы данных. Именно так и будет происходить обучение вашего "Эксперта".

База может быть любого содержания, но важно соблюдать следующие правила:

  1. Формат файлов

    - Только текстовые файлы с расширением .txt

    - Кодировка: UTF-8 (чтобы поддерживались кириллица и спецсимволы)

    - Имя файла — описательное, без пробелов и спецсимволов (лучше: engine_misfire.txt, а не новый файл (1).txt)

  2. Ограничение по объёму

    Общий объём всех файлов — не более 2000–2500 символов (примерно 400–500 токенов)

    Почему? Потому что:

    - Phi-3-mini имеет контекст 4096 токенов

    • Из них:

      • ~300 токенов — системный промпт

      • ~100 токенов — вопрос пользователя

      • ~500–700 токенов — ответ модели

    • Остаётся ~2500–3000 токенов на контекст, но лучше играть на опережение и оставить запас

    Если база растёт — разделите её на тематические подсистемы (engine/, brakes/) и запускайте отдельные экземпляры.

  3. Структура содержимого

    Заголовки в квадратных скобках или через ===:

    [ТРОИТ ДВИГАТЕЛЬ НА ХОЛОСТЫХ]

    Маркированные списки:

    - Изношенные свечи зажигания

    - Засорённые форсунки

    - Подсос воздуха

    - Изношенные свечи зажигания

    Ключевые слова: совпадают с примерами вопросов

    Ключевые слова в начале (для совпадения с вопросом):

    «Скрип тормозов», «Ошибка P0300», «АКПП пинается»

  4. Нет "воды", только факты

    Избегайте:

    - Длинных абзацев

    - Вводных фраз: «Как известно…», «Следует отметить, что…»

    - Повторов и «воды»

    - Сложных предложений

  5. Точность и достоверность

    Указывайте конкретные коды ошибок: P0300, C1234, а не «ошибки зажигания»

    Используйте стандартные термины: ДПДЗ, АКПП, ЭБУ, ТЖ

    Не допускайте двусмысленности:
    Нет = «Может быть что угодно»
    Да = «Наиболее вероятные причины: 1) ..., 2) ...»

  6. Язык и стиль

    - Единый язык (в нашем случае — русский)

    - Профессиональная лексика, но без излишнего жаргона

    - Предпочтение повелительному наклонению или списку фактов

Часть 7. Запускаем программу и содаём ярлык на Рабочий стол.

Закрываем окно CMD, если оно было раньше открыто, запускаем виртуальное окружение:

cd C:\car_expert

venv_gpu_fresh\Scripts\activate

пишем команду запуска нашей программы:

python app.py

В окне CMD вы должны увидеть следующую картину (немного промотал вниз):

Надпись: load_tensors: layer 0 assigned to device CUDA0, is_swa = 0 означает, что работает видеокарта и обрабатывает поступающую информацию.

Открываем в браузере ссылку http://127.0.0.1:7860/ и наслаждаемся результатом:

Делаем ссылку на ярлык для Рабочего стола:

- создаём в Блокноте файл, копируем и вставляем внутрь

@Echo off

cd /d "C:\car_expert"

call "C:\car_expert\venv_gpu_fresh\Scripts\python.exe" app.py

pause

сохраняем в корневую папку с названием Запустить авто-эксперта.bat.

- кликаем на него правой кнопкой и выбираем "Создать ярлык".

- Перименовываем новый созданный файлик "Запустить авто-эксперта — ярлык.lnk" в "Авто-Эксперт (оффлайн).lnk".

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

Часть 8. Финальная.

Вот и всё. Мы своими собственными руками создали "великую и ужасную нейросеть" :) так что теперь смело можете говорить всем вокруг, что "...писали мы ваши нейросети, нет там ничего сложного" и гордо демонстировать свою работу. Текст надписей "морды лица" в браузере легко исправляется в коде файла app.py, база данных легко адаптируется под любые задачи.

Благодарю всех за внимание, если хотите меня отблагодарить и сподвигнуть на новые изобретения, можете задонатить, сколько не жалко :)

Показать полностью 7
5

Как создавать и распознавать штрихкоды с помощью Java

В современном бизнесе и IT-технологиях штрихкоды встречаются повсеместно. От упаковки товаров и логистики до систем доступа и проверки билетов — они обеспечивают быструю и точную передачу информации.

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

В этой статье представлен эффективный инструмент — Free Spire.Barcode for Java. Это профессиональная Java-библиотека для генерации и распознавания штрихкодов, упрощающая разработку. Мы покажем, как легко реализовать генерацию и считывание штрихкодов в вашем Java-проекте.


1. Обзор Free Spire.Barcode и настройка окружения

Free Spire.Barcode for Java — функциональная Java-библиотека для создания, чтения и сканирования различных одномерных и двумерных штрихкодов. Она поддерживает популярные форматы, включая Code 128, QR Code, EAN-13, UPC-A, Data Matrix, PDF417 и многие другие. API библиотеки гибкий и позволяет тонко настраивать внешний вид штрихкода.

Преимущества

  • Широкая поддержка типов штрихкодов — почти все распространённые стандарты.

  • Простая интеграция — совместимость с Maven, Gradle и другими инструментами сборки.

  • Высокая производительность — быстрое создание и распознавание, подходит для высоконагруженных приложений.

  • Гибкая настройка — размеры, цвет, шрифт и расположение текста штрихкода.

  • Чистая реализация на Java — не требует дополнительных зависимостей, работает кроссплатформенно.

Настройка окружения

Наиболее удобный способ подключения — через Maven:

<repositories>

<repository>

<id>com.e-iceblue</id>

<name>e-iceblue</name>

<url>https://repo.e-iceblue.com/nexus/content/groups/public/&lt;/...

</repository>

</repositories>

<dependency>

<groupId>e-iceblue</groupId>

<artifactId>spire.barcode.free</artifactId>

<version>5.2.1</version>

</dependency>

2. Генерация штрихкодов с использованием Spire.Barcode for Java

Библиотека предоставляет интуитивный API для создания различных типов штрихкодов. Рассмотрим примеры генерации QR Code и PZN.

Генерация QR Code с логотипом

QR Code широко используется для мобильных платежей и обмена информацией. Spire.Barcode позволяет вставлять логотип в QR Code для повышения узнаваемости бренда.

import com.spire.barcode.BarCodeGenerator;

import com.spire.barcode.BarcodeSettings;

import com.spire.barcode.BarCodeType;

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

public class GenerateQRCodeWithLogo {

public static void main(String[] args) throws IOException {

BarcodeSettings settings = new BarcodeSettings();

settings.set2DData("Hello World"); // Данные для QR Code

settings.setType(BarCodeType.QR_Code); // Тип штрихкода

settings.setShowText(false); // Не отображать текст

settings.hasBorder(true); // Добавить рамку

BufferedImage logoImage = ImageIO.read(new File("data/Logo.png")); // Чтение логотипа

settings.setQRCodeLogoImage(logoImage); // Вставка логотипа

BarCodeGenerator generator = new BarCodeGenerator(settings);

BufferedImage image = generator.generateImage(); // Генерация изображения

ImageIO.write(image, "PNG", new File("QR_CODE_With_Logo.png"));

System.out.println("QR Code с логотипом успешно создан!");

}

}

Примечания:

  • BarcodeSettings — настройки параметров штрихкода.

  • set2DData() — содержимое QR Code.

  • setQRCodeLogoImage() — вставка логотипа.

  • generateImage() — создание изображения.

  • ImageIO.write() — сохранение изображения.


Генерация PZN штрихкода

PZN (Pharmazentralnummer) — стандарт штрихкода для фармацевтической продукции в Германии.

import com.spire.barcode.BarCodeGenerator;

import com.spire.barcode.BarcodeSettings;

import com.spire.barcode.BarCodeType;

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

public class GeneratePZNBarcode {

public static void main(String[] args) throws IOException {

BarcodeSettings settings = new BarcodeSettings();

settings.setData("123456"); // Данные для PZN

settings.setType(BarCodeType.PZN); // Тип штрихкода

settings.setShowTextOnBottom(true); // Отображать текст под штрихкодом

settings.hasBorder(true); // Добавить рамку

BarCodeGenerator generator = new BarCodeGenerator(settings);

BufferedImage image = generator.generateImage();

ImageIO.write(image, "PNG", new File("PZN_Barcode.png"));

System.out.println("PZN штрихкод успешно создан!");

}

}

Библиотека позволяет настраивать ширину, высоту, отступы и цвет штрихкода.


3. Распознавание штрихкодов с помощью Spire.Barcode for Java

Помимо генерации, Spire.Barcode эффективно распознаёт штрихкоды с изображений.

Распознавание из изображения

import com.spire.barcode.BarcodeScanner;

public class ReadBarcodeFromImage {

public static void main(String[] args) {

String imagePath = "CODABAR.png"; // Путь к изображению штрихкода

String[] barcodes = BarcodeScanner.scan(imagePath);

if (barcodes != null && barcodes.length > 0) {

System.out.println("Распознанные штрихкоды:");

for (String barcode : barcodes) {

System.out.println("- " + barcode);

}

} else {

System.out.println("Штрихкод не распознан.");

}

}

}

Советы для повышения точности распознавания:

  • Качество изображения — использовать четкие и высокоразрешённые картинки.

  • Угол наклона штрихкода — по возможности горизонтальный или вертикальный.

  • Контраст с фоном — штрихкод должен быть хорошо виден на фоне.

  • Четкость границ — избегать размытия или зазубрин.

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


Заключение

В этом руководстве показано, как использовать Free Spire.Barcode для:

  1. Настройки окружения;

  2. Генерации различных штрихкодов (QR Code, PZN и др.) с возможностью кастомизации;

  3. Распознавания штрихкодов с изображений.

Благодаря широкой поддержке форматов, высокой производительности, простоте интеграции и гибкости настройки, Free Spire.Barcode for Java является идеальным решением для Java-разработчиков, работающих с штрихкодами. Он упрощает процесс разработки и позволяет сосредоточиться на бизнес-логике приложения.

Показать полностью
9

Logistics_Analyzer виджет панель и как она работает

В прошлом посте я рассказывал, что занимаюсь разработкой программы для логистической инфраструктуры в одиночку. (Ознакомиться тут: Разработка своей программы, суровые реальности и как такое продавать? )

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

Теперь поговорим о виджет панели, зачем я ее создал и как она по моему мнению должна упростить операционку.



Рассмотрим следующую ситуацию:

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

P.S. Такие случаи встречаются довольно часто, особенно когда компании чрезмерно увеличивают штат сотрудников.

Как упростить эту модель? Программа не является WebView, она десктопная, не имеет серверов и хранит данные локально. "Решение есть!" — скажу я вам. Виджет панель с сохранением состояний в JSON. Получаем универсальную настройку программа у каждого пользователя, но работающего с одной системой.


Элемент включения правого окна панели управления

Элемент включения правого окна панели управления

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

Панель виджетов.

Панель виджетов.

Что бы добавить новый виджет или выключить существующий необходимо просто прожать чекбокс.

А состояние мы просто сохраним в JSON формате.

Нажатие на "Добавить ссылку на дашборд" запускает процесс получения данных из системы. Получается компонент опрашивает БД через отдельное ядро "Есть ли у нас созданные дашборды? Да? Верни название страницы, я создам список для пользователя"

Окно выбора страницы для создания виджета

Окно выбора страницы для создания виджета

Код ответил "Да, у нас есть страница с названием (Тестовый шаблон)", далее дроп окно нам показывает название и имеет возможность выбора из нескольких вариантов.
Для удобства настройки - предоставлена возможность выбор иконки для виджета и создания названия виджета.

Окно выбора иконки. При наведении на иконку, если она GIF - запускается анимация и происходит выделение цветом.

Окно выбора иконки. При наведении на иконку, если она GIF - запускается анимация и происходит выделение цветом.

Вот мы добавили новый тип виджета "Ссылка на дашборды".

Мы добавили новый виджет

Мы добавили новый виджет

При нажатии на элемент виджета программа перенаправит нас на страницу с настроенными графиками и информацией, которые так же настроил пользователь.

Открытая страница дашборда.

Открытая страница дашборда.

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

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

Структура панели.

Структура панели.


Ах, да. Говоря о возможностях правой панели, я потерял нить: "Как же это улучшит работу?".

Программа использует переменную, позволяющую выбрать между локальным хранилищем SQLite3 и сетевым. Это обеспечивает совместную работу всех пользователей с одними данными и возможность добавления новых. Человек ИКС настроил скрипты для получения данных, подходящих под программу. Другие пользователи могут не только просматривать наборы кириллицы и латиницы, но и визуализировать данные на карте с интерактивным просмотром. Они также могут создавать свои собственные графики и дашборды.

Хотя я не претендую на замену BI-систем, я понимаю, что не у всех есть средства для внедрения полноценных аналитических систем. JSON структура позволяет настроить уникальный формат панели в соответствии с предпочтениями пользователя.


Чрезмерно благодарен за уделенное время прочтения статьи. Впереди третья часть в следующую среду)

P.S. Местами есть разногласия в теме дизайна, активно перевожу на централизованный QSS стиль темы. Это позволит изменять один файл и менять тему везде. Сейчас частично стили интегрированы в код

Показать полностью 10
16

Алгоритмы против людей: как умники с Уолл-стрит превратили биржу в казино с кодом

Недавно купил книгу «Кванты. Как волшебники от математики заработали миллиарды и чуть не обрушили фондовый рынок», которую её автор Скотт Паттерсон написал ещё в 2010 году. Книга издана на русском языке в 2014, но я познакомился с ней только недавно и понял что в книге очень хорошо расписана хронология развития алгоритмической торговли и чем она заканчивалась. Спойлер: ничем хорошим в итоге, но в моменте очень выгодно для участников.

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

Причём странная деталь — заказал книгу на обычном маркетплейсе, но книга шла из‑за рубежа и пришла даже без указания тиража — то есть какая‑то условно китайская копия — раньше с такими не сталкивался.

Моя книга

Моя книга

Ниже первая часть, которая написана на основе этой книги.

Эволюция алгоритмов: как математика захватила Уолл-стрит

История современной финансовой инженерии — это история про то, как математика постепенно вытеснила интуицию. За полвека Уолл‑стрит превратилась в гигантский вычислительный аппарат: биржу, где решения принимают не люди, а алгоритмы. Скотт Паттерсон в книге «Кванты» подробно исследовал этот путь — от простейшего статистического анализа до сложнейших моделей корреляций и высокочастотного трейдинга.

1960-е: от казино к рынку капитала — математический прорыв

Эд Торп

Эд Торп

Эд Торп - первый квант

Профессор MIT Эдвард Торп стал первым, кто доказал: случайная система подчиняется математике, а значит — её можно обыграть.

Метод: подсчёт карт + критерий Келли (функция максимизации log‑utility)

Критерий Келли решает оптимизационную задачу:

[ \max f(x) = E[\log(1 + xR)] ]

где x — доля капитала в ставке, R — доходность.

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

Переход в финансы: дельта-хеджирование варрантов (1967)

Торп перенёс идеи динамического хеджа в торговлю опционами ещё до публикации формулы Блэка‑Шоулза. Суть алгоритма:

  1. Купить недооценённый варрант.

  2. Продать соответствующую акцию в объёме, равном дельте варранта.

  3. Регулярно обновлять хедж → «реплицировать» поведение опциона.

Фактически это была одна из первых практических реализаций стохастического процесса геометрического броуновского движени и динамического хеджирования.

1970-е: формулы приходят на Уолл-стрит

Слева направо - Ф. Блэк, М. Шоулз и Р. Мертон

Слева направо - Ф. Блэк, М. Шоулз и Р. Мертон

Метод Блэка‑Шоулза (1973) базируется на предположении:

[ dS_t = \mu S_t dt + \sigma S_t dW_t ]

и отсутствии арбитража.

Формула позволила впервые «правильно» оценивать опционы.

Портфельное страхование (Dynamic Hedging)

Алгоритм превратил репликацию пут‑опциона в массовый продукт. При падении рынка позиции автоматически хеджировались продажей фьючерсов S&P 500.
В реальности дискретная аппроксимация в условиях высокой волатильности привела к положительной обратной связи, что стало катализатором краха 1987 года.

1980-е: статистический арбитраж и рождение машинного подхода

Метод: парный трейдинг

Был основан на утверждении, что разница между двумя «синхронными» акциями — стационарный процесс.

Математическая форма этого:
[ spread_t = y_t — \beta x_t \approx OU\text{‑процесс} ]

Метод: статистический арбитраж

Это масштабирование парной идеи на сотни и тысячи бумаг:

  • кросс‑секционные регрессии,

  • ранний PCA,

  • ранние ML‑подходы (кластеризация).

Группы APT (Morgan Stanley), Renaissance и D.E. Shaw создали первые полноценные алгоритмические машины извлечения альфы.

1990-е: факторные модели и первые элементы машинного обучения

Юджин Фама (слева) и Кеннет Френч (справа)

Юджин Фама (слева) и Кеннет Френч (справа)

Факторные модели Фама‑Френча

Каждая акция рассматривается как вектор факторных экспозиций.
Цель — построить market‑neutral портфель с экспозицией:

  • long Value,

  • long Momentum,

  • long Size,

  • short всё остальное.

Клифф Эснесс из AQR превратил это в масштабируемый продукт.

Метод: распознавание образов в ценах (фонд Medallion)

Renaissance применяли методы:

  • HMM (скрытые марковские модели),

  • сигнальную обработку,

  • Kalman Filtering,

  • wavelet‑декомпозицию,

  • регрессионные ансамбли.

Это были первые «ML‑прототипы» в торговле.

2000-е: корреляционный риск и кризис

Дэвид X. Ли

Дэвид X. Ли

Метод: Gaussian Copula (Дэвид Ли)

Фактором роста CDO было предложение Дэвида Ли использовать статистическую модель «гауссовой копулы» для расчета цен на CDO. В конце 2005 года исследовательская компания Celent оценила размер глобального рынка CDO в $1,5 трлн и прогнозировала, что рынок вырастет ориентировочно до $2 трлн к концу 2006 года.

Модель:

[ C(u, v) = \Phi_\rho(\Phi^{-1}(u), \Phi^{-1}(v)) ]

Главные упрощения этого:

  • корреляции считаются стабильными,

  • хвостовые риски срезаются нормальным распределением.

Ошибки копулы стали одной из фундаментальных причин кризиса 2008.

Метод: Credit Arbitrage (Боаз Вайнштейн)

Связь «акций ↔ облигаций ↔ CDS» создаёт сеть относительных цен.
Несогласованности приводят к арбитражу структуры капитала.

Итоги книги

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

В книге подчёркивается не злой умысел, а слепая вера в модели. Например, Мэтью Ротман (Goldman) не хотел разрушить рынок — он искренне верил в эффективность рынка и гауссовы распределения, пока реальность не опровергла это.

Книга закончилась, но я попробовал продолжить историю дальше самостоятельно.

Продолжение: квантовая эволюция уже после выхода книги (с 2010 по 2025)

Я немного дописал на основе открытых источников.

2010-е: Big Data и машинное обучение

ML в квантовых фондах. Фонды Two Sigma, D.E. Shaw, Jane Street внедряют:

  • Random Forest

  • Gradient Boosting

  • k-NN

  • нелинейные факторные модели

Для того чтобы:

  • обнаруживать микро-паттерны,

  • классификацировать ордера,

  • прогнозировать микро-волатильности.

2015–2020: NLP, RL и альтернативные данные

Обработка естественного языка (Natural Language Processing) приходит на рынок. Использование:

  • Word2Vec

  • BERT

  • FinBERT

  • GPT-like моделей

для оценки тональности новостей, отчётов.

Reinforcement Learning в торговле

Оптимизация инструментов маркет-мейкера и риск-менеджмента через RL:

  • DQN

  • PPO

  • Actor–Critic

Альтернативные данные

Используются даже изображения со спутников, квитанции, поисковые запросы, трафик в торговых центрах.

2020-е: предсказание стакана, трансформеры и микро-структура рынка

Алгоритмические модели микро-структуры (LOB). Для этого используются модели:

  • LSTM

  • TCN

  • Transformer-based time series

Которые решают задачи:

  • предсказания перехода между состояниями order book,

  • определения вероятности немедленного движения цены.

Low-latency и FPGA революция

Квантовые фирмы работают на:

  • FPGA-ускорителях,

  • специализированных NIC-картах,

  • colocated-серверах с задержками ~100 нс.

2025+: LLM-Quant эра

Использование LLM в анализе документов. LLM обрабатывают:

  • отчёты SEC,

  • корпоративные публикации,

  • патентные тексты,

  • судебные материалы.

Роль программиста меняется: создание quant-pipeline, где:

LLM → фичи → ML-модель → торговая стратегия.

Итог

Алготрейдинг уже давно не набор формул. Это инженерная дисциплина, на стыке:

  • стохастики,

  • статистики,

  • ML,

  • распределённых систем,

  • сетевой инженерии,

  • оптимизации под архитектуру (CPU/GPU/FPGA),

  • больших данных,

  • системного моделирования.

А рынок — это распределённая вычислительная система, где соревнуются программы.

Автор: Михаил Шардин
🔗 Моя онлайн‑визитка
📢 Telegram «Умный Дом Инвестора»

2 декабря 2025

Показать полностью 5
5

Как конвертировать Excel в JPG с помощью Python (3 практических метода)

Конвертация листов Excel в форматы изображений, такие как JPG, является распространенной задачей в отчетах, панелях управления, визуализации данных и рабочих процессах документов. Хотите ли вы встроить содержимое таблицы в отчет, создать миниатюры, опубликовать данные в вебе или просто поделиться содержимым листа без раскрытия формул, конвертация Excel в изображения на Python предоставляет быстрое и автоматизированное решение. В этом руководстве вы узнаете несколько способов конвертации файлов Excel в изображения JPG с использованием Python и Free Spire.XLS для Python, включая:

  • Конвертацию целого листа в JPG

  • Применение пользовательских полей

  • Создание высококачественных JPG с использованием масштабирования DPI

  • Экспорт только определенного диапазона ячеек

Давайте начнем.

Зачем конвертировать Excel в JPG?

Вот самые распространенные случаи использования:

  • Делитесь содержимым Excel без раскрытия формул: превращайте листы в статические изображения для отчетов, статей и электронных писем.

  • Встраивание в веб: веб-страницы обрабатывают JPG/PNG гораздо лучше, чем файлы Excel.

  • Автоматизированная генерация отчетов: полезно при создании панелей управления или пакетном экспорте содержимого Excel.

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

  • Предотвращение редактирования: изображения гарантируют, что данные не могут быть легко изменены.

Установка необходимых библиотек

Установите Free Spire.XLS для Python:

pip install spire.xls.free

Опционально: установите Pillow для масштабирования DPI:

pip install Pillow

Метод 1: Конвертация листа в файл JPG с пользовательскими полями

При конвертации таблиц в изображения поля иногда могут добавлять нежелательные отступы. Spire.XLS позволяет установить пользовательские поля страницы перед экспортом.

using Spire.Doc;

using Spire.Doc.Documents;

class Program

{

static void Main(string[] args)

{

// Create a Document object

Document document = new Document();

// Load the RTF file

document.LoadFromFile("input.rtf");

// Save as a PDF file

document.SaveToFile("output.pdf", FileFormat.PDF);

// Output success message

Console.WriteLine("RTF file successfully converted to PDF!");

}

}

Метод 2: Конвертация листа в файл JPG с пользовательским DPI (высокое качество)

Spire.XLS поддерживает экспорт векторных EMF-изображений, которые можно увеличить до любого DPI с помощью Pillow. Это идеально подходит для печати или презентаций высокого разрешения.

Этапы

  1. Экспортируйте лист в EMF (векторное изображение).

  2. Загрузите EMF с помощью Pillow.

  3. Увеличьте до пользовательского DPI (например, 300 DPI).

  4. Сохраните как JPG/PNG.

Пример кода

sheet.SaveToImage(

stream,

sheet.FirstRow,

sheet.FirstColumn,

sheet.LastRow,

sheet.LastColumn,

ImageType.Metafile, # Это выход EMF

EmfType.EmfPlusDual

)

workbook.Dispose()

# --- 2. Загрузите EMF из потока с помощью Pillow ---

emf_bytes = stream.ToArray()

img = Image.open(io.BytesIO(emf_bytes))

# --- 3. Увеличьте до 300 DPI ---

target_dpi = 300

scale = target_dpi / 96# Pillow рендерит EMF при ~96 dpi

new_size = (int(img.width * scale), int(img.height * scale))

img = img.resize(new_size, Image.LANCZOS)

# --- 4. Сохраните изображение высокого разрешения ---

img.save("sheet_300dpi.jpg", dpi=(target_dpi, target_dpi))

Почему этот метод мощный

  • Выходное изображение кристально четкое

  • Отлично подходит для печати, встраивания в PDF, графики пользовательского интерфейса и многое другое

  • EMF гарантирует, что текст остается четким даже после масштабирования

Метод 3: Конвертация определенного диапазона ячеек в файл JPG

Иногда нужно только часть листа — например, график, таблицу или область панели управления.

from spire.xls import *

from spire.xls.common import *

# Создание объекта Workbook

workbook = Workbook()

# Загрузка файла Excel

workbook.LoadFromFile("C:/Users/Administrator/Desktop/input.xlsx")

# Получение первого листа

sheet = workbook.Worksheets[0]

# Укажите диапазон ячеек для конвертации

startRow = 1

startCol = 1

endRow = 11

endCol = 5

# Конвертация диапазона ячеек листа в изображение

image = sheet.ToImage(startRow, startCol, endRow, endCol)

# Сохранение изображения в файл PNG

image.Save("CellRangeToImage.jpg")

workbook.Dispose()

Резюме

С помощью Python и Spire.XLS вы можете легко конвертировать листы Excel в изображения JPG с полным контролем над макетом и разрешением. В этом руководстве вы узнали, как:

  • Конвертировать лист в JPG с пользовательскими полями

  • Генерировать высококачественные JPG с использованием EMF + масштабирования DPI

  • Экспортировать определенный диапазон ячеек как изображение

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

Показать полностью
12

Привет обитателям сообщества пикабу!

Это мой первый пост, так что прошу не кидаться помидорами. Мне 23. Я учусь в институте на цифрового инженера горного дела и дополнительно в другом институте прохожу переквалификацию по аналитике данных. Специальность в институте не очень похожа на что-то связанное с программированием, да и базу не дают. Проходили курс по программированию в прошлом году и наелись говна, пытаясь изучить С++ без какой либо базы и понимания что это вообще такое. В начала обучения говорили, что профессия связана с АСУТП, фотограмметрией у маркшейдеров, внедрением ии в производство. Но проучившись 2 года я поняла, что кроме геологии, горного дела и обогащения ничего нам не дадут. Вот теперь с глазами полными ужаса и психотравмой от с++ я хочу попробовать двинуться в сторону самостоятельного изучения программирования. Я себе представляю что программирование это очень доходная штука, но в сфере добычи золота мы очень далеко от внедрения каких-то технологий. Подскажите пожалуйста, насколько актуальна аналитика данных и работа с sql, python, power bi и big data? Возможно ли начать переходить в сферу программирования с таким набором знаний или надо изучать еще кучу всего? Я очень боюсь обосраться с выбором направления, боюсь что пропаду в жизни, так как выбрала неверный путь и буду всю жизнь пилить ноготочки в задроченом салоне красоты.


Апдейт: Сегодня в институт поступил запрос на аналитика от одного из местных ГОКов. Хотят пробовать цифровизироваться. Всем спасибо за комменты!

Показать полностью

Девушка в конфе парней-программистов или очень не-дружелюбное python-комьюнити тупых самцов

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

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

Часть 1. Приход в чатик python-программистов.

Итак, прихожу в очередной пайтон-чатик. Пишу: «привет, меня зовут Кристина, я хочу общаться не темы, связанные с программированием на языке Python…лалала» И сразу набегает куча существ противоположного пола с предложениями типа: «давай код, поправлю», «покажи ошибку, решу» и тому подобное. Честно, всегда меня с души воротило от этой их лицемерной заботы, под которой на самом деле скрывается махровое собственничество и удушливый авторитарный самцовый эгоцентризм. Один из главных аспектов патриархального воспитания, что поделать. Была бы я такой тупой самкой, о каких писала в своём предыдущем посте — кинула бы код в саблайме написанный, в котором внутри вайл тру вавилонская башня из кучи ненужных никому переменных и однотипных ифов, а по земле растекается мутной жижей страшный и непонятный(для неё) еррор, возникший по причине того, что один из этих ифов что-то там поломал. Ну и просто чтобы показать, что я не такая от слова совсем, кидаю им что-то вроде такого вот:

Девушка в конфе парней-программистов или очень не-дружелюбное python-комьюнити тупых самцов

Некоторое время они усиленно скрипят мозгами, переваривая увиденное. Потом бывали дебильные вопросы по типу «аа чо??? а чо это вапще такое там?» или «откуда там взялись self.name и self.family, если нет даже конструктора и их в нём?» , «почему этот странный непонятный метод не вызывается через точку, а при этом всё равно выполняется», «зачем там две черточки с обеих сторон такие» и т. д. Ну понятно, что все эти вопросики исходили от ребят, которые потусовались на всяких степиках, начитались укуса-питона, насмотрелись гайдов от хауди-хо и решили в итоге, что обладают достаточным уровнем познаний, чтобы помогать глупым тян, решать их ошибки в коде, а в возможной перспективе и «познакомиться поближе». И общее отношение очень быстро трансформируется из добродушно-снисходительной заботливости сначала в холодную настороженность а потом уже и в агрессивную враждебность. Ну правильно, я же сломала им один из их главных подсознательных патриархальных стереотипов, согласно которому они априори обладают монополией на глубокие знания и крутые навыки в чем бы то ни было.

Часть 2. Травля, троллинг и харасмент.

Далее всё разворачивается по стандартному сценарию. Я никого из них не оскорбляю (во всяком случае первая), пытаюсь нормально общаться. Но меня начинают посылать на три буквы, обзывать «шлюхой», писать, что я «жирная», «уродина» и т. д. Откуда-то иногда прилетают требования показать сиськи, кинуть нюдсы, «го е-ся» и прочее в этом роде.

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

Второе — пытаюсь хоть как-то им отвечать. Но тут бац! Мне выдают пред(варн). То есть им можно, а мне нельзя. Ухожу в режим молчания и ридонли.

Часть 3. Как доказать что ты не верблюд. Точнее, что ты — девушка.

Точнее доказать, что ты биологическая женщина. Зачем? А затем, что от оскорблений они быстро переходили сначала к коллективному созданию теории, что коды, которые я кидала в чат, на самом деле не мои, а их написал какой-то парень «нормальный программист», а потом появлялись предположения о том, что я сама — какой-то «парень» и заявленный изначально мной гендер якобы не соответствует действительности. Если я вдруг начинала что-то после этого писать, то мне отвечали, обращаясь ко мне в мужском роде обязательно и т. д. Меня начинали усиленно именовать «братан», «чувак», «мужик» и т д. Что, опять же, делать бедной девушке в этой ситуации? Да да да, поначалу я была такой наивной, что (по большей части ради эксперимента, но и с небольшой надеждой что-то изменить) начинала реально пытаться им как-то доказать их неправоту в этом плане. Но не тут то было. Являясь девушкой, не так то просто доказать, что ты девушка. Отправка голосовых сообщений не помогала. Фоткаться рядом с монитором, на котором открыт этот чат или мой аккаунт в вк — тоже ни к чему это не приводило(хорошему во всяком случае). Буквально, чем больше я предпринимала таких попыток — там сильнее они начинали верещать, что я «мужик». Ну, или в лучшем случае, трансгендерное существо. Ну конечно, ведь лишь «трёхногим» дано от рождения великое право писать хороший код. На предложения-требования пойти в голосовой чат я всегда отвечала отказом, потому что слышать их я не в состоянии просто физически (мои индивидуальные особенности). Я и чужие голосовые сообщения в чатах не слушаю никогда. И в итоге они окончательно навешивали на меня ярлык «ненастоящей девушки», «гея под женским аккаунтом» и тому подобные бредовые идиотизмы. Сей горький опыт научил меня многому. Теперь я даже в своем личном чате больше не отправляю никакие голосовые сообщения и не кидаю фотки, из которых несомненно видно, к какому полу я отношусь. А в чужие чаты больше не хожу. Только на аву ставлю свой реальный фейс, сильно обработанный нейросеткой в приложении. Однако внешнее сходство с оригиналом и при этом крайне велико. Считаю, что этого более чем достаточно. Если какие-то дауны хотят думать про меня что-то другое — то это их святое право (быть клиническими идиотами).

Часть 4. Эпилог.

Чем всё это всегда заканчивалось? Как правило, я сама покидала эти помойки (ведь из всего вышесказанного становится ясно, что никак иначе эти «юзерфрендли пайтон-комьюнити чаты» назвать нельзя) и шла в новые(пока все они не кончились). Но бывали интересные случаи, когда я не успевала уйти и меня исключали. За что же, спросите вы? Ну, однажды мне админ написал: извини, из-за тебя начался «срач», потому я вынужден тебя исключить из беседы. Но такое было пару раз всего. И то потому, что в чате находилась парочка более менее разумных существ, которые вставали на мою сторону и тоже сразу начинали подвергаться коллективной обструкции и откровенной травле, как "подсосы", куколды и "п-лизы". А так обычно просто кикали из злобы и личной неприязни. Это меня не удивляло. Было удивительно другое. Опять же ради эксперимента и в рамках социологического исследования я тихо заходила в те же чаты с другого неприметного акка и тихо сидела, читая, что про меня они там пишут. И поначалу выпадала в осадок от того, что там было. Что же такого там было, спросите вы? О, это было нечто. Просто верх приматского слабоумия я бы сказала. Что самое любопытное, постфактум они почему-то начинали всё же признавать то, что я действительно скорее всего тян а не кун. Но при этом про меня начинали различные слагаться мифы и легенды. Какого бреда там только не было. В программировании я по большей части занимаюсь написанием вк-ботов и эти … даунлоады начинали на полном серьёзе писать что:

1. Мои боты — хрень полная, таких любой школьник напишет на коленке в туалете во время перемены. (вряд ли, на несколько тысяч строк кода времени тупо не хватит)

2 Боты норм, но они «не мои». Варианты — скачаны мной с гитхаба, написаны для меня кем-то другим(разумеется, кем-то мужского пола).

3 Я «не умею писать код»!(тут особое хаха)

4 Я «не знаю python вообще»!!(тут просто ржунимагу)

5 Некий сгенерированный ими искусственный образ меня - «жирная, прыщавая уродина. парня нет — вот и бесится», «шлюха, шалава, прошмандовка». Причем первое прекрасно сочетается со вторым. Ну и «мужик» тоже никуда не исчез и так же гармонично вписывается в картину первых двух утверждений. Там ещё «школьница 12 лет» и т. д. Короче если джоин сделать, то «жирная уродливая шлюха школьница мужик», как-то так. Ах, ещё забыла слово «тупая», да. Я — тупая (тут даже комментарии излишни, стоит просто почитать некоторые мои посты здесь даже). В плане интеллекта и умственного развития я на много порядков превосхожу их всех, вместе взятых - это должно быть очевидно любому, даже не очень далекому индивиду, кто их читал.

И вот после всего этого они, «трёхногие» хозяева планеты, продолжают себя считать «вершиной эволюции», а нас, милых и прекрасных нежных "двуногих" созданий — существами второго(или даже третьего) сорта.

Если подытожить, то всё это — и правда «вершина». Просто верх человеческой(не только самцовой) глупости, мелочности, тотальной умственной ограниченности и эгоцентризма. Самки тоже виноваты в том, что всё так сложилось. Но не буду углубляться в фем-дискурс, это не к данному разделу относится. К тому же я не феминистка в обычном представлении, даже близко нет.

И не стану напоминать о том, что так называемый «риаллайф», физический мир, реальность — совсем не так реальны на самом деле, как это почти всем людям кажется. Это тоже относится к моей общей тематике, а не к данному разделу. И потому в качестве послесловия скажу так, как говорят «нормальные» люди — в реале (физическом мире) я вот прям полнейшая диаметральная противоположность всего того бреда, который про меня сочинили и до сих пор сочиняют разные умственно-отсталые существа в интернете.

По порядку:

1 «Жирная(толстая) прыщавая уродина» - я очень худая, буквально соответствую выражению «кожа да кости», прыщей нет и даже в подростковом возрасте не водилось. И не уродина, даже близко нет. Даже далеко. Напротив, когда накрашусь, сделаю причесон, оденусь по моде и выползу в большой город (что бывает примерно пару раз в году) — то приматы постоянно жрут своими потными похотливыми глазёнками моё прекрасное стройное тело и моё милое личико.

2 «Бесится, что парня нет». Тут они правы кое в чем. Парня и правда нет, но не бешусь. А радуюсь. Ну и нет его не потому, что на меня внимания они не обращают — обращают даже слишком, если видят. А просто потому что я их не воспринимаю в качестве объекта для чувств и возможных отношений. А механический секс с ними ради ощущений меня давно уже не интересует.

3 «Боты не мои» - нет, они мои. Я даже написала микролибу для создания ботов, что наглядно доказала, выложив скрины кода одного из моих ботов на ней (методов с такими названиями и общей архитектурной специфики нет ни в одной общеизвестной библиотеке для создания вк-ботов на питоне). Много раз у себя в чате я в рантайме фиксила некоторые баги в своих ботах, многие( в том числе и некоторые участники вышеозначенных пайтон-помоек ) это видели своими собственными глазами.
Боты приватные("заточены" под мои чаты), выполняют только мои команды и тех участников, которым в этих ботах я даю повышенные права. Следовательно я имею прямой доступ к их базе данных, а не использую чьи-то чужие ресурсы. Какие ещё нужны тут доказательства?

4 «Плохо знаю язык Python или не знаю его вообще» - ну тут даже говорить нечего особо. Мой старый аккаунт вконтакте весь облеплен примерами моего кода, из которых очевидно, что знаю я его распрекрасно. Просто ради развлечения легко и непринужденно юзаю такие вещи, как сложные декораторы, множественное наследование, метаклассы и дескрипторы. А об этих вещах вообще мало кто даже из так называемых «миддлов» знает. Прочитала наиболее серьёзные книги по питону, в том числе М. Лутца и Б. Любановича. В ООП питона разбираюсь на академическом уровне.

5 «Не являюсь биологической женщиной» - нет, являюсь. Более чем. В самой полной мере плоть до соответствующего набора хромосом и всяких мелких женских проблемок и больших(правда не всем доступных) радостей, чем весьма довольна. Близкие друзья меня видели, слышали, общались даже некоторые вживую. А всяким мимокрокодилам и мамкиным школотроллям я доказывать сей факт даже не обязана от слова совсем. И не собираюсь больше этого делать.

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

Пообщаться со мной и получить ответы на вопросы можно там:

чат в вк: https://vk.me/join/AZQ1dxyBWxOm9k0RMt1hwxdk

чат в тг: https://t.me/+FbDIvoJceAJjZjEy

Показать полностью 1

Оффлайн переводчик на Android

Переводчик работает за счёт предустановленного(прописанного) словаря в код. Словарь можно пополнять новыми словами.

Отличная работа, все прочитано!