You can run all the "test" scripts at once by adding the --workspaces (plural) to your npm run command: # Run "test" script on all packages npm run test --workspaces # Tip - this also works: npm run test -ws
- Jun 2021
 - 
            
ruanmartinelli.com ruanmartinelli.com
- 
  
 - 
  
Your packages (the ones you created)
 - 
  
Dependencies are hoisted, meaning they get installed in the root node_modules folder. This is done for performance reasons: if a dependency is shared by multiple packages, it gets saved only once in the root.
 - 
  
Other package managers such as Yarn and pnmp already ship with Workspaces for quite a while now.
 - 
  
In fact, npm is not trying to reinvent the wheel. You can find similarities between all three Workspace implementations.
 
 - 
  
 - 
            
docs.npmjs.com docs.npmjs.com
- 
  
This demonstrates how the nature of node_modules resolution allows for workspaces to enable a portable workflow for requiring each workspace in such a way that is also easy to publish these nested workspaces to be consumed elsewhere.
 
Tags
Annotators
URL
 - 
  
 - 
            
docs.npmjs.com docs.npmjs.com
- 
  
Please make sure that your file(s) referenced in bin starts with #!/usr/bin/env node, otherwise the scripts are started without the node executable!
 
 - 
  
 - 
            
digitalnow878391108.wordpress.com digitalnow878391108.wordpress.com
- 
  
Monorepo use cases
 - 
  
Apart from that it’s just more convenient to have all your source files opened in a single IDE instance. You can jump from project to project without switching windows on your desktop.
 - 
  
Why is it big news? Because the main advantage of npm over other package managers like yarn or pnpm is that it comes bundled with NodeJS.
 
 - 
  
 - 
            
stackoverflow.com stackoverflow.com
- 
  
 - 
  
I've copied his response here as this question ranks very high in web search results.
 - 
  
A really good question. Sad to realise that there is no feature equivalent for package.json to what we have in Gemfiles.
 
 - 
  
 - 
            
docs.npmjs.com docs.npmjs.com
- 
  
npm install <folder>: Install the package in the directory as a symlink in the current project. Its dependencies will be installed before it's linked. If <folder> sits inside the root of your project, its dependencies may be hoisted to the top-level node_modules as they would for other types of dependencies.
 
 - 
  
 - 
            
stackoverflow.com stackoverflow.com
- 
  
The local package will be copied to the prefix (./node-modules).
Yay for linking to relevant PR!
 - 
  
 
 - 
  
 - 
            
www.viget.com www.viget.com
- 
  
 - 
  
The answer for me is @whitecolor's yalc.
 - 
  
But this solution has technical complications, and the npm and the yarn implimentations give people trouble (as of this writing there are about 40 open npm link issues and over 150 open yarn link issues). If you have tried to use symlinked dependencies while developing a package you've probably run into into a stumbling block, whether simply an unexpected unlink behavior, trouble with peer dependencies, or something bigger.
 
 - 
  
 - 
            
github.com github.com
- 
  
 - 
  
Use with Yarn/Pnpm workspaces
 
 - 
  
 - 
            
material.io material.ioLists3
- 
  
Selected state should be applied on the .mdc-list-item when it is likely to frequently change due to user choice. E.g., selecting one or more photos to share in Google Photos.Activated state is more permanent than selected state, and will NOT change soon relative to the lifetime of the page. Common examples are navigation components such as the list within a navigation drawer.
 - 
  
In Material Design, the selected and activated states apply in different, mutually-exclusive situations:
 - 
  
Do not use aria-orientation attribute for standard list (i.e., role="list"), use component's vertical property to set the orientation to vertical.
 
 - 
  
 - 
            
github.com github.com
- 
  
(write-only)
 - 
  
Note that separator is indeed a valid role for li elements.
 
 - 
  
 - 
            
www.merriam-webster.com www.merriam-webster.com
- 
  
When dealing with the verb, the issue of how to treat the past participle is a contentious one, with much blood being shed on both sides. Some people feel that the past participle of input should be input, not inputted, based on the reasoning that the word comes from put, and we don’t say “he putted the papers on the shelf.” A similar line of reasoning has caused many people to aver that words such as broadcast should never be written as broadcasted, since the cast portion of the word remains unchanged with tense.
 
 - 
  
 - 
            
jpetazzo.github.io jpetazzo.github.io
- 
  
but we think that it’s simpler, as well as easier to write and to maintain, to go with the single actor model of Docker.
 
 - 
  
 - 
            
dockerquestions.com dockerquestions.com
- 
  
Docker returns: Client sent an HTTP request to an HTTPS server.
 
 - 
  
 - 
            
github.com github.com
- 
  
Please keep in mind that the GitHub issue tracker is not intended as a general support forum, but for reporting bugs and feature requests.
 
 - 
  
 - 
            
- 
  
Integrated access to the pdb debugger and the Python profiler.
 
Tags
Annotators
URL
 - 
  
 - 
            
stackoverflow.com stackoverflow.com
- 
  
${0%/*} removes everything including and after the last / in the filename ${0##*/} removes everything before and including the last / in the filename
 
 - 
  
 - 
            
mywiki.wooledge.org mywiki.wooledge.org
- 
  
Since looping over the positional parameters is such a common thing to do in scripts, for arg defaults to for arg in "$@". The double-quoted "$@" is special magic that causes each parameter to be used as a single word (or a single loop iteration). It's what you should be using at least 99% of the time.
 - 
  
Bash (like all Bourne shells) has a special syntax for referring to the list of positional parameters one at a time, and $* isn't it. Neither is $@. Both of those expand to the list of words in your script's parameters, not to each parameter as a separate word.
 
 - 
  
 - 
            
superuser.com superuser.com
- 
  
Instead of using a for loop, which will fail on spaces unless you redefine the IFS variable, I would recommend using a while loop combined with find.
 - 
  
mmv1,2 is also a very nice tool for such a task, applied to the current job, it would be mmv '*.md' 'test - #1.md'
 
 - 
  
 - 
            
unix.stackexchange.com unix.stackexchange.com
- 
  
In case writing to tmpfile fails for some reason, use && mv ... instead of ; mv ... -- that will keep $file from being overwritten with "bad" content.
 - 
  
 
 - 
  
 - 
            
stackoverflow.com stackoverflow.com
- 
  
Different ways to prepend a line: (echo 'line to prepend';cat file)|sponge file sed -i '1iline to prepend' file # GNU sed -i '' $'1i\\\nline to prepend\n' file # BSD printf %s\\n 0a 'line to prepend' . w|ed -s file perl -pi -e 'print"line to prepend\n"if$.==1' file
 
 - 
  
 - 
            
devhints.io devhints.io
 - 
  
 - 
            
stackoverflow.com stackoverflow.com
- 
  
From pretty format documentation: '%w([<w>[,<i1>[,<i2>]]])': switch line wrapping, like the -w option of git-shortlog[1]. And from shortlog: -w[<width>[,<indent1>[,<indent2>]]] Linewrap the output by wrapping each line at width. The first line of each entry is indented by indent1 spaces, and the second and subsequent lines are indented by indent2 spaces. width, indent1, and indent2 default to 76, 6 and 9 respectively. If width is 0 (zero) then indent the lines of the output without wrapping them.
 
 - 
  
 - 
            
- 
  
Although h.265 was released almost 5 years ago, adoption is slow. The primary reason for this, is that unlike h.264 which has 1 patent pool, h.265 has 3 patent pools with different pricing structures and terms & conditions. The second patent pool (HEVC Advance) was introduced in 2015, 3 years after the launch. This unclarity about the royalties situation around h.265 was hindering the adoption and as a result primary browsers have no support at all (e.g. Chrome, Firefox) or only partial support (Edge). Due to this, many content providers have stuck with h.264 because at least they know it will always play.
patents
 
 - 
  
 - 
            
www.quora.com www.quora.com
- 
  
Sort of. There are several systems around that have varying degrees of freedom. I have used Ivideon, which works fairly well as a docker-based environment, although it really needs its paid cloud back end to work well, and looked as Shinobi. If you are prepared to train your system, which can take some time, Shinobi is probably the best bet.
 
 - 
  
 - 
            
shinobi.video shinobi.video
- 
  
 - 
  
"I am a huge fan of open source and am writing code myself. However Zoneminder is a mess. Been trying to use it for like 10 years. But it never worked reliably. More than 3 cameras almost always made it fail. RTSP never worked reliably. Shinobi took me minutes to set up on my mini PC and is feeling so reliable already. Reinventing the wheel may be bad. But let's face it: Zoneminder is doomed. The horse is dead. Let's get off."
.
 - 
  
I would suggest Shinobi as a NVR
 
Tags
Annotators
URL
 - 
  
 - 
            
selfhosted.show selfhosted.show
 - 
  
 - 
            
www.amazon.com www.amazon.com
- 
  
100% customer satisfaction service, value for your money, any questions, do contact us for help! We are always here to help you out.
.
 
 - 
  
 - 
            
www.amazon.com www.amazon.com
- 
  
It is NOT an alarm, but it does alert you!
What's the difference?
 - 
  
always bring a few when staying in hotels or Airbnb’s and such. Can be removed with ease and be installed within a minute or 2
.
 
 - 
  
 - 
            
www.amazon.com www.amazon.com
- 
  
But after using it for a few days you quickly realize that there is one major privacy issue that has been installed consciously by Amazon and Ring.The ring app allows you to delete videos on the system but it does Not allow you to delete motion sensor and window sensor history.So Amazon/ring knows everything that happens inside your home and there is no way for you to delete that history. They know when you’re inside, they know when you open your door, they know when you closed it. etc. etc. etc. So they essentially know everything about you and your motions within your home.This is a major privacy issue. And it is not some mistake that was overlooked. This was a conscious choice on Amazon/rings part to track the motions of you and your family inside your own home.I spoke with the customer service rep from Ring and she admitted that many many people call up and complain that they can’t delete sensor history. Of course it would’ve been much more ethical to explain to potential customers BEFORE they buy ring products that this breach of privacy has been installed.But Amazon/ring does not warn their customers about this privacy breach. They don’t warn customers because they created the privacy breech and Will continue to have an always have very personal information on the motions of your family inside your own home.If you care about your privacy. Don’t buy Ring products.
 - 
  
Why bother? Well, you never know if some crook has a device that can hack into your garage door opener!
.
 
 - 
  
 - 
            
www.amazon.com www.amazon.com
- 
  
What finally led me to write this review was that I recently received an offer containing 2 $20.00 gift cards to write a 5 star review. I wonder now if I had been duped by the reviews I read
 - 
  
I do not advise. I still do not understand where there are so many good reviews for this product. This vacuum cleaner is literally bursting at the seams.
 - 
  
Soliciting five star reviews earns a one star.
 
 - 
  
 - 
            
www.amazon.com www.amazon.com
- 
  
I bought this mostly because of the outstanding reviews which now I question greatly and may never trust another review again.
 
 - 
  
 - 
            
stackoverflow.com stackoverflow.com
- 
  
for cpp_file in *.cpp; do gcc -c $$cpp_file & done; wait This gives much finer control than make -j.
 - 
  
Note that & is a line terminator like ; (write command& not command&;).
 - 
  
 - 
  
There is one very important reason for enabling job control to be useful inside scripts: the side-effect it has of placing background processes in their own process groups. This makes it much, much easier to send signels to them and their children with one simple command: kill -<signal> -$pgid. All other ways of dealing with signaling entire trees of processes either involve elaborate (sometimes even recursive) functions, which are often bugnests, or risk killing the parent in the process (no pun intended).
 - 
  
You particular circumstances may or may not warrant a way different from what lhunath (and other users) deem "best practices".
 - 
  
Remember that in the end, especially in scripting, there always are more than one way to skin a cat, but some ways are more portable, more reliable, make it simpler to handle error cases, parse the output, etc.
 
Tags
- more than one right way (no one right/best way)
 - which is better depends on which criteria you use to judge
 - unintuitive
 - surprising behavior
 - use case
 - best practices
 - shell scripting
 - command line: job control
 - appropriate use case
 - depends on whom you ask
 - easy to get wrong
 - shell scripting: killing/managing child processes
 - Linux: process groups
 - shell scripting: job control
 
Annotators
URL
 - 
  
 - 
            
- 
  
 - 
  
Provides a template for future specific classes
 - 
  
Abstract classes offer default functionality for the subclasses.
 
 - 
  
 - 
            
english.stackexchange.com english.stackexchange.com
- 
  
 - 
  
I hate mentee. The word is protégé.
 - 
  
'...ee' is usually paired with an '..er', isn't it? Employee/Employer, Trainee/Trainer. I wouldn't use Coachee because to me, it implies you're a Coacher, not a Coach.
Just because "...ee" is usually paired with an "...er" word doesn't mean it can never be paired with a non-"-er", non-"-or" word.
I'm sure there are many examples of inconsistencies in English that we could point at to make that point...
 
 - 
  
 - 
            
github.com github.com
- 
  
In your pull request, could you please add the index_errors option to the documentation of the has_many association, and may be refer to it in the accepts_nested_attributes_for method? The option is nowhere documented accept for the Rails 5.0 update readme.
 - 
  
index_errors: true
index_errors: true
 
 - 
  
 - 
            
github.com github.com
- 
  
Closing this PR since it's been sitting here for over 2 years. Can reopen if need be.
 - 
  
 - 
  
Happy Third Birthday #24728!
 
 - 
  
 - 
            
github.com github.com
- 
  
 - 
  
As you can see Rails already adds error messages from associated models and doing it wrongly: Merging together errors from different models under same has_many association. :"employments.company"=>["can't be blank"] And this is wrong.
 - 
  
I have been waiting for a solution for this quite a while now.
 
 - 
  
 - 
            
github.com github.com
- 
  
I wouldn't consider it switching behavior. Ultimately it's including a module -- either a manually defined and referenced one from the user, or a RSpec::Core::SharedExampleGroupModule created for the user when they defined the shared example group and referenced via the group name.
 - 
  
The first argument to shared_context (the shared group name) is superfluous. It feels a bit like "what's this argument for again?" (Note that you could still use it with include_context to include the group manually, but it's a bit odd to mix-and-match the approaches).
 
 - 
  
 - 
            
formidable.com formidable.com
- 
  
When we use a GraphQL API there are two kinds of errors we may encounter: Network Errors and GraphQL Errors from the API. Since it's common to encounter either of them, there's a CombinedError class that can hold and abstract either.
 
 - 
  
 - 
            
en.wikipedia.org en.wikipedia.org
 - 
            
spec.graphql.org spec.graphql.orgGraphQL1
- 
  
GraphQL services should not provide any additional entries to the error format since they could conflict with additional entries that may be added in future versions of this specification.
 
Tags
Annotators
URL
 - 
  
 - 
            
graphql-ruby.org graphql-ruby.org
- 
  
This kind of error handling does express error state (either via HTTP 500 or by the top-level "errors" key), but it doesn’t take advantage of GraphQL’s type system and can only express one error at a time.
 - 
  
It works, but a stronger solution is to treat errors as data.
 - 
  
In mutations, when errors happen, the other fields may return nil. So, if those other fields have null: false, but they return nil, the GraphQL will panic and remove the whole mutation from the response, including the errors!
 - 
  
In order to have the rich error data, even when other fields are nil, those fields must have null: true so that the type system can be obeyed when errors happen.
 - 
  
 - 
  
Then, client apps can show the error messages to end users, so they might correct the right fields in a form, for example.
 
Tags
- unintentionally breaking something
 - unfortunate limitations
 - limitations
 - unintended consequence
 - works for many (array) in addition to one (no arbitrary limitation)
 - irony
 - typing
 - limitation: works for one but not many (array)
 - disadvantages/drawbacks/cons
 - recoverable errors
 - GraphQL: mutation errors
 - GraphQL: top-level errors
 - recoverable vs. non-recoverable errors
 - errors as data
 
Annotators
URL
 - 
  
 - 
            
graphql-ruby.org graphql-ruby.org
- 
  
In general, top-level errors should only be used for exceptional circumstances when a developer should be made aware that the system had some kind of problem. For example, the GraphQL specification says that when a non-null field returns nil, an error should be added to the "errors" key. This kind of error is not recoverable by the client. Instead, something on the server should be fixed to handle this case. When you want to notify a client some kind of recoverable issue, consider making error messages part of the schema, for example, as in mutation errors.
 
 - 
  
 - 
            
dictionary.cambridge.org dictionary.cambridge.org
- 
  
non-surface-apparent opacity
 
 - 
  
 - 
            
graphql-ruby.org graphql-ruby.org
- 
  
With GraphQL-Ruby, it’s possible to hide parts of your schema from some users. This isn’t exactly part of the GraphQL spec, but it’s roughly within the bounds of the spec.
 - 
  
(Always call super to inherit the default behavior.)
 
 - 
  
 - 
            
graphql-ruby.org graphql-ruby.org
- 
  
Authorization is the process of verifying that the current user has permission to do something (or see something), for example, checking admin? status or looking up permission groups from the database.
 - 
  
Authentication is the process of determining what user is making the current request, for example, accepting a username and password, or finding a User in the database from session[:current_user_id].
 - 
  
Instead, your controller should get the current user based on the HTTP request (eg, an HTTP header or a cookie) and provide that information to the GraphQL query.
 - 
  
To illustrate the problem:
 - 
  
However, this request-by-request mindset doesn’t map well to GraphQL because there’s only one controller and the requests that come to it may be very different.
 
 - 
  
 - 
            
github.com github.com
- 
  
I was inspired by udzura's mock.
 
 - 
  
 - 
            
web.dev web.dev
- 
  
 - 
  
Unfortunately, many existing mechanisms to gauge and propagate trustworthiness—to work out if an interaction with a site is from a real human, for example—take advantage of techniques that can also be used for fingerprinting.
 - 
  
Trust Tokens is a new API to help combat fraud and distinguish bots from real humans
 
 - 
  
 - 
            
developer.chrome.com developer.chrome.com
- 
  
Trust Token is a new API to help combat fraud and distinguish bots from real humans
 
 - 
  
 - 
            
sveltematerialui.com sveltematerialui.com
- 
  
Use this to build a ClassAdder component. ClassAdder components are useful for reducing the size of your bundle. If you have tons of simple components that just need to add classes/props or set a context, using ClassAdder components means there's only one "big" Svelte component in your bundle for all of these many tiny components.
 - 
  
This is useful when you need to add classes to a component, since Svelte's "class:" directives don't work on components.
 
 - 
  
 - 
            
sveltematerialui.com sveltematerialui.com
- 
  
Masonry
 
Tags
Annotators
URL
 - 
  
 - 
            
material-ui.com material-ui.com
- 
  
 - 
  
Persistent navigation drawers can toggle open or closed. The drawer sits on the same surface elevation as the content. It is closed by default and opens by selecting the menu icon, and stays open until closed by the user. The state of the drawer is remembered from action to action and session to session. When the drawer is outside of the page grid and opens, the drawer forces other content to change size and adapt to the smaller viewport.
 - 
  
Temporary drawerTemporary navigation drawers can toggle open or closed. Closed by default, the drawer opens temporarily above all other content until a section is selected.
 - 
  
 
Tags
- annotation meta: can't add regular contextual annotations on this document
 - UI: drawer: persistent drawer
 - UI: navigation
 - UI: drawer: temporary drawer
 - app design: navigation
 - Hypothesis meta: annotations created here are linked to the wrong URL (and may become orphans)
 - UI: breadcrumbs
 
Annotators
URL
 - 
  
 - 
            
stackoverflow.com stackoverflow.com
- 
  
Can you provide details of what you mean by "not working as expected"?
 
 - 
  
 - 
            
careerfoundry.com careerfoundry.com
- 
  
 - 
  
As you read along, you’ll begin to notice UI designer is just another word for a foodie—we love to name our UI elements after food.
 - 
  
These little trails of links help users figure out where they are within a website. Often located at the top of a site, breadcrumbs let users see their current location and the proceeding pages. Users are also able to click on them to move between steps.
 
 - 
  
 - 
            
www.fuckdropdowns.com www.fuckdropdowns.com
Tags
Annotators
URL
 - 
  
 - 
            
www.nointerface.com www.nointerface.com
Tags
Annotators
URL
 - 
  
 - 
            
about.gitlab.com about.gitlab.com
- 
  
document.querySelector('hypothesis-adder') is present but has size of 0x0
 - 
  
We try to minimize breaking changes, but some changes are needed to improve workflows, performance, scalability, and more.
 
 - 
  
 - 
            
defragged.org defragged.org
 - 
            
askubuntu.com askubuntu.com
- 
  
To avoid the problems with different versions of echo you may want to use printf instead. In contrast to echo printf always interprets \ sequences but doesn't automatically add a linefeed at the end so you have to append \n at the end if you want one.
 - 
  
 
 - 
  
 - 
            
medium.com medium.com
- 
  
Please consider reading this article at the original website.
 
 - 
  
 - 
            
store.steampowered.com store.steampowered.com
- 
  
First off: The fact that the developer read the review, saw that a puzzle from elsewhere had made it into the game, fact-checked this, responded, and made an update within 48 hours is exactly the kind of thing I want to support.
.
 
 - 
  
 - 
            
stackoverflow.com stackoverflow.com
- 
  
You need to run gem pristin --only-executables Because whenever a ruby is updated or perhaps moved/named, due to RubyGems is generating explicit #!/path/to/ruby for all gem executables, will need to regenerate the gem bin stubs with the new path to the ruby executable.
 - 
  
Unfortunately, even though this bug/request was opened in 2016, this feature is still not implemented in ruby-install.
 - 
  
Based on the responses in a feature request, the best way to remove older ruby versions is to go back to the src directory and run make uninstall or rake uninstall. By default, ruby-install uses $HOME/src/ruby-$version for unpacked sources of ruby versions during installation.
 
 - 
  
 - 
            
github.com github.com
- 
  
AnyCable uses the same protocol as ActionCable, so you can use its JavaScript client without any monkey-patching.
 - 
  
AnyCable allows you to use any WebSocket server (written in any language) as a replacement for your Ruby server (such as Faye, Action Cable, etc).
 
 - 
  
 - 
            
github.com github.com
- 
  
Whether you agree or not, to me there's nothing in this world that is entirely apolitical - when there are people there is politics. You don't have to agree with my views, nor do I expect you to. Diversity and disagreement is what drives mankind forward.
 - 
  
In the end this plugin is a piece of software that I wrote and I'm just doing what I think is reasonable to make our community more inclusive.
- doing what one believes is best for community
 
 - 
  
As aforementioned, the usage of master as a branch most likely originated from the first meaning
The meaning:
An original recording, film, or document from which copies can be made.
makes more sense to me. Why would they have meant the other meaning?
 - 
  
I completely understand that master have two meanings: A man who has people working for him, especially servants or slaves; and An original recording, film, or document from which copies can be made.
 - 
  
 - 
  
so by adopting git installations with latest source code you're effectively agreeing to go bleeding-edge. I would assume that means you're ready for any breaking changes and broken installations, which is what happened here.
 - 
  
There are many projects that does not use the master branch as default. For example, Next.js uses the canary branch, the npm CLI and many more other projects uses stuff like prod, production, dev, develop, release, beta, head.
 - 
  
I'm not sure if there's any cost in terms of contributing either, especially when by design git can have any branch as default, and will not hinder your experience when you use something other than master.
git is neutral/unbiased/agnostic about default branch name by design
And that is a good thing
 - 
  
It just happens that most projects chose to be "lazy" (stick to default), opted to use master
 - 
  
to be honest I think it is more about sentiment than actual engineering practices now.
 - 
  
Forcing people out of the habit to assume this branch would be called master, is a valuable lesson.
 - 
  
The primary branch in git can have any name by design.
 - 
  
Well, there are a lot of reasons, with the main reason being that I am empathetic to what is happening out there and I agree with many other people that we should re-examine our choice of words to make the industry more inclusive.
 - 
  
Personally I think it is a very bad idea to leverage political views, even if I may share them, through software.
 - 
  
I think it's just a bad English/mis-translation problem. I'm guessing @pmmmwh assumed 'master' meant like 主 in 奴隸主 (slave owner/master). Actually a better translation would be 師 like 功夫大師 (Kung Fu master). The specimen copies are made from.
 - 
  
The specimen copies are made from.
 - 
  
On existing projects, consider the global effort to change from origin/master to origin/main. The cost of being different than git convention and every book, tutorial, and blog post. Is the cost of change and being different worth it?
 - 
  
In the context of git, the word "master" is not used in the same way as "master/slave". I've never known about branches referred to as "slaves" or anything similar.
 - 
  
I'm glad I never got a master's degree in college!
 - 
  
My 3 projects were using your lib and got broken thanks to the renaming.
 - 
  
In the context of git, the word "master" is not used in the same way as "master/slave". I've never known about branches referred to as "slaves" or anything similar. On existing projects, consider the global effort to change from origin/master to origin/main. The cost of being different than git convention and every book, tutorial, and blog post. Is the cost of change and being different worth it? PS. My 3 projects were using your lib and got broken thanks to the renaming. PS. PS. I'm glad I never got a master's degree in college!
 
Tags
- doing what one believes is best
 - poor/confusing wording
 - you don't have to agree with my views
 - no arbitrary limitation
 - inoffensive/inclusive/politically correct wording
 - being inclusive
 - wording
 - explaining why
 - ambiguous
 - separation of personal/political views from professional activity
 - words with multiple different meanings: master
 - high-cost changes
 - forcing people out of a habit
 - unintentionally breaking something
 - re-examining/challenging long-established traditions
 - git
 - do pros outweigh/cover cons?
 - sharing/spreading political views through software
 - this is a good thing
 - word senses
 - good point
 - doing something other than the most common/popular option
 - sentiment vs. good/rational reasons
 - I like this
 - neutral/unbiased/agnostic
 - despite:
 - nothing is apolitical where people are involved
 - annotation meta: may need new tag
 - using cutting-edge/pre-release tech
 - intentional/well-considered decisions
 - the cost of changing something
 - I agree
 - is using bleeding-edge tech risky?
 - alternative to mainstream way
 - valuable lesson
 - good question
 - most people choose the lazy/default option
 - funny
 - words with multiple different meanings (ambiguity)
 - unintended consequence
 - by design
 - is it worth it?
 - git: default branch
 - git: changing from master branch to main
 - diversity
 - lost in translation
 - questioning/challenging long-held traditions/beliefs/habits
 - confusing wording
 - I disagree
 
Annotators
URL
 - 
  
 - 
            
www.theserverside.com www.theserverside.com
- 
  
 - 
  
However, the term master is out of favor in the computing world and beyond.
 - 
  
"While it takes time to make these changes now, it's a one-time engineering cost that will have lasting impacts, both internally and externally," Sorenson said in an email. "We're in this for the long game, and we know inclusive language is just as much about how we code and what we build as it is about person-to-person interactions."
 - 
  
"I really appreciate the name change [because] it raises awareness," said Javier Cánovas, assistant professor in the SOM Research Lab, at the Internet Interdisciplinary Institute at the Open University of Catalonia in Barcelona. "There are things that we accept as implicit, and we then realize that we can change them because they don't match our society."
 - 
  
the benefits of GitHub renaming the master branch to main far outweigh any temporary stumbling blocks. He said the change is part of a broader internal initiative to add inclusive language to the company's systems. His team is also replacing whitelist and blacklist with allowlist and blocklist.
 - 
  
"Both Conservancy and the Git project are aware that the initial branch name, 'master,' is offensive to some people and we empathize with those hurt by the use of that term," said the Software Freedom Conservancy.
 - 
  
Let's examine why GitHub renamed the master branch to main branch and what effect it will have on developers.
 
Tags
- potentially offensive/non-inclusive wording/terms
 - one-time cost
 - long term / long game
 - inoffensive/inclusive/politically correct wording
 - wording designed to be more palatable/pleasing/inoffensive
 - explaining why
 - git: changing from master branch to main
 - inclusive language
 - falling out of favor
 - things we accept as implicit
 - raising awareness
 - good explanation
 
Annotators
URL
 - 
  
 - 
            
github.com github.com
- 
  
The emphasis was made on a raw CDP protocol because Chrome allows you to do so many things that are barely supported by WebDriver because it should have consistent design with other browsers.
compatibility: need for compatibility is limiting:
- innovation
 - use of newer features
 
 - 
  
 - 
  
Runs headless by default, but you can configure it to run in a headful mode.
first sighting of term: headful
 - 
  
There's no official Chrome or Chromium package for Linux don't install it this way because it's either outdated or unofficial, both are bad. Download it from official source.
 - 
  
Ferrum connects to the browser by CDP protocol and there's no Selenium/WebDriver/ChromeDriver dependency.
 
Tags
- browser: headful
 - testing: CDP-based
 - not:
 - using cutting-edge/pre-release tech
 - Selenium/WebDriver
 - first sighting
 - distributing apps
 - reasonable defaults
 - compatibility: need for compatibility is limiting: prevents use of newer features
 - browser: headless
 - outdated
 - compatibility: need for compatibility is limiting
 - CDP (Chrome DevTools Protocol)
 - Ferrum (Ruby)
 - software distribution
 - browser: headful vs. headless
 - testing: non-Selenium
 - good advice
 - unofficial
 
Annotators
URL
 - 
  
 - 
            
github.com github.com
- 
  
driven_by :selenium_chrome_headless
first sighting:
driven_by - 
  
Rails.application.routes.default_url_options[:host] = "localhost:#{Capybara.current_session.server.port}"
 
 - 
  
 - 
            
thoughtbot.com thoughtbot.com
 - 
            
- 
  
UDP
 - 
  
Broadcast messages a ephemeral from the WS server point of view.
 - 
  
The main (IMO) feature of MQTT – quality of service – doesn't make sense in our case: if a WebSocket server is down and doesn't receive broadcast messages (through HTTP/Redis/queue), it's likely not to handle client connections too.
 - 
  
According to official Actioncable guide, Actioncable creates multiple redis pubsub channels.
 - 
  
Yes, AnyCable uses only a single Redis pub/sub channel. Unlike Action Cable, anycable-go manages the actual subscriptions by itself (see hub.go), we only need a single channel to get broadcasts from web apps to a WS server, which performs the actual retransmission. Check out https://docs.anycable.io/#/v1/misc/how_to_anycable_server
 - 
  
Right now, we are building a concept proofing prototype using Anycable.
 - 
  
We should think about the number of simultaneous connections (peak and average) and the message rate/payload size. I think, the threshold to start thinking about AnyCable (instead of just Action Cable) is somewhere between 500 and 1000 connections on average or 5k-10k during peak hours.
number of simultaneous connections (peak and average)
the message rate/payload size.
 - 
  
We use a single stream/queue/channel to deliver messages from RPC to WS. RPC server acts as publisher: it pushes a JSON-encoded command. Pubsub connection is initialized lazily in this case (during the first #broadcast call). WS server (anycable-go) acts as subscriber: subscription is initialized on server start, messages are received, deserialized and passed to the app.
 - 
  
they handled this with 4 1x dynos on Heroku (before switching to AnyCable they had 20 2x dynos for ActionCable).
 - 
  
HTTP REST seems like an "out of external dependency" way to go.
 - 
  
Personally, I like having Redis as a dependency as most of my current applications use two Redis instances; persistent store and volatile.
 - 
  
The idea is to avoid additional dependency if it's possible.
 
Tags
- ActionCable
 - devops/server architecture
 - annotation meta: may need new tag
 - proof of concept
 - threshold to start considering/thinking about this option
 - RPC
 - dependencies: avoid additional dependency if possible
 - non-guaranteed delivery
 - UDP
 - features
 - differences
 - dependencies: already using it
 - good idea
 - determining if something is an appropriate application / best tool for the job
 - ephemeral
 - primary feature
 - system architecture description/overview
 - minimal dependencies
 - Redis
 - wasteful/inefficient use of resources
 - REST API
 - pub/sub
 - defining feature
 - feature: reliable/guaranteed delivery
 - threshold to start considering/thinking about this factor
 - AnyCable
 - efficiency (computing)
 - comparison
 - devops/server architecture: factors
 - I like this
 
Annotators
URL
 - 
  
 - 
            
twitter.com twitter.com
- 
  
So ActionCable needs Redis! Is this the first time Rails is aligning with a vendor product? Why not abstract it like AR/AJ?
 
 - 
  
 - 
            
evilmartians.com evilmartians.com
- 
  
prepend(Module.new do
 - 
  
A lot of projects leveraging CDP appeared since then, including the most well-known one—Puppeteer, a browser automation library for Node.js. What about the Ruby world? Ferrum, a CDP library for Ruby, although being a pretty young one, provides a comparable to Puppeteer experience. And, what’s more important for us, it ships with a companion project called Cuprite—a pure Ruby Capybara driver using CDP.
 - 
  
That’s not the only way of writing end-to-end tests in Rails. For example, you can use Cypress JS framework and IDE. The only reason stopping me from trying this approach is the lack of multiple sessions support, which is required for testing real-time applications (i.e., those with AnyCable 😉).
 - 
  
Thus, by adding system tests, we increase the maintenance costs for development and CI environments and introduce potential points of failures or instability: due to the complex setup, flakiness is the most common problem with end-to-end testing. And most of this flakiness comes from communication with a browser.
 - 
  
For example, Database Cleaner for a long time was a must-have add-on: we couldn’t use transactions to automatically rollback the database state, because each thread used its own connection; we had to use TRUNCATE ... or DELETE FROM ... for each table instead, which is much slower. We solved this problem by using a shared connection in all threads (via the TestProf extension). Rails 5.1 was released with a similar functionality out-of-the-box.
 - 
  
In practice, we usually also need another tool to provide an API to control the browser (e.g., ChromeDriver).
 - 
  
There were attempts to simplify this setup by building specific browsers (such as capybara-webkit and PhantomJS) providing such APIs out-of-box, but none of them survived the compatibility race with real browsers.
 - 
  
“System tests” is a common naming for automated end-to-end tests in the Rails world. Before Rails adopted this name, we used such variations as feature tests, browser tests
 - 
  
even acceptance tests (though the latter are ideologically different)
 - 
  
Disclaimer: This article is being regularly updated with the best recommendations up to date, take a look at a Changelog section.
 
Tags
- testing: CDP-based
 - limitations
 - updating a published document: disclosing that it has been updated
 - compatibility
 - no longer needed
 - naming
 - advantages/merits/pros
 - Ruby: prepend Module.new
 - testing: acceptance tests
 - testing: stack: choosing
 - competition/race
 - Chromedriver
 - browser-based automated testing
 - intermittent test failures (flaky tests)
 - misnomer
 - changelog
 - Ruby: prepend
 - unfortunate limitations
 - Cuprite (Ruby)
 - Cypress
 - failed attempt
 - distinction
 - testing: end-to-end
 - testing: system-level
 - Ferrum (Ruby)
 - Capybara
 - testing: database: wrapping tests in transaction
 - race (general)
 - disadvantages/drawbacks/cons
 - naming convention
 
Annotators
URL
 - 
  
 - 
            
github.com github.com
- 
  
 - 
  
Cuprite is a pure Ruby driver (read as no Selenium/WebDriver/ChromeDriver dependency) for Capybara.
 - 
  
The design of the driver is as close to Poltergeist as possible though it's not a goal.
 
 - 
  
 - 
            
duckduckgo.com duckduckgo.com
Tags
Annotators
URL
 - 
  
 - 
            
chromedevtools.github.io chromedevtools.github.io
 - 
            
duckduckgo.com duckduckgo.com
 - 
  
 - 
            
github.com github.com
- 
  
We instead recommend using the Selenium or Apparition drivers.
 - 
  
Development has been suspended on this project because QtWebKit was deprecated in favor of QtWebEngine, which is not a suitable replacement for our purposes.
 
 -