1. 1

    If it’s just yet another setup.exe downloader, and not a real package manager, then why should I care?

    1. 5

      You probably wouldn’t, but that’s also not what it is; it is indeed a real package manager, albeit still a relatively simple one à la Homebrew. The GitHub repo honestly actually provides a better overview than the official homepage, but as a quick summary, Scoop:

      • Installs in the user directory, so you don’t need to deal with UAC pop-ups;
      • Handles dependencies;
      • Handles upgrades and updates;
      • When it does have to work with a setup.exe for whatever reason, avoids you having to deal with it by extracting and setting things up behind-the-scenes; and
      • Is trivially extensible

      Some of the above is admittedly cultural (the team prefers finding and sourcing portable apps whenever possible), but some is also unique to Scoop’s implementation. For what it’s worth, I’ve submitted at least one new formula to Scoop and updated a few from time to time, and found the process really simple; the feel is similar to Homebrew, in a good way, and makes it feel significantly lighter-weight than something like Chocolatey.

      1. 1

        Installs in the user directory, so you don’t need to deal with UAC pop-ups

        When I was on Vista, you would’ve sold me with that one line.

        1. 1

          Ah, that’s potentially damn handy. Thanks for that bit of info.

          If that’s the case it should work on my Windows VM I use to get access to my corporate overlord’s network on my own hardware :)

      1. -1

        That looks good but cmder has all the goodies already available.

        1. 2

          I’m not sure what you’re looking at, but those are very different. Scoop is a competitor to Chocolatey; Cmder is a competitor to cmd.exe.

          1.  

            Yeah but the video showed packages all readily available in cmder. That’s all.

          2. 1

            I’m super confused at this too. cmder is a console/shell like thing, not a package manager.

            1.  

              I understand but it seemed to show only packages that are already available in cmder.

              1.  

                Either you are confused or cmder has capabilities that I am not aware of, in which case, spill it so I can figure this out! :)

                Looking at the Github repository for cmder it appears the developers don’t integrate a package manager (I didn’t think they did.)

                is it possible your local sysadmin or something bundled chocolatey or scoop by default with your installation of cmder?

            2. 0

              Excuse me?

            1. 3

              Most of this guide is excellent, but

              # Pre
              Disable-UAC
              

              is equivalent to enabling passwordless sudo from any user. I have no idea why that’s in there.

              1. 4

                would be amazing if ms open sourced the engine now. could be interesting to see an engine written from scratch for the current technologies.

                but i guess this will never happen, just like opera didn’t release the presto engine :/

                1. 4

                  EdgeHTML wasn’t rewritten form scratch, AFAIU that’s a myth they want people to believe. It’s still pretty close to Trident (IE rendering engine), from which they removed lots of Microsoft-legacy/proprietary and then added some features.

                  1. 2

                    AFAIU that’s a myth they want people to believe

                    I don’t think MS has ever promulgated this, actually; the Edge page definitely doesn’t claim it’s brand-new, and they initially launched Edge as literally just a document mode for IE—definitely not as some sort of total rewrite. I think the idea that EdgeHTML is an outright new browser got started by fans who either conflated the fact that the Edge chrome is brand-new (which it was) for the rendering engine being new (which it emphatically isn’t); who conflated EdgeHTML in general with the Chakra JavaScript engine (which was indeed new and has now been open-sourced); or who just straight-up exaggerated what Microsoft had done to Trident to make the Edge rendering engine.

                    Microsoft itself though has been quite clear in everything I’ve read that Edge is a direct descendent of IE’s rendering engine, because it’s honestly their marketing for why it’s okay to use Edge in corporations currently stuck on IE: it’s the same stuff you know and love, but now it can also scale cleanly into Chrome/Firefox territory. That messaging makes no sense if it’s a brand-new engine.

                    1. 1

                      ah, thanks (also gecko for the background information) for the clarification, is must have got that mixed up :)

                  1. 2

                    Really enjoyed this article! Am definitely going to give this year’s puzzles a whirl in C++ since I’m learning that now.

                    (Though I’m terribly stuck in Chapter 5 of Stroustrup’s Tour of C++ on copy/move :)

                    1. 3

                      If you can easily access a copy, I think that Scott Meyers does a better job covering the copy/move distinction in Effective Modern C++. You’d want to look around page 350 or so.

                      That section of that book, incidentally, also has one of my favorite examples of how complicated C++ has gotten:

                      std::move doesn’t move anything, for example […]. Move operations aren’t always cheaper than copying; when they are, they’re not always as cheap as you’d expect; and they’re not always called in a context where moving is valid. The construct type&& doesn’t always represent an rvalue reference.

                      It’s occasionally just nice to know that it’s not you, it’s the language.

                      1. 1

                        Thanks for that. I’ve been referred to that book right along but I felt like I needed a gentler introduction to the language, which is why I turned to Tour but I will definitely check the Meyers book out for the copy/move stuff. I have a Safari membership so all you can eat books for one price. (I love it :)

                        That section of that book, incidentally, also has one of my favorite examples of how complicated C++ has gotten:

                        Interesting that you point this out. I’m actually finding that C++, at least at the beginner level I’m interfacing with it, feels considerably less complex and more abstract than the C++ I last touched in the early 90s.

                        I’m sure this is because I haven’t had to delve into the inner workings of STL and the like - I’m guessing the … uh… water? Gets MUCH deeper there :)

                        1. 2

                          The language doesn’t grow less complex for having more high level abstractions.

                    1. 3

                      Interesting comment on hg-git in @ngoldbaum’s reply to the first post:

                      Unfortunately hg-git is thousands of lines of leaky abstraction. There are tons of corner cases and fixing one breaks others. I wouldn’t advise using it due to issues like this. In the future there are plans to write an hg client that uses the git data store, so you’d have hg working directly with a git repo with no need for a conversion step.

                      1. 2

                        That extension is called hgit, but development is stalled, largely because the abstractions in Hg to do something like that cleanly don’t (didn’t?) exist.

                        That said, ignoring any of my personal opinions on Git as such, I don’t think that’s really a great direction to go, anyway. One of the reasons I did not try to do an hg-git approach with Kiln Harmony is that, while Git and Mercurial data is largely isomorphic, their workflows are just really different, and Mercurial’s UI is unsurprisingly best suited to Mercurial’s workflow. When using hg-git (or Git’s equivalent), you end up needing to keep both systems’ workflows and data models in your head at once. I’ve never thought this was a great user experience, and I still don’t. Instead, I’d love at some point to write a Git porcelain that brought revsets, filesets, and maybe some form of changeset evolution to Git. But I think that’d best be done as truly its own thing, not by trying to make Mercurial try to natively work with Git repos.

                      1. 7

                        I really have no idea what problem this would fix.

                        1. 15

                          First, it’d unify what Edge even means: “Edge” on Android and iOS is Blink and WebKit, respectively, while it’s Trident on Windows. It’d now be a WebKit-based everywhere. (And mean that they could do Edge for macOS or Linux with a straight face, too.)

                          Second, as freddyb points out, it drastically cuts resource use. I disagree that Chrome is more secure, and definitely that it’s less resource-heavy, but it almost certainly takes fewer engineers to improve Chrome than build an entirely separate browser.

                          Third, Microsoft is already using Chromium, via their Electron apps, especially dev tooling (Visual Studio Code and various Azure components). This would allow more devs to focus on just one engine, and perhaps pave the way for better Windows integration there.

                          Fourth, it ironically gets Microsoft out of compatibility hell. Many sites are incompatible with Edge because they’re so tightly bound to Chrome. This sidesteps that.

                          And finally, having Edge just isn’t a competitive advantage anymore. Even if, for sake of argument, Edge is lighter and more secure than Chrome, no one is buying Windows over it. That makes it a lousy thing to emphasize as much as they are, dev-resource-wise.

                          1. 1

                            “Edge” on Android and iOS is Blink and WebKit, respectively, while it’s Trident on Windows.

                            All browsers on iOS are WebKit, even Firefox. Nobody has a choice there. But I don’t see Edge on Android switching away from Blink either, where they could if they wanted to. The three codebases for all three platform have essentially nothing to do with each other either.

                          2. 6

                            Market share. Revenue. Ressource allocation. Security. Lots, really.

                            1. 2
                              1. 2

                                That certainly seems plausible. Thanks.

                            1. 3

                              This week I learned Microsoft is also making Android apps/games. I never thought I’d see that day. Perhaps the two are related?

                              1. 7

                                Microsoft has been making Android apps for a long while. The entire Office suite, Cortana, Outlook, and others have been available for years, plural. This would be comparably new, but the thing I’d cite as the precedent wouldn’t be Android apps, but rather Electron apps (notably Visual Studio Code and the Azure data browser).

                                1. 1

                                  The office apps I use for work on Android (Outlook and OneNote) are polished apps.

                                1. 30

                                  LOL @ 100 MB being considered small. Just yesterday, I was working on my gui lib (which, granted, has zero mobile support, so totally unfair comparison.. but still) and I was like “eh, that 2.4 MB RAM usage is a little fat”.

                                  How low have standards fallen in the mobile world?

                                  1. 11

                                    This is the RAM their replacement for the Android simulator needs. So that’s including debugging/hot code swapping support, I suppose. I’d be interested in the non-debugging case.

                                    1. 8

                                      I’m skeptical: 2.4 MB of ram is barely enough to contain the pixels for a single 640x480 window with double buffering. While there’s the Flutter example could almost certainly use less memory, I think you’ve got some sort of accounting error here.

                                      1. 1

                                        I have a buffer for 500x500 there, since that was the window size in my test program, so that accounts for 1 MB… but that isn’t actually strictly necessary (and the operating system will have another for the desktop compositor, and the screen framebuffer itself, but those are on the OS side and thus is apples-to-apples on any user framework). You can redraw in response to the WM_PAINT messages too and avoid keeping the additional buffer. This isn’t an arcane technique - it is the way native desktop apps have basically always worked!

                                        My library is 150 KB, and actually uses native stuff so… that’s about all there is to it.

                                        1. 6

                                          You can redraw in response to the WM_PAINT messages too and avoid keeping the additional buffer. This isn’t an arcane technique - it is the way native desktop apps have basically always worked!

                                          You seem to be on Windows, so I want to clarify things a little bit:

                                          Yes, since Windows 7/Server 2008, Windows automatically keeps an off-screen buffer for you, and that’s what you’re actually drawing to when you respond to WM_PAINT. But (at least as of Windows 8) that buffer is subject to the same drawing rules that used to apply for direct screen rendering—specifically, if you’re drawing “directly” to the screen, then your double-buffered image can still sheer, giving you exactly the same artifacts you used to get on Windows 3.1 if you didn’t double-buffer.

                                          (If that has changed, I’m curious how. My guess is they would implicitly do buffer-swaps at the conclusion of handling WM_PAINT.)

                                          1. 1

                                            Well, what I meant there was you can just respond to the message and get a working program, but yeah, I use a bitmap buffer too and just blit that over to paint (and in the window size I had at the time, it was a ~1MB buffer).

                                            But this is a fraction of what flutter (and electron) devour.

                                      2. 5

                                        One big point of desktop apps is to not eat an imperial shit-ton of RAM, so this struck me too.

                                        Oh well, memory is relatively expensive so computers don’t ship with a lot of it, but people seem content with blowing it all on a browser and a browser-based app or two :(

                                        1. 1

                                          Well, RAM is plentiful… until you have 80 tabs. 80 * 1 MB is doable. 80 * 100 MB is suddenly memory pressure. And that isn’t that uncommon!

                                          1. 4

                                            Err… my ancient desktop, which is so old it barely has USB3, got 32G without breaking financial sweat. This back in the day, not current discount offers. But if I wanted to upgrade my current workstation up from 8G I’ll not only pay myself sick, but get in line to even buy anything.

                                            Thanks, mobile phones, for eating up the world’s DDR4 supply, I guess.

                                            Despite that, I’m a heavy user of tabs, famously sticking to an old and insecure browser for Tab Mix Plus + Tab Groups, until Mozilla unfucks its product.

                                            I don’t have nearly all tabs loaded and occasionally I shut down the browser.

                                            Not just to conserve memory but to keep me from being distracted while working with proper desktop apps.

                                            1. 4

                                              Ram isn’t exactly cheap today however. I recently bought some more ram for my pc, and it cost double what I paid for the same amount of ram 2 years ago. It’s jt that expensive, but often other parts get prioritized over more ram.

                                              1. 1

                                                Err… my ancient desktop, which is so old it barely has USB3, got 32G without breaking financial sweat.

                                                On Desktops you can upgrade, but laptops are a different story. I have 32GB in my ThinkPad X220, but I can’t just upgrade the 16GB MBP that I am typing on. Similar to my phone, where upgrading RAM is not possible either. I guess I need to throw it away now and buy a new one…

                                        1. 3

                                          Can not open multiple files/windows at a time. (if your workflow is like mine, it means you often save and quit, do something in the shell, and then relaunch your editor. The startup time should be fast enough to support this style of workflow.)

                                          This is completely un-acme-like.

                                          1. 1

                                            Well, it’s stated as a limitation, so presumably it can be addressed in the future.

                                            1. 6

                                              Yeah, but, like, it’s really hard to put into words just how much of a non-sequitur that is. Having used acme in anger, these would be equivalent statements for other mainstream editors/environments:

                                              • It’s like Vim, but it doesn’t yet have modal editing.
                                              • It’s like Emacs, but it doesn’t yet have any scripting support.
                                              • It’s like Mac OS, but it doesn’t yet have mouse support.
                                              • It’s like Linux, but it doesn’t currently support any POSIX calls.

                                              Being able to have multiple windows is central to being able to do anything meaningful in acme. Otherwise, you have something closer to an editor in between sam and maybe a kind of non-modal Kakoune or something. I’m absolutely not knocking this software, because I have a lot of custom tools I use to write stuff that are just for me and make me happy with my customized weird workflows, but the comparison to acme is just odd.

                                              1. 1

                                                Thanks for taking the time to expand. I am not that familiar with plan9 and acme so it’s great to see more information.

                                                Now, I think this project is fine for a one-person tool, and it’s well presented for further work should anyone want to continue with it. But it will be interested to see how prioritized the lack of multiple files is in the future.

                                          1. 3

                                            I find Bug Bounty Programs quite an interesting process.

                                            Imagine having a bank/supermarket and telling people to test the security by attempting to rob it and report back.

                                            1. 4

                                              Banks do actually do that—at least some of them. Sneakers’ portrayal is a bit overdramatic, but that concept is very real. But you have some very specific contracts in place when you do that stuff.

                                              1. 1

                                                That’s cool! I didn’t know that :D

                                              2. 3

                                                Although while on bug bounty you should not attempt to actually rob the bank, but maybe finds way to rob and report the plans that might actually work. If possible you should build your own bank from the plan of your target and try to rob your own banks before reporting back to the actual bank. Bug bounties program are not free pass to run actual exploit against a system.

                                              1. 9

                                                Woo! Congrats, @sjamaan! I know how long this has been in the making. Great to see CHICKEN staying at the top of the game.

                                                1. 8

                                                  Thanks @zdsmith! This is an important release for us, yet in some sense only the beginning. People have been holding back several cool patches in the interest of getting this release out, so 5.1.0 is probably going to rock just as hard as this release.

                                                  1. 1

                                                    What kinds of things are likely to land in the point release?

                                                    1. 2

                                                      Well, we have a milestone for it in Trac so that should give a good idea of all the stuff we would like to tackle. I’m not 100% sure all these tickets will stay on 5.1, but we certainly are going to aim at fixing as many of these as possible. Besides that, people have been thinking about improving our thread scheduler (which is a right mess), the scrutinizer is going to get some attention and there’s even been talk about a native code backend (but that’s more likely to be part of 6.0, so don’t get your hopes up).

                                                      There’s also an interesting patch pending that enables conditional library loading, so when you do (if blabla (import foo)), the import will only happen when blabla is true. This is a continuation (haha) of the work we did to make import expressions lexically scoped (which is in 5.0 already), so that in (let () (import foo) ...) the identifiers which foo exports do not leak outside the let. In CHICKEN 4, these kinds of imports were (sort of) raised to the toplevel.

                                                      Performance is also a focus, as 5.0 is slightly slower than 4.x and in benchmarks we’re somewhat middle of the road, so I really want to see if that can be improved.

                                                1. 8

                                                  begin shameless plug

                                                  These objections echo why I wrote dpdb. I wanted to abstract away the trivial details of different database backends (connection strings, the parameter-quoting style, etc) but still be able to write real SQL queries.

                                                  A whole lot of research has gone in to making databases good at manipulating data in situ. Yes you can do that with ORMs, but usually one of two things happens (in my experience):

                                                  • you manipulate the data in your application and do a lot of round trips to/from the database, which is horribly inefficient and not using your database for one of the things it’s good at (manipulating data)
                                                  • you do clever things to manipulate your data in the database, but by doing so you have to go around your ORM, removing a lot of the advantages of the ORM

                                                  I’m sure things have improved in the ORM world, but I haven’t used an ORM layer since I started using dpdb.

                                                  So yeah, if you want to manipulate a bunch of data without a bunch of round trips and battling a very real impedance mismatch, the time to learn SQL will be well spent.

                                                  1. 4

                                                    For people in .net land I can show a neat shameless plug, I have nothing to do with this project but I do love F#.

                                                    Rezoom.SQL offers a unified SQL dialect that can query many different kinds of database, SQLite, PGSQL, TSQL etc. This of course is the main argument for the ORM that I can think of. It uses type providers instead of an ORM.

                                                    1. 1

                                                      That looks pretty cool. I think Dapper would probably be the most direct .NET analog to what lorddimwit is suggesting, but they look as if they serve slightly different purposes, similar to the normal use of Ruby’s Sequel library v. directly invoking SQL queries and using Sequel purely for the driver abstractions.

                                                  1. 4

                                                    So, I have a serious question: I understand different databases have different trade-offs; that’s fine. But since jepsen tests seem to reliably fail in non-intuitive ways on MongoDB, I’m having trouble figuring out two things:

                                                    1. Are services running on MongoDB just losing data constantly and no one notices? If not, has it decreased the frequency, or the failure states, compared to five years ago?
                                                    2. Does this imply that there should be some sort of “jepsen-for-the-99%” test? What would it take for MongoDB to legitimately pass? What else that currently fails jepsen would then pass?
                                                    1. 2

                                                      Yes, services have just been losing data. Take parse for instance:

                                                      • Frequent (daily) master reelections on AWS EC2. Rollback files were discarded and let to data loss

                                                      https://medium.baqend.com/parse-is-gone-a-few-secrets-about-their-infrastructure-91b3ab2fcf71

                                                      1. 2

                                                        Network partitions & failovers are both relatively uncommon operations in day-to-day operations.

                                                        You’re only moderately likely to lose a few minutes of updates once every few years.

                                                        1. 2

                                                          This is something that has proven to be untrue many times over and has been refuted by @aphyr himself:

                                                          https://queue.acm.org/detail.cfm?id=2655736

                                                          1. 1

                                                            I said “relatively uncommon”; that is, not frequently enough to cause enough data loss to kill a business built on it.

                                                        2. 1
                                                          1. Sort of, yes. If your network experiences a hiccup, your mongodb cluster can go AWOL or FUBAR, depending on how the dice roll. That is on top of the usual problems with organically growing document stores…

                                                          2. To legit pass, a MongoDB server should handle network failure to the cluster by becoming either unavailable or, if a quorum is present, continuing operation. Continuing operation in the absence of a quorum or any other mechanism to ensure data consistency is an immediate fail IMO.

                                                        1. 8

                                                          At work, I’m continuing to chip away at some Active Merchant improvements.

                                                          At home, I’m working on my other hobby, my DeLorean, which needs a new window regulator. Two of the bolts are borderline impossible to get in, so I’m making a custom tool for the purpose, which will be the first thing I’ll have 3D printed that isn’t, like, a soap tray.

                                                          I will also try to hack on Factor a bit, but that’s honestly been rare these days. The older I get, the harder it is to follow up a day of coding with…more coding.

                                                          1. 3

                                                            any rumblings on what happened to Factors creator, Slava Pestov? I’ve used jEdit a ton in the past and heard alot about Factor … i heard he moved onto Google at one point, but I’m shocked to have not heard any news regarding him in the recent past…

                                                            I can relate to the “it’s hard to follow up a day of coding with … more coding” … i don’t even get how I have friends that can do hours of WoW after a day of coding. I need to separate myself from the PC in the evening daily :D

                                                            1. 3

                                                              any rumblings on what happened to Factors creator, Slava Pestov?

                                                              He works on Swift at Apple. You can follow his Twitter feed if you’re curious.

                                                            2. 1

                                                              so I’m making a custom tool for the purpose, which will be the first thing I’ll have 3D printed that isn’t, like, a soap tray.

                                                              I always think of stuff that is 3D printed as being – for lack of a better word – fragile. You are going to make a tool with it – that is awesome and interesting. Can you give us some details after the fact about the 3D printer, tool and if it all worked?

                                                              1. 3

                                                                Sure. That said, I think you’re overestimating what a tool means in this case.

                                                                John DeLorean and Steve Jobs have a lot in common, personality-wise, and the DMC-12 is kind of a Macintosh of cars: it’s super-stylish and has tons of things that were novel for the time, but also made tons of compromises in the process. The doors, which are a) gull-wing doors, b) before people figured out how to actually do that sanely, c) and also have some of the earliest power windows, are a complete shit-show. In this case, to put the lower half of the door back on, you have to get two bolts (or screws, if you’re the first one in the door and haven’t replaced them, which is worse) into two holes. You would normally want to hand-thread something like this, but these holes are obscured, and also about 3-4 inches down in the door, accessible only through two holes, each only about 1”x1.5”. And no, you can’t do the bolts first. And, oh yes, if you miss, and the bolt falls into the door, you have to disassemble all of the door you’ve assembled up to that point.

                                                                So, the tool I’m making literally just needs to help me get the bolts threaded in the tiniest, littlest amount, after which its job is done and I can sanely use a ratchet wrench. It’s serving the role my fingers would play…if my fingers were 8” long and as thin as a pencil. If you imagine two joined chopsticks that are bent 90 degrees for the last 2cm or so, that’s literally all I’m making.

                                                                So yeah, I’ll post back, but unless I really fuck up, then while it might not actually work, it at least shouldn’t snap or anything.

                                                                1. 1

                                                                  fingers were 8” long and as thin as a pencil

                                                                  That image is now etched into my mind. :)

                                                                  1. 1

                                                                    I’m just a little mad the DMC-12 stole the thunder from the Bricklin SV-1, the local automobile from here. It even had gull-wing doors too!

                                                                    1. 1

                                                                      That’s true, but didn’t the SV-1 stop production like half a decade before the first DMC-12 rolled off the assembly line? It’s been awhile, but I remember it having a shorter run and massive quality control issues.

                                                                      1. 1

                                                                        Very much true - but the DMC-12 also has the advantage of becoming a pop culture icon ex post facto as well.

                                                              1. 2

                                                                I have an older HP 13” x360 with 16 GB of RAM and a 6th-gen i7, running Fedora. I was drawn to it because the screen (which is hi-DPI) and keyboard are quite nice, it’s highly portable, components I cared about were well-supported by Linux, and it’s got a touch screen for when I want it (e.g. for testing Android apps), and I was able to buy the laptop on a heavy discount, since the 7th gen x360s were coming out at the same time. The main drawbacks are that the graphics are underpowered (fine for either an external hi-DPI display, or an internal one, but not both at once, and not for games), and that it just predates USB-C charging, so I have to carry around an extra power brick when I’ve also got my work’s MacBook Pro.

                                                                1. 2

                                                                  I am curious about one thing. The image model of small talk, which is considered one of its strengths is similar to the notebook state in Jupyter notebooks right? How does smalltalk get away from all the associated disadvantages?

                                                                  What am I missing when people talk about image based development?

                                                                  1. 11

                                                                    The main thing I think you’re missing is that the actual Smalltalk development experience looks nothing like the experience of using Jupyter.

                                                                    First, Smalltalk, unlike every other language I’m aware of, and unlike Jupyter notebooks, is not written as files. Instead, you work entirely in a tool called the browser, where you can see a list of classes, those classes’ definitions, and a list of all methods within a class. The order in which these classes and methods were defined is irrelevant and invisible. This alone eliminates a huge swath of the notebook complaints.

                                                                    Second, with few exceptions, the version of objects you’re seeing is always live; while you might have a Workspace (REPL) open with a test and output, that’s visibly very distinct from an Inspector, which shows you the current state of any given variable. The Browser likewise only shows you the current definitions of a class or method. (Previous versions are usually available through what you can think of as a very powerful undo tool.) You thus don’t end up with the current v. previous value skew issues with notebooks.

                                                                    Notebooks are suffering because they’re trying to bring a kind of Smalltalky experience to a world where code is written linearly in an editor. I agree, that’s tough, and that’s really the underlying issue that the post you linked is hitting. Smalltalk (and Common Lisp environments) instead focus on saying that, if you’re gonna have an image-style situation, you need tooling that focuses on the dynamic nature of the preserved data.

                                                                    [Edit: all that said, by the way, I think you can make a case that some specifics of how Smalltalk’s image works in relation to its dev environment are a bit off. One way to fix that is the direction Self went with Morphic, where truly everything is live, and direct object manipulation rules the day. The other direction you can go is what Common Lisp and Factor do, which is to say that the image contains code, but not data—in other words, making images more like Java .jars/.NET assemblies/Python .pyc files. The purist in me prefers Self’s approach, the practical part of me prefers Factor/Common Lisp’s.]

                                                                    1. 2

                                                                      Thank you for your response.

                                                                      I am not sure I understand. Say I have an object A that contains another object B constructed in a particular way as a member. Now, if I edit the constructor of the object B, so that the variables inside B are initialized slightly differently, would it reflect on the already constructed object inside A?

                                                                      1. 5

                                                                        Not in that specific case, no. For other things (e.g., changing variable names, class shape, changing a method definition, etc.), the answer is yes. The best way to think of it: the Smalltalk image is a database, and like most databases, if you change the schema or a stored procedure, that takes effect immediately, but existing data would need to be backfilled or changed. This is exactly the thing I was flagging on why Common Lisp and Factor do not do this: their images are code only, no data. (Or Self, for which the answer to your question is, at least in some cases, actually yes.)

                                                                        This is different than the main thing highlighted in the article, though. There, the concern wasn’t as much about state existing at all, as much as the fact that the presentation made it look as if the output accurately reflected the input, which wasn’t guaranteed. Thus, in a notebook,

                                                                        In[123]: x = 5
                                                                        Out[123]: 5
                                                                        

                                                                        is potentially not accurately reflecting the real value of x, whereas in Smalltalk, if you went behind the scenes and changed x to, say, 10, then any Inspector on x would also change immediately to 10.

                                                                        1. 2

                                                                          Thanks again for the detailed response!

                                                                          I understood the rest of the post, but I do not get it when you say that in Common Lisp (and Factor), image is code only, and not data. How is that different from storing everything in a file?

                                                                          1. 2

                                                                            Eh, I probably confused things. The images for Factor and Lisp are just compiled code, effectively, albeit stored in a high-level format that’s designed to make debugging a running app a lot easier. That’s why I said they’re equivalent to Java .class files or the like. I was more mentioning that because the word “images” means something very different in Smalltalk/Self v. Common Lisp/Factor-like systems.

                                                                            1. 1

                                                                              So, what does it mean when Factor says it has an image based model? Is it simply saying that it is compiled?

                                                                              Going back to the original question; My experience is with R, where the image is frequently not a boon, unless one is very careful not to reuse variable names during data cleaning. And the linearity of notebooks isn’t a factor when you work in the command line. R does let you see the current definitions of everything but that is not as helpful as it first seemed to be. Hence my question.

                                                                          2. 1

                                                                            Interesting! So if I define a class, instantiate it, change a method definition, and call that method on the class, the new definition is called?

                                                                            That would indeed be much more useful than a notebook-like approach.

                                                                            1. 2

                                                                              That’s completely correct, and also applies to certain other refactorings on the class (e.g., renaming instance variables or the like).

                                                                        2. 1

                                                                          One problem I could see with image files is servicing them; how do you patch several image files, or worse, deal with divergences in each due to patching of behaviour?

                                                                      1. 6

                                                                        I’m glad to see that they are making progress. I dream of an OS as extensible as Emacs, and I think using Guile is a step in that direction.

                                                                        1. 7

                                                                          Honestly, the heavy resurgence of Guile in the GNU stack (via Guix, nearly-there Emacs integration, etc.) has me paying a lot more attention to the GNU project than I have in quite awhile. I’m excited to see where this goes.

                                                                          1. 1

                                                                            Is it actually near completion in Emacs? I couldn’t find anything online about it.

                                                                        1. 2

                                                                          We literally do the direct equivalent of this in Smalltalk, and have since the very first version of Smalltalk-80, because, while the author’s really upset about it, it turns out you actually need to do this in real-world hierarchical OO programming. I have never been confused by this, even the first time I came across the pattern; it just made intuitive sense. And given that Ruby the language is largely Smalltalk-80 with a different syntax, I’d say that sets the bar pretty high if you want to convince me to change my ways.

                                                                          …which is unfortunate, since the article provides zero actual motivation for change other than the author doesn’t like it.

                                                                          1. 1

                                                                            The motivation for change is that the documented purpose of the exception is something else. I think it’s totally valid to use a custom exception class, or even for one to be provided in the Ruby standard library, but I do think there’s something compelling about “This class is documented to mean this and that is not the way it is being used”.

                                                                            https://www.gnu.org/software/smalltalk/manual-base/gst-base.html#SystemExceptions_002eNotImplemented is this the SmallTalk equivalent? Seems totally valid to use that as-documented.

                                                                            http://ruby-doc.org/core-2.5.1/NotImplementedError.html speaks to a different use entirely.

                                                                          1. 2

                                                                            Taking a break. It’s the weekend. Give yourself a moment away from the computer.

                                                                            1. 1

                                                                              Yup.

                                                                              Instead of hacking yesterday, I made lemonade and went swimming in a beautiful, quiet lake just to take nap on the grass afterwards - refreshing af.