WebAssembly (aka wasm) is a new, standardized compilation target for the web, available in all modern browsers. But since it's so low level it can be difficult to see how it will revolutionize the future generations of React apps and potentially even power React itself. In this talk Jay will reveal what it is, how you can use it today, and the incredible opportunities it will continue to unlock.
Reactive programming nut and compiler enthusiast. Jay is a Senior Software Engineer at Netflix. Lover of all things open source, his contributions span numerous ecosystems. Former RxJS core team member and author of core-decorators, git-blame-someone-else, and co-author of redux-observable.
Presented at Jazoon, April 28th, 2017
A revolution is about to begin. WebAssembly (aka wasm) is shipping in all modern browsers, but since it’s (intentionally) very low level, it can be difficult to understand how it will be critical to future web applications–and definitely not just games and C++!
In this talk, Jay will demystify stack assembly languages like WebAssembly, even if you have zero experience with assembly and linear memory.
Jay Phelps talks about WebAssembly (aka wasm) - a new, standardized compilation target for the web, shipping in all modern browsers. He reveals what it is, how we can use it today, and the incredible opportunities it will unlock in the years to come.
Jay Phelps is a Senior Software Engineer at Netflix.
--
QConSF, Nov 15th, 2017. Video to be publically released, early access available to QCon attendees: https://www.infoq.com/presentations/webassembly-wasm-intro
Real-time Insights, powered by Reactive ProgrammingJay Phelps
Presented at Netflix HQ, March 21st, 2017
The time it takes you to debug your systems is critical, both in production and development. In this talk we'll reveal how we harness the power of Reactive Programming with RxJS and RxJava to provide real-time querying and transformation of extremely high volume logs.
Backpressure? Resistance is not futile. (Uphill Conf 2019)Jay Phelps
Backpressure--resistance opposing the desired flow of data through software--from massive scale, to death by a thousand cuts, it's something nearly every software engineer will have to deal with at some point. For some, it’s a frequent problem. But the term itself isn’t nearly as understood and recognized as such.
In this talk, we'll discover what backpressure really is, when it happens, and the strategies you can apply to deal with it.
(presented at Uphill Conf 2019)
WebAssembly. Neither Web Nor Assembly, All RevolutionaryC4Media
Video and slides synchronized, mp3 and slide download available at URL https://bit.ly/2tWqrMm.
Jay Phelps talks about WebAssembly, a bytecode designed and maintained by some of the major players in tech: Google, Microsoft, Apple, Mozilla, Intel, LG, and many others. He talks about what WebAssembly is and what it isn’t. Filmed at qconsf.com.
Jay Phelps is the Chief Software Architect and Co-founder at This Dot, where they provide support, training, mentoring, and software design. Previously, he worked as a Senior Software Engineer at Netflix.
TestWorks Conf Serenity BDD in action - John Ferguson SmartXebia Nederland BV
Serenity BDD in Action
Every test tells a story, but some tell a better story than others. Every test illustrates a specific path through the system to achieve a specific goal, but some paths are clearer than others. Valuable tests are the ones that tell a compelling story.
Come on a journey of discovery to learn how to write such tests, and witness a demonstration of these principles in action, with live coding of Serenity BDD automated tests.
Serenity BDD - from executable specifications to living documentationAlex Soto
Learn how to write clean, clear, maintainable automated acceptance tests for both web applications and web services using Serenity BDD (http://serenity-bdd.info). Serenity BDD is an open source library that helps you write better, more effective automated acceptance tests, and use these acceptance tests to produce world-class test reports and living documentation.
Presented at Jazoon, April 28th, 2017
A revolution is about to begin. WebAssembly (aka wasm) is shipping in all modern browsers, but since it’s (intentionally) very low level, it can be difficult to understand how it will be critical to future web applications–and definitely not just games and C++!
In this talk, Jay will demystify stack assembly languages like WebAssembly, even if you have zero experience with assembly and linear memory.
Jay Phelps talks about WebAssembly (aka wasm) - a new, standardized compilation target for the web, shipping in all modern browsers. He reveals what it is, how we can use it today, and the incredible opportunities it will unlock in the years to come.
Jay Phelps is a Senior Software Engineer at Netflix.
--
QConSF, Nov 15th, 2017. Video to be publically released, early access available to QCon attendees: https://www.infoq.com/presentations/webassembly-wasm-intro
Real-time Insights, powered by Reactive ProgrammingJay Phelps
Presented at Netflix HQ, March 21st, 2017
The time it takes you to debug your systems is critical, both in production and development. In this talk we'll reveal how we harness the power of Reactive Programming with RxJS and RxJava to provide real-time querying and transformation of extremely high volume logs.
Backpressure? Resistance is not futile. (Uphill Conf 2019)Jay Phelps
Backpressure--resistance opposing the desired flow of data through software--from massive scale, to death by a thousand cuts, it's something nearly every software engineer will have to deal with at some point. For some, it’s a frequent problem. But the term itself isn’t nearly as understood and recognized as such.
In this talk, we'll discover what backpressure really is, when it happens, and the strategies you can apply to deal with it.
(presented at Uphill Conf 2019)
WebAssembly. Neither Web Nor Assembly, All RevolutionaryC4Media
Video and slides synchronized, mp3 and slide download available at URL https://bit.ly/2tWqrMm.
Jay Phelps talks about WebAssembly, a bytecode designed and maintained by some of the major players in tech: Google, Microsoft, Apple, Mozilla, Intel, LG, and many others. He talks about what WebAssembly is and what it isn’t. Filmed at qconsf.com.
Jay Phelps is the Chief Software Architect and Co-founder at This Dot, where they provide support, training, mentoring, and software design. Previously, he worked as a Senior Software Engineer at Netflix.
TestWorks Conf Serenity BDD in action - John Ferguson SmartXebia Nederland BV
Serenity BDD in Action
Every test tells a story, but some tell a better story than others. Every test illustrates a specific path through the system to achieve a specific goal, but some paths are clearer than others. Valuable tests are the ones that tell a compelling story.
Come on a journey of discovery to learn how to write such tests, and witness a demonstration of these principles in action, with live coding of Serenity BDD automated tests.
Serenity BDD - from executable specifications to living documentationAlex Soto
Learn how to write clean, clear, maintainable automated acceptance tests for both web applications and web services using Serenity BDD (http://serenity-bdd.info). Serenity BDD is an open source library that helps you write better, more effective automated acceptance tests, and use these acceptance tests to produce world-class test reports and living documentation.
The top 5 JavaScript issues in all our codebasesPhil Nash
We all try to write the best code we can, but sometimes things slip through the cracks. With a look at the data from scans of thousands of projects, we can tell the most common issues in the codebases of all JavaScript developers. In this talk we'll look at those top issues plaguing JavaScript projects around the world, we'll see why they are problems, and finally how to spot and avoid those common errors and anti-patterns. By the end of the talk, you'll feel more confident in your codebase and maybe have a few things to fix.
---
Tools:
SonarQube: https://www.sonarsource.com/products/sonarqube/
SonarCloud: https://www.sonarsource.com/products/sonarcloud/
SonarLint: https://www.sonarsource.com/products/sonarlint/
ESLint: https://eslint.org/
eslint-plugin-sonarjs: https://github.com/SonarSource/eslint-plugin-sonarjs
Links
Cognitive Complexity paper: https://www.sonarsource.com/docs/CognitiveComplexity.pdf
Code is read much more often than it is written, so plan accordingly: https://devblogs.microsoft.com/oldnewthing/20070406-00/?p=27343
Sonar JavaScript Rules: https://rules.sonarsource.com/javascript
🎉 Reveal.js Confetti 🎉 https://github.com/philnash/reveal-confetti
This presentation is by Doug Crockford, I'm reposting it here from this Google Blog post: http://googlecode.blogspot.com/2009/03/doug-crockford-javascript-good-parts.html
Queues can provide parallel processing, cross language scripting and more! The talk was focused on Gearman but the principles apply to any alternative.
Advanced Topics in Continuous DeploymentMike Brittain
Like what you've read? We're frequently hiring for a variety of engineering roles at Etsy. If you're interested, drop me a line or send me your resume: mike@etsy.com.
http://www.etsy.com/careers
perl often doesn't get updated because people don't have a way to know if their current code works with the new one. The problem is that they lack unit tests. This talk describes how simple it is to generate unit tests with Perl and shell, use them to automate solving problems like missing modules, and test a complete code base.
The web is live. APIs give us access to continuously changing data. We discuss ways to get real-time data into your app, how to handle data processing and what to do when you get thousands of updates per second.
🐲 Here be Stacktraces — Flink SQL for Non-Java DevelopersHostedbyConfluent
"Apache Flink might be the belle of the ball at the moment, but that doesn't stop it from being baffling to learn at times. A platform steeped in its history as a Java project, it can be daunting for the humble data engineer equipped with only some SQL and their wits to navigate. And that's a shame, because with Flink SQL you can do some rather useful things with streams (and batches) of data just using SQL - no coding required!
Join me as I map out the components of Flink, explore the bits that you do—and don't—need to be familiar with to begin to work with Flink SQL. We'll explore together the murky undergrowth of catalogs and connectors, clients and Calcite—and take in a spot of architecture along the way to give us a proper understanding of what happens when we run a SQL statement on Flink.
By the end of this talk, you'll have learnt how to run Flink locally, submit SQL jobs, integrate with various systems through source and sink connectors, and use Flink SQL for effective data transformation.
Whether you're a seasoned data engineer or just starting out, you'll leave with the confidence to hit the ground running with Flink SQL for yourself."
Backpressure? Resistance is not futile. RxJS Live 2019Jay Phelps
Backpressure—resistance opposing the desired flow of data through software—from massive scale, to death by a thousand cuts, it's something nearly every software engineer will have to deal with at some point. For some, it’s a frequent problem. But the term itself isn’t nearly as understood and recognized as such. In this talk, we'll discover what backpressure really is, when it happens, and the strategies you can apply to deal with it.
JSX is an XML-like syntax extension to JavaScript, popularized by React. When seen for the first time it can often elicit bad memories of intermixing HTML and code, but JSX is *very* different! Let's learn exactly what it is, how it works, and even how you can use it outside of React.
--
Reactive programming nut and compiler enthusiast. Jay is a Senior Software Engineer at Netflix. Lover of all things open source, his contributions span numerous ecosystems. Former RxJS core team member and author of core-decorators, git-blame-someone-else, and co-author of redux-observable.
The top 5 JavaScript issues in all our codebasesPhil Nash
We all try to write the best code we can, but sometimes things slip through the cracks. With a look at the data from scans of thousands of projects, we can tell the most common issues in the codebases of all JavaScript developers. In this talk we'll look at those top issues plaguing JavaScript projects around the world, we'll see why they are problems, and finally how to spot and avoid those common errors and anti-patterns. By the end of the talk, you'll feel more confident in your codebase and maybe have a few things to fix.
---
Tools:
SonarQube: https://www.sonarsource.com/products/sonarqube/
SonarCloud: https://www.sonarsource.com/products/sonarcloud/
SonarLint: https://www.sonarsource.com/products/sonarlint/
ESLint: https://eslint.org/
eslint-plugin-sonarjs: https://github.com/SonarSource/eslint-plugin-sonarjs
Links
Cognitive Complexity paper: https://www.sonarsource.com/docs/CognitiveComplexity.pdf
Code is read much more often than it is written, so plan accordingly: https://devblogs.microsoft.com/oldnewthing/20070406-00/?p=27343
Sonar JavaScript Rules: https://rules.sonarsource.com/javascript
🎉 Reveal.js Confetti 🎉 https://github.com/philnash/reveal-confetti
This presentation is by Doug Crockford, I'm reposting it here from this Google Blog post: http://googlecode.blogspot.com/2009/03/doug-crockford-javascript-good-parts.html
Queues can provide parallel processing, cross language scripting and more! The talk was focused on Gearman but the principles apply to any alternative.
Advanced Topics in Continuous DeploymentMike Brittain
Like what you've read? We're frequently hiring for a variety of engineering roles at Etsy. If you're interested, drop me a line or send me your resume: mike@etsy.com.
http://www.etsy.com/careers
perl often doesn't get updated because people don't have a way to know if their current code works with the new one. The problem is that they lack unit tests. This talk describes how simple it is to generate unit tests with Perl and shell, use them to automate solving problems like missing modules, and test a complete code base.
The web is live. APIs give us access to continuously changing data. We discuss ways to get real-time data into your app, how to handle data processing and what to do when you get thousands of updates per second.
🐲 Here be Stacktraces — Flink SQL for Non-Java DevelopersHostedbyConfluent
"Apache Flink might be the belle of the ball at the moment, but that doesn't stop it from being baffling to learn at times. A platform steeped in its history as a Java project, it can be daunting for the humble data engineer equipped with only some SQL and their wits to navigate. And that's a shame, because with Flink SQL you can do some rather useful things with streams (and batches) of data just using SQL - no coding required!
Join me as I map out the components of Flink, explore the bits that you do—and don't—need to be familiar with to begin to work with Flink SQL. We'll explore together the murky undergrowth of catalogs and connectors, clients and Calcite—and take in a spot of architecture along the way to give us a proper understanding of what happens when we run a SQL statement on Flink.
By the end of this talk, you'll have learnt how to run Flink locally, submit SQL jobs, integrate with various systems through source and sink connectors, and use Flink SQL for effective data transformation.
Whether you're a seasoned data engineer or just starting out, you'll leave with the confidence to hit the ground running with Flink SQL for yourself."
Backpressure? Resistance is not futile. RxJS Live 2019Jay Phelps
Backpressure—resistance opposing the desired flow of data through software—from massive scale, to death by a thousand cuts, it's something nearly every software engineer will have to deal with at some point. For some, it’s a frequent problem. But the term itself isn’t nearly as understood and recognized as such. In this talk, we'll discover what backpressure really is, when it happens, and the strategies you can apply to deal with it.
JSX is an XML-like syntax extension to JavaScript, popularized by React. When seen for the first time it can often elicit bad memories of intermixing HTML and code, but JSX is *very* different! Let's learn exactly what it is, how it works, and even how you can use it outside of React.
--
Reactive programming nut and compiler enthusiast. Jay is a Senior Software Engineer at Netflix. Lover of all things open source, his contributions span numerous ecosystems. Former RxJS core team member and author of core-decorators, git-blame-someone-else, and co-author of redux-observable.
Video of talk: https://www.youtube.com/watch?v=6P7hwhvlwig
Let's take a deep dive into some of the new features of ECMAScript 2015, the specification that defines JavaScript. Classes, arrow functions, and more. Then we'll peek at what's coming in ES2016 and even discuss rumored features yet to be revealed like enums and pattern matching!
A crash course on how Ember CLI can supercharge your productivity building Ember applications and how you can start leveraging the thriving Ember add-on ecosystem.
This was presented January 28th, 2015 at the Silicon Valley Ember Meetup.
Quarkus Hidden and Forbidden ExtensionsMax Andersen
Quarkus has a vast extension ecosystem and is known for its subsonic and subatomic feature set. Some of these features are not as well known, and some extensions are less talked about, but that does not make them less interesting - quite the opposite.
Come join this talk to see some tips and tricks for using Quarkus and some of the lesser known features, extensions and development techniques.
Navigating the Metaverse: A Journey into Virtual Evolution"Donna Lenk
Join us for an exploration of the Metaverse's evolution, where innovation meets imagination. Discover new dimensions of virtual events, engage with thought-provoking discussions, and witness the transformative power of digital realms."
Atelier - Innover avec l’IA Générative et les graphes de connaissancesNeo4j
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Allez au-delà du battage médiatique autour de l’IA et découvrez des techniques pratiques pour utiliser l’IA de manière responsable à travers les données de votre organisation. Explorez comment utiliser les graphes de connaissances pour augmenter la précision, la transparence et la capacité d’explication dans les systèmes d’IA générative. Vous partirez avec une expérience pratique combinant les relations entre les données et les LLM pour apporter du contexte spécifique à votre domaine et améliorer votre raisonnement.
Amenez votre ordinateur portable et nous vous guiderons sur la mise en place de votre propre pile d’IA générative, en vous fournissant des exemples pratiques et codés pour démarrer en quelques minutes.
E-commerce Application Development Company.pdfHornet Dynamics
Your business can reach new heights with our assistance as we design solutions that are specifically appropriate for your goals and vision. Our eCommerce application solutions can digitally coordinate all retail operations processes to meet the demands of the marketplace while maintaining business continuity.
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisGlobus
JASMIN is the UK’s high-performance data analysis platform for environmental science, operated by STFC on behalf of the UK Natural Environment Research Council (NERC). In addition to its role in hosting the CEDA Archive (NERC’s long-term repository for climate, atmospheric science & Earth observation data in the UK), JASMIN provides a collaborative platform to a community of around 2,000 scientists in the UK and beyond, providing nearly 400 environmental science projects with working space, compute resources and tools to facilitate their work. High-performance data transfer into and out of JASMIN has always been a key feature, with many scientists bringing model outputs from supercomputers elsewhere in the UK, to analyse against observational or other model data in the CEDA Archive. A growing number of JASMIN users are now realising the benefits of using the Globus service to provide reliable and efficient data movement and other tasks in this and other contexts. Further use cases involve long-distance (intercontinental) transfers to and from JASMIN, and collecting results from a mobile atmospheric radar system, pushing data to JASMIN via a lightweight Globus deployment. We provide details of how Globus fits into our current infrastructure, our experience of the recent migration to GCSv5.4, and of our interest in developing use of the wider ecosystem of Globus services for the benefit of our user community.
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteGoogle
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
👉👉 Click Here To Get More Info 👇👇
https://sumonreview.com/ai-pilot-review/
AI Pilot Review: Key Features
✅Deploy AI expert bots in Any Niche With Just A Click
✅With one keyword, generate complete funnels, websites, landing pages, and more.
✅More than 85 AI features are included in the AI pilot.
✅No setup or configuration; use your voice (like Siri) to do whatever you want.
✅You Can Use AI Pilot To Create your version of AI Pilot And Charge People For It…
✅ZERO Manual Work With AI Pilot. Never write, Design, Or Code Again.
✅ZERO Limits On Features Or Usages
✅Use Our AI-powered Traffic To Get Hundreds Of Customers
✅No Complicated Setup: Get Up And Running In 2 Minutes
✅99.99% Up-Time Guaranteed
✅30 Days Money-Back Guarantee
✅ZERO Upfront Cost
See My Other Reviews Article:
(1) TubeTrivia AI Review: https://sumonreview.com/tubetrivia-ai-review
(2) SocioWave Review: https://sumonreview.com/sociowave-review
(3) AI Partner & Profit Review: https://sumonreview.com/ai-partner-profit-review
(4) AI Ebook Suite Review: https://sumonreview.com/ai-ebook-suite-review
First Steps with Globus Compute Multi-User EndpointsGlobus
In this presentation we will share our experiences around getting started with the Globus Compute multi-user endpoint. Working with the Pharmacology group at the University of Auckland, we have previously written an application using Globus Compute that can offload computationally expensive steps in the researcher's workflows, which they wish to manage from their familiar Windows environments, onto the NeSI (New Zealand eScience Infrastructure) cluster. Some of the challenges we have encountered were that each researcher had to set up and manage their own single-user globus compute endpoint and that the workloads had varying resource requirements (CPUs, memory and wall time) between different runs. We hope that the multi-user endpoint will help to address these challenges and share an update on our progress here.
Zoom is a comprehensive platform designed to connect individuals and teams efficiently. With its user-friendly interface and powerful features, Zoom has become a go-to solution for virtual communication and collaboration. It offers a range of tools, including virtual meetings, team chat, VoIP phone systems, online whiteboards, and AI companions, to streamline workflows and enhance productivity.
GraphSummit Paris - The art of the possible with Graph TechnologyNeo4j
Sudhir Hasbe, Chief Product Officer, Neo4j
Join us as we explore breakthrough innovations enabled by interconnected data and AI. Discover firsthand how organizations use relationships in data to uncover contextual insights and solve our most pressing challenges – from optimizing supply chains, detecting fraud, and improving customer experiences to accelerating drug discoveries.
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxrickgrimesss22
Discover the essential features to incorporate in your Winzo clone app to boost business growth, enhance user engagement, and drive revenue. Learn how to create a compelling gaming experience that stands out in the competitive market.
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...Juraj Vysvader
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I didn't get rich from it but it did have 63K downloads (powered possible tens of thousands of websites).
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus
As part of the DOE Integrated Research Infrastructure (IRI) program, NERSC at Lawrence Berkeley National Lab and ALCF at Argonne National Lab are working closely with General Atomics on accelerating the computing requirements of the DIII-D experiment. As part of the work the team is investigating ways to speedup the time to solution for many different parts of the DIII-D workflow including how they run jobs on HPC systems. One of these routes is looking at Globus Compute as a way to replace the current method for managing tasks and we describe a brief proof of concept showing how Globus Compute could help to schedule jobs and be a tool to connect compute at different facilities.
OpenMetadata Community Meeting - 5th June 2024OpenMetadata
The OpenMetadata Community Meeting was held on June 5th, 2024. In this meeting, we discussed about the data quality capabilities that are integrated with the Incident Manager, providing a complete solution to handle your data observability needs. Watch the end-to-end demo of the data quality features.
* How to run your own data quality framework
* What is the performance impact of running data quality frameworks
* How to run the test cases in your own ETL pipelines
* How the Incident Manager is integrated
* Get notified with alerts when test cases fail
Watch the meeting recording here - https://www.youtube.com/watch?v=UbNOje0kf6E
Enhancing Research Orchestration Capabilities at ORNL.pdfGlobus
Cross-facility research orchestration comes with ever-changing constraints regarding the availability and suitability of various compute and data resources. In short, a flexible data and processing fabric is needed to enable the dynamic redirection of data and compute tasks throughout the lifecycle of an experiment. In this talk, we illustrate how we easily leveraged Globus services to instrument the ACE research testbed at the Oak Ridge Leadership Computing Facility with flexible data and task orchestration capabilities.
Essentials of Automations: The Art of Triggers and Actions in FMESafe Software
In this second installment of our Essentials of Automations webinar series, we’ll explore the landscape of triggers and actions, guiding you through the nuances of authoring and adapting workspaces for seamless automations. Gain an understanding of the full spectrum of triggers and actions available in FME, empowering you to enhance your workspaces for efficient automation.
We’ll kick things off by showcasing the most commonly used event-based triggers, introducing you to various automation workflows like manual triggers, schedules, directory watchers, and more. Plus, see how these elements play out in real scenarios.
Whether you’re tweaking your current setup or building from the ground up, this session will arm you with the tools and insights needed to transform your FME usage into a powerhouse of productivity. Join us to discover effective strategies that simplify complex processes, enhancing your productivity and transforming your data management practices with FME. Let’s turn complexity into clarity and make your workspaces work wonders!
29. Jay Phelps | @_jayphelps
You'll likely consume compiled
WebAssembly binaries even sooner
30. Jay Phelps | @_jayphelps
Oxidizing Source Maps with Rust and WebAssembly
https://hacks.mozilla.org/2018/01/oxidizing-source-maps-with-rust-and-webassembly/
5.89 times faster!
109. Jay Phelps | @_jayphelps
• pause work and come back to it later
Fiber
110. Jay Phelps | @_jayphelps
• pause work and come back to it later
• assign priority to different types of work
Fiber
111. Jay Phelps | @_jayphelps
• pause work and come back to it later
• assign priority to different types of work
• reuse previously completed work
Fiber
112. Jay Phelps | @_jayphelps
• pause work and come back to it later
• assign priority to different types of work
• reuse previously completed work
• abort work if it's no longer needed
Fiber
113. Jay Phelps | @_jayphelps
Lin Clark - A Cartoon Intro to Fiber
https://goo.gl/bXsYhY
114. Jay Phelps | @_jayphelps
Ember’s “Glimmer” VM is being written in Rust
compiled to WebAssembly
115. Jay Phelps | @_jayphelps
React components could run in WebAssembly
e.g. writing them in Reason
116. Jay Phelps | @_jayphelps
let component = ReasonReact.statelessComponent("Page");
let handleClick = (_event, _self) => Js.log("clicked!");
let make = (~message, _children) => {
...component,
render: self =>
<div onClick={self.handle(handleClick)}>
{ReasonReact.stringToElement(message)}
</div>
};
117. Jay Phelps | @_jayphelps
This is possible right now, but not yet ideal
missing direct access to the DOM