vak: (Знайка)
Ответ на настоящее время: 20421 штука.

Вот скрипт на Питоне, который извлекает из базы UniProt/SwissProt полный список известных протеинов человеческого организма: extract_human_swissprot_proteins.py

Результат записывается в файл human_swissprot_proteins.tsv. Для каждого протеина указывается идентификатор, описание и название гена. К примеру, отыщем всё, связанное с инсулином:
$ grep -i insulin human_swissprot_proteins.tsv
F8WCM5 Insulin, isoform 2 INS-IGF2
O00425 Insulin-like growth factor 2 mRNA-binding protein 3 IGF2BP3
O14654 Insulin receptor substrate 4 IRS4
O15503 Insulin-induced gene 1 protein INSIG1
P01308 Insulin INS
P01344 Insulin-like growth factor 2 IGF2
P05019 Insulin-like growth factor 1 IGF1
P06213 Insulin receptor INSR
P08069 Insulin-like growth factor 1 receptor IGF1R
P08833 Insulin-like growth factor-binding protein 1 IGFBP1
P09565 Putative insulin-like growth factor 2-associated protein N/A
P14616 Insulin receptor-related protein INSRR
P14735 Insulin-degrading enzyme IDE
P17936 Insulin-like growth factor-binding protein 3 IGFBP3
P18065 Insulin-like growth factor-binding protein 2 IGFBP2
P22692 Insulin-like growth factor-binding protein 4 IGFBP4
P24592 Insulin-like growth factor-binding protein 6 IGFBP6
P24593 Insulin-like growth factor-binding protein 5 IGFBP5
P35568 Insulin receptor substrate 1 IRS1
P35858 Insulin-like growth factor-binding protein complex acid labile subunit IGFALS
P51460 Insulin-like 3 INSL3
P61371 Insulin gene enhancer protein ISL-1 ISL1
Q01101 Insulinoma-associated protein 1 INSM1
Q14641 Early placenta insulin-like peptide INSL4
Q16270 Insulin-like growth factor-binding protein 7 IGFBP7
Q6B9Z1 Insulin growth factor-like family member 4 IGFL4
Q6U949 Putative insulin-like growth factor 2 antisense gene protein IGF2-AS
Q6UW32 Insulin growth factor-like family member 1 IGFL1
Q6UWQ7 Insulin growth factor-like family member 2 IGFL2
Q6UXB1 Insulin growth factor-like family member 3 IGFL3
Q86XT9 Insulin-like growth factor-binding protein 3 receptor TMEM219
Q8TDV5 Glucose-dependent insulinotropic receptor GPR119
Q8WX77 Insulin-like growth factor-binding protein-like 1 IGFBPL1
Q96A47 Insulin gene enhancer protein ISL-2 ISL2
Q96T92 Insulinoma-associated protein 2 INSM2
Q9NZI8 Insulin-like growth factor 2 mRNA-binding protein 1 IGF2BP1
Q9Y4H2 Insulin receptor substrate 2 IRS2
Q9Y581 Insulin-like peptide INSL6 INSL6
Q9Y5Q6 Insulin-like peptide INSL5 INSL5
Q9Y5U4 Insulin-induced gene 2 protein INSIG2
Q9Y6M1 Insulin-like growth factor 2 mRNA-binding protein 2 IGF2BP2
А вот скрипт, показывающий структуру указанного протеина: get_protein_sequence.py. Опробуем на инсулине:
$ python3 get_protein_sequence.py P01308
Fetching protein sequence for UniProt accession: P01308
UniProt data retrieved for P01308: Insulin
Saved sequence to protein_sequences.fasta

$ cat protein_sequences.fasta
>P01308 | Insulin | UniProt Protein Sequence
MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAEDLQVGQVELGGGPGAGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN
Каждая буква обозначает аминокислоту:
  • A - Аланин
  • C - Цистеин
  • D - Аспарагиновая кислота
  • E - Глутаминовая кислота
  • F - Фенилаланин
  • G - Глицин
  • H - Гистидин
  • I - Изолейцин
  • K - Лизин
  • L - Лейцин
  • M - Метионин
  • N - Аспарагин
  • P - Пролин
  • Q - Глутамин
  • R - Аргинин
  • S - Серин
  • T - Треонин
  • V - Валин
  • W - Триптофан
  • Y - Тирозин
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