Noutați

DevOps Best Practices for Faster and More Reliable Software Delivery

Imagine a scenario where teams creating the software and delivery aren’t just passing information but sitting together, brainstorming and solving problems in real time. That’s the core of DevOps. It’s not a one-click software solution, but teams working together to provide a reliable solution for seamless and faster software delivery. Let’s take an example of an app or software update; users would expect it to work seamlessly. The secret here for that seamless experience is often a well-structured DevOps strategy. DevOps isn’t just about speeding things up, it’s about balancing the need for speed with the need for stability. According to research, 99% of organizations witnessed a positive impact after implementing DevOps in their business delivery processes. They’re deploying updates far more frequently, their failure recovery is lightning-fast, and they see fewer issues when they launch new features. Using DevOps for Efficient Software Delivery DevOps is crucial for organizations looking to resolve the complexities of modern software delivery. It bridges the gap between ‘code complete’ and ‘code in production,’ ensuring that software isn’t just created but delivered swiftly and effectively to the end-user. This approach not only accelerates time-to-market but also enhances product quality and customer satisfaction. By adopting continuous integration and continuous delivery (CI/CD), automation, and constant feedback, DevOps empowers teams to respond to market changes with agility and confidence. It’s about balancing processes, people and technology that work together to unlock higher efficiency, innovation and success. Implementing Continuous Integration and Continuous Deployment (CI/CD) Continuous integration and continuous deployment (CI/CD) are core practices in the DevOps approach, designed to streamline and automate the steps in getting software from development to deployment. CI/CD establishes a framework for development teams that supports frequent code changes while maintaining system stability and high-quality output. This method depends on automation to detect problems early, reduce manual errors and speed up the delivery process, ensuring that new features, updates and fixes are available to users quickly and reliably. Teams should follow several best practices: • Commit to Version Control Rigorously: Every piece of code, from application to configuration scripts, should be version-controlled. It ensures that any changes can be tracked, rolled back or branched out at any point, providing a solid foundation for collaborative development and deployment.• Automate the Build for Consistency: Automation is the key to CI/CD. By automating the build process, one can ensure that the software can be reliably built at any time. This automation includes compiling code, running database migrations, and executing any necessary scripts to move from source code to a working program.• Incorporate Comprehensive Automated Testing: A robust suite of automated tests, including unit, integration, acceptance, and regression tests, should be run against every build to catch bugs early. Automated tests act as a safety net that helps maintain code quality throughout the rapid pace of DevOps cycles.• Replicate Production in Staging: A staging environment replicates your production environment and is crucial for pre-deployment testing. It should mimic production as closely as possible to surface any environment-specific issues that could otherwise cause unexpected behavior after release. • Ensure Quick and Safe Rollbacks: The ability to roll back to a previous state quickly is essential. This safety measure minimizes downtime by swiftly reversing failed deployments or critical issues without going through a prolonged troubleshooting process during peak hours.• Monitor Relentlessly […]

Read More

What Are The CMath Mathematical Special Functions in Modern C++?

In C++11 and C++14, we were able to use this math.h library in C++ applications. After the C++17 standard, this library modernized math operations with the cmath library. Functions are declared in  header. For compatibility reasons the is an optional alternative to support older code. In this post, we list most of these mathematical functions declared in the header of modern C++. What is cmath mathematical functions library in C++? The CMath Mathematical Special Functions Header  defines mathematical functions and symbols in the std namespace. It includes the previous math functions. It may also define them in the global namespace. You have to add a std namespace using namespace std; or you should use the std:: prefix for each math function. Some of the mathematical special functions are added to the C++17 cmath library header by the contents of the former international standard ISO/IEC 29124:2010 and math.h functions added too. These are only available in namespace std. If you do not use namespace you should add std:: prefix to use these modern math functions. In general, they are mostly double functions and can be slower, but they have more accurate results. For example sin() uses double variables, sinf() uses a float variable (same as C++11, faster, less accurate), while sinl() is used with long double variables (same as C++11, also slower, but more accurate). Here is a simple C++ example using the sin function.   #include #include   int main() { double d = std::sin(1.0); // double float  f = std::sinf(1.0); // float (C++11) long double  l = std::sinl(1.0); // long double (C++11)   }   What are the CMath mathematical special functions in modern C++ 17? There are many new modern mathematical special functions in the C++17 cmath header. Such as functions for associated Laguerre polynomials, elliptic integral of the first kind functions, Cylindrical Bessel functions (of the first kind), Cylindrical Neumann functions, Exponential integral functions, Hermite polynomials functions, Legendre polynomials functions, Laguerre polynomials, Riemann zeta function, and some spherical functions. Here is a list of the CMath special functions. Description double float long double Associated Laguerre polynomials assoc_laguerre assoc_laguerref assoc_laguerrel Associated Legendre polynomials assoc_legendre assoc_legendref assoc_legendrel Beta function beta betaf betal Elliptic integral of the first kind (complete) comp_ellint_1 comp_ellint_1f comp_ellint_1l Elliptic integral of the second kind (complete) comp_ellint_2 comp_ellint_2f comp_ellint_1l Elliptic integral of the third kind (complete) comp_ellint_3 comp_ellint_3f comp_ellint_1l Regular modified cylindrical Bessel functions cyl_bessel_i cyl_bessel_if cyl_bessel_il Cylindrical Bessel functions (of the first kind) cyl_bessel_j cyl_bessel_jf cyl_bessel_jl Irregular modified cylindrical Bessel functions cyl_bessel_k cyl_bessel_kf cyl_bessel_kl Cylindrical Neumann functions cyl_neumann cyl_neumannf cyl_neumannl Elliptic integral of the first kind (incomplete) ellint_1 ellint_1f ellint_1l Elliptic integral of the second kind (incomplete) ellint_2 ellint_2f ellint_2l Elliptic integral of the third kind (incomplete) ellint_3 ellint_3f ellint_3l Exponential integral expint expint expint Hermite polynomials hermite hermitef hermitel Legendre polynomials legendre legendref legendrel Laguerre polynomials laguerre laguerref laguerrel Riemann zeta function riemann_zeta riemann_zetaf riemann_zetal spherical associated Legendre functions sph_legendre sph_legendref sph_legendrel spherical Bessel functions (of the first kind) sph_bessel sph_besself sph_bessell spherical Neumann functions sph_neumann sph_neumannf sph_neumannl Note that, by the C++20 standard, only default names of math functions are used. For example, the laguerre() is used for the float, double and long double versions. For more details about changes in C++17 standard, please see this https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0226r1.pdf C++ Builder is the easiest and fastest C and C++ compiler […]

Read More

What’s New in the vcpkg 2023.11.20 Release

What’s New in the vcpkg 2023.11.20 Release Augustin Popa November 28th, 20230 0 The 2023.11.20 release of the vcpkg package manager is available. This blog post summarizes changes from October 19th, 2023 to November 19th, 2023 for the Microsoft/vcpkg, Microsoft/vcpkg-tool, and Microsoft/vcpkg-docs GitHub repos. Some stats for this period: 34 new ports were added to the open-source registry. A port is a versioned recipe for building a package from source, such as a C or C++ library. 268 updates were made to existing ports. As always, we validate each change to a port by building all other ports that depend on or are depended by the library that is being updated for our nine main triplets. There are now 2,352 total libraries available in the vcpkg public registry. 22 contributors submitted PRs, issues, or participated in discussions in the main repo. The main vcpkg repo has over 5,800 forks and 20,200 stars on GitHub.   Key changes This vcpkg update includes some bugfixes, documentation improvements, as well as a new community triplet. Notable changes for this release are summarized below.   Added mips64-linux community triplet A community contributor has added a mips64-linux community triplet. MIPS stands for Microprocessor without Interlocked Pipelined Stages and is a “family of reduced instruction set computer (RISC) instruction set architectures (ISA)” (Source: MIPS architecture on Wikipedia). As someone who took courses in university where we wrote code targeting MIPS, I thought this was pretty neat! Also, as implied by the triplet name, this support is specifically for 64-bit MIPS. PR: Microsoft/vcpkg#34392, Microsoft/vcpkg-tool#1226 (thanks @capric8416!)   Documentation changes This month, our documentation changes at learn.microsoft.com/vcpkg include a glossary of terms and two new tutorials. The first tutorial covers exporting compiled dependencies, which is useful when you want to share libraries across multiple projects in a portable manner, without requiring the end user to install vcpkg to receive them. The second tutorial describes how to update an open-source vcpkg dependency to a new version and submit the changes to the vcpkg repo. Documentation changelog: Added Glossary of terms. Added Tutorial: Export compiled dependencies. Describes how to export compiled dependencies using the vcpkg export command. Added Tutorial: Update an existing vcpkg dependency. Updated MSBuild integration article to describe properties for app-local DLL deployment. Fixed incorrect spelling to an “env” macro in a CMakePresets.json snippet (PR: Microsoft/vcpkg-docs#215, thanks @oraqlle!) Fixed a couple of links in the CMake integration page (PR: Microsoft/vcpkg-docs#212, thanks @randallpittman!) Other minor edits / typo fixes.   Bug fixes / performance improvements Fixed vcpkg activate failing when run with the –no-color switch in Visual Studio (PR: Microsoft/vcpkg-tool#1247). Fixed crash when running “vcpkg add port sqlite3[core]” (PR: Microsoft/vcpkg-tool#1163, thanks @autoantwort!) Other minor bugfixes.   Total ports available for tested triplets We are re-building our ports for arm64-windows and x64-windows due to an error that occurred in the last CI run. The numbers for these will be updated shortly. triplet ports available x64-windows Building… x86-windows 2,122 x64-windows-static 2,084 x64-windows-static-md 2,108 arm64-windows Building… x64-uwp 1,217 arm64-uwp 1,184 x64-linux 2,158 x64-osx 2,050 arm-neon-android 1,496 x64-android 1,555 arm64-android 1,513 While vcpkg supports a much larger variety of target platforms and architectures, the list above is validated exhaustively to ensure updated ports don’t break other ports in the catalog.   Thank you to our contributors vcpkg couldn’t be where it is today […]

Read More

What Are The New Rules For Auto Deduction In C++ 17?

The features of C++17 were a big step in the history of C++ and brought a lot of new features. In C++17, there are new auto rules for direct-list-initialization. This feature in C++, changes the rules for auto deduction from a braced-init-list. In this post, we explain what these new rules for auto deduction with examples are. What is auto keyword in C++? The auto keyword arrives with the new features in C++11 and improved in C++17, can be used as a placeholder type specifier (an auto-typed variable), or it can be used in function declaration, or in a structured binding declaration. The auto keyword can be used with other new CLANG standards like C++14, C++17, etc. What are the new rules for auto deduction in C++ 17? In C++17, For copy-list-initialization, the auto deduction will either deduce a std::initializer_list (if the types of entries in the braced-init-list are all identical) or be ill-formed otherwise. Note that, auto a = {1, 2, 3}, b = {1}; remains unchanged and deduces initializer_list. This change is intended as a defect resolution against C++14. Now, let’s see the examples below. Auto deduction from braced-init-list Rule #1 For direct list-initialization: For a braced-init-list with only a single element, the auto deduction will deduce from that entry. In the example below, there is a single member in the braced-init-list, and this is automatically defined as an initializer_list that consists of int members.   auto a = { 30 }; // decltype(a) is std::initializer_list for (auto i : a)  std::cout

Read More

Modern Examples For The New Modern C++ Builder 12

Hello C++ Developers, Yilmaz here from LearnCPlusPlus.org. This month, the new RAD Studio 12, the new C++ Builder 12, and the new Delphi 12 were released packed full of great features, optimizations, and improvements. We’ve had some great positive and encouraging feedback especially about one of the great features of C++ Builder 12 the new Visual Assist (VA) with code completion, refactoring, and very powerful navigation. Feedback for the CLANG C++ compiler preview is also very encouraging for the future of C++ Builder. It is another big step introducing a new 64bit bcc64x CLANG (15.x) compiler (Version 7.60), which supports C++11, C++14, C++17, and partially the C++20 standards. There were many new features in IDE, libs, components, and compilers on both C++ Builder and Delphi side. Please see below for details. This week we have 3 new post picks from LearnCPLusPlus.org that can be used with the new C++ Builder 12. The first post pick is about the std::is_final type trait that can be used to detect if a class or a method is marked as a final or not. The second post is about the new begin() and end() iterators that come with C++14 and are used to define the start of iteration and the end of the iteration. The other new post is about the std::integer_sequence is a class template for the sequence of integers that is generated at compile-time. It has been 3 years since we start adding posts to our educational LearnCPlusPlus.org site, it has a broad selection of new and unique posts with examples suitable for everyone from beginners to professionals alike. It is growing well thanks to you, and we have many new readers, thanks to your support! The site features a treasure-trove of posts that are great for learning the features of modern C++ compilers with very simple explanations and examples. RAD Studio’s C++ Builder, Delphi, and their free community editions C++ Builder CE, and Delphi CE are powerful tools for modern application development. Where I can I learn C++ and test these examples with a free C++ compiler? If you don’t know anything about C++ or the C++ Builder IDE, don’t worry, we have a lot of great, easy to understand examples on the LearnCPlusPlus.org website and they’re all completely free. Just visit this site and copy and paste any examples there into a new Console, VCL, or FMX project, depending on the type of post. We keep adding more C and C++ posts with sample code. In today’s round-up of recent posts on LearnCPlusPlus.org, we have new articles with very simple examples that can be used with: The free version of C++ Builder 11 CE Community Edition or a professional version of C++ Builder  or free BCC32C C++ Compiler and BCC32X C++ Compiler or the free Dev-C++ Read the FAQ notes on the CE license and then simply fill out the form to download C++ Builder 11 CE. How to use modern C++ with C++ Builder? In C++11, the final specifier is used for a function or for a class that cannot be overridden by derived classes, and there was no way to check if that class or method is the final. In C++14, there is a std::is_final type trait that can be used to detect if a class or a method is marked as a final or not. In the first post, we explain how we can use the std::is_final type trait in C++14 and C++17. Iterators are one of the […]

Read More

New Relic Adds Ability to Monitor AI Models to APM Platform

New Relic today added an ability to monitor artificial intelligence (AI) models to its application performance management (APM) platform. Peter Pezaris, senior vice president for strategy and experience for New Relic, said as next-generation applications are built and deployed, it’s apparent most of them will incorporate multiple AI models. New Relic is extending its APM platform to make it simpler to monitor the behavior of those AI models within the context of an application, he added. To achieve that goal, New Relic has added more than 50 integrations with frameworks and AI models to troubleshoot, compare and optimize different prompts and responses to address performance, cost, security and quality issues such as hallucinations, bias, toxicity and fairness. For example, response tracing for large language models (LLMs) can be applied using New Relic agent software to collect telemetry data that can be used to compare how different AI models are performing and responding to queries. Those results will provide immediate full visibility into the models, applications and infrastructure being used to provide complete visibility across the entire AI stack, said Pezaris. That capability is going to prove crucial as developer use a mix of proprietary, open source and custom large language models (LLMs) alongside a range of other types of AI models to build and deploy applications, he added. Organizations are likely to find themselves managing hundreds of AI models that either they or a third party developed. The challenge, as always, is bringing order to a potentially chaotic process that, in addition to wasting resources, represents a significant risk to the business given the potential for regulatory fines to be levied, noted Pezaris. Each organization will need to determine for itself how best to construct workflows spanning data scientists, application developers, software engineers, cybersecurity teams and compliance specialists. Before too long, organizations will find themselves managing hundreds of AI models that might be integrated into thousands of applications. New Relic is essentially making a case for extending an existing APM platform to address that challenge rather than requiring organizations to acquire, deploy and maintain additional platforms. Eventually, in addition to updating AI models, IT teams will find they are being regularly replaced as advances continue to be made at a fast and furious rate. Data science teams are now making AI models based on significantly larger parameters that make previous generations of models obsolete before they can even be deployed in production environments. As a result, operationalizing AI is going to present DevOps teams with major challenges as they look to both tune application performance and ensure the results being generated are accurate and consistent. That latter issue is especially critical in enterprise application environments where the results generated by an AI model can’t vary from one query to the next.It’s still early days in terms of how AI will be applied to applications, but as AI models join the pantheon of artifacts DevOps teams need to manage, application development and deployment are about to become much more complex to manage.

Read More

What Is The Integer Sequence (std::integer_sequence) In C++ 14

In modern programming sometimes we want to use a sequence of integers that are created at compile-time. In C++14, the std::integer_sequence is a class template for the sequence of integers that is generated at compile-time. In this post, we explain what integer sequence (std::integer_sequence) is in modern programming. What is the integer sequence (std::integer_sequence) in C++ 14? In C++14, the std::integer_sequence is a class template defined in a header that can be used for the sequence of integers generated at compile-time. In some cases, looping through a range of numbers whose span is unknown is used and, in these cases, we can use the std::integer_sequence integer sequence. Thus, we can create a sequence of integers at compile time. Our application knows the sequence of integers before it runs, and we use them on runtime as a package. In other words, the std::integer_sequence is used to hold a sequence of integers which can be turned into a parameter pack. We can use integer_sequence in template programming or meta-programming algorithms, and this will make our code faster and less complex. In C++14, a simple syntax for the std::integer_sequence can be written as shown below.   template class integer_sequence;   Here, T is the type of integers and val is a parameter pack of integers. Is there a simple integer sequence (std::integer_sequence) example in C++ 14? Here is a simple example how we can use std::integer_sequence.   template void print_sequence2(std::integer_sequence) { ( (std::cout

Read More

Visual Studio Code CMake Tools Extension 1.16 Update: New CMake Tools Sidebar and CMake Debugging options

Visual Studio Code CMake Tools Extension 1.16 Update: New CMake Tools Sidebar and CMake Debugging options Sinem Akinci November 15th, 20230 1 The November release of the CMake Tools extension in VS Code is now available. With this release, we have two major new updates to the extension:  A new, customizable CMake Tools status bar and side bar for your presets and CMake actions  Script mode debugging support for the CMake Debugger  The full list of updates can be seen in our change log. This release features 10 contributions from the open-source community. Thank you all for your continued support!  Release Schedule Updates Starting with this November release, CMake Tools will now release every 3 months. You can learn more about our release schedules on our release schedule wiki.  Updates to the default CMake Tools UI Starting in this 1.16 release, the default CMake Tools status bar will only have commonly-used actions like Build, Debug, and Run to de-clutter the status bar by default. All options for configuring your project through CMake presets or kits/variants will be found in the CMake Tools side bar under their respective node. There are new items for Deleting Cache and Reconfiguring and accessing CMake settings at the top of the Project Status view.  New CMake Tools Sidebar Under each respective node, you will be able to view and toggle your active CMake presets and targets and perform Configure, Build, Test, Debug, and Launch actions on your project configurations. This will provide a one-stop location to view and edit all your CMake configurations by default.  New Simplified CMake Status Bar Items The previous status bar displayed a plethora of CMake configuration options, but with the new default, you will have access to only the commonly-used CMake actions in the status bar in order to clean up space in the view by default. Then, you can expand the CMake sidebar for your configuration needs. This view can be customized to suit your needs, so you can pull whatever relevant items you want to the status bar and configure the amount of space each command takes up. If you have any other feedback on this new experience, please comment on our open GitHub issue. Added script mode for the CMake Debugger We have now added support for users to use the CMake debugger to debug externally launched CMake processes or any generic CMake script. To do so, please add cmakeDebugType to your launch.json  configurations to specify whether you are debugging with the three available modes: configure, external, and script. Example launch.json with CMake debug types { “configurations”: [ { “type”: “cmake”, “request”: “launch”, “name”: “Debug CMake script”, “cmakeDebugType”: “script”, “scriptPath” “${workspaceFolder}/anyScript.cmake }, { “type”: “cmake”, “request”: “launch”, “name”: “Debug externally launched CMake processes”, “cmakeDebugType”: “external” “pipeName”: “” } ] } To learn more about the supported CMake debug variables in your launch.json, please see our CMake debug documentation. You can also debug vcpkg portfiles using the CMake Debugger in the new script mode. source cross-platform library manager that uses portfiles to know how to acquire, build, and install libraries. Debugging portfiles can be helpful whenever you are adding a new library of your own to the vcpkg catalog. To learn more, please see our blog post on debugging vcpkg portfiles. What’s next? For our next release of CMake […]

Read More

Microsoft Previews Additional Copilot Tools for Azure

At its Ignite 2023 conference, Microsoft this week previewed Copilot tools to simplify the management of the Azure cloud service along with a tool that streamlines the building and deploying of artificial intelligence (AI) applications on the Azure platform. In addition, Microsoft launched Microsoft Copilot Studio, a low-code tool that automates the process of creating data integration plugins and adding custom copilots within the Microsoft Copilot for Microsoft 365 tool that Microsoft previously launched. Microsoft Copilot for Azure leverages large language models (LLMs) to enable IT teams to use natural language to create, configure, discover and troubleshoot Azure services. It also enables IT teams to create complex commands, ask questions and optimize costs. Erin Chapple, corporate vice president for Azure Core at Microsoft, told Ignite attendees that Microsoft, along with a handful of customers, is already using Microsoft Copilot Azure to manage Azure infrastructure. In the long term, it’s clear that Microsoft is moving toward streamlining the building and deployment of AI applications using Azure AI Studio, a framework for invoking the AI models that Microsoft makes available on the Azure platform. The goal is to make it possible for organizations to create their own copilots based on AI models they have trained. It’s still early days in terms of organizations leveraging AI models to build applications, but it’s already apparent that DevOps and machine learning operations (MLOps), along with data engineering and cybersecurity best practices, will need to converge. Microsoft is making a case for Azure AI Studio as the framework that will enable IT organizations to achieve that goal. Of course, Microsoft is not the only provider of IT infrastructure resources with similar ambitions, but thanks to its investments in OpenAI and the acquisition of GitHub, it is furthest along in terms of defining a framework for building AI applications at scale. Last week, GitHub previewed an extension of the Copilot tools it already provides to help developers write code that leverages generative AI to automatically propose an editable plan for building an application based on natural language descriptions typed into the GitHub Issues project management software. Copilot Workspace will generate editable documents via a single click that can be used to create code that developers can then visually inspect. Any errors discovered by application developers or the Copilot Workspace platform can also be automatically fixed. At the same time, GitHub has extended the scope and reach of Copilot Chat to make it simpler for developers to use natural language to discover issues in their code base. Generative AI is already having a massive impact on the rate at which applications are developed, but that code still needs to be reviewed. Chat GPT is based on a general-purpose large language model (LLM) that is trained by pulling in code of varying quality from all across the web. As a result, code generated by the platform might contain vulnerabilities or be inefficient. In many cases, professional developers still prefer to write their own code. Of course, not every programming task requires the same level of coding expertise. In many instances, ChatGPT will generate, for example, a script that can be reused with confidence across a DevOps workflow. There is no shortage of mediocre developers who are now writing better code thanks to tools such as GitHub Copilot, and soon, […]

Read More

What Are The Member Initializers And Aggregates Features in C++14?

C++14 brought us a lot of useful things that we use today. One of the great features of C++14 was the member initializers and aggregates feature that a class with default member initializers may now be an aggregate. In this post, we explain how can use member initializers and aggregates with examples. What are the member initializers and aggregates features in C++14? With the new C++14, a class or struct with default member initializers may now be an aggregate in definition. “If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member not explicitly initialized shall be initialized from its brace-or-equal-initializer or, if there is no brace-or-equal-initializer, from an empty initializer list“. Here is an example,   struct st_X { int a; int b = 100; }; st_X X = { 5 };   Here, X.b will be 100 automatically. Are there simple examples about member initializers and aggregates features in C++14? This feature can be good to be used with default values (i.e. “Unknown”), here is an example.   struct st_student { std::string name; int score; std::string uni = “Unknown”; };   st_student s0 = { “David Millington”}; st_student s1 = { “Yilmaz Yoru”, 98 }; st_student s2 = { “Ian Barker”, 99, “Harvard University” };   Here, David will have 0 score and “Unknown” university, Yilmaz will have “Unknown” university. We can use parameters in the next parameters.   struct st_test {  const char* str; int a; int val = str[a]; }; st_test test = { “ABCD”, 2 };   Here example above, value of test.val is initiated automatically to 67 which is third char ‘C’. Is there a full example about member initializers and aggregates feature in C++14? Here is a full example. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35   #include #include   struct st_student { std::string name; int score; std::string uni = “Unknown”; };   struct st_test {  const char* str; int a; int val = str[a]; };   struct st_X { int a; int b = 100; };   int main() { st_student s0 = { “David Millington”}; st_student s1 = { “Yilmaz Yoru”, 98 }; st_student s2 = { “Ian Barker”, 99, “Harvard University” };   std::cout

Read More