Thanks, I had completely forgotten about STON, thats a good point too (possibly 
this is what SimplePersistence uses as well - I'm not sure).

I recall there is a git repo for Pharo tips/tricks - I will try and curate this 
list over there as a few people have commented how useful this has been, and 
appreciate everyone who has chipped in.

Tim

On Thu, 8 Oct 2020, at 1:43 AM, Russ Whaley wrote:
> I have been using STON for a while now.  It does a really nice job of keeping 
> everything just the way I need it - and the read/write - even for larger 
> files process very quickly.  Limitations are full writes, no updates, but 
> hey, it is incredibly easy to use and works in both v8 and v9.  I built a 
> flashcard application in Pharo as well, and the STON files load in a fraction 
> of a second.
> 
> Cheers!
> Russ
> 
> On Wed, Oct 7, 2020 at 12:04 AM jtuc...@objektfabrik.de 
> <jtuc...@objektfabrik.de> wrote:
>> Am 06.10.20 um 22:41 schrieb Tim Mackinnon:
>> 
>> > Gosh - this is proving much more interesting than I had imagined, and I’m 
>> > getting lots of useful input, so I double appreciate the time and thoughts 
>> > from everyone.
>> 
>> >
>> 
>> > I probably should have said that my "super awesome idea" is just a little 
>> > flashcard spelling app for my daughter (and possibly a few friends in her 
>> > class) - so probably SimplePersistance will do in this case,
>> 
>> 
>> 
>> yes, sounds like it. You mentioned it is not a super-complex 30-year 
>> 
>> project you are planning. It sounds like you can load all the data into 
>> 
>> memory in a few msec and just go form there, Saving the whole model as a 
>> 
>> file also sounds like perfectly doable in such a project. So, heck, you 
>> 
>> could probably simply just save the image and be good. A chunk of JSON, 
>> 
>> Fuel, whatever object serialization is probably second best.
>> 
>> 
>> 
>> The great thing about this: nothing external (to the image) to install 
>> 
>> or maintain. It is just you and the file system.
>> 
>> 
>> 
>> 
>> 
>> > however the comments about making a persistence decision at the right 
>> > moment are super interesting - and as always, its about spotting the right 
>> > moment to do that…
>> 
>> 
>> 
>> Oh no, don't fear this too much. That's not what I wanted to point out. 
>> 
>> Most projects will do well on either NoSQL or using an ORM or an OODB. 
>> 
>> Almost anything is possible on all of them. We do boring business stuff 
>> 
>> (accounting) using Glorp as an ORM and DB2. Another well-known project 
>> 
>> in the Pharo world does something extremely similar (travel cost) with 
>> 
>> Voyage/Mongo. It is not so much a question of lost opportunities. The 
>> 
>> problem here is that you have to deal with the very same problems 
>> 
>> (concurrent access and isolation, fast lookups, caching, ghost objects) 
>> 
>> on each of these technologies, but differently. It is the different 
>> 
>> approaches to the same problems that make switching from one to the 
>> 
>> other that makes the decision so hard.
>> 
>> 
>> 
>> Example: we had a hard time finding out why some objects never went away 
>> 
>> although we had deleted them from the database. It took a while of 
>> 
>> logging all SQL statements until we found out first that they were 
>> 
>> really deleted in the Transaction when the user clicked OK. But they 
>> 
>> were inserted back in the next, possibly completely unrelated, 
>> 
>> transaction, because we had some dangling backpointers that tricked 
>> 
>> glorp into thinking "oops, there is this bunch of new objects I have to 
>> 
>> insert now". This is why I used object deletion as an example. Smalltalk 
>> 
>> has no concept of deleting an object. Databases do. So whatever approach 
>> 
>> you chose, deleting an object looks different. You either make the 
>> 
>> object completely (!) unreachable from the rest of the object model and 
>> 
>> thus just make it irrelevant, or you tell the databse to just throw it 
>> 
>> away. Sounds like no big deal. But it can be.
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> > and ideally you have well factored code with ample tests that help you 
>> > easily move from the idea, to something more scalable or robust…
>> 
>> The hard part here: the example with the reinserted objects is what is 
>> 
>> called an unknown unknown in the boringtech site ;-) You would need a 
>> 
>> test to check whether an object you deleted really isn't reoccuring 
>> 
>> after the next Transaction. You'd have to imagine that there might be a 
>> 
>> small chance that you delete an object successfully, but for some reason 
>> 
>> you distorted the ORMs internal bookkeeping and trocked it into 
>> 
>> inserting teh object back in some consecutive Transaction. A simple fact 
>> 
>> once you understood why it happened, but I am 99% sure almost nobody 
>> 
>> would come around the corner and say: well, we'll have to write a test 
>> 
>> for this scenario where an object still lingers somewhere and gets 
>> 
>> reinserted. The whole team would by this guy a beer and move to another 
>> 
>> table.
>> 
>> > however, move too soon and you get bogged down with the details and you 
>> > lose site of an MVP.
>> 
>> 
>> 
>> move and live with your decision. Or be prepared for a much more 
>> 
>> complicated transition than you thought.
>> 
>> 
>> 
>> The problem is that nobody (at least that I am aware of) has come up 
>> 
>> with an abstraction good enough to make the persistence implications 
>> 
>> irrelevant enough and provide good performance and feature richness at 
>> 
>> the same time. I know it's been tried.
>> 
>> 
>> 
>> 
>> 
>> >
>> 
>> > It has been interesting hearing peoples thoughts on all of this… the 
>> > turning tide on ORM’s, the potential sweet allure of a NoSql (but can you 
>> > query it easily) - and then the overarching element of just setting this 
>> > shit up (where hopefully Docker steps in to make that bit at least easy).
>> 
>> Not sure about the need for Docker. You just throw more tech at the 
>> 
>> problem. I mean, installing and setting up PostgreSQL or MySQL on a 
>> 
>> Linux distro these days is matter of a few commands. apt install, enter 
>> 
>> a db administrator password, answer a few questions and go. Same with 
>> 
>> Mongo or CouchDB.
>> 
>> > I suppose this is where the Rails scaffolding was/is? such a jumpstart,
>> 
>> 
>> 
>> Don't get me started ;-)
>> 
>> 
>> 
>> Scaffolding is great if you need to sell a technology to management on a 
>> 
>> few slides. Slip in some comment like "works on existing database 
>> 
>> schemas too, at no extra cost" and these guys are ready to write 
>> 
>> whatever it takes onto a cheque. I mean, come on, that guy showed us how 
>> 
>> to make the whole mapping and transaction management for a flight 
>> 
>> booking system in 15 minutes, how much harder can our project be? That's 
>> 
>> how most multi-million desasters start.
>> 
>> 
>> 
>> 
>> 
>> > you can get a full thing going quite easily, and deploying seems 
>> > relatively easy too… for us in Smalltalk land, its still a bit too much 
>> > work for my liking, compared to the ease of getting an image and coding, 
>> > and seeing it all work.
>> 
>> 
>> 
>> I totally agree. These days, everything is easy. Just install NodeJS and 
>> 
>> some super sophisticated package manager and let it install everything 
>> 
>> for you in just 5 minutes and you're ready to go. Just make sure you 
>> 
>> have at least 12 GB of free memory and a good machine with fast 
>> 
>> internet. Your data will be stored in the *bling, stars and glitter * 
>> 
>> Cloud and you just forget about this detail. You want a login screen, 
>> 
>> sure, just type 'init -n -tfgr "login"' and provide your github 
>> 
>> credentials. We'll create a directory structure for you with a src, an 
>> 
>> html, a helpers and a .gitignore file. Don't worry, some of that you'll 
>> 
>> never touch. Oh, sure just make sure you have a Facebook account and 
>> 
>> consent with the cookie policy of that super-georgous technology company 
>> 
>> that provides this piece of code.
>> 
>> 
>> 
>> Not sure if that is what is really needed, but it's where we're heading 
>> 
>> at the moment. Open any JS related book these days and read the first 
>> 
>> chapter. I bet it's going to step you through the installation process 
>> 
>> of at least three major super-cool open source, reliable and tested 
>> 
>> frameworks or infrastructure monsters before you can start. From there 
>> 
>> on, everything is a breeze. It's like a free lunch.
>> 
>> 
>> 
>> But boy, somebody will have to run this stuff for a while.
>> 
>> 
>> 
>> I think the Smalltalk vendors, both commercial and open source are 
>> 
>> making great progress here, and I like the fact that we are not followng 
>> 
>> the bloating trend. Maybe the "not invented here" meme makes sense to 
>> 
>> some degree. What we as developers need is some understanding of what 
>> 
>> we're doing and not so much the latest bells and whistles. Storing data 
>> 
>> in a file may be unsophisticated, but it does the job even under hard 
>> 
>> conditions.
>> 
>> 
>> 
>> ..but I am getting slightly off-topic ;-)
>> 
>> 
>> 
>> 
>> 
>> Joachim
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> > It does seem to be getting marginally better at least, but I do wish there 
>> > was super easy setup with all the pieces nicely in place so it was just 
>> > your idea that you could focus on…
>> 
>> >
>> 
>> > Anyway, that login screen… oh crap I have to write one of those…
>> 
>> >
>> 
>> > Tim
>> 
>> >
>> 
>> >> On 6 Oct 2020, at 20:56, jtuc...@objektfabrik.de wrote:
>> 
>> >>
>> 
>> >> Sean,
>> 
>> >>
>> 
>> >> thanks for your short overview of what SimplePersistence does. Sounds 
>> >> useful for quite a few scenarios and might even carry you well through 
>> >> production stages for some projects.
>> 
>> >> What I was talking about is also not meant to frustrate people. I've only 
>> >> played with Mongo/Voyage for a few hours and I must say I was blown away 
>> >> by the speed and ease of that stack. We got something running in a few 
>> >> hours and it was impressive. So Mongo/Voyage is a cool thing to use.
>> 
>> >>
>> 
>> >> I always wanted to use Magna on Pharo. I even started to implement my own 
>> >> little clone of Magna in VA Smalltalk. I got into troubles when I tried 
>> >> to nest transactions and get this concurrency stuff streamlined somehow. 
>> >> We all know that besides naming and one-off problems, caching and 
>> >> concurreny are the hardest problems in computing. I think there is 
>> >> something about this. And so I gave up on that project... ;-)
>> 
>> >>
>> 
>> >> In the end I went with Glorp and DB2 (soon PostgreSQL). So far I am in a 
>> >> very solid state somewhere between complete despair and freaking out 
>> >> about how cool things are. I love and hate that stack from the bottom of 
>> >> my heart.
>> 
>> >>
>> 
>> >> The cool thing about an RDB is (and will sure be for quite a while) three 
>> >> letters. S, Q and L. There are lots of highly sophisticated GUI tools to 
>> >> query, manage, correct your data. And you can simply do everything form a 
>> >> command prompt, in an ssh session from your smartphone in a hotel toilet 
>> >> on the other side of the planet.
>> 
>> >>
>> 
>> >> Sure, using pure Smalltalk objects and not worry about n:m relationships, 
>> >> not having to write mappings and not having to end up with an object 
>> >> model that is driven mostly by what your O/R mapper can handle, sound 
>> >> great. And it is. Until you realize you also need to think about query 
>> >> optimizations, reorganizations, indexes and whatnot in an object 
>> >> database. There are also compromises to make.
>> 
>> >>
>> 
>> >> But, hey, I said all of that before.
>> 
>> >>
>> 
>> >> So maybe approaches like fuel, SimplePersistence (or BOSS or Object 
>> >> Swapper) are the best thing to start with when you need to find out about 
>> >> your architectural and business ideas first (am I building the right 
>> >> thing, will this feel good to a user, etc.), but once you are beyond that 
>> >> state, you better dive into your options and decide soon. Maybe using 
>> >> image saving or SimplePersistence is even good for production in your 
>> >> case. It was good enough for dabbleDB for quite a while, iirc, so why 
>> >> shouldn't it work for others? And maybe that is even the best you can do 
>> >> to postpone the decision for as long as possible at minimum opportunity 
>> >> cost.
>> 
>> >>
>> 
>> >> I didn't dig deep enough into Voyage/Mongo to judge how expensive or 
>> >> risky the changes to the design are. How hard is it to restructure the 
>> >> root trees - say you need something that is now beneath some root to be a 
>> >> root of its own? How would you do such changes?
>> 
>> >>
>> 
>> >> I know I can do a lot of things of that kind with SQL. It is a second 
>> >> looking glass and set of tools to view and manipulate the data. Sometimes 
>> >> things are easier to do in Smalltalk, sometimes it is way too slow on top 
>> >> of an ORM and a SQL query can do the same thing in a few milliseconds.
>> 
>> >>
>> 
>> >> But maybe I am asking the wrong questions fo Tim's purposes. I think I 
>> >> understand what you (Tim) are looking for is not a big, complex project 
>> >> but more like an experiment? I don't want to invalidate any of the given 
>> >> suggestions, I know or at least believe that they each do a good job. All 
>> >> I really wanted to warn you is that you will not easily be able to go 
>> >> from one option to another, because each will have a deep impact on your 
>> >> object model and application architecture.
>> 
>> >>
>> 
>> >> Joachim
>> 
>> >>
>> 
>> >>
>> 
>> >>
>> 
>> >>
>> 
>> >> Am 06.10.20 um 16:34 schrieb Sean P. DeNigris via Pharo-users:
>> 
>> >>> jtuchel wrote
>> 
>> >>>> Sigh. Forget about the idea that it will be easy to switch your
>> 
>> >>>> persistence later....I am not commenting on SimplePersistence here, I
>> 
>> >>>> don't even know what it
>> 
>> >>>> does or doesn't.
>> 
>> >>> Joachim,
>> 
>> >>> Thanks for this interesting perspective. I've never had the 
>> >>> (mis?!)fortune
>> 
>> >>> of a project growing enough to force me to make those tough choices! For
>> 
>> >>> SimplePersistence I will say that I view it as a way to *delay* making 
>> >>> *any*
>> 
>> >>> choices until you are forced to. It's really just a layer of sugar on 
>> >>> top of
>> 
>> >>> Fuel (it used to use the old school Squeak equivalent serialization
>> 
>> >>> mechanism - I forget the name and that might still work). You tell it 
>> >>> what
>> 
>> >>> classes to serialize. Implement two methods for each class that get and 
>> >>> set
>> 
>> >>> the data, and then it saves the whole thing as one object graph.
>> 
>> >>>
>> 
>> >>> Tim,
>> 
>> >>> If you use SimplePersistence, please keep me posted about your 
>> >>> experience.
>> 
>> >>> I'm happy to help.
>> 
>> >>>
>> 
>> >>> NB I have maintained and extended the library, but it is the work of 
>> >>> Ramon
>> 
>> >>> Leon
>> 
>> >>>
>> 
>> >>>
>> 
>> >>>
>> 
>> >>> -----
>> 
>> >>> Cheers,
>> 
>> >>> Sean
>> 
>> >>> --
>> 
>> >>> Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
>> 
>> >>>
>> 
>> >> -- 
>> 
>> >> -----------------------------------------------------------------------
>> 
>> >> Objektfabrik Joachim Tuchel          mailto:jtuc...@objektfabrik.de
>> 
>> >> Fliederweg 1                         http://www.objektfabrik.de
>> 
>> >> D-71640 Ludwigsburg                  http://joachimtuchel.wordpress.com
>> 
>> >> Telefon: +49 7141 56 10 86 0         Fax: +49 7141 56 10 86 1
>> 
>> >>
>> 
>> 
>> 
>> -- 
>> 
>> -----------------------------------------------------------------------
>> 
>> Objektfabrik Joachim Tuchel          mailto:jtuc...@objektfabrik.de
>> 
>> Fliederweg 1                         http://www.objektfabrik.de
>> 
>> D-71640 Ludwigsburg                  http://joachimtuchel.wordpress.com
>> 
>> Telefon: +49 7141 56 10 86 0         Fax: +49 7141 56 10 86 1
>> 
>> 
> -- 
> Russ Whaley
> whaley.r...@gmail.com

Reply via email to