From 6427b6120cb709a1e224f99bc9d695e3fe6afb44 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 1 Feb 2025 13:32:39 +0000 Subject: [PATCH] Update docs --- posts/atom.xml | 4 +- posts/rss.xml | 6 +- ru/posts/atom.xml | 124 ++--------------- ru/posts/index.html | 104 +-------------- ru/posts/pochemu-gc-sbcl-mozhet-14/index.html | 2 + ru/posts/rss.xml | 126 ++---------------- 6 files changed, 33 insertions(+), 333 deletions(-) diff --git a/posts/atom.xml b/posts/atom.xml index b92ce00..8bfeada 100644 --- a/posts/atom.xml +++ b/posts/atom.xml @@ -1,4 +1,4 @@ -40Antshttps://40ants.com/2025-02-01T13:24:23.508059Zhttps://40ants.com/Just an example of the static file generated by StatiCL.Pushing your pulls faster!https://40ants.com/posts/push-your-pulls/2025-02-01T13:24:23.491392Zhttps://40ants.com/posts/push-your-pulls/<p>Today I’m going to share an idea I’ve been nurturing for a long time, my friends. It came into my mind many years ago. It’s core message has to do with development of a service, which would aggregate and conveniently display all communications related to your favorite GitHub projects. This service will be very helpful for users having many own GitHub projects. It’ll also help GitHub users with numerous pulls and tickets for third party projects.</p> +40Antshttps://40ants.com/2025-02-01T13:32:25.160757Zhttps://40ants.com/Just an example of the static file generated by StatiCL.Pushing your pulls faster!https://40ants.com/posts/push-your-pulls/2025-02-01T13:32:25.144314Zhttps://40ants.com/posts/push-your-pulls/<p>Today I’m going to share an idea I’ve been nurturing for a long time, my friends. It came into my mind many years ago. It’s core message has to do with development of a service, which would aggregate and conveniently display all communications related to your favorite GitHub projects. This service will be very helpful for users having many own GitHub projects. It’ll also help GitHub users with numerous pulls and tickets for third party projects.</p> <p>I believe that tickets and pulls creators create them to improve their open source projects of interest. In order to do that, tickets must become pulls. The pulls in turn should merge in a timely manner. The faster this process will be, the quicker open source projects will be developed.</p> <p>Today I’m going to share an idea I’ve been nurturing for a long time, my friends. It came into my mind many years ago. It’s core message has to do with development of a service, which would aggregate and conveniently display all communications related to your favorite GitHub projects. This service will be very helpful for users having many own GitHub projects. It’ll also help GitHub users with numerous pulls and tickets for third party projects.</p> @@ -27,7 +27,7 @@ It helped to halve overflow consisting of 103 pulls and tickets. I closed some o If you want to be one of its early adopters, please, provide your email address. To do this, fill in a form on http://12forks.com site.</p> <p>Any concepts to be realized in this product? Speak up. You're more than welcome. Put them down in your comments to the post. Or send them to ideas@12forks.com.</p> -Second version of Ultralisp.org is available now!https://40ants.com/posts/ultralisp/2025-02-01T13:24:23.505664Zhttps://40ants.com/posts/ultralisp/<p>I believe, that software should evolve and evolve quickly. +Second version of Ultralisp.org is available now!https://40ants.com/posts/ultralisp/2025-02-01T13:32:25.158400Zhttps://40ants.com/posts/ultralisp/<p>I believe, that software should evolve and evolve quickly. One of the reasons why Common Lisp seems strange to newcomers is its ecosystem. It takes a long time to add a new library and make it useful to other common lispers.</p> diff --git a/posts/rss.xml b/posts/rss.xml index d03b34d..a175ab0 100644 --- a/posts/rss.xml +++ b/posts/rss.xml @@ -1,7 +1,7 @@ -40Antshttps://40ants.com/Just an example of the static file generated by StatiCL.https://40ants.com/Sat, 01 Feb 2025 13:24:23 +0000Pushing your pulls faster!https://40ants.com/posts/push-your-pulls/<p>Today I’m going to share an idea I’ve been nurturing for a long time, my friends. It came into my mind many years ago. It’s core message has to do with development of a service, which would aggregate and conveniently display all communications related to your favorite GitHub projects. This service will be very helpful for users having many own GitHub projects. It’ll also help GitHub users with numerous pulls and tickets for third party projects.</p> +40Antshttps://40ants.com/Just an example of the static file generated by StatiCL.https://40ants.com/Sat, 01 Feb 2025 13:32:25 +0000Pushing your pulls faster!https://40ants.com/posts/push-your-pulls/<p>Today I’m going to share an idea I’ve been nurturing for a long time, my friends. It came into my mind many years ago. It’s core message has to do with development of a service, which would aggregate and conveniently display all communications related to your favorite GitHub projects. This service will be very helpful for users having many own GitHub projects. It’ll also help GitHub users with numerous pulls and tickets for third party projects.</p> <p>I believe that tickets and pulls creators create them to improve their open source projects of interest. In order to do that, tickets must become pulls. The pulls in turn should merge in a timely manner. The faster this process will be, the quicker open source projects will be developed.</p> -https://40ants.com/posts/push-your-pulls/Sat, 01 Feb 2025 13:24:23 +0000<p>Today I’m going to share an idea I’ve been nurturing for a long time, my friends. It came into my mind many years ago. It’s core message has to do with development of a service, which would aggregate and conveniently display all communications related to your favorite GitHub projects. This service will be very helpful for users having many own GitHub projects. It’ll also help GitHub users with numerous pulls and tickets for third party projects.</p> +https://40ants.com/posts/push-your-pulls/Sat, 01 Feb 2025 13:32:25 +0000<p>Today I’m going to share an idea I’ve been nurturing for a long time, my friends. It came into my mind many years ago. It’s core message has to do with development of a service, which would aggregate and conveniently display all communications related to your favorite GitHub projects. This service will be very helpful for users having many own GitHub projects. It’ll also help GitHub users with numerous pulls and tickets for third party projects.</p> <p>I believe that tickets and pulls creators create them to improve their open source projects of interest. In order to do that, tickets must become pulls. The pulls in turn should merge in a timely manner. The faster this process will be, the quicker open source projects will be developed.</p> @@ -34,7 +34,7 @@ to other common lispers.</p> <p>Just pretend that you've made a brand new library and want to show it to the world. Now you have two options.</p> -https://40ants.com/posts/ultralisp/Sat, 01 Feb 2025 13:24:23 +0000<p>I believe, that software should evolve and evolve quickly. +https://40ants.com/posts/ultralisp/Sat, 01 Feb 2025 13:32:25 +0000<p>I believe, that software should evolve and evolve quickly. One of the reasons why Common Lisp seems strange to newcomers is its ecosystem. It takes a long time to add a new library and make it useful to other common lispers.</p> diff --git a/ru/posts/atom.xml b/ru/posts/atom.xml index f49159b..09c4f8a 100644 --- a/ru/posts/atom.xml +++ b/ru/posts/atom.xml @@ -1,4 +1,4 @@ -40Antshttps://40ants.com/2025-02-01T13:24:23.698782Zhttps://40ants.com/Just an example of the static file generated by StatiCL.Красота для LispWorkshttps://40ants.com/ru/posts/krasota-dlya-lispworks-18/2025-02-01T13:24:23.600768Zhttps://40ants.com/ru/posts/krasota-dlya-lispworks-18/<p><img src="https://40ants.com/ru/posts/images/18.jpg" alt=""></p> +40Antshttps://40ants.com/2025-02-01T13:32:25.335494Zhttps://40ants.com/Just an example of the static file generated by StatiCL.Красота для LispWorkshttps://40ants.com/ru/posts/krasota-dlya-lispworks-18/2025-02-01T13:32:25.254547Zhttps://40ants.com/ru/posts/krasota-dlya-lispworks-18/<p><img src="https://40ants.com/ru/posts/images/18.jpg" alt=""></p> <p>Красота для LispWorks</p> @@ -22,7 +22,7 @@ <p>Приятно, когда люди вкладывают душу в подобные проекты.</p> <strong>Обсудить пост в <a href="https://t.me/c/2102092834/18">Telegram канале</a>.</strong> -Maxima скомпилировали для запуска в браузере!https://40ants.com/ru/posts/maxima-skompilirovali-dlya-zapuska-v-brauzere-17/2025-02-01T13:24:23.605533Zhttps://40ants.com/ru/posts/maxima-skompilirovali-dlya-zapuska-v-brauzere-17/<p><video src="images/17.mp4"></video></p> +Maxima скомпилировали для запуска в браузере!https://40ants.com/ru/posts/maxima-skompilirovali-dlya-zapuska-v-brauzere-17/2025-02-01T13:32:25.267689Zhttps://40ants.com/ru/posts/maxima-skompilirovali-dlya-zapuska-v-brauzere-17/<p><video src="images/17.mp4"></video></p> <p>Maxima скомпилировали для запуска в браузере!</p> @@ -50,7 +50,7 @@ <p>Что в этой истории примечательного? То что компиляция в <a href="https://ru.wikipedia.org/wiki/WebAssembly">WebAssembly</a> расширяет возможности использования Common Lisp. Я пока не погружался в детали того как это работает, но судя по тому, что в данном проекте использовался ECL (Embeddable Common Lisp), могу предположить, что Maxima транслировали в C, а затем уже собрали в WebAssembly.</p> <strong>Обсудить пост в <a href="https://t.me/c/2102092834/17">Telegram канале</a>.</strong> -Прототип Static Site Bothttps://40ants.com/ru/posts/prototip-static-site-bot-16/2025-02-01T13:24:23.617834Zhttps://40ants.com/ru/posts/prototip-static-site-bot-16/<p><img src="https://40ants.com/ru/posts/images/16.jpg" alt=""></p> +Прототип Static Site Bothttps://40ants.com/ru/posts/prototip-static-site-bot-16/2025-02-01T13:32:25.273019Zhttps://40ants.com/ru/posts/prototip-static-site-bot-16/<p><img src="https://40ants.com/ru/posts/images/16.jpg" alt=""></p> <p>Прототип Static Site Bot</p> @@ -74,115 +74,13 @@ <p>Для того, чтобы превратить мой прототип в полноценный продукт, предстоит ещё много работы, а пока что буду оценивать его полезность на своем канале. Кстати, если у кого-то есть идеи, как посчитать переходы с сайта в Telegram канал, пишите в комментариях, буду рад любым советам.</p> <strong>Обсудить пост в <a href="https://t.me/c/2102092834/16">Telegram канале</a>.</strong> -Почему GC SBCL может не освобождать память?https://40ants.com/ru/posts/pochemu-gc-sbcl-mozhet-14/2025-02-01T13:24:23.636444Zhttps://40ants.com/ru/posts/pochemu-gc-sbcl-mozhet-14/<p>Последнее время я работаю над новой версией фреймфорка для создания Telegram ботов. Этот фреймворк использует библиотеку реализующую акторы. И нем обнаружился досадный баг, который я намеревался исправить. Однако в процессе исправления оказалось, что оно может повлиять на производительность. Хорошо что у автора отыскался benchmark с помощью которого можно проверить скорость работы актора.</p> +Почему GC SBCL может не освобождать память?https://40ants.com/ru/posts/pochemu-gc-sbcl-mozhet-14/2025-02-01T13:32:25.284294Zhttps://40ants.com/ru/posts/pochemu-gc-sbcl-mozhet-14/<p>Последнее время я работаю над новой версией фреймфорка для создания Telegram ботов. Этот фреймворк использует библиотеку реализующую акторы. И нем обнаружился досадный баг, который я намеревался исправить. Однако в процессе исправления оказалось, что оно может повлиять на производительность. Хорошо что у автора отыскался benchmark с помощью которого можно проверить скорость работы актора.</p> <p>К моему удивлению этому бенчмарку не хватало 4G памяти для хоть сколько-нибудь длительной работы. Более того, если бенчмарк запустить ненадолго, то оказывалось, что после его работы процесс &quot;толстел&quot; на 2.5G и не отпускал эту память до тех пор, пока не сделаешь вручную <code>(sb-ext:gc :full t)</code>.</p> <p>Это поведение показалось крайне странным. Как вообще можно использовать это язык в production, если он не отпускает память!?</p> <p>Так я оказался втянут в исследование того, почему garbage collector SBCL не очищает кучу мусора оставшуюся после теста.</p> - -<p>Прошло три дня.</p> - -<p>После некоторых исследований у меня появилась гипотеза, почему GC не очищает память.</p> - -<p>Дело в том, что в бенчмарке N потоков генерят сообщения к одному актору. Если актор не успевает разгребать сообщения, то те накапливаются в очереди. Тест заканчивается, когда все сообщения в очереди обработаны.</p> - -<p>Когда в очереди много сообщений и срабатывает GC, то он видит, что на эти сообщения есть ссылки, и не может их подчистить, а потому перекладывает эти объекты в более старшее поколение. И чем дольше разгребается очередь в процессе генерации объектов, тем больше таких объектов оказывается в старших поколениях garbage collector.</p> - -<p>Когда тест заканчивается, то ссылок на сообщения уже нет, но из-за того, что GC поместил их в старшие поколения, при регулярных запусках он до этих объектов не добирается и они так и остаются висеть в памяти. А вот <code>(gc :full t)</code> их подбирает и подчищает.</p> - -<p>Как я это понял? Хотелось бы ответить: &quot;Очень просто!&quot;, но нет 🙁</p> - -<p>Сначала я решил поисследовать природу объектов, остающихся висеть в памяти после бенчмарка и написал вот такую функциюЖ</p> - -<pre><code> (let ((count 0)) - (sb-vm:map-allocated-objects (lambda (obj type size) - (declare (ignore obj type size)) - (incf count)) - :dynamic) - (let ((random-idx (random count)) - (found-obj nil) - (current-idx 0)) - (sb-vm:map-allocated-objects (lambda (obj type size) - (declare (ignore type size)) - (when (= current-idx random-idx) - (setf found-obj - (trivial-garbage:make-weak-pointer obj))) - (incf current-idx)) - :dynamic) - (values found-obj - random-idx - count)))) - -</code></pre> - -<p>она достает из памяти случайны объект и возвращает weak указатель на него. Почему weak указатель? Чтобы не возникло лишней ссылки -на объект.</p> - -<p>Выяснилось, что значительная часть объектов, это сообщения из очереди актора:</p> - -<pre><code> NIL NIL)&gt; - -</code></pre> - -<p>Далее я попытался выяснить а не держит ли кто ссылки на эти объекты. Для этого в SBCL есть функция поиска корней:</p> - -<pre><code> :print :verbose) -Path to &quot;MODILETTERDA&quot;: - 6 70031144DF [ 2] SB-IMPL::*ALL-PACKAGES* - 5 700518C41F [ 146] a (COMMON-LISP:SIMPLE-VECTOR 513) - 5 7005281513 [ 8] #&lt;PACKAGE &quot;CL-UNICODE&quot;&gt; - 5 70053D8533 [ 2] a SB-IMPL::SYMBOL-TABLE - 5 70054FB6F7 [ 1] a cons = (# . #) - 5 70056F16EF [ 34] a (COMMON-LISP:SIMPLE-VECTOR 307) - 5 7005919B9F [ 2] CL-UNICODE::*NAMES-TO-CODE-POINTS* - 5 7005B1CBC3 [ 6] #&lt;HASH-TABLE :TEST EQUALP :COUNT 33698 {7005B1CBC3}&gt; - 5 700D21000F [38446] a (COMMON-LISP:SIMPLE-VECTOR 83559) -; No values - -;; Попробуем проверить действительно ли такой ключ есть в словаре: -CL-USER&gt; (gethash &quot;MODILETTERDA&quot; CL-UNICODE::*NAMES-TO-CODE-POINTS*) -71199 -</code></pre> - -<p>Это лишь пример. Но по объектам созданным в результате бенчмарка, <code>search-roots</code> ничего не выдавал, что говорило о том, что эти объекты &quot;висят в воздухе&quot; и GC вполне мог бы их удалить.</p> - -<p>Потом я дополнительно проверил свою гипотезу того, что память не освобождается из-за того, что очередь забивается слишком большим количеством объектов. Для этого поменял код отправляющий сообщения в акторы так, чтобы каждые 10000-20000 сообщений случался <code>(sleep 0.1)</code>. И это помогло - GC стал подчищать сообщения своевременно, они перестали накапливаться в старших поколениях GC.</p> - -<p>Но что более удивительно, так это то, что замедление в генерации сообщений привело к увеличению пропускной способности актора. Без sleep он обрабатывал примерно 777 тыс. сообщений в секунду, а со sleep стал успевать обработать 821 тыс..</p> - -<p>Вероятно, ускорение связано с тем, что при более медленной генерации мусора, тот не успевает накапливаться в памяти и GC тратит меньше времени на сборку.</p> - -<p>Без слипа:</p> - -<pre><code>Times: 16000000 -Evaluation took: - 20.572 seconds of real time - 58.627387 seconds of total run time (23.984544 user, 34.642843 system) - [ Real times consist of 4.297 seconds GC time, and 16.275 seconds non-GC time. ] - [ Run times consist of 3.778 seconds GC time, and 54.850 seconds non-GC time. ] - 284.98% CPU - 208 forms interpreted - 3,068,032,944 bytes consed -</code></pre> - -<p>С задержкой генерации сообщений:</p> - -<pre><code>Evaluation took: - 19.483 seconds of real time - 24.618729 seconds of total run time (17.348749 user, 7.269980 system) - [ Real times consist of 0.044 seconds GC time, and 19.439 seconds non-GC time. ] - [ Run times consist of 0.044 seconds GC time, and 24.575 seconds non-GC time. ] - 126.36% CPU - 208 forms interpreted - 3,065,746,080 bytes consed -</code></pre> - -<p>Из этих данных видно, что хотя non-GC время и увеличилось на несколько секунд, GC время сократилось на пару порядков.</p> - -<p>Замедление порой приводит к ускорению. Такие дела!</p> -<strong>Обсудить пост в <a href="https://t.me/c/2102092834/15">Telegram канале</a>.</strong> <p>Последнее время я работаю над новой версией фреймфорка для создания Telegram ботов. Этот фреймворк использует библиотеку реализующую акторы. И нем обнаружился досадный баг, который я намеревался исправить. Однако в процессе исправления оказалось, что оно может повлиять на производительность. Хорошо что у автора отыскался benchmark с помощью которого можно проверить скорость работы актора.</p> <p>К моему удивлению этому бенчмарку не хватало 4G памяти для хоть сколько-нибудь длительной работы. Более того, если бенчмарк запустить ненадолго, то оказывалось, что после его работы процесс &quot;толстел&quot; на 2.5G и не отпускал эту память до тех пор, пока не сделаешь вручную <code>(sb-ext:gc :full t)</code>.</p> @@ -191,6 +89,8 @@ Evaluation took: <p>Так я оказался втянут в исследование того, почему garbage collector SBCL не очищает кучу мусора оставшуюся после теста.</p> +<!--more--> + <p>Прошло три дня.</p> <p>После некоторых исследований у меня появилась гипотеза, почему GC не очищает память.</p> @@ -292,7 +192,7 @@ Evaluation took: <p>Замедление порой приводит к ускорению. Такие дела!</p> <strong>Обсудить пост в <a href="https://t.me/c/2102092834/15">Telegram канале</a>.</strong> -Matrix Badger для GitHubhttps://40ants.com/ru/posts/matrix-badges/2025-02-01T13:24:23.641477Zhttps://40ants.com/ru/posts/matrix-badges/<p>Сегодня расскажу ещё про один мой проект, который так и не превратился в продукт. Правда в отличие от 12forks.com, этот проект жив до сих пор. Проект связан с GitHub и полезен тем, кто развивает фреймворк или библиотеку, предназначенную для разных платформ, языков программирования или операционных систем.</p> +Matrix Badger для GitHubhttps://40ants.com/ru/posts/matrix-badges/2025-02-01T13:32:25.289213Zhttps://40ants.com/ru/posts/matrix-badges/<p>Сегодня расскажу ещё про один мой проект, который так и не превратился в продукт. Правда в отличие от 12forks.com, этот проект жив до сих пор. Проект связан с GitHub и полезен тем, кто развивает фреймворк или библиотеку, предназначенную для разных платформ, языков программирования или операционных систем.</p> <p>Сегодня расскажу ещё про один мой проект, который так и не превратился в продукт. Правда в отличие от 12forks.com, этот проект жив до сих пор. Проект связан с GitHub и полезен тем, кто развивает фреймворк или библиотеку, предназначенную для разных платформ, языков программирования или операционных систем.</p> <!--more--> @@ -306,7 +206,7 @@ Evaluation took: <p>Я так и не придумал, как монетизировать этот небольшой проект. Но он много ресурсов не требует и времени не отнимает, а польза от него есть - сам в каждом своём проекте его использую.</p> <p>Вообще мне кажется что сложно сделать так, чтобы разработчики платили за подобные продукты. У нас же как, если кто-то за что-то хочет с нас копеечку - сразу возникает мысль: &quot;Я же могу сделать сам и даже лучше!&quot; :)))</p> -Помощник для Opensource разработчиковhttps://40ants.com/ru/posts/12forks/2025-02-01T13:24:23.645627Zhttps://40ants.com/ru/posts/12forks/<p>Сегодня хочу рассказать про один из своих прошлых проектов. Когда-то у меня появилась идея, как упростить себе обработку большого числа пулл-реквестов и issue в своих opensource проектах. И тогда я сделал сайт 12forks.com (сейчас уже недоступен, как выглядела главная страница можно глянуть <a href="https://web.archive.org/web/20211124152220/https://12forks.com/">через WebArchive</a>).</p> +Помощник для Opensource разработчиковhttps://40ants.com/ru/posts/12forks/2025-02-01T13:32:25.293294Zhttps://40ants.com/ru/posts/12forks/<p>Сегодня хочу рассказать про один из своих прошлых проектов. Когда-то у меня появилась идея, как упростить себе обработку большого числа пулл-реквестов и issue в своих opensource проектах. И тогда я сделал сайт 12forks.com (сейчас уже недоступен, как выглядела главная страница можно глянуть <a href="https://web.archive.org/web/20211124152220/https://12forks.com/">через WebArchive</a>).</p> <p>Сегодня хочу рассказать про один из своих прошлых проектов. Когда-то у меня появилась идея, как упростить себе обработку большого числа пулл-реквестов и issue в своих opensource проектах. И тогда я сделал сайт 12forks.com (сейчас уже недоступен, как выглядела главная страница можно глянуть <a href="https://web.archive.org/web/20211124152220/https://12forks.com/">через WebArchive</a>).</p> <!--more--> @@ -320,7 +220,7 @@ Evaluation took: <p>Недавно у меня появился коллега, который когда-то поработал в Google. Он рассказывал что там во внутренней системе code review есть такое понятие, как attention set, принцип работы которой похож на то что я делал в 12Forks.com.</p> <p>Как думаете, стоит ли возродить этот проект?</p> -Результаты хакатона ЛЦТ 2023https://40ants.com/ru/posts/hrzero/2025-02-01T13:24:23.675549Zhttps://40ants.com/ru/posts/hrzero/<p>В <a href="https://www.youtube.com/watch?v=Zpn86AQRVN8">последнем видео</a> на YouTube канале я рассказываю о проекте HrZero, который мы с одним товарищем делали на хакатоне Лидеры Цифровой Трансформации осенью 2023. Задача была создать сервис онбординга сотрудников, но мы, как всегда постарались сделать больше, чем от нас требовалось. В результате, в нашем сервисе онбординга появилась мини-игра, позволяющая новому сотруднику запомнить своих коллег. Эта идея нам так понравилась, что решили сделать из неё отдельный проект. Так появился https://mememo.ru.</p> +Результаты хакатона ЛЦТ 2023https://40ants.com/ru/posts/hrzero/2025-02-01T13:32:25.297023Zhttps://40ants.com/ru/posts/hrzero/<p>В <a href="https://www.youtube.com/watch?v=Zpn86AQRVN8">последнем видео</a> на YouTube канале я рассказываю о проекте HrZero, который мы с одним товарищем делали на хакатоне Лидеры Цифровой Трансформации осенью 2023. Задача была создать сервис онбординга сотрудников, но мы, как всегда постарались сделать больше, чем от нас требовалось. В результате, в нашем сервисе онбординга появилась мини-игра, позволяющая новому сотруднику запомнить своих коллег. Эта идея нам так понравилась, что решили сделать из неё отдельный проект. Так появился https://mememo.ru.</p> <p>В <a href="https://www.youtube.com/watch?v=Zpn86AQRVN8">последнем видео</a> на YouTube канале я рассказываю о проекте HrZero, который мы с одним товарищем делали на хакатоне Лидеры Цифровой Трансформации осенью 2023. Задача была создать сервис онбординга сотрудников, но мы, как всегда постарались сделать больше, чем от нас требовалось. В результате, в нашем сервисе онбординга появилась мини-игра, позволяющая новому сотруднику запомнить своих коллег. Эта идея нам так понравилась, что решили сделать из неё отдельный проект. Так появился https://mememo.ru.</p> <!--more--> @@ -329,7 +229,7 @@ Evaluation took: <p>Кстати, скорее всего благодаря этому проекту вскоре для Common Lisp появится библиотека для парсинга данных в интернет, по типу питоновского Scrapy. У меня уже есть несколько идей относительно того, как организовать обход сайта, органичение числа запросов в секунду и прочего.</p> Если у вас есть опыт обучения с помощью карточек, буду рад обсудить его в комментариях! -Идея трансляции Telegram канала в статический сайтhttps://40ants.com/ru/posts/telegram-reposter/2025-02-01T13:24:23.682716Zhttps://40ants.com/ru/posts/telegram-reposter/<p><img src="https://40ants.com/ru/posts/images/10.jpg" alt=""></p> +Идея трансляции Telegram канала в статический сайтhttps://40ants.com/ru/posts/telegram-reposter/2025-02-01T13:32:25.301287Zhttps://40ants.com/ru/posts/telegram-reposter/<p><img src="https://40ants.com/ru/posts/images/10.jpg" alt=""></p> <p>Привет, друзья! Сегодня я хочу поделиться с вами интересной идеей, которая пришла мне в голову недавно. Я сейчас вникаю в то, как продвигать свои проекты, а через них и Common Lisp. Ну, знаете, SEO там всякий, маркетинг. И вот что я придумал!</p> <p><img src="https://40ants.com/ru/posts/images/10.jpg" alt=""></p> @@ -348,7 +248,7 @@ Evaluation took: <p>Что вы думаете об этой идее? Буду рад услышать ваши мысли и предложения!</p> <strong>Обсудить пост в <a href="https://t.me/the40ants/10">Telegram канале</a>.</strong> -Сайт со сказкамиhttps://40ants.com/ru/posts/skazorama/2025-02-01T13:24:23.691840Zhttps://40ants.com/ru/posts/skazorama/<p>Продолжая тему моих неудачных проектов, хочу рассказать ещё об одном сайте – Skazorama.ru.</p> +Сайт со сказкамиhttps://40ants.com/ru/posts/skazorama/2025-02-01T13:32:25.328391Zhttps://40ants.com/ru/posts/skazorama/<p>Продолжая тему моих неудачных проектов, хочу рассказать ещё об одном сайте – Skazorama.ru.</p> <p>Идея этого проекта была в том, чтобы сделать бесконечную ленту сказок, которые можно почитать детям. При чём, открывая сайт на телефоне, родитель видел новые сказки, которые ещё не читал своему ребёнку. Если сказка не понравилась, то её можно было просто промотать, и вслед за ней подгружалась следующая. При этом сервис воспринимал такую промотку как &quot;dislike&quot; и в будущем я рассчитывал прикрутить ML, чтобы рекомендовать именно те сказки, которые с большей вероятностью понравятся ребёнку.</p> <p>Продолжая тему моих неудачных проектов, хочу рассказать ещё об одном сайте – Skazorama.ru.</p> @@ -367,7 +267,7 @@ Evaluation took: <p>Как видите, Сказорама ещё раз доказывает, что проекты которые делаются лишь для удовлетворения потребностей одного только создателя обречены. Надо сразу думать о монитизации. Кастати, на эту тему мне сегодня попалась статейка на VC, которая так и называется &quot;Делаете стартап? — Сначала продай, а потом делайте! Можно иначе? Да, но продай сначала&quot;.</p> А что вы думаете о подходе, когда с самого начала всё закручивается вокруг денег, а технологии вторичны? -AllMyChanges.comhttps://40ants.com/ru/posts/allmychanges/2025-02-01T13:24:23.698774Zhttps://40ants.com/ru/posts/allmychanges/<p>Мне всю жизнь нравится что-то придумывать и конструировать. Просто не могу сидеть без дела. Поэтому я постоянно пишу какие-то небольшие проектики помимо основной работы. Но долгое время я не понимал, что чтобы проект &quot;полетел&quot;, нужно вкладывать хотя бы половину времени в его продвижение - каст-дев, маркетинг, SEO. Сегодня, и в нескольких следующих постах хочу рассказать вам про мои неудачные проекты.</p> +AllMyChanges.comhttps://40ants.com/ru/posts/allmychanges/2025-02-01T13:32:25.335484Zhttps://40ants.com/ru/posts/allmychanges/<p>Мне всю жизнь нравится что-то придумывать и конструировать. Просто не могу сидеть без дела. Поэтому я постоянно пишу какие-то небольшие проектики помимо основной работы. Но долгое время я не понимал, что чтобы проект &quot;полетел&quot;, нужно вкладывать хотя бы половину времени в его продвижение - каст-дев, маркетинг, SEO. Сегодня, и в нескольких следующих постах хочу рассказать вам про мои неудачные проекты.</p> <p>Мне всю жизнь нравится что-то придумывать и конструировать. Просто не могу сидеть без дела. Поэтому я постоянно пишу какие-то небольшие проектики помимо основной работы. Но долгое время я не понимал, что чтобы проект &quot;полетел&quot;, нужно вкладывать хотя бы половину времени в его продвижение - каст-дев, маркетинг, SEO. Сегодня, и в нескольких следующих постах хочу рассказать вам про мои неудачные проекты.</p> <!--more--> diff --git a/ru/posts/index.html b/ru/posts/index.html index 3322470..59addd1 100644 --- a/ru/posts/index.html +++ b/ru/posts/index.html @@ -71,109 +71,7 @@

Это поведение показалось крайне странным. Как вообще можно использовать это язык в production, если он не отпускает память!?

Так я оказался втянут в исследование того, почему garbage collector SBCL не очищает кучу мусора оставшуюся после теста.

- -

Прошло три дня.

- -

После некоторых исследований у меня появилась гипотеза, почему GC не очищает память.

- -

Дело в том, что в бенчмарке N потоков генерят сообщения к одному актору. Если актор не успевает разгребать сообщения, то те накапливаются в очереди. Тест заканчивается, когда все сообщения в очереди обработаны.

- -

Когда в очереди много сообщений и срабатывает GC, то он видит, что на эти сообщения есть ссылки, и не может их подчистить, а потому перекладывает эти объекты в более старшее поколение. И чем дольше разгребается очередь в процессе генерации объектов, тем больше таких объектов оказывается в старших поколениях garbage collector.

- -

Когда тест заканчивается, то ссылок на сообщения уже нет, но из-за того, что GC поместил их в старшие поколения, при регулярных запусках он до этих объектов не добирается и они так и остаются висеть в памяти. А вот (gc :full t) их подбирает и подчищает.

- -

Как я это понял? Хотелось бы ответить: "Очень просто!", но нет 🙁

- -

Сначала я решил поисследовать природу объектов, остающихся висеть в памяти после бенчмарка и написал вот такую функциюЖ

- -
  (let ((count 0))
-    (sb-vm:map-allocated-objects (lambda (obj type size)
-                                   (declare (ignore obj type size))
-                                   (incf count))
-                                 :dynamic)
-    (let ((random-idx (random count))
-          (found-obj nil)
-          (current-idx 0))
-      (sb-vm:map-allocated-objects (lambda (obj type size)
-                                     (declare (ignore type size))
-                                     (when (= current-idx random-idx)
-                                       (setf found-obj
-                                             (trivial-garbage:make-weak-pointer obj)))
-                                     (incf current-idx))
-                                   :dynamic)
-      (values found-obj
-              random-idx
-              count))))
-
-
- -

она достает из памяти случайны объект и возвращает weak указатель на него. Почему weak указатель? Чтобы не возникло лишней ссылки -на объект.

- -

Выяснилось, что значительная часть объектов, это сообщения из очереди актора:

- -
                    NIL NIL)>
-
-
- -

Далее я попытался выяснить а не держит ли кто ссылки на эти объекты. Для этого в SBCL есть функция поиска корней:

- -
                              :print :verbose)
-Path to "MODILETTERDA":
- 6       70031144DF [   2] SB-IMPL::*ALL-PACKAGES*
- 5       700518C41F [ 146] a (COMMON-LISP:SIMPLE-VECTOR 513)
- 5       7005281513 [   8] #<PACKAGE "CL-UNICODE">
- 5       70053D8533 [   2] a SB-IMPL::SYMBOL-TABLE
- 5       70054FB6F7 [   1] a cons = (# . #)
- 5       70056F16EF [  34] a (COMMON-LISP:SIMPLE-VECTOR 307)
- 5       7005919B9F [   2] CL-UNICODE::*NAMES-TO-CODE-POINTS*
- 5       7005B1CBC3 [   6] #<HASH-TABLE :TEST EQUALP :COUNT 33698 {7005B1CBC3}>
- 5       700D21000F [38446] a (COMMON-LISP:SIMPLE-VECTOR 83559)
-; No values
-
-;; Попробуем проверить действительно ли такой ключ есть в словаре:
-CL-USER> (gethash "MODILETTERDA" CL-UNICODE::*NAMES-TO-CODE-POINTS*)
-71199
-
- -

Это лишь пример. Но по объектам созданным в результате бенчмарка, search-roots ничего не выдавал, что говорило о том, что эти объекты "висят в воздухе" и GC вполне мог бы их удалить.

- -

Потом я дополнительно проверил свою гипотезу того, что память не освобождается из-за того, что очередь забивается слишком большим количеством объектов. Для этого поменял код отправляющий сообщения в акторы так, чтобы каждые 10000-20000 сообщений случался (sleep 0.1). И это помогло - GC стал подчищать сообщения своевременно, они перестали накапливаться в старших поколениях GC.

- -

Но что более удивительно, так это то, что замедление в генерации сообщений привело к увеличению пропускной способности актора. Без sleep он обрабатывал примерно 777 тыс. сообщений в секунду, а со sleep стал успевать обработать 821 тыс..

- -

Вероятно, ускорение связано с тем, что при более медленной генерации мусора, тот не успевает накапливаться в памяти и GC тратит меньше времени на сборку.

- -

Без слипа:

- -
Times: 16000000
-Evaluation took:
-  20.572 seconds of real time
-  58.627387 seconds of total run time (23.984544 user, 34.642843 system)
-  [ Real times consist of 4.297 seconds GC time, and 16.275 seconds non-GC time. ]
-  [ Run times consist of 3.778 seconds GC time, and 54.850 seconds non-GC time. ]
-  284.98% CPU
-  208 forms interpreted
-  3,068,032,944 bytes consed
-
- -

С задержкой генерации сообщений:

- -
Evaluation took:
-  19.483 seconds of real time
-  24.618729 seconds of total run time (17.348749 user, 7.269980 system)
-  [ Real times consist of 0.044 seconds GC time, and 19.439 seconds non-GC time. ]
-  [ Run times consist of 0.044 seconds GC time, and 24.575 seconds non-GC time. ]
-  126.36% CPU
-  208 forms interpreted
-  3,065,746,080 bytes consed
-
- -

Из этих данных видно, что хотя non-GC время и увеличилось на несколько секунд, GC время сократилось на пару порядков.

- -

Замедление порой приводит к ускорению. Такие дела!

-Обсудить пост в Telegram канале. -

Matrix Badger для GitHub

posted on 2024-04-05

Сегодня расскажу ещё про один мой проект, который так и не превратился в продукт. Правда в отличие от 12forks.com, этот проект жив до сих пор. Проект связан с GitHub и полезен тем, кто развивает фреймворк или библиотеку, предназначенную для разных платформ, языков программирования или операционных систем.

+

Read more...

Matrix Badger для GitHub

posted on 2024-04-05

Сегодня расскажу ещё про один мой проект, который так и не превратился в продукт. Правда в отличие от 12forks.com, этот проект жив до сих пор. Проект связан с GitHub и полезен тем, кто развивает фреймворк или библиотеку, предназначенную для разных платформ, языков программирования или операционных систем.

Read more...

Помощник для Opensource разработчиков

posted on 2024-03-21

Сегодня хочу рассказать про один из своих прошлых проектов. Когда-то у меня появилась идея, как упростить себе обработку большого числа пулл-реквестов и issue в своих opensource проектах. И тогда я сделал сайт 12forks.com (сейчас уже недоступен, как выглядела главная страница можно глянуть через WebArchive).

Read more...

Результаты хакатона ЛЦТ 2023

posted on 2024-03-09

В последнем видео на YouTube канале я рассказываю о проекте HrZero, который мы с одним товарищем делали на хакатоне Лидеры Цифровой Трансформации осенью 2023. Задача была создать сервис онбординга сотрудников, но мы, как всегда постарались сделать больше, чем от нас требовалось. В результате, в нашем сервисе онбординга появилась мини-игра, позволяющая новому сотруднику запомнить своих коллег. Эта идея нам так понравилась, что решили сделать из неё отдельный проект. Так появился https://mememo.ru.

Read more...

Идея трансляции Telegram канала в статический сайт

posted on 2024-03-05

diff --git a/ru/posts/pochemu-gc-sbcl-mozhet-14/index.html b/ru/posts/pochemu-gc-sbcl-mozhet-14/index.html index 7d0ca51..4a739e2 100644 --- a/ru/posts/pochemu-gc-sbcl-mozhet-14/index.html +++ b/ru/posts/pochemu-gc-sbcl-mozhet-14/index.html @@ -36,6 +36,8 @@

Почему GC SBCL может не освобожда

Так я оказался втянут в исследование того, почему garbage collector SBCL не очищает кучу мусора оставшуюся после теста.

+ +

Прошло три дня.

После некоторых исследований у меня появилась гипотеза, почему GC не очищает память.

diff --git a/ru/posts/rss.xml b/ru/posts/rss.xml index ee3c321..37176ed 100644 --- a/ru/posts/rss.xml +++ b/ru/posts/rss.xml @@ -1,4 +1,4 @@ -40Antshttps://40ants.com/Just an example of the static file generated by StatiCL.https://40ants.com/Sat, 01 Feb 2025 13:24:23 +0000Красота для LispWorkshttps://40ants.com/ru/posts/krasota-dlya-lispworks-18/<p><img src="https://40ants.com/ru/posts/images/18.jpg" alt=""></p> +40Antshttps://40ants.com/Just an example of the static file generated by StatiCL.https://40ants.com/Sat, 01 Feb 2025 13:32:25 +0000Красота для LispWorkshttps://40ants.com/ru/posts/krasota-dlya-lispworks-18/<p><img src="https://40ants.com/ru/posts/images/18.jpg" alt=""></p> <p>Красота для LispWorks</p> @@ -10,7 +10,7 @@ <p>Приятно, когда люди вкладывают душу в подобные проекты.</p> <strong>Обсудить пост в <a href="https://t.me/c/2102092834/18">Telegram канале</a>.</strong> -https://40ants.com/ru/posts/krasota-dlya-lispworks-18/Sat, 01 Feb 2025 13:24:23 +0000<p><img src="https://40ants.com/ru/posts/images/18.jpg" alt=""></p> +https://40ants.com/ru/posts/krasota-dlya-lispworks-18/Sat, 01 Feb 2025 13:32:25 +0000<p><img src="https://40ants.com/ru/posts/images/18.jpg" alt=""></p> <p>Красота для LispWorks</p> @@ -36,7 +36,7 @@ <p>Что в этой истории примечательного? То что компиляция в <a href="https://ru.wikipedia.org/wiki/WebAssembly">WebAssembly</a> расширяет возможности использования Common Lisp. Я пока не погружался в детали того как это работает, но судя по тому, что в данном проекте использовался ECL (Embeddable Common Lisp), могу предположить, что Maxima транслировали в C, а затем уже собрали в WebAssembly.</p> <strong>Обсудить пост в <a href="https://t.me/c/2102092834/17">Telegram канале</a>.</strong> -https://40ants.com/ru/posts/maxima-skompilirovali-dlya-zapuska-v-brauzere-17/Sat, 01 Feb 2025 13:24:23 +0000<p><video src="images/17.mp4"></video></p> +https://40ants.com/ru/posts/maxima-skompilirovali-dlya-zapuska-v-brauzere-17/Sat, 01 Feb 2025 13:32:25 +0000<p><video src="images/17.mp4"></video></p> <p>Maxima скомпилировали для запуска в браузере!</p> @@ -62,7 +62,7 @@ <p>Для того, чтобы превратить мой прототип в полноценный продукт, предстоит ещё много работы, а пока что буду оценивать его полезность на своем канале. Кстати, если у кого-то есть идеи, как посчитать переходы с сайта в Telegram канал, пишите в комментариях, буду рад любым советам.</p> <strong>Обсудить пост в <a href="https://t.me/c/2102092834/16">Telegram канале</a>.</strong> -https://40ants.com/ru/posts/prototip-static-site-bot-16/Sat, 01 Feb 2025 13:24:23 +0000<p><img src="https://40ants.com/ru/posts/images/16.jpg" alt=""></p> +https://40ants.com/ru/posts/prototip-static-site-bot-16/Sat, 01 Feb 2025 13:32:25 +0000<p><img src="https://40ants.com/ru/posts/images/16.jpg" alt=""></p> <p>Прототип Static Site Bot</p> @@ -81,109 +81,7 @@ <p>Это поведение показалось крайне странным. Как вообще можно использовать это язык в production, если он не отпускает память!?</p> <p>Так я оказался втянут в исследование того, почему garbage collector SBCL не очищает кучу мусора оставшуюся после теста.</p> - -<p>Прошло три дня.</p> - -<p>После некоторых исследований у меня появилась гипотеза, почему GC не очищает память.</p> - -<p>Дело в том, что в бенчмарке N потоков генерят сообщения к одному актору. Если актор не успевает разгребать сообщения, то те накапливаются в очереди. Тест заканчивается, когда все сообщения в очереди обработаны.</p> - -<p>Когда в очереди много сообщений и срабатывает GC, то он видит, что на эти сообщения есть ссылки, и не может их подчистить, а потому перекладывает эти объекты в более старшее поколение. И чем дольше разгребается очередь в процессе генерации объектов, тем больше таких объектов оказывается в старших поколениях garbage collector.</p> - -<p>Когда тест заканчивается, то ссылок на сообщения уже нет, но из-за того, что GC поместил их в старшие поколения, при регулярных запусках он до этих объектов не добирается и они так и остаются висеть в памяти. А вот <code>(gc :full t)</code> их подбирает и подчищает.</p> - -<p>Как я это понял? Хотелось бы ответить: &quot;Очень просто!&quot;, но нет 🙁</p> - -<p>Сначала я решил поисследовать природу объектов, остающихся висеть в памяти после бенчмарка и написал вот такую функциюЖ</p> - -<pre><code> (let ((count 0)) - (sb-vm:map-allocated-objects (lambda (obj type size) - (declare (ignore obj type size)) - (incf count)) - :dynamic) - (let ((random-idx (random count)) - (found-obj nil) - (current-idx 0)) - (sb-vm:map-allocated-objects (lambda (obj type size) - (declare (ignore type size)) - (when (= current-idx random-idx) - (setf found-obj - (trivial-garbage:make-weak-pointer obj))) - (incf current-idx)) - :dynamic) - (values found-obj - random-idx - count)))) - -</code></pre> - -<p>она достает из памяти случайны объект и возвращает weak указатель на него. Почему weak указатель? Чтобы не возникло лишней ссылки -на объект.</p> - -<p>Выяснилось, что значительная часть объектов, это сообщения из очереди актора:</p> - -<pre><code> NIL NIL)&gt; - -</code></pre> - -<p>Далее я попытался выяснить а не держит ли кто ссылки на эти объекты. Для этого в SBCL есть функция поиска корней:</p> - -<pre><code> :print :verbose) -Path to &quot;MODILETTERDA&quot;: - 6 70031144DF [ 2] SB-IMPL::*ALL-PACKAGES* - 5 700518C41F [ 146] a (COMMON-LISP:SIMPLE-VECTOR 513) - 5 7005281513 [ 8] #&lt;PACKAGE &quot;CL-UNICODE&quot;&gt; - 5 70053D8533 [ 2] a SB-IMPL::SYMBOL-TABLE - 5 70054FB6F7 [ 1] a cons = (# . #) - 5 70056F16EF [ 34] a (COMMON-LISP:SIMPLE-VECTOR 307) - 5 7005919B9F [ 2] CL-UNICODE::*NAMES-TO-CODE-POINTS* - 5 7005B1CBC3 [ 6] #&lt;HASH-TABLE :TEST EQUALP :COUNT 33698 {7005B1CBC3}&gt; - 5 700D21000F [38446] a (COMMON-LISP:SIMPLE-VECTOR 83559) -; No values - -;; Попробуем проверить действительно ли такой ключ есть в словаре: -CL-USER&gt; (gethash &quot;MODILETTERDA&quot; CL-UNICODE::*NAMES-TO-CODE-POINTS*) -71199 -</code></pre> - -<p>Это лишь пример. Но по объектам созданным в результате бенчмарка, <code>search-roots</code> ничего не выдавал, что говорило о том, что эти объекты &quot;висят в воздухе&quot; и GC вполне мог бы их удалить.</p> - -<p>Потом я дополнительно проверил свою гипотезу того, что память не освобождается из-за того, что очередь забивается слишком большим количеством объектов. Для этого поменял код отправляющий сообщения в акторы так, чтобы каждые 10000-20000 сообщений случался <code>(sleep 0.1)</code>. И это помогло - GC стал подчищать сообщения своевременно, они перестали накапливаться в старших поколениях GC.</p> - -<p>Но что более удивительно, так это то, что замедление в генерации сообщений привело к увеличению пропускной способности актора. Без sleep он обрабатывал примерно 777 тыс. сообщений в секунду, а со sleep стал успевать обработать 821 тыс..</p> - -<p>Вероятно, ускорение связано с тем, что при более медленной генерации мусора, тот не успевает накапливаться в памяти и GC тратит меньше времени на сборку.</p> - -<p>Без слипа:</p> - -<pre><code>Times: 16000000 -Evaluation took: - 20.572 seconds of real time - 58.627387 seconds of total run time (23.984544 user, 34.642843 system) - [ Real times consist of 4.297 seconds GC time, and 16.275 seconds non-GC time. ] - [ Run times consist of 3.778 seconds GC time, and 54.850 seconds non-GC time. ] - 284.98% CPU - 208 forms interpreted - 3,068,032,944 bytes consed -</code></pre> - -<p>С задержкой генерации сообщений:</p> - -<pre><code>Evaluation took: - 19.483 seconds of real time - 24.618729 seconds of total run time (17.348749 user, 7.269980 system) - [ Real times consist of 0.044 seconds GC time, and 19.439 seconds non-GC time. ] - [ Run times consist of 0.044 seconds GC time, and 24.575 seconds non-GC time. ] - 126.36% CPU - 208 forms interpreted - 3,065,746,080 bytes consed -</code></pre> - -<p>Из этих данных видно, что хотя non-GC время и увеличилось на несколько секунд, GC время сократилось на пару порядков.</p> - -<p>Замедление порой приводит к ускорению. Такие дела!</p> -<strong>Обсудить пост в <a href="https://t.me/c/2102092834/15">Telegram канале</a>.</strong> -https://40ants.com/ru/posts/pochemu-gc-sbcl-mozhet-14/Sat, 01 Feb 2025 13:24:23 +0000<p>Последнее время я работаю над новой версией фреймфорка для создания Telegram ботов. Этот фреймворк использует библиотеку реализующую акторы. И нем обнаружился досадный баг, который я намеревался исправить. Однако в процессе исправления оказалось, что оно может повлиять на производительность. Хорошо что у автора отыскался benchmark с помощью которого можно проверить скорость работы актора.</p> +https://40ants.com/ru/posts/pochemu-gc-sbcl-mozhet-14/Sat, 01 Feb 2025 13:32:25 +0000<p>Последнее время я работаю над новой версией фреймфорка для создания Telegram ботов. Этот фреймворк использует библиотеку реализующую акторы. И нем обнаружился досадный баг, который я намеревался исправить. Однако в процессе исправления оказалось, что оно может повлиять на производительность. Хорошо что у автора отыскался benchmark с помощью которого можно проверить скорость работы актора.</p> <p>К моему удивлению этому бенчмарку не хватало 4G памяти для хоть сколько-нибудь длительной работы. Более того, если бенчмарк запустить ненадолго, то оказывалось, что после его работы процесс &quot;толстел&quot; на 2.5G и не отпускал эту память до тех пор, пока не сделаешь вручную <code>(sb-ext:gc :full t)</code>.</p> @@ -191,6 +89,8 @@ Evaluation took: <p>Так я оказался втянут в исследование того, почему garbage collector SBCL не очищает кучу мусора оставшуюся после теста.</p> +<!--more--> + <p>Прошло три дня.</p> <p>После некоторых исследований у меня появилась гипотеза, почему GC не очищает память.</p> @@ -293,7 +193,7 @@ Evaluation took: <p>Замедление порой приводит к ускорению. Такие дела!</p> <strong>Обсудить пост в <a href="https://t.me/c/2102092834/15">Telegram канале</a>.</strong> Matrix Badger для GitHubhttps://40ants.com/ru/posts/matrix-badges/<p>Сегодня расскажу ещё про один мой проект, который так и не превратился в продукт. Правда в отличие от 12forks.com, этот проект жив до сих пор. Проект связан с GitHub и полезен тем, кто развивает фреймворк или библиотеку, предназначенную для разных платформ, языков программирования или операционных систем.</p> -https://40ants.com/ru/posts/matrix-badges/Sat, 01 Feb 2025 13:24:23 +0000<p>Сегодня расскажу ещё про один мой проект, который так и не превратился в продукт. Правда в отличие от 12forks.com, этот проект жив до сих пор. Проект связан с GitHub и полезен тем, кто развивает фреймворк или библиотеку, предназначенную для разных платформ, языков программирования или операционных систем.</p> +https://40ants.com/ru/posts/matrix-badges/Sat, 01 Feb 2025 13:32:25 +0000<p>Сегодня расскажу ещё про один мой проект, который так и не превратился в продукт. Правда в отличие от 12forks.com, этот проект жив до сих пор. Проект связан с GitHub и полезен тем, кто развивает фреймворк или библиотеку, предназначенную для разных платформ, языков программирования или операционных систем.</p> <!--more--> @@ -307,7 +207,7 @@ Evaluation took: <p>Вообще мне кажется что сложно сделать так, чтобы разработчики платили за подобные продукты. У нас же как, если кто-то за что-то хочет с нас копеечку - сразу возникает мысль: &quot;Я же могу сделать сам и даже лучше!&quot; :)))</p> Помощник для Opensource разработчиковhttps://40ants.com/ru/posts/12forks/<p>Сегодня хочу рассказать про один из своих прошлых проектов. Когда-то у меня появилась идея, как упростить себе обработку большого числа пулл-реквестов и issue в своих opensource проектах. И тогда я сделал сайт 12forks.com (сейчас уже недоступен, как выглядела главная страница можно глянуть <a href="https://web.archive.org/web/20211124152220/https://12forks.com/">через WebArchive</a>).</p> -https://40ants.com/ru/posts/12forks/Sat, 01 Feb 2025 13:24:23 +0000<p>Сегодня хочу рассказать про один из своих прошлых проектов. Когда-то у меня появилась идея, как упростить себе обработку большого числа пулл-реквестов и issue в своих opensource проектах. И тогда я сделал сайт 12forks.com (сейчас уже недоступен, как выглядела главная страница можно глянуть <a href="https://web.archive.org/web/20211124152220/https://12forks.com/">через WebArchive</a>).</p> +https://40ants.com/ru/posts/12forks/Sat, 01 Feb 2025 13:32:25 +0000<p>Сегодня хочу рассказать про один из своих прошлых проектов. Когда-то у меня появилась идея, как упростить себе обработку большого числа пулл-реквестов и issue в своих opensource проектах. И тогда я сделал сайт 12forks.com (сейчас уже недоступен, как выглядела главная страница можно глянуть <a href="https://web.archive.org/web/20211124152220/https://12forks.com/">через WebArchive</a>).</p> <!--more--> @@ -321,7 +221,7 @@ Evaluation took: <p>Как думаете, стоит ли возродить этот проект?</p> Результаты хакатона ЛЦТ 2023https://40ants.com/ru/posts/hrzero/<p>В <a href="https://www.youtube.com/watch?v=Zpn86AQRVN8">последнем видео</a> на YouTube канале я рассказываю о проекте HrZero, который мы с одним товарищем делали на хакатоне Лидеры Цифровой Трансформации осенью 2023. Задача была создать сервис онбординга сотрудников, но мы, как всегда постарались сделать больше, чем от нас требовалось. В результате, в нашем сервисе онбординга появилась мини-игра, позволяющая новому сотруднику запомнить своих коллег. Эта идея нам так понравилась, что решили сделать из неё отдельный проект. Так появился https://mememo.ru.</p> -https://40ants.com/ru/posts/hrzero/Sat, 01 Feb 2025 13:24:23 +0000<p>В <a href="https://www.youtube.com/watch?v=Zpn86AQRVN8">последнем видео</a> на YouTube канале я рассказываю о проекте HrZero, который мы с одним товарищем делали на хакатоне Лидеры Цифровой Трансформации осенью 2023. Задача была создать сервис онбординга сотрудников, но мы, как всегда постарались сделать больше, чем от нас требовалось. В результате, в нашем сервисе онбординга появилась мини-игра, позволяющая новому сотруднику запомнить своих коллег. Эта идея нам так понравилась, что решили сделать из неё отдельный проект. Так появился https://mememo.ru.</p> +https://40ants.com/ru/posts/hrzero/Sat, 01 Feb 2025 13:32:25 +0000<p>В <a href="https://www.youtube.com/watch?v=Zpn86AQRVN8">последнем видео</a> на YouTube канале я рассказываю о проекте HrZero, который мы с одним товарищем делали на хакатоне Лидеры Цифровой Трансформации осенью 2023. Задача была создать сервис онбординга сотрудников, но мы, как всегда постарались сделать больше, чем от нас требовалось. В результате, в нашем сервисе онбординга появилась мини-игра, позволяющая новому сотруднику запомнить своих коллег. Эта идея нам так понравилась, что решили сделать из неё отдельный проект. Так появился https://mememo.ru.</p> <!--more--> @@ -332,7 +232,7 @@ Evaluation took: Идея трансляции Telegram канала в статический сайтhttps://40ants.com/ru/posts/telegram-reposter/<p><img src="https://40ants.com/ru/posts/images/10.jpg" alt=""></p> <p>Привет, друзья! Сегодня я хочу поделиться с вами интересной идеей, которая пришла мне в голову недавно. Я сейчас вникаю в то, как продвигать свои проекты, а через них и Common Lisp. Ну, знаете, SEO там всякий, маркетинг. И вот что я придумал!</p> -https://40ants.com/ru/posts/telegram-reposter/Sat, 01 Feb 2025 13:24:23 +0000<p><img src="https://40ants.com/ru/posts/images/10.jpg" alt=""></p> +https://40ants.com/ru/posts/telegram-reposter/Sat, 01 Feb 2025 13:32:25 +0000<p><img src="https://40ants.com/ru/posts/images/10.jpg" alt=""></p> <p>Привет, друзья! Сегодня я хочу поделиться с вами интересной идеей, которая пришла мне в голову недавно. Я сейчас вникаю в то, как продвигать свои проекты, а через них и Common Lisp. Ну, знаете, SEO там всякий, маркетинг. И вот что я придумал!</p> @@ -351,7 +251,7 @@ Evaluation took: Сайт со сказкамиhttps://40ants.com/ru/posts/skazorama/<p>Продолжая тему моих неудачных проектов, хочу рассказать ещё об одном сайте – Skazorama.ru.</p> <p>Идея этого проекта была в том, чтобы сделать бесконечную ленту сказок, которые можно почитать детям. При чём, открывая сайт на телефоне, родитель видел новые сказки, которые ещё не читал своему ребёнку. Если сказка не понравилась, то её можно было просто промотать, и вслед за ней подгружалась следующая. При этом сервис воспринимал такую промотку как &quot;dislike&quot; и в будущем я рассчитывал прикрутить ML, чтобы рекомендовать именно те сказки, которые с большей вероятностью понравятся ребёнку.</p> -https://40ants.com/ru/posts/skazorama/Sat, 01 Feb 2025 13:24:23 +0000<p>Продолжая тему моих неудачных проектов, хочу рассказать ещё об одном сайте – Skazorama.ru.</p> +https://40ants.com/ru/posts/skazorama/Sat, 01 Feb 2025 13:32:25 +0000<p>Продолжая тему моих неудачных проектов, хочу рассказать ещё об одном сайте – Skazorama.ru.</p> <p>Идея этого проекта была в том, чтобы сделать бесконечную ленту сказок, которые можно почитать детям. При чём, открывая сайт на телефоне, родитель видел новые сказки, которые ещё не читал своему ребёнку. Если сказка не понравилась, то её можно было просто промотать, и вслед за ней подгружалась следующая. При этом сервис воспринимал такую промотку как &quot;dislike&quot; и в будущем я рассчитывал прикрутить ML, чтобы рекомендовать именно те сказки, которые с большей вероятностью понравятся ребёнку.</p> @@ -368,7 +268,7 @@ Evaluation took: <p>Как видите, Сказорама ещё раз доказывает, что проекты которые делаются лишь для удовлетворения потребностей одного только создателя обречены. Надо сразу думать о монитизации. Кастати, на эту тему мне сегодня попалась статейка на VC, которая так и называется &quot;Делаете стартап? — Сначала продай, а потом делайте! Можно иначе? Да, но продай сначала&quot;.</p> А что вы думаете о подходе, когда с самого начала всё закручивается вокруг денег, а технологии вторичны? AllMyChanges.comhttps://40ants.com/ru/posts/allmychanges/<p>Мне всю жизнь нравится что-то придумывать и конструировать. Просто не могу сидеть без дела. Поэтому я постоянно пишу какие-то небольшие проектики помимо основной работы. Но долгое время я не понимал, что чтобы проект &quot;полетел&quot;, нужно вкладывать хотя бы половину времени в его продвижение - каст-дев, маркетинг, SEO. Сегодня, и в нескольких следующих постах хочу рассказать вам про мои неудачные проекты.</p> -https://40ants.com/ru/posts/allmychanges/Sat, 01 Feb 2025 13:24:23 +0000<p>Мне всю жизнь нравится что-то придумывать и конструировать. Просто не могу сидеть без дела. Поэтому я постоянно пишу какие-то небольшие проектики помимо основной работы. Но долгое время я не понимал, что чтобы проект &quot;полетел&quot;, нужно вкладывать хотя бы половину времени в его продвижение - каст-дев, маркетинг, SEO. Сегодня, и в нескольких следующих постах хочу рассказать вам про мои неудачные проекты.</p> +https://40ants.com/ru/posts/allmychanges/Sat, 01 Feb 2025 13:32:25 +0000<p>Мне всю жизнь нравится что-то придумывать и конструировать. Просто не могу сидеть без дела. Поэтому я постоянно пишу какие-то небольшие проектики помимо основной работы. Но долгое время я не понимал, что чтобы проект &quot;полетел&quot;, нужно вкладывать хотя бы половину времени в его продвижение - каст-дев, маркетинг, SEO. Сегодня, и в нескольких следующих постах хочу рассказать вам про мои неудачные проекты.</p> <!--more-->