me = asyncio.current_task()
try:
...
except asyncio.CancelledError:
...
# задача решила, что всё-таки не должна отменяться
me.uncancel() # уменьшаем счётчик отмен
if me.cancelling() > 0: # если остались другие причины отмены
raise # CancelledError продолжает лететь
сложная статья. А можете сказать, я правильно обрабатываю CancelledError? я CancelledError отдаю в exit_stack.__aexit__, он её обрабатывает и кидает уже осмысленную ошибку
import asyncio
from aioconsole import ainput
from contextlib import AsyncExitStack
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
MCP_SERVER_URL = "http://localhost:3001/mcp"
async def open_connection(exit_stack: AsyncExitStack):
try:
read_stream, write_stream, _ = await exit_stack.enter_async_context(
streamablehttp_client(MCP_SERVER_URL)
)
session = await exit_stack.enter_async_context(
ClientSession(read_stream, write_stream)
)
await session.initialize()
return session
except BaseException as exc:
exc = await emergency_close_connection(exit_stack, exc)
print(f"Не удалось подключиться к {MCP_SERVER_URL}: {exc!r}")
return None
async def emergency_close_connection(exit_stack: AsyncExitStack, exc: BaseException) -> BaseException:
# Отдаём исключение в exit_stack.__aexit__, а не просто зовём aclose() -
# иначе task group внутри streamablehttp_client не поймёт, что отмена уже
# обработана, и поднимет исходную ошибку ещё раз при закрытии.
try:
await exit_stack.__aexit__(type(exc), exc, exc.__traceback__)
except BaseException as cleanup_exc:
exc = cleanup_exc
if isinstance(exc, BaseExceptionGroup):
return exc.exceptions[0]
else:
raise exc
async def close_connection(exit_stack: AsyncExitStack):
await exit_stack.aclose()
async def main():
exit_stack = AsyncExitStack()
session = await open_connection(exit_stack)
while True:
user_input = input('\nВы: ')
if user_input == 'exit':
break
if session is not None:
try:
tools = await session.list_tools()
for tool in tools.tools:
print(tool.name)
except BaseException as exc:
exc = await emergency_close_connection(exit_stack, exc)
print(f"server disconnected {MCP_SERVER_URL}: {exc!r}")
session = None
await close_connection(exit_stack)
asyncio.run(main())
Я устал от этого дурацкого плагина Fit, в котором постоянно ошибки, и выяснил, что на телефоне можно использовать непосредственно плагин Git. На телефоне он использует isomorphic-git (урезанную реализацию git на js), которая может делать push/pull/commit. А инициализацию репозитория на телефоне надо сделать 1 раз через Termux.
Для параноиков: плагины obsidian могут исполнять произвольный код на компе, а т.к. сейчас модно создавать ssh-ключ, закидывать его на гитхаб и делать git push без пароля, то создать "продвинутый" токен недостаточно. Чтобы защитить гитхаб от обсидиана можно например сделать ssh-ключ с паролем. (И при каждом git push вводить пароль, который будет расшифровывать закрытый ключ для дальнейшего его использования).
вот одна из причин этой ошибки: в репозитории присутствуют файлы, содержащие ?*: или совпадающие с каким-нибудь расширением типа .md. Оказывается такие файлы нельзя создавать в файловой системе андроида. Выяснил после того как попытался склонировать репозиторий через termux.
а как сделать то же самое, что и ipywidgets, только при помощи html/javascript, чтобы в дальнейшем это можно было оформить как отдельную веб-морду без юпитер-ноутбука (но сначала чтобы она была в юпитер-ноутбуке)? Ну HTML/javasctipt можно отобразить при помощи display(HTML(...)), и наверно еще понадобится запустить маленький веб-сервер, чтобы он принимал сигналы из HTML и менял питонские переменные, и как-то всё это подружить...
Все элементы все равно располагаются на турбинах так же как в статье все располагается на дифференциалах.
Скорость — это скорость или расход жидкости, который напрямую конвертируется в скорость турбины.
Потенциал — давление,
Напряжение — сила или разность давлений, которая напрямую конвертируется в силу, с которой турбина взаимодействует с тем, что к ней прикреплено.
А турбину считаем идеальной, без трения и проскальзывания жидкости.
1.ОК,3.ОК, давай моделировать при с==1.
2. но моделировать амплитуды синусоидальных сигналов мгновенными величинами (или наоборот) — это какая-то лажа получается.
Я вот думаю, опять во вращательной механике, но где U — F — момент сил, а I — v — угловая скорость, если взять такую конструкцию
то она будет описываться уравнением
это конечно не то, что нужно но уже ближе.
а, ну да, в разделе “uncancel и вложенные таймауты” про это уже сказано
насколько применим такой подход?
сложная статья. А можете сказать, я правильно обрабатываю CancelledError? я CancelledError отдаю в
exit_stack.__aexit__, он её обрабатывает и кидает уже осмысленную ошибкунапример когда плагин git не может закоммитить большой файл, он просто говорит об этом => открываешь termux и за пару команд всё поправляешь.
когда fit чего-то не может - он просто ломается и приходится перенастраивать весь obsidian заново
Я устал от этого дурацкого плагина Fit, в котором постоянно ошибки, и выяснил, что на телефоне можно использовать непосредственно плагин Git. На телефоне он использует isomorphic-git (урезанную реализацию git на js), которая может делать push/pull/commit. А инициализацию репозитория на телефоне надо сделать 1 раз через Termux.
Для параноиков: плагины obsidian могут исполнять произвольный код на компе, а т.к. сейчас модно создавать ssh-ключ, закидывать его на гитхаб и делать
git pushбез пароля, то создать "продвинутый" токен недостаточно. Чтобы защитить гитхаб от обсидиана можно например сделать ssh-ключ с паролем. (И при каждомgit pushвводить пароль, который будет расшифровывать закрытый ключ для дальнейшего его использования).вот одна из причин этой ошибки: в репозитории присутствуют файлы, содержащие
?*:или совпадающие с каким-нибудь расширением типа.md. Оказывается такие файлы нельзя создавать в файловой системе андроида. Выяснил после того как попытался склонировать репозиторий через termux.а как сделать то же самое, что и ipywidgets, только при помощи html/javascript, чтобы в дальнейшем это можно было оформить как отдельную веб-морду без юпитер-ноутбука (но сначала чтобы она была в юпитер-ноутбуке)? Ну HTML/javasctipt можно отобразить при помощи display(HTML(...)), и наверно еще понадобится запустить маленький веб-сервер, чтобы он принимал сигналы из HTML и менял питонские переменные, и как-то всё это подружить...
Компилируем, запускаем
запускаем
нажимаем End, любуемся
есть
со скриншотами
а это случайно не бэктрекинг?
В примере
помоему все же не классический конечный автомат: его вид динамически меняется в зависимости от того, какой путь ты уже прошел.
надо заменить на δ’(p0, aaax) = δ(δ’(p0, aaa), x) = δ(p5, x) = p4
Следуя логике статьи конечным идеальным ЯП будет unlambda.
Там даже от лямбда-абстракции отказались!
Да что греха таить, даже от переменных/констант!
Скорость — это скорость или расход жидкости, который напрямую конвертируется в скорость турбины.
Потенциал — давление,
Напряжение — сила или разность давлений, которая напрямую конвертируется в силу, с которой турбина взаимодействует с тем, что к ней прикреплено.
А турбину считаем идеальной, без трения и проскальзывания жидкости.
2. но моделировать амплитуды синусоидальных сигналов мгновенными величинами (или наоборот) — это какая-то лажа получается.
Я вот думаю, опять во вращательной механике, но где U — F — момент сил, а I — v — угловая скорость, если взять такую конструкцию
то она будет описываться уравнением
это конечно не то, что нужно но уже ближе.