#clojure #проекты
В том году взял на себя труд изучить
• форка популярной, но заброшенной автором библиотеки для
• вьетнамских флэшбеков от погружения всточную канаву экосистему
• пре-альфа-версии веб-сервиса, предназначенного для погружения в бессознательное с помощью снов,подробнее пока спойлерить не буду, с потенциальной перспективой монетизации. Пока не выкладываю в паблик, потому что стыдно всё пока жутко недоделанное, даже дизайн я делал вот этой парой рук 🙌, а они для этого совсем не предназначены)
По-прежнему жду, что случится чудо и в сутках будет хотя бы часов по 80, чтобы я мог успевать уделять внимание всем своим проектам 😅
В том году взял на себя труд изучить
Clojure
на практике — в рамках реализации одной из своих давнишних идей. В результате я теперь являюсь обладателем:• форка популярной, но заброшенной автором библиотеки для
ClojureScript
, в котором я собрал все фиксы от коммьюнити;• вьетнамских флэшбеков от погружения в
node.js
;• пре-альфа-версии веб-сервиса, предназначенного для погружения в бессознательное с помощью снов,
По-прежнему жду, что случится чудо и в сутках будет хотя бы часов по 80, чтобы я мог успевать уделять внимание всем своим проектам 😅
GitHub
GitHub - lockie/re-frame-cookie-fx: Oh cookie, yummy!
Oh cookie, yummy! Contribute to lockie/re-frame-cookie-fx development by creating an account on GitHub.
👍3🔥1
#clojure
Вспоминал тут про один свой давнишний пет-проект в виде вебсайта на Python/Django, к которому уже давно пора прикрутить рекламу и окончательно забыть, чтобы хотя бы затраты на хостинг отбивать. Пришла в голову шальная мысль, а почему бы его не переписать на каком-нибудь лиспе, например, на наиболее подходящей для веба Clojure. Единственное, что останавливает — что в мире Clojure(Script) нет ничего даже близкого к джанговской админке, чтобы натравил её на табличку в БД, а она тебе готовый веб-интерфейс для управления объектами в ней, даром что веб–1.0-ный. Типичный ответ на вопрос о такой фиче — "тут вам не полновесная Django, а скорее минималистичный Flask, делайте сами".
Можно даже попробовать занять эту нишу — написать для кложуровского ring нехитрую библиотеку, которая будет ходить в заданную табличку в БД и предоставлять к ней административный интерфейс; правда, там ещё миллион мелочей, вроде авторизации, аудита, возможности расширения, смены дизайна интерфейса и т.д.
Ну и это закрывая глаза на факт, что я итак уже с трудом вывожу все свои проекты 🤣
Вспоминал тут про один свой давнишний пет-проект в виде вебсайта на Python/Django, к которому уже давно пора прикрутить рекламу и окончательно забыть, чтобы хотя бы затраты на хостинг отбивать. Пришла в голову шальная мысль, а почему бы его не переписать на каком-нибудь лиспе, например, на наиболее подходящей для веба Clojure. Единственное, что останавливает — что в мире Clojure(Script) нет ничего даже близкого к джанговской админке, чтобы натравил её на табличку в БД, а она тебе готовый веб-интерфейс для управления объектами в ней, даром что веб–1.0-ный. Типичный ответ на вопрос о такой фиче — "тут вам не полновесная Django, а скорее минималистичный Flask, делайте сами".
Можно даже попробовать занять эту нишу — написать для кложуровского ring нехитрую библиотеку, которая будет ходить в заданную табличку в БД и предоставлять к ней административный интерфейс; правда, там ещё миллион мелочей, вроде авторизации, аудита, возможности расширения, смены дизайна интерфейса и т.д.
Ну и это закрывая глаза на факт, что я итак уже с трудом вывожу все свои проекты 🤣
😢2👍1🤔1
#clojure
Минутка бесстыдной рекламы: вот уже в этот четверг, 27 апреля, начнётся первый поток курса Clojure Developer в Otus, к которому ваш покорный немножко приложил руку, и, более того, будет вести в нём несколько занятий. Команда курса собрана очень сильная, поэтому, если всегда хотелось занырнуть в мир разработки на Clojure, добро пожаловать 😊
Минутка бесстыдной рекламы: вот уже в этот четверг, 27 апреля, начнётся первый поток курса Clojure Developer в Otus, к которому ваш покорный немножко приложил руку, и, более того, будет вести в нём несколько занятий. Команда курса собрана очень сильная, поэтому, если всегда хотелось занырнуть в мир разработки на Clojure, добро пожаловать 😊
otus.ru
Курс clojure Developer
Best Practices по одному из любимых языков разработчиков
❤2
#лытдыбр #clojure
Между делом тут решил сделать небольшой пет-проект на злобу дня в виде вебсервиса на Clojure. Примерно прикинул используемый стек и куда и как буду развёртывать, начал писать код, разбирая шаблон Luminus на отдельные запчасти и выкидывая ненужные. И вот встал вопрос взаимодействия вебсервиса с БД, и тут я задумался.
Штука в том, что в подавляющем большинстве случаев в Java и, как следствие, в Clojure вопросы масштабирования всегда решаются тред-пулами, хотя вот уже лет десять как самый модный подход для их решения — асинхронщина на основе интерфейсов мультиплексирования ввода-вывода а-ля, не то что лисперский чатик, в котором мы только и знаем, что про коммунизм сраться 😅 . Там мне объяснили, что нужно не выёживаться и использовать тред-пулы 😁 Я решил показать преимущества асинхронного подхода на примере и вчера уже к ночи сделал бенчмарк на чистой сишечке, чтобы не оглядываться на рантайм языка.
Как бенчмарк устроен:
1. Два варианта, синхронный и асинхронный. Оба запускаются с заданным количеством тредов и запускают в каждом серверный цикл, с помощью флажка
2. Сценарий обработки следующий: дожидаемся конца запроса от клиента (путём поиска
3. Синхронный вариант ждёт ответа от БД в блокирующем режиме; таким образом, для него 1 тред = 1 обрабатываемый в данный момент клиент.
4. Асинхронный вариант отправляет запрос в БД, закидывает сокет соединения с БД в общий eventloop и уходит на следующую его итерацию, таким образом, один тред с одним циклом событий может "одновременно" обрабатывать сколь угодно много клиентов. Всегда мечтал поиспользовать C-шный интерфейс к
5. Для теста использовал
По результатам асинхронный вариант изи достиг максимальной производительности в два потока (строго говоря, даже в один, но что я, зря код для многопоточного epoll писал 😂). В то же время синхронному варианту для этого понадобилось 100 тредов, да и то была парочка таймаутов; собственно, по дефолту в PostgreSQL
Написал в кложа-чатике, но там меня снова убедили, что с тред-пулом по сути всё то же самое, просто нужно аккуратно его настроить, и накидали ссылок для изучения ❤️
Между делом тут решил сделать небольшой пет-проект на злобу дня в виде вебсервиса на Clojure. Примерно прикинул используемый стек и куда и как буду развёртывать, начал писать код, разбирая шаблон Luminus на отдельные запчасти и выкидывая ненужные. И вот встал вопрос взаимодействия вебсервиса с БД, и тут я задумался.
Штука в том, что в подавляющем большинстве случаев в Java и, как следствие, в Clojure вопросы масштабирования всегда решаются тред-пулами, хотя вот уже лет десять как самый модный подход для их решения — асинхронщина на основе интерфейсов мультиплексирования ввода-вывода а-ля
epoll(7)
в Linux или kqueue(2)
в *BSD. Полез подробнее изучать вопрос, выяснилось, что на самом деле в топе известных бенчмарков от Techempower по Clojure находится решение с асинхронным жабовским сервером Undertow и очень экспериментальным асинхронным драйвером БД от наших финских коллег из Metosin porsas. Поспрашивал в русскоязычном чатике по Clojure, кстати, очень крутое сообществоКак бенчмарк устроен:
1. Два варианта, синхронный и асинхронный. Оба запускаются с заданным количеством тредов и запускают в каждом серверный цикл, с помощью флажка
SO_REUSEPORT
на серверном сокете.2. Сценарий обработки следующий: дожидаемся конца запроса от клиента (путём поиска
\r\n\r\n
в конце буфера), делаем в PostgreSQL запрос SELECT pg_sleep(5)
, отвечаем клиенту HTTP/1.0 204 No Content
, обрываем соединение.3. Синхронный вариант ждёт ответа от БД в блокирующем режиме; таким образом, для него 1 тред = 1 обрабатываемый в данный момент клиент.
4. Асинхронный вариант отправляет запрос в БД, закидывает сокет соединения с БД в общий eventloop и уходит на следующую его итерацию, таким образом, один тред с одним циклом событий может "одновременно" обрабатывать сколь угодно много клиентов. Всегда мечтал поиспользовать C-шный интерфейс к
libpq
в асинхронном режиме, вот и довелось, правда, место в документации, где этот вариант описывается, зачитал до дыр, прежде чем сделал 😅5. Для теста использовал
wrk
с 10 одновременными соединениями в течение минуты, таким образом, максимальная теоретическая производительность в этом бенчмарке — 10 / 5 = 2 запроса в секунду; напомню, запрос обрабатывается минимум 5 секунд из-за эмуляции медленных запросов в базе через pg_sleep(5)
.По результатам асинхронный вариант изи достиг максимальной производительности в два потока (строго говоря, даже в один, но что я, зря код для многопоточного epoll писал 😂). В то же время синхронному варианту для этого понадобилось 100 тредов, да и то была парочка таймаутов; собственно, по дефолту в PostgreSQL
max_connections
как раз 100, и мне было лень его подкручивать выше.Написал в кложа-чатике, но там меня снова убедили, что с тред-пулом по сути всё то же самое, просто нужно аккуратно его настроить, и накидали ссылок для изучения ❤️
GitLab
Andrew Kravchuk / async-benchmark · GitLab
❤6🔥1
#лытдыбр #мемасики #clojure
Создал так называемый интернет-мэм, начитавшись в социальной сети Тваттер срачей "Авторизация через OAuth-провайдеров vs классическая самодельная по паролю", в которых апологеты последней всё никак не могут внятно сформулировать, чем плоха авторизация с помощью провайдера таковой, который уже решил все вопросы с безопасностью, "GOOGLE BAD" и всё тут.
В веб-сервисе на Clojure, который я пилю в свободное от работы время, конечно, авторизация будет отдана на аутсорс (уже наладил через Google), я пока не настолько сошёл с ума, чтобы вручную реализовывать такую важную вещь, или полагаться на Clojure-овский buddy, который, мягко говоря, заброшен 😅
Создал так называемый интернет-мэм, начитавшись в социальной сети Тваттер срачей "Авторизация через OAuth-провайдеров vs классическая самодельная по паролю", в которых апологеты последней всё никак не могут внятно сформулировать, чем плоха авторизация с помощью провайдера таковой, который уже решил все вопросы с безопасностью, "GOOGLE BAD" и всё тут.
В веб-сервисе на Clojure, который я пилю в свободное от работы время, конечно, авторизация будет отдана на аутсорс (уже наладил через Google), я пока не настолько сошёл с ума, чтобы вручную реализовывать такую важную вещь, или полагаться на Clojure-овский buddy, который, мягко говоря, заброшен 😅
👍3
#проекты #clojure
На той неделе поучаствовал в летнем хакатоне HealthSamurai, где умудрился за три дня пройти от давно вынашиваемой идеи до рабочего прототипа и сделал на Clojure бота, уведомляющего об обновлениях версий используемых библиотек в произвольных проектах (ну как произвольных, пока только на Clojure и Python), этакий аналог Snyk, но в телеграме. Вот видос с таймкодом, где я рассказываю о том, что удалось сделать на хакатоне, а вот и сам бот — он пока в открытом бета-тесте и бесплатный 😊
На той неделе поучаствовал в летнем хакатоне HealthSamurai, где умудрился за три дня пройти от давно вынашиваемой идеи до рабочего прототипа и сделал на Clojure бота, уведомляющего об обновлениях версий используемых библиотек в произвольных проектах (ну как произвольных, пока только на Clojure и Python), этакий аналог Snyk, но в телеграме. Вот видос с таймкодом, где я рассказываю о том, что удалось сделать на хакатоне, а вот и сам бот — он пока в открытом бета-тесте и бесплатный 😊
YouTube
Summer Hackathon | 3rd Day
👍8❤2