Therefore client side validation should always be treated as a progressive enhancement to the user experience; all forms should be usable even if client side validation is not present.
- Mar 2021
-
www.html5rocks.com www.html5rocks.com
-
-
It's important to remember that even with these new APIs client side validation does not remove the need for server side validation. Malicious users can easily workaround any client side constraints, and, HTTP requests don't have to originate from a browser.
-
Since you have to have server side validation anyways, if you simply have your server side code return reasonable error messages and display them to the end user you have a built in fallback for browsers that don't support any form of client side validation.
-
workaround
-> work around
-
Validating forms has notoriously been a painful development experience. Implementing client side validation in a user friendly, developer friendly, and accessible way is hard. Before HTML5 there was no means of implementing validation natively; therefore, developers have resorted to a variety of JavaScript based solutions.
-
-
stackoverflow.com stackoverflow.com
-
stackoverflow.com stackoverflow.com
-
I used this in the console to find the file and the line of the error (took it from this answer): JS_PATH = "app/assets/javascripts/**/*.js"; Dir[JS_PATH].each do |file_name| puts "\n#{file_name}" puts Uglifier.compile(File.read(file_name)) end
Didn't work for me because it was actually a .coffee file.
So I tried something similar with this:
main > Dir["*/assets/javascripts/**/*.coffee"].each { |file_name| puts "\n#{file_name}"; Sprockets::CoffeeScriptProcessor.(filename: file_name, data: File.read(file_name), cache: {}); } app/assets/javascripts/bootstrapped.js.coffee NoMethodError: undefined method `config' for nil:NilClass from /home/tyler/.gem/ruby/2.7.1/gems/sprockets-4.0.2/lib/sprockets/source_map_utils.rb:40:in `format_source_map'
but it wasn't as trivial to provide the necessary environment that Sprockets wants.
But that's okay, when better_errors paused on the exception, I just jumped to the
block in Sprockets::CoffeeScriptProcessor.call sprockets (4.0.2) lib/sprockets/coffee_script_processor.rb, line 24
frame and evaluated
input[:filename]
to figure out which file had failed.
Obviously this information should be part of the error message itself though!!
-
I know this is old, but I got the same error and I came here from Google, so in case someone does too, this was my solution:
-
-
github.com github.com
-
afarkas.github.io afarkas.github.ioWebshim4
-
If set to true the UI of all input widgets (number, time, month, date, range) are replaced in all browsers (also in browser, which have implemented these types). This is useful, if you want to style the UI in all browsers.
-
Webshim is opinionated, that a developer should always solve a problem the HTML5 way.
-
Webshim is also more than a polyfill, it has become a UI component and widget library. Webshim enables a developer to also enhance HTML5 capable browsers with more highly customizable, extensible and flexible UI components and widgets.
And now that it's deprecated (presumably due to no longer needing these polyfills), not only do the polyfills go away (no longer maintained), but also these unrelated "extras" that some of us may have been depending on are now going away with no replacement ...
If those were in a separate package, then there would have been some chance of the "extras" package being updated to work without the base webshims polyfills.
In particular, I was using
$.webshims.addCustomValidityRule
which adds something that you can't do in plain HTML5 (that I can tell), so it isn't a polyfill... -
-
-
html.spec.whatwg.org html.spec.whatwg.org
-
Fires an invalid event at the element
First time I've seen/heard it said that an event is fired at some target. But it sure makes sense, since it matches how "fire" is used in other senses (like shooting a gun).
-
-
stackoverflow.com stackoverflow.com
-
answered May 9 '13 at 15:29 alexander farkas
-
-
stackoverflow.com stackoverflow.com
-
You can't just use arbitrary pseudo selectors and expect it work. It's like me trying to speak Spanish in Japan and expecting japanese people to understand what I'm saying
-
-
mychartwa.providence.org mychartwa.providence.org
-
We’re doing our part to be more transparent and get data into the hands of patients quicker. Starting October 25, 2020, we’ll be releasing test results, visit notes and summaries immediately. Your provider may take up to three to five days to review your results and contact you to discuss abnormal results. Learn more here.
-
-
github.com github.com
-
markdown-it is the result of the decision of the authors who contributed to 99% of the Remarkable code to move to a project with the same authorship but new leadership (Vitaly and Alex). It's not a fork.
-
var md = require('markdown-it')('commonmark');
first sighting: require(...)(...)
How would that work with import? Not as fluidly but...
import markdownIt from 'markdown-it' let md = markdownIt('commonmark')
-
-
+ adds syntax extensions
-
Configurable syntax! You can add new rules and even replace existing ones.
-
Community-written plugins and other packages on npm.
Tags
- disagreement
- first sighting
- syntax extensions
- forking
- easily extensible with plugins/extensions
- competition in open-source software
- CommonMark
- Markdown
- interesting approach/solution
- not:
- javascript libraries
- extension API
- controversial
- nice API
- distinction
- open-source software: transferring project to new maintainer
- configurable
- change of leadership
Annotators
URL
-
-
code.visualstudio.com code.visualstudio.com
-
runtimes (such as .NET and Unity)
Tags
Annotators
URL
-
-
store.steampowered.com store.steampowered.com
-
-
Starting the Game is a game about a non-experienced gamer who is trying to download, crack and play a game.
-
-
store.steampowered.com store.steampowered.com
-
Playing it now, I realise that the game isn't necessarily any easier - I'm just more patient.
Tags
Annotators
URL
-
-
store.steampowered.com store.steampowered.com
-
i need to write review so i get my badge
-
-
store.steampowered.com store.steampowered.com
-
Posting an issue on the discussion boards for a three year old game, yesterday, I wasn't holding my breath for a reply. Earlier, this morning, a dev. responded, stating they'd look at fixing it, and it was just a few hours before it were sorted!
-
-
boardgamegeek.com boardgamegeek.comDawn1
-
Players try to build a village together. As the game goes on each player secretly chooses whether they want to go for a coop victory or a single-player win.
-
-
boardgamegeek.com boardgamegeek.com
-
Dawn - March 15 Dawn on Titan - March 15
-
-
www.kickstarter.com www.kickstarter.com
-
We often are too busy. We spend our days occupied by a multitude of worries. One day, I realized that my time left in this life was getting shorter and shorter. For the first time, I felt regret and wondered, “Where did my time go?”
-
-
www.kickstarter.com www.kickstarter.com
-
Try before you buy Here's a link to the game on Tabletopia: Judean Hammer on Tabletopia
-
-
stackoverflow.com stackoverflow.com
-
// A general key transform method. Pass it a function that accepts the old key and returns // the new key. // // @example // obj = transformKeys(obj, (key) => ( // key.replace(/\b(big)\b/g, 'little') // )) export function transformKeys(source, f) { return Object.entries(source).reduce((o, [key, value]) => { o[f(key) || key] = value return o }, {}) } // Provide an object that maps from old key to new key export function rekeyObject(source, keyMap) { transformKeys(source, key => keyMap[key]) }
-
function objectMap(source,keyMap) { return Object.entries(keyMap).reduce((o,[key , newKey]) => { o[newKey]=source[key] return o;},{}) }
-
Here's another plain ES2015/2017 version
-
You really don't need underscore/lodash for this ... nowadays anyways
-
I realize the question was asked 9 years ago, but this question is (still) ranked highly in search results and I came across it today
-
-
reedbarger.com reedbarger.com
-
Replacing map / filter with a single reduce
-
-
github.com github.com
-
Recursively transform object keys with a custom key transform strategy
-
-
stackoverflow.com stackoverflow.com
-
not all answers pass this tests
-
function isObject(o) { return o instanceof Object && o.constructor === Object; }
-
An array is from a logical point of view not an object - although JavaScript handles and reports them as such. In practice however, it is not helpful to see them equal, because they are not.
-
In case you need to verify that object is instance of particular class you have to check constructor with your particular class
-
Arrays are definitely objects. Not sure why you think objects can't have a length property nor methods like push, Object.create(Array.prototype) is a trivial counterexample of a non-array object which has these. What makes arrays special is that they are exotic objects with a custom [[DefineOwnProperty]] essential internal method, but they are still objects.
-
arrays are not objects from a logical point of view. I'm speaking about program logic. It is sometimes necessary to check if an array is a "real" array and definitely not an "real" object. That's what Array.isArray() is for. Imagine you have a function which accepts an object or an array of objects.
-
function isObject (item) { return (typeof item === "object" && !Array.isArray(item) && item !== null); }
-
-
What's a primitive?
-
What's an object (i.e. not a primitive)?
-
-
github.com github.com
Tags
Annotators
URL
-
-
trailblazer.to trailblazer.to
-
In production, you will never trigger one specific callback or a particular validation, only. Your application will run all code required to create a Song object, for instance. In Trailblazer, this means running the Song::Create operation, and testing that very operation with all its side-effects.
-
There’s no need to test controllers, models, service objects, etc. in isolation
-
Run the complete unit with a certain input set, and test the side-effects. This differs to the Rails Way™ testing style, where smaller units of code, such as a specific validation or a callback, are tested in complete isolation. While that might look tempting and clean, it will create a test environment that is not identical to what happens in production.
-
Integration tests for controllers: These Smoke tests only test the wiring between controller, operation and presentation layer.
-
Unit tests for operations: They test all edge cases in a nice, fast unit test environment without any HTTP involved.
-
Internally, it creates and returns a fresh, subclassed activity (via patching) whilst replacing the step for given :id. Be advised that this does not change the original activity class.
-
This helper allows you to mock any step within a given or deeply nested activities.
-
To skip processing inside :load_user and use a mock instead, use mock_step.
Tags
- the Trailblazer way
- testing: test the side effects
- testing: philosohy of testing
- testing: avoid unnecessarily testing things in too much isolation, in a different way than the code is actually used (should match production)
- isolation (programming)
- rails: the Rails way
- testing: mocking
- testing: fast test suite
- testing: unit tests
- testing: avoid testing implementation details
- object-oriented programming
- testing: integration tests
- unnecessary
- testing: tests should resemble the way your software is used
- testing: smoke tests
- subclassing/inheritance
Annotators
URL
-
-
store.steampowered.com store.steampowered.com
-
Meta gaming at its finest.
-
Make It Indie! is an indie game about making an indie game.
-
-
www.kickstarter.com www.kickstarter.com
-
www.kickstarter.com www.kickstarter.com
-
She asked me if I could create international universal design Shogi set for foreign Shogi fans.
-
Design SHOGI pieces have been redesigned with new iconography to indicate the piece’s movement.
-
Redesigning the pieces was very difficult work, because traditional pieces have 4 specialties below.
-
Shogi is a classic game. I know many people who want to play Shogi, but the Kanji on the pieces makes it too hard to master. I have designed this Shogi with icons so anybody can learn it easily.
-
If you want to try playing to see how these pieces work in the game, you can playtest it on the Iishogi.org site (https://lishogi.org/). Last year the Iishogi designer asked me to register the Design SHOGI pieces on their site. This Iishogi.org is a free to play Shogi website. I was willing to give them permission to use them. You are free to play and switch pieces design from the piece variation section. If you register your ID, then you can play vs the A.I. easily. You can learn how the Design SHOGI pieces work there.
-
-
boardgamegeek.com boardgamegeek.comShogi1
-
I am only interested in the universal designed Shogi, like https://www.kickstarter.com/projects/logygames/design-shogi
-
-
www.kickstarter.com www.kickstarter.com
-
-
Why Kickstarter? Where else am I going to get the money to manufacture my game? No seriously, if you have a better place I can get this kind of money, please send me a message and I will do that immediately.
-
Here is a pic of me "hard at work" (aka pretending to work while getting photographed)
-
-
github.com github.com
-
It can also be included as individual modules, i.e. Hashie::Extensions::MethodReader, Hashie::Extensions::MethodWriter and Hashie::Extensions::MethodQuery.
-
The MethodAccess extension allows you to quickly build method-based reading, writing, and querying into your Hash descendant.
-
-
github.com github.com
-
-
Using ::delegates works exactly like the Forwardable module in Ruby, with one bonus: It creates the accessors in a module, allowing you to override and call super in a user module or class.
-
Uber::Option implements the pattern of taking an option, such as a proc, instance method name, or static value, and evaluate it at runtime without knowing the option's implementation.
-
-
github.com github.com
-
supermodel
Tags
Annotators
URL
-
-
guides.rubyonrails.org guides.rubyonrails.org
-
These methods should be used with caution, however, because important business rules and application logic may be kept in callbacks. Bypassing them without understanding the potential implications may lead to invalid data.
-
-
trailblazer.to trailblazer.toTrailblazer33
-
Using multiple termini has three magnificent, beautiful advantages.
-
When nesting an activity with multiple outcomes, you can wire each terminus to a different route.
-
It is much easier to track what is going on within the activity. Instead of transporting additional state via ctx, you expose the outcome via an additional end event.
Note: It's only super easy to see what's going on if you have the benefit of a diagram.
-
You may communicate more than a binary outcome of an activity. For instance, a controller endpoint activity could have end events for success and failure, but also for “not authorized”, or “validation failed”. You’re not limited to a binary setup here.
-
we head straight into an additional terminus, or end event as it’s called in BPMN
no
-
For example, an output using Track(:create) will snap to the next possible task that is “magnetic to” :create. That’s how tracks or paths are created.
-
Semantics are mostly relevant for nesting
-
Having a closer look, you will see that putting “create user” on the failure track probably isn’t such a great idea, as it will also get invoked when #validate errors-out. It’s a good idea to introduce a new, separate path for handling new users.
-
Instead of connecting an output to a particular task, you can also choose to let it connect to a track. A track is created by taking a task’s output, retrieving its semantic, and then connecting it to the next available task that is “magnetic to” this semantic.
-
Having an understanding of higher level abstractions, such as tasks, activities and the historical code path taken, its debugging trace is much closer to how you, as an engineer, think about your code.
-
Remember, in a railway activity each task has two standard outputs with the “semantics” success and failure.
-
By using Output(:semantic), you can select an existing output of the task and rewire it.
-
Why don’t we put the “create user” task onto the failure track, and in case of successfully persisting the new user, we deviate back to the happy path?
-
This is my absolute favorite feature ever and the official reason for (re-)writing Trailblazer 2.1. It makes me happy every time I use it.
-
Trailblazer::Developer.wtf?(Signup, ctx)
-
Admittedly, both the signature and the return values of invoke feel a bit clumsy. That’s becaus we’re currently working with the low-level interfaces.
-
Originally designed to “only” implement railways for CRUD logic, we now use activities in many parts of Trailblazer itself
-
Instead of one big code pile, activities will gently enforce a clean, standardized way for organizing code.
-
the Activity component is the heart of TRB
-
To implement such an activity, we only need to rewire the second step’s failure output to a new terminus.
-
Since you can reference outputs by their semantic, you as a modeller only connect conceptual termini to ongoing connections!
-
it’s a bit as if the following wiring is applied to every task added via #step
-
This is where all our learnings about semantics, outputs, signals and the DSL come together.
-
Visualized, our new composed structure would look as follows.
-
Additionally, you may add debugging steps, error handler or rewire the conditions dynamically without touching the original snippet.
-
So why the over-complication? What we got now is replicating a chain of && in the former version. This time, however, you will know which condition failed and what went in by using tracing. Look at the trace above - it’s impossible to not understand what was going on.
-
signal.to_h[:semantic]
Why not just allow us to call
signal.semantic
? -
Suppose that the validate task was getting quite complex and bloated. When writing “normal” Ruby, you’d break up one method into several. In Trailblazer, that’s when you introduce a new, smaller activity.
-
Hey, that’s is an imaginary complication of our example - please don’t do this with every condition you have in your app.
-
To demonstrate that, we need to complicate out example application a bit.
-
Knowing about the wiring mechanics in Trailblazer is one thing. However, the real fun starts with nesting activities. That’s when the ideas of encapsulation, interfaces and reducing dependencies really come into play.
-
Nesting an activity into another is a bit like calling a library method from another method
-
the explicit modelling has one massive advantage: all possible outcomes of the nested activity are visible and have to be connected in the outer diagram
Tags
- clean/uncluttered code
- nice diagram
- extremes
- dogfooding
- good explanation
- convention
- terminus/end event
- separation of concerns
- strictly enforced rules/conventions: benefits
- where it shines / best application
- easy to follow/read/understand
- see content below
- why?
- clumsy interface/syntax
- clean code
- state management
- magic values
- semantic meaning
- pleasant/enjoyable to use
- low-level interface
- trailblazer-activity: wiring/outputs/tracks
- composition
- answer the "why?"
- self-reference
- good illustration (visual)
- trailblazer-activity: wiring/outputs: semantic
- good example
- easy to see/notice
- Trailblazer
- admit the limitations/shortcomings of your argument/benefits
- functions
- see content above
- Business Process Model and Notation
- good point
- easy to understand
- railway-oriented programming
- example: not how you would actually do it (does something wrong/bad/nonideal illustrating but we should overlook it because that's not the one thing the example is trying to illustrate/show us)
- splitting code/component/function into smaller pieces
- main/key/central/essential/core thing/point/problem/meat
- debugging tools
- funny
- non-binary
- complicated
- simplify
- coming up with hypothetical examples
- can we do even better?
- standardization
- artificial example
- conflation
- the Trailblazer way
- software design patterns
- nesting
- favorite
- not:
- analogy
- higher level of abstraction
- trailblazer-activity
- fun wording
- advantages/merits/pros
- putting it all together (building, learning, ...)
- good idea
- being explicit
Annotators
URL
-
-
github.com github.com
-
MIT License. Copyright 2020 Rafael França, Carlos Antônio da Silva. Copyright 2009-2019 Plataformatec.
-
Responders don't use valid? to check for errors in models to figure out if the request was successful or not, and relies on your controllers to call save or create to trigger the validations.
-
-
trailblazer.to trailblazer.toTrailblazer13
-
or even configure its taskWrap
-
Please note that the I/O DSL is only providing the most-used requirements. Feel free to use the low-level taskWrap API to build your own variable mapping with different scoping techniques.
-
You need to create a copy of the method or the class of your callable task in order to fix this and have two identical steps.
-
interferring
-
You don’t have to stick to the task interface! The [circuit interface] is a bit more clumsy, but gives you much better control over how ctx and signals are handled.
-
And trust us, we’ve been playing with different APIs for two years and this was the easiest and fastest outcome.
-
The circuit interface is a bit more clumsy but it gives you unlimited power over the way the activity will be run.
-
Using this interface empowers you to fully take control of the flow™.
-
Advanced features like tracing, input/output filters or type checking leverage the framework argument flow_options
-
Note that the :task option for step configures this element as a low-level circuit interface, or in other words, it will skip the wrapping with the task interface.
This bit me because I didn't realize that. Was getting error:
TypeError: no implicit conversion of Symbol into Integer
Finally checked
ctx
and found it was an array...At least this is documented here.
-
Do not fear those syntactical finesses unfamiliar to you, young padawan.
-
There’s no additional logic from Trailblazer happening here. The function returns a well-defined hash which is passed as an argument to step.
-
patch: -> { step Destroy.method(:tidy_storage), before: :delete_model }
Tags
- documentation
- trailblazer-activity: TaskWrap
- funny
- trade-offs
- caveat
- it's just _
- powerful
- typo
- extension API: ability to override/customize nested objects
- scope (programming)
- less-than-ideal workarounds
- clumsy interface/syntax
- please elaborate
- counterintuitive
- "trust us"
- how?
- wrapper (software)
- providing lower-level components/functions for cases where higher-level ones aren't customizable enough
- trailblazer-activity
- Ruby
- extension API
- nice API
- admit the limitations/shortcomings of your argument/benefits
- objects/hashes
- monkey patching
- configurable
Annotators
URL
-
-
github.com github.com
-
github.com github.com
-
First sighting (type: mention/link): https://hyp.is/3AMkJHumEeurpAsw_sA3nA/trailblazer.to/2.1/blog.html
Example that uses it: https://github.com/trailblazer/tutorial/blob/master/ruby/test/basics_test.rb
-
-
-
release 0.0.1 after around 5 years.
-
-
trailblazer.to trailblazer.to
-
A leaked snippet of the endpoint architectural design draft document, highly confidential.
-
we have a helpful little framework behind the page rendering that pulls code snippets from real tests out of the actual gems
-
Writing documentation for the new website has been fun. Yes, fun!
-
It almost feels unreal finishing up this release post. It’s been so long!
-
After around 3 years of silence, Trailblazer is back with its 2.1 release.
-
We have fully documented the migration path to 2.1 while upgrading several complex apps. It worked.
Tags
- documentation
- open-source software: progress seems slow
- nice diagram
- easy migration/upgrade path
- tongue-in-cheek
- documentation generator
- software design
- system architecture/design diagram/illustration
- making boring things fun
- automate the boring stuff
- work: fun
- software architecture
- see content above
Annotators
URL
-
-
github.com github.com
-
result["result.policy.default"].success?
-
The guard name defaults to default and can be set via name:. This allows having multiple guards.
-
the guard can also be a Callable-marked object
elaborate...
-
The Model macro literally does what our model! step did.
That information is not generally relevant. Only makes sense for someone who actually knew about or used the old interface.
The docs shouldn't assume you are an experienced user / a user of the previous version.
Would have been appropriate in a Changelog entry or announcement, but not in the general docs.
-
-
blog.mozilla.org blog.mozilla.org
-
Our new feature, Total Cookie Protection, works by maintaining a separate “cookie jar” for each website you visit. Any time a website, or third-party content embedded in a website, deposits a cookie in your browser, that cookie is confined to the cookie jar assigned to that website, such that it is not allowed to be shared with any other website.
-
-
www.kickstarter.com www.kickstarter.com
-
Vision-based combat. The success of a ninja action is solely based on guards’ vision.
-
-
-
www.amazon.com www.amazon.com
-
-
github.com github.compry/pry1
-
you can use the wtf? command to display a few lines of the backtrace for the most recent exception
-
-
trailblazer.to trailblazer.to
-
The flow pipetree is a mix of the Either monad and “Railway-oriented programming”, but not entirely the same.
-
The absence of a method name here is per design: this object does only one thing, and hence what it does is reflected in the class name.
-
-
store.steampowered.com store.steampowered.com
-
2021年の旧正月セールで買いました。まだすべてのステージをクリアしてはいないのですが、30分ほど遊んだところで良いところ・悪いところが見えてきたのでひとまず日本人がレビュー一番乗りです。良いところ・グラフィックは無機質ですが悪くないと思います・音楽も自己主張しすぎず、アクションを盛り上げる感じで悪くはないです気になるところ・WASDで動けるのですが動きが半端にバイオハザードみたいなラジコン操作感があり、ちょっと気に食わないですただ、これは個人の感想の範疇ですね・ジャンプの性能は低く、距離ぎりぎりを要求されます。これは慣れですね悪いところ・ウォールランや動く壁といったギミックがありますが、これらの調整がとにかくできていません。特に斜め移動などでは自動で高度の調整が入るのですが、始点で普通につかまっているのに終点で床の下に潜り込んだり、果ては床のない場所にズレたりします。パルクール的なゲーム性を損ない、ものすごいストレスとなります。以上です。パルクールアクション的なものを期待して購入し、実際予想通りのゲーム性でした。しかし残念ですが自分にとっては上記の悪いところがとにかくストレスとして感じられます。買った以上はクリアまでは進めたいですが、他人におすすめはできません。
I bought it at the 2021 Chinese New Year sale. I haven't cleared all the stages yet, but after playing for about 30 minutes, I could see the good and bad points, so for the time being, the Japanese are the first to review.
Good point ・ The graphics are inorganic, but I don't think they are bad. ・ The music is not too self-assertive, and it's not bad because it makes the action exciting.
Where to worry ・ I can move with WASD, but the movement is odd and there is a feeling of radio control operation like biohazard, so I do not like it a little. However, this is a category of personal impressions. ・ Jump performance is low, and it is required to be close to the distance. This is familiar
bad place -There are gimmicks such as wall runs and moving walls, but these adjustments have not been made anyway. Especially when moving diagonally, the altitude is automatically adjusted, but even though it is normally held at the start point, it may slip under the floor at the end point, or it may shift to a place without a floor. It spoils the parkour-like gameplay and causes tremendous stress.
that's all. I bought it in anticipation of something like parkour action, and the game was actually as expected. But unfortunately, the above bad points are stressful to me anyway. As long as I bought it, I would like to proceed to clear it, but I cannot recommend it to others.
-
-
store.steampowered.com store.steampowered.com
-
a strategy game for me is mostly about the mechanics and the replayability. I love good art and design, but function follow form!
-
-
www.kongregate.com www.kongregate.com
-
This game runs on Flash. Effective Jan. 12, 2021, Adobe (the company that made Flash) began blocking its use everywhere. This is unfortunate, but outside of Kongregate's control.
-
-
store.steampowered.com store.steampowered.com
-
He also upped the price for every one of his games back in march 2019 up to 1000%! so his 90% discounts back to the original price would look better.
-
-
store.steampowered.com store.steampowered.com
-
If you get this game for some reason, it's worth mucking around in for 20 minutes or so, but you probably shouldn't buy this on purpose.
-
- Feb 2021
-
store.steampowered.com store.steampowered.com
-
Hard hat tester, Ray,
Hard hat tester Ray has ...
-
-
www.reddit.com www.reddit.com
-
store.steampowered.com store.steampowered.com
-
[0.4] Controls & Training & Help[0.2] Menu & Settings[0.2] Sound & Music[0.1] Graphics[0.2] Game Design[0.3] Game Story[0.2] Game Content[0.4] Time to complete feels ok? (& if the Game can be repeatedly played again)[0] is it Enjoyable & Fun?[0] Could it hold a spot in Favorites?[0] BONUS point: Multi-Player related[0] BONUS point: Review for VR
-
-
www.steamtrades.com www.steamtrades.com
-
The games above are only a suggestion, I will analyze any offer.
-
-
steamcommunity.com steamcommunity.com
-
To whom did you sell your keys and at what kind of rates? https://steamcommunity.com/id/playa131 for example resells them and might be the source for DIG's purchases.
-
Indiegala is mentioned because it was a legitimate mutually signed contractual agreement as far as previous business is concerned.
-
Do you have collaborators who could have generated keys and sold them on their own? DIG's Steam keys and other stores' Steam keys must have some source, after all. Keys don't generate themselves, and only your accounts should be able to request them.This particular game was in Bunch Keys Indie Wizardry Bundle. I assume you had a proper contract for that. Maybe DIG or an intermediary bought 50-200 copies of it?
-
It isn't stealing because you or an associate must have generated and given them the keys in some way or another?Ideally you would ask a DIG bundle buyer to show you their key for your game, so you can figure out what key request batch it came from, and then you can scratch your head and wonder who you gave those keys to and what journey they took afterwards.
-
-
www.priceintelligently.com www.priceintelligently.com
-
For years, retailers, no matter what time of day or year, have offered sales and advertisements that lure bargain-drooling customers in the doors.
-
Retailers use a combination of promotional pricing, fake pricing, and price anchoring to form a comprehensive psychological pricing strategy that creates a pricing trigger that minimizes the sales cycle significantly
-
For instance, when faced with a 60% off, 12 hour only coupon that reduces a $1,200 winter coat to $400, you can’t help but rush to the store to buy it, even if it is 95 degrees out. A few things are happening here. For one, the $1200 acts as an anchor price that psychologically forces you to realize you’re getting an enormous deal at the $400 price point. Plus, the promotion limiting the time the offer is available forces you into an impulse.
-
So, where did J.C. Penney go wrong? Well, while we admire their attempt to change, they attempted to destroy over a century’s worth of price conditioning consumers have been through with department stores and pricing in general. They weren’t completely off base, as consumers with more and more access to information (comparison shopping engines, consumer reports, etc.), are beginning to realize that the value of products is determined much differently than a sticker would suggest. Yet, assuming that most soccer moms (and dads) wouldn’t fall prey to the colorful print ads tucked within the comics section in the Sunday paper, overlooks how much the majority of consumers value “winning” the retail game. Simply, deflating the perceived value causes customers to value the actual product less.
-
Almost no one ever pays full price. In fact, studies show that people are much more inclined to pay $25 for an item valued at $50, than paying for the same item without a sale at $25. It’s all about the “price framing” of a product that creates a perceived value, which all leads to the excitement of getting a good deal
-
-
www.reddit.com www.reddit.com
-
This is Fantatical's annual "Bundlefest" so in this case it's just timing. They'll do this once a year and we just so happened to have a bundle with them not too long ago. It's not something we typically do.
-
Apologies: it's hyperbole. The parent site has a bunch of "spend x to get one of y Steam games" deals, which is what I was referring to. it was not meant literally. Just an attempt to build common ground with the poster who was talking about gambling and fomo.I thought they were referencing the larger site, so I wanted to acknowledge that so I didn't come off as dismissive of their concerns.Which turned out to be entirely separate concerns! Obviating the reason for the comment in the first place.Anyway, sorry for the short novel. But that's the danger of pithy one-liners: assumed context for the poster can be entirely lost in translation.Thanks for coming to my public apology press release?
-
Anyway, sorry for the short novel. But that's the danger of pithy one-liners: assumed context for the poster can be entirely lost in translation.
-
Eh, that's just sales. Humans are dumb, panicky animals: just look at how J.C. Penny's "Fair and Square" initiative went.Short version: they went full-on no bullshit: no limited time sales, no fake prices discounted, things cost what they cost, no more FOMO, no waiting for deals.It tanked. Horribly.
-
Why do companies insist on making deals a gamble? Is it basically just to capture FOMO sales?Both rhetorical questions.Edit: I'm talking about how you can pay one price for a deal and then a couple months later it's even cheaper.
-
-
store.steampowered.com store.steampowered.com
-
I went by the reviews and now i am seeing a pattern on STEAM where even good reviews are bought and paid for and not really player revews and that actuallly watching game play from google will be my best option in the future. AGAIN don;t trust bought and paid for reviews from STEAM....I just learned and realised this now
-
-
github.com github.com
-
It is based on the idea that each validation is encapsulated by a simple, stateless predicate that receives some input and returns either true or false.
-
URI::MailTo::EMAIL_REGEXP
First time I've seen someone create a validator by simply matching against
URI::MailTo::EMAIL_REGEXP
from std lib. More often you see people copying and pasting some really long regex that they don't understand and is probably not loose enough. It's much better, though, to simply reuse a standard one from a library — by reference, rather than copying and pasting!! -
It will return the result as a Dry::Monads::Result object which can be either successful or failure.
-
-
trailblazer.to trailblazer.toTrailblazer12
-
To understand this helper, you should understand that every step invocation calls Output() for you behind the scenes. The following DSL use is identical to the one [above]. class Execute < Trailblazer::Activity::Railway step :find_provider, Output(Trailblazer::Activity::Left, :failure) => Track(:failure), Output(Trailblazer::Activity::Right, :success) => Track(:success)
-
In combination with [Track()], the :magnetic_to option allows for a neat way to spawn custom tracks outside of the conventional Railway or FastTrack schema.
Instead of
magnetic_to:
, I propose wrapping the steps that are on a separate track in something like...DefTrack do :paypal do step :charge_paypal end
or
paypal_track = RailwayTrack do :paypal do step :charge_paypal end
so we can reference it from outputs, like we can with tracks created with
Path
helper. -
The Subprocess macro will go through all outputs of the nested activity, query their semantics and search for tracks with the same semantic.
-
For branching out a separate path in an activity, use the Path() macro. It’s a convenient, simple way to declare alternative routes
Seems like this would be a very common need: once you switch to a custom failure track, you want it to stay on that track until the end!!!
The problem is that in a Railway, everything automatically has 2 outputs. But we really only need one (which is exactly what Path gives us). And you end up fighting the defaults when there are the automatic 2 outputs, because you have to remember to explicitly/verbosely redirect all of those outputs or they may end up going somewhere you don't want them to go.
The default behavior of everything going to the next defined step is not helpful for doing that, and in fact is quite frustrating because you don't want unrelated steps to accidentally end up on one of the tasks in your custom failure track.
And you can't use
fail
for custom-track steps becase that breaksmagnetic_to
for some reason.I was finding myself very in need of something like this, and was about to write my own DSL, but then I discovered this. I still think it needs a better DSL than this, but at least they provided a way to do this. Much needed.
For this example, I might write something like this:
step :decide_type, Output(Activity::Left, :credit_card) => Track(:with_credit_card) # Create the track, which would automatically create an implicit End with the same id. Track(:with_credit_card) do step :authorize step :charge end
I guess that's not much different than theirs. Main improvement is it avoids ugly need to specify end_id/end_task.
But that wouldn't actually be enough either in this example, because you would actually want to have a failure track there and a path doesn't have one ... so it sounds like Subprocess and a new self-contained ProcessCreditCard Railway would be the best solution for this particular example... Subprocess is the ultimate in flexibility and gives us all the flexibility we need)
But what if you had a path that you needed to direct to from 2 different tasks' outputs?
Example: I came up with this, but it takes a lot of effort to keep my custom path/track hidden/"isolated" and prevent other tasks from automatically/implicitly going into those steps:
class Example::ValidationErrorTrack < Trailblazer::Activity::Railway step :validate_model, Output(:failure) => Track(:validation_error) step :save, Output(:failure) => Track(:validation_error) # Can't use fail here or the magnetic_to won't work and Track(:validation_error) won't work step :log_validation_error, magnetic_to: :validation_error, Output(:success) => End(:validation_error), Output(:failure) => End(:validation_error) end
puts Trailblazer::Developer.render o Reloading... #<Start/:default> {Trailblazer::Activity::Right} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=validate_model> #<Trailblazer::Activity::TaskBuilder::Task user_proc=validate_model> {Trailblazer::Activity::Left} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=log_validation_error> {Trailblazer::Activity::Right} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=save> #<Trailblazer::Activity::TaskBuilder::Task user_proc=save> {Trailblazer::Activity::Left} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=log_validation_error> {Trailblazer::Activity::Right} => #<End/:success> #<Trailblazer::Activity::TaskBuilder::Task user_proc=log_validation_error> {Trailblazer::Activity::Left} => #<End/:validation_error> {Trailblazer::Activity::Right} => #<End/:validation_error> #<End/:success> #<End/:validation_error> #<End/:failure>
Now attempt to do it with Path... Does the Path() have an ID we can reference? Or maybe we just keep a reference to the object and use it directly in 2 different places?
class Example::ValidationErrorTrack::VPathHelper1 < Trailblazer::Activity::Railway validation_error_path = Path(end_id: "End.validation_error", end_task: End(:validation_error)) do step :log_validation_error end step :validate_model, Output(:failure) => validation_error_path step :save, Output(:failure) => validation_error_path end
o=Example::ValidationErrorTrack::VPathHelper1; puts Trailblazer::Developer.render o Reloading... #<Start/:default> {Trailblazer::Activity::Right} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=validate_model> #<Trailblazer::Activity::TaskBuilder::Task user_proc=validate_model> {Trailblazer::Activity::Left} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=log_validation_error> {Trailblazer::Activity::Right} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=save> #<Trailblazer::Activity::TaskBuilder::Task user_proc=log_validation_error> {Trailblazer::Activity::Right} => #<End/:validation_error> #<Trailblazer::Activity::TaskBuilder::Task user_proc=save> {Trailblazer::Activity::Left} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=log_validation_error> {Trailblazer::Activity::Right} => #<End/:success> #<End/:success> #<End/:validation_error> #<End/:failure>
It's just too bad that:
- there's not a Railway helper in case you want multiple outputs, though we could probably create one pretty easily using Path as our template
- we can't "inline" a separate Railway acitivity (Subprocess "nests" it rather than "inlines")
-
Subprocess will try to match the nested ends’ semantics to the tracks it knows. You may wire custom ends using Output.
-
A nested activity doesn’t have to have two ends, only.
-
class Charge < Trailblazer::Activity::Path # ... step :validate step :decide_type, Output(Activity::Left, :credit_card) => Path(end_id: "End.cc", end_task: End(:with_cc)) do step :authorize step :charge end step :direct_debit end
if you want to copy and paste to console:
module Trailblazer class Charge < Trailblazer::Activity::Path # ... step :validate step :decide_type, Output(Activity::Left, :credit_card) => Path(end_id: "End.cc", end_task: End(:with_cc)) do step :authorize step :charge end step :direct_debit end end
puts Trailblazer::Developer.render a #<Start/:default> {Trailblazer::Activity::Right} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=validate> #<Trailblazer::Activity::TaskBuilder::Task user_proc=validate> {Trailblazer::Activity::Right} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=decide_type> #<Trailblazer::Activity::TaskBuilder::Task user_proc=decide_type> {Trailblazer::Activity::Right} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=direct_debit> {Trailblazer::Activity::Left} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=authorize> #<Trailblazer::Activity::TaskBuilder::Task user_proc=authorize> {Trailblazer::Activity::Right} => #<Trailblazer::Activity::TaskBuilder::Task user_proc=charge> #<Trailblazer::Activity::TaskBuilder::Task user_proc=charge> {Trailblazer::Activity::Right} => #<End/:with_cc> #<Trailblazer::Activity::TaskBuilder::Task user_proc=direct_debit> {Trailblazer::Activity::Right} => #<End/:success> #<End/:success>
-
step :direct_debit
I don't think we would/should really want to make this the "success" (Right) path and :credit_card be the "failure" (Left) track.
Maybe it's okay to repurpose Left and Right for something other than failure/success ... but only if we can actually change the default semantic of those signals/outputs. Is that possible? Maybe there's a way to override or delete the default outputs?
-
Using Track() with a new track semantic only makes sense when using the [:magnetic_to option] on other tasks.
-
Defaults names are given to steps without the :id options, but these might be awkward sometimes.
Why would those default names ever be awkward?
If you the default name is whatever comes after
step
:step :default_name
then why can't you just change that name to whatever you want?
To answer my own question: I think you can do that, as long as the name is the 1st argument to
step
. But below I noticed an example where aSubprocess
was the 1st argument instead, and so it needs a name in this case:step Subprocess(DeleteAssets), id: :delete_assets
Why are they inconsistent about calling it name or id? Which one is it? I guess it's an id since that's what the key is called, and since there's an
Id()
helper to reference a task by its id. -
Patching has no implicit, magical side-effects and is strongly encouraged to customize flows for a specific case in a quick and consise way.
-
However, it can be a PITA if you want to customize one of those deeply nested components and add or remove a certain step, for example.
Tags
- feels wrong
- monkey patching
- concise
- side effects
- helper functions
- DSL
- flexibility
- caveat
- non-binary
- no arbitrary limitation
- makes sense to me
- unintuitive
- important point
- equivalent code
- powerful
- can we do even better?
- useful
- no magic
- extension API: ability to override/customize nested objects
- extension API: patching
- customizable
- tip
- example: in order to keep example concise/focused, may not implement all best practices (illustrates one thing only)
- I don't understand
- demystified
- technical details
- I have a question about this
- semantics
- trailblazer-activity
- verbose / noisy / too much boilerplate
- nice API
- official preferred convention / way to do something
- being explicit
- confusing
- example: not how you would actually do it (does something wrong/bad/nonideal illustrating but we should overlook it because that's not the one thing the example is trying to illustrate/show us)
- automatic
Annotators
URL
-
-
github.com github.com
-
Since we're not passing any inputs to ListAccounts, it makes sense to use .run! instead of .run. If it failed, that would mean we probably messed up writing the interaction.
-
-
trailblazer.to trailblazer.to
-
You’re free to test this activity in a separate unit test.
-
# Yes, you can use lambdas as steps, too! step ->(ctx, params:, **) { params.is_a?(Hash) }
-
User.init!(User.new("apotonick@gmail.com"))
That's not valid ActiveRecord. To be consistent with your example, it probably should be...
-
The fact we’re using ActiveRecord (or something looking like it) doesn’t mean Trailblazer only works with Rails! Most people are familiar with its API, so we chose to use “ActiveRecord” in this tutorial.
-
Keyword arguments allow to define particular parameters as required. Should the parameter be missing, they also provide a way to set a default value. This is all done with pure Ruby.
-
-
2019.trailblazer.to 2019.trailblazer.to
-
Currently, only Right signals are wired up.
So what happens if a task returns a Left signal?? Will it still go Right? Will it error?
-
-
trailblazer.to trailblazer.to
-
The sole purpose to add Dev::Trace::Inspector module is to make custom inspection possible and efficient while tracing. For example, ActiveRecord::Relation#inspect makes additional queries to fetch top 10 records and generate the output everytime. To avoid this, Inspector will not call inspect method when it finds such objects (deeply nested anywhere). Instead, it’ll call AR::Relation#to_sql to get plain SQL query which doesn’t make additional queries and is better to understand in tracing output.
-
Please note that this is a higher-level debugging tool that does not confront you with a 200-lines stack trace the way Ruby does it, but pinpoints the exceptional code and locates the problem on a task level. This is possible due to you structuring code into higher abstractions, tasks and activities.
-
-
trailblazer.to trailblazer.to
-
They are an abstraction that will save code and bugs, and introduce strong conventions.
-
WE ARE CURRENTLY WORKING ON A UNIFIED API FOR ERRORS (FOR DRY AND REFORM).
-
-
store.steampowered.com store.steampowered.com
-
At the request of the publisher, Tales of Monkey Island Complete Pack: Chapter 2 - The Siege of Spinner Cay is unlisted on the Steam store and will not appear in search.
-
-
store.steampowered.com store.steampowered.com
-
I think one thing would have been a solution to basically everything here: Player created maps. As Im involved in many modding communities, I know for a fact that player created content can be vital in making games last so much longer, and the quality can shoot for the stars, Player created maps would have been fantastic for this game.
-