The Art of Chunking!!

How to make sense of any mess? 

Chunking makes content easier to comprehend and remember. It helps to understand the relationship between content elements and information hierarchy. By grouping each piece into a large whole, you can improve the amount of information you can remember. Chunking is one way to your product to stand out from the other competitors.

For example, a chunked phone number (+61–955–345–1234) is easier to remember (and scan) than a long string of un-chunked digits (9553451234).

Why chunking is important in UX?

Chunking Content in UX: Why chunking is important in UX?

Chunking is a concept that originates from the field of cognitive psychology. UX professionals can break their text and multimedia content into smaller chunks to help users process, understand, and easily remember within a quick span.

Presenting content in chunks makes scanning easier for the user and can improve their ability to comprehend and remember it. In practice, chunking is about creating meaningful, visually distinct content units that make sense in the context of the larger whole.

 

Key info is chunked to give clarity about the company.

Simply chunking your text isn’t enough — you also need to support scanning by making it easy to quickly identify the main points of the chunks. Some of the most commonly used methods of chunking text content are:

  1. Headings and subheadings that clearly contrast with the rest of the text (bolder, larger, etc.)
  2. Highlighted keywords (bold, italic, etc.)
  3. Bulleted or numbered lists
  4. A short summary paragraph for longer sections of text, such as articles
  5. Short paragraphs, with white space to separate them
  6. Short text lines of text (around 50–75 characters)
  7. Clear visual hierarchies with related items grouped together
  8. Distinct groupings in strings of letters or numbers such as passwords, license keys, credit card or account numbers, phone numbers, and dates (for example, 14487324534 vs 1 (448) 732 4534)

 

The contents are chunked with an illustration to give clear visual hierarchy!

The Mythical Number Seven:

Magical number seven,’ made famous by cognitive psychologist George Miller. In 1956, Miller found that most people can remember about 7 chunks of information in their short-term memory. People could remember 7 individual letters, or 28 letters if they were grouped into 7 four-letter words in a meaningful way. Designers often misunderstand the concept of Mythical Number Seven.

It doesn’t mean to give the things not more than seven to the user. Even they can still find easy to use with more than seven things at the given time.

 

Chunked infographics draw attention to the passed value here.

For UX professional, the real takeaway from Miller’s is that people with short-term memory are limited. So, if you want the people to remember more information just group them into Chunks.

Source: https://www.nngroup.com/articles/chunking/

Conclusion:

Presenting content in chunks makes scanning easier for the users and can improve their ability to comprehend and remember it.

Understanding CSS: Precedence & Specificity

Have you faced a situation where you are trying to apply the CSS style to an element, but it does not apply? It seems the webpage is ignoring your code. This could be caused by conflicts in the cascade order.

Things will discuss here:

  1. Origins of Stylesheets
  2. Specificity
  3. Importance
  4. Cascade Order

Origins of stylesheets:

  1. Author stylesheet (Styles set by the web developers)
  2. User stylesheet (Custom styles set by a user – Browsers give you the option of extending the browser’s default style sheet)
  3. Browser stylesheet / User-agent style sheet (Browser defaults – if the author of a web page didn’t apply any styling, the styling details present in the default stylesheet installed within the browser is applied)

Specificity:

        An HTML element can be targeted by multiple CSS rules. If there are two or more conflicting CSS rules, the browser will apply the rule which is more specifically mentioned. Specificity will only apply when one element has multiple declarations to it. To understand in a better way, the specificity is expressed in the form (a, b, c, d). Lets see in detail,

Specificity Hierarchy (High to Low):

  • Inline style

o   ‘style’ attribute rather than a rule with a selector

o   The position ‘a’ – (a, b, c, d) – (1, 0, 0, 0)

  • ID Selectors

o   Eg. The element with id attribute, id=’example’(#example)

o   The position ‘b’ – (a, b, c, d) – (0, 1, 0, 0)

  • Class Selectors(.example), Attribute selectors([type=radio]) and pseudo-classes(:hover)

o   The position ‘c’ – (a, b, c, d) – (0, 0, 1, 0)

  • Type Selectors(h1) and pseudo-elements (::after)

o   The position ‘d’ – (a, b, c, d) – (0,0,0,1)

Example:

Selectors Specificity
*{ } 0,0,0,0
li{ } 0,0,0,1
li:first-line { }   0,0,0,2
ul li{ }   0,0,0,2
ul ol+li{ } 0,0,0,3
h1 + *[rel=up]{ } 0,0,1,1
ul ol li.red  { } 0,0,1,3
li.red.level  { } 0,0,2,1
#exampleId{ } 0,1,0,0
style=”” 1,0,0,0

No Specificity:

  1. The universal selector (*,+, -,>, ~) has no specificity value.
  2. The pseudo-class :not() adds no specificity. The negation ‘ pseudo-class: not’ is not considered a pseudo-class in the specificity calculation. It counts as normal selectors

Origin Hierarchy:

Below is the priority order from highest to lowest for normal styles when there is equal specificity for the declarations. If it was an important style (! important), it is just the reverse.

  1. Author style sheet
  2. User style sheet
  3. User-agent (browser) stylesheet

Importance:

  1. Normal declaration (p {color: red} )
  2. Important declaration (p {color: red !important} )

!important

The !important value appended in a declaration along with the property value in any of the ruleset/rules will be taken as the most priority even if the rule has less specificity.

Override !important:

Either add Specificity to the declaration or have only one !important declaration, remove others.

Cascade Order:

        The cascading order depends on origin, specificity, importance and source order. Below is the precedence order from low to high,

  1. Declarations in user agent style sheets (e.g. the browser’s default styles, used when no other styling is set).
  2. Normal declarations in user style sheets (custom styles set by a user).
  3. Normal declarations in author style sheets (these are the styles set by the web developers).
  4. Important declarations in author style sheets
  5. Important declarations in user style sheets

Note:

  • Declaration with Same Importance and Same-Origin: More specific selectors will override more general ones
  • Source Order – Declaration with the Same Importance, Same Specificity, and Same-Origin: the later rule takes precedence

Best Practices:

  • Use Class selectors instead of ID selectors.
  • Avoid using multiple CSS rules that target the same HTML elements.
  • Do not use inline styles.
  • Use specificity before even considering !important .
  • Although ‘!important’ works, it is generally bad practice. It can make debugging a difficult process
  • Only use !important on page-specific CSS that overrides foreign CSS (from external libraries, like Bootstrap or normalize.css).

Reference:

1) https://www.w3.org/TR/2011/REC-CSS2-20110607/cascade.html#cascade
2) https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity
3) https://css-tricks.com/precedence-css-order-css-matters/
4) https://vanseodesign.com/css/css-specificity-inheritance-cascaade/
5) https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Cascade_and_inheritance
6) http://tutorials.jenkov.com/css/precedence.html

Learn RxJS in 1 Blog…(Disclaimer: Javascript basics are highly recommended)

RxJS (stands for Reactive Javascript) is actually a well-known library that is used to handle asynchronous calls with multiple events. There are plenty of other reactive libraries written in other platforms. Some of them are RxJava, Rx.NET, UniRx, RxScala, RxClosure, RxCpp, RxPY, RxDart, RxNetty, RxAndroid, RxCocoa etc.

Sample RxJS Implementation:

const interval = new Observable(observer => {

 let count = 0;

 const interval = setInterval(() => {

   observer.next(count++);

 }, 1000);

 // once we stop listening to values clear the interval

 return () => {

   clearInterval(interval);

 }

});

interval.subscribe(value => console.log(value));

// —-1—-2—-3—->

The functional units of RxJs are,

Observable:

Observables are collections of a stream of values or events. It can hold either synchronous or asynchronous stream of values or events.

Observer:

After fetching the necessary values from observables, callbacks are implemented to perform the required actions based upon the values. These set of collections of callbacks are called observers.

Subscription:

Subscription is the way to return the value when the asynchronous function is completed.

Operators:

RxJs Operators can be considered as Lodash for events. It provides the ease of RxJS implementations through enabling functional programming.

Subject:

A subject is simply a unit that can act as both Observable and Observer simultaneously.

Schedulers:

Schedulers help us to define in what execution way does an observable deliver its values to the observer.

Basically, the RxJs Observables can be compared with Promises in a better way as they have the major similarities.

Reference Links:

A dive into “Vuex” !

Let’s meet our hero – “The Vuex”!

Vuex is a state management library that is used commonly in vue.js. But why do we use it? Vuex is very much useful in passing the data from one component to another component.

We can pass data from the parent component to child component using props, but when the child component has many nested siblings, the data passing between the child components becomes difficult and that’s where “Vuex” comes into play !!

Store :

A store is a global object that keeps track of all the state changes of the app across the components.

But what makes it different from other objects?

  • Vuex stores are reactive – every state changes are updated efficiently in the store
  • Vuex stores are read-only – It is not possible to change the state properties directly in the store. The only way to change a store’s state is by explicitly committing mutations.

We can create a store by creating an instance of vuex like :

const store = new Vuex.Store({ state: {} })

In order to integrate vuex with vue, we have to add the store in the vue instance by :

const App = new Vue({ store })

In order to keep track of the state changes, we have to access the state in the “computed” property in vue component

Now we have created a store, but how do we access the store data?

We access the store by the following methods :

  • Mutations
  • Getters
  • Actions

Mutations :

These are functions used to update the state. They behave like events and we have to use “commit” in order to invoke them.

To be clear, we define the mutation by :

const store = new Vuex.Store({

mutations: {

  yourMutationFunction (state, payload) => {

     }

   }

});

We invoke the above mutation by:

this.$store.commit(MUTATION_NAME, {payloadData});

Getters :

Applicable to a scenario where we have to get a value from the store that is obtained by manipulating the state data, then we use “Getters”. Having these manipulations in the store makes the “Getters” reusable in other components as well.

Getter functions are created by :

const store = new Vuex.Store({getters: { yourGetterFunction : (state) => ( ) } });

And we invoke the getters by,

this.$store.getters.yourGetterFunction

We also have a helper method called “mapGetters” to invoke a getter function in the component.

Example :

import { mapGetters } from ‘vuex’

export default {
 // some code ..
 computed: {
   …mapGetters([   // we use spread operator to append the mapGetters to the computed object
    ‘yourGetter’
   ])
 }
}

But when we have no manipulation in the state, we have to use mapState helper to fetch the data in the store directly from the store.

computed: {

  …mapState([‘yourStateName’]);

}

Actions :

They are generally functions, that is invoked to perform some backend calls or any other asynchronous operations before mutations. Actions keep track of the mutation changes correctly in case of asynchronous operations.

actions: {
 yourActionMethod({ commit }) {
   commit(‘mutationMethod’)
 }
}

Actions are invoked by dispatching them using store object or mapActions helper function

Example :

   this.$store.dispatch(‘actionName’)

Or in components by :

methods: {
   …mapActions([‘actionName’])

}

Thus, the flow for the state from component to store will be like :

Sources :

We are reviewed on Clutch!

Squash Apps Receives 5-star Ratings for Development Services!

We are proud to announce our partnership with Clutch, the leading B2B ratings, reviews and research platform. Clutch lists over 7,000 IT companies all around the world in over 500 industries. The ratings platform helps potential buyers find in-depth testimonials in order to find the best fit software developers, UI/UX designers, and web developers for their next projects.

We’re extremely happy to announce the amazing feedback that has been received by some of our most esteemed clients. With 4 reviews, Squash Apps has a close to perfect score. Our clients have been saying the most delightful things about our services on Clutch, commending Squash Apps for our outstanding communication skills, our flexibility and our superior technology skills.

Their team is extremely proactive in finding alternatives or solutions to obstacles….Squash Apps understood our direction and asked for clarification when needed”– CEO, StayLocal.co

They come highly recommended.” – Partner, 707 Ventures

I don’t know how many projects they have going on, but they give me the feeling as if my project is the only project they’re working on.” – CEO, Shelly Apps

Based on the feedback received, Squash Apps is listed amongst the top software development companies in India on Clutch’s sister site, The Manifest. Our team prides themselves on building the cleanest code possible while completely avoiding any and all shortcuts to ensure that our clients get the highest quality of work. Our top priority is keeping our clients happy with low costs and high quality service.

We like to develop a relationship with our clients so that we can help them maximize the potential in every project. When we work with our clients, communication is the most important tool. We place a strong emphasis on consistent and clear communication so that there is never any confusion at any time. I think you’ll see that commitment if you check out our extensive profile on Clutch.

If you’d like to learn more about our highly rated services, make sure to check out our website and contact us for any inquiries.

Mobile App Patenting

 

23435005_1543530655758030_8880005081137232381_n

Mobile Apps are the ‘In’ thing and have been for young developers. College kids, and even some school kids these days are trying their hand at developing mobile apps, and they’re doing a great job too! Another reason for this flurry of mobile applications is because they are so great for business! So, if you are someone who’s got an idea for a Mobile App, then make it your own by patenting it! It is a lengthy process, but it is worth it! So, let’s go through the steps quick!

So, the first question is, can you just patent an idea? Well, not really. You must know the ins and out of your App, how everything works. So much so that you should be able to educate anyone about it. Also, know that you cannot patent the code of your app. The code itself falls under the category of law covered by copyrights. (And that is a whole other article there, we tell you!)

What you can patent your App under the categories of “method” or “process.” Methods and processes can be patented, along with machines, articles of manufacture, and compositions of matter.

So, first things first. You need to research on whether your App is eligible for patenting. There are a so many apps available, hundreds of thousands!

Just because apps can, in general, be patented, this doesn’t necessarily mean that your app is eligible for the patent. So, basically, you need to determine whether you somebody else has patented the same type of app. The USPTO (US Patent & Trademark Office) recommends performing a patent search before attempting to file a patent. Be sure to search for any related keywords, especially ones that would-be core to what makes the app work. Note that this does not ensure safety against being sued for patent infringement. The USPTO does not ensure that. So, plenty of research is necessary!

And finally, your patent must qualify as “useful, and by useful, we mean, it should work at least in theory. It is what requires you to develop a very concrete and detailed explanation of precisely how your app works, rather than just claiming ownership over an app that accomplishes some general task without needing to know how.

So, this is the basic idea you should have before you even begin the process of filing for a Patent. So, we’ll cover that part in another article, while your mind stews on this! Good Day Mobile people!

 

Tech Wars – Apple vs Qualcomm

23472303_1543529659091463_8009714013245635611_nWhat happens when tow giants decide to sue and countersue each other? Well, they generate a lot of news, and lose a lot of money, and give stuff to talk about for everyone! The two giants in question here are none other than Qualcomm and Apple. Yes, we’re excited too, and yes, it’s going to go on for years! So, let’s get the ground work done, and we’ll let you know what’s happened till date!

We all know Qualcomm’s processors, or better yet, their modems are key for any LTE-connected device in today’s world. Also, it is known that Qualcomm’s modems are the only ones on the market capable of supporting data transfers up to gigabit speed. Additionally, along with the high quality of the radios, Qualcomm is also the only company that licenses the CDMA technology that Sprint and Verizon use for their 2G and 3G networks.

So where did it all begin?  Well, earlier this year, Apple and Qualcomm began a legal battle over Fair, Reasonable and Non-Discriminatory (FRAND) patents that stated Qualcomm was charging unreasonable sums for patents essential to cellular technology. Qualcomm followed that up with a claim to the U.S. International Trade Commission (ITC) stating Apple infringed on six of Qualcomm’s patents. Whew! And that’s not all.

According to Qualcomm, Apple has stolen patents and, so they filed paperwork to ban both the sale and the manufacturing of the popular smartphone in China. A spokeswoman from Qualcomm was heard saying “Apple employs technologies invented by Qualcomm without paying for them,” noting that the iPhone’s power management and Force Touch features are just “a few examples of the many Qualcomm technologies that Apple uses to improve its devices and increase its profits.”

Apple had another spokesman saying, “In our many years of ongoing negotiations with Qualcomm, these patents have never been discussed. Like their other courtroom manoeuvres, we believe this latest legal effort will fail.”

Yes, it has been a war of words, and it will continue to be. Now, lets talk numbers and locations. In the United States, Apple is suing Qualcomm for a whopping $1 billion, and that’s not all. It has also filed a lawsuit in China and the United Kingdom for $145 million each!

So, what does Qualcomm want?  Well, it was iPhone’s – sales and manufacturing in China to be banned and is also seeking to ban certain iPhone models from sale in the US. Even though the models are not shared yes, it is a huge ask!

In another statement, “Qualcomm’s inventions are at the heart of every iPhone and extend well beyond modem technologies or cellular standards,” general counsel Don Rosenberg said, and continued with “Apple continues to use Qualcomm’s technology while refusing to pay for it.”

To counter this argument, Apple said that there was whole lot of evidence to prove that Qualcomm operated an “illegal business model,” and that it sought to extract patent royalties on every wireless device containing its chips.

So, this is the base, the foundation, but what’s happening now?  Well, Apple has won two rulings. The judge has ruled that Qualcomm cannot collect intellectual property (IP) royalty payments on Apple’s manufacturing partners until the total royalty’s amount is determined, if that happens at all. Qualcomm will now have to calculate and argue just how much royalty money will need to be recouped from Apple and its partners. Not only that, Qualcomm will now have to prove just how exactly Apple are infringing their patents! So, it’s Apple -2 and Qualcomm – 0. We’ll have to wait for more that’s bound to happen in this case!

**Source Internet**

Debounce And Throttle in Javascript

The greatest concern faced by UI developers is the performance issues in situations where functions are being executed excessively and in some cases unnecessarily


There are two ways in order to control the execution of functions using Debounce and Throttle, which come in handy when on handling events such as mouse scroll or window resizing.

A simple explanation of debounce and throttle is that the number of times a function is executed over a period of time is throttle and the time passed between each execution of a function is implemented as debounce.

 

Real Time Example:

Debounce: The perfect example for debounce would be resizing of the window in a desktop. Imagine we are to get the value of the screen size, but it would be useless to execute the function as the user drags on the size of the screen but we would be interested only in the final value of the screen size after it has been resized, as explained in the link(https://css-tricks.com/debouncing-throttling-explained-examples/)

debounce

Throttle: An example of throttle can be explained through the infinite scroll, where we have to determine the scroll position and load data before the user reaches the bottom. In this case, it wouldn’t be advisable to use debounce, as it would allow us to call the function only after the user stops scrolling. But throttle would ensure that we constantly check how far is the user from the bottom and act accordingly.

throttle

The major advantage of throttle over debounce is that we have the option to store ignored executions and execute them at last after all the function calls are made

Implementation:

A code sample for implementation of debounce

//original code from  Jhey Tompkins blog

//https://medium.com/@_jh3y/throttling-and-debouncing-in-javascript-b01cad5c8edf

var debounce = function(func, delay) {

var inDebounce = undefined;

return function() {

  var context = this,

    args = arguments;

  clearTimeout(inDebounce);

  return inDebounce = setTimeout(function() {

    return func.apply(context, args);

  }, delay);

}

}

 

The above function could be linked to a click event as follows:

 

debounceBtn.addEventListener(‘click’, debounce(function() {

return console.log(‘Hey! It is’, new Date().toUTCString());

}, 3000));

 

In the above code, when the button click event is called the function gets executed with the delay of 3 seconds, but if another click event is triggered before the execution of first click, then it is replaced by the second event.

 

Similarly, a code implementation for throttle would be

 

//original code from comment of maninak

//https://gist.github.com/makenova/7885923

function throttle(func, msWait) {

var time = Date.now();

return function() {

if ((time + (msWait || 100) – Date.now()) < 0) {

func();

time = Date.now();

}

}

}

Can be used as:

window.addEventListener(‘scroll’, throttle(myOnScrollFunction), false);

The above code ignores execution of the function for the events that are being called within 100ms of execution of the previous function call.

Conclusion:

Debounce and Throttle are techniques used to optimize the event handling.Both throttling and debouncing will rate-limit execution of a function.

In Summary:
Debounce will bunch a series of sequential calls to a function into a single call to that function. It ensures that one notification is made for an event that fires multiple times.

Throttle will delay executing a function. It will reduce the notifications of an event that fires multiple times.

References:
1.https://css-tricks.com/debouncing-throttling-explained-examples/
2.https://medium.com/@_jh3y/throttling-and-debouncing-in-javascript-b01cad5c8edf
3.https://gist.github.com/makenova/7885923

4.https://stackoverflow.com/questions/25991367/difference-between-throttling-and-debouncing-a-function

5.http://reactivex.io/documentation/operators/debounce.html#collapseRxNET

6.http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-throttleTime

 

Android 8- Oreo!

milk-2006449_960_720

Oreo – Not just for your Taste buds anymore!

There has been a lot of hoopla for iOS 11 and the launch of iPhone 8 and iPhone X, and amidst all that, it almost feels like Oreo has drowned in a glass of milk! (Pun Intended). Well, we shall revive that for you in this article specifically for Android 8 – Oreo!

Android phones are the ones commonly used by most people around the world, and almost all the phones in the market. This has given a boost to App developers from all over to create innovative android Apps, and release them to the market.

“Powers, and Beyond” is how they are pitching the new version, and with the looks of it, it does seem pretty cool! With great features for users and developers alike, lets now have a quick look at some of our favourite additions that are a part of this yummy new release – Oreo!

Oreo is going to make your device twice as fast as it was. How? Well, they have increased the boot speed, making it 2 times faster, so as soon as you have powered up your mobile, you really don’t have to twiddle your thumbs.

Another issue most of us face is that of background processes that not only eat our internet, but also our battery. Well, worry not – Oreo is going to help minimize background activity of the Apps you don’t even use! Stealth Power, we say!

Notification Dots – something that iPhone users will be familiar with is now on Android. You will get a small notification on top of any App that will have one for you. It could be a new e-mail or a message on WhatsApp.

Another exciting new feature is that Google is now going to help you control the notification setup for each App individually. You can Snooze notifications for any App individually, instead of placing your mobile on silent!

Finally, we have super helpful Autofill API’s, while it has always been there due to third party Apps, it’s now been made easier by adding platform support to it.

We then have Adaptive Icons for Developers, this is enable cool and funky icons for all Apps they develop.

And at last, the most fun feature of all – an Addition of over 60 new Emojis! Yay!

So, while there were a few more additions, these are some of our picks. Let us know your favourite updates in the new release!

iOS 11 is here!

iOS 11 is here!

iOS 11 is here, and in its wake, its left a lot of cheers and excitement! While it was released yesterday for previous versions of the iPhone, the newbies iPhone 8 and iPhone X were out commercially on September 22 and November 3 worldwide (there’s still some speculation on the Worldwide part), and we couldn’t help but talk about a few features that we really liked!

If you are an iPhone user, then we’re sure you would have looked up this data already, but we’re sharing it nonetheless. iOS 11 will be available on the trio of new iPhones and be compatible with the following models of iPhone, iPad and iPod. The iPhone’s it supports are: 5s, 6, 6 Plus, 6s, 6s Plus, SE, 7, 7 Plus, 8, 8 Plus, X. It is also changing the way iPads are used, they are compatible with 5th generation (2017); Mini 2, 3 and 4; all Air models and all Pro Models. For the iPod Touch, it is available for the 6th generation (2015). If you own an iPhone 5 and iPhone 5c you will not be able to get iOS 11. And unfortunately, Apple is also dropping support for the 2012 iPad 4.

As you can see, it was pretty gracious of Apple to support most of its iPhone models, and iPads. So, even if you don’t want to spend all that money buying the expensive iPhone 8 and X, you can still experience the goodies they are providing with iOS 11.

So, in this article, we wanted to graze upon some of the new fun aspects that are a part of this release, and so, we will be talking about the Face ID and the Animoji in an upcoming article. For now, let us begin by talking about the awesome all new Command Centre amongst others.

The previous command centre was not worth all its trouble, or annoyance mainly because of the few options it provided. Well, with this one, it does not take up half the screen, but the entire screen and has a lot more options. You get the music control centre on the same screen, and to magnify any option, all you have to do is a long press and voila! Another great addition was the idea of making the options visible on this screen editable. So, you get to decide the options you want displayed on the Command Centre.

Screen Record! Move out of the way Screenshots, we have the all new standout Scree Record on iOS 11. When you want to share something and an image just won’t do, just send across a screen record and get the job done. This is one feature that we feel will be included on upcoming Android releases.

Finally, we wrap up this article by talking about the ‘Do Not Disturb While Driving’ function. This is one has both an upside and a downside. That is probably because of the way it gets activated. When your device detects a constant speed in which it is travelling in, this setting is automatically turned on, making your phone go to Silent mode automatically. If you are driving, well and good, you will not get distracted, but if you are a passenger, well there are a lot of chances for you to miss your calls!

These are a few options we found exciting for our day to day lives, there are so many more. If you find some other feature to be fun and exciting, let us know too!