- Feb 2021
-
-
Any attribute in the list will be allowed, and any defined as attr_{accessor,reader,writer} will not be populated when passed in as params. This means we no longer need to use strong_params in the controllers because the form has a clear definition of what it expects and protects us by design.
strong params not needed since form object handles that responsibility.
That's the same opinion Nick took in Reform...
-
I've been over the use case for form objects in this post on moving away from fat models but wanted to go into more detail on how and why I use them here. I really believe in the utility of these objects; their ability to abstract and isolate logic in a simple and effective manner is unmatched, IMO.
-
The basic classification of a form object is a class that contains writable attributes, validations and logic to persist the attributes to ActiveRecord objects. These forms can also include other side-effects like background job triggers, emails, and push-notifications etc. The simplest way to understand the concept is to think of them as a representation of a controller action where all of the business logic that happens in that controller action is abstracted into a form object.
This definition may be a bit too broad. Others (like Reform) define it to have smaller scope — only the part where it persists/validates attributes. The other side effects might be better to put in a different location, like the controller action, or a service/processor object that has a form object.
-
-
-
I find reform's implementation a bit too complicated too (lots of layers of abstraction, including going through the representable gem for a lot of things)
-
I made this gem because I tried reform and I found some bugs. I started to contribute but there is some things I don't like in reform.
-
but there is some things I don't like in reform
-
Another problem I found with Reform is the synchronisation with models. The object you passed in argument to reform does not have the same value than the form.
-
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).
-
Finally, I really do something simple and I find the reform's implementation is a little bit too complicated for what I want. I think my code (and yours) is simple.
-
I close the issue but we can continue the discussion.
closing does not necessarily imply end of discussion
-
Trust me, I thought a lot about #validate and its semantics, and I am gonna make it even more "SRP" by making Form#errors and #valid? semi-public. All that happens via #validate reducing the possible wrong usage for users.
-
About #validate which fill attributes of the form, I think it's a problem of architecture and clarity. If you respect the Single Responsabilty Principle, you must to have two methods. This is wrong. SRP means your class does exactly one thing, which is reflected in a single public method. The more methods you expose, the less SRP you go.
-
I apologize for the slow development of Reform after the "explosion" when I released it initially. The reason for this is I changed jobs and didn't use Reform (yet).
-
I meant to say after I published Reform I changed jobs (unrelated to Reform) and in the new project, we don't use Reform, yet
-
Thanks for all your patches and ideas so far!
-
I like your API here much better than reform's API.
-
reform conflates these two responsibilities into a single validate method
-
About #validate which fill attributes of the form, I think it's a problem of architecture and clarity. If you respect the Single Responsabilty Principle, you must to have two methods. The validate method do two thing really different.
-
I have developed a simple pattern that copies errors from the model or the service into the form object so that the view can still use those errors
-
commented
Tags
- intentional/well-considered decisions
- appreciation
- too complicated
- see content below
- surprising behavior
- reform (Ruby)
- using your project at work
- clarification
- my comments
- make it hard to get wrong/incorrect
- disagreement
- not:
- misunderstanding
- software project created to address shortcomings in another project
- does not necessarily imply
- pointing out gaps/downsides/cons in competition/alternatives
- single responsibility
- I agree
- conflation
- issues: discuss more before closing
- ambiguous
- issues: closed but continuing discussion
- me too
- workaround
- API
- prefer simpler option
- hard to find time/be motivated to build/maintain unless you use it yourself (motivation; maintenance)
- locked discussion threads
- motivation
- confusing
Annotators
URL
-
-
github.com github.com
-
I found the code a little bit complicated. Why to instanciate instance variables in this class instead to do a hash that could be used like this form.models[:first_model]; form.model[:second_model]?
-
This looks like a really nice patch. (I haven't tried it out yet though.) Any reason we shouldn't merge this in? I really like all the new tests you added in test/active_record_composition_test.rb
-
-
github.com github.com
-
Set your models free from the accepts_nested_attributes_for helper. Active Form provides an object-oriented approach to represent your forms by building a form object, rather than relying on Active Record internals for doing this.
-
@conference_form.submit(conference_params)
Surprised they called it
submit
, since that could imply that you're triggering an action called submit.They use other verbs to describe this:
- sync
- populate
- write
Analogous to Reform's sync / sync_models method.
Actually, the name makes a lot of sense when you see it in context:
@conference_form = ConferenceForm.new(conference) @conference_form.submit(conference_params) if @conference_form.save
-
initialize(model) accepts an instance of the model that the form represents.
By designing this so there is a main model, it isn't as flexible as Reform's "Composition" module that lets you compose it in any way you want, including having as many as you want top-level "main" modules that your form is comprised of.
-
Special thanks to the owners of the great gems that inspired this work: Nick Sutterer - creator of reform Nathan Van der Auwera - creator of cocoon
-
-
www.metacritic.com www.metacritic.com
-
More and more, Im seeing this "retro graphics" (aka - lazy cash in.) money grab titles that are completely broken or absolutely terrible.. and they're RAPIDLY flooding the Switch like flies to horse dung. With no real reliable independent reviews of Indie titles available (Even MetaCritic is blank for at LEAST 70% of these indie garbage games..) players are left with no recourse but to flush hard earned cash on what is essentially a non-refundable gamble.
-
-
github.com github.com
-
Finally, you can use fields_for in order to create/edit associated fields and the suffix _list (like profile_list below) to choose an existing associated record.
-
Seems similar to Reform, but simpler, plays nicely with Rails
-
@user_form = UserForm.new(User.find(params[:id])) # you need to load the record being edited
-
# Use relationship's name followed by "__" plus attribute's name # to validate has_one and belongs_to associations validates :name, :address__street, :company__name, presence: true
-
-
stackoverflow.com stackoverflow.com
-
this is a followup to my question here: Updating child association in ActiveModel
-
-
coderwall.com coderwall.com
-
There is nothing wrong with accepts_nested_attributes_for. This is what you should use in your typical case. My post describes a non-typical case. ContactListForm is not an ActiveRecord object, it is an object that includes ActiveModel::Model, which does not support accepts_nested_attributes_for.
-
If you include ActiveModel::Validations you can write the same validators as you would with ActiveRecord. However, in this case, our form is just a collection of Contact objects, which are ActiveRecord and have their own validations. When I save the ContactListForm, it attempts to save all the contacts. In doing so, each contact has its error_messages available.
-
Of course our object doesn't have any contacts yet, so our controller will need to make sure that the form has at least one fields_for block to render by giving it one on initialization
-
-
www.amazon.com www.amazon.com
-
It does seem a bit like class notes and is *too* simplified to really be of much practical use though.
-
If you are a VISUAL LEARNER, start here.
-
The thought of an illustrated book will, no doubt, make the purists recoil in horror - that's their loss. Sometimes a couple of drawings are far more illuminating than pages full of discrete mathematics, and this is what we have here.
-
-
www.amazon.com www.amazon.com
-
Again this is my personal opinion, but this a rough point to start as a beginner.
.
-
{'good': ['API objects', 'structured data', 'data sources', 'filtering and operations'],'improvement areas for v2': ['AWS deployment images too small', 'not setting up the data sources in aws that it talked up','not enough numpy','no deep learning yo','drop or shorten up the kitchen analogy, we get what distributed computing is'],'realization: "out of the box functionality won't be much help for real life... have to get weird w delayed objects"}
-
Dask is an amazing tool, and this book is fine for a introduction of dask data structures but little else. This book follows a rather unfortunate trend -- try to both cover the basic elements of 'data science' as well as serve as a tutorial to a software platform.
-
-
www.amazon.com www.amazon.com
-
Manning: I love the cover art. Seriously! It is very apropos and beautiful (for both this Haskell book and the recent Manning F# book).
-
-
www.steamgifts.com www.steamgifts.com
-
GMG end and restart their bundles whenever they want without any notice
-
some bundle sites are constantly changing end dates of their bundles (usually to scam the devs and not pay them for keys, see GoGo/Otakubundles)
-
DIG might be selling keys without developers permission, so the keys might be revoked in the future
Why do you need developer's permission to (re)sell copies of their game (Steam keys)? Maybe I don't understand well enough how keys get obtained in the first place in order to get (re)sold.
I just don't understand how the system would allow something like this to even happen (why wouldn't it only allow keys to be acquired in an authorized way to begin with, to avoid any problems?).
And I can't understand how developers would be allowed to revoke keys, especially from users who (to the best of their knowledge) were buying legit keys and not "stolen" keys or whatever.
-
-
isthereanydeal.com isthereanydeal.com
-
Report: This price didn't exist on the store This price did show on the store but the game could not be bought This was a very short price made by a mistake (glitch)
-
-
store.steampowered.com store.steampowered.com
-
Hardly anybody seems to have played this game and that's a shame because it's a solid collectathon platformer.
Tags
Annotators
URL
-
-
store.steampowered.com store.steampowered.com
-
Please note that I bought this game for $1.49 on sale, so I won't uphold $15 price that nobody wants to pay for it.
Tags
Annotators
URL
-
-
store.steampowered.com store.steampowered.com
-
Remember the helpful old man in the original Zelda for NES: "It's dangerous to go alone, take this [sword]" ? Well, TMF's tagline would be: "It's dangerous to go alone. Off you go, alone. Be careful, I guess."
-
-
simplychurch.com simplychurch.com
-
The Lord led me to a wonderful Christian ophthalmologist with unconventional methods of arresting the disease through diet alone and that has saved my sight.
-
-
www.codewall.co.uk www.codewall.co.uk
-
Using details/summary for dropdown nav menu without requiring any JavaScript
-
in this post, we’ll look at how to use this as the basis for an accessible dropdown navigation element that can be opened equally well by keyboard users tabbing through the page, and mouse users hovering on the nav item
-
The HTML details element comes with a surprise – in most browsers it has the ability to hide and show content with no additional JavaScript or CSS whatsoever. Here’s a little bit about how it works. details has with a child called summary, and when a page first loads, the summary is the only part of the element that’s visible, along with a triangle that browsers display by default, to suggest the expandable nature of the content. Interacting with the summary element, by clicking or using the keyboard, will make the rest of the details element visible and add an open attribute to the details element itself.
-
There’s an important wrinkle when it comes to animating the menu away. When the user closes the menu, it will always disappear instantly, because the open attribute is, by default, removed immediately when the user clicks that summary element. In order to gracefully animate your menu out when it closes, we need some JavaScript. Here we can listen for clicks on the details element, and call preventDefault() on the click event, then use setTimeout() to determine exactly when that open attribute should be removed. This gives us time to trigger the closing animation with CSS. This click event listener will also fire when a keyboard user hits space or enter while the element is focused, which means no further listeners are needed for keyboard actions!
-
-
www.convinceandconvert.com www.convinceandconvert.com
-
Have you ever been emailed something from a company and tried to reply only to be frustrated with a failed-to-send message response? A no-reply email frustrates your customers.Instead, use a dedicated email to send out your messages and to keep business emails in a central location so you can answer customer concerns quickly and decisively. This level of customer service will help develop your reputation as a company that cares about its customers.
-
The blog A Life Of Productivity uses double opt-ins to make sure that people signing up for the email newsletter really want to read it. If a site visitor was somehow subscribed by accident, the subscription won’t go through unless they click the verification button sent to their email address.<img class="aligncenter size-full wp-image-32479" src="https://www.convinceandconvert.com/wp-content/uploads/2016/05/A-Life-of-Productivity.jpg" alt="A Life of Productivity" width="724" height="549" />
-
-
emaildesign.beefree.io emaildesign.beefree.io
-
We got this email from Parabo, the print shop app, and smiled. Instead of the very standard “Please confirm subscription” header text, we were greeted with a funny, whimsical hello that’s totally in their brand voice. “We really want you to want us” is a clever way to break up the usual mundane greeting, and, guess what? It totally reaffirmed why we thought we wanted to sign up for their emails in the first place.
-
A button that simply said “Confirm” wouldn’t necessarily make it immediately clear about what the reader’s action means.
-
-
writingexplained.org writingexplained.org
-
A good trick to remember on to vs. onto is to mentally say “up” before on in a sentence. If it still makes sense, then onto is probably the correct choice.
-
-
github.com github.com
-
NO support whatsoever will be given for the moment unless I gave you the program personally. This is because all of this is work in progress and I can't code while constantly writing documentation and answering questions.
-
-
store.steampowered.com store.steampowered.com
-
From having the DLC only items be both constantly in your face and the kind of things you should really have access to as a base (medium sized building, most of the decorations etc) to the maps layout being seemingly purposefully made to be agravating, everytme I tried to play and like this game I got spit in the face by the devs
-
-
github.com github.com
-
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
-
-
-
developer.android.com developer.android.com
-
An intent filter is an expression in an app's manifest file that specifies the type of intents that the component would like to receive. For instance, by declaring an intent filter for an activity, you make it possible for other apps to directly start your activity with a certain kind of intent. Likewise, if you do not declare any intent filters for an activity, then it can be started only with an explicit intent.
-
Using an implicit intent to start a service is a security hazard because you can't be certain what service will respond to the intent, and the user can't see which service starts. Beginning with Android 5.0 (API level 21), the system throws an exception if you call bindService() with an implicit intent.
-
Implicit intents do not name a specific component, but instead declare a general action to perform, which allows a component from another app to handle it. For example, if you want to show the user a location on a map, you can use an implicit intent to request that another capable app show a specified location on a map.
-
Explicit intents specify which application will satisfy the intent, by supplying either the target app's package name or a fully-qualified component class name. You'll typically use an explicit intent to start a component in your own app, because you know the class name of the activity or service you want to start.
-
-
-
Universal Links allow you to register a series of domains that are allowed to interact with an installed application. If the application is not installed, the universal link is opened with Safari, allowing you to inform the user of the existence of an application or whatever is necessary.
-
-
www.globaldatinginsights.com www.globaldatinginsights.com
-
github.com github.com
-
I don't see a way to hook into Devise's route mapping load process to add the action (several monkey patching attempts failed)
-
-
www.conversioner.com www.conversioner.com
-
These two mistakes, especially the second one, plant worries in your customers mind before they’ve even had time to think of them.
-
Stop warning people – no contract, no obligations, cancel anytime – companies can’t resist saying this on every pricing page but by using negative words they’re just putting ideas into people’s heads.
-
Great pricing plan names that illustrate the type of plan you’re about to choose – from simple “hammering” for quick storage to the full blown “crane” offering unlimited storage.
-
-
-
blog.hubspot.com blog.hubspot.com
-
www.bluleadz.com www.bluleadz.com
-
There are many ways to incorporate social proof on your pricing page, including the following: Case studies Reviews Testimonials
-
-
-
blog.useproof.com blog.useproof.com
-
-
The goal of the header copy is to say just enough to get the user to convert without getting in their way. Appcues says all they need to in one concise and straightforward sentence.
Tags
Annotators
URL
-
-
www.commonsensemedia.org www.commonsensemedia.org
-
A plans and pricing comparison page ... without the prices?!
-
-
www.webfx.com www.webfx.com
-
isthereanydeal.com isthereanydeal.com
-
Historical LowSteam on 2020-05-100% off$0.00
If you zoom in on the timeline, it looks like they accidentally set price to $0.00 (probably meant to set discount to 0 instead?) and then corrected it.
17:16: 0% off of $0.00 17:23: 0% off of $19.99
Having this mistake/outlier shown as the historical low is misleading and confusing and incorrect, and should be corrected.
-
-
www.metacritic.com www.metacritic.com
-
There's no such a thing, more like beautiful interface trying to hide that there's no actual gameplay.
hiding __?
-
Yes, you do face difficult choices (moral) but you don't care about it. All you care are the reputation bars. So... Let's kill this guy, who cares if he is innocent, but this faction needs it or I'm dead. Sounds great on paper but to be honest... you just sit there and do whatever for these reputation bars. If you won't, then you lose
-
The press will tell you that "the concept" is great but the execution is bad. What should I tell you? The experience is shallow. The game is mediocre. But listen carefully, when a game is mediocre and can't even make you feel something then it's the worst kind of gaming. I will give it a 4 out of 10. You know, if this was a test in a school then this game should be marked D (someone answered a few questions, but overall missed the point). I understand that many people care about the "concept" of this game, but why if the experience is just... not here. I'm talking about the experience becaus We. The Revolution tried to be an actual experience. And it fails so badly.
-
the gameplay is meaningless and the devs just missed the point.
-
The filthy casuals write positive reviews on steam and it's clear that true gamers won't even try to review such a shallow game.
reviews/ratings because only those already inclined to like it (or who have been swayed by the already positive reviews) will bother buying it and (therefore) bother reviewing it, hence amplifying the positive ratings
-
I'm grieving over the concept which was wasted. That's the feeling you get.
-
-
store.steampowered.com store.steampowered.com
-
However, why some questions for the defendant make the jury feel that way or the other? No explanation is given. You can ask a defendant where they got the crime instrument and that sometimes makes the jury more likely to acquit them and sometimes more likely to behead them. There's no real reasoning or feedback given behind this and it feels, again, forced and arbitrary.
-
The second mechanic involved in the judgment process is the opinion of the jury. If you want to avoid reputationsand faction relations penalties, you have to deliver verdicts that the jury agrees with. That is extremely understandable.
-
-
store.steampowered.com store.steampowered.com
-
DEV actively answers questions in the community.
-
-
store.steampowered.com store.steampowered.com
-
Don't just wishlist me. I'm not that expensive... also, look at those reviews!
-
-
openrct2.org openrct2.org
Tags
Annotators
URL
-
-
www.simutrans.com www.simutrans.com
-
Choose from multiple unique paksets which offer different graphics and gameplay. Each pakset has different objects, buying prices, maintenance costs, themes and a whole unique gameplay. Every pakset is a new game.
-
-
-
aeplay.org aeplay.org
Tags
Annotators
URL
-
-
store.steampowered.com store.steampowered.com
-
Transport Tycoon is easily one of the best Tycoon games, this variant offers indepth control over your logistic networks and zero breakdowns but with loads of new tools to get to grips with you will need to search up a guide.The other variant, OpenTTD, wants to remain more like the original. its not as precise in its logistics but much simpler to pick up and play.Both are multiplayerBoth are freeIf Simutrans feels abit obtuse, try OTTDIf OTTD feels too simple, try Simutrans
-
-
www.openttd.org www.openttd.org
-
-
As of today, you can Wishlist OpenTTD on SteamE. Historically, OpenTTD always had a single home from where we distributed the game. We used to be hosted on SourceForge (you know you are old, if you remember that being a thing :D), and slowly moved towards our own self-created distribution methods. These days, we mostly distribute our game via our website. But times are changing, and so is our hair. Over the last few months, we have silently been working to become a bit more visible in the world. Don’t worry, not for reasons you might think: OpenTTD has as many active users as it had in 2007. But more because we no longer think it is the right approach to only distribute via our own website.
-
-
www.openttd.org www.openttd.org
-
As of today, you can Wishlist OpenTTD on SteamE. Historically, OpenTTD always had a single home from where we distributed the game. We used to be hosted on SourceForge (you know you are old, if you remember that being a thing :D), and slowly moved towards our own self-created distribution methods. These days, we mostly distribute our game via our website. But times are changing, and so is our hair. Over the last few months, we have silently been working to become a bit more visible in the world. Don’t worry, not for reasons you might think: OpenTTD has as many active users as it had in 2007. But more because we no longer think it is the right approach to only distribute via our own website. This became painfully apparent when we noticed other people post OpenTTD on some stores. They are not always updated with new releases, sometimes even slacking behind a few years. And maybe more important to us: we can not guarantee that the uploaded version is unmodified and is the version as we intended. So, instead of fighting it, why not turn around and join them! Why not release our own, verified, builds on those stores! And this is exactly what we have been working on lately. And when I say “we”, a bit ironic to me, I mean the two developers that are around longest (myself and orudge) ;) A while back orudge added OpenTTD to the Microsoft Store. And today, I am happy to announce we will be on SteamE too! Well, we are on Steam, but we haven’t released anything there yet (sorry that I got your hopes up, just to squash them right after :( ). This is partially because of how Steam works, but also because we know we can bring a better experience for Steam with our upcoming release. That brings me to the most exciting news: if everything goes as planned, we will release OpenTTD 1.11 on Steam on the first of April, 2021! And that is not even an April fools’ joke! You can already Wishlist OpenTTD today .. and till we release on Steam, you can find our game via our website ;)
-
-
-
100vw is 100% of the viewport width not accounting for scrollbars (unless the root element has anything other than overflow: auto set, but auto is the default value). Thus, when the page content overflows the viewport vertically, the browser renders the vertical scroll bar, which reduces the visible viewport area by a few pixels. But the 100vw value doesn't update to account for this, so the selected div retains the same width as before the vertical scrollbar appeared. This results in the horizontal scroll bar rendering.
-
-
www.sitepoint.com www.sitepoint.com
-
Now, however, you set width:100vw and that is going to be (in this case) 100% wide (viewport wide) + the vertical scrollbar width. That’s too wide. That induces the HORIZONTAL scrollbar.
-
They are a nice idea, but in practice
-
-
www.dekudeals.com www.dekudeals.com
-
Tired of games where there are tips and tutorials of all kinds and you can finish them without much difficulty?
-
-
store.steampowered.com store.steampowered.com
-
Not fun by yourself and the game is dead. Wouldn't be much fun with others either.
-
-
store.steampowered.com store.steampowered.com
-
(The forms !=, /= or <> are generally used in programming languages where ease of typing and use of ASCII text is preferred.) x ≈ y means x is approximately equal to y. This may also be written ≃, ≅, ~, ♎ (Libra Symbol), or ≒. G ≈ H means that group G is isomorphic (structurally identical) to group H.
what does that have to do with this game?
-
-
www.amazon.com www.amazon.com
-
There is an evil genius lurking around in this software, playing withyour emotions and your work. This monster wants to sell its product by any means,even if it means shutting down your work at a crucial moment so that you would run to buy the next version. Update this and update that and buy! buy! buy!For your own wellbeing, don't buy it.
-
I bought this software mainly for the multiple camera capture. I upgraded to the Pinnacle Studio 24 Ultimate.The Ultimate version still restricts how many cameras can be added.To add more cameras requires purchasing another upgrade.Their 'Ultimate' version isn't the ultimate if they are still holding back features.
-
-
hilton.org.uk hilton.org.uk
-
Unlike naming children, coding involves naming things on a daily basis. When you write code, naming things isn’t just hard, it’s a relentless demand for creativity. Fortunately, programmers are creative people.
-
We could of course refactor our code to rename things any time we like, but we don’t do this enough in practice
-
If we renamed things more often, then it probably wouldn’t be so hard to name them in the first place.
-
We also find it hard to agree on what good names and bad names look like, which makes it hard to know when renaming improves a name.
-
violates our expectation that hard things should be technical
-
This is funny because it’s unexpected. Cache invalidation sounds like a hard thing, while naming sounds more straightforward. The joke works because it violates our expectation that hard things should be technical. It’s also funny because it’s true.
-
First of all, we want names to exhibit truth and beauty: to be the right names, and to make our code clean and beautiful. At least, this is what we want to think about our code, but naming’s importance is far more practical.
-
Naming is communication
-
Scalability is the problem you want to have, and sooner rather than later, but maintainability is the problem you’re definitely going to have, sooner or later.
-
‘Programs are meant to be read by humans and only incidentally for computers to execute.’
-
Naming matters for both idealogical and practical reasons.
-
Naming is just one part of the micro-design activity that we call programming. If design weren’t hard, we wouldn’t find good design so satisfying.
-
Anyone who has ever tried to name a child knows that naming is hard. Naming things in code is harder. It’s bad enough that you have to commit to a name that someone isn’t going to like. You also have to be able to live with it.
-
In principle, the naming things in code need only be temporary, but names in code stick just like nicknames at school.
Tags
- creative people
- big change/rewrite vs. continuous improvements / smaller refactorings
- scalability
- good point
- clean code
- why is it difficult/hard?
- problem you are definitely going to have
- what programmers are like
- human-readable vs. machine-readable
- contrast
- why is it important? / why does it matter?
- naming
- naming: the importance of good names
- _is_ (strong is-a/hyponymy/equivalence)
- requires/demands creativity
- don't do often enough
- considering your audience
- refactoring: rename
- can in theory but not commonly done in practice
- creativity
- funny because it's true
- beautiful code
- good problem to have / problem you want to have
- cache invalidation is hard
- becomes/gets easier with practice/experience
- communication
- difficult/hard problem
- software development
- incidental
- quotable
- well-written
- hard things in computer science
- source code is meant to be read primarily by humans (human-readable more important)
- relentless
- beauty
- programming
- hard to determine/recognize if it is better / an improvement or not
- satisfying/rewarding
- surprising
- practical
- truth
- creative
- good analogy
- frequently encountered (common) problem
- is just one part of _
- funny because it's unexpected
- technical problems
- hard to agree on
- non-technical problems
- supposed to be temporary / things have a way of sticking/becoming permanent
- maintainability
- expectations
- the activity of _
- naming things is hard
Annotators
URL
-
-
en.wikipedia.org en.wikipedia.org
Tags
Annotators
URL
-
-
www.reddit.com www.reddit.com
-
It's difficult because it's a case-by-case basis - there is no one right answer so it falls into subjective arguments.
-
Space: Suppose we had infinite memory, then cache all the data; but we don't so we have to decide what to cache that is meaningful to have the cache implemented (is a ??K cache size enough for your use case? Should you add more?) - It's the balance with the resources available.
-
Time: Suppose all your data was immutable, then cache all the data indefinitely. But this isn't always to case so you have to figure out what works for the given scenario (A person's mailing address doesn't change often, but their GPS position does).
-
The underlying data might get changed by another process and then your process that uses the cache will be working with incorrect data
-
You have to guess when the data is not likely to be needed in memory. It can't be too short that the cache is useless, and too long that you'll get a memory leak.
Tags
- more than one right way (no one right/best way)
- cache invalidation
- caching
- why is it difficult/hard?
- balance
- challenges
- how recent/fresh/up-to-date does it need to be? 
- cache invalidation is hard
- limited resources (computing)
- how good/perfect does it really need to be?
- subjective arguments
- trade-offs
Annotators
URL
-
-
www.honeybadger.io www.honeybadger.io
-
-
One reason Turbolinks sites seem faster than traditional web apps is because of its cache. However, the cache can be a source of great frustration. Many of the edge cases we're going to discuss involve the cache in some way.
-
Now let me ask you, do you write JS for a single page application differently from a "traditional" web application? I sure hope you do! In a "traditional" application, you can get away with being sloppy because every time the user navigates to a new page, their browser destroys the DOM and the JavaScript context. SPAs, though, require a more thoughtful approach.
-
where's the code that unloads the table-sorter plugin when the page unloads? There isn't any. There didn't need to be back in the day because the browser handled the cleanup. However, in a single-page application like Turbolinks, the browser doesn't handle it. You, the developer, have to manage initialization and cleanup of your JavaScript behaviors.
-
When people try to port traditional web apps to Turbolinks, they often run into problems because their JS never cleans up after itself.
-
All Turbolinks-friendly JavaScript needs to: Initialize itself when a page is displayed Clean up after itself before Turbolinks navigates to a new page.
-
For new projects, I would recommend using Webpack, along with perhaps a lightweight framework like Stimulus.
-
Turbolinks is a Single-Page Application Turbolinks doesn't just give you some of the benefits of a single-page app. Turbolinks is a single page app. Think about it: When someone visits your site, you serve them some HTML and Javascript. The JavaScript takes over and manages all subsequent changes to the DOM. If that's not a single-page app, I don't know what is.
-
Well, I'm glad they did, because Turbolinks is a much better piece of software than jquery-pjax ever was. It's actively maintained and doesn't require jQuery at all! So we're one step closer to our dream of ditching $.
-
Now if you think about it, PJAX sounds a lot like Turbolinks. They both use JS to fetch server-rendered HTML and put it into the DOM. They both do caching and manage the forward and back buttons. It's almost as if the Rails team took a technique developed elsewhere and just rebranded it.
-
In 2025 we plan to
Surely this is a typo and should have said 2020? Nobody would make such a specific tech plan for 5.5 years in the future ... would they?
-
we plan to migrate to Angular 1, and we'll finish out the decade on React
Wrong direction: I'd recommend migrate from Angular to React.
-
The only problem is that our PJAX library is no longer maintained and was preventing us from updating jQuery (ugh). So it had to go.
https://github.com/MoOx/pjax doesn't say it's no longer maintained (though hasn't been updated in 2 years), and does say that it doesn't use jQuery. Oh well.
-
There's an approach we've been using for years that lets us have our cake and eat it too. It's called PJAX, and its big idea is that you can get SPA-like speed without all the Javascript. When a user clicks a link, the PJAX library intercepts it, fetches the page and updates the DOM with the new HTML.
-
Our app is mostly about displaying pages of static information. We crunch a lot of data to generate a single error report page.
-
Honeybadger isn't a single page app, and it probably won't ever be. SPAs just don't make sense for our technical requirements.
Tags
- copying ideas from another project
- lazy
- good point
- it's your responsibility to handle that
- I have a differing opinion
- requires a careful/thoughtful approach
- determining if something is an appropriate application / best tool for the job
- Angular
- single-page app
- switching/migrating to something different
- lightweight
- sloppy
- React
- not the most appropriate / best tool/application/fit for every use case
- typo
- planning
- I'm not sure about this
- copying/doing the same as how another project/library did it
- depends on use case / application
- Turbolinks
- cache invalidation
- newer/better ways of doing things
- surprising
- similarities/commonalities
- no longer maintained
- excellent technical writing
- cache invalidation is hard
- definition
- relationship: is a
- not the most appropriate / best tool/application/fit for this use case
Annotators
URL
-
-
www.quora.com www.quora.com
-
-
So the hard and unsolvable problem becomes: how up-to-date do you really need to be?
-
After considering the value we place, and the tradeoffs we make, when it comes to knowing anything of significance, I think it becomes much easier to understand why cache invalidation is one of the hard problems in computer science
the crux of the problem is: trade-offs
-
why a company like Facebook invests so much research and engineering into the network performance of things as seemingly trivial as notifications.
-
the 2 hardest problems in computer science are essentially the 2 hardest problems of life in general, as far as humans and information are concerned.
-
The non-determinism is why cache invalidation — and that other hard problem, naming things — are uniquely and intractably hard problems in computer science. Computers can perfectly solve deterministic problems. But they can’t predict when to invalidate a cache because, ultimately, we, the humans who design and build computational processes, can’t agree on when a cache needs to be invalidated.
-
I like the answers already given, but I think they both could use an even more top-level, generalized explanation.
-
Cache invalidation is hard because: Everything in life we want to know, changes.Those changes are non-deterministic.
-
you began by first finding out if your crush was already in a relationship. If so, you then did what you could in your power to have the most most up-to-date information on their relationship status. The downside of outdated data is self-evident: you want to move in at the first sign of the current relationship dissolving.
-
Sometimes humorously extended as “cache invalidation, naming things, and off-by-one errors.”
Tags
- where it shines / best application
- everything changes over time
- difficult/hard problem
- good point
- network performance
- good explanation
- generalized explanation
- knowledge
- life in general
- computers
- funny
- hard things in computer science
- how good/perfect does it really need to be?
- trade-offs
- why?
- cache invalidation
- seemingly trivial
- main/key/central/essential/core thing/point/problem/meat
- nondeterministic
- good analogy
- excellent technical writing
- deterministic
- good question
- cache invalidation is hard
- investing in something (general)
Annotators
URL
-
-
www.computers.wtf www.computers.wtf
-
There’s only one hard thing in Computer Science: human communication. The most complex part of cache invalidation is figuring out what the heck people mean with the word cache. Once you get that sorted out, the rest is not that complicated; the tools are out there, and they’re pretty good.
-
Cache and caching are some of the most ambiguous words in the IT world, and that’s because we can have multiple types of caching working in parallel and affecting content independently.
-
-
ctf0.wordpress.com ctf0.wordpress.com
-
copyheart.org copyheart.org
-
Instead of trying to educate everyone on the complexities of copyright law, we’d rather make our intentions clear with this simple statement:
-
I think you want a symbol with a circle around it, like the circle around the C in ©. That way the association with the copyright symbol is clear.
-
But the circle on its own doesn’t seem to be available as a nonspacing diacritic in Unicode. Bugger.
-
Creating more legally binding licenses and contracts just perpetuates the problem of law – a.k.a. state force – intruding where it doesn’t belong.
-
That ♡copyheart isn’t a legally binding license is not a bug – it’s a feature!
-
We really don’t think laws and “imaginary property” have any place
Tags
- state/government force (law)
- complex
- Unicode
- legally binding
- being explicit
- similarities/commonalities
- unfortunate
- intruding where they/it doesn’t belong
- it’s a feature, not a bug
- explicit goals
- copyright law
- making the association/commonality/relationship clear/explicit
- freedom: don't force something/your way/your will
- avoid complexity
- interesting wording
- making intentions clear/explicit
Annotators
URL
-
-
store.steampowered.com store.steampowered.com
-
This is not a game.It's just a thing.It's nothing to do with cash.Luckily, it's free.Don't pay a dime in this.it's not a game.It's just... more.It's just more.Not in a good way.Nor in a bad way.Sometimes more is just more.This is more. More snore.Is it a good snooze?You decide.I recommend you decide for yourself.After you give it a try.It's free.A free what though?This is not a game.
-
-
www.reddit.com www.reddit.com
-
please, for the love of god do NOT use Mint as a source of inspiration for a derivative distro. If you like Cinnamon or Mate, fine, but holy CHRIST do not let your infrastructure get as criminally sloppy as Mint's. No unholy mixing of Debian and Ubuntu debs into some kind of Frankenbuntu, no namespace collisions, no ... well, no being Mint in general, please!Ideally, I really, really hope you'll continue to support Ubuntu as a primary platform, regardless of what you do with Pop!_OS. But hooboy, do not turn into another Mint, please.
-
Everyone here wears many hats
links to image of someone literally wearing many hats
-
We're small, but we're efficient. We can do with the number of people we have what would take twice the workforce of other companies. Everyone here wears many hats, and that allows us to cover a lot of ground without needing as many people.
-
when it comes to personal machines, I expect them to just work so I can work.
-
Not to mention 80% of our sales are laptops and desktops running, you guessed it, a Linux desktop. So, unlike Red Hat and Canonical, we live or die based on how good that experience is.
-
If it was remotely possible to get Davinci Resolve running that would be incredible (and bring a lot of video people I think)
-
We do know what our customers ask us for: powerful desktops and laptops that work with them in their creative endeavors. And we know that Canonical is no longer interested in catering to them. So we're going to try and step up.
-
the most productive environment possible for people that use their computer to create.What is a productive environment?How do you measure productivity in an operating system environment?How do you compare YOUR distribution to other distributions when it comes to productivity?Is the way in which 'people that use their computer to create' (creators) the same across all professions and activities?Does a photographer have the same requirements for a productive environment as a software engineer?Why do you think your distribution will be the best for delivering a productive environment than any other Linux distribution?
Tags
- PopOS
- generalist
- System76
- funny
- desktop Linux
- how to choose
- literal meaning
- Canonical
- good user experience
- Linux distros
- criticism
- compatibility
- wearing many hats/roles
- Linux distros: Ubuntu derivative
- core business model
- efficiency
- users want it to "just work"
- giving users what they want
- Linux Mint
- business
- bad combination/mixture/hybrid/frankenstein
- good question
- motivation
Annotators
URL
-
-
-
This gives them a slight edge but that’s nothing substantial because those fixes eventually reach Ubuntu.
-
Technically, it isn’t a part of the comparison internally but it is a factor that some users care for.
-
Pop!_OS has its own official PPA which is enabled by default.
-
-
-
It’s always about the money… Fish got’a swim, birds got’a fly, and development has to have money. If you think otherwise you’re a fool!
-
Considering Canonical has pulled resources from this project, the path for continued third-party development of Unity will not be easy. It is my hope that they are successful and can become another shining example of the power of forking, like the MATE project.
-
-
www.reddit.com www.reddit.com
-
Pop!_Os makes some improvements on Ubuntu especially for gaming and coding. There are newer drivers and some coding related things are easier to setup.
-
Get off systemd, and enter the world of chroot.
-
And then think about if you want a rolling release, or a fixed release. Although all the distros you mentioned are on the fixed release side.
-
Think about how much you want to customize the desktop environment(DE), and whether you know how to do so. Pick a distro that has the DE you like.
-
There is no best distro. All of them are more or less the same.
-
When people talk about "beginner distros" they mean distros that are no hassle to get started, it doesnt mean they are somewhat inferior or less capable.
-
And honestly, most people prefer the no hassle, especially after wasting too much time dabbling with distros that are "for advanced users" troubleshooting all kinds of dumbass problems that just worked out of the box in many other distros.
-
-
www.youtube.com www.youtube.com
-
I chose 18.04 because it's the latest LTS version, and I'm not keen on updating my OS every year or so. (I like getting things stable and not having to worry for a while)
-
considering PopOS is trying to tackle Ubuntu they really need their dual-boot setup to be a lot less tedious
-
Couldn't agree more, the whole fuss about POP OS is overrated. I think it started because of a video on Linus tech tips, which listed Pop OS as one of the best solutions for Linux gaming. But I think that running Ubuntu + some Linux knowledge to install the proprietary driver is a better solution imo.
-
if PopOS! really wants to be what Ubuntu was 10 years ago they need to step up and make dual booting easier.
-
Instead of resizing the existing Widnows EFI System partition of size 100 mb, Can't I just create a new EFI system partition of 500 mb FAT32 for bootloader and linux only related stuff?
-
Instead of resizing Windows efi partition, I created a new one for pop os as well. So now my system has two different efi partitions. No chance of any messing up.
-
I tried it but the tool wouldn't let me resize the EFI partition
-
If would recommend you create a bootable Windows 10 USB from the MS website and reinstall the PC with a clean Windows installation so you have the same Windows installation as shown in the video. Also, you'll be a lot happier with all the bloatware removed.
-
The part where you want to add 2 EFI partitions is not advisable. It seems that Windows doesn't really like this, of you are dual booting multiple Linux installs it might work. But it is always recommended to use only 1 EFI partition per disk. Hope this helps. :)
-
-
www.howtogeek.com www.howtogeek.com
-
Press Shift+F10 while installing Windows to open a Command Prompt window.
-
-
pop-planet.info pop-planet.info
-
You don't necessarily have to resize Windows' EFI partition. You can have multiple EFI partitions.
-
When I started Pop!_Planet, I launched it because I saw a need for a centralized community for Pop!_OS. To be frank, I never expected the level of popularity it has achieved. Over the last year, we have gone from under 50 users, to almost 400 users. That's awesome! However... it also comes with a downside. We are rapidly running out of disk space on our server, and the bandwidth costs go up every month. Pop!_Planet is not affiliated with System76 in any way, and is funded completely out of pocket. From day one, I said that I'd never use on-site ads (I hate them as much as you do), so the only monetization we get is through donations. Right now, the donations we receive don't even cover our overhead. I know that most users will ignore this message, and that's ok. However, if even a few of our users are willing and able to donate a few dollars to help offset our expenses, it would be greatly appreciated.
-