maegul

joined 2 years ago
MODERATOR OF
[–] maegul@lemmy.ml 17 points 11 months ago

I went to an exhibition of his works that did a very good job of collecting many of his well known paintings from various sources.

It quickly became clear that the physical size any painting was unpredictable however familiar I was with it from a book. The guy knew how to paint!

[–] maegul@lemmy.ml -4 points 11 months ago

Its absurd that you all think that vegans of all people would tolerate hurting an animal or reducing its quality of life in any way.

What do you all think vegan even means?

Yea ... they way some get abusive and accusatory against vegans or pro-vegan people around topics like this is really revealing. Strawman arguments, thin presumptions and generally unfriendly behaviour ... all to avoid talking/thinking about a moral issue. You can tell that for some it's a touchy issue that they're not comfortable with because for so many other things plenty of people are happy to admit that they're fallible and shitty, like we all are. But somehow this issue seems to get under people's skin, which to me only indicates that there's some serious cognitive dissonance going on.

[–] maegul@lemmy.ml 8 points 11 months ago (1 children)

So … you seen Romulus?

[–] maegul@lemmy.ml 2 points 11 months ago* (last edited 11 months ago)

Yea flagging like that is definitely NOT (edit!, sorry) available.

But a mod/admin can post “as a moderator” which kinda counts. Beyond that a discussion can be had with the mods of a community to establish an understanding some new rules if necessary etc, and if negotiations breakdown, the community can be moved to a new instance in an orderly fashion.

It may not be enough for some situations, but seems like a reasonable starting point to me. AFAICT, there may have been a bit of a freak out from the admin in the original incident (which happens, it’d just be good to see if any lessons are being learned).

Thanks for the chat!

[–] maegul@lemmy.ml 29 points 11 months ago (3 children)

That is beautiful! Thank you, made my day.

[–] maegul@lemmy.ml 65 points 11 months ago (45 children)

Any chance the relevant incident could be unpacked and used as a demonstration of how these changes would alter the outcome or encourage a different outcome?

As someone who only saw pieces of it after the fact, I am potentially in the dark here about the purposes and context of these changes.

That being said, from what I did see, it seemed very much like an instance admin imposing themselves and their superior power on a community when there were probably plenty of other more subtle action that could have been taken, where subtlety becomes vital for any issue complex and nuanced enough to be handled remotely well. I'm not sure I'm seeing any awareness of this in this post and the links provided.

For instance, AFAICT, the "incident" involved a discussion of if or how a domestic cat could eat a vegan diet. Obviously that's not trivial as they, like humans, have some necessary nutrients, and AFAICT the vegans involved were talking about how it could be done, while the admin involved was basically having none of that and removed content on the basis that it would lead to a cat dying.

And then in the misinformation link we have:

We also reserve the right to remove any sufficiently scientifically proven MALICIOUS information posted which a user may follow, which would result in either IMMINENT PHYSICAL harm to an INDIVIDUALS PROPERTY, the PROPERTY of OTHERS or OTHER LIVING BEINGS.

In the context of cats and their food ... which "living beings" are being harmed and who is encouraging or discouraging this harm?

Whether you're vegan or not, this seems to me formally ambiguous and on the face of it only enshrines the source of the conflict rather than facilitating better forms of communication or resolution (perhaps there are things in the by-laws I've missed??).

Two groups can have exactly the same aim and core values (reduce harm to living beings) but in the complexity of the issue come to issue a bunch of friendly fire ... that's how complex issues work.

So, back to my original question ... how exactly would things be done better?

[–] maegul@lemmy.ml 2 points 11 months ago
[–] maegul@lemmy.ml 3 points 11 months ago

I think it’s also nebulously counter- or peri- factual in that it’s looking for signals whose value is often that you know to give that signal. Meanwhile the qualities relatively unique to NDs can be hard or impossible to signal.

[–] maegul@lemmy.ml 72 points 11 months ago (3 children)

I hear you and essentially don't disagree. But I feel like this might lean a tad toward gaslighting.

  • Plenty of people are fine communicators when it comes to genuine collaborative work but still find the "game" of job applications very difficult or impossible.
  • Being left alone with a customer is not a thing at all for many roles.
  • Embracing diversity in abilities and doing so transparently is a thing that can be valuable for both companies and humanity. Presuming everyone can do all the things is, IMO/IME, damaging. It leads to cutting out people who have something valuable to offer. But also leads to not recognising when people are properly bad at something despite the fact that they really shouldn't be given their seniority and role.

In the end, a job application/interview is not like the job at all (whether necessarily or not). That there are people in the world who would be disproportionately good at the job but bad the application seems to me an empirical fact given the diversity of humanity. And recognising this seems important and valuable in general but especially for those trying to understand their relationship to the system.

 

FWIW, this isn't to do with me personally at all, I'm not looking to do anything dodgy here, but this came up as a theoretical question about remote work and geographical security, and I realised I didn't know enough about this (as an infosec noob)

Presuming:

  • an employer provides the employee with their laptop
  • with security software installed that enables snooping and wiping etc and,
  • said employer does not want their employee to work remotely from within some undesirable geographical locations

How hard would it be for the employee to fool their employer and work from an undesirable location?

I personally figured that it's rather plausible. Use a personal VPN configured on a personal router and then manually switch off wifi, bluetooth and automatic time zone detection. I'd presume latency analysis could be used to some extent?? But also figure two VPNs, where the second one is that provided by/for the employer, would disrupt that enough depending on the geographies involved?

What else could be done on the laptop itself? Surreptitiously turn on wiki and scan? Can there be secret GPSs? Genuinely curious!

 

I'm talking about !moviesandtv@lemm.ee .

Just recently had a post (cross-post of CGI video posted here) removed for no reason (none stated at least) and then they banned me for asking why.

You can see it all in the modlog, filtered to just actions against me.

The lack of any engagement on why a post gets removed and trigger happy user banning just screams bad moderator culture to me.

I didn't realise they were like this before and now realise that an alternative place that's kinder and more open is important. I don't know how the other mods (I'm mostly an accidental mod) are here, but I get the feeling that this is a nicer place and I hope it stays that way (plus the growing user numbers probably reflects this?)

Anyway, just thought I'd share as you wouldn't know when this stuff happens unless someone tells you in another community.

Hope political/drama posts are ok (I didn't see anything in the rules against them).

 

This is the final part of a 4 part series this person did.

If you haven't seen any of the others ... here's the playlist on youtube

You should check it out. Basically a VFX artist calling bullshit on the whole "we did it all practically without any CGI" marketing and fan hype as the lies they are. The key take away being that so much CGI is actually really hard to spot and everywhere and all of those who say they can easily spot CGI are just catching the obvious things and full of themselves.

The rest of the CGI in films is just flatly lied about by the studios. Parts 3 and 4, IIRC, do a good job of recounting how this is an old behaviour from way before CGI all tied up with the marketing (ie lying) impulses of the studios and also likely with their greed. You'll see (in part 1 I think) a particularly egregious example of lying (or being deceptive) about CGI usage.

As part 4 concludes with, you can't trust hollywood on whether they're using CGI ... they're much more interested in lying to you than being open about how they do things ... and second, the industry is now stuck in an anti-CGI hype cycle, where the audience think they know what "no-CGI" looks like because they've been influenced by the studios' lies which has now created expectations that can't be disappointed which continues the studio lies and audience misconceptions.

For me, the insidious part here is that there is a whole industry of artists being swept under the rug while also being absolutely essential to what we enjoy about films today. That they have fair compensation issues cannot be a coincidence at all. So, for me, anyone who's all about "no-CGI" in films is really part of something rather hauntingly dumb and sinister.

 

A little thread I wrote on masto after watching this talk by Bret Victor and reflecting on their stated ideals for how computing ought to be designed.

 

By "augmenting human intellect" we mean increasing the capability of a man to approach a complex problem situation, to gain comprehension to suit his particular needs, and to derive solutions to problems.

Man's population and gross product are increasing at a considerable rate, but the complexity of his problems grows still faster, and the urgency with which solutions must be found becomes steadily greater in response to the increased rate of activity and the increasingly global nature of that activity. Augmenting man's intellect, in the sense defined above, would warrant full pursuit by an enlightened society if there could be shown a reasonable approach and some plausible benefits.


Quote from Doglas Engelbart provided in this talk by @bret@dynamic.land (Bret Victor).

 

Just place to keep links to comments from this community that go "above and beyond" in helping someone out and really explaining or teaching.

There'll be a link in the side bar.

Feel free to add any links you like with a comment

 

Intro

I'm not on top of traits or generics but found myself looking some of them up anyhow, and came across the Sum trait.

Here is the Std Lib documentation on Sum (I believe).

And I guess all of the generics and/or type logic and how they interoperate has thrown me for a bit of a spin ... so I thought I'd put my thoughts here. Maybe I'll work things out in writing it or maybe someone here can help me/us out?

A bit long ... sorry


Trait Definition

From the docs and source, here is the trait's signature:

// core::iter::Sum
pub trait Sum<A = Self>: Sized {
    // Required method
    fn sum<I: Iterator<Item = A>>(iter: I) -> Self;
}

First thoughts: Defined on elements not iterators?

  • The part that confused me at first was what Self is actually. Naively, I imagined it was referring to the iterator (or type that'd implemented Iterator) ... but that clearly can't be true because the return type is Self.
  • So ... Sum is implemented not on any collection but on the element type?!
  • If so, why not rely on the Add Trait at the element level, which is responsible for the addition operator (see docs here)?

Kinda seems so?

  • So, in trying to understand this, I thought I'd look at the source of Iterator::sum() first figuring that it'd be the main implementation.
  • This is the sum you'd be calling in something like vec![1, 2, 3].into_iter().sum() to get 6.
core::iter::Iterator::sum
fn sum<S>(self) -> S
where
    Self: Sized,
    S: Sum<Self::Item>,
{
    Sum::sum(self)
}
  • Ok, so the call of Sum::sum(self) clearly indicates that this is not where Sum is defined (instead it must be in Sum::sum() somehow).
  • Moreover, self is being passed into Sum::sum(), withself being the Iterator here ... which means there's no method being called on Iterator itself but something from another module.
  • Additionally, this method is bound by the generic <S> which is defined in the where clause as Sum<Self::Item> ... which ... wait WTF is going on?
    • So this method (Iterator::sum()) must return a type that has implemented the trait Sum??
    • If that's correct, then that confirms my suspicion that Sum is implemented on the elements of an iterator (where I'm sure those comfortable with the generics syntax of the definition above are yelling YES!! OF course!!)
    • That's because the return type of sum() would generally have to be the same type as the summed elements, so S is both the type of the elements in the iterator and the return type of sum. All good.
    • And indeed, in the definition of the type alias S we've got Sum<Self::Item> which binds the return type of Iterator::sum() to the type of the iterator's elements (ie Self::Item)
      • Self::Item is technically the Item type of the Iterator which can, AFAIU, be defined as distinct from the type of the elements of the collection from which the iterator is derived but that's another story.

Back to the beginning

  • So back to trying to understand the definition of core::iter::Sum (which I believe is the definition of the trait):
// core::iter::Sum
pub trait Sum<A = Self>: Sized {
    // Required method
    fn sum<I: Iterator<Item = A>>(iter: I) -> Self;
}
  • The trait itself is bound to Sized. I don't know the details around Sized (see docs here and The book, ch 19.4 here) but it seems fundamental likely that it applies to vectors and the like.
  • The generic A = Self and its occurrences in the generics for the sum() function and its return type ... are a lot:
    • AFAIU, Self, ie the type on Sum is implemented for, must be the Item type for the Iterator that will be passed into the sum method.
    • But it must also be the return type of sum() ... which makes sense.
  • So the confusing part here then is the generic type of the sum() method: <I: Iterator<Item = A>>.
    • Remember, A = Self, so it's really <I: Iterator<Item = Self>> (right?)
    • This generic type is any Iterator whose Item (ie, the type that is returned each iteration) is the same type as Self.
  • Which means that if I want to sum a vector if i32 numbers, I'd have to make sure I've implemented Sum not on Vec but on i32 and defined it as a method that takes any iterator of i32 (ie Self) elements to then return an i32 element.
  • Ok ....

Confirmation

  • We can look at the implementors of core::iter::Sum ( see docs here) and check the source for the i32 implementation ...
  • Which gives us this source code:
integer_sum_product! { i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize }
macro_rules! integer_sum_product {
    (@impls $zero:expr, $one:expr, #[$attr:meta], $($a:ty)*) => ($(
        #[$attr]
        impl Sum for $a {
            fn sum<I: Iterator<Item=Self>>(iter: I) -> Self {
                iter.fold(
                    $zero,
                    #[rustc_inherit_overflow_checks]
                    |a, b| a + b,
                )
            }
        }
  • which ... uses fold() (basically reduce but with an initial value) and plain addition in the anonymous/closure function |a, b| a + b. What!?

Why? How?

  • Ok that was a long way to go to find the addition operator at the bottom of the heap of traits!

  • Hopefully I've grasped the mechanics?!

  • I'm not quite clear on why it's build this way. I'm guessing there's some flexibility baked into the way that the relevant implementation of Sum depends on the element type, which can be flexibly defined as the Item type of an Iterator independently of the type of the collection's elements. That is, an iterator can utilise a type different from the actual elements of a collection and then rely on its particular implementation of sum. And then this can be independent from Add.

  • But that feels like a lot of obscure flexibility for a pretty basic operation, no?

  • For example, this code doesn't compile because a type needs to be specified, presumably type inference gets lost amongst all the generics?

// doesn't compile
let x = vec![1i32, 2, 3].into_iter().sum();

// These do compile
let x2 = vec![1i32, 2, 3].into_iter().sum::<i32>();  // turbofish!!
let x3: i32 = vec![1i32, 2, 3].into_iter().sum();

  • Design choices aside ...
  • I'm still unclear as to how Iterator::sum() works
fn sum<S>(self) -> S
where
    Self: Sized,
    S: Sum<Self::Item>,
{
    Sum::sum(self)
}
  • How does Sum::sum(self) work!?
  • self is the Iterator (so vec![1i32, 2, 3].iter()).
  • And Sum::sum() is the essential trait addressed above.
  • How does rust go from a call of a trait's method to using the actual implementation on the specific type? I guess I hadn't really thought about it, but it makes sense and it's what all those Selfs are for.
  • In this case though, it's rather confusing that the relevant implementation isn't on the type of self, but because of the definition of Sum, the implementation is on the type of the elements (or Item specifically) of self. Sighs

Thoughts??

 

They’re not done yet. Just announcing (and the verge reporting on it).

Their announcement (here) is quite forceful though, interestingly. The article described it as a manifesto.

See also a recent post here about their survey on integrating activity pub: https://lemmy.ml/post/14734757

 

I’m personally not watching it (you could call me a bit of a disco “hater” and s4 really kinda bummed me out) … but thought I’d see how people are enjoying it and think about getting a paramount subscription.

Asked some friends and they said they’d stopped watching. Then I checked here and the other community and posts about the episodes just seem to be tepid compared to what I would have expected.

Now obviously I’ve got a bias (and I really don’t want to start kicking the show) … but am I reading this right or wrong?

 

A minor but interesting and illuminating point came up in a conversation that I thought was worth sharing, for those learning rust, in a separate post. I'm mostly just copy-and-pasting here.


TL;DR: The patterns you use in match statements and related syntax are (basically) available to you in let statements. This is how destructuring works!! And what they're for with let. But the patterns have to be "irrefutable"


IE, they have to always be able to match the expression/value.


For those who aren't aware, here's the first section in The Book on patterns in let statements.

I think, if this is confusing, there are two points of clarification:

  1. All let statements involve patterns (as Ephera states). They're all let PATTERN = EXPRESSION.
    • For ordinary variable binding, we're just providing a basic pattern that is essentially like a wildcard in that it will match the totality of any expression and so be bound to the full/final value of that expression.
    • It's only when the pattern becomes more complex that the pattern matching part becomes evident, as elements of the value/expression are destructured into those of the pattern.
    • EG, let (x, y, _) = (1, 2, 3); or Ephera's example below let Something(different_thing) = something; which extracts the single field of the struct something into the variable different_thing (handy!).
  2. let statements must use irrefutable patterns. That is, patterns that cannot fail to match the expression.
    • For example, against a tuple, (x, y, _) will always match. Another way of putting it: irrefutable patterns are about destructuring not testing or conditional logic.
    • if let statements on the other hand can take both irrefutable patterns and refutable, but are really intended to be used with refutable patterns as they're intended for conditional logic where the pattern must be able to fail to match the expression/value.
    • See The Book chapter on refutability

The nice and useful example provided by @Ephera@lemmy.ml (in the original comment):

struct Something(DifferentThing);

let something = Something(DifferentThing::new());

let Something(different_thing) = something;
  • Here, the variable something is a struct of type Something which contains one field of type DifferentThing.
  • In the final line, we're extracting that DifferentThing field with a pattern in a let statement.
  • IE, Something(different_thing) is the pattern. And it is irrefutable against all variables of type Something, as they have only one field.
 

I can't help but suspect it doesn't offer much and you may as well just use match statements for whenever you want pattern matching, however many times it might be slightly more verbose than what you could do with if let.

I feel like I'd easily miss that pattern matching was happening with if let but will always know with match what's happening and have an impression of what's happening just from the structure of the code.

view more: ‹ prev next ›