225 Matching Annotations
  1. Feb 2021
    1. Currently, only Right signals are wired up.

      So what happens if a task returns a Left signal?? Will it still go Right? Will it error?

    1. step :direct_debit

      I don't think we would/should really want to make this the "success" (Right) path and :credit_card be the "failure" (Left) track.

      Maybe it's okay to repurpose Left and Right for something other than failure/success ... but only if we can actually change the default semantic of those signals/outputs. Is that possible? Maybe there's a way to override or delete the default outputs?

    2. Defaults names are given to steps without the :id options, but these might be awkward sometimes.

      Why would those default names ever be awkward?

      If you the default name is whatever comes after step:

      step :default_name

      then why can't you just change that name to whatever you want?

      To answer my own question: I think you can do that, as long as the name is the 1st argument to step. But below I noticed an example where a Subprocess was the 1st argument instead, and so it needs a name in this case:

      step Subprocess(DeleteAssets), id: :delete_assets

      Why are they inconsistent about calling it name or id? Which one is it? I guess it's an id since that's what the key is called, and since there's an Id() helper to reference a task by its id.

    1. Another thing I don’t like is the name of the config file manifest.js. Internally Sprockets has the concept of a manifest already Sprockets::Manifest, but the two aren’t directly coupled. We also already have a “manifest” JSON file that gets generated in public/assets/ and has manifest in the name .Sprockets-manifest-140998229eec5a9a5802b31d0ef6ed25.json. I know one is a JS file and one is a JSON file, but it’s a bit confusing to talk about.

      When I first heard of app/assets/config/manifest.js, I was a bit confused too, and assumed/wondered if it was related to the manifest it generates under public.

    2. The link name is not very helpful, it doesn’t explain what it does very well.
    1. Our mission is to allow people to make money via educational efforts and to dedicate the rest of their time to creating great open source products.

      What does this mean exactly? "Our mission is to allow people to make money via educational efforts"

    1. The latter are important examples which usually also exist in "purely" functional programming languages.

      How can they exist and it still be considered pure??

      I guess that's not quite the same / as bad as saying something had side effects in a purely functional programming context, right?

    1. provide interfaces so you don’t have to think about them

      Question to myself: Is not having to think about it actually a good goal to have? Is it at odds with making intentional/well-considered decisions?  Obviously there are still many of interesting decisions to make even when using a framework that provides conventions and standardization and makes some decisions for you...

    1. What is the opposite of free content?

      The opposite of free/open-source software is proprietary software or non-free software (https://en.wikipedia.org/wiki/Proprietary_software).

      So should we call the opposite of free content "non-free content"? Or "proprietary content"?

      Seems likes either would be fine.

      Looks like https://en.wikipedia.org/wiki/Wikipedia:Non-free_content prefers the term "non-free content".

      Couldn't find anyone contrasting these 2 terms (like I could no doubt find for software):

      Not to be confused with:

      • paid content ... just like:
      • free content should not be confused with gratis content (?)
      • free software should not be confused with freeware
    1. The rsync and sleep commands (the sleep is just an example) are run through exec to prevent the creation of zombie processes if I kill the parent script while they're running, and each potentially-long-running command is wrapped in its own subshell so that when exec finishes, it won't terminate the whole script.
  2. www.metacritic.com www.metacritic.com
    1. Please, do not buy this. I am really tired of "games" that are given critical praise because its cool to praise or because its political correct to do. I will break up my review in points so its clear why I dislike this "game" : 1) This is not a game. This is a short story, like an interactive book. 2) This game is so short, that I completed it in a 3 hour bus ride. It was boring. 3) Its a story of a girl that have to take the reigns of her life after divorce. WOMAN EMPOWERMENT. Now you know why this game is rated so highly 4) This is a MOBILE GAME. I paid $3 to play on an iphone (after watching a gaming channel give it GOTY contender. Needless to say, I never watched that gaming channel again). I FELT I WAS ROBBED OF TIME AND $3. Imagine how much I hated this game to feel like I was robbed even though it costed me only $3. 5) This game costs $7 on the eshop. You could buy CELESTE for $9 on sale on the Eshop. That is a great game. I recently bought Hollow Knight for $7 on Playstation. This interactive novel should not be sold as a game. Period. It is a waste of time and money.

      Nothing wrong with interactive novels being sold in the same store as games... as long as it's clear what it is (no false advertising).

      Somewhat agree with some of the other points...

    1. compose(Add, x: x, y: 3)

      How is this better than simply:

      Add.run(x: x, y: 3)


      I guess if we did that we would also have to remember to handle merging errors from that outcome into self...

    1. @adisos if reform-rails will not match, I suggest to use: https://github.com/orgsync/active_interaction I've switched to it after reform-rails as it was not fully detached from the activerecord, code is a bit hacky and complex to modify, and in overall reform not so flexible as active_interaction. It has multiple params as well: https://github.com/orgsync/active_interaction/blob/master/spec/active_interaction/modules/input_processor_spec.rb#L41

      I'm not sure what he meant by:

      fully detached from the activerecord I didn't think it was tied to ActiveRecord.

      But I definitely agree with:

      code is a bit hacky and complex to modify

    1. with ActiveForm-Rails, validations is the responsability of the form and not of the models. There is no need to synchronize errors from the form to the models and vice versa.

      But if you intend to save to a model after the form validates, then you can't escape the models' validations:

      either you check that the models pass their own validations ahead of time (like I want to do, and I think @mattheworiordan was wanting to do), or you have to accept that one of the following outcomes is possible/inevitable if the models' own validations fail:

      1. if you use object.save then it may silently fail to save
      2. if you use object.save then it will fail to save and raise an error

      Are either of those outcomes acceptable to you? To me, they seem not to be. Hence we must also check for / handle the models' validations. Hence we need a way to aggregate errors from both the form object (context-specific validations) and from the models (unconditional/invariant validations that should always be checked by the model), and present them to the user.

      What do you guys find to be the best way to accomplish that?

      I am interested to know what best practices you use / still use today after all these years. I keep finding myself running into this same problem/need, which is how I ended up looking for what the current options are for form objects today...

    2. If you compare the code of Reform and the code of ActiveForm-Rails, I think the last is more simple and clear for a behavior similar (or better).
    1. you'll want to update Devise's generated views to remove references to passwords, since you don't need them any more

      Doesn't this contradict the statement

      This strategy plays well with most other Devise strategies

      (which includes password strategies)?

      One thing that wasn't clear from their instructions was whether magic links could be used as an option in addition to regular password log-ins. On the one hand they say:

      This strategy plays well with most other Devise strategies (see notes on other Devise strategies).

      but on the other hand they say:

      you'll want to update Devise's generated views to remove references to passwords, since you don't need them any more

    1. You use grid-area, so the place for the side nav is allocated at start. If you hide (or even delete) the side nav, that won't change anything about this. You have to do a little trick: Set the width for the first column to 0 and change the grid-gap because otherwise you will have a (not needed) gap at the left.
    1. Popup - You don't need to deal with these messages right away, yet at some point you will need to take action since these won't go away until explicitly say say you don't want them around anymore.
  3. Jan 2021
    1. Slackmojis is made by some random dude in Brooklyn. He doesn't work for Slack, isn't paid by Slack, he just thinks Slack is pretty cool. Super Official Lawyer Talk: Slackmojis is not created by, affiliated with, or supported by Slack Technologies, Inc.
    1. So, what I've discovered in a meanwhile. It was an ubuntu-docker issue. Recently I upgraded my ubuntu from 16.04 to 18.04. This change seems to be incompatible with the docker version I had, 1.11.0.
    1. Situation: you have a single line of text in a flex child element. You don’t want that text to wrap, you want it truncated with ellipsis (or fall back to just hiding the overflow). But the worst happens. The unthinkable! The layout breaks and forces the entire flex parent element too wide. Flexbox is supposed to be helping make layout easier!
    1. Simple ways to do more with spreadsheets

      For me the key is use cases within my discipline--teaching and how students can use them. I don't like to teach stuff that won't reap students dividends in productivity, learning, sharing, gathering info effectively, time saving.

    1. I can’t promise I’m explaining this 100% accurately, but the way I understand it, the minimum width of a grid column is auto.
    1. Basically the typescript compiler emits no code for interfaces, so webpack can not find them in the compiled module; except when a module consists of only interfaces. In that case the module will end up completely empty and then webpack will not investigate the exports.
    1. However, one of the drawbacks of this property is that the line intersects descenders of the characters.

      I think it actually looks great/better because it intersects descenders of the characters.

    1. Open About Popover

      I have to say, I like how it looks in their Apple and Desktop preview better than the Android/Material preview. I wish they had the arrow in Android Material too.

      But on https://sveltematerialui.com/demo/menu-surface it doesn't bother me quite as much...

    1. You may find that your application requires a layout that differs slightly from your regular application layout to support one particular controller. Rather than repeating the main layout and editing it, you can accomplish this by using nested layouts (sometimes called sub-templates).
    1. What if there's an icon that I need that's not in this set?

      How do I add a custom icon to the set for use on a web page and have the custom icon styled the same way as these "standard" icons?

      Like how they have instructions for adding an icon here, for example: https://www.digitalocean.com/community/tutorials/angular-custom-svg-icons-angular-material#custom-svg-icons

  4. Dec 2020
    1. This can be used to perform actions once the navigation has completed, such as updating a database, store

      Wouldn't/shouldn't it be the other way around — wouldn't we wait until the save is completed (database is updated) successfully before we navigate away from the current page/form??

  5. Nov 2020
    1. This definition is actually a strict subset of the first definition: as the same script must (by definition) run inside both a server/Node.js context, but also a browser DOM context
    1. Text links are a very simple button type.

      Eh? I didn't know links were considered buttons. I'm not sure I totally agree understand, but it's not outrageous either...

      Update: Okay, I guess when you put an outline around it (like they directly below this paragraph), and even more if you put an icon with it (like they did further down; https://hyp.is/DZTZzi6fEeuu65uvQJ9W1Q/uxdesign.cc/ui-cheat-sheets-buttons-7329ed9d6112), the link looks like more like a button.

      But (and I think this is their point) it is what it is because of how it's used and not how it's styled: it should be the same thing (a button) whether or not it has an outline.

    1. If I understand the problem correctly, just changing the imports to point to svelte/internal isn't enough because they could still point to different packages depending on how your components are bundled. It solved your specific issue, but if you had two completely unrelated Svelte components compiled to vanilla javascript bundled with Svelte, you'd still hit issues with mismatching current_component when using slots or callbacks.
    2. It sounds like another case of multiple svelte/internal modules? I think we need to look into reworking how svelte/internal keeps track of the current component since it breaks when mixing components not bundled with the app. It sounds like we need to find a way to pass Svelte's internal runtime state when instantiating components, since slots and callbacks end up mixing different svelte/internal together.
    1. A Chrome Extension designed with one intention: Increase the speed and privacy of your web browsing by skipping tracking redirects and removing the tracking parameters from URLs to keep them short and cleaner for sharing, bookmarking, etc.
    1. It is impossible to rebuild the base from the Dockerfile as the 3rd party dependencies have changed significantly since 8 months ago when the base was last built. The tags for my base image have been overwritten and I can only restore them from a descendant image. With Docker 1.8 I simply pulled the descendant image, tagged the base layer and I was done. With Docker 1.10+ I'd need to save, then manually construct the base image descriptor and reload it. Doable but sad that it's far more complex.
    2. Is anything like this possible with the new setup?
    3. Unfortunately, this image was built months ago. No one has the build any more. We are left with a descendant image that has all the original content but on lower layers.
    4. is there a way we can specify for image build layers to be included in the pull?
    5. Sorry, I don't totally know how the internals work, but does there currently exist a workaround? By that I mean, can I pull an image, then run it at a layer other than the top layer? (I basically use this for testing purposes, its certainly possible to build the image myself then do it, but its slightly less convenient)
    1. i like working on application frameworks, compilers, interpreters, and emulators.
    1. but know I know what I don't want to do. I definitely know I want to be an Engineer now, and it makes it more clear that I should start my own business.
  6. Oct 2020
    1. Please don't copy answers to multiple questions; this is the same as your answer to a similar question

      Why on earth not? There's nothing wrong with reusing the same answer if it can work for multiple questions. That's called being efficient. It would be stupid to write a new answer from scratch when you already have one that can work very well and fits the question very well.

    1. “"

      Which character is this referring to exactly?

      It looks like the empty string, which wouldn't make sense.

      https://www.postgresql.org/docs/13/functions-matching.html only lists these 2:

      If pattern does not contain percent signs or underscores, then the pattern only represents the string itself; in that case LIKE acts like the equals operator. An underscore (_) in pattern stands for (matches) any single character; a percent sign (%) matches any sequence of zero or more characters.

    1. Could you please explain why it is a vulnerability for an attacker to know the user names on a system? Currently External Identity Providers are wildly popular, meaning that user names are personal emails.My amazon account is my email address, my Azure account is my email address and both sites manage highly valuable information that could take a whole company out of business... and yet, they show no concern on hiding user names...

      Good question: Why do the big players like Azure not seem to worry? Microsoft, Amazon, Google, etc. too probably. In fact, any email provider. So once someone knows your email address, you are (more) vulnerable to someone trying to hack your account. Makes me wonder if the severity of this problem is overrated.

      Irony: He (using his full real name) posts:

      1. Information about which account ("my Azure account is my email address"), and
      2. How high-value of a target he would be ("both sites manage highly valuable information that could take a whole company out of business...")

      thus making himself more of a target. (I hope he does not get targetted though.)

    1. For all systems of structural incentive, the incentive of any actor (individual or group), must be rigorously aligned with the well-being of all other agents in the system and of the commons writ large. Ie, all externalities must be internalized – all the consequences of activity within the system must be included in the system’s accounting.

      Sure ...

      This is a bit "I want a million dollars"

      You can write this down and the devil is in how to implement it.

    1. Another example:

      const expensiveOperation = async (value) => {
        // return Promise.resolve(value)
          // console.log('value:', value)
          await sleep(1000)
          console.log('expensiveOperation: value:', value, 'finished')
          return value
      var expensiveOperationDebounce = debounce(expensiveOperation, 100);
      // for (let num of [1, 2]) {
      //   expensiveOperationDebounce(num).then(value => {
      //     console.log(value)
      //   })
      // }
      (async () => { await sleep(0   ); console.log(await expensiveOperationDebounce(1)) })();
      (async () => { await sleep(200 ); console.log(await expensiveOperationDebounce(2)) })();
      (async () => { await sleep(1300); console.log(await expensiveOperationDebounce(3)) })();
      // setTimeout(async () => {
      //   console.log(await expensiveOperationDebounce(3))
      // }, 1300)

      Outputs: 1, 2, 3

      Why, if I change it to:

      (async () => { await sleep(0   ); console.log(await expensiveOperationDebounce(1)) })();
      (async () => { await sleep(200 ); console.log(await expensiveOperationDebounce(2)) })();
      (async () => { await sleep(1100); console.log(await expensiveOperationDebounce(3)) })();

      Does it only output 2, 3?

    1. Using the keyboard arrows, navigate down the suggestion list to the item(s) you want to remove from the Chrome autofill suggestions With the suggestion highlighted, use the appropriate keystroke sequence to delete the Chrome suggestion:

      Linux: Shift + Delete

    1. andrewdeandrade commented on Jul 31, 2015

      locked issues that I would comment on if I could: Can't react to comment because locked. Want to thumb up.

    2. Without elegant ways of expressing loops/iterators (like angular does with directives), the primary way to keep JSX readable thus becomes copying and pasting.

      I'm not quite sure I understand this (so until I do, I'm not sure I agree)...

      Why does he think copying and pasting is the only way to make it readable? Like he pointed out, you can extract JSX snippets and use loops within JSX. But maybe he means (his previous point), that people often don't do that. Hmm. 

    1. I don't understand the need for the name "Open–closed principle". It doesn't seem meaningful or clear to me.

      Can't we just call it "extensibility" or "easily extendable"? Doesn't "extensibility" already imply that we are extending it (adding new code on top of it, to interoperate with it) rather than modifying its source code?

    1. Don’t indent code blocks.

      Sure, we don't need to add any additional indent. But what if your code block contains indentation (function body)? It would look silly to remove all leading indentation.

    1. Although I'm starting to regret even posting this because I feel like it cheapens what we've accomplished.
    2. But I suppose it comes with the territory when I consider even publishing an article like this. I was sitting on this one for weeks and wasn't sure I was going to publish it until I found myself trying to defend why I didn't just give up before I started.
    1. A new option --proximate=N groups together lines of output that are within N lines of each other in the file. This is useful when looking for matches that are related to each other.

      I'd been wishing for a feature like this with grep/etc. tools.

      I've had to use some really ugly workarounds (chain grep -C5 | grep -B5) which end up showing extra irrelevant context lines.

      So I'm glad there's a clean way to do this now!

  7. Sep 2020
    1. Actually just returning the loginDaoCall works fine. I dont really get what's different as it is the looked like it was the same instance, but probably not.

      So the posted answer wasn't necessary/correct? Which part of the answer was incorrect/unneeded?

      I wish this OP comment included the full version of code that worked.

      I don't understand this OP comment. Wasn't OP already returning loginDaoCall? So maybe the only thing they could mean is that they just needed to change it to return loginDaoCall.then(...) instead...

      That would be consistent with what the answer said:

      the promise returned by the further .then() does also get rejected and was not handled.

      So I guess the unnecessary part of the answer was adding the return true/false...

    1. The AOL helpline number would is the best option "How do I talk to a Live Person at AOL". Usually after dialing the number, stay on the line and move as prompted. It may take a while but you will get proper assistance. The process is quite long, if you think that the process is taking more time than expected it’s better to use chat help option.

    2. There might be an issue that you buy a new phone and wish to set up AT&T email in Outlook on your phone, but you are facing some serious technical glitch. If your AT&T is not working, you might want to connect to a live person to get the issue fixed. There are three common ways, How do I talk to a live person at AT&T.

    1. setContext / getContext can only be used once at component init, so how do you share your API result through context? Related: how would you share those API results if the call was made outside of a Svelte component, where setContext would be even more out of the question (and the API call would arguably be better located, for separation of concerns matters)? Well, put a store in your context.
    1. While there is some precedence in other frameworks for using as, the word doesn't fit well. Since you are adding functionality to elements I like the word add better (and it only has 1 more character).
    2. the ability to pass around element names as strings in place of components
    1. Can this word be used to describe the property in computing where a value can be dynamic? I feel like "dynamicness" would be a better term for this.

      It seems to refer more to personality:

      1a: marked by usually continuous and productive activity or change a dynamic city b: ENERGETIC, FORCEFUL a dynamic personality

      See also the same sentiment here: https://news.ycombinator.com/item?id=4137596

    1. I considered it, but dynamism refers to personality and philosophy, while dynamicity is just the condition of being dynamic.
    1. I am curious if this is being looked at seriously or not. This is currently an issue I keep running into when trying to build highly general purpose UI Library style component sets.
    2. I keep needing this feature three times a week.
    1. I was now about to form another being of whose dispositions I was alike ignorant; she might become ten thousand times more malignant than her mate and delight, for its own sake, in murder and wretchedness.

      No one knows what someone will be like after they've been brought into the world, but we don't lament every single person who is born. When someone you know is having a kid you don't say to them: "remember H.H. Holmes? Are you sure you want to have kid? They might be ten thousand times worse than H.H. Holmes!" Because that would be ridiculous.

    1. The problem with the export { className as class } approach is that the classes defined in the parent/calling component still have to be marked as being global otherwise they get removed.
    1. But because that final CSS file is probably minified (all whitespace removed), DevTools is likely to tell us that we’ll find the declaration we’re looking for on line 1! Unfortunate, and not helpful for development.
    1. The decline of the Muslim civilization, a puzzle that remains elusive despite a rich variety of suggested causes from the goat to Mongols, began almost simultaneously with the rise of the modern Europe. The advent of the Reformation that transformed the intellectual landscape of Europe is dated from 1517 when Martin Luther began his campaign against the Church. By a remarkable coincidence an event that helped freeze the intellectual landscape of the Muslim world took place at about the same time. In 1515 the Ottoman Sultan Selim I, persuaded by the influential clerics of the realm, issued a decree that imposed death penalty on anyone using a printing press, invented in Germany in 1455, to print books in Turkish or Arabic. The ban remained in force for the next 270 years, till 1784, except for an attempt to circumvent the ban in 1729. Thus, it was only after 1784 that the technology of printing could filter to the rest of the Middle East. Even so it was not till 1817 (362 years after the invention of printing) that the first book was printed in Iran. In Europe, however, the printing press had come into extensive use in by the end of the 15th century and is recognized as a powerful engine of the Reformation and the making of the modern Europe

      Ah hah, one explanation of how Islam, leading the known world in literature, philosophy, science etc went into steep decline at exactly the same time that Martin Luthar made his famous statements. The Ottomans' banning of the printing press for 270 years retarded what had once been a flourishing empire.

      This ties in with the [[From Dawn to Decadence]] book.

  8. Aug 2020
  9. Jul 2020
    1. This isn’t an accident. OpenOffice’s sidebar code was copied and incorporated into LibreOffice. The Apache OpenOffice project uses the Apache License, while the LibreOffice uses a dual LGPLv3 / MPL license. The practical result is LibreOffice can take OpenOffice’s code and incorporate it into LibreOffice — the licenses are compatible. On the other hand, LibreOffice has some features — like font embedding — that don’t appear in OpenOffice. This is because the two different licenses only allow a one-way transfer of code. LibreOffice can incorporate OpenOffice’s code, but OpenOffice can’t incorporate LibreOffice’s code. This is the result of the different licenses the projects chose.

      What part of LGPLv3 / MPL prevents LibreOffice code from being incorporated back into OpenOffice's Apache Licensed code??

    1. lass ceilings’.

      These individuals who hit this "glass ceiling" make up the majority of the population in our classrooms. These are the children who's schools are underfunded and teachers are exhausted and burn out or who are fresh out of school with no experience, but a lot of motivation.

    1. Take a look at the slogans of some of the popular companies.

      Hmm, are these taglines or slogans? According to https://yourbusiness.azcentral.com/slogan-vs-tagline-12643.html:

      A tagline should represent your business, while a slogan represents a single product or is part of an advertising campaign

      it seems that these are more taglines than slogans.

    1. In the Set class we already called this - and difference, which it is ok but not really accurate because of the previous explanation, but probably not worthwhile to change it.

      Is this saying that the name difference is inaccurate?

      Why is it inaccurate? You even called it the "theoretic difference" above.

      Is that because "relative complement" would be better? Or because the full phrase "theoretic difference" [https://en.wiktionary.org/wiki/set-theoretic_difference] is required in order for it to be accurate rather than just "difference"?

    2. This improved readability

      Not really. How?

    3. inaccurate

      How is the use of - for sets inaccurate?

  10. Jun 2020
    1. This means you no longer have to declare inverse_of on two associations which have good names.

      ... which have good names.

      This implies that those names where the inverse_of cannot automatically be inferred are bad names. I disagree that a "good name" is at all related/dependent on that ability.

      What they should say here instead is:

      ... which have names that allow the relationship to be easily inferred.

      Or refer to these names as the "default" or "Rails conventional" names for these associations.

      But it is not necessarily a better name. A better name is, quite often, one that is more descriptive and specific.

      For example, just because by default if you use rails generate with a User model, it might (I don't remember; can it even generate associations?) create a belongs_to :user association doesn't mean that's the best name for it. belongs_to :author or belongs_to :owner, for example, being more specific, are likely better names. The model still needs a generic name like User because it may be used in various relationships, but the relationships themselves should pretty much never be called user because there's almost always a more specific name that better reveals/describes the relationship.

    1. What would be nice is if JavaScript had a built-in way to do what I can do in Ruby with:

      > I18n.interpolate('Hi, %{name}', name: 'Fred')
      => "Hi, Fred"

      But to be fair, I18n comes from i18n library, so JS could just as easily (and I'm sure does) have a library that does the same thing.

      Update: Actually, you can do this in plain Ruby (so why do we even need I18n.interpolate?):

      main > "Hi, %{name}" % {name: 'Fred'}
      => "Hi, Fred"
      main > ? String#%
      From: string.c (C Method):
      Owner: String
      Visibility: public
      Signature: %(arg1)
      Number of lines: 9
      Format---Uses str as a format specification, and returns the result
      of applying it to arg. If the format specification contains more than
      one substitution, then arg must be an Array or Hash
      containing the values to be substituted. See Kernel::sprintf for
      details of the format string.
         "%05d" % 123                              #=> "00123"
         "%-5s: %016x" % [ "ID", self.object_id ]  #=> "ID   : 00002b054ec93168"
         "foo = %{foo}" % { :foo => 'bar' }        #=> "foo = bar"

      I guess that built-in version is fine for simple cases. You only need to use I18n.translate if you need its more advanced features like I18n.config.missing_interpolation_argument_handler.

    1. I know you acknowledged your response was late and you're just trying to help but please don't resurrect very old threads.

      This is better than creating a duplicate new thread.

      There is no better place to respond to an existing topic than in the existing thread for that topic.

    1. This is a poor solution

      What's so bad about this solution? If it works, it works. And it only requires wrapping in 1 additional block. Pretty simple.

  11. May 2020
    1. I have used this bash one-liner before set -- "${@:1:$(($#-1))}" It sets the argument list to the current argument list, less the last argument.

      Analogue of shift built-in. Too bad there isn't just a pop built-in.