Event Location:
Pensacola State College, Main Campus
1000 College Blvd
Pensacola, Florida
Abstract:
Have you been wondering what Azure SQL Database is and what it means for you as a production DBA? Azure SQL Database has become an Enterprise-worthy database platform that provides relational database-as-a-service. In this session you’ll get a grounding in the fundamentals of Azure SQL Database from a DBA perspective. First we’ll cover how to create an Azure SQL Database using the Azure Portal and an approach for sizing a new Azure SQL Database. Then we’ll cover some of the similarities and differences between on premises SQL Server and Azure SQL Database. Finally we will cover how monitoring and performance tuning Azure SQL Database differs from on premises SQL Server. If you’ve been considering Azure SQL Database for your organization, this session is for you!
Speaker(s): Tim Radney,
Abstract:
Query tuning is key to peak performance in SQL Server databases. However, lots of developers and DBAs constantly struggle to pinpoint the root cause of performance issues and spend way too much time in trying to fix them. In this presentation, I will share my tried and true best practices for tuning SQL statements and other issues by utilizing Wait Time Analysis, reviewing execution plans and using SQL diagramming techniques. In addition, several case studies will be used to demonstrate these best practices. Regardless of the complexity of your database or your skill level, this systematic approach will lead you down the correct tuning path with no guessing, saving countless hours of tuning queries and optimizing performance of your SQL Server databases. Learning objectives: • Learn how to effectively use wait types to quickly identify bottlenecks and get clues on the best tuning approach • Quickly identify inefficient operations through review of query execution plans • Learn how
Speaker(s): Janis Griffin,
Abstract:
One of the biggest challenges to successful implementation of data encryption has been the back and forth between the application and the database. You have to overcome the obstacle of the application decrypting the data it needs. Microsoft tried to simplify this process when it introduced Always Encrypted (AE) into SQL Server 2016 and Azure SQL Database. In this demo intense session, you will learn about what Always Encrypted is, how it works, and the implications for your environment. By the end you will know how to now easily encrypt columns of data and just as importantly how to unencrypt. You will also learn about the current limitations of the feature and what your options are to work around them.
Speaker(s): Monica Rathbun,
Abstract:
SQL Server 2017 introduces new schema extensions that make working with certain types of data easier and potentially more efficient. These graph extensions make it possible to create graph structures consisting of nodes and edges inside the relational database. Graphs are commonly used to describe network topology, but they are also used to model certain other types of data, including hierarchical and complex many-to-many relationships. In this talk, you will receive a brief introduction to graph concepts and some use cases for modeling data as graphs. You will then learn how to apply the new SQL Server extensions to create node and edge type tables, as well as how to efficiently query these structures.
Speaker(s): Sven Aelterman,
Abstract:
Have you ever needed to learn a new database design and don't know where to begin? Or are trying to find out why a query doesn't perform well? Or need to provide security information to auditors or your security team? SQL Server has a number of metadata facilities available to help you with these tasks, and more. Functions, dynamic management views, and system stored procedures can illuminate details from the smallest column up through an entire SQL Server instance and everything in-between. We will demonstrate metadata techniques to help you: - Document your database schema objects such as procedures, functions, tables, columns and indexes - Investigate performance and look for bottlenecks - Discover metadata to administer your databases backups, index maintenance, and security - Apply your own metadata using extended properties We'll also demonstrate the new SQL Data Discovery/Classification and Vulnerability Assessment features in SQL Server Management Studio.
Speaker(s): Rob Volk,
Abstract:
What will happen when a Performance Tuner is analyzing statistics and using Power BI reports based on that analysis? A dynamic learning experience from a different perspective. The SQL Server optimizer uses distribution statistics when creating execution plans. Statistics are used to provide the optimizer with estimations for the best way to process the query and hopefully optimize performance. Power BI is a powerful tool that has been released in the last few years that helps you visualize your information to help make informative decisions with rich visualization. In this session, we will show you how SQL Server uses statistics to create the execution plan and Power BI to visualize that statistical distribution; with a TWIST. Roles will be reversed to show a dynamic and interactive learning experience helping users with two different concepts in one exciting session!
Speaker(s): William Wolf,
Abstract:
Design and development may be exciting, but database administration is absolutely critical (and, reasonably well-paying!) The care and feeding of a server tends to get short-changed or neglected. In this class, we'll cover the basics of the big five administrator tasks: * Backups – You must set up regular backups, to keep copies of your databases...just in case something breaks, or someone makes a bad, bad mistake. * Integrity checks – Regularly and automatically check databases for corruption, which is when bits get scrambled, lost, and ruined. * Index maintenance – Databases need regular upkeep so they'll continue to run well. * Disk management – It's actually your job to find out about full disks before they happen. After all, databases grow! * Alerting – Alerts tell you what's wrong, so you don't have to go looking for problems. Being a database administrator is a big job, but we can cover the basics in one session!
Speaker(s): Jennifer McCown,
Abstract:
Do you want to make your deployments risk free? Do you want to deliver business values to your customers faster? Do you want to increase the efficiency of your Team? Are your application and database deployment separate processes? Do you encounter issues while deploying your database changes? Do you want to automate your testing process? Is your database slowing you down? If the answer to any of the above questions is a Yes, then this presentation is for YOU. Come join me in this 60 min session to understand the problems with traditional database development, why organizations are moving towards achieving Continuous Integration and Database DevOps, the problems it tries to solve and learn about the toolsets which will assist you in this journey towards painless database deployments.
Speaker(s): Samir Behara,
Abstract:
What do you do when you have a performance or troubleshooting problem that you can’t figure out? One option is to open a support ticket with Microsoft Support (CSS). The CSS engineer will use a specific set of tools to collect and analyze workload data from your SQL Server. Based on this information they might recommend patches, configuration changes, or identify the worst-performing queries. But what if you could bypass support and do all of this analysis yourself? In this session, you'll learn how to use battle tested tools to analyze your workload and error logs. Armed with this information, you'll understand the root cause of the problem and propose solutions to performance and stability problems.
Speaker(s): Kerry Tyler,
Abstract:
Your job includes designing and writing stored procedures, but you haven’t had a lot of actual training on the subject, right? In a single day, we will show you how to write stored procedures from scratch, using the design advice we’ve accumulated in our combined 40 years of experience. Here are a few of the things you’ll learn: When and how to use stored procedures The benefits and basics of contractual programming How to write stored procedures from scratch How to structure and organize stored procedures Key techniques for ideal stored procedure management Troubleshooting and debugging stored procedures The session will be packed with tons of code examples, with plenty of labs to reinforce key concepts. Beginner and experienced T-SQL programmers both will walk away with a greater understanding of how to design, manage, and troubleshoot stored procedures. Join mefor one fun session of SQL Server programming!
Speaker(s): Sean McCown,
Abstract:
We will cover many security features in SQL Server 2016/2017 such as Row Level Security, Dynamic Data Masking, Always Encrypted, Advanced Threat Detection, and the Azure Security Center covering SQL Server. Row-Level Security enables customers to control access to rows based on the characteristics of the user executing a query. RLS enables you to implement restrictions on data row access. Dynamic Data Masking limits sensitive data exposure by masking it to non-privileged users. Always Encrypted is a feature designed to protect sensitive data stored in a SQL database. Always Encrypted allows clients to encrypt sensitive data inside client applications and never reveal the encryption keys to the Database Engine. We will cover the Azure Security Center and Advanced Threat Detection which can be used to provide a dashboard for viewing responding to security risks. The benefits of include configuration of SQL threat detection policy, email alerts, Azure Portal and Excel integration.
Speaker(s): David Pless,
Abstract:
I would like to share the 3 lessons I learned that helped me become a much better consultant. These lessons were crucial in helping me make that "mind shift" from thinking like a regular "9 to 5 DBA" to thinking like a consultant. The goal of this session is to help those who are interested in becoming a consultant. Hopefully these 3 lessons will help make that transition successful as it did for me.
Speaker(s): Mohammad Darab,
Abstract:
In this session, we'll cover the basics of Disaster Planning and key operational items to consider when establishing software systems. We'll cover terms and their importance as well as commonly used software and hardware techniques for disaster planning purposes.
Speaker(s): Michael Viron,
Abstract:
Want to know the position Master Data Management and MDS play in an organization's overall data strategy? We'll review the key concepts and the different roles and responsibilities to help you get your organization moving forward with MDM. We'll then take a look at the features of SQL Server 2016 MDS that make it an excellent tool for MDM. This demo-packed presentation will cover architecture and installation, different ways of processing data, hierarchies, security and many other features that will get you up and running with MDS.
Speaker(s): Neal Waterstreet,
Abstract:
During this session you will learn about SSAS Tabular concepts, how to create a new Tabular project in Visual Studio, design a simple model using Adventure Works sample database, build basic DAX calculations, explore the model using Excel, and how to deploy the project to an SSAS Server. Along the way, you will learn about best practices when creating Tabular models and post-deployment considerations.
Speaker(s): Shabnam Watson,
Abstract:
In this session you will be learn what Cosmos DB is and why it is the hottest thing in Azure. What does massively scalable, mullti-model, globally distributed, well-defined consistency models look like? Most important, who is going to be using it and why?
Speaker(s): Mike Lawell,
Abstract:
Come see us for a talk about SQL database administrator issues, and how Minion Enterprise can solve them! We'll cover time savings, security, auditing, enterprise alerting, centralized maintenance, disk space management, and more. Bring your questions and your lunch!
Speaker(s): Jennifer McCown,
Abstract:
Time and time again the same misunderstandings by developers and query writers appear when query performance issues arise. In this demo heavy presentation, we will review these specific topics such as data types, implicit conversions, sargability, and some others that all have an impact on query performance. Come join me and by the end of this session you will have the knowledge to boost your query performance!
Speaker(s): John Wells,
Abstract:
Are you new to Power BI? Do you want to learn what all the buzz is about and how to use it from a purely novice standpoint? Do you need to ramp up quickly to be able to build some great visualizations? This session is the session that you need! We will walk you through the basic architecture and nuances of Power BI all the while taking a fun adventure to building your first Power BI report. The attendee will leave the class ready to start using Power BI in the real world.
Speaker(s): Ed Watson,
Abstract:
Since the new cardinality estimator was released in SQL Server 2014, every version on SQL has introduced new great features design to help your queries run at max performance. In 2016, it was Query Store; in 2017, Adaptive Query Processing and Automatic Tuning have been introduced. In this session we will explore these new features and how they can make your life easier. We will also look at some of the pitfalls and potential issues that can arise from these new features.
Speaker(s): Lance Tidwell,
Abstract:
A common issue database administrators face is data auditing. Many use triggers, CDC, third-party tools, or roll their own type of auditing tool. In SQL Server 2016, a new feature called Temporal Tables was introduced and helps to simplify this common need. In this session, we will take a look at what temporal tables are, how they work and how you can implement them into your environment.
Speaker(s): John Morehouse,
Abstract:
Are you curious about Business Intelligence and how it drives the world around us? In this session, we'll cover high-level technical components of a BI system and the business processes that drive them. Whether you are new to IT in general or considering a career change, you'll come out of this session with a basic understanding of the BI world.
Speaker(s): Kerry Tyler,
Abstract:
Many of us have to deal with hardware that doesn’t meet our standards or contributes to performance problems. This session will cover how to work around hardware issues when it isn’t in the budget for newer, faster, stronger, better hardware. It’s time to make that existing hardware work for us. Learn tips and tricks on how to reduce IO, relieve memory pressure, and reduce blocking. Let’s see how compression, statistics, and indexes bring new life into your existing hardware.
Speaker(s): Monica Rathbun,
Abstract:
Database source control can be challenging and tricky to implement. This session will be a discussion on setting up a good foundation to implement source control. During this session we will go over getting buy-in for source control, managing database changes, and avoiding common pitfalls.
Speaker(s): Elizabeth Noble,
Abstract:
2016 SSIS packages can access data anywhere throughout the network, but normally run on the server they are deployed on. And if something terrible happens to that server, the manual setup of the SSISDB can be time consuming. With 2017, SSIS packages can be deployed once and run on several servers, even simultaneously. At this meetup, Paul LaGrone will teach you how to set up 2017 SSIS Scale Out packages so that your SSIS packages can now be in a Highly Available and Disaster Recovery environment.
Speaker(s): Paul LaGrone,
Abstract:
Why would you ever need to automatically monitor the SQL Servers in your care? What is the business value of doing so? What are the important features that a DBA should look for in a performance-monitoring tool? Rodney gives answers based on long experience and why tools like Redgate’s SQL Monitor are often the best option for implementing in your organization.
Speaker(s): Rodney Landrum,
Abstract:
Whether you are just starting a career, advancing into senior leadership, or trying to woo a potential client, soft skills can be your ticket to success. Often times we focus on showing how smart we are instead of showing what a good team member we can be. We will discuss the role and types of soft skills needed to showcase your X-factor. Need to hone your skills? We will explore innovative and fun ways in which to do just that!
Speaker(s): Angela Tidwell,
This is a list of speakers from the XML Guidebook records. The details and URLs were valid at the time of the event.
LinkedIn: https://www.linkedin.com/in/sqlrus
Contact: http://www.sqlrus.com
John Morehouse is currently a Consultant with Denny Cherry Associates living in Louisville, Kentucky. With over 2 decades of technical experience in various industries, John now focuses on the Microsoft Data platform and specializes in Microsoft SQL Server. He is honored to be a Microsoft Data Platform MVP, VMWare vExpert, Friend of Red Gate, Sentry One PAC member Community Ambassador, and 2016 Idera Ace. John has a passion around speaking, teaching technical topics, and giving back to the technical community as much as possible. He is a user group leader, SQL Saturday organizer, and former PASS regional mentor. He is also a blogger, avid tweeter, and a frequent speaker at SQL Saturday’s as well as other conferences.
LinkedIn: http://www.linkedin.com/in/angela-tidwell-28a11528
Contact: https://www.TidwellTidbits.com
Angela Tidwell is an experienced Data Professional with a love for Data Analytics, Data Science, Power BI, Python, SQL, etc. She is a dynamic and exciting speaker armed with a zest for life and quick wit; her background and unique views on the world provide the backdrop for a plethora of great stories. Utilizing her strong interpersonal skills and verbal/written communications, Angela supports SQL Saturdays across the country and blogs about her experiences in order to help other data professionals grow at TidwellTidbits.com.
LinkedIn: https://www.linkedin.com/in/williamjwolf
Contact: http://www.sqlwarewolf.com
Bill is the Manager of SQL Server Performance Tuning for RDX. He works with over 400 customers on solutions within the SQL Server environment and specialized in code tuning and mentoring the team within RDX. He has become a SQL Saturday veteran speaking at nearly 40 SQL Saturdays in the last 3 years. He has also spoken at Summit and is an Idera Ace class of 2018. Bill is active in the Pittsburgh SQL Server User Group. He is also the chapter lead for the DevOps Virtual User Group. He is passionate about educating users on SQL Server and mentoring others.
Paul is currently in his fourth year as the ETL Manager for a local CRM software firm. Paul's database work dates back to early database platforms like Dbase III and has worked with every version of SQL Server since SQL 7.0 was introduced. His certifications include MCSE, MCDBA, and MCT. Along with holding a DBA job for the City of Fort Worth, Texas, he also taught T-SQL Intro and Advanced classes to several departments and the North Texas GIS community. In 2006, he founded and ran the Greater Fort Worth SQL Server group for three years, which still continues today. While moving data and other SSIS tasks are Paul's responsibility now, he has also been a Production DBA, worked heavily in the GIS database co
LinkedIn: https://www.linkedin.com/in/kerrytyler
Contact: http://airbornegeek.com
Kerry Tyler is a SQL Server, Business Intelligence, and Azure consultant. His initial IT experience was in network engineering and Windows system administration before moving into the data realm. This infrastructure background builds a firm foundation for performance tuning and cloud infrastructure design and implementation. Kerry has full-time DBA experience in SQL Server since version 2000 and business intelligence architecture since SQL Server 2005. In addition to consulting work, he delivers presentations and training on SQL Server administration, business intelligence, and Azure data and infrastructure components.
LinkedIn: http://www.linkedin.com/in/watsoned
Contact: http://sqlgator.com
Ed Watson is a Principal Data Platform Consultant for Improving Enterprises, a full-stack Microsoft consulting firm in Atlanta. Ed is a Microsoft Data Platform MVP since 2014 and like most children, Ed was born at an early age. Today, Ed specializes in the Business Intelligence stack and enjoys specializing in Power BI immensely. He currently lives in Atlanta and is active with the Atlanta MDF and Atlanta BI user groups and is an organizer for SQL Saturday Atlanta, Atlanta BI, and Pensacola.
LinkedIn: https://www.linkedin.com/in/sqlespresso
Contact: http://www.sqlespresso.com
Monica Rathbun lives in Virginia, is a Microsoft MVP for Data Platform and Microsoft Certified Solutions Expert. She has nearly two decades of experience working with a wide variety of database platforms with a focus on SQL Server and the Microsoft Data Platform. She is a frequent speaker at IT industry conferences on topics including performance tuning and configuration management. She is the Leader of the Hampton Roads SQL Server User Group and a Mid‐Atlantic PASS Regional Mentor. She is passionate about SQL Server and the SQL Server community, doing anything she can to give back. Monica can always be found on Twitter (@sqlespresso) handing out helpful tips. You can find Monica blogging at sqlespresso.com
LinkedIn: https://www.linkedin.com/in/samir-behara-78953870
Contact: https://dotnetvibes.com/
Samir Behara is a Solution Architect with EBSCO Industries and builds software solutions using cutting edge technologies. He is a Microsoft Data Platform MVP with over 13 years of IT experience working on large-scale enterprise applications involving complex business functions, web integration, and data management in various domains like Insurance, Manufacturing and Publishing. Samir is a frequent speaker at conferences such as PASS Summit, IT/Dec Connections, CodeStock, SQL Saturdays and CodeCamps. He is the Co-Chapter Lead of the Steel City SQL Server UserGroup, Birmingham, AL. He is the author of www.dotnetvibes.com
LinkedIn: http://www.linkedin.com/in/nealwaterstreet
Contact: http://www.nealwaterstreet.com
Neal is a BI Architect/Consultant with more than 20 years of industry experience. Neal is skilled in the entire BI spectrum, including dimensional modeling, ETL design and development using Integration Services (SSIS), designing and developing multidimensional cubes and Tabular models using Analysis Services (SSAS) and Master Data Management using Microsoft Data Services (MDS). He's also involved with the database community and is the co-founder and co-leader of the PASS Healthcare Virtual Chapter and the Atlanta Modern Excel User Group.
LinkedIn: http://linkedin.com/in/tradney
Contact: http://www.timradney.com
Tim is a Data Platform MVP and has a whole collection of Microsoft and other industry certifications. His experience includes HA/DR, virtualization, SSIS, SSRS, and performance tuning, among everything else SQL Server-related. Tim is very active and passionate in the SQL Community. He runs the Columbus GA SQL Users Group, has been a PASS Regional Mentor for a number of years, was named a PASS Outstanding Volunteer in 2012, and is a frequent speaker at user groups, SQL Saturdays and PASS Summits. Tim is one of the top ranked in karma on ask.sqlservercentral.com, answers questions as @tradney on Twitter, and blogs at http://timradney.com and SQLskills blog at http://www.SQLskills.com/blogs/tim.
LinkedIn: https://linkd.in/svena
Contact: https://svenaelterman.wordpress.com
Sven Aelterman is the Director of IT for the Sorrell College of Business at Troy University; a role with a global scope. He is also a lecturer in Information Systems and teaches courses in data warehousing and information security. He continues consulting work through Adduxis, where he assists customers with various Microsoft technology implementations. Co-author of The Art of SQL Server FILESTREAM, published by Red Gate; and SQL Server 2017 Administration Inside Out, published by Microsoft Press. Cloud Software Architect at Sorrell Solutions, L.L.C. developing a Microsoft Azure-hosted Electronic Health Record system.
LinkedIn: http://www.linkedin.com/in/jennifermccown
Contact: http://www.MidnightDBA.com/Jen
Jen McCown is CEO of MinionWare, LLC; a Microsoft Certified Master for SQL Server; and an independent consultant. She is Senior Editor at MidnightDBA.com, where she creates training videos, the DBAs at Midnight webshow, blogs, reviews, and podcasts. Jen is a member, volunteer, and speaker in PASS, and the PASS Women in Technology Virtual Group.
LinkedIn: https://www.linkedin.com/in/sqlespresso
Contact: http://www.sqlespresso.com
Monica Rathbun lives in Virginia, is a Microsoft MVP for Data Platform and Microsoft Certified Solutions Expert. She has nearly two decades of experience working with a wide variety of database platforms with a focus on SQL Server and the Microsoft Data Platform. She is a frequent speaker at IT industry conferences on topics including performance tuning and configuration management. She is the Leader of the Hampton Roads SQL Server User Group and a Mid‐Atlantic PASS Regional Mentor. She is passionate about SQL Server and the SQL Server community, doing anything she can to give back. Monica can always be found on Twitter (@sqlespresso) handing out helpful tips. You can find Monica blogging at sqlespresso.com
LinkedIn: https://www.linkedin.com/in/elizabeth-a-noble
Elizabeth Noble is a Director of Database Development in the metro Atlanta area. When she was introduced to her first database over 10 years ago, it was love at first sight. Her passion is to help others improve the quality and speed of deploying database changes through automation. When she is not trying to automate all of the things, she can be found spending time with her dogs, playing disc golf, or taking a walk at the gym.
LinkedIn: http://www.linkedin.com/pub/janis-griffin/0/914/aba
Janis Griffin has over 30 years of DBA/database experience including design, development and implementation of many critical database applications. Before coming to Quest Software, Janis primarily worked in the Telecom/Network Industry, working with both real-time network routing databases and OLTP business to business applications. Janis also held positions as a Principal Architect and Senior Manager, mentoring other DBAs on best practices in database performance tuning.
Contact: http://www.midnightdba.com/dbarant
Sean McCown is a Certified Master with 23 years of experience in databases. He is also founder and co-owner of the MidnightDBA.com website, where he records free SQL Server training videos. He also writes the popular Minion Maintenance suite, the most configurable maintenance solution on the planet.
Contact: http://blogs.msdn.com/b/sql_pfe_blog/
For the past nine years, I have been a Technical Solution Professional with Microsoft. As a TSP I conduct full training workshops, conduct demo sessions, and perform architectural reviews on all supported builds of SQL Server. I mainly support the Southeast focusing on Florida, but I can be anywhere in the world. My core areas are Performance Tuning and Optimization, Azure, AlwaysOn, Reporting Services (SSRS), custom monitoring, building custom dashboards, and more.
Contact: http://lancetidwell.com
Lance Tidwell, from the Austin, TX, area, has worked as a SQL Server DBA for the last 11 years. During his time as a DBA he has found his passion for all things SQL, but specifically for performance tuning. He has a life-long quest to always be learning new things; currently this quest has lead him to explore more about the Data Analytics/ Data Science areas.
LinkedIn: https://www.linkedin.com/in/kerrytyler
Contact: http://airbornegeek.com
Kerry Tyler is a SQL Server, Business Intelligence, and Azure consultant. His initial IT experience was in network engineering and Windows system administration before moving into the data realm. This infrastructure background builds a firm foundation for performance tuning and cloud infrastructure design and implementation. Kerry has full-time DBA experience in SQL Server since version 2000 and business intelligence architecture since SQL Server 2005. In addition to consulting work, he delivers presentations and training on SQL Server administration, business intelligence, and Azure data and infrastructure components.
LinkedIn: https://www.linkedin.com/in/rob-volk-134ba81
Contact: http://weblogs.sqlteam.com/robv/
Rob Volk is a SQL Server DBA in the Metro Atlanta area since 2001. He also moderates and answers the forums on SQLTeam.com. While an old-time cranky DBA, he no longer considers quot;business intelligencequot; an oxymoron or quot;the cloudquot; as merely atmospheric moisture, and is delightedly dipping his toes into both of these new oceans, and loves to do things in new and and unusual ways.
 Her work focus within the Microsoft BI Stack has been on Analysis Services and Power BI. She is an active member of PASS community and has spoken at PASS Summit, SQL Saturdays, PASS Business Analytics and Women in Technology virtual chapters, and many other local user groups and conferences. She is one of the organizers of SQL Saturday Atlanta BI Edition. She holds a master's degree in computer science, a bachelor’s degree in Computer Engineering, and a Certified Business Intelligence Professional (CBIP) certification by The Data Warehouse Institute (TDWI).
LinkedIn: https://www.linkedin.com/in/john-wells-33367a59/
Contact: https://sqlrookieinthe318.wordpress.com/
I'm a DBA at Lamar Advertising in Baton Rouge. I'm a member of the Baton Rouge User Groups Board as well as a co-organizer for the ONLY SQLSaturday that serves Jambalaya for lunch! I started speaking in 2018 and enjoy everything about this powerful community! I enjoy performance tuning, helping developers with best practices and DBATools.
LinkedIn: https://www.linkedin.com/in/michaelviron
Michael Viron has a wide range of experience as a senior IT manager amp; business owner. As Director of IT amp; Software Engineering at KAMedData, Inc, he has been heavily involved in coordinating numerous product launches amp; both company amp; division startups. A key team member, his main responsibilities include technical operations, project management, security, short and long range technical planning, and development. As owner of General Education Online, he handles both IT and business operations.
Rodney Landrum has been architecting solutions for SQL Server for over 15 years. He has worked with and written about many SQL Server technologies, including DTS, Integration Services, Analysis Services, and Reporting Services. He has co-authored 4 books on Reporting Services. He has been a regular contributor to SQL Server magazine, sqlservercentral.com and Simple-talk.com. Rodney was also a Microsoft Data Platform MVP from 2008 through 2016.
LinkedIn: http://www.linkedin.com/in/jennifermccown
Contact: http://www.MidnightDBA.com/Jen
Jen McCown is CEO of MinionWare, LLC; a Microsoft Certified Master for SQL Server; and an independent consultant. She is Senior Editor at MidnightDBA.com, where she creates training videos, the DBAs at Midnight webshow, blogs, reviews, and podcasts. Jen is a member, volunteer, and speaker in PASS, and the PASS Women in Technology Virtual Group.
LinkedIn: https://www.linkedin.com/in/mikelawell
Contact: http://sqlserverassociates.com/Blog
Mike Lawell is an 19 year veteran of SQL Server, working with all versions since 6.5. He specializes in performance tuning and high availability as an independent consultant. He is a Linchpin People Teammate, he also consults with SolidQ, Intellinet and Microsoft Consulting Services. He is also a certified Scuba instructor with a long bucket list of dive sites. He resides in Atlanta, GA and you can catch him at many of the SQLSaturdays in the SE region of the United States.
LinkedIn: https://www.linkedin.com/in/mdarab/
Contact: https://mohammaddarab.com
Mohammad Darab is a Microsoft Data Professional, speaker and blogger with over 19 years of IT professional experience, 10+ years of that working with SQL Server. Some areas of his focus are the database engine, HA/DR, and security. He is currently an MCITP, MCP, as well as an IDERA ACE Class of 2019.
The following is a list of sponsors that helped fund the event.


The sixth expansion pack for the Sims 3, the first expansion developed entirely at EA Salt Lake. The expansion brought new careers, locations, and abilities to sims, mostly relating to show business.
This was the first expansion for the sims 3 made in Salt Lake City. The team was new to the making expansions, but had some fantastic ideas that carried over even today in the franchise.
Engineering QA
PC/Mac 2012
Sims 3
9 months
75+
Windows / OS X
Transitioning from troublesome but consistent 3DS hardware to the less consistent, and still troublesome PC platform was an enjoyable ride. This was my first foray into building a game for literally hundreds of system configurations, and it was a unique challenge. I was still a member of the engineering team after transitioning during the Pets 3DS project. I further became entrenched as liasion between QA and Engineering attending both daily stand ups and communicating between leads.
I ran tests on code before it entered the main dev line, often helping engineers tweak code on their own workstations and gave recommendations on fixes. I also was a main part of the ESRB, alpha, beta, and final submission and approval team in creating tests and checks.


Due by 23:59:59 pm on Wednesday, May 10, 2017
Overview
The overall objective of this assignment is to expose you to fold, fold, and more fold. And just when you think you’ve had enough, FOLD.
The assignment is in the file
that you need to download, edit and submit. As before, your task is to replace each expression of the form
failwith "to be written"
with the the appropriate OCaml code for each of those expressions.
Note: All the solutions can be done using the purely functional fragment of OCaml, using constructs covered in class, and most require the use of recursion. Solutions using imperative features such as references, while loops or library functions will receive no credit It is a good idea to start this assignment early; ML programming, while quite simple (when you know how), often seems somewhat foreign at first, particularly when it comes to recursion and list manipulation.
Assignment Testing and Evaluation
Your functions/programs must compile and run with ocaml
on ieng6.ucsd.edu
.
Most of the points, will be awarded automatically, by evaluating your functions against a given test suite. hw1.ml contains a very small suite of tests which gives you a flavor of of these tests.
At any point, on the bash shell, enter:
$ ocaml hw1.ml
or if you are in the Ocaml REPL enter:
# #use "hw1.ml" ;;
to get a report on how your code stacks up against the simple tests.
The last line of the shell must look like:
130>>Compiled
- : int * int = (SCORE, TOTAL)
where SCORE
and TOTAL
are a pair of integers, reflecting your score and the max possible score on the sample tests.
If instead an error message appears, your code will receive a zero.
If for some problem, you cannot get the code to compile, leave it as is with the failwith ...
with your partial solution enclosed below as a comment.
The other lines will give you a readout for each test. You are encouraged to try to understand the testing code, but you will not be graded on this.
Submission Instructions
To submit your homework (on ieng6
), enter:
$ turnin -c cs130s -p 03 hw3.ml
turnin
will provide you with a confirmation of the submission process; make sure that the size of the file indicated by turnin
matches the size of your file. See the ACS Web page on turnin for more information on the operation of the program.
Problem #1: Warm-Up
(a) 15 points
Fill in the skeleton given for sqsum
, which uses List.fold_left
to get an OCaml function
val sqsum : int list -> int
such that sqsum [x1;...;xn]
returns the integer x1^2 + ... + xn^2
Your task is to fill in the appropriate values for
- the folding function
f
and - the base case
base
.
Once you have implemented the function, you should get the following behavior at the OCaml prompt:
# sqsum [];;
- : int = 0
# sqsum [1;2;3;4];;
- : int = 30
# sqsum [(-1); (-2); (-3); (-4)];;
- : int = 30
(b) 30 points
Fill in the skeleton given for pipe
which uses List.fold_left
to get an OCaml function
val pipe : ('a -> 'a) list -> ('a -> 'a)
such that pipe [f1;...;fn]
(where f1,...,fn
are functions!) returns a function f
such that for any x
, we have f x
returns result fn(...(f2(f1 x)))
.
Again, your task is to fill in the appropriate values for
- the folding function
f
and - the base case
base
.
Once you have implemented the function, you should get the following behavior at the OCaml prompt:
# pipe [] 3;;
- : int = 3
# pipe [(fun x -> x+x); (fun x -> x + 3)] 3 ;;
- : int = 9
# pipe [(fun x -> x + 3);(fun x-> x + x)] 3;;
- : int = 12
(c) 20 points
Fill in the skeleton given for sepConcat
, which uses List.fold_left
to get an OCaml function
val sepConcat : string -> string list -> string
Intuitively, the expression sepConcat sep [s1;...;sn]
where sep
is a string to be used as a separator, and [s1;...;sn]
is a list of strings. sepConcat sep []
should return the empty string ""
. sepConcat sep [s]
should return just the string s
. Otherwise, if there are more than one string, in the list, then the output should be the string s1 ^ sep ^ s2 ^ ... ^ sep ^ sn
. You should only modify the parts of the skeleton consisting of failwith "to be implemented"
. You will need to define the function f
, and give values for base
and l
.
Once you have filled in these parts, you should get the following behavior at the OCaml prompt:
# sepConcat ", " ["foo";"bar";"baz"];;
- : string = "foo, bar, baz"
# sepConcat "---" [];;
- : string = ""
# sepConcat "" ["a";"b";"c";"d";"e"];;
- : string = "abcde"
# sepConcat "X" ["hello"];;
- : string = "hello"
(d) 10 points
Implement the curried OCaml function
val stringOfList : ('a -> string) -> 'a list -> string
such that stringOfList f [x1;...;xn]
should return the string "[" ^ (f x1) ^ "; " ^ ... ^ (f xn) ^ "]"
This function can be implemented on one line, without using any recursion by calling List.map
and sepConcat
with appropriate inputs. Once you have completed this function, you should get the following behavior at the OCaml prompt:
# stringOfList string_of_int [1;2;3;4;5;6];;
- : string = "[1; 2; 3; 4; 5; 6]"
# stringOfList (fun x -> x) ["foo"];;
- : string = "[foo]"
# stringOfList (stringOfList string_of_int) [[1;2;3];[4;5];[6];[]];;
- : string = "[[1; 2; 3]; [4; 5]; [6]; []]"
Problem #2: Big Numbers
The OCaml type int
only contains values upto a certain size. For example,
#<PHONE_NUMBER>9999999999999999999999999999999999999 ;;
Error: Integer literal exceeds the range of representable integers of type int
You will now implement functions to manipulate arbitrarily large numbers represented as lists of integers.
(a) 10 + 5 + 10 points
Write a curried function
val clone : 'a -> int -> 'a list
such that clone x n
returns a list of n
copies of the value x
. If the integer n
is 0
or negative, then clone
should return the empty list. Once you have implemented the function, you should get the following behavior at the OCaml prompt:
# clone 3 5;;
- : int list = [3; 3; 3; 3; 3]
# clone "foo" 2;;
- : string list = ["foo"; "foo"]
# clone clone (-3);;
- : ('_a -> int -> '_a list) list = []
Use clone
to write a curried function
val padZero : int list -> int list -> int list * int list
which takes two lists: [x1;...;xn]
[y1;...;ym]
and adds zeros in front of the shorter list to make the lists equal.
Your implementation should *not** be recursive.
Once you have implemented the function, you should get the following behavior at the OCaml prompt:
# padZero [9;9] [1;0;0;2];;
- : int list * int list = ([0;0;9;9],[1;0;0;2])
# padZero [1;0;0;2] [9;9];;
- : int list * int list = ([1;0;0;2],[0;0;9;9])
Next, write a function
val removeZero : int list -> int list
that takes a list and removes a prefix of leading zeros.
Once you have implemented the function, you should get the following behavior at the OCaml prompt:
# removeZero [0;0;0;1;0;0;2];;
- : int list = [1;0;0;2]
# removeZero [9;9];;
- : int list = [9;9]
# removeZero [0;0;0;0];;
- : int list = []
(b) 25 points
Let us use the list [d1;d2;...;dn]
, where each di
is between 0
and 9
, to represent the (positive) big-integer d1d2...dn
. For example, let [9;9;9;9;9;9;9;9;9;9]
represent the big-integer<PHONE_NUMBER>
. Fill out the implementation for
val bigAdd : int list -> int list -> int list
so that it takes two integer lists, where each integer is between 0
and 9
and returns the list corresponding to the addition of the two big-integers. Again, you have to fill in the implementation to supply the appropriate values to f
, base
, args
. Once you have implemented the function, you should get the following behavior at the OCaml prompt:
# bigAdd [9;9] [1;0;0;2];;
- : int list = [1;1;0;1]
# bigAdd [9;9;9;9] [9;9;9];;
- : int list = [1;0;9;9;8]
(c) 15 + 20 points
Next you will write functions to multiply two big integers. First write a function
val mulByDigit : int -> int list -> int list
which takes an integer digit and a big integer, and returns the big integer list which is the result of multiplying the big integer with the digit. Once you have implemented the function, you should get the following behavior at the OCaml prompt:
# mulByDigit 9 [9;9;9;9];;
- : int list = [8;9;9;9;1]
Now, using mulByDigit
, fill in the implementation of
val bigMul : int list -> int list -> int list
Again, you have to fill in implementations for f
, base
, args
only. Once you are done, you should get the following behavior at the prompt:
# bigMul [9;9;9;9] [9;9;9;9];;
- : int list = [9;9;9;8;0;0;0;1]
# bigMul [9;9;9;9;9] [9;9;9;9;9];;
- : int list = [9;9;9;9;8;0;0;0;0;1]


XANTHIAS. SHALL I crack any of those old jokes, master,
At which the audience never fail to laugh?
DIONYSUS.
XAN. Nothing else smart?
DIO. Aye, save my shoulder’s aching.
XAN. Come now, that comical joke?
DIO. With all my heart.
Only be careful not to shift your pole.
And— XAN. What? DIO. And vow that you’ve a belly-ache.
XAN. May I not say I’m overburdened so
That if none ease me, I must ease myself?
DIO. For mercy’s sake, not till I’m going to vomit.
XAN. What! must I bear these burdens, and not make
One of the jokes Ameipsias and Lycis
And Phrynichus, in every play they write,
Put in the mouths of all their burden-bearers?
DIO. Don’t make them; no! I tell you when I see
Their plays, and hear those jokes, I come away
More than a twelvemonth older than I went.
XAN. O, thrice unlucky neck of mine, which now
Is getting crushed, yet must not crack its joke!
DIO. Now is not this fine pampered insolence
When I myself, Dionysus, son of—Pipkin,
Toil on afoot, and let this fellow ride,
Taking no trouble, and no burden bearing?
XAN. What, don’t I bear? DIO. How can you when you’re riding?
XAN. Why, I bear these. DIO. How? XAN. Most unwillingly.
DIO. Does not the donkey bear the load you’re bearing?
XAN. Not what I bear myself: by Zeus, not he.
DIO. How can you bear, when you are borne yourself?
XAN. Don’t know: but anyhow my shoulder’s aching.
DIO. Then since you say the donkey helps you not,
You lift him up and carry him in turn.
XAN. O, hang it all! why didn’t I fight at sea?
You should have smarted bitterly for this.
DIO. Get down, you rascal; I’ve been trudging on
Till now I’ve reached the portal, where I’m going
First to turn in. Boy! Boy! I say there, Boy!
HERACLES. Who banged the door?  Mercy o’ me, what’s this?
DIO. Boy. XAN. Yes. DIO. Did you observe? XAN. What? DIO. How alarmed
He is. XAN. Aye, truly, lest you’ve lost your wits.
HER. O, by Demeter, I can’t choose but laugh.
Biting my lips won’t stop me. Ha! ha! ha!
DIO. Pray you, come hither, I have need of you.
HER. I vow I can’t help laughing, I can’t help it.
A lion’s hide upon a yellow silk,
A club and buskin! What’s it all about?
Where were you going? DIO. I was serving lately
Aboard the—Cleisthenes. HER. And fought? DIO. And sank
More than a dozen of the enemy’s ships.
HER. You two? DIO. We two. HER. And then I awoke, and lo!
DIO. There as, on deck, I’m reading to myself
The “Andromeda,” a sudden pang of longing
Shoots through my heart, you can’t conceive how keenly.
HER. How big a pang? DIO. A small one, Molon’s size.
HER. Caused by a woman? DIO. No. HER. A boy? DIO. No, no.
HER. A man? DIO. Ah! ah! HER. Was it for Cleisthenes?
DIO. Don’t mock me, brother; on my life I am
In a bad way: such fierce desire consumes me.
HER. Aye, little brother? how? DIO. I can’t describe it.
But yet I’ll tell you in a riddling way.
Have you e’er felt a sudden lust for soup?
HER. Soup! Zeus-a-mercy, yes, ten thousand times.
DIO. Is the thing clear, or must I speak again?
HER. Not of the soup: I’m clear about the soup.
DIO. Well, just that sort of pang devours my heart
For lost Euripides. HER. A dead man too.
DIO. And no one shall persuade me not to go
After the man. HER. Do you mean below, to Hades?
DIO. And lower still, if there’s a lower still.
HER. What on earth for? DIO. I want a genuine poet,
“For some are not, and those that are, are bad.”
HER. What! does not Iophon live? DIO. Well, he’s the sole
Good thing remaining, if even he is good.
For even of that I’m not exactly certain.
HER. If go you must, there’s Sophocles—he comes
Before Euripides—why not take him?
DIO. Not till I’ve tried if Iophon’s coin rings true
When he’s alone, apart from Sophocles.
Besides, Euripides, the crafty rogue,
Will find a thousand shifts to get away,
But he was easy here, is easy there.
HER. But Agathon, where is he? DIO. He has gone and left us.
A genial poet, by his friends much missed.
HER. Gone where? DIO. To join the blessed in their banquets.
HER. But what of Xenocles? DIO. O, he be hanged!
HER. Pythangelus? XAN. But never a word of me,
Not though my shoulder’s chafed so terribly.
HER. But have you not a shoal of little songsters,
Tragedians by the myriad, who can chatter
A furlong faster than Euripides?
DIO. Those be mere vintage-leavings, jabberers, choirs
Of swallow-broods, degraders of their art,
Who get one chorus, and are seen no more,
The Muses’ love once gained. But, O my friend,
Search where you will, you’ll never find a true
Creative genius, uttering startling things.
HER. Creative? how do you mean? DIO. I mean a man
Who’ll dare some novel venturesome conceit,
Air, Zeus’ chamber, or Time’s foot, or this:
’Twas not my mind that swore: my tongue committed
A little perjury on its own account.
HER. You like that style? DIO. Like it? I dote upon it.
HER.
DIO. Teach me to dine! XAN. But never a word of me.
DIO. But tell me truly—’twas for this I came
Dressed up to mimic you—what friends received
And entertained you when you went below
To bring back Cerberus, in case I need them.
And tell me too the havens, fountains, shops,
Roads, resting-places, stews, refreshment rooms,
Towns, lodgings, hostesses, with whom were found
The fewest bugs. XAN. But never a word of me.
HER. You are really game to go?
DIO. O, drop that, can’t you?
And tell me this: of all the roads you know,
Which is the quickest way to get to Hades?
I want one not too warm, nor yet too cold.
HER. Which shall I tell you first? which shall it be?
There’s one by rope and bench: you launch away
And—hang yourself. DIO. No, thank you: that’s too stifling.
HER. Then there’s a track, a short and beaten cut,
By pestle and mortar. DIO. Hemlock, do you mean?
HER. Just so. DIO. No, that’s too deathly cold a way;
You have hardly started ere your shins get numbed.
HER. Well, would you like a steep and swift descent?
DIO. Aye, that’s the style: my walking powers are small.
HER. Go down to the Cerameicus. DIO. And do what?
HER. Climb to the tower’s top pinnacle— DIO. And then?
HER. Observe the torch-race started, and when all
The multitude is shouting Let them go,
Let yourself go. DIO. Go whither? HER. To the ground.
DIO. O, that would break my brain’s two envelopes.
I’ll not try that. HER. Which will you try? DIO. The way
You went yourself. HER. A parlous voyage that,
For first you’ll come to an enormous lake
Of fathomless depth. DIO. And how and I to cross?
HER. An ancient mariner will row you over
In a wee boat, so big. The fare’s two obols.
DIO. Fie! The power two obols have, the whole world through!
How came they thither? HER. Theseus took them down.
And next you’ll see great snakes and savage monsters
In tens of thousands. DIO. You needn’t try to scare me,
I’m going to go. HER. Then weltering seas of filth
And ever-rippling dung: and plunged therein,
Whoso has wronged the stranger here on earth,
Or robbed his boylove of the promised pay,
Or swinged his mother, or profanely smitten
His father’s cheek, or sworn an oath forsworn,
Or copied out a speech of Morsimus.
DIO. There too, perdie, should he be plunged, whoe’er
Has danced the sword-dance of Cinesias.
HER. And next the breath of flutes will float around you,
And glorious sunshine, such as ours, you’ll see,
And myrtle groves, and happy bands who clap
Their hands in triumph, men and women too.
DIO. And who are they? HER. The happy mystic bands,
XAN. And I’m the donkey in the mystery show.
But I’ll not stand it, not one instant longer.
HER. Who’ll tell you everything you want to know.
You’ll find them dwelling close beside the road
You are going to travel, just at Pluto’s gate.
And fare thee well, my brother. DIO. And to you
Good cheer. (To Xan.)
XAN. Before I’ve put them down? DIO. And quickly too.
XAN. No, prithee, no; but hire a body, one
They’re carrying out, on purpose for the trip.
DIO. If I can’t find one? XAN. Then I’ll take them. DIO. Good.
And see! they are carrying out a body now.

CORPSE. What are they? DIO. These. CORP. Two drachmas for the job?
DIO. Nay, that’s too much. CORP. Out of the pathway, you!
DIO. Beshrew thee, stop: maybe we’ll strike a bargain.
CORP. Pay me two drachmas, or it’s no use talking.
DIO. One and a half. CORP. I’d liefer live again!
XAN.  He be hanged!
I’ll go myself. DIO. You’re the right sort, my man.
Now to the ferry. CHARON. Yoh, up! lay her to.
XAN. Whatever’s that? DIO. Why, that’s the lake, by Zeus,
Whereof he spake, and yon’s the ferry-boat.
XAN. Poseidon, yes, and that old fellow’s Charon.
DIO. Charon! O welcome, Charon! welcome, Charon!
CHAR. Who’s for the Rest from every pain and ill?
Who’s for the Lethe’s plain? the Donkey-shearings?
Who’s for Cerberia? Taenarum? or the Ravens?
DIO. I. CHAR. Hurry in. DIO. But where are you going really?
In truth to the Ravens? CHAR. Aye, for your behoof.
Step in. DIO. (To Xan.) Now, lad. CHAR. A slave? I take no slave,
Unless he has fought for his bodyrights at sea.
XAN. I couldn’t go. I’d got the eye-disease.
CHAR. Then fetch a circuit round about the lake.
XAN. Where must I wait? CHAR. Beside the Withering stone,
Hard by the Rest. DIO.  XAN. Too well.
O, what ill omen crossed me as I started!
CHAR. (To Dio.) Sit to the oar. (Calling.) Who else for the boat? Be quick.
(To Dio.) Hi! What are you doing? DIO. What am I doing? Sitting
On to the oar.
CHAR.  DIO. So?
CHAR. Now stretch your arms full length before you. DIO. So?
CHAR. Come, don’t keep fooling; plant your feet, and now
Pull with a will. DIO. Why, how am I to pull?
I’m not an oarsman, seaman, Salaminian.
I can’t! CHAR. You can. Just dip your oar in once,
You’ll hear the loveliest timing songs. DIO. What from?
CHAR. Frog-swans, most wonderful. DIO. Then give the word.
CHAR. Heave ahoy! heave ahoy!
FROGS. Brekekekex, ko-ax, ko-ax!
Brekekekex, ko-ax, ko-ax!
We children of the fountain and the lake,
Let us wake
Our full choir-shout, as the flutes are ringing out,
Our symphony of clear-voiced song.
The song we used to love, in the Marshland up above,
In praise of Dionysus to produce,
Of Nysaean Dionysus, son of Zeus,
When the revel-tipsy throng, all crapulous and gay,
To our precinct reeled along on the holy
Pitcher day.
Brekekekex, ko-ax, ko-ax.
DIO. O, dear! O, dear! now I declare
I’ve got a bump upon my rump.
FR. Brekekekex, ko-ax, ko-ax.
DIO.
There’s nothing but ko-ax with you.
FR. That is right, Mr. Busybody, right!
For the Muses of the lyre love us well;
And hornfoot Pan who plays on the pipe his jocund lays;
And Apollo, Harper bright, in our Chorus takes delight;
For the strong reed’s sake which I grow within my lake
To be girdled in his lyre’s deep shell.
Brekekekex, ko-ax, ko-ax.
DIO. My hands are blistered very sore;
My stern below is sweltering so,
’Twill soon, I know, upturn and roar
Brekekekex, ko-ax, ko-ax.
O tuneful race, O, pray give o’er,
O, sing no more. FR. Ah, no! ah, no!
Loud and louder our chant must flow.
Sing if ever ye sang of yore,
When in sunny and glorious days
Through the rushes and marsh-flags springing
On we swept, in the joy of singing
Myriad-diving roundelays.
Or when fleeing the storm, we went
Down to the depths, and our choral song
Wildly raised to a loud and long
Bubble-bursting accompaniment.
FR. and DIO. Brekekekex, ko-ax, ko-ax.
DIO. This timing song I take from you.
FR. That’s a dreadful thing to do.
DIO. Much more dreadful, if I row
Till I burst myself, I trow.
FR. and DIO. Brekekekex, ko-ax, ko-ax.
DIO. Go, hang yourselves; for what care I?
FR. All the same we’ll shout and cry,
Stretching all our throats with song,
Shouting, crying, all day long,
FR. and DIO. Brekekekex, ko-ax, ko-ax.
DIO. In this you’ll never, never win.
FR. This you shall not beat us in.
DIO. No, nor ye prevail o’er me.
Never! never! I’ll my song
Shout, if need be, all day long,
Until I’ve learned to master your ko-ax.
Brekekekex, ko-ax, ko-ax.
I thought I’d put a stop to your ko-ax.
CHAR. Stop! Easy! Take the oar and push her to.
Now pay your fare and go. DIO. Here ’tis: two obols.
Xanthias! where’s Xanthias? Is it Xanthias there?
XAN. Hoi, hoi! DIO. Come hither. XAN. Glad to meet you, master.
DIO. What have you there? XAN. Nothing but filth and darkness.
DIO. But tell me, did you see the parricides
And perjured folk he mentioned? XAN. Didn’t you?
DIO. Poseidon, yes. Why, look! (Pointing to the audience.) I see them now.
What’s the next step? XAN. We’d best be moving on.
This is the spot where Heracles declared
Those savage monsters dwell. DIO. O, hang the fellow!
That’s all his bluff: he thought to scare me off,
The jealous dog, knowing my plucky ways.
There’s no such swaggerer lives as Heracles.
Why, I’d like nothing better than to achieve
Some bold adventure, worthy of our trip.
XAN. I know you would. Hallo! I hear a noise.
DIO. Where? what? XAN. Behind us, there. DIO.
XAN. No, it’s in front. DIO.
XAN. And now I see the most ferocious monster.
DIO. O, what’s it like? XAN. Like everything by turns.
Now it’s a bull: now it’s a mule: and now
The loveliest girl. DIO. O, where? I’ll go and meet her.
XAN. It’s ceased to be a girl: it’s a dog now.
DIO. It is Empusa! XAN. Well, its face is all
Ablaze with fire. DIO. Has it a copper leg?
XAN. A copper leg? yes, one; and one of cow dung.
DIO. O, whither shall I flee? XAN. O, whither I?
DIO. My priest, protect me, and we’ll sup together.
XAN. King Heracles, we’re done for. DIO. O, forbear, Good fellow, call me anything but that.
XAN. Well, then, Dionysus. DIO. O, that’s worse again.
XAN. (To the Spectre.) Aye, go thy way. O master, here, come here.
DIO. O, what’s up now? XAN. Take courage; all’s serene.
And, like Hegelochus, we now may say,
“Out of the storm there comes a new fine wether.”
Empusa’s gone. DIO. Swear it. XAN. By Zeus she is.
DIO. Swear it again. XAN. By Zeus. DIO. Again. XAN. By Zeus.
O, dear, O, dear, how pale I grew to see her,
But he from fright has yellowed me all over.
DIO. Ah me, whence fall these evils on my head?
Who is the god to blame for my destruction?
Air, Zeus’ chamber, or the Foot of Time?
(A flute is played behind the scenes.)
DIO. Hist! XAN. What’s the matter? DIO. Didn’t you hear it?
XAN. What?
DIO. The breath of flutes. XAN. Aye, and a whiff of torches
Breathed o’er me too; a very mystic whiff.
DIO. Then crouch we down, and mark what’s going on.
CHORUS. (In the distance.) O Iacchus!
O Iacchus! O Iacchus!
XAN. O have it, master: ’tis those blessed Mystics,
Of whom he told us, sporting hereabouts.
They sing the Iacchus which Diagoras made.
DIO. I think so too: we had better both keep quiet
And so find out exactly what it is.
(The calling forth of Iacchus.)
CHOR. O Iacchus! power excelling, here in stately temples dwelling,
O Iacchus! O Iacchus!
Come to tread this verdant level,
Come to dance in mystic revel,
Come whilst round thy forehead hurtles
Many a wreath of fruitful myrtles,
Come with wild and saucy paces
Mingling in our joyous dance,
Pure and holy, which embraces all the charms of all the Graces,
When the mystic choirs advance.
XAN. Holy and sacred queen, Demeter’s daughter,
O, what a jolly whiff of pork breathed o’er me!
DIO. Hist! and perchance you’ll get some tripe yourself.
(The welcome to Iacchus.)
CHOR. Come, arise, from sleep awaking, come the fiery torches shaking,
O Iacchus! O Iacchus!
Morning Star that shinest nightly.
Lo, the mead is blazing brightly,
Age forgets its years and sadness,
Agèd knees curvet for gladness,
Lift thy flashing torches o’er us,
Marshal all thy blameless train,
Lead, O, lead the way before us; lead the lovely youthful Chorus
To the marshy flowery plain.


I'm a novice web developer with aspirations to become a full-time engineer. I've spent my time working with and learning HTML, CSS, and JavaScript. My current goal for the year is to build my own website.
Here's what I've learned thus far
Please find me at Lindedin


Cryptopals Challenges
Table of Contents
1 Set 1
1.1 Convert hex to base64
(cp:bytes->base64 (cp:hex->bytes "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"))
"SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t"
1.2 Fixed XOR
(cp:bytes->hex (cp:fixed-xor (cp:hex->bytes "1c0111001f010100061a024b53535009181c") (cp:hex->bytes "686974207468652062756c6c277320657965")))
"746865206B696420646F6E277420706C6179"
1.3 Single-byte XOR cipher
(car (cp:break-single-byte-xor (cp:hex->bytes "1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736")))
(:SCORE 44.4112472277668d0 :KEY 88 :STRING "Cooking MC's like a pound of bacon")
To score English text, I used a Chi-squared test. I had to play with the
frequencies a fair amount – just using a-z was not giving great results. The
most important thing I did was to add a penalty for uncommon characters. Common
punctuation is ignored, but uncommon punctuation is penalized (see the #\Nul
frequency below).
cp:*frequencies*
((#\a . 0.0651738d0) (#\b . 0.0124248d0) (#\c . 0.0217339d0) (#\d . 0.0349835d0) (#\e . 0.1041442d0) (#\f . 0.0197881d0) (#\g . 0.015861d0) (#\h . 0.0492888d0) (#\i . 0.0558094d0) (#\j . 9.033d-4) (#\k . 0.0050529d0) (#\l . 0.033149d0) (#\m . 0.0202124d0) (#\n . 0.0564513d0) (#\o . 0.0596302d0) (#\p . 0.0137645d0) (#\q . 8.606d-4) (#\r . 0.0497563d0) (#\s . 0.051576d0) (#\t . 0.0729357d0) (#\u . 0.0225134d0) (#\v . 0.0082903d0) (#\w . 0.0171272d0) (#\x . 0.0013692d0) (#\y . 0.0145984d0) (#\z . 7.836d-4) (#\ . 0.1918182d0) (#\Nul . 0.001d0))
1.4 Detect single-character XOR
(flet ((top-score (hex) (first (cp:break-single-byte-xor (cp:hex->bytes hex))))) (let ((scores (with-open-file (in "4.txt") (loop for l = (read-line in nil) while l collect (nconc (list :line l) (top-score l)))))) (car (sort scores #'< :key (lambda (x) (getf x :score))))))
(:LINE "7b5a4215415d544115415d5015455447414c155c46155f4058455c5b523f" :SCORE 51.34496174418811d0 :KEY 53 :STRING "Now that the party is jumping ")
1.5 Implement repeating-key XOR
(cp:bytes->hex (cp:repeating-xor (cp:ascii->bytes "ICE") (cp:ascii->bytes "Burning 'em, if you ain't quick and nimble I go crazy when I hear a cymbal")))
"0B3637272A2B2E63622C2E69692A23693A2A3C6324202D623D63343C2A26226324272765272A282B2F20430A652E2C652A3124333A653E2B2027630C692B20283165286326302E27282F"
1.6 Break repeating-key XOR
Test our hamming distance calculation:
(cp:hamming-distance (cp:ascii->bytes "this is a test") (cp:ascii->bytes "wokka wokka!!!"))
37
Now, attempt to find the key size of the XOR'd challenge text. My
FIND-XOR-KEYSIZE
implementation averages BLOCK-COUNT
blocks. Looking at the
output, it converges on a key size of 29 bytes, which is what we'll use to try
and break the cipher.
(loop with bytes = (cp:read-base64-file "6.txt") for i from 1 to 20 collect (cp:find-xor-keysize bytes :block-count i))
(5 5 5 5 5 5 5 29 29 29 29 29 29 29 29 29 29 29 29 29)
And now try to actually break repeating XOR.
(let ((bytes (cp:read-base64-file "6.txt"))) (cp:bytes->ascii (cp:break-repeating-xor (cp:find-xor-keysize bytes) bytes)))
"I'm back and I'm ringin' the bell A rockin' on the mike while the fly girls yell In ecstasy in the back of me Well that's my DJ Deshay cuttin' all them Z's Hittin' hard and the girlies goin' crazy Vanilla's on the mike, man I'm not lazy. I'm lettin' my drug kick in It controls my mouth and I begin To just let it flow, let my concepts go My posse's to the side yellin', Go Vanilla Go! Smooth 'cause that's the way I will be And if you don't give a damn, then Why you starin' at me So get off 'cause I control the stage There's no dissin' allowed I'm in my own phase The girlies sa y they love me and that is ok And I can dance better than any kid n' play Stage 2 -- Yea the one ya' wanna listen to It's off my head so let the beat play through So I can funk it up and make it sound good 1-2-3 Yo -- Knock on some wood For good luck, I like my rhymes atrocious Supercalafragilisticexpialidocious I'm an effect and that you can bet I can take a fly girl and make her wet. I'm like Samson -- Samson to Delilah There's no denyin', You can try to hang But you'll keep tryin' to get my style Over and over, practice makes perfect But not if you're a loafer.  Come on and say it! VIP.  Steppin' so hard like a German Nazi Startled by the bases hittin' ground There's no trippin' on mine, I'm just gettin' down Sparkamatic, I'm hangin' tight like a fanatic You trapped me once and I thought that You might have it So step down and lend me your ear '89 in my time! You, '90 is my year.   I'm lettin' my drug kick in It controls my mouth and I begin To just let it flow, let my concepts go My posse's to the side yellin', Go Vanilla Go! Smooth 'cause that's the way I will be And if you don't give a damn, then Why you starin' at me So get off 'cause I control the stage There's no dissin' allowed I'm in my own phase The girlies sa y they love me and that is ok And I can dance better than any kid n' play Stage 2 -- Yea the one ya' wanna listen to It's off my head so let the beat play through So I can funk it up and make it sound good 1-2-3 Yo -- Knock on some wood For good luck, I like my rhymes atrocious Supercalafragilisticexpialidocious I'm an effect and that you can bet I can take a fly girl and make her wet. I'm like Samson -- Samson to Delilah There's no denyin', You can try to hang But you'll keep tryin' to get my style Over and over, practice makes perfect But not if you're a loafer.  Come on and say it! VIP.  Steppin' so hard like a German Nazi Startled by the bases hittin' ground There's no trippin' on mine, I'm just gettin' down Sparkamatic, I'm hangin' tight like a fanatic You trapped me once and I thought that You might have it So step down and lend me your ear '89 in my time! You, '90 is my year.
It returns the number of equal blocks if ECB is detected, or NIL
otherwise.
(let ((lines (cp:read-hex-line-file "8.txt"))) (remove-if #'null (mapcar (lambda (line) (cons (cp:detect-aes-128-ecb line) (cp:bytes->hex line))) lines) :key #'car))
((6 . "D880619740A8A19B7840A8A31C810A3D08649AF70DC06F4FD5D2D69C744CD283E2DD052F6B641DBF9D11B0348542BB5708649AF70DC06F4FD5D2D69C744CD2839475C9DFDBC1D46597949D9C7E82BF5A08649AF70DC06F4FD5D2D69C744CD28397A93EAB8D6AECD566489154789A6B0308649AF70DC06F4FD5D2D69C744CD283D403180C98C8F6DB1F2A3F9C4040DEB0AB51B29933F2C123C58386B06FBA186A"))
2 Set 2
2.1 Implement PKCS#7 padding
(cp:pad-pkcs7 (cp:ascii->bytes "YELLOW SUBMARINE") :block-size 20)
#(89 69 76 76 79 87 32 83 85 66 77 65 82 73 78 69 4 4 4 4)
2.2 Implement CBC mode
(cp:bytes->ascii (cp:unpad-pkcs7 (cp:decrypt-aes-128-cbc (cp:ascii->bytes "YELLOW SUBMARINE") (make-array 16 :initial-element 0) (cp:read-base64-file "10.txt"))))
"I'm back and I'm ringin' the bell A rockin' on the mike while the fly girls yell In ecstasy in the back of me Well that's my DJ Deshay cuttin' all them Z's Hittin' hard and the girlies goin' crazy Vanilla's on the mike, man I'm not lazy. I'm lettin' my drug kick in It controls my mouth and I begin To just let it flow, let my concepts go My posse's to the side yellin', Go Vanilla Go! Smooth 'cause that's the way I will be And if you don't give a damn, then Why you starin' at me So get off 'cause I control the stage There's no dissin' allowed I'm in my own phase The girlies sa y they love me and that is ok And I can dance better than any kid n' play Stage 2 -- Yea the one ya' wanna listen to It's off my head so let the beat play through So I can funk it up and make it sound good 1-2-3 Yo -- Knock on some wood For good luck, I like my rhymes atrocious Supercalafragilisticexpialidocious I'm an effect and that you can bet I can take a fly girl and make her wet. I'm like Samson -- Samson to Delilah There's no denyin', You can try to hang But you'll keep tryin' to get my style Over and over, practice makes perfect But not if you're a loafer.  Come on and say it! VIP.  Steppin' so hard like a German Nazi Startled by the bases hittin' ground There's no trippin' on mine, I'm just gettin' down Sparkamatic, I'm hangin' tight like a fanatic You trapped me once and I thought that You might have it So step down and lend me your ear '89 in my time! You, '90 is my year.   My oracle
returns multiple values – the encrypted output, and T
for ECB or
NIL
for CBC. Run the ECB detector on the oracle output, and ensure
we correctly detected the ECB encryptions.
(let* ((input (make-array (* 16 4) :initial-element (char-code #\A))) (runs (loop repeat 10 collect (multiple-value-list (cp:encryption-oracle input)))) (results (mapcar (lambda (r) (cons (second r) (cp:detect-aes-128-ecb (first r)))) runs))) (values results (every (lambda (r) (or (and (car r) (cdr r)) (not (or (car r) (cdr r))))) results)))
((T . 3) (T . 3) (NIL) (NIL) (NIL) (NIL) (T . 3) (T . 3) (NIL) (T . 3)) T
2.4 Byte-at-a-time ECB decryption (Simple)
2.4.1 Detect the block size
(cp:with-oracle (oracle) (loop for i from 1 to 64 for encrypted = (oracle (make-array (* i 2) :initial-element 97)) for blocks = (cp:blockify encrypted :block-size i) until (equalp (first blocks) (second blocks)) finally (return i)))
16
2.4.2 Detect that the function is using ECB
(cp:with-oracle (oracle) (cp:detect-aes-128-ecb (oracle (make-array (* 16 2) :initial-element 97))))
1
2.4.3 Use oracle to break ECB
(let ((unknown (cp:base64->bytes "Um9sbGluJyBpbiBteSA1L jAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkgaGFpciBjYW4gYmxvd wpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBqdXN0IHRvIHNhe SBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUgYnkK"))) (cp:with-oracle (oracle unknown) (cp:bytes->ascii (cp:break-aes-ecb-with-oracle #'oracle))))
"Rollin' in my 5.0 With my rag-top down so my hair can blow The girlies on standby waving just to say hi Did you stop? No, I just drove by "
2.5 ECB cut-and-paste
2.5.1 Write a k=v parsing routine
(cp:parse-cookie "foo=bar&baz=qux&zap=zazzle")
(("foo" . "bar") ("baz" . "qux") ("zap" . "zazzle"))
2.5.2 Write a function that encodes a user profile
(let ((user-profiler (cp:make-profiler "user"))) (list (cp:profile-for user-profiler "alice") (cp:profile-for user-profiler "bob") (cp:profile-for user-profiler "eve")))
("email=alice&uid=0&role=user" "email=bob&uid=1&role=user" "email=eve&uid=2&role=user")
2.5.3 Carry out a cut-paste attack
MAKE-ENCRYPTED-USER-PROFILER
is just an AES ECB wrapper around
MAKE-PROFILER
. Use carefully crafted email addresses to get blocks
that can be combined to create an admin profile.
(let* ((secret (cp:gen-random 16)) (profiler (cp:make-encrypted-user-profiler secret 10)) ;; Bogus email address so that the second block starts ;; with "admin": "admin&uid=10&rol" (admin (funcall profiler "aaaaaaaaaaadmin")) ;; Use a valid thirteen character email address so that ;; the second block ends with "role=" (profile (funcall profiler "attak@jdtw.us")) ;; We need a third block to cut-paste from to get the ;; right pkcs7 padding (padding (funcall profiler "aaaaaaaaa"))) ;; Now mix and match... (setf (nth-block 2 profile) (nth-block 1 admin) profile (concat-bytes profile (nth-block 2 padding))) (cp:decrypt-and-parse-profile secret profile))
(("email"<EMAIL_ADDRESS>("uid" . "11") ("role" . "admin") ("uid" . "10") ("rol" . ""))
Verify that our parser thinks the profile is an admin.
(cp:profile-role '(("email"<EMAIL_ADDRESS>("uid" . "11") ("role" . "admin") ("uid" . "10") ("rol" . "")))
"admin"
2.6 Byte-at-a-time ECB decryption (Harder)
I modified my original oracle code and added "prefix" versions. The first task
is to find the length of the random prefix, which is what FIND-PREFIX-LENGTH
does.
(loop for i below 256 do (cp:with-oracle (oracle nil (gen-random i)) (let ((len (cp:find-prefix-length #'oracle))) (assert (= i len)))))
NIL
And once the prefix-length is known, it's just a matter of updating offsets appropriately. Here we are decrypting the text, using a prefix of a random length:
(let ((unknown (cp:base64->bytes "Um9sbGluJyBpbiBteSA1L jAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkgaGFpciBjYW4gYmxvd wpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBqdXN0IHRvIHNhe SBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUgYnkK")) (prefix (cp:gen-random (random 255)))) (cp:with-oracle (oracle unknown prefix) (cp:bytes->ascii (cp:break-aes-ecb-with-prefix-oracle #'oracle))))
"Rollin' in my 5.0 With my rag-top down so my hair can blow The girlies on standby waving just to say hi Did you stop? No, I just drove by "
2.7 PKCS#7 padding validation
(cp:bytes->ascii (cp:unpad-pkcs7 (concatenate '(vector (unsigned-byte 8) *) (cp:ascii->bytes "ICE ICE BABY") #(4 4 4 4))))
"ICE ICE BABY"
(handler-case (cp:unpad-pkcs7 (concatenate '(vector (unsigned-byte 8) *) (cp:ascii->bytes "ICE ICE BABY") #(5 5 5 5))) (cp:invalid-padding-error () :invalid-padding))
:INVALID-PADDING
(handler-case (cp:unpad-pkcs7 (concatenate '(vector (unsigned-byte 8) *) (cp:ascii->bytes "ICE ICE BABY") #(1 2 3 4))) (cp:invalid-padding-error () :invalid-padding))
:INVALID-PADDING
2.8 CBC bitflipping attacks
The intuition here is that the prior ciphertext block gets XOR'd with the output
of the AES s-box. That means, to get the required character, we need to XOR the
right ciphertext byte with the known-plaintext byte and the desired byte. That
is what the function CBC-FLIP
does in the code below.
(let* ((secret (cp:gen-random 16)) (iv (cp:gen-random 16)) (user-data "aaaaaaaaaaaaaaaaaaaaaaadminatrue") (encrypted (cp:encrypt-user-data secret iv user-data))) ;; Flip the 'a' before "admin" to ';' and the 'a' before ;; "true" to '='. Hard code the indices, because I'm lazy. (cp:cbc-flip encrypted 37 #\a #\;) (cp:cbc-flip encrypted 43 #\a #\=) (cp:data-lookup "admin" (cp:decrypt-and-parse-data secret iv encrypted)))
"true"


Malaria is a disease caused by a parasite. The parasite is spread to humans through the bites of infected female anophlese mosquitoes. People who have malaria usually feel very sick with a high fever and shaking chills.While the disease is uncommon in temperate climates, malaria is still common in tropical and subtropical countries. Each year nearly 290 million people are infected with malaria, and more than 400,000 people die of the disease.
Signs and symptoms of malaria may include:
1. Fever
2. Chills
3. General feeling of discomfort
4. Headache
5. Nausea and vomiting
6. Diarrhea
7. Abdominal pain
8. Muscle or joint pain
9. Fatigue
10. Rapid breathing
11. Rapid heart rate
12. Cough
treatment of malaria is by taking of quinine drugs. it is also advisable to sleep under a treated net since prevention is better than cure


Memo: Daily savings deposit. (Payment ID: APB86e930ca6)
Transaction ID: CW6a21d9c
Date: Saturday 14th of October 2017 05:22:02 PM
Memo: Daily savings deposit. (Payment ID: APB86e930ca6)
Transaction ID: CW6a21d9c
Date: Saturday 14th of October 2017 05:22:02 PM
Memo: Daily savings deposit. (Payment ID: APB86e930ca6)
Transaction ID: CW6a21d9c
Date: Saturday 14th of October 2017 05:22:02 PM
Memo: Daily savings deposit. (Payment ID: APB86e930ca6)
Transaction ID: CW6a21d9c
Date: Saturday 14th of October 2017 05:22:02 PM
Memo: Daily savings deposit. (Payment ID: APB86e930ca6)
Transaction ID: CW6a21d9c
Date: Saturday 14th of October 2017 05:22:02 PM


Book details
Title: {{ (bookState | async).books[id].title }}
Year: {{ (bookState | async).books[id].year }}
Author:
{{
(authorState | async).authors[
(bookState | async).books[id].authorId - 1
].name
}}
Publisher: {{ (bookState | async).books[id].publisher }}


Simple Table:
| First | Second |
|---|---|
| Cool | Shit |
Without header:
| Cool | Shit |
| is this | really |
With some alignment:
| Cool | Shit | in | here |
And now to some colspan:
| Names | ||
|---|---|---|
| Name | Firstname | Age |
| Fox | Peter | 42 |
| Guy | Ritchie | ca. 60 |
Multimarkdown example:
| Grouping | ||
|---|---|---|
| First Header | Second Header | Third Header |
| Content | Long Cell | |
| Content | Cell | Cell |
| New section | More | Data |
| And more | And more |


The table view presents the attributes for all the nodes and transactions in the graph.
The highlighted rows in the table represent the selected elements in the graph. The check box
in the 'selected' column is also checked when an element is selected in the graph.
Selection of the table rows (including the use of the shift and control buttons) will result in
the selection of the table rows and the associated elements in the graph itself. Conversely, changes
in the selection set of the graph are reflected in the table.
The table displays the attributes for all selected and unselected nodes and transactions.
: View the node attributes
: View the transaction attributes
The set of columns displayed in the table can be modified by selecting the button .
The table rows can be sorting by selecting any of the column headers.
There are multiple ways to copy data from the Table. All copy operations will produce a comma separated output. The data is only copied to the clipboard.
This operation copies all column and all rows within the table. The order of the column values is the same as how it is listed on the table. This operation can be slow with a large graph.
This operation copies all column and selected rows within the table. The order of the column values is the same as how it is listed on the table.
This operation provides the user the option to select specific column(s) and specific rows. The order is alphabetical by default.
Column names that are listed on the right will be copied. The column list on the right can be reordered to determine the order of the output. Use the up and down arrows on the right to reorder the colum names. The "Copy selected row(s) only" check box allows user to choose whether they would like to copy all rows or just the rows that are currently selected.


A major feature added to Mimkatz in August 2015 is “DCSync” which effectively “impersonates” a Domain Controller and requests account password data from the targeted Domain Controller. DCSync was written by Benjamin Delpy and Vincent Le Toux. As of Mimikatz version 2.1 alpha 20160501, DCSync works with renamed domains.
The exploit method prior to DCSync was to run Mimikatz or Invoke-Mimikatz on a Domain Controller to get the KRBTGT password hash to create Golden Tickets. With Mimikatz’s DCSync and the appropriate rights, the attacker can pull the password hash, as well as previous password hashes, from a Domain Controller over the network without requiring interactive logon or copying off the Active Directory database file (ntds.dit).
Special rights are required to run DCSync. Any member of Administrators, Domain Admins, or Enterprise Admins as well as Domain Controller computer accounts are able to run DCSync to pull password data. Note that Read-Only Domain Controllers are not only allowed to pull password data for users by default.
How DCSync works:
I have previously done some packet captures for Domain Controller replication and identified the intra-DC communication flow regarding how Domain Controllers replicate.
The Samba Wiki describes the DSGetNCChanges function:
“The client DC sends a DSGetNCChanges request to the server when the first one wants to get AD objects updates from the second one. The response contains a set of updates that the client has to apply to its NC replica. …
When a DC receives a DSReplicaSync Request, then for each DC that it replicates from (stored in RepsFrom data structure) it performs a replication cycle where it behaves like a client and makes DSGetNCChanges requests to that DC. So it gets up-to-date AD objects from each of the DC’s which it replicates from.”
DCSync Options:
- /all – DCSync pull data for the entire domain.
- /user – user id or SID of the user you want to pull the data for.
- /domain (optional) – FQDN of the Active Directory domain. Mimikatz will discover a DC in the domain to connect to. If this parameter is not provided, Mimikatz defaults to the current domain.
- /csv – export to csv
- /dc (optional) – Specify the Domain Controller you want DCSync to connect to and gather data.
There’s also a /guid parameter.
DCSync Command Examples:
Pull password data for the KRBTGT user account in the rd.adsecurity.org domain:
Mimikatz “lsadump::dcsync /domain:rd.adsecurity.org /user:krbtgt” exit
Pull password data for the Administrator user account in the rd.adsecurity.org domain:
Mimikatz “lsadump::dcsync /domain:rd.adsecurity.org /user:Administrator” exit
Pull password data for the ADSDC03 Domain Controller computer account in the lab.adsecurity.org domain:
Mimikatz “lsadump::dcsync /domain:lab.adsecurity.org /user:adsdc03$” exit
If the account is enabled for “reversible encryption”, the clear-text password shown.


dynaglue is an opinionated JavaScript library that makes single-table designs in DynamoDB easier to query and update.
npm install dynaglue
Querying and storing data in single-table DynamoDB designs is hard. Keeping indexes up-to-date and constructing DynamoDB queries and update expressions is time-consuming and error-prone.
dynaglue takes the hassle out of managing your data with a straightforward way to declare its mapping onto your table's indexes, and wraps it all up with simple and foolproof Mongo-like API.
See Motivation (below) for a more detailed explanation.
A comprehensive Getting Started Guide is available explaining how to install and use dynaglue in a new project as well as all its current features.
See the examples directory for a more concise overview of its features in action.
Reference Documentation, generated from the source code, also contains useful information about the operations and types you need to use dynaglue.
This project is currently in progress (alpha). Its API may change during this period, so take care and keep an eye on updates for now.
It's quite feature complete, barring some specific items (like batch read/write, transacions, projection expressions, capacity numbers).
Please try it out, report bugs, suggest improvements or submit a PR.
// Declare the layout of your table (its primary and secondary indexes and their key names)
const layout = {
tableName: 'my-table',
primaryKey: { partitionKey: 'id', sortKey: 'collection' },
findKeys: [
// 2 GSIs => up to 2 extra access patterns per collection
{ indexName: 'gs2', partitionKey: 'gs2p', sortKey: 'gs2s' },
{ indexName: 'gs3', partitionKey: 'gs3p', sortKey: 'gs3s' },
],
};
// Declare a collection for each data type (like a Mongo collection)
const usersCollection = {
name: 'users',
layout,
// access patterns that are mapped to indexes in the table layout
accessPatterns: [
// 1. Find users by their email address on GSI2
{ indexName: 'gs2', partitionKeys: [], sortKeys: [['email']] },
// 2. Find users by their team (and optionally, employee code)
{ indexName: 'gs3', partitionKeys: [['team', 'id']], sortKeys: [['team', 'employeeCode']] },
],
};
const ddb = new AWS.DynamoDB();
const ctx = createContext(ddb, [usersCollection]);
// Insert users into collection (auto-generated IDs)
const user1 = await insert(ctx, 'users', {
name: 'Anayah Dyer',
email<EMAIL_ADDRESS>team: { id: 'team-code-1', employeeCode: 'AC-1' },
});
const user2 = await insert(ctx, 'users', {
name: 'Ruairidh Hughes',
email<EMAIL_ADDRESS>team: { id: 'team-code-1', employeeCode: 'AC-2' },
});
const user3 = await insert(ctx, 'users', {
name: 'Giles Major',
email<EMAIL_ADDRESS>team: { id: 'team-code-2', employeeCode: 'GT-5' },
});
const user4 = await insert(ctx, 'users', {
name: 'Lance Alles',
email<EMAIL_ADDRESS>team: { id: 'team-code-2', employeeCode: 'GT-6' },
});
// Find a user by ID (uses primary index)
const foundUser = await findById(ctx, 'users', user2._id);
// => { _id: '...', name: 'Ruairidh Hughes', ... }
// Find a user by email (access pattern 1)
const userByEmail = await find(ctx, 'users', { email<EMAIL_ADDRESS>});
// => [{ _id: '...', name: 'Anayah Dyer', ... }]
// Find all users in a team (access pattern 2)
const usersInTeam2 = await find(ctx, 'users', { 'team.id': 'team-code-2' });
// => [{ _id: '...', name: 'Giles Major', ... }, { _id: '...', name: 'Lance Alles', ... }]
// Find user by teamId and employeeCode (access pattern 2)
const specificUser = await find(ctx, 'users', { 'team.id': 'team-code-1', employeeCode: 'AC-2' });
// => [{ _id: '...', name: 'Ruairidh Hughes', ... }]
// Update an item
const updatedItem = await updateById(ctx, 'users', user4._id, {
'team.employeeCode': 'GT-10',
'name': 'James Alles',
});
This library assumes you have a good understanding of DynamoDB partition and sort keys, primary and secondary indexes, and assumes you understand how single-table designs work in theory.
If you're unsure what any of this means, first learn how to build applications using DynamoDB:
more advanced DynamoDB modelling:
and on the merits of single table vs multi table design (this library is mostly agnostic):
You can see what it is doing to DynamoDB by running your code with the environment variable:
export DEBUG=dynaglue:*
which will print out the queries it executes.
I've learnt that in order to leverage DynamoDB properly, you must first:
Once you've accepted all that is horrible as best practice, only then you may then build highly performant and scalable web applications.
The next stumbling block is DynamoDB's API: it does not make this easy. Combining multiple records from different data types sharing indexes in the same logical table requires discipline and attention to detail.
Most DynamoDB applications will attempt to avoid this by using separate tables for each type of data, using secondary indexes liberally and by naming their keys intuitively based on the data being modelled. This is actually fine: it makes working with the API less painful but it makes it harder to optimise for cost and performance.
This library is an attempt at a compromise - it presents a Mongo-like API for looking up data, but still relies on you to identify and declare your access patterns up front.
You can query your data as if your storage engine knows how to work out what index to use, but it will fail hard if it can't find that index, which is (counterintuitively) what you want with DynamoDB.
You can use it for single or multi-table designs (in reality, there is no such thing as single-table designs, because there will be at least one access pattern that is so different from your others that it would affect the performance of them if they shared an index or table).
This is a list of current limitations:
status=(starting, started, stopping, stopped deleted)
and you query them on one of those values relentlessly, you will get a
hot partition. The normal solution is to add a suffix spread between a given
set of values (e.g. 0-19) so that when it is queried on status the query can
be split over 20 partitions instead of one.Open an Issue (especially before you write any code) and share your thoughts / plans / ideas before you do anything substantial.
Abuse, harrassment, and anything else that is becoming unproductive will be closed without further engagement.
Copyright 2019-2020 Christopher Armstrong
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Generated using TypeDoc


WebRender
Patrick Walton
@pcwalton
Lunch Talk @ Google
This presentation rendered with WebRender!
What is WebRender?
A framework for rendering user interfaces on GPU.
GPU APIs
-
OpenGL 3.0 and OpenGL ES 3.0 backends
- On Windows, optionally uses ANGLE
-
GPU code is factored out into a separate "driver" that can be swapped
out for other APIs
-
Long-term, want to experiment with
gfx-rs
- Would give us native Vulkan & Metal support
Imaging model
CSS-like, not PostScript-like
- Borders, box shadows, text shadows
- 3D transforms
- Scroll frames,
position: sticky
- Out-of-process
iframe
s
Animation
A flexible property binding system allows efficient handling of
animations
Multiprocess
-
Display lists can be generated in an untrusted process and delivered
via IPC to a trusted process for rendering
-
Serialization code is memory-safe and autogenerated via
serde
-
Content from multiple processes can be composited into a single scene
Multithreading
-
Renderer: issues GPU commands
- The only thread that interacts with the GPU
- Backend: builds GPU batches/command buffers
- Worker: performs CPU-intensive tasks like glyph rasterization
- A thread pool managed by
rayon
Debugging
-
Scenes can be saved into YAML or binary formats
- Can be replayed with
wrench
Profiling
How is WebRender different?
Traditional 2D pipeline
Traditional advantages
- Compositing is cheap
- Translations are fast (touch scrolling)
- Can leverage hardware layers (sometimes)
- Encounters fewer GPU driver bugs 😉
Traditional disadvantages
- High memory usage
- High overdraw
- Layerization heuristics are complicated for developers
WebRender pipeline
Brushes and pictures
Instead of layers, WebRender uses:
-
Brushes: typically-small images cached on GPU and reused from
frame to frame
- e.g. glyphs, images, border pieces
-
Pictures: temporary render targets, discarded after each frame
- (Though this might change)
Batch, Batch, Batch
Consider a typical series of draw commands:
- Solid Color
- Solid Color
- Text
- Solid Color
- Image
- Solid Color
Batch, Batch, Batch
Without opaque reordering, the batches are:
- 2x Solid Color
- Text
- Solid Color
- Image
- Solid Color
Batch, Batch, Batch
But with opaque reordering:
- 4x Solid Color
- Text
- Image
But does it matter?
Aren't GPUs really fast?
2017 MacBook Pro, Intel HD 630
WebRender disadvantages
-
Rendering translations can be more costly
- Though not by much, in most cases
- Leans on the GPU more
WebRender advantages
- Eliminates memory/performance tradeoffs
- Reduces overdraw
- Simpler for app developers to understand
- Works more like a game engine.
“When path rendering is fully GPU-accelerated, a retained model
of rendering is more appropriate and efficient. We believe web
browsers should behave more like video games in this respect to
exploit the GPU.”
—Kilgard & Bolz,
NVIDIA,
"GPU-Accelerated Path Rendering",
SIGGRAPH Asia 2012
GPU font rendering
- Experimental!
:
- Strives to match the native system rendering
- Uses OS libraries for font loading, hinting, etc.
Pathfinder long-term
- Delightfully crisp pinch zooming and transformation of text
- Make WebRender able to render SVG
Pathfinder non-goal
- Make Pathfinder easy to use independent of WebRender
- Too low-level to be realistically appropriate for apps
- WebRender is the one-stop shop for 2D rendering
WebRender status
- Shipping in Firefox Nightly behind a preference
-
On by default for a small percentage of Nightly users
- Currently gathering Telemetry data for studies
- Burning down remaining bugs
Embeddability
- WebRender isn't just a Firefox component
- Some experimental UI toolkits in the community are using it


After the training:
Where does TDD fall?
“Behaviour” is a more useful word than “test”
Given some initial context (the givens),
When an event occurs,
Then ensure some outcomes.
BDD emphasizes the client's perspective
BDD is a second-generation, outside-in, pull-based, multiple-stakeholder, multiple-scale, high-automation, agile methodology. It describes a cycle of interactions with well-defined outputs, resulting in the delivery of working, tested software that matters.
Dan North - introducing BDDfeatures/googlesearch.feature
Feature: Google search
As a user
I'd like to search for some phrase
to get new information about it
Scenario: a user can search for a phrase
Given a user visit google
When the user searches for the phrase
Then one of the results contains expected result
behave_demo/releases/tag/featurefile
Let's finally run it!
(behave_demo) C:\Projects\behave_demo>behave
ConfigError: No steps directory in 'C:\\Projects\\behave_demo\\features'
...and now let's fix this
features/steps/pages/BasePage.py
class BasePage(object):
def __init__(self, driver):
self.driver = driver
self.timeout = 30
def find_element(self, *loc):
return self.driver.find_element(*loc)
def load(self, url):
self.driver.get(url)
features/steps/pages/SearchPage.py
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from .BasePage import BasePage
class SearchPage(BasePage):
SEARCH_INPUT = (By.XPATH, "//input[@name='q']")
def __init__(self, context):
super().__init__(context.driver)
def search(self, phrase):
search_input = self.driver.find_element(*self.SEARCH_INPUT)
search_input.send_keys(phrase + Keys.RETURN)
features/steps/pages/ResultsPage.py
from selenium.webdriver.common.by import By
from .BasePage import BasePage
class ResultPage(BasePage):
@classmethod
def phrase_results(cls, phrase):
xpath = f"//*[contains(text(), '{phrase}')]"
return By.XPATH, xpath
def __init__(self, context):
super().__init__(context.driver)
def phrase_result_count(self, phrase):
phrase_results = self.driver.find_elements(*self.phrase_results(phrase))
return len(phrase_results)
behave_demo/releases/tag/pom
| Behave runner | User |
|---|---|
| text | after_* |
| table | before_* |
| scenario | step definition |
| tags | |
| feature | |
| config |
and many others
First let's maybe look for something meaningful
features/googlesearch.feature
Feature: Google search
As a user
I'd like to search for some phrase
to get new information about it
Scenario: a user can search for a phrase
Given a user visit google
When the user searches for the behave python phrase
Then one of the results contains: Welcome to behave
features/steps/googlesearch.py
from behave import given, when, then
from selenium import webdriver
from features.steps.pages import *
@given('a user visit google')
def step_impl(context):
context.driver = webdriver.Chrome("C:/drivers/chromedriver.exe")
page = SearchPage(context)
page.load('http://www.google.com')
@when('the user searches for the behave python phrase')
def step_impl(context):
page = SearchPage(context)
page.search('behave python')
@then('one of the results contains: Welcome to behave')
def step_impl(context):
page = ResultPage(context)
results = page.phrase_result_count('Welcome to behave')
context.driver.quit()
assert results > 0
Let's do some precheck with 'behave --dry-run'
Looks promising. Doesn't it?
behave_demo/releases/tag/steps
features/googlesearch.feature
Feature: Google search
As a user
I'd like to search for some phrase
to get new information about it
Scenario: a user can search for a phrase
Given a user visit google
When the user searches for the "behave python" phrase
Then one of the results contains: "Welcome to behave"
features/steps/googlesearch.py
from behave import given, when, then
from selenium import webdriver
from features.steps.pages import *
@given('a user visit google')
def step_impl(context):
context.driver = webdriver.Chrome("C:/drivers/chromedriver.exe")
page = SearchPage(context)
page.load('http://www.google.com')
@when('the user searches for the "{search}" phrase')
def step_impl(context, search):
page = SearchPage(context)
page.search(search)
@then('one of the results contains: "{expected_result}"')
def step_impl(context, expected_result):
page = ResultPage(context)
results = page.phrase_result_count(expected_result)
context.driver.quit()
assert results > 0
behave_demo/releases/tag/stepparameters
features/steps/googlesearch.py
@given('a user visit google')
def step_impl(context):
context.driver = webdriver.Chrome("C:/drivers/chromedriver.exe")
page = SearchPage(context)
page.load('http://www.google.com')
@then('one of the results contains: "{expected_result}"')
def step_impl(context, expected_result):
page = ResultPage(context)
results = page.phrase_result_count(expected_result)
context.driver.quit()
assert results > 0
features/steps/googlesearch.py
from behave import given, when, then
from features.steps.pages import *
@given('a user visit google')
def step_impl(context):
page = SearchPage(context)
page.load('http://www.google.com')
@when('the user searches for the "{search}" phrase')
def step_impl(context, search):
page = SearchPage(context)
page.search(search)
@then('one of the results contains: "{expected_result}"')
def step_impl(context, expected_result):
page = ResultPage(context)
results = page.phrase_result_count(expected_result)
assert results > 0
features/environment.py
from selenium import webdriver
def before_scenario(context, scenario):
context.driver = webdriver.Chrome("C:/drivers/chromedriver.exe")
context.driver.implicitly_wait(10)
def after_scenario(context, scenario):
context.driver.quit()
behave_demo/releases/tag/hooks
features/fixtures.py
from selenium import webdriver
from behave.fixture import fixture
@fixture
def browser_chrome(context):
context.driver = webdriver.Chrome("C:/drivers/chromedriver.exe")
context.driver.implicitly_wait(10)
yield context.driver
context.driver.quit()
features/environment.py
from behave import use_fixture
from fixtures import browser_chrome
def before_tag(context, tag):
if tag == "fixture.browser.chrome":
use_fixture(browser_chrome, context)
features/googlesearch.feature
@fixture.browser.chrome
Feature: Google search
As a user
I'd like to search for some phrase
to get new information about it
Scenario: a user can search for a phrase
Given a user visit google
When the user searches for the "behave python" phrase
Then one of the results contains: "Welcome to behave"
behave_demo/releases/tag/fixtures
add to features/googlesearch.feature
Scenario: a user can search for a very long phrase
Given a user visit google
When the user searches for the:
"""
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua.
"""
Then one of the results contains: "Wikipedia"
add to features/steps/googlesearch.py
@when('the user searches for the')
def step_impl(context):
page = SearchPage(context)
page.search(context.text)
behave_demo/releases/tag/multilinetext
add to features/googlesearch.feature
Scenario: a user search something
When user do the search of "Dan North"
Then one of the results contains: "Introducing BDD"
add to features/steps/googlesearch.py
@when('user do the search of "{phrase}"')
def step_impl(context, phrase):
context.execute_steps(u"""
given a user visit google
when the user searches for the "{search}" phrase
""".format(search=phrase))
behave_demo/releases/tag/stepmacro
features/scenariooutline.feature
@fixture.browser.chrome
Feature: Google search
As a user
I'd like to search for some phrase
to get new information about it
Scenario Outline: a user can search for a phrases
Given a user visit google
When the user searches for the "<search>" phrase
Then one of the results contains: "<expected result>"
Examples: BDD topics
| search | expected result |
| BDD | Behavior-driven development |
| Behaviour Testing | Tutorialspoint |
| Dan North | Introducing BDD |
Examples: Selenium topics
| search | expected result |
| Selenium | Selenium Tutorial for Beginners |
| Page Object Model | Design Pattern |
behave_demo/releases/tag/scenarioutline
behave --tags-help
behave --tags @sometag
behave --tags="@foo and @bar"
behave --tags="(@a or @b) and not @c"
behave -f allure_behave.formatter:AllureFormatter -o %allure_result_folder% ./features
allure serve %allure_result_folder% #run in powershell
Behave Driven Python • TestFest 29.02.2020 • Agnieszka Malek


Control validity directives and components for Angular forms.
Project & README | Demo | Demo Source Code | Documentation
npm i @nowzoo/ngx-form --save
Import the module...
import { NgxFormModule } from '@nowzoo/ngx-form';
@NgModule({
//...
imports: [
//...
ReactiveFormsModule, // or FormsModule
NgxFormModule
],
//...
})
export class AppModule { }
Use the directives and components...

Email

<input
id="reactive-demo-email"
type="text"
[formControl]="fcEmail"
ngxControlInvalidClass
ngxControlValidClass
class="form-control form-control-lg">

<ngx-control-error key="required">Required.</ngx-control-error>
<ngx-control-error key="email">Invalid email.</ngx-control-error>

<ngx-control-success>That's a valid email!</ngx-control-success>

Validity: {{emailValidity.validity$ | async | json}}

<input
class="form-check-input"
type="checkbox"
value="true"
id="reactive-demo-check"
[formControl]="fcTos"
ngxControlInvalidClass
ngxControlValidClass>

I agree to your onerous terms of service.

<ngx-control-error key="required">You really must agree to send us Junior.</ngx-control-error>
<ngx-control-success>That's just great! We're sure Junior will enjoy work in the salt mine.</ngx-control-success>

Validity: {{tosValidity.validity$ | async | json}}

Clone the main repo and npm install...
git clone https://github.com/nowzoo/ngx-libs.git
cd ngx-libs
npm i
The library files are in projects/ngx-form
.
The demo code is in projects/ngx-form-demo
.
Building the library...
ng build ngx-form
Testing the library...
ng test ngx-form
To test with Wallaby, use the wallaby.js
config at the root of the project directory.
Serving the demo...
# make sure you've built the library locally first with ng build ngx-form
ng serve ngx-form-demo
Please submit issues to the main repo here.


Slider Background (Font Awesome Icons)
Slider Background (Pixeden Icons)
Video Background
Coming Soon Page (Video Background)


Login Forms
With error messages on top
With error messages on fields
Signup Forms
With error messages on fields