git-of-theseus
core.async
git-of-theseus | core.async | |
---|---|---|
13 | 9 | |
2,362 | 1,936 | |
- | -0.1% | |
4.3 | 5.1 | |
6 months ago | 3 months ago | |
Python | Clojure | |
Apache License 2.0 | Eclipse Public License 1.0 |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
git-of-theseus
-
I Parsed Git Statistics
https://github.com/erikbern/git-of-theseus
- The half-life of code and the ship of Theseus
-
Show HN: Visualize the Entropy of a Codebase with a 3D Force-Directed Graph
A tangentially related tool you can use to look at a repo over time is Git of Theseus[1]. It shows things like "what percentage of the code in this repo survives 6 months.
[1]https://erikbern.com/2016/12/05/the-half-life-of-code.html
-
The Road to 128 bit Linux
There're some more in the presentation article: https://erikbern.com/2016/12/05/the-half-life-of-code.html#:...
A kernel line has half-life 6.6 years.
-
How to look at familiar codebase with “fresh” eyes again
Look at the codebase with Git of Theseus or Codescene
-
Rich Hickey – open-source is Not About You
I guess one good example (that was mentioned just yesterday here on HN) would be Flask vs FastAPI: https://news.ycombinator.com/item?id=31953470 - "There are no open issues or pull requests on Flask "
Quick count finds that FastAPI has 48422 lines of code, while Flask has 9995. Flask just achieved "Zero standing issues/PRs" while FastAPI has 1.1K open issues and ~500 open PRs.
Large surface area/API quickly leads to be overwhelmed when you're trying to maintain it. Adding new features/fixing existing ones becomes harder as well.
Best bet to make sure something is maintainable over time is to add as little as possible to it, and if you really have to, make sure you're also removing something at the same time.
Otherwise you need a massive team just to be able to "survive" and not making things rot.
There is this blogpost as well about the "half-life of code": https://erikbern.com/2016/12/05/the-half-life-of-code.html
Someone run that tool on the Clojure codebase as well, and it really shows how well the Clojure codebase has been written, as most code that was initially written is still there and does what it needs, without having to be rewritten.
- Show HN: Git Timeline Generator – Visualize contributions to any Git project
-
Do you think it's possible to automatically detect Technical Debt from the source code?
Some parts of technical debt, you can find with https://github.com/erikbern/git-of-theseus or https://codescene.com/
- Git-of-Theseus – Analyze how a Git repo grows over time
core.async
-
How to handle concurrency in Clojure with core.async
Hey, how you doing? This article was written right after I had to painstakingly read the clojure.core.async source code in order to finish a task. So, I hope I save you from the same fate as I had 😄.
- Como desenvolvi um backend web em Clojure
-
Comparison of manifold and clojure.core.async
It was created by Rich Hickey: https://github.com/clojure/core.async/commit/47b1d24c0291050a1188dbeee2fc9227f694eb3c don't think he's disavowed it lol.
-
Sleeping is not the best option
Some time ago we developed some helpers using the capturing notifications strategy to test asynchronous ClojureScript code that was using core.async channels. Have a look at, for instance, the expect-async-message assertion helper in which we use core.async/alts! and core.async/timeout to implement this behaviour. The core.async/alts! function selects the first channel that responds. If that channel is the one the test code was observing we assert that the received message is what we expected. If the channel that responds first is the one generated by core.async/timeout we fail the test. We mentioned these async-test-tools in previous post: Testing Om components with cljs-react-test.
-
What is the difference between Manifold and core.async?
Hi there I'm using Clojure almost a year. I've played with both Manifold and core.async a bit but I'm not %100 sure when to use core.async over Manifold or vice versa.
-
Rich Hickey – open-source is Not About You
If you're not familiar with lisps in general, it might be hard to grok the differences between lisp-macros (as used in Clojure) and "normal" macros you see in other languages.
But, if you are familiar already, and just wanna see examples of neat macros that makes the API nicer than what a function could provide, here are a few:
- https://github.com/clojure/core.async/blob/master/examples/w...
- https://github.com/weavejester/compojure
- https://github.com/ptaoussanis/timbre
- https://github.com/krisajenkins/yesql
-
The Clojure Mindshare (2019)
https://github.com/clojure/core.async
> and with a very poor tooling (lack of IDE's)
Lisps have fantastic support in Emacs and VSCode and are in general simple enough languages that often the heavyweight of an IDE is not needed. But if you want IDEs there are:
- 6 Years of Professional Clojure
-
Equivalent of select in core.async?
If you don't want to block the current thread, you can do the looking/waiting on another thread via thread or in a go using alts! .
What are some alternatives?
Gource - software version control visualization
promesa - A promise library & concurrency toolkit for Clojure and ClojureScript.
pre-commit - A framework for managing and maintaining multi-language pre-commit hooks.
cloroutine - Coroutine support for clojure
compojure - A concise routing library for Ring/Clojure
zio-schema - Compositional, type-safe schema definitions, which enable auto-derivation of codecs and migrations.
pre-commit-hooks - Some out-of-the-box hooks for pre-commit
lein-ancient - Check your Projects for outdated Dependencies
ts-macros - A typescript transformer / plugin that allows you to write macros for typescript!
yesql - A Clojure library for using SQL.
shadow-cljs - ClojureScript compilation made easy