10,000 Matching Annotations
  1. Feb 2021
    1. While each of these two words has several possible meanings, they are notably distinct from each other in all senses. Denotation is concerned with explicit meaning, and connotation tends to be concerned with implicit meaning.
    1. With the introduction of CPUs which ran faster than the original 4.77 MHz Intel 8088 used in the IBM Personal Computer, programs which relied on the CPU's frequency for timing were executing faster than intended. Games in particular were often rendered unplayable. To provide some compatibility, the "turbo" button was added. Engaging turbo mode slows the system down to a state compatible with original 8086/8088 chips.
    2. Contrary to what it suggests, the "turbo" button was intended to let a computer run slower than the speed for which it had been designed.

      I guess they called it that because it would be come across better than calling it a "slow" button!

    1. Programming to an interface means that when you are presented with some programming interface (be it a class library, a set of functions, a network protocol or anything else) that you keep to using only things guaranteed by the interface. You may have knowledge about the underlying implementation (you may have written it), but you should not ever use that knowledge.
    2. The problem with this is that it creates a strong coupling between your code and the implementation, exactly what the interface was supposed to prevent.
    3. Depending on the politics it might either mean that the implementation can no longer be changed, because that would break your code, or that your code is very fragile and keeps breaking on every upgrade or change of the underlying implementation.

      not quite sure how this is politics, but interesting example

    4. If the program was important enough, Microsoft might actually go ahead and add some hack to their implementation so the the program would continue to work, but the cost of that is increased complexity (with all the ensuing problems) of the Windows code. It also makes life extra-hard for the Wine people, because they try to implement the WinAPI as well, but they can only refer to the documentation for how to do this, which leads to many programs not working as they should because they (accidentally or intentionally) rely on some implementation detail.
    5. Abstract myself from the how it does and get focus on what to do.
    6. Say you have software to keep track of your grocery list. In the 80's, this software would work against a command line and some flat files on floppy disk. Then you got a UI. Then you maybe put the list in the database. Later on it maybe moved to the cloud or mobile phones or facebook integration. If you designed your code specifically around the implementation (floppy disks and command lines) you would be ill-prepared for changes. If you designed your code around the interface (manipulating a grocery list) then the implementation is free to change.
    7. It's more like providing an Employee object rather than the set of linked tables you use to store an Employee record. Or providing an interface to iterate through songs, and not caring if those songs are shuffled, or on a CD, or streaming from the internet. They're just a sequence of songs.
    1. Rather than implement features you might need, you implement only the features you definitely need, but in a way that accommodates change. If you don't have this flexibility, parallel development simply isn't possible.
    2. At the core of parallel development, however, is the notion of flexibility. You have to write your code in such a way that you can incorporate newly discovered requirements into the existing code as painlessly as possible.
    3. many successful projects have proven that you can develop high-quality code more rapidly (and cost effectively) this way than with the traditional pipelined approach
    1. Though getter/setter methods are commonplace in Java, they are not particularly object oriented (OO). In fact, they can damage your code's maintainability. Moreover, the presence of numerous getter and setter methods is a red flag that the program isn't necessarily well designed from an OO perspective.
    2. This article explains why you shouldn't use getters and setters (and when you can use them) and suggests a design methodology that will help you break out of the getter/setter mentality.
    1. Some languages like Smalltalk and Ruby only allow access via object methods
    2. They claim that inheritance often breaks encapsulation, given that inheritance exposes a subclass to the details of its parent's implementation.
    3. Encapsulation is used to hide the values or state of a structured data object inside a class, preventing direct access to them by clients in a way that could expose hidden implementation details or violate state invariance maintained by the methods.
    1. you can do pairs.each_with_object({}) do |(multiparameter_name, value), attributes|
    2. values_with_empty_parameters.each_value.all?(&:nil?) This comment has been minimized. Show comment Hide comment Copy link Quote reply egilburg on Apr 9, 2015 Contributor you can do values_with_empty_parameters.values.none? [nil, nil].none? => true Pick your reaction egilburg on Apr 9, 2015 Contributor you can do values_with_empty_parameters.values.none? [nil, nil].none? => true
    3. @kirs can we leave the typecast API out for now? This will conflict with the work @sgrif want to do and it would maybe make harder to integrate.
    1. As I reported in #10, error keys get duplicated and we should namespace them. This code behaves right like AR::Base accept_nested_attributes
    1. class ConferencesController def create conference = Conference.new @conference_form = ConferenceForm.new(conference) @conference_form.submit(conference_params) if @conference_form.save redirect_to @conference_form, notice: "Conference: #{@conference_form.name} was successfully created." } else render :new end end end
    2. ActionForm also can accept ActiveModel::Model instances as a model.
    3. You can find a list of applications using this gem in this repository: https://github.com/m-Peter/nested-form-examples . All the examples are implemented in before/after pairs. The before is using the accepts_nested_attributes_for, while the after uses this gem to achieve the same functionality.
    1. This would be more useful if there was an easy way to actually compare the differences...

      This is how I did it:

      cd user-example
      diff -r -u10 before/ after/
      # then compare after/app/forms, which was only in after
      

      Linked to from https://hyp.is/5YyPAnFNEeu0Vv94pLaypA/github.com/railsgsoc/actionform

    1. My reasoning for not gemifying ActiveForm is that the custom not-rails-core logic is relatively small
    2. I've utilized as many Rails modules as I can to make maintenance a lot easier as I just have to update Rails and I get the updates for free. By utilizing Rails core modules, it's a really small library - there are only 10 methods in the Base module!
    3. while ActiveForm currently fits 99% of my use cases, I do sometimes make modifications based on the product requirements
    4. For now I feel ActiveForm is still a bit early to transition to a gem  as there are still things to improve and work out. One day I'll invest more time into making it extendable and release it as a gem. For now I feel it's an unnecessary complexity.

      If he's like most of us, though, this means it will never happen...

    5. I will continue to use form objects and push changes into the repo when I feel they are universally relevant and valuable.

      new tag?:

      • code that is universally relevant/valuable
      • non - _-specific logic
    6. we get the benefit of isolating request specific logic without cramming it into a ActiveRecord model that will be used in multiple controllers/actions

      request-specific logic

    7. The controllers feel very familiar to using ActiveRecord models
    8. if you name you instance variable form, then you can always just pass in params[:form]
    9. However, sometimes actions can't be rolled back and it is unfortunately unavoidable. For example, consider when we send emails during the call to process. If we send before saving a record and that record fails to save what do we do? We can't unsend that email.
    10. I typically save everything I can first, and then call the side-effects afterwards. If the side-effects fail I can handle them elsewhere and retry when necessary.
    11. Writing the uniqueness validations yourself is easy so I felt it was better to leave this up to the developer
    12. Why process, not save? This is entirely up to you. However, it's good to stay consistent across your team so there's no confusion. I began using save but found there are some cases for forms where you aren't saving anything, such as when you are just triggering a job or push-notification. I found using process fits more cases so that's what I use. This is also typically the only method that is public on my forms.

      process is a good name, but I think this is evidence that this object is not the form object itself, but a form processor (as I like to call it) or a "workflow" object (like https://github.com/gogogarrett/reform_example/blob/master/app/forms/workflows/user_workflow.rb), which wraps a form object.

    13. ActiveForm has the attribute allow-listing by default. Any attribute in the list will be allowed
    14. 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...

    15. 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.
    16. 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.

    1. it's just a shame that there's no online or split-screen multiplayer, which seems like a major oversight to us; local play between Switch system is possible, but could prove to be a logical nightmare.
    2. logical

      logistical?

    1. Игра лютая дрянь, MX unleashed лучше в 100 раз. Физики нет, трассы дрянь, трюки вырвиглазны. Я заплатил за игру 150 руб, она даже копейки не стоит.

      The game is fierce rubbish, MX unleashed is 100 times better. There is no physics, the tracks are rubbish, the tricks are torn out. I paid 150 rubles for the game, it doesn't even cost a penny.

    1. Did you by any chance ever finish/publish your solution for this?
    2. I do think it's a common pattern that should be solved, and I am probably going to try and solve it as a Gem as opposed to simply writing code that we use in our code base
    3. 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...

    4. I'd like to know specifically what you were aiming to achieve with this Gem as opposed to simply using https://github.com/apotonick/reform? I am happy to help contribute, but equally if there is a gem out there that already does the job well, I'd like to know why we shouldn't just use that.
    5. Like all best practices, I think the way you will resolve a problem will depend of the application you are doing.
    6. DSLs can be problematic for the user since the user has to manage state (e.g. am I supposed to call valid? first or update_attributes?). This is exactly why the #validate is the only method to change state in Reform.
    7. The reason Reform does updating attributes and validation in the same step is because I wanna reduce public methods. This is to save users from having to remember state.

      I see what he means, but what would you call this (tag)? "have to remember state"? maybe "have to remember" is close enough

      Or maybe order is important / do things in the right order is all we need to describe the problem/need.

    8. I agre with your concern. I realy prefer to do this : form.assign_attributes(hash) if form.valid? my_service.update(form) #render something else #render somthing else end It looks more like a normal controller.
    9. Furthermore, you call #sync_and_validate_with and #then_validate. When I read this line I understand than it do the validation two times.
    10. My only concern with this approach is that if someone calls #valid? on the form object afterwards, it would under the hood currently delete the existing errors on the form object and revalidate. The could have unexpected side effects where the errors added by the models passed in or the service called will be lost.
    11. My concern with this approach is still that it's somewhat brittle with the current implementation of valid? because whilst valid? appears to be a predicate and should have no side effects, this is not the case and could remove the errors applied by one of the steps above.
    12. 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)
    13. 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.
    14. but there is some things I don't like in reform
    15. 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.
    16. 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).
    17. 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.
    18. I close the issue but we can continue the discussion.

      closing does not necessarily imply end of discussion

    19. 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.
    20. 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.
    21. 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).
    22. 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
    23. Thanks for all your patches and ideas so far!
    24. I like your API here much better than reform's API.
    25. reform conflates these two responsibilities into a single validate method
    26. 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.
    27. 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
    28. commented

    Tags

    Annotators

    URL

    1. def self.attribute(name, type = ActiveModel::Type::Value.new, **options) super attribute_type = attribute_types[name.to_s] # Add the ? method for boolean attributes alias_boolean(name) if attribute_type.is_a?(ActiveModel::Type::Boolean) # store date attribute names so we can merge the params during # initialization date_attributes << name if attribute_type.class.in?(DATE_TYPES) end
    2. merge_date_and_time_params
    3. dealias_params(params_hash)
    4. *initialize* also supports passing resources (also attributes if you would # like to) manually
    5. An additional usecase is where we would like to update multiple records
    6. This can be useful in cases like multistep registration. Previously in # rails we used to stick all of the validations in the class and then we're # stuck validating them all everytime
    7. Some developers found work arounds by using virtual attributes to # skip validators
    1. Hopscotch
    2. simplify complex business logic
    3. Top level architecture
    4. You can optionally compose the steps manually (great for reuse) and just make use of the Runner#call method.
    5. class UsersController < ApplicationController def create success = -> (response, time) { redirect_to root_path, notice: "#{response} - at: #{time}" } failure = -> { render :new } Workflow::CreateUser.call(params[:name], success: success, failure: failure) end end
    6. While this example could work, we're already duplicating code and things could easily get out of sync with the previous Signup runner.
    7. What does this mean for our runner? They get simpler and allow for quick reuse! Let's see.
    8. Let's assume that something in the system has to change (as it rarely does..), and we need to add a new step to the process to the runner
    1. Please buy my book to support the development and learn everything about Reform
    2. By explicitly defining the form layout using ::property there is no more need for protecting from unwanted input. strong_parameter or attr_accessible become obsolete. Reform will simply ignore undefined incoming parameters.
    3. Great thanks to Blake Education for giving us the freedom and time to develop this project in 2013 while working on their project.
    1. Launched in 2008, our breakthrough reading app, Reading Eggs, has been used by over 3.4 million users in 169 countries.

      Have Reading Eggs for kids. First time I had learned anything about the company behind it.

      Here: https://hyp.is/G85jmnChEeuRiUMfGc0Brg/github.com/trailblazer/reform

    1. 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]?
    2. 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
    1. 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.
    2. @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
      
    3. 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.

    4. 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
    1. 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.
    1. 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.
    2. Seems similar to Reform, but simpler, plays nicely with Rails

    3. @user_form = UserForm.new(User.find(params[:id])) # you need to load the record being edited
    4. # 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
    1. 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.
    2. 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.
    3. 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
    1. It does seem a bit like class notes and is *too* simplified to really be of much practical use though.
    2. If you are a VISUAL LEARNER, start here.
    3. 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.
    1. Again this is my personal opinion, but this a rough point to start as a beginner.

      .

    2. {'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"}
    3. 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.
    1. Manning: I love the cover art. Seriously! It is very apropos and beautiful (for both this Haskell book and the recent Manning F# book).
    1. GMG end and restart their bundles whenever they want without any notice
    2. 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)
    3. 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.

    1. 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)
    1. Hardly anybody seems to have played this game and that's a shame because it's a solid collectathon platformer.
    1. 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.
    1. 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."
    1. Using details/summary for dropdown nav menu without requiring any JavaScript

    2. 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
    3. 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.
    4. 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!
    1. 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.
    2. 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" />
    1. 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.
    2. A button that simply said “Confirm” wouldn’t necessarily make it immediately clear about what the reader’s action means.
    1. 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.
    1. 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.
    1. 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
    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. 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.
    2. 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.
    3. 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.
    4. 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.
    1. 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.
    1. These two mistakes, especially the second one, plant worries in your customers mind before they’ve even had time to think of them.
    2. 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.
    3. 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.
    1. 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.
    1. A plans and pricing comparison page ... without the prices?!

    1. 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.

    1. There's no such a thing, more like beautiful interface trying to hide that there's no actual gameplay.

      hiding __?

    2. 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
    3. 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.
    4. the gameplay is meaningless and the devs just missed the point.
    5. 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

    6. I'm grieving over the concept which was wasted. That's the feeling you get.
    1. 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.
    2. 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.
    1. 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.
    1. 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