announcements

Project/library announcements ONLY - use threaded replies for discussions. Do not cross post here from other channels. Consider #events or #news-and-articles for other announcements.
chrisn 2021-03-18T15:14:06.073300Z

Here is a simple video encoding library for Clojure: https://github.com/cnuernber/avclj I wrote this as an example of how simple interfacing with C systems can be and to show how nice using the deps.edn pathway is for a clojure library. It sits directly on top of the libavcodec series of shared libraries used by ffmpeg - it loads them dynamically and then you pass frames directly to the library. I have included a simple example of using Skija to render to a native buffer that is then passed directly into the encode-frame! method. Use this if you have a need to render videos of your crazy Clojure pixel art πŸ™‚.

πŸ‘ 1
πŸŽ‰ 16
πŸ“Ή 2
Helins 2021-03-18T15:18:15.075Z

Dear friends, a new much improved version of BinF, a Clojure/script library for handling any kind of binary formats /protocols in a simple yet powerful way. I've used it with great success for things like MIDI processing and a WebAssembly decompiler. I find it really capable, flexible, and feature-rich. It provides probably more than you need. Hope it will sprout new super use cases: https://github.com/helins/binf.cljc

πŸ‘ 3
1
cassiel 2021-03-19T10:28:33.112400Z

The award will, of course, be in binary.

😁 2
πŸ”Ÿ 1
cassiel 2021-03-18T18:25:18.076900Z

Nice. I have a Node-hosted sysex librarian to finish. This could well be useful.

2021-03-18T18:33:59.077300Z

This looks great! I also nominate your READMEs description of your support for 64-bit integers for the "README Hall of Fame":

It is not the most beautiful experience one will encounter in the course of a lifetime but it works and does the job pretty efficiently.

βž• 1
phronmophobic 2021-03-18T18:37:55.077500Z

This is really neat! Would it be possible to make a simple video player using avclj?

chrisn 2021-03-18T19:15:58.077800Z

Yes it would be possible. The decode pathways in my opinion are much harder than the encode pathways but all the necessary pieces are there. I could provide a function that gives you a sequence of close-able buffer objects or something that had each frame's information such as the image, the microsecond time and duration. The waters are fairly deep with FFmpeg; the encoder took a lot of head scratching before it produced videos that worked on cellphones.

alexmiller 2021-03-18T19:20:25.078500Z

After a slight delay, https://clojure.org/releases/devchangelog#v1.11.0-alpha1 is now available! β€’ https://clojure.atlassian.net/browse/CLJ-2603 Clojure keyword argument functions now also accept a map, see https://clojure.org/news/2021/03/18/apis-serving-people-and-programs

πŸ‘ 5
πŸ’― 15
16
26
🀯 1
1
πŸŽ‰ 7
vemv 2021-03-19T08:05:11.105Z

Thanks, that's useful! I asked partly because I was under the impression that for the following programmer intent:

(defn foo [& {:keys [a b c]}])
...one could emit internally two arities. In Clojure pseudocode:
(defn foo
  ([m])
  ([k v & kvs]))
The point being, if you invoke the arity 1 (by using {} caller-side instead of kwargs), you'd get the best possible performance. Which would seem a sweet spot: one can opt to consume defns in a more performant way, while keeping full flexibility.

alexmiller 2021-03-19T08:06:50.105200Z

yes, that was one of many options we considered

πŸ‘ 1
πŸ™‚ 1
seancorfield 2021-03-18T19:28:29.079Z

user=> (let [[& {:keys [a b] :as opts}] [{:a 1 :b 2}]] [a b opts])
[1 2 {:a 1, :b 2}]
user=> (let [[& {:keys [a b] :as opts}] [:a 1 :b 2]] [a b opts])
[1 2 {:a 1, :b 2}]

seancorfield 2021-03-18T19:29:06.079500Z

Compared to 1.10.3:

Clojure 1.10.3
user=> (let [[& {:keys [a b] :as opts}] [{:a 1 :b 2}]] [a b opts])
Execution error (IllegalArgumentException) at user/eval140 (REPL:1).
No value supplied for key: {:a 1, :b 2}
user=> (let [[& {:keys [a b] :as opts}] [:a 1 :b 2]] [a b opts])
[1 2 {:b 2, :a 1}]

seancorfield 2021-03-18T19:29:30.079800Z

So, no, it changes destructuring β€œeverywhere”.

seancorfield 2021-03-18T19:30:28.080Z

@zane You’re trying to destructuring a sequence as a map β€” the change in 1.11 is the other way round, effectively, destructuring a map as a sequence of named arguments.

seancorfield 2021-03-18T19:31:10.080300Z

I will update us to 1.11 Alpha 1 at work and see if it breaks anything!

alexmiller 2021-03-18T19:52:31.081900Z

I should also mention that the destructuring docs have also been updated (they actually never had been updated to include keyword argument support and there were no published semantics about that anywhere). Also, the doc has been extended to cover this new 1.11 capability https://clojure.org/reference/special_forms#keyword-arguments

phronmophobic 2021-03-18T20:28:34.083500Z

FFmpeg is such a useful library, it's something I've been meaning to dive into myself. I'm familiar with jna and it would probably be good for me to also learn from how you've been using jna based off your excellent work with libpython-clj. I'll check it out and see how it goes.

phronmophobic 2021-03-18T20:30:43.083700Z

wow, I did not know about this trick, https://github.com/cnuernber/avclj/blob/master/cpptest/compile64.sh#L1 Very cool. I've been using python-clang to try to get struct info.

phronmophobic 2021-03-18T20:42:31.084400Z

🀯 , this stuff is awesome, https://cnuernber.github.io/dtype-next/tech.v3.datatype.ffi.html. Is the ffi stuff graalvm compatible?

hlship 2021-03-18T20:51:59.085200Z

This seems like a clever little change though to be honest I don't like the kw-args approach, I'm always happy enough to just use an optional map parameter on my functions. A lot of confusion to save two characters. It's feels like a rare example of Clojure doing something "to be cool looking" (the kw args in the first place, not this new change).

βž• 2
hlship 2021-03-18T20:52:41.085400Z

Also, I think the example in the release notes would be slightly more useful if it showed a mix of kw args and a map.

βž• 1
chrisn 2021-03-18T22:03:21.086100Z

Not at this time. I am working on it right now. It is JNA and JDK-16 compatible.

phronmophobic 2021-03-18T22:05:46.086800Z

Well, either way, there's some really great c interop code here and I look forward to simplifying some of my c interop code in the future. Thanks! :thumbsup:

chrisn 2021-03-18T22:10:32.087Z

You are so welcome! I will post of course when I get a graal native pathway working. The target is some clojure code along with some python stuff all wrapped up into a graal native shared library that is then loaded via cython.

🀘 1
phronmophobic 2021-03-18T22:17:34.087400Z

Eventually, I'd like to be able to spit out apps a shared library that can be loaded and ran on mobile using a prebuilt iOS/android app

🀘 1
vemv 2021-03-18T22:48:04.088Z

Is there a performance difference between using the new & and no & at all? (i.e. a vanilla, fixed map arg)

Helins 2021-03-18T22:57:42.088300Z

Then I shall accept the honor!