From de946f36e9f10574db872e11179c7325a9c4b4e1 Mon Sep 17 00:00:00 2001 From: jhudsl-robot Date: Wed, 12 Jul 2023 15:53:59 +0000 Subject: [PATCH 1/3] Render bookdown --- docs/02-ethics.md | 2 ++ docs/04-refactoring.md | 6 +++--- docs/ethics-of-using-ai.html | 1 + docs/refactoring-code.html | 6 +++--- docs/search_index.json | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/02-ethics.md b/docs/02-ethics.md index 577b6a49..8358d4da 100644 --- a/docs/02-ethics.md +++ b/docs/02-ethics.md @@ -36,6 +36,8 @@ Note that this is an incomplete list; additional ethical concerns will become ap :::{.ethics} Be transparent about what AI tools you use to write code. This help others to better understand how you created your code, as well as the possible sources that the AI tools might have used when helping you write code. It may also help with future unknown issues related to the use of these tools. + +Some organizations and scientific societies have created guidelines or requirements for using AI in journal articles and conference submissions, like the [International Society for Computational Biology](https://www.iscb.org/iscb-policy-statements/iscb-policy-for-acceptable-use-of-large-language-models). Be aware of the requirements/guidelines for your field. ::: **It is essential to address these ethical concerns and ensure that the use of AI in coding is done in a responsible and transparent manner.** This could be done through ensuring the quality of the data used to train AI systems, promoting transparency in AI-generated code, and implementing safeguards against the creation of harmful or biased code. By doing so, we can harness the potential of AI to improve and transform the way we write and optimize code while maintaining ethical standards. diff --git a/docs/04-refactoring.md b/docs/04-refactoring.md index c43c26ab..0010cf03 100644 --- a/docs/04-refactoring.md +++ b/docs/04-refactoring.md @@ -547,7 +547,7 @@ proc.time() - start_time ``` ## user system elapsed -## 12.077 0.000 12.076 +## 11.986 0.003 11.988 ``` :::{.query} @@ -575,7 +575,7 @@ proc.time() - start_time ``` ## user system elapsed -## 0.665 0.363 0.697 +## 0.745 0.504 0.832 ``` The `outer()` function performs the same calculation as the nested loop in the original code, but more efficiently. It returns a matrix of all possible combinations of x and y values, with each element of the matrix being the product of the corresponding x and y values. The `rowSums()` function is then used to sum the elements of each row of the matrix, which is equivalent to summing the products of x and y for each index `i` in the original loop. This method avoids the need for the nested loop, resulting in a faster and more efficient computation. @@ -603,7 +603,7 @@ proc.time() - start_time ``` ## user system elapsed -## 0.334 0.296 0.402 +## 0.394 0.452 0.536 ``` One optimized way to perform the same calculation is by using the `%*%` operator to perform matrix multiplication. This can be done by converting x and y to matrices and transposing one of them so that their dimensions align for matrix multiplication. This code should be much faster than the original implementation because it takes advantage of highly optimized matrix multiplication algorithms in R. diff --git a/docs/ethics-of-using-ai.html b/docs/ethics-of-using-ai.html index 4dcf38b4..838447c4 100644 --- a/docs/ethics-of-using-ai.html +++ b/docs/ethics-of-using-ai.html @@ -400,6 +400,7 @@

2.2 Major concerns

Note that this is an incomplete list; additional ethical concerns will become apparent as we continue to use these new technologies. We highly suggest that users of these tools be transparent about the use of these tools, so that as new ethical issues emerge, we will be better prepared to understand the implications for specific coding projects.

Be transparent about what AI tools you use to write code. This help others to better understand how you created your code, as well as the possible sources that the AI tools might have used when helping you write code. It may also help with future unknown issues related to the use of these tools.

+

Some organizations and scientific societies have created guidelines or requirements for using AI in journal articles and conference submissions, like the International Society for Computational Biology. Be aware of the requirements/guidelines for your field.

It is essential to address these ethical concerns and ensure that the use of AI in coding is done in a responsible and transparent manner. This could be done through ensuring the quality of the data used to train AI systems, promoting transparency in AI-generated code, and implementing safeguards against the creation of harmful or biased code. By doing so, we can harness the potential of AI to improve and transform the way we write and optimize code while maintaining ethical standards.

diff --git a/docs/refactoring-code.html b/docs/refactoring-code.html index e32fa3b9..f1b5270a 100644 --- a/docs/refactoring-code.html +++ b/docs/refactoring-code.html @@ -746,7 +746,7 @@

4.10 Code optimization

# End timer proc.time() - start_time
##    user  system elapsed 
-##  12.077   0.000  12.076
+## 11.986 0.003 11.988

What is a faster, more optimized way of running the following R code?

@@ -765,7 +765,7 @@

4.10 Code optimization

# End timer proc.time() - start_time
##    user  system elapsed 
-##   0.665   0.363   0.697
+## 0.745 0.504 0.832

The outer() function performs the same calculation as the nested loop in the original code, but more efficiently. It returns a matrix of all possible combinations of x and y values, with each element of the matrix being the product of the corresponding x and y values. The rowSums() function is then used to sum the elements of each row of the matrix, which is equivalent to summing the products of x and y for each index i in the original loop. This method avoids the need for the nested loop, resulting in a faster and more efficient computation.

So much faster! We can look at another option by regenerating the response:

@@ -784,7 +784,7 @@

4.10 Code optimization

# End timer proc.time() - start_time
##    user  system elapsed 
-##   0.334   0.296   0.402
+## 0.394 0.452 0.536

One optimized way to perform the same calculation is by using the %*% operator to perform matrix multiplication. This can be done by converting x and y to matrices and transposing one of them so that their dimensions align for matrix multiplication. This code should be much faster than the original implementation because it takes advantage of highly optimized matrix multiplication algorithms in R.

While this second suggestion is faster, you will need to consider what aspects of the codebase are most important in each instance. For example, this code runs more quickly, but the %*% operator might be unfamiliar to some R programmers. In cases where efficiency is less important, or the data are not large, you might consider maximizing readability.

diff --git a/docs/search_index.json b/docs/search_index.json index a7b886bc..c2edb219 100644 --- a/docs/search_index.json +++ b/docs/search_index.json @@ -1 +1 @@ -[["index.html", "AI for Software Development Harnessing the Power of Large Language Models About this Course Available course formats Suggested Activity Context Learning Objectives Lesson Breakdown", " AI for Software Development Harnessing the Power of Large Language Models July, 2023 About this Course This course on AI for software development explores the use of AI large language models such as ChatGPT, Bard, and others and their potential benefits and challenges. Through examples and hands-on activities, students will develop an understanding of the ways in which AI can speed up software development tasks and free up time for more creative and strategic work. By the end of the course, students will be equipped to navigate the rapidly changing landscape of software development and use AI chatbots in a way that maximizes benefits and efficiency while limiting harm as much as possible. Available course formats This course is available in multiple formats which allows you to take it in the way that best suits your needs. The material for this course can be viewed without login requirement on this Bookdown website. This format might be most appropriate for you if you rely on screen-reader technology. Our courses are open source, you can find the source material for this course on GitHub. The slides for the images in the course can be found here. Suggested Activity Context Course Audience Professionals looking to improve efficiency Students hoping to learn more about programming Anyone curious about how AI can be harnessed for technology Note: Those completely new to programming will find using AI tools to create software solutions challenging at this time. It is helpful to have some fundamental knowledge to write appropriate prompts and to discern when code is not working as expected. We advise novices to seek expert review. Course Prerequisites Some previous exposure to programming recommended. Assessment Type Hands-on activities following each lesson. Learning Objectives Learners will be able to: Explain the basics of AI and its potential for improving software development workflows Implement strategies to write and debug code using AI-based tools Describe the benefits of refactoring code using AI-powered techniques, such as making code readable, keeping it brief, and optimizing code Apply best practices for annotating code using AI Recognize strategies for using AI-based tools to understand and analyze code, such as code comprehension of unfamiliar languages or functions Discuss the challenges and ethical implications of using AI for different aspects of software development Lesson Breakdown Activity Duration Introduction 10 minutes Ethics for Using AI 20 minutes Writing Code 35 minutes Writing Exercise 15 minutes Refactoring Code 35 minutes Refactoring Exercise 15 minutes Annotating Code 25 minutes Understanding Code 25 minutes Understanding Exercise 10 minutes Total 3 hours & 10 minutes "],["introduction.html", "Chapter 1 Introduction 1.1 Learning Objectives 1.2 AI Provides New Opportunities 1.3 AI Code of Ethics 1.4 The AI Chatbots 1.5 How to Use This Book 1.6 About This Book", " Chapter 1 Introduction The increasing availability of AI chatbots is creating a new landscape in software development and data science. It is important to be aware of the potential benefits and challenges of this technology, so that we can use it in a way that benefits everyone and limits harm as much as possible. On the one hand, AI chatbots have the potential to replace or significantly reduce the workload of programmers. This could lead to job losses in the data science industry. Additionally, there are significant ethical and privacy concerns regarding the use of training data sets to teach these AI systems. For example, if a chatbot is trained on a dataset of biased or discriminatory data, it could perpetuate those biases in its interactions with users. On the other hand, AI chatbots also have the potential to create new jobs and opportunities. For example, chatbot developers will be needed to create and maintain these AI systems. Additionally, AI chatbots could be used to automate tasks that are currently done by humans, freeing up programmers to focus on more creative and strategic work of interpreting what the data actually mean. Ultimately, while the future of programming in software development and data science is unclear, there is much to be optimistic about in this brave new world. The advancements in AI and chatbot technology present an opportunity for programmers to work alongside algorithms to create innovative solutions that were previously unimaginable. As with any technological revolution, there will be challenges, but it is up to us to work together to ensure that we use these tools ethically and responsibly, and to create a future that benefits everyone. 1.1 Learning Objectives In this chapter we will demonstrate how to: Consider the potential benefits and limitations of AI for software development Recognize how to use this course, how it was written, and what to expect Explain general concepts for ethical use of AI tools for software development Summarize what Chatbots are and how they work Distinguish between different AI options for software development 1.2 AI Provides New Opportunities We do not believe that AI chatbots will replace programmers, software developers, and data scientists. While AI can be powerful and useful, it is only as good as the training data behind it and the human using it. Therefore, for the time being and the foreseeable future, humans will remain at the forefront of programming innovation, with AI providing valuable support. As new code is often built on top of existing code written by humans, it is unlikely that AI will fully replace the need for human programmers. However, we do think that the roles of programmers in software development and data science are changing, and some of the skills required to work in this new environment are slightly different from those needed before. In addition to proficiency in programming syntax, programmers may need to develop a more refined ability to construct queries that enable AI bots to create the desired workflows. Other critical skills such as debugging, troubleshooting, and documentation will continue to be valuable, and can be enhanced through the use of AI. Furthermore, AI creates new opportunities and niches for tasks that were previously difficult, time-consuming, or impossible. This is an exciting time for those working in programming, with great potential to explore new and innovative solutions. As AI technology continues to advance, its role in programming will only become more significant, and it is up to developers to adapt and learn how to use these new tools effectively. We asked OpenAI’s ChatGPT whether AI chatbots would replace human software developers, data scientists, and programmers, and this was the response: “It is unlikely that AI chatbots will replace software developers, data scientists, and programmers entirely. While AI chatbots can perform certain tasks related to software development, data analysis, and programming, they are limited in their abilities and require human oversight and input to function properly. AI chatbots can be used to automate certain tasks such as generating simple code snippets, running tests, and performing simple data analysis. They can also assist in the development process by providing quick answers to commonly asked questions and suggesting possible solutions to programming problems. However, more complex software development, data analysis, and programming tasks require a level of creativity, critical thinking, and problem-solving that AI chatbots cannot currently replicate. Software developers, data scientists, and programmers have a deep understanding of the technologies and tools used to develop AI chatbots, as well as the ability to optimize and improve those tools. Furthermore, software development, data analysis, and programming require a high level of human communication and collaboration, which AI chatbots cannot currently replicate. Humans are also essential in making ethical decisions related to AI development, such as ensuring that AI systems are transparent, fair, and unbiased. In summary, while AI chatbots can provide valuable assistance to software developers, data scientists, and programmers, they are unlikely to replace them entirely. Human expertise, creativity, and critical thinking will continue to be essential in developing and optimizing AI systems for the foreseeable future.” 1.3 AI Code of Ethics Our first duty as programmers is to avoid causing harm to people and the world. This includes avoiding both intentional and inadvertent harm. Intentional harm is harm that is caused by a programmer’s deliberate actions. For example, a programmer might create a virus that is designed to harm computers. Inadvertent harm is harm that is caused by a programmer’s negligence or lack of foresight. For example, a programmer might create a program that is buggy and causes data loss. We must always be aware of the potential for harm and deliberately take steps to mitigate it. This includes things like: Be aware of the potential for bias. AI systems are trained on data, and that data can reflect the biases of the people who collected it. Programmers should be aware of the potential for bias in their data and take steps to mitigate it. Be transparent about your work. Share information about your code, data, and algorithms. This will help others to understand how your work works and to identify any potential problems. Be accountable for your work. Take responsibility for the consequences of your code. Be willing to make changes if necessary. Participate in discussions about AI ethics. There are many online and in-person communities where you can discuss the ethical implications of AI with other people. Advocate for ethical AI. Speak up when you see AI being used in a way that you believe is unethical. Support organizations that are working to promote ethical AI. 1.4 The AI Chatbots Humans have been interacting with AI chatbots for years. In fact, Alan Turing is credited with coming up with the concept for chatbots as early as 1950. Chatbots are software-based systems that interact with humans typically by text or speech inputs, rather than code. They mimic some human activity (“Chatbot” 2023; Abdulla et al. 2022) based on these language inputs. They process the inputs using natural language processing commonly abbreviated as NLP. NLP is a kind of AI that uses human text or speech and parses the language to determine structures and patterns to extract meaning. NLP uses large amounts of language data (such as books, websites etc.) to train AI systems to identify these structures and patterns. For example, the AI model might identify when a sentence is a question or a statement by examining various features in a prompt such as the inclusion of a question mark of the use of words often used in questions (“Natural Language Processing” 2023; Cahn 2017). The methods used for chatbots have evolved over time. Now chatbots often utilize AI methods like deep learning (which involve multiple layers of abstractions of the input data (“Deep Learning” 2023)) to extract meaning from the language data (“Natural Language Processing” 2023). As these methods use large quantities of text, they are therefore often called large language models (“Large Language Model” 2023). Despite the fact that chatbots have been around awhile, the popularity of OpenAI’s ChatGPT and DALL-E programs has sparked a recent surge of interest. These chatbots are in part particularly powerful due to the fact that large amounts of computing power were used to train their NLP models on very large datasets (Caldarini, Jaf, and McGarry 2022; Cahn 2017). Large language model AIs can be divided into two categories: those that can be reached using an internet browser, and those that can be reached using an integrated development environment (IDE). This is not a comprehensive list! Browser-based chatbots Bard is Google’s large language model, also known as a conversational AI or chatbot trained to be informative and comprehensive. It is trained on a massive amount of text data and is able to communicate and generate human-like text in response to a wide range of prompts and questions. You will need to join the waiting list before getting access, although in our experience the wait time is short. ChatGPT is OpenAI’s large language model based on the GPT (Generative Pre-trained Transformer) architecture. It is designed to understand and generate human-like responses to text-based conversations. You will need to create an account before using it. Phind is a AI-powered search engine designed specifically for developers asking technical questions. In addition to answering your coding question, it will provide links to the internet sources used to find the answer. Poe is Quora’s platform that gives you access to multiple AI chatbots, including Sage, based on OpenAI’s GPT-3.5 architecture; Claude, an AI natural language bot created by Anthropic; and ChatGPT. IDE-based chatbots CoPilot by GitHub is a language bot that interfaces with your editor. This bot provides coding suggestions and ways to speed up testing. GitHub describes it as an “AI pair programmer”. It uses a subscription model with both individual and business tiers. CodeWhisperer is the Amazon Web Services chatbot for the AWS cloud platform. It can be installed in your integrated development environment (IDE) using the latest AWS Toolkit plugin. The individual tier for CodeWhisperer is free, although you will need to create an AWS account and add a payment method. What are the data sources for these chatbots? Some high-profile English-language AIs, including Google’s T5 and Facebook’s LLaMA, were trained on more than 15 million websites (Schaul, Chen, and Tiku 2023). The top sources of training data for these AI models were https://patents.google.com/ and https://www.wikipedia.org/ ! 1.5 How to Use This Book This book is written with the expectation that users will follow along and paste the queries from each example into their own AI chatbot session. After you have finished this book, you will be able to use whichever combination of chatbot and programming environment that you’re comfortable using. 1.5.1 Choice of AI Model You can use whichever AI you like for this course, as long as it is a large language model. (Other types of AIs are not explored in this course.) We will use a variety of browser-based chatbots as examples throughout this course. Some AIs will be better suited for your particular tasks, and it is too early to judge which of the technologies will end up dominating the industry. We encourage you to test multiple AI platforms to find the ones that best fit your needs, and the use of a particular AI in each chapter should not be taken as an endorsement by us. We have focused on the browser-based chatbots for our examples in this course for ease of demonstration. 1.5.2 Computing Environment Needs All the examples and activities in this course can be done in the computer environment you prefer. None of the tasks require a huge amount of computing power, so local installations on your personal computer are fine, though everything will also translate to a high performance computing cluster or a cloud computing platform. In addition to the CodeWhisperer chatbot available on the AWS cloud platform, a variety of cloud-based AI tools and platforms exist that can be leveraged for practical projects after this course. For instance, Amazon SageMaker or Google Cloud AI Platform can be used for constructing and training machine learning models, while Microsoft Azure Cognitive Services can be applied to incorporate natural language processing features into your applications. If you’d like to learn more about how AI can be integrated with cloud computing, you can read about it in the Appendix. 1.5.3 Boxes Throughout this course, you will see several types of specially-colored boxes. In particular, there are two to which you should pay special attention. One box highlights potential ethical issues with an AI usage. In this box, you’ll find reminders of the ethical considerations you should be particularly aware of while using AI to do certain tasks. The other box highlights our queries to AI chatbots. The question we posed to the AI chatbot is written in these boxes to make it easier for you to find. Wherever possible, we use screenshots of the actual answers we got from the AI chatbots in response to our questions. Occasionally when we have asked for the AI to write or fix code, we have formatted the answer in such a way that makes it easier to use. When you see this format, you will know it indicates an AI response Code in these boxes was written by AI. 1.6 About This Book We used AI bots (including ChatGPT, Bard, Sage, and Claude) to develop and write much of this course. We firmly believe this new technology can be used in ethical ways and we put into practice all the rules and suggestions offered over the following modules while we created this book. "],["ethics-of-using-ai.html", "Chapter 2 Ethics of Using AI 2.1 Learning Objectives 2.2 Major concerns 2.3 Replacing Humans 2.4 Bias 2.5 Misinformation 2.6 Unintelligible Code 2.7 Faulty or Buggy Code 2.8 Security and Privacy issues 2.9 Violating Copyright 2.10 Harmful code 2.11 Summary", " Chapter 2 Ethics of Using AI The use of artificial intelligence (AI) and in particular, generative AI, in coding has raised a number of ethical concerns. We will highlight several current concerns, however please be aware that this is a dynamic field and the possible implications of this technology is continuing to develop. It is critical that we as a society continue to evaluate and predict what the consequences of the use of AI will be, so that we can mitigate harmful effects. 2.1 Learning Objectives In this chapter we will demonstrate how to: Describe key ethical concerns for using AI tools in software development Identify possible mitigation strategies for these major concerns Explain the potential benefits of being transparent about the use of AI tools to write code Discuss why human contributions are still important and necessary Recognize strategies for using AI tools to write code more responsibly Implement prompts to ask AI tools about responsible use throughout various coding practices 2.2 Major concerns In this chapter we will discuss the following issues that writing code with AI tools may contribute to: Replacing Humans - AI tools can help humans write code, but they are not a replacement. Bias - AI models are built on data and code that were created by biased humans, this bias can be further perpetuated. Misinformation - fake or manipulated data used to help design algorithms could be believed to be correct and this could be further propagated. Unintelligible Code - Developers need to follow best practices with code generated by AI. Just like code generated by human developers, this includes figuring out how the code works, how it integrates with other code, as well as annotating and documenting how to use the code . Faulty or Buggy Code - Code that may not be optimal for a given situation may be inadvertently used by those with less familiarity, which may result in faulty software. Security or Privacy Issues - Code may not be optimized for security if not adequately evaluated. Generative AI models have access to large amounts of data that is currently unregulated and may include data that should be protected for privacy reasons. Copyright Violations - The code used for the generative AI model may used code that has copyright laws that require attribution or do not allow reuse and it may not be clear where the code came from. Harmful Code - Currently it is not clear how well generative AI models restrict the creation of code that will be used for goals that harm others. Note that this is an incomplete list; additional ethical concerns will become apparent as we continue to use these new technologies. We highly suggest that users of these tools be transparent about the use of these tools, so that as new ethical issues emerge, we will be better prepared to understand the implications for specific coding projects. Be transparent about what AI tools you use to write code. This help others to better understand how you created your code, as well as the possible sources that the AI tools might have used when helping you write code. It may also help with future unknown issues related to the use of these tools. It is essential to address these ethical concerns and ensure that the use of AI in coding is done in a responsible and transparent manner. This could be done through ensuring the quality of the data used to train AI systems, promoting transparency in AI-generated code, and implementing safeguards against the creation of harmful or biased code. By doing so, we can harness the potential of AI to improve and transform the way we write and optimize code while maintaining ethical standards. 2.3 Replacing Humans Those who use AI tools to write code or to understand code need to recognize their own value in the process. While AI systems are useful, they do not replace the strengths that humans have for innovating new ways to write code, evaluating how the code integrates into the larger picture of a project, or in evaluating the downstream consequences of the code. Computer science is a field that has historically lacked diversity and new learners can often feel intimidated. There is the potential that new learners may feel even more discouraged as they learn to write code when witnessing AI tools write code. It is critical that we support diverse new learners of computer science, as we will continue to need human involvement in the development and use of AI tools. 2.3.1 Tips for supporting human code Follow best teaching practices for inclusion of diverse learners. Encourage current and future programmers to continue to innovate and write code. Avoid thinking that code written by computers must be better than code written by humans, as this simply is not true. Recall that humans first wrote they code that the AI tools use to write code. Be transparent about when you do or do not use AI tools, give credit to the humans who write code where possible. A new term in the medical field called AI paternalism describes the concept that doctors (and others) may trust AI over their own judgment or the experiences of the patients they treat. This has already been shown to be a problem with earlier AI systems intended to help distinguish patient groups. Not all humans will necessarily fit the expectations of the AI model if it is not very good at predicting edge cases (Hamzelou n.d.). Therefore, in all fields it is important for us to not forget our value as humans in our understanding of the world. 2.4 Bias One of the biggest concerns is the potential for AI to create biased code. AI systems are trained on data created by humans. If this data used to train the system is biased (and this includes existing code that may be written in a biased manner), the resulting code could also be biased. This could lead to discrimination, abuse, or neglect for certain groups of people, such as those with certain ethnic or cultural backgrounds, genders, ages, sexuality, capabilities, religions or other group affiliations. It is well known that data and code are often biased (Belenguer 2022). It is important that evaluations be made throughout the software development process to check for and consider potential perpetuation of bias. 2.4.1 Tips for avoiding bias Be aware of the potential biases in the data that is used to train AI systems. Check for possible biases within the data. Are there harmful data values? Examples could include discriminatory and false associations. Are the data adequately inclusive? Examples could include a lack of data about certain ethnic or gender groups or disabled individuals, which could result in code that does not adequately consider these groups, ignores them all together, or makes false associations. Are the data of high enough quality? Examples could include data that is false about certain individuals. Evaluate the code for biases as it is developed. Check if any of the criteria for weighting certain data values over others are rooted in bias. Consider the possible outcomes of the use of the code. Consider if the code could possibly be used in a manner that will result in discrimination. See Belenguer (2022) for more guidance. 2.5 Misinformation AI tools use data that may contain false information. AI tools may also report data as if it is real, when it is in fact not real. For example, currently at the time of the writing of this course, ChatGPT will report citations with links that are not correct. 2.5.1 Tips for reducing misinformation Be aware that some AI tools currently make up false information based on artifacts of the algorithm. Do not assume that everything that the algorithm produces is real or correct. 2.6 Unintelligible Code There is risk that those less aware of best coding practices use AI-generated code and do not follow these practices. This could make it difficult for others to understand how the code works and could make it hard to identify and fix any issues that may arise. This could result in negative consequences, such as system crashes or security breaches, that could have been avoided if the code had been written by an experienced and savvy human programmer. 2.6.1 Tips for avoiding unintelligible code Code should be reviewed by experienced programmers. Code should be annotated throughout to explain what the code is doing. Documentation should be created that describes how to use the code properly. Ask AI tools to help you understand the code, but get expert assistance where needed. Can you explain what the code in line 4 is doing? 2.7 Faulty or Buggy Code There is a risk that code written with AI tools, if not reviewed carefully enough, may be faulty. AI systems may not be trained on data that relates to current software dependencies or best practices. It is also important to remember that code generated by AI tools is not necessarily better than code written by humans. It requires just as much code review. 2.7.1 Tips for reducing faulty or buggy code Do not assume that the code generate by AI is correct. Realize that AI is only as good or up-to-date as what it was trained on, the code may be generated using out-of-date code. Look up packages and functions used to ensure if the code is up-to-date. Make sure that you understand the code that you are using. AI can be used to help you understand what the code is doing, but consult with experts when needed. Ask the AI tools for extra information about if there are any potential limitations or weaknesses in the code, but keep in mind that the tool may not be aware of issues and therefore human review is required. The information provided by the tool can however be a helpful starting point. Are there any limitations associated with this code? What assumptions were made in writing this code? Stack Overflow, a popular community-based website where programmers help one another, has (at the time of writing this) temporarily banned users from answering questions with AI-generated code. This is because users were posting incorrect answers to questions. It is important to follow this policy (as you may face removal from the community). This policy goes to show that you really need to check the code that you get from AI models. While they are currently helpful tools, they do not know everything. 2.8 Security and Privacy issues AI tools are not always trained in a way that is particularly conscious of data security. Furthermore, if the code is written using these tools by users who are less familiar with coding security concerns, protected data or important passwords may be leaked within the code itself. AI systems may also utilize data that was actually intended to be private. It is also important to consider what data your code might actually be using. 2.8.1 Tips for reducing security and privacy issues Check that all passwords, access tokens (like API keys), security certificates are not saved in a public place where anyone can access or tamper with them. Check that no sensitive data, such as Personal Identifiable Information (PII) becomes public through the code. Utilize encryption and other security practices where needed. Consult with an expert about data security if you think your code could possibly cause someone to access protected data who is not authorized to access it. Promote for regulation of AI tools by voting for such standards where possible. Ask AI tools for help, but to not rely on them alone. Are there any security or privacy concerns associated with this code? 2.9 Violating Copyright When AI systems are trained on data, they may also learn and incorporate code from that data. This means that AI-generated code could potentially infringe on the copyright of the original author of the code. For example, if an AI system is trained on a GitHub repository that contains code written by a human programmer, the AI system could generate code that is identical to or similar to the code in the GitHub repository. If the AI system then uses this code without permission from the original author, this could constitute copyright infringement. In general, we want programmers to feel comfortable sharing their code openly without fear they won’t be credited. Similarly, AI systems could potentially infringe on intellectual property rights by using code that is protected by trademarks or patents. For example, if an AI system is trained on a training manual that contains code that is protected by a trademark, the AI system could generate code that is identical to or similar to the code in the training manual. If the AI system then uses this code without permission from the trademark owner, this could constitute trademark infringement. 2.9.1 Tips for avoiding copyright violations Be transparent about what AI tools you use to write your code. Obtain permission from the copyright holders of any code that you use to train the AI system. Only use code that is in the public domain or that has been licensed for use by the AI system’s owner. Cite any GitHub repositories or training manuals you might use in your code. Ask the AI tools if the code it helped generate used any code that you can cite. Did this code use any code from others that I can cite? 2.10 Harmful code Another major concern is the use of AI to generate malicious code. For instance, AI could be used to create code that spreads malware or hacks into computer systems. This could cause severe damage to individuals and organizations, including data breaches and financial losses. 2.10.1 Tips for avoiding the creation of harmful code Be careful about what code you share publicly, as it could be used for malicious purposes. Consider how the code might be used by others. Ask the AI tools to help you, but do not rely on them alone. What are the possible downstream uses of this code? What are some possible negative consequences of using this code? 2.11 Summary Here is a summary of all the tips we suggested: Disclose when you use AI tools to write code. Credit human authors by citing their code and adhering to copyright restrictions. Ensure the code doesn’t expose sensitive data, such as passwords or PII. Don’t assume AI-generated content is real, accurate, or current. Ask the AI tools to help you understand: Sources for the code that you can cite What the code is doing Code limitations Potential security or privacy issues Potential downstream consequences of the code Always have expert humans review the code and value your own contributions and thoughts. Overall, we hope that these guidelines and tips will help us all to use AI tools more responsibly for writing code. We recognize however, that as this is emerging technology and more ethical issues will emerge as we continue to use these tools in new ways. AI tools can even help us to use them more responsibly when we ask the right additional questions when writing code, but remember that human review is always necessary. Staying up-to-date on the current ethical considerations will also help us all continue to use AI responsibly. "],["writing-code.html", "Chapter 3 Writing Code 3.1 Learning Objectives 3.2 Coding Basics 3.3 Writing Code with AI 3.4 Tips for Coding with AI 3.5 Example One: Creating a Function 3.6 Example Two: Debugging Code 3.7 Example Three: Comparing Syntax 3.8 Example Four: Figuring Out a Common Task 3.9 Example Five: Planning Your Program 3.10 Example Six: Selecting a Coding Language 3.11 Hands On Exercise 3.12 Summary", " Chapter 3 Writing Code 3.1 Learning Objectives Recognize the benefits and capabilities of AI-powered programming tools, particularly for certain kinds of tasks that are difficult for humans Explain how AI-generated code and automated programming tools contribute to making programming more accessible to individuals with limited coding experience or to those working in a new language Explore the ethical considerations associated with using AI in programming, including the importance of rigorous testing before publishing code Apply strategies for using AI to build functions, debug code, understand error messages, check syntax, choose the proper programming language, and plan out a multi-step programming project 3.2 Coding Basics In today’s digitally-driven world, coding has become an essential skill. It is used to create websites, mobile applications, and sophisticated software systems. Contrary to popular belief, coding is not only for those who possess an innate talent for programming. With the right resources and a willingness to learn, anyone can become proficient in coding. Practice is crucial to mastering the art of coding, and those who are willing to commit themselves to the learning process can achieve great results. Writing code can also be a rewarding and fulfilling hobby, too. Creating your own software, building a website, or automating a task can be immensely satisfying, and can provide a sense of accomplishment and pride. Moreover, writing code can be a form of creative expression. Just as musicians use notes to compose music and artists use paint to create visual art, programmers use code to create digital experiences. From building websites to creating video games, code can be used to bring ideas to life in exciting and innovative ways. Ultimately, the ability to write code is a valuable asset in today’s world, with increasing demand for skilled programmers in a wide range of industries. Whether as a career or hobby, coding can be both personally and professionally rewarding. The accessibility and versatility of coding make it an excellent skill for anyone to learn, regardless of their background or previous experience. 3.3 Writing Code with AI AI-powered programming tools and technologies are revolutionizing the way we approach software development. AI can generate code snippets. An AI-powered code editor can suggest more efficient algorithms or highlight potential errors in real-time. It can also help developers to reproduce bugs more easily and to test potential fixes more quickly. This can save developers a significant amount of time and effort, and it can help them to debug their code more effectively. Be aware that AI still makes a lot of mistakes when writing code, so you will need to be particularly careful in testing code it writes. AI can make programming more accessible. With AI-generated code and automated programming tools, individuals who are not experienced developers can still create software solutions. Experienced developers can also more easily write code in languages with which they aren’t familiar. This has the potential to democratize programming and lead to new innovations from a wider range of people. Can complete novices learn how to program using AI tools? At present, it is very challenging for complete novices to rely on AI chatbots to learn how to write code. These tools will sometimes write buggy code or code that doesn’t not work as intended, and a person with no programming experience will have difficulty learning how to spot these sorts of mistakes. AI chatbots are best thought of as a supplement to your software development education, not as a replacement, and they should be used alongside other resources. Therefore, we advise that you seek expert review and assistance. As AI tools are refined, complete novices may be able to create software products more readily on their own. AI is changing the skills required for writing code. Rather than simply memorizing syntax, developers need to focus on developing their creativity, intuition, and problem-solving skills. Additionally, programmers must also hone their abilities in architecture design and project management, as these skills are becoming increasingly important in the modern software development landscape. As AI continues to evolve, it is likely to have an even greater impact on the way we develop software in the future. As a programmer using AI, it is up to you to be responsible for what you create. You must rigorously test any code you write. It is your job to make sure any code you create with AI is not malicious and works as expected. 3.4 Tips for Coding with AI Using AI to write code is as much of an art as writing your own code. Following a few rules and suggestions will make your experience much more enjoyable and productive. Remember that AI cannot read your mind. You need to tell it what you’re thinking, and it may take several rounds of question-and-answer before you get something you can work with. Be clear about your goals. What do you want the AI to do? Be as specific as possible. Start with a simple task. Don’t try to do too much too soon. Start with a simple task and then gradually work your way up to more complex tasks. You wouldn’t write a complete program all at once, and you shouldn’t have AI do it, either. Provide enough data. The more data (and detail) you can give the AI, the better it will be able to learn and perform the task you want it to do. Be patient. Querying an AI can take time. Don’t expect it to be perfect right away. Test everything AI writes. You are responsible for the code that AI generates, even if you didn’t write it yourself. AI can be biased, just like humans, and this could lead to sub optimal development. There is a concern that AI may focus development on areas that optimize certain metrics but not overall quality, effectiveness, or user needs. Human judgment is still needed to ensure that AI is used in a responsible and ethical way. Test your results. Make sure the AI is actually doing what you want it to do. AI systems are trained on data, and if the data is not representative of the real world, the AI system may not be able to generate code that works correctly. It is important to test the code to make sure that it is working as intended and that it is producing the desired results. Inadequate testing could lead to low quality, buggy code. Since AI generated code would be highly automated, it requires strong testing procedures and safety oversight to ensure it meets standards before deployment. Make sure your code is secure. AI systems can be used to generate code that is vulnerable to attack, and it is important to test the code to make sure that it is secure. This can help to prevent security breaches from occurring. Use a variety of AI models. There are many different AI models available. Experiment with different models to see which one works best for your task. Get feedback from others. Ask other people to review your code and give you feedback. This can help you identify and fix any problems with your code. 3.5 Example One: Creating a Function One of the most common things a programmer does is write functions to automate tedious tasks. With proper guidance, AI can speed this process up. Perhaps you need to write a quick function that reverses all the letters in a string. We can query Phind for help. How do I write a function that reverses the letters in a string? To reverse a string in Bash, there are multiple approaches. One way to reverse a string is by using the rev command. According to StackOverflow, the rev command is installed on most Linux systems by default. To use the rev command, simply enter rev followed by the string you want to reverse. For example: $ echo "12345" | rev However, it is important to note that the rev command is not present in all flavors of Unix. Another way to reverse a string is by using a simple Bash script. According to StackOverflow, we can write a Bash script that reverses a string using a for loop. Here is an example script: var="12345" copy=\\${var} len=${#copy} for((i=$len-1;i>=0;i--)); do rev="$rev\\${copy:$i:1}"; done echo "var: $var, rev: $rev" This script takes the string “12345” and stores it in the variable var. It then creates a copy of the string and stores it in the variable copy. The length of the string is stored in the variable len. The for loop starts at the end of the string and iterates through each character, adding it to the variable rev. Finally, the script prints the original string and the reversed string. Another approach to reversing a string is by using the tac command. According to StackOverflow, we can use the tac command to reverse the contents of a file or the standard input. Here is an example command: $ echo "12345" | sed 's/./&\\n/g' | tac | sed -e :a -e 'N;s/\\n//g;ta' This command uses the sed command to insert a newline character after each character in the string. It then passes the output to the tac command, which reverses the order of the lines. Finally, another sed command is used to remove the newline characters and print the reversed string. Overall, there are multiple approaches to reversing a string in Bash. The rev command, a simple Bash script with a for loop, and the tac command are all viable options. Phind offers you a variety of ways to do this, but all these options are in the language Bash. Because we didn’t include a programming language in our query, Phind picked one for us. Let’s refine our query a little. How do I write a function using Python that reverses the letters in a string? To write a function using Python that reverses the letters in a string, there are several approaches that can be taken. One approach involves using a for loop and the concatenation operator to join the original string in reverse order. This technique is demonstrated in realpython.com as follows: def reverse_string(text): result = "" for char in text: result = char + result return result print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and initializes an empty string result. The for loop iterates over each character in the input string, concatenating it with the current content of result and reassigning the new intermediate string to result at each iteration. At the end of the loop, result holds a new string as a reversed copy of the original one. Another approach involves using slicing to reverse the string. This technique is demonstrated in stackoverflow.com as follows: def reverse_string(text): return text[::-1] print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and returns the string in reverse order using slicing. The syntax text [::-1] means to slice the entire string with a step of -1, which reverses the order of the string. A third approach involves using Python’s built-in reversed() function to reverse the string. This technique is demonstrated in datagy.io as follows: def reverse_string(text): return ''.join(reversed(text)) print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and uses the reversed() function to return an iterator that produces the characters of the string in reverse order. The join() method is then used to convert the iterator back into a string. All three approaches produce the same output, but they differ in terms of performance and readability. The first approach using a for loop and concatenation is the most straightforward, but it can be slower for large strings because it creates successive intermediate strings only to throw them away in the next iteration. The second approach using slicing is more efficient because it creates a new string object only once, but it may be less readable for some programmers. The third approach using reversed() is concise and readable, but it may be slower for large strings because it creates a reversed iterator that must be converted back into a string using join(). Once again, Phind has come through with multiple options. Now let’s say you knew you wanted to write a function like this, but you realize it’s only the strings in the third column of your file. Let’s add that requirement to our query. “How do I write a function using python that reverses the letters in a string for the third column of my file?” To write a function using Python that reverses the letters in a string for the third column of a file, you can use the extended slice syntax in Python. The extended slice syntax is a more concise and faster way of slicing strings in Python. To reverse a string using extended slices, you can use the following syntax: string[::-1] In this syntax, the first colon indicates the start of the slice, the second colon indicates the end of the slice, and the third colon indicates the step size of the slice. By setting the step size to -1, you can reverse the string. To create a function that reverses the letters in a string for the third column of a file, you can use the following code: def reverse_string(string): return string[:2] + string[2:5][::-1] + string[5:] In this code, the reverse_string() function takes a string as input and returns the string with its third column reversed. The first two characters of the string are returned as-is, while the third column (characters 3 to 5) are reversed using extended slices. Finally, the remaining characters of the string are returned as-is. There are other ways to reverse a string in Python, including using loops, recursion, stacks, and function calls. However, using extended slices is the most concise and efficient way to reverse a string in Python. Here are some pros and cons of using extended slices to reverse a string: Pros: Concise syntax: using the extended slice syntax is a one-liner that is easy to read and write. Fast execution: using the extended slice syntax is faster than using loops or other methods to reverse a string. Cons: Limited functionality: the extended slice syntax can only be used to reverse a string, and cannot be used for more complex string operations. Not beginner-friendly: the extended slice syntax is not intuitive for beginners who are not familiar with Python’s slicing syntax. In conclusion, to write a function using Python that reverses the letters in a string for the third column of a file, you can use the extended slice syntax in Python. This syntax is concise and efficient, but may not be beginner-friendly and may not be suitable for more complex string operations. 3.6 Example Two: Debugging Code A vast amount of time in programming is spent on debugging code. Often the compiler error messages are very precise about what has gone wrong while simultaneously lacking enough detail for the programmer to immediately understand how to fix the error. It is good practice to debug code as you go, instead of writing the entire program and then testing to identify the errors. Using an AI chatbot makes this task much, much easier. There are two options for using ChatGPT for debugging. First, we could query what the error code means. Here’s a Python code snippet that is throwing a TypeError: unsupported operand type(s) for +: 'int' and 'str' error when we try running it. def add_numbers(a, b): result = a + b return result number1 = 10 number2 = "20" sum = add_numbers(number1, number2) print("The sum of", number1, "and", number2, "is", sum) What does this error mean? TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ This error typically occurs when you try to concatenate (i.e., add together) a string and an integer using the “+” operator in Python. In Python, the “+” operator is used for both addition and concatenation depending on the data types of the operands. If you try to add a string and an integer using the “+” operator, Python will raise a TypeError because these two data types are not compatible for this operation. For example, if you have the following code: age = 25 message = "I am " + age + " years old." Python will raise the TypeError because you are trying to concatenate a string (“I am”) with an integer (25) using the “+” operator. To fix this error, you can convert the integer to a string using the str() function: age = 25 message = "I am " + str(age) + " years old." In this case, the str() function converts the integer age to a string before concatenating it with the other string, so the operation is valid and no error will be raised. ChatGPT helpfully explains what TypeError means, what causes it, and how to fix it. This is quite useful when you don’t understand the error message. Another option is to submit the code snippet that is causing an error to ChatGPT directly and ask for it to fix the mistake. Here’s another buggy code snippet, this time in C#. Can you debug this code? using System; class Program { static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; int sum = 0; for (int i = 1; i <= numbers.Length; i++) { sum += numbers[i]; } Console.WriteLine("The sum of the numbers is: " + sum); } } Sure, I can help you debug this code. Here are the issues I see: The loop is going out of bounds: The loop is iterating from 1 to numbers.Length, but array indexes start from 0. Therefore, when i is equal to numbers.Length, numbers[i] is trying to access an element outside the bounds of the array, which will result in an IndexOutOfRangeException. To fix this, you should change the loop condition to i < numbers.Length. The loop is not summing the array elements correctly: The loop is adding the elements starting from the second element instead of the first. To fix this, you should change the initial value of i to 0, which corresponds to the first element of the array. Here’s the corrected code: using System; class Program { static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; int sum = 0; for (int i = 0; i < numbers.Length; i++) { sum += numbers[i]; } Console.WriteLine("The sum of the numbers is: " + sum); } } This should correctly sum the elements of the numbers array and output the result. Be aware that if you choose to submit your code directly to an AI chatbot to debug that you submit a snippet at a time (if possible). Otherwise the answer can get quite unwieldy! 3.7 Example Three: Comparing Syntax You may be in the middle of writing code when you realize that you’ve used two possible syntaxes for the same command. Perhaps you are using the R package here and are wondering if two different ways of writing a command are the same. Is here::here(\"raw\", \"data.csv\") equivalent to here::here(\"raw/data.csv\")? First, let’s see what ChatGPT responded. When we first started putting together this course, we had intended to include an answer from Bard that disagreed with the answer from ChatGPT as an example of why it can be helpful to query multiple chatbots. (We decided ChatGPT was correct after verifying its answer in the here package documentation.) However, when we queried Bard again two weeks later, we were pleasantly surprised to discover that Bard had corrected its answer. Now it’s a cool little example of how the chatbots are rapidly improving and “learning” from their mistakes. 3.8 Example Four: Figuring Out a Common Task Sometimes you have a task that needs done that is fairly routine. You might not have done it before, but plenty of people in the world have. In this case, you don’t want to reinvent the wheel, but you may not know exactly where to start. AI is a great option for figuring out the basic workflow steps. A very common task for anyone working with genomic samples is to combine multiple files in the vcf format. Perhaps you’ve been asked to do this and then create a separate file that contains the names of the samples. You turn to ChatGPT for help. Can you write a program that merges vcf files and then outputs the sample names? Great! Of course, maybe you’re not comfortable using bcftools, or you try this and can’t get it to work. You can take advantage of the “Regenerate Response” option in ChatGPT to get another solution. What’s another way I can do this? You can also specify some of the features you’d like in your code, or where you might want the code to come from. Maybe you want to practice using GitHub repositories, so you specifically request it. Can you write a program that merges vcf files and then outputs the sample names using a github repo? If you know you’ve used something like a GitHub repository, you can ask ChatGPT for the citation. Just be aware that you need to verify that any citation it gives you should be checked independently. Unfortunately, AI bots can still respond with imaginary journal articles. (Assume that if you can’t find it, it doesn’t exist.) What’s the citation for the repo used in this code? In general, after you find a solution that works for you, you should always make a habit of asking the AI where it got the code. Never, ever, ever run code without knowing where it came from. What’s the source for this code? You should always take care that you are only using code that you’re authorized to use when writing code. This means asking the AI chatbot where code snippets are from and tracking down those citations and authorizations yourself (instead of just trusting the AI that everything is okay). 3.9 Example Five: Planning Your Program Let’s say we want to create software that plays the card game blackjack. You can jump right in and ask your AI chatbot to write the code, but you’re unlikely to be successful and incredibly likely to get frustrated. Before you start interacting with the AI, you need to plan out what you want to do. Everyone needs a plan of attack when building software. You should start by identifying what your software will do, then you can figure out the steps necessary to make that happen. We’ll ask Claude-instant (as implemented by Poe) how we can go about creating the necessary code for our game. How would I go about writing a program that can play blackjack? That seems like a really good roadmap for building a basic game, but if you’re ambitious (and of course you are), you might want to give your game a little extra something. Claude-instant has some ideas for that, too. What are some other features I could add to this game? At this point, you are ready to begin writing your program. You have a lot of tasks to do, so you have to pick a logical starting point. If you’re uncertain, you can ask AI for advice on your first task. What should be my first coding task for this program? In this case, the AI went beyond just suggesting a first task and also offered several options for how to do it as well. 3.10 Example Six: Selecting a Coding Language You will need to choose the language for your software. If you don’t, AI will likely pick a language for you, which may or may not be one you want. You might choose a language based on: Your preexisting knowledge or experience with the language A specific use case where the language is commonly used The language(s) your colleagues or coworkers use You can find a description of other languages you might encounter here. Let’s ask Claude-instant again for some recommendations on the appropriate languages for our proposed blackjack game from the above example. (Pro tip: the various AI bots all keep track of your previous queries, so you don’t have to restate your goal for the software if you’re continuing the conversation.) What would be a good coding language to create this game of blackjack? Claude-instant actually gave us more information than we anticipated. If it hadn’t stated pros and cons while offering language suggestions, we could ask for them directly. This could be helpful if you’re deciding between two options like, say, Python or Java. What are the pros and cons of using Python vs Java for this project? 3.11 Hands On Exercise Now it’s your turn to try! 3.11.1 Code Here’s the code you need for question #2. def calculate_average(numbers): total = 0 for number in numbers: total += number average = total / len(numbers) return average numbers = [1, 2, 3, 4, "5"] average = calculate_average(numbers) print("The average of the numbers is:", average) 3.11.2 Questions Write a prompt to create a function that replaces all instances of the string “three” with the number 3, then create a prompt that allows you to modify the function so that “three”, “Three”, and “THREE” are all replaced with the number 3. Write a query that helps you debug the code snippet from above. Create a query that explains how to retrieve data from an online database. Don’t forget to find out what the source of the code is. Write a prompt to plan out a program that creates and plays a game of Rock, Paper, Scissors. You should create a multi-step plan as well as figure out what your first coding task should be. Create a prompt that identifies the best coding language for the above game. 3.12 Summary Coding has become an essential skill in today’s world. AI can increase the efficiency of planning, writing, and debugging code, as well as make coding more accessible for beginners. Querying AI on code writing tasks requires patience. AI cannot read your mind, and users need to be both specific and patient when asking for coding help. It is essential to test all AI-written code while in development, since inadequate testing could lead to low quality, buggy code. A programmer is responsible for what they create while coding with AI, even if AI writes the actual code. devtools::session_info() ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## curl 4.3 2019-12-02 [1] RSPM (R 4.0.3) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## highr 0.8 2019-03-20 [1] RSPM (R 4.0.3) ## hms 0.5.3 2020-01-08 [1] RSPM (R 4.0.0) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## httr 1.4.2 2020-07-20 [1] RSPM (R 4.0.3) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.0.2) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## ottrpal 1.0.1 2023-03-28 [1] Github (jhudsl/ottrpal@151e412) ## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.3) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## readr 1.4.0 2020-10-05 [1] RSPM (R 4.0.2) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.0.2) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.3) ## vctrs 0.6.1 2023-03-22 [1] CRAN (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["refactoring-code.html", "Chapter 4 Refactoring Code 4.1 Learning Objectives 4.2 Refactoring Basics 4.3 AI in Code Refactoring 4.4 Example One: Correcting Syntax 4.5 Example Two: Styling and Convention 4.6 Example Three: Staying DRY 4.7 Example Four: Keeping Code Alive 4.8 Example Five: Making Code Readable 4.9 Example Six: Keep it Brief 4.10 Code optimization 4.11 Challenges and Limitations 4.12 Hands-On Exercise 4.13 Summary", " Chapter 4 Refactoring Code 4.1 Learning Objectives Describe how refactoring code involves optimization for maintainability, efficiency, and reuse Explain why refactoring code is important for developers in the longterm Recognize the benefits and limitations of using AI tools to refactor code, as well as why AI tools are uniquely poised to be beneficial Implement prompt strategies that can be used to assist with refactoring code for correcting syntax, for adopting more consistent styling, for making code more concise, for making code easier to maintain, and for making code more efficient 4.2 Refactoring Basics Code refactoring is the process of improving the quality of underlying code without changing its functionality. In other words, it’s a way of cleaning up and optimizing code so that it’s easier to maintain and more efficient. This often involves making small changes to the code, such as renaming variables or functions, reorganizing code blocks, or simplifying complex expressions. Refactoring is an essential practice in software development and helps to ensure that the codebase remains manageable and adaptable as requirements and business needs change over time. Code refactoring helps to reduce technical debt, which is the accumulation of development work that needs to be done in the future as a result of taking shortcuts or using less than optimal solutions. Refactoring can help to identify potential issues and bugs before they cause problems, resulting in more stable software. Finally, refactoring code to be more readable and less verbose can create fewer headaches for you in the future. To understand why code refactoring is important, imagine trying to cook in a disorganized and cluttered kitchen. You might be a fantastic cook, but you are spending more time searching for utensils and ingredients, and the quality of the meal could suffer as a result. Similarly, code that is disorganized and cluttered can be difficult to work with and can result in lower-quality software. Refactoring is like cleaning and organizing the kitchen - it makes the process of cooking (or coding) smoother and more efficient. 4.3 AI in Code Refactoring Code refactoring has historically been done manually by developers. This involves reviewing code and identifying areas that could be improved or optimized, and then making changes to the codebase accordingly. Though important, this is process is time-consuming and labor-intensive, as it requires developers to carefully review every line of code to identify potential issues or areas for improvement. Additionally, manual code refactoring is error-prone, as developers can accidentally introduce bugs or errors into the codebase while making changes. However, AI has significant potential to help with code refactoring. AI can use machine learning algorithms to analyze large amounts of code and identify patterns or areas that could be improved. For example, they can identify sections of code that are redundant, overly complex, or difficult to maintain, and suggest changes that could be made to improve the codebase. Machine learning algorithms can also help to identify potential bugs or security issues in the codebase, which can help to improve the overall quality and stability of the software. AI refactoring is also faster and more accurate than manual refactoring. This is particularly useful for large-scale software projects with massive codebases, where manual code review and refactoring can be an enormous task. In the next sections, we’ll take a look at some examples of using AI to refactor code. 4.4 Example One: Correcting Syntax Programming languages operate using their established set of rules. For example, Python uses indentation to define code blocks. However, when you shift between development environments, indentation and line breaks can sometimes be affected, causing major headaches! Let’s say we run the following code: def calculate_sum(a,b): result = a + b return result def calculate_product(a,b):result = a * b return result def main(): a=5 b=6 sum_result = calculate_sum(a, b) print("Sum:", sum_result) product_result = calculate_product(a,b) print("Product:", product_result) if __name__ == '__main__': main() ## unexpected indent (<string>, line 3) We get the error above because our indentation is off. Let’s ask ChatGPT to clean things up. Can you assist me with correcting the formatting and indentation issues in my Python code? Of course! Here is the code after correcting the formatting and indentation: def calculate_sum(a, b): result = a + b return result def calculate_product(a, b): result = a * b return result def main(): a = 5 b = 6 sum_result = calculate_sum(a, b) print("Sum:", sum_result) product_result = calculate_product(a, b) print("Product:", product_result) if __name__ == '__main__': main() ## Sum: 11 ## Product: 30 Much better! This can be quite handy when you can’t immediately see what is wrong with the formatting or if you are working with a large codebase. 4.5 Example Two: Styling and Convention Sometimes programming languages have more flexible rules where there are multiple ways to take the same or almost the same action. For example, in the R programming language, there are several ways to perform variable assignment. However, is is generally accepted among R programmers that the <- operator should be used. Single and double quotes can be used for character types interchangeably, but it’s generally a good idea to stick with one or the other. 4.5.1 Commonly Accepted Convention Let’s say we have the following code: a <- "apple" b = 'banana' "carrot" -> c c(a, b, c) ## [1] "apple" "banana" "carrot" This code does not produce any errors, but it doesn’t follow typical R convention. Let’s ask ChatGPT to clean things up. Can you help me reformat my R code to follow accepted style conventions? Sure, here’s the cleaned-up R code: a <- "apple" b <- "banana" c <- "carrot" Much better! This code will now look more familiar to other R programmers. 4.5.2 Visual Styling Some languages are flexible about line breaks, indentation, and spacing among code blocks. If you’re rapidly developing, things can get messy pretty quickly. Many development environments, for example RStudio and PyCharm, have the ability to format your code for you without changing any of the code itself. However, you can also get AI to do this according to your own preferences. d <- c(rep(a,5),rep(b,5),rep(c,5),paste(a,b,c),paste(c,b,a)) This code is pretty hard to read. Let’s see if AI can do better. Can you space out this R code to make it more readable? Sure! Here’s the same code with added spacing for improved readability: d <- c(rep(a, 5), rep(b, 5), rep(c, 5), paste(a, b, c), paste(c, b, a)) Better! It’s easier to interpret because only one action is being taken on each step. By spacing out the code and breaking it into multiple lines, it becomes easier for the human eye to scan for structure, logic, errors, and/or inconsistencies. 4.6 Example Three: Staying DRY The DRY (Don’t Repeat Yourself) programming tenet is essential to good software. By avoiding repetition in code, we can reduce the amount of duplicate code we need to write and maintain. If we need to change the functionality of a certain piece of code, we have to make the same change in multiple places, which can be time-consuming and error-prone. Let’s take the following Python code: def print_greetings(): print("Hello, Alice!") print("Hello, Bob!") print("Hello, Carol!") print("Hello, David!") print("Hello, Eve!") print_greetings() ## Hello, Alice! ## Hello, Bob! ## Hello, Carol! ## Hello, David! ## Hello, Eve! Notice how repetitive this code is? print() and the string \"Hello, \" appear five times. We can improve this! Could you please refactor my Python code to make it more DRY? Sure, here’s a refactored version of your code: def print_greeting(name): print(f"Hello, {name}!") def print_greetings(): names = ["Alice", "Bob", "Carol", "David", "Eve"] for name in names: print_greeting(name) print_greetings() ## Hello, Alice! ## Hello, Bob! ## Hello, Carol! ## Hello, David! ## Hello, Eve! Now let’s imagine your software lead has asked us to change the greeting to Spanish. Notice how we only have to change the second line of code: def print_greeting(name): print(f"¡Hola, {name}!") def print_greetings(): names = ["Alice", "Bob", "Carol", "David", "Eve"] for name in names: print_greeting(name) print_greetings() ## ¡Hola, Alice! ## ¡Hola, Bob! ## ¡Hola, Carol! ## ¡Hola, David! ## ¡Hola, Eve! Much easier. 4.7 Example Four: Keeping Code Alive During software development, code is often changing rapidly. It’s common to end up with functions or variables you don’t need anymore. It’s best practice to remove “dead” code from your codebase: it’s distracting and can make maintenance more challenging. Programmers should resist the urge to hang on to unused code in the expectation that they might need it one day. Version control, such as provided by git and GitHub, let you keep a record of old code without cluttering your final version. Let’s take a look at some Python code with some dead code: def default_values(): a = 5 b = 6 return a, b def calculate_sum(a, b): result = a + b return result def calculate_product(x, y): return x * y def simulate_data(): a, b = default_values() dat = calculate_sum(a, b) + calculate_sum(a, b) return dat def main(): a = 5 b = 6 a, b = default_values() sum_result = calculate_sum(a, b) print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 Some of these functions aren’t used in the final step, typically defined in python as the main() function. Let’s ask AI to remove them. I need help with eliminating unused functions in my Python script. Sure! Here’s a refactored version: def default_values(): a = 5 b = 6 return a, b def calculate_sum(a, b): result = a + b return result def main(): a = 5 b = 6 a, b = default_values() sum_result = calculate_sum(a, b) print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 Great! Now our code is much more manageable. This code only includes the necessary functions needed to run the main() function. We can go a step further! Can you help me refactor my python code to make it more concise? Certainly! Here’s a more concise version of your code: def calculate_sum(a=5, b=6): return a + b def main(): sum_result = calculate_sum() print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 In this version, the calculate_sum function is simplified to take default arguments for a and b. This means the default_values function is no longer necessary. The a and b variables are also removed from main, as they are no longer needed. Much better and easier to look at overall. 4.8 Example Five: Making Code Readable Usually, our first goal as programmers is to get the response we need from the code. Readability might be the last thing on our minds. Luckily, AI can help with this. Let’s imagine we whipped up this code pretty quickly. It is tough to read, and it could definitely be improved. for(term in c("good","bad","ugly")){ print(c(rep(term,3),paste("really",stringr::str_to_upper(term)))) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" Let’s see if AI can do better. Can you help me clean up this R code so it is more readable? Sure! Here’s a more readable version of the code: library(stringr) for(term in c("good", "bad", "ugly")) { print(c(rep(term, 3), paste("really", str_to_upper(term)))) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" I added whitespace around operators and after commas for better readability. I also loaded the stringr package explicitly using library() to make the code more self-contained. This is a good start, but not much has changed. Let’s try again. On ChatGPT, we can click “Regenerate Response”. Here’s a cleaned-up version of the R code that is more readable: library(stringr) terms <- c("good", "bad", "ugly") for (term in terms) { rep_term <- rep(term, 3) upper_term <- str_to_upper(term) really_upper_term <- paste("really", upper_term) result <- c(rep_term, really_upper_term) print(result) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" I’ve stored the repeated term and the uppercased term in separate variables to make the code more readable. I’ve also separated the construction of the “really” phrase from the uppercased term to make it clearer what’s happening. Finally, I’ve used whitespace and indentation to make the structure of the code more apparent. Better! While the code takes up a greater number of lines, it’s easier to interpret because only one action is being taken on each step. 4.9 Example Six: Keep it Brief As we learned above, following the DRY principle and removing dead code can make your code easier to interpret, maintain, and debug. However, sometimes the issue is the functions themselves. No one has perfect knowledge of everything in their programming language. AI can help us determine if there are any more efficient sets of functions that do the same thing. Here is some code that plays with the “CO2” dataset in R: library(datasets) for (type in unique(CO2$Type)) { dat_subset <- CO2[CO2$Type == type, ] for (plant in unique(dat_subset$Plant)) { dat_subset_2 <- dat_subset[dat_subset$Plant == plant, ] print(paste(dat_subset_2$Plant[1], round(mean(dat_subset_2$uptake), 1))) } } ## [1] "Qn1 33.2" ## [1] "Qn2 35.2" ## [1] "Qn3 37.6" ## [1] "Qc1 30" ## [1] "Qc2 32.7" ## [1] "Qc3 32.6" ## [1] "Mn1 26.4" ## [1] "Mn2 27.3" ## [1] "Mn3 24.1" ## [1] "Mc1 18" ## [1] "Mc2 12.1" ## [1] "Mc3 17.3" Let’s see if AI has any ideas for making it more concise. Can you make this code more concise? Here’s a more concise version using dplyr package in R: library(dplyr) CO2 %>% group_by(Type, Plant) %>% summarize(mean_uptake = mean(uptake)) ## # A tibble: 12 × 3 ## # Groups: Type [2] ## Type Plant mean_uptake ## <fct> <ord> <dbl> ## 1 Quebec Qn1 33.2 ## 2 Quebec Qn2 35.2 ## 3 Quebec Qn3 37.6 ## 4 Quebec Qc1 30.0 ## 5 Quebec Qc3 32.6 ## 6 Quebec Qc2 32.7 ## 7 Mississippi Mn3 24.1 ## 8 Mississippi Mn2 27.3 ## 9 Mississippi Mn1 26.4 ## 10 Mississippi Mc2 12.1 ## 11 Mississippi Mc3 17.3 ## 12 Mississippi Mc1 18 This code groups the CO2 dataset by Type and Plant, calculates the mean uptake for each group using summarize, and then prints the resulting data frame. The code is shorter and more concise because it uses the dplyr package, which has built-in functions for data manipulation and summarization. Refactoring the code to be more concise using dplyr makes it easier to read and understand the steps involved in the data manipulation. It also reduces the number of nested loops and intermediate variables, making the code more efficient and reducing the chance of errors. Ultimately, it is your job as a programmer to use your best judgment on the fine balance between brevity and readability, as the best solution is not always this obvious. Remember that you can regenerate the AI’s response if you want more options. 4.10 Code optimization Sometimes time and efficiency is of the essence. Loops can be slow and time consuming in many languages. Take for example the following R code that calculates the cross product between two vectors x and y using nested for loops: set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) z <- numeric(n) # Start timer start_time <- proc.time() for(i in 1:n) { for(j in 1:n) { z[i] <- z[i] + x[i]*y[j] } } # End timer proc.time() - start_time ## user system elapsed ## 12.077 0.000 12.076 What is a faster, more optimized way of running the following R code? set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) # Start timer start_time <- proc.time() z <- outer(x, y, "*") z <- rowSums(z) # End timer proc.time() - start_time ## user system elapsed ## 0.665 0.363 0.697 The outer() function performs the same calculation as the nested loop in the original code, but more efficiently. It returns a matrix of all possible combinations of x and y values, with each element of the matrix being the product of the corresponding x and y values. The rowSums() function is then used to sum the elements of each row of the matrix, which is equivalent to summing the products of x and y for each index i in the original loop. This method avoids the need for the nested loop, resulting in a faster and more efficient computation. So much faster! We can look at another option by regenerating the response: set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) z <- numeric(n) # Start timer start_time <- proc.time() z <- x %*% t(y) # End timer proc.time() - start_time ## user system elapsed ## 0.334 0.296 0.402 One optimized way to perform the same calculation is by using the %*% operator to perform matrix multiplication. This can be done by converting x and y to matrices and transposing one of them so that their dimensions align for matrix multiplication. This code should be much faster than the original implementation because it takes advantage of highly optimized matrix multiplication algorithms in R. While this second suggestion is faster, you will need to consider what aspects of the codebase are most important in each instance. For example, this code runs more quickly, but the %*% operator might be unfamiliar to some R programmers. In cases where efficiency is less important, or the data are not large, you might consider maximizing readability. 4.11 Challenges and Limitations Like humans, AI can make mistakes. Be sure to keep the following in mind as you use AI to refactor your code. 4.11.1 Complexity Refactoring is often a complex process that requires deep understanding of the code and its context. AI may not always be able to fully understand the complexity of the code and may struggle to identify the best refactoring strategy. Use a modular approach whenever possible. 4.11.2 Limited Data AI models require large amounts of data to learn from, but in the case of code refactoring, there is often limited data available. This can make it difficult for AI models to generalize to new code bases and situations, especially if you are using a more niche programming language. 4.11.3 Quality Control Automated refactoring tools that use AI may not always produce code that is of the same quality as code produced by human developers. It can be difficult to always ensure that the refactored code is maintainable, efficient, and free of bugs. You need to use your best judgment when copying and pasting AI-produced code into your codebase. You should always include unit tests in your code. Tests can help you catch bugs, including those introduced accidentally by AI. Because AI models are created by humans, they can be biased. This means they may not always identify your preferred refactorings or may prioritize certain types of refactorings over others. In some cases, this can lead to suboptimal code quality and may create technical debt over time. 4.11.4 Security When using AI to refactor code, the code itself is often sent to an external service or platform for analysis and transformation. This can raise concerns about the security of the code, especially if it contains sensitive information such as trade secrets, proprietary algorithms, or personal data. If your code is sensitive, it’s important to carefully vet any third-party AI tools or services used in the refactoring process. 4.12 Hands-On Exercise Now it’s your turn to try. 4.12.1 The Code Let’s say you are dusting off some code from your past (no judgment here). You were investigating tweets about Mr. Trash Wheel, a beloved Baltimore-based contraption that filters trash out of the waterways. Note: This code is just an example and was written strictly for educational purposes. import tweepy import pandas # Enter your API keys and access tokens here consumer_key = 'your_consumer_key' consumer_secret = "your_consumer_secret" access_token = 'your_access_token' access_token_secret = 'your_access_token_secret' # Authenticate with Twitter API auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q="Mr. Trash Wheel", tweet_mode='extended').items(100) # Create empty list to store tweet data date_data = [] location_data = [] text_data = [] def get_tweet_length(tweet): # Return the length of the tweet text return len(tweet.full_text) # Loop through each tweet and extract desired data for tweet in tweets: date_info = { 'date': tweet.created_at } date_data.append(date_info) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q="Mr. Trash Wheel", tweet_mode='extended').items(100) # Loop through each tweet and extract desired data for tweet in tweets: location_info = { 'location': tweet.user.location } location_data.append(location_info) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q='Mr. Trash Wheel', tweet_mode='extended').items(100) # Loop through each tweet and extract desired data for tweet in tweets: text_info = { 'text': tweet.full_text } text_data.append(text_info) # Combine lists into a dictionary data = {'date': date_data, 'location': location_data, 'text': text_data} # Store results in pandas dataframe df = pandas.DataFrame(data) # Print dataframe print(df) 4.12.2 Questions Create an AI prompt that fixes any formatting issues with the code that would cause it not to run. Devise an AI prompt that removes any dead code from your sample above. What gets removed? Create a prompt that makes the code less repetitive, adhering to the DRY principle. What aspect of the code was repetitive? Construct a prompt that makes the code more concise. What are some trade-offs that appear in this code between readability and brevity? 4.13 Summary Code refactoring is the process of improving code quality without changing its functionality. It is crucial in software development to maintain a manageable and adaptable codebase. Code refactoring reduces technical debt, improves code stability, and makes it easier to maintain. Examples of using AI for code refactoring include correcting syntax, adhering to styling and convention, visual styling, avoiding repetition, removing dead code, and improving both readability and speed of execution (optimization). The use of AI for code refactoring raises ethical concerns and is not perfect. It is important for the developer to consider security needs of their code, as well as test out their code. "],["annotating-your-code.html", "Chapter 5 Annotating Your Code 5.1 Learning Objectives 5.2 Annotating Code is Good Practice 5.3 Improves readability 5.4 Improves maintainability 5.5 Improves the quality 5.6 Examples of quality aiding comments 5.7 AI in Code Annotation 5.8 Ethics of using AI to annotate code 5.9 Examples on using AI for annotation 5.10 Summary", " Chapter 5 Annotating Your Code 5.1 Learning Objectives Explain the significance and benefits of code annotation and how it aids in understanding and working with code in the future. Demonstrate the ability to apply effective code annotation practices by providing clear and concise comments in code. Recognize the impact of code annotation on code maintainability. Explain how well-annotated code can facilitate collaboration among developers and ensure code consistency. Critically evaluate the use of AI in code annotation, including benefits, ethical considerations, and limitations. Explore how AI can be used to create README files, do line-by-line annotations, and offer potential code improvements. 5.2 Annotating Code is Good Practice Code annotation, also known as code commenting, is the process of adding explanatory notes to source code. These notes are used to provide context, clarify functionality, and aid in understanding for developers who may be working on the codebase in the future. Code annotation is an important practice for any developer looking to write clear, efficient, and maintainable code. There are many benefits to annotating code: Improves readability Improves maintainability Improves quality 5.3 Improves readability First, it can help to improve the readability of code. By adding comments, developers can explain the purpose of each section of code, which can make it easier for others to understand what the code is doing. This can be especially helpful for large or complex codebases, where it can be difficult to keep track of all the different components. This is particularly important in contexts where the original developer of a project may move on to something else and others are left to work on them. Annotation perhaps most often helps a developer remember things they knew about the code when they were originally writing it (annotation is helpful for future you!) If the original developer left well-annotated code, it can drastically improve the ability of others (and their future selves) to continue with the project. 5.3.1 Examples of readability aiding comments Comments that help readability clarify what the code is doing Function explanations: A comment at the beginning of a function or method can describe its purpose, parameters, and expected return values. This makes it easier for others to understand what the function does and how to use it. # This function calculates and returns the sum of two numbers (x and y) def add_numbers(x, y): return x + y Inline explanations: Use inline comments to explain what a specific line or block of code does. This can help someone reading your code to quickly understand what’s going on. # Loop through each item in the list for item in my_list: # Check if the item is greater than 10 if item > 10: # Print the item print(item) TODO comments: Use TODO comments to mark areas of your code that need further work or improvement. This can help you or others to remember to come back to a specific part of the code. # TODO: Implement error handling for this function def my_function(): pass Parameter descriptions: If a function or method has complex parameters, it can be helpful to add comments explaining what each parameter does. def my_function(parameter1, parameter2): """ Calculate the sum of two numbers. Parameters: parameter1 (int): The first number to be added. parameter2 (int): The second number to be added. Returns: int: The sum of parameter1 and parameter2. """ return parameter1 + parameter2 Code block summary explanations: If you have a long or complex code block, you can add a comment to explain what the block is doing. # This code block creates a dictionary containing the counts of each word in a list of text strings word_counts = {} for text in text_list: for word in text.split(): if word not in word_counts: word_counts[word] = 0 word_counts[word] += 1 5.4 Improves maintainability Code annotation can help to improve the maintainability of code. By adding comments, developers can explain the reasoning behind certain decisions, which can make it easier for others to make changes to the code without breaking it. This can be especially helpful when multiple developers are working on the same codebase, as it can help to prevent conflicts and ensure that the code is always in a consistent state. 5.4.1 Examples of maintainability aiding comments Comments that help maintainability explain the historical context of why code was made the way it was Examples of maintainability aiding comments Design decisions: If there were specific design decisions made when creating the code, you can add comments explaining why certain choices were made. bash # We chose to use a linked list data structure for this function to reduce the time complexity of inserting and deleting elements. Legacy code: Sometimes, code may have been written in a certain way due to constraints or limitations at the time it was created. Adding comments to explain this can help others understand why the code is the way it is. # This code was written before Python 3, which introduced the `yield from` syntax. Therefore, we used a `for` loop to iterate over the nested list. Performance optimizations: If certain performance optimizations were made to the code, you can add comments explaining why they were necessary. bash # We used memoization to improve the time complexity of this recursive function, as it was taking too long to execute for larger inputs. Compatibility considerations: If the code was written with compatibility considerations in mind, you can add comments explaining why certain choices were made. # We used the `os.path` module to ensure that this code will work on both Windows and Unix-based systems, as the path separators are different on each platform. Limitations: If there are limitations or edge cases that the code cannot handle, you can add comments to explain this to others. # Note that this function assumes that the input array is sorted in ascending order. If the array is unsorted, the results may be incorrect. 5.5 Improves the quality Code annotation can help to improve the quality of code. By adding comments, developers can identify potential issues or edge cases, which can help to prevent these issues from occurring in the first place. This can be especially helpful when testing code, as it can help to ensure that the code is working as expected. 5.6 Examples of quality aiding comments Comments that help improve the quality of the code by explaining to others how to use it or help improve it Error handling: Adding comments to explain how and why error handling is being implemented can help ensure that your code is robust and able to handle unexpected inputs or errors. This helps others know how the code was intended to be used. # If the input argument is not a list or is empty, raise a ValueError if not isinstance(input_list, list) or len(input_list) == 0: raise ValueError("Input must be a list that is not empty") Complexity: If your code has particular complexities, adding comments that explain it can help others understand the performance characteristics of your code. It may help others identify whether there is a simpler way to write the code. By adding a comment that expresses uncertainty about the code and asking for suggestions, the author can potentially receive feedback from others on how to improve the code. # This block of code could probably be simplified, but I'm not sure how. new_list = [] for i in old_list: if i > 0: new_list.append(i) Constants and variables: Adding comments to explain the purpose of constants and variables can make your code easier to use. It not only notifies others of the variables existence but lets them know if they need to change the parameters for their own purposes. # This constant represents the maximum allowed number of retries when attempting to connect to the server. MAX_RETRIES = 3 # This variable tracks the number of failed attempts to connect to the server. num_retries = 0 Code organization or disorganization: Adding comments to explain the organization and structure of your code can make it easier for others to navigate and may bring out a better organizational strategy for your code. # Define helper functions for data processing def preprocess_data(input_data): # Implementation details def analyze_data(processed_data): # Implementation details def visualize_data(analyzed_data): # Implementation details # Load data from file input_data = load_data("input.txt") # Preprocess data processed_data = preprocess_data(input_data) # Analyze data analyzed_data = analyze_data(processed_data) # Visualize data visualize_data(analyzed_data) Assumptions and constraints: Adding comments to explain the assumptions and constraints of your code can help others understand its limitations and potential pitfalls. # This function assumes that all input values are positive integers. Negative or non-integer inputs may result in unexpected behavior. 5.7 AI in Code Annotation We’ve discussed why code annotation and documentation are important, but when and why would you use AI for code annotation? AI can be a nice tool to supplement the annotation of your code. It should not be the only source of annotation for your code, because as the code author, you need to verify that what AI has annotated is consistent with your knowledge and history of development of the code. But using AI to annotate your code can be useful to supplement existing code annotations or to annotate old code that was poorly annotated either by yourself or others who are no longer working on the project. Here are some of the benefits of using AI for code annotation: Speed and efficiency: AI algorithms can analyze code much faster than humans, which means they can quickly generate comments and annotations for large codebases. This can save developers significant time and effort, allowing them to focus on other aspects of the development process. Consistency: Unlike humans, AI is not affected by personal biases or preferences, so it can provide consistent annotations across different code files and projects. A human may underestimate places in the code that should have annotation, whereas an AI might be more consistent at putting annotation in these places. This can help ensure that all code in a project is well-documented and easy to understand. Objectivity: AI can analyze code objectively and identify potential issues that may have been missed by humans. This can lead to better quality code that is easier to maintain and less prone to errors. Learning: AI models can learn from large datasets of annotated code and improve their ability to generate comments and annotations over time. This means that the more code the AI model analyzes, the more accurate and effective it becomes at annotating code. Specificity: AI models can be trained on specific programming languages, frameworks, or libraries, allowing them to generate language-specific comments and annotations that are tailored to the needs of the project. This can be particularly helpful for large, complex projects that require specialized knowledge or expertise. 5.8 Ethics of using AI to annotate code However, there are also a number of potential ethical concerns associated with using AI to annotate code. For example, we don’t yet know how and in what ways AI models may be biased. Additionally, AI models may be opaque, which could make it difficult to understand why they made certain annotations. Finally, because AI models are not humans and don’t necessarily tell the stories behind the code, they may be used to generate annotations that are not accurate, helpful, or do not tell the full depth of the history of what occurred with the code, which could lead to problems. Given these potential benefits and concerns, it is important for users of AI to always realize that they are ultimately accountable for the annotation that an AI model makes, and careful review of this annotation is needed. There are a number of ethical considerations to take into account when using AI to annotate code. Here are a few of the most important considerations: Accountability: First and foremost, a user of AI is always primarily accountable for any output that they use from an AI model. AI models can give you annotation to start with, but it is up to you as the user to verify and review this output carefully. The user of the AI model is ultimately responsible for keeping or throwing out the annotations the AI makes and thus is responsible for using errors that the model makes. Much like a user of a Google Search engine is responsible for which results they use, a user of AI is responsible what output from the AI model they use. Transparency: It is important to be transparent about the use of AI in code annotation. This means disclosing the fact that AI is being used, as well as the specific AI model and dataset that is being used. This should be stated on every file where annotation has been made using AI. This transparency allows others who view the code to be able more fully interpret the AI-created annotation that accompanies the code. Bias: AI models are trained on data, and this data can introduce bias into the model. It is important to be aware of the potential for bias and to take steps to mitigate it. This can be done by using a diverse dataset, by carefully selecting the features that are used to train the model, and by using techniques such as adversarial training. It is important to provide annotations that indicate any known biases, possible limitations associated with bias, and any strategies that were used to mitigate bias. Explainability: It is important to be able to explain the decisions that an AI model makes. This is especially important in the case of code annotation, where the decisions made by the AI model can have a significant impact on the quality of the code. There are a number of techniques that can be used to explain the decisions of an AI model, such as visualization and rule extraction. You can (and should) ask a chatbot to explain its sources and rationale for output that it gave. (Be aware that actual citations it gives may or may not be accurate, and you need to verify the accuracy of those citations by doing your own follow up literature search). 5.9 Examples on using AI for annotation 5.9.1 Ask for a README summary To try out some annotation with code examples, this author dug up some old code that she had no idea about what it did anymore because time had passed and she didn’t document it very well. First, I wanted ChatGPT to make a README for me. README’s are a standard file that explain what the code base does and provides a summary of what is happening in the set. I asked ChatGPT if it could: Create a README for this code and then I pasted the old code. ChatGPT gave me some output that generally looked like a README: This README seems accurate given the work I was doing at the time. But obviously the title isn’t great – it doesn’t describe the code well. Plus there’s not really information about usage or outputs of the code. So I asked it: Can you make this README more succinct and with sections about how you would use this code? This yielded a much better result. 5.9.2 Ask for line by line annotation Second, I wanted to have ChatGPT annotate code line by line. So I asked it Can you annotate some R code for me? It not only provided helpful annotations but it fixed spacing and added more spaces between lines of code: It does however, think the code is Python apparently if we look in the upper left corner. But this doesn’t seem to have affected its accuracy in its annotations. 5.9.3 Ask for how the code could be improved This code is old, and I don’t think it runs properly and is in no way reproducible. So I wanted to see what ChatGPT would recommend for improvements to the code. I said How could I make this code better? It had a lot of great advice: First and foremost it told me my variable names are not consistent and also not descriptive. Which is completely accurate! There’s variable names like xx and ll which don’t tell the reader anything about the variable. 5.9.4 Style the code Next, I asked chatGPT if it could restyle the code into tidyverse style. It definitely put elements that look like tidyverse however, it also put items in the code that I can tell by looking at it won’t work. So I tried to tell it about the errors: :::{.query} This code is close but there are some errors. These tidyverse functions don’t work with matrices. ::: and it told me: You are correct that the tidyverse functions are designed to work with data frames and not matrices. Here's a modified version of your code that converts the matrix to a data frame and uses tidyverse functions: The lesson here is that the output of chatGPT still needs to be vetted by the person asking for it. It is a great idea to continue to have AI’s work on something if it isn’t quite what you are asking for, however, at the end of the day it is you, the human, who has to vet the output. 5.9.5 Sometimes it has trouble with file types if given a URL Copying and pasting code appears to be the best way to go at this point in time. I asked chatGPT if it could annotate code in a Jupyter notebook at a URL I gave it: Can you annotate the code at this URL? https://github.com/jhudsl/reproducible-python-example/blob/main/make_heatmap.ipynb It responded with some of the code at that file where it was annotated but most of the notebook was not there. I told ChatGPT: That isn’t all the code at that url ChatGPT told me: You're right, I apologize. The code at the given URL is actually in a Jupyter Notebook format, so it's not easy to copy-paste here. However, I can suggest an alternative approach: you can use the website nbviewer (https://nbviewer.jupyter.org/) to view the notebook and its code. Here are the steps to do so: Go to https://nbviewer.jupyter.org/ Paste the URL of the notebook https://github.com/jhudsl/reproducible-python-example/blob/main/make_heatmap.ipynb into the "Enter the location of a Jupyter Notebook" field and press "Go". This will display the notebook and its code, and you can read through it and add your own annotations as needed. I hope this helps! This was a nice tool to recommend, however it still told me I should add my own annotations at the end of this. 5.10 Summary Code annotation is important for readability, maintainability, and overall quality of code AI can be a helpful tool for supplementing annotations or creating annotation for poorly annotated code. Ultimately the code author who uses AI as a tool for annotation is still responsible for verifying that the annotations are consistent with their knowledge of the code. devtools::session_info() ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## curl 4.3 2019-12-02 [1] RSPM (R 4.0.3) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## highr 0.8 2019-03-20 [1] RSPM (R 4.0.3) ## hms 0.5.3 2020-01-08 [1] RSPM (R 4.0.0) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## httr 1.4.2 2020-07-20 [1] RSPM (R 4.0.3) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.0.2) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## ottrpal 1.0.1 2023-03-28 [1] Github (jhudsl/ottrpal@151e412) ## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.3) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## readr 1.4.0 2020-10-05 [1] RSPM (R 4.0.2) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.0.2) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.3) ## vctrs 0.6.1 2023-03-22 [1] CRAN (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["understanding-unfamiliar-code.html", "Chapter 6 Understanding Unfamiliar Code 6.1 Learning Objectives 6.2 Reading Unfamiliar Code Is A Skill 6.3 AI in Reading Code 6.4 Example One: Summarizing Code You Didn’t Write 6.5 Example Two: Identifying a Coding Language 6.6 Example Three: Interpreting Regex 6.7 Example Four: Demystifying Functions 6.8 Hands-On Exercise 6.9 Summary", " Chapter 6 Understanding Unfamiliar Code 6.1 Learning Objectives Recognize the benefits, limitations, and assumptions in using AI to understand unfamiliar code Consider the ethical questions around using AI to understand another person’s code Practice using AI to summarize code, identify an unknown coding language, and interpret regex and unknown functions 6.2 Reading Unfamiliar Code Is A Skill As a programmer, you will frequently encounter situations where you need to read and understand code written by other developers. This could be because you are collaborating on a project, you have taken over maintenance of an existing codebase, or you are learning new syntax or skills that require reading example codes. Comprehending code written by someone else is a distinct skill from being able to write your own code, and it takes practice to become proficient at it. Reading unfamiliar code is like exploring an unfamiliar city without a map or a guide. Just like in a new city, you may not know where to start or how to navigate the codebase. You may encounter unfamiliar syntax, functions, and libraries that you have never seen before, just as you might encounter new streets, buildings, and landmarks. At first, you may feel disoriented and overwhelmed, and may need to spend some time getting oriented and familiarizing yourself with the environment. As you explore, you may start to see patterns and similarities, just as you might begin to recognize neighborhoods and landmarks in a new city. You may also encounter dead-ends, confusing intersections, and unexpected detours, just as you might encounter bugs and errors in the code. To make progress in this unfamiliar territory, you may need to rely on a combination of intuition, deduction, and experimentation. You may need to break down the code into smaller pieces, analyze the behavior of each piece, and gradually build up a mental model of how the code works. You may also need to consult documentation, online resources, or other experts who are familiar with the codebase, just as you might ask locals or consult a map in a new city. In the end, with patience, persistence, and a willingness to learn, you can successfully navigate the unfamiliar code and achieve your goals, just as you can successfully explore a new city and discover its hidden treasures. Learning how to read and understand code written by someone else is a valuable skill that can help you be a more effective programmer. By being able to read and comprehend unfamiliar code, you can contribute to projects more quickly, diagnose and fix bugs more effectively, and learn new programming techniques and best practices. As with any skill, the more you practice reading and understanding code written by others, the more comfortable and proficient you will become at it. 6.3 AI in Reading Code While anyone can learn to understand code written by someone else, using AI language models to achieve this has three significant advantages. Summarize large codebases. AI can quickly scan large codebases and give you a high-level overview of what they do. This can save you a lot of time and effort, especially when dealing with complex codebases. For example, AI can identify the main functions and classes in a codebase, and it can show you how they are related. Analyze the code. AI can look at the code and tell you about its structure, complexity, and potential defects quickly and efficiently. This can help you understand the code better and make it easier to maintain and improve. For example, AI can identify parts of the code that are difficult to understand or maintain, and it can suggest ways to improve the code. Understand comments and documentation. AI can read comments and documentation written by other developers. This can help you understand the code’s purpose and the assumptions and limitations of the codebase. For example, AI can identify the key assumptions that are made in the code, and it can explain the trade-offs that were made in the design of the code. Keep these ethical considerations in mind when using AI to summarize code. Who owns the code? If you are not the owner of the code, you should get permission from the owner before summarizing it. What is the purpose of the summary? If you are summarizing the code for educational or research purposes, it is likely ethical to do so. However, if you are summarizing the code for commercial purposes, you may need to get permission from the owner. Does the code contain any sensitive or personal information? If the code contains any sensitive or personal information, you should take special care to protect that information. 6.4 Example One: Summarizing Code You Didn’t Write Here’s some simple code using the R programming language, written by an unnamed programmer. If you are familiar with R, you might be able to understand what this code does with little effort. However, if you don’t know R, you’re relatively new to R, or you’re just having a bad day, understanding what this bit of code can take a great deal more energy and time. AI language bots can ease that burden. library(tidyverse) d <- ggplot2::diamonds d_sel <- d %>% select(carat, cut, color, clarity, depth, table, price) d_fil <- d_sel %>% filter(price > 5000) d_bin <- d_fil %>% mutate(carat_bins = cut_width(carat, width = 0.2)) d_summ <- d_bin %>% group_by(carat_bins, cut, color, clarity) %>% summarize(mean_price = mean(price), sd_price = sd(price)) We first ask Claude-instant (as implemented by Poe) to explain the purpose of this code. What does this code do? You can ask for Claude to summarize each step in detail as well. Can you explain what each step does in detail? Maybe you’ve never worked with the tidyverse package in R - Claude can tell you about it. What is the tidyverse package? You might also not be familiar with the diamonds dataset (especially if you’ve never used it before) and want some clarification on where the data are from. Can you tell me more about the diamonds dataset? 6.5 Example Two: Identifying a Coding Language Sometimes you might have to work with legacy code. Legacy code can be difficult to work with, especially if it is written in a language or style with which you are not familiar. There are more than 700 programming languages in use today, so it is impossible for any programmer to know them all. AI can be a helpful tool for identifying the language and version of legacy code, which can make your life just a little easier. Let’s look at example code that might have been written decades ago. program temperature_smog_analysis; uses Math; const n_temperatures = 1000; n_smog_measures = 500; type TemperatureArray = array[0..n_temperatures-1] of integer; SmogArray = array[0..n_smog_measures-1] of integer; var temperatures: TemperatureArray; smog_measures: SmogArray; combined_data: array of integer; slope, y_intercept: double; i, j: integer; function connect_to_database(filename: string): integer; begin { implementation of connect_to_database function } end; function retrieve_temperatures(fd: integer): integer; begin { implementation of retrieve_temperatures function } end; function retrieve_smog_measures(fd: integer): integer; begin { implementation of retrieve_smog_measures function } end; function retrieve_temperature(fd, index: integer): integer; begin { implementation of retrieve_temperature function } end; function retrieve_smog_measure(fd, index: integer): integer; begin { implementation of retrieve_smog_measure function } end; procedure close_database(fd: integer); begin { implementation of close_database function } end; We can ask Bard to take a guess at what the coding language might be. What language is this code written in? We can explore further to figure out what indicators tell Bard the language is Pascal. How do you know this is Pascal? It turns out there are multiple versions of Pascal. Since you will presumably need to work with this legacy code, you might want to know which version it is. What version of Pascal is this? 6.6 Example Three: Interpreting Regex Regex (short for Regular Expressions) is a powerful tool used to describe patterns in text. It’s a sequence of characters that define a search pattern. Regular expressions can be a powerful tool for data cleaning, text mining, and data validation. They are widely used in web development, data science, and other fields where text processing is important. They can also be tricky to understand at first because they involve a specific syntax that can be complex. We can use ChatGPT to explain regex in a bit of someone else’s code. x = sub("/d/e","/d",x) What does this do? 6.7 Example Four: Demystifying Functions Sometimes we get handed code that includes complex architecture. Perhaps you are working with code you wrote years ago when you really liked loops, but present you finds them difficult to parse. (Be nice to past you - maybe you were a baby programmer and didn’t know better.) Instead of giving yourself a headache, you could turn to ChatGPT to explain what your old code does. def my_function(x): result = x for i in range(10): for j in range(5): result = result + 2 * (i + 1) * (j + 1) * (i % 2 == 0 and j % 2 == 0) - 1 return result What does this function do? Well, now you have an idea what past-you might have been attempting to do with this code. You can also query AI about the potential problems from using the code as-written. What are some possible issues with this code? (And if you do ever run across an expression like this in your code, you can check out our chapter on refactoring code using AI to fix it!) 6.8 Hands-On Exercise Now it’s your turn to try. Let’s say you were handed this bit of code to work with (and eventually modify), but first you need to figure out what’s going on with it. Unfortunately, the original programmer left very little in the way of notes or annotation. 6.8.1 The Code Note: This code is just an example and was written strictly for educational purposes. use ode_solvers::{Euler, OdeMethod}; use plotters::prelude::*; use std::fs::File; const N: f64 = 1000000.0; const I0: f64 = 10.0; const R0: f64 = 0.0; const S0: f64 = N - I0 - R0; const BETA: f64 = 0.3; const GAMMA: f64 = 0.1; fn sir_model(t: f64, y: &[f64], v: f64) -> Vec<f64> { let s = y[0]; let i = y[1]; let r = y[2]; let dsdt = -BETA * s * i / N - v * s; let didt = BETA * s * i / N - GAMMA * i; let drdt = GAMMA * i + v * s; vec![dsdt, didt, drdt] } fn main() { let mut solver = Euler::new(sir_model); solver.set_initial_condition(&[S0, I0, R0]); let root = BitMapBackend::new("sir_vaccination.png", (800, 600)).into_drawing_area(); root.fill(&WHITE).unwrap(); let mut chart = ChartBuilder::on(&root) .caption("SIR model with vaccination", ("sans-serif", 40)) .set_label_area_size(LabelAreaPosition::Left, 60) .set_label_area_size(LabelAreaPosition::Bottom, 40) .build_cartesian_2d(0.0..100.0, 0.0..N) .unwrap(); let mut data1 = vec![]; for _ in 0..1000 { let y = solver.integrate(0.1, 0.0); data1.push((solver.time(), y[0], y[1], y[2])); } let vac_rate = 0.1; let vac_coverage = 0.5; let vac_num = vac_coverage * N; let mut data2 = vec![]; for i in 0..1000 { let t = i as f64 * 0.1; let v = if t >= 50.0 && t < 150.0 {vac_num * vac_rate} else {0.0}; let y = solver.integrate(0.1, v); data2.push((solver.time(), y[0], y[1], y[2])); } chart .configure_mesh() .x_labels(10) .y_labels(10) .disable_x_mesh() .disable_y_mesh() .draw() .unwrap(); chart .draw_series(LineSeries::new( data1.iter().map(|d| 6.8.2 Questions Write a query that identifies the features that can be used to determine the coding language, as well as the version of the language. What language and version is it written in? What features give away the coding language? Create a prompt that determines what this code does, as well as important features of the program. What does this code do? Write a prompt that determines the purpose of this specific code snippet: let root = BitMapBackend::new("sir_vaccination.png", (800, 600)).into_drawing_area(); What is the purpose of this line of code? 6.9 Summary Understanding code written by someone else can be made easier by using AI AI chatbots can summarize the code and the dataset used, as well as clarify functions and expressions that are confusing AI chatbots can also identify the coding language and version used in legacy code Be mindful of who owns the code and what the summary will be used for when using AI to summarize someone else’s code "],["about-the-authors.html", "About the Authors", " About the Authors These credits are based on our course contributors table guidelines.     Credits Names Pedagogy Lead Content Instructor Elizabeth Humphries (Writing Code, Understanding Unfamiliar Code) Content Authors Candace Savonen (Annotating Your Code), Carrie Wright (Ethics of Using AI), Ava Hoffman (Refactoring Code) Content Editor Reviewer Howard Baek Technical Template Publishing Engineers Candace Savonen, Carrie Wright, Ava Hoffman Publishing Maintenance Engineer Candace Savonen Technical Publishing Stylists Carrie Wright, Ava Hoffman, Candace Savonen Package Developers (ottrpal) Candace Savonen, John Muschelli, Carrie Wright Art and Design Figure Artists Candace Savonen, Carrie Wright, Ava Hoffman, Elizabeth Humphries Funding Funders CS, CW, and HB were supported by the National Cancer Institute (NCI) under Grant UE5CA254170. AMH and EMH were supported by the AnVIL Project through cooperative agreement awards from the National Human Genome Research Institute with cofunding from OD/ODSS to the Broad Institute (U24HG010262) and Johns Hopkins University (U24HG010263). Funding Staff Sandra Ormbrek, Shasta Nicholson   Tools Used: ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["appendix.html", "Appendix Programming Languages AI and Cloud Computing", " Appendix Programming Languages Here are commonly used languages and their typical use cases. Python Known for its readability, simple syntax, and comprehensive add-on modules. It is often recommended as a beginner-friendly language. Python is used for scientific computing, data analysis, machine learning, and web development. Many Data Scientist roles rely on Python. Ruby Similar to Python, Ruby is also known for its readability and user-friendly syntax. It is typically used for web development, building dynamic websites, and creating web applications. JavaScript A popular language for web development, known for its versatility and ease of use. Many of the interactive features of websites rely on JavaScript. Java Java is widely used for enterprise applications, android mobile apps, and web apps. PHP PHP is easy to learn but can become complex as the application grows. It is typically used for building dynamic web pages, web applications, and content management systems. R Used for statistical computing, data analysis, and data visualization, R is a popular choice for researchers and data scientists. Some beginners find its syntax complex, especially due to differences in the two major dialects: “base” R versus the “tidyverse”. Kotlin Kotlin is a relatively new language that is designed to be more concise and expressive than Java. However, its advanced features and concepts may be challenging for beginners. It is used for developing Android mobile apps, web development, and server-side development. Swift Used for iOS and macOS app development, Swift is known for its strict syntax and steep learning curve. C# Often used for Windows desktop applications, web applications, and video games, C# can be challenging due to its more complex syntax and strict type system. C++ A powerful language often used for developing high-performance applications and operating systems, C++ can be challenging to learn due to its complexity and the need to manage memory manually. Julia Julia is designed for numerical and scientific computing, data analysis, and machine learning. It has a syntax that is easy to learn and read, making it an ideal choice for data scientists, engineers, and researchers. Julia code can also be compiled to native machine code using the Julia compiler. Because Julia is a relatively new language, it has fewer add-on libraries and resources available compared to more established languages. MATLAB MATLAB is a high-level programming language and development environment commonly used for numerical computation, data analysis, and visualization. It is widely used in engineering, physics, and finance, among other fields. It is generally considered to have a user-friendly syntax and is relatively easy to learn compared to other languages. MATLAB has a development environment called MATLAB Compiler that allows you to package MATLAB code into standalone executables or shared libraries for use on a wide variety of operating systems. Fortran Fortran has been around for decades and has a long history in scientific and engineering communities. It has a more challenging syntax and is considered harder to learn than some of the other languages on this list. It is primarily used for scientific and engineering applications that require numerical computations and simulations such as computational physics, weather forecasting, and computational chemistry. Rust Rust is a systems programming language that focuses on speed, reliability, and memory safety. It is commonly used for developing performance-critical software, such as operating systems, web browsers, and game engines. Rust’s syntax is similar to C++, but is often considered to have a steeper learning curve due to its focus on memory safety and ownership concepts. AI and Cloud Computing AI in cloud computing is an exciting and rapidly advancing field that combines artificial intelligence (AI) and cloud computing technologies. Cloud computing provides on-demand access to computing resources over the internet, such as storage, processing, and analytics, while AI uses algorithms and models to enable machines to perform tasks traditionally requiring human intelligence. Developers can easily incorporate AI into applications using cloud-based AI services. For example, Amazon Web Services (AWS), Microsoft Azure, and Google Cloud Platform offer AI services like speech recognition, image recognition, natural language processing, and machine learning. AI optimizes cloud resources and performance. It allocates resources based on workload demands, optimizes power usage, detects threats, and improves application latency by predicting user behavior and preloading content. However, integrating AI and cloud computing presents challenges around data, security, privacy, ethics, complexity, and management that must be addressed carefully. Large amounts of data are needed to train AI models, especially deep learning models requiring vast labeled data to identify patterns and predictions accurately. Storing and processing huge data can be expensive, impacting cost, scalability, and environment performance. Ensuring data security, privacy, and ethical use also require consideration. AI and cloud computing are complex with specialized skills and knowledge to use effectively. Integration increases complexity, challenging management and maintenance. Careful planning and execution evaluates benefits and limits of AI; selects appropriate models and algorithms; and determines integration into the cloud environment. Monitoring evaluates model performance, enabling adjustments to optimize performance and efficiency. As both AI and cloud computing technologies advance, the intelligent integration of the two can provide on-demand access to advanced AI capabilities, optimize resources, facilitate smarter applications, and gain data-driven business insights. Integration challenges around data, security, ethics, and complexity must be managed proactively through evaluation, planning, monitoring, and adjustments to maximize benefits and minimize limitations. When implemented responsibly, AI in cloud computing enables remarkable intelligent and scalable systems transforming organizations and society. "],["references.html", "References", " References "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] +[["index.html", "AI for Software Development Harnessing the Power of Large Language Models About this Course Available course formats Suggested Activity Context Learning Objectives Lesson Breakdown", " AI for Software Development Harnessing the Power of Large Language Models July, 2023 About this Course This course on AI for software development explores the use of AI large language models such as ChatGPT, Bard, and others and their potential benefits and challenges. Through examples and hands-on activities, students will develop an understanding of the ways in which AI can speed up software development tasks and free up time for more creative and strategic work. By the end of the course, students will be equipped to navigate the rapidly changing landscape of software development and use AI chatbots in a way that maximizes benefits and efficiency while limiting harm as much as possible. Available course formats This course is available in multiple formats which allows you to take it in the way that best suits your needs. The material for this course can be viewed without login requirement on this Bookdown website. This format might be most appropriate for you if you rely on screen-reader technology. Our courses are open source, you can find the source material for this course on GitHub. The slides for the images in the course can be found here. Suggested Activity Context Course Audience Professionals looking to improve efficiency Students hoping to learn more about programming Anyone curious about how AI can be harnessed for technology Note: Those completely new to programming will find using AI tools to create software solutions challenging at this time. It is helpful to have some fundamental knowledge to write appropriate prompts and to discern when code is not working as expected. We advise novices to seek expert review. Course Prerequisites Some previous exposure to programming recommended. Assessment Type Hands-on activities following each lesson. Learning Objectives Learners will be able to: Explain the basics of AI and its potential for improving software development workflows Implement strategies to write and debug code using AI-based tools Describe the benefits of refactoring code using AI-powered techniques, such as making code readable, keeping it brief, and optimizing code Apply best practices for annotating code using AI Recognize strategies for using AI-based tools to understand and analyze code, such as code comprehension of unfamiliar languages or functions Discuss the challenges and ethical implications of using AI for different aspects of software development Lesson Breakdown Activity Duration Introduction 10 minutes Ethics for Using AI 20 minutes Writing Code 35 minutes Writing Exercise 15 minutes Refactoring Code 35 minutes Refactoring Exercise 15 minutes Annotating Code 25 minutes Understanding Code 25 minutes Understanding Exercise 10 minutes Total 3 hours & 10 minutes "],["introduction.html", "Chapter 1 Introduction 1.1 Learning Objectives 1.2 AI Provides New Opportunities 1.3 AI Code of Ethics 1.4 The AI Chatbots 1.5 How to Use This Book 1.6 About This Book", " Chapter 1 Introduction The increasing availability of AI chatbots is creating a new landscape in software development and data science. It is important to be aware of the potential benefits and challenges of this technology, so that we can use it in a way that benefits everyone and limits harm as much as possible. On the one hand, AI chatbots have the potential to replace or significantly reduce the workload of programmers. This could lead to job losses in the data science industry. Additionally, there are significant ethical and privacy concerns regarding the use of training data sets to teach these AI systems. For example, if a chatbot is trained on a dataset of biased or discriminatory data, it could perpetuate those biases in its interactions with users. On the other hand, AI chatbots also have the potential to create new jobs and opportunities. For example, chatbot developers will be needed to create and maintain these AI systems. Additionally, AI chatbots could be used to automate tasks that are currently done by humans, freeing up programmers to focus on more creative and strategic work of interpreting what the data actually mean. Ultimately, while the future of programming in software development and data science is unclear, there is much to be optimistic about in this brave new world. The advancements in AI and chatbot technology present an opportunity for programmers to work alongside algorithms to create innovative solutions that were previously unimaginable. As with any technological revolution, there will be challenges, but it is up to us to work together to ensure that we use these tools ethically and responsibly, and to create a future that benefits everyone. 1.1 Learning Objectives In this chapter we will demonstrate how to: Consider the potential benefits and limitations of AI for software development Recognize how to use this course, how it was written, and what to expect Explain general concepts for ethical use of AI tools for software development Summarize what Chatbots are and how they work Distinguish between different AI options for software development 1.2 AI Provides New Opportunities We do not believe that AI chatbots will replace programmers, software developers, and data scientists. While AI can be powerful and useful, it is only as good as the training data behind it and the human using it. Therefore, for the time being and the foreseeable future, humans will remain at the forefront of programming innovation, with AI providing valuable support. As new code is often built on top of existing code written by humans, it is unlikely that AI will fully replace the need for human programmers. However, we do think that the roles of programmers in software development and data science are changing, and some of the skills required to work in this new environment are slightly different from those needed before. In addition to proficiency in programming syntax, programmers may need to develop a more refined ability to construct queries that enable AI bots to create the desired workflows. Other critical skills such as debugging, troubleshooting, and documentation will continue to be valuable, and can be enhanced through the use of AI. Furthermore, AI creates new opportunities and niches for tasks that were previously difficult, time-consuming, or impossible. This is an exciting time for those working in programming, with great potential to explore new and innovative solutions. As AI technology continues to advance, its role in programming will only become more significant, and it is up to developers to adapt and learn how to use these new tools effectively. We asked OpenAI’s ChatGPT whether AI chatbots would replace human software developers, data scientists, and programmers, and this was the response: “It is unlikely that AI chatbots will replace software developers, data scientists, and programmers entirely. While AI chatbots can perform certain tasks related to software development, data analysis, and programming, they are limited in their abilities and require human oversight and input to function properly. AI chatbots can be used to automate certain tasks such as generating simple code snippets, running tests, and performing simple data analysis. They can also assist in the development process by providing quick answers to commonly asked questions and suggesting possible solutions to programming problems. However, more complex software development, data analysis, and programming tasks require a level of creativity, critical thinking, and problem-solving that AI chatbots cannot currently replicate. Software developers, data scientists, and programmers have a deep understanding of the technologies and tools used to develop AI chatbots, as well as the ability to optimize and improve those tools. Furthermore, software development, data analysis, and programming require a high level of human communication and collaboration, which AI chatbots cannot currently replicate. Humans are also essential in making ethical decisions related to AI development, such as ensuring that AI systems are transparent, fair, and unbiased. In summary, while AI chatbots can provide valuable assistance to software developers, data scientists, and programmers, they are unlikely to replace them entirely. Human expertise, creativity, and critical thinking will continue to be essential in developing and optimizing AI systems for the foreseeable future.” 1.3 AI Code of Ethics Our first duty as programmers is to avoid causing harm to people and the world. This includes avoiding both intentional and inadvertent harm. Intentional harm is harm that is caused by a programmer’s deliberate actions. For example, a programmer might create a virus that is designed to harm computers. Inadvertent harm is harm that is caused by a programmer’s negligence or lack of foresight. For example, a programmer might create a program that is buggy and causes data loss. We must always be aware of the potential for harm and deliberately take steps to mitigate it. This includes things like: Be aware of the potential for bias. AI systems are trained on data, and that data can reflect the biases of the people who collected it. Programmers should be aware of the potential for bias in their data and take steps to mitigate it. Be transparent about your work. Share information about your code, data, and algorithms. This will help others to understand how your work works and to identify any potential problems. Be accountable for your work. Take responsibility for the consequences of your code. Be willing to make changes if necessary. Participate in discussions about AI ethics. There are many online and in-person communities where you can discuss the ethical implications of AI with other people. Advocate for ethical AI. Speak up when you see AI being used in a way that you believe is unethical. Support organizations that are working to promote ethical AI. 1.4 The AI Chatbots Humans have been interacting with AI chatbots for years. In fact, Alan Turing is credited with coming up with the concept for chatbots as early as 1950. Chatbots are software-based systems that interact with humans typically by text or speech inputs, rather than code. They mimic some human activity (“Chatbot” 2023; Abdulla et al. 2022) based on these language inputs. They process the inputs using natural language processing commonly abbreviated as NLP. NLP is a kind of AI that uses human text or speech and parses the language to determine structures and patterns to extract meaning. NLP uses large amounts of language data (such as books, websites etc.) to train AI systems to identify these structures and patterns. For example, the AI model might identify when a sentence is a question or a statement by examining various features in a prompt such as the inclusion of a question mark of the use of words often used in questions (“Natural Language Processing” 2023; Cahn 2017). The methods used for chatbots have evolved over time. Now chatbots often utilize AI methods like deep learning (which involve multiple layers of abstractions of the input data (“Deep Learning” 2023)) to extract meaning from the language data (“Natural Language Processing” 2023). As these methods use large quantities of text, they are therefore often called large language models (“Large Language Model” 2023). Despite the fact that chatbots have been around awhile, the popularity of OpenAI’s ChatGPT and DALL-E programs has sparked a recent surge of interest. These chatbots are in part particularly powerful due to the fact that large amounts of computing power were used to train their NLP models on very large datasets (Caldarini, Jaf, and McGarry 2022; Cahn 2017). Large language model AIs can be divided into two categories: those that can be reached using an internet browser, and those that can be reached using an integrated development environment (IDE). This is not a comprehensive list! Browser-based chatbots Bard is Google’s large language model, also known as a conversational AI or chatbot trained to be informative and comprehensive. It is trained on a massive amount of text data and is able to communicate and generate human-like text in response to a wide range of prompts and questions. You will need to join the waiting list before getting access, although in our experience the wait time is short. ChatGPT is OpenAI’s large language model based on the GPT (Generative Pre-trained Transformer) architecture. It is designed to understand and generate human-like responses to text-based conversations. You will need to create an account before using it. Phind is a AI-powered search engine designed specifically for developers asking technical questions. In addition to answering your coding question, it will provide links to the internet sources used to find the answer. Poe is Quora’s platform that gives you access to multiple AI chatbots, including Sage, based on OpenAI’s GPT-3.5 architecture; Claude, an AI natural language bot created by Anthropic; and ChatGPT. IDE-based chatbots CoPilot by GitHub is a language bot that interfaces with your editor. This bot provides coding suggestions and ways to speed up testing. GitHub describes it as an “AI pair programmer”. It uses a subscription model with both individual and business tiers. CodeWhisperer is the Amazon Web Services chatbot for the AWS cloud platform. It can be installed in your integrated development environment (IDE) using the latest AWS Toolkit plugin. The individual tier for CodeWhisperer is free, although you will need to create an AWS account and add a payment method. What are the data sources for these chatbots? Some high-profile English-language AIs, including Google’s T5 and Facebook’s LLaMA, were trained on more than 15 million websites (Schaul, Chen, and Tiku 2023). The top sources of training data for these AI models were https://patents.google.com/ and https://www.wikipedia.org/ ! 1.5 How to Use This Book This book is written with the expectation that users will follow along and paste the queries from each example into their own AI chatbot session. After you have finished this book, you will be able to use whichever combination of chatbot and programming environment that you’re comfortable using. 1.5.1 Choice of AI Model You can use whichever AI you like for this course, as long as it is a large language model. (Other types of AIs are not explored in this course.) We will use a variety of browser-based chatbots as examples throughout this course. Some AIs will be better suited for your particular tasks, and it is too early to judge which of the technologies will end up dominating the industry. We encourage you to test multiple AI platforms to find the ones that best fit your needs, and the use of a particular AI in each chapter should not be taken as an endorsement by us. We have focused on the browser-based chatbots for our examples in this course for ease of demonstration. 1.5.2 Computing Environment Needs All the examples and activities in this course can be done in the computer environment you prefer. None of the tasks require a huge amount of computing power, so local installations on your personal computer are fine, though everything will also translate to a high performance computing cluster or a cloud computing platform. In addition to the CodeWhisperer chatbot available on the AWS cloud platform, a variety of cloud-based AI tools and platforms exist that can be leveraged for practical projects after this course. For instance, Amazon SageMaker or Google Cloud AI Platform can be used for constructing and training machine learning models, while Microsoft Azure Cognitive Services can be applied to incorporate natural language processing features into your applications. If you’d like to learn more about how AI can be integrated with cloud computing, you can read about it in the Appendix. 1.5.3 Boxes Throughout this course, you will see several types of specially-colored boxes. In particular, there are two to which you should pay special attention. One box highlights potential ethical issues with an AI usage. In this box, you’ll find reminders of the ethical considerations you should be particularly aware of while using AI to do certain tasks. The other box highlights our queries to AI chatbots. The question we posed to the AI chatbot is written in these boxes to make it easier for you to find. Wherever possible, we use screenshots of the actual answers we got from the AI chatbots in response to our questions. Occasionally when we have asked for the AI to write or fix code, we have formatted the answer in such a way that makes it easier to use. When you see this format, you will know it indicates an AI response Code in these boxes was written by AI. 1.6 About This Book We used AI bots (including ChatGPT, Bard, Sage, and Claude) to develop and write much of this course. We firmly believe this new technology can be used in ethical ways and we put into practice all the rules and suggestions offered over the following modules while we created this book. "],["ethics-of-using-ai.html", "Chapter 2 Ethics of Using AI 2.1 Learning Objectives 2.2 Major concerns 2.3 Replacing Humans 2.4 Bias 2.5 Misinformation 2.6 Unintelligible Code 2.7 Faulty or Buggy Code 2.8 Security and Privacy issues 2.9 Violating Copyright 2.10 Harmful code 2.11 Summary", " Chapter 2 Ethics of Using AI The use of artificial intelligence (AI) and in particular, generative AI, in coding has raised a number of ethical concerns. We will highlight several current concerns, however please be aware that this is a dynamic field and the possible implications of this technology is continuing to develop. It is critical that we as a society continue to evaluate and predict what the consequences of the use of AI will be, so that we can mitigate harmful effects. 2.1 Learning Objectives In this chapter we will demonstrate how to: Describe key ethical concerns for using AI tools in software development Identify possible mitigation strategies for these major concerns Explain the potential benefits of being transparent about the use of AI tools to write code Discuss why human contributions are still important and necessary Recognize strategies for using AI tools to write code more responsibly Implement prompts to ask AI tools about responsible use throughout various coding practices 2.2 Major concerns In this chapter we will discuss the following issues that writing code with AI tools may contribute to: Replacing Humans - AI tools can help humans write code, but they are not a replacement. Bias - AI models are built on data and code that were created by biased humans, this bias can be further perpetuated. Misinformation - fake or manipulated data used to help design algorithms could be believed to be correct and this could be further propagated. Unintelligible Code - Developers need to follow best practices with code generated by AI. Just like code generated by human developers, this includes figuring out how the code works, how it integrates with other code, as well as annotating and documenting how to use the code . Faulty or Buggy Code - Code that may not be optimal for a given situation may be inadvertently used by those with less familiarity, which may result in faulty software. Security or Privacy Issues - Code may not be optimized for security if not adequately evaluated. Generative AI models have access to large amounts of data that is currently unregulated and may include data that should be protected for privacy reasons. Copyright Violations - The code used for the generative AI model may used code that has copyright laws that require attribution or do not allow reuse and it may not be clear where the code came from. Harmful Code - Currently it is not clear how well generative AI models restrict the creation of code that will be used for goals that harm others. Note that this is an incomplete list; additional ethical concerns will become apparent as we continue to use these new technologies. We highly suggest that users of these tools be transparent about the use of these tools, so that as new ethical issues emerge, we will be better prepared to understand the implications for specific coding projects. Be transparent about what AI tools you use to write code. This help others to better understand how you created your code, as well as the possible sources that the AI tools might have used when helping you write code. It may also help with future unknown issues related to the use of these tools. Some organizations and scientific societies have created guidelines or requirements for using AI in journal articles and conference submissions, like the International Society for Computational Biology. Be aware of the requirements/guidelines for your field. It is essential to address these ethical concerns and ensure that the use of AI in coding is done in a responsible and transparent manner. This could be done through ensuring the quality of the data used to train AI systems, promoting transparency in AI-generated code, and implementing safeguards against the creation of harmful or biased code. By doing so, we can harness the potential of AI to improve and transform the way we write and optimize code while maintaining ethical standards. 2.3 Replacing Humans Those who use AI tools to write code or to understand code need to recognize their own value in the process. While AI systems are useful, they do not replace the strengths that humans have for innovating new ways to write code, evaluating how the code integrates into the larger picture of a project, or in evaluating the downstream consequences of the code. Computer science is a field that has historically lacked diversity and new learners can often feel intimidated. There is the potential that new learners may feel even more discouraged as they learn to write code when witnessing AI tools write code. It is critical that we support diverse new learners of computer science, as we will continue to need human involvement in the development and use of AI tools. 2.3.1 Tips for supporting human code Follow best teaching practices for inclusion of diverse learners. Encourage current and future programmers to continue to innovate and write code. Avoid thinking that code written by computers must be better than code written by humans, as this simply is not true. Recall that humans first wrote they code that the AI tools use to write code. Be transparent about when you do or do not use AI tools, give credit to the humans who write code where possible. A new term in the medical field called AI paternalism describes the concept that doctors (and others) may trust AI over their own judgment or the experiences of the patients they treat. This has already been shown to be a problem with earlier AI systems intended to help distinguish patient groups. Not all humans will necessarily fit the expectations of the AI model if it is not very good at predicting edge cases (Hamzelou n.d.). Therefore, in all fields it is important for us to not forget our value as humans in our understanding of the world. 2.4 Bias One of the biggest concerns is the potential for AI to create biased code. AI systems are trained on data created by humans. If this data used to train the system is biased (and this includes existing code that may be written in a biased manner), the resulting code could also be biased. This could lead to discrimination, abuse, or neglect for certain groups of people, such as those with certain ethnic or cultural backgrounds, genders, ages, sexuality, capabilities, religions or other group affiliations. It is well known that data and code are often biased (Belenguer 2022). It is important that evaluations be made throughout the software development process to check for and consider potential perpetuation of bias. 2.4.1 Tips for avoiding bias Be aware of the potential biases in the data that is used to train AI systems. Check for possible biases within the data. Are there harmful data values? Examples could include discriminatory and false associations. Are the data adequately inclusive? Examples could include a lack of data about certain ethnic or gender groups or disabled individuals, which could result in code that does not adequately consider these groups, ignores them all together, or makes false associations. Are the data of high enough quality? Examples could include data that is false about certain individuals. Evaluate the code for biases as it is developed. Check if any of the criteria for weighting certain data values over others are rooted in bias. Consider the possible outcomes of the use of the code. Consider if the code could possibly be used in a manner that will result in discrimination. See Belenguer (2022) for more guidance. 2.5 Misinformation AI tools use data that may contain false information. AI tools may also report data as if it is real, when it is in fact not real. For example, currently at the time of the writing of this course, ChatGPT will report citations with links that are not correct. 2.5.1 Tips for reducing misinformation Be aware that some AI tools currently make up false information based on artifacts of the algorithm. Do not assume that everything that the algorithm produces is real or correct. 2.6 Unintelligible Code There is risk that those less aware of best coding practices use AI-generated code and do not follow these practices. This could make it difficult for others to understand how the code works and could make it hard to identify and fix any issues that may arise. This could result in negative consequences, such as system crashes or security breaches, that could have been avoided if the code had been written by an experienced and savvy human programmer. 2.6.1 Tips for avoiding unintelligible code Code should be reviewed by experienced programmers. Code should be annotated throughout to explain what the code is doing. Documentation should be created that describes how to use the code properly. Ask AI tools to help you understand the code, but get expert assistance where needed. Can you explain what the code in line 4 is doing? 2.7 Faulty or Buggy Code There is a risk that code written with AI tools, if not reviewed carefully enough, may be faulty. AI systems may not be trained on data that relates to current software dependencies or best practices. It is also important to remember that code generated by AI tools is not necessarily better than code written by humans. It requires just as much code review. 2.7.1 Tips for reducing faulty or buggy code Do not assume that the code generate by AI is correct. Realize that AI is only as good or up-to-date as what it was trained on, the code may be generated using out-of-date code. Look up packages and functions used to ensure if the code is up-to-date. Make sure that you understand the code that you are using. AI can be used to help you understand what the code is doing, but consult with experts when needed. Ask the AI tools for extra information about if there are any potential limitations or weaknesses in the code, but keep in mind that the tool may not be aware of issues and therefore human review is required. The information provided by the tool can however be a helpful starting point. Are there any limitations associated with this code? What assumptions were made in writing this code? Stack Overflow, a popular community-based website where programmers help one another, has (at the time of writing this) temporarily banned users from answering questions with AI-generated code. This is because users were posting incorrect answers to questions. It is important to follow this policy (as you may face removal from the community). This policy goes to show that you really need to check the code that you get from AI models. While they are currently helpful tools, they do not know everything. 2.8 Security and Privacy issues AI tools are not always trained in a way that is particularly conscious of data security. Furthermore, if the code is written using these tools by users who are less familiar with coding security concerns, protected data or important passwords may be leaked within the code itself. AI systems may also utilize data that was actually intended to be private. It is also important to consider what data your code might actually be using. 2.8.1 Tips for reducing security and privacy issues Check that all passwords, access tokens (like API keys), security certificates are not saved in a public place where anyone can access or tamper with them. Check that no sensitive data, such as Personal Identifiable Information (PII) becomes public through the code. Utilize encryption and other security practices where needed. Consult with an expert about data security if you think your code could possibly cause someone to access protected data who is not authorized to access it. Promote for regulation of AI tools by voting for such standards where possible. Ask AI tools for help, but to not rely on them alone. Are there any security or privacy concerns associated with this code? 2.9 Violating Copyright When AI systems are trained on data, they may also learn and incorporate code from that data. This means that AI-generated code could potentially infringe on the copyright of the original author of the code. For example, if an AI system is trained on a GitHub repository that contains code written by a human programmer, the AI system could generate code that is identical to or similar to the code in the GitHub repository. If the AI system then uses this code without permission from the original author, this could constitute copyright infringement. In general, we want programmers to feel comfortable sharing their code openly without fear they won’t be credited. Similarly, AI systems could potentially infringe on intellectual property rights by using code that is protected by trademarks or patents. For example, if an AI system is trained on a training manual that contains code that is protected by a trademark, the AI system could generate code that is identical to or similar to the code in the training manual. If the AI system then uses this code without permission from the trademark owner, this could constitute trademark infringement. 2.9.1 Tips for avoiding copyright violations Be transparent about what AI tools you use to write your code. Obtain permission from the copyright holders of any code that you use to train the AI system. Only use code that is in the public domain or that has been licensed for use by the AI system’s owner. Cite any GitHub repositories or training manuals you might use in your code. Ask the AI tools if the code it helped generate used any code that you can cite. Did this code use any code from others that I can cite? 2.10 Harmful code Another major concern is the use of AI to generate malicious code. For instance, AI could be used to create code that spreads malware or hacks into computer systems. This could cause severe damage to individuals and organizations, including data breaches and financial losses. 2.10.1 Tips for avoiding the creation of harmful code Be careful about what code you share publicly, as it could be used for malicious purposes. Consider how the code might be used by others. Ask the AI tools to help you, but do not rely on them alone. What are the possible downstream uses of this code? What are some possible negative consequences of using this code? 2.11 Summary Here is a summary of all the tips we suggested: Disclose when you use AI tools to write code. Credit human authors by citing their code and adhering to copyright restrictions. Ensure the code doesn’t expose sensitive data, such as passwords or PII. Don’t assume AI-generated content is real, accurate, or current. Ask the AI tools to help you understand: Sources for the code that you can cite What the code is doing Code limitations Potential security or privacy issues Potential downstream consequences of the code Always have expert humans review the code and value your own contributions and thoughts. Overall, we hope that these guidelines and tips will help us all to use AI tools more responsibly for writing code. We recognize however, that as this is emerging technology and more ethical issues will emerge as we continue to use these tools in new ways. AI tools can even help us to use them more responsibly when we ask the right additional questions when writing code, but remember that human review is always necessary. Staying up-to-date on the current ethical considerations will also help us all continue to use AI responsibly. "],["writing-code.html", "Chapter 3 Writing Code 3.1 Learning Objectives 3.2 Coding Basics 3.3 Writing Code with AI 3.4 Tips for Coding with AI 3.5 Example One: Creating a Function 3.6 Example Two: Debugging Code 3.7 Example Three: Comparing Syntax 3.8 Example Four: Figuring Out a Common Task 3.9 Example Five: Planning Your Program 3.10 Example Six: Selecting a Coding Language 3.11 Hands On Exercise 3.12 Summary", " Chapter 3 Writing Code 3.1 Learning Objectives Recognize the benefits and capabilities of AI-powered programming tools, particularly for certain kinds of tasks that are difficult for humans Explain how AI-generated code and automated programming tools contribute to making programming more accessible to individuals with limited coding experience or to those working in a new language Explore the ethical considerations associated with using AI in programming, including the importance of rigorous testing before publishing code Apply strategies for using AI to build functions, debug code, understand error messages, check syntax, choose the proper programming language, and plan out a multi-step programming project 3.2 Coding Basics In today’s digitally-driven world, coding has become an essential skill. It is used to create websites, mobile applications, and sophisticated software systems. Contrary to popular belief, coding is not only for those who possess an innate talent for programming. With the right resources and a willingness to learn, anyone can become proficient in coding. Practice is crucial to mastering the art of coding, and those who are willing to commit themselves to the learning process can achieve great results. Writing code can also be a rewarding and fulfilling hobby, too. Creating your own software, building a website, or automating a task can be immensely satisfying, and can provide a sense of accomplishment and pride. Moreover, writing code can be a form of creative expression. Just as musicians use notes to compose music and artists use paint to create visual art, programmers use code to create digital experiences. From building websites to creating video games, code can be used to bring ideas to life in exciting and innovative ways. Ultimately, the ability to write code is a valuable asset in today’s world, with increasing demand for skilled programmers in a wide range of industries. Whether as a career or hobby, coding can be both personally and professionally rewarding. The accessibility and versatility of coding make it an excellent skill for anyone to learn, regardless of their background or previous experience. 3.3 Writing Code with AI AI-powered programming tools and technologies are revolutionizing the way we approach software development. AI can generate code snippets. An AI-powered code editor can suggest more efficient algorithms or highlight potential errors in real-time. It can also help developers to reproduce bugs more easily and to test potential fixes more quickly. This can save developers a significant amount of time and effort, and it can help them to debug their code more effectively. Be aware that AI still makes a lot of mistakes when writing code, so you will need to be particularly careful in testing code it writes. AI can make programming more accessible. With AI-generated code and automated programming tools, individuals who are not experienced developers can still create software solutions. Experienced developers can also more easily write code in languages with which they aren’t familiar. This has the potential to democratize programming and lead to new innovations from a wider range of people. Can complete novices learn how to program using AI tools? At present, it is very challenging for complete novices to rely on AI chatbots to learn how to write code. These tools will sometimes write buggy code or code that doesn’t not work as intended, and a person with no programming experience will have difficulty learning how to spot these sorts of mistakes. AI chatbots are best thought of as a supplement to your software development education, not as a replacement, and they should be used alongside other resources. Therefore, we advise that you seek expert review and assistance. As AI tools are refined, complete novices may be able to create software products more readily on their own. AI is changing the skills required for writing code. Rather than simply memorizing syntax, developers need to focus on developing their creativity, intuition, and problem-solving skills. Additionally, programmers must also hone their abilities in architecture design and project management, as these skills are becoming increasingly important in the modern software development landscape. As AI continues to evolve, it is likely to have an even greater impact on the way we develop software in the future. As a programmer using AI, it is up to you to be responsible for what you create. You must rigorously test any code you write. It is your job to make sure any code you create with AI is not malicious and works as expected. 3.4 Tips for Coding with AI Using AI to write code is as much of an art as writing your own code. Following a few rules and suggestions will make your experience much more enjoyable and productive. Remember that AI cannot read your mind. You need to tell it what you’re thinking, and it may take several rounds of question-and-answer before you get something you can work with. Be clear about your goals. What do you want the AI to do? Be as specific as possible. Start with a simple task. Don’t try to do too much too soon. Start with a simple task and then gradually work your way up to more complex tasks. You wouldn’t write a complete program all at once, and you shouldn’t have AI do it, either. Provide enough data. The more data (and detail) you can give the AI, the better it will be able to learn and perform the task you want it to do. Be patient. Querying an AI can take time. Don’t expect it to be perfect right away. Test everything AI writes. You are responsible for the code that AI generates, even if you didn’t write it yourself. AI can be biased, just like humans, and this could lead to sub optimal development. There is a concern that AI may focus development on areas that optimize certain metrics but not overall quality, effectiveness, or user needs. Human judgment is still needed to ensure that AI is used in a responsible and ethical way. Test your results. Make sure the AI is actually doing what you want it to do. AI systems are trained on data, and if the data is not representative of the real world, the AI system may not be able to generate code that works correctly. It is important to test the code to make sure that it is working as intended and that it is producing the desired results. Inadequate testing could lead to low quality, buggy code. Since AI generated code would be highly automated, it requires strong testing procedures and safety oversight to ensure it meets standards before deployment. Make sure your code is secure. AI systems can be used to generate code that is vulnerable to attack, and it is important to test the code to make sure that it is secure. This can help to prevent security breaches from occurring. Use a variety of AI models. There are many different AI models available. Experiment with different models to see which one works best for your task. Get feedback from others. Ask other people to review your code and give you feedback. This can help you identify and fix any problems with your code. 3.5 Example One: Creating a Function One of the most common things a programmer does is write functions to automate tedious tasks. With proper guidance, AI can speed this process up. Perhaps you need to write a quick function that reverses all the letters in a string. We can query Phind for help. How do I write a function that reverses the letters in a string? To reverse a string in Bash, there are multiple approaches. One way to reverse a string is by using the rev command. According to StackOverflow, the rev command is installed on most Linux systems by default. To use the rev command, simply enter rev followed by the string you want to reverse. For example: $ echo "12345" | rev However, it is important to note that the rev command is not present in all flavors of Unix. Another way to reverse a string is by using a simple Bash script. According to StackOverflow, we can write a Bash script that reverses a string using a for loop. Here is an example script: var="12345" copy=\\${var} len=${#copy} for((i=$len-1;i>=0;i--)); do rev="$rev\\${copy:$i:1}"; done echo "var: $var, rev: $rev" This script takes the string “12345” and stores it in the variable var. It then creates a copy of the string and stores it in the variable copy. The length of the string is stored in the variable len. The for loop starts at the end of the string and iterates through each character, adding it to the variable rev. Finally, the script prints the original string and the reversed string. Another approach to reversing a string is by using the tac command. According to StackOverflow, we can use the tac command to reverse the contents of a file or the standard input. Here is an example command: $ echo "12345" | sed 's/./&\\n/g' | tac | sed -e :a -e 'N;s/\\n//g;ta' This command uses the sed command to insert a newline character after each character in the string. It then passes the output to the tac command, which reverses the order of the lines. Finally, another sed command is used to remove the newline characters and print the reversed string. Overall, there are multiple approaches to reversing a string in Bash. The rev command, a simple Bash script with a for loop, and the tac command are all viable options. Phind offers you a variety of ways to do this, but all these options are in the language Bash. Because we didn’t include a programming language in our query, Phind picked one for us. Let’s refine our query a little. How do I write a function using Python that reverses the letters in a string? To write a function using Python that reverses the letters in a string, there are several approaches that can be taken. One approach involves using a for loop and the concatenation operator to join the original string in reverse order. This technique is demonstrated in realpython.com as follows: def reverse_string(text): result = "" for char in text: result = char + result return result print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and initializes an empty string result. The for loop iterates over each character in the input string, concatenating it with the current content of result and reassigning the new intermediate string to result at each iteration. At the end of the loop, result holds a new string as a reversed copy of the original one. Another approach involves using slicing to reverse the string. This technique is demonstrated in stackoverflow.com as follows: def reverse_string(text): return text[::-1] print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and returns the string in reverse order using slicing. The syntax text [::-1] means to slice the entire string with a step of -1, which reverses the order of the string. A third approach involves using Python’s built-in reversed() function to reverse the string. This technique is demonstrated in datagy.io as follows: def reverse_string(text): return ''.join(reversed(text)) print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and uses the reversed() function to return an iterator that produces the characters of the string in reverse order. The join() method is then used to convert the iterator back into a string. All three approaches produce the same output, but they differ in terms of performance and readability. The first approach using a for loop and concatenation is the most straightforward, but it can be slower for large strings because it creates successive intermediate strings only to throw them away in the next iteration. The second approach using slicing is more efficient because it creates a new string object only once, but it may be less readable for some programmers. The third approach using reversed() is concise and readable, but it may be slower for large strings because it creates a reversed iterator that must be converted back into a string using join(). Once again, Phind has come through with multiple options. Now let’s say you knew you wanted to write a function like this, but you realize it’s only the strings in the third column of your file. Let’s add that requirement to our query. “How do I write a function using python that reverses the letters in a string for the third column of my file?” To write a function using Python that reverses the letters in a string for the third column of a file, you can use the extended slice syntax in Python. The extended slice syntax is a more concise and faster way of slicing strings in Python. To reverse a string using extended slices, you can use the following syntax: string[::-1] In this syntax, the first colon indicates the start of the slice, the second colon indicates the end of the slice, and the third colon indicates the step size of the slice. By setting the step size to -1, you can reverse the string. To create a function that reverses the letters in a string for the third column of a file, you can use the following code: def reverse_string(string): return string[:2] + string[2:5][::-1] + string[5:] In this code, the reverse_string() function takes a string as input and returns the string with its third column reversed. The first two characters of the string are returned as-is, while the third column (characters 3 to 5) are reversed using extended slices. Finally, the remaining characters of the string are returned as-is. There are other ways to reverse a string in Python, including using loops, recursion, stacks, and function calls. However, using extended slices is the most concise and efficient way to reverse a string in Python. Here are some pros and cons of using extended slices to reverse a string: Pros: Concise syntax: using the extended slice syntax is a one-liner that is easy to read and write. Fast execution: using the extended slice syntax is faster than using loops or other methods to reverse a string. Cons: Limited functionality: the extended slice syntax can only be used to reverse a string, and cannot be used for more complex string operations. Not beginner-friendly: the extended slice syntax is not intuitive for beginners who are not familiar with Python’s slicing syntax. In conclusion, to write a function using Python that reverses the letters in a string for the third column of a file, you can use the extended slice syntax in Python. This syntax is concise and efficient, but may not be beginner-friendly and may not be suitable for more complex string operations. 3.6 Example Two: Debugging Code A vast amount of time in programming is spent on debugging code. Often the compiler error messages are very precise about what has gone wrong while simultaneously lacking enough detail for the programmer to immediately understand how to fix the error. It is good practice to debug code as you go, instead of writing the entire program and then testing to identify the errors. Using an AI chatbot makes this task much, much easier. There are two options for using ChatGPT for debugging. First, we could query what the error code means. Here’s a Python code snippet that is throwing a TypeError: unsupported operand type(s) for +: 'int' and 'str' error when we try running it. def add_numbers(a, b): result = a + b return result number1 = 10 number2 = "20" sum = add_numbers(number1, number2) print("The sum of", number1, "and", number2, "is", sum) What does this error mean? TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ This error typically occurs when you try to concatenate (i.e., add together) a string and an integer using the “+” operator in Python. In Python, the “+” operator is used for both addition and concatenation depending on the data types of the operands. If you try to add a string and an integer using the “+” operator, Python will raise a TypeError because these two data types are not compatible for this operation. For example, if you have the following code: age = 25 message = "I am " + age + " years old." Python will raise the TypeError because you are trying to concatenate a string (“I am”) with an integer (25) using the “+” operator. To fix this error, you can convert the integer to a string using the str() function: age = 25 message = "I am " + str(age) + " years old." In this case, the str() function converts the integer age to a string before concatenating it with the other string, so the operation is valid and no error will be raised. ChatGPT helpfully explains what TypeError means, what causes it, and how to fix it. This is quite useful when you don’t understand the error message. Another option is to submit the code snippet that is causing an error to ChatGPT directly and ask for it to fix the mistake. Here’s another buggy code snippet, this time in C#. Can you debug this code? using System; class Program { static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; int sum = 0; for (int i = 1; i <= numbers.Length; i++) { sum += numbers[i]; } Console.WriteLine("The sum of the numbers is: " + sum); } } Sure, I can help you debug this code. Here are the issues I see: The loop is going out of bounds: The loop is iterating from 1 to numbers.Length, but array indexes start from 0. Therefore, when i is equal to numbers.Length, numbers[i] is trying to access an element outside the bounds of the array, which will result in an IndexOutOfRangeException. To fix this, you should change the loop condition to i < numbers.Length. The loop is not summing the array elements correctly: The loop is adding the elements starting from the second element instead of the first. To fix this, you should change the initial value of i to 0, which corresponds to the first element of the array. Here’s the corrected code: using System; class Program { static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; int sum = 0; for (int i = 0; i < numbers.Length; i++) { sum += numbers[i]; } Console.WriteLine("The sum of the numbers is: " + sum); } } This should correctly sum the elements of the numbers array and output the result. Be aware that if you choose to submit your code directly to an AI chatbot to debug that you submit a snippet at a time (if possible). Otherwise the answer can get quite unwieldy! 3.7 Example Three: Comparing Syntax You may be in the middle of writing code when you realize that you’ve used two possible syntaxes for the same command. Perhaps you are using the R package here and are wondering if two different ways of writing a command are the same. Is here::here(\"raw\", \"data.csv\") equivalent to here::here(\"raw/data.csv\")? First, let’s see what ChatGPT responded. When we first started putting together this course, we had intended to include an answer from Bard that disagreed with the answer from ChatGPT as an example of why it can be helpful to query multiple chatbots. (We decided ChatGPT was correct after verifying its answer in the here package documentation.) However, when we queried Bard again two weeks later, we were pleasantly surprised to discover that Bard had corrected its answer. Now it’s a cool little example of how the chatbots are rapidly improving and “learning” from their mistakes. 3.8 Example Four: Figuring Out a Common Task Sometimes you have a task that needs done that is fairly routine. You might not have done it before, but plenty of people in the world have. In this case, you don’t want to reinvent the wheel, but you may not know exactly where to start. AI is a great option for figuring out the basic workflow steps. A very common task for anyone working with genomic samples is to combine multiple files in the vcf format. Perhaps you’ve been asked to do this and then create a separate file that contains the names of the samples. You turn to ChatGPT for help. Can you write a program that merges vcf files and then outputs the sample names? Great! Of course, maybe you’re not comfortable using bcftools, or you try this and can’t get it to work. You can take advantage of the “Regenerate Response” option in ChatGPT to get another solution. What’s another way I can do this? You can also specify some of the features you’d like in your code, or where you might want the code to come from. Maybe you want to practice using GitHub repositories, so you specifically request it. Can you write a program that merges vcf files and then outputs the sample names using a github repo? If you know you’ve used something like a GitHub repository, you can ask ChatGPT for the citation. Just be aware that you need to verify that any citation it gives you should be checked independently. Unfortunately, AI bots can still respond with imaginary journal articles. (Assume that if you can’t find it, it doesn’t exist.) What’s the citation for the repo used in this code? In general, after you find a solution that works for you, you should always make a habit of asking the AI where it got the code. Never, ever, ever run code without knowing where it came from. What’s the source for this code? You should always take care that you are only using code that you’re authorized to use when writing code. This means asking the AI chatbot where code snippets are from and tracking down those citations and authorizations yourself (instead of just trusting the AI that everything is okay). 3.9 Example Five: Planning Your Program Let’s say we want to create software that plays the card game blackjack. You can jump right in and ask your AI chatbot to write the code, but you’re unlikely to be successful and incredibly likely to get frustrated. Before you start interacting with the AI, you need to plan out what you want to do. Everyone needs a plan of attack when building software. You should start by identifying what your software will do, then you can figure out the steps necessary to make that happen. We’ll ask Claude-instant (as implemented by Poe) how we can go about creating the necessary code for our game. How would I go about writing a program that can play blackjack? That seems like a really good roadmap for building a basic game, but if you’re ambitious (and of course you are), you might want to give your game a little extra something. Claude-instant has some ideas for that, too. What are some other features I could add to this game? At this point, you are ready to begin writing your program. You have a lot of tasks to do, so you have to pick a logical starting point. If you’re uncertain, you can ask AI for advice on your first task. What should be my first coding task for this program? In this case, the AI went beyond just suggesting a first task and also offered several options for how to do it as well. 3.10 Example Six: Selecting a Coding Language You will need to choose the language for your software. If you don’t, AI will likely pick a language for you, which may or may not be one you want. You might choose a language based on: Your preexisting knowledge or experience with the language A specific use case where the language is commonly used The language(s) your colleagues or coworkers use You can find a description of other languages you might encounter here. Let’s ask Claude-instant again for some recommendations on the appropriate languages for our proposed blackjack game from the above example. (Pro tip: the various AI bots all keep track of your previous queries, so you don’t have to restate your goal for the software if you’re continuing the conversation.) What would be a good coding language to create this game of blackjack? Claude-instant actually gave us more information than we anticipated. If it hadn’t stated pros and cons while offering language suggestions, we could ask for them directly. This could be helpful if you’re deciding between two options like, say, Python or Java. What are the pros and cons of using Python vs Java for this project? 3.11 Hands On Exercise Now it’s your turn to try! 3.11.1 Code Here’s the code you need for question #2. def calculate_average(numbers): total = 0 for number in numbers: total += number average = total / len(numbers) return average numbers = [1, 2, 3, 4, "5"] average = calculate_average(numbers) print("The average of the numbers is:", average) 3.11.2 Questions Write a prompt to create a function that replaces all instances of the string “three” with the number 3, then create a prompt that allows you to modify the function so that “three”, “Three”, and “THREE” are all replaced with the number 3. Write a query that helps you debug the code snippet from above. Create a query that explains how to retrieve data from an online database. Don’t forget to find out what the source of the code is. Write a prompt to plan out a program that creates and plays a game of Rock, Paper, Scissors. You should create a multi-step plan as well as figure out what your first coding task should be. Create a prompt that identifies the best coding language for the above game. 3.12 Summary Coding has become an essential skill in today’s world. AI can increase the efficiency of planning, writing, and debugging code, as well as make coding more accessible for beginners. Querying AI on code writing tasks requires patience. AI cannot read your mind, and users need to be both specific and patient when asking for coding help. It is essential to test all AI-written code while in development, since inadequate testing could lead to low quality, buggy code. A programmer is responsible for what they create while coding with AI, even if AI writes the actual code. devtools::session_info() ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## curl 4.3 2019-12-02 [1] RSPM (R 4.0.3) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## highr 0.8 2019-03-20 [1] RSPM (R 4.0.3) ## hms 0.5.3 2020-01-08 [1] RSPM (R 4.0.0) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## httr 1.4.2 2020-07-20 [1] RSPM (R 4.0.3) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.0.2) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## ottrpal 1.0.1 2023-03-28 [1] Github (jhudsl/ottrpal@151e412) ## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.3) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## readr 1.4.0 2020-10-05 [1] RSPM (R 4.0.2) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.0.2) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.3) ## vctrs 0.6.1 2023-03-22 [1] CRAN (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["refactoring-code.html", "Chapter 4 Refactoring Code 4.1 Learning Objectives 4.2 Refactoring Basics 4.3 AI in Code Refactoring 4.4 Example One: Correcting Syntax 4.5 Example Two: Styling and Convention 4.6 Example Three: Staying DRY 4.7 Example Four: Keeping Code Alive 4.8 Example Five: Making Code Readable 4.9 Example Six: Keep it Brief 4.10 Code optimization 4.11 Challenges and Limitations 4.12 Hands-On Exercise 4.13 Summary", " Chapter 4 Refactoring Code 4.1 Learning Objectives Describe how refactoring code involves optimization for maintainability, efficiency, and reuse Explain why refactoring code is important for developers in the longterm Recognize the benefits and limitations of using AI tools to refactor code, as well as why AI tools are uniquely poised to be beneficial Implement prompt strategies that can be used to assist with refactoring code for correcting syntax, for adopting more consistent styling, for making code more concise, for making code easier to maintain, and for making code more efficient 4.2 Refactoring Basics Code refactoring is the process of improving the quality of underlying code without changing its functionality. In other words, it’s a way of cleaning up and optimizing code so that it’s easier to maintain and more efficient. This often involves making small changes to the code, such as renaming variables or functions, reorganizing code blocks, or simplifying complex expressions. Refactoring is an essential practice in software development and helps to ensure that the codebase remains manageable and adaptable as requirements and business needs change over time. Code refactoring helps to reduce technical debt, which is the accumulation of development work that needs to be done in the future as a result of taking shortcuts or using less than optimal solutions. Refactoring can help to identify potential issues and bugs before they cause problems, resulting in more stable software. Finally, refactoring code to be more readable and less verbose can create fewer headaches for you in the future. To understand why code refactoring is important, imagine trying to cook in a disorganized and cluttered kitchen. You might be a fantastic cook, but you are spending more time searching for utensils and ingredients, and the quality of the meal could suffer as a result. Similarly, code that is disorganized and cluttered can be difficult to work with and can result in lower-quality software. Refactoring is like cleaning and organizing the kitchen - it makes the process of cooking (or coding) smoother and more efficient. 4.3 AI in Code Refactoring Code refactoring has historically been done manually by developers. This involves reviewing code and identifying areas that could be improved or optimized, and then making changes to the codebase accordingly. Though important, this is process is time-consuming and labor-intensive, as it requires developers to carefully review every line of code to identify potential issues or areas for improvement. Additionally, manual code refactoring is error-prone, as developers can accidentally introduce bugs or errors into the codebase while making changes. However, AI has significant potential to help with code refactoring. AI can use machine learning algorithms to analyze large amounts of code and identify patterns or areas that could be improved. For example, they can identify sections of code that are redundant, overly complex, or difficult to maintain, and suggest changes that could be made to improve the codebase. Machine learning algorithms can also help to identify potential bugs or security issues in the codebase, which can help to improve the overall quality and stability of the software. AI refactoring is also faster and more accurate than manual refactoring. This is particularly useful for large-scale software projects with massive codebases, where manual code review and refactoring can be an enormous task. In the next sections, we’ll take a look at some examples of using AI to refactor code. 4.4 Example One: Correcting Syntax Programming languages operate using their established set of rules. For example, Python uses indentation to define code blocks. However, when you shift between development environments, indentation and line breaks can sometimes be affected, causing major headaches! Let’s say we run the following code: def calculate_sum(a,b): result = a + b return result def calculate_product(a,b):result = a * b return result def main(): a=5 b=6 sum_result = calculate_sum(a, b) print("Sum:", sum_result) product_result = calculate_product(a,b) print("Product:", product_result) if __name__ == '__main__': main() ## unexpected indent (<string>, line 3) We get the error above because our indentation is off. Let’s ask ChatGPT to clean things up. Can you assist me with correcting the formatting and indentation issues in my Python code? Of course! Here is the code after correcting the formatting and indentation: def calculate_sum(a, b): result = a + b return result def calculate_product(a, b): result = a * b return result def main(): a = 5 b = 6 sum_result = calculate_sum(a, b) print("Sum:", sum_result) product_result = calculate_product(a, b) print("Product:", product_result) if __name__ == '__main__': main() ## Sum: 11 ## Product: 30 Much better! This can be quite handy when you can’t immediately see what is wrong with the formatting or if you are working with a large codebase. 4.5 Example Two: Styling and Convention Sometimes programming languages have more flexible rules where there are multiple ways to take the same or almost the same action. For example, in the R programming language, there are several ways to perform variable assignment. However, is is generally accepted among R programmers that the <- operator should be used. Single and double quotes can be used for character types interchangeably, but it’s generally a good idea to stick with one or the other. 4.5.1 Commonly Accepted Convention Let’s say we have the following code: a <- "apple" b = 'banana' "carrot" -> c c(a, b, c) ## [1] "apple" "banana" "carrot" This code does not produce any errors, but it doesn’t follow typical R convention. Let’s ask ChatGPT to clean things up. Can you help me reformat my R code to follow accepted style conventions? Sure, here’s the cleaned-up R code: a <- "apple" b <- "banana" c <- "carrot" Much better! This code will now look more familiar to other R programmers. 4.5.2 Visual Styling Some languages are flexible about line breaks, indentation, and spacing among code blocks. If you’re rapidly developing, things can get messy pretty quickly. Many development environments, for example RStudio and PyCharm, have the ability to format your code for you without changing any of the code itself. However, you can also get AI to do this according to your own preferences. d <- c(rep(a,5),rep(b,5),rep(c,5),paste(a,b,c),paste(c,b,a)) This code is pretty hard to read. Let’s see if AI can do better. Can you space out this R code to make it more readable? Sure! Here’s the same code with added spacing for improved readability: d <- c(rep(a, 5), rep(b, 5), rep(c, 5), paste(a, b, c), paste(c, b, a)) Better! It’s easier to interpret because only one action is being taken on each step. By spacing out the code and breaking it into multiple lines, it becomes easier for the human eye to scan for structure, logic, errors, and/or inconsistencies. 4.6 Example Three: Staying DRY The DRY (Don’t Repeat Yourself) programming tenet is essential to good software. By avoiding repetition in code, we can reduce the amount of duplicate code we need to write and maintain. If we need to change the functionality of a certain piece of code, we have to make the same change in multiple places, which can be time-consuming and error-prone. Let’s take the following Python code: def print_greetings(): print("Hello, Alice!") print("Hello, Bob!") print("Hello, Carol!") print("Hello, David!") print("Hello, Eve!") print_greetings() ## Hello, Alice! ## Hello, Bob! ## Hello, Carol! ## Hello, David! ## Hello, Eve! Notice how repetitive this code is? print() and the string \"Hello, \" appear five times. We can improve this! Could you please refactor my Python code to make it more DRY? Sure, here’s a refactored version of your code: def print_greeting(name): print(f"Hello, {name}!") def print_greetings(): names = ["Alice", "Bob", "Carol", "David", "Eve"] for name in names: print_greeting(name) print_greetings() ## Hello, Alice! ## Hello, Bob! ## Hello, Carol! ## Hello, David! ## Hello, Eve! Now let’s imagine your software lead has asked us to change the greeting to Spanish. Notice how we only have to change the second line of code: def print_greeting(name): print(f"¡Hola, {name}!") def print_greetings(): names = ["Alice", "Bob", "Carol", "David", "Eve"] for name in names: print_greeting(name) print_greetings() ## ¡Hola, Alice! ## ¡Hola, Bob! ## ¡Hola, Carol! ## ¡Hola, David! ## ¡Hola, Eve! Much easier. 4.7 Example Four: Keeping Code Alive During software development, code is often changing rapidly. It’s common to end up with functions or variables you don’t need anymore. It’s best practice to remove “dead” code from your codebase: it’s distracting and can make maintenance more challenging. Programmers should resist the urge to hang on to unused code in the expectation that they might need it one day. Version control, such as provided by git and GitHub, let you keep a record of old code without cluttering your final version. Let’s take a look at some Python code with some dead code: def default_values(): a = 5 b = 6 return a, b def calculate_sum(a, b): result = a + b return result def calculate_product(x, y): return x * y def simulate_data(): a, b = default_values() dat = calculate_sum(a, b) + calculate_sum(a, b) return dat def main(): a = 5 b = 6 a, b = default_values() sum_result = calculate_sum(a, b) print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 Some of these functions aren’t used in the final step, typically defined in python as the main() function. Let’s ask AI to remove them. I need help with eliminating unused functions in my Python script. Sure! Here’s a refactored version: def default_values(): a = 5 b = 6 return a, b def calculate_sum(a, b): result = a + b return result def main(): a = 5 b = 6 a, b = default_values() sum_result = calculate_sum(a, b) print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 Great! Now our code is much more manageable. This code only includes the necessary functions needed to run the main() function. We can go a step further! Can you help me refactor my python code to make it more concise? Certainly! Here’s a more concise version of your code: def calculate_sum(a=5, b=6): return a + b def main(): sum_result = calculate_sum() print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 In this version, the calculate_sum function is simplified to take default arguments for a and b. This means the default_values function is no longer necessary. The a and b variables are also removed from main, as they are no longer needed. Much better and easier to look at overall. 4.8 Example Five: Making Code Readable Usually, our first goal as programmers is to get the response we need from the code. Readability might be the last thing on our minds. Luckily, AI can help with this. Let’s imagine we whipped up this code pretty quickly. It is tough to read, and it could definitely be improved. for(term in c("good","bad","ugly")){ print(c(rep(term,3),paste("really",stringr::str_to_upper(term)))) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" Let’s see if AI can do better. Can you help me clean up this R code so it is more readable? Sure! Here’s a more readable version of the code: library(stringr) for(term in c("good", "bad", "ugly")) { print(c(rep(term, 3), paste("really", str_to_upper(term)))) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" I added whitespace around operators and after commas for better readability. I also loaded the stringr package explicitly using library() to make the code more self-contained. This is a good start, but not much has changed. Let’s try again. On ChatGPT, we can click “Regenerate Response”. Here’s a cleaned-up version of the R code that is more readable: library(stringr) terms <- c("good", "bad", "ugly") for (term in terms) { rep_term <- rep(term, 3) upper_term <- str_to_upper(term) really_upper_term <- paste("really", upper_term) result <- c(rep_term, really_upper_term) print(result) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" I’ve stored the repeated term and the uppercased term in separate variables to make the code more readable. I’ve also separated the construction of the “really” phrase from the uppercased term to make it clearer what’s happening. Finally, I’ve used whitespace and indentation to make the structure of the code more apparent. Better! While the code takes up a greater number of lines, it’s easier to interpret because only one action is being taken on each step. 4.9 Example Six: Keep it Brief As we learned above, following the DRY principle and removing dead code can make your code easier to interpret, maintain, and debug. However, sometimes the issue is the functions themselves. No one has perfect knowledge of everything in their programming language. AI can help us determine if there are any more efficient sets of functions that do the same thing. Here is some code that plays with the “CO2” dataset in R: library(datasets) for (type in unique(CO2$Type)) { dat_subset <- CO2[CO2$Type == type, ] for (plant in unique(dat_subset$Plant)) { dat_subset_2 <- dat_subset[dat_subset$Plant == plant, ] print(paste(dat_subset_2$Plant[1], round(mean(dat_subset_2$uptake), 1))) } } ## [1] "Qn1 33.2" ## [1] "Qn2 35.2" ## [1] "Qn3 37.6" ## [1] "Qc1 30" ## [1] "Qc2 32.7" ## [1] "Qc3 32.6" ## [1] "Mn1 26.4" ## [1] "Mn2 27.3" ## [1] "Mn3 24.1" ## [1] "Mc1 18" ## [1] "Mc2 12.1" ## [1] "Mc3 17.3" Let’s see if AI has any ideas for making it more concise. Can you make this code more concise? Here’s a more concise version using dplyr package in R: library(dplyr) CO2 %>% group_by(Type, Plant) %>% summarize(mean_uptake = mean(uptake)) ## # A tibble: 12 × 3 ## # Groups: Type [2] ## Type Plant mean_uptake ## <fct> <ord> <dbl> ## 1 Quebec Qn1 33.2 ## 2 Quebec Qn2 35.2 ## 3 Quebec Qn3 37.6 ## 4 Quebec Qc1 30.0 ## 5 Quebec Qc3 32.6 ## 6 Quebec Qc2 32.7 ## 7 Mississippi Mn3 24.1 ## 8 Mississippi Mn2 27.3 ## 9 Mississippi Mn1 26.4 ## 10 Mississippi Mc2 12.1 ## 11 Mississippi Mc3 17.3 ## 12 Mississippi Mc1 18 This code groups the CO2 dataset by Type and Plant, calculates the mean uptake for each group using summarize, and then prints the resulting data frame. The code is shorter and more concise because it uses the dplyr package, which has built-in functions for data manipulation and summarization. Refactoring the code to be more concise using dplyr makes it easier to read and understand the steps involved in the data manipulation. It also reduces the number of nested loops and intermediate variables, making the code more efficient and reducing the chance of errors. Ultimately, it is your job as a programmer to use your best judgment on the fine balance between brevity and readability, as the best solution is not always this obvious. Remember that you can regenerate the AI’s response if you want more options. 4.10 Code optimization Sometimes time and efficiency is of the essence. Loops can be slow and time consuming in many languages. Take for example the following R code that calculates the cross product between two vectors x and y using nested for loops: set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) z <- numeric(n) # Start timer start_time <- proc.time() for(i in 1:n) { for(j in 1:n) { z[i] <- z[i] + x[i]*y[j] } } # End timer proc.time() - start_time ## user system elapsed ## 11.986 0.003 11.988 What is a faster, more optimized way of running the following R code? set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) # Start timer start_time <- proc.time() z <- outer(x, y, "*") z <- rowSums(z) # End timer proc.time() - start_time ## user system elapsed ## 0.745 0.504 0.832 The outer() function performs the same calculation as the nested loop in the original code, but more efficiently. It returns a matrix of all possible combinations of x and y values, with each element of the matrix being the product of the corresponding x and y values. The rowSums() function is then used to sum the elements of each row of the matrix, which is equivalent to summing the products of x and y for each index i in the original loop. This method avoids the need for the nested loop, resulting in a faster and more efficient computation. So much faster! We can look at another option by regenerating the response: set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) z <- numeric(n) # Start timer start_time <- proc.time() z <- x %*% t(y) # End timer proc.time() - start_time ## user system elapsed ## 0.394 0.452 0.536 One optimized way to perform the same calculation is by using the %*% operator to perform matrix multiplication. This can be done by converting x and y to matrices and transposing one of them so that their dimensions align for matrix multiplication. This code should be much faster than the original implementation because it takes advantage of highly optimized matrix multiplication algorithms in R. While this second suggestion is faster, you will need to consider what aspects of the codebase are most important in each instance. For example, this code runs more quickly, but the %*% operator might be unfamiliar to some R programmers. In cases where efficiency is less important, or the data are not large, you might consider maximizing readability. 4.11 Challenges and Limitations Like humans, AI can make mistakes. Be sure to keep the following in mind as you use AI to refactor your code. 4.11.1 Complexity Refactoring is often a complex process that requires deep understanding of the code and its context. AI may not always be able to fully understand the complexity of the code and may struggle to identify the best refactoring strategy. Use a modular approach whenever possible. 4.11.2 Limited Data AI models require large amounts of data to learn from, but in the case of code refactoring, there is often limited data available. This can make it difficult for AI models to generalize to new code bases and situations, especially if you are using a more niche programming language. 4.11.3 Quality Control Automated refactoring tools that use AI may not always produce code that is of the same quality as code produced by human developers. It can be difficult to always ensure that the refactored code is maintainable, efficient, and free of bugs. You need to use your best judgment when copying and pasting AI-produced code into your codebase. You should always include unit tests in your code. Tests can help you catch bugs, including those introduced accidentally by AI. Because AI models are created by humans, they can be biased. This means they may not always identify your preferred refactorings or may prioritize certain types of refactorings over others. In some cases, this can lead to suboptimal code quality and may create technical debt over time. 4.11.4 Security When using AI to refactor code, the code itself is often sent to an external service or platform for analysis and transformation. This can raise concerns about the security of the code, especially if it contains sensitive information such as trade secrets, proprietary algorithms, or personal data. If your code is sensitive, it’s important to carefully vet any third-party AI tools or services used in the refactoring process. 4.12 Hands-On Exercise Now it’s your turn to try. 4.12.1 The Code Let’s say you are dusting off some code from your past (no judgment here). You were investigating tweets about Mr. Trash Wheel, a beloved Baltimore-based contraption that filters trash out of the waterways. Note: This code is just an example and was written strictly for educational purposes. import tweepy import pandas # Enter your API keys and access tokens here consumer_key = 'your_consumer_key' consumer_secret = "your_consumer_secret" access_token = 'your_access_token' access_token_secret = 'your_access_token_secret' # Authenticate with Twitter API auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q="Mr. Trash Wheel", tweet_mode='extended').items(100) # Create empty list to store tweet data date_data = [] location_data = [] text_data = [] def get_tweet_length(tweet): # Return the length of the tweet text return len(tweet.full_text) # Loop through each tweet and extract desired data for tweet in tweets: date_info = { 'date': tweet.created_at } date_data.append(date_info) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q="Mr. Trash Wheel", tweet_mode='extended').items(100) # Loop through each tweet and extract desired data for tweet in tweets: location_info = { 'location': tweet.user.location } location_data.append(location_info) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q='Mr. Trash Wheel', tweet_mode='extended').items(100) # Loop through each tweet and extract desired data for tweet in tweets: text_info = { 'text': tweet.full_text } text_data.append(text_info) # Combine lists into a dictionary data = {'date': date_data, 'location': location_data, 'text': text_data} # Store results in pandas dataframe df = pandas.DataFrame(data) # Print dataframe print(df) 4.12.2 Questions Create an AI prompt that fixes any formatting issues with the code that would cause it not to run. Devise an AI prompt that removes any dead code from your sample above. What gets removed? Create a prompt that makes the code less repetitive, adhering to the DRY principle. What aspect of the code was repetitive? Construct a prompt that makes the code more concise. What are some trade-offs that appear in this code between readability and brevity? 4.13 Summary Code refactoring is the process of improving code quality without changing its functionality. It is crucial in software development to maintain a manageable and adaptable codebase. Code refactoring reduces technical debt, improves code stability, and makes it easier to maintain. Examples of using AI for code refactoring include correcting syntax, adhering to styling and convention, visual styling, avoiding repetition, removing dead code, and improving both readability and speed of execution (optimization). The use of AI for code refactoring raises ethical concerns and is not perfect. It is important for the developer to consider security needs of their code, as well as test out their code. "],["annotating-your-code.html", "Chapter 5 Annotating Your Code 5.1 Learning Objectives 5.2 Annotating Code is Good Practice 5.3 Improves readability 5.4 Improves maintainability 5.5 Improves the quality 5.6 Examples of quality aiding comments 5.7 AI in Code Annotation 5.8 Ethics of using AI to annotate code 5.9 Examples on using AI for annotation 5.10 Summary", " Chapter 5 Annotating Your Code 5.1 Learning Objectives Explain the significance and benefits of code annotation and how it aids in understanding and working with code in the future. Demonstrate the ability to apply effective code annotation practices by providing clear and concise comments in code. Recognize the impact of code annotation on code maintainability. Explain how well-annotated code can facilitate collaboration among developers and ensure code consistency. Critically evaluate the use of AI in code annotation, including benefits, ethical considerations, and limitations. Explore how AI can be used to create README files, do line-by-line annotations, and offer potential code improvements. 5.2 Annotating Code is Good Practice Code annotation, also known as code commenting, is the process of adding explanatory notes to source code. These notes are used to provide context, clarify functionality, and aid in understanding for developers who may be working on the codebase in the future. Code annotation is an important practice for any developer looking to write clear, efficient, and maintainable code. There are many benefits to annotating code: Improves readability Improves maintainability Improves quality 5.3 Improves readability First, it can help to improve the readability of code. By adding comments, developers can explain the purpose of each section of code, which can make it easier for others to understand what the code is doing. This can be especially helpful for large or complex codebases, where it can be difficult to keep track of all the different components. This is particularly important in contexts where the original developer of a project may move on to something else and others are left to work on them. Annotation perhaps most often helps a developer remember things they knew about the code when they were originally writing it (annotation is helpful for future you!) If the original developer left well-annotated code, it can drastically improve the ability of others (and their future selves) to continue with the project. 5.3.1 Examples of readability aiding comments Comments that help readability clarify what the code is doing Function explanations: A comment at the beginning of a function or method can describe its purpose, parameters, and expected return values. This makes it easier for others to understand what the function does and how to use it. # This function calculates and returns the sum of two numbers (x and y) def add_numbers(x, y): return x + y Inline explanations: Use inline comments to explain what a specific line or block of code does. This can help someone reading your code to quickly understand what’s going on. # Loop through each item in the list for item in my_list: # Check if the item is greater than 10 if item > 10: # Print the item print(item) TODO comments: Use TODO comments to mark areas of your code that need further work or improvement. This can help you or others to remember to come back to a specific part of the code. # TODO: Implement error handling for this function def my_function(): pass Parameter descriptions: If a function or method has complex parameters, it can be helpful to add comments explaining what each parameter does. def my_function(parameter1, parameter2): """ Calculate the sum of two numbers. Parameters: parameter1 (int): The first number to be added. parameter2 (int): The second number to be added. Returns: int: The sum of parameter1 and parameter2. """ return parameter1 + parameter2 Code block summary explanations: If you have a long or complex code block, you can add a comment to explain what the block is doing. # This code block creates a dictionary containing the counts of each word in a list of text strings word_counts = {} for text in text_list: for word in text.split(): if word not in word_counts: word_counts[word] = 0 word_counts[word] += 1 5.4 Improves maintainability Code annotation can help to improve the maintainability of code. By adding comments, developers can explain the reasoning behind certain decisions, which can make it easier for others to make changes to the code without breaking it. This can be especially helpful when multiple developers are working on the same codebase, as it can help to prevent conflicts and ensure that the code is always in a consistent state. 5.4.1 Examples of maintainability aiding comments Comments that help maintainability explain the historical context of why code was made the way it was Examples of maintainability aiding comments Design decisions: If there were specific design decisions made when creating the code, you can add comments explaining why certain choices were made. bash # We chose to use a linked list data structure for this function to reduce the time complexity of inserting and deleting elements. Legacy code: Sometimes, code may have been written in a certain way due to constraints or limitations at the time it was created. Adding comments to explain this can help others understand why the code is the way it is. # This code was written before Python 3, which introduced the `yield from` syntax. Therefore, we used a `for` loop to iterate over the nested list. Performance optimizations: If certain performance optimizations were made to the code, you can add comments explaining why they were necessary. bash # We used memoization to improve the time complexity of this recursive function, as it was taking too long to execute for larger inputs. Compatibility considerations: If the code was written with compatibility considerations in mind, you can add comments explaining why certain choices were made. # We used the `os.path` module to ensure that this code will work on both Windows and Unix-based systems, as the path separators are different on each platform. Limitations: If there are limitations or edge cases that the code cannot handle, you can add comments to explain this to others. # Note that this function assumes that the input array is sorted in ascending order. If the array is unsorted, the results may be incorrect. 5.5 Improves the quality Code annotation can help to improve the quality of code. By adding comments, developers can identify potential issues or edge cases, which can help to prevent these issues from occurring in the first place. This can be especially helpful when testing code, as it can help to ensure that the code is working as expected. 5.6 Examples of quality aiding comments Comments that help improve the quality of the code by explaining to others how to use it or help improve it Error handling: Adding comments to explain how and why error handling is being implemented can help ensure that your code is robust and able to handle unexpected inputs or errors. This helps others know how the code was intended to be used. # If the input argument is not a list or is empty, raise a ValueError if not isinstance(input_list, list) or len(input_list) == 0: raise ValueError("Input must be a list that is not empty") Complexity: If your code has particular complexities, adding comments that explain it can help others understand the performance characteristics of your code. It may help others identify whether there is a simpler way to write the code. By adding a comment that expresses uncertainty about the code and asking for suggestions, the author can potentially receive feedback from others on how to improve the code. # This block of code could probably be simplified, but I'm not sure how. new_list = [] for i in old_list: if i > 0: new_list.append(i) Constants and variables: Adding comments to explain the purpose of constants and variables can make your code easier to use. It not only notifies others of the variables existence but lets them know if they need to change the parameters for their own purposes. # This constant represents the maximum allowed number of retries when attempting to connect to the server. MAX_RETRIES = 3 # This variable tracks the number of failed attempts to connect to the server. num_retries = 0 Code organization or disorganization: Adding comments to explain the organization and structure of your code can make it easier for others to navigate and may bring out a better organizational strategy for your code. # Define helper functions for data processing def preprocess_data(input_data): # Implementation details def analyze_data(processed_data): # Implementation details def visualize_data(analyzed_data): # Implementation details # Load data from file input_data = load_data("input.txt") # Preprocess data processed_data = preprocess_data(input_data) # Analyze data analyzed_data = analyze_data(processed_data) # Visualize data visualize_data(analyzed_data) Assumptions and constraints: Adding comments to explain the assumptions and constraints of your code can help others understand its limitations and potential pitfalls. # This function assumes that all input values are positive integers. Negative or non-integer inputs may result in unexpected behavior. 5.7 AI in Code Annotation We’ve discussed why code annotation and documentation are important, but when and why would you use AI for code annotation? AI can be a nice tool to supplement the annotation of your code. It should not be the only source of annotation for your code, because as the code author, you need to verify that what AI has annotated is consistent with your knowledge and history of development of the code. But using AI to annotate your code can be useful to supplement existing code annotations or to annotate old code that was poorly annotated either by yourself or others who are no longer working on the project. Here are some of the benefits of using AI for code annotation: Speed and efficiency: AI algorithms can analyze code much faster than humans, which means they can quickly generate comments and annotations for large codebases. This can save developers significant time and effort, allowing them to focus on other aspects of the development process. Consistency: Unlike humans, AI is not affected by personal biases or preferences, so it can provide consistent annotations across different code files and projects. A human may underestimate places in the code that should have annotation, whereas an AI might be more consistent at putting annotation in these places. This can help ensure that all code in a project is well-documented and easy to understand. Objectivity: AI can analyze code objectively and identify potential issues that may have been missed by humans. This can lead to better quality code that is easier to maintain and less prone to errors. Learning: AI models can learn from large datasets of annotated code and improve their ability to generate comments and annotations over time. This means that the more code the AI model analyzes, the more accurate and effective it becomes at annotating code. Specificity: AI models can be trained on specific programming languages, frameworks, or libraries, allowing them to generate language-specific comments and annotations that are tailored to the needs of the project. This can be particularly helpful for large, complex projects that require specialized knowledge or expertise. 5.8 Ethics of using AI to annotate code However, there are also a number of potential ethical concerns associated with using AI to annotate code. For example, we don’t yet know how and in what ways AI models may be biased. Additionally, AI models may be opaque, which could make it difficult to understand why they made certain annotations. Finally, because AI models are not humans and don’t necessarily tell the stories behind the code, they may be used to generate annotations that are not accurate, helpful, or do not tell the full depth of the history of what occurred with the code, which could lead to problems. Given these potential benefits and concerns, it is important for users of AI to always realize that they are ultimately accountable for the annotation that an AI model makes, and careful review of this annotation is needed. There are a number of ethical considerations to take into account when using AI to annotate code. Here are a few of the most important considerations: Accountability: First and foremost, a user of AI is always primarily accountable for any output that they use from an AI model. AI models can give you annotation to start with, but it is up to you as the user to verify and review this output carefully. The user of the AI model is ultimately responsible for keeping or throwing out the annotations the AI makes and thus is responsible for using errors that the model makes. Much like a user of a Google Search engine is responsible for which results they use, a user of AI is responsible what output from the AI model they use. Transparency: It is important to be transparent about the use of AI in code annotation. This means disclosing the fact that AI is being used, as well as the specific AI model and dataset that is being used. This should be stated on every file where annotation has been made using AI. This transparency allows others who view the code to be able more fully interpret the AI-created annotation that accompanies the code. Bias: AI models are trained on data, and this data can introduce bias into the model. It is important to be aware of the potential for bias and to take steps to mitigate it. This can be done by using a diverse dataset, by carefully selecting the features that are used to train the model, and by using techniques such as adversarial training. It is important to provide annotations that indicate any known biases, possible limitations associated with bias, and any strategies that were used to mitigate bias. Explainability: It is important to be able to explain the decisions that an AI model makes. This is especially important in the case of code annotation, where the decisions made by the AI model can have a significant impact on the quality of the code. There are a number of techniques that can be used to explain the decisions of an AI model, such as visualization and rule extraction. You can (and should) ask a chatbot to explain its sources and rationale for output that it gave. (Be aware that actual citations it gives may or may not be accurate, and you need to verify the accuracy of those citations by doing your own follow up literature search). 5.9 Examples on using AI for annotation 5.9.1 Ask for a README summary To try out some annotation with code examples, this author dug up some old code that she had no idea about what it did anymore because time had passed and she didn’t document it very well. First, I wanted ChatGPT to make a README for me. README’s are a standard file that explain what the code base does and provides a summary of what is happening in the set. I asked ChatGPT if it could: Create a README for this code and then I pasted the old code. ChatGPT gave me some output that generally looked like a README: This README seems accurate given the work I was doing at the time. But obviously the title isn’t great – it doesn’t describe the code well. Plus there’s not really information about usage or outputs of the code. So I asked it: Can you make this README more succinct and with sections about how you would use this code? This yielded a much better result. 5.9.2 Ask for line by line annotation Second, I wanted to have ChatGPT annotate code line by line. So I asked it Can you annotate some R code for me? It not only provided helpful annotations but it fixed spacing and added more spaces between lines of code: It does however, think the code is Python apparently if we look in the upper left corner. But this doesn’t seem to have affected its accuracy in its annotations. 5.9.3 Ask for how the code could be improved This code is old, and I don’t think it runs properly and is in no way reproducible. So I wanted to see what ChatGPT would recommend for improvements to the code. I said How could I make this code better? It had a lot of great advice: First and foremost it told me my variable names are not consistent and also not descriptive. Which is completely accurate! There’s variable names like xx and ll which don’t tell the reader anything about the variable. 5.9.4 Style the code Next, I asked chatGPT if it could restyle the code into tidyverse style. It definitely put elements that look like tidyverse however, it also put items in the code that I can tell by looking at it won’t work. So I tried to tell it about the errors: :::{.query} This code is close but there are some errors. These tidyverse functions don’t work with matrices. ::: and it told me: You are correct that the tidyverse functions are designed to work with data frames and not matrices. Here's a modified version of your code that converts the matrix to a data frame and uses tidyverse functions: The lesson here is that the output of chatGPT still needs to be vetted by the person asking for it. It is a great idea to continue to have AI’s work on something if it isn’t quite what you are asking for, however, at the end of the day it is you, the human, who has to vet the output. 5.9.5 Sometimes it has trouble with file types if given a URL Copying and pasting code appears to be the best way to go at this point in time. I asked chatGPT if it could annotate code in a Jupyter notebook at a URL I gave it: Can you annotate the code at this URL? https://github.com/jhudsl/reproducible-python-example/blob/main/make_heatmap.ipynb It responded with some of the code at that file where it was annotated but most of the notebook was not there. I told ChatGPT: That isn’t all the code at that url ChatGPT told me: You're right, I apologize. The code at the given URL is actually in a Jupyter Notebook format, so it's not easy to copy-paste here. However, I can suggest an alternative approach: you can use the website nbviewer (https://nbviewer.jupyter.org/) to view the notebook and its code. Here are the steps to do so: Go to https://nbviewer.jupyter.org/ Paste the URL of the notebook https://github.com/jhudsl/reproducible-python-example/blob/main/make_heatmap.ipynb into the "Enter the location of a Jupyter Notebook" field and press "Go". This will display the notebook and its code, and you can read through it and add your own annotations as needed. I hope this helps! This was a nice tool to recommend, however it still told me I should add my own annotations at the end of this. 5.10 Summary Code annotation is important for readability, maintainability, and overall quality of code AI can be a helpful tool for supplementing annotations or creating annotation for poorly annotated code. Ultimately the code author who uses AI as a tool for annotation is still responsible for verifying that the annotations are consistent with their knowledge of the code. devtools::session_info() ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## curl 4.3 2019-12-02 [1] RSPM (R 4.0.3) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## highr 0.8 2019-03-20 [1] RSPM (R 4.0.3) ## hms 0.5.3 2020-01-08 [1] RSPM (R 4.0.0) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## httr 1.4.2 2020-07-20 [1] RSPM (R 4.0.3) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.0.2) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## ottrpal 1.0.1 2023-03-28 [1] Github (jhudsl/ottrpal@151e412) ## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.3) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## readr 1.4.0 2020-10-05 [1] RSPM (R 4.0.2) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.0.2) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.3) ## vctrs 0.6.1 2023-03-22 [1] CRAN (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["understanding-unfamiliar-code.html", "Chapter 6 Understanding Unfamiliar Code 6.1 Learning Objectives 6.2 Reading Unfamiliar Code Is A Skill 6.3 AI in Reading Code 6.4 Example One: Summarizing Code You Didn’t Write 6.5 Example Two: Identifying a Coding Language 6.6 Example Three: Interpreting Regex 6.7 Example Four: Demystifying Functions 6.8 Hands-On Exercise 6.9 Summary", " Chapter 6 Understanding Unfamiliar Code 6.1 Learning Objectives Recognize the benefits, limitations, and assumptions in using AI to understand unfamiliar code Consider the ethical questions around using AI to understand another person’s code Practice using AI to summarize code, identify an unknown coding language, and interpret regex and unknown functions 6.2 Reading Unfamiliar Code Is A Skill As a programmer, you will frequently encounter situations where you need to read and understand code written by other developers. This could be because you are collaborating on a project, you have taken over maintenance of an existing codebase, or you are learning new syntax or skills that require reading example codes. Comprehending code written by someone else is a distinct skill from being able to write your own code, and it takes practice to become proficient at it. Reading unfamiliar code is like exploring an unfamiliar city without a map or a guide. Just like in a new city, you may not know where to start or how to navigate the codebase. You may encounter unfamiliar syntax, functions, and libraries that you have never seen before, just as you might encounter new streets, buildings, and landmarks. At first, you may feel disoriented and overwhelmed, and may need to spend some time getting oriented and familiarizing yourself with the environment. As you explore, you may start to see patterns and similarities, just as you might begin to recognize neighborhoods and landmarks in a new city. You may also encounter dead-ends, confusing intersections, and unexpected detours, just as you might encounter bugs and errors in the code. To make progress in this unfamiliar territory, you may need to rely on a combination of intuition, deduction, and experimentation. You may need to break down the code into smaller pieces, analyze the behavior of each piece, and gradually build up a mental model of how the code works. You may also need to consult documentation, online resources, or other experts who are familiar with the codebase, just as you might ask locals or consult a map in a new city. In the end, with patience, persistence, and a willingness to learn, you can successfully navigate the unfamiliar code and achieve your goals, just as you can successfully explore a new city and discover its hidden treasures. Learning how to read and understand code written by someone else is a valuable skill that can help you be a more effective programmer. By being able to read and comprehend unfamiliar code, you can contribute to projects more quickly, diagnose and fix bugs more effectively, and learn new programming techniques and best practices. As with any skill, the more you practice reading and understanding code written by others, the more comfortable and proficient you will become at it. 6.3 AI in Reading Code While anyone can learn to understand code written by someone else, using AI language models to achieve this has three significant advantages. Summarize large codebases. AI can quickly scan large codebases and give you a high-level overview of what they do. This can save you a lot of time and effort, especially when dealing with complex codebases. For example, AI can identify the main functions and classes in a codebase, and it can show you how they are related. Analyze the code. AI can look at the code and tell you about its structure, complexity, and potential defects quickly and efficiently. This can help you understand the code better and make it easier to maintain and improve. For example, AI can identify parts of the code that are difficult to understand or maintain, and it can suggest ways to improve the code. Understand comments and documentation. AI can read comments and documentation written by other developers. This can help you understand the code’s purpose and the assumptions and limitations of the codebase. For example, AI can identify the key assumptions that are made in the code, and it can explain the trade-offs that were made in the design of the code. Keep these ethical considerations in mind when using AI to summarize code. Who owns the code? If you are not the owner of the code, you should get permission from the owner before summarizing it. What is the purpose of the summary? If you are summarizing the code for educational or research purposes, it is likely ethical to do so. However, if you are summarizing the code for commercial purposes, you may need to get permission from the owner. Does the code contain any sensitive or personal information? If the code contains any sensitive or personal information, you should take special care to protect that information. 6.4 Example One: Summarizing Code You Didn’t Write Here’s some simple code using the R programming language, written by an unnamed programmer. If you are familiar with R, you might be able to understand what this code does with little effort. However, if you don’t know R, you’re relatively new to R, or you’re just having a bad day, understanding what this bit of code can take a great deal more energy and time. AI language bots can ease that burden. library(tidyverse) d <- ggplot2::diamonds d_sel <- d %>% select(carat, cut, color, clarity, depth, table, price) d_fil <- d_sel %>% filter(price > 5000) d_bin <- d_fil %>% mutate(carat_bins = cut_width(carat, width = 0.2)) d_summ <- d_bin %>% group_by(carat_bins, cut, color, clarity) %>% summarize(mean_price = mean(price), sd_price = sd(price)) We first ask Claude-instant (as implemented by Poe) to explain the purpose of this code. What does this code do? You can ask for Claude to summarize each step in detail as well. Can you explain what each step does in detail? Maybe you’ve never worked with the tidyverse package in R - Claude can tell you about it. What is the tidyverse package? You might also not be familiar with the diamonds dataset (especially if you’ve never used it before) and want some clarification on where the data are from. Can you tell me more about the diamonds dataset? 6.5 Example Two: Identifying a Coding Language Sometimes you might have to work with legacy code. Legacy code can be difficult to work with, especially if it is written in a language or style with which you are not familiar. There are more than 700 programming languages in use today, so it is impossible for any programmer to know them all. AI can be a helpful tool for identifying the language and version of legacy code, which can make your life just a little easier. Let’s look at example code that might have been written decades ago. program temperature_smog_analysis; uses Math; const n_temperatures = 1000; n_smog_measures = 500; type TemperatureArray = array[0..n_temperatures-1] of integer; SmogArray = array[0..n_smog_measures-1] of integer; var temperatures: TemperatureArray; smog_measures: SmogArray; combined_data: array of integer; slope, y_intercept: double; i, j: integer; function connect_to_database(filename: string): integer; begin { implementation of connect_to_database function } end; function retrieve_temperatures(fd: integer): integer; begin { implementation of retrieve_temperatures function } end; function retrieve_smog_measures(fd: integer): integer; begin { implementation of retrieve_smog_measures function } end; function retrieve_temperature(fd, index: integer): integer; begin { implementation of retrieve_temperature function } end; function retrieve_smog_measure(fd, index: integer): integer; begin { implementation of retrieve_smog_measure function } end; procedure close_database(fd: integer); begin { implementation of close_database function } end; We can ask Bard to take a guess at what the coding language might be. What language is this code written in? We can explore further to figure out what indicators tell Bard the language is Pascal. How do you know this is Pascal? It turns out there are multiple versions of Pascal. Since you will presumably need to work with this legacy code, you might want to know which version it is. What version of Pascal is this? 6.6 Example Three: Interpreting Regex Regex (short for Regular Expressions) is a powerful tool used to describe patterns in text. It’s a sequence of characters that define a search pattern. Regular expressions can be a powerful tool for data cleaning, text mining, and data validation. They are widely used in web development, data science, and other fields where text processing is important. They can also be tricky to understand at first because they involve a specific syntax that can be complex. We can use ChatGPT to explain regex in a bit of someone else’s code. x = sub("/d/e","/d",x) What does this do? 6.7 Example Four: Demystifying Functions Sometimes we get handed code that includes complex architecture. Perhaps you are working with code you wrote years ago when you really liked loops, but present you finds them difficult to parse. (Be nice to past you - maybe you were a baby programmer and didn’t know better.) Instead of giving yourself a headache, you could turn to ChatGPT to explain what your old code does. def my_function(x): result = x for i in range(10): for j in range(5): result = result + 2 * (i + 1) * (j + 1) * (i % 2 == 0 and j % 2 == 0) - 1 return result What does this function do? Well, now you have an idea what past-you might have been attempting to do with this code. You can also query AI about the potential problems from using the code as-written. What are some possible issues with this code? (And if you do ever run across an expression like this in your code, you can check out our chapter on refactoring code using AI to fix it!) 6.8 Hands-On Exercise Now it’s your turn to try. Let’s say you were handed this bit of code to work with (and eventually modify), but first you need to figure out what’s going on with it. Unfortunately, the original programmer left very little in the way of notes or annotation. 6.8.1 The Code Note: This code is just an example and was written strictly for educational purposes. use ode_solvers::{Euler, OdeMethod}; use plotters::prelude::*; use std::fs::File; const N: f64 = 1000000.0; const I0: f64 = 10.0; const R0: f64 = 0.0; const S0: f64 = N - I0 - R0; const BETA: f64 = 0.3; const GAMMA: f64 = 0.1; fn sir_model(t: f64, y: &[f64], v: f64) -> Vec<f64> { let s = y[0]; let i = y[1]; let r = y[2]; let dsdt = -BETA * s * i / N - v * s; let didt = BETA * s * i / N - GAMMA * i; let drdt = GAMMA * i + v * s; vec![dsdt, didt, drdt] } fn main() { let mut solver = Euler::new(sir_model); solver.set_initial_condition(&[S0, I0, R0]); let root = BitMapBackend::new("sir_vaccination.png", (800, 600)).into_drawing_area(); root.fill(&WHITE).unwrap(); let mut chart = ChartBuilder::on(&root) .caption("SIR model with vaccination", ("sans-serif", 40)) .set_label_area_size(LabelAreaPosition::Left, 60) .set_label_area_size(LabelAreaPosition::Bottom, 40) .build_cartesian_2d(0.0..100.0, 0.0..N) .unwrap(); let mut data1 = vec![]; for _ in 0..1000 { let y = solver.integrate(0.1, 0.0); data1.push((solver.time(), y[0], y[1], y[2])); } let vac_rate = 0.1; let vac_coverage = 0.5; let vac_num = vac_coverage * N; let mut data2 = vec![]; for i in 0..1000 { let t = i as f64 * 0.1; let v = if t >= 50.0 && t < 150.0 {vac_num * vac_rate} else {0.0}; let y = solver.integrate(0.1, v); data2.push((solver.time(), y[0], y[1], y[2])); } chart .configure_mesh() .x_labels(10) .y_labels(10) .disable_x_mesh() .disable_y_mesh() .draw() .unwrap(); chart .draw_series(LineSeries::new( data1.iter().map(|d| 6.8.2 Questions Write a query that identifies the features that can be used to determine the coding language, as well as the version of the language. What language and version is it written in? What features give away the coding language? Create a prompt that determines what this code does, as well as important features of the program. What does this code do? Write a prompt that determines the purpose of this specific code snippet: let root = BitMapBackend::new("sir_vaccination.png", (800, 600)).into_drawing_area(); What is the purpose of this line of code? 6.9 Summary Understanding code written by someone else can be made easier by using AI AI chatbots can summarize the code and the dataset used, as well as clarify functions and expressions that are confusing AI chatbots can also identify the coding language and version used in legacy code Be mindful of who owns the code and what the summary will be used for when using AI to summarize someone else’s code "],["about-the-authors.html", "About the Authors", " About the Authors These credits are based on our course contributors table guidelines.     Credits Names Pedagogy Lead Content Instructor Elizabeth Humphries (Writing Code, Understanding Unfamiliar Code) Content Authors Candace Savonen (Annotating Your Code), Carrie Wright (Ethics of Using AI), Ava Hoffman (Refactoring Code) Content Editor Reviewer Howard Baek Technical Template Publishing Engineers Candace Savonen, Carrie Wright, Ava Hoffman Publishing Maintenance Engineer Candace Savonen Technical Publishing Stylists Carrie Wright, Ava Hoffman, Candace Savonen Package Developers (ottrpal) Candace Savonen, John Muschelli, Carrie Wright Art and Design Figure Artists Candace Savonen, Carrie Wright, Ava Hoffman, Elizabeth Humphries Funding Funders CS, CW, and HB were supported by the National Cancer Institute (NCI) under Grant UE5CA254170. AMH and EMH were supported by the AnVIL Project through cooperative agreement awards from the National Human Genome Research Institute with cofunding from OD/ODSS to the Broad Institute (U24HG010262) and Johns Hopkins University (U24HG010263). Funding Staff Sandra Ormbrek, Shasta Nicholson   Tools Used: ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["appendix.html", "Appendix Programming Languages AI and Cloud Computing", " Appendix Programming Languages Here are commonly used languages and their typical use cases. Python Known for its readability, simple syntax, and comprehensive add-on modules. It is often recommended as a beginner-friendly language. Python is used for scientific computing, data analysis, machine learning, and web development. Many Data Scientist roles rely on Python. Ruby Similar to Python, Ruby is also known for its readability and user-friendly syntax. It is typically used for web development, building dynamic websites, and creating web applications. JavaScript A popular language for web development, known for its versatility and ease of use. Many of the interactive features of websites rely on JavaScript. Java Java is widely used for enterprise applications, android mobile apps, and web apps. PHP PHP is easy to learn but can become complex as the application grows. It is typically used for building dynamic web pages, web applications, and content management systems. R Used for statistical computing, data analysis, and data visualization, R is a popular choice for researchers and data scientists. Some beginners find its syntax complex, especially due to differences in the two major dialects: “base” R versus the “tidyverse”. Kotlin Kotlin is a relatively new language that is designed to be more concise and expressive than Java. However, its advanced features and concepts may be challenging for beginners. It is used for developing Android mobile apps, web development, and server-side development. Swift Used for iOS and macOS app development, Swift is known for its strict syntax and steep learning curve. C# Often used for Windows desktop applications, web applications, and video games, C# can be challenging due to its more complex syntax and strict type system. C++ A powerful language often used for developing high-performance applications and operating systems, C++ can be challenging to learn due to its complexity and the need to manage memory manually. Julia Julia is designed for numerical and scientific computing, data analysis, and machine learning. It has a syntax that is easy to learn and read, making it an ideal choice for data scientists, engineers, and researchers. Julia code can also be compiled to native machine code using the Julia compiler. Because Julia is a relatively new language, it has fewer add-on libraries and resources available compared to more established languages. MATLAB MATLAB is a high-level programming language and development environment commonly used for numerical computation, data analysis, and visualization. It is widely used in engineering, physics, and finance, among other fields. It is generally considered to have a user-friendly syntax and is relatively easy to learn compared to other languages. MATLAB has a development environment called MATLAB Compiler that allows you to package MATLAB code into standalone executables or shared libraries for use on a wide variety of operating systems. Fortran Fortran has been around for decades and has a long history in scientific and engineering communities. It has a more challenging syntax and is considered harder to learn than some of the other languages on this list. It is primarily used for scientific and engineering applications that require numerical computations and simulations such as computational physics, weather forecasting, and computational chemistry. Rust Rust is a systems programming language that focuses on speed, reliability, and memory safety. It is commonly used for developing performance-critical software, such as operating systems, web browsers, and game engines. Rust’s syntax is similar to C++, but is often considered to have a steeper learning curve due to its focus on memory safety and ownership concepts. AI and Cloud Computing AI in cloud computing is an exciting and rapidly advancing field that combines artificial intelligence (AI) and cloud computing technologies. Cloud computing provides on-demand access to computing resources over the internet, such as storage, processing, and analytics, while AI uses algorithms and models to enable machines to perform tasks traditionally requiring human intelligence. Developers can easily incorporate AI into applications using cloud-based AI services. For example, Amazon Web Services (AWS), Microsoft Azure, and Google Cloud Platform offer AI services like speech recognition, image recognition, natural language processing, and machine learning. AI optimizes cloud resources and performance. It allocates resources based on workload demands, optimizes power usage, detects threats, and improves application latency by predicting user behavior and preloading content. However, integrating AI and cloud computing presents challenges around data, security, privacy, ethics, complexity, and management that must be addressed carefully. Large amounts of data are needed to train AI models, especially deep learning models requiring vast labeled data to identify patterns and predictions accurately. Storing and processing huge data can be expensive, impacting cost, scalability, and environment performance. Ensuring data security, privacy, and ethical use also require consideration. AI and cloud computing are complex with specialized skills and knowledge to use effectively. Integration increases complexity, challenging management and maintenance. Careful planning and execution evaluates benefits and limits of AI; selects appropriate models and algorithms; and determines integration into the cloud environment. Monitoring evaluates model performance, enabling adjustments to optimize performance and efficiency. As both AI and cloud computing technologies advance, the intelligent integration of the two can provide on-demand access to advanced AI capabilities, optimize resources, facilitate smarter applications, and gain data-driven business insights. Integration challenges around data, security, ethics, and complexity must be managed proactively through evaluation, planning, monitoring, and adjustments to maximize benefits and minimize limitations. When implemented responsibly, AI in cloud computing enables remarkable intelligent and scalable systems transforming organizations and society. "],["references.html", "References", " References "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] From 91f6ede243f70ec4e8d9b58c077d42c5c127ef27 Mon Sep 17 00:00:00 2001 From: jhudsl-robot Date: Wed, 12 Jul 2023 15:57:37 +0000 Subject: [PATCH 2/3] Render toc-less --- docs/no_toc/02-ethics.md | 2 ++ docs/no_toc/04-refactoring.md | 6 +++--- docs/no_toc/ethics-of-using-ai.html | 1 + docs/no_toc/refactoring-code.html | 6 +++--- docs/no_toc/search_index.json | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/no_toc/02-ethics.md b/docs/no_toc/02-ethics.md index 577b6a49..8358d4da 100644 --- a/docs/no_toc/02-ethics.md +++ b/docs/no_toc/02-ethics.md @@ -36,6 +36,8 @@ Note that this is an incomplete list; additional ethical concerns will become ap :::{.ethics} Be transparent about what AI tools you use to write code. This help others to better understand how you created your code, as well as the possible sources that the AI tools might have used when helping you write code. It may also help with future unknown issues related to the use of these tools. + +Some organizations and scientific societies have created guidelines or requirements for using AI in journal articles and conference submissions, like the [International Society for Computational Biology](https://www.iscb.org/iscb-policy-statements/iscb-policy-for-acceptable-use-of-large-language-models). Be aware of the requirements/guidelines for your field. ::: **It is essential to address these ethical concerns and ensure that the use of AI in coding is done in a responsible and transparent manner.** This could be done through ensuring the quality of the data used to train AI systems, promoting transparency in AI-generated code, and implementing safeguards against the creation of harmful or biased code. By doing so, we can harness the potential of AI to improve and transform the way we write and optimize code while maintaining ethical standards. diff --git a/docs/no_toc/04-refactoring.md b/docs/no_toc/04-refactoring.md index 3ead500c..6120c58a 100644 --- a/docs/no_toc/04-refactoring.md +++ b/docs/no_toc/04-refactoring.md @@ -547,7 +547,7 @@ proc.time() - start_time ``` ## user system elapsed -## 207.366 0.057 207.422 +## 231.734 0.076 231.807 ``` :::{.query} @@ -575,7 +575,7 @@ proc.time() - start_time ``` ## user system elapsed -## 0.531 0.336 0.588 +## 0.770 0.263 0.878 ``` The `outer()` function performs the same calculation as the nested loop in the original code, but more efficiently. It returns a matrix of all possible combinations of x and y values, with each element of the matrix being the product of the corresponding x and y values. The `rowSums()` function is then used to sum the elements of each row of the matrix, which is equivalent to summing the products of x and y for each index `i` in the original loop. This method avoids the need for the nested loop, resulting in a faster and more efficient computation. @@ -603,7 +603,7 @@ proc.time() - start_time ``` ## user system elapsed -## 0.260 0.288 0.355 +## 0.336 0.236 0.353 ``` One optimized way to perform the same calculation is by using the `%*%` operator to perform matrix multiplication. This can be done by converting x and y to matrices and transposing one of them so that their dimensions align for matrix multiplication. This code should be much faster than the original implementation because it takes advantage of highly optimized matrix multiplication algorithms in R. diff --git a/docs/no_toc/ethics-of-using-ai.html b/docs/no_toc/ethics-of-using-ai.html index 4dcf38b4..838447c4 100644 --- a/docs/no_toc/ethics-of-using-ai.html +++ b/docs/no_toc/ethics-of-using-ai.html @@ -400,6 +400,7 @@

2.2 Major concerns

Note that this is an incomplete list; additional ethical concerns will become apparent as we continue to use these new technologies. We highly suggest that users of these tools be transparent about the use of these tools, so that as new ethical issues emerge, we will be better prepared to understand the implications for specific coding projects.

Be transparent about what AI tools you use to write code. This help others to better understand how you created your code, as well as the possible sources that the AI tools might have used when helping you write code. It may also help with future unknown issues related to the use of these tools.

+

Some organizations and scientific societies have created guidelines or requirements for using AI in journal articles and conference submissions, like the International Society for Computational Biology. Be aware of the requirements/guidelines for your field.

It is essential to address these ethical concerns and ensure that the use of AI in coding is done in a responsible and transparent manner. This could be done through ensuring the quality of the data used to train AI systems, promoting transparency in AI-generated code, and implementing safeguards against the creation of harmful or biased code. By doing so, we can harness the potential of AI to improve and transform the way we write and optimize code while maintaining ethical standards.

diff --git a/docs/no_toc/refactoring-code.html b/docs/no_toc/refactoring-code.html index 5b1ac1ae..115d6c24 100644 --- a/docs/no_toc/refactoring-code.html +++ b/docs/no_toc/refactoring-code.html @@ -746,7 +746,7 @@

4.10 Code optimization

# End timer proc.time() - start_time
##    user  system elapsed 
-## 207.366   0.057 207.422
+## 231.734 0.076 231.807

What is a faster, more optimized way of running the following R code?

@@ -765,7 +765,7 @@

4.10 Code optimization

# End timer proc.time() - start_time
##    user  system elapsed 
-##   0.531   0.336   0.588
+## 0.770 0.263 0.878

The outer() function performs the same calculation as the nested loop in the original code, but more efficiently. It returns a matrix of all possible combinations of x and y values, with each element of the matrix being the product of the corresponding x and y values. The rowSums() function is then used to sum the elements of each row of the matrix, which is equivalent to summing the products of x and y for each index i in the original loop. This method avoids the need for the nested loop, resulting in a faster and more efficient computation.

So much faster! We can look at another option by regenerating the response:

@@ -784,7 +784,7 @@

4.10 Code optimization

# End timer proc.time() - start_time
##    user  system elapsed 
-##   0.260   0.288   0.355
+## 0.336 0.236 0.353

One optimized way to perform the same calculation is by using the %*% operator to perform matrix multiplication. This can be done by converting x and y to matrices and transposing one of them so that their dimensions align for matrix multiplication. This code should be much faster than the original implementation because it takes advantage of highly optimized matrix multiplication algorithms in R.

While this second suggestion is faster, you will need to consider what aspects of the codebase are most important in each instance. For example, this code runs more quickly, but the %*% operator might be unfamiliar to some R programmers. In cases where efficiency is less important, or the data are not large, you might consider maximizing readability.

diff --git a/docs/no_toc/search_index.json b/docs/no_toc/search_index.json index 1717acfe..fff272e0 100644 --- a/docs/no_toc/search_index.json +++ b/docs/no_toc/search_index.json @@ -1 +1 @@ -[["index.html", "AI for Software Development Harnessing the Power of Large Language Models About this Course Available course formats Suggested Activity Context Learning Objectives Lesson Breakdown", " AI for Software Development Harnessing the Power of Large Language Models July, 2023 About this Course This course on AI for software development explores the use of AI large language models such as ChatGPT, Bard, and others and their potential benefits and challenges. Through examples and hands-on activities, students will develop an understanding of the ways in which AI can speed up software development tasks and free up time for more creative and strategic work. By the end of the course, students will be equipped to navigate the rapidly changing landscape of software development and use AI chatbots in a way that maximizes benefits and efficiency while limiting harm as much as possible. Available course formats This course is available in multiple formats which allows you to take it in the way that best suits your needs. The material for this course can be viewed without login requirement on this Bookdown website. This format might be most appropriate for you if you rely on screen-reader technology. Our courses are open source, you can find the source material for this course on GitHub. The slides for the images in the course can be found here. Suggested Activity Context Course Audience Professionals looking to improve efficiency Students hoping to learn more about programming Anyone curious about how AI can be harnessed for technology Note: Those completely new to programming will find using AI tools to create software solutions challenging at this time. It is helpful to have some fundamental knowledge to write appropriate prompts and to discern when code is not working as expected. We advise novices to seek expert review. Course Prerequisites Some previous exposure to programming recommended. Assessment Type Hands-on activities following each lesson. Learning Objectives Learners will be able to: Explain the basics of AI and its potential for improving software development workflows Implement strategies to write and debug code using AI-based tools Describe the benefits of refactoring code using AI-powered techniques, such as making code readable, keeping it brief, and optimizing code Apply best practices for annotating code using AI Recognize strategies for using AI-based tools to understand and analyze code, such as code comprehension of unfamiliar languages or functions Discuss the challenges and ethical implications of using AI for different aspects of software development Lesson Breakdown Activity Duration Introduction 10 minutes Ethics for Using AI 20 minutes Writing Code 35 minutes Writing Exercise 15 minutes Refactoring Code 35 minutes Refactoring Exercise 15 minutes Annotating Code 25 minutes Understanding Code 25 minutes Understanding Exercise 10 minutes Total 3 hours & 10 minutes "],["introduction.html", "Chapter 1 Introduction 1.1 Learning Objectives 1.2 AI Provides New Opportunities 1.3 AI Code of Ethics 1.4 The AI Chatbots 1.5 How to Use This Book 1.6 About This Book", " Chapter 1 Introduction The increasing availability of AI chatbots is creating a new landscape in software development and data science. It is important to be aware of the potential benefits and challenges of this technology, so that we can use it in a way that benefits everyone and limits harm as much as possible. On the one hand, AI chatbots have the potential to replace or significantly reduce the workload of programmers. This could lead to job losses in the data science industry. Additionally, there are significant ethical and privacy concerns regarding the use of training data sets to teach these AI systems. For example, if a chatbot is trained on a dataset of biased or discriminatory data, it could perpetuate those biases in its interactions with users. On the other hand, AI chatbots also have the potential to create new jobs and opportunities. For example, chatbot developers will be needed to create and maintain these AI systems. Additionally, AI chatbots could be used to automate tasks that are currently done by humans, freeing up programmers to focus on more creative and strategic work of interpreting what the data actually mean. Ultimately, while the future of programming in software development and data science is unclear, there is much to be optimistic about in this brave new world. The advancements in AI and chatbot technology present an opportunity for programmers to work alongside algorithms to create innovative solutions that were previously unimaginable. As with any technological revolution, there will be challenges, but it is up to us to work together to ensure that we use these tools ethically and responsibly, and to create a future that benefits everyone. 1.1 Learning Objectives In this chapter we will demonstrate how to: Consider the potential benefits and limitations of AI for software development Recognize how to use this course, how it was written, and what to expect Explain general concepts for ethical use of AI tools for software development Summarize what Chatbots are and how they work Distinguish between different AI options for software development 1.2 AI Provides New Opportunities We do not believe that AI chatbots will replace programmers, software developers, and data scientists. While AI can be powerful and useful, it is only as good as the training data behind it and the human using it. Therefore, for the time being and the foreseeable future, humans will remain at the forefront of programming innovation, with AI providing valuable support. As new code is often built on top of existing code written by humans, it is unlikely that AI will fully replace the need for human programmers. However, we do think that the roles of programmers in software development and data science are changing, and some of the skills required to work in this new environment are slightly different from those needed before. In addition to proficiency in programming syntax, programmers may need to develop a more refined ability to construct queries that enable AI bots to create the desired workflows. Other critical skills such as debugging, troubleshooting, and documentation will continue to be valuable, and can be enhanced through the use of AI. Furthermore, AI creates new opportunities and niches for tasks that were previously difficult, time-consuming, or impossible. This is an exciting time for those working in programming, with great potential to explore new and innovative solutions. As AI technology continues to advance, its role in programming will only become more significant, and it is up to developers to adapt and learn how to use these new tools effectively. We asked OpenAI’s ChatGPT whether AI chatbots would replace human software developers, data scientists, and programmers, and this was the response: “It is unlikely that AI chatbots will replace software developers, data scientists, and programmers entirely. While AI chatbots can perform certain tasks related to software development, data analysis, and programming, they are limited in their abilities and require human oversight and input to function properly. AI chatbots can be used to automate certain tasks such as generating simple code snippets, running tests, and performing simple data analysis. They can also assist in the development process by providing quick answers to commonly asked questions and suggesting possible solutions to programming problems. However, more complex software development, data analysis, and programming tasks require a level of creativity, critical thinking, and problem-solving that AI chatbots cannot currently replicate. Software developers, data scientists, and programmers have a deep understanding of the technologies and tools used to develop AI chatbots, as well as the ability to optimize and improve those tools. Furthermore, software development, data analysis, and programming require a high level of human communication and collaboration, which AI chatbots cannot currently replicate. Humans are also essential in making ethical decisions related to AI development, such as ensuring that AI systems are transparent, fair, and unbiased. In summary, while AI chatbots can provide valuable assistance to software developers, data scientists, and programmers, they are unlikely to replace them entirely. Human expertise, creativity, and critical thinking will continue to be essential in developing and optimizing AI systems for the foreseeable future.” 1.3 AI Code of Ethics Our first duty as programmers is to avoid causing harm to people and the world. This includes avoiding both intentional and inadvertent harm. Intentional harm is harm that is caused by a programmer’s deliberate actions. For example, a programmer might create a virus that is designed to harm computers. Inadvertent harm is harm that is caused by a programmer’s negligence or lack of foresight. For example, a programmer might create a program that is buggy and causes data loss. We must always be aware of the potential for harm and deliberately take steps to mitigate it. This includes things like: Be aware of the potential for bias. AI systems are trained on data, and that data can reflect the biases of the people who collected it. Programmers should be aware of the potential for bias in their data and take steps to mitigate it. Be transparent about your work. Share information about your code, data, and algorithms. This will help others to understand how your work works and to identify any potential problems. Be accountable for your work. Take responsibility for the consequences of your code. Be willing to make changes if necessary. Participate in discussions about AI ethics. There are many online and in-person communities where you can discuss the ethical implications of AI with other people. Advocate for ethical AI. Speak up when you see AI being used in a way that you believe is unethical. Support organizations that are working to promote ethical AI. 1.4 The AI Chatbots Humans have been interacting with AI chatbots for years. In fact, Alan Turing is credited with coming up with the concept for chatbots as early as 1950. Chatbots are software-based systems that interact with humans typically by text or speech inputs, rather than code. They mimic some human activity (“Chatbot” 2023; Abdulla et al. 2022) based on these language inputs. They process the inputs using natural language processing commonly abbreviated as NLP. NLP is a kind of AI that uses human text or speech and parses the language to determine structures and patterns to extract meaning. NLP uses large amounts of language data (such as books, websites etc.) to train AI systems to identify these structures and patterns. For example, the AI model might identify when a sentence is a question or a statement by examining various features in a prompt such as the inclusion of a question mark of the use of words often used in questions (“Natural Language Processing” 2023; Cahn 2017). The methods used for chatbots have evolved over time. Now chatbots often utilize AI methods like deep learning (which involve multiple layers of abstractions of the input data (“Deep Learning” 2023)) to extract meaning from the language data (“Natural Language Processing” 2023). As these methods use large quantities of text, they are therefore often called large language models (“Large Language Model” 2023). Despite the fact that chatbots have been around awhile, the popularity of OpenAI’s ChatGPT and DALL-E programs has sparked a recent surge of interest. These chatbots are in part particularly powerful due to the fact that large amounts of computing power were used to train their NLP models on very large datasets (Caldarini, Jaf, and McGarry 2022; Cahn 2017). Large language model AIs can be divided into two categories: those that can be reached using an internet browser, and those that can be reached using an integrated development environment (IDE). This is not a comprehensive list! Browser-based chatbots Bard is Google’s large language model, also known as a conversational AI or chatbot trained to be informative and comprehensive. It is trained on a massive amount of text data and is able to communicate and generate human-like text in response to a wide range of prompts and questions. You will need to join the waiting list before getting access, although in our experience the wait time is short. ChatGPT is OpenAI’s large language model based on the GPT (Generative Pre-trained Transformer) architecture. It is designed to understand and generate human-like responses to text-based conversations. You will need to create an account before using it. Phind is a AI-powered search engine designed specifically for developers asking technical questions. In addition to answering your coding question, it will provide links to the internet sources used to find the answer. Poe is Quora’s platform that gives you access to multiple AI chatbots, including Sage, based on OpenAI’s GPT-3.5 architecture; Claude, an AI natural language bot created by Anthropic; and ChatGPT. IDE-based chatbots CoPilot by GitHub is a language bot that interfaces with your editor. This bot provides coding suggestions and ways to speed up testing. GitHub describes it as an “AI pair programmer”. It uses a subscription model with both individual and business tiers. CodeWhisperer is the Amazon Web Services chatbot for the AWS cloud platform. It can be installed in your integrated development environment (IDE) using the latest AWS Toolkit plugin. The individual tier for CodeWhisperer is free, although you will need to create an AWS account and add a payment method. What are the data sources for these chatbots? Some high-profile English-language AIs, including Google’s T5 and Facebook’s LLaMA, were trained on more than 15 million websites (Schaul, Chen, and Tiku 2023). The top sources of training data for these AI models were https://patents.google.com/ and https://www.wikipedia.org/ ! 1.5 How to Use This Book This book is written with the expectation that users will follow along and paste the queries from each example into their own AI chatbot session. After you have finished this book, you will be able to use whichever combination of chatbot and programming environment that you’re comfortable using. 1.5.1 Choice of AI Model You can use whichever AI you like for this course, as long as it is a large language model. (Other types of AIs are not explored in this course.) We will use a variety of browser-based chatbots as examples throughout this course. Some AIs will be better suited for your particular tasks, and it is too early to judge which of the technologies will end up dominating the industry. We encourage you to test multiple AI platforms to find the ones that best fit your needs, and the use of a particular AI in each chapter should not be taken as an endorsement by us. We have focused on the browser-based chatbots for our examples in this course for ease of demonstration. 1.5.2 Computing Environment Needs All the examples and activities in this course can be done in the computer environment you prefer. None of the tasks require a huge amount of computing power, so local installations on your personal computer are fine, though everything will also translate to a high performance computing cluster or a cloud computing platform. In addition to the CodeWhisperer chatbot available on the AWS cloud platform, a variety of cloud-based AI tools and platforms exist that can be leveraged for practical projects after this course. For instance, Amazon SageMaker or Google Cloud AI Platform can be used for constructing and training machine learning models, while Microsoft Azure Cognitive Services can be applied to incorporate natural language processing features into your applications. If you’d like to learn more about how AI can be integrated with cloud computing, you can read about it in the Appendix. 1.5.3 Boxes Throughout this course, you will see several types of specially-colored boxes. In particular, there are two to which you should pay special attention. One box highlights potential ethical issues with an AI usage. In this box, you’ll find reminders of the ethical considerations you should be particularly aware of while using AI to do certain tasks. The other box highlights our queries to AI chatbots. The question we posed to the AI chatbot is written in these boxes to make it easier for you to find. Wherever possible, we use screenshots of the actual answers we got from the AI chatbots in response to our questions. Occasionally when we have asked for the AI to write or fix code, we have formatted the answer in such a way that makes it easier to use. When you see this format, you will know it indicates an AI response Code in these boxes was written by AI. 1.6 About This Book We used AI bots (including ChatGPT, Bard, Sage, and Claude) to develop and write much of this course. We firmly believe this new technology can be used in ethical ways and we put into practice all the rules and suggestions offered over the following modules while we created this book. "],["ethics-of-using-ai.html", "Chapter 2 Ethics of Using AI 2.1 Learning Objectives 2.2 Major concerns 2.3 Replacing Humans 2.4 Bias 2.5 Misinformation 2.6 Unintelligible Code 2.7 Faulty or Buggy Code 2.8 Security and Privacy issues 2.9 Violating Copyright 2.10 Harmful code 2.11 Summary", " Chapter 2 Ethics of Using AI The use of artificial intelligence (AI) and in particular, generative AI, in coding has raised a number of ethical concerns. We will highlight several current concerns, however please be aware that this is a dynamic field and the possible implications of this technology is continuing to develop. It is critical that we as a society continue to evaluate and predict what the consequences of the use of AI will be, so that we can mitigate harmful effects. 2.1 Learning Objectives In this chapter we will demonstrate how to: Describe key ethical concerns for using AI tools in software development Identify possible mitigation strategies for these major concerns Explain the potential benefits of being transparent about the use of AI tools to write code Discuss why human contributions are still important and necessary Recognize strategies for using AI tools to write code more responsibly Implement prompts to ask AI tools about responsible use throughout various coding practices 2.2 Major concerns In this chapter we will discuss the following issues that writing code with AI tools may contribute to: Replacing Humans - AI tools can help humans write code, but they are not a replacement. Bias - AI models are built on data and code that were created by biased humans, this bias can be further perpetuated. Misinformation - fake or manipulated data used to help design algorithms could be believed to be correct and this could be further propagated. Unintelligible Code - Developers need to follow best practices with code generated by AI. Just like code generated by human developers, this includes figuring out how the code works, how it integrates with other code, as well as annotating and documenting how to use the code . Faulty or Buggy Code - Code that may not be optimal for a given situation may be inadvertently used by those with less familiarity, which may result in faulty software. Security or Privacy Issues - Code may not be optimized for security if not adequately evaluated. Generative AI models have access to large amounts of data that is currently unregulated and may include data that should be protected for privacy reasons. Copyright Violations - The code used for the generative AI model may used code that has copyright laws that require attribution or do not allow reuse and it may not be clear where the code came from. Harmful Code - Currently it is not clear how well generative AI models restrict the creation of code that will be used for goals that harm others. Note that this is an incomplete list; additional ethical concerns will become apparent as we continue to use these new technologies. We highly suggest that users of these tools be transparent about the use of these tools, so that as new ethical issues emerge, we will be better prepared to understand the implications for specific coding projects. Be transparent about what AI tools you use to write code. This help others to better understand how you created your code, as well as the possible sources that the AI tools might have used when helping you write code. It may also help with future unknown issues related to the use of these tools. It is essential to address these ethical concerns and ensure that the use of AI in coding is done in a responsible and transparent manner. This could be done through ensuring the quality of the data used to train AI systems, promoting transparency in AI-generated code, and implementing safeguards against the creation of harmful or biased code. By doing so, we can harness the potential of AI to improve and transform the way we write and optimize code while maintaining ethical standards. 2.3 Replacing Humans Those who use AI tools to write code or to understand code need to recognize their own value in the process. While AI systems are useful, they do not replace the strengths that humans have for innovating new ways to write code, evaluating how the code integrates into the larger picture of a project, or in evaluating the downstream consequences of the code. Computer science is a field that has historically lacked diversity and new learners can often feel intimidated. There is the potential that new learners may feel even more discouraged as they learn to write code when witnessing AI tools write code. It is critical that we support diverse new learners of computer science, as we will continue to need human involvement in the development and use of AI tools. 2.3.1 Tips for supporting human code Follow best teaching practices for inclusion of diverse learners. Encourage current and future programmers to continue to innovate and write code. Avoid thinking that code written by computers must be better than code written by humans, as this simply is not true. Recall that humans first wrote they code that the AI tools use to write code. Be transparent about when you do or do not use AI tools, give credit to the humans who write code where possible. A new term in the medical field called AI paternalism describes the concept that doctors (and others) may trust AI over their own judgment or the experiences of the patients they treat. This has already been shown to be a problem with earlier AI systems intended to help distinguish patient groups. Not all humans will necessarily fit the expectations of the AI model if it is not very good at predicting edge cases (Hamzelou n.d.). Therefore, in all fields it is important for us to not forget our value as humans in our understanding of the world. 2.4 Bias One of the biggest concerns is the potential for AI to create biased code. AI systems are trained on data created by humans. If this data used to train the system is biased (and this includes existing code that may be written in a biased manner), the resulting code could also be biased. This could lead to discrimination, abuse, or neglect for certain groups of people, such as those with certain ethnic or cultural backgrounds, genders, ages, sexuality, capabilities, religions or other group affiliations. It is well known that data and code are often biased (Belenguer 2022). It is important that evaluations be made throughout the software development process to check for and consider potential perpetuation of bias. 2.4.1 Tips for avoiding bias Be aware of the potential biases in the data that is used to train AI systems. Check for possible biases within the data. Are there harmful data values? Examples could include discriminatory and false associations. Are the data adequately inclusive? Examples could include a lack of data about certain ethnic or gender groups or disabled individuals, which could result in code that does not adequately consider these groups, ignores them all together, or makes false associations. Are the data of high enough quality? Examples could include data that is false about certain individuals. Evaluate the code for biases as it is developed. Check if any of the criteria for weighting certain data values over others are rooted in bias. Consider the possible outcomes of the use of the code. Consider if the code could possibly be used in a manner that will result in discrimination. See Belenguer (2022) for more guidance. 2.5 Misinformation AI tools use data that may contain false information. AI tools may also report data as if it is real, when it is in fact not real. For example, currently at the time of the writing of this course, ChatGPT will report citations with links that are not correct. 2.5.1 Tips for reducing misinformation Be aware that some AI tools currently make up false information based on artifacts of the algorithm. Do not assume that everything that the algorithm produces is real or correct. 2.6 Unintelligible Code There is risk that those less aware of best coding practices use AI-generated code and do not follow these practices. This could make it difficult for others to understand how the code works and could make it hard to identify and fix any issues that may arise. This could result in negative consequences, such as system crashes or security breaches, that could have been avoided if the code had been written by an experienced and savvy human programmer. 2.6.1 Tips for avoiding unintelligible code Code should be reviewed by experienced programmers. Code should be annotated throughout to explain what the code is doing. Documentation should be created that describes how to use the code properly. Ask AI tools to help you understand the code, but get expert assistance where needed. Can you explain what the code in line 4 is doing? 2.7 Faulty or Buggy Code There is a risk that code written with AI tools, if not reviewed carefully enough, may be faulty. AI systems may not be trained on data that relates to current software dependencies or best practices. It is also important to remember that code generated by AI tools is not necessarily better than code written by humans. It requires just as much code review. 2.7.1 Tips for reducing faulty or buggy code Do not assume that the code generate by AI is correct. Realize that AI is only as good or up-to-date as what it was trained on, the code may be generated using out-of-date code. Look up packages and functions used to ensure if the code is up-to-date. Make sure that you understand the code that you are using. AI can be used to help you understand what the code is doing, but consult with experts when needed. Ask the AI tools for extra information about if there are any potential limitations or weaknesses in the code, but keep in mind that the tool may not be aware of issues and therefore human review is required. The information provided by the tool can however be a helpful starting point. Are there any limitations associated with this code? What assumptions were made in writing this code? Stack Overflow, a popular community-based website where programmers help one another, has (at the time of writing this) temporarily banned users from answering questions with AI-generated code. This is because users were posting incorrect answers to questions. It is important to follow this policy (as you may face removal from the community). This policy goes to show that you really need to check the code that you get from AI models. While they are currently helpful tools, they do not know everything. 2.8 Security and Privacy issues AI tools are not always trained in a way that is particularly conscious of data security. Furthermore, if the code is written using these tools by users who are less familiar with coding security concerns, protected data or important passwords may be leaked within the code itself. AI systems may also utilize data that was actually intended to be private. It is also important to consider what data your code might actually be using. 2.8.1 Tips for reducing security and privacy issues Check that all passwords, access tokens (like API keys), security certificates are not saved in a public place where anyone can access or tamper with them. Check that no sensitive data, such as Personal Identifiable Information (PII) becomes public through the code. Utilize encryption and other security practices where needed. Consult with an expert about data security if you think your code could possibly cause someone to access protected data who is not authorized to access it. Promote for regulation of AI tools by voting for such standards where possible. Ask AI tools for help, but to not rely on them alone. Are there any security or privacy concerns associated with this code? 2.9 Violating Copyright When AI systems are trained on data, they may also learn and incorporate code from that data. This means that AI-generated code could potentially infringe on the copyright of the original author of the code. For example, if an AI system is trained on a GitHub repository that contains code written by a human programmer, the AI system could generate code that is identical to or similar to the code in the GitHub repository. If the AI system then uses this code without permission from the original author, this could constitute copyright infringement. In general, we want programmers to feel comfortable sharing their code openly without fear they won’t be credited. Similarly, AI systems could potentially infringe on intellectual property rights by using code that is protected by trademarks or patents. For example, if an AI system is trained on a training manual that contains code that is protected by a trademark, the AI system could generate code that is identical to or similar to the code in the training manual. If the AI system then uses this code without permission from the trademark owner, this could constitute trademark infringement. 2.9.1 Tips for avoiding copyright violations Be transparent about what AI tools you use to write your code. Obtain permission from the copyright holders of any code that you use to train the AI system. Only use code that is in the public domain or that has been licensed for use by the AI system’s owner. Cite any GitHub repositories or training manuals you might use in your code. Ask the AI tools if the code it helped generate used any code that you can cite. Did this code use any code from others that I can cite? 2.10 Harmful code Another major concern is the use of AI to generate malicious code. For instance, AI could be used to create code that spreads malware or hacks into computer systems. This could cause severe damage to individuals and organizations, including data breaches and financial losses. 2.10.1 Tips for avoiding the creation of harmful code Be careful about what code you share publicly, as it could be used for malicious purposes. Consider how the code might be used by others. Ask the AI tools to help you, but do not rely on them alone. What are the possible downstream uses of this code? What are some possible negative consequences of using this code? 2.11 Summary Here is a summary of all the tips we suggested: Disclose when you use AI tools to write code. Credit human authors by citing their code and adhering to copyright restrictions. Ensure the code doesn’t expose sensitive data, such as passwords or PII. Don’t assume AI-generated content is real, accurate, or current. Ask the AI tools to help you understand: Sources for the code that you can cite What the code is doing Code limitations Potential security or privacy issues Potential downstream consequences of the code Always have expert humans review the code and value your own contributions and thoughts. Overall, we hope that these guidelines and tips will help us all to use AI tools more responsibly for writing code. We recognize however, that as this is emerging technology and more ethical issues will emerge as we continue to use these tools in new ways. AI tools can even help us to use them more responsibly when we ask the right additional questions when writing code, but remember that human review is always necessary. Staying up-to-date on the current ethical considerations will also help us all continue to use AI responsibly. "],["writing-code.html", "Chapter 3 Writing Code 3.1 Learning Objectives 3.2 Coding Basics 3.3 Writing Code with AI 3.4 Tips for Coding with AI 3.5 Example One: Creating a Function 3.6 Example Two: Debugging Code 3.7 Example Three: Comparing Syntax 3.8 Example Four: Figuring Out a Common Task 3.9 Example Five: Planning Your Program 3.10 Example Six: Selecting a Coding Language 3.11 Hands On Exercise 3.12 Summary", " Chapter 3 Writing Code 3.1 Learning Objectives Recognize the benefits and capabilities of AI-powered programming tools, particularly for certain kinds of tasks that are difficult for humans Explain how AI-generated code and automated programming tools contribute to making programming more accessible to individuals with limited coding experience or to those working in a new language Explore the ethical considerations associated with using AI in programming, including the importance of rigorous testing before publishing code Apply strategies for using AI to build functions, debug code, understand error messages, check syntax, choose the proper programming language, and plan out a multi-step programming project 3.2 Coding Basics In today’s digitally-driven world, coding has become an essential skill. It is used to create websites, mobile applications, and sophisticated software systems. Contrary to popular belief, coding is not only for those who possess an innate talent for programming. With the right resources and a willingness to learn, anyone can become proficient in coding. Practice is crucial to mastering the art of coding, and those who are willing to commit themselves to the learning process can achieve great results. Writing code can also be a rewarding and fulfilling hobby, too. Creating your own software, building a website, or automating a task can be immensely satisfying, and can provide a sense of accomplishment and pride. Moreover, writing code can be a form of creative expression. Just as musicians use notes to compose music and artists use paint to create visual art, programmers use code to create digital experiences. From building websites to creating video games, code can be used to bring ideas to life in exciting and innovative ways. Ultimately, the ability to write code is a valuable asset in today’s world, with increasing demand for skilled programmers in a wide range of industries. Whether as a career or hobby, coding can be both personally and professionally rewarding. The accessibility and versatility of coding make it an excellent skill for anyone to learn, regardless of their background or previous experience. 3.3 Writing Code with AI AI-powered programming tools and technologies are revolutionizing the way we approach software development. AI can generate code snippets. An AI-powered code editor can suggest more efficient algorithms or highlight potential errors in real-time. It can also help developers to reproduce bugs more easily and to test potential fixes more quickly. This can save developers a significant amount of time and effort, and it can help them to debug their code more effectively. Be aware that AI still makes a lot of mistakes when writing code, so you will need to be particularly careful in testing code it writes. AI can make programming more accessible. With AI-generated code and automated programming tools, individuals who are not experienced developers can still create software solutions. Experienced developers can also more easily write code in languages with which they aren’t familiar. This has the potential to democratize programming and lead to new innovations from a wider range of people. Can complete novices learn how to program using AI tools? At present, it is very challenging for complete novices to rely on AI chatbots to learn how to write code. These tools will sometimes write buggy code or code that doesn’t not work as intended, and a person with no programming experience will have difficulty learning how to spot these sorts of mistakes. AI chatbots are best thought of as a supplement to your software development education, not as a replacement, and they should be used alongside other resources. Therefore, we advise that you seek expert review and assistance. As AI tools are refined, complete novices may be able to create software products more readily on their own. AI is changing the skills required for writing code. Rather than simply memorizing syntax, developers need to focus on developing their creativity, intuition, and problem-solving skills. Additionally, programmers must also hone their abilities in architecture design and project management, as these skills are becoming increasingly important in the modern software development landscape. As AI continues to evolve, it is likely to have an even greater impact on the way we develop software in the future. As a programmer using AI, it is up to you to be responsible for what you create. You must rigorously test any code you write. It is your job to make sure any code you create with AI is not malicious and works as expected. 3.4 Tips for Coding with AI Using AI to write code is as much of an art as writing your own code. Following a few rules and suggestions will make your experience much more enjoyable and productive. Remember that AI cannot read your mind. You need to tell it what you’re thinking, and it may take several rounds of question-and-answer before you get something you can work with. Be clear about your goals. What do you want the AI to do? Be as specific as possible. Start with a simple task. Don’t try to do too much too soon. Start with a simple task and then gradually work your way up to more complex tasks. You wouldn’t write a complete program all at once, and you shouldn’t have AI do it, either. Provide enough data. The more data (and detail) you can give the AI, the better it will be able to learn and perform the task you want it to do. Be patient. Querying an AI can take time. Don’t expect it to be perfect right away. Test everything AI writes. You are responsible for the code that AI generates, even if you didn’t write it yourself. AI can be biased, just like humans, and this could lead to sub optimal development. There is a concern that AI may focus development on areas that optimize certain metrics but not overall quality, effectiveness, or user needs. Human judgment is still needed to ensure that AI is used in a responsible and ethical way. Test your results. Make sure the AI is actually doing what you want it to do. AI systems are trained on data, and if the data is not representative of the real world, the AI system may not be able to generate code that works correctly. It is important to test the code to make sure that it is working as intended and that it is producing the desired results. Inadequate testing could lead to low quality, buggy code. Since AI generated code would be highly automated, it requires strong testing procedures and safety oversight to ensure it meets standards before deployment. Make sure your code is secure. AI systems can be used to generate code that is vulnerable to attack, and it is important to test the code to make sure that it is secure. This can help to prevent security breaches from occurring. Use a variety of AI models. There are many different AI models available. Experiment with different models to see which one works best for your task. Get feedback from others. Ask other people to review your code and give you feedback. This can help you identify and fix any problems with your code. 3.5 Example One: Creating a Function One of the most common things a programmer does is write functions to automate tedious tasks. With proper guidance, AI can speed this process up. Perhaps you need to write a quick function that reverses all the letters in a string. We can query Phind for help. How do I write a function that reverses the letters in a string? To reverse a string in Bash, there are multiple approaches. One way to reverse a string is by using the rev command. According to StackOverflow, the rev command is installed on most Linux systems by default. To use the rev command, simply enter rev followed by the string you want to reverse. For example: $ echo "12345" | rev However, it is important to note that the rev command is not present in all flavors of Unix. Another way to reverse a string is by using a simple Bash script. According to StackOverflow, we can write a Bash script that reverses a string using a for loop. Here is an example script: var="12345" copy=\\${var} len=${#copy} for((i=$len-1;i>=0;i--)); do rev="$rev\\${copy:$i:1}"; done echo "var: $var, rev: $rev" This script takes the string “12345” and stores it in the variable var. It then creates a copy of the string and stores it in the variable copy. The length of the string is stored in the variable len. The for loop starts at the end of the string and iterates through each character, adding it to the variable rev. Finally, the script prints the original string and the reversed string. Another approach to reversing a string is by using the tac command. According to StackOverflow, we can use the tac command to reverse the contents of a file or the standard input. Here is an example command: $ echo "12345" | sed 's/./&\\n/g' | tac | sed -e :a -e 'N;s/\\n//g;ta' This command uses the sed command to insert a newline character after each character in the string. It then passes the output to the tac command, which reverses the order of the lines. Finally, another sed command is used to remove the newline characters and print the reversed string. Overall, there are multiple approaches to reversing a string in Bash. The rev command, a simple Bash script with a for loop, and the tac command are all viable options. Phind offers you a variety of ways to do this, but all these options are in the language Bash. Because we didn’t include a programming language in our query, Phind picked one for us. Let’s refine our query a little. How do I write a function using Python that reverses the letters in a string? To write a function using Python that reverses the letters in a string, there are several approaches that can be taken. One approach involves using a for loop and the concatenation operator to join the original string in reverse order. This technique is demonstrated in realpython.com as follows: def reverse_string(text): result = "" for char in text: result = char + result return result print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and initializes an empty string result. The for loop iterates over each character in the input string, concatenating it with the current content of result and reassigning the new intermediate string to result at each iteration. At the end of the loop, result holds a new string as a reversed copy of the original one. Another approach involves using slicing to reverse the string. This technique is demonstrated in stackoverflow.com as follows: def reverse_string(text): return text[::-1] print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and returns the string in reverse order using slicing. The syntax text [::-1] means to slice the entire string with a step of -1, which reverses the order of the string. A third approach involves using Python’s built-in reversed() function to reverse the string. This technique is demonstrated in datagy.io as follows: def reverse_string(text): return ''.join(reversed(text)) print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and uses the reversed() function to return an iterator that produces the characters of the string in reverse order. The join() method is then used to convert the iterator back into a string. All three approaches produce the same output, but they differ in terms of performance and readability. The first approach using a for loop and concatenation is the most straightforward, but it can be slower for large strings because it creates successive intermediate strings only to throw them away in the next iteration. The second approach using slicing is more efficient because it creates a new string object only once, but it may be less readable for some programmers. The third approach using reversed() is concise and readable, but it may be slower for large strings because it creates a reversed iterator that must be converted back into a string using join(). Once again, Phind has come through with multiple options. Now let’s say you knew you wanted to write a function like this, but you realize it’s only the strings in the third column of your file. Let’s add that requirement to our query. “How do I write a function using python that reverses the letters in a string for the third column of my file?” To write a function using Python that reverses the letters in a string for the third column of a file, you can use the extended slice syntax in Python. The extended slice syntax is a more concise and faster way of slicing strings in Python. To reverse a string using extended slices, you can use the following syntax: string[::-1] In this syntax, the first colon indicates the start of the slice, the second colon indicates the end of the slice, and the third colon indicates the step size of the slice. By setting the step size to -1, you can reverse the string. To create a function that reverses the letters in a string for the third column of a file, you can use the following code: def reverse_string(string): return string[:2] + string[2:5][::-1] + string[5:] In this code, the reverse_string() function takes a string as input and returns the string with its third column reversed. The first two characters of the string are returned as-is, while the third column (characters 3 to 5) are reversed using extended slices. Finally, the remaining characters of the string are returned as-is. There are other ways to reverse a string in Python, including using loops, recursion, stacks, and function calls. However, using extended slices is the most concise and efficient way to reverse a string in Python. Here are some pros and cons of using extended slices to reverse a string: Pros: Concise syntax: using the extended slice syntax is a one-liner that is easy to read and write. Fast execution: using the extended slice syntax is faster than using loops or other methods to reverse a string. Cons: Limited functionality: the extended slice syntax can only be used to reverse a string, and cannot be used for more complex string operations. Not beginner-friendly: the extended slice syntax is not intuitive for beginners who are not familiar with Python’s slicing syntax. In conclusion, to write a function using Python that reverses the letters in a string for the third column of a file, you can use the extended slice syntax in Python. This syntax is concise and efficient, but may not be beginner-friendly and may not be suitable for more complex string operations. 3.6 Example Two: Debugging Code A vast amount of time in programming is spent on debugging code. Often the compiler error messages are very precise about what has gone wrong while simultaneously lacking enough detail for the programmer to immediately understand how to fix the error. It is good practice to debug code as you go, instead of writing the entire program and then testing to identify the errors. Using an AI chatbot makes this task much, much easier. There are two options for using ChatGPT for debugging. First, we could query what the error code means. Here’s a Python code snippet that is throwing a TypeError: unsupported operand type(s) for +: 'int' and 'str' error when we try running it. def add_numbers(a, b): result = a + b return result number1 = 10 number2 = "20" sum = add_numbers(number1, number2) print("The sum of", number1, "and", number2, "is", sum) What does this error mean? TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ This error typically occurs when you try to concatenate (i.e., add together) a string and an integer using the “+” operator in Python. In Python, the “+” operator is used for both addition and concatenation depending on the data types of the operands. If you try to add a string and an integer using the “+” operator, Python will raise a TypeError because these two data types are not compatible for this operation. For example, if you have the following code: age = 25 message = "I am " + age + " years old." Python will raise the TypeError because you are trying to concatenate a string (“I am”) with an integer (25) using the “+” operator. To fix this error, you can convert the integer to a string using the str() function: age = 25 message = "I am " + str(age) + " years old." In this case, the str() function converts the integer age to a string before concatenating it with the other string, so the operation is valid and no error will be raised. ChatGPT helpfully explains what TypeError means, what causes it, and how to fix it. This is quite useful when you don’t understand the error message. Another option is to submit the code snippet that is causing an error to ChatGPT directly and ask for it to fix the mistake. Here’s another buggy code snippet, this time in C#. Can you debug this code? using System; class Program { static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; int sum = 0; for (int i = 1; i <= numbers.Length; i++) { sum += numbers[i]; } Console.WriteLine("The sum of the numbers is: " + sum); } } Sure, I can help you debug this code. Here are the issues I see: The loop is going out of bounds: The loop is iterating from 1 to numbers.Length, but array indexes start from 0. Therefore, when i is equal to numbers.Length, numbers[i] is trying to access an element outside the bounds of the array, which will result in an IndexOutOfRangeException. To fix this, you should change the loop condition to i < numbers.Length. The loop is not summing the array elements correctly: The loop is adding the elements starting from the second element instead of the first. To fix this, you should change the initial value of i to 0, which corresponds to the first element of the array. Here’s the corrected code: using System; class Program { static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; int sum = 0; for (int i = 0; i < numbers.Length; i++) { sum += numbers[i]; } Console.WriteLine("The sum of the numbers is: " + sum); } } This should correctly sum the elements of the numbers array and output the result. Be aware that if you choose to submit your code directly to an AI chatbot to debug that you submit a snippet at a time (if possible). Otherwise the answer can get quite unwieldy! 3.7 Example Three: Comparing Syntax You may be in the middle of writing code when you realize that you’ve used two possible syntaxes for the same command. Perhaps you are using the R package here and are wondering if two different ways of writing a command are the same. Is here::here(\"raw\", \"data.csv\") equivalent to here::here(\"raw/data.csv\")? First, let’s see what ChatGPT responded. When we first started putting together this course, we had intended to include an answer from Bard that disagreed with the answer from ChatGPT as an example of why it can be helpful to query multiple chatbots. (We decided ChatGPT was correct after verifying its answer in the here package documentation.) However, when we queried Bard again two weeks later, we were pleasantly surprised to discover that Bard had corrected its answer. Now it’s a cool little example of how the chatbots are rapidly improving and “learning” from their mistakes. 3.8 Example Four: Figuring Out a Common Task Sometimes you have a task that needs done that is fairly routine. You might not have done it before, but plenty of people in the world have. In this case, you don’t want to reinvent the wheel, but you may not know exactly where to start. AI is a great option for figuring out the basic workflow steps. A very common task for anyone working with genomic samples is to combine multiple files in the vcf format. Perhaps you’ve been asked to do this and then create a separate file that contains the names of the samples. You turn to ChatGPT for help. Can you write a program that merges vcf files and then outputs the sample names? Great! Of course, maybe you’re not comfortable using bcftools, or you try this and can’t get it to work. You can take advantage of the “Regenerate Response” option in ChatGPT to get another solution. What’s another way I can do this? You can also specify some of the features you’d like in your code, or where you might want the code to come from. Maybe you want to practice using GitHub repositories, so you specifically request it. Can you write a program that merges vcf files and then outputs the sample names using a github repo? If you know you’ve used something like a GitHub repository, you can ask ChatGPT for the citation. Just be aware that you need to verify that any citation it gives you should be checked independently. Unfortunately, AI bots can still respond with imaginary journal articles. (Assume that if you can’t find it, it doesn’t exist.) What’s the citation for the repo used in this code? In general, after you find a solution that works for you, you should always make a habit of asking the AI where it got the code. Never, ever, ever run code without knowing where it came from. What’s the source for this code? You should always take care that you are only using code that you’re authorized to use when writing code. This means asking the AI chatbot where code snippets are from and tracking down those citations and authorizations yourself (instead of just trusting the AI that everything is okay). 3.9 Example Five: Planning Your Program Let’s say we want to create software that plays the card game blackjack. You can jump right in and ask your AI chatbot to write the code, but you’re unlikely to be successful and incredibly likely to get frustrated. Before you start interacting with the AI, you need to plan out what you want to do. Everyone needs a plan of attack when building software. You should start by identifying what your software will do, then you can figure out the steps necessary to make that happen. We’ll ask Claude-instant (as implemented by Poe) how we can go about creating the necessary code for our game. How would I go about writing a program that can play blackjack? That seems like a really good roadmap for building a basic game, but if you’re ambitious (and of course you are), you might want to give your game a little extra something. Claude-instant has some ideas for that, too. What are some other features I could add to this game? At this point, you are ready to begin writing your program. You have a lot of tasks to do, so you have to pick a logical starting point. If you’re uncertain, you can ask AI for advice on your first task. What should be my first coding task for this program? In this case, the AI went beyond just suggesting a first task and also offered several options for how to do it as well. 3.10 Example Six: Selecting a Coding Language You will need to choose the language for your software. If you don’t, AI will likely pick a language for you, which may or may not be one you want. You might choose a language based on: Your preexisting knowledge or experience with the language A specific use case where the language is commonly used The language(s) your colleagues or coworkers use You can find a description of other languages you might encounter here. Let’s ask Claude-instant again for some recommendations on the appropriate languages for our proposed blackjack game from the above example. (Pro tip: the various AI bots all keep track of your previous queries, so you don’t have to restate your goal for the software if you’re continuing the conversation.) What would be a good coding language to create this game of blackjack? Claude-instant actually gave us more information than we anticipated. If it hadn’t stated pros and cons while offering language suggestions, we could ask for them directly. This could be helpful if you’re deciding between two options like, say, Python or Java. What are the pros and cons of using Python vs Java for this project? 3.11 Hands On Exercise Now it’s your turn to try! 3.11.1 Code Here’s the code you need for question #2. def calculate_average(numbers): total = 0 for number in numbers: total += number average = total / len(numbers) return average numbers = [1, 2, 3, 4, "5"] average = calculate_average(numbers) print("The average of the numbers is:", average) 3.11.2 Questions Write a prompt to create a function that replaces all instances of the string “three” with the number 3, then create a prompt that allows you to modify the function so that “three”, “Three”, and “THREE” are all replaced with the number 3. Write a query that helps you debug the code snippet from above. Create a query that explains how to retrieve data from an online database. Don’t forget to find out what the source of the code is. Write a prompt to plan out a program that creates and plays a game of Rock, Paper, Scissors. You should create a multi-step plan as well as figure out what your first coding task should be. Create a prompt that identifies the best coding language for the above game. 3.12 Summary Coding has become an essential skill in today’s world. AI can increase the efficiency of planning, writing, and debugging code, as well as make coding more accessible for beginners. Querying AI on code writing tasks requires patience. AI cannot read your mind, and users need to be both specific and patient when asking for coding help. It is essential to test all AI-written code while in development, since inadequate testing could lead to low quality, buggy code. A programmer is responsible for what they create while coding with AI, even if AI writes the actual code. devtools::session_info() ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## curl 4.3 2019-12-02 [1] RSPM (R 4.0.3) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## highr 0.8 2019-03-20 [1] RSPM (R 4.0.3) ## hms 0.5.3 2020-01-08 [1] RSPM (R 4.0.0) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## httr 1.4.2 2020-07-20 [1] RSPM (R 4.0.3) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.0.2) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## ottrpal 1.0.1 2023-03-28 [1] Github (jhudsl/ottrpal@151e412) ## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.3) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## readr 1.4.0 2020-10-05 [1] RSPM (R 4.0.2) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.0.2) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.3) ## vctrs 0.6.1 2023-03-22 [1] CRAN (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["refactoring-code.html", "Chapter 4 Refactoring Code 4.1 Learning Objectives 4.2 Refactoring Basics 4.3 AI in Code Refactoring 4.4 Example One: Correcting Syntax 4.5 Example Two: Styling and Convention 4.6 Example Three: Staying DRY 4.7 Example Four: Keeping Code Alive 4.8 Example Five: Making Code Readable 4.9 Example Six: Keep it Brief 4.10 Code optimization 4.11 Challenges and Limitations 4.12 Hands-On Exercise 4.13 Summary", " Chapter 4 Refactoring Code 4.1 Learning Objectives Describe how refactoring code involves optimization for maintainability, efficiency, and reuse Explain why refactoring code is important for developers in the longterm Recognize the benefits and limitations of using AI tools to refactor code, as well as why AI tools are uniquely poised to be beneficial Implement prompt strategies that can be used to assist with refactoring code for correcting syntax, for adopting more consistent styling, for making code more concise, for making code easier to maintain, and for making code more efficient 4.2 Refactoring Basics Code refactoring is the process of improving the quality of underlying code without changing its functionality. In other words, it’s a way of cleaning up and optimizing code so that it’s easier to maintain and more efficient. This often involves making small changes to the code, such as renaming variables or functions, reorganizing code blocks, or simplifying complex expressions. Refactoring is an essential practice in software development and helps to ensure that the codebase remains manageable and adaptable as requirements and business needs change over time. Code refactoring helps to reduce technical debt, which is the accumulation of development work that needs to be done in the future as a result of taking shortcuts or using less than optimal solutions. Refactoring can help to identify potential issues and bugs before they cause problems, resulting in more stable software. Finally, refactoring code to be more readable and less verbose can create fewer headaches for you in the future. To understand why code refactoring is important, imagine trying to cook in a disorganized and cluttered kitchen. You might be a fantastic cook, but you are spending more time searching for utensils and ingredients, and the quality of the meal could suffer as a result. Similarly, code that is disorganized and cluttered can be difficult to work with and can result in lower-quality software. Refactoring is like cleaning and organizing the kitchen - it makes the process of cooking (or coding) smoother and more efficient. 4.3 AI in Code Refactoring Code refactoring has historically been done manually by developers. This involves reviewing code and identifying areas that could be improved or optimized, and then making changes to the codebase accordingly. Though important, this is process is time-consuming and labor-intensive, as it requires developers to carefully review every line of code to identify potential issues or areas for improvement. Additionally, manual code refactoring is error-prone, as developers can accidentally introduce bugs or errors into the codebase while making changes. However, AI has significant potential to help with code refactoring. AI can use machine learning algorithms to analyze large amounts of code and identify patterns or areas that could be improved. For example, they can identify sections of code that are redundant, overly complex, or difficult to maintain, and suggest changes that could be made to improve the codebase. Machine learning algorithms can also help to identify potential bugs or security issues in the codebase, which can help to improve the overall quality and stability of the software. AI refactoring is also faster and more accurate than manual refactoring. This is particularly useful for large-scale software projects with massive codebases, where manual code review and refactoring can be an enormous task. In the next sections, we’ll take a look at some examples of using AI to refactor code. 4.4 Example One: Correcting Syntax Programming languages operate using their established set of rules. For example, Python uses indentation to define code blocks. However, when you shift between development environments, indentation and line breaks can sometimes be affected, causing major headaches! Let’s say we run the following code: def calculate_sum(a,b): result = a + b return result def calculate_product(a,b):result = a * b return result def main(): a=5 b=6 sum_result = calculate_sum(a, b) print("Sum:", sum_result) product_result = calculate_product(a,b) print("Product:", product_result) if __name__ == '__main__': main() ## unexpected indent (<string>, line 3) We get the error above because our indentation is off. Let’s ask ChatGPT to clean things up. Can you assist me with correcting the formatting and indentation issues in my Python code? Of course! Here is the code after correcting the formatting and indentation: def calculate_sum(a, b): result = a + b return result def calculate_product(a, b): result = a * b return result def main(): a = 5 b = 6 sum_result = calculate_sum(a, b) print("Sum:", sum_result) product_result = calculate_product(a, b) print("Product:", product_result) if __name__ == '__main__': main() ## Sum: 11 ## Product: 30 Much better! This can be quite handy when you can’t immediately see what is wrong with the formatting or if you are working with a large codebase. 4.5 Example Two: Styling and Convention Sometimes programming languages have more flexible rules where there are multiple ways to take the same or almost the same action. For example, in the R programming language, there are several ways to perform variable assignment. However, is is generally accepted among R programmers that the <- operator should be used. Single and double quotes can be used for character types interchangeably, but it’s generally a good idea to stick with one or the other. 4.5.1 Commonly Accepted Convention Let’s say we have the following code: a <- "apple" b = 'banana' "carrot" -> c c(a, b, c) ## [1] "apple" "banana" "carrot" This code does not produce any errors, but it doesn’t follow typical R convention. Let’s ask ChatGPT to clean things up. Can you help me reformat my R code to follow accepted style conventions? Sure, here’s the cleaned-up R code: a <- "apple" b <- "banana" c <- "carrot" Much better! This code will now look more familiar to other R programmers. 4.5.2 Visual Styling Some languages are flexible about line breaks, indentation, and spacing among code blocks. If you’re rapidly developing, things can get messy pretty quickly. Many development environments, for example RStudio and PyCharm, have the ability to format your code for you without changing any of the code itself. However, you can also get AI to do this according to your own preferences. d <- c(rep(a,5),rep(b,5),rep(c,5),paste(a,b,c),paste(c,b,a)) This code is pretty hard to read. Let’s see if AI can do better. Can you space out this R code to make it more readable? Sure! Here’s the same code with added spacing for improved readability: d <- c(rep(a, 5), rep(b, 5), rep(c, 5), paste(a, b, c), paste(c, b, a)) Better! It’s easier to interpret because only one action is being taken on each step. By spacing out the code and breaking it into multiple lines, it becomes easier for the human eye to scan for structure, logic, errors, and/or inconsistencies. 4.6 Example Three: Staying DRY The DRY (Don’t Repeat Yourself) programming tenet is essential to good software. By avoiding repetition in code, we can reduce the amount of duplicate code we need to write and maintain. If we need to change the functionality of a certain piece of code, we have to make the same change in multiple places, which can be time-consuming and error-prone. Let’s take the following Python code: def print_greetings(): print("Hello, Alice!") print("Hello, Bob!") print("Hello, Carol!") print("Hello, David!") print("Hello, Eve!") print_greetings() ## Hello, Alice! ## Hello, Bob! ## Hello, Carol! ## Hello, David! ## Hello, Eve! Notice how repetitive this code is? print() and the string \"Hello, \" appear five times. We can improve this! Could you please refactor my Python code to make it more DRY? Sure, here’s a refactored version of your code: def print_greeting(name): print(f"Hello, {name}!") def print_greetings(): names = ["Alice", "Bob", "Carol", "David", "Eve"] for name in names: print_greeting(name) print_greetings() ## Hello, Alice! ## Hello, Bob! ## Hello, Carol! ## Hello, David! ## Hello, Eve! Now let’s imagine your software lead has asked us to change the greeting to Spanish. Notice how we only have to change the second line of code: def print_greeting(name): print(f"¡Hola, {name}!") def print_greetings(): names = ["Alice", "Bob", "Carol", "David", "Eve"] for name in names: print_greeting(name) print_greetings() ## ¡Hola, Alice! ## ¡Hola, Bob! ## ¡Hola, Carol! ## ¡Hola, David! ## ¡Hola, Eve! Much easier. 4.7 Example Four: Keeping Code Alive During software development, code is often changing rapidly. It’s common to end up with functions or variables you don’t need anymore. It’s best practice to remove “dead” code from your codebase: it’s distracting and can make maintenance more challenging. Programmers should resist the urge to hang on to unused code in the expectation that they might need it one day. Version control, such as provided by git and GitHub, let you keep a record of old code without cluttering your final version. Let’s take a look at some Python code with some dead code: def default_values(): a = 5 b = 6 return a, b def calculate_sum(a, b): result = a + b return result def calculate_product(x, y): return x * y def simulate_data(): a, b = default_values() dat = calculate_sum(a, b) + calculate_sum(a, b) return dat def main(): a = 5 b = 6 a, b = default_values() sum_result = calculate_sum(a, b) print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 Some of these functions aren’t used in the final step, typically defined in python as the main() function. Let’s ask AI to remove them. I need help with eliminating unused functions in my Python script. Sure! Here’s a refactored version: def default_values(): a = 5 b = 6 return a, b def calculate_sum(a, b): result = a + b return result def main(): a = 5 b = 6 a, b = default_values() sum_result = calculate_sum(a, b) print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 Great! Now our code is much more manageable. This code only includes the necessary functions needed to run the main() function. We can go a step further! Can you help me refactor my python code to make it more concise? Certainly! Here’s a more concise version of your code: def calculate_sum(a=5, b=6): return a + b def main(): sum_result = calculate_sum() print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 In this version, the calculate_sum function is simplified to take default arguments for a and b. This means the default_values function is no longer necessary. The a and b variables are also removed from main, as they are no longer needed. Much better and easier to look at overall. 4.8 Example Five: Making Code Readable Usually, our first goal as programmers is to get the response we need from the code. Readability might be the last thing on our minds. Luckily, AI can help with this. Let’s imagine we whipped up this code pretty quickly. It is tough to read, and it could definitely be improved. for(term in c("good","bad","ugly")){ print(c(rep(term,3),paste("really",stringr::str_to_upper(term)))) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" Let’s see if AI can do better. Can you help me clean up this R code so it is more readable? Sure! Here’s a more readable version of the code: library(stringr) for(term in c("good", "bad", "ugly")) { print(c(rep(term, 3), paste("really", str_to_upper(term)))) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" I added whitespace around operators and after commas for better readability. I also loaded the stringr package explicitly using library() to make the code more self-contained. This is a good start, but not much has changed. Let’s try again. On ChatGPT, we can click “Regenerate Response”. Here’s a cleaned-up version of the R code that is more readable: library(stringr) terms <- c("good", "bad", "ugly") for (term in terms) { rep_term <- rep(term, 3) upper_term <- str_to_upper(term) really_upper_term <- paste("really", upper_term) result <- c(rep_term, really_upper_term) print(result) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" I’ve stored the repeated term and the uppercased term in separate variables to make the code more readable. I’ve also separated the construction of the “really” phrase from the uppercased term to make it clearer what’s happening. Finally, I’ve used whitespace and indentation to make the structure of the code more apparent. Better! While the code takes up a greater number of lines, it’s easier to interpret because only one action is being taken on each step. 4.9 Example Six: Keep it Brief As we learned above, following the DRY principle and removing dead code can make your code easier to interpret, maintain, and debug. However, sometimes the issue is the functions themselves. No one has perfect knowledge of everything in their programming language. AI can help us determine if there are any more efficient sets of functions that do the same thing. Here is some code that plays with the “CO2” dataset in R: library(datasets) for (type in unique(CO2$Type)) { dat_subset <- CO2[CO2$Type == type, ] for (plant in unique(dat_subset$Plant)) { dat_subset_2 <- dat_subset[dat_subset$Plant == plant, ] print(paste(dat_subset_2$Plant[1], round(mean(dat_subset_2$uptake), 1))) } } ## [1] "Qn1 33.2" ## [1] "Qn2 35.2" ## [1] "Qn3 37.6" ## [1] "Qc1 30" ## [1] "Qc2 32.7" ## [1] "Qc3 32.6" ## [1] "Mn1 26.4" ## [1] "Mn2 27.3" ## [1] "Mn3 24.1" ## [1] "Mc1 18" ## [1] "Mc2 12.1" ## [1] "Mc3 17.3" Let’s see if AI has any ideas for making it more concise. Can you make this code more concise? Here’s a more concise version using dplyr package in R: library(dplyr) CO2 %>% group_by(Type, Plant) %>% summarize(mean_uptake = mean(uptake)) ## # A tibble: 12 × 3 ## # Groups: Type [2] ## Type Plant mean_uptake ## <fct> <ord> <dbl> ## 1 Quebec Qn1 33.2 ## 2 Quebec Qn2 35.2 ## 3 Quebec Qn3 37.6 ## 4 Quebec Qc1 30.0 ## 5 Quebec Qc3 32.6 ## 6 Quebec Qc2 32.7 ## 7 Mississippi Mn3 24.1 ## 8 Mississippi Mn2 27.3 ## 9 Mississippi Mn1 26.4 ## 10 Mississippi Mc2 12.1 ## 11 Mississippi Mc3 17.3 ## 12 Mississippi Mc1 18 This code groups the CO2 dataset by Type and Plant, calculates the mean uptake for each group using summarize, and then prints the resulting data frame. The code is shorter and more concise because it uses the dplyr package, which has built-in functions for data manipulation and summarization. Refactoring the code to be more concise using dplyr makes it easier to read and understand the steps involved in the data manipulation. It also reduces the number of nested loops and intermediate variables, making the code more efficient and reducing the chance of errors. Ultimately, it is your job as a programmer to use your best judgment on the fine balance between brevity and readability, as the best solution is not always this obvious. Remember that you can regenerate the AI’s response if you want more options. 4.10 Code optimization Sometimes time and efficiency is of the essence. Loops can be slow and time consuming in many languages. Take for example the following R code that calculates the cross product between two vectors x and y using nested for loops: set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) z <- numeric(n) # Start timer start_time <- proc.time() for(i in 1:n) { for(j in 1:n) { z[i] <- z[i] + x[i]*y[j] } } # End timer proc.time() - start_time ## user system elapsed ## 207.366 0.057 207.422 What is a faster, more optimized way of running the following R code? set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) # Start timer start_time <- proc.time() z <- outer(x, y, "*") z <- rowSums(z) # End timer proc.time() - start_time ## user system elapsed ## 0.531 0.336 0.588 The outer() function performs the same calculation as the nested loop in the original code, but more efficiently. It returns a matrix of all possible combinations of x and y values, with each element of the matrix being the product of the corresponding x and y values. The rowSums() function is then used to sum the elements of each row of the matrix, which is equivalent to summing the products of x and y for each index i in the original loop. This method avoids the need for the nested loop, resulting in a faster and more efficient computation. So much faster! We can look at another option by regenerating the response: set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) z <- numeric(n) # Start timer start_time <- proc.time() z <- x %*% t(y) # End timer proc.time() - start_time ## user system elapsed ## 0.260 0.288 0.355 One optimized way to perform the same calculation is by using the %*% operator to perform matrix multiplication. This can be done by converting x and y to matrices and transposing one of them so that their dimensions align for matrix multiplication. This code should be much faster than the original implementation because it takes advantage of highly optimized matrix multiplication algorithms in R. While this second suggestion is faster, you will need to consider what aspects of the codebase are most important in each instance. For example, this code runs more quickly, but the %*% operator might be unfamiliar to some R programmers. In cases where efficiency is less important, or the data are not large, you might consider maximizing readability. 4.11 Challenges and Limitations Like humans, AI can make mistakes. Be sure to keep the following in mind as you use AI to refactor your code. 4.11.1 Complexity Refactoring is often a complex process that requires deep understanding of the code and its context. AI may not always be able to fully understand the complexity of the code and may struggle to identify the best refactoring strategy. Use a modular approach whenever possible. 4.11.2 Limited Data AI models require large amounts of data to learn from, but in the case of code refactoring, there is often limited data available. This can make it difficult for AI models to generalize to new code bases and situations, especially if you are using a more niche programming language. 4.11.3 Quality Control Automated refactoring tools that use AI may not always produce code that is of the same quality as code produced by human developers. It can be difficult to always ensure that the refactored code is maintainable, efficient, and free of bugs. You need to use your best judgment when copying and pasting AI-produced code into your codebase. You should always include unit tests in your code. Tests can help you catch bugs, including those introduced accidentally by AI. Because AI models are created by humans, they can be biased. This means they may not always identify your preferred refactorings or may prioritize certain types of refactorings over others. In some cases, this can lead to suboptimal code quality and may create technical debt over time. 4.11.4 Security When using AI to refactor code, the code itself is often sent to an external service or platform for analysis and transformation. This can raise concerns about the security of the code, especially if it contains sensitive information such as trade secrets, proprietary algorithms, or personal data. If your code is sensitive, it’s important to carefully vet any third-party AI tools or services used in the refactoring process. 4.12 Hands-On Exercise Now it’s your turn to try. 4.12.1 The Code Let’s say you are dusting off some code from your past (no judgment here). You were investigating tweets about Mr. Trash Wheel, a beloved Baltimore-based contraption that filters trash out of the waterways. Note: This code is just an example and was written strictly for educational purposes. import tweepy import pandas # Enter your API keys and access tokens here consumer_key = 'your_consumer_key' consumer_secret = "your_consumer_secret" access_token = 'your_access_token' access_token_secret = 'your_access_token_secret' # Authenticate with Twitter API auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q="Mr. Trash Wheel", tweet_mode='extended').items(100) # Create empty list to store tweet data date_data = [] location_data = [] text_data = [] def get_tweet_length(tweet): # Return the length of the tweet text return len(tweet.full_text) # Loop through each tweet and extract desired data for tweet in tweets: date_info = { 'date': tweet.created_at } date_data.append(date_info) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q="Mr. Trash Wheel", tweet_mode='extended').items(100) # Loop through each tweet and extract desired data for tweet in tweets: location_info = { 'location': tweet.user.location } location_data.append(location_info) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q='Mr. Trash Wheel', tweet_mode='extended').items(100) # Loop through each tweet and extract desired data for tweet in tweets: text_info = { 'text': tweet.full_text } text_data.append(text_info) # Combine lists into a dictionary data = {'date': date_data, 'location': location_data, 'text': text_data} # Store results in pandas dataframe df = pandas.DataFrame(data) # Print dataframe print(df) 4.12.2 Questions Create an AI prompt that fixes any formatting issues with the code that would cause it not to run. Devise an AI prompt that removes any dead code from your sample above. What gets removed? Create a prompt that makes the code less repetitive, adhering to the DRY principle. What aspect of the code was repetitive? Construct a prompt that makes the code more concise. What are some trade-offs that appear in this code between readability and brevity? 4.13 Summary Code refactoring is the process of improving code quality without changing its functionality. It is crucial in software development to maintain a manageable and adaptable codebase. Code refactoring reduces technical debt, improves code stability, and makes it easier to maintain. Examples of using AI for code refactoring include correcting syntax, adhering to styling and convention, visual styling, avoiding repetition, removing dead code, and improving both readability and speed of execution (optimization). The use of AI for code refactoring raises ethical concerns and is not perfect. It is important for the developer to consider security needs of their code, as well as test out their code. "],["annotating-your-code.html", "Chapter 5 Annotating Your Code 5.1 Learning Objectives 5.2 Annotating Code is Good Practice 5.3 Improves readability 5.4 Improves maintainability 5.5 Improves the quality 5.6 Examples of quality aiding comments 5.7 AI in Code Annotation 5.8 Ethics of using AI to annotate code 5.9 Examples on using AI for annotation 5.10 Summary", " Chapter 5 Annotating Your Code 5.1 Learning Objectives Explain the significance and benefits of code annotation and how it aids in understanding and working with code in the future. Demonstrate the ability to apply effective code annotation practices by providing clear and concise comments in code. Recognize the impact of code annotation on code maintainability. Explain how well-annotated code can facilitate collaboration among developers and ensure code consistency. Critically evaluate the use of AI in code annotation, including benefits, ethical considerations, and limitations. Explore how AI can be used to create README files, do line-by-line annotations, and offer potential code improvements. 5.2 Annotating Code is Good Practice Code annotation, also known as code commenting, is the process of adding explanatory notes to source code. These notes are used to provide context, clarify functionality, and aid in understanding for developers who may be working on the codebase in the future. Code annotation is an important practice for any developer looking to write clear, efficient, and maintainable code. There are many benefits to annotating code: Improves readability Improves maintainability Improves quality 5.3 Improves readability First, it can help to improve the readability of code. By adding comments, developers can explain the purpose of each section of code, which can make it easier for others to understand what the code is doing. This can be especially helpful for large or complex codebases, where it can be difficult to keep track of all the different components. This is particularly important in contexts where the original developer of a project may move on to something else and others are left to work on them. Annotation perhaps most often helps a developer remember things they knew about the code when they were originally writing it (annotation is helpful for future you!) If the original developer left well-annotated code, it can drastically improve the ability of others (and their future selves) to continue with the project. 5.3.1 Examples of readability aiding comments Comments that help readability clarify what the code is doing Function explanations: A comment at the beginning of a function or method can describe its purpose, parameters, and expected return values. This makes it easier for others to understand what the function does and how to use it. # This function calculates and returns the sum of two numbers (x and y) def add_numbers(x, y): return x + y Inline explanations: Use inline comments to explain what a specific line or block of code does. This can help someone reading your code to quickly understand what’s going on. # Loop through each item in the list for item in my_list: # Check if the item is greater than 10 if item > 10: # Print the item print(item) TODO comments: Use TODO comments to mark areas of your code that need further work or improvement. This can help you or others to remember to come back to a specific part of the code. # TODO: Implement error handling for this function def my_function(): pass Parameter descriptions: If a function or method has complex parameters, it can be helpful to add comments explaining what each parameter does. def my_function(parameter1, parameter2): """ Calculate the sum of two numbers. Parameters: parameter1 (int): The first number to be added. parameter2 (int): The second number to be added. Returns: int: The sum of parameter1 and parameter2. """ return parameter1 + parameter2 Code block summary explanations: If you have a long or complex code block, you can add a comment to explain what the block is doing. # This code block creates a dictionary containing the counts of each word in a list of text strings word_counts = {} for text in text_list: for word in text.split(): if word not in word_counts: word_counts[word] = 0 word_counts[word] += 1 5.4 Improves maintainability Code annotation can help to improve the maintainability of code. By adding comments, developers can explain the reasoning behind certain decisions, which can make it easier for others to make changes to the code without breaking it. This can be especially helpful when multiple developers are working on the same codebase, as it can help to prevent conflicts and ensure that the code is always in a consistent state. 5.4.1 Examples of maintainability aiding comments Comments that help maintainability explain the historical context of why code was made the way it was Examples of maintainability aiding comments Design decisions: If there were specific design decisions made when creating the code, you can add comments explaining why certain choices were made. bash # We chose to use a linked list data structure for this function to reduce the time complexity of inserting and deleting elements. Legacy code: Sometimes, code may have been written in a certain way due to constraints or limitations at the time it was created. Adding comments to explain this can help others understand why the code is the way it is. # This code was written before Python 3, which introduced the `yield from` syntax. Therefore, we used a `for` loop to iterate over the nested list. Performance optimizations: If certain performance optimizations were made to the code, you can add comments explaining why they were necessary. bash # We used memoization to improve the time complexity of this recursive function, as it was taking too long to execute for larger inputs. Compatibility considerations: If the code was written with compatibility considerations in mind, you can add comments explaining why certain choices were made. # We used the `os.path` module to ensure that this code will work on both Windows and Unix-based systems, as the path separators are different on each platform. Limitations: If there are limitations or edge cases that the code cannot handle, you can add comments to explain this to others. # Note that this function assumes that the input array is sorted in ascending order. If the array is unsorted, the results may be incorrect. 5.5 Improves the quality Code annotation can help to improve the quality of code. By adding comments, developers can identify potential issues or edge cases, which can help to prevent these issues from occurring in the first place. This can be especially helpful when testing code, as it can help to ensure that the code is working as expected. 5.6 Examples of quality aiding comments Comments that help improve the quality of the code by explaining to others how to use it or help improve it Error handling: Adding comments to explain how and why error handling is being implemented can help ensure that your code is robust and able to handle unexpected inputs or errors. This helps others know how the code was intended to be used. # If the input argument is not a list or is empty, raise a ValueError if not isinstance(input_list, list) or len(input_list) == 0: raise ValueError("Input must be a list that is not empty") Complexity: If your code has particular complexities, adding comments that explain it can help others understand the performance characteristics of your code. It may help others identify whether there is a simpler way to write the code. By adding a comment that expresses uncertainty about the code and asking for suggestions, the author can potentially receive feedback from others on how to improve the code. # This block of code could probably be simplified, but I'm not sure how. new_list = [] for i in old_list: if i > 0: new_list.append(i) Constants and variables: Adding comments to explain the purpose of constants and variables can make your code easier to use. It not only notifies others of the variables existence but lets them know if they need to change the parameters for their own purposes. # This constant represents the maximum allowed number of retries when attempting to connect to the server. MAX_RETRIES = 3 # This variable tracks the number of failed attempts to connect to the server. num_retries = 0 Code organization or disorganization: Adding comments to explain the organization and structure of your code can make it easier for others to navigate and may bring out a better organizational strategy for your code. # Define helper functions for data processing def preprocess_data(input_data): # Implementation details def analyze_data(processed_data): # Implementation details def visualize_data(analyzed_data): # Implementation details # Load data from file input_data = load_data("input.txt") # Preprocess data processed_data = preprocess_data(input_data) # Analyze data analyzed_data = analyze_data(processed_data) # Visualize data visualize_data(analyzed_data) Assumptions and constraints: Adding comments to explain the assumptions and constraints of your code can help others understand its limitations and potential pitfalls. # This function assumes that all input values are positive integers. Negative or non-integer inputs may result in unexpected behavior. 5.7 AI in Code Annotation We’ve discussed why code annotation and documentation are important, but when and why would you use AI for code annotation? AI can be a nice tool to supplement the annotation of your code. It should not be the only source of annotation for your code, because as the code author, you need to verify that what AI has annotated is consistent with your knowledge and history of development of the code. But using AI to annotate your code can be useful to supplement existing code annotations or to annotate old code that was poorly annotated either by yourself or others who are no longer working on the project. Here are some of the benefits of using AI for code annotation: Speed and efficiency: AI algorithms can analyze code much faster than humans, which means they can quickly generate comments and annotations for large codebases. This can save developers significant time and effort, allowing them to focus on other aspects of the development process. Consistency: Unlike humans, AI is not affected by personal biases or preferences, so it can provide consistent annotations across different code files and projects. A human may underestimate places in the code that should have annotation, whereas an AI might be more consistent at putting annotation in these places. This can help ensure that all code in a project is well-documented and easy to understand. Objectivity: AI can analyze code objectively and identify potential issues that may have been missed by humans. This can lead to better quality code that is easier to maintain and less prone to errors. Learning: AI models can learn from large datasets of annotated code and improve their ability to generate comments and annotations over time. This means that the more code the AI model analyzes, the more accurate and effective it becomes at annotating code. Specificity: AI models can be trained on specific programming languages, frameworks, or libraries, allowing them to generate language-specific comments and annotations that are tailored to the needs of the project. This can be particularly helpful for large, complex projects that require specialized knowledge or expertise. 5.8 Ethics of using AI to annotate code However, there are also a number of potential ethical concerns associated with using AI to annotate code. For example, we don’t yet know how and in what ways AI models may be biased. Additionally, AI models may be opaque, which could make it difficult to understand why they made certain annotations. Finally, because AI models are not humans and don’t necessarily tell the stories behind the code, they may be used to generate annotations that are not accurate, helpful, or do not tell the full depth of the history of what occurred with the code, which could lead to problems. Given these potential benefits and concerns, it is important for users of AI to always realize that they are ultimately accountable for the annotation that an AI model makes, and careful review of this annotation is needed. There are a number of ethical considerations to take into account when using AI to annotate code. Here are a few of the most important considerations: Accountability: First and foremost, a user of AI is always primarily accountable for any output that they use from an AI model. AI models can give you annotation to start with, but it is up to you as the user to verify and review this output carefully. The user of the AI model is ultimately responsible for keeping or throwing out the annotations the AI makes and thus is responsible for using errors that the model makes. Much like a user of a Google Search engine is responsible for which results they use, a user of AI is responsible what output from the AI model they use. Transparency: It is important to be transparent about the use of AI in code annotation. This means disclosing the fact that AI is being used, as well as the specific AI model and dataset that is being used. This should be stated on every file where annotation has been made using AI. This transparency allows others who view the code to be able more fully interpret the AI-created annotation that accompanies the code. Bias: AI models are trained on data, and this data can introduce bias into the model. It is important to be aware of the potential for bias and to take steps to mitigate it. This can be done by using a diverse dataset, by carefully selecting the features that are used to train the model, and by using techniques such as adversarial training. It is important to provide annotations that indicate any known biases, possible limitations associated with bias, and any strategies that were used to mitigate bias. Explainability: It is important to be able to explain the decisions that an AI model makes. This is especially important in the case of code annotation, where the decisions made by the AI model can have a significant impact on the quality of the code. There are a number of techniques that can be used to explain the decisions of an AI model, such as visualization and rule extraction. You can (and should) ask a chatbot to explain its sources and rationale for output that it gave. (Be aware that actual citations it gives may or may not be accurate, and you need to verify the accuracy of those citations by doing your own follow up literature search). 5.9 Examples on using AI for annotation 5.9.1 Ask for a README summary To try out some annotation with code examples, this author dug up some old code that she had no idea about what it did anymore because time had passed and she didn’t document it very well. First, I wanted ChatGPT to make a README for me. README’s are a standard file that explain what the code base does and provides a summary of what is happening in the set. I asked ChatGPT if it could: Create a README for this code and then I pasted the old code. ChatGPT gave me some output that generally looked like a README: This README seems accurate given the work I was doing at the time. But obviously the title isn’t great – it doesn’t describe the code well. Plus there’s not really information about usage or outputs of the code. So I asked it: Can you make this README more succinct and with sections about how you would use this code? This yielded a much better result. 5.9.2 Ask for line by line annotation Second, I wanted to have ChatGPT annotate code line by line. So I asked it Can you annotate some R code for me? It not only provided helpful annotations but it fixed spacing and added more spaces between lines of code: It does however, think the code is Python apparently if we look in the upper left corner. But this doesn’t seem to have affected its accuracy in its annotations. 5.9.3 Ask for how the code could be improved This code is old, and I don’t think it runs properly and is in no way reproducible. So I wanted to see what ChatGPT would recommend for improvements to the code. I said How could I make this code better? It had a lot of great advice: First and foremost it told me my variable names are not consistent and also not descriptive. Which is completely accurate! There’s variable names like xx and ll which don’t tell the reader anything about the variable. 5.9.4 Style the code Next, I asked chatGPT if it could restyle the code into tidyverse style. It definitely put elements that look like tidyverse however, it also put items in the code that I can tell by looking at it won’t work. So I tried to tell it about the errors: :::{.query} This code is close but there are some errors. These tidyverse functions don’t work with matrices. ::: and it told me: You are correct that the tidyverse functions are designed to work with data frames and not matrices. Here's a modified version of your code that converts the matrix to a data frame and uses tidyverse functions: The lesson here is that the output of chatGPT still needs to be vetted by the person asking for it. It is a great idea to continue to have AI’s work on something if it isn’t quite what you are asking for, however, at the end of the day it is you, the human, who has to vet the output. 5.9.5 Sometimes it has trouble with file types if given a URL Copying and pasting code appears to be the best way to go at this point in time. I asked chatGPT if it could annotate code in a Jupyter notebook at a URL I gave it: Can you annotate the code at this URL? https://github.com/jhudsl/reproducible-python-example/blob/main/make_heatmap.ipynb It responded with some of the code at that file where it was annotated but most of the notebook was not there. I told ChatGPT: That isn’t all the code at that url ChatGPT told me: You're right, I apologize. The code at the given URL is actually in a Jupyter Notebook format, so it's not easy to copy-paste here. However, I can suggest an alternative approach: you can use the website nbviewer (https://nbviewer.jupyter.org/) to view the notebook and its code. Here are the steps to do so: Go to https://nbviewer.jupyter.org/ Paste the URL of the notebook https://github.com/jhudsl/reproducible-python-example/blob/main/make_heatmap.ipynb into the "Enter the location of a Jupyter Notebook" field and press "Go". This will display the notebook and its code, and you can read through it and add your own annotations as needed. I hope this helps! This was a nice tool to recommend, however it still told me I should add my own annotations at the end of this. 5.10 Summary Code annotation is important for readability, maintainability, and overall quality of code AI can be a helpful tool for supplementing annotations or creating annotation for poorly annotated code. Ultimately the code author who uses AI as a tool for annotation is still responsible for verifying that the annotations are consistent with their knowledge of the code. devtools::session_info() ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## curl 4.3 2019-12-02 [1] RSPM (R 4.0.3) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## highr 0.8 2019-03-20 [1] RSPM (R 4.0.3) ## hms 0.5.3 2020-01-08 [1] RSPM (R 4.0.0) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## httr 1.4.2 2020-07-20 [1] RSPM (R 4.0.3) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.0.2) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## ottrpal 1.0.1 2023-03-28 [1] Github (jhudsl/ottrpal@151e412) ## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.3) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## readr 1.4.0 2020-10-05 [1] RSPM (R 4.0.2) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.0.2) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.3) ## vctrs 0.6.1 2023-03-22 [1] CRAN (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["understanding-unfamiliar-code.html", "Chapter 6 Understanding Unfamiliar Code 6.1 Learning Objectives 6.2 Reading Unfamiliar Code Is A Skill 6.3 AI in Reading Code 6.4 Example One: Summarizing Code You Didn’t Write 6.5 Example Two: Identifying a Coding Language 6.6 Example Three: Interpreting Regex 6.7 Example Four: Demystifying Functions 6.8 Hands-On Exercise 6.9 Summary", " Chapter 6 Understanding Unfamiliar Code 6.1 Learning Objectives Recognize the benefits, limitations, and assumptions in using AI to understand unfamiliar code Consider the ethical questions around using AI to understand another person’s code Practice using AI to summarize code, identify an unknown coding language, and interpret regex and unknown functions 6.2 Reading Unfamiliar Code Is A Skill As a programmer, you will frequently encounter situations where you need to read and understand code written by other developers. This could be because you are collaborating on a project, you have taken over maintenance of an existing codebase, or you are learning new syntax or skills that require reading example codes. Comprehending code written by someone else is a distinct skill from being able to write your own code, and it takes practice to become proficient at it. Reading unfamiliar code is like exploring an unfamiliar city without a map or a guide. Just like in a new city, you may not know where to start or how to navigate the codebase. You may encounter unfamiliar syntax, functions, and libraries that you have never seen before, just as you might encounter new streets, buildings, and landmarks. At first, you may feel disoriented and overwhelmed, and may need to spend some time getting oriented and familiarizing yourself with the environment. As you explore, you may start to see patterns and similarities, just as you might begin to recognize neighborhoods and landmarks in a new city. You may also encounter dead-ends, confusing intersections, and unexpected detours, just as you might encounter bugs and errors in the code. To make progress in this unfamiliar territory, you may need to rely on a combination of intuition, deduction, and experimentation. You may need to break down the code into smaller pieces, analyze the behavior of each piece, and gradually build up a mental model of how the code works. You may also need to consult documentation, online resources, or other experts who are familiar with the codebase, just as you might ask locals or consult a map in a new city. In the end, with patience, persistence, and a willingness to learn, you can successfully navigate the unfamiliar code and achieve your goals, just as you can successfully explore a new city and discover its hidden treasures. Learning how to read and understand code written by someone else is a valuable skill that can help you be a more effective programmer. By being able to read and comprehend unfamiliar code, you can contribute to projects more quickly, diagnose and fix bugs more effectively, and learn new programming techniques and best practices. As with any skill, the more you practice reading and understanding code written by others, the more comfortable and proficient you will become at it. 6.3 AI in Reading Code While anyone can learn to understand code written by someone else, using AI language models to achieve this has three significant advantages. Summarize large codebases. AI can quickly scan large codebases and give you a high-level overview of what they do. This can save you a lot of time and effort, especially when dealing with complex codebases. For example, AI can identify the main functions and classes in a codebase, and it can show you how they are related. Analyze the code. AI can look at the code and tell you about its structure, complexity, and potential defects quickly and efficiently. This can help you understand the code better and make it easier to maintain and improve. For example, AI can identify parts of the code that are difficult to understand or maintain, and it can suggest ways to improve the code. Understand comments and documentation. AI can read comments and documentation written by other developers. This can help you understand the code’s purpose and the assumptions and limitations of the codebase. For example, AI can identify the key assumptions that are made in the code, and it can explain the trade-offs that were made in the design of the code. Keep these ethical considerations in mind when using AI to summarize code. Who owns the code? If you are not the owner of the code, you should get permission from the owner before summarizing it. What is the purpose of the summary? If you are summarizing the code for educational or research purposes, it is likely ethical to do so. However, if you are summarizing the code for commercial purposes, you may need to get permission from the owner. Does the code contain any sensitive or personal information? If the code contains any sensitive or personal information, you should take special care to protect that information. 6.4 Example One: Summarizing Code You Didn’t Write Here’s some simple code using the R programming language, written by an unnamed programmer. If you are familiar with R, you might be able to understand what this code does with little effort. However, if you don’t know R, you’re relatively new to R, or you’re just having a bad day, understanding what this bit of code can take a great deal more energy and time. AI language bots can ease that burden. library(tidyverse) d <- ggplot2::diamonds d_sel <- d %>% select(carat, cut, color, clarity, depth, table, price) d_fil <- d_sel %>% filter(price > 5000) d_bin <- d_fil %>% mutate(carat_bins = cut_width(carat, width = 0.2)) d_summ <- d_bin %>% group_by(carat_bins, cut, color, clarity) %>% summarize(mean_price = mean(price), sd_price = sd(price)) We first ask Claude-instant (as implemented by Poe) to explain the purpose of this code. What does this code do? You can ask for Claude to summarize each step in detail as well. Can you explain what each step does in detail? Maybe you’ve never worked with the tidyverse package in R - Claude can tell you about it. What is the tidyverse package? You might also not be familiar with the diamonds dataset (especially if you’ve never used it before) and want some clarification on where the data are from. Can you tell me more about the diamonds dataset? 6.5 Example Two: Identifying a Coding Language Sometimes you might have to work with legacy code. Legacy code can be difficult to work with, especially if it is written in a language or style with which you are not familiar. There are more than 700 programming languages in use today, so it is impossible for any programmer to know them all. AI can be a helpful tool for identifying the language and version of legacy code, which can make your life just a little easier. Let’s look at example code that might have been written decades ago. program temperature_smog_analysis; uses Math; const n_temperatures = 1000; n_smog_measures = 500; type TemperatureArray = array[0..n_temperatures-1] of integer; SmogArray = array[0..n_smog_measures-1] of integer; var temperatures: TemperatureArray; smog_measures: SmogArray; combined_data: array of integer; slope, y_intercept: double; i, j: integer; function connect_to_database(filename: string): integer; begin { implementation of connect_to_database function } end; function retrieve_temperatures(fd: integer): integer; begin { implementation of retrieve_temperatures function } end; function retrieve_smog_measures(fd: integer): integer; begin { implementation of retrieve_smog_measures function } end; function retrieve_temperature(fd, index: integer): integer; begin { implementation of retrieve_temperature function } end; function retrieve_smog_measure(fd, index: integer): integer; begin { implementation of retrieve_smog_measure function } end; procedure close_database(fd: integer); begin { implementation of close_database function } end; We can ask Bard to take a guess at what the coding language might be. What language is this code written in? We can explore further to figure out what indicators tell Bard the language is Pascal. How do you know this is Pascal? It turns out there are multiple versions of Pascal. Since you will presumably need to work with this legacy code, you might want to know which version it is. What version of Pascal is this? 6.6 Example Three: Interpreting Regex Regex (short for Regular Expressions) is a powerful tool used to describe patterns in text. It’s a sequence of characters that define a search pattern. Regular expressions can be a powerful tool for data cleaning, text mining, and data validation. They are widely used in web development, data science, and other fields where text processing is important. They can also be tricky to understand at first because they involve a specific syntax that can be complex. We can use ChatGPT to explain regex in a bit of someone else’s code. x = sub("/d/e","/d",x) What does this do? 6.7 Example Four: Demystifying Functions Sometimes we get handed code that includes complex architecture. Perhaps you are working with code you wrote years ago when you really liked loops, but present you finds them difficult to parse. (Be nice to past you - maybe you were a baby programmer and didn’t know better.) Instead of giving yourself a headache, you could turn to ChatGPT to explain what your old code does. def my_function(x): result = x for i in range(10): for j in range(5): result = result + 2 * (i + 1) * (j + 1) * (i % 2 == 0 and j % 2 == 0) - 1 return result What does this function do? Well, now you have an idea what past-you might have been attempting to do with this code. You can also query AI about the potential problems from using the code as-written. What are some possible issues with this code? (And if you do ever run across an expression like this in your code, you can check out our chapter on refactoring code using AI to fix it!) 6.8 Hands-On Exercise Now it’s your turn to try. Let’s say you were handed this bit of code to work with (and eventually modify), but first you need to figure out what’s going on with it. Unfortunately, the original programmer left very little in the way of notes or annotation. 6.8.1 The Code Note: This code is just an example and was written strictly for educational purposes. use ode_solvers::{Euler, OdeMethod}; use plotters::prelude::*; use std::fs::File; const N: f64 = 1000000.0; const I0: f64 = 10.0; const R0: f64 = 0.0; const S0: f64 = N - I0 - R0; const BETA: f64 = 0.3; const GAMMA: f64 = 0.1; fn sir_model(t: f64, y: &[f64], v: f64) -> Vec<f64> { let s = y[0]; let i = y[1]; let r = y[2]; let dsdt = -BETA * s * i / N - v * s; let didt = BETA * s * i / N - GAMMA * i; let drdt = GAMMA * i + v * s; vec![dsdt, didt, drdt] } fn main() { let mut solver = Euler::new(sir_model); solver.set_initial_condition(&[S0, I0, R0]); let root = BitMapBackend::new("sir_vaccination.png", (800, 600)).into_drawing_area(); root.fill(&WHITE).unwrap(); let mut chart = ChartBuilder::on(&root) .caption("SIR model with vaccination", ("sans-serif", 40)) .set_label_area_size(LabelAreaPosition::Left, 60) .set_label_area_size(LabelAreaPosition::Bottom, 40) .build_cartesian_2d(0.0..100.0, 0.0..N) .unwrap(); let mut data1 = vec![]; for _ in 0..1000 { let y = solver.integrate(0.1, 0.0); data1.push((solver.time(), y[0], y[1], y[2])); } let vac_rate = 0.1; let vac_coverage = 0.5; let vac_num = vac_coverage * N; let mut data2 = vec![]; for i in 0..1000 { let t = i as f64 * 0.1; let v = if t >= 50.0 && t < 150.0 {vac_num * vac_rate} else {0.0}; let y = solver.integrate(0.1, v); data2.push((solver.time(), y[0], y[1], y[2])); } chart .configure_mesh() .x_labels(10) .y_labels(10) .disable_x_mesh() .disable_y_mesh() .draw() .unwrap(); chart .draw_series(LineSeries::new( data1.iter().map(|d| 6.8.2 Questions Write a query that identifies the features that can be used to determine the coding language, as well as the version of the language. What language and version is it written in? What features give away the coding language? Create a prompt that determines what this code does, as well as important features of the program. What does this code do? Write a prompt that determines the purpose of this specific code snippet: let root = BitMapBackend::new("sir_vaccination.png", (800, 600)).into_drawing_area(); What is the purpose of this line of code? 6.9 Summary Understanding code written by someone else can be made easier by using AI AI chatbots can summarize the code and the dataset used, as well as clarify functions and expressions that are confusing AI chatbots can also identify the coding language and version used in legacy code Be mindful of who owns the code and what the summary will be used for when using AI to summarize someone else’s code "],["about-the-authors.html", "About the Authors", " About the Authors These credits are based on our course contributors table guidelines.     Credits Names Pedagogy Lead Content Instructor Elizabeth Humphries (Writing Code, Understanding Unfamiliar Code) Content Authors Candace Savonen (Annotating Your Code), Carrie Wright (Ethics of Using AI), Ava Hoffman (Refactoring Code) Content Editor Reviewer Howard Baek Technical Template Publishing Engineers Candace Savonen, Carrie Wright, Ava Hoffman Publishing Maintenance Engineer Candace Savonen Technical Publishing Stylists Carrie Wright, Ava Hoffman, Candace Savonen Package Developers (ottrpal) Candace Savonen, John Muschelli, Carrie Wright Art and Design Figure Artists Candace Savonen, Carrie Wright, Ava Hoffman, Elizabeth Humphries Funding Funders CS, CW, and HB were supported by the National Cancer Institute (NCI) under Grant UE5CA254170. AMH and EMH were supported by the AnVIL Project through cooperative agreement awards from the National Human Genome Research Institute with cofunding from OD/ODSS to the Broad Institute (U24HG010262) and Johns Hopkins University (U24HG010263). Funding Staff Sandra Ormbrek, Shasta Nicholson   Tools Used: ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## hms 0.5.3 2020-01-08 [1] RSPM (R 4.0.0) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.0.2) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## ottrpal 1.0.1 2023-03-28 [1] Github (jhudsl/ottrpal@151e412) ## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.3) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## readr 1.4.0 2020-10-05 [1] RSPM (R 4.0.2) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.0.2) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.3) ## vctrs 0.6.1 2023-03-22 [1] CRAN (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["appendix.html", "Appendix Programming Languages AI and Cloud Computing", " Appendix Programming Languages Here are commonly used languages and their typical use cases. Python Known for its readability, simple syntax, and comprehensive add-on modules. It is often recommended as a beginner-friendly language. Python is used for scientific computing, data analysis, machine learning, and web development. Many Data Scientist roles rely on Python. Ruby Similar to Python, Ruby is also known for its readability and user-friendly syntax. It is typically used for web development, building dynamic websites, and creating web applications. JavaScript A popular language for web development, known for its versatility and ease of use. Many of the interactive features of websites rely on JavaScript. Java Java is widely used for enterprise applications, android mobile apps, and web apps. PHP PHP is easy to learn but can become complex as the application grows. It is typically used for building dynamic web pages, web applications, and content management systems. R Used for statistical computing, data analysis, and data visualization, R is a popular choice for researchers and data scientists. Some beginners find its syntax complex, especially due to differences in the two major dialects: “base” R versus the “tidyverse”. Kotlin Kotlin is a relatively new language that is designed to be more concise and expressive than Java. However, its advanced features and concepts may be challenging for beginners. It is used for developing Android mobile apps, web development, and server-side development. Swift Used for iOS and macOS app development, Swift is known for its strict syntax and steep learning curve. C# Often used for Windows desktop applications, web applications, and video games, C# can be challenging due to its more complex syntax and strict type system. C++ A powerful language often used for developing high-performance applications and operating systems, C++ can be challenging to learn due to its complexity and the need to manage memory manually. Julia Julia is designed for numerical and scientific computing, data analysis, and machine learning. It has a syntax that is easy to learn and read, making it an ideal choice for data scientists, engineers, and researchers. Julia code can also be compiled to native machine code using the Julia compiler. Because Julia is a relatively new language, it has fewer add-on libraries and resources available compared to more established languages. MATLAB MATLAB is a high-level programming language and development environment commonly used for numerical computation, data analysis, and visualization. It is widely used in engineering, physics, and finance, among other fields. It is generally considered to have a user-friendly syntax and is relatively easy to learn compared to other languages. MATLAB has a development environment called MATLAB Compiler that allows you to package MATLAB code into standalone executables or shared libraries for use on a wide variety of operating systems. Fortran Fortran has been around for decades and has a long history in scientific and engineering communities. It has a more challenging syntax and is considered harder to learn than some of the other languages on this list. It is primarily used for scientific and engineering applications that require numerical computations and simulations such as computational physics, weather forecasting, and computational chemistry. Rust Rust is a systems programming language that focuses on speed, reliability, and memory safety. It is commonly used for developing performance-critical software, such as operating systems, web browsers, and game engines. Rust’s syntax is similar to C++, but is often considered to have a steeper learning curve due to its focus on memory safety and ownership concepts. AI and Cloud Computing AI in cloud computing is an exciting and rapidly advancing field that combines artificial intelligence (AI) and cloud computing technologies. Cloud computing provides on-demand access to computing resources over the internet, such as storage, processing, and analytics, while AI uses algorithms and models to enable machines to perform tasks traditionally requiring human intelligence. Developers can easily incorporate AI into applications using cloud-based AI services. For example, Amazon Web Services (AWS), Microsoft Azure, and Google Cloud Platform offer AI services like speech recognition, image recognition, natural language processing, and machine learning. AI optimizes cloud resources and performance. It allocates resources based on workload demands, optimizes power usage, detects threats, and improves application latency by predicting user behavior and preloading content. However, integrating AI and cloud computing presents challenges around data, security, privacy, ethics, complexity, and management that must be addressed carefully. Large amounts of data are needed to train AI models, especially deep learning models requiring vast labeled data to identify patterns and predictions accurately. Storing and processing huge data can be expensive, impacting cost, scalability, and environment performance. Ensuring data security, privacy, and ethical use also require consideration. AI and cloud computing are complex with specialized skills and knowledge to use effectively. Integration increases complexity, challenging management and maintenance. Careful planning and execution evaluates benefits and limits of AI; selects appropriate models and algorithms; and determines integration into the cloud environment. Monitoring evaluates model performance, enabling adjustments to optimize performance and efficiency. As both AI and cloud computing technologies advance, the intelligent integration of the two can provide on-demand access to advanced AI capabilities, optimize resources, facilitate smarter applications, and gain data-driven business insights. Integration challenges around data, security, ethics, and complexity must be managed proactively through evaluation, planning, monitoring, and adjustments to maximize benefits and minimize limitations. When implemented responsibly, AI in cloud computing enables remarkable intelligent and scalable systems transforming organizations and society. "],["references.html", "References", " References "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] +[["index.html", "AI for Software Development Harnessing the Power of Large Language Models About this Course Available course formats Suggested Activity Context Learning Objectives Lesson Breakdown", " AI for Software Development Harnessing the Power of Large Language Models July, 2023 About this Course This course on AI for software development explores the use of AI large language models such as ChatGPT, Bard, and others and their potential benefits and challenges. Through examples and hands-on activities, students will develop an understanding of the ways in which AI can speed up software development tasks and free up time for more creative and strategic work. By the end of the course, students will be equipped to navigate the rapidly changing landscape of software development and use AI chatbots in a way that maximizes benefits and efficiency while limiting harm as much as possible. Available course formats This course is available in multiple formats which allows you to take it in the way that best suits your needs. The material for this course can be viewed without login requirement on this Bookdown website. This format might be most appropriate for you if you rely on screen-reader technology. Our courses are open source, you can find the source material for this course on GitHub. The slides for the images in the course can be found here. Suggested Activity Context Course Audience Professionals looking to improve efficiency Students hoping to learn more about programming Anyone curious about how AI can be harnessed for technology Note: Those completely new to programming will find using AI tools to create software solutions challenging at this time. It is helpful to have some fundamental knowledge to write appropriate prompts and to discern when code is not working as expected. We advise novices to seek expert review. Course Prerequisites Some previous exposure to programming recommended. Assessment Type Hands-on activities following each lesson. Learning Objectives Learners will be able to: Explain the basics of AI and its potential for improving software development workflows Implement strategies to write and debug code using AI-based tools Describe the benefits of refactoring code using AI-powered techniques, such as making code readable, keeping it brief, and optimizing code Apply best practices for annotating code using AI Recognize strategies for using AI-based tools to understand and analyze code, such as code comprehension of unfamiliar languages or functions Discuss the challenges and ethical implications of using AI for different aspects of software development Lesson Breakdown Activity Duration Introduction 10 minutes Ethics for Using AI 20 minutes Writing Code 35 minutes Writing Exercise 15 minutes Refactoring Code 35 minutes Refactoring Exercise 15 minutes Annotating Code 25 minutes Understanding Code 25 minutes Understanding Exercise 10 minutes Total 3 hours & 10 minutes "],["introduction.html", "Chapter 1 Introduction 1.1 Learning Objectives 1.2 AI Provides New Opportunities 1.3 AI Code of Ethics 1.4 The AI Chatbots 1.5 How to Use This Book 1.6 About This Book", " Chapter 1 Introduction The increasing availability of AI chatbots is creating a new landscape in software development and data science. It is important to be aware of the potential benefits and challenges of this technology, so that we can use it in a way that benefits everyone and limits harm as much as possible. On the one hand, AI chatbots have the potential to replace or significantly reduce the workload of programmers. This could lead to job losses in the data science industry. Additionally, there are significant ethical and privacy concerns regarding the use of training data sets to teach these AI systems. For example, if a chatbot is trained on a dataset of biased or discriminatory data, it could perpetuate those biases in its interactions with users. On the other hand, AI chatbots also have the potential to create new jobs and opportunities. For example, chatbot developers will be needed to create and maintain these AI systems. Additionally, AI chatbots could be used to automate tasks that are currently done by humans, freeing up programmers to focus on more creative and strategic work of interpreting what the data actually mean. Ultimately, while the future of programming in software development and data science is unclear, there is much to be optimistic about in this brave new world. The advancements in AI and chatbot technology present an opportunity for programmers to work alongside algorithms to create innovative solutions that were previously unimaginable. As with any technological revolution, there will be challenges, but it is up to us to work together to ensure that we use these tools ethically and responsibly, and to create a future that benefits everyone. 1.1 Learning Objectives In this chapter we will demonstrate how to: Consider the potential benefits and limitations of AI for software development Recognize how to use this course, how it was written, and what to expect Explain general concepts for ethical use of AI tools for software development Summarize what Chatbots are and how they work Distinguish between different AI options for software development 1.2 AI Provides New Opportunities We do not believe that AI chatbots will replace programmers, software developers, and data scientists. While AI can be powerful and useful, it is only as good as the training data behind it and the human using it. Therefore, for the time being and the foreseeable future, humans will remain at the forefront of programming innovation, with AI providing valuable support. As new code is often built on top of existing code written by humans, it is unlikely that AI will fully replace the need for human programmers. However, we do think that the roles of programmers in software development and data science are changing, and some of the skills required to work in this new environment are slightly different from those needed before. In addition to proficiency in programming syntax, programmers may need to develop a more refined ability to construct queries that enable AI bots to create the desired workflows. Other critical skills such as debugging, troubleshooting, and documentation will continue to be valuable, and can be enhanced through the use of AI. Furthermore, AI creates new opportunities and niches for tasks that were previously difficult, time-consuming, or impossible. This is an exciting time for those working in programming, with great potential to explore new and innovative solutions. As AI technology continues to advance, its role in programming will only become more significant, and it is up to developers to adapt and learn how to use these new tools effectively. We asked OpenAI’s ChatGPT whether AI chatbots would replace human software developers, data scientists, and programmers, and this was the response: “It is unlikely that AI chatbots will replace software developers, data scientists, and programmers entirely. While AI chatbots can perform certain tasks related to software development, data analysis, and programming, they are limited in their abilities and require human oversight and input to function properly. AI chatbots can be used to automate certain tasks such as generating simple code snippets, running tests, and performing simple data analysis. They can also assist in the development process by providing quick answers to commonly asked questions and suggesting possible solutions to programming problems. However, more complex software development, data analysis, and programming tasks require a level of creativity, critical thinking, and problem-solving that AI chatbots cannot currently replicate. Software developers, data scientists, and programmers have a deep understanding of the technologies and tools used to develop AI chatbots, as well as the ability to optimize and improve those tools. Furthermore, software development, data analysis, and programming require a high level of human communication and collaboration, which AI chatbots cannot currently replicate. Humans are also essential in making ethical decisions related to AI development, such as ensuring that AI systems are transparent, fair, and unbiased. In summary, while AI chatbots can provide valuable assistance to software developers, data scientists, and programmers, they are unlikely to replace them entirely. Human expertise, creativity, and critical thinking will continue to be essential in developing and optimizing AI systems for the foreseeable future.” 1.3 AI Code of Ethics Our first duty as programmers is to avoid causing harm to people and the world. This includes avoiding both intentional and inadvertent harm. Intentional harm is harm that is caused by a programmer’s deliberate actions. For example, a programmer might create a virus that is designed to harm computers. Inadvertent harm is harm that is caused by a programmer’s negligence or lack of foresight. For example, a programmer might create a program that is buggy and causes data loss. We must always be aware of the potential for harm and deliberately take steps to mitigate it. This includes things like: Be aware of the potential for bias. AI systems are trained on data, and that data can reflect the biases of the people who collected it. Programmers should be aware of the potential for bias in their data and take steps to mitigate it. Be transparent about your work. Share information about your code, data, and algorithms. This will help others to understand how your work works and to identify any potential problems. Be accountable for your work. Take responsibility for the consequences of your code. Be willing to make changes if necessary. Participate in discussions about AI ethics. There are many online and in-person communities where you can discuss the ethical implications of AI with other people. Advocate for ethical AI. Speak up when you see AI being used in a way that you believe is unethical. Support organizations that are working to promote ethical AI. 1.4 The AI Chatbots Humans have been interacting with AI chatbots for years. In fact, Alan Turing is credited with coming up with the concept for chatbots as early as 1950. Chatbots are software-based systems that interact with humans typically by text or speech inputs, rather than code. They mimic some human activity (“Chatbot” 2023; Abdulla et al. 2022) based on these language inputs. They process the inputs using natural language processing commonly abbreviated as NLP. NLP is a kind of AI that uses human text or speech and parses the language to determine structures and patterns to extract meaning. NLP uses large amounts of language data (such as books, websites etc.) to train AI systems to identify these structures and patterns. For example, the AI model might identify when a sentence is a question or a statement by examining various features in a prompt such as the inclusion of a question mark of the use of words often used in questions (“Natural Language Processing” 2023; Cahn 2017). The methods used for chatbots have evolved over time. Now chatbots often utilize AI methods like deep learning (which involve multiple layers of abstractions of the input data (“Deep Learning” 2023)) to extract meaning from the language data (“Natural Language Processing” 2023). As these methods use large quantities of text, they are therefore often called large language models (“Large Language Model” 2023). Despite the fact that chatbots have been around awhile, the popularity of OpenAI’s ChatGPT and DALL-E programs has sparked a recent surge of interest. These chatbots are in part particularly powerful due to the fact that large amounts of computing power were used to train their NLP models on very large datasets (Caldarini, Jaf, and McGarry 2022; Cahn 2017). Large language model AIs can be divided into two categories: those that can be reached using an internet browser, and those that can be reached using an integrated development environment (IDE). This is not a comprehensive list! Browser-based chatbots Bard is Google’s large language model, also known as a conversational AI or chatbot trained to be informative and comprehensive. It is trained on a massive amount of text data and is able to communicate and generate human-like text in response to a wide range of prompts and questions. You will need to join the waiting list before getting access, although in our experience the wait time is short. ChatGPT is OpenAI’s large language model based on the GPT (Generative Pre-trained Transformer) architecture. It is designed to understand and generate human-like responses to text-based conversations. You will need to create an account before using it. Phind is a AI-powered search engine designed specifically for developers asking technical questions. In addition to answering your coding question, it will provide links to the internet sources used to find the answer. Poe is Quora’s platform that gives you access to multiple AI chatbots, including Sage, based on OpenAI’s GPT-3.5 architecture; Claude, an AI natural language bot created by Anthropic; and ChatGPT. IDE-based chatbots CoPilot by GitHub is a language bot that interfaces with your editor. This bot provides coding suggestions and ways to speed up testing. GitHub describes it as an “AI pair programmer”. It uses a subscription model with both individual and business tiers. CodeWhisperer is the Amazon Web Services chatbot for the AWS cloud platform. It can be installed in your integrated development environment (IDE) using the latest AWS Toolkit plugin. The individual tier for CodeWhisperer is free, although you will need to create an AWS account and add a payment method. What are the data sources for these chatbots? Some high-profile English-language AIs, including Google’s T5 and Facebook’s LLaMA, were trained on more than 15 million websites (Schaul, Chen, and Tiku 2023). The top sources of training data for these AI models were https://patents.google.com/ and https://www.wikipedia.org/ ! 1.5 How to Use This Book This book is written with the expectation that users will follow along and paste the queries from each example into their own AI chatbot session. After you have finished this book, you will be able to use whichever combination of chatbot and programming environment that you’re comfortable using. 1.5.1 Choice of AI Model You can use whichever AI you like for this course, as long as it is a large language model. (Other types of AIs are not explored in this course.) We will use a variety of browser-based chatbots as examples throughout this course. Some AIs will be better suited for your particular tasks, and it is too early to judge which of the technologies will end up dominating the industry. We encourage you to test multiple AI platforms to find the ones that best fit your needs, and the use of a particular AI in each chapter should not be taken as an endorsement by us. We have focused on the browser-based chatbots for our examples in this course for ease of demonstration. 1.5.2 Computing Environment Needs All the examples and activities in this course can be done in the computer environment you prefer. None of the tasks require a huge amount of computing power, so local installations on your personal computer are fine, though everything will also translate to a high performance computing cluster or a cloud computing platform. In addition to the CodeWhisperer chatbot available on the AWS cloud platform, a variety of cloud-based AI tools and platforms exist that can be leveraged for practical projects after this course. For instance, Amazon SageMaker or Google Cloud AI Platform can be used for constructing and training machine learning models, while Microsoft Azure Cognitive Services can be applied to incorporate natural language processing features into your applications. If you’d like to learn more about how AI can be integrated with cloud computing, you can read about it in the Appendix. 1.5.3 Boxes Throughout this course, you will see several types of specially-colored boxes. In particular, there are two to which you should pay special attention. One box highlights potential ethical issues with an AI usage. In this box, you’ll find reminders of the ethical considerations you should be particularly aware of while using AI to do certain tasks. The other box highlights our queries to AI chatbots. The question we posed to the AI chatbot is written in these boxes to make it easier for you to find. Wherever possible, we use screenshots of the actual answers we got from the AI chatbots in response to our questions. Occasionally when we have asked for the AI to write or fix code, we have formatted the answer in such a way that makes it easier to use. When you see this format, you will know it indicates an AI response Code in these boxes was written by AI. 1.6 About This Book We used AI bots (including ChatGPT, Bard, Sage, and Claude) to develop and write much of this course. We firmly believe this new technology can be used in ethical ways and we put into practice all the rules and suggestions offered over the following modules while we created this book. "],["ethics-of-using-ai.html", "Chapter 2 Ethics of Using AI 2.1 Learning Objectives 2.2 Major concerns 2.3 Replacing Humans 2.4 Bias 2.5 Misinformation 2.6 Unintelligible Code 2.7 Faulty or Buggy Code 2.8 Security and Privacy issues 2.9 Violating Copyright 2.10 Harmful code 2.11 Summary", " Chapter 2 Ethics of Using AI The use of artificial intelligence (AI) and in particular, generative AI, in coding has raised a number of ethical concerns. We will highlight several current concerns, however please be aware that this is a dynamic field and the possible implications of this technology is continuing to develop. It is critical that we as a society continue to evaluate and predict what the consequences of the use of AI will be, so that we can mitigate harmful effects. 2.1 Learning Objectives In this chapter we will demonstrate how to: Describe key ethical concerns for using AI tools in software development Identify possible mitigation strategies for these major concerns Explain the potential benefits of being transparent about the use of AI tools to write code Discuss why human contributions are still important and necessary Recognize strategies for using AI tools to write code more responsibly Implement prompts to ask AI tools about responsible use throughout various coding practices 2.2 Major concerns In this chapter we will discuss the following issues that writing code with AI tools may contribute to: Replacing Humans - AI tools can help humans write code, but they are not a replacement. Bias - AI models are built on data and code that were created by biased humans, this bias can be further perpetuated. Misinformation - fake or manipulated data used to help design algorithms could be believed to be correct and this could be further propagated. Unintelligible Code - Developers need to follow best practices with code generated by AI. Just like code generated by human developers, this includes figuring out how the code works, how it integrates with other code, as well as annotating and documenting how to use the code . Faulty or Buggy Code - Code that may not be optimal for a given situation may be inadvertently used by those with less familiarity, which may result in faulty software. Security or Privacy Issues - Code may not be optimized for security if not adequately evaluated. Generative AI models have access to large amounts of data that is currently unregulated and may include data that should be protected for privacy reasons. Copyright Violations - The code used for the generative AI model may used code that has copyright laws that require attribution or do not allow reuse and it may not be clear where the code came from. Harmful Code - Currently it is not clear how well generative AI models restrict the creation of code that will be used for goals that harm others. Note that this is an incomplete list; additional ethical concerns will become apparent as we continue to use these new technologies. We highly suggest that users of these tools be transparent about the use of these tools, so that as new ethical issues emerge, we will be better prepared to understand the implications for specific coding projects. Be transparent about what AI tools you use to write code. This help others to better understand how you created your code, as well as the possible sources that the AI tools might have used when helping you write code. It may also help with future unknown issues related to the use of these tools. Some organizations and scientific societies have created guidelines or requirements for using AI in journal articles and conference submissions, like the International Society for Computational Biology. Be aware of the requirements/guidelines for your field. It is essential to address these ethical concerns and ensure that the use of AI in coding is done in a responsible and transparent manner. This could be done through ensuring the quality of the data used to train AI systems, promoting transparency in AI-generated code, and implementing safeguards against the creation of harmful or biased code. By doing so, we can harness the potential of AI to improve and transform the way we write and optimize code while maintaining ethical standards. 2.3 Replacing Humans Those who use AI tools to write code or to understand code need to recognize their own value in the process. While AI systems are useful, they do not replace the strengths that humans have for innovating new ways to write code, evaluating how the code integrates into the larger picture of a project, or in evaluating the downstream consequences of the code. Computer science is a field that has historically lacked diversity and new learners can often feel intimidated. There is the potential that new learners may feel even more discouraged as they learn to write code when witnessing AI tools write code. It is critical that we support diverse new learners of computer science, as we will continue to need human involvement in the development and use of AI tools. 2.3.1 Tips for supporting human code Follow best teaching practices for inclusion of diverse learners. Encourage current and future programmers to continue to innovate and write code. Avoid thinking that code written by computers must be better than code written by humans, as this simply is not true. Recall that humans first wrote they code that the AI tools use to write code. Be transparent about when you do or do not use AI tools, give credit to the humans who write code where possible. A new term in the medical field called AI paternalism describes the concept that doctors (and others) may trust AI over their own judgment or the experiences of the patients they treat. This has already been shown to be a problem with earlier AI systems intended to help distinguish patient groups. Not all humans will necessarily fit the expectations of the AI model if it is not very good at predicting edge cases (Hamzelou n.d.). Therefore, in all fields it is important for us to not forget our value as humans in our understanding of the world. 2.4 Bias One of the biggest concerns is the potential for AI to create biased code. AI systems are trained on data created by humans. If this data used to train the system is biased (and this includes existing code that may be written in a biased manner), the resulting code could also be biased. This could lead to discrimination, abuse, or neglect for certain groups of people, such as those with certain ethnic or cultural backgrounds, genders, ages, sexuality, capabilities, religions or other group affiliations. It is well known that data and code are often biased (Belenguer 2022). It is important that evaluations be made throughout the software development process to check for and consider potential perpetuation of bias. 2.4.1 Tips for avoiding bias Be aware of the potential biases in the data that is used to train AI systems. Check for possible biases within the data. Are there harmful data values? Examples could include discriminatory and false associations. Are the data adequately inclusive? Examples could include a lack of data about certain ethnic or gender groups or disabled individuals, which could result in code that does not adequately consider these groups, ignores them all together, or makes false associations. Are the data of high enough quality? Examples could include data that is false about certain individuals. Evaluate the code for biases as it is developed. Check if any of the criteria for weighting certain data values over others are rooted in bias. Consider the possible outcomes of the use of the code. Consider if the code could possibly be used in a manner that will result in discrimination. See Belenguer (2022) for more guidance. 2.5 Misinformation AI tools use data that may contain false information. AI tools may also report data as if it is real, when it is in fact not real. For example, currently at the time of the writing of this course, ChatGPT will report citations with links that are not correct. 2.5.1 Tips for reducing misinformation Be aware that some AI tools currently make up false information based on artifacts of the algorithm. Do not assume that everything that the algorithm produces is real or correct. 2.6 Unintelligible Code There is risk that those less aware of best coding practices use AI-generated code and do not follow these practices. This could make it difficult for others to understand how the code works and could make it hard to identify and fix any issues that may arise. This could result in negative consequences, such as system crashes or security breaches, that could have been avoided if the code had been written by an experienced and savvy human programmer. 2.6.1 Tips for avoiding unintelligible code Code should be reviewed by experienced programmers. Code should be annotated throughout to explain what the code is doing. Documentation should be created that describes how to use the code properly. Ask AI tools to help you understand the code, but get expert assistance where needed. Can you explain what the code in line 4 is doing? 2.7 Faulty or Buggy Code There is a risk that code written with AI tools, if not reviewed carefully enough, may be faulty. AI systems may not be trained on data that relates to current software dependencies or best practices. It is also important to remember that code generated by AI tools is not necessarily better than code written by humans. It requires just as much code review. 2.7.1 Tips for reducing faulty or buggy code Do not assume that the code generate by AI is correct. Realize that AI is only as good or up-to-date as what it was trained on, the code may be generated using out-of-date code. Look up packages and functions used to ensure if the code is up-to-date. Make sure that you understand the code that you are using. AI can be used to help you understand what the code is doing, but consult with experts when needed. Ask the AI tools for extra information about if there are any potential limitations or weaknesses in the code, but keep in mind that the tool may not be aware of issues and therefore human review is required. The information provided by the tool can however be a helpful starting point. Are there any limitations associated with this code? What assumptions were made in writing this code? Stack Overflow, a popular community-based website where programmers help one another, has (at the time of writing this) temporarily banned users from answering questions with AI-generated code. This is because users were posting incorrect answers to questions. It is important to follow this policy (as you may face removal from the community). This policy goes to show that you really need to check the code that you get from AI models. While they are currently helpful tools, they do not know everything. 2.8 Security and Privacy issues AI tools are not always trained in a way that is particularly conscious of data security. Furthermore, if the code is written using these tools by users who are less familiar with coding security concerns, protected data or important passwords may be leaked within the code itself. AI systems may also utilize data that was actually intended to be private. It is also important to consider what data your code might actually be using. 2.8.1 Tips for reducing security and privacy issues Check that all passwords, access tokens (like API keys), security certificates are not saved in a public place where anyone can access or tamper with them. Check that no sensitive data, such as Personal Identifiable Information (PII) becomes public through the code. Utilize encryption and other security practices where needed. Consult with an expert about data security if you think your code could possibly cause someone to access protected data who is not authorized to access it. Promote for regulation of AI tools by voting for such standards where possible. Ask AI tools for help, but to not rely on them alone. Are there any security or privacy concerns associated with this code? 2.9 Violating Copyright When AI systems are trained on data, they may also learn and incorporate code from that data. This means that AI-generated code could potentially infringe on the copyright of the original author of the code. For example, if an AI system is trained on a GitHub repository that contains code written by a human programmer, the AI system could generate code that is identical to or similar to the code in the GitHub repository. If the AI system then uses this code without permission from the original author, this could constitute copyright infringement. In general, we want programmers to feel comfortable sharing their code openly without fear they won’t be credited. Similarly, AI systems could potentially infringe on intellectual property rights by using code that is protected by trademarks or patents. For example, if an AI system is trained on a training manual that contains code that is protected by a trademark, the AI system could generate code that is identical to or similar to the code in the training manual. If the AI system then uses this code without permission from the trademark owner, this could constitute trademark infringement. 2.9.1 Tips for avoiding copyright violations Be transparent about what AI tools you use to write your code. Obtain permission from the copyright holders of any code that you use to train the AI system. Only use code that is in the public domain or that has been licensed for use by the AI system’s owner. Cite any GitHub repositories or training manuals you might use in your code. Ask the AI tools if the code it helped generate used any code that you can cite. Did this code use any code from others that I can cite? 2.10 Harmful code Another major concern is the use of AI to generate malicious code. For instance, AI could be used to create code that spreads malware or hacks into computer systems. This could cause severe damage to individuals and organizations, including data breaches and financial losses. 2.10.1 Tips for avoiding the creation of harmful code Be careful about what code you share publicly, as it could be used for malicious purposes. Consider how the code might be used by others. Ask the AI tools to help you, but do not rely on them alone. What are the possible downstream uses of this code? What are some possible negative consequences of using this code? 2.11 Summary Here is a summary of all the tips we suggested: Disclose when you use AI tools to write code. Credit human authors by citing their code and adhering to copyright restrictions. Ensure the code doesn’t expose sensitive data, such as passwords or PII. Don’t assume AI-generated content is real, accurate, or current. Ask the AI tools to help you understand: Sources for the code that you can cite What the code is doing Code limitations Potential security or privacy issues Potential downstream consequences of the code Always have expert humans review the code and value your own contributions and thoughts. Overall, we hope that these guidelines and tips will help us all to use AI tools more responsibly for writing code. We recognize however, that as this is emerging technology and more ethical issues will emerge as we continue to use these tools in new ways. AI tools can even help us to use them more responsibly when we ask the right additional questions when writing code, but remember that human review is always necessary. Staying up-to-date on the current ethical considerations will also help us all continue to use AI responsibly. "],["writing-code.html", "Chapter 3 Writing Code 3.1 Learning Objectives 3.2 Coding Basics 3.3 Writing Code with AI 3.4 Tips for Coding with AI 3.5 Example One: Creating a Function 3.6 Example Two: Debugging Code 3.7 Example Three: Comparing Syntax 3.8 Example Four: Figuring Out a Common Task 3.9 Example Five: Planning Your Program 3.10 Example Six: Selecting a Coding Language 3.11 Hands On Exercise 3.12 Summary", " Chapter 3 Writing Code 3.1 Learning Objectives Recognize the benefits and capabilities of AI-powered programming tools, particularly for certain kinds of tasks that are difficult for humans Explain how AI-generated code and automated programming tools contribute to making programming more accessible to individuals with limited coding experience or to those working in a new language Explore the ethical considerations associated with using AI in programming, including the importance of rigorous testing before publishing code Apply strategies for using AI to build functions, debug code, understand error messages, check syntax, choose the proper programming language, and plan out a multi-step programming project 3.2 Coding Basics In today’s digitally-driven world, coding has become an essential skill. It is used to create websites, mobile applications, and sophisticated software systems. Contrary to popular belief, coding is not only for those who possess an innate talent for programming. With the right resources and a willingness to learn, anyone can become proficient in coding. Practice is crucial to mastering the art of coding, and those who are willing to commit themselves to the learning process can achieve great results. Writing code can also be a rewarding and fulfilling hobby, too. Creating your own software, building a website, or automating a task can be immensely satisfying, and can provide a sense of accomplishment and pride. Moreover, writing code can be a form of creative expression. Just as musicians use notes to compose music and artists use paint to create visual art, programmers use code to create digital experiences. From building websites to creating video games, code can be used to bring ideas to life in exciting and innovative ways. Ultimately, the ability to write code is a valuable asset in today’s world, with increasing demand for skilled programmers in a wide range of industries. Whether as a career or hobby, coding can be both personally and professionally rewarding. The accessibility and versatility of coding make it an excellent skill for anyone to learn, regardless of their background or previous experience. 3.3 Writing Code with AI AI-powered programming tools and technologies are revolutionizing the way we approach software development. AI can generate code snippets. An AI-powered code editor can suggest more efficient algorithms or highlight potential errors in real-time. It can also help developers to reproduce bugs more easily and to test potential fixes more quickly. This can save developers a significant amount of time and effort, and it can help them to debug their code more effectively. Be aware that AI still makes a lot of mistakes when writing code, so you will need to be particularly careful in testing code it writes. AI can make programming more accessible. With AI-generated code and automated programming tools, individuals who are not experienced developers can still create software solutions. Experienced developers can also more easily write code in languages with which they aren’t familiar. This has the potential to democratize programming and lead to new innovations from a wider range of people. Can complete novices learn how to program using AI tools? At present, it is very challenging for complete novices to rely on AI chatbots to learn how to write code. These tools will sometimes write buggy code or code that doesn’t not work as intended, and a person with no programming experience will have difficulty learning how to spot these sorts of mistakes. AI chatbots are best thought of as a supplement to your software development education, not as a replacement, and they should be used alongside other resources. Therefore, we advise that you seek expert review and assistance. As AI tools are refined, complete novices may be able to create software products more readily on their own. AI is changing the skills required for writing code. Rather than simply memorizing syntax, developers need to focus on developing their creativity, intuition, and problem-solving skills. Additionally, programmers must also hone their abilities in architecture design and project management, as these skills are becoming increasingly important in the modern software development landscape. As AI continues to evolve, it is likely to have an even greater impact on the way we develop software in the future. As a programmer using AI, it is up to you to be responsible for what you create. You must rigorously test any code you write. It is your job to make sure any code you create with AI is not malicious and works as expected. 3.4 Tips for Coding with AI Using AI to write code is as much of an art as writing your own code. Following a few rules and suggestions will make your experience much more enjoyable and productive. Remember that AI cannot read your mind. You need to tell it what you’re thinking, and it may take several rounds of question-and-answer before you get something you can work with. Be clear about your goals. What do you want the AI to do? Be as specific as possible. Start with a simple task. Don’t try to do too much too soon. Start with a simple task and then gradually work your way up to more complex tasks. You wouldn’t write a complete program all at once, and you shouldn’t have AI do it, either. Provide enough data. The more data (and detail) you can give the AI, the better it will be able to learn and perform the task you want it to do. Be patient. Querying an AI can take time. Don’t expect it to be perfect right away. Test everything AI writes. You are responsible for the code that AI generates, even if you didn’t write it yourself. AI can be biased, just like humans, and this could lead to sub optimal development. There is a concern that AI may focus development on areas that optimize certain metrics but not overall quality, effectiveness, or user needs. Human judgment is still needed to ensure that AI is used in a responsible and ethical way. Test your results. Make sure the AI is actually doing what you want it to do. AI systems are trained on data, and if the data is not representative of the real world, the AI system may not be able to generate code that works correctly. It is important to test the code to make sure that it is working as intended and that it is producing the desired results. Inadequate testing could lead to low quality, buggy code. Since AI generated code would be highly automated, it requires strong testing procedures and safety oversight to ensure it meets standards before deployment. Make sure your code is secure. AI systems can be used to generate code that is vulnerable to attack, and it is important to test the code to make sure that it is secure. This can help to prevent security breaches from occurring. Use a variety of AI models. There are many different AI models available. Experiment with different models to see which one works best for your task. Get feedback from others. Ask other people to review your code and give you feedback. This can help you identify and fix any problems with your code. 3.5 Example One: Creating a Function One of the most common things a programmer does is write functions to automate tedious tasks. With proper guidance, AI can speed this process up. Perhaps you need to write a quick function that reverses all the letters in a string. We can query Phind for help. How do I write a function that reverses the letters in a string? To reverse a string in Bash, there are multiple approaches. One way to reverse a string is by using the rev command. According to StackOverflow, the rev command is installed on most Linux systems by default. To use the rev command, simply enter rev followed by the string you want to reverse. For example: $ echo "12345" | rev However, it is important to note that the rev command is not present in all flavors of Unix. Another way to reverse a string is by using a simple Bash script. According to StackOverflow, we can write a Bash script that reverses a string using a for loop. Here is an example script: var="12345" copy=\\${var} len=${#copy} for((i=$len-1;i>=0;i--)); do rev="$rev\\${copy:$i:1}"; done echo "var: $var, rev: $rev" This script takes the string “12345” and stores it in the variable var. It then creates a copy of the string and stores it in the variable copy. The length of the string is stored in the variable len. The for loop starts at the end of the string and iterates through each character, adding it to the variable rev. Finally, the script prints the original string and the reversed string. Another approach to reversing a string is by using the tac command. According to StackOverflow, we can use the tac command to reverse the contents of a file or the standard input. Here is an example command: $ echo "12345" | sed 's/./&\\n/g' | tac | sed -e :a -e 'N;s/\\n//g;ta' This command uses the sed command to insert a newline character after each character in the string. It then passes the output to the tac command, which reverses the order of the lines. Finally, another sed command is used to remove the newline characters and print the reversed string. Overall, there are multiple approaches to reversing a string in Bash. The rev command, a simple Bash script with a for loop, and the tac command are all viable options. Phind offers you a variety of ways to do this, but all these options are in the language Bash. Because we didn’t include a programming language in our query, Phind picked one for us. Let’s refine our query a little. How do I write a function using Python that reverses the letters in a string? To write a function using Python that reverses the letters in a string, there are several approaches that can be taken. One approach involves using a for loop and the concatenation operator to join the original string in reverse order. This technique is demonstrated in realpython.com as follows: def reverse_string(text): result = "" for char in text: result = char + result return result print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and initializes an empty string result. The for loop iterates over each character in the input string, concatenating it with the current content of result and reassigning the new intermediate string to result at each iteration. At the end of the loop, result holds a new string as a reversed copy of the original one. Another approach involves using slicing to reverse the string. This technique is demonstrated in stackoverflow.com as follows: def reverse_string(text): return text[::-1] print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and returns the string in reverse order using slicing. The syntax text [::-1] means to slice the entire string with a step of -1, which reverses the order of the string. A third approach involves using Python’s built-in reversed() function to reverse the string. This technique is demonstrated in datagy.io as follows: def reverse_string(text): return ''.join(reversed(text)) print(reverse_string("Hello, World!")) # Output: '!dlroW ,olleH' In this example, the function reverse_string takes a string as its argument and uses the reversed() function to return an iterator that produces the characters of the string in reverse order. The join() method is then used to convert the iterator back into a string. All three approaches produce the same output, but they differ in terms of performance and readability. The first approach using a for loop and concatenation is the most straightforward, but it can be slower for large strings because it creates successive intermediate strings only to throw them away in the next iteration. The second approach using slicing is more efficient because it creates a new string object only once, but it may be less readable for some programmers. The third approach using reversed() is concise and readable, but it may be slower for large strings because it creates a reversed iterator that must be converted back into a string using join(). Once again, Phind has come through with multiple options. Now let’s say you knew you wanted to write a function like this, but you realize it’s only the strings in the third column of your file. Let’s add that requirement to our query. “How do I write a function using python that reverses the letters in a string for the third column of my file?” To write a function using Python that reverses the letters in a string for the third column of a file, you can use the extended slice syntax in Python. The extended slice syntax is a more concise and faster way of slicing strings in Python. To reverse a string using extended slices, you can use the following syntax: string[::-1] In this syntax, the first colon indicates the start of the slice, the second colon indicates the end of the slice, and the third colon indicates the step size of the slice. By setting the step size to -1, you can reverse the string. To create a function that reverses the letters in a string for the third column of a file, you can use the following code: def reverse_string(string): return string[:2] + string[2:5][::-1] + string[5:] In this code, the reverse_string() function takes a string as input and returns the string with its third column reversed. The first two characters of the string are returned as-is, while the third column (characters 3 to 5) are reversed using extended slices. Finally, the remaining characters of the string are returned as-is. There are other ways to reverse a string in Python, including using loops, recursion, stacks, and function calls. However, using extended slices is the most concise and efficient way to reverse a string in Python. Here are some pros and cons of using extended slices to reverse a string: Pros: Concise syntax: using the extended slice syntax is a one-liner that is easy to read and write. Fast execution: using the extended slice syntax is faster than using loops or other methods to reverse a string. Cons: Limited functionality: the extended slice syntax can only be used to reverse a string, and cannot be used for more complex string operations. Not beginner-friendly: the extended slice syntax is not intuitive for beginners who are not familiar with Python’s slicing syntax. In conclusion, to write a function using Python that reverses the letters in a string for the third column of a file, you can use the extended slice syntax in Python. This syntax is concise and efficient, but may not be beginner-friendly and may not be suitable for more complex string operations. 3.6 Example Two: Debugging Code A vast amount of time in programming is spent on debugging code. Often the compiler error messages are very precise about what has gone wrong while simultaneously lacking enough detail for the programmer to immediately understand how to fix the error. It is good practice to debug code as you go, instead of writing the entire program and then testing to identify the errors. Using an AI chatbot makes this task much, much easier. There are two options for using ChatGPT for debugging. First, we could query what the error code means. Here’s a Python code snippet that is throwing a TypeError: unsupported operand type(s) for +: 'int' and 'str' error when we try running it. def add_numbers(a, b): result = a + b return result number1 = 10 number2 = "20" sum = add_numbers(number1, number2) print("The sum of", number1, "and", number2, "is", sum) What does this error mean? TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ This error typically occurs when you try to concatenate (i.e., add together) a string and an integer using the “+” operator in Python. In Python, the “+” operator is used for both addition and concatenation depending on the data types of the operands. If you try to add a string and an integer using the “+” operator, Python will raise a TypeError because these two data types are not compatible for this operation. For example, if you have the following code: age = 25 message = "I am " + age + " years old." Python will raise the TypeError because you are trying to concatenate a string (“I am”) with an integer (25) using the “+” operator. To fix this error, you can convert the integer to a string using the str() function: age = 25 message = "I am " + str(age) + " years old." In this case, the str() function converts the integer age to a string before concatenating it with the other string, so the operation is valid and no error will be raised. ChatGPT helpfully explains what TypeError means, what causes it, and how to fix it. This is quite useful when you don’t understand the error message. Another option is to submit the code snippet that is causing an error to ChatGPT directly and ask for it to fix the mistake. Here’s another buggy code snippet, this time in C#. Can you debug this code? using System; class Program { static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; int sum = 0; for (int i = 1; i <= numbers.Length; i++) { sum += numbers[i]; } Console.WriteLine("The sum of the numbers is: " + sum); } } Sure, I can help you debug this code. Here are the issues I see: The loop is going out of bounds: The loop is iterating from 1 to numbers.Length, but array indexes start from 0. Therefore, when i is equal to numbers.Length, numbers[i] is trying to access an element outside the bounds of the array, which will result in an IndexOutOfRangeException. To fix this, you should change the loop condition to i < numbers.Length. The loop is not summing the array elements correctly: The loop is adding the elements starting from the second element instead of the first. To fix this, you should change the initial value of i to 0, which corresponds to the first element of the array. Here’s the corrected code: using System; class Program { static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; int sum = 0; for (int i = 0; i < numbers.Length; i++) { sum += numbers[i]; } Console.WriteLine("The sum of the numbers is: " + sum); } } This should correctly sum the elements of the numbers array and output the result. Be aware that if you choose to submit your code directly to an AI chatbot to debug that you submit a snippet at a time (if possible). Otherwise the answer can get quite unwieldy! 3.7 Example Three: Comparing Syntax You may be in the middle of writing code when you realize that you’ve used two possible syntaxes for the same command. Perhaps you are using the R package here and are wondering if two different ways of writing a command are the same. Is here::here(\"raw\", \"data.csv\") equivalent to here::here(\"raw/data.csv\")? First, let’s see what ChatGPT responded. When we first started putting together this course, we had intended to include an answer from Bard that disagreed with the answer from ChatGPT as an example of why it can be helpful to query multiple chatbots. (We decided ChatGPT was correct after verifying its answer in the here package documentation.) However, when we queried Bard again two weeks later, we were pleasantly surprised to discover that Bard had corrected its answer. Now it’s a cool little example of how the chatbots are rapidly improving and “learning” from their mistakes. 3.8 Example Four: Figuring Out a Common Task Sometimes you have a task that needs done that is fairly routine. You might not have done it before, but plenty of people in the world have. In this case, you don’t want to reinvent the wheel, but you may not know exactly where to start. AI is a great option for figuring out the basic workflow steps. A very common task for anyone working with genomic samples is to combine multiple files in the vcf format. Perhaps you’ve been asked to do this and then create a separate file that contains the names of the samples. You turn to ChatGPT for help. Can you write a program that merges vcf files and then outputs the sample names? Great! Of course, maybe you’re not comfortable using bcftools, or you try this and can’t get it to work. You can take advantage of the “Regenerate Response” option in ChatGPT to get another solution. What’s another way I can do this? You can also specify some of the features you’d like in your code, or where you might want the code to come from. Maybe you want to practice using GitHub repositories, so you specifically request it. Can you write a program that merges vcf files and then outputs the sample names using a github repo? If you know you’ve used something like a GitHub repository, you can ask ChatGPT for the citation. Just be aware that you need to verify that any citation it gives you should be checked independently. Unfortunately, AI bots can still respond with imaginary journal articles. (Assume that if you can’t find it, it doesn’t exist.) What’s the citation for the repo used in this code? In general, after you find a solution that works for you, you should always make a habit of asking the AI where it got the code. Never, ever, ever run code without knowing where it came from. What’s the source for this code? You should always take care that you are only using code that you’re authorized to use when writing code. This means asking the AI chatbot where code snippets are from and tracking down those citations and authorizations yourself (instead of just trusting the AI that everything is okay). 3.9 Example Five: Planning Your Program Let’s say we want to create software that plays the card game blackjack. You can jump right in and ask your AI chatbot to write the code, but you’re unlikely to be successful and incredibly likely to get frustrated. Before you start interacting with the AI, you need to plan out what you want to do. Everyone needs a plan of attack when building software. You should start by identifying what your software will do, then you can figure out the steps necessary to make that happen. We’ll ask Claude-instant (as implemented by Poe) how we can go about creating the necessary code for our game. How would I go about writing a program that can play blackjack? That seems like a really good roadmap for building a basic game, but if you’re ambitious (and of course you are), you might want to give your game a little extra something. Claude-instant has some ideas for that, too. What are some other features I could add to this game? At this point, you are ready to begin writing your program. You have a lot of tasks to do, so you have to pick a logical starting point. If you’re uncertain, you can ask AI for advice on your first task. What should be my first coding task for this program? In this case, the AI went beyond just suggesting a first task and also offered several options for how to do it as well. 3.10 Example Six: Selecting a Coding Language You will need to choose the language for your software. If you don’t, AI will likely pick a language for you, which may or may not be one you want. You might choose a language based on: Your preexisting knowledge or experience with the language A specific use case where the language is commonly used The language(s) your colleagues or coworkers use You can find a description of other languages you might encounter here. Let’s ask Claude-instant again for some recommendations on the appropriate languages for our proposed blackjack game from the above example. (Pro tip: the various AI bots all keep track of your previous queries, so you don’t have to restate your goal for the software if you’re continuing the conversation.) What would be a good coding language to create this game of blackjack? Claude-instant actually gave us more information than we anticipated. If it hadn’t stated pros and cons while offering language suggestions, we could ask for them directly. This could be helpful if you’re deciding between two options like, say, Python or Java. What are the pros and cons of using Python vs Java for this project? 3.11 Hands On Exercise Now it’s your turn to try! 3.11.1 Code Here’s the code you need for question #2. def calculate_average(numbers): total = 0 for number in numbers: total += number average = total / len(numbers) return average numbers = [1, 2, 3, 4, "5"] average = calculate_average(numbers) print("The average of the numbers is:", average) 3.11.2 Questions Write a prompt to create a function that replaces all instances of the string “three” with the number 3, then create a prompt that allows you to modify the function so that “three”, “Three”, and “THREE” are all replaced with the number 3. Write a query that helps you debug the code snippet from above. Create a query that explains how to retrieve data from an online database. Don’t forget to find out what the source of the code is. Write a prompt to plan out a program that creates and plays a game of Rock, Paper, Scissors. You should create a multi-step plan as well as figure out what your first coding task should be. Create a prompt that identifies the best coding language for the above game. 3.12 Summary Coding has become an essential skill in today’s world. AI can increase the efficiency of planning, writing, and debugging code, as well as make coding more accessible for beginners. Querying AI on code writing tasks requires patience. AI cannot read your mind, and users need to be both specific and patient when asking for coding help. It is essential to test all AI-written code while in development, since inadequate testing could lead to low quality, buggy code. A programmer is responsible for what they create while coding with AI, even if AI writes the actual code. devtools::session_info() ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## curl 4.3 2019-12-02 [1] RSPM (R 4.0.3) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## highr 0.8 2019-03-20 [1] RSPM (R 4.0.3) ## hms 0.5.3 2020-01-08 [1] RSPM (R 4.0.0) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## httr 1.4.2 2020-07-20 [1] RSPM (R 4.0.3) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.0.2) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## ottrpal 1.0.1 2023-03-28 [1] Github (jhudsl/ottrpal@151e412) ## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.3) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## readr 1.4.0 2020-10-05 [1] RSPM (R 4.0.2) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.0.2) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.3) ## vctrs 0.6.1 2023-03-22 [1] CRAN (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["refactoring-code.html", "Chapter 4 Refactoring Code 4.1 Learning Objectives 4.2 Refactoring Basics 4.3 AI in Code Refactoring 4.4 Example One: Correcting Syntax 4.5 Example Two: Styling and Convention 4.6 Example Three: Staying DRY 4.7 Example Four: Keeping Code Alive 4.8 Example Five: Making Code Readable 4.9 Example Six: Keep it Brief 4.10 Code optimization 4.11 Challenges and Limitations 4.12 Hands-On Exercise 4.13 Summary", " Chapter 4 Refactoring Code 4.1 Learning Objectives Describe how refactoring code involves optimization for maintainability, efficiency, and reuse Explain why refactoring code is important for developers in the longterm Recognize the benefits and limitations of using AI tools to refactor code, as well as why AI tools are uniquely poised to be beneficial Implement prompt strategies that can be used to assist with refactoring code for correcting syntax, for adopting more consistent styling, for making code more concise, for making code easier to maintain, and for making code more efficient 4.2 Refactoring Basics Code refactoring is the process of improving the quality of underlying code without changing its functionality. In other words, it’s a way of cleaning up and optimizing code so that it’s easier to maintain and more efficient. This often involves making small changes to the code, such as renaming variables or functions, reorganizing code blocks, or simplifying complex expressions. Refactoring is an essential practice in software development and helps to ensure that the codebase remains manageable and adaptable as requirements and business needs change over time. Code refactoring helps to reduce technical debt, which is the accumulation of development work that needs to be done in the future as a result of taking shortcuts or using less than optimal solutions. Refactoring can help to identify potential issues and bugs before they cause problems, resulting in more stable software. Finally, refactoring code to be more readable and less verbose can create fewer headaches for you in the future. To understand why code refactoring is important, imagine trying to cook in a disorganized and cluttered kitchen. You might be a fantastic cook, but you are spending more time searching for utensils and ingredients, and the quality of the meal could suffer as a result. Similarly, code that is disorganized and cluttered can be difficult to work with and can result in lower-quality software. Refactoring is like cleaning and organizing the kitchen - it makes the process of cooking (or coding) smoother and more efficient. 4.3 AI in Code Refactoring Code refactoring has historically been done manually by developers. This involves reviewing code and identifying areas that could be improved or optimized, and then making changes to the codebase accordingly. Though important, this is process is time-consuming and labor-intensive, as it requires developers to carefully review every line of code to identify potential issues or areas for improvement. Additionally, manual code refactoring is error-prone, as developers can accidentally introduce bugs or errors into the codebase while making changes. However, AI has significant potential to help with code refactoring. AI can use machine learning algorithms to analyze large amounts of code and identify patterns or areas that could be improved. For example, they can identify sections of code that are redundant, overly complex, or difficult to maintain, and suggest changes that could be made to improve the codebase. Machine learning algorithms can also help to identify potential bugs or security issues in the codebase, which can help to improve the overall quality and stability of the software. AI refactoring is also faster and more accurate than manual refactoring. This is particularly useful for large-scale software projects with massive codebases, where manual code review and refactoring can be an enormous task. In the next sections, we’ll take a look at some examples of using AI to refactor code. 4.4 Example One: Correcting Syntax Programming languages operate using their established set of rules. For example, Python uses indentation to define code blocks. However, when you shift between development environments, indentation and line breaks can sometimes be affected, causing major headaches! Let’s say we run the following code: def calculate_sum(a,b): result = a + b return result def calculate_product(a,b):result = a * b return result def main(): a=5 b=6 sum_result = calculate_sum(a, b) print("Sum:", sum_result) product_result = calculate_product(a,b) print("Product:", product_result) if __name__ == '__main__': main() ## unexpected indent (<string>, line 3) We get the error above because our indentation is off. Let’s ask ChatGPT to clean things up. Can you assist me with correcting the formatting and indentation issues in my Python code? Of course! Here is the code after correcting the formatting and indentation: def calculate_sum(a, b): result = a + b return result def calculate_product(a, b): result = a * b return result def main(): a = 5 b = 6 sum_result = calculate_sum(a, b) print("Sum:", sum_result) product_result = calculate_product(a, b) print("Product:", product_result) if __name__ == '__main__': main() ## Sum: 11 ## Product: 30 Much better! This can be quite handy when you can’t immediately see what is wrong with the formatting or if you are working with a large codebase. 4.5 Example Two: Styling and Convention Sometimes programming languages have more flexible rules where there are multiple ways to take the same or almost the same action. For example, in the R programming language, there are several ways to perform variable assignment. However, is is generally accepted among R programmers that the <- operator should be used. Single and double quotes can be used for character types interchangeably, but it’s generally a good idea to stick with one or the other. 4.5.1 Commonly Accepted Convention Let’s say we have the following code: a <- "apple" b = 'banana' "carrot" -> c c(a, b, c) ## [1] "apple" "banana" "carrot" This code does not produce any errors, but it doesn’t follow typical R convention. Let’s ask ChatGPT to clean things up. Can you help me reformat my R code to follow accepted style conventions? Sure, here’s the cleaned-up R code: a <- "apple" b <- "banana" c <- "carrot" Much better! This code will now look more familiar to other R programmers. 4.5.2 Visual Styling Some languages are flexible about line breaks, indentation, and spacing among code blocks. If you’re rapidly developing, things can get messy pretty quickly. Many development environments, for example RStudio and PyCharm, have the ability to format your code for you without changing any of the code itself. However, you can also get AI to do this according to your own preferences. d <- c(rep(a,5),rep(b,5),rep(c,5),paste(a,b,c),paste(c,b,a)) This code is pretty hard to read. Let’s see if AI can do better. Can you space out this R code to make it more readable? Sure! Here’s the same code with added spacing for improved readability: d <- c(rep(a, 5), rep(b, 5), rep(c, 5), paste(a, b, c), paste(c, b, a)) Better! It’s easier to interpret because only one action is being taken on each step. By spacing out the code and breaking it into multiple lines, it becomes easier for the human eye to scan for structure, logic, errors, and/or inconsistencies. 4.6 Example Three: Staying DRY The DRY (Don’t Repeat Yourself) programming tenet is essential to good software. By avoiding repetition in code, we can reduce the amount of duplicate code we need to write and maintain. If we need to change the functionality of a certain piece of code, we have to make the same change in multiple places, which can be time-consuming and error-prone. Let’s take the following Python code: def print_greetings(): print("Hello, Alice!") print("Hello, Bob!") print("Hello, Carol!") print("Hello, David!") print("Hello, Eve!") print_greetings() ## Hello, Alice! ## Hello, Bob! ## Hello, Carol! ## Hello, David! ## Hello, Eve! Notice how repetitive this code is? print() and the string \"Hello, \" appear five times. We can improve this! Could you please refactor my Python code to make it more DRY? Sure, here’s a refactored version of your code: def print_greeting(name): print(f"Hello, {name}!") def print_greetings(): names = ["Alice", "Bob", "Carol", "David", "Eve"] for name in names: print_greeting(name) print_greetings() ## Hello, Alice! ## Hello, Bob! ## Hello, Carol! ## Hello, David! ## Hello, Eve! Now let’s imagine your software lead has asked us to change the greeting to Spanish. Notice how we only have to change the second line of code: def print_greeting(name): print(f"¡Hola, {name}!") def print_greetings(): names = ["Alice", "Bob", "Carol", "David", "Eve"] for name in names: print_greeting(name) print_greetings() ## ¡Hola, Alice! ## ¡Hola, Bob! ## ¡Hola, Carol! ## ¡Hola, David! ## ¡Hola, Eve! Much easier. 4.7 Example Four: Keeping Code Alive During software development, code is often changing rapidly. It’s common to end up with functions or variables you don’t need anymore. It’s best practice to remove “dead” code from your codebase: it’s distracting and can make maintenance more challenging. Programmers should resist the urge to hang on to unused code in the expectation that they might need it one day. Version control, such as provided by git and GitHub, let you keep a record of old code without cluttering your final version. Let’s take a look at some Python code with some dead code: def default_values(): a = 5 b = 6 return a, b def calculate_sum(a, b): result = a + b return result def calculate_product(x, y): return x * y def simulate_data(): a, b = default_values() dat = calculate_sum(a, b) + calculate_sum(a, b) return dat def main(): a = 5 b = 6 a, b = default_values() sum_result = calculate_sum(a, b) print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 Some of these functions aren’t used in the final step, typically defined in python as the main() function. Let’s ask AI to remove them. I need help with eliminating unused functions in my Python script. Sure! Here’s a refactored version: def default_values(): a = 5 b = 6 return a, b def calculate_sum(a, b): result = a + b return result def main(): a = 5 b = 6 a, b = default_values() sum_result = calculate_sum(a, b) print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 Great! Now our code is much more manageable. This code only includes the necessary functions needed to run the main() function. We can go a step further! Can you help me refactor my python code to make it more concise? Certainly! Here’s a more concise version of your code: def calculate_sum(a=5, b=6): return a + b def main(): sum_result = calculate_sum() print("Sum:", sum_result) if __name__ == '__main__': main() ## Sum: 11 In this version, the calculate_sum function is simplified to take default arguments for a and b. This means the default_values function is no longer necessary. The a and b variables are also removed from main, as they are no longer needed. Much better and easier to look at overall. 4.8 Example Five: Making Code Readable Usually, our first goal as programmers is to get the response we need from the code. Readability might be the last thing on our minds. Luckily, AI can help with this. Let’s imagine we whipped up this code pretty quickly. It is tough to read, and it could definitely be improved. for(term in c("good","bad","ugly")){ print(c(rep(term,3),paste("really",stringr::str_to_upper(term)))) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" Let’s see if AI can do better. Can you help me clean up this R code so it is more readable? Sure! Here’s a more readable version of the code: library(stringr) for(term in c("good", "bad", "ugly")) { print(c(rep(term, 3), paste("really", str_to_upper(term)))) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" I added whitespace around operators and after commas for better readability. I also loaded the stringr package explicitly using library() to make the code more self-contained. This is a good start, but not much has changed. Let’s try again. On ChatGPT, we can click “Regenerate Response”. Here’s a cleaned-up version of the R code that is more readable: library(stringr) terms <- c("good", "bad", "ugly") for (term in terms) { rep_term <- rep(term, 3) upper_term <- str_to_upper(term) really_upper_term <- paste("really", upper_term) result <- c(rep_term, really_upper_term) print(result) } ## [1] "good" "good" "good" "really GOOD" ## [1] "bad" "bad" "bad" "really BAD" ## [1] "ugly" "ugly" "ugly" "really UGLY" I’ve stored the repeated term and the uppercased term in separate variables to make the code more readable. I’ve also separated the construction of the “really” phrase from the uppercased term to make it clearer what’s happening. Finally, I’ve used whitespace and indentation to make the structure of the code more apparent. Better! While the code takes up a greater number of lines, it’s easier to interpret because only one action is being taken on each step. 4.9 Example Six: Keep it Brief As we learned above, following the DRY principle and removing dead code can make your code easier to interpret, maintain, and debug. However, sometimes the issue is the functions themselves. No one has perfect knowledge of everything in their programming language. AI can help us determine if there are any more efficient sets of functions that do the same thing. Here is some code that plays with the “CO2” dataset in R: library(datasets) for (type in unique(CO2$Type)) { dat_subset <- CO2[CO2$Type == type, ] for (plant in unique(dat_subset$Plant)) { dat_subset_2 <- dat_subset[dat_subset$Plant == plant, ] print(paste(dat_subset_2$Plant[1], round(mean(dat_subset_2$uptake), 1))) } } ## [1] "Qn1 33.2" ## [1] "Qn2 35.2" ## [1] "Qn3 37.6" ## [1] "Qc1 30" ## [1] "Qc2 32.7" ## [1] "Qc3 32.6" ## [1] "Mn1 26.4" ## [1] "Mn2 27.3" ## [1] "Mn3 24.1" ## [1] "Mc1 18" ## [1] "Mc2 12.1" ## [1] "Mc3 17.3" Let’s see if AI has any ideas for making it more concise. Can you make this code more concise? Here’s a more concise version using dplyr package in R: library(dplyr) CO2 %>% group_by(Type, Plant) %>% summarize(mean_uptake = mean(uptake)) ## # A tibble: 12 × 3 ## # Groups: Type [2] ## Type Plant mean_uptake ## <fct> <ord> <dbl> ## 1 Quebec Qn1 33.2 ## 2 Quebec Qn2 35.2 ## 3 Quebec Qn3 37.6 ## 4 Quebec Qc1 30.0 ## 5 Quebec Qc3 32.6 ## 6 Quebec Qc2 32.7 ## 7 Mississippi Mn3 24.1 ## 8 Mississippi Mn2 27.3 ## 9 Mississippi Mn1 26.4 ## 10 Mississippi Mc2 12.1 ## 11 Mississippi Mc3 17.3 ## 12 Mississippi Mc1 18 This code groups the CO2 dataset by Type and Plant, calculates the mean uptake for each group using summarize, and then prints the resulting data frame. The code is shorter and more concise because it uses the dplyr package, which has built-in functions for data manipulation and summarization. Refactoring the code to be more concise using dplyr makes it easier to read and understand the steps involved in the data manipulation. It also reduces the number of nested loops and intermediate variables, making the code more efficient and reducing the chance of errors. Ultimately, it is your job as a programmer to use your best judgment on the fine balance between brevity and readability, as the best solution is not always this obvious. Remember that you can regenerate the AI’s response if you want more options. 4.10 Code optimization Sometimes time and efficiency is of the essence. Loops can be slow and time consuming in many languages. Take for example the following R code that calculates the cross product between two vectors x and y using nested for loops: set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) z <- numeric(n) # Start timer start_time <- proc.time() for(i in 1:n) { for(j in 1:n) { z[i] <- z[i] + x[i]*y[j] } } # End timer proc.time() - start_time ## user system elapsed ## 231.734 0.076 231.807 What is a faster, more optimized way of running the following R code? set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) # Start timer start_time <- proc.time() z <- outer(x, y, "*") z <- rowSums(z) # End timer proc.time() - start_time ## user system elapsed ## 0.770 0.263 0.878 The outer() function performs the same calculation as the nested loop in the original code, but more efficiently. It returns a matrix of all possible combinations of x and y values, with each element of the matrix being the product of the corresponding x and y values. The rowSums() function is then used to sum the elements of each row of the matrix, which is equivalent to summing the products of x and y for each index i in the original loop. This method avoids the need for the nested loop, resulting in a faster and more efficient computation. So much faster! We can look at another option by regenerating the response: set.seed(123) n <- 10000 x <- rnorm(n) y <- rnorm(n) z <- numeric(n) # Start timer start_time <- proc.time() z <- x %*% t(y) # End timer proc.time() - start_time ## user system elapsed ## 0.336 0.236 0.353 One optimized way to perform the same calculation is by using the %*% operator to perform matrix multiplication. This can be done by converting x and y to matrices and transposing one of them so that their dimensions align for matrix multiplication. This code should be much faster than the original implementation because it takes advantage of highly optimized matrix multiplication algorithms in R. While this second suggestion is faster, you will need to consider what aspects of the codebase are most important in each instance. For example, this code runs more quickly, but the %*% operator might be unfamiliar to some R programmers. In cases where efficiency is less important, or the data are not large, you might consider maximizing readability. 4.11 Challenges and Limitations Like humans, AI can make mistakes. Be sure to keep the following in mind as you use AI to refactor your code. 4.11.1 Complexity Refactoring is often a complex process that requires deep understanding of the code and its context. AI may not always be able to fully understand the complexity of the code and may struggle to identify the best refactoring strategy. Use a modular approach whenever possible. 4.11.2 Limited Data AI models require large amounts of data to learn from, but in the case of code refactoring, there is often limited data available. This can make it difficult for AI models to generalize to new code bases and situations, especially if you are using a more niche programming language. 4.11.3 Quality Control Automated refactoring tools that use AI may not always produce code that is of the same quality as code produced by human developers. It can be difficult to always ensure that the refactored code is maintainable, efficient, and free of bugs. You need to use your best judgment when copying and pasting AI-produced code into your codebase. You should always include unit tests in your code. Tests can help you catch bugs, including those introduced accidentally by AI. Because AI models are created by humans, they can be biased. This means they may not always identify your preferred refactorings or may prioritize certain types of refactorings over others. In some cases, this can lead to suboptimal code quality and may create technical debt over time. 4.11.4 Security When using AI to refactor code, the code itself is often sent to an external service or platform for analysis and transformation. This can raise concerns about the security of the code, especially if it contains sensitive information such as trade secrets, proprietary algorithms, or personal data. If your code is sensitive, it’s important to carefully vet any third-party AI tools or services used in the refactoring process. 4.12 Hands-On Exercise Now it’s your turn to try. 4.12.1 The Code Let’s say you are dusting off some code from your past (no judgment here). You were investigating tweets about Mr. Trash Wheel, a beloved Baltimore-based contraption that filters trash out of the waterways. Note: This code is just an example and was written strictly for educational purposes. import tweepy import pandas # Enter your API keys and access tokens here consumer_key = 'your_consumer_key' consumer_secret = "your_consumer_secret" access_token = 'your_access_token' access_token_secret = 'your_access_token_secret' # Authenticate with Twitter API auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q="Mr. Trash Wheel", tweet_mode='extended').items(100) # Create empty list to store tweet data date_data = [] location_data = [] text_data = [] def get_tweet_length(tweet): # Return the length of the tweet text return len(tweet.full_text) # Loop through each tweet and extract desired data for tweet in tweets: date_info = { 'date': tweet.created_at } date_data.append(date_info) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q="Mr. Trash Wheel", tweet_mode='extended').items(100) # Loop through each tweet and extract desired data for tweet in tweets: location_info = { 'location': tweet.user.location } location_data.append(location_info) # Search for tweets containing the search term tweets = tweepy.Cursor(tweepy.API(auth).search_tweets, q='Mr. Trash Wheel', tweet_mode='extended').items(100) # Loop through each tweet and extract desired data for tweet in tweets: text_info = { 'text': tweet.full_text } text_data.append(text_info) # Combine lists into a dictionary data = {'date': date_data, 'location': location_data, 'text': text_data} # Store results in pandas dataframe df = pandas.DataFrame(data) # Print dataframe print(df) 4.12.2 Questions Create an AI prompt that fixes any formatting issues with the code that would cause it not to run. Devise an AI prompt that removes any dead code from your sample above. What gets removed? Create a prompt that makes the code less repetitive, adhering to the DRY principle. What aspect of the code was repetitive? Construct a prompt that makes the code more concise. What are some trade-offs that appear in this code between readability and brevity? 4.13 Summary Code refactoring is the process of improving code quality without changing its functionality. It is crucial in software development to maintain a manageable and adaptable codebase. Code refactoring reduces technical debt, improves code stability, and makes it easier to maintain. Examples of using AI for code refactoring include correcting syntax, adhering to styling and convention, visual styling, avoiding repetition, removing dead code, and improving both readability and speed of execution (optimization). The use of AI for code refactoring raises ethical concerns and is not perfect. It is important for the developer to consider security needs of their code, as well as test out their code. "],["annotating-your-code.html", "Chapter 5 Annotating Your Code 5.1 Learning Objectives 5.2 Annotating Code is Good Practice 5.3 Improves readability 5.4 Improves maintainability 5.5 Improves the quality 5.6 Examples of quality aiding comments 5.7 AI in Code Annotation 5.8 Ethics of using AI to annotate code 5.9 Examples on using AI for annotation 5.10 Summary", " Chapter 5 Annotating Your Code 5.1 Learning Objectives Explain the significance and benefits of code annotation and how it aids in understanding and working with code in the future. Demonstrate the ability to apply effective code annotation practices by providing clear and concise comments in code. Recognize the impact of code annotation on code maintainability. Explain how well-annotated code can facilitate collaboration among developers and ensure code consistency. Critically evaluate the use of AI in code annotation, including benefits, ethical considerations, and limitations. Explore how AI can be used to create README files, do line-by-line annotations, and offer potential code improvements. 5.2 Annotating Code is Good Practice Code annotation, also known as code commenting, is the process of adding explanatory notes to source code. These notes are used to provide context, clarify functionality, and aid in understanding for developers who may be working on the codebase in the future. Code annotation is an important practice for any developer looking to write clear, efficient, and maintainable code. There are many benefits to annotating code: Improves readability Improves maintainability Improves quality 5.3 Improves readability First, it can help to improve the readability of code. By adding comments, developers can explain the purpose of each section of code, which can make it easier for others to understand what the code is doing. This can be especially helpful for large or complex codebases, where it can be difficult to keep track of all the different components. This is particularly important in contexts where the original developer of a project may move on to something else and others are left to work on them. Annotation perhaps most often helps a developer remember things they knew about the code when they were originally writing it (annotation is helpful for future you!) If the original developer left well-annotated code, it can drastically improve the ability of others (and their future selves) to continue with the project. 5.3.1 Examples of readability aiding comments Comments that help readability clarify what the code is doing Function explanations: A comment at the beginning of a function or method can describe its purpose, parameters, and expected return values. This makes it easier for others to understand what the function does and how to use it. # This function calculates and returns the sum of two numbers (x and y) def add_numbers(x, y): return x + y Inline explanations: Use inline comments to explain what a specific line or block of code does. This can help someone reading your code to quickly understand what’s going on. # Loop through each item in the list for item in my_list: # Check if the item is greater than 10 if item > 10: # Print the item print(item) TODO comments: Use TODO comments to mark areas of your code that need further work or improvement. This can help you or others to remember to come back to a specific part of the code. # TODO: Implement error handling for this function def my_function(): pass Parameter descriptions: If a function or method has complex parameters, it can be helpful to add comments explaining what each parameter does. def my_function(parameter1, parameter2): """ Calculate the sum of two numbers. Parameters: parameter1 (int): The first number to be added. parameter2 (int): The second number to be added. Returns: int: The sum of parameter1 and parameter2. """ return parameter1 + parameter2 Code block summary explanations: If you have a long or complex code block, you can add a comment to explain what the block is doing. # This code block creates a dictionary containing the counts of each word in a list of text strings word_counts = {} for text in text_list: for word in text.split(): if word not in word_counts: word_counts[word] = 0 word_counts[word] += 1 5.4 Improves maintainability Code annotation can help to improve the maintainability of code. By adding comments, developers can explain the reasoning behind certain decisions, which can make it easier for others to make changes to the code without breaking it. This can be especially helpful when multiple developers are working on the same codebase, as it can help to prevent conflicts and ensure that the code is always in a consistent state. 5.4.1 Examples of maintainability aiding comments Comments that help maintainability explain the historical context of why code was made the way it was Examples of maintainability aiding comments Design decisions: If there were specific design decisions made when creating the code, you can add comments explaining why certain choices were made. bash # We chose to use a linked list data structure for this function to reduce the time complexity of inserting and deleting elements. Legacy code: Sometimes, code may have been written in a certain way due to constraints or limitations at the time it was created. Adding comments to explain this can help others understand why the code is the way it is. # This code was written before Python 3, which introduced the `yield from` syntax. Therefore, we used a `for` loop to iterate over the nested list. Performance optimizations: If certain performance optimizations were made to the code, you can add comments explaining why they were necessary. bash # We used memoization to improve the time complexity of this recursive function, as it was taking too long to execute for larger inputs. Compatibility considerations: If the code was written with compatibility considerations in mind, you can add comments explaining why certain choices were made. # We used the `os.path` module to ensure that this code will work on both Windows and Unix-based systems, as the path separators are different on each platform. Limitations: If there are limitations or edge cases that the code cannot handle, you can add comments to explain this to others. # Note that this function assumes that the input array is sorted in ascending order. If the array is unsorted, the results may be incorrect. 5.5 Improves the quality Code annotation can help to improve the quality of code. By adding comments, developers can identify potential issues or edge cases, which can help to prevent these issues from occurring in the first place. This can be especially helpful when testing code, as it can help to ensure that the code is working as expected. 5.6 Examples of quality aiding comments Comments that help improve the quality of the code by explaining to others how to use it or help improve it Error handling: Adding comments to explain how and why error handling is being implemented can help ensure that your code is robust and able to handle unexpected inputs or errors. This helps others know how the code was intended to be used. # If the input argument is not a list or is empty, raise a ValueError if not isinstance(input_list, list) or len(input_list) == 0: raise ValueError("Input must be a list that is not empty") Complexity: If your code has particular complexities, adding comments that explain it can help others understand the performance characteristics of your code. It may help others identify whether there is a simpler way to write the code. By adding a comment that expresses uncertainty about the code and asking for suggestions, the author can potentially receive feedback from others on how to improve the code. # This block of code could probably be simplified, but I'm not sure how. new_list = [] for i in old_list: if i > 0: new_list.append(i) Constants and variables: Adding comments to explain the purpose of constants and variables can make your code easier to use. It not only notifies others of the variables existence but lets them know if they need to change the parameters for their own purposes. # This constant represents the maximum allowed number of retries when attempting to connect to the server. MAX_RETRIES = 3 # This variable tracks the number of failed attempts to connect to the server. num_retries = 0 Code organization or disorganization: Adding comments to explain the organization and structure of your code can make it easier for others to navigate and may bring out a better organizational strategy for your code. # Define helper functions for data processing def preprocess_data(input_data): # Implementation details def analyze_data(processed_data): # Implementation details def visualize_data(analyzed_data): # Implementation details # Load data from file input_data = load_data("input.txt") # Preprocess data processed_data = preprocess_data(input_data) # Analyze data analyzed_data = analyze_data(processed_data) # Visualize data visualize_data(analyzed_data) Assumptions and constraints: Adding comments to explain the assumptions and constraints of your code can help others understand its limitations and potential pitfalls. # This function assumes that all input values are positive integers. Negative or non-integer inputs may result in unexpected behavior. 5.7 AI in Code Annotation We’ve discussed why code annotation and documentation are important, but when and why would you use AI for code annotation? AI can be a nice tool to supplement the annotation of your code. It should not be the only source of annotation for your code, because as the code author, you need to verify that what AI has annotated is consistent with your knowledge and history of development of the code. But using AI to annotate your code can be useful to supplement existing code annotations or to annotate old code that was poorly annotated either by yourself or others who are no longer working on the project. Here are some of the benefits of using AI for code annotation: Speed and efficiency: AI algorithms can analyze code much faster than humans, which means they can quickly generate comments and annotations for large codebases. This can save developers significant time and effort, allowing them to focus on other aspects of the development process. Consistency: Unlike humans, AI is not affected by personal biases or preferences, so it can provide consistent annotations across different code files and projects. A human may underestimate places in the code that should have annotation, whereas an AI might be more consistent at putting annotation in these places. This can help ensure that all code in a project is well-documented and easy to understand. Objectivity: AI can analyze code objectively and identify potential issues that may have been missed by humans. This can lead to better quality code that is easier to maintain and less prone to errors. Learning: AI models can learn from large datasets of annotated code and improve their ability to generate comments and annotations over time. This means that the more code the AI model analyzes, the more accurate and effective it becomes at annotating code. Specificity: AI models can be trained on specific programming languages, frameworks, or libraries, allowing them to generate language-specific comments and annotations that are tailored to the needs of the project. This can be particularly helpful for large, complex projects that require specialized knowledge or expertise. 5.8 Ethics of using AI to annotate code However, there are also a number of potential ethical concerns associated with using AI to annotate code. For example, we don’t yet know how and in what ways AI models may be biased. Additionally, AI models may be opaque, which could make it difficult to understand why they made certain annotations. Finally, because AI models are not humans and don’t necessarily tell the stories behind the code, they may be used to generate annotations that are not accurate, helpful, or do not tell the full depth of the history of what occurred with the code, which could lead to problems. Given these potential benefits and concerns, it is important for users of AI to always realize that they are ultimately accountable for the annotation that an AI model makes, and careful review of this annotation is needed. There are a number of ethical considerations to take into account when using AI to annotate code. Here are a few of the most important considerations: Accountability: First and foremost, a user of AI is always primarily accountable for any output that they use from an AI model. AI models can give you annotation to start with, but it is up to you as the user to verify and review this output carefully. The user of the AI model is ultimately responsible for keeping or throwing out the annotations the AI makes and thus is responsible for using errors that the model makes. Much like a user of a Google Search engine is responsible for which results they use, a user of AI is responsible what output from the AI model they use. Transparency: It is important to be transparent about the use of AI in code annotation. This means disclosing the fact that AI is being used, as well as the specific AI model and dataset that is being used. This should be stated on every file where annotation has been made using AI. This transparency allows others who view the code to be able more fully interpret the AI-created annotation that accompanies the code. Bias: AI models are trained on data, and this data can introduce bias into the model. It is important to be aware of the potential for bias and to take steps to mitigate it. This can be done by using a diverse dataset, by carefully selecting the features that are used to train the model, and by using techniques such as adversarial training. It is important to provide annotations that indicate any known biases, possible limitations associated with bias, and any strategies that were used to mitigate bias. Explainability: It is important to be able to explain the decisions that an AI model makes. This is especially important in the case of code annotation, where the decisions made by the AI model can have a significant impact on the quality of the code. There are a number of techniques that can be used to explain the decisions of an AI model, such as visualization and rule extraction. You can (and should) ask a chatbot to explain its sources and rationale for output that it gave. (Be aware that actual citations it gives may or may not be accurate, and you need to verify the accuracy of those citations by doing your own follow up literature search). 5.9 Examples on using AI for annotation 5.9.1 Ask for a README summary To try out some annotation with code examples, this author dug up some old code that she had no idea about what it did anymore because time had passed and she didn’t document it very well. First, I wanted ChatGPT to make a README for me. README’s are a standard file that explain what the code base does and provides a summary of what is happening in the set. I asked ChatGPT if it could: Create a README for this code and then I pasted the old code. ChatGPT gave me some output that generally looked like a README: This README seems accurate given the work I was doing at the time. But obviously the title isn’t great – it doesn’t describe the code well. Plus there’s not really information about usage or outputs of the code. So I asked it: Can you make this README more succinct and with sections about how you would use this code? This yielded a much better result. 5.9.2 Ask for line by line annotation Second, I wanted to have ChatGPT annotate code line by line. So I asked it Can you annotate some R code for me? It not only provided helpful annotations but it fixed spacing and added more spaces between lines of code: It does however, think the code is Python apparently if we look in the upper left corner. But this doesn’t seem to have affected its accuracy in its annotations. 5.9.3 Ask for how the code could be improved This code is old, and I don’t think it runs properly and is in no way reproducible. So I wanted to see what ChatGPT would recommend for improvements to the code. I said How could I make this code better? It had a lot of great advice: First and foremost it told me my variable names are not consistent and also not descriptive. Which is completely accurate! There’s variable names like xx and ll which don’t tell the reader anything about the variable. 5.9.4 Style the code Next, I asked chatGPT if it could restyle the code into tidyverse style. It definitely put elements that look like tidyverse however, it also put items in the code that I can tell by looking at it won’t work. So I tried to tell it about the errors: :::{.query} This code is close but there are some errors. These tidyverse functions don’t work with matrices. ::: and it told me: You are correct that the tidyverse functions are designed to work with data frames and not matrices. Here's a modified version of your code that converts the matrix to a data frame and uses tidyverse functions: The lesson here is that the output of chatGPT still needs to be vetted by the person asking for it. It is a great idea to continue to have AI’s work on something if it isn’t quite what you are asking for, however, at the end of the day it is you, the human, who has to vet the output. 5.9.5 Sometimes it has trouble with file types if given a URL Copying and pasting code appears to be the best way to go at this point in time. I asked chatGPT if it could annotate code in a Jupyter notebook at a URL I gave it: Can you annotate the code at this URL? https://github.com/jhudsl/reproducible-python-example/blob/main/make_heatmap.ipynb It responded with some of the code at that file where it was annotated but most of the notebook was not there. I told ChatGPT: That isn’t all the code at that url ChatGPT told me: You're right, I apologize. The code at the given URL is actually in a Jupyter Notebook format, so it's not easy to copy-paste here. However, I can suggest an alternative approach: you can use the website nbviewer (https://nbviewer.jupyter.org/) to view the notebook and its code. Here are the steps to do so: Go to https://nbviewer.jupyter.org/ Paste the URL of the notebook https://github.com/jhudsl/reproducible-python-example/blob/main/make_heatmap.ipynb into the "Enter the location of a Jupyter Notebook" field and press "Go". This will display the notebook and its code, and you can read through it and add your own annotations as needed. I hope this helps! This was a nice tool to recommend, however it still told me I should add my own annotations at the end of this. 5.10 Summary Code annotation is important for readability, maintainability, and overall quality of code AI can be a helpful tool for supplementing annotations or creating annotation for poorly annotated code. Ultimately the code author who uses AI as a tool for annotation is still responsible for verifying that the annotations are consistent with their knowledge of the code. devtools::session_info() ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## curl 4.3 2019-12-02 [1] RSPM (R 4.0.3) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## highr 0.8 2019-03-20 [1] RSPM (R 4.0.3) ## hms 0.5.3 2020-01-08 [1] RSPM (R 4.0.0) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## httr 1.4.2 2020-07-20 [1] RSPM (R 4.0.3) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.0.2) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## ottrpal 1.0.1 2023-03-28 [1] Github (jhudsl/ottrpal@151e412) ## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.3) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## readr 1.4.0 2020-10-05 [1] RSPM (R 4.0.2) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.0.2) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.3) ## vctrs 0.6.1 2023-03-22 [1] CRAN (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["understanding-unfamiliar-code.html", "Chapter 6 Understanding Unfamiliar Code 6.1 Learning Objectives 6.2 Reading Unfamiliar Code Is A Skill 6.3 AI in Reading Code 6.4 Example One: Summarizing Code You Didn’t Write 6.5 Example Two: Identifying a Coding Language 6.6 Example Three: Interpreting Regex 6.7 Example Four: Demystifying Functions 6.8 Hands-On Exercise 6.9 Summary", " Chapter 6 Understanding Unfamiliar Code 6.1 Learning Objectives Recognize the benefits, limitations, and assumptions in using AI to understand unfamiliar code Consider the ethical questions around using AI to understand another person’s code Practice using AI to summarize code, identify an unknown coding language, and interpret regex and unknown functions 6.2 Reading Unfamiliar Code Is A Skill As a programmer, you will frequently encounter situations where you need to read and understand code written by other developers. This could be because you are collaborating on a project, you have taken over maintenance of an existing codebase, or you are learning new syntax or skills that require reading example codes. Comprehending code written by someone else is a distinct skill from being able to write your own code, and it takes practice to become proficient at it. Reading unfamiliar code is like exploring an unfamiliar city without a map or a guide. Just like in a new city, you may not know where to start or how to navigate the codebase. You may encounter unfamiliar syntax, functions, and libraries that you have never seen before, just as you might encounter new streets, buildings, and landmarks. At first, you may feel disoriented and overwhelmed, and may need to spend some time getting oriented and familiarizing yourself with the environment. As you explore, you may start to see patterns and similarities, just as you might begin to recognize neighborhoods and landmarks in a new city. You may also encounter dead-ends, confusing intersections, and unexpected detours, just as you might encounter bugs and errors in the code. To make progress in this unfamiliar territory, you may need to rely on a combination of intuition, deduction, and experimentation. You may need to break down the code into smaller pieces, analyze the behavior of each piece, and gradually build up a mental model of how the code works. You may also need to consult documentation, online resources, or other experts who are familiar with the codebase, just as you might ask locals or consult a map in a new city. In the end, with patience, persistence, and a willingness to learn, you can successfully navigate the unfamiliar code and achieve your goals, just as you can successfully explore a new city and discover its hidden treasures. Learning how to read and understand code written by someone else is a valuable skill that can help you be a more effective programmer. By being able to read and comprehend unfamiliar code, you can contribute to projects more quickly, diagnose and fix bugs more effectively, and learn new programming techniques and best practices. As with any skill, the more you practice reading and understanding code written by others, the more comfortable and proficient you will become at it. 6.3 AI in Reading Code While anyone can learn to understand code written by someone else, using AI language models to achieve this has three significant advantages. Summarize large codebases. AI can quickly scan large codebases and give you a high-level overview of what they do. This can save you a lot of time and effort, especially when dealing with complex codebases. For example, AI can identify the main functions and classes in a codebase, and it can show you how they are related. Analyze the code. AI can look at the code and tell you about its structure, complexity, and potential defects quickly and efficiently. This can help you understand the code better and make it easier to maintain and improve. For example, AI can identify parts of the code that are difficult to understand or maintain, and it can suggest ways to improve the code. Understand comments and documentation. AI can read comments and documentation written by other developers. This can help you understand the code’s purpose and the assumptions and limitations of the codebase. For example, AI can identify the key assumptions that are made in the code, and it can explain the trade-offs that were made in the design of the code. Keep these ethical considerations in mind when using AI to summarize code. Who owns the code? If you are not the owner of the code, you should get permission from the owner before summarizing it. What is the purpose of the summary? If you are summarizing the code for educational or research purposes, it is likely ethical to do so. However, if you are summarizing the code for commercial purposes, you may need to get permission from the owner. Does the code contain any sensitive or personal information? If the code contains any sensitive or personal information, you should take special care to protect that information. 6.4 Example One: Summarizing Code You Didn’t Write Here’s some simple code using the R programming language, written by an unnamed programmer. If you are familiar with R, you might be able to understand what this code does with little effort. However, if you don’t know R, you’re relatively new to R, or you’re just having a bad day, understanding what this bit of code can take a great deal more energy and time. AI language bots can ease that burden. library(tidyverse) d <- ggplot2::diamonds d_sel <- d %>% select(carat, cut, color, clarity, depth, table, price) d_fil <- d_sel %>% filter(price > 5000) d_bin <- d_fil %>% mutate(carat_bins = cut_width(carat, width = 0.2)) d_summ <- d_bin %>% group_by(carat_bins, cut, color, clarity) %>% summarize(mean_price = mean(price), sd_price = sd(price)) We first ask Claude-instant (as implemented by Poe) to explain the purpose of this code. What does this code do? You can ask for Claude to summarize each step in detail as well. Can you explain what each step does in detail? Maybe you’ve never worked with the tidyverse package in R - Claude can tell you about it. What is the tidyverse package? You might also not be familiar with the diamonds dataset (especially if you’ve never used it before) and want some clarification on where the data are from. Can you tell me more about the diamonds dataset? 6.5 Example Two: Identifying a Coding Language Sometimes you might have to work with legacy code. Legacy code can be difficult to work with, especially if it is written in a language or style with which you are not familiar. There are more than 700 programming languages in use today, so it is impossible for any programmer to know them all. AI can be a helpful tool for identifying the language and version of legacy code, which can make your life just a little easier. Let’s look at example code that might have been written decades ago. program temperature_smog_analysis; uses Math; const n_temperatures = 1000; n_smog_measures = 500; type TemperatureArray = array[0..n_temperatures-1] of integer; SmogArray = array[0..n_smog_measures-1] of integer; var temperatures: TemperatureArray; smog_measures: SmogArray; combined_data: array of integer; slope, y_intercept: double; i, j: integer; function connect_to_database(filename: string): integer; begin { implementation of connect_to_database function } end; function retrieve_temperatures(fd: integer): integer; begin { implementation of retrieve_temperatures function } end; function retrieve_smog_measures(fd: integer): integer; begin { implementation of retrieve_smog_measures function } end; function retrieve_temperature(fd, index: integer): integer; begin { implementation of retrieve_temperature function } end; function retrieve_smog_measure(fd, index: integer): integer; begin { implementation of retrieve_smog_measure function } end; procedure close_database(fd: integer); begin { implementation of close_database function } end; We can ask Bard to take a guess at what the coding language might be. What language is this code written in? We can explore further to figure out what indicators tell Bard the language is Pascal. How do you know this is Pascal? It turns out there are multiple versions of Pascal. Since you will presumably need to work with this legacy code, you might want to know which version it is. What version of Pascal is this? 6.6 Example Three: Interpreting Regex Regex (short for Regular Expressions) is a powerful tool used to describe patterns in text. It’s a sequence of characters that define a search pattern. Regular expressions can be a powerful tool for data cleaning, text mining, and data validation. They are widely used in web development, data science, and other fields where text processing is important. They can also be tricky to understand at first because they involve a specific syntax that can be complex. We can use ChatGPT to explain regex in a bit of someone else’s code. x = sub("/d/e","/d",x) What does this do? 6.7 Example Four: Demystifying Functions Sometimes we get handed code that includes complex architecture. Perhaps you are working with code you wrote years ago when you really liked loops, but present you finds them difficult to parse. (Be nice to past you - maybe you were a baby programmer and didn’t know better.) Instead of giving yourself a headache, you could turn to ChatGPT to explain what your old code does. def my_function(x): result = x for i in range(10): for j in range(5): result = result + 2 * (i + 1) * (j + 1) * (i % 2 == 0 and j % 2 == 0) - 1 return result What does this function do? Well, now you have an idea what past-you might have been attempting to do with this code. You can also query AI about the potential problems from using the code as-written. What are some possible issues with this code? (And if you do ever run across an expression like this in your code, you can check out our chapter on refactoring code using AI to fix it!) 6.8 Hands-On Exercise Now it’s your turn to try. Let’s say you were handed this bit of code to work with (and eventually modify), but first you need to figure out what’s going on with it. Unfortunately, the original programmer left very little in the way of notes or annotation. 6.8.1 The Code Note: This code is just an example and was written strictly for educational purposes. use ode_solvers::{Euler, OdeMethod}; use plotters::prelude::*; use std::fs::File; const N: f64 = 1000000.0; const I0: f64 = 10.0; const R0: f64 = 0.0; const S0: f64 = N - I0 - R0; const BETA: f64 = 0.3; const GAMMA: f64 = 0.1; fn sir_model(t: f64, y: &[f64], v: f64) -> Vec<f64> { let s = y[0]; let i = y[1]; let r = y[2]; let dsdt = -BETA * s * i / N - v * s; let didt = BETA * s * i / N - GAMMA * i; let drdt = GAMMA * i + v * s; vec![dsdt, didt, drdt] } fn main() { let mut solver = Euler::new(sir_model); solver.set_initial_condition(&[S0, I0, R0]); let root = BitMapBackend::new("sir_vaccination.png", (800, 600)).into_drawing_area(); root.fill(&WHITE).unwrap(); let mut chart = ChartBuilder::on(&root) .caption("SIR model with vaccination", ("sans-serif", 40)) .set_label_area_size(LabelAreaPosition::Left, 60) .set_label_area_size(LabelAreaPosition::Bottom, 40) .build_cartesian_2d(0.0..100.0, 0.0..N) .unwrap(); let mut data1 = vec![]; for _ in 0..1000 { let y = solver.integrate(0.1, 0.0); data1.push((solver.time(), y[0], y[1], y[2])); } let vac_rate = 0.1; let vac_coverage = 0.5; let vac_num = vac_coverage * N; let mut data2 = vec![]; for i in 0..1000 { let t = i as f64 * 0.1; let v = if t >= 50.0 && t < 150.0 {vac_num * vac_rate} else {0.0}; let y = solver.integrate(0.1, v); data2.push((solver.time(), y[0], y[1], y[2])); } chart .configure_mesh() .x_labels(10) .y_labels(10) .disable_x_mesh() .disable_y_mesh() .draw() .unwrap(); chart .draw_series(LineSeries::new( data1.iter().map(|d| 6.8.2 Questions Write a query that identifies the features that can be used to determine the coding language, as well as the version of the language. What language and version is it written in? What features give away the coding language? Create a prompt that determines what this code does, as well as important features of the program. What does this code do? Write a prompt that determines the purpose of this specific code snippet: let root = BitMapBackend::new("sir_vaccination.png", (800, 600)).into_drawing_area(); What is the purpose of this line of code? 6.9 Summary Understanding code written by someone else can be made easier by using AI AI chatbots can summarize the code and the dataset used, as well as clarify functions and expressions that are confusing AI chatbots can also identify the coding language and version used in legacy code Be mindful of who owns the code and what the summary will be used for when using AI to summarize someone else’s code "],["about-the-authors.html", "About the Authors", " About the Authors These credits are based on our course contributors table guidelines.     Credits Names Pedagogy Lead Content Instructor Elizabeth Humphries (Writing Code, Understanding Unfamiliar Code) Content Authors Candace Savonen (Annotating Your Code), Carrie Wright (Ethics of Using AI), Ava Hoffman (Refactoring Code) Content Editor Reviewer Howard Baek Technical Template Publishing Engineers Candace Savonen, Carrie Wright, Ava Hoffman Publishing Maintenance Engineer Candace Savonen Technical Publishing Stylists Carrie Wright, Ava Hoffman, Candace Savonen Package Developers (ottrpal) Candace Savonen, John Muschelli, Carrie Wright Art and Design Figure Artists Candace Savonen, Carrie Wright, Ava Hoffman, Elizabeth Humphries Funding Funders CS, CW, and HB were supported by the National Cancer Institute (NCI) under Grant UE5CA254170. AMH and EMH were supported by the AnVIL Project through cooperative agreement awards from the National Human Genome Research Institute with cofunding from OD/ODSS to the Broad Institute (U24HG010262) and Johns Hopkins University (U24HG010263). Funding Staff Sandra Ormbrek, Shasta Nicholson   Tools Used: ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.0.2 (2020-06-22) ## os Ubuntu 20.04.5 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2023-07-12 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib source ## assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.5) ## bookdown 0.24 2023-03-28 [1] Github (rstudio/bookdown@88bc4ea) ## bslib 0.4.2 2022-12-16 [1] CRAN (R 4.0.2) ## cachem 1.0.7 2023-02-24 [1] CRAN (R 4.0.2) ## callr 3.5.0 2020-10-08 [1] RSPM (R 4.0.2) ## cli 3.6.1 2023-03-23 [1] CRAN (R 4.0.2) ## crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0) ## desc 1.2.0 2018-05-01 [1] RSPM (R 4.0.3) ## devtools 2.3.2 2020-09-18 [1] RSPM (R 4.0.3) ## digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0) ## ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.3) ## evaluate 0.20 2023-01-17 [1] CRAN (R 4.0.2) ## fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0) ## fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.0.2) ## fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.3) ## glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.5) ## hms 0.5.3 2020-01-08 [1] RSPM (R 4.0.0) ## htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.0.2) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.0.2) ## jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2) ## knitr 1.33 2023-03-28 [1] Github (yihui/knitr@a1052d1) ## lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.0.2) ## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.0.2) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.0.2) ## ottrpal 1.0.1 2023-03-28 [1] Github (jhudsl/ottrpal@151e412) ## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.0.2) ## pkgbuild 1.1.0 2020-07-13 [1] RSPM (R 4.0.2) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.3) ## pkgload 1.1.0 2020-05-29 [1] RSPM (R 4.0.3) ## prettyunits 1.1.1 2020-01-24 [1] RSPM (R 4.0.3) ## processx 3.4.4 2020-09-03 [1] RSPM (R 4.0.2) ## ps 1.4.0 2020-10-07 [1] RSPM (R 4.0.2) ## R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0) ## readr 1.4.0 2020-10-05 [1] RSPM (R 4.0.2) ## remotes 2.2.0 2020-07-21 [1] RSPM (R 4.0.3) ## rlang 1.1.0 2023-03-14 [1] CRAN (R 4.0.2) ## rmarkdown 2.10 2023-03-28 [1] Github (rstudio/rmarkdown@02d3c25) ## rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.0.2) ## sass 0.4.5 2023-01-24 [1] CRAN (R 4.0.2) ## sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.3) ## stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.3) ## stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.3) ## testthat 3.0.1 2023-03-28 [1] Github (R-lib/testthat@e99155a) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.0.2) ## usethis 1.6.3 2020-09-17 [1] RSPM (R 4.0.2) ## utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.3) ## vctrs 0.6.1 2023-03-22 [1] CRAN (R 4.0.2) ## withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2) ## xfun 0.26 2023-03-28 [1] Github (yihui/xfun@74c2a66) ## yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.3) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library "],["appendix.html", "Appendix Programming Languages AI and Cloud Computing", " Appendix Programming Languages Here are commonly used languages and their typical use cases. Python Known for its readability, simple syntax, and comprehensive add-on modules. It is often recommended as a beginner-friendly language. Python is used for scientific computing, data analysis, machine learning, and web development. Many Data Scientist roles rely on Python. Ruby Similar to Python, Ruby is also known for its readability and user-friendly syntax. It is typically used for web development, building dynamic websites, and creating web applications. JavaScript A popular language for web development, known for its versatility and ease of use. Many of the interactive features of websites rely on JavaScript. Java Java is widely used for enterprise applications, android mobile apps, and web apps. PHP PHP is easy to learn but can become complex as the application grows. It is typically used for building dynamic web pages, web applications, and content management systems. R Used for statistical computing, data analysis, and data visualization, R is a popular choice for researchers and data scientists. Some beginners find its syntax complex, especially due to differences in the two major dialects: “base” R versus the “tidyverse”. Kotlin Kotlin is a relatively new language that is designed to be more concise and expressive than Java. However, its advanced features and concepts may be challenging for beginners. It is used for developing Android mobile apps, web development, and server-side development. Swift Used for iOS and macOS app development, Swift is known for its strict syntax and steep learning curve. C# Often used for Windows desktop applications, web applications, and video games, C# can be challenging due to its more complex syntax and strict type system. C++ A powerful language often used for developing high-performance applications and operating systems, C++ can be challenging to learn due to its complexity and the need to manage memory manually. Julia Julia is designed for numerical and scientific computing, data analysis, and machine learning. It has a syntax that is easy to learn and read, making it an ideal choice for data scientists, engineers, and researchers. Julia code can also be compiled to native machine code using the Julia compiler. Because Julia is a relatively new language, it has fewer add-on libraries and resources available compared to more established languages. MATLAB MATLAB is a high-level programming language and development environment commonly used for numerical computation, data analysis, and visualization. It is widely used in engineering, physics, and finance, among other fields. It is generally considered to have a user-friendly syntax and is relatively easy to learn compared to other languages. MATLAB has a development environment called MATLAB Compiler that allows you to package MATLAB code into standalone executables or shared libraries for use on a wide variety of operating systems. Fortran Fortran has been around for decades and has a long history in scientific and engineering communities. It has a more challenging syntax and is considered harder to learn than some of the other languages on this list. It is primarily used for scientific and engineering applications that require numerical computations and simulations such as computational physics, weather forecasting, and computational chemistry. Rust Rust is a systems programming language that focuses on speed, reliability, and memory safety. It is commonly used for developing performance-critical software, such as operating systems, web browsers, and game engines. Rust’s syntax is similar to C++, but is often considered to have a steeper learning curve due to its focus on memory safety and ownership concepts. AI and Cloud Computing AI in cloud computing is an exciting and rapidly advancing field that combines artificial intelligence (AI) and cloud computing technologies. Cloud computing provides on-demand access to computing resources over the internet, such as storage, processing, and analytics, while AI uses algorithms and models to enable machines to perform tasks traditionally requiring human intelligence. Developers can easily incorporate AI into applications using cloud-based AI services. For example, Amazon Web Services (AWS), Microsoft Azure, and Google Cloud Platform offer AI services like speech recognition, image recognition, natural language processing, and machine learning. AI optimizes cloud resources and performance. It allocates resources based on workload demands, optimizes power usage, detects threats, and improves application latency by predicting user behavior and preloading content. However, integrating AI and cloud computing presents challenges around data, security, privacy, ethics, complexity, and management that must be addressed carefully. Large amounts of data are needed to train AI models, especially deep learning models requiring vast labeled data to identify patterns and predictions accurately. Storing and processing huge data can be expensive, impacting cost, scalability, and environment performance. Ensuring data security, privacy, and ethical use also require consideration. AI and cloud computing are complex with specialized skills and knowledge to use effectively. Integration increases complexity, challenging management and maintenance. Careful planning and execution evaluates benefits and limits of AI; selects appropriate models and algorithms; and determines integration into the cloud environment. Monitoring evaluates model performance, enabling adjustments to optimize performance and efficiency. As both AI and cloud computing technologies advance, the intelligent integration of the two can provide on-demand access to advanced AI capabilities, optimize resources, facilitate smarter applications, and gain data-driven business insights. Integration challenges around data, security, ethics, and complexity must be managed proactively through evaluation, planning, monitoring, and adjustments to maximize benefits and minimize limitations. When implemented responsibly, AI in cloud computing enables remarkable intelligent and scalable systems transforming organizations and society. "],["references.html", "References", " References "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] From 9910b226ddcfe5084e5d0184419fe6249b00ba87 Mon Sep 17 00:00:00 2001 From: jhudsl-robot Date: Wed, 12 Jul 2023 15:59:11 +0000 Subject: [PATCH 3/3] Render Leanpub --- .../resources/chapt_screen_images/index.png | Bin 90334 -> 89991 bytes .../chapt_screen_images/writing-code.png | Bin 109711 -> 88500 bytes resources/chapt_screen_images/index.png | Bin 90334 -> 89991 bytes .../chapt_screen_images/writing-code.png | Bin 109711 -> 88500 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/manuscript/resources/chapt_screen_images/index.png b/manuscript/resources/chapt_screen_images/index.png index d4a657c16ae90aad57b515f4de2a218aa941fa70..979986d7c3d2dd77ac5c83d91ec72afa97201b0d 100644 GIT binary patch literal 89991 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

l4A2gV57psW$AZze#}RbnD7QTFKKC8MVI_7# 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 literal 109711 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 diff --git a/resources/chapt_screen_images/index.png b/resources/chapt_screen_images/index.png index d4a657c16ae90aad57b515f4de2a218aa941fa70..979986d7c3d2dd77ac5c83d91ec72afa97201b0d 100644 GIT binary patch literal 89991 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

l4A2gV57psW$AZze#}RbnD7QTFKKC8MVI_7# zK7b{o3=M~I#OUkk1rwEIlvk!2>8_2G*^O(c1K*l7(LSp@4ap~#RT4`b&mzQyA%O zZ>YxEDEY*Y>KS=}DR$Vkjg3?56Xo2Van8Uwr;z0cS{F8Lx5;Me%C`%h1ur`rj7vW! zDe=Z-*cfN)THe|_aXKLT)8zrgZwp+!Sf2!G0cl0<3BdZPxSBh!Uw_)ZFd->vI;$cg zJX}7#EbL;y+L_-vG-%siB!2Z`E07|kR)-or_o%Yo7O_K5!~3#U#GPm;&~Y4B(Y&<|%@Xm*(zflH+DV=`g4d6P6gG?qGF)?r)iCOQ16;}FrEFtp z2y(H2Q};Rb((>{W{7$dgd1zu*d+3n?KUvm}Tf|B!zIH8vsv=evO4BvtS{^WIfn%t9 zAEQ$R-&+6o_- zmb&*hmRFK2WSHnZoRg5;_Z)7b8F!eF=R+c~a7M8NBoq_km&U#jD=IYUHZ1uJ6O0aZ zDgQ@?Xw^P^=tv@I6NNc_BKJ!Cta=8R{w$Q$u#*L;vYjE7#}A3tdRExwMEd~}top$^ zss-_Kumt5|+vO%fho`#We1-jE=@qPnzgv9!c2d75R8irO^r@+~UdlyEHdVe(jWmtd zTOFY)gpp%lvShTE#mK%{I8I;w-n0d!e)pj_Iv zyEVQ{YdEHNQ@8XE%P3$ub}w<_7897b0OFi2`2UnsC`cSiY<*9g4cG)R{r7#owmo}k zXedh(BNo$+4d)ac;byyM_BxAQ$5ss)iV>eYG~%Fo8iA33Fap~fkEXfUFfPD*yHX9s z`|Y75r^BuHd-c+#Dh|tZ)8e-f`HkAp6`qPib+@V?;`v zOtv8K-KSZ#wa8@DmaK8kHE(Fo?O(LR9xqUbvnwsaB5uiE<4^A9T^HYQXL@sW&sVQn zb*1+CvuApg%pqEOpDO0$EYcY8>AY^ndi2-gD|vFgW(?xHDP2_YNtc06L%U=5bEaxpTeq zKjmD~K6wJFmIQx)vxf1z+uWh_jG$IZ4;BBhQKLuehZrUd(n$=j{vI&fct12`&#||> zn_CmB#|ivv`lTv8tG3BG$EI|9|J{vSP8?8Xz3xaKwp20ZiJQ4%X^VCnoe80RN z&n?Hzisk$DJs5eer^cC^7Zdfm$T+lay4`4IDmO5?)(*mY{h=ib7mBZipn=krV0m9T z>OV2GqRV7Kx{Mryh{?a*TZY@GbJ+_}fSANY=ba2Jh{_AAz;6mX+qCX7!=d3|;hN-p ztBDpNb=T7af4y>SG~cBn?yX$r=Nou&SNAaR1oPlLo37)@*dc_LcwP^aq3hZ z+^x!l5aKNZt=+%$zym{-Duy3Ja8 z%Tw02t{hhVa?I4ig9jB{Zd&tR_q4Loiyq$ajh><^opC*7&Dz!n+f?=aV;EzDc*b{P z<^NHnqBwrYWo%OX=zL}zIpQ#PZnDQht?Tn0^6cU#vEY2I{KoW`_1tV0N&7^!)MCm? z2!&bLg%`CWMB8a(7eqUnY-GgqIE{}?Hgy)7W{Xu9qJYeA-2F?kHws4*I2=gtXSyo1 zNlN=cm2g^r9yu1DFcdWvk6ZY+WGty!S&^UBNd1Bv>D0=Qd8~HzM!pw=H;B7kpT4QK z(&@+zp|yDReid##ii4#}!w)=fNvt0Zza4^+jB0B>Ll0>9pb-_{1_lJ&1DK%cbe;!_ zTdfR%^ZkejN~6jnpdPLs0<&sg-Eyj3F&|!L`BzX3$yvbM-D#g}&wB1LB(l@o!8+24 zN(@p}z;!4?5NSL#m#-rswjBK7*`|`(2hdrq5o#!g8>vbC82!M}|y>5xnW4y^}9K^u9KB-JOJ zD1-)f=iE={8oB^b)YZ=~vOz=G^ zVW#-RyTw>3E}GZKtaq+4N^?;oo(IiZ;}Gi*UFPA#5MNYRUmwcNM%VE%hlR{?K~my9 z)h#!Fu)@3Wvf5*BOOzEYT0+!L<47}(JwlMx!yN&x}I zzwU#?=|2;)sZ^ucwX|S`p(jjc0ruM3{>ej1g%(!T<8JL(Eo@0LUgtge@p4)0jx%RA zxJ24st!a37vbz7}7ro2gFY+4ibI8A2M^6yZdjClU7$@jKh+WhQKWu@u6;)$=?~kj?Ufko_+XqqxdO2NvvHmD@O&hbBU&~_a}36 zWl|Q9?pa`AAiCT{rKkXCF4Z<4e6;KX1C1iQxjV}bf)M_oIkepHz%+RP6rWqz<8*<= zJ4Xom7#c^h#6*xwX&i98&7L35g|X`~Nv-$o35Wl3%RD~sYWRCg!=p!rx4Qe`+F&;++iY?e)kAf^N;hG2Ws|R`cDy&=O zZSj2i72hB#1&;$UGmkbl1~&f12bZ1w2sQvtSdP}y?pOVB4FOm1hY$pga1y@$o9;*q1w_kGmzKg3`4H>Q4j2+Du{=vhgP$m|^ps0R$ zd%=Dq;}nYpqqb+O4^8b5!x5Nud$#M?KE*LZbRduZP3cN-fnJzB01p=JoGH^1#*NDU znDrJyT8E26Ks~V}So9aUxgS-zQl3c4yWbLLkDlbG6j>2@HNV`3y%Lb#J!-agxTu2Q zkHvs8MA`Yx@pT!0t`#Eu)R#uK$n_XO*p17Gu(G&7IEH`Y)50OH(u`OV9~*6jO15SFTsXLWwzA-;lAE}g4_BUwJvQ$*lzueINH2G|mf;9+9LdH3<`MQHa z7Tgmz93inO)H3WHt<^^x=N-pdNmk5c&1mDG)fu(@H)O0rtIgW^dd1PKEa92P8x8;6 zx{>6y^7E10R}-l9f~YhO?OWnHAThjYA&5m)|BUK~`3XxrE7S8TuYWVUf9cl#zA2hV z0ybLDT=}H)-NF(3JR05Xqq^UfhXvC^baJ$R#5<7ASQzalGRXmj1O7y-@IS;f56hQp zDM(3O^xz$nnL=c;6iqOXQ{59RC_4^70A9vBY3Ezg)g7RNHm?dSY3`gbw6>p~e{QMfX!_c^7 z7=g^9CYaGP5*8M1HnXH{?<#oU!gmE$l)-F-bLokNRvb?l?NBx!mKj<1uk91OOYgw5 zktP%TV_|U$18QZnFTE4dR+0z`9UClK6o4enwZL7L8(vwSdG*XCE5`!1C#bbh)L5{n z3gttWgJ_^;v>+=}9ul)LLOu#LT^ePg z+5}vVrgUo_5I6G)=FM1S74zGuNj7orI9Vz{<-~RjxAb664z9=1*6oY8+m`VQ;14p~ zm^020K`jXkfP4Mp-t=sQY)IK=@ean0oAFv>;iY=_xErDcB?gR8EPc4SLU{`O=9|pl zuD@K|N@LBugP*yqEA#Pw4KKbJej1sXCf5QUTXf^b?!4>M-34u|GKjc22f%|gFe+gXo`nToH&Sf5GK^e&(_y+th2O40tOML&$mx#|8~{w26pI3X~7Zl129(+^Fdpt z+K~`4S^g~rkj9n_YzLN2r3zuEZQV8a$G1ntgux$*y#qe3|n(rxXX53&{YU!Ph4iXH(lrPYDLKhQB0$)dirZWFp;`5H$+=M0b|AQeYT3c*g z+LA4rD=u8z(WDpi)cfO23WeeWXL}p3y=&c+lN9ZfwAX$%dex(=4g9;p*pyEgvOAVs0bl%(05GDRpQMP*0`QKm@7OquQmRHmrVgeWAl$WVq7DP<~T z$ebY|88g1e)%W@CcmMNSYwzFMd%dmI^HjJ$_kCU0d7j649LIUzY^2Y6zBK)Z5>;7Z zDm$ZaiCVMz!1cI^CM6AtQl`+54fPvb{QXn3lj8KVub(QlSuyd$S^|m)CwD$q8)-^ zstMXhUV9WA4C2nTY8vEWVP$0v{d31-iJ`G(b?mgJl<%_>N!$g2s&PuHsw-~Yx;0ks zL5Um=c<aAa6Fh%&8{VL6x0?K<3A>bH_-hs#gBlNp8=lCy8m<$hbW@WjH>qj5kM&(PDsX?VdMc1t?!^I3 ztqY$cLWSLo`v!vc&J@!HU$KR$8k%Z zqssk1{itZ+QTp7JchJS<#h1=(g)QIsOn2RB64Xg%@bK{P9Iw;Obsb)B+mcI1a~tbp zeN|A9;XF|9IIyg-q-3$m&GlhHj0_CL*kk*NpC|S7^-a3VLutR&I0M)1UY(?y7XGQo zW70NJrXV1IQSihw?H^8!U%&RTee!0NJpYwq2@em?{AlXw`6_w(^<$NrW))fI8*881 z-2MG0*6Su+_3ol3KHBOvYs?oKh74M&Q)~Ry-gUpf%^2CHT_w5^zXXl)a;^-uw?Eo7 zRP$J+{NqOntNrK8Sd`kIS1H_<@{GbQvVGk$zdP**Fxll}6VN8^b!BVKuri93>ST&8}VNer9%`c==c$otfN z3oEM|;-+Ps*(;AL7>_B}W8ntZOGa?pixkxEWU8Mp9J)4G4aShl65iBF}>U~Cap+L(Uk>aneP$!tG^SCmtU4Q7QE`mZg8LfYo^4!`>S zK`65$Fpw$oU7Z2S-X1m>Lc}bSuVV4$DJ34J$x9Ll_k-bE8Xh$_`pEzP?;LT87IbCa{)<7_GPQq z73W>(T@jgZ+Vu$cbZlo&cOTXFbaGSqb=FN|-aFjp#v8`HABw*iAB{MC`t$}w+~xK1 z?(M~w7t44}ONbg51}ZMht|^-R&1muIe%z?%4!^`Gv1wHcOKR_DZx=Sh_;Yp7WE)%$ z9Prs^CHNG_A(MVB-5u-2eh2VNJGXb^B3m1qAoGgw_x@TIXU~>2H#bv{=x@iy#%}Q0 zagyHf<@K|Nc@7E%yYzgitUQ+RHM7v`3&)_=cDAP{lETkFbcwF$c_NU?!^WoFx5wMt zJF^3eAO0+DBr}$GX_`jNB4j|FzS$<_&mtls(E-zKO%0W!EL#fP#|1q-JvaCi-`=Jk zX#2f|CEmSI!lp?(A^74E>PX=Esme&X%nt9l>GyuwX#o`xVm#jt8Gio|=B)oy(Y}4} z4R@0bB+x&*i*9V+>&ADR!^9 zvfPTukdO`5!pXuryK(+Xdpx(G2AlY5N zx9jYOo|*9m;|zzcgPXT)Q|qez{Mli&=ja~q+1xKP8f-`DXPdIEWxs9s-qT}(yO3RJ zD`J?dVRxsoWzU{HW+n3OW7P&fbxn&e(Pie(1P2Gp^6meyf3)Y5c}Yx6Ozy?et(Rs8 zid#}ldwY61Z>uYWa&uF!Jpb(UTgB^tQ*oa2LT_bhOWuW%_uHb|KdUR2qFf>75?9xS z(jS@htSNlAVy#UPzJI-f=k}F3HqAN-o8Kbsntj_~VPRp?UmK@Y$C#}j)SP3-@siqQ z@i9bRNNNB64EqkH11c(NU763H;}~mprmnn!l zwmUjHvheZ-oqTQ)<1*OfHkjRT`s~?jA3q*>`|jN)Vc{e0{3wu0pW~034|x1)zkF=T zit?NJdHMOVT5+m}R8?zdu6TU^z&_Sjv-rh}7o0No8(e;V<+m=ks!u-I_a$)+qJ@Q> zJ??X4ZJ3a5b*wVQC}G>8H(c0S=*9E+V2~1ipT-$&Z$F(l^~~3IY3s#aUM8-c2hQdp zP>Vl*UV}t_rz~>M#nq{)sYvqK4MrtZiVI9MPO0;pxOlqN=dBFWksIc zXJi!hrSCynniv*yahR&_uV40&On-11?K`M9OC{`D*Ny+E+m&y<<0$izf0ZHay!{E z9N~?dHtnC-r`%PaVxS=y_S7IplpJDwv3z6U&GquN{q9G)8jLCB=N6yR-N%2d&JNP3 zui~KDJ3E&?+T^cTY@`}3R9GhU+3YvZA+vN{s z92V*5=%fQnm8svCSdM$xIXy*^sAhkd)FNB{BifbX0s_moQO6$cwYT5#rlchF{(XO> zPVJ`}bW&1MxB(-?e`7u zF)a&xJ^N>ru3P1)v`v#waq(Up*OL1BwL#pHS8m^414!tLI`$#9lU7~mdY!6cnW zilV|po|>7Nndx3LE(esA`DJCf4<9~!NL~FJr5bkyMfzNQ^73WNmN^a7ubi8i6mu9D zj?c7dmhxPfo3w1n6`vUTX7F>_^`}p_C+?F{R4g(X*umkPvgl7xSiiNI{qOGg49l0- zybMf95jhqqyM>2?gX7w#2hy8lWH@nqPqpG!=x15dojrRNPe#w@`D0nc~dv8WgPK16q$uJ~QKF)9U=n9f{QVrlt5{?pEs(j$U>4wx(xk%^h z6} z<`+j3x(|g3p0Mxv$kmwJ-A$Px5A$${867xsgegki!w)AvX5UqM%Z5~5_lci3hQ7U2 z--;7gyy2VviN)rxv$)j;^E;80a1_ux-nhGo}9QROV`$deojX^bh}jgiMvP zP@mZ2TT)w<$Lt*XYqunB`HjNFuCH5&Y{;qLnS0)FZhHJv=mAoZVt0^?O} z<+PEMMca!E6leRI+{ASwiR8t$CR|)xxlaA7huVt7c%tv#Wl&U9%(D7SpQ4{FnDB)) zESh!G!4248bV5kGZ{FTmQ=HsXD@b%XuSui`#FKJ5s098MMA73>-X?#^FQ zPaz$S&?8{zakL)KL~kRH$Aq|t-N*aN4DoCU^>XLN3=I3TO_qgpKou^hxmBz7S$I2@zgdC#)uuTBLEDl$V z{-hRW_>jOUv6WT#B^hsTJu3K)jcfSz)nzh{-3;^717fI?9sQpZ(9j=1aYX~SlBB;# zS?4R)t}T0}lk&`!7a7!TASDNYati^yeB9Eu=e6~Lll)v;FRF06T)0pIszvRE>DCE5 znaRJ&$8Y=5t*=b1q`iA9d4D$NFjKhScSy-3dEyh#R7J_7mhL-rhyl3uGP{t@Bee+8 zgK3I;_N+r=@(wvt^}(0byD$FUY+_>aYi_cwYkGX3c4`%`?CFW0jik;QUHl&Ac({3V z>#kkT%R71-pP#Ktck0(#C-2S%1_s3t08BaISfoaZzU1aD)RvB)jn5ev820YnOY`*d z61QoRaJzW%^_w?JFGQ`atw9`x$sTQbH+(Tzu&BKEFD+265f^kRLUwWLNaNY)*WbRK z;s$|LhRe`(pIwJe%f7FgUr(P~=ZF06-CP3=Y1g8o`M#WUKDp(yC1?WW<`*`a=ye;X zuxW3onwpG!Y4-e1O^mOe0YpXK< z5P%Al()GZu@G{^Fa5cJ&k#DYT{bp|}lmHPrdV2f-!M-*&b`(su3XR%u{y_V6cc=LZ zTKm@w)2F9izBoS};68*lgt~q`Q1kvr*Lw$w>5AXHS+v4eNvg86bSW14pqAEZTKh=X zJHnL(tQBF>@5RAFR9$9Pn4)28JZ%G7YZY;SSKFus-uLg{lQ#A6&N#pF_wO&q#cdJP zetNokwzai2bGq(A&&Qhgp4Ln}QcV2({DcIfwWDT!rCwd!6@T=BPPY`(+^;7EA8}qn zZ{50rMmol%bmxqbMV6#>J=^ZNi@X1Ie&V&87~B$h&RlSE^1*`>P#5+M=Vcr!SC^f1C z4a)2G*H;4!dp=3G-C1eZn7K4DF;Q9cc$_Nx)!N7EXf-M%N40&1x#@NhkH zZ|71x(Vb6xoSY04ezm-GWxmO$=m%2t*s)dT&!4YOKDldbpn(~LO85_6fYO1Wa@*z? zD{;9poaJ9=OgqX$H>GD}yaqVSxHxKY{%iU^sReKt)k(Tycs%ZgG~;*p@zYjT1k`>+ ze5V!7=SvJDfLYe96E>K~sVHf-D_Xgsh>FR-!gY%FYh>gyy1mM1#hc(YH*ehieaht|Iy*OKUcxKubSXRA zIkZAXM&=QyphL%w(T5n9ZrreehE74i=^nC07Z#mi6}9T1qvKBU*qP>POzZb>k`CiY zlFL;K?#jwa*-%UL)4-G+_~u-%87YEL(Ur#@eIUgt=OPTcZY;hRbR>}eyTRt1&^vd0 z0AOENR<1gFUt%BbSRAzCLq%#mh?`yDbNCHjPz&?4OSq>qGZTZ#QPhlx!Hd42C|$HY zgi1|ywzIQavSi7j&u2g0y^Q>~xZLi{Tuz&JNi;Qo1AL;Hg+(lWy01EBG2(C$*0(YL z_U+qXWOW|OxvpYfzvmJb@|kX0F!J)5x7S%YcbvY|YN|xCpZ3GrgT+FgR#$r7UT}15 z9~cm_rn1h@&;GGQPPkFe!OJV+vD>ch89R{o$tE-I?}(6GkI7VtmRM!Rv7v9xedCrp z-=UvH$5V{W)JQXuH!SqzlD2Do`~LPeakpQmwV!Dp)-S87Vn&~S;MywQ9e92cblK@eIaZzaEe{rW>{Y9(k?2$}pOA)y3o zX;=7X>wRgvU<7By#>gDIwlXlitbBYoeSDT+JvPe8@i6l#96$!$BQGBpUM#<7&m*lw zmes2_inQfjIP3J|%ksZ%A9x(jnwpy0v0Y~?+mSC19X(1Zqoz4txDcb2Xg@i0YRS^2 zXQqC2WCr#lIi|afn6wmla9q52@vf}1;KRsB)^+Owks%X9Gr@sA!V#s9yg6L7u-?kb zsun-~t)sJ3>!)LadUUwg>1T#{JEtcGg;owXK393>P1h~0V`*o16TQ(Ud3oN+;kI{p z=s0Se?NyYV%TES%b#>rugNd40hpsa4CXXbNL1I|eY&_rkiVNR;?eXJHWjFb5hJ>*A zT)WnVG@AbW`F@1dpN>-RT&&9>$^_E3gyL(%tfa5;}r%>biFy}C4eb1gC)k~baAbMl)j1I5I& zB*gfG*|&UW(sEy#UCn&odQJI)Wi4ou^KFHv{3jL{KiYTIY{vLYUQT*?vCr}~gvHq7 zF~LMbgk5>^WHSMRnSUyyEy|idIj#1QnoGI z2kk(&a7$Qjc)9f;6};}oO@-;F_nPp+@N?|BSvW{As@GG zOAwYGSCR$x0)&0i(O~4Ua2P& zf?p-fitS)l-N2^=JZuBG{p_7FI@>@_N?b{54zNO5)c7HgoLXstLH4=0(a`wzX-12d z%TzEgE%Fxo(#I*vht<@svM5QVI)48^FOqaB;bpFD`_dCnHTET}|AYNmX=K!eG<|!% z?aARai4sb$15;GvZmGs1SSwz9etuS6U^FF0TQKODiUX>RSwpaXN*Qzr%4`(R)`et5 z5c7E(n>Ytx!&^N9Zk0Te=QhtNqQwV?ve$g$g(wZmD zduH%S{-q84wT7IF8TGTzv0s{9TP0?gdkGXP(He6dzpt1WZo7$`b?BZ?gy!pwe`r`+ zA@g#^7u46e_ScIWJyEV|UMdWhrTPz~+CU%VlstDwVh_>8x=a`b=PN7n(|Tj;7rNiC zY0SD3bjxZoFXcwo+60LpUn@Rq(`I3WQ_y)CVd0NYzpsHJ<`}-4Pj+xn;1zZ?sgV0OGriqzl{2RAoL21FePIFAkD;;cBMvY`h1 zEpwjOn3`U7ZS!hq|9%vap*fJIn-+CmMoLQO$8_rH0>{1U1w{P8w*Ac&R{IqNEvpjJ zI4;FnN@qpfx@Gd^cT{A^fpA@l0mou`rV#Fe ziVxI>Hv|`YO*?ge|K0(m2Z`>%Pt)5I3PWEr79%B9zx4hj-!(KO%05{2@#9;F78%ev zzC1g@h~)bY(fA=-`QqQl&XCt-wYNc5&vdV#W=GzsMbb3{A3<31fD3H6mv&lWwl+>} z3b7DZ9)oHUe=O2JpK=~B!4t}s)-9yCPYwkw%nehuzmRNe;*av6`8b0w)=nX*sg2hL zm_o(`DPFNN9@!m1Aa4vEV5NR)`wK=v&KgOdiDd-X5X}EsF0F_Av*=bk|3DYbSFc`~ zrBp(%8NMrFwYu`*?yGO#9th--J|r$)W1yH*7;0+C5xoJv~-UTH> zSx=9%5d3uJSKhx5xjf8c$sW{u!2d4>OLBm5o@&Hgxs!)duB@XIp6okJJ-^1x*9mq@ zt4v9*WVFdTjom=l1@xL$Pcs^fHm}LZFP+b0M7$PwvTVOm+@Pl4px8q)VCCTvs<703 zro9}CNK(bPOMot?uM&U7C2N(>9G{?g~aYDg92n!LlY&%MwaEMbVoxxmY`NODC)ZDq&21!Y@o#{lnxWa~o#aG2w zNGZ|ptyjHxCaZb%_S71M(gu_G)Ro0m_*gxYfZpL>)kR8F%(a~`^h)22;{lZlH zRc5n$f2e^`Ka#B=Z5!-MGt8rQUb%X8{McvPpr)D{&1bzlXiLPz#Dq`fvw;)1m4AF% zdiRB%z~nRHM0-cIWbwgE|*OR7$@n7P!iVlN4SFn0)$>ny>eOT zIa~Qq+|r=Qc{E5w)K~*@vbpmZAJ}e`(EgO7)(lgXlkd3)4>pc*DSE&9BFPtGyyXlk zH<(oQCk{)K+=#}_%Jmq!JxK01#?)NgsL8|daMX3FLnUk1uDvT|b6>);!2$*@gYSc7{rX^tS_G`3mlLhY2LicpQrE(|K3QPwaV?UD`S@KR^7HnQ7lJ_C z<0n&T+YO{cN2Ijs#@)EOFi4C&J zIQ3v+1nuqJ)}c0_!c9q|yj)y2kY5I#sLxz2Mv``}Ke1y|+8lo%+2wML??%gBp<-UY zapN`Uf*XK>k5I4ClNO`sj`Y<~o2;TB%*29asda2h(YNN{J%&)$)@CCb13Ki2cs?#g>eX&pZf{1rr~1ERZCKcd^YYu89S^?EUSM4}1MF5OtOO*QCXV%<5 zm&8^nn&(90S<;q9?YX!J5FN7WtMUtJDG=ZFUb={^-{VG8Q&S__TD6y9`e{1wXHSkS zPz!Ty3ulnapmT2VVZp)J>*$!79FPr3dIQ8$)XBYA6jpY2U!1bV0H!g!ng23*Wr8+K zT9ocQQA}C{=Ittu$|lHaSX!c75GupQ=C2~xU%PbE!NBVG_6hOvodIHn#p44F9esV* zk?$Vsq)_^`W4Lg|#y(#wtZ0mLb;Xs8AZx1!JI*XZyR(TW0*;PIIoD38i`N4J_8&Y* zPkQTc5d+e|aPBm_?j-EPBIDG@;xg1i`g84MJyz2D19euXpV=?0pLOWP5ZKGt(5{ci zAE{{;%SD?7IxOLKKO{oR7;SjcE(#_ILfb(gTZ!(VpmGd4ZadN@k(`o^&jlfYyg^qD z0w&zNQ-Xfgy6b6$(<^W|#1}1I>>SU`xr2seBZ(sd1eNqz^28ZZ-a)u>OW5s0b|H6& zOiS3aZR$}QHf`A`9Yv4RiNxVHJ0-qz=g!ln zri)<)0|`K6dciEsH>7GMvLa6;pL~AsY$5o*b$i@c;B$cZMA$a~e42`i3b7R>^j*Y; zELyaPNW(t9zWfl`l^BS*$BlyLMclFbP~`RzJj`XA<`+a9MWVF)@|2Yb-BzFD&!GQP zj`Hv#D@@uMnCcAEz2}ft(=(YkPnH4amo|aMNIGO$Eq^bdLnD`W0sJ__wzsG4QWND)xOfsQ)d)&tuP$;B2ySf4*bw|&% zE5}1`tWV(qO@0b`qr3JSl*#_k-g0@H^lq2uG@qg4x3 z&Tp(ut(x2EET=*~Wo(b&q)zpXk7t0e372K$K@Cbqev}SrJADc_7T3X%9cB00WU49X zL$=lDvX=M!e?M#yoElCWFXU1S3YTV&Bo_9)K*C^FoZYYzjC-TuVWHz_V(;YF2;SvF zN!xAXRF)o@E!*F4i^n@Mvx!IW_~c_4@5(;b21_6ze~ByE7JCdA&>V-L3vBs>KFi(em> z{U>oy_TM_;*0TQ)XYTFz4@uGF|4NF>|Kq3re}60WZ>92o_Ok!wt5W}45B6WY11j`? zZE64G4xm;P{o?usRJ=b?`@{UhhYxpnPT40L=B>7}qO870zSZgn7YJs+a$=C!ChqRJ zn0dHXzxrVdiZ86xa30cS!mVHYSQuPtZx6 zhGF%4WFY0+JM!mza&LdD*vjLxtHSDJD>`NK;D!LJ2xjj}b#=8?LjOhGweOO1t>uuW zP=$d(QiPg%raXlI*XU>o zJZg+yH@sL0%IKq73tqm@>B6%@QF-7gSG5U*Ga(m227k@6T0{HRHNTTD`gbjmCu+&l z>i*Km$DQHQ2@j<0I;Tdu2((d{pX%D!J3cvit)M_2IEQ#IcEyEkZ$r1SiHVU~4kFu+iuRsfjU^Cm4_}(uT@TCt)Oly6Ivvm-k(1ML5OzzQ(>Lsi?##D znuQM{-^T#mSv1y<9*ooCNACu_=6m((;=hkZ;n_^=?3g_~W|R^*T!Z}$S|8#O=xC$` z`yQsdB2pc|6at;w=qG9NU{fvzOK1WX zl@FKe>gxWZvX)^Vool~iLvbu);S|5CNEM#v#l7l1w^&IEH?pxw^`m_R6ggg?F2r4g zyO{v37;qGQZAFSN&Np7+^PZxE))v+?^6M9|(`0zhxf4;w*4Fm!uCu{E-PnXhUBG8X zc23|B5`TJ+Zc^RXT!&3Kt2Noyx`cC=a~%@?E#nLT1XXuxdLXUi#}C1voUE(^Fqb0H z-+-H#dJP&S$M)MT5$p1iFYjt=SHmL?Si=Cedpvapu0&$&ZpZ0I%{T*#A&A5~@f4sQ zX?a*!ST4bbQVgclu3&sEkOR{(Qw@y}?VtUSiNe<3UwZRpVb^W&cp!F(x*{qn3T}IY zPO{!*NM}luC#e)2wT4R;_lVIuQWwqY;OY%m)ZxU)l^@rAYAkBRFFmhAltcHGqRHCv18>ez9Juw1K5Oij&4 zA;z_X*ZB4OckRolPX8u$*WfV`W2!|mEF^>myh@gr+@9n)HkaYnQ{4_CLl@IwB24`H z=MvrG9S{(e8k}Km+`M@+aZeMw-?3W~@MI)7R!{k2uS_|X|RPT4k z^uu~&o>Zd(!A}&>5A0>L6U}zDxw*MA_;U-D>#%t5NR{umm#!tqa9Di%f2r1VoD;LE z$BuCN_YPqbH_!hE|_=TP$PQ$Id1s;=SlWmk(Sct#B{}p@KJ|e`0teT+@$t#qC{Oh+hmt1Q5$M8&LHjqna9r zhpcV<4EMt+H#sw0#O&(o3Y21ki{;vPT#-1{=KKOOBk3=Qn2CqPKGOBARJ<9d(`VrEX<8awwu+?3wpYxt(Ikqdl42@V5|MivYvN*bpN zAIGa4iOF72t?BUDA_>IcaOk}_e@`<`3Wj~;W>Yc;f#s_c&?&HMQy^jqb_hq=e@w2O z>h0ZTaFc(S4gEgnE(<0wQGU1y)7DoPF>9e2+As9ObM3@@TuS;`Wrty|Ef>{izDF2W zL&@#GXZcehqQ@)$>D=;FtLi-w~ro_Ns_@{>l%Kz5jb-Onr;!0t*_en}hB5RQ~IN9o< z&cwN6uOaN3*nGtEMeRJ`#o${so62=vwAH08PZ;oZmSa_g$b$B z7h(qC-DQUc4bgfpYWH>2(B<*jR`q#MXh{LWzQs763y41MEN`l6+W{ z$krn>Wnj96m5WONHDZgxRQuw_?B|%`sezo@@%{T2s7w4XeUw695xk=s2Wk9;#7(7` zkWQh z0NmE3Adv%yxCv!ZB7$lLSV^k_wQylp$jX0pwOo*a*CE?o2MV|v#kg!0wT=aAY*H4; zRV%;Q=S)=^8kZaBa{{p3H;}yjiXP*pIhnPCeO*@n40*?YF>4}WzR603JKcj@tM@ts11ajQCbt`pnovhO# znccf@Ah6W>8}@LZHu7WcpcLgq8G-f|b8@Ai8_*G=?udV%C^E6b!;`7Z4xcu z&s2N2ZrytDNnG3w)CNWns8$9|llSo1(o2>l#|7VO*1sO}J$i+nc@l>9kz0U%8mb#2B?fB)6+9sy6BVBq(Oj*hl>bX*N-U^TXRBX~bTa*$n` znsVd!IWx=#-Xa1Gt_ei{jqt-mK)MdSNO$6AwNA?);h%GA4+_uv@(**B79?2lB|*(4 z=bn|5Q?JuYw139QVFsWmX)^yarE}k-Da3X2EwziY>2DXp)#&$#i)-SONT!%`hKU$l zB3FSZCKIHkb*C%J%UN)6OunX{$qXDt035&#l;ZMFz9ai6BjuOI?7xO6CK?KI0uH|D zr#1Kwi4!t5f^sg12J9^ks(Jsf@o|bBm}jGqkQzKUcz*tw4zf3AtD3Q|P`pi$YP8}dF}jKB5&(Gcp$CotyHenEMtMK%AL69kXw1vg zlVoDJZ^Fxhir z($Js_g2#|s$}D<*rfp#bKm`mDLZ2SLZ)cwuZWk%q5-9-4v24EoI1SDO3bcY zvMxcLk3jXtJusPV#7549pmgr5TFmb=1(&_AQp|RwuWmjH^h(F@uvpLx^}9l>6jmCi z9?8v%ZOilY3*56oJ+lL4-ZH0$#Z@mHMmOl5y$OtRYLGAcvAC@&+ zkA!@Cpw!*A1}$j#;7toX27Yjmcs3T5;B}#8gRKPy7kQI zOZ|)Q`1Lf#{0Xrw|5IH!8B{=}jf;14*Lq$OoSLot@ZlEk=$q8%m|R=V%*@=Fd!;J3 zv-POzEjqEI?u+UeYX)QBbS=LZ)2&h;FK3XwQwCHzRoW?{5`=t#1o4x-h09K5t+p*523IUzt!i zDP}Vr#qRg&EZbz1&M!S*KR{C5CM92Y#Nk&M|byTp0iM1VVr5lA&Pjx&du!)oizsScC9DY zN*OrJzN>5{nMFn`N9IY$sKKW$jPl@l7tzph`a$)UO+tqSjJS-eoAr<`v*dRi(~j1PoEP_GJ~1v@II5B`<8ht$^K-wwFv9 zJbzALLF20xzKc92e(r;x4r%!J{^s; z{{Wty02JW2LtDT9rhfl6t6P$soUD=OXl|AJ^a7Sj1iCagY@wk&i8?9VWD%k5(f%m^ zAP5^$67k-kEOG93+)R2CbdqE};k&&ZoFYDH_&SU0_bllKSr%dTBQ)LsE>z4UxervI z6Uvp}P!vfUTx*|QmBasTyR0n54PGRCE)_ZZ3>wYS_zw8Q^xz>OX2pT*{iCny$eoTQ zH$2(r5k*wcv02S@ULW!&-Ut}XFd5jWuvYuaur@S1T8a0tf2>ZD1F!&`S;|sIqvsjn z8wVTDB+J(nSdbQ=^+nPQhZ$BaQ}iOl|GO8uy+riHaDGO!*wDAPA(Qkr=3z!SUFa8R zXo&ABc*$Zo%N|lX+N<|bi%Z3OTFyl;^BNHR;l``r$q6?XMhkCCe1oC}+2}3mk=ek` zZbL42K5L8>;{_wb7uw!#b*u`UtU3doK-=b{;px6EXT4>3OB&BttI)(X7LZJdOCYI??^Yvt`6x$qmFvyW|bbP{b z3n%F{OaTae_nf%In~8IeW4Vs0t4A35Ns7sFFSSz$f}N&6a82o#v#%Vw=)GYYBa^No z`dJ}miZ~5>y(-r`@?TtMsSkod${?98MMm->r}>H%PA$S&AS49XzZLRjFq)MBU=lB+)6cK0 z5Tn5|Jx&%);h%Y;l}H?*jS>b1%^N=_oOODKE7OoKUJkOv0mOl|dYXjYgVC_$O7 z#^Puv=@8uOKEQC!co|N(_+iRx)BdzXXee-%(t(>OL+~KnuYx!|gDydqZzWwx)G|L= zw_h6&XJamI{SA7` z#aWg$i+~Ofz$@thNKTXvxMV{Vu5e$dVyE`l`t2!_u&OO=4R|>(xx)Kvt-@OFrYf8L z!J(>gwN{2{>AibjdsV)F{~E0snL?Pwq^4zkG8f$Ck0uQ{K6+Yn{+@}k+wIlmKmASM zoLt##EBh8G(P)ZgCvV}T250m4?thRm>8$CW?}ucUar*TlbfDxN7;fLGFkRTB6LUlu z2fI!@B*iXP__G}7@t;lEjOejd;6Sv8_gmQD#mA>(oEK~ZD!%gk7ERDea*oQuM#)y) z?wt5`cSg_Pa4X&AS!-D_G4%v5pErG&MD2-;MY@{mPl!&3J2=_6XgxfUBE+DGh~SvM z9J_h)85P5Hv1-SdybWY>xO%It+LJfW7~bt{O$fSZC#ZUO*vho^r9c~F;|h0JuXezB zkgS)n2oa}|RCia}E~-ZHD>pGHq{RUD9|W(6!n72C&FU5GQAX69v*-MuUfF@_Su&B& z-rwI39^tmvO5xm9dneUyS$w7H>vhhx$DGz)F_o~TyB3p{Q!vrPDCexoXjwZ!n%CYW z!H~971}ArRyRAJqnt94zkKr=jBT?lJQ9`~-Gz62VjAv1-9*E96>oGPu39v9J21JSiBKqryTEjD zJ?BO#skKBB<1qH*5BN&^6Xbz3m0KN=hdz(Cg6~-6EC=o=L91r}t9{?efdUu@NqC^A8p6&SAR^;bx2R<+>6hDa4dOpbmUj{N3Ty_#*@zZY1XL&g(@3Z z?4NTGsmhcIn6X14A}VSXr1K|Fo;-qOfH+SkvyAWI#VATDD$6JoERvb%UKvCQj!utT z=jA><2eX>nNas=@7oDC5-+=q}9zRaUx@nU^ z@a6~npX=&M(WQT%XihyPXK87vZFShdx%25$r)jX2ejd-B$H#947!HI9j2}3u|171Z zs=6Ue^*gGB^10XJgMXysZRlNFL>1w4kqPH2$-3 z4Iz3TEUm1nQUM>*5^!=5Bd_J5z?H4R>&NVU}ig<%m_0S^r5{MO9VR z?x-GP)>6-WV8poZLF(Mj7}O@R2PH&7Epm+;302fSxLXcx_xYJTJTvUKTEG6IN6{Urcw=fCB%!(DO!Z$(+frx1wH>wGy}*ky6m$=R7WPcW`QENVdc zcp<{Y?8^SMB5M8(7@QsEAJ}ZuZ{551UUG-5tZaIAb}9NF_%Q>}e#0MaiWwD0Av(6i zq@?`_8e|{%JxhThFP2_YcNZ+-+>aJ0-SdxQ3rvxio@zPo^E2u+f^HUX^OzdUX$uJr zy$l`D&BFupKV0S(`sX$U#|fxK4^quJM0ddz4Q2V{T$sG3$29YqvFn&7>VW#S*TRCl z0Eh@+FxNXw)`b^NoiGFa;x_S<3vDmKapYwOptaI|?TYsNz5L+K^+CYYo$#fgHKo@{ zHM{|T#TaNi)e*=p`vH^TED41%@zN#QAu3L5Xzglwd3g}ybU>akv95(tCby0QUe6HK zxYL3AHn5ZrZri?{A`E#?iC7mJJ=582epWQ~W>t{(v_k1d0nA7p{X34NK^Ile)>AmHpRqW~+!;GHm)_ zQ9M32M$8(7jIpJqo{Q}I?2RsP1kWaZliE%~Q zAGZa4{Pc;~?ak<8TQP6R?Aq@>!>l&4Ji@eUxG zuPrdf3k1=!c-xn{I##d*&^CtFKfnfH0Orn2j5}zj zzP`TGNIm7BJ}Cp3i&L0pf!i=lZXO0iSkVH=RRPE0Q{~1>BVK#NAG`;15sd~i6<7RF zkd~Nu13VZVZLO%`b);>6jMl(~^ctMKKO&j1?Ce7xAMOZz#bhO!{(H`}) zdkjwa4sr3<_=J$#x33cYnO{ccE>Ak4E`)TFi{az_1sAH4fdLPaIY|OZSx$y^GJ;x1 z_$Z26vTPZN)~aa5clf*&Hx4XPQF-S$*#V~)a7G7OEi&CIPR)Dv;Y{GFMczES=DaEfHQb(WJvlKy7A%_xLA}+0hgN#A1kDmm82l1IQfrKNYP9Q|c zh#(@);rU(|`SxLy2}Ek{zB*VMfA!UDB7PQbZtm@Zf=ZBU!P@vBzQM>l%m@_tqzMWN zm3V&8c5{=#t4;{4ITWV_+K(RZANiz}zgf)>Q5%ZQ?ZCY24rysI>A<|a-O!;|>gqPA z>So^2Icby)rzW;+Ki&X?_kr=VFyu-I6m%zJo)DONKdj)nm&1aCR{@jxBh}?COE{50 zDj<$!$G`w19125>EErV6AaYji7?E~^*UPWKqEe_oXRu-HJtA!qJEf%j@V*qRnIG7Y z>jySMc|VOoB=#O%l49W^1J!*R^lx=toiFCQ@VX#Eejp9#{+WC>aP?V(T&b+Jt?epM z{dipoCcwprlW+26*G|uh7U=<@9w^^6`CZ1+T7v0hj& zQ7L*fa(?&H;p z^sq5AtXS~|VaXq+T7&sAWK`<&(kK?Cc~gRIdV8-y_=V6#W)z4M1}R4G`!Y?h>+_5a zFMqV`pUJ>L3@3UbB5(rc_dMP{>JxI)zC&2iU%}bOqImf~-xZ>N za98`kzv~ch4A=kn=NRtO&|o3#-B32nzi_&h7tF)8f!2;%nxPj+9OY-vnnEaL2`K%V z?<|D$v@G5OP}{Y_t0JRG=Eq7!h5>hjbOv?-o0y| zhOY-AZJJ^-X9~gRfKCX+#j-PJ&fuMUOJLt#1tA1XaEwluBxnW-dYKOALGjdoKgbUi zXZp53yKg?yY}=;60hf@#q^zPMA2AohPFGogoGl3-U6rqZ{8b|!gg+AbaVwe9+-I@5 zxtu>hnp4=&f34)FOPgSM$LRi*j0|y5cC-&aAJu1#)#^Qii$Us zZGtO#V<-cVqH06{c|Q-j4J-&O&@y;?Sc%9tOceU*35UyB*xHI7*vJa|&8e-G%a<=F z-$5fu38uf8+6%`6t+7KKmAl%7oe#lGzj0!!8N*uv6598kyxJ5Ety-v}49jd}r zAor#myPNpBDeThb3Zp1VA0y>BKmorNE1F$|7niNu?YIOJA({e}#5Dv51C6FhX==hU zvotN2jLd>IfLntL*ewGio`g$>Q5y{Vb^!r88hN!48NCKml5YD=Ht(L7@}kQ$WKus+ zhoIW3L2{!y!r=E{@{gtED}zHs2_t;Mwqp-3MMbSghw;z!!8!nKc;sJWp{Ts7QW&#$ z?p%${#gLO6d4C1?F1QBY56WQ%3}|n+oC<+$fbfQ_SM+# zLwt;n&@k%(!;v9uv^aqJd{`OaZvtnkkqK9Hp@p~tPukv%p)?v$176v6nD7B7k|>=M zvT5in_UYg8(wv{j)sK0jEPs4jSPx5 z4@0j+1*Yfa<)vK;3uDKyorazs1OAE+C@w4WlXC$ys7^7Ewk`T6#K_^$G}1)_ZIAaL9(f>jbZCxzBMtrG zhfgllNGV6yszP(jxmV1I@Hi<_^RGUP41j)}bj2`RSfQ@A_L4+xyq?!)M;XDa2(xxL z6k3=HO*z<~9Sn9bnTXeuarq_e>cG%smMArgSm z+Q8!Z%k|_x`K@&g-#An5ix*OtTo-rO!gi$d_#Iv^kZ2!`&ork`j^o>`a~vZ}49?Eu zJD-0RGkQhS7&YEQ%l5EEH{u7gF4IbCW!~h}9xkKMy&H-V)#Bc>ZbaT8OgQ#B5JrASAhAr2!9yG^$+_ z%*^XS4DOV~yH|Wo-YS{utj(GijMXcA#t_jgXR6PTzJ2<{BHxPWolKhEKah=^M!SF4 zkGa|>qbK;Jx1$N|#?~bwPg>oh1Lj-2xw&y9A;?E#gFKcA>_{J^HVoi|jpGB&@yc1vKO24&{c022-D zUaOmZ3}`Tab9o&JC#0CfhZviXP>+5UDqQ6v{u?@@J9sL!tdn~RUXQb$y{e(xl@@g8 zg$p96l9MTG^*~+So#ElS0*a7jQJ23j!a@p}8Gs+O z`yu~K1+|LyrV&tDWP2W3U&(Pjrf18X_jyUFdcg+{G{f{X_o7qE5Hwo!F1(W|1?%b& zL32_!WWVL7S7op7HsXK36CdwvoRD8McGnwaXEqC>`R;Kv#1~8bH9*v_2^O%NIVC0gp@&nJkFc3LW=svblI@gHIZ~e}x+~3`CKg0z z=j7Djf`VdBTW|b(lSu{!36yOdKsjIcH(bhpRDxttGgt9nzx*IFni9GwcXrC7s5rl_ zDf!wFzJ)pH2UjCdCa3B7j0c5hu3Q-`30zD(Nbeb4At983}W6jM^o4#;!bE~-4 zuVrc`L}1LU1HU={D<<%QWcY*Cn8b*guOfAR99o!&9&KPsYs7j%e|eLY=EK~YMo{0!! zJ=EF^!%m37vRm7|Le}C~G+$W-?at0o5&yu8h=tCDz6^PP`OB%T=MNulsi}5%(Ll5i zXly1&>H*K}mZn`t(P<0hFNO1!D@J|y??L`g%%QgldkT_sKME0hz+Aiz6Tqiq9^5=O%B97qr%`JRDF4a%^lXt<(yu%8Sz|%LZ z0(`N3m8nywvWDjPmPpJUm9v(%_V(k)I|#Z(?zn0+oy3l2YE4xFt@A(La|#Z%H>a8d zT03_9_?Yg8VhO?LYWE+~<;&H*w7mSaJA}Oe83=h;Bir;l{tl3fp3(rMr@zK~ZD(f} z%aK(>wZ2rz+Wvdb+XzGk@+RpIR=O1uBQa7*a5c`x5j z)z;RgIE>56I+L-!VEOE|YlqxfblL0_o01=B2f%BSI(9q&Y%cT;aH?&R(RPlLa6quVjcBHUTVGQ){nSvo zcBsX2M2+Td?NQX-z<8gU=eItk=`-g!wLJU&vj!-!B8}hde(?ft;4_KTDW^O@%^gp` z|1UgNNp<6S*;fs<%T^&FYsUVUR1wmrMQ3cLFYa;NJXEZJQP<5n`Mx{q2SXz~^qo7k z<%KnEdNgU?_|329%-vYr)pPT=0RbhAht3}Pl4fV{5M{_>=+y^Lo*d+^pW;&u+ZhV_ zahbiNQH_xAc6-a9vu9mk!uDJ=zj1V6{A^IC!P?qZNVYO#5FI5xc<^90Ck0y8UvD6q z>O_|hpnTcv7)_~Ge0#_0uiBmP^DrZ##gs{t7Gfb;NI^EWUt7t^7^K9vzu{P+iG1)K zPuq21Jm_d_<0egx0|HVETh6@ThK6m>*s)_jQ=ZyCenta^43F5i{L31q!Ivnx29pH| zq%l!!xVzQT%u`p)WZ-N;v}! z63T%&5bkM-rDfc9R3VENT|QR)>ZYfUpWhWoSS@<|YeY3`KEUk!LjDc3Ih#UPz8r_F zVhQY=efyNY(+Pg>wROdF0bNJ7ZPzXV=;J=cK<*=jQ)orb?d|>a_0NzpP@Y(XmabRp zhA-tOIXmlHx?YB48Mu4gZCHf_s_EG%;7;Pp>qMsFk;y(hR8D~7JQ%Wi%}#;c9-q-? zu~6Q+e@<6U4ZQ_e`4Yo%Jf49$Y^i5yX>aw{z!)r9vEl*YB6Fzp<;|g2TgVapj>97A zz{9tl-Clwe4IVUT5p8=vo|}1u-4=N@z|NYkRGYFAA|FFZyYetTbMEwVpZpR9AADEb3-n8oAIt#@ zj{M&99oF=IJ$h{IGR%J4@e?OP;i6WK3VpwUJLjKPV3K=uPg?PE|)uzsPpzG-89+N$urr z<>B%3mPm0e55;s9WZYwZ1PfECIh>8n##!Q?WC}>9(Wj4uTwB70QDLs`H)zmddW}7} z)aT3E1>hXSo`P@V`#sm$lIMdLv$tK!ChW+RLZJ$Dc-%eL zTOj$8&kY4_64+IJ6HnzN9=dtld=e?Ip{}UEcAt>wKQqguAmP-AjfXpQ>=??CXqTY* zr|#j@b6^&iV0+{^T9e@JUQ6F${&7T(1D%|lbPx-yL+3YZ#*A267g^tgFR<8&ntBZ8 z_JWHpGBm0E&2=XYP8)|EIBS#9J+K)RhZT2rKTx85U4|chsl0fh1t5vkYp}dupr^dT zCFXg%1IphVQA-T&ANI2Mg`nz9dDf!Y`!rKTb1!B{X!= zk8dBE$$2)9%dV5w0@V$NqPFZ$P^v*F(q;AFUU*3Y#7i2}h!Ny(a601T`|#5OR6ngO6XE?Lu33KSlx7M+YR~pYU zGkajGMsgWSuM?Ty!&kh#&4Cd4hcAhKBRAb?*sx(l8Px9*HiqoBfxeqnnjAjt*2u>M z8Xl9KidD$n@k~}$)`NTZc5z0nE~SJxz&|Oeq@!NJ)3x_xZq1QS{Wz5<<$SI3aGIObHEc9tf`=-!X%HgG(?JO&O_qcadcwh()KxF1A)BP*YR94BOe)<*@;96 zXqB@fb2;+iC8Vc#D8bxWy{d=2QzkLy@Lggtot_<*DNOO@HW?_5#YfB&?O9qp}W zf6b%>mK)Xbo%zO7x~sZ|M{_yzoFm^PrSAm$i+^!rkOLbxa^0j^JNfP%EM4VT=1&|w zbm-Rh9HU^Mu)MktT?eAv9b{3fOi4_?i>mN4RZAlO`1@jOC$cv*U4zziFDkpQw;z(r zzUu9~7>F^C-mU|6s3Rk_Lf4S4b8z^XciNV&r-!YX5F9-C^U7bAE?aglY-?iOZ1=E< z)YL05>)J2mN-|w|rqA-FmEPK(T6@w0iK{&G5NBUWrCiYkN&%#N{OpHUr)&;BlK6L> zr!u=-yn!#tj?1fC&%H@((r|sxP5uw)7>@h-^{zN!(6O)A@v2vK-Vb1qz%I!=?-rfr8B(v}L6AcRV+r0YcR8Ztt z81BgiwO>ITNU=bHq3?MXYD{_cqJbLZ_lcV5BVlK2Um!LZwa zO^@1Jz9SWNAv;5gfeZ`EC8&>t?Jq%v+5Ik=9(9mNf&wgOeGs`3$C-b_E~jRAbVS54 z^O()Ym$y>fn#7XRmG^oioU9JjUWr4&``F%R68l_p-29>ZroZ0SRq^cuJvtS9|MtP4 ze(m>xuToP|#O^xvnAW+(swyI7Ag=t@W)P5Zw|XRWCXU9M+|{=zaay!$Wz?%H7sz49 zKat4OIR66IK;Y@Yj9$&_3#6*h$7IvW$@2~`rYUI?9|`uF`HFkv&8OouhWADq2a_J4 za-o|zM_(k$cut~T703StV#S{}cK&=d$n`oZ)G}TivZTJM!tdl$D@c|m1)Y2RIdAXU z-1xTv03&_+qeGZ*)45ua)S17Eiaa{~;2NXFUlTIwOKvNX>8PH7)|EK1VEN~75dElJ zfD_+vBU^p$kEN1}Ofu^jvsLRC&tMfmw~?lK2TMT$sd4gdQ~Ybi+ZCs4iv(1a<$i%r zZNJd?VG(qf47z{;$jMTc6E~~3_AeK(Lb2ud@81L%kAy96L5{vgaqmR>g;1)zc>3 zy>?>+o1{mS*Rp=iUpr@!~M*}@p(7Z z*}7<6N>({IIH3E!JoUSK(>T9Bzr#9hNV{M7v4yeiyw)LI=t~aY=rzP9r9Kh06UW;O zHV9~WGr(+On~d*l+A`~#;?Yb~>i|I)K4duk7Dx&R$=hpz7cQJ*2F@_RtWCBruqf@!i)cr&M zCz`$Q`xo~RZ}(!RBZZk+jbL>qQDGA~X*wGQj!Z-~NkdNdJAbrmeN}1Kvbv*{f{|t% zgmJL3%@9Yxd5QW3E-1?R^|))Vl4oCV46SsY@Oc<|25{v;O{|0migL6WrfT1@<07K? z7Pty)F5)OYjo`#c)+8eUL5h77J8MRp+~EP2qiT6A*L22FASe#un9N81^jL~+WxcFF zb$i~Zn6R$J;l9=5_Lr8bCeCOK$P4?DivuE$(@g>=MELfiG-N3YK zW#^NRhxKVi$Nk~0@))CBJ3jqZ6ijq+yD0weZPzI6y!ean+XrxdQS-Xj-Wz=?WooTk5YY!jBzrpv^mz1xI2Z7!d* zTz_HfeVnI6I^E?2`Wa6KP5}l_#WMMWzi;}l9ZZ6cY_8X6&(^iJw#7ChO(N9OJQDp6 zn+`JRUuqJ0txoOQ!YDg4u)s>26w_42?(2jiDvK004}ZcY!Og*Z>!o40a6pFX1@UeLt$tZ+6oY~gWDHW#Pc zC99;iLG!|!0zCee8rTl7Z4bwZjI*hH_2c_a(ZjF=XNRxsf@Ntd2a#op;%}JOb>8J^ zv{>Evvp)7C&}`~|PuqOZV9bwqS00P-5U8ns?V4O3L|TMBR|dHb+yU11n}I> zg;X-_CX}C?{8D9jxmH6Jd<-jC51{v(^hJI}f5uac5SO?huiN^!3?j5u_(Nm#&O#Y~8{v*lAC@(N(nT^eFAl6gsZGRl8@%qT~&A0pX zXuB7DO@x6k%-yuKn)7zS(j1Oo(oWSx12tfNVptsjz|qw2D*xx2#&5r#_t$*pub!p@ zO(9Sy>=dWIWW^;WT%7)Ay)2*c1^Si?7oJNV&|g_xc{L;T!jV!VWrj)W!y^Iyj~uRE zll3;BOPAA=Gs0PAZX2^TRFQ4Mk)Z9MuNN{FAB#YOL{fkwY`uP6PxON{@1$kpR&F)# z+KOADR!L6?f)VR~!R0m~r32>2^wS+#8GmI^*h{rdubeI!j8W5FsdR>vY7DlDIKX?l zbHH*@ajtpWlv`}OgkHRQb#v;LX;Y`VIi5aoqG6LJO?+;yr%zUKC(4?b_MCc79J(e`Nm9JtR_U}{xn=2y^5Rci{%MN|@y(@hQ8L>tN_>`}!9d*7#sQ!c`e&L$ax$my}Un=>W~O_TX7zQdAyJZ}rPf$K6+y2=!Kw7tz1zhhn$-XCfac7-`GO}VJF%9h<%ePQ#&e~h$hF_M>K~po@A|pPU+?L)@HwFH zJ_u4s+P+*a@Z){&>easY)|&d^>De*0d>p1toai^VOD=&DgWC1e&kG8*zZe|6AG=jf zzQQl6^6%HhDj-=ikrF{B7m#u>Pv^Lso3ZuIkX}iqPEVgak;Rob;^_~1>L~sBUq^iT zS8vL!~~PDk|eiBH@QBtVV3OY zUsHemY$a0i7=!9DCMLQD0q6D7o~9SdEzg^jIf;=2)X^0F%Rf{0zMd85w*TbOqiw?v z51>^jItc*{^nZ(}R-Ww!q6HP~_z}H}YLy=KzH#G*7e}R4aE_0AaI4rGz3+O2cXu%u zq0xQHmGpPbqDy~LK%>SI1LL_6Qats{7w1ofZMYUpOGc@r%!R0xWJlh#3}Yd#tIw6z z`Y4b@T!@Yvrsn|k99+%Rf>0YY*CUkgN@plUG0$wdub?Ys5{Do*?x#y)%Pd4p%6>38j_ zPjw&z5X6u)PkGJA<63m(piM0R@+c^OV!d)ApCaFL&y<^ z^WiqT`;ziQ`9Arv6%TXQfddoi`hg%X<9$Z-a5`x@e@!c1RQ22w64}TPee(QyJpIE) zHK`z4)~_wsoRC?l$nf3Pk^Cgkl<=BfA6>3@5AZes0zP~3;yyIM2;APlXd(doV_bI; z&*}~qHGo3g2r(R;C3#=42ea&d#M<2{s;GEHJPJ(qbG!vZANgOz@q<`tFXig=;99fr z{cWNmu8Cu050w|AGwd`*@HOB^Bl9+J6EaSsR&0n_GXk;r_IL3@+ksk9t@~ttGcs1( z*BS0G_%ayTD?$!A^$3yd*{fG~Ev-w*RUem!ZcgnDy&)KfW$GW_==kyDJb~LR$jFTB z#gBW=QEobqB+X7{_zfBrcEM((u`jNBd3Q+7Aj6jT+gCZmN9_u9EGEU;yaM%RnkE;k zVsC7jS@4ay%bXS$%XB8h6kk(!Xu09X*R28m)6W>2I0SqB4V`s_w`y-mH08Lz!(z9B z#LARH~Q9s`~d(N2QA7! zo?J2ff7T3lA^s!iODoNt>^*crOt&pd8gTP0C`;z5$48eeSm45^=cGI8h)O_d1{(Pn z3o~*`Uem54b`enQR@LMUgeT!DTd-1D5|k75CK~@Ry!s+Q1Q~Zpt+#_y=9g~Wwlumz z?2|M={CV-v>sNm?Ld|~Z_T~Wt_W$>ib`7)ZcY24695Djhi_%({YKn;bjwzs3-O(sB zxK&lQ(yl!cbZzhdi)>v~>r!TO$%z1m`+iK|tc#5GdN6XdFK3+8n1HeiN!HskI`(v6 zzXM->7X5GjPo?~SBb9$_Jjs)=aLGij-=M)Q*#C2Zfs!dh=5*}ChfOHV;)RdH*#wv$ zWPYP9>>?o(eK@oZ)M?b#?s0qhZ@|FK5T#C)>7Pp=EC^FCKHu2$eFgScB9#6WDv}!I3h}&vpV=mBXT21~>`Q#I|WC3C_2|=8Eb5D71}u5>PYF%xOWJUDi+;$hX?ic$G`Ut;nbbSw1|NMf5?K7v)6I0?1qZU&kcF<8%* zlbj~*Q<~4*E5fd}ZFc}=b`Un2-zFZ8va+&ty_=W2|)py?>SOw`=|RUli?!n!R8DALV+p2LDRFMF0N( zQPlqbTJx3bb*6@lkO3PAjQ0GyyHM0rGS367& z{)-qa7!Bp~N_`~UBKz}wep~sg^|KMwNwACBn_N#!es*2iwcJVcvYbn1XwKFHlXKSj zyX)jQbsuhEMGA*uj|Be<)!#gf-Aa5?t(?AvcsTHTa-BXteeB|4@drERzn3lDbIONg zWeaab1cW+V@axE8ACFPkY_-HtBt(AD|MC`Kq^*E^;>3!oksTV9-BF^D4%ABE%E;osH9+E(WDeaghklpof&yTAdv9w*Gz-Bi%^G(cQeS#Qv>kcL z0ijp>KBm=?X-Khr1HO2B1%m`6!yVh3u%>J~>E9&Ll@Un=&UC>$vEj+MKi<9BCJW|W zlL(H3Z_Do84LW!3oSXQ^c^VqhEMx{7i;6-d=Nc|u8HE&wXn;>8$st_Pt26fQ+0(pZ z$A$F+H7u2Q*PP%jC|SnQ)VJHQYJLunb|){8)x#G&h<6_*QX&sjKZ-V> z#E{O6H-uYEf(;R1MP65JvpW)iW$yL9EJYI!I# zwPX&GPfnA@jRjm1;8%4JFdJVpqR%cc7kRhMK}iZCxi?#@8am{jOs}W!Vb<+940l9scz*_={9GO(p~Va1uIwX=Qiy@M~m(a*W7Ep z2LYYup`*q;J=F1YKmL-)(1rjS0_$!-b&=BQ=1W5q0 z$&0Pz5RpMkDi^v4Ft}|b4E!;02g`;IQv_eUw(QRe1_d)Bhz$)5hmuf(f5H{^K=`Am z595Jlxb3kpj~hMOCAr2-AY;VkKNY%FRWhrBb-qPGrCTw6$Ggp2w{9H>buNu2{&>li zB8BQv@lyP>a8U`kbr_xLN);9v70}Ptjk;$CGn|CFLVF`71tcgCLHX&Or%jut8cl7+ z?(OYS*N4mIHROW`+9X0rLW9McLd)}%FbUxwf8o&zz>e%QvC9i+xdvqPOPeD(SX88I zGQ?cYua;V$oU$I87E!x+Z|)f}9Io;}8@25h%Sx0fobvpTvZ-9C)MCLW0kp&h(;V6Y zhlJRJ#W`OZWx5z2M#Zm60S{J;wLoy&9cBLSy+@CBoIAI0pHCGGboa>sg9$MfNbH#Yol0sHoXqISuIO5kpRiu2s8V0$G6`Z5?B)XPt>d~hv`>C8mm zL#zike|#U#0aZpCu*5aWg$IsM#;_S5Pk7TYn1dD|L6tlwEN0>m3kwTNE~E0;@FBm6 zu4MMYI zoSPd_0&5sHv+Zv@hkke)Rl!+`sV6Ad-k&fqLl<(+&#xX`pk|1eqZp48yvEzcnJ?Z( zw76KKl!z!1B;g~BC?;f&+eL;$z|*%KVBw05S+m$=<1Suio7?PHvlaJ9N=$o9!k|hwW%N zWvBVY@sEPyg0GzF|J=Fx`D=Bbj#)SM@bsC)?*BzRj^mOO$9-$*XFX1cvkX686;o0a zLpToq3Mq=I>)&q;=i(j6Ui3$?D#^QJ&`&G{gB_!>h@izq*a^a7+sTui0Py#6m2@Wo zgYS~rBt&oHfGL}Lm>L?^P(?68lf5!y)~p>O)^>L|i2_I;hEH$O`uO&u;fB}eV6ZPY z_0|tgDD0z=uxDBFqu+ty77`Y&HDrh~jwQnxaqr~)^XdbZXMFGT8i<4q9Y=gTWHK`c zchVHYUEI!?ZZbay@RPj3zCigBg+ymST=@8lLydjByteY1EfL+w0w&N;OhNQ*dxj?< z$2fQPtcs?73>B-S^FxEM6K!UCw4ndGFn>tR;L)l3XL7yOaJg|yG*`82)R64HbO#Sdd*x%(He?Xb!I~PivZEGPROkEKUv_y0kUiMg-F zxf#2VG=F$BaTd%Qnd{p?0EADY*1)W)1g#r*g)r{=v@#KhoWWI>nGD7vR13?yv$D6WL)cC@uOF-UZ~V3u=OGzqdCX+>OX6?>p%f$>^1%( zlT<4{qEn-3ACMBYA*?Ivv0!=J=BT)TLF#dOxUxRqX+RUxxzC4;yv9w7ZZP7ePqWSz zQ5&RY1JD)1C;R};h-9tOKX2?LPYCVEzKTdpr<6>Q7yJ;)$hhFX_dVtoO z)ncC$I9BHjhs4|Dzu16%1`P1fc!s7zYCig$C)XWhpu3Dw5X&JYriU^L#h~^h$G*ro zMIOXM8Ethsl{FH%34LkTnp@6JPp)PoORAyxZXp!=Ou4oxvTLAMP-l(vlZJaex}0)9 z>FYA3y=A3D!{1aC3@T&$v<5-9SeW4z6jBD>D%pKCZ~bsMGUR?M$S^?e%~i$Wc6N## zX-v7k7fp*jAZE&+Hzj*#JDaFt{j|bC($5B7>ycght^0~S(!n_Oa`Fs7YUHzVYoRPnm){CwFDX0DUdPabFko_~jQD)3)A5mrzhg45GH$ zLG7p-jbbYIcEF~=HI4JVptbm0sgGoF1qJ-AN}#06apFGL^w_^AdFtGw4I4FzB)sIv z)kFI{4;^YzT4V3WQ;XGlUbueW$lKq4SA~lbU{jeqXjZGxv@m{N$V&Ge{T=%iR9wG) z9nEzusg`-F-N=)}Ngy{5rKs_nC=VMH8JsbqAUk&QRz}h@8`%wpG zXRI|KCyDh4g1eXIv+(dNZY{*a|c`hK`{PzL@dMqiFA!ta@*)%vPT~4qp3M-c8KXni+|Ql zQS|&e(Y^@J49(0Mqm94Oz*J{YppQ=-GH6bXbZiSqFLNvua{hnV46n^Dus=QYWm(`l zGoQtNOFfwwOc5HD8f(?=ubJa|w#4OkE-0umdzMM&wZ<>A5{)JvuTFv9Xk8?6;j1 zG_jbkxC!H^kM`1wFQ5}rKTs9?^x3nmc+d$Kku>p&=&K*RraLDlrz)x2gM(LwWprrY zel&d7%54QGMOEKRd(Asy8Q7ikGP*|6zZG0z;@|NT5Z)+T ztH(F!`&|d32MRbnppf%$M{uyF_=zh{zZ*N$O49Qs`{w-l-%5O^ZR$Ka`s$%SL#}`I z*VIdmSK{N%jt3M{J8&2WIaG!w)Xe=b>udN&M*tC^*EUFQBohk!aSyGa@} zIABxM^?;w1ZrA8q7Gt?Ku)ai%pF;TCjN*HH+_76$2o?Ehs>0vGp=u#?a-qmq0O;;a+UEq7b!Rw#_cevvKTUB*sqtkI^_U? zXnKPFj#ElxNJAY8TSFZi$0(*5hl+O?YX@_^2%(I!Ca!ugep_f!U3))y$;rvL#j`)J zc0+%&U;2{q!Yx2j*KV^jQ~Z=gll@GV+pjR8=O!hhSGe6{-i3P!^wn^FRkr~H4tQ8V z%;YCFmN1`%6w(r%BS#rcmw8E-6iP{pw=?yMP4(KCpWbY^6R1tMrKxs5V1vlxbrPk% za~){mj2vGY4*FCZzkU6HhP2{y6UTtR9iCwHsD|^Gl9UUr_@o;&cD;T3wg-`Z1u0H1 z?Na0>;;pIod&Zf|5*Y_ivC2WFq4yvaf@31{$`;W-2s*JpVhJNd8OdfY||muOH+KNTRb0M)#FzzigV{C z4)=WhdJzF&!SQbwK{GK3;r-_-5Q_~N{u%p=ii$pTeR9t?1eT5ykesiFwnt8#dJx#7 zC_u9ZnJbPTn{H?_Z0Jw{@z8_;;!S{jgqAt~v5Vc=(DLQXdPE_-m9kEmb)$Jpl|&|p zgodpxbNuL!-f+gewe8{bs#J)*1oVx_;56`-GCkdZgTYw;yY-l99_yg z1O1R+C9x#Oj_u-%xffkD+a0iqqOcX6>Pg*;F>nSr5n&R2wAj1ci zKkJH9r@ngv*$tu=5JnC;4Gk3NyL557-Oo*TR_At+5yl`czfc)4bwER+b0t+zB_TG5 znHNzJ(NDFI;NO6)g$|_KCM*0xmS0Y>X5i64aXal8L(b-spB}FB0BYUct5@i z%>$c(grdCQ-TX9oOZ8KS=XRmO*o^*68dlCY39f^XP+D^h5)gNKuC>?i6qd5yf=GC! zg=CqG1LfdgWhe97UUeGyo6?7I-X}Bp5Kow3sX1cYHt%tNAcx;ffWF zxrt<=CEnRFtXshrsjS~fj36f@XzM^n(b@1{zmXzGI>s)F=B&7>Ry5WMgV6WVmx??A*Jjkti7sD@H*lRmUmhUKZ~;X#>o%iqAL9oN+t;ik&c+NoiMYYA&=pWC>9*zrrJG}e?Q?f;Ablsx7#>|_$tqf%Fj+>p1~ z-yB}d!9kqF0upR9YZ{-(udb)ISp~8o7M~k6Jh~cP>l&D}R(wLB^nfX6Ki51MIwZPl z(I35vU9YD+OiI5xDip}C9?+CH5P0{J*(Fp76{0w)ZAQ(o2V@6yDZ|lf2|$jNM$y7I zqxv@gjQ_L!6$}=p2aV%ysLuu$hJ|BK%&;uu%k& z&vqfqG^2%G|IeBayY$+YvYSeqWZ1H{o6^Ywwhsy3zHOUC!0@aB)7~^!-Un|u zlGeizO)Dr?dD}%YQSTqjV{Adcq0{&Qv9Yl(HzEgUXl!Nw2=Sz*=BYQbt!%e*E$n{# zeV;8S2rS10yxR1Ht69z5&CfcWP54(!U|w)_@o&FZpDijcUW52Yz-E>+2VAb=yPdM{ zgY*7NnjqwHILcwdIZ;LWg2kk1{ILl)M-mL??fkU<&~D!G_;5rfAXaOt%&|OWMqcf} zCYMs>X4;WdjnZir2fR1oV48@G3$q#8+&{Pl&=bulUZ1>NR8nl1u`mg6`cGpNCr46s z_RVVsO>i&6i)L%>e^^`p-LuC0uhfph4*UL-L)K*5g#WO)n>_!%GQ6cyBTp^^M>0~zoR@4 zc=iTnu$!i4@btK#eay*b@D5DwmuVBXi!cV6&8z|)9%)%cMaZ)^&nF)HH2$>x5X|bx zSG8xj<|@%s3cg$u@gA68@cf(KC+t^vfBY0;aDt}ahFe!-U`MhoR$Q12limq|7j^_6 zfPv}Ox}nSngZbE=!5^2T!PFh)zDf70CY&B*Hove(NRj#jgf+j>2_tHbJvq(q>$`-g z`yV#F%FE9eU=Td*g#wDR@3T|J*Yr|7oArejwku zQ|o5IvNBmcz@^&h39J^}00DmOqpOLc;C`<3^}5yLY5cy=&vHB3 z)W_E{#?DTwVm-=bV9Uz7mUq&gC}~e~;&w{LH>Posp?YZz>EC1A;83fGZqZXV{&}z< ztg=+Qpr2xzm9(QuGj)9Fp7i}LMNtK< z{2PHWa=2Z%~U=1R+&`zKDY`K3okc(T1iF>N5Yy*{!uk{We{=Mf=``r3+MQ|u& zbJ*}ewVO^nGH9l$y1F{LKl1?#)2`VD4*2J?oJz4IP{4pofQPX~Nt{`(Jr} zyQol0uE?-+)TErzHC02050{w|6gXS|u9(nsY-6sEX{QocPq|q56J8uM?XjbXhs^1R z%ztO`2VM>AaZvvr^Pv7MRGqNlcvFINZzaxPzr5KiwL-C*pnPWE+k2Y48VmTJBbAGf71hhx{Ub1g?lA zn`c^}&lJ)06L0i~gJ|)>rS5b(>h4|#I2Hd|*2jnQoxjwP0*l|xKc_!WEcQa`O3QFw z`SIOs4$S;cXr22UR6bnEbEVgUM6BFBpWmm*K&nZYLS1hw0tn} zh(UIL54x3REj7NKO0=!e5I8Y@4zTAOLS^Q?R&D&^qIogLU7*E>o^ z{~?_n(gP_3B}WR$mcaZ-rR$A$80j}%ukZ2I(sA7)S1Q9@FO>72cOIzSzKAL{9i(^1B;;?)jpCUQ(k z#^a+=zC|!db(QCi$$mRZ5{%bdAQ_HjJLY6(yTE@^B>V!Qiu{;Y8BeTWH*>E_UX*Wk$a1rDDA^lZ=QDaHL&l8Z>y)l$Zs11`J!HuQ#q0;ilu4mnc~Pd3 zDUpv@>QXwD=yl>T!AAy0uM13abVygMs=JKOu~E`X{Ew8B26Aq1jqXNL-y-Vtr36(Q@EzrIngPq}vN#aO5Q-BaUU78?$c6&?l=fg@3 zB$9d^IvG$NjM(qsj31y8mS6ggTT2o{-f?*>;LE0-Sq|&g2`Qr_UpR6KY77{#lw&&j#P3x5C-dW(YM z5pDHLh^2^2Fzhe4HE0!aGcGP}4!Vk$RJC&y3NeXBS+jQSV!kjRjE*v%GweRc*KBU; zD)`Z3^fvRD&lI*WaT5?z5u$gPysi>1FdUV^n$@cp;@UGEJ}S_+g4X&a0Kf}2>2WxU z;j3TQ=5ulAUPfAc3F+x2noo&3z^p)Kg0cuBgngbr?=vzY;u12k9X>ujml4)}CbmA* zx%%s6P`=gW2V7kjcR#eN8q!j7H#pi3Fb?5}{Ab1zJfJJMLHeny@4=60QUsKKM*&4dL2lwyqW_c^FR!f$I5@30mo9QxIo|PxrbC>1c z{Ol{-vGUg?@b&agJ!`Lf3^`07piUwb=J0feQvei!(+_tjbW6`ce(5f$4!`#9eFf^~ z8mzn|E3e};i=UkrR+ya~OVfLo7I+To_LI2IiWHt@71GNT^|7)7WPSX!Yx}O2^O>i- z1Qi(7ywlHb&9N@4o)>i)jlKHRiJ;J*MRKNum_;6zWiIyis(19oOEJ4Hp(k5G122n~ zzyoXRzLE=3#QpJef%fmu{H@ItI4ekMmgRMt0E}UJdZCPjH$LeJ*)4w&U2(a71vx6R zI$Z~@12>U1hYm0a0P+QThZo+Hj>uXL=LrA(^ztiYBYeWfH0_wy773^U3cbP+D}fJL zVZQg+L@%K}NCqGw?TR9g9WMNyEznK^J938Y&`_&fE{PzFDQFC=CE7*SJ3XpA%+Gwo zS)KOl6{nJ{@)A+UY)}xwB^DF&Vw1Y2(A&tt_GG}I`JYZv=sc8zfeT6kfFufraQJti zM)E9WwLvK<_EnRLJmmc+C(pb_?zVh4Qg9!NTyPdhATwH$WILEwm?UXgx)&co|15Uw zq@*NEmhL+;*R3EtGIb=OR+fTP>=KZIG-Dw;y2&B^9p2A9ZJBm;|8YdsCkbRPjgX)h zUNy-^iVH6W5Jlo*&}5q_afC0dw;f`vr@eNR@AVIRSoa`Q@1T7oZbgp4y9o(b(BTAU z9lX{A^O(FNyl|cBaxg~OXy`;AGhg!_RcgGXGV#x6j~`#ha%yzZ3a+&vyw2~aE#zFK57^zL z^U#B)J55Z?m8?LUA10sHx85E&>4w+z>o-f!jM^AfuDrUJxtABX5R@nC(BOjKr}IOW zcea3-2{WoeDCago8-Xn)pqv5;G-?aaM#L9VT&!~Bz?I_jXI88T45jBplp@8%l{U1C18Rzf>-6Zmo%^^I|!xT)2g@i7mLzMHT4O zZuu+vU+4qDdVm*er~o_TWtuqWx=aMXlcG}h3pbwT$!-@z5Za^~D)C{!ph7t95K3(* z?gP=YkxaKA9;}vsXQ%#T@Kb9t=%Ee>B-j3dDedrLO8ta^uHl>Dd;GzL7(oPovwx<= z!;*=(s=_=!V~&fTDWxtHgmc4Jip2rW@_*MOG&=jfz#1x$==a|3LL{}H(;nT&7~&OF zDyE4h5QK4miWf)F?X4vl^>9V-ZC7!3LGU%NuiiVl zva(XN_u?fXt=qy@e{%HZFD*qbfrK`)MTR(WC~aPZEpNwHesuaIX?0{(HBbo^gswKy zaQ_M4eJL4Rk6HN^Q7nwGv68W40L}h1X!vQPW5iUX)yBaF= zT%$=hknnI~F2-1OI4t$@$uzQ3M0HjX4)V{X>%RX~dPc^FB}aSq>UA62f*|3ggV_yt zO(&B_0b#@swf}U0ycd*-wNy;$YXz)6K=-=25vMCD@^=+pHy zI$H}g%FLD#sztZIHl`SGDWi@{Siz6ZjNFTYK_#ji^vyfbk&**=W!BpU#`{mPbJbsy$=24YF zXC`VeghoHb%_mOClw!tey8Pwoz3q=QQ_o+Yy^9nbU@U{LMf*=S z?DA{TfAlRxUWmj6{INZeY8k#d1vlveB%*NecZy1Y*T$j}N9Jej*wBglT$s18Q8IP~ zwN+S14Rsr%RBJig+`>{#F4(M3nN(5na(HCJuQD7-Z#{yFp{rjj+a~15a2eRWnU$q5 zO!?P}o_f`z=NPyqf9k1GN>`r7!M(z&m98S7LExSyIG`I|y?Qmb<3<3|$eMGt&EngC zXH;vX`!EK#wYTi(U}p8^3F?0O0+s)%N4S$WxbK2rmr+(oPi^9+LP_xwBTg!-RF!{u z9Y7;|ZtbYEp|=laZJtt5D|XuM;6h+^Rm~BF?)e$3`giVsKQ2+Am2R=7H#s>$mqrqDg znHie7l+91b!f~^X7^C)uhx{#W*=Y1=andEuSL&)dbhSWMwP;I$ZtAHt9|cH83t3M> z{FkobL5N9&p5)VEotbcHvE*1tV_4Fz=}&*qO}(7Y7>>}F-6271HC4ZxhesUz^NuNR zIib;q9BS8$1g6=uXWM-V321yjxo2_e{pE;oP*%x54S%@Q(`lA%$C~cC*>bw0`hzAx zh&K?~xdg{Jn8CcI-7@hA{W{TzOI7&xnCj2--o3i1#{A*|GGUdSWnAE#nD~k_k<&B5 zQR$uX{P|JSguaJq`w*t^(7ixADBPs2ME-F<`moVFlQ;c~hg_IEmW~#SX1U(A!jv`a zkMtDX6RA+~v~x5Ff^#@UY!jX7Jgwl1*#8nvPPk102K znB|{W+uH}|M4gziPFZm_-@#RnukjSd*Wy?}a1WE!7Z0orINt!p^{LB@jYfSsmG(9AT|f)nv0^;48fNTV!DgaI zf~@Zma#M5Oqao82o+Y}Q$Tf#7)U+dCf>G!mKCB#WPV@?|)a%lv=3*zATRHXg=lRc^ z-MS~HcX3FrcAAy3KK9kU`VkQ8A{fkC+H&_c$HTLXI9=6;pP5PRH545rO0RQe=MQ!{ zt*xb{Qf)7dLve5m$;wK@P6!Dir*FM#q*95Qo@$hV+973r9foY|ZP8IN=nJ`2QtiW` z!rsD@wljPhfT8YJ-`_cHS=hNt+C@26&&@mEE42L3;rI*c)^kn5o2f+nfihPH96Z6d zFI+jpkSa<7)M+}SPR^a9ecwPR@M@p8zKBmKP8LvC$ww7e1+q3#XFfTrj7jZk`g!4u z)Tl#UN1?f?7-I7E`y304t`*)ou2E{=ITf9PKtf?c~R~&#sR0-z7Ll zxu%B3SWxS*FaFl^ulB00;o!eXH5dN#Z)wl*73SX7UpVfyOe&#F}1iT^{Sdl7pvm^dIjJ09ebOO@tAJS)rc5KQi!463WK%; zHnnUlE(9EYQeT-dlfGnW)5V@ornLKV_~M2wiH)u*1l6;k*MIm(aH3C>KR7dF6ijjP z!)bp81OzvVAiY^~BHEUzep&yl_l;K^LcV49Z=C=5#BFWj8fRzcuncqxP5FPKI&D1> z+}U>VV(+zg%$|KSzLS#Dnr7fGeJ=s(+o9wZJv~1j$9{CCzYhxYu!M^pbrlsw&!Nm# ztIodns|;8J^}r2RJ}Wk;pmf}n0|OkLe*Y0X>1#?)TU9nSqbMh6yEYD<3(OOL(!xjG zj5CXEZb?G7jBFH&n z+a?5VM3kXn7GXH&&m&Bh1EJ)Vx#&)*<8O90pF7>bzE<$=6IV@Va&VsTK4NU1qPyxa z&-$vuHL90Yc*@b--@1#}Ukg1}WD!vKJR*38&$(xlo;go7pSd=AQb^eKccc6>@-HxG zppm)xpEe)nK8smq{<&VtxsZ^M&{NhYzQZ@r4ICZb&U*gn>mhn+9aP}o{0lL!4C30w zoM*^sPH&(1;{mVI0Dz-+N!lBOFG_nt#)OA(y3eW|T&llWtq`e+r@{o2o&H}4II&N8H*6_3eEM#8S{ zS@-$c#rGM4;g~$<(*`!Hy}@0pilj%6CU6#QtU_riaNh&&0gV1Ap$1_oWp zP(rLoB83SYM{**ZVr0iIX;jVBtx=OdP>Q$LUD+8B%f{W)BriADPGe(D_h()lH6pc> zW4@Sk6-nWSz-0XmWiAyTBYDYBo;@4O**0K+I7LwFXgDd#b$|cggKG$UsQR)wP;(^x zb2F4%kyj&umqZWS$=Jl^gih=aZF`f)IW$gD)++;U)8gDFY9J!@_fE`S1g4Y1tn}DA z)JF0NpTSr1#Ge?y!xZ?vzN`hR{`L%SJuDpVkg0Mw-XZl zp7(ggE{s6K5cWfr&03@7yT$2Jp0iVJ(d#?ApFDkf=ww4rL;@%{T5#C@lvIL4Ks#w{ z4mnQ;EO{X^pi?G35t*T*qqLRR<*7U44&pGlssvUAvmqOxH37>+S71?Ku$+Y5-}<#h zXA@Z6b8?^7w^@epASjkZ4F*mL&K|h7VK}WNa;(eHuCM`;!9af?mY}v@4zBZNg2FbC z$FSEuincb>|Jk@u&UaRD8p_Bs4_}t&b`Ea}ZCb)@z;`mR5KtaT>lnaQDx@~+rY>$m z_O_MuIMV ztem;f*c1T?0$8cg#X^J6M}8RJFLSshyubq2h2;Y>rgr#OOz`?H!k?XFhLg>{kj%~g zJI)6*P8~1(F`!BU_}b5~H&(EW@>*4Xx=;oN@O^2cI@Jgd3zNZdOhyd)ST~dWq1KEX zd|TLJ8iwA960|1a=QQb}z5rRs>tFeS*tl-I2r!Td{7po@Y}eh`ZTgtC|GkU&F^3Ep zM|KNuNaX#Tv^MSZj(q>To~FLd{!k~j2onY0uGH!@cUrneU#TyAjZ6yJg{SxKRT@zb zZ|BU-Au3WN$E9yey_s~MG%xm&X3Ew51+?rU$)jHHK5`_0@wm4!^(YVq3;s5RabvQcMQDZ2WU^l~Lbf^!E(B71X>EZ_ew;AA&{#ibo4fOe&S2(S47~iHg=l@2p}E9-QIq{-hK-jueiuyDMCs~ zkoglc*XET|MHiR!yrm}W8*vZIj+XRXtV4hBo#h@c`*S0$h1l*$-#}Tm6Cg_L9gtUL z&Xz+kWrE+~v%C#~BgPSO80T5PtS9p<Bi&)Gj&v+%bZ(pu^fjKHUP|J7Zu&674J(Eox3| z4YBHN;ZyK;#|iawVf{b4Ey`Rmoo^Yf#F`&TzOW%6afZ1McjQQ(wd9E~s1@H9hGuyV zOCFuN@NtVVs|5jAJ+9D_ZU<;0aK$vcJiA|bi{{N;==oEZb=eXii5=W* zJf1}~3T(gxVmHbOqOn`eoZ)^I^RA$q(Hf)-`h)wFL=f#W_USyNAf|}YH< z5IFtcavTry+eOpfs9ie`o4B=%mF0XHNYJ>?V8g<(|Hr=mlht4TvB0R`{1_>N&7c%J*1<347n|8iZw>-Rg)?{=zv?8CZ`Yzi^Y?6?8Ei0IeFX2fH2-|)fq4;C-g zrhAO4Ra2@Vf2vK*gEOjkbDf$pA&$-A@Xp(9zdDZ_M*+5mTlV0KD9P^!8Xhmr+`L+5l|Z4?U+vf*@GWk!j^{2JeA?n=-^9FW%up*RmKIL)tZ;m z*qZ z^0kGgOA<(1Ko8RWZtVy62L0~olie5Ok2As%VwH%LTu;y3-fKG}U0PfE;xPo8;B741 zrZw|I+r|wpIGoe_Qyo!cWo%dz7${?F6|hWBYti&TAy%6_tU$lC?CFw`2l&<#-aI%@ z@;hm4-6{K4^K$cI)kA<2pPVfp)66R~U_*{*3-E#YiX*}1SLiz=-q$*=wR}-0;>_Hl zCx$W~~rG z?^Gmt*0u8Lyx3pAMcl+0GXfDT3K);xgCu|fEKG)X+?~+=L2{7(@1fC!y&rVb4Eu8) zluhNcf9ct})%B_Ne@W1k@A9<&RD$+Dkh+N~uG@xEpDOnetFSG{)oItGhoUP10yuo3 zeP1-6>apI$je@F@qEs|4Y!$j`Q)ToX+?Z^WW*%q$=tEu&AH3p^Z&%zfvatH88$0?f ziC@g71*V>rjY6^3bAs=gp=2L! zyxL~`_&QC)yt`T^qlEEpIqbWBZ{et4dRHpHF>*jP6&;`6(vKP4drC*GrI95lrW{`lPo z3cw45M9c_jdu+;qKs{Y2)B`N9k(4rTy8!+78?5%gHtY5LTk6s4;&~5qb18N*A&9?KJVK30Oj@ zt0~P9h6xEQ5V(m-20@sJxm7X+QzbB%jOf7*fn-fVp29vx@%01piuy88j-ZNDMbX3p zt^l$~p_2uu7UJR!D46(5y>_)tBdKsA;vgC6Do$sC9Ka7T;XQRPg%7_#hX4w8PG%p? zdp3e{c7M*i%D&=6-~{?MvX0;{aqcTPMJuTQ!6X(CKJo4eH_<_f8jHd!qN|n|NyI8B zM=0p+w-i|1^77SHk)c~4-(*COSj|}p^6`X=qjXDn3{oZ3p<4p1vJ`1DMH?O@%WCW& z>-)-?z+4Tb+Jp%ce32=se2I8QFDpYsL6a-1Bxr|Z3mKE80-j$+Pc2RX@J?}9B_;L4 zBTE}yOLfY#px*1e=)#FH=h>QFkkJNuLYaWz23L0_>jX#Y zgvTM5y&>K@b?S7E?joFyT}737i3(Ih1#4@wZ3~+E6e>x{)G55;!d^~XN6!Mn*i-^z1~+>zO7H&7ZhAaYWY!No+4G5_t! zqsNaA#DARMZ_}i;4^bhk!Z_;QN~h-eMi)4mLU#?l zeMEIGEv+Vn6TPn$j*Je&?FwMq0rcJ=W|_nnli(VG2NpBXIovI zPaT9Xx!(^Rh&(9X?`o@hX|2tbV7 zY3>|w85jyfT_G8PT^984QZWQ=4SYiGG&+j=6%f9SLC^;+UYwY+yKD68RW4TZJ#)^T zQ>pBdOpS()*&dm}OmT^YfHbtg9Dqwv94G`dziU=^$m6yYqMG)m?Lo|pOSgH7!>Ume zh2aUY`pQ8=##a2Uf6ca?am2mqRlZEKwSPQ{lm+&EWJ7OG8W5hfn?Jr0OFZJ7#^(_`X{ys(fQ{KSnJ(cHXp2lh|g+0Z`-oFsAZ!SHFq*X*a&~abe zYwTESJ10b4;*QPDyx5?yjPYc-ZwXuj?%O-pB<|H)8eeat{`u3-ysBA*l5?ZhU@mzu zX91U6BQo(Q756u+m!lO#V|0G`_G5U25dGi@SUAVVtMV)o3we5Tub0tu;FRr&+K(TLrIZHRCYCLvY>&)Q111-pNA?c;w3{($``fIm$}{UiAEu)2pm!k&+SSb|}b z5K*66naLtud-x>+Zc`qfQ!2_t{z>mS?BT#Fu5RiyG04$EiOV0^3T_731L&f{Jv9jWO={)2_=Ner=IOVKIW$9^84gPTL}lUV0t$0uUD9=@26XDU#T&Q+UCnM1uMitsg4vHOWOXQ$oBc4672I$(f?0 z%6rC-Cj%YTZ$0ER;&%e^B=S=SfNb?xW5{1FuM#J}C{{2&sHCZJ2pH<6eJ`JLm&7&I z$ewi2;d;y3BC)0t!bqWH+AN$beg1?A=hnU05*m7*hMmv2JSga9ll4vixa3cke8>&* z-Bi((6I#+=Dbqy^&BYW)-rCL)$sOfMRpgy&FU!?vSJ9OPEayHu-r{%HdwhJl!$Ytz zT#kF#q&-Z0zMmhZXe#IO12(MJ3}>r zmh^t}Ilq1Lp-c>0jYf+yX%ebItN2evN`<7XL303UW}EDad)qe6%3V^+XieVIJZEI<4Q79qVf@tVVg#+|ck~ZqTUF?vKj$hZi4c z0jJQPPmgAd-`H2@_S2_j$}d$Ci5Wl^We#if-e=!(_1mzjJ5epb%4Z9v*EQ3LjP2JVs^sMRXlzwnZ(}Srh|@3= zRz({)9?OG+rB5pl?q?;>7C`9lwLg9VABs->0smO;?euQMt&|eGwko9bC zHB=Rlj0fZ2xZbv3Sb<3VWzVT`lU-fyjrRtkHvEX4J)I~dz@gghH=*L%3c>*JsJM54?4xoDd={@_WKtSV{!|$--x;{`>^7C z<=VAqFGnt@8CBcFY13ANZAs!?Vi8-57VQz$mSpbD_VhHT1Q5uP$~G=O>LC3x4a?lj z^fvWsP|*n_QC4xKk|y_nm%bAWgCoiy^x)pz|P9pAKC(?;zWurkuoI=zv3tD_TV26X%| zeo_y0KxCB>5i>eW(8{+yRa*4J(s-8-Jx^(B>|JQ8_k&)IMQ0Wr?_IR*x8Jt?zN1%t zZsi47OPSQlj#~Lj?2y!TO{(!fyy;2}B!id0to@2I;*7tgQ&HWgM~!L+p(NR@=+ZLE z_VlSx;b3Hptwmbe_Xsx~X|P^(9?mOtyF@cAb6*_}kE=m!2p{+S&6^{2UUFQ@E-!2YH&XyW?zG=H zqf}Z_ul@D|T@r`NAtcQYH(gmi&S)^O={G*-OzWcKQRee>+3v6KTEu})66k<);BOX+6R1Z*tRa3 zf~2!J!>#o@EqF5l@6Ra5!7gj9yh#6$_Nb;`B}$M>T$q|M?|2BRXljO&XvgbG4)fBA zucc-$Xr7gzs_E|@zPp8`qFUriWN)gcCXv)O+_NR@eLKYj zD6sXWtAvlNL!LR5n$r^z;tO)u+;bDh6q}fv(;DxkKdrBw&e3=E`t{)@&a|^FwhdDT zap!Jt%f(MHiV~%Ot~X@+b}KNOcD%R~!eDJ}`j<_^+U^Bk$OPf=_t)>#X#=&~KyI`r zIyN63KTb<)e%%dEwN8^JLwU^zB+Z-5!uKR&dc3lvFBClZ>~x%E^7qth-F!->gB&Tk zQFewcTYg4)IHc_+s{KHH#=HV~4*?zLJ3Z$lFgFj`u%SO+9M-_!|2Y~d`3ow%y(ABq z0N}iTp1uN9p|#$blYk~Bvmf}*?g!@T??0UgT#^L_v(cy#5{vN1i##i`?K;eS`QnAu zlFv#Bz)h#qy@aAkyj8KDzVlVYK* zolYI;f3-VwoO4Nj11857YnI>Y)uQ3QI;9H~ zYNoQyp{3i~5#}V=>leR&-*K)f62fj6gXo1D_a#vmD94~jk1Z^}>9pPeMHW>4Cx~$m zzBkUHS8mR_tI?_V5VJ&Xw zSMUHZSy#=alW&GBxt?}96y$IQF^Tauo#g~`IqJ#t=R?qsHgEZR{>ZYe`!3F9v%&aa zjb))qZ4ZyPplY*o{5Ifddt4&D>& zt~`+8+)1l`Mdlf4t3$S~UBA9VM!weSgi#~go)a~Ey-n|8o>eoFma^^j~;lI^kE)Y35ry2d{_59W{7>WLzDIsBD z!zCu2r54^{sKE+CzuIjZHV6)R4~o;%2%gscsB~Qgg32@9uH9;AS2s#y9X-8~Y$&o6 zZ1r`_oMkAkd~1Murvq=-YbE^XVY4Q|Kc@Iv1W)W)jbl#aKCs@84LEJ$iL15=fD)rgsdl1X^eb}Uv(V=e`XLNu~ZWJ>u9gOQgm0G!jk zlRmC4fy#j=-@kiTzj14WmvsYrKj<;*eqFCs{{B>D#!fEx*a6*;x~g5-3INQ(4``WL zaMP&+Ql23TmgN(k(mKuf2w+}adta`iJo#v(Enc_p(`P4lrU1)C%CXhT4|>7enWjBw z`}!AaO+_rda?Kk3A^P?w1|<6;rQMi})oo zaCRtVas3!Y`u?-Jn`|G24N@&Ur);^3qg`UsvW@cul zR$LLg$6oOKhaLuAQz_ToI3v_vQ*Z8ao*8EFbC748?)G;vz2ePX^UA4HH!5LaVMm&3 zr-M92l1rd|&$c^=;;cTN@MAP{+1Ek0+{N0MkaaV~*2- zgeU3W-TYO-JkO$PN9CWqW_WVavABsBsxtCr(*{%XPp)Q}m#w1oJmV~Fi^s$`Y(k~9 z1e3KVbu!0Jy-T}wTsNB9UPJLUI()`v`ozG)9wlKO2JiP7lYpYLpZm(W=@9c{lq$cSGGb?ce4NBd?JISis<)&>`quEHI8@wiN$+ zz!=*4-(EPxDk8VgmGYtj`H2iv-ROE?ADnJ~^Xb2zjyv)zfIZ=FmfKz>>ubI{s_?L@ z%3~K_0_DPJ+X=Al4#AUWp6DJ4X}wuO)6(C)+dC#Z_Qy|l~Xw|>^jbe*-;RJ@&6z#|T34V8Jmh>^jWFU``eU%xUaYWf_`w@QHx zm5xF#H7`gU8W4}B_W^Z~Uq-7?u?$+w#~OGW@;})>X|K*b@j(IYjAtKPGVdApbyW$ zc@a_^ed8^#<=GC$6ijlsmJD2B%Ia~!AWvmPmPCeT9kd_n??>R|9!!6dmc*mE$Ij4i z37}@BD<0VtMnWmeFe&ad=e=2yrCX|DaZZ1igzQ_h@_33`UEG$nAYk3Pj-D|+!Q0ax zcU8@1ywu87t0r+Ut52KjDob3i0c?tL4;}M{JLHwYQI9&Y`_YSP&L#O>H|V+KEq+&9 z0?08~?4c6|L@@fW;6$iJ`49tzX8{h}?@s!~q^C}U@;(_^_BF7WlWHG4-+s&Tqtl@( zST_ys#T!`my+e3ldfZ?jGS!pP`ujF}?3u0i)Lkh(ebaZePyK-TbLXaDZf@ta-yzy> zTB_9}QUnAkT#AGG%g4t->YJ2yVj2kVtYQ6JbC~@>JMF#)ntO#Ur)^#**-mg8BI1^L z7O!57d-554f-r}wVi*!UmF~z7Uk_rU0Iqq11n2Wssw+P*|1k5w1+D+fb&k$#lW5)(6gh9Jb3GR>)Q3}Z!){~yuwtuaKJWdk3+Op zMA6yO-1gm@wpmvioQ8OS^WgcTrdLek=?8q`vk#9WRz9#}?>57msK}EF+&rVg`OZPR zDBJ1V+Un8kSY@5R?GWsEr@=_gOxx{^ZihDO+V!~EOWi)HypVPDZGau!m`yu&jMX%^?j{N=jG%HXYmXCc^42Tej@R&4`^8zWWX8Q?%(U+43|Y2~EO~!`W8q zQ(J#!Iv#z}nqgg=$JD-ct6yoGb;r3tlEwhHeGv*!A|gQt3%(fi}YQa*nP^?0#$X>z_|t!}Pc;azwQ?LAnUW zfPar&F-h3NX5Z4-cx1-SCk5@t@&uY4P)39uK~p5U49Se*&9y>*`(y1NAB3Qw`KGH9 z1|kf+Ptf48W1a+s6m!QU31@oK;lJH_HSmu`@0avAIOp&STY1sEh$V&gIX=VAjNEs1 zV5n7_gvBpEACCY1WxvYhgG?Uq6EboQzJ|3{U5RsAhrRH{*~ko6P6+{6JA1vbOD`sG z1er-y36hSEjy^K3%xD5Gw(tkR$3_ewqd~;{5&*~fE3K$c<>BGh{ll$g|B}QFNpGjX zlkB@ovqsP0MFLw`w);)Z;o&D#{h6UA)(L-tVTS z%hSCMk-$!M3U189j-LGxW&K<%-9tEg9?WpTsRonrrMAvLI?)LKnl)hdV^QCMwY+ z#Hx+lNqQ08vY|${X`AVC1?j}Q_yAxe<(jt3>ZHYYM4bc7=q*9yw8xh?C|c*;*G%iK ztZA>XQ7+rK(I(uhTh}4o%5Hflxg6Nl;rbj)_t9Pp%fBcIkw5TB>|Yt{gzjsWIldjy zJLZ^gGwX#Gd0!t}*02OcsO(`f-~hpc-ND_>GQKoChN=dMzj+0~TD2K7UYaFuJk&R| z6%5a3!EpBxXd=0ay0X%#sjdDl(9P0TIqOf2=Ur;Yve#3#XGg$71N~{ zAH(0(?%#8Kp}SW3@7P`uzds_|*c{)npTYs366sB0JBKPJeLl@_$L@WJ`Qlpp4AJj4eDu8RGZV)2=-k<$Td`B8X1*z2QAx+L8DOjW zl$qa+dQI}zUd=(fT-AIfmC-=Q%^@LGKt=GnS(y~sK8m4AVLQBx-q-w@n!+k_%<=s< zHeOeU*bnQ@ghWVt?Mp7_dyK7|k)v|9sy9t@@DoMjt>*8PEx`t$s`dj3LaWPVWBh&{OfL0mlMCjp;GEz z;@R{kQ79}qvhon)v4Eohb_3Y#n)O@k_-f|0N7IX~t@_Q_e0{g69-8<;kcHHip7R?9 zj%xU+Rm2yxB{JO5BwM5Su}#`1Blo^Fo+mHOcKBA1xECTNgeBKM{V*z~^?S#;bB`&{ z_ivwCGkI!-ZCdG>=P~6?-%uQ!$Ix!qDzAUJM~h_6c_jWOrryv`BxFK*x9&ip_>-t| z8P4;V9_hS{P(eVJKHv6E`cn>hn0rzg&5P!B<~+H;x)-~zNK7f&E+A`K`D`FuFLB4K zM1MFS%C2Us&N)0utI>7HR9neWCckuPo#Cf!9DaeFmZTc_A)Zns zT?&9lvWh{$Q{k0_GZDDjbD-H81`$30XcBQXY)WS^(R7P#urjhM(PTpNKcw%L@kL0e zhlb2@Cy%P<(l0&5!U9|<@fqsf{^<_e7i1q`SL74$k0@Nx5ZqE*XmwD)_X*RJ#56W` zmd@x`Ve?zc>4I6?pGLF=fsL4LfY`O0bxiNm?i5j07gJLuEVhl$tg~F6Z|P->x1s-g zEZG*Q?X0}oedXy(hta63E#y8=E`MB=+dr6XWFkVc_zqj_I}BZ?Nc`Vq;0TM?2Uvch z69^f_4@3_rf*T0SBSB$pek*F&GJ;Tma;YWTCR9+|J_`E?PV5|PtX`SN!4 z^i`{pj*U)Ux&$A$s5fLU*odu$C4Dxtyf?BoKF&n?`)@OIU6PgcTt<*jp=E=G9~_dd#JLNKj-9CY8`*jt7eODu9%&oCaGp z*%KJjGjrJBevHO?)8{m^1VsDI+Ng2!Vh)+U1_qWHhhmneVqzhtQ%P#dws2m2;WK?S z3Kq7u9}{mH(ITQ2>A62bSjh{M7bH{~uG*~V(Ld-dext!tu#%#9BD?btD=RZlL0O53 ziG9QmCPoO>y^PqTS!_;rz7SvW@q_7e!Nt+=w~K1pK6*ywCGWQ+DV%y)3*MHL$b1D+ zmC#Pgwd4gdKaHqFr}k@DZ(W&Og@Eb6yG0Rq9&#EWUzO)*f`^C8qtsU??(O5PEk7lK zD$t6agC%9tIFIE1D2s*9P`&K1|CfzUuG%qmFgL>$ipM;4o=d0+0nAE!`?x)d6=tl!Its-O`on$AKtD{tWm_` zKt_58_JRkr1S{xSC?t#zbp;5MPfopkiEH8YIu*$lT$v-yj3lK( zJ^|=FB+KbCTM0{irLV8AS=qtSvCUwECHYr!X!@5s=h0`^Fpd&ueA{8lR$q4i$sn?T z3=$)J;J~zvt*VOaL^A6UgUa!W2=EdwydGYB;_3Avleb8kA6^+Dda*r8*(aH|0By$U zOH~g@6Hej$6uk?@x6Jc_yG;okK@TLi7zY}_20K~!(yz*A@igR~(!aqrLzu=Y@Z&wU z5mv%lvQfQ7K>4yyYMTJ>sArOSNKr52T2bsmSju!WfH<-KSx4E)pcMKoyI1QXsGaGI zH0!q=)}Ql%HD_~RL{sKkXn9-i_<2TElt-du1z@{8P1(I<70)K#m@`*wG~Bsqm-ysT zf`@C&VU_X3wQ-NNY3Qa=>|$7t4^M$DHj7Bxh?s7)>;ucXZI_mU$*i`h*0NSaV9$94p(_wZ11J9M*;-*aq@C3LjRJCLUKjJGkT zpdZ&o#$h#TuqC7F^OkLH$e#gXO}wo#iSkHC-1Q<=SM z^Or^MLCh{vj&RrOP!jl=NtpFSOfG6|#oe|zvUQqr?5ja-16L8#q!fMWhuA=(IM9>| zeayA`CR_&lzy$FYjxYuENJgcRda!bgAy`5RHT_%0u1K+Xk*)F;DH6CwCh~fB6Bi!e zH~-L~!?jCpyV$0k)v!N#Vs2cly?jg+q^xun|=x zzaitO)bYKNV*INU(xtwUOE6|95Pf0zpB=Y3GzH{xrB-ca9mx>QLEUIHeO4GuE;`7g z&u0(4I&Vb-i+AcR%Ukv3Ir0q%unfrE_I5w63W=ok$y@pB-Fy35-a8t9wA>H_)0@iB zRI6Zpo-YX>WAW%q)B;I50l6;ex7pqa0f|gv7NX)+g?p(3o$z4+cZ|jiq8X`6R@>ag7;xIO^G;*oS6(Y>|x^es;Pa}yVVs_StS-68b~^-hFS@**IZv;c^-56 zR`i(TZSlW+*uUw#gfE8qD37i&YiHv9L#3G)5d@8qu?e2xUX&X*N__GrzN zRuBGs0mojCwP*kN(ubD6sowLCcUjxn;l_e0JLL`KN28nfsr28x&soW1W)kJ=yiHrT zR!e6+=o#%Z zlV9acFvn2EC0{8s%+}Xd99#j^;AnZoz@e|b|OZNY;N1dOq5$L8j$|LuQZ-E*>T|VuzPCVgTeS5a-ZOODo*d&NTZPen$MTHYA5 z@I;S_4_jT=cK(p}cDJ5}Hxe1nc%g&PzwDu~L^hg=_{+}==d;XWM2VMj`Eu2p=>Mvz z0Ld#eVNt|E_#=p}let3a%R)WROlEvu6vSM0J$NWB$cmI%w=|0KBlu^*;3dE@I-iTLoufGXGU|4nVOFgIf41&~!+(2*IgzeeY+Q1d+)ACs1-8WkEW`#S~L4yEo5_ZO{F| z!lX%RFlPwIn+EccAtRI#4g2LW4TOiZQiN@QMB#>8@1e#K8|idYT7yPpC+gJH6hMjx z=sZ_~(FPhS{ZK2`5m#>D31^sIl=FsPno=SYAt5i05Fv%ba}L;DdUxCP&M^+H@B`t8 z1iqFL@;q)1>Un#AQ-YElH~OrHrVpf{6&>BZdrc_t(#yX7SE0_II-QT{)Y)CBw9X^k z66M$DlJo4$<}Zf?baqB7vR0h3bc{!i9$kiZqRvk}n=dwMvm0VL5Mhx3B3xmMW`QB| zVq;FY&Q_?r5Q?dnAhH>VU<+`_FKHSl`_`XlH00`6;n|@!wJg>tp@+d9d5%#tFyMkE zoJ@~%xt?%K_onTOvF;KH1q%Vmxr*j5<<6ak^yxCB6>wQY$2q8yXtq#aX&?m=O%~)6 z=R%4iGKhcF>uIPs>wICk#cstBCKJ?sOM2#FQliva2{A5m3_<=dLurYV6s0;2vIe0R z!xyf@B29N(gJp!0@S$`mq?Ll!*Tw^lwK3d!Y{WKY`Qd=$WP44xy!J!0uWoXMh)$Z20A+CJWo0Z zP5>}H2|^M5mS|B3EjA#wQW|;D{Lr?wY>8T;nY?;&u_WYSziTKugzpL~d2I>rWvts8 zTAr0f+ev!mKde5U0XoY%K5b+UhFVuwSDVF)l|G{Wq10dLMfnp&&+f@1V`~`7tclih zy}b{7Qv&I+;UFNuinYey9|gw{qb-?ih$7VzJ;#@iZ@ZyQp16Z=8jL$#l2@s^EhB6h zNZ1JZUOJsYfWJPmr#$Co!0Kvz^QY0jEKx}Gd-CW}%YD5_ubR^3M~lIO12eM7O>?5P z(ANI%b!FzM&HhQB({SNZ&yDrk+upFDiny9TmunpUT`k6f4|rt17QqeJZY;n48VWR~U`#l85VZ2yCx zGxnmPvSr(ex_S0w#^&?%TAM&Xr@Q>A#Zsb1nVX+L!NsjLH{WL)H604}$*WhxAmiJF zTG>Y~E})JXh#IsTgvXkopaZNskYsHGotnhLZoBcdo@L-PgZD8f`EyFLdiDF+#-AL;PpSXK&iw@yq_z<7(O-UnX(Z{I`VC_Y;=uRks*N#SaQ2{nl&3i zB){Bs60H6GMFNFPSY&&ri5($Wx1P<_M=~N;J~X?S=ufB&zb&6AyA$-AA{yeeXs1_% zW`h=B>`D@u0?rwaa<$7jjoFj8{R1A8`-EL}R$m;>uVgHuGJbQtM_%(DJw`XWD#NFLxqVQR=1pd_@EoI7*I5!j)$k1DFp6C` z^cu}8emuo%h4a8pzk8&GSR7~luAG*1CUqgOkK{~%S3hL3>;SIkMp!d2T zU4Yq~8|?o;-*n`DoaXS9GXI3dCLjXdU{30kD+xxBYpHx4G0=%UA5lxAqeB^Ejcstf zjF$&GU~J^M#D(O4(?QkCA5Jgz1`P%|JJm>e9RR-}mSz?ejiaOE$a%l=r!sXO(&zig zCe=A;CE53--;+xMil$8h15i__eqW&U6xv~CAFYM-5DHZqcTnt==?x81cVVWYS(tE( z{L$w`P@}u^XQz=V<&b_IY_{*aye4U$C&Os%V#hZHKboEusZABY+=Gsy~*dbmqB0`$Dg1n@Mg&PDd^6XsIT@F z0*<{UZbanwa^0{2NpL+4ccUgvUf%bxd^E;oN%ZhhgRu!W<#7Cl8_X|cGV3z-#K1dB z`r*OE30K)RtSX-a6=?M?+iKAg#Qf$yxhxq7CGub9gd3) zGJik@OaWQQq9j<SQ0az9u}%h69B!R_^nd?Yw9-!DDt#G{v3wW`8U8WzBi| z>yJY0Z0+I*JeTex5}LK^)>*hkj*UM&J&dPP%ArRUFRR{d(|NA%`PzCwiW8np^l76j2nHVsNHEcqn0Vd$@iknWK(R9X_$? za36WI)Vnl?tW@W@PQG7ubVd>(3lIg{3jBCBKHc&(b(B|vvvMaUqI}Fr9@h2(7y0cI z2RVP6!Gov-gzxd zOq_If}0g0TjIT+YS*)w=bonsBg{B8C9V5dMvfGkx?D7OvLOBaHC3> ziSS6FL1F91OvVPlw|Y5zMOIIvt+Ajtg8%XutaRP}CHwG!xa`hc^xF#=;Y!!uG33Vb zlG~ZFql_E&(c{^gu4F}SeBQQ_b#b3`g#1TC$qc3}T9YvfLXRoULrjI3ZO-h3cV_3cxR=%XQ7*K~tyhe{MEpFY7mD$O!5nlH@vmPK+E8`k|a#wHCF& zB<_Q71QLFQfx>L>0?poejZeRRJtIh6pyZ6mKK5u(-kP#z*Sj9cNqwKYsHj1Lsk1Z$ z;FOZEi^oX1eTmZM^wM=2y~)EOBK7|L#9Pm7dnYtz7Z8V+7?3Dj1)Bq)R_|UKJogo< z3RQ8Q)3`T&OSjh! z06_2*@20IrH$8xwkOYAC-6lE1tUlbiB_ep|B6nAtsxH~&>cF9UJ!Cqw_g)HZNoEnK zgu5whP^3$8KTJRC=x$!zAIWxPwIn+5aN&t~1IMQnItnFZO|P~;cMc=;EYwOf&Z%R< zF2hr?!58Pay>u(|vZ}B5`9(o?lrHC;;pa0Qip_U~+|4+&H+reS0Ojrrs{EwiO})RM zznjaO22*Cu8bAF+r7L>ch~l+K~^yzZrmm96R4tLmbxMaG^Et2rHDwOgs3mY|VJP9#Vs4+bGO}n7dd$NAVEY=`g~Gr1QwK< zM%n2{j_vE^EkClE;#ud@u-P^g30lq}g~R~&zdEQY2Ss(b+3klHvZtpjnmeZM+y7v! zUr}DNvCo}8fWnAD%$|)M?X&NvMQlZkkz9)aXb*jLN-_c;;gwAW6V-OjQEoENR;%s7 zhl<>PYs?O>o)@*S*4_!J`zCx=y}k5-YL`SbJ9WtmhL~!!G_>0fmgX0A1U2X0Q}Z0t z^G`S_alhb04voBUXvxmgI$JhVGCUTIVmZ%+j8#_0AN)6J*`g>||5V<$t3KBG9?sf; z{Uc^{Wxt`#({exX<6D_Z8DSM_4I*IXQD#cXeAG=Nt;hQIYeIaE_S94?`@gGo=5UwT z7HvkJundTKdR^JE7ex#dhv~{f|LTl*JkKF&aZOOM9)%!Jc>#4kavaM59f+g{k1hoQ zE6X&{HA`L}L%iF(r7%LsvJ_-L z^!wO9WEb1xgly#>*yatMuh`0E)Dz^3ITIj!Bt{vB&};9bH)ZuJGp-=iLunaSUUi8YP48D6hdtu}IbdCs8H z&FSC-%S8nS-(16V1wMdfUu-5s*w%=!jXFNiHa*|&-H2sK09%lX#9Gz)`f8IAeS`pR z--rg!VXO#? zd%&jlMq#=o=tC#QAuWb0F&mur7pp0dA5jmj$X=9SM?TbBbO=NH%?G~}V=qLPOv4hh zljNB=9+|N0$PK4wlnd%Qh#mg46zDr zJb|G+>TQ)8%fjJ!k-%iYxN4F$fn7-k-XRctxj4ziuvM#8Oiz@SW-DV=lfD!Wm7IJr z-x4f*WPQ@&swzzBeHIp1VLve_zW%bom=WK3M~NvKxT@B9z%U7qd$>-?IxSIe?Drxd z6VBW+?;V|pOqZsSx`ZxYW|wjzO+d?+;(z?`SF3<&dpzHFREa#0kF**j0{CIw#0#s! zp;0c)dW;kVY1&VuK%r%lMe^p7u8VxV6cetF43J=csfx8i-K^+Y>GQJ)C+X>W=P$_C7@=PA{48vD%do#q*Ev*t2fkQK3 zxBI@i#l4&=yWpPh7B!1GT#DZRWw4g9&z;`fDQ*78ZDi<{!l&G`QQk;=HzW7T_o>bzu03 z6>}q^JZR9q(_xephknf@Q9?vD{<~ar$<_o(n?oVdr6Nh$k&zWB43z>!W%XsqMmzS3 zRH>_ZnnJFX!;Kv65s2yzT)U6X}WsN5M&T^T_=&yj|>lMn!Al7wONq zS!&O9yvAcXdidX%Hz%gJx}GQ5i+G;ZusLXcWD(Z23D28qtmW$Uich9w_3F5(vqN{O z*w8IW3KZQvHr_hGHXZs{l^8`o_p#XxHYw4=?BV%7L9imd1Ld=cWC;0)L_oqy@oWvG z1%LSLSv#MB@6PRiu^G-r$Kz|XSQSx4sJ z*0iO2YE~@$R<$R-uKsbXsb<)}NF)7Y^?>pyv)e|j6`|ASQfpS;gMy^Zppkc5A8-TvwO{L}mV)7vO~ssHZ&{BOO_KfR42 zZOs3i^StuXGbQ0K;??p^hr$6-@y>ORH407Z)KLgid7rzzW2P4VV3l}%m6vHHmA5dk z%D2Bd8mwP9q-XNVb^m%&RQLalx&7lu|M4%cHd48MU{u@9hHk+{g{{Rv$RiXd@ literal 109711 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