The lastest version of more-speech (202207301434) has a user configurable option to schedule the sending of kind:0 metadata profiles every N days, or :never. You can set this in private/user-configuration. See the wiki page (https://github.com/unclebob/more-speech/wiki/user_configuration)
The lastest version of more-speech (202207301434) has a user configurable option to schedule the sending of kind:0 metadata profiles every N days, or :never. You can set this in private/user-configuration. See the wiki page (https://github.com/unclebob/more-speech/wiki/user_configuration)
I definitely want the web of trust. So perhaps you can descibe how kind-3 serves that purpose. The way I look at it, it's no better than a file containing pubkeys and petnames that I keep on my laptop.
>From: jb55 at 07/30/22 09:54:31 on wss://relay.nostr.info
>---------------
>I find it's useful for building a web of trust, and seeing followers for discoverability. but yeah it's optional I guess... can't imagine using a twitter-like client without it though.
This bothers me on two fronts.
1. As I stated before I don't like the idea that relays can delete old data -- it's a kind of temporal censorship.
2. I don't like the idea that relays are a kind of personal database that allow users to squirrel away their private data. There are plenty of other options for that.
>From: jb55 at 07/30/22 09:43:19 on wss://nostr-relay.wlvs.space
>---------------
>querying kind3 helps with this a bit
>
>
>
>
>From: unclebobmartin at 07/29/22 18:44:08 on wss://wlvs.space
>---------------
>>From: Giszmo47 at 07/29/22 12:19:07 on wss://nostr-relay.wlvs.space
>>---------------
>>Relays use DBs and kind-0 is special in that it is replaceable. Relays are supposed to only share the last received, so they have to filter out or delete older ones.
>
>NIP-01 is not quite that demanding. It says: "A relay may delete past set_metadata events once it gets a new one for the same pubkey." I had previously missed the fact that a relay MIGHT only send the latest metadata.
>
>Honestly, I think that's a mistake. Deleting history is a dangerous precedent IMHO. I wonder what #[7] thinks about that?
And now I'll use the correct pubkey for #[8]. At least I think it's the correct one. There are five profiles out there that claim to be fiatjaf.
You learn a lot by doing a query for all kind:0 events. Lots of identity issues. There are two or three Giszmos, several fiatjafs etc. In more-speech I disambiguate them with random numbers. As it happens, when I run more-speech, you show up as Giszmo47.
>From: Giszmo387 at 07/29/22 20:13:53 on wss://nostr-pub.wellorder.net
>---------------
>well ... apart from more-speech not supporting markdown
That's a fair criticism. I'll modify more-speech to allow the user to add profile fields as part of the configuration. I'll also sllow the user to specify a frequency of metadata transmission, and a frequency of kind:0 queries from relays.
I remain convinced of the following points.
1. The user must have absolute control over their profile; and therefore that profile must be specified by the user on a client by client basis. e.g. each client should be configured with the profile the user desires to transmit.
2. nostr is a censorship free protocol. Ephemeral or replaceable events are a form of censorship. i.e. They censor the past. As such I have a philosophical problem with relays that delete old kind:0 and/or support other replaceable events.
>From: more-speech-6973 at 07/29/22 15:40:43 on wss://relay.nostr.info
...
>Yes, you answered my question. Thank you :)
>However, I still don't understand why we have to provide type explicite.
>For example in Javascript this code would look like this:
>> const send_to = ws => ws.sendText("alice");
>> const ws = new WebSocket();
>> send_to(ws); // no metada passed here
>So is this specific to Clojure or maybe JVM? Maybe this is silly question, but I don't have good understanding how languages works.
It is specific to Java. Java is a statically typed language and so methods must be paired to classes by more than just their names.
For example, in Java I could have two classes A and B, both of which had a method f. The language considers those two f methods to be completely different and considers the names to be irrelevant. So, in order to call f on an A object, the compiler must KNOW that the object is an instance of class A. In order to call f on a B object, the compiler must know that the object is an instance of class B.
This is different from dynamically typed languages like Javascript, Python, and Ruby. In those languages the compiler does not care about the type of the object. So in Python, for example, if I have an object o which happens to hold an instance of A, and if I invoke o.f(), then AT RUN TIME the language system will inspect the object o to see if it has a method f, and if it does, it calls it. The language system does not need to know that o is an instance of A or B, it just knows that it has an f method.
Clojure is a dynamically typed language like python. Most of the time we don't need to know the type of the objects we deal with. But sometimes, when dealing with Java interop, we must let the JVM know the type of an object so that the JVM can call the a method on that object.
I hope this helps.
A good way to practice patience and tolerance towards other is to practice being patient and tolerant one person at a time.
>From: temblor at 07/29/22 15:33:47 on wss://relay.nostr.info
>---------------
>What are good ways to practice patience and tolerance towards others?
>
>I'm upset rn. I googled this question and here's the answer:
>
>
BTW, @Gizmo47, I appreciate the dialog. I think you can tell that I enjoy a good debate, and will sometimes take a strong position for the sake of the argument. I've found it a good way to learn. This dialog has been very informative so far. Moreover, it is one of the first real tests of a dialog like this, on nostr, that I have participated in.
>From: Giszmo47 at 07/29/22 12:22:11 on wss://relay.nostr.info
>---------------
>Yet you worry **others** might miss your metadata if you stopped constantly spamming it out? Try it out. No client apart from yours ignores what happened before the user first started it.
I think you make a good point. I should change more-speech to send metatadata at a configuration dependent frequency which includes "only once", and "not at all". I should also, at minimum, have more-speech do a query for all the kind:0 events the very first time it starts up. Or, perhaps at a configuration dependent frequency (like every-friday).
I really dislike HIP-16. Again, changing or failing to record history is probably not a good precedent to set. I'm also unclear as to where the 'supported_nips' field is to be found. Perhaps #[6] can clarify.
>From: Giszmo47 at 07/29/22 12:20:57 on wss://relay.nostr.info
>---------------
>The distinction here is replaceable events vs. non-replaceable ones. Please look into nip-16.
>From: Giszmo47 at 07/29/22 12:19:51 on wss://relay.nostr.info
>---------------
>The client db is never the expensive part. Relays will handle the data of millions of clients. They will eventually not be for free.
Perhaps. A wise man once advised me that, when it comes to software, focus first on the here and now; tomorrows problems will come soon enough. In any case it seems to me that appending metadata events is no more expensive than appending any other kind of event; and that UPDATING metadata is the more expensive of the options.
>From: Giszmo47 at 07/29/22 12:19:07 on wss://nostr-relay.wlvs.space
>---------------
>Relays use DBs and kind-0 is special in that it is replaceable. Relays are supposed to only share the last received, so they have to filter out or delete older ones.
NIP-01 is not quite that demanding. It says: "A relay may delete past set_metadata events once it gets a new one for the same pubkey." I had previously missed the fact that a relay MIGHT only send the latest metadata.
Honestly, I think that's a mistake. Deleting history is a dangerous precedent IMHO. I wonder what #[6] thinks about that?
>From: more-speech-6973 at 07/29/22 11:59:18 on wss://nostr-relay.untethr.me
>---------------
>Hello sir, could you explain why do use ^WebSocket to annotate conn with metadata?
You mean in the source code? Clojure sometimes needs to know the type of an object especially if you are going to call a java method on that object. So ^WebSocket tells clojure that the following object is of type WebSocket, and that allows clojure to properly call methods.
Here's an example. In the 'send-to' method I need to call the 'sendText' method to the WebSocket object. But there are many classes that have 'sendText' methods, and clojure has no way of knowing what class the 'conn' variable is, unless I tell it.
(defn send-to [^WebSocket conn msg]
(try
(let [msg (events/to-json msg)]
(println "sending:" msg)
(.sendText conn msg true))
(catch Exception e
(prn 'send-to (.getMessage e)))))
I hope this answers the question. Interoperating between clojure and Java is usually a joy; but every once in awhile you run into things like this and you have to use type coersions, like ^WebSocket, to resolve them.
I just pushed a new version which has some nice facilities for creating, deleting, and changing tabs. Right click on the tabs themselves or on the articles in the list, to see the options.
>From: more-speech-6973 at 07/29/22 11:03:09 on wss://nostr-pub.wellorder.net
>---------------
>Smooth smooth experience with more-speech.
>It just worked without any problems lein run and here I'am :).
>From: Giszmo47 at 07/29/22 10:59:39 on wss://nostr-relay.wlvs.space
>---------------
>Organizing stuff in tabs doesn't preclude you from querying kind 0 and 3 without limit for accounts of interest.
True enough, but separately querying kind 0 and 3 doesn't help me much either. In more-speech I keep my own list of profiles. Once I see a metadata event, I record that profile and never forget it. So I never need to explicitly ask for kind 0.
Having said that, I can see an advantage to allowing the user to asks for all the kind:0 from the beginning of time to gather up all the users that the relays know. I may have to implement that at some point.
As for kind:3, I really don't know what to do with that. I mean, why do I want to have some relay hold my contacts and pet names for me. I keep all that in flat files on my machine. Yes, I suppose it would be convenient to pull that down into a new client but I'm so far away from needing that kind of ability that it's not real high on my priority list.
;-)
It's pretty bare bones at the moment. There's a huge to-do list (which I know you understand :-)
You can download the executable jar at https://www.dropbox.com/s/8r23ufbcyho5jwx/more-speech-0.1.0-SNAPSHOT-standalone.jar?dl=0
You can execute with java -jar more-speech-0.1.0-SNAPSHOT-standalone.jar
I should start up and give you a new id and user name, which you can change later.
You can download the source from github.com/unclebob/more-speech, and read though the wiki for basic operating instructions.