po Water, sustainable development, and the nexus: response to climate change / editors, Velma I. Grover, Amani Alfarra By library.mit.edu Published On :: Sun, 15 Mar 2020 06:23:26 EDT Barker Library - TD390.W3845 2020 Full Article
po Deployment of deep decarbonization technologies: proceedings of a workshop / Alex Martin, rapporteur ; Board on Energy and Environmental Systems, Division on Engineering and Physical Sciences, the National Academies of Sciences, Engineering, Medicine By library.mit.edu Published On :: Sun, 29 Mar 2020 06:19:37 EDT Online Resource Full Article
po Advances in Water Pollution Monitoring and Control: select proceedings from HSFEA 2018 / Nihal Anwar Siddiqui, S.M. Tauseef, Rajendra Dobhal, editors By library.mit.edu Published On :: Sun, 5 Apr 2020 06:19:51 EDT Online Resource Full Article
po Inevitably toxic: historical perspectives on contamination, exposure and expertise / edited by Brinda Sarathy, Vivien Hamilton and Janet Farrell Brodie By library.mit.edu Published On :: Sun, 26 Apr 2020 06:32:35 EDT Barker Library - TD179.I54 2018 Full Article
po Environmental justice in postwar America: a documentary reader / edited by Christopher W. Wells By library.mit.edu Published On :: Sun, 26 Apr 2020 06:32:35 EDT Dewey Library - GE230.E594 2018 Full Article
po Exploring apocalyptica: coming to terms with environmental alarmism / edited by Frank Uekötter By library.mit.edu Published On :: Sun, 26 Apr 2020 06:32:35 EDT Hayden Library - GE40.E96 2018 Full Article
po The postwar origins of the global environment: how the United Nations built Spaceship Earth / Perrin Selcer By library.mit.edu Published On :: Sun, 26 Apr 2020 06:32:35 EDT Barker Library - GE195.S385 2018 Full Article
po Transforming rural water governance: the road from resource management to political activism in Nicaragua / Sarah T. Romano By library.mit.edu Published On :: Sun, 26 Apr 2020 06:32:35 EDT Dewey Library - TD231.N5 R66 2019 Full Article
po Environmental justice, popular struggle and community development / edited by Anne Harley and Eurig Scandrett By library.mit.edu Published On :: Sun, 26 Apr 2020 06:32:35 EDT Dewey Library - GE220.E58 2019 Full Article
po Struggles for climate justice: uneven geographies and the politics of connection / Brandon Barclay Derman By library.mit.edu Published On :: Sun, 26 Apr 2020 06:32:35 EDT Online Resource Full Article
po Sustainable groundwater management: a comparative analysis of French and Australian policies and implications to other countries / Jean-Daniel Rinaudo [and 3 others], editors By library.mit.edu Published On :: Sun, 26 Apr 2020 06:32:35 EDT Online Resource Full Article
po Responsible Consumption and Production. By library.mit.edu Published On :: Sun, 26 Apr 2020 06:32:35 EDT Online Resource Full Article
po Cooperative phenomenon of vapochromism and proton conduction of luminescent Pt(II) complexes for the visualisation of proton conductivity By feeds.rsc.org Published On :: Faraday Discuss., 2020, Accepted ManuscriptDOI: 10.1039/D0FD00001A, PaperAtsushi Kobayashi, Shin-ichiro Imada, Dongjin Wang, Yuki Nagao, Masaki Yoshida, Masako KatoThe luminescent and proton conductive Pt(II) complex [PtCl(tpy-o-py)]Cl and its HCl adduct [PtCl(tpy-o-pyH)]Cl2 (o-Pt and o-Pt·HCl, respectively; tpy-o-py = 2,2': 6',2''-terpyridine-6',2'''-pyridine) were synthesised and their crystal structures, vapochromic behaviour, and...The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
po The Role of Temperature and Adsorbate on Negative Gas Adsorption in the Mesoporous Metal-Organic Framework DUT-49 By feeds.rsc.org Published On :: Faraday Discuss., 2020, Accepted ManuscriptDOI: 10.1039/D0FD00013B, Paper Open Access   This article is licensed under a Creative Commons Attribution 3.0 Unported Licence.Simon Krause, Jack D. Evans, Volodymyr Bon, Irene Senkovska, François-Xavier Coudert, Daniel M Többens, Dirk Wallacher, Nico Grimm, Stefan KaskelUnusual adsorption phenomena, such as breathing and negative gas adsorption (NGA), are rare and challenge our understanding of the thermodynamics of adsorption in deformable porous solids. In particular, NGA appears...The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
po Dictionnaire universel chronologique et historique de Justice, police, et finances By reader.digitale-sammlungen.de Published On :: Thu, 16 Apr 2020 13:12:02 +0100 Autor: Chasles, François J. Erschienen 1725 BSB-Signatur 2 J.gall. 9-1 URN: urn:nbn:de:bvb:12-bsb10489826-5 URL: http://digitalisate.bsb-muenchen.de/bsb10489826/ Full Article
po The dynamics of care: maintaining patient treatment flows for an increasing older population / Eric Wolstenholme, Douglas McKelvie By library.mit.edu Published On :: Sun, 15 Mar 2020 06:46:24 EDT Online Resource Full Article
po Occupational therapy for older people Christian Pozzi, Alessandro Lanzoni, Maud J. L. Graff, Alessandro Morandi, editors By library.mit.edu Published On :: Sun, 15 Mar 2020 06:46:24 EDT Online Resource Full Article
po Plastic and cosmetic surgery of the male breast Adriana Cordova, Alessandro Innocenti, Francesca Toia, Massimiliano Tripoli, editors By library.mit.edu Published On :: Sun, 15 Mar 2020 06:46:24 EDT Online Resource Full Article
po Health and political engagement / Mikko Mattila By library.mit.edu Published On :: Sun, 22 Mar 2020 06:38:46 EDT Online Resource Full Article
po The convergence of infectious diseases and noncommunicable diseases: proceedings of a workshop / V. Ayanoo Ogawa, Cecilia Mundaca Shah, Yamrot Negussie, and Anna Nicholson, rapporteurs ; Forum on Microbial Threats, Board on Global Health, Health and Medic By library.mit.edu Published On :: Sun, 29 Mar 2020 06:39:15 EDT Online Resource Full Article
po A health equity approach to obesity efforts: proceedings of a workshop / Emily A. Callahan, rapporteur ; Roundtable on Obesity Solutions, Food and Nutrition Board, Health and Medicine Division, the National Academies of Sciences, Engineering, Medicine By library.mit.edu Published On :: Sun, 29 Mar 2020 06:39:15 EDT Online Resource Full Article
po Criteria for selecting the Leading Health Indicators for Healthy People 2030 / Committee on Informing the Selection of Leading Health Indicators for Healthy People 2030, Board on Population Health and Public Health Practice, Health and Medicine Division By library.mit.edu Published On :: Sun, 29 Mar 2020 06:39:15 EDT Online Resource Full Article
po Endocrinology of physical activity and sport / Anthony C. Hackney, Naama W. Constantini, editors By library.mit.edu Published On :: Sun, 5 Apr 2020 06:39:21 EDT Online Resource Full Article
po Sports-related Eye Injuries / edited by Hua Yan By library.mit.edu Published On :: Sun, 26 Apr 2020 07:06:33 EDT Online Resource Full Article
po Dimensions on nursing teaching and learning: supporting nursing students in learning nursing / Sheila Cunningham, editor By library.mit.edu Published On :: Sun, 26 Apr 2020 07:06:33 EDT Online Resource Full Article
po Others' milk: the potential of exceptional breastfeeding / Kristin J. Wilson By library.mit.edu Published On :: Sun, 26 Apr 2020 07:06:33 EDT Hayden Library - RJ216.W683 2018 Full Article
po To raise up the man farthest down: Tuskegee University's advancements in human health, 1881-1987 / Dana R. Chandler and Edith Powell ; foreword by Linda Kenney Miller By library.mit.edu Published On :: Sun, 26 Apr 2020 07:06:33 EDT Hayden Library - R746.A2C5 2018 Full Article
po The Cambridge companion to Hippocrates / edited by Peter E. Pormann By library.mit.edu Published On :: Sun, 26 Apr 2020 07:06:33 EDT Hayden Library - R126.H8 C36 2018 Full Article
po Atlas of operative maxillofacial trauma surgery: post-traumatic deformity / Michael Perry, Simon Holmes, editors By library.mit.edu Published On :: Sun, 26 Apr 2020 07:06:33 EDT Online Resource Full Article
po Death is all around us: corpses, chaos, and public health in Porfirian Mexico City / Jonathan M. Weber By library.mit.edu Published On :: Sun, 26 Apr 2020 07:06:33 EDT Hayden Library - RA452.M6 W43 2019 Full Article
po Dr. Arthur Spohn: surgeon, inventor, and Texas medical pioneer / Jane Clements Monday and Frances Brannen Vick ; with Charles W. Monday Jr. ; introduction by Kenneth L. Mattox By library.mit.edu Published On :: Sun, 26 Apr 2020 07:06:33 EDT Hayden Library - R154.S66 M66 2018 Full Article
po Built-in Browser Support for Responsive Images By feedproxy.google.com Published On :: Thu, 11 Sep 2014 00:00:00 +0000 Take advantage of the new element and new features of in your next responsive website. Full Article
po Rolling out Public Key Pinning with HPKP Reporting By feedproxy.google.com Published On :: Tue, 01 Sep 2015 00:00:00 +0000 Full Article
po Responsible JavaScript: Part I By feedproxy.google.com Published On :: 2019-03-28T09:07:40+00:00 By the numbers, JavaScript is a performance liability. If the trend persists, the median page will be shipping at least 400 KB of it before too long, and that’s merely what’s transferred. Like other text-based resources, JavaScript is almost always served compressed—but that might be the only thing we’re getting consistently right in its delivery. Unfortunately, while reducing resource transfer time is a big part of that whole performance thing, compression has no effect on how long browsers take to process a script once it arrives in its entirety. If a server sends 400 KB of compressed JavaScript, the actual amount browsers have to process after decompression is north of a megabyte. How well devices cope with these heavy workloads depends, well, on the device. Much has been written about how adept various devices are at processing lots of JavaScript, but the truth is, the amount of time it takes to process even a trivial amount of it varies greatly between devices. Take, for example, this throwaway project of mine, which serves around 23 KB of uncompressed JavaScript. On a mid-2017 MacBook Pro, Chrome chews through this comparably tiny payload in about 25 ms. On a Nokia 2 Android phone, however, that figure balloons to around 190 ms. That’s not an insignificant amount of time, but in either case, the page gets interactive reasonably fast. Now for the big question: how do you think that little Nokia 2 does on an average page? It chokes. Even on a fast connection, browsing the web on it is an exercise in patience as JavaScript-laden web pages brick it for considerable stretches of time. Figure 1. A performance timeline overview of a Nokia 2 Android phone browsing on a page where excessive JavaScript monopolizes the main thread. While devices and the networks they navigate the web on are largely improving, we’re eating those gains as trends suggest. We need to use JavaScript responsibly. That begins with understanding what we’re building as well as how we’re building it. The mindset of “sites” versus “apps” Nomenclature can be strange in that we sometimes loosely identify things with terms that are inaccurate, yet their meanings are implicitly understood by everyone. Sometimes we overload the term “bee” to also mean “wasp”, even though the differences between bees and wasps are substantial. Those differences can motivate you to deal with each one differently. For instance, we’ll want to destroy a wasp nest, but because bees are highly beneficial and vulnerable insects, we may opt to relocate them. We can be just as fast and loose in interchanging the terms “website” and “web app”. The differences between them are less clear than those between yellowjackets and honeybees, but conflating them can bring about painful outcomes. The pain comes in the affordances we allow ourselves when something is merely a “website” versus a fully-featured “web app.” If you’re making an informational website for a business, you’re less likely to lean on a powerful framework to manage changes in the DOM or implement client-side routing—at least, I hope. Using tools so ill-suited for the task would not only be a detriment to the people who use that site but arguably less productive. When we build a web app, though, look out. We’re installing packages which usher in hundreds—if not thousands—of dependencies, some of which we’re not sure are even safe. We’re also writing complicated configurations for module bundlers. In this frenzied, yet ubiquitous, sort of dev environment, it takes knowledge and vigilance to ensure what gets built is fast and accessible. If you doubt this, run npm ls --prod in your project’s root directory and see if you recognize everything in that list. Even if you do, that doesn’t account for third party scripts—of which I’m sure your site has at least a few. What we tend to forget is that the environment websites and web apps occupy is one and the same. Both are subject to the same environmental pressures that the large gradient of networks and devices impose. Those constraints don’t suddenly vanish when we decide to call what we build “apps”, nor do our users’ phones gain magical new powers when we do so. It’s our responsibility to evaluate who uses what we make, and accept that the conditions under which they access the internet can be different than what we’ve assumed. We need to know the purpose we’re trying to serve, and only then can we build something that admirably serves that purpose—even if it isn’t exciting to build. That means reassessing our reliance on JavaScript and how the use of it—particularly to the exclusion of HTML and CSS—can tempt us to adopt unsustainable patterns which harm performance and accessibility. Don’t let frameworks force you into unsustainable patterns I’ve been witness to some strange discoveries in codebases when working with teams that depend on frameworks to help them be highly productive. One characteristic common among many of them is that poor accessibility and performance patterns often result. Take the React component below, for example: import React, { Component } from "react"; import { validateEmail } from "helpers/validation"; class SignupForm extends Component { constructor (props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); this.updateEmail = this.updateEmail.bind(this); this.state.email = ""; } updateEmail (event) { this.setState({ email: event.target.value }); } handleSubmit () { // If the email checks out, submit if (validateEmail(this.state.email)) { // ... } } render () { return ( Enter your email: Sign Up ); } } There are some notable accessibility issues here: A form that doesn’t use a <form> element is not a form. Indeed, you could paper over this by specifying role="form" in the parent <div>, but if you’re building a form—and this sure looks like one—use a <form> element with the proper action and method attributes. The action attribute is crucial, as it ensures the form will still do something in the absence of JavaScript—provided the component is server-rendered, of course.A <span> is not a substitute for a <label> element, which provides accessibility benefits <span>s don’t.If we intend to do something on the client side prior to submitting a form, then we should move the action bound to the <button> element's onClick handler to the <form> element’s onSubmit handler.Incidentally, why use JavaScript to validate an email address when HTML5 offers form validation controls in almost every browser back to IE 10? There’s an opportunity here to rely on the browser and use an appropriate input type, as well as the required attribute—but be aware that getting this to work right with screen readers takes a little know-how.While not an accessibility issue, this component doesn't rely on any state or lifecycle methods, which means it can be refactored into a stateless functional component, which uses considerably less JavaScript than a full-fledged React component. Knowing these things, we can refactor this component: import React from "react"; const SignupForm = props => { const handleSubmit = event => { // Needed in case we're sending data to the server XHR-style // (but will still work if server-rendered with JS disabled). event.preventDefault(); // Carry on... }; return ( <form method="POST" action="/signup" onSubmit={handleSubmit}> <label for="email" class="email-label">Enter your email:</label> <input type="email" id="email" required /> <button>Sign Up</button> </form> ); }; Not only is this component now more accessible, but it also uses less JavaScript. In a world that’s drowning in JavaScript, deleting lines of it should feel downright therapeutic. The browser gives us so much for free, and we should try to take advantage of that as often as possible. This is not to say that inaccessible patterns occur only when frameworks are used, but rather that a sole preference for JavaScript will eventually surface gaps in our understanding of HTML and CSS. These knowledge gaps will often result in mistakes we may not even be aware of. Frameworks can be useful tools that increase our productivity, but continuing education in core web technologies is essential to creating usable experiences, no matter what tools we choose to use. Rely on the web platform and you’ll go far, fast While we’re on the subject of frameworks, it must be said that the web platform is a formidable framework of its own. As the previous section showed, we’re better off when we can rely on established markup patterns and browser features. The alternative is to reinvent them, and invite all the pain such endeavors all but guarantee us, or worse: merely assume that the author of every JavaScript package we install has solved the problem comprehensively and thoughtfully. SINGLE PAGE APPLICATIONS One of the tradeoffs developers are quick to make is to adopt the single page application (SPA) model, even if it’s not a fit for the project. Yes, you do gain better perceived performance with the client-side routing of an SPA, but what do you lose? The browser’s own navigation functionality—albeit synchronous—provides a slew of benefits. For one, history is managed according to a complex specification. Users without JavaScript—be it by their own choice or not—won’t lose access altogether. For SPAs to remain available when JavaScript is not, server-side rendering suddenly becomes a thing you have to consider. Figure 2. A comparison of an example app loading on a slow connection. The app on the left depends entirely upon JavaScript to render a page. The app on the right renders a response on the server, but then uses client-side hydration to attach components to the existing server-rendered markup. Accessibility is also harmed if a client-side router fails to let people know what content on the page has changed. This can leave those reliant on assistive technology to suss out what changes have occurred on the page, which can be an arduous task. Then there’s our old nemesis: overhead. Some client-side routers are very small, but when you start with React, a compatible router, and possibly even a state management library, you’re accepting that there’s a certain amount of code you can never optimize away—approximately 135 KB in this case. Carefully consider what you’re building and whether a client side router is worth the tradeoffs you’ll inevitably make. Typically, you’re better off without one. If you’re concerned about the perceived navigation performance, you could lean on rel=prefetch to speculatively fetch documents on the same origin. This has a dramatic effect on improving perceived loading performance of pages, as the document is immediately available in the cache. Because prefetches are done at a low priority, they’re also less likely to contend with critical resources for bandwidth. Figure 3. The HTML for the writing/ URL is prefetched on the initial page. When the writing/ URL is requested by the user, the HTML for it is loaded instantaneously from the browser cache. The primary drawback with link prefetching is that you need to be aware that it can be potentially wasteful. Quicklink, a tiny link prefetching script from Google, mitigates this somewhat by checking if the current client is on a slow connection—or has data saver mode enabled—and avoids prefetching links on cross-origins by default. Service workers are also hugely beneficial to perceived performance for returning users, whether we use client side routing or not—provided you know the ropes. When we precache routes with a service worker, we get many of the same benefits as link prefetching, but with a much greater degree of control over requests and responses. Whether you think of your site as an “app” or not, adding a service worker to it is perhaps one of the most responsible uses of JavaScript that exists today. JAVASCRIPT ISN’T THE SOLUTION TO YOUR LAYOUT WOES If we’re installing a package to solve a layout problem, proceed with caution and ask “what am I trying to accomplish?” CSS is designed to do this job, and requires no abstractions to use effectively. Most layout issues JavaScript packages attempt to solve, like box placement, alignment, and sizing, managing text overflow, and even entire layout systems, are solvable with CSS today. Modern layout engines like Flexbox and Grid are supported well enough that we shouldn’t need to start a project with any layout framework. CSS is the framework. When we have feature queries, progressively enhancing layouts to adopt new layout engines is suddenly not so hard. /* Your mobile-first, non-CSS grid styles goes here */ /* The @supports rule below is ignored by browsers that don't support CSS grid, _or_ don't support @supports. */ @supports (display: grid) { /* Larger screen layout */ @media (min-width: 40em) { /* Your progressively enhanced grid layout styles go here */ } } Using JavaScript solutions for layout and presentations problems is not new. It was something we did when we lied to ourselves in 2009 that every website had to look in IE6 exactly as it did in the more capable browsers of that time. If we’re still developing websites to look the same in every browser in 2019, we should reassess our development goals. There will always be some browser we’ll have to support that can’t do everything those modern, evergreen browsers can. Total visual parity on all platforms is not only a pursuit made in vain, it’s the principal foe of progressive enhancement. I’m not here to kill JavaScript Make no mistake, I have no ill will toward JavaScript. It’s given me a career and—if I’m being honest with myself—a source of enjoyment for over a decade. Like any long-term relationship, I learn more about it the more time I spend with it. It’s a mature, feature-rich language that only gets more capable and elegant with every passing year. Yet, there are times when I feel like JavaScript and I are at odds. I am critical of JavaScript. Or maybe more accurately, I’m critical of how we’ve developed a tendency to view it as a first resort to building for the web. As I pick apart yet another bundle not unlike a tangled ball of Christmas tree lights, it’s become clear that the web is drunk on JavaScript. We reach for it for almost everything, even when the occasion doesn’t call for it. Sometimes I wonder how vicious the hangover will be. In a series of articles to follow, I’ll be giving more practical advice to follow to stem the encroaching tide of excessive JavaScript and how we can wrangle it so that what we build for the web is usable—or at least more so—for everyone everywhere. Some of the advice will be preventative. Some will be mitigating “hair of the dog” measures. In either case, the outcomes will hopefully be the same. I believe that we all love the web and want to do right by it, but I want us to think about how to make it more resilient and inclusive for all. Full Article
po Accessibility for Vestibular Disorders: How My Temporary Disability Changed My Perspective By feedproxy.google.com Published On :: 2019-04-04T01:55:13+00:00 Accessibility can be tricky. There are plenty of conditions to take into consideration, and many technical limitations and weird exceptions that make it quite hard to master for most designers and developers. I never considered myself an accessibility expert, but I took great pride in making my projects Web Content Accessibility Guidelines (WCAG) compliant…ish. They would pass most automated tests, show perfectly in the accessibility tree, and work quite well with keyboard navigation. I would even try (and fail) to use a screen reader every now and then. But life would give me a lesson I would probably never learn otherwise: last October, my abled life took a drastic change—I started to feel extremely dizzy, with a constant sensation of falling or spinning to the right. I was suffering from a bad case of vertigo caused by labyrinthitis that made it impossible to get anything done. Vertigo can have a wide range of causes, the most common being a viral infection or tiny calcium crystal free floating in the inner ear, which is pretty much our body’s accelerometer. Any disruption in there sends the brain confusing signals about the body’s position, which causes really heavy nausea, dizziness, and headaches. If you’ve ever felt seasick, it’s quite a similar vibe. If not, think about that feeling when you just get off a rollercoaster…it’s like that, only all day long. For most people, vertigo is something they’ll suffer just once in a lifetime, and it normally goes away in a week or two. Incidence is really high, with some estimates claiming that up to 40% of the population suffers vertigo at least once in their lifetime. Some people live all their lives with it (or with similar symptoms caused by a range of diseases and syndromes grouped under the umbrella term of vestibular disorders), with 4% of US adults reporting chronic problems with balance, and an additional 1.1% reporting chronic dizziness, according to the American Speech-Language-Hearing Association. In my case, it was a little over a month. Here’s what I learned while going through it. Slants can trigger vestibular symptoms It all started as I was out for my daily jog. I felt slightly dizzy, then suddenly my vision got totally distorted. Everything appeared further away, like looking at a fun house’s distortion mirror. I stumbled back home and rested; at that moment I believed I might have over-exercised, and that hydration, food, and rest were all I needed. Time would prove me wrong. What I later learned was that experiencing vertigo is a constant war between one of your inner ears telling the brain “everything is fine, we’re level and still” and the other ear shouting “oh my God, we’re falling, we’re falling!!!” Visual stimuli can act as an intermediary, supporting one ear’s message or the other’s. Vertigo can also work in the opposite way, with the dizziness interfering with your vision. I quickly found that when symptoms peaked, staring at a distant object would ease the falling sensation somewhat. In the same fashion, some visual stimuli would worsen it. Vertical slants were a big offender in that sense. For instance, looking at a subtle vertical slant (the kind that you’d have to look at twice to make sure it’s not perfectly vertical) on a webpage would instantly trigger symptoms for me. Whether it was a page-long slant used to create some interest beside text or a tiny decoration to mark active tabs, looking at anything with slight slants would instantly send me into the rollercoaster. Horizontal slants (whatever the degree) and harder vertical slants wouldn’t cause these issues. My best guess is that slight vertical slants can look like forced perspective and therefore reinforce the falling-from-height sensation, so I would recommend avoiding vertical slants if you can, or make them super obvious. A slight slant looks like perspective, a harder one looks like a triangle. Target size matters (even on mouse-assisted devices) After a magnetic resonance imaging (MRI) scan, some tests to discard neurological conditions, and other treatments that proved ineffective, I was prescribed Cinnarizine. Cinnarizine is a calcium channel blocker—to put it simply, it prevents the malfunctioning inner ear “accelerometer” from sending incorrect info to the brain. And it worked wonders. After ten days of being barely able to get out of bed, I was finally getting something closer to my normal life. I would still feel dizzy all the time, with some peaks throughout the day, but for the most part, it was much easier. At this point, I was finally able to use the computer (but still unable to produce any code at all). To make the best of it, I set on a mission to self-experiment on accessibility for vestibular disorders. In testing, I found that one of the first things that struck me was that I would always miss targets (links and buttons). I’m from the generation that grew up with desktop computers, so using a mouse is second nature. The pointer is pretty much an extension of my mind, as it is for many who use it regularly. But while Cinnarizine helped with the dizziness, it has a common side effect of negatively impacting coordination and fine motor skills (it is recommended not to drive or operate machinery while under treatment). It was not a surprise when I realized it would be much harder to get the pointer to do what I intended. The common behavior would be: moving the pointer past the link I intended to click, clicking before reaching it at all, or having to try multiple times to click on smaller targets. Success Criterion 2.5.5 Target Size (Level AAA) of the World Wide Web Consortium (W3C)’s WCAG recommends bigger target sizes so users can activate them easily. The obvious reason for this is that it’s harder to pinpoint targets on smaller screens with coarser inputs (i.e., touchscreens of mobile devices). A fairly common practice for developers is to set bigger target sizes for smaller viewport widths (assuming that control challenges are only touch-related), while neglecting the issue on big screens expected to be used with mouse input. I know I’m guilty of that myself. Instead of targeting this behavior for just smaller screen sizes, there are plenty of reasons to create larger target sizes on all devices: it will benefit users with limited vision (when text is scaled up accordingly and colors are of sufficient contrast), users with mobility impairments such as hand tremors, and of course, users with difficulty with fine motor skills. Font size and spacing Even while “enjoying” the ease of symptoms provided by the treatment, reading anything still proved to be a challenge for the following three weeks. I was completely unable to use mobile devices while suffering vertigo due to the smaller font sizes and spacing, so I was forced to use my desktop computer for everything. I can say I was experiencing something similar to users with mild forms of dyslexia or attention disorders: whenever I got to a website that didn’t follow good font styling, I would find myself reading the same line over and over again. This proves once again that accessibility is intersectional: when we improve things for a particular purpose it usually benefits users with other challenges as well. I used to believe recommendations on font styles were mostly intended for the nearsighted and those who have dyslexia. Turns out they are also critical for those with vertigo, and even for those with some cognitive differences. At the end of the day, everybody benefits from better readability. Some actions you can take to improve readability are: Keep line height to at least 1.5 times the font size (i.e., line-height: 1.5).Set the spacing between paragraphs to at least 2.0 times the font size. We can do this by adjusting the margins using relative units such as em.Letter spacing should be at least 0.12 times the font size. We can adjust this by using the letter-spacing CSS property, perhaps setting it in a relative unit.Make sure to have good contrast between text and its background.Keep font-weight at a reasonable level for the given font-family. Some fonts have thin strokes that make them harder to read. When using thinner fonts, try to improve contrast and font size accordingly, even more than what WCAG would suggest.Choose fonts that are easy to read. There has been a large and still inconclusive debate on which font styles are better for users, but one thing I can say for sure is that popular fonts (as in fonts that the user might be already familiar with) are generally the least challenging for users with reading issues. WCAG recommendations on text are fairly clear and fortunately are the most commonly implemented of recommendations, but even they can still fall short sometimes. So, better to follow specific guides on accessible text and your best judgement. Passing automated tests does not guarantee actual accessibility. Another issue on which my experience with vertigo proved to be similar to that of people with dyslexia and attention disorders was how hard it was for me to keep my attention in just one place. In that sense… Animations are bad (and parallax is pure evil) Val Head has already covered visually-triggered vestibular disorders in an outstanding article, so I would recommend giving it a good read if you haven’t already. To summarize, animations can trigger nausea, dizziness, and headaches in some users, so we should use them purposely and responsibly. While most animations did not trigger my symptoms, parallax scrolling did. I’d never been a fan of parallax to begin with, as I found it confusing. And when you’re experiencing vertigo, the issues introduced by parallax scrolling compound. Really, there are no words to describe just how bad a simple parallax effect, scrolljacking, or even background-attachment: fixed would make me feel. I would rather jump on one of those 20-G centrifuges astronauts use than look at a website with parallax scrolling. Every time I encountered it, I would put the bucket beside me to good use and be forced to lie in bed for hours as I felt the room spinning around me, and no meds could get me out of it. It was THAT bad. Though normal animations did not trigger a reaction as severe, they still posed a big problem. The extreme, conscious, focused effort it took to read would make it such that anything moving on the screen would instantly break my focus, and force me to start the paragraph all over. And I mean anything. I would constantly find myself reading a website only to have the typical collapsing navigation bar on scroll distract me just enough that I’d totally lose count of where I was at. Autoplaying carousels were so annoying I would delete them using dev tools as soon as they showed up. Background videos would make me get out of the website desperately. Over time I started using mouse selection as a pointer; a visual indication of what I’d already read so I could get back to it whenever something distracted me. Then I tried custom stylesheets to disable transforms and animations whenever possible, but that also meant many websites having critical elements not appear at all, as they were implemented to start off-screen or otherwise invisible, and show up on scroll. Of course, deleting stuff via dev tools or using custom stylesheets is not something we can expect 99.99% of our users to even know about. So if anything, consider reducing animations to a minimum. Provide users with controls to turn off non-essential animations (WCAG 2.2.3 Animation from Interactions) and to pause, stop, or hide them (WCAG 2.2.2 Pause, Stop, Hide). Implement animations and transitions in such a way that if the user disables them, critical elements still display. And be extra careful with parallax: my recommendation is to, at the very least, try limiting its use to the header (“hero”) only, and be mindful of getting a smooth, realistic parallax experience. My vertigo self would have said, “just don’t freaking use parallax. Never. EVER.” But I guess that might be a hard idea to sell to stakeholders and designers. Also consider learning how to use the prefers-reduced-motion feature query. This is a newer addition to the specs (it’s part of the Media Queries Level 5 module , which is at an early Editor’s Draft stage) that allows authors to apply selective styling depending on whether the user has requested the system to minimize the use of animations. OS and browser support for it is still quite limited, but the day will come when we will set any moving thing inside a query for when the user has no-preference, blocking animations from those who choose reduce. After about a week of wrestling websites to provide a static experience, I remembered something that would prove to be my biggest ally while the vertigo lasted: Reader mode Some browsers include a “reader mode” that strips the content from any styling choices, isolates it from any distraction, and provides a perfect WCAG compliant layout for the text to maximize readability. It is extremely helpful to provide a clear and consistent reading experience throughout multiple websites, especially for users with any kind of reading impairment. I have to confess: before experiencing my vestibular disorder, I had never used Reader Mode (the formal name varies in browsers) or even checked if my projects were compatible with it. I didn’t even think it was such a useful feature, as a quick search for “reader mode” actually returned quite a few threads by users asking how to disable it or how to take the button for it out of Firefox’s address bar. (It seems some people are unwittingly activating it…perhaps the icon is not clear enough.) Displaying the button to access Reader Mode is toggled by browser heuristics, which are based on the use (or not) of semantic tags in a page’s HTML. Unfortunately this meant not all websites provided such a “luxury.” I really wish I wouldn’t have to say this in 2019…but please, please use semantic tags. Correct conversational semantics allow your website to be displayed in Reader Mode, and provide a better experience for users of screen readers. Again, accessibility is intersectional. Reader Mode proved to be extremely useful while my vertigo lasted. But there was something even better: Dark color schemes By the fourth week, I started feeling mostly fine. I opened Visual Studio Code to try to get back to work. In doing so, it served me well to find one more revelation: a light-text-on-dark-background scheme was SO much easier for me to read. (Though I still was not able to return to work at this time.) I was quite surprised, as I had always preferred light mode with dark-text-on-light-background for reading, and dark mode, with light-text-on-dark for coding. I didn’t know at the time that I was suffering from photophobia (which is a sensitivity to light), which was one of the reasons I found it hard to read on my desktop and to use my mobile device at all. As far as I know, photophobia is not a common symptom of vestibular disorders, but there are many conditions that will trigger it, so it’s worth looking into for our projects’ accessibility. CSS is also planning a media query to switch color schemes. Known as prefers-color-scheme, it allows applying styles based on the user’s stated preference for dark or light theming. It’s also part of the Media Queries Level 5 spec, and at the time of writing this article it’s only available in Safari Technology Preview, with Mozilla planning to ship it in the upcoming Firefox 67. Luckily there’s a PostCSS plugin that allows us to use it in most modern browsers by turning prefers-color-schemequeries into color-index queries, which have much better support. If PostCSS is not your cup of tea, or for whatever reason you cannot use that approach to automate switching color schemes to a user’s preference, try at least to provide a theming option in your app’s configuration. Theming has become extremely simple since the release of CSS Custom Properties, so implementing this sort of switch is relatively easy and will greatly benefit anyone experiencing photophobia. Moving on After a month and some days, the vertigo disappeared completely, and I was able to return to work without needing any meds or further treatment. It should stay that way, as for most people it’s a once-in-a-lifetime occurrence. I went back to my abled life, but the experience changed my mindset for good. As I said before, I always cared for making my projects compatible for people using keyboard navigation and screen readers. But I learned the hard way that there are plenty of “invisible conditions” that are just as important to take into consideration: vestibular disorders, cognitive differences, dyslexia, and color blindness, just to name a few. I was totally neglecting those most of the time, barely addressing the issues in order to pass automated tests, which means I was unintentionally annoying some users by making websites inaccessible to them. After my experience with vertigo, I’ve turned to an accessibility-first approach to design and development. Now I ask myself, “am I leaving anyone behind with this decision?,” before dropping a single line of code. Accessibility should never be an afterthought. Making sure my projects work from the start for those with difficulties also improves the experience for everyone else. Think about how improving text styles for users with dyslexia, vertigo, or visual problems improves readability for all users, or how being able to control animations or choose a color scheme can be critical for users with attention disorders and photophobia, respectively, while also a nice feature for everybody. It also turned my workflow into a much smoother development experience, as addressing accessibility issues from the beginning can mean a slower start, but it’s also much easier and faster than trying to fix broken accessibility afterwards. I hope that by sharing my personal experience with vertigo, I’ve illustrated how we can all design and develop a better web for everybody. Remember, we’re all just temporarily abled. Full Article
po Responsible JavaScript: Part II By feedproxy.google.com Published On :: 2019-06-13T13:30:28+00:00 You and the rest of the dev team lobbied enthusiastically for a total re-architecture of the company’s aging website. Your pleas were heard by management—even up to the C-suite—who gave the green light. Elated, you and the team started working with the design, copy, and IA teams. Before long, you were banging out new code. It started out innocently enough with an npm install here and an npm install there. Before you knew it, though, you were installing production dependencies like an undergrad doing keg stands without a care for the morning after. Then you launched. Unlike the aftermath of most copious boozings, the agony didn’t start the morning after. Oh, no. It came months later in the ghastly form of low-grade nausea and headache of product owners and middle management wondering why conversions and revenue were both down since the launch. It then hit a fever pitch when the CTO came back from a weekend at the cabin and wondered why the site loaded so slowly on their phone—if it indeed ever loaded at all. Everyone was happy. Now no one is happy. Welcome to your first JavaScript hangover. It’s not your fault When you’re grappling with a vicious hangover, “I told you so” would be a well-deserved, if fight-provoking, rebuke—assuming you could even fight in so sorry a state. When it comes to JavaScript hangovers, there’s plenty of blame to dole out. Pointing fingers is a waste of time, though. The landscape of the web today demands that we iterate faster than our competitors. This kind of pressure means we’re likely to take advantage of any means available to be as productive as possible. That means we’re more likely—but not necessarily doomed—to build apps with more overhead, and possibly use patterns that can hurt performance and accessibility. Web development isn't easy. It’s a long slog we rarely get right on the first try. The best part of working on the web, however, is that we don’t have to get it perfect at the start. We can make improvements after the fact, and that’s just what the second installment of this series is here for. Perfection is a long ways off. For now, let’s take the edge off of that JavaScript hangover by improving your site’s, er, scriptuation in the short term. Round up the usual suspects It might seem rote, but it’s worth going through the list of basic optimizations. It’s not uncommon for large development teams—particularly those that work across many repositories or don’t use optimized boilerplate—to overlook them. Shake those trees First, make sure your toolchain is configured to perform tree shaking. If tree shaking is new to you, I wrote a guide on it last year you can consult. The short of it is that tree shaking is a process in which unused exports in your codebase don’t get packaged up in your production bundles. Tree shaking is available out of the box with modern bundlers such as webpack, Rollup, or Parcel. Grunt or gulp—which are not bundlers, but rather task runners—won’t do this for you. A task runner doesn’t build a dependency graph like a bundler does. Rather, they perform discrete tasks on the files you feed to them with any number of plugins. Task runners can be extended with plugins to use bundlers to process JavaScript. If extending task runners in this way is problematic for you, you’ll likely need to manually audit and remove unused code. For tree shaking to be effective, the following must be true: Your app logic and the packages you install in your project must be authored as ES6 modules. Tree shaking CommonJS modules isn’t practically possible.Your bundler must not transform ES6 modules into another module format at build time. If this happens in a toolchain that uses Babel, @babel/preset-env configuration must specify modules: false to prevent ES6 code from being converted to CommonJS. On the off chance tree shaking isn’t occurring during your build, getting it to work may help. Of course, its effectiveness varies on a case-by-case basis. It also depends on whether the modules you import introduce side effects, which may influence a bundler’s ability to shake unused exports. Split that code Chances are good that you’re employing some form of code splitting, but it’s worth re-evaluating how you’re doing it. No matter how you’re splitting code, there are two questions that are always worth asking yourself: Are you deduplicating common code between entry points?Are you lazy loading all the functionality you reasonably can with dynamic import()? These are important because reducing redundant code is essential to performance. Lazy loading functionality also improves performance by lowering the initial JavaScript footprint on a given page. On the redundancy front, using an analysis tool such as Bundle Buddy can help you find out if you have a problem. Bundle Buddy can examine your webpack compilation statistics and determine how much code is shared between your bundles. Where lazy loading is concerned, it can be a bit difficult to know where to start looking for opportunities. When I look for opportunities in existing projects, I’ll search for user interaction points throughout the codebase, such as click and keyboard events, and similar candidates. Any code that requires a user interaction to run is a potentially good candidate for dynamic import(). Of course, loading scripts on demand brings the possibility that interactivity could be noticeably delayed, as the script necessary for the interaction must be downloaded first. If data usage is not a concern, consider using the rel=prefetch resource hint to load such scripts at a low priority that won’t contend for bandwidth against critical resources. Support for rel=prefetch is good, but nothing will break if it’s unsupported, as such browsers will ignore markup they doesn’t understand. Externalize third-party hosted code Ideally, you should self-host as many of your site’s dependencies as possible. If for some reason you must load dependencies from a third party, mark them as externals in your bundler’s configuration. Failing to do so could mean your website’s visitors will download both locally hosted code and the same code from a third party. Let’s look at a hypothetical situation where this could hurt you: say that your site loads Lodash from a public CDN. You've also installed Lodash in your project for local development. However, if you fail to mark Lodash as external, your production code will end up loading a third party copy of it in addition to the bundled, locally hosted copy. This may seem like common knowledge if you know your way around bundlers, but I’ve seen it get overlooked. It’s worth your time to check twice. If you aren’t convinced to self-host your third-party dependencies, then consider adding dns-prefetch, preconnect, or possibly even preload hints for them. Doing so can lower your site’s Time to Interactive and—if JavaScript is critical to rendering content—your site’s Speed Index. Smaller alternatives for less overhead Userland JavaScript is like an obscenely massive candy store, and we as developers are awed by the sheer amount of open source offerings. Frameworks and libraries allow us to extend our applications to quickly do all sorts of stuff that would otherwise take loads of time and effort. While I personally prefer to aggressively minimize the use of client-side frameworks and libraries in my projects, their value is compelling. Yet, we do have a responsibility to be a bit hawkish when it comes to what we install. When we’ve already built and shipped something that depends on a slew of installed code to run, we’ve accepted a baseline cost that only the maintainers of that code can practically address. Right? Maybe, but then again, maybe not. It depends on the dependencies used. For instance, React is extremely popular, but Preact is an ultra-small alternative that largely shares the same API and retains compatibility with many React add-ons. Luxon and date-fns are much more compact alternatives to moment.js, which is not exactly tiny. Libraries such as Lodash offer many useful methods. Yet, some of them are easily replaceable with native ES6. Lodash’s compact method, for example, is replaceable with the filter array method. Many more can be replaced without much effort, and without the need for pulling in a large utility library. Whatever your preferred tools are, the idea is the same: do some research to see if there are smaller alternatives, or if native language features can do the trick. You may be surprised at how little effort it may take you to seriously reduce your app’s overhead. Differentially serve your scripts There’s a good chance you’re using Babel in your toolchain to transform your ES6 source into code that can run on older browsers. Does this mean we’re doomed to serve giant bundles even to browsers that don’t need them, until the older browsers disappear altogether? Of course not! Differential serving helps us get around this by generating two different builds of your ES6 source: Bundle one, which contains all the transforms and polyfills required for your site to work on older browsers. You’re probably already serving this bundle right now.Bundle two, which contains little to none of the transforms and polyfills because it targets modern browsers. This is the bundle you’re probably not serving—at least not yet. Achieving this is a bit involved. I’ve written a guide on one way you can do it, so there’s no need for a deep dive here. The long and short of it is that you can modify your build configuration to generate an additional but smaller version of your site’s JavaScript code, and serve it only to modern browsers. The best part is that these are savings you can achieve without sacrificing any features or functionality you already offer. Depending on your application code, the savings could be quite significant. A webpack-bundle-analyzer analysis of a project's legacy bundle (left) versus one for a modern bundle (right). View full-sized image. The simplest pattern for serving these bundles to their respective platforms is brief. It also works a treat in modern browsers: <!-- Modern browsers load this file: --> <script type="module" src="/js/app.mjs"></script> <!-- Legacy browsers load this file: --> <script defer nomodule src="/js/app.js"></script> Unfortunately, there’s a caveat with this pattern: legacy browsers like IE 11—and even relatively modern ones such as Edge versions 15 through 18—will download both bundles. If this is an acceptable trade-off for you, then worry no further. On the other hand, you'll need a workaround if you’re concerned about the performance implications of older browsers downloading both sets of bundles. Here’s one potential solution that uses script injection (instead of the script tags above) to avoid double downloads on affected browsers: var scriptEl = document.createElement("script"); if ("noModule" in scriptEl) { // Set up modern script scriptEl.src = "/js/app.mjs"; scriptEl.type = "module"; } else { // Set up legacy script scriptEl.src = "/js/app.js"; scriptEl.defer = true; // type="module" defers by default, so set it here. } // Inject! document.body.appendChild(scriptEl); This script infers that if a browser supports the nomodule attribute in the script element, it understands type="module". This ensures that legacy browsers only get legacy scripts and modern browsers only get modern ones. Be warned, though, that dynamically injected scripts load asynchronously by default, so set the async attribute to false if dependency order is crucial. Transpile less I’m not here to trash Babel. It’s indispensable, but lordy, it adds a lot of extra stuff without your ever knowing. It pays to peek under the hood to see what it’s up to. Some minor changes in your coding habits can have a positive impact on what Babel spits out. https://twitter.com/_developit/status/1110229993999777793 To wit: default parameters are a very handy ES6 feature you probably already use: function logger(message, level = "log") { console[level](message); } The thing to pay attention to here is the level parameter, which has a default of “log.” This means if we want to invoke console.log with this wrapper function, we don’t need to specify level. Great, right? Except when Babel transforms this function, the output looks like this: function logger(message) { var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "log"; console[level](message); } This is an example of how, despite our best intentions, developer conveniences can backfire. What was a handful of bytes in our source has now been transformed into much larger in our production code. Uglification can’t do much about it either, as arguments can’t be reduced. Oh, and if you think rest parameters might be a worthy antidote, Babel’s transforms for them are even bulkier: // Source function logger(...args) { const [level, message] = args; console[level](message); } // Babel output function logger() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } const level = args[0], message = args[1]; console[level](message); } Worse yet, Babel transforms this code even for projects with a @babel/preset-env configuration targeting modern browsers, meaning the modern bundles in your differentially served JavaScript will be affected too! You could use loose transforms to soften the blow—and that’s a fine idea, as they’re often quite a bit smaller than their more spec-compliant counterparts—but enabling loose transforms can cause issues if you remove Babel from your build pipeline later on. Regardless of whether you decide to enable loose transforms, here’s one way to cut the cruft of transpiled default parameters: // Babel won't touch this function logger(message, level) { console[level || "log"](message); } Of course, default parameters aren’t the only feature to be wary of. For example, spread syntax gets transformed, as do arrow functions and a whole host of other stuff. If you don’t want to avoid these features altogether, you have a couple ways of reducing their impact: If you’re authoring a library, consider using @babel/runtime in concert with @babel/plugin-transform-runtime to deduplicate the helper functions Babel puts into your code.For polyfilled features in apps, you can include them selectively with @babel/polyfill via @babel/preset-env’s useBuiltIns: "usage" option. This is solely my opinion, but I believe the best choice is to avoid transpilation altogether in bundles generated for modern browsers. That’s not always possible, especially if you use JSX, which must be transformed for all browsers, or if you’re using bleeding edge language features that aren’t widely supported. In the latter case, it might be worth asking if those features are really necessary to deliver a good user experience (they rarely are). If you arrive at the conclusion that Babel must be a part of your toolchain, then it’s worth peeking under the hood from time to time to catch suboptimal stuff Babel might be doing that you can improve on. Improvement is not a race As you massage your temples wondering when this horrid JavaScript hangover is going to lift, understand that it’s precisely when we rush to get something out there as fast as we possibly can that the user experience can suffer. As the web development community obsesses on iterating faster in the name of competition, it’s worth your time to slow down a little bit. You’ll find that by doing so, you may not be iterating as fast as your competitors, but your product will be faster than theirs. As you take these suggestions and apply them to your codebase, know that progress doesn’t spontaneously happen overnight. Web development is a job. The truly impactful work is done when we’re thoughtful and dedicated to the craft for the long haul. Focus on steady improvements. Measure, test, repeat, and your site’s user experience will improve, and you’ll get faster bit by bit over time. Special thanks to Jason Miller for tech editing this piece. Jason is the creator and one of the many maintainers of Preact, a vastly smaller alternative to React with the same API. If you use Preact, please consider supporting Preact through Open Collective. Full Article
po A question of inequality: the politics of equal worth / Christopher Steed By library.mit.edu Published On :: Sun, 1 Mar 2020 08:00:08 EST Dewey Library - HB523.S78 2018 Full Article
po The Canadian environment in political context / Andrea Olive By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC120.E5 O45 2019 Full Article
po Behavioural macroeconomics: theory and policy / Paul de Grauwe and Yuemei Ji By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HB74.P8 G73 2019 Full Article
po Predatory value extraction: how the looting of the business corporation became the U.S. norm and how sustainable prosperity can be restored / William Lazonick and Jang-Sup Shin By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HB201.L39 2020 Full Article
po How rich countries got rich ... and why poor countries stay poor / Erik S. Reinert By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC21.R425 2019 Full Article
po Arguing with zombies: economics, politics, and the fight for a better future / Paul Krugman By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC106.84.K78 2020 Full Article
po The dark side of nudges / by Maria Alejandra Caporale Madi By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HB74.P8 C365 2020 Full Article
po Failure or reform?: market-based policy instruments for sustainable agriculture and resource management / Stewart Lockie By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC79.E5 L636 2019 Full Article
po Whatever it takes: the battle for post-crisis Europe/ George Papaconstantinou By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC240.P37 2020 Full Article
po Possessive individualism: a crisis of capitalism / Daniel W. Bromley By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HB501.B76 2019 Full Article
po Reinventing liberalism: the politics, philosophy and economics of early neoliberalism (1920-1947) / Ola Innset By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Online Resource Full Article
po Managing socio-ecological production landscapes and seascapes for sustainable communities in Asia: mapping and navigating stakeholders, policy and action / Osamu Saito, Suneetha M Subramanian, Shizuka Hashimoto, Kazuhiko Takeuchi, editors By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Online Resource Full Article
po Carlos Slim: the power, money, and morality of one of the world's richest men / Diego Enrique Osorno ; translated by Juana Adcock By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Dewey Library - HC132.5.S55 O85313 2019 Full Article
po Secrets and siblings: the vanished lives of China's one child policy / Mari Manninen ; translated by Mia Spangenberg By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Dewey Library - HB3654.A3 M3613 2019 Full Article