se Microbrowsers are Everywhere By 24ways.org Published On :: Sun, 15 Dec 2019 12:00:00 +0000 Colin Bendell gets into the minutia of microbrowsers - the small previews of your site that are pervasive all around the web and through social media apps and search engines whenever an item of content on your site is referenced. You’ve seen it everywhere - that little thumbnail preview of a website mentioned in a tweet, the expanded description in a Slack channel, or in WhatsApp group chat. Figure 1: The preview shown in a group chat provides a hint of what the real webpage looks like These link previews are so commonplace that we hardly pay any attention to how our site design might be impacting the generated preview. Yet, these previews can be the most influential part for attracting new audiences and increasing engagement - possibly more than SEO. Even more alarming is that most web analytics are blind to this traffic and can’t show you how these Microbrowsers are interacting with your site. As we close out the year, here are five essential questions and ideas that every web dev should know about Microbrowsers. 1. What are Microbrowsers? How are they different from “normal” browser? We are all very familiar with the main browsers like Firefox, Safari, Chrome, Edge and Internet Explorer. Not to mention the many new browsers that use Chromium as the rendering engine but offer unique user experiences like Samsung Internet or Brave. In contrast, Microbrowsers are a class of User-Agents that also visit website links, parse HTML and generate a user experience. But unlike those traditional browsers, the HTML parsing is limited and the rendering engine is singularly focused. The experience is not intended to be interactive. Rather the experience is intended to be representational - to give the user a hint of what exists on the other side of the URL. Creating link previews is not new. Facebook and Twitter have been adding these link previews in posts for nearly a decade. That used to be the primary use case. Marketing teams created backlog items to adopt different microdata - from Twitter Cards and Open Graph annotations for Facebook. LinkedIn likewise embraced both Open Graph and OEmbed tags to help generate the previews <meta name="description" content="seo description long"> <meta name="keywords" content="seo keyword list"> <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"> <link rel="icon" href="favicon_32.png" sizes="32x32"> <link rel="icon" href="favicon_48.png" sizes="48x48"> <link rel="icon" href="favicon_96.png" sizes="96x96"> <link rel="icon" href="favicon_144.png" sizes="144x144"> <meta property="og:title" content="Short title here" /> <meta property="og:description" content="shortish description" /> <meta name="twitter:title" content="Short title here"> <meta name="twitter:description" content="shortish description"> <meta property="og:image" content="https://res.cloudinary.com/.../hero-img.png" /> <meta name="twitter:image:src" content="https://res.cloudinary.com/.../hero-img.png"> As group chats and other collaboration tools have become more prevalent, we have seen many features from the big social media platforms emerge. Particularly in recent years we’ve seen the adoption of the link unfurling behaviour in these chat platforms. Rather than reinventing the wheel, each platform looks for pre-existing microdata to generate the preview. But which data should be used? How should this be arranged? As it turns out, each platform behaves slightly differently; presenting information in slightly different ways. Figure 2: The same amazon link shared in iMessage (left), Hangouts and WhatsApp (right) 2. If Microbrowsers are everywhere, why don’t I see them in my analytics reports? It’s easy to miss the traffic from Microbrowsers. This is for a number of reasons: First, page requests from Microbrowsers don’t run JavaScript and they don’t accept cookies. The Google Analytics <script> block won’t be run or executed. And all cookie will be ignored by the rendering agent. Second, if you were to do a log analysis based on HTTP logs from your CDN or web stack, you would see a relatively small volume of traffic. That is assuming you can identify the User-Agent strings. Some of these Microbrowsers impersonate real browsers and others impersonate Facebook or twitter. For example, iMessage uses the same User-Agent string for all these requests and it hasn’t changed since iOS 9. User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.4 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.4 facebookexternalhit/1.1 Facebot Twitterbot/1.0 Finally, many platforms - particularly Facebook Messenger and Hangouts use centralized services to request the preview layout. This, in contrast to WhatsApp and iMessage where you will see one request per user. In the centralized consumer approach your web servers will only see one request, but this one request might represent thousands of eyeballs. 3. Microbrowser are probably more important than google bot We all know the importance of having our web sites crawled by search engines like googlebot. These bots are the lifeblood for lead generation and for discovering new users. However, the real gold for marketers is from word-of-mouth discussions. Those conversations with your friends when you recommend a TV show, a brand of clothing, or share a news report. This is the most valuable kind of marketing. Last year when assembling the data for Cloudinary’s State of the Visual Media report, I discovered that there was a very prominent usage pattern over the USA holiday season. During thanksgiving, all the way to Black Friday, the rate of link sharing skyrocketed as group chats shared deals and insights. Zooming out (and normalizing for time-of-day), we can see that there is a daily cadence of link sharing and word of mouth referrals. It probably isn’t a shock to see that we predominantly share links in Slack between Monday and Friday, while WhatsApp is used all week long. Likewise, WhatsApp is most often used during our ‘break’ times like lunch or in the evening after we put the kids to bed. While the link preview is increasingly common, there are two user behaviours to balance: Users can be skeptical of links sent via SMS and other chats. We don’t want to be fooled into clicking a phishing links and so we look for other queues to offer validation. This is why most platforms use the preview while also emphasize the website url host name. Skimming. I’m sure you’ve had the experience coming out of a meeting or grocery store to find a group chat with 100 messages. As you scroll to catch up on the conversation, links can easily be skipped. In this way, users expect the preview to act as a summary to tell them how important it is to visit the link. Figure 4: Nielsen Norman Group summarizes the research in a dynamic image preview Figure 5: A mockup of how an ecommerce product could create compelling previews showcasing colors, stock and price in the preview 4. Microbrowsers are not real browsers (they just play one on TV) As I previously mentioned, Microbrowsers pretend to be a browser in that they send the right HTTP headers and often send impersonating User-Agent strings. Yet, there are several characteristics that a web dev should be aware of. First, Microbrowsers try to protect the User’s privacy. The user hasn’t decided to visit your site yet, and more importantly, the user is having a private conversation. The fact that your brand or website is mentioned should just make your ears burn, but you shouldn’t be able to listen in to the conversation. For this reason, all Microbrowsers: don’t execute JavaScript - so your react application won’t work ignore all cookies - so your A/B or red/green cookies will be ignored some will follow redirects, but will quickly time out after a few seconds and give up trying to expand the link. there won’t be a referer: HTTP header when the user clicks the link for the full browser. In fact, a new user will appear as ‘direct’ traffic - as though they typed in the url. Second, Microbrowsers have a very small brain and very likely don’t use an advanced network algorithm. Most browsers will use a tokenizer to parse the HTML markup and send requests to the network stack asynchronously. Better yet, browsers will do some analysis of the resources needed before sending the async request to the network. Based on observational experimentation, most platforms simply use a glorified for loop when parsing the HTML and often request the resources synchronously. This might be ok for fast wifi experiences, but it can cause inconsistent experiences on flaky wifi. For example, iMessage will discover and load all <link rel="icon" > favicon, all <meta property="og:image" images, and all <meta name="twitter:image:src" before deciding what to render. Many sites still advertise 5 or more favicon sizes. This means that iMessage will download all favicons regardless of size and then not use them if it decides to instead render the image. For this reason the meta markup that is included is important. The lighter the content, the more likely it will be to be rendered. 5. Markup Matters Since Microbrowsers are simple-brained browsers, it is all the more important to produce good markup. Here are a few good strategies: It’s almost 2020, you only need one favicon size. Remove all the other <link rel="shortcut icon" and <link rel="icon" references. Based on observational experimentation, the most commonly recognized microdata tags for preview are the Open-Graph tags. When the OG and twitter card tags are missing, the default SEO <meta name="description" is used. However, since the description is often nonsensical SEO optimized phrases, users’ eyes will likely glaze over. On that note, use good descriptive text Provide up to three <meta property="og:image" images. Most platforms will only load the first one, while others (notably iMessage) attempts to create a collage. Figure 6: Amazon uses User-Agent detection which results in many link previews using the description meta tag. Use <meta property="og:video* with progressive (not streaming) video experiences. <meta property="og:type" content="video.other"> <meta property="og:video:url" content="https://shoesbycolin.com/blue.mp4"> <meta property="og:video:secure_url" content="https://shoesbycolin.com/blue.mp4"> <meta property="og:video:type" content="video/mp4"> <meta property="og:video:width" content="1280"> <meta property="og:video:height" content="720"> Don’t use UA sniffing to hide the <meta> tags. Sites like Amazon do this to try and show only Facebook/Twitter the microdata annotated website. But this can cause problems for some Microbrowsers that don’t use the same impersonation convention. The result is a simple link without a preview. Use the opportunity to tell your product story or summarize your ideas. Summary As more of our conversations happen in group chats and slack channels, link previews are an important way for you to engage users before they start the journey on your site. Unfortunately, not all websites present good or compelling previews. (And now that you know what to look for, you won’t be able to unsee bad examples - I’m sorry). To help users take the leap and visit your site, we need to make sure that all our pages are annotated with microdata. Better yet, we can use these previews to create compelling visual summaries. About the author Colin is part of the CTO Office at Cloudinary and co-author of the O’Reilly book High Performance Images. He spends much of his time at the intersection of high volume data, media, browsers and standards. He recently helped the community effort writing chapters in the Web Almanac on Media and CDNs. You can find him on tweeting @colinbendell and at blogging at https://bendell.ca More articles by Colin Full Article Code performance
se Building a Dictaphone Using Media Recorder and getUserMedia By 24ways.org Published On :: Tue, 17 Dec 2019 12:00:00 +0000 Chris Mills brushes up his shorthand and shows how the MediaStream Recording API in modern browsers can be used to capture audio directly from the user’s device. Inching ever closer to the capabilities of native software, it truly is an exciting time to be a web developer. The MediaStream Recording API makes it easy to record audio and/or video streams. When used with MediaDevices.getUserMedia(), it provides an easy way to record media from the user’s input devices and instantly use the result in web apps. This article shows how to use these technologies to create a fun dictaphone app. A sample application: Web Dictaphone To demonstrate basic usage of the MediaRecorder API, we have built a web-based dictaphone. It allows you to record snippets of audio and then play them back. It even gives you a visualisation of your device’s sound input, using the Web Audio API. We’ll just concentrate on the recording and playback functionality in this article, for brevity’s sake. You can see this demo running live, or grab the source code on GitHub. This has pretty good support on modern desktop browsers, but pretty patchy support on mobile browsers currently. Basic app setup To grab the media stream we want to capture, we use getUserMedia(). We then use the MediaRecorder API to record the stream, and output each recorded snippet into the source of a generated <audio> element so it can be played back. We’ll first declare some variables for the record and stop buttons, and the <article> that will contain the generated audio players: const record = document.querySelector('.record'); const stop = document.querySelector('.stop'); const soundClips = document.querySelector('.sound-clips'); Next, we set up the basic getUserMedia structure: if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { console.log('getUserMedia supported.'); navigator.mediaDevices.getUserMedia ( // constraints - only audio needed for this app { audio: true }) // Success callback .then(function(stream) { }) // Error callback .catch(function(err) { console.log('The following `getUserMedia` error occured: ' + err); } ); } else { console.log('getUserMedia not supported on your browser!'); } The whole thing is wrapped in a test that checks whether getUserMedia is supported before running anything else. Next, we call getUserMedia() and inside it define: The constraints: Only audio is to be captured for our dictaphone. The success callback: This code is run once the getUserMedia call has been completed successfully. The error/failure callback: The code is run if the getUserMedia call fails for whatever reason. Note: All of the code below is found inside the getUserMedia success callback in the finished version. Capturing the media stream Once getUserMedia has created a media stream successfully, you create a new Media Recorder instance with the MediaRecorder() constructor and pass it the stream directly. This is your entry point into using the MediaRecorder API — the stream is now ready to be captured into a <Blob>, in the default encoding format of your browser. const mediaRecorder = new MediaRecorder(stream); There are a series of methods available in the MediaRecorder interface that allow you to control recording of the media stream; in Web Dictaphone we just make use of two, and listen to some events. First of all, MediaRecorder.start() is used to start recording the stream once the record button is pressed: record.onclick = function() { mediaRecorder.start(); console.log(mediaRecorder.state); console.log("recorder started"); record.style.background = "red"; record.style.color = "black"; } When the MediaRecorder is recording, the MediaRecorder.state property will return a value of “recording”. As recording progresses, we need to collect the audio data. We register an event handler to do this using mediaRecorder.ondataavailable: let chunks = []; mediaRecorder.ondataavailable = function(e) { chunks.push(e.data); } Last, we use the MediaRecorder.stop() method to stop the recording when the stop button is pressed, and finalize the Blob ready for use somewhere else in our application. stop.onclick = function() { mediaRecorder.stop(); console.log(mediaRecorder.state); console.log("recorder stopped"); record.style.background = ""; record.style.color = ""; } Note that the recording may also stop naturally if the media stream ends (e.g. if you were grabbing a song track and the track ended, or the user stopped sharing their microphone). Grabbing and using the blob When recording has stopped, the state property returns a value of “inactive”, and a stop event is fired. We register an event handler for this using mediaRecorder.onstop, and construct our blob there from all the chunks we have received: mediaRecorder.onstop = function(e) { console.log("recorder stopped"); const clipName = prompt('Enter a name for your sound clip'); const clipContainer = document.createElement('article'); const clipLabel = document.createElement('p'); const audio = document.createElement('audio'); const deleteButton = document.createElement('button'); clipContainer.classList.add('clip'); audio.setAttribute('controls', ''); deleteButton.innerHTML = "Delete"; clipLabel.innerHTML = clipName; clipContainer.appendChild(audio); clipContainer.appendChild(clipLabel); clipContainer.appendChild(deleteButton); soundClips.appendChild(clipContainer); const blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' }); chunks = []; const audioURL = window.URL.createObjectURL(blob); audio.src = audioURL; deleteButton.onclick = function(e) { let evtTgt = e.target; evtTgt.parentNode.parentNode.removeChild(evtTgt.parentNode); } } Let’s go through the above code and look at what’s happening. First, we display a prompt asking the user to name their clip. Next, we create an HTML structure like the following, inserting it into our clip container, which is an <article> element. <article class="clip"> <audio controls></audio> <p>_your clip name_</p> <button>Delete</button> </article> After that, we create a combined Blob out of the recorded audio chunks, and create an object URL pointing to it, using window.URL.createObjectURL(blob). We then set the value of the <audio> element’s src attribute to the object URL, so that when the play button is pressed on the audio player, it will play the Blob. Finally, we set an onclick handler on the delete button to be a function that deletes the whole clip HTML structure. So that’s basically it — we have a rough and ready dictaphone. Have fun recording those Christmas jingles! As a reminder, you can find the source code, and see it running live, on the MDN GitHub. This article is based on Using the MediaStream Recording API by Mozilla Contributors, and is licensed under CC-BY-SA 2.5. About the author Chris Mills manages the MDN web docs writers’ team at Mozilla, which involves spreadsheets, meetings, writing docs and demos about open web technologies, and occasional tech talks at conferences and universities. He used to work for Opera and W3C, and enjoys playing heavy metal drums and drinking good beer. More articles by Chris Full Article Code apis
se Five Interesting Ways to Use Array.reduce() (And One Boring Way) By 24ways.org Published On :: Wed, 18 Dec 2019 12:00:00 +0000 Chris Ferdinandi turns the heat down low and lets the sauce reduce while we take a look at how to add spice to our source with a sprinkling of Array.reduce(). Just a little ingenuity with the humblest of functions. Of all the modern array methods, the one I had the hardest time wrapping my head around was Array.reduce(). On the surface, it seems like a simple, boring method that doesn’t do much. But below its humble exterior, Array.reduce() is actually a powerful, flexible addition to your developer toolkit. Today, we’re going to look at some cool things you can do with Array.reduce(). How Array.reduce() works Most of the modern array methods return a new array. The Array.reduce() method is a bit more flexible. It can return anything. Its purpose is to take an array and condense its content into a single value. That value can be a number, a string, or even an object or new array. That’s the part that’s always tripped me up – I didn’t realize just how flexible it is! The syntax The Array.reduce() accepts two arguments: a callback method to run against each item in the array, and a starting value. The callback also accepts two arguments: the accumulator, which is the current combined value, and the current item in the loop. Whatever you return is used as the accumulator for the next item in the loop. On the very first loop, that starting value is used instead. var myNewArray = [].reduce(function (accumulator, current) { return accumulator; }, starting); Let’s look at some examples to make this all tangible. 1. Adding numbers together Let’s say you had an array of numbers that you wanted to add together. Using Array.forEach(), you might do something like this: var total = 0; [1, 2, 3].forEach(function (num) { total += num; }); This is the cliche example for using Array.reduce(). I find the word accumulator confusing, so in this example, I’m calling it sum, because that’s what it is. var total = [1, 2, 3].reduce(function (sum, current) { return sum + current; }, 0); Here, we pass in 0 as our starting value. In the callback, we add the current value to the sum, which has our starting value of 0 on the first loop, then 1 (the starting value of 0 plus the item value of 1), then 3 (the sum value of 1 plus the item value of 2), and so on. Here’s a demo. 2. Combining multiple array methods into Array.map() and Array.filter() into a single step Imagine you had an array of wizards at Hogwarts. var wizards = [ { name: 'Harry Potter', house: 'Gryfindor' }, { name: 'Cedric Diggory', house: 'Hufflepuff' }, { name: 'Tonks', house: 'Hufflepuff' }, { name: 'Ronald Weasley', house: 'Gryfindor' }, { name: 'Hermione Granger', house: 'Gryfindor' } ]; You want to create a new array that contains just the names of wizards who are in Hufflepuff. One way you could do that is by using the Array.filter() method to get back just wizards whose house property is Hufflepuff. Then, you’d use the Array.map() method to create a new array containing just the name property for the remaining wizards. // Get the names of the wizards in Hufflepuff var hufflepuff = wizards.filter(function (wizard) { return wizard.house === 'Hufflepuff'; }).map(function (wizard) { return wizard.name; }); With the Array.reduce() method, we can get the same array in a single pass, improving our performance. You pass in an empty array ([]) as the starting value. On each pass, you check to see if the wizard.house is Hufflepuff. If it is, you push it to the newArr (our accumulator in this example). If not, you do nothing. Either way, you return the newArr to become the accumulator on the next pass. // Get the names of the wizards in Hufflepuff var hufflepuff = wizards.reduce(function (newArr, wizard) { if (wizard.house === 'Hufflepuff') { newArr.push(wizard.name); } return newArr; }, []); Here’s another demo. 3. Creating markup from an array What if, instead of creating an array of names, we wanted to create an unordered list of wizards in Hufflepuff? Instead of passing an empty array into Array.reduce() as our starting value, we’ll pass in an empty string ('') and call it html. If the wizard.house equals Hufflepuff, we’ll concatenate our html string with the wizard.name wrapped in an opening and closing list item (li). Then, we’ll return the html to become the accumulator on the next loop. // Create a list of wizards in Hufflepuff var hufflepuffList = wizards.reduce(function (html, wizard) { if (wizard.house === 'Hufflepuff') { html += '<li>' + wizard.name + '</li>'; } return html; }, ''); Add an opening and closing unordered list element before and after Array.reduce(), and you’re ready to inject your markup string into the DOM. // Create a list of wizards in Hufflepuff var hufflepuffList = '<ul>' + wizards.reduce(function (html, wizard) { if (wizard.house === 'Hufflepuff') { html += '<li>' + wizard.name + '</li>'; } return html; }, '') + '</ul>'; See it in action here. 4. Grouping similar items in an array together The lodash library has a groupBy() method takes a collection of items as an array and groups them together into an object based on some criteria. Let’s say you want an array of numbers. If you wanted to group all of the items in numbers together based on their integer value, you would do this with lodash. var numbers = [6.1, 4.2, 6.3]; // returns {'4': [4.2], '6': [6.1, 6.3]} _.groupBy(numbers, Math.floor); If you had an array of words, and you wanted to group the items in words by their length, you would do this. var words = ['one', 'two', 'three']; // returns {'3': ['one', 'two'], '5': ['three']} _.groupBy(words, 'length'); Creating a groupBy() function with Array.reduce() You can recreate that same functionality using the Array.reduce() method. We’ll create a helper function, groupBy(), that accepts the array and criteria to sort by as arguments. Inside groupBy(), we’ll run Array.reduce() on our array, passing in an empty object ({}) as our starting point, and return the result. var groupBy = function (arr, criteria) { return arr.reduce(function (obj, item) { // Some code will go here... }, {}); }; Inside the Array.reduce() callback function, we’ll check to see if the criteria is a function, or a property of the item. Then we’ll get its value from the current item. If there’s no property in the obj with that value yet, we’ll create it and assign an empty array as its value. Finally, we’ll push the item to that key, and return the object as the accumulator for the next loop. var groupBy = function (arr, criteria) { return arr.reduce(function (obj, item) { // Check if the criteria is a function to run on the item or a property of it var key = typeof criteria === 'function' ? criteria(item) : item[criteria]; // If the key doesn't exist yet, create it if (!obj.hasOwnProperty(key)) { obj[key] = []; } // Push the value to the object obj[key].push(item); // Return the object to the next item in the loop return obj; }, {}); }; Here’s a demo of the completed helper function. Special thanks to Tom Bremer for helping me make some improvements to this one. You can find this helper function and more like it on the Vanilla JS Toolkit. 5. Combining data from two sources into an array Remember our array of wizards? var wizards = [ { name: 'Harry Potter', house: 'Gryfindor' }, { name: 'Cedric Diggory', house: 'Hufflepuff' }, { name: 'Tonks', house: 'Hufflepuff' }, { name: 'Ronald Weasley', house: 'Gryfindor' }, { name: 'Hermione Granger', house: 'Gryfindor' } ]; What if you had another data set, an object of house points each wizard has earned. var points = { HarryPotter: 500, CedricDiggory: 750, RonaldWeasley: 100, HermioneGranger: 1270 }; Imagine you wanted to combine both sets of data into a single array, with the number of points added to each wizard’s data in the wizards array. How would you do it? The Array.reduce() method is perfect for this! var wizardsWithPoints = wizards.reduce(function (arr, wizard) { // Get the key for the points object by removing spaces from the wizard's name var key = wizard.name.replace(' ', ''); // If the wizard has points, add them // Otherwise, set them to 0 if (points[key]) { wizard.points = points[key]; } else { wizard.points = 0; } // Push the wizard object to the new array arr.push(wizard); // Return the array return arr; }, []); Here’s a demo combining data from two sources into an array. 6. Combining data from two sources into an object What if you instead wanted to combine the two data sources into an object, where each wizard’s name was the key, and their house and points were properties? Again, the Array.reduce() method is perfect for this. var wizardsAsAnObject = wizards.reduce(function (obj, wizard) { // Get the key for the points object by removing spaces from the wizard's name var key = wizard.name.replace(' ', ''); // If the wizard has points, add them // Otherwise, set them to 0 if (points[key]) { wizard.points = points[key]; } else { wizard.points = 0; } // Remove the name property delete wizard.name; // Add wizard data to the new object obj[key] = wizard; // Return the array return obj; }, {}); Here’s a demo combining two data sets into an object. Should you use Array.reduce() more? The Array.reduce() method has gone from being something I thought was pointless to my favorite JavaScript method. So, should you use it? And when? The Array.reduce() method has fantastic browser support. It works in all modern browsers, and IE9 and above. It’s been supported in mobile browsers for a long time, too. If you need to go back even further than that, you can add a polyfill to push support back to IE6. The biggest complaint you can make about Array.reduce() is that it’s confusing for people who have never encountered it before. Combining Array.filter() with Array.map() is slower to run and involves extra steps, but it’s easier to read. It’s obvious from the names of the methods what they’re supposed to be doing. That said, there are times where Array.reduce() makes things that would be complicated more simple rather than more complicated. The groupBy() helper function is a good example. Ultimately, this is another tool to add to your toolkit. A tool that, if used right, can give you super powers. About the author Chris Ferdinandi helps people learn vanilla JavaScript. He believes there’s a simpler, more resilient way to make things for the web. Chris is the author of the Vanilla JS Pocket Guide series, creator of the Vanilla JS Academy training program, and host of the Vanilla JS Podcast. His developer tips newsletter is read by thousands of developers each weekday. He’s taught developers at organizations like Chobani and the Boston Globe, and his JavaScript plugins have been used used by Apple and Harvard Business School. Chris Coyier, the founder of CSS-Tricks and CodePen, has described his writing as “infinitely quote-worthy.” Chris loves pirates, puppies, and Pixar movies, and lives near horse farms in rural Massachusetts. He runs Go Make Things with Bailey Puppy, a lab-mix from Tennessee. More articles by Chris Full Article Code javascript
se Usability and Security; Better Together By 24ways.org Published On :: Sun, 22 Dec 2019 12:00:00 +0000 Divya Sasidharan calls into question the trade-offs often made between security and usability. Does a secure interface by necessity need to be hard to use? Or is it the choice we make based on years of habit? Snow has fallen, snow on snow. Security is often synonymous with poor usability. We assume that in order for something to be secure, it needs to by default appear impenetrable to disincentivize potential bad actors. While this premise is true in many instances like in the security of a bank, it relies on a fundamental assumption: that there is no room for choice. With the option to choose, a user almost inevitably picks a more usable system or adapts how they interact with it regardless of how insecure it may be. In the context of the web, passwords are a prime example of such behavior. Though passwords were implemented as a way to drastically reduce the risk of attack, they proved to be marginally effective. In the name of convenience, complex, more secure passwords were shirked in favor of easy to remember ones, and passwords were liberally reused across accounts. This example clearly illustrates that usability and security are not mutually exclusive. Rather, security depends on usability, and it is imperative to get user buy-in in order to properly secure our applications. Security and Usability; a tale of broken trust At its core, security is about fostering trust. In addition to protecting user accounts from malicious attacks, security protocols provide users with the peace of mind that their accounts and personal information is safe. Ironically, that peace of mind is incumbent on users using the security protocols in the first place, which further relies on them accepting that security is needed. With the increased frequency of cyber security threats and data breaches over the last couple of years, users have grown to be less trusting of security experts and their measures. Security experts have equally become less trusting of users, and see them as the “the weakest link in the chain”. This has led to more cumbersome security practices such as mandatory 2FA and constant re-login flows which bottlenecks users from accomplishing essential tasks. Because of this break down in trust, there is a natural inclination to shortcut security altogether. Build a culture of trust not fear Building trust among users requires empowering them to believe that their individual actions have a larger impact on the security of the overall organization. If a user understands that their behavior can put critical resources of an organization at risk, they will more likely behave with security in mind. For this to work, nuance is key. Deeming that every resource needs a similarly high number of checks and balances diminishes how users perceive security and adds unnecessary bottlenecks to user workflows. In order to lay the foundation for good security, it’s worth noting that risk analysis is the bedrock of security design. Instead of blindly implementing standard security measures recommended by the experts, a better approach is to tailor security protocols to meet specific use cases and adapt as much as possible to user workflows. Here are some examples of how to do just that: Risk based authentication Risk based authentication is a powerful way to perform a holistic assessment of the threats facing an organization. Risks occur at the intersection of vulnerability and threat. A high risk account is vulnerable and faces the very real threat of a potential breach. Generally, risk based authentication is about calculating a risk score associated with accounts and determining the proper approach to securing it. It takes into account a combination of the likelihood that that risk will materialize and the impact on the organization should the risk come to pass. With this system, an organization can easily adapt access to resources depending on how critical they are to the business; for instance, internal documentation may not warrant 2FA, while accessing business and financial records may. Dynamically adaptive auth Similar to risk based auth, dynamically adaptive auth adjusts to the current situation. Security can be strengthened and slackened as warranted, depending on how risky the access point is. A user accessing an account from a trusted device in a known location may be deemed low risk and therefore not in need of extra security layers. Likewise, a user exhibiting predictive patterns of use should be granted quick and easy access to resources. The ability to adapt authentication based on the most recent security profile of a user significantly improves the experience by reducing unnecessary friction. Conclusion Historically, security failed to take the user experience into account, putting the onus of securing accounts solely on users. Considering the fate of password security, we can neither rely on users nor stringent security mechanisms to keep our accounts safe. Instead, we should aim for security measures that give users the freedom to bypass them as needed while still protecting our accounts from attack. The fate of secure systems lies in the understanding that security is a process that must constantly adapt to face the shifting landscape of user behavior and potential threats. About the author Divya is a web developer who is passionate about open source and the web. She is currently a developer experience engineer at Netlify, and believes that there is a better workflow for building and deploying sites that doesn’t require a server—ask her about the JAMstack. You will most likely find her in the sunniest spot in the room with a cup of tea in hand. More articles by Divya Full Article UX security
se I set my own rules: Sabyasachi Mukherjee By www.thehindu.com Published On :: Wed, 10 Aug 2016 17:24:59 +0530 Designers must create new templates that suit their creativity instead of allowing the market to set the pace for them, says Sabyasachi Mukherjee, who will present his collection at the finale of Lakme Fashion Week. Full Article Fashion
se LFW W/F 2016: Past meets present By www.thehindu.com Published On :: Mon, 22 Aug 2016 16:39:58 +0530 Bina Rao’s collection for Lakme Fashion Week Winter/Festive 2016 draws inspiration from Rembrandt’s paintings Full Article Metroplus
se A season for transition By www.thehindu.com Published On :: Thu, 08 Sep 2016 16:40:11 +0530 NEETI SARKAR gets fashion experts to reveal how you can dress smart this season in spite of the finicky weather Full Article Metroplus
se An idea whose time has come By www.thehindu.com Published On :: Mon, 24 Oct 2016 14:38:14 +0530 Ritu Beri revisits khadi with her new collection called Vichar Vastra Full Article Metroplus
se Cut, carat and setting By www.thehindu.com Published On :: Thu, 17 Nov 2016 22:25:27 +0530 Kajal Nair’s bespoke jewellery blends high design with rare gems for a worldwide clientèle Full Article Metroplus
se For the festive season, designers are working with artisans to create clothes with a conscience By www.thehindu.com Published On :: Thu, 20 Oct 2022 17:57:52 +0530 As gifting and dressing up for the festive season begins, consumers are increasingly looking at sustainable, environment friendly choices Full Article Life & Style
se Uniqlo turns three in the India market; launches second edition of its collaboration with Italian luxury fashion house Marni By www.thehindu.com Published On :: Mon, 12 Dec 2022 11:35:06 +0530 Headquartered in Tokyo, the Japanese apparel brand focusses on technology and sustainability, and its latest collection of fleece jackets is made of recycled PET bottles Full Article Life & Style
se Designer Ranna Gill brings the essence of Lake Como to the runway at the Lakme Fashion Week X FDCI By www.thehindu.com Published On :: Fri, 10 Mar 2023 17:01:57 +0530 Twenty-five years of Ranna Gill, and she still lets the flowers do the talking in her garments. Ahead of her show at Lakme Fashion Week X FDCI, the designer gives us a sneak peek into her collection Full Article Life & Style
se This Chennai-based startup customises your sneakers so you can put your personality on them By www.thehindu.com Published On :: Fri, 07 Apr 2023 16:52:36 +0530 Pastels, bling, or bold colours, whatever be your taste, K-kix, a sneaker customisation platform from Chennai can do it for you Full Article Life & Style
se From techno-inspired rave bags to pants that depict neurons, this Chennai-based gender neutral fashion label’s creations are conversation starters By www.thehindu.com Published On :: Fri, 14 Apr 2023 17:03:21 +0530 Brimming with cut outs, panels, thread piping and embroidery, Biskit’s new collection explores the human mind Full Article Life & Style
se Public sector – Saab Chalta Hai! By www.thehindubusinessline.com Published On :: Tue, 25 Jun 2013 15:50:18 +0530 Full Article Richa Mishra
se Get set go for health By www.thehindu.com Published On :: Thu, 21 Apr 2016 16:15:54 +0530 It’s time to bring out those running shoes; Pinkathon is back again Full Article Metroplus
se A kickstart to self defence By www.thehindu.com Published On :: Tue, 31 May 2016 16:40:02 +0530 There are ways to safeguard your physical and mental well being, say martial arts trainer Kyoshi K.S. Sekar and Krav Maga master S. Sreeram who will soon teach in Coimbatore Full Article Metroplus
se A sense of community By www.thehindu.com Published On :: Mon, 20 Jun 2016 14:56:38 +0530 The importance of the Anjali mudra, and how to do it Full Article Fitness
se Yoga with a dose of mindfulness By www.thehindu.com Published On :: Mon, 20 Jun 2016 16:00:51 +0530 Bend into a pretzel, if you can, but do so with a better understanding of yoga Full Article Metroplus
se Scoring a self goal By www.thehindu.com Published On :: Sat, 02 Jul 2016 17:13:58 +0530 Inspired by the free flowing style of the Copa America and the Euro, NIKHIL VARMA decides to give football a try and realises that he is not up for the challenge Full Article Metroplus
se A plan of exercise By www.thehindu.com Published On :: Sat, 16 Jul 2016 16:23:28 +0530 No matter what your schedule may be, if you make a little time for a workout a day, it keeps all the aches away Full Article Metroplus
se Perseverance pays off By www.thehindu.com Published On :: Fri, 14 Oct 2016 15:03:45 +0530 S. Anthonyammal wards off stiff challenges in life to return with a gold medal in kabaddi at the 5th Asian Beach Games held in Vietnam last month Full Article Metroplus
se Sole purpose By www.thehindu.com Published On :: Thu, 27 Oct 2016 17:09:22 +0530 The city is on its toes for Trivandrum Marathon 2016 Full Article Fitness
se Ready... get set... run By www.thehindu.com Published On :: Fri, 28 Oct 2016 17:48:33 +0530 If you want to be fit without investing much in terms of equipments or gear, then give running a shot Full Article Metroplus
se Time to act against early-onset diabetes By www.thehindu.com Published On :: Sat, 12 Nov 2016 17:24:08 +0530 Catching diabetes in its early stages could mean lesser complications later Full Article Fitness
se Coimbatore-based Walkaroo footwear hosts the 11th edition of Coimbatore Marathon By www.thehindu.com Published On :: Tue, 05 Sep 2023 13:52:13 +0530 Coimbatore-based Walkaroo footwear has joined hands with Coimbatore Cancer Foundation to host the 11th edition of the Coimbatore Marathon Full Article Fashion
se Editorial. Gold users must get a transparent Re-based price By www.thehindubusinessline.com Published On :: Fri, 19 Jul 2024 21:29:16 +0530 There is a need to provide consumers with a transparently derived domestic reference rate which is under regulatory supervision Full Article Editorial
se Editorial. Cautious and conservative By www.thehindubusinessline.com Published On :: Tue, 23 Jul 2024 22:42:10 +0530 Budget is conservative but not averse to experimenting Full Article Editorial
se Editorial. Gold duty cut can help exporters and consumers if cost savings are passed on By www.thehindubusinessline.com Published On :: Thu, 25 Jul 2024 22:07:36 +0530 The customs duty cut on gold, silver and platinum will certainly bring down production costs in this thin-margin industry, helping Indian exports gain competitive edge in the global market Full Article Editorial
se Editorial. Skilling sops useful, but education is key By www.thehindubusinessline.com Published On :: Wed, 31 Jul 2024 21:36:18 +0530 There can be no getting away from the fact that the skills crisis in India’s young (15-29 years) reflects a failure of the education system — and the best skilling efforts cannot make up for this lack Full Article Editorial
se Editorial. SEBI right in trying to restrict retail F&O punts By www.thehindubusinessline.com Published On :: Thu, 01 Aug 2024 21:34:12 +0530 These punts result in flight of capital too, as the counter-parties are often global algo-trading and high frequency shops Full Article Editorial
se Editorial. TRAI rules can ring in better telecom service quality By www.thehindubusinessline.com Published On :: Sun, 11 Aug 2024 20:50:28 +0530 The changes promise a better user experience, with faster load times for web pages and smoother live streams Full Article Editorial
se Editorial. SEBI storm By www.thehindubusinessline.com Published On :: Mon, 12 Aug 2024 21:08:12 +0530 Buch’s rebuttal plausible, but needs verification Full Article Editorial
se Editorial. Clinical trials waiver for some drugs raises questions By www.thehindubusinessline.com Published On :: Mon, 19 Aug 2024 21:11:47 +0530 The Centre should not relax its clinical trials norms unless the situation is exceptional or dire Full Article Editorial
se Editorial: Easy entry for market advisers is good, but not fee control By www.thehindubusinessline.com Published On :: Wed, 21 Aug 2024 21:16:29 +0530 SEBI could have dispensed with controls on levy of fees. Also, the proposal to dilute the qualification criteria for registered advisers seems ill-advised Full Article Editorial
se Editorial. Sound compromise By www.thehindubusinessline.com Published On :: Mon, 26 Aug 2024 20:15:11 +0530 UPS addresses concerns of both employees and the fisc Full Article Editorial
se Editorial. SEBI’s take on household financial savings clears the air By www.thehindubusinessline.com Published On :: Sun, 08 Sep 2024 20:35:54 +0530 SEBI has calculated net primary and secondary market investment in equity and debt based on actual data at its disposal Full Article Editorial
se Editorial. Senior cover By www.thehindubusinessline.com Published On :: Tue, 17 Sep 2024 21:01:49 +0530 PM-JAY will need tweaks to deliver geriatric care Full Article Editorial
se Editorial. Loose ends in SEBI’s colo scam and other probes By www.thehindubusinessline.com Published On :: Wed, 18 Sep 2024 21:29:14 +0530 There are multiple instances of SEBI’s orders being overturned by SAT, displaying lack of rigour in its investigation Full Article Editorial
se Editorial. Fed cuts loose By www.thehindubusinessline.com Published On :: Fri, 20 Sep 2024 20:23:44 +0530 US rate cut positive for financial markets, flows Full Article Editorial
se Editorial. More disclosures needed in SEBI ‘direct plan’ push By www.thehindubusinessline.com Published On :: Mon, 14 Oct 2024 21:12:50 +0530 The dashboards on AMCs’ websites should feature data on direct plans, not just regular ones Full Article Editorial
se Editorial. Satcom can complement telecom services in remote areas By www.thehindubusinessline.com Published On :: Fri, 18 Oct 2024 21:02:58 +0530 Tech advancements have made it possible for satcom players to offer seamless broadband connectivity directly to the users’ smartphones, bypassing traditional cell towers Full Article Editorial
se Bank of Baroda reports 23% increase in Q2FY25 net profit at ₹5,238 cr By www.thehindubusinessline.com Published On :: Fri, 25 Oct 2024 18:57:42 +0530 BoB had reported a net profit of Rs ₹4,253 crore in the year ago quarter (Q2FY24) Full Article Money & Banking
se Cholamandalam Investment posts 26% rise in Q2 net at ₹963 crore By www.thehindubusinessline.com Published On :: Fri, 25 Oct 2024 20:06:21 +0530 Murugappa Group’s NBFC, Cholamandalam Investment & Finance Co Ltd, reported a strong double-digit growth across key metrics in the September quarter and the first half of this fiscal year. Net income for Q2 surged 37 per cent y-o-y to ₹3,238 crore, up from ₹2,367 crore. Full Article Money & Banking
se Indian banks increased their overseas presence during 2023-24 : RBI Survey By www.thehindubusinessline.com Published On :: Fri, 25 Oct 2024 20:41:08 +0530 During the year, the number of branches and employees of foreign banks in India also expanded by 0.6 per cent and 1.4 per cent, respectively Full Article Money & Banking
se ICICI Bank Q2 PAT rises 15% to ₹11,746 crore on strong core income growth By www.thehindubusinessline.com Published On :: Sat, 26 Oct 2024 18:54:10 +0530 NIM moderated 9 basis points sequentially to 4.27 per cent on higher cost of funds Full Article Money & Banking
se Indian Bank posts 36% rise in Q2 net at ₹2,707 crore on the back of reduced slippages By www.thehindubusinessline.com Published On :: Mon, 28 Oct 2024 18:31:23 +0530 For the first half of the fiscal, the bank’s net profit exceeded ₹5,000 crore, totalling ₹5,110 crore, up from ₹3,697 crore Full Article Money & Banking
se RBI grants online payments aggregator license to Jio Financial arm JSPL By www.thehindubusinessline.com Published On :: Tue, 29 Oct 2024 17:29:14 +0530 Jio Financial, helmed by veteran banker K.V. Kamath, already runs a shadow bank and an insurance brokerage and has joined forces with BlackRock Inc. to start an asset management business Full Article Money & Banking
se Compliant with gold loan norms, will further strengthen audit processes: CSB Bank MD By www.thehindubusinessline.com Published On :: Tue, 29 Oct 2024 19:01:36 +0530 Bank expects its advances and deposits to rise at least 30-50 per cent faster than the banking system Full Article Money & Banking
se Finova Capital raises $135 million in Series E round led by Avataar Venture Partners, Sofina, others By www.thehindubusinessline.com Published On :: Wed, 30 Oct 2024 09:43:54 +0530 Finova will use the funds to grow its loan book, invest in technology, expand geographically and further its vision of enabling financial inclusion at scale Full Article Money & Banking