• 4 Posts
  • 135 Comments
Joined 1 year ago
cake
Cake day: July 6th, 2023

help-circle
  • Use libcosmic 😑

    No, but seriously… skip to the end.

    Iced and Egui both can’t handle Arabic, which is a deal breaker.

    Iced can handle Arabic shaping-wise when cosmic-text is used, but it can’t handle the direction (yet). If you only need it for the interface, a shit workaround would be to prefix all text with an RLM (RIGHT-TO-LEFT Mark). This would left-align all text of course.

    Iced takes forever to compile and iterate, maybe that’ll be fixed with dynamic linking.

    Fast iteration is already fixed by using cranelift in your release-dev profile (or whatever you want to call it), and mold as a linker. The binary will be slower, but iteration will be much much faster.


    Okay, something helpful instead: Did you try asking in the rust:gnome.org matrix room mentioned in the project page?


  • &Bar is a reference to something. That something is either a part of self, or a part of the static context. There is no other context because there is no runtime/GC. So there is no logical not-nonsensical scenario where this would be both a valid and a limiting situation in Rust. And this is why your surface analogy to Index is invalid.

    If the return value may depend on something other than self or the static context, and still need to be reference-like, then the trait definition is wrong. It should either return a Cow, or go for the obvious generalization of returning impl AsRef<Bar> values. With that generalization, references, Cows, and more can be returned.

    There is also the possibility that the trait definition is right, and you (the implementer) are trying to break a (probably) deliberate constraint (e.g. the return value in Index being tied to &self).

    I would wager a guess that what you call an escape hatchet is considered a very bad C# style anyway (or will/should be). Just like how mutable statics are considered very bad in Rust 😉







  • Sorry, I thought you meant the use of .. in Rust is odd. So I pointed out that {0..9} and{a..z}is also used at least in bash and zsh. That’s at least 10s of millions of users!

    I know of .. being used for appending by lua at least. So still not odd-ball I would argue, since the people who interacted with lua code in their life probably outnumber those who interacted with all functional languages combined.



  • Maybe this is a reductionist simplification of it, but his point is basically that, at least in the context of rust, async code is explicit and easy to introduce in a blocking context by simply blocking on it, while blocking code is not explicit about how blocky it is (and it’s not a binary), and thus, it’s not trivial to know where explicit unblocks are needed in an async context.

    Blocking on async code is usually done with some_executor::block_on(), of which some very lightweight implementations exist, combined with the possibility of not requiring that the data’s ownership be moved to the executor, nor is the data required to be Sendable to other threads (an executor doesn’t have to be a multi-threaded work-stealing one).

    Meanwhile, unblocking is done usually via blocking::unblock() or some_executor::spawn_blocking(), and doesn’t offer such flexibility.



  • I do think it would’ve been worth it to introduce ++ for general appending.

    I already mentioned (val..).next() which is both safe* and explicit about it being a generic stepping operation instead of possibly being sugar for {x = x + 1; x}.

    Also, calling it “appending” is weird for us folks coming from languages like C 😉

    * you don’t have to worry about what i32::MAX++ would/should return.



  • The general theme of your comment is good, but the example is…

    The string “AAAAA” cannot be said to be greater or less than “AAAAB”

    But in general the name “John” is not considered to be higher/lower than “Mark”

    // rust
      eprintln!("{}", "AAAAB" > "AAAAA") // true
      eprintln!("{}", "Mark" > "John") // true
    
    // C
      printf("%d\n", strcmp("AAAAB", "AAAAA")); // 1
      printf("%d\n", strcmp("Mark", "John")); // 1
    

    strcmp() docs:

    strcmp() returns an integer indicating the result of the comparison, as follows:

    • 0, if the s1 and s2 are equal;

    • a negative value if s1 is less than s2;

    • a positive value if s1 is greater than s2.

    So basically, if C had higher level constructs, it would be identical to Rust here.

    So, even if it is cool to manipulate strings by using addition/subtraction, it is still bad language design and very unintuitive.

    Rust has impl Add<&str> for String and impl AddAssign<&str> for String. Both append as expected.

    But maybe you meant numeric addition specifically.

    In that case, yes, Rust doesn’t have that, although it’s an impl<'a> Step for &'a str away from having something similar (it would be ("AAAAA"..).next()).

    impl Step for char already exists of course, but shouldn’t if we take your argument to its logical conclusion.

    Oh, and C would most definitely have this feature if it could. Numerical manipulation of chars is commonplace there.




  • Yeah. I read the linked explanation by OP.

    User repositories is basically how FMS on Freenet (now Hyphanet) works. The big difference is that JSON is used at AT instead of XML 😁. Also, things on Freenet are “content addressable” (what a buzz word) and immutable, always has been.

    General data scalability is a part of the Freenet network model. App bandwidth and sync is admittedly not optimal, since on FMS, you basically pull from everyone’s feed to your database (bar the ones you distrust, or others you trust their distrust judgment distrust). But that can be trivially fixed by adding watchers split over the keyspace. These watchers can give users metadata about who to pull/update from. This of course was never actually needed since the user-base is small.

    So reading about AT, I was left wondering. Is this really innovative? Then I read this part

    Our founding engineers were core IPFS and Dat engineers

    … and everything made sense. The masters of pretending they are coming up with new stuff are at it again.


  • Some shallow observations without really getting into the code:

    misc

    • Was hosting labeler/ResNet50_nsfw_model.pth in the repository really necessary?
      (I like my --filter=tree:0 clones to be maximally fast and small.)
    • Why not declare all dependencies in the workspace?
    • How old is the code (for real)?

    rsky-crypto

    • anyhow in library code.
    • Not liking that multibase dependency much either. I know that base64 at least got re-written since that crate’s last update (Nov 6, 2020).

    rsky-feedgen

    • serde_cbor is long dead (I was a user myself).
    • I’m not even sure why serde_cbor and serde_ipld_dagcbor are dependencies anyway.
    • We moved from lazy_static to once_cell a long time ago. And your use is available in std on stable Rust today.

    rsky-firehose

    • Here, all three CBOR dependencies are actually used.
    • CBOR (the format) used in $CURRENT_YEAR is meh anyway. But I guess that comes from IPLD.

    rsky-identity

    • anyhow in library code.

    rsky-pds

    • That’s quite the dependency list! Too long for me to take a closer look.
    • How many *base* dependencies does one need? All of them of course!

    rsky-syntax

    lazy_static and anyhow again.


    That’s all from a code organization and ecosystem PoV. Otherwise, things look normal and not fancy (which is good).

    Unfortunately, I don’t have the time to look beyond that at this moment.