Imagine a world where product owners, Development, QA, IT Operations, and Infosec work together, not only to help each other, but also to ensure that the overall organization succeeds. By working toward a common goal, they enable the fast flow of planned work into production (e.g., performing tens, hundreds, or even thousands of code deploys per day), while achieving world-class stability, reliability, availability, and security.
In this world, cross-functional teams rigorously test their hypotheses of which features will most delight users and advance the organizational goals. They care not just about implementing user features, but also actively ensure their work flows smoothly and frequently through the entire value stream without causing chaos and disruption to IT Operations or any other internal or external customer.
Simultaneously, QA, IT Operations, and Infosec are always working on ways to reduce friction for the team, creating the work systems that enable developers to be more productive and get better outcomes. By adding the expertise of QA, IT Operations, and Infosec into delivery teams and automated self-service tools and platforms, teams are able to use that expertise in their daily work without being dependent on other teams.
This enables organizations to create a safe system of work, where small teams are able to quickly and independently develop, test, and deploy code and value quickly, safely, securely, and reliably to customers. This allows organizations to maximize developer productivity, enable organizational learning, create high employee satisfaction, and win in the marketplace.
These are the outcomes that result from DevOps. For most of us, this is not the world we live in. More often than not, the system we work in is broken, resulting in extremely poor outcomes that fall well short of our true potential. In our world, Development and IT Operations are adversaries; testing and Infosec activities happen only at the end of a project, too late to correct any problems found; and almost any critical activity requires too much manual effort and too many handoffs, leaving us to always be waiting. Not only does this contribute to extremely long lead times to get anything done, but the quality of our work, especially production deployments, is also problematic and chaotic, resulting in negative impacts to our customers and our business.
As a result, we fall far short of our goals, and the whole organization is dissatisfied with the performance of IT, resulting in budget reductions and frustrated, unhappy employees who feel powerless to change the process and its outcomes.† The solution? We need to change how we work; DevOps shows us the best way forward.
To better understand the potential of the DevOps revolution, let us look at the Manufacturing Revolution of the 1980s. By adopting Lean principles and practices, manufacturing organizations dramatically improved plant productivity, customer lead times, product quality, and customer satisfaction, enabling them to win in the marketplace.
Before the revolution, average manufacturing plant order lead times were six weeks, with fewer than 70% of orders being shipped on time. By 2005, with the widespread implementation of Lean practices, average product lead times had dropped to less than three weeks, and more than 95% of orders were being shipped on time. Organizations that did not implement Lean practices lost market share, and many went out of business entirely.
Similarly, the bar has been raised for delivering technology products and services—what was good enough in previous decades is not good enough now. For each of the last four decades, the cost and time required to develop and deploy strategic business capabilities and features has dropped by orders of magnitude. During the 1970s and 1980s, most new features required one to five years to develop and deploy, often costing tens of millions of dollars.
By the 2000’s, because of advances in technology and the adoption of Agile principles and practices, the time required to develop new functionality had dropped to weeks or months, but deploying into production would still require weeks or months, often with catastrophic outcomes.
And by 2010, with the introduction of DevOps and the neverending commoditization of hardware, software, and now the cloud, features (and even entire startup companies) could be created in weeks, quickly being deployed into production in just hours or minutes—for these organizations, deployment finally became routine and low risk. These organizations are able to perform experiments to test business ideas, discovering which ideas create the most value for customers and the organization as a whole, which are then further developed into features that can be rapidly and safely deployed into production.
Today, organizations adopting DevOps principles and practices often deploy changes hundreds or even thousands of times per day. In an age where competitive advantage requires fast time to market and relentless experimentation, organizations that are unable to replicate these outcomes are destined to lose in the marketplace to more nimble competitors and could potentially go out of business entirely, much like the manufacturing organizations that did not adopt Lean principles.
These days, regardless of what industry we are competing in, the way we acquire customers and deliver value to them is dependent on the technology value stream. Put even more succinctly, as Jeffrey Immelt, CEO of General Electric, stated, “Every industry and company that is not bringing software to the core of their business will be disrupted.” Or as Jeffrey Snover, Technical Fellow at Microsoft, said, “In previous economic eras, businesses created value by moving atoms. Now they create value by moving bits.”
It’s difficult to overstate the enormity of this problem—it affects every organization, independent of the industry we operate in, the size of our organization, whether we are profit or non-profit. Now more than ever, how technology work is managed and performed predicts whether our organizations will win in the marketplace, or even survive. In many cases, we will need to adopt principles and practices that look very different from those that have successfully guided us over the past decades. See Appendix 1.
Now that we have established the urgency of the problem that DevOps solves, let us take some time to explore in more detail the symptomatology of the problem, why it occurs, and why, without dramatic intervention, the problem worsens over time.
Most organizations are not able to deploy production changes in minutes or hours, instead requiring weeks or months. Nor are they able to deploy hundreds or thousands of changes into production per day; instead, they struggle to deploy monthly or even quarterly. Nor are production deployments routine, instead involving outages and chronic firefighting and heroics.
In an age where competitive advantage requires fast time to market, high service levels, and relentless experimentation, these organizations are at a significant competitive disadvantage. This is in large part due to their inability to resolve a core, chronic conflict within their technology organization.
In almost every IT organization, there is an inherent conflict between Development and IT Operations which creates a downward spiral, resulting in ever-slower time to market for new products and features, reduced quality, increased outages, and, worst of all, an ever-increasing amount of technical debt.
The term “technical debt” was first coined by Ward Cunningham. Analogous to financial debt, technical debt describes how decisions we make lead to problems that get increasingly more difficult to fix over time, continually reducing our available options in the future—even when taken on judiciously, we still incur interest.
One factor that contributes to this is the often competing goals of Development and IT Operations. IT organizations are responsible for many things. Among them are the two following goals, which must be pursued simultaneously:
Frequently, Development will take responsibility for responding to changes in the market, deploying features and changes into production as quickly as possible. IT Operations will take responsibility for providing customers with IT service that is stable, reliable, and secure, making it difficult or even impossible for anyone to introduce production changes that could jeopardize production. Configured this way, Development and IT Operations have diametrically opposed goals and incentives.
Dr. Eliyahu M. Goldratt, one of the founders of the manufacturing management movement, called these types of configuration “the core, chronic conflict”—when organizational measurements and incentives across different silos prevent the achievement of global, organizational goals.‡
This conflict creates a downward spiral so powerful it prevents the achievement of desired business outcomes, both inside and outside the IT organization. These chronic conflicts often put technology workers into situations that lead to poor software and service quality, and bad customer outcomes, as well as a daily need for workarounds, firefighting, and heroics, whether in Product Management, Development, QA, IT Operations, or Information Security. See Appendix 2.
The downward spiral in IT has three acts that are likely familiar to most IT practitioners.
The first act begins in IT Operations, where our goal is to keep applications and infrastructure running so that our organization can deliver value to customers. In our daily work, many of our problems are due to applications and infrastructure that are complex, poorly documented, and incredibly fragile. This is the technical debt and daily workarounds that we live with constantly, always promising that we’ll fix the mess when we have a little more time. But that time never comes.
Alarmingly, our most fragile artifacts support either our most important revenue-generating systems or our most critical projects. In other words, the systems most prone to failure are also our most important and are at the epicenter of our most urgent changes. When these changes fail, they jeopardize our most important organizational promises, such as availability to customers, revenue goals, security of customer data, accurate financial reporting, and so forth.
The second act begins when somebody has to compensate for the latest broken promise—it could be a product manager promising a bigger, bolder feature to dazzle customers with or a business executive setting an even larger revenue target. Then, oblivious to what technology can or can’t do, or what factors led to missing our earlier commitment, they commit the technology organization to deliver upon this new promise.
As a result, Development is tasked with another urgent project that inevitably requires solving new technical challenges and cutting corners to meet the promised release date, further adding to our technical debt—made, of course, with the promise that we’ll fix any resulting problems when we have a little more time.
This sets the stage for the third and final act, where everything becomes just a little more difficult, bit by bit—everybody gets a little busier, work takes a little more time, communications become a little slower, and work queues get a little longer. Our work becomes more tightly-coupled, smaller actions cause bigger failures, and we become more fearful and less tolerant of making changes. Work requires more communication, coordination, and approvals; teams must wait just a little longer for their dependent work to get done; and our quality keeps getting worse. The wheels begin grinding slower and require more effort to keep turning. See Appendix 3.
Although it’s difficult to see in the moment, the downward spiral is obvious when one takes a step back. We notice that production code deployments are taking ever-longer to complete, moving from minutes to hours to days to weeks. And worse, the deployment outcomes have become even more problematic, that resulting in an ever-increasing number of customer-impacting outages that require more heroics and firefighting in Operations, further depriving them of their ability to pay down technical debt.
As a result, our product delivery cycles continue to move slower and slower, fewer projects are undertaken, and those that are, are less ambitious. Furthermore, the feedback on everyone’s work becomes slower and weaker, especially the feedback signals from our customers. And, regardless of what we try, things seem to get worse—we are no longer able to respond quickly to our changing competitive landscape, nor are we able to provide stable, reliable service to our customers. As a result, we ultimately lose in the marketplace.
Time and time again, we learn that when IT fails, the entire organization fails. As Steven J. Spear noted in his book The High-Velocity Edge, whether the damages “unfold slowly like a wasting disease” or rapidly “like a fiery crash...the destruction can be just as complete.”
For over a decade, the authors of this book have observed this destructive spiral occur in countless organizations of all types and sizes. We understand better than ever why this downward spiral occurs and why it requires DevOps principles to mitigate. First, as described earlier, every IT organization has two opposing goals, and second, every company is a technology company, whether they know it or not.
As Christopher Little, a software executive and one of the earliest chroniclers of DevOps, said, “Every company is a technology company, regardless of what business they think they’re in. A bank is just an IT company with a banking license.”§
To convince ourselves that this is the case, consider that the vast majority of capital projects have some reliance upon IT. As the saying goes, “It is virtually impossible to make any business decision that doesn’t result in at least one IT change.”
In the business and finance context, projects are critical because they serve as the primary mechanism for change inside organizations. Projects are typically what management needs to approve, budget for, and be held accountable for; therefore, they are the mechanism that achieve the goals and aspirations of the organization, whether it is to grow or even shrink.¶
Projects are typically funded through capital spending (i.e., factories, equipment, and major projects, and expenditures are capitalized when payback is expected to take years), of which 50% is now technology related. This is even true in “low tech” industry verticals with the lowest historical spending on technology, such as energy, metal, resource extraction, automotive, and construction. In other words, business leaders are far more reliant upon the effective management of IT in order to achieve their goals than they think.**
 This powerlessness is often followed by burnout, with the associated feelings of fatigue, cynicism, and even hopelessness and despair.
Many psychologists assert that creating systems that cause feelings of powerlessness is one of the most damaging things we can do to fellow human beings—we deprive other people of their ability to control their own outcomes and even create a culture where people are afraid to do the right thing because of fear of punishment, failure, or jeopardizing their livelihood. This can create the conditions of learned helplessness, where people become unwilling or unable to act in a way that avoids the same problem in the future.
For our employees, it means long hours, working on weekends, and a decreased quality of life, not just for the employee, but for everyone who depends on them, including family and friends. It is not surprising that when this occurs, we lose our best people (except for those that feel like they can’t leave, because of a sense of duty or obligation).
In addition to the human suffering that comes with the current way of working, the opportunity cost of the value that we could be creating is staggering—the authors believe that we are missing out on approximately $2.6 trillion of value creation per year, which is, at the time of this writing, equivalent to the annual economic output of France, the sixth-largest economy in the world.
Consider the following calculation—both IDC and Gartner estimated that in 2011, approximately 5% of the worldwide gross domestic product($3.1 trillion) was spent on IT (hardware, services, and telecom). If we estimate that 50% of that $3.1 trillion was spent on operating costs and maintaining existing systems, and that one-third of that 50% was spent on urgent and unplanned work or rework, approximately $520 billion was wasted.
If adopting DevOps could enable us, through better management and increased operational excellence, to halve that waste and redeploy that human potential into something that’s five times the value (a modest proposal), we could create $2.6 trillion of value per year.
In the previous sections, we described the problems and the negative consequences of the status quo due to the core, chronic conflict, from the inability to achieve organizational goals, to the damage we inflict on fellow human beings. By solving these problems, DevOps astonishingly enables us to simultaneously improve organizational performance, achieve the goals of all the various functional technology roles (e.g., Development, QA, IT Operations, Infosec), and improve the human condition.
This exciting and rare combination may explain why DevOps has generated so much excitement and enthusiasm in so many in such a short time, including technology leaders, engineers, and much of the software ecosystem we reside in.
Ideally, small teams of developers independently implement their features, validate their correctness in production-like environments, and have their code deployed into production quickly, safely and securely. Code deployments are routine and predictable. Instead of starting deployments at midnight on Friday and spending all weekend working to complete them, deployments occur throughout the business day when everyone is already in the office and without our customers even noticing—except when they see new features and bug fixes that delight them. And, by deploying code in the middle of the workday, for the first time in decades IT Operations is working during normal business hours like everyone else.
By creating fast feedback loops at every step of the process, everyone can immediately see the effects of their actions. Whenever changes are committed into version control, fast automated tests are run in production-like environments, giving continual assurance that the code and environments operate as designed and are always in a secure and deployable state.
Automated testing helps developers discover their mistakes quickly (usually within minutes), which enables faster fixes as well as genuine learning—learning that is impossible when mistakes are discovered six months later during integration testing, when memories and the link between cause and effect have long faded. Instead of accruing technical debt, problems are fixed as they are found, mobilizing the entire organization if needed, because global goals outweigh local goals.
Pervasive production telemetry in both our code and production environments ensure that problems are detected and corrected quickly, confirming that everything is working as intended and customers are getting value from the software we create.
In this scenario, everyone feels productive—the architecture allows small teams to work safely and architecturally decoupled from the work of other teams who use self-service platforms that leverage the collective experience of Operations and Information Security. Instead of everyone waiting all the time, with large amounts of late, urgent rework, teams work independently and productively in small batches, quickly and frequently delivering new value to customers.
Even high-profile product and feature releases become routine by using dark launch techniques. Long before the launch date, we put all the required code for the feature into production, invisible to everyone except internal employees and small cohorts of real users, allowing us to test and evolve the feature until it achieves the desired business goal.
And, instead of firefighting for days or weeks to make the new functionality work, we merely change a feature toggle or configuration setting. This small change makes the new feature visible to ever-larger segments of customers, automatically rolling back if something goes wrong. As a result, our releases are controlled, predictable, reversible, and low stress.
It’s not just feature releases that are calmer—all sorts of problems are being found and fixed early, when they are smaller, cheaper, and easier to correct. With every fix, we also generate organizational learnings, enabling us to prevent the problem from recurring and enabling us to detect and correct similar problems faster in the future.
Furthermore, everyone is constantly learning, fostering a hypothesis-driven culture where the scientific method is used to ensure nothing is taken for granted—we do nothing without measuring and treating product development and process improvement as experiments.
Because we value everyone’s time, we don’t spend years building features that our customers don’t want, deploying code that doesn’t work, or fixing something that isn’t actually the cause of our problem.
Because we care about achieving goals, we create long-term teams that are responsible for meeting them. Instead of project teams where developers are reassigned and shuffled around after each release, never receiving feedback on their work, we keep teams intact so they can keep iterating and improving, using those learnings to better achieve their goals. This is equally true for the product teams who are solving problems for our external customers, as well as our internal platform teams who are helping other teams be more productive, safe, and secure.
Instead of a culture of fear, we have a high-trust, collaborative culture, where people are rewarded for taking risks. They are able to fearlessly talk about problems as opposed to hiding them or putting them on the backburner—after all, we must see problems in order to solve them.
And, because everyone fully owns the quality of their work, everyone builds automated testing into their daily work and uses peer reviews to gain confidence that problems are addressed long before they can impact a customer. These processes mitigate risk, as opposed to approvals from distant authorities, allowing us to deliver value quickly, reliably, and securely—even proving to skeptical auditors that we have an effective system of internal controls.
And when something does go wrong, we conduct blameless post-mortems, not to punish anyone, but to better understand what caused the accident and how to prevent it. This ritual reinforces our culture of learning. We also hold internal technology conferences to elevate our skills and ensure that everyone is always teaching and learning.
Because we care about quality, we even inject faults into our production environment so we can learn how our system fails in a planned manner. We conduct planned exercises to practice large-scale failures, randomly kill processes and compute servers in production, and inject network latencies and other nefarious acts to ensure we grow ever more resilient. By doing this, we enable better resilience, as well as organizational learning and improvement.
In this world, everyone has ownership in their work, regardless of their role in the technology organization They have confidence that their work matters and is meaningfully contributing to organizational goals, proven by their low-stress work environment and their organization’s success in the marketplace. Their proof is that the organization is indeed winning in the marketplace.
We have decisive evidence of the business value of DevOps. From 2013 through 2016, as part of Puppet Labs’ State Of DevOps Report, to which authors Jez Humble and Gene Kim contributed, we collected data from over twenty-five thousand technology professionals, with the goal of better understanding the health and habits of organizations at all stages of DevOps adoption.
The first surprise this data revealed was how much high-performing organizations using DevOps practices were outperforming their non–high performing peers in the following areas:
In other words, high performers were both more agile and more reliable, providing empirical evidence that DevOps enables us to break the core, chronic conflict. High performers deployed code thirty times more frequently, and the time required to go from “code committed” to “successfully running in production” was two hundred times faster—high performers had lead times measured in minutes or hours, while low performers had lead times measured in weeks, months, or even quarters.
Furthermore, high performers were twice as likely to exceed profitability, market share, and productivity goals. And, for those organizations that provided a stock ticker symbol, we found that high performers had 50% higher market capitalization growth over three years. They also had higher employee job satisfaction, lower rates of employee burnout, and their employees were 2.2 times more likely to recommend their organization to friends as a great place to work.†† High performers also had better information security outcomes. By integrating security objectives into all stages of the development and operations processes, they spent 50% less time remediating security issues.
When we increase the number of developers, individual developer productivity often significantly decreases due to communication, integration, and testing overhead. This is highlighted in the famous book by Frederick Brook, The Mythical Man-Month, where he explains that when projects are late, adding more developers not only decreases individual developer productivity but also decreases overall productivity.
On the other hand, DevOps shows us that when we have the right architecture, the right technical practices, and the right cultural norms, small teams of developers are able to quickly, safely, and independently develop, integrate, test, and deploy changes into production. As Randy Shoup, formerly a director of engineering at Google, observed, large organizations using DevOps “have thousands of developers, but their architecture and practices enable small teams to still be incredibly productive, as if they were a startup.”
The 2015 State of DevOps Report examined not only “deploys per day” but also “deploys per day per developer.” We hypothesized that high performers would be able to scale their number of deployments as team sizes grew.
Indeed, this is what we found. Figure 1 shows that in low performers, deploys per day per developer go down as team size increases, stays constant for medium performers, and increases linearly for high performers.
In other words, organizations adopting DevOps are able to linearly increase the number of deploys per day as they increase their number of developers, just as Google, Amazon, and Netflix have done.§§
One of the most influential books in the Lean manufacturing movement is The Goal: A Process of Ongoing Improvement written by Dr. Eliyahu M. Goldratt in 1984. It influenced an entire generation of professional plant managers around the world. It was a novel about a plant manager who had to fix his cost and product due date issues in ninety days, otherwise his plant would be shut down.
Later in his career, Dr. Goldratt described the letters he received in response to The Goal.  Most importantly, these letters showed people were able to replicate the breakthroughs in performance that were described in the book in their own work environments.
The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win, written by Gene Kim, Kevin Behr, and George Spafford in 2013, was closely modeled after The Goal. It is a novel that follows an IT leader who faces all the typical problems that are endemic in IT organizations: an over-budget, behind-schedule project that must get to market in order for the company to survive. He experiences catastrophic deployments; problems with availability, security, and compliance; and so forth. Ultimately, he and his team use DevOps principles and practices to overcome those challenges, helping their organization win in the marketplace. In addition, the novel shows how DevOps practices improved the workplace environment for the team, creating lower stress and higher satisfaction because of greater practitioner involvement throughout the process.
As with The Goal, there is tremendous evidence of the universality of the problems and solutions described in The Phoenix Project. Consider some of the statements found in the Amazon reviews: “I find myself relating to the characters in The Phoenix Project...I’ve probably met most of them over the course of my career,” “If you have ever worked in any aspect of IT, DevOps, or Infosec you will definitely be able to relate to this book,” or “There’s not a character in The Phoenix Project that I don’t identify with myself or someone I know in real life… not to mention the problems faced and overcome by those characters.”
In the remainder of this book, we will describe how to replicate the transformation described in The Phoenix Project, as well provide many case studies of how other organizations have used DevOps principles and practices to replicate those outcomes.
The purpose of the DevOps Handbook is to give you the theory, principles, and practices you need to successfully start your DevOps initiative and achieve your desired outcomes. This guidance is based on decades of sound management theory, study of high-performing technology organizations, work we have done helping organizations transform, and research that validates the effectiveness of the prescribed DevOps practices. As well as interviews with relevant subject matter experts and analyses of nearly one hundred case studies presented at the DevOps Enterprise Summit.
Broken into six parts, this book covers DevOps theories and principles using the Three Ways, a specific view of the underpinning theory originally introduced in The Phoenix Project. The DevOps Handbook is for everyone who performs or influences work in the technology value stream (which typically includes Product Management, Development, QA, IT Operations, and Information Security), as well as for business and marketing leadership, where most technology initiatives originate.
The reader is not expected to have extensive knowledge of any of these domains, or of DevOps, Agile, ITIL, Lean, or process improvement. Each of these topics is introduced and explained in the book as it becomes necessary.
Our intent is to create a working knowledge of the critical concepts in each of these domains, both to serve as a primer and to introduce the language necessary to help practitioners work with all their peers across the entire IT value stream, and to frame shared goals.
This book will be of value to business leaders and stakeholders who are increasingly reliant upon the technology organization for the achievement of their goals.
Furthermore, this book is intended for readers whose organizations might not be experiencing all the problems described in the book (e.g., long deployment lead times or painful deployments). Even readers in this fortunate position will benefit from understanding DevOps principles, especially those relating to shared goals, feedback, and continual learning.
In Part I, we present a brief history of DevOps and introduce the underpinning theory and key themes from relevant bodies of knowledge that span over decades. We then present the high level principles of the Three Ways: Flow, Feedback, and Continual Learning and Experimentaion.
Part II describes how and where to start, and presents concepts such as value streams, organizational design principles and patterns, organizational adoption patterns, and case studies.
Part III describes how to accelerate Flow by building the foundations of our deployment pipeline: enabling fast and effective automated testing, continuous integration, continuous delivery, and architecting for low-risk releases.
Part IV discusses how to accelerate and amplify Feedback by creating effective production telemetry to see and solve problems, better anticipate problems and achieve goals, enable feedback so that Dev and Ops can safely deploy changes, integrate A/B testing into our daily work, and create review and coordination processes to increase the quality of our work.
Part V describes how we accelerate Continual Learning by establishing a just culture, converting local discoveries into global improvements, and properly reserving time to create organizational learning and improvements.
Finally, in Part VI we describe how to properly integrate security and compliance into our daily work, by integrating preventative security controls into shared source code repositories and services, integrating security into our deployment pipeline, enhancing telemetry to better enable detection and recovery, protecting the deployment pipeline, and achieving change management objectives.
By codifying these practices, we hope to accelerate the adoption of DevOps practices, increase the success of DevOps initiatives, and lower the activation energy required for DevOps transformations.


|
Reckless
Abandon
(Blink 182) |
|
On
and on, reckless abandon
Something's wrong, this is gonna shock them Nothing to hold on to We'll use this song to lead you on I learned a lot today Not sure if I'll get laid Not sure if I'll fail or pass Kissed every girl in class Everybody would waste it all To have a summer that they could call Memory thats full of fun Fucked up, when it's all done On and on, reckless abandon Something's wrong, this is gonna shock them Nothing to hold on to We'll use this song to lead you on And break the truth with more bad news He left a scar, size extra large Sip a drink of the alcohol End up kneeling in bathroom stalls Eyes are red and my movement's slow Too high, got vertigo He took a shit in the bathroom tub And fed the dog with brownie drugs Tried hard to not get caught He fucked a chick in a parking lot On and on, reckless abandon Somethings wrong, this is gonna shock them Nothing to hold on to We'll use this song to lead you on And break the truth with more bad news He left a scar, size extra large Break a window and bust a wall Making fun of your friend's mom Turn the music up way too loud Charged a pizza to the house Everybody would waste it all To have a summer that they could call Memory thats full of fun Gucked up when it's all done On and on, reckless abandon Somethings wrong, this is gonna shock them Nothing to hold on to We'll use this song to lead you on And break the truth with more bad news He left a scar, size extra large |


@(guildShortName: String, steps: Seq[bot.VerificationStep])(implicit flash: Flash) @verify(guildShortName, steps) {
You were previously banned, or do not meet the @guildShortName membership criteria. If you think this might be a mistake, please contact a server admin.


Welcome
About
Exhibition
Aljumaine Gayle
Erin Konsmo
Katelyn Hawley
Olivia Dreisinger
Shonee
Page Not Found
Sorry, but the page you were trying to view does not exist.


Home
Groups
Stats
About us
John Doe
+15.20$
Total balance
+
New group
+5.03$
John's Birthday
-10$
Presents
+13$
Food
2 more ...
Add an expense
+
-8.28$
New York
-10$
Shake Shack
+13$
Empire State Building
4 more ...
Add an expense
+
Create a group
-
John Doe With A Very Very Very Very Very Long Name Seriously
-
John Doe
-
John Doe
-
{{participants.name}}
Add an expense
$
Who paid?
Théotime
Robert
Thomas
Who participated?
Théotime
Robert
Thomas


Browse Available Books
- All Books
- Most Recent
- Most Popular
- Free Books
Jewels of Nizam
by Geeta Devi
Cakes & Bakes
by Sanjeev Kapoor
Jamie’s Kitchen
by Jamie Oliver
Inexpensive Family Meals
by Simon Holst
Paleo Slow Cooking
by Chrissy Gower
Cook Like an Italian
by Tobie Puttock
Suneeta Vaswani
by Geeta Devi
Jamie Does
by Jamie Oliver
Jamie’s italy
by Jamie Oliver
Vegetables Cookbook
by Matthew Biggs
Jewels of Nizam
by Geeta Devi
Cakes & Bakes
by Sanjeev Kapoor


To be, or not to be, that is the question:
Whether 'tis Nobler in the mind to suffer
The Slings and Arrows of outrageous Fortune,
Or to take Arms against a Sea of troubles,
And by opposing end them: to die, to sleep
No more; and by a sleep, to say we end
The Heart-ache, and the thousand Natural shocks
That Flesh is heir to? 'Tis a consummation
Devoutly to be wished. To die to sleep,
To sleep, perchance to Dream; Aye, there's the rub,
For in that sleep of death, what dreams may come,
When we have shuffled off this mortal coil,
Must give us pause.


I am a 4th year BCS student at the University of British Columbia. I am currently on coop building health care analytics apps.
I love building fun projects. They're the best way to learn.
This is a simple trading cards website. Each card shows you an image of the car along with its name and price.
The user is able to add new cards and delete existing cards. The form to add new cards does validation to make sure field are filled out appropriately.
The website is built entirely with pure HTML, CSS, and JavaScript.


| Class and Description |
|---|
| FrameObject |
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| MatrixObject.UpdateType |
| Class and Description |
|---|
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| MatrixObject.UpdateType |
| Class and Description |
|---|
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| CacheBlock
Interface for all blocks handled by lazy write buffer.
|
| MatrixObject.UpdateType |
| Class and Description |
|---|
| CacheableData
Each object of this class is a cache envelope for some large piece of data
called "cache block".
|
| CacheableData.CacheStatus
Defines all possible cache status types for a data blob.
|
| CacheBlock
Interface for all blocks handled by lazy write buffer.
|
| CacheStatistics.Stat |
| FrameObject |
| LazyWriteBuffer.RPolicy |
| MatrixObject
Represents a matrix in control program.
|
| MatrixObject.UpdateType |
| TensorObject |
| Class and Description |
|---|
| CacheableData
Each object of this class is a cache envelope for some large piece of data
called "cache block".
|
| CacheBlock
Interface for all blocks handled by lazy write buffer.
|
| FrameObject |
| MatrixObject
Represents a matrix in control program.
|
| MatrixObject.UpdateType |
| TensorObject |
| Class and Description |
|---|
| CacheableData
Each object of this class is a cache envelope for some large piece of data
called "cache block".
|
| Class and Description |
|---|
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| CacheBlock
Interface for all blocks handled by lazy write buffer.
|
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| CacheBlock
Interface for all blocks handled by lazy write buffer.
|
| Class and Description |
|---|
| CacheableData
Each object of this class is a cache envelope for some large piece of data
called "cache block".
|
| MatrixObject.UpdateType |
| Class and Description |
|---|
| CacheableData
Each object of this class is a cache envelope for some large piece of data
called "cache block".
|
| FrameObject |
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| CacheableData
Each object of this class is a cache envelope for some large piece of data
called "cache block".
|
| CacheBlock
Interface for all blocks handled by lazy write buffer.
|
| Class and Description |
|---|
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| MatrixObject
Represents a matrix in control program.
|
| Class and Description |
|---|
| CacheBlock
Interface for all blocks handled by lazy write buffer.
|
| MatrixObject
Represents a matrix in control program.
|
| MatrixObject.UpdateType |
| Class and Description |
|---|
| CacheBlock
Interface for all blocks handled by lazy write buffer.
|
Copyright © 2021 The Apache Software Foundation. All rights reserved.


| 1 | package fr.sii.ogham.testing.assertion.wiremock; | |
| 2 | ||
| 3 | import org.custommonkey.xmlunit.DetailedDiff; | |
| 4 | import org.w3c.dom.Document; | |
| 5 | ||
| 6 | import com.fasterxml.jackson.annotation.JsonProperty; | |
| 7 | import com.github.tomakehurst.wiremock.client.WireMock; | |
| 8 | import com.github.tomakehurst.wiremock.matching.MatchResult; | |
| 9 | import com.github.tomakehurst.wiremock.matching.StringValuePattern; | |
| 10 | ||
| 11 | import fr.sii.ogham.testing.assertion.util.HtmlUtils; | |
| 12 | ||
| 13 | /** | |
| 14 | * Check if the HTML is similar to the expected. The HTML strings are parsed | |
| 15 | * into {@link Document}s. Two documents are considered to be "similar" if they | |
| 16 | * contain the same elements and attributes regardless of order. | |
| 17 | * | |
| 18 | * <p> | |
| 19 | * See {@link HtmlUtils} for more information about "similar" HTML. | |
| 20 | * | |
| 21 | * <p> | |
| 22 | * NOTE: {@link WireMock#equalToXml(String)} does an identical check. | |
| 23 | * | |
| 24 | * @author Aurélien Baudet | |
| 25 | * | |
| 26 | */ | |
| 27 | public class SimilarHtmlPattern extends StringValuePattern { | |
| 28 | /** | |
| 29 | * Initialized with the expected HTML | |
| 30 | * | |
| 31 | * @param expectedValue | |
| 32 | * the expected HTML | |
| 33 | */ | |
| 34 | public SimilarHtmlPattern(@JsonProperty("similarHtml") String expectedValue) { | |
| 35 | super(expectedValue); | |
| 36 | } | |
| 37 | ||
| 38 | @Override | |
| 39 | public MatchResult match(String value) { | |
| 40 | DetailedDiff diff = HtmlUtils.compare(expectedValue, value); | |
| 41 |
1
1. match : replaced return value with null for fr/sii/ogham/testing/assertion/wiremock/SimilarHtmlPattern::match → NO_COVERAGE |
return new MatchResult() { |
| 42 | ||
| 43 | @Override | |
| 44 | public boolean isExactMatch() { | |
| 45 |
2
1. isExactMatch : replaced boolean return with false for fr/sii/ogham/testing/assertion/wiremock/SimilarHtmlPattern$1::isExactMatch → NO_COVERAGE 2. isExactMatch : replaced boolean return with true for fr/sii/ogham/testing/assertion/wiremock/SimilarHtmlPattern$1::isExactMatch → NO_COVERAGE |
return diff.similar(); |
| 46 | } | |
| 47 | ||
| 48 | @Override | |
| 49 | public double getDistance() { | |
| 50 |
1
1. getDistance : replaced double return with 0.0d for fr/sii/ogham/testing/assertion/wiremock/SimilarHtmlPattern$1::getDistance → NO_COVERAGE |
return diff.getAllDifferences().size(); |
| 51 | } | |
| 52 | }; | |
| 53 | } | |
| 54 | } | |
Mutations | ||
| 41 |
1.1 |
|
| 45 |
1.1 2.2 |
|
| 50 |
1.1 |


|
||||||||||
| PREV LETTER NEXT LETTER | FRAMES NO FRAMES |
DatatypeAttribute
represents an Attribute which supports the
XML Schema Data Types
specification.DatatypeDocumentFactory
is a factory of XML objects which
support the XML Schema Data Types
specification.DatatypeElement
represents an Element which supports the XML Schema Data Types
specification.DatatypeElementFactory
is a factory for a specific Element in
an XML Schema.Document
defines an XML Document.DocumentException
is a nested Exception which may be thrown
during the processing of a DOM4J document.DocumentFactory
is a collection of factory methods to allow
easy custom building of DOM4J trees.DocumentHelper
is a collection of helper methods for using
DOM4J.Locator
is only really useful when parsing a
textual document as its main purpose is to identify the line and column
number.
DocumentResult
implements a JAXP SAXResult
for a
Document
.DocumentSource
implements a JAXP SAXSource
for a
.SAXSource
for the given Node
.
SAXSource
for the given Document
.
DocumentType
defines an XML DOCTYPE declaration.TransformerFactory.getFeature(java.lang.String)
returns
true
when passed this value as an argument then the
Transformer natively supports dom4j .
DOMReader
navigates a W3C DOM tree and creates a DOM4J tree
from it.DOMWriter
takes a DOM4J tree and outputs it as a W3C DOM
object
|
||||||||||
| PREV LETTER NEXT LETTER | FRAMES NO FRAMES |


--- layout: default title: Deis meta: - name: description content: Deis is an open source PaaS that leverages Docker, CoreOS and Heroku Buildpacks to provide a private application platform that is lightweight and flexible. - name: keywords content: deis, open source, application platform, docker, heroku, buildpacks, private paas, paas ---
Open Source Application Platform
For Public and Private Clouds


Instructions
Select features using select by polygon tool. Attributes of selected features will be displayed here.
Click on a row to select a feature associated with it or click on a feature to display its popup.


Disney+ Already Flying High With More Than 10 Million Subscribers
Disney+ already has more than 10 million subscribers.
This is in spite of the service only having been available for one day and still limited to select countries.
The number beats previous expectations signalling the service will continue to see rapid growth as it expands to more places.
Advertisement
Disney+ outdoing already high expectations
Disney+ was always expected to make a splash when it arrived. Even prior to the launch it was clear there was enormous interest with Disney+ racking up almost 2 million subscribers through pre-orders alone.
However, the real test was always going to be what number the service settled on at the end of the first day. That number has now been confirmed by Disney as 10 million.
This is only the start of things to come considering Disney+ is still only available in select countries. The company has already confirmed Disney+ will go live in many European countries on March 31, 2020.
Advertisement
The United Kingdom, Germany, and France are all part of that European launch and you can expect another instant subscriber boost to take place at that time.
Long before then, the next big test will come in a matter of days.
Disney's next big test coming soon
Impressive as it is that Disney+ has amassed so many subscribers and so quickly, these are not paid subscribers yet.
Advertisement
Disney+ offers a seven-day free trial and the majority of the 10 million are currently taking advantage of the free period.
Next week those trials will come to an end leaving subscribers with the choice of canceling their subscription or converting to a paid subscription. How many subscribers the service has then will be a truer indication of how well Disney+ streaming is doing.
The price is one of the ways Disney hopes to reduce the number of subscribers from cancelling.
Advertisement
At just $6.99 per month, Disney is significantly cheaper than many other services, including Netflix.
Adding to this, Disney+ has also made a play for the value beyond the sign-up price. For example, unlike other services, Disney+ does not offer any complicated plans or upgrades.
Instead, Disney+ comes loaded with every feature Disney has to offer included in the base price. This includes 4K, unlimited downloads, up to four streams at the same time, and more.
Advertisement
Of course, having access to the Star Wars, Marvel, Nat Geo and The Simpsons back catalogs helps as well. As does the ability to stream years and years of Disney classics.


Extracting chords from MIDI¶
CASSETTE (Chord estimation Applied to Symbolic music by Segmentation, Extraction and Tie-breaking TEmplate matching) is a chord_template-matching based algorithm for MIDI chord recognition that is easy to implement and understand. Similar to the good old cassette tapes, this algorithm is certainly not state of the art. However, it is simple to implement and does not require any training.
CASSETTE recognizes chords in a three-step procedure:
It segments each audio-aligned midi file (on bar/beat/note level);
It calculates a weighted chroma feature for each of the segments, based on the notes within that segment;
It matches the features of each segment to the features of a predefined chord vocabulary and assigns each segment to the most similar chord.
The main function to use is classify_aligned_midis_for_song()
, which calls CASSETTE on all MIDIs matched to
the given Song.
-
decibel.midi_chord_recognizer.cassette.
classify_aligned_midis_for_song
(chord_vocabulary: decibel.music_objects.chord_vocabulary.ChordVocabulary, segmenter: decibel.midi_chord_recognizer.midi_segmenter_interface.MIDISegmenterInterface)[source]¶ Find chord labels for all re-aligned MIDIs of this song
- Parameters
song – Song object for which we want to find the chord labels
chord_vocabulary – List of all chords
segmenter – Bar or beat segmenter


Photography & Videography
Home
Photos
Real Estate
Cars
Photoshop
Videos
Cinematography
More Videos
Contact
404 Error
Search


Burgers' equation with three constant states as initial data, ql = -1.0, qm = 3.0, qr = -2.0
Your browser does not support the video tag.


Certified Subtitle 1
EnerSys Supplier Subtitle 2
EnerSys Service Subtitle 3
UPS Battery and Uninterruptible Power Supply Sales and Installation.
UPS Battery and Uninterrup
CPR and forklift certified personnel Spill kits and safety ki
Smelter facility for battery disposal $5,000,000.00 polluti
Toll free 24/7 emergency service line with immediate dispa


3132095
Account: 3132095
Balance (USD)
Leverage
Your actual leverage could be lower depending on various conditions.
New Nickname
If you have multiple accounts, you can give each one a unique name to make navigation easier.
Server: mt5real.exness.com:443
MT5 Login: 3132095
Type: Standard
Leverage: 1:2000
Real funds: 0.00 USD
Unrealized P&L: 0.00 USD
Current Trading Password
New Trading Password


MOTORAMA A film review by Gerald Edgar Copyright 1993 Gerald Edgar
I rented the movie MOTORAMA by pure coincidence. I am glad I did.
MOTORAMA is a 1991 comedy written by Joseph Minion and directed by Barry Shils. It is such a charming little movie, I wonder why I had never heard of it before.
The star is Jordan Christopher Michael as Gus, a ten-year-old on the road. (His previous credits are two made-for-TV movies.) We see Gus's (dare I say it?) quirky adventures as he travels. But where is it? It seems (at first) to be the western rural USA (it was filmed in California and Arizona); but after a while we see from the details that it is not. Maybe it is some future time, or some alternate USA, or perhaps just some generic place dreamed up for the movie. It might be interesting to take the states Gus visits, and see if they can be identified as corresponding to real places.
Many of the small roles, people Gus meets along the way, are played by well-known actors, including: Drew Barrymore, Dick Miller, Vince Edwards (as a doctor of course), Michael J. Pollard, Jack Nance, Charles Tyner, and Robert Picardo. But don't get the movie to see these actors, because each of them is only briefly on screen. Writer Joseph Minion's previous film AFTER HOURS is also quirky in its own way, but I liked MOROTRAMA much more.
Unexpected things happen to Gus along the way. The ending is a bit peculiar, and it left me smiling, wanting to see more. If you like strange movies, try this one. MOTORAMA is rated R, presumably for language: the sex and violence could be easily PG-13.
-- Gerald A. Edgar Internet<EMAIL_ADDRESS>Department of Mathematics Bitnet: EDGAR@OHSTPY
.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Mother charged, may have to register as sex offender after being topless in her home
SALT LAKE CITY (KSL/CNN) - A Utah woman is facing charges after she says her stepchildren spotted her topless in her own home.
Tili Buchanan is charged with a misdemeanor that could force her to register as a sex offender.
Her lawyers were in court Tuesday, asking a judge to strike down the law banning toplessness for women.
The incident happened more than a year ago in Salt Lake City. Buchanan says she and her husband were hanging drywall in their garage when they took off their shirts to keep their clothes from getting dusty. Buchanan also removed her bra.
Her three stepchild asked why she wasn't wearing a shirt, and she told the children, everyone should be fine walking around their own home with their skin showing.
"It was in the privacy of my own home. My husband was right next to me in the exact same manner, so I'm being prosecuted for it,” Buchanan said.
"When you look at this statute is there's one, there's a part of it that says a woman. This part of a woman is found inherently obscene, and this part of a man isn't, and that really sets up an unequal, unfair dichotomy,” Leah Farrell, Buchanan’s attorney, said.

The judge is expected to rule in a couple of months.


Keeps track of the index of the images being received by the drain. More...
#include <helper.h>
Public Member Functions | |
| Counter () | |
| Constructor of counter. More... | |
| unsigned long | getCurrentSeq () |
| Get the currently stored index value. More... | |
| long int | getLoss () |
| Get the estimated value of lost images/messages. More... | |
| void | updateSeq (unsigned long index) |
| updateSeq More... | |
Private Attributes | |
| boost::mutex | counter_mutex |
| unsigned long | current_seq |
| bool | first_time |
| long int | loss |
| unsigned long | previous_seq |
Keeps track of the index of the images being received by the drain.
The drain instance shall encapsulate two counters, one for the RGB subscriber and one for the depth subscriber. Upon receiving a new image from the source, the subscriber thread will call Counter's updateSeq method and pass it the image's index. Counter will compare the current index with the previous index and calculate the number of lost images during transmission
Counter is thread safe.
|
inline |
| unsigned long Counter::getCurrentSeq | ( | ) |
| long int Counter::getLoss | ( | ) |
Get the estimated value of lost images/messages.
Definition at line 25 of file counter.cpp.
| void Counter::updateSeq | ( | unsigned long | index | ) |
updateSeq
Everytime this method is called, loss will be updated based on the difference between current_seq and previous_seq.
Normally, this difference is expected to be 1, which means no loss between the arrival of two images/messages. In this case, loss does not change.
If the diff. > 1, at least one message is not received yet, and loss will increase.
| index | Index of the newly received image/message |
Definition at line 6 of file counter.cpp.
|
private |
|
private |


| equality-expectations {testthat} | R Documentation |
These functions provide two levels of strictness when comparing a
computation to a reference value. expect_identical()
is the baseline;
expect_equal()
relaxes the test to ignore small numeric differences.
In the 2nd edition, expect_identical()
uses identical()
and
expect_equal
uses all.equal()
. In the 3rd edition, both functions use
waldo. They differ only in that
expect_equal()
sets tolerance = testthat_tolerance()
so that small
floating point differences are ignored; this also implies that (e.g.) 1
and 1L
are treated as equal.
expect_equal( object, expected, ..., tolerance = if (edition_get() >= 3) testthat_tolerance(), info = NULL, label = NULL, expected.label = NULL ) expect_identical( object, expected, info = NULL, label = NULL, expected.label = NULL, ... )
object, expected |
Computation and value to compare it to. Both arguments supports limited unquoting to make it easier to generate readable failures within a function or for loop. See quasi_label for more details. |
... |
3e: passed on to 2e: passed on to |
tolerance |
3e: passed on to 2e: passed on to |
info |
Extra information to be included in the message. This argument is soft-deprecated and should not be used in new code. Instead see alternatives in quasi_label. |
label, expected.label |
Used to customise failure messages. For expert use only. |
expect_setequal()
/expect_mapequal()
to test for set equality.
expect_reference()
to test if two names point to same memory address.
Other expectations:
comparison-expectations
,
expect_error()
,
expect_length()
,
expect_match()
,
expect_named()
,
expect_null()
,
expect_output()
,
expect_reference()
,
expect_silent()
,
inheritance-expectations
,
logical-expectations
a <- 10 expect_equal(a, 10) # Use expect_equal() when testing for numeric equality ## Not run: expect_identical(sqrt(2) ^ 2, 2) ## End(Not run) expect_equal(sqrt(2) ^ 2, 2)


The data comes from UCI Machine learning repository of a retail bank in Portugal from their telemarketing campaign of term deposits products.
Term deposits = long-term locked-in accounts with higher saving rates
The business objectives are as follows:
Here are the features available in the dataset:
bank client data:
related with the last contact of the current campaign:
social and economic context attributes
client_col = ['age', 'job', 'marital','education','default','housing',
'loan', 'y']
clients = df[client_col]
context_var = ['emp.var.rate', 'cons.price.idx',
'cons.conf.idx', 'euribor3m', 'nr.employed', 'y']
contexts = df[context_var]
campaign_col = ['contact', 'month', 'day_of_week', 'duration', 'campaign', 'pdays',
'previous', 'poutcome','y']
campaigns = df[campaign_col]
campaigns['previous'] = campaigns['previous'].astype('category')
df.head()
| age | job | marital | education | default | housing | loan | contact | month | day_of_week | ... | campaign | pdays | previous | poutcome | emp.var.rate | cons.price.idx | cons.conf.idx | euribor3m | nr.employed | y | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 56 | housemaid | married | basic.4y | no | no | no | telephone | may | mon | ... | 1 | 999 | 0 | nonexistent | 1.1 | 93.994 | -36.4 | 4.857 | 5191.0 | no |
| 1 | 57 | services | married | high.school | unknown | no | no | telephone | may | mon | ... | 1 | 999 | 0 | nonexistent | 1.1 | 93.994 | -36.4 | 4.857 | 5191.0 | no |
| 2 | 37 | services | married | high.school | no | yes | no | telephone | may | mon | ... | 1 | 999 | 0 | nonexistent | 1.1 | 93.994 | -36.4 | 4.857 | 5191.0 | no |
| 3 | 40 | admin. | married | basic.6y | no | no | no | telephone | may | mon | ... | 1 | 999 | 0 | nonexistent | 1.1 | 93.994 | -36.4 | 4.857 | 5191.0 | no |
| 4 | 56 | services | married | high.school | no | no | yes | telephone | may | mon | ... | 1 | 999 | 0 | nonexistent | 1.1 | 93.994 | -36.4 | 4.857 | 5191.0 | no |
5 rows × 21 columns
def cat_summary(df, cat_col,target, fw):
sns.set_style('whitegrid')
fh = np.ceil(fw/2*(len(cat_col)/2))
fig,axes = plt.subplots(int(np.ceil(len(cat_col)/2)),2,figsize=(fw,fh))
for idx,col in enumerate(cat_col):
sns.countplot(data=df,x=col,hue=target,ax=fig.axes[idx])
for ax in fig.axes:
ax.xaxis.set_visible(True)
ax.yaxis.set_visible(True)
if len(ax.get_xticklabels())>5:
for tick in ax.get_xticklabels():
tick.set_rotation(90)
else:
for tick in ax.get_xticklabels():
tick.set_rotation(45)
plt.tight_layout()
plt.show()
cat_col = [col for col in clients.columns if clients[col].dtype.name =='object']
cat_summary(clients, cat_col, 'y',12)
print('Defaults')
print(clients.default.value_counts())
print('-'*50)
print('Education')
print(clients.education.value_counts())
print('-'*50)
print('Marital status')
print(clients.marital.value_counts())
Defaults no 32588 unknown 8597 yes 3 Name: default, dtype: int64 -------------------------------------------------- Education university.degree 12168 high.school 9515 basic.9y 6045 professional.course 5243 basic.4y 4176 basic.6y 2292 unknown 1731 illiterate 18 Name: education, dtype: int64 -------------------------------------------------- Marital status married 24928 single 11568 divorced 4612 unknown 80 Name: marital, dtype: int64
#@title
from scipy.stats import chi2_contingency
def cramer_v_cal(f,n,r,c):
return np.sqrt((f/n)/np.min([r-1,c-1]))
def multi_chi2_tests(df, cat_col, target,alpha):
cramer_v = []
test_statistics = []
p_values = []
for col in cat_col:
ct = pd.crosstab(df[col], df[target])
res = chi2_contingency(ct)
n = ct.sum().sum()
r = ct.shape[0]
c = ct.shape[1]
cramer_val = cramer_v_cal(res[0],n,r,c)
cramer_v.append(cramer_val)
test_statistics.append(res[0])
p_values.append(res[1])
results = pd.DataFrame({'Variables':cat_col,
'Chi2 statistics':test_statistics,
'Cramer V': cramer_v,
'p-values': p_values})
results['Sig.@ alpha='+str(alpha)] = ['yes' if p<=alpha else 'no' for p in p_values]
if target in results.Variables.tolist():
results.drop(results[results['Variables']==target].index,axis=0,inplace=True)
return results
cat_col = [col for col in clients.columns if clients[col].dtype.name =='object' and col != 'y']
results = multi_chi2_tests(clients, cat_col, 'y', 0.05)
print('Pearson chi-squared test for categorical variables against whether client subscribe after telemarketing campaign')
results
Pearson chi-squared test for categorical variables against whether client subscribe after telemarketing campaign
| Chi2 statistics | Cramer V | Variables | p-values | Sig.@ alpha=0.05 | |
|---|---|---|---|---|---|
| 0 | 961.242440 | 0.152768 | job | 4.189763e-199 | yes |
| 1 | 122.655152 | 0.054570 | marital | 2.068015e-26 | yes |
| 2 | 193.105905 | 0.068472 | education | 3.305189e-38 | yes |
| 3 | 406.577515 | 0.099354 | default | 5.161958e-89 | yes |
| 4 | 5.684496 | 0.011748 | housing | 5.829448e-02 | no |
| 5 | 1.094028 | 0.005154 | loan | 5.786753e-01 | no |
#@title
from scipy.stats import ttest_ind
def cohend(d1, d2):
# calculate the size of samples
n1, n2 = len(d1), len(d2)
# calculate the variance of the samples
s1, s2 = np.var(d1, ddof=1), np.var(d2, ddof=1)
# calculate the pooled standard deviation
s = np.sqrt(((n1 - 1) * s1 + (n2 - 1) * s2) / (n1 + n2 - 2))
# calculate the means of the samples
u1, u2 = np.mean(d1), np.mean(d2)
# calculate the effect size
return (u1 - u2) / s
print('EDA Clients age')
t_stats, t_p_val = ttest_ind(clients.loc[clients['y']=='yes','age'].values,
clients.loc[clients['y']=='no','age'].values,
equal_var = True)
t_stats = np.round(t_stats,2)
t_p_val = format(t_p_val, '.6f')
print('t-test for difference of mean between groups of outcome')
print('t-statistic: {}, p-value: {}'.format(t_stats, t_p_val))
plt.figure(figsize=(9,6))
sns.set_style('whitegrid')
sns.pointplot(data=clients, x='y', y='age', ci=95)
plt.show()
EDA Clients age t-test for difference of mean between groups of outcome t-statistic: 6.17, p-value: 0.000000
plt.figure(figsize=(9,6))
sns.distplot(clients.loc[clients['y']=='no','age'],hist=False,
kde_kws={'shade':True},
color='r', label='Did not subscribe',)
sns.distplot(clients.loc[clients['y']=='yes','age'],hist=False,
kde_kws={'shade':True},
color='c',label='Subscribed',)
plt.legend()
age_cohen = cohend(clients.loc[clients['y']=='yes', 'age'].values,
clients.loc[clients['y']=='no', 'age'].values)
age_cohen = np.round(age_cohen,3)
print('The cohen effect size in terms of age difference between outcome is {}'.format(age_cohen))
plt.show()
The cohen effect size in terms of age difference between outcome is 0.096
num_campaign = ['duration', 'campaign', 'pdays']
cat_campaign = [col for col in campaigns.columns if col != 'y' and col not in num_campaign]
cat_summary(campaigns, cat_campaign, 'y',12)
results_2 = multi_chi2_tests(campaigns, cat_campaign, 'y', 0.05)
print('Pearson chi-squared test for categorical variables against whether client subscribe after telemarketing campaign')
results_2
Pearson chi-squared test for categorical variables against whether client subscribe after telemarketing campaign
| Chi2 statistics | Cramer V | Variables | p-values | Sig.@ alpha=0.05 | |
|---|---|---|---|---|---|
| 0 | 862.318364 | 0.144693 | contact | 1.525986e-189 | yes |
| 1 | 3101.149351 | 0.274395 | month | 0.000000e+00 | yes |
| 2 | 26.144939 | 0.025195 | day_of_week | 2.958482e-05 | yes |
| 3 | 2299.436360 | 0.236279 | previous | 0.000000e+00 | yes |
| 4 | 4230.523798 | 0.320488 | poutcome | 0.000000e+00 | yes |
# plt.figure(figsize=(20,20))
# numcol=[col for col in campaigns.columns if col not in cat_campaign]
num_campaign.append('y')
sns.pairplot(campaigns.loc[campaigns['pdays']!=999,num_campaign], diag_kind ='kde',
height=3.5, hue='y')
plt.show()
corr = campaigns.loc[campaigns['pdays']!=999,num_campaign].corr()
mask = np.zeros_like(corr)
mask[np.triu_indices_from(mask)] = True
plt.figure(figsize=(8,8))
sns.heatmap(corr, mask=mask,square=True)
plt.title('Correlation plots numeric campaigns variables')
plt.show()
from scipy.stats import f_oneway
def multi_anova_oneway(df, num_col, target, alpha=0.05):
groups = df[target].unique()
f_val = []
p_val = []
cohen = []
for col in num_col:
group1 = df.loc[df[target]==groups[0], col].values
group2 = df.loc[df[target]==groups[1],col].values
f,p = f_oneway(group1, group2)
d = cohend(group1, group2)
cohen.append(d)
f_val.append(f)
p_val.append(p)
results = pd.DataFrame({
'Variables':num_col,
'Cohen d': cohen,
'F-statistics':f_val,
'p-values':p_val,
})
results['Sig.@ '+str(alpha)] = ['no' if pv>alpha else 'yes' for pv in p_val]
return results
print('ANOVA one-way tests')
results = multi_anova_oneway(campaigns, ['duration','campaign','pdays'],'y')
results
ANOVA one-way tests
| Cohen d | F-statistics | Variables | p-values | Sig.@ 0.05 | |
|---|---|---|---|---|---|
| 0 | -1.402100 | 8094.101634 | duration | 0.000000e+00 | yes |
| 1 | 0.210338 | 182.156673 | campaign | 2.007780e-41 | yes |
| 2 | 1.086588 | 4861.173272 | pdays | 0.000000e+00 | yes |
contexts.describe().transpose()
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| emp.var.rate | 41188.0 | 0.081886 | 1.570960 | -3.400 | -1.800 | 1.100 | 1.400 | 1.400 |
| cons.price.idx | 41188.0 | 93.575664 | 0.578840 | 92.201 | 93.075 | 93.749 | 93.994 | 94.767 |
| cons.conf.idx | 41188.0 | -40.502600 | 4.628198 | -50.800 | -42.700 | -41.800 | -36.400 | -26.900 |
| euribor3m | 41188.0 | 3.621291 | 1.734447 | 0.634 | 1.344 | 4.857 | 4.961 | 5.045 |
| nr.employed | 41188.0 | 5167.035911 | 72.251528 | 4963.600 | 5099.100 | 5191.000 | 5228.100 | 5228.100 |
corr = contexts.corr()
mask = np.zeros_like(corr)
mask[np.triu_indices_from(mask)] = True
plt.figure(figsize=(8,8))
sns.heatmap(corr, mask=mask, square=True, annot=True)
plt.yticks(rotation=0)
plt.show()
Looks like we have heavy multi-collinearity between economic variables, which is normal but wouldn't do well for traditional regression analysis
results_cont = multi_anova_oneway(contexts, ['emp.var.rate','cons.price.idx','cons.conf.idx',
'euribor3m','nr.employed'], 'y')
results_cont
| Variables | Cohen d | F-statistics | p-values | Sig.@ 0.05 | |
|---|---|---|---|---|---|
| 0 | emp.var.rate | 0.988586 | 4023.829925 | 0.000000e+00 | yes |
| 1 | cons.price.idx | 0.434859 | 778.589786 | 9.318965e-170 | yes |
| 2 | cons.conf.idx | -0.173829 | 124.409975 | 7.536665e-29 | yes |
| 3 | euribor3m | 1.023074 | 4309.479048 | 0.000000e+00 | yes |
| 4 | nr.employed | 1.199769 | 5926.610646 | 0.000000e+00 | yes |
Europe interbank borrowing rate, number of citizens employed, and employment variation rate seems to have big impact on whether client has subscribed.
Our hypotheses are:
We will use decision trees to build a predictive model and analyse the most important predictor because:
The chosen package is Extreme Gradient Boosting (xgboost)
Input:
Output
print('The shape of predictors is {}'.format(X.shape))
print('The shape of target is {}'.format(y.shape))
The shape of predictors is (41188, 62) The shape of target is (41188, 1)
%%time
hyperopt = {'colsample_bytree': 0.55, 'eta': 0.005, 'max_depth': 4,
'min_child_weight': 5.0, 'subsample': 1.0}
d_train = xgb.DMatrix(data=X_train, label=y_train, nthread=-1)
d_test = xgb.DMatrix(data=X_test, label=y_test,nthread=-1)
watch_list = {(d_test, 'eval'), (d_train, 'train')}
param_set = {'objective':'binary:logistic',
'eval_metric':'auc',
'seed':42,
'tree_method':'gpu_hist',
'growpolicy':'lossguide',
'scale_pos_weight':float(np.sum(y.y==0)/np.sum(y.y==1))}
param_set.update(hyperopt)
rounds = 2000
eval_loss = {}
xgbclf = xgb.train(params=param_set, dtrain=d_train,maximize=True,
evals=watch_list, num_boost_round=rounds,
verbose_eval=200,#early_stopping_rounds = int(rounds/10),
callbacks=[xgb.callback.record_evaluation(eval_loss)])
[0] eval-auc:0.77659 train-auc:0.79086 [200] eval-auc:0.787509 train-auc:0.801548 [400] eval-auc:0.789473 train-auc:0.805303 [600] eval-auc:0.792038 train-auc:0.809257 [800] eval-auc:0.792666 train-auc:0.812517 [1000] eval-auc:0.793453 train-auc:0.816033 [1200] eval-auc:0.793637 train-auc:0.818966 [1400] eval-auc:0.794603 train-auc:0.82192 [1600] eval-auc:0.795376 train-auc:0.825111 [1800] eval-auc:0.796124 train-auc:0.827617 [1999] eval-auc:0.796708 train-auc:0.83012 CPU times: user 30.9 s, sys: 6.34 s, total: 37.2 s Wall time: 26.8 s
class_bin_eval(y_test, y_pred, 0.5)
Top 4 (all economic variables):
import shap
explainer = shap.TreeExplainer(xgbclf)
shap_val = explainer.shap_values(X, approximate=True)
shap.summary_plot(shap_val, X, plot_type='bar')
Caveats: could be sampling bias where clients using cellphone are richer thus more likely to have long term deposits.
Caveats: clients previously subscribed have a higher prior probability of subscribing.
Caveats: clients not willing to subscribe in the first place intentionally prolong the contact to multiple times OR complicated procedures make clients change their mind.
shap.summary_plot(shap_val, X)
Adding variables:
Phone call contexts: Caller profile(number of sales this month number of years experience); inbound/outbound call; time of day;
Client variables: Income, banking relationship (whether they have other types of account with us), spending pattern (in context of income),
Product variables: national monthly average term deposit rate, most client-suited rate according to banks (best-offered), best-offered minus national average, type of product offered
Several possible applications given a predicted probability of subscription:
Sort clients by probability of acceptance and call the most likely first. If a value per each acceptance is given (i.e. profit if subscribe) we can optimise the call list to call only the top 20% valuable and likely to accept clients first.
Given clients probability of acceptance of each product, optimise the offerings to all clients. Matrix of decision: n-products x m-clients
Optimise allocation of caller to clients to improve success rate.


{% extends 'layout.html' %} {% set pageName='Unable to login' %} {% block page_content %}
We are experiencing technical problems. Try again in a few moments.
If you’re still having trouble getting access try visiting the homepage or let us know
{# Error should be raised in Sentry #}The team has been notified of this error.
{% endblock %}


Follow the links below to the Luigi feature demos.
LuigiClient Features
{{ item.text }} – {{ item.description }}
Luigi Core Features
{{ item.text }} – {{ item.description }}
There are no unsaved changes – toggle
this to be asked for confirmation when you leave this page
There are unsaved changes – a
confirmation modal will appear when you navigate
somewhere else
Update Header Navigation – Updates the top
navigation, eg. to update badge counters


low_bits_mask
is a section
of contiguous of bits which extend out from the least significant bit toward
the most significant bit. The following is a basic example of how low_bits_mask
works:
typedef low_bits_mask<int, 10> mask; // mask::value has the following binary value // 0000 0000 0000 0000 0000 0011 1111 1111
#include <boost/integer/low_bits_mask.hpp> #include <boost/integer/high_low_mask.hpp>
low_bits_mask
has the following
template signature:
namespace boost { template <typename T, unsigned int Width> struct low_bits_mask; }
low_bits_mask
inherits from
integral_mask
.
|
Parameter |
Description |
|---|---|
|
|
Is an integral type which the mask is to be created over. |
|
|
This is the width of the mask in bits. |
low_bits_mask
Compile time
interface. Assume that N
is of type low_bits_mask<int,10>
the
type supplied here is only for example.
|
Operation |
Description |
|---|---|
|
|
Returns the |
|
|
Returns |
|
|
Returns the current types type. |
|
|
Returns the integral value associated with the |
|
|
Returns 0 for this mask because the |
|
|
Run time support function. All this function does is return the value associated with the type. |
|
Precondition |
Description |
Enforcement |
|---|---|---|
|
|
The |
Enforced by static assert. |
|
|
|
This is only a documented precondition. It is not enforced. |
Examples and use cases related to the low_bits_mask
template.
Example:
typedef low_bits_mask<int,4> mask; // binary for mask::value // 0000 0000 0000 0000 0000 0000 0000 1111 int integral_value = 0xc000000c; // integral_value's binary value // 1100 0000 0000 0000 0000 0000 0000 1100 int result = integral_value & mask(); // binary value of result // 0000 0000 0000 0000 0000 0000 0000 1100
The implicit cast operator allows for simplicity, clairity of code. In the
above example mask()
could be replaced with mask::value
to achieve the same result. The same applies to all other bitwise operators.


American History is filled with stories of men and women of other nations coming to this great land of opportunity and making a way for themselves and their families. One such success story is right here in our own community. Cataldo Alu, "Aldo" as he is known by most, first came to this nation on January 22, 1966, at the tender age of eighteen. Aldo was born on May 10, 1948, in the city of Palermo, Sicily of Italy. Working with an Italian restaurant in St. Louis, he decided to test the opportunities available and began his own restaurant. Aldo came to Washington, Missouri on July 2, 1971, at the age of twenty-four and opened ALDO'S PIZZA on the corner of Fifth and Grand. It's been a success ever since. He married Liberata or "Susie," on June 29, 1974. Aldo's philosophy is to make the best Italian food around by taking meticulous care in using the freshest ingredients which go into every dish. Take his pizza for instance. It isn't thrown together using mass produced dough, but rather the dough is made fresh daily in the restaurant. The special recipe used in Aldo's sausage and hamburger toppings are made in house, as well, as our tomato and meat sauces.


#include <WinCAPICryptoHash.hpp>
Inheritance diagram for WinCAPICryptoHash:
Uses the Windows Crypt functions to perform digest functions.
Public Member Functions | |
Constructors/Destructors | |
| WinCAPICryptoHash (HCRYPTPROV prov, XSECCryptoHash::HashType alg) | |
| Construct a Hash object. | |
| virtual | ~WinCAPICryptoHash () |
HMAC Functions | |
| virtual void | setKey (XSECCryptoKey *key) |
Digest/Hash functions | |
| virtual void | reset (void) |
| Rest the hash function. | |
| virtual void | hash (unsigned char *data, unsigned int length) |
| Hash some data. | |
| virtual unsigned int | finish (unsigned char *hash, unsigned int maxLength) |
| Finish up a Digest operation and read the result. | |
Information functions | |
| virtual HashType | getHashType (void) |
|
|
Construct a Hash object. Creates a Windows Crypto API based hash object of the required type.
|
|
|
|
|
|
Finish up a Digest operation and read the result. This call tells the CryptoHash object that the input is complete and to finalise the Digest. The output of the digest is read into the hash buffer (at most maxLength bytes)
Implements XSECCryptoHash. |
|
|
Determine the hash type of this object
Implements XSECCryptoHash. |
|
|
Hash some data. Take length bytes of data from the data buffer and update the hash that already exists. This function may (and normally will) be called many times for large blocks of data.
Implements XSECCryptoHash. |
|
|
Rest the hash function. Re-initialises the digest structure. Implements XSECCryptoHash. |
|
|
Does nothing. If the required function is an HMAC function, then WinCAPICryptoHashHMAC should be used.
Implements XSECCryptoHash. |


The quick young fox jumped over the lazy dog.
The quick young fox jumped over the lazy dog.
The quick young fox jumped over the lazy dog.
The quick young fox jumped over the lazy dog.


Healthy baby boy for Cape Town Shoprite cashier who was assaulted while pregnant
by Velani LudidiShoprite cashier Zimkhitha Xhalabile gave birth to a healthy baby boy last month.
Xhalabile was eight-months pregnant when she was assaulted by a male customer at her till in September, GroundUp reported.
She had just closed her till in the Shoprite in Broadway Mall, Lwandle, on September 9, when a customer demanded to be assisted.
At first, she said, she argued with the customer, telling him to use another till, but when he became aggressive, she decided to assist him.
The two exchanged words and the customer punched Xhalabile. The incident was recorded on the CCTV cameras. The man has made a brief appearance at the Strand Magistrate's Court.
"The court wanted us to reconcile, but he has not shown any sign of remorse. He has not tried to apologise or asked to speak to my family. I would have considered dropping the case if he tried showing remorse. I want the case to carry on," said Xhalabile.
She is currently on maternity leave and is expected back at work in April next year.
"I am happy that nothing happened to my child. That was one of my worries, even after doctors assured me nothing was wrong."


Team comprising of Eldhose Joy, Varghese Mathai and Arun Baby, under the guidance of Asst. Prof Anas M.M, bagged the third prize of Rs 40,000, for their work on “Zone Adaptive Warning and Speed Control System”in the finals of 3rd National Level ACCS-ARM Design challenge
The team led by KPS Sachin, Athul Stanley and Abhijith A Sabu and mentored by Prof. Anas M.M received the honour of ‘Most Promising Project’ in the 3rd National Level ACCS-ARM Design for their effort On “Driving Control System Based on Heart Beat” and won Rs. 25,000/- for their project.
Save Your Money(SYM), a fintech startup has been acquired by Accel Partners backed Good Methods Global(GMG). SYM was founded by Aravind Muraleedharan,Vivek S,Abin Alias,Aswin Dev and Sarah Abraham while in their third year of engineering at MITS. Hearty congratulations to team SYM.
The mini-project team consisting of Sruthy Chandran, Soniya Sanu, Rekha Narayanan and Anju Saji, S6 CSE 2017 , under the guidance of Asst. Prof Divya Madhu, presented a paper on ”OMALISTA:An user assistance to rack up tagged wish car” at IEEE International Conference on ICICCS 2017


Do you want a standardized UI for your app which is easy to use and configure? Luigi comes with an out-of-the-box L-shaped shell bar with a variety of different menus, dropdowns and switchers. The navigation built with Fundamental Styles allows all your micro frontends to be embedded in a consistent UI. Learn more about Luigi navigation here.
Luigi can help you quickly adapt your application to render well on a variety of devices and automatically scale the content and elements to match the screen size on which it is viewed. You can create a responsive app in two simple steps. Find out more here.
Security is an important feature, so Luigi has simplified the process of authenticating users with a unique login password. Luigi Core provides ready-to-use plugins for OpenID Connect and OAuth2. We also describe how to use Google Cloud Identity with Luigi or set up your own custom authorization provider.
Another way to use Luigi's authorization and Core/Client API features is to make certain parts of your application only visible to some users. You can show a different view to admins and regular users, for example. This allows for more flexibility and security in your app.
Luigi allows you to set up notifications and alerts for your application. The alerts are displayed in the main app, which means that you save time and effort by developing them globally, and they all have a consistent user-friendly look. Find out more about alerts here. Notifications can also be displayed by using the badge counter for top navigation items.
Besides alerts, you can also add input forms, messages, and modals via your Luigi configuration. Modals are designed to look like a part of the Luigi Core app, but receive data from the micro frontend. Thus, your app looks consistent and not like a patchwork of different micro frontends. For more information check out the Luigi Core and Luigi Client API documentation.
Offering your app in different languages allows you to reach more people. Luigi is the only micro frontend framework which also offers localization and translation features. For more information, refer to our localization example here.