mastodon.world is one of the many independent Mastodon servers you can use to participate in the fediverse.
Generic Mastodon server for anyone to use.

Server stats:

9.3K
active users

#grasp

0 posts0 participants0 posts today
Habr<p>Разбираем архитектуру. Часть 1. Чистая архитектура и её корни: история и взаимосвязи</p><p>Предисловие Цель этой статьи - объединить и кратко изложить все базовые архитектурные подходы: их терминологию, концепции и отличительные черты. Собрать всё воедино, чтобы можно было относительно быстро вникнуть в основы. Я решил написать серию статей, посвящённых различным аспектам проектирования программных систем, но первоначальной идеей было показать архитектурное решение моего pet-проекта на FastAPI — пример реализации «чистой архитектуры» с использованием современного стека: Python3.13, FastAPI, Uvicorn, Nginx, PostgreSQL, Alembic, Celery, Redis, Pytest, Filebeat, Logstash, Elasticsearch, Kibana, Prometheus, Grafana, Docker и Docker Compose. Однако по мере проработки деталей стало очевидно: чтобы обсуждать структуру приложения предметно и аргументированно, необходимо сначала заложить общую теоретическую основу, чтобы читатель понимал, о чем речь. Так родилась идея вынести базовые концепции архитектуры и проектирования в отдельную публикацию — не перегружать материал сразу всем, а построить серию объёмных, но логично связанных статей.</p><p><a href="https://habr.com/ru/articles/905148/" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">habr.com/ru/articles/905148/</span><span class="invisible"></span></a></p><p><a href="https://zhub.link/tags/%D1%87%D0%B8%D1%81%D1%82%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>чистая_архитектура</span></a> <a href="https://zhub.link/tags/%D1%87%D0%B8%D1%81%D1%82%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>чистый_код</span></a> <a href="https://zhub.link/tags/%D0%BE%D0%BE%D0%BF" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ооп</span></a> <a href="https://zhub.link/tags/%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>проектирование_систем</span></a> <a href="https://zhub.link/tags/%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>терминология</span></a> <a href="https://zhub.link/tags/%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>шаблоны_проектирования</span></a> <a href="https://zhub.link/tags/%D0%BB%D1%83%D0%BA%D0%BE%D0%B2%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>луковичная_архитектура</span></a> <a href="https://zhub.link/tags/%D0%B3%D0%B5%D0%BA%D1%81%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>гексагональная_архитектура</span></a> <a href="https://zhub.link/tags/solid" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>solid</span></a> <a href="https://zhub.link/tags/grasp" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>grasp</span></a></p>
Panicz Maciej Godek<p>It's been a while since I wrote a report on the progress of <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a> </p><p>In large part, it's because things haven't been going too well lately. The fact that I no longer commute to work by train has a negative impact on my productivity.</p><p>I will likely start renting a co-working office starting next month. I'm also in the process of switching jobs.</p><p>So, my last few weeks were a kind of a mental diarrhea, when I was figuring out what to do next.</p><p>So I had a lot of ideas and very little accomplishments.</p><p>My current attitude is that in order to finish GRASP, I will have to start developing it from scratch. Maybe not entirely from scratch, because I think some parts of its design are completely fine, but I will probably start a new project, and just move some bits of the old one as I'll be needing them.</p><p>But this also leads me to the position of figuring out certain current shortcommings of GRASP. One of the problems is that I'm unable to run it in the browser. So last week I made a very simple Scheme to JS translator. (I call it jsssssssss, which stands for "JavaScript Scrounged from a Sophisticated Superset of a Simple Subset of Scheme or Something Similar")</p><p>Another thing is that I'd like to decouple GRASP from Kawa, and possibly be able to run it on top of other Scheme implementations. But I don't want to give up on the affordances that I get from Kawa, and in particular its type system, and so I'm looking for a way to transplant that system to some other Schemes, refining it along the way. It consists of a few components, including<br>- a subsystem for interface-based object-orientation<br>- a record system<br>- type signatures</p><p>The system is going to be very similar to what I developed on top of Kawa, and described a while ago around here (under the <a href="https://functional.cafe/tags/PlottingScheme" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>PlottingScheme</span></a> tag). I originally thought of making a <a href="https://functional.cafe/tags/lang" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>lang</span></a> for Racket, because I was hoping that I could use RacketScript to target the browser, but it turned out that RacketScript doesn't really suit my needs.</p><p>I still think of targetting Racket though, because it has its own object-orientation system that I think aligns fairly well with that of Kawa.</p><p>I would of course also want to have that system available in jsssssssss, and perhaps I will also try to make a version that works with Chez.</p><p>The system's name is POORMANS, which stands for Portable Object-Orientation/Reflection Module Across Numerous Schemes.</p><p>The development of jsssssssss made me revisit the old compiler that I wrote for my...</p>
Panicz Maciej Godek<p>You think you're super-smart because you know how to exit vim?</p><p>You brag among your colleagues about being a proficient user of ed?</p><p>You no longer edit files in Emacs, because your elisp functions do that for you?</p><p>Then try edit anything in <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a>, and see how far you can go.</p><p>I bet not too far.</p><p><a href="https://functional.cafe/tags/GraspChallenge" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GraspChallenge</span></a></p>
Habr<p>GRASP: почему настоящая архитектура начинается не с SOLID</p><p>Хочу начать с личной предыстории. Давным-давно, как и многие из вас, я читал умные книжки: «Чистый код» и «Чистая архитектура» Роберта Мартина, «Совершенный код» Стива Макконнелла и другие. Также не обошли меня и классические принципы проектирования — SOLID , KISS , DRY — и, думаю, каждый читатель добавит сюда свои. Безусловно, это всё важные и фундаментальные вещи. Но однажды на горизонте появилось DDD — предметно-ориентированное проектирование в изложении Эрика Эванса. Именно его «синяя книга» стала культовой и задала язык для архитектурного мышления. Позже я открыл и «красную книгу» Вона Вернона, где DDD уже рассматривался с точки зрения практической имплементации: архитектура, код, реальные подходы в проектах. Читая Эванса, рассматривая его диаграммы классов и примеры кода, я всё думал: как он это делает? Самым большим открытием для меня стало то, что книга DDD хоть и показывает стратегические и тактические приёмы — агрегаты, объекты-значения, спецификации, фабрики и т.д. — но не учит проектировать саму предметную область . Складывалось ощущение, что мы это уже откуда-то должны были знать . А откуда — остаётся загадкой.</p><p><a href="https://habr.com/ru/articles/900140/" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">habr.com/ru/articles/900140/</span><span class="invisible"></span></a></p><p><a href="https://zhub.link/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a> <a href="https://zhub.link/tags/%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>паттерны_проектирования</span></a> <a href="https://zhub.link/tags/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>архитектура</span></a> <a href="https://zhub.link/tags/DDD" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>DDD</span></a> <a href="https://zhub.link/tags/SOLID" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>SOLID</span></a> <a href="https://zhub.link/tags/OOP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>OOP</span></a> <a href="https://zhub.link/tags/%D1%87%D0%B8%D1%81%D1%82%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>чистая_архитектура</span></a> <a href="https://zhub.link/tags/%D1%87%D0%B8%D1%81%D1%82%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>чистый_код</span></a></p>
The Moonstar MediumSentiment<br> <br> <a href="https://pixelfed.social/discover/tags/baby?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#baby</a><br> <a href="https://pixelfed.social/discover/tags/babymoonstar?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#babymoonstar</a><br> <a href="https://pixelfed.social/discover/tags/birthday?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#birthday</a> <br> <a href="https://pixelfed.social/discover/tags/child?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#child</a><br> <a href="https://pixelfed.social/discover/tags/crazy?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#crazy</a> <br> <a href="https://pixelfed.social/discover/tags/firstbirthday?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#firstbirthday</a> <br> <a href="https://pixelfed.social/discover/tags/free?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#free</a> <br> <a href="https://pixelfed.social/discover/tags/grab?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#grab</a> <br> <a href="https://pixelfed.social/discover/tags/grasp?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#grasp</a> <br> <a href="https://pixelfed.social/discover/tags/kid?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#kid</a><br> <a href="https://pixelfed.social/discover/tags/oneyearold?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#oneyearold</a> <br> <a href="https://pixelfed.social/discover/tags/photography?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#photography</a><br> <a href="https://pixelfed.social/discover/tags/sentiment?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#sentiment</a><br> <a href="https://pixelfed.social/discover/tags/themoonstarmedium?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#themoonstarmedium</a><br> <a href="https://pixelfed.social/discover/tags/toddler?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#toddler</a> <br> <a href="https://pixelfed.social/discover/tags/wild?src=hash" class="u-url hashtag" rel="nofollow noopener noreferrer" target="_blank">#wild</a>
Panicz Maciej Godek<p>In February, I've been mostly involved with developing a simple physics engine for <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a> </p><p>It is tangential to the editor itself, and completely inessential - but I felt that I had to write it, because a few months earlier I wrote a collision detection algorithm.</p><p>It mostly works, although there are some issues with collision detection, and the physical objects sometimes get through the walls.</p><p>But I wonder whether I would want to devote more time to this venture.</p><p>I've found that there is a physics engine written in Java called dyn4j, and I probably would be able to integrate it with GRASP easily, without all the burden of development and debugging (although that wasn't the purpose of this exercise).</p><p>Other than this, February wasn't a good month for me. I've spent the bigger part of it being sick and lying in bed, and despite working according to schedule, I feel that I've lost the rhythm.</p><p>Besides the office of the company that I work for has moved significantly closer to my home, so I no longer commute by train, and don't have that spare time to write code on my phone.</p><p>I think that I'm currently going through a sort of a crisis. I'm trying to figure out the way to monetize my work, because I will most likely be parting from my company in a few months.</p><p>I applied for a coworking office in a nearby technological park, and if my submission gets accepted, I plan to spend there one or two hours a day, doing some GRASP-related things.</p><p>Currently I will be focusing more on writing the book that I started writing. (At this moment, I'm around 4000 words, and while there's some room for improvement regarding the text, I am somewhat happy about what I already have. I plan to write around 80000 words, so it seems I'm at 5%, but of course this is hard to measure precisely.)</p><p>There are more things that I've been unhappy about, though. Recently, I started spending way too much time on X (formerly Twitter), partially due to the political events, but I also tried become more politically aware regarding the upcoming presidential elections in Poland. I find it terribly ironic that X (formerly Twitter) is still a place where the political discourse seems to be happening. But my overall impression is that interactions have gotten better than they used to be (I don't know if these are interactions with people or bots though).</p>
Panicz Maciej Godek<p>Ok maybe collisions don't yet work the way they should, but the physics engine that I've been developing for <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a> is slowly getting into shape:</p><p><a href="https://youtube.com/shorts/H0T7SpjNhW8" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">youtube.com/shorts/H0T7SpjNhW8</span><span class="invisible"></span></a></p>
JustAnotherGail<p>This is my favorite tree in town. I love the way this vine seems to hold it in its <a href="https://chattrbx.com/tags/grasp" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>grasp</span></a> like a hug.</p><p><a href="https://chattrbx.com/tags/DailyChatPix" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>DailyChatPix</span></a> <a href="https://chattrbx.com/tags/Grasp" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Grasp</span></a></p>
Panicz Maciej Godek<p>I wrote about this before, but I think it needs more consideration.</p><p>When I work on <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a>, I have a TODO file, wherein I make notes (almost) every day, writing at the top the today's date and then I begin a sort of a dialogue with myself, which sometimes consists only of a list of things to make, sometimes of certain design considerations, and sometimes of actual code which can afterwards (sometimes after many days) be moved elsewhere. And sometimes - conversely - I bring a lot of existing code pieces into one place to figure out how a particular feature works.</p><p>I wonder if other programmers also have similar workflows, and whether they use some tools that would support them?</p><p>(I only found out about Mylyn for Eclipse, but I've never used it. It seems to have a lot of good ideas though)</p>
Panicz Maciej Godek<p>In the early December of 2024 I made a list of things that I would like to fix before releasing <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a>. I wrote it in a paper notebook, and even made some rough estimates for fixing them. I felt excited, because it seemed that the moment when I can start releasing GRASP (to <span class="h-card" translate="no"><a href="https://floss.social/@fdroidorg" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>fdroidorg</span></a></span>, at least initially) is really close.</p><p>Now that we're in the middle of January, I haven't touched almost any of those points.</p><p>I feel that GRASP is already mature enough that I could try pushing the release, and despite all the bugs, willing people could still find it useful, or at least worthy to play around with.</p><p>But even if editing was made flawlees, the current state of GRASP is still far from its "grand vision", which is a tool that would blend documents/books with applications, written in a way to promote code understandability.</p><p>So, here's the list of things that I wanted to fix:<br>- automatic workspace persistence<br>- using keyboard to navigate the menus<br>- proper search&amp;replace<br>- drag&amp;drop editing of strings and comments<br>- fully functioning undo (it has some bugs)<br>- scroll-bars<br>- hyper-textual help documents<br>- proper serialization and deserialization of extensions</p><p>I still want to do all those things. But I want to do that in the atmosphere of fun, rather than self-imposed pressure.</p><p>Other things that I'd like to have certainly include opening and closing boxes (by double-tapping on their left paren), scaling boxes to different sizes (and maybe changing their rotations as well?), and "pulling-the-rug splicing".</p><p>However, at this moment I feel that trying to live-code visual applications in GRASP is much cooler, and a much better driving force for the development.</p><p>Of course, if you fear that you're missing out by not using GRASP (which is probably true), feel free to join the project and help me release it sooner. (It's currently GPL, but I've been thinking about making it AGPL)</p><p>And don't be afraid to reach out ask questions - including some very basic ones.</p><p>Also, I decided to stop obligating myself to write monthly reports. I'm now switching to a more organic form of writing about GRASP, namely - whenever I feel like it (like, right now).</p><p>(If I'm going to "feel like writing about it once a month", it's going to get a bit cringy, but I guess I'll be OK with that)</p>
Panicz Maciej Godek<p><span class="h-card" translate="no"><a href="https://computerfairi.es/@budsofstone" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>budsofstone</span></a></span> I don't know, but <span class="h-card" translate="no"><a href="https://functional.cafe/@flatwhatson" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>flatwhatson</span></a></span> started a PreScheme restoration project (at prescheme.org), and there's rash-lang.org</p><p>I suspect there might be some people to whom scsh never went away.</p><p>Also, I think of <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a> - a thing of my own making - to be a kind of a shell, but two-dimensional and optimized for tactile input</p>
Panicz Maciej Godek<p>One thing that I'm relatively happy about is the design of the animation system in <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a> </p><p>Since GRASP can run in graphical environments as well as in terminal, all the rendering is mediated by the interface called Painter.</p><p>Painter is not a clear-cut, elegant abstraction. It has about 100 methods, and I think of it as a whimsical artist.</p><p>And among those, there is a method with the following signature:</p><p>(play! animation::Animation)::void</p><p>where Animation is a very simple interface, defined in the following way:</p><p>(define-interface Animation ()<br> ;; if this method returns <a href="https://functional.cafe/tags/f" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>f</span></a>, it means<br> ;; that the animation has ended and can<br> ;; be discarded by the animation system<br> (advance! timestep/ms::int)::boolean)</p><p>Now, the three clients of GRASP provide very different implementations of the play! method (and each of them is fairly complex): the AWT version uses a javax.swing.Timer to advance the animations, the terminal version uses java.util.concurrent.ScheduledThreadPoolExecutor:scheduleAtFixedRate, and the Android version uses android.os.Handler:postDelayed (as if that meant anything to you)</p><p>All three clients use a fixed tick period of 40ms, which would ideally amount to 25 frames per second - but this is neither documented nor guaranteed (which is why the advance! method receives the time delta from the previous call that it can rely on)</p><p>Currently there are three use cases for the animation system. One is screen repositioning, another is the visual stepper, and the last one is used for panning to the next search result.</p>
Panicz Maciej Godek<p>for the first time in my life (and hopefully last) I had to use "eval" inside of a syntax-case guard (and I'm so sorry)</p><p><a href="https://functional.cafe/tags/scheme" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>scheme</span></a> <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a> <a href="https://functional.cafe/tags/schemebites" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>schemebites</span></a></p>
Panicz Maciej Godek<p>I now render a dark gray background before rendering a document in the graphical versions of <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a>, which was very easy to implement, and I think immediately makes the experience much less confusing (and less canvasy).</p><p>Once I introduce scroll bars and forbid free rotation, the background will be visible never or almost never, but for now it should be fine.</p>
Panicz Maciej Godek<p><a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a></p><p><a href="https://www.youtube.com/watch?v=tiCsPavgG9M" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://www.</span><span class="ellipsis">youtube.com/watch?v=tiCsPavgG9</span><span class="invisible">M</span></a></p>
Panicz Maciej Godek<p>While I think that I failed to fulfill any of the objectives that I set to myself for December, it was a month that filled me with hope - I managed to fix some of the most annoying bugs, and made <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a> actually usable (although currently mainly for myself, because there's still one small bug that would probably confuse a lot of people if they tried to use it).</p><p>Another highlight of December was that I had a few days off from computers in general, and I think that I needed that badly (and I still have almost an entire week of vacation ahead of me).</p><p>Overall, I don't remember 2024 as a particularly good year; I remember spending a lot of time on improving the vertical cursor movement (and it still needs some improvement), and likewise a lot of time on modifying the build system (and it blows occasionaly for unknown reason).</p><p>I'm not particularly worried about those problems, because I wanted to implement all the essential features before polishing the details, and I feel that - while there's probably still a lot of refactors (and possibly a big rewrite) ahead of me, the essetnials are already in place.</p><p>I think that the main highlight for 2024 was my participation in the spring Lisp Game Jam, which resulted in a game that I made for my daughter, and Causal Islands. Going to Milan for ICFP/Scheme workshop was also an adventure, but a very costly one (and I'd say that the vibe of the conference was a bit too academic to my taste). I was a bit disappointed that I coudn't meet WIll Byrd, but I'm very happy to have met Michael Ballantyne.</p><p>Overall, though, I think I had more fun watching live streams from SPLASH (and I felt it was a truly epic event, especially the LIVE workshop).</p><p>As to the plans for 2025, I have an ambition to make a follow-up of my Causal Islands talk, if it is going to be organized (I hope it will): I would like to have implemented all the things that I talked about.</p><p>There's also going to be Programming Conference in Prague in the beginning of June, and there's a direct train connection from Gdynia to Prague. In is unclear yet what the program is going to be, but if they will have an event that could accomodate a GRASP demo, I think I'd be eager to submit (although it can be difficult to reconcile with family life).</p><p>I'm also considering European Lisp Symposium (which takes place in Zurich in May), but I'll most likely have to skip it.</p><p>When it comes to the development plans, my priority is to have GRASP released...</p>
Panicz Maciej Godek<p>My first attempt at what would become <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a> was in September 2016, when I was working on a structure editor running in the SLAYER framework that I was developing at the time. It wasn't called GRASP yet, though - I called it "Butterfly", because of the XKCD strip about "real programmers", but I didn't get very far.</p><p>SLAYER was based on Guile, and I ended up implementing something akin to Racket's Big Bang (which I didn't know about at that time), and I have spent considerable effort to find a way to represent stuff in Scheme in a nice way (I developed a library for working with lists of interspersed keywords and values, but I was never happy about that).</p><p>I think I may have been on a trajectory to build something similar to <span class="h-card" translate="no"><a href="https://types.pl/@disconcision" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>disconcision</span></a></span> 's Fructure, but I broke my laptop, and it took me a while to recover the latest changes from the disk (which I think eventually happened in 2018; until then, I was working on a small Intel Atom-based netbook that I borrowed from a friend, and on which I wrote "A Pamphlet Against R").</p><p>Then I started to look for a nice way of putting rectangles into other rectangles, which took the form of "The Draggable Rectangle Challenge" that I published on Quora (I was a Quora addict at that time)</p><p><a href="https://eidolon-language.quora.com/Draggable-rectangle-challenge-part-I-the-introduction" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">eidolon-language.quora.com/Dra</span><span class="invisible">ggable-rectangle-challenge-part-I-the-introduction</span></a></p><p>I wrote a highly idiosyncratic solution in Racket, which nevertheless had its charm, but it ran terribly slowly on my friend's Raspberry Pi, and I haven't figured out any way to run it on Android.</p><p>The editor window title was "GRASP LIMB", where "GRASP" stands - of course - for GRAphical Scheme Programming, and "LIMB" is meant to be a pun on LISP's backronym "Lots of Irritating Superfluous Parentheses"; "LIMB" was meant to stand for "Lots of Intriguing Movable Boxes".</p><p>I started figuring out a way to build Android applications - I had to buy additional 2GB of RAM to my laptop to make Android Studio to run, and when (after breaking another laptop) I finally found a way to build Android apps in Termux, without Android Studio, it turned out to be a huge productivity booster to me - I could finally do programming in places where I wouldn't be able to use the laptop, and this setup prompted some of the design of GRASP.</p><p>I made the first version on/for the phone in the spring of 2020, mainly on the toilet (and it shows: <a href="https://www.youtube.com/watch?v=BmZ39IfElzg" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://www.</span><span class="ellipsis">youtube.com/watch?v=BmZ39IfElz</span><span class="invisible">g</span></a>), and in 2021 I wrote what I thought would be the "final version" - but in both cases, the development eventually stalled.</p>
Panicz Maciej Godek<p>Mom, can we have <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a>?</p><p>Mom: oh, honey, we have GRASP at home.</p><p>GRASP at home:</p><p><a href="https://blob.cat/objects/f935506f-b090-496b-ba6a-3402c8382f32" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">blob.cat/objects/f935506f-b090</span><span class="invisible">-496b-ba6a-3402c8382f32</span></a></p>
Panicz Maciej Godek<p>I did <a href="https://functional.cafe/tags/AdventOfCode" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>AdventOfCode</span></a> day 5 riddle in the Android version of <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a>, but the Scheme interpreter on Android wasn't able to handle my interface to attributes, so I had to evaluate the code in a JVM version</p>
Panicz Maciej Godek<p><span class="h-card" translate="no"><a href="https://mas.to/@pk84" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>pk84</span></a></span> you made me do it<br><a href="https://functional.cafe/tags/AdventOfCode" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>AdventOfCode</span></a> <a href="https://functional.cafe/tags/AdventOfCode2024" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>AdventOfCode2024</span></a> <a href="https://functional.cafe/tags/Scheme" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Scheme</span></a> <a href="https://functional.cafe/tags/Lisp" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Lisp</span></a> <a href="https://functional.cafe/tags/GRASP" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GRASP</span></a></p>