vak: (Знайка)
В Питоне образовалась качественная поддержка для разработки современных шрифтов.К примеру, вот как выглядят исходники буквы A в шрифте TikTokSans: A_.glyph
vak: (Default)
Пробуем латинскую кодировку для русского языка. Вот скрипт, перекодирующий произвольный текст.

Odnaždy, v stud́onuü zimńuü poru
Ä iz ĺesu vyšel; byl siĺnyj moroz.
Gĺažu, podnimaëtśa ḿedĺenno v goru
Lošadka, v́ezuşaä hvorostu voz.
I šestvuä važno, v spokojstvii činnom,
Lošadku v́ed́ot pod uzdcy mužičok
V boĺših sapogah, v polušubḱe ovčinnom,
V boĺših rukavicah… a sam s nogotok!
«Zdorovo, parnişe!» — Stupaj śeb́e mimo! —
«Už boĺno ty groźen, kak ä pogĺažu!
Otkuda droviški?» — Iz ĺesu, v́estimo;
Ot́ec, slyšiš, rubit, a ä otvožu.
(V ĺesu razdavalśa topor drovośeka.) —
«A čto, u otca-to boĺšaä śemä?»
— Śemä-to boĺšaä, da dva čelov́eka
Vśego mužikov-to: ot́ec moj da ä…—
«Tak von ono čto! A kak zvat́ t́eb́a?» — Vlasom.—
«A koj t́eb́e godik?» — Šestoj minoval…
Nu, ḿortvaä! — kriknul maĺutočka basom,
Rvanul pod uzdcy i bystŕej zašagal.
vak: (Знайка)
В языке Python с некоторого момента появились сопрограммы (coroutines), реализованные ключевыми словами async и await. Эта фича очень удобна для симуляции всяких процессов. В качестве примера забацаем классических обедающих философов.

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

Вот код на Питоне: Результат:
vak: (Default)
Товарищи взялись заменить Verilog на Python. Проект называется Amaranth. Есть отдельный симулятор.

Проект на Гитхабе: amaranth-lang/amaranth

Есть несколько реализаций процессора RISC-V на Amaranth.
vak: (Default)
Оказывается, на Питоне можно писать навороченные интерфейсы в текстовом режиме. Типа такого:



Больше примеров: textual.textualize.io/widget_gallery/

Проект на Гитхабе: Textualize/textual
vak: (Default)
На днях обсуждали со [personal profile] spamsink минимизацию булевских функций. Тема из далёкого студенчества. Задачка нетривиальная, но давно и глубоко проработанная. Озадачил нею Грока, получил два решения:

на Питоне: minimize-boolean-function.py

на Rust: minimize-boolean-function.rs

Функция с 8 переменными вычисляется на Rust за шесть секунд:
$ rustc minimize-boolean-function.rs

$ /usr/bin/time ./minimize-boolean-function

Truth table: 0000000000X10000000000000000000000000000000000000000000000000000010X010X010X010X010X010X010X010X010X010X010X010X010X010X010X010X00000000001X0000000000000000000000000000000000001X1X1X1X1X1X1X1X0000000000000000000000000000000000000000000000000000000000000000
8-variable result: ~ABH + ~B~C~DE~FG + A~BCD
6.26 real 6.22 user 0.03 sys
vak: (Daemon)
Решил подписаться на линуксный журнал, а у них ошибка выскакивает. Питон не тот язык, на котором следует писать надёжные системы. Заметьте: production код выполняется из каталога /home/odoo/src.
RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
File "/home/odoo/src/odoo/17.0/odoo/http.py", line 1803, in _serve_db
return service_model.retrying(self._serve_ir_http, self.env)
File "/home/odoo/src/odoo/17.0/odoo/service/model.py", line 152, in retrying
result = func()
File "/home/odoo/src/odoo/17.0/odoo/http.py", line 1831, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/src/odoo/17.0/odoo/http.py", line 2035, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/src/odoo/17.0/addons/website/models/ir_http.py", line 235, in _dispatch
response = super()._dispatch(endpoint)
File "/home/odoo/src/odoo/17.0/odoo/addons/base/models/ir_http.py", line 221, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/src/odoo/17.0/odoo/http.py", line 772, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/enterprise/17.0/website_sale_account_taxcloud/controllers/main.py", line 48, in shop_payment_transaction
return super().shop_payment_transaction(order_id, access_token, **kwargs)
File "/home/odoo/src/odoo/17.0/odoo/http.py", line 772, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/odoo/17.0/addons/website_sale/controllers/main.py", line 2089, in shop_payment_transaction
return tx_sudo._get_processing_values()
File "/home/odoo/src/odoo/17.0/addons/payment/models/payment_transaction.py", line 466, in _get_processing_values
processing_values.update(self._get_specific_processing_values(processing_values))
File "/home/odoo/src/custom/trial/saas_payment_stripe/models/payment_transaction.py", line 24, in _get_specific_processing_values
res = super()._get_specific_processing_values(processing_values)
File "/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py", line 36, in _get_specific_processing_values
intent = self._stripe_create_intent()
File "/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py", line 90, in _stripe_create_intent
payload=self._stripe_prepare_payment_intent_payload(),
File "/home/odoo/src/custom/trial/saas_payment_stripe/models/payment_transaction.py", line 73, in _stripe_prepare_payment_intent_payload
**super()._stripe_prepare_payment_intent_payload(**kwargs),
File "/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py", line 176, in _stripe_prepare_payment_intent_payload
payment_intent_payload.update(**self._stripe_prepare_mandate_options())
File "/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py", line 206, in _stripe_prepare_mandate_options
mandate_values = self._get_mandate_values()
File "/home/odoo/src/enterprise/17.0/sale_subscription/models/payment_transaction.py", line 53, in _get_mandate_values
start_datetime = max(
TypeError: '>' not supported between instances of 'datetime.datetime' and 'bool'

The above server error caused the following client error:
RPC_ERROR: Odoo Server Error
RPC_ERROR
at makeErrorFromResponse (https://shop.linuxnewmedia.com/web/assets/4/8f9a553/web.assets_frontend_lazy.min.js:4739:163)
at XMLHttpRequest.<anonymous> (https://shop.linuxnewmedia.com/web/assets/4/8f9a553/web.assets_frontend_lazy.min.js:4743:13)
vak: (Знайка)
Я понимаю, что второй Питон это низзя, ужас-ужас и дурной тон, но что делать, если очень хочется? 😀
На линуксе делаем:
sudo apt install readline-dev libssl-dev
curl -fsSL https://pyenv.run | bash
~/.pyenv/bin/pyenv install 2.7
На маке ещё проще:
brew install pyenv
~/.pyenv/bin/pyenv install 2.7
После чего питон можно вызывать командой:
$ ~/.pyenv/versions/2.7.18/bin/python2
Python 2.7.18 (default, Feb  6 2025, 20:48:01) 
[GCC 13.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> _
vak: (Default)
Лена вяжет и шьёт плед из большого количества разноцветных кусочков. Но подобрать вручную "случайный" узор оказалось непросто. Пришлось сбацать скрипт на Питоне. Примерно такое получается.
vak: (Default)
По BGI необязательно тосковать. Всё-таки в 21-м веке живём. Нынче есть более развитая библиотечка PyGame. Умеет всё то же самое и многое другое. Для пробы, я переиначил демонстрашку "калейдоскоп", написанную Гвидо Гонзато для BGI (изначально на Си, позже на Питоне) на библиотеку PyGame.

Вот как было и как стало:
vak: (Знайка)
Народ обнаружил, что к икейскому датчику качества воздуха VINDRIKTNING можно подпаяться и добавить интеллекта. Подключаем Raspberry Pico или ESP32 и имеем массу удовольствия.

"Hacking IKEA"



vak: (Знайка)
Сляпал на скорую руку скриптик для мака, аналогичный линуксовому 'free'. Показывает состояние памяти. Всего несколько строк на Питоне:

github.com/sergev/vak-opensource/blob/master/languages/python/free.py

Вот так работает:
$ free
Mbytes: total used free active inactive available
Mem: 32768 7377 17776 5854 4855 24504
Swap: 0 0 0
vak: (Default)
(Статья мне показалась интересной, решил перепостить: 10 Python Scripts to Automate Everyday Problems)

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

Fetch IMDB

You probably use IMDB for getting your best movie for a weekend but do you know you can scrap data from IMDB with Python. This automation script will let you automate the IMDb data scraping in a Pythonic way. Below I coded the standard function you can use.
  • You can use it for your IMDB Project
  • Scrap and Analyze Movies Data
  • Finding the Best movie for your Weekend
  • And much more
# IMDB
# pip install imdbpy

import imdb
ia = imdb.IMDb()

# Search for a movie.
search_result = ia.search_movie('The Matrix')

# Get the ID of the movie.
movie_id = search_result[0].movieID

# Get the movie from ID
movie = ia.get_movie(movie_id)

# Get Rating of movie
rating = movie['rating']

# Get Plot of movie
plot = movie['plot']

# Get Genre of movie
genre = movie['genres']

# Get Box office of movie
box_office = movie['box office']

# Get Cast of movie
cast = movie['cast']

# Get Director of movie
director = movie['director']

# Get Writer of movie
writer = movie['writer']

# Search for a person.
search_result = ia.search_person('Keanu Reeves')
+9 )
vak: (Default)
Простое и понятное введение в "черепашью графику" на языке Питон.

http://gvard.github.io/py/turtle/

vak: (Default)
Питон нынче присутствует везде, даже на самых крохотных линуксных девайсах. Но если вы скучаете по функциональщине, вот вам простой Лисп поверх Питона. Называется Hy:

https://docs.hylang.org/en/stable/whyhy.html

Устанавливается командой:
pip3 install --user hy
Вызывается как "hy". Такой себе вполне Лисп, с полным доступом к функциям и библиотекам Питона, и обратно. Поддерживает макросы, питоновские классы и модули. Можно делать автономные скрипты. Пример вычисления чисел Фибоначчи:
(defn fib [n]
(if (< n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))))
(print (fib 30))
Напечатает:
832040
vak: (Default)
Любишь кодить - люби и тестировать. Фундаментальность программистского образования в СССР нивелировалась полным отсутствием представления об организации процесса тестирования, и вообще обеспечения качества программного продукта. Ни в курчатнике, где мы делали операционную систему Демос, ни в ИТМиВТ, с которым мы активно сотрудничали и где разрабатывали штатные ОС и компиляторы для БЭСМ и Эльбрус, не было соответствующей практики наработки тестов и организации регулярного тестирования. А жаль.

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

Pytest представляет собой утилиту, которая вызывается из командной строки и запускает набор тестов Вашей программы. Для этого pytest сканирует присутствующие папки и файлы в них, находит файлы с именами test_*.py, а в них определения процедур с именами вида test_xxx(), и вызывает эти процедуры. На экран выдаётся информация о пройденных тестах. По умолчанию печатается имя файла и дальше точка для каждого успешного теста или F для неуспешного. Скажем, у меня есть файл test_demo.py и в нём десять тестов. Будет выдано следующее:
$ pytest
======================== test session starts =========================
platform darwin -- Python 3.8.4, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
rootdir: /Users/vak/Project/Github/Pytest-Actions-Demo
collected 10 items

test_demo.py .......... [100%]

========================= 10 passed in 0.03s ========================
Если добавить флаг -v, будут выдаваться имена тестов, по одному в строке:
$ pytest -v
======================== test session starts =========================
platform darwin -- Python 3.8.4, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 -- /usr/local/opt/python@3.8/bin/python3.8
cachedir: .pytest_cache
rootdir: /Users/vak/Project/Github/Pytest-Actions-Demo
collected 10 items

test_demo.py::test_fact_0 PASSED [ 10%]
test_demo.py::test_fact_1 PASSED [ 20%]
test_demo.py::test_fact_2 PASSED [ 30%]
test_demo.py::test_fact_3 PASSED [ 40%]
test_demo.py::test_fact_10 PASSED [ 50%]
test_demo.py::test_fact_20 PASSED [ 60%]
test_demo.py::test_fact_30 PASSED [ 70%]
test_demo.py::test_fact_40 PASSED [ 80%]
test_demo.py::test_fact_50 PASSED [ 90%]
test_demo.py::test_fact_minus1 PASSED [100%]

========================= 10 passed in 0.03s ========================
Процедуры тестов содержат операторы assert, проверяющие результат выполнения Вашей программы. Если результат совпадает - тест считается успешным:
def test_fact_3():
assert demo.factorial(3) == 6
Если в одном из тестов обнаружена ошибка, она выдаётся в виде:
============================== FAILURES ==============================
____________________________ test_fact_3 _____________________________

def test_fact_3():
> assert demo.factorial(3) == 7
E assert 6 == 7
E +6
E -7

test_demo.py:24: AssertionError
====================== short test summary info =======================
FAILED test_demo.py::test_fact_3 - assert 6 == 7
==================== 1 failed, 9 passed in 0.06s =====================
Да, я не упомянул: устанавливается pytest командой "pip install pytest". А если добавить к нему ещё и "pip3 install pytest-xdist", то у pytest появится флаг "-nauto", запускающий тесты впараллель на всех доступных процессорах компьютера. Это заметно ускоряет процесс. К примеру у меня на работе в одном из проектов имеется больше 600 тестов, и полный прогон (на одном процессоре) занимает около 15 минут. С флагом же "-nauto" задействуется 16 процессоров моего MacBook Pro, и тестирование ускоряется до 5 минут.

Это базовый минимум. Но в pytest есть куча полезных фич, помогающих в разработке тестов. Рекомендую книжку, где все возможности подробно описаны: "Python Testing with pytest".



Пример проекта с pytest смотрите на Гитхабе: https://github.com/sergev/Pytest-Actions-Demo
vak: (Default)
Если вы собираетесь начать разрабатывать программу на языке Питон - вот заготовка, с которой можно стартовать: https://github.com/sergev/Pytest-Actions-Demo

Клонируете проект к себе и наполняете содержанием. В заготовке задействованы автоматическая проверка кода утилитой flake8 и тестирование посредством pytest. Автоматизация выполнена через сервис Github Actions. Скрипт .github/workflows/pytest.yml содержит задание для Actions запускать flake8 и pytest каждый раз, когда приходит очередное изменение. Причём тестируются заданные версии Питона, а именно 2.7 и 3.8.

Конечно, всегда лучше запускать flake8 и pytest локально, перед отправкой изменений в Github. Но удобно, что результаты тестирования копятся на сервере и всегда доступны для просмотра (здесь).

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



Есть аналогичная заготовка для Питона с автоматизацией, но для Битбакета: https://vak.dreamwidth.org/658470.html