Pull to refresh

Comments 19

Последняя демка выглядит особенно круто.

Жду продолжения!

Спасибо! Над продолжением уже начал работу 😅

Сам с Lisp'ом не работаю, но было интересно читать. Жду продолжения)

Да, у меня давно чешутся руки изучить Abuse поподробнее.

По поводу геймджемов, на itch.io дважды в год проводится Lisp Game Jam, в котором можно участвовать на любом диалекте, хоть на Common Lisp, хоть на Clojure, хоть на Fennel с Löve2D. По совпадению, осенний Lisp Game Jam 2023 начался буквально сегодня утром, к нему ещё можно присоединиться 😊

Выглядит прикольно, спасибо!

Замечу только, что у меня при попытке воспроизвести пример возникли проблемы с системой pull. Пока не переименовал биндинг acceleration внутри let в accel-value, получал только здоровый стектрейс при запуске. Я не специалист по CL, и в теории кажется, что let должен позволять "перекрывать" внешний биндинг локальным, - но всё же у меня тут возникал конфликт имён, кажется. Стоило бы проверить это место в статье.

Заинтересовали также такие вопросы:

  1. Видно, что код отдельных компонентов и систем довольно хорошо отделён друг от друга. Это неплохо. Однако остаётся здоровенная склейка в функции init, где мы вынуждены инициализировать все объекты. Чем больше разных типов объектов появляется здесь, тем монструознее станет код. Как обычно решается эта проблема? Наверняка есть более-менее стандартные решения.

  2. Запускать код из REPL или редактора во время разработки весело и удобно, а как потом эту радость упаковывать в дистрибутив для конечного пользователя? Теоретически-то оно понятно, конечно: собираем в одно место сишечные либы, собираем рядышком лисповые либы (или даже компилируем?), делаем какой-то лаунчер для запуска этой радости. Существуют ли готовые решения для подобной упаковки?

  3. В процессе работы над примером я несколько раз ловил стектрейсы из-за собственных ошибок (неправильно указал имя файла, не там скобочку поставил в коде и т.п.). Каждый раз это приводило к показу здоровенного диалогового окошка с кучей страшных надписей. Понятно, что конечному пользователю это показывать не следует. Как обычно бывает устроена обработка ошибок в "пользовательской сборке" продукта?

Пожалуйста 🤗

По биндингу — вы правы, let "перекрывает" внешние биндинги локальными, однако, парадоксальным образом, для компонента по имени acceleration не создаётся ни одного биндинга по имени acceleration 😅 Если не трудно и есть время, скиньте куда-нибудь ругань SBCL с непереименованным биндингом, попробуем разобраться, что там не так.

  1. Да, init в коде похож на небольшую свалку 😅 Обычно способ, которым решают эту проблему — это что-то в духе префабов, т.е. параметры компонентов, сериализованные в файл/файлы. На самом деле тут можно заабьюзить возможность Лиспа мешать код с данными и загружать списки-спецификации объектов из файлов с помощью стандартной функции load, а затем скармливать их в ecs:make-object; примерно так я поступил в одном из проектов на базе cl-fast-ecs. В первой части руководства я ради простоты захардкодил инициализацию всех объектов.

  2. Да, есть целый ряд решений. Более того, в мой шаблон cookiecutter-lisp-game входит машинерия по сборке проекта (точка входа в неё — скрипт package.sh), на данный момент поддерживаются Windows и Linux (над MacOS буду работать в ближайшие пару недель). Более того, эта машинерия автоматически запускается при пуше в репозиторий тэга и радует вас готовыми бинарниками в секции Releases ^_^

  3. Скорее всего, вы не пользовались IDE. В том же самом Emacs ошибка приводит к появлению интерфейса интерактивной обработки ошибки, который выглядит примерно так. Опять-таки, одна из уникальных фичей CL — невероятно мощная система обработки ошибок, про неё целая книга недавно вышла. Можно программно выбирать обработку конкретных ошибок в зависимости от текущих условий, можно пытаться повторять выполнить тот же код, повторно вызывать сбойнувшие функции с другими аргументами, игнорировать ошибки и т.д. Я просто выбрал самое примитивное — показать окошко с бэктрейсом и аварийно завершиться, но можно легко закодировать более продвинутые варианты, например, отправить отчёт об ошибке, перезапустить текущий уровень, буквально всё, что душа пожелает)

Спасибо, отличный туториал

Пытаюсь запустить на macos sonoma 14.0 и у меня ошибка )

При первом вызове (ecs-tutorial-1:main)

в консоли:

CORRUPTION WARNING in SBCL pid 23700 pthread 0x7000058be000:
Memory fault at 0x0 (pc=0x5adfcfa, fp=0x7000058bd4d0, sp=0x7000058bd4b0) pthread 0x7000058be000
The integrity of this image is possibly compromised.
Continuing with fingers crossed.

Единственное, что сделал не по инструкции - загрузил allegro

brew install allegro 

и libffi

brew install libffi

и соответственно ничего не компилировал

Пожалуйста!

Судя по всему, вы всё сделали правильно, но совместимость с MacOS я пока не проверял из-за отсутсвия соответствующего железа. Однако она у меня находится в ближайших планах 😊

Выглядит ошибка странно, ничего криминального в вызове al_load_config_file с несуществующим конфигом нет. А попробуйте в каталоге проекта создать пустой текстовый файл config.cfg, возможно, поможет.

Скорее всего, у вас какая-то другая ошибка, там что-то хтоническое всплывает из недр самого SBCL, а у вас совершенно определённо крэш в вызове сишной функции al_load_config_file, хотя чему там крэшиться, мне совершенно неясно 😅

Остаётся только порекомендовать запустить из-под Virtualbox с какой-нибудь Ubuntu, у меня в виртуалке с VMSVGA драйвером всё вполне себе бодро бегало (собственно, скриншоты в статье как раз из-под этой виртуалки). Ну или подождать пару недель, пока у меня дойдут руки до облачной виртуалки с MacOS, чтобы зафиксить все проблемы совместимости)

Попробую сделать в виртуальной машине, что-то не так, пришлось отступать от инструкции (то гита не было в чистой убунте, то cookiecutter не установился из питона - pip нет, установил через sudo apt-get install cookiecutter)

сообщения с ошибками

user@lisp:~/Documents/lisp/ecs-tutorial-1/src$ sbcl
This is SBCL 2.1.11.debian, an implementation of ANSI Common Lisp.
More information about SBCL is available at http://www.sbcl.org/.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.

  • (ql:quickload :ecs-tutorial-1) While evaluating the form starting at line 1, column 0 of #P"/home/user/Documents/lisp/ecs-tutorial-1/ecs-tutorial-1.asd": ; ; compilation unit aborted ; caught 1 fatal ERROR condition To load "deploy": Load 4 ASDF systems: alexandria asdf trivial-features uiop Install 5 Quicklisp releases: babel cffi deploy documentation-utils trivial-indent

debugger invoked on a SB-BSD-SOCKETS:OPERATION-TIMEOUT-ERROR in thread
#<THREAD "main thread" RUNNING {1005044233}>:
Socket error in "connect": ETIMEDOUT (Connection timed out)

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT ] Give up on "deploy"
1: Give up on "ecs-tutorial-1"
2: [REGISTER-LOCAL-PROJECTS] Register local projects and try again.
3: Exit debugger, returning to top level.

(SB-BSD-SOCKETS:SOCKET-ERROR "connect" 110)
error finding frame source: Bogus form-number: the source file has probably
changed too much to cope with.
source: NIL
0] 1
(:ECS-TUTORIAL-1)

  • (ecs-tutorial-1:main)

debugger invoked on a SB-INT:SIMPLE-READER-PACKAGE-ERROR in thread
#<THREAD "main thread" RUNNING {1005044233}>:
Package ECS-TUTORIAL-1 does not exist.

Stream: #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {100001B513}>

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [CONTINUE ] Use the current package, COMMON-LISP-USER.
1: [RETRY ] Retry finding the package.
2: [USE-VALUE] Specify a different package
3: [UNINTERN ] Read the symbol as uninterned.
4: [SYMBOL ] Specify a symbol to return
5: [ABORT ] Exit debugger, returning to top level.

(SB-IMPL::READER-FIND-PACKAGE "ECS-TUTORIAL-1" #<SYNONYM-STREAM :SYMBOL SB-SYS:STDIN {100001B513}> T)
0] 1

debugger invoked on a SB-INT:SIMPLE-READER-PACKAGE-ERROR in thread
#<THREAD "main thread" RUNNING {1005044233}>:
Package ECS-TUTORIAL-1 does not exist.

Stream: #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {100001B513}>

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [CONTINUE ] Use the current package, COMMON-LISP-USER.
1: [RETRY ] Retry finding the package.
2: [USE-VALUE] Specify a different package
3: [UNINTERN ] Read the symbol as uninterned.
4: [SYMBOL ] Specify a symbol to return
5: [ABORT ] Exit debugger, returning to top level.

(SB-IMPL::READER-FIND-PACKAGE "ECS-TUTORIAL-1" #<SYNONYM-STREAM :SYMBOL SB-SYS:STDIN {100001B513}> T)
0] 5
*
debugger invoked on a SB-INT:SIMPLE-READER-ERROR in thread
#<THREAD "main thread" RUNNING {1005044233}>:
unmatched close parenthesis

Stream: #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {100001B513}>

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.

(SB-IMPL::READ-RIGHT-PAREN #<SYNONYM-STREAM :SYMBOL SB-SYS:STDIN {100001B513}> #)
0] 0

  • exit

debugger invoked on a UNBOUND-VARIABLE @52B4AF39 in thread
#<THREAD "main thread" RUNNING {1005044233}>:
The variable EXIT is unbound.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [CONTINUE ] Retry using EXIT.
1: [USE-VALUE ] Use specified value.
2: [STORE-VALUE] Set specified value and use it.
3: [ABORT ] Exit debugger, returning to top level.

(SB-INT:SIMPLE-EVAL-IN-LEXENV EXIT #)
0] 3

  • (exit) user@lisp:~/Documents/lisp/ecs-tutorial-1/src$ sbcl This is SBCL 2.1.11.debian, an implementation of ANSI Common Lisp. More information about SBCL is available at http://www.sbcl.org/.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.

debugger invoked on a SB-BSD-SOCKETS:OPERATION-TIMEOUT-ERROR in thread
#<THREAD "main thread" RUNNING {1005044233}>:
Socket error in "connect": ETIMEDOUT (Connection timed out)

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT ] Give up on "deploy"
1: Give up on "ecs-tutorial-1"
2: [REGISTER-LOCAL-PROJECTS] Register local projects and try again.
3: Exit debugger, returning to top level.

(SB-BSD-SOCKETS:SOCKET-ERROR "connect" 110) error finding frame source: Bogus form-number: the source file has probably changed too much to cope with. source: NIL 0] 2 While evaluating the form starting at line 1, column 0 of #P"/home/user/Documents/lisp/ecs-tutorial-1/ecs-tutorial-1.asd": ; ; compilation unit aborted ; caught 1 fatal ERROR condition To load "deploy": Load 5 ASDF systems: alexandria asdf documentation-utils trivial-features uiop Install 3 Quicklisp releases: babel cffi deploy ; Fetching #<URL "http://beta.quicklisp.org/archive/babel/2023-02-14/babel-20230214-git.tgz"> ; 267.55KB

273,967 bytes in 0.12 seconds (2302.80KB/sec) ; Fetching #<URL "http://beta.quicklisp.org/archive/cffi/2023-10-21/cffi-20231021-git.tgz"> ; 257.22KB

263,396 bytes in 0.11 seconds (2293.01KB/sec) ; Fetching #<URL "http://beta.quicklisp.org/archive/deploy/2023-10-21/deploy-20231021-git.tgz"> ; 19.21KB

19,676 bytes in 0.00 seconds (0.00KB/sec) ; Loading "deploy" [package babel-encodings]......................... [package babel]................................... .................................................. [package cffi-sys]................................ [package cffi-features]........................... [package cffi].................................... .................................................. [package trivial-indent].......................... [package documentation-utils]..................... [package deploy]...... To load "ecs-tutorial-1": Load 1 ASDF system: ecs-tutorial-1 ; Loading "ecs-tutorial-1" To load "cl-liballegro": Load 8 ASDF systems: asdf bordeaux-threads cffi cffi-libffi documentation-utils trivial-features trivial-garbage trivial-gray-streams Install 6 Quicklisp releases: array-utils cl-liballegro dissect float-features simple-tasks trivial-main-thread ; Fetching #<URL "http://beta.quicklisp.org/archive/dissect/2023-10-21/dissect-20231021-git.tgz"> ; 28.68KB

29,368 bytes in 0.00 seconds (7162.76KB/sec)

debugger invoked on a SB-BSD-SOCKETS:OPERATION-TIMEOUT-ERROR in thread
#<THREAD "main thread" RUNNING {1001834363}>:
Socket error in "connect": ETIMEDOUT (Connection timed out)

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT ] Give up on "cl-liballegro"
1: Give up on "ecs-tutorial-1"
2: [REGISTER-LOCAL-PROJECTS] Register local projects and try again.
3: Exit debugger, returning to top level.

(SB-BSD-SOCKETS:SOCKET-ERROR "connect" 110) error finding frame source: Bogus form-number: the source file has probably changed too much to cope with. source: NIL 0] 2 To load "ecs-tutorial-1": Load 1 ASDF system: ecs-tutorial-1 ; Loading "ecs-tutorial-1" To load "cl-liballegro": Load 9 ASDF systems: asdf bordeaux-threads cffi cffi-libffi dissect documentation-utils trivial-features trivial-garbage trivial-gray-streams Install 5 Quicklisp releases: array-utils cl-liballegro float-features simple-tasks trivial-main-thread ; Fetching #<URL "http://beta.quicklisp.org/archive/array-utils/2023-10-21/array-utils-20231021-git.tgz"> ; 6.76KB

6,926 bytes in 0.00 seconds (0.00KB/sec)

debugger invoked on a SB-BSD-SOCKETS:OPERATION-TIMEOUT-ERROR in thread
#<THREAD "main thread" RUNNING {1001834363}>:
Socket error in "connect": ETIMEDOUT (Connection timed out)

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT ] Give up on "cl-liballegro"
1: Give up on "ecs-tutorial-1"
2: [REGISTER-LOCAL-PROJECTS] Register local projects and try again.
3: Exit debugger, returning to top level.

(SB-BSD-SOCKETS:SOCKET-ERROR "connect" 110)
error finding frame source: Bogus form-number: the source file has probably
changed too much to cope with.
source: NIL
0] 2
To load "ecs-tutorial-1":
Load 1 ASDF system:
ecs-tutorial-1
; Loading "ecs-tutorial-1"
To load "cl-liballegro":
Load 10 ASDF systems:
array-utils asdf bordeaux-threads cffi cffi-libffi
dissect documentation-utils trivial-features
trivial-garbage trivial-gray-streams
Install 4 Quicklisp releases:
cl-liballegro float-features simple-tasks
trivial-main-thread

debugger invoked on a SB-BSD-SOCKETS:OPERATION-TIMEOUT-ERROR in thread
#<THREAD "main thread" RUNNING {1001834363}>:
Socket error in "connect": ETIMEDOUT (Connection timed out)

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT ] Give up on "cl-liballegro"
1: Give up on "ecs-tutorial-1"
2: [REGISTER-LOCAL-PROJECTS] Register local projects and try again.
3: Exit debugger, returning to top level.

(SB-BSD-SOCKETS:SOCKET-ERROR "connect" 110) error finding frame source: Bogus form-number: the source file has probably changed too much to cope with. source: NIL 0] 2 To load "ecs-tutorial-1": Load 1 ASDF system: ecs-tutorial-1 ; Loading "ecs-tutorial-1" To load "cl-liballegro": Load 10 ASDF systems: array-utils asdf bordeaux-threads cffi cffi-libffi dissect documentation-utils trivial-features trivial-garbage trivial-gray-streams Install 4 Quicklisp releases: cl-liballegro float-features simple-tasks trivial-main-thread ; Fetching #<URL "http://beta.quicklisp.org/archive/simple-tasks/2023-10-21/simple-tasks-20231021-git.tgz"> ; 12.17KB

12,462 bytes in 0.00 seconds (0.00KB/sec) ; Fetching #<URL "http://beta.quicklisp.org/archive/trivial-main-thread/2023-10-21/trivial-main-thread-20231021-git.tgz"> ; 5.93KB

6,070 bytes in 0.00 seconds (0.00KB/sec)

debugger invoked on a SB-BSD-SOCKETS:OPERATION-TIMEOUT-ERROR in thread
#<THREAD "main thread" RUNNING {1001834363}>:
Socket error in "connect": ETIMEDOUT (Connection timed out)

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT ] Give up on "cl-liballegro"
1: Give up on "ecs-tutorial-1"
2: [REGISTER-LOCAL-PROJECTS] Register local projects and try again.
3: Exit debugger, returning to top level.

(SB-BSD-SOCKETS:SOCKET-ERROR "connect" 110) error finding frame source: Bogus form-number: the source file has probably changed too much to cope with. source: NIL 0] 2 To load "ecs-tutorial-1": Load 1 ASDF system: ecs-tutorial-1 ; Loading "ecs-tutorial-1" To load "cl-liballegro": Load 8 ASDF systems: asdf cffi cffi-libffi documentation-utils trivial-features trivial-garbage trivial-gray-streams trivial-main-thread Install 2 Quicklisp releases: cl-liballegro float-features ; Fetching #<URL "http://beta.quicklisp.org/archive/float-features/2023-10-21/float-features-20231021-git.tgz"> ; 11.27KB

11,540 bytes in 0.00 seconds (0.00KB/sec) ; Fetching #<URL "http://beta.quicklisp.org/archive/cl-liballegro/2023-10-21/cl-liballegro-20231021-git.tgz"> ; 54.73KB

56,039 bytes in 0.17 seconds (316.85KB/sec)
; Loading "cl-liballegro"

; pkg-config libffi --cflags

; cc -o /home/user/.cache/common-lisp/sbcl-2.1.11.debian-linux-x64/home/user/quicklisp/dists/quicklisp/software/cffi-20231021-git/libffi/libffi-types__grovel-tmpWFQA38F3.o -c -g -O2 -ffile-prefix-map=/build/sbcl-rxgrSo/sbcl-2.1.11=. -fstack-protector-strong -Wformat -Werror=format-security -g -Wall -Wundef -Wsign-compare -Wpointer-arith -O3 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Wunused-parameter -fno-omit-frame-pointer -momit-leaf-frame-pointer -fPIC -I/home/user/quicklisp/dists/quicklisp/software/cffi-20231021-git/ /home/user/.cache/common-lisp/sbcl-2.1.11.debian-linux-x64/home/user/quicklisp/dists/quicklisp/software/cffi-20231021-git/libffi/libffi-types__grovel.c /home/user/.cache/common-lisp/sbcl-2.1.11.debian-linux-x64/home/user/quicklisp/dists/quicklisp/software/cffi-20231021-git/libffi/libffi-types__grovel.c: In function ‘main’: /home/user/.cache/common-lisp/sbcl-2.1.11.debian-linux-x64/home/user/quicklisp/dists/quicklisp/software/cffi-20231021-git/libffi/libffi-types__grovel.c:12:7: warning: unused variable ‘autotype_tmp’ [-Wunused-variable] 12 | int autotype_tmp; | ^~~~~~~~~~~~ ; cc -o /home/user/.cache/common-lisp/sbcl-2.1.11.debian-linux-x64/home/user/quicklisp/dists/quicklisp/software/cffi-20231021-git/libffi/libffi-types__grovel-tmpSN3PDQTY -g -Wl,--export-dynamic /home/user/.cache/common-lisp/sbcl-2.1.11.debian-linux-x64/home/user/quicklisp/dists/quicklisp/software/cffi-20231021-git/libffi/libffi-types__grovel.o ; /home/user/.cache/common-lisp/sbcl-2.1.11.debian-linux-x64/home/user/quicklisp/dists/quicklisp/software/cffi-20231021-git/libffi/libffi-types__grovel /home/user/.cache/common-lisp/sbcl-2.1.11.debian-linux-x64/home/user/quicklisp/dists/quicklisp/software/cffi-20231021-git/libffi/libffi-types__grovel.grovel-tmp.lisp .................................................. [package array-utils]............................. [package dissect]................................. [package simple-tasks]............................ [package trivial-main-thread]..................... [package float-features].......................... [package cl-liballegro]........................... .................................................. ..... To load "ecs-tutorial-1": Load 1 ASDF system: ecs-tutorial-1 ; Loading "ecs-tutorial-1" To load "cl-liballegro-nuklear": Load 4 ASDF systems: cffi cffi-libffi cl-liballegro trivial-features Install 1 Quicklisp release: cl-liballegro-nuklear ; Fetching #<URL "http://dist.luckylambda.technology/releases/archives/cl-liballegro-nuklear/cl-liballegro-nuklear-9ade527a6f6d0a69807c44f8fe0ab9fd0a1b911a.tgz"> ; 578.08KB

591,958 bytes in 0.13 seconds (4505.51KB/sec)
; Loading "cl-liballegro-nuklear"
[package cl-liballegro-nuklear]...................
..................................................

To load "ecs-tutorial-1": Load 1 ASDF system: ecs-tutorial-1 ; Loading "ecs-tutorial-1" To load "livesupport": Load 1 ASDF system: asdf Install 1 Quicklisp release: livesupport ; Fetching #<URL "http://beta.quicklisp.org/archive/livesupport/2019-05-21/livesupport-release-quicklisp-71e6e412-git.tgz"> ; 2.87KB

2,939 bytes in 0.00 seconds (0.00KB/sec)
; Loading "livesupport"
[package livesupport]
To load "ecs-tutorial-1":
Load 1 ASDF system:
ecs-tutorial-1
; Loading "ecs-tutorial-1"
[package ecs-tutorial-1]
(:ECS-TUTORIAL-1)
*

Судя по ошибкам, у вас была какая-то сетевая проблема с доступом к сайту Quicklisp http://beta.quicklisp.org . Стоило бы выбрать рестарт Retry (ну или, точнее, "Register local projects and try again", ключевые слова try again), чтобы просто повторить попытку загрузки.

А сколько нужно выделить под гостевую ОС, чтобы FPS были по-больше?

Я выделил 8 гигов памяти, 6 процессоров, 1280х800, масштабирование 200%, установил i3wm (Unity заметно лагал) и все-равно что-то не очень

Рад, что получилось!

FPS под вируталкой, я боюсь, зависит от софтверных настроек видеодрайвера самой виртуалки и не лечится изменением доступной RAM или процессорного ресурса. У меня быстрее всего работало с драйвером VMSVGA в Virtualbox.

Увы, у меня точно такая же проблема, что и у предыдущего докладчика. Всё усугубляется тем, что процессор M2 — свежий и ARM64. Но вы пишите, пожалуйста, дальше, я буду читать и завидовать.

Спасибо за фидбек!

Обязательно на следующей неделе первым делом возьмусь за макось)

Sign up to leave a comment.

Articles