Архив рубрики: Без рубрики

Программа для подключения двух сервоприводов к Arduino

#include <Servo.h> 
Servo myservo_1;  // для управления первым сервоприводом
Servo myservo_2;  // для управления вторым сервоприводом
int val = 1;  // угол положения сервопривода 
int increment = 1;  // на сколько градусов менять угол
 
void setup() 
{ 
  // жёлтый провод первого сервопривода на 9 пине
  myservo_1.attach(9); 
  // жёлтый провод второго сервопривода на 10 пине 
  myservo_2.attach(10);
} 
 
void loop() 
{ 
  // Сервоприводы поворачиваются на противоположные углы
  if(val <= 1){
    increment = 1;
  }
  if(val >= 178){
    increment = -1;
  }
  val += increment;
  myservo_1.write(val);
  myservo_2.write(179 - val);
  delay(15);
} 

Ходовые модули Python для анализа данных и машинного обучения

== CNTK

  • # The Microsoft Cognitive Toolkit
  • «A free, easy-to-use, open-source, commercial-grade toolkit that trains deep learning algorithms to learn like the human brain.»
  • pip install cntk
  • «CNTK is no longer actively developed»

== deap

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

== jupyter

  • среда для выполнения кода на питоне и просмотра результатов в браузере
  • можно перезапускать с изменениями только выбранные куски кода
  • можно выводить графики matplotlib

== keras

  • для нейронных сетей
  • может работать поверх theano, tensorflow или CNTK

== matplotlib

  • рисование графиков

== numpy

  • многомерные массивы, матрицы
  • удобная загрузка данных из бинарных файлов
  • библиотека используется во многих других (pandas, …)

== nvidia-…

  • nvidia-cublas-cu12
  • nvidia-cuda-cupti-cu12
  • nvidia-cuda-nvcc-cu12
  • nvidia-cuda-nvrtc-cu12
  • nvidia-cuda-runtime-cu12
  • nvidia-cuda-sanitizer-api-cu12
  • nvidia-cufft-cu12
  • nvidia-curand-cu12
  • nvidia-cusolver-cu12
  • nvidia-cusparse-cu12
  • nvidia-npp-cu12
  • nvidia-nvjitlink-cu12
  • nvidia-nvjpeg-cu12
  • nvidia-nvml-dev-cu12
  • nvidia-nvtx-cu12
  • nvidia-pyindex

== opencv-python

  • pip install opencv-python
  • машинное зрение, распознавание объектов на изображениях и т.п.

== orange3

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

== pandas

  • для извлечения и подготовки данных
  • похоже на электронные таблицы, можно задавать и использовать имена колонок и индексы для строк
  • на базе numpy
  • загрузка данных из excel, csv, json, sql
  • группировка и фильтрация данных
  • применение функций ко всем значениям в выбранных колонках — в разы быстрее чем использовать циклы на чистом питоне
  • надо внимательно следить при работе с данными, когда они нормально скопированы, а когда ссылаются на источник, чтоб изменяя значения в одном месте, не испортить их в другом

== pillow

  • работа с изображениями
  • можно попиксельно

== plotly

  • интерактивные графики в браузере
  • pip install plotly

== pyodbc

  • для выполнения запросов к разным базам данных (MSSQL, PG и т.п.)
  • для разных баз данных изредка работает с разными ошибками (изредка случалось, результаты из модуля не совпадали с результатами через нативные клиенты), но в большинстве случаев всё хорошо

== pytorch

  • библиотека для машинного обучения
  • нейронные сети
  • тензорные вычисления
  • может работать с GPU
  • говорят, что замена для numpy
  • вроде поддерживает динамические графики

== scikit-learn

  • библиотека всяких алгоритмов машинного обучения — кластеризации, регрессии, классификации, …
  • на основе numpy и scipy

== scipy

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

== seaborn

  • библиотека построения графиков и визуализации данных
  • основана на matplotlib

== spyder

  • интерактивный редактор кода с автодополнением
  • можно выполнять код прямо внутри редактора
  • можно сразу выводить графики matplotlib

== sympy

  • для символьных вычислений — не только получения значений, а сокращения формул и т.п.
  • для уравнений в решении умеет возвращать несколько корней, как положено
  • хорошая статья с примерами на хабре https://habr.com/ru/post/680258/

== tensorflow

  • для нейронных сетей

== theano

  • для нейронных сетей
  • может использовать GPU

Ещё не написал про модули от nvidia для работы с GPU

Если кто ещё знает полезные модули по теме — пишите в коментариях, тоже соберём в кучу

C++ Компиляция HelloWorld для wxWidgets в Ubuntu

  1. Установить пакеты wxWidgets (версии могут быть другие):
sudo apt install libwxgtk3.0-gtk3-0v5
sudo apt install libwxgtk3.0-gtk3-dev

2. Создать файл main.cpp:

// https://docs.wxwidgets.org/latest/overview_helloworld.html
// https://docs.wxwidgets.org/latest/overview_install.html

// wxWidgets "Hello world" Program
// For compilers that support precompilation, includes "wx/wx.h".
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif
class MyApp: public wxApp
{
public:
    virtual bool OnInit();
};
class MyFrame: public wxFrame
{
public:
    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
private:
    void OnHello(wxCommandEvent& event);
    void OnExit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);
    wxDECLARE_EVENT_TABLE();
};
enum
{
    ID_Hello = 1
};
wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(ID_Hello,   MyFrame::OnHello)
    EVT_MENU(wxID_EXIT,  MyFrame::OnExit)
    EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
wxEND_EVENT_TABLE()
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame( "Hello World", wxPoint(50, 50), wxSize(450, 340) );
    frame->Show( true );
    return true;
}
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
        : wxFrame(NULL, wxID_ANY, title, pos, size)
{
    wxMenu *menuFile = new wxMenu;
    menuFile->Append(ID_Hello, "&Hello...\tCtrl-H",
                     "Help string shown in status bar for this menu item");
    menuFile->AppendSeparator();
    menuFile->Append(wxID_EXIT);
    wxMenu *menuHelp = new wxMenu;
    menuHelp->Append(wxID_ABOUT);
    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append( menuFile, "&File" );
    menuBar->Append( menuHelp, "&Help" );
    SetMenuBar( menuBar );
    CreateStatusBar();
    SetStatusText( "Welcome to wxWidgets!" );
}
void MyFrame::OnExit(wxCommandEvent& event)
{
    Close( true );
}
void MyFrame::OnAbout(wxCommandEvent& event)
{
    wxMessageBox( "This is a wxWidgets' Hello world sample",
                  "About Hello World", wxOK | wxICON_INFORMATION );
}
void MyFrame::OnHello(wxCommandEvent& event)
{
    wxLogMessage("Hello world from wxWidgets!");
}

3. Скомпилировать вот такой командой:

$ g++ main.cpp -o main `wx-config --cxxflags --libs`

4. Можно запускать получившуюся программу:

$ ./main

Python Генерация звуков через PyAudio

Следующий код генерирует и проигрывает звук:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Генерация звуков через pyaudio.

За основу взят https://medium.com/py-bits/sound-generation-python-904e54f5398d

sudo apt-get install python3-pyaudio
"""

import pyaudio
import math
PyAudio = pyaudio.PyAudio
BITRATE = 5000
FREQUENCY = 10000
LENGTH = 5
if FREQUENCY > BITRATE:
    BITRATE = FREQUENCY + 100
NUMBER_OF_FRAMES = int(BITRATE * LENGTH)
WAVEDATA = ''
for x in range(NUMBER_OF_FRAMES):
    WAVEDATA = WAVEDATA + chr(
        int(
            math.sin(
                x
                / (
                    (
                        BITRATE / FREQUENCY
                    ) / math.pi
                )
            ) * 127 + 128
        )
    )
REST_FRAMES = NUMBER_OF_FRAMES % BITRATE
for x in range(REST_FRAMES):
    WAVEDATA = WAVEDATA + chr(128)
# print(WAVEDATA)
# óYªQ±J¹CÀ<Æ5Í/Ó)Ù$Þãèìð
# öùûýþþþþýüúø	õ
# óYªQ±J¹CÀ<Æ5Í/Ó)Ù$ÞãèìðÛ&Ö,Ð2Ê9Ã?¼FµN®U¦\lt|xph
# öùûýþþþþýüúø	õ
# ...
p = PyAudio()
stream = p.open(
    format=p.get_format_from_width(1),
    channels=2,
    rate=BITRATE,
    output=True
)
stream.write(WAVEDATA)
stream.stop_stream()
stream.close()
p.terminate()

wxPython пример рабочего окна с кнопкой

# -*- coding: utf-8 -*-
"""
# Самый простой пример окна.

# Отсюда: https://wiki.wxpython.org/Getting%20Started

import wx

# Create a new app, don't redirect stdout/stderr to a window.
app = wx.App(False)
# A Frame is a top-level window.
frame = wx.Frame(None, wx.ID_ANY, "Hello World")
frame.Show(True)     # Show the frame.
app.MainLoop()
"""

import wx


class MyFrame(wx.Frame):
    """Главное окно."""

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200, 100))
        # текстовое многострочное поле
        self.text_input = wx.TextCtrl(
            self,
            style=wx.TE_MULTILINE,
            size=(400, 200),
        )
        # кнопка
        self.exit_button = wx.Button(
            self,
            label="Exit",
            pos=(300, 300),
            size=(100, 100)
        )
        self.Size = (500, 500)
        # Привязка нажатия кнопки к запуску метода главного окна
        self.Bind(wx.EVT_BUTTON, self.my_exit, self.exit_button)
        self.Show(True)

    def my_exit(self, param):
        """Самодельный метод - Закрыть главное окно."""
        # quit()  # раскоментировать чтоб выход заработал
        print(f"param: {dir(param)}")  # что во втором параметре
        self.text_input.SetValue("Exit")  # изменить текст


app = wx.App(False)
frame = MyFrame(None, 'Small editor - Тестовый редактор')
app.MainLoop()

Python matplotlib быстро нарисовать график

matplotlib — модуль питона для рисования графиков

Установка matplotlib:

python3 -m pip install matplotlib

Код чтоб нарисовать простой график:

import matplotlib.pyplot as plt
plt.plot([1,2,3], [2,1,3])

просто два массива — по x и y

Результат:

Сборка Python из исходников в Linux

Имеем распакованный архив с исходниками, например Python-3.10.0.tar.xz

 1490  cd Python-3.10.0
 1491  ls
 1492  mkdir debug
 1493  cd debug/
 1498  make -C ".." clean
 1499  ../configure --with-pydebug
 1500  make
 1502  ./python

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

Как узнать код активации Windows из Linux

В «современных» компьютерах код активации windows обычно зашивается производителями в железо. Чтобы узнать код активации, например для переустановки винды, нужно загрузиться с загрузочной флэшки с Linux и выполнить команду:

sudo cat /sys/firmware/acpi/tables/MSDM

Pygame перехват событий с джойстика

Код для вывода информации обо всех событиях, происходящих с джойстиком:

import pygame
pygame.joystick.init()
pygame.init()
clock = pygame.time.Clock()
joysticks = [pygame.joystick.Joystick(x) for x in range(pygame.joystick.get_count())]
while True:
    for event in pygame.event.get():
        print(event)
    clock.tick(60)

Пример вывода информации о происходящих с джойстиком событиях:

pygame 2.0.1 (SDL 2.0.14, Python 3.8.10)
Hello from the pygame community. https://www.pygame.org/contribute.html
<Event(1541-JoyDeviceAdded {'device_index': 0, 'guid': '030000004c050000da0c000011010000'})>
<Event(4352-AudioDeviceAdded {'which': 0, 'iscapture': 0})>
<Event(4352-AudioDeviceAdded {'which': 0, 'iscapture': 1})>
<Event(1536-JoyAxisMotion {'joy': 0, 'instance_id': 0, 'axis': 0, 'value': 0.0})>
<Event(1536-JoyAxisMotion {'joy': 0, 'instance_id': 0, 'axis': 0, 'value': -1.000030518509476})>
<Event(1536-JoyAxisMotion {'joy': 0, 'instance_id': 0, 'axis': 0, 'value': 0.0})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 3})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 3})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 0})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 0})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 2})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 2})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 1})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 1})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 5})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 5})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 4})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 4})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 7})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 7})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 6})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 6})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 9})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 9})>
<Event(1539-JoyButtonDown {'joy': 0, 'instance_id': 0, 'button': 8})>
<Event(1540-JoyButtonUp {'joy': 0, 'instance_id': 0, 'button': 8})>

Программа для проверки джойстика — человек ходит влево-вправо:

import pygame
pygame.joystick.init()
pygame.init()
clock = pygame.time.Clock()
joysticks = [pygame.joystick.Joystick(x) for x in range(pygame.joystick.get_count())]
hero_sprite = (
    "_o_\n"
    "(_)\n"
    "/ \\\n"
)


def render_object(x: int, sprite: str):
    lines = sprite.split("\n")
    print("\n" * 50)
    for line in lines:
        print(" " * x + line)


hero_x = 10
hero_vx = 0
while True:
    for event in pygame.event.get():
        if event.type == pygame.JOYAXISMOTION:
            print("it works!")
            if event.axis == 0:
                hero_vx = int(event.value)
    hero_x += hero_vx
    render_object(hero_x, hero_sprite)
    clock.tick(60)