Lecture #1 Introduction to Python Introduction Python Is a High-Level

Total Page:16

File Type:pdf, Size:1020Kb

Lecture #1 Introduction to Python Introduction Python Is a High-Level Lecture #1 Introduction to Python Introduction Python is a high-level general-purpose programming language, which means it is a language designed to be used for writing software in a wide variety of application domains. It is an object-oriented language and is described by the 2019 IEEE Spectrum as an easy-to-use programming language. In the field of cybersecurity, Python has earned a top position and shows a tendency to quickly outperform other languages. Microsoft has included Python in its Visual Studio, known as the Microsoft Python extension. Python, in a nutshell, is a highly modularized language, which means it supports a large number of standard libraries. Each of the modules is specially developed to support a different programming task such as connecting to web servers, searching text with regular expressions, reading and modifying files, system administration, and cybersecurity. Python is a free, open source language maintained by the Python Software Foundation. Its packages and source codes are available for download the at http://www.python.org website. It is “free” in following two senses: cost and freedom. • Cost: It does not cost anything to download or use Python, or to include it in your application. • Freedom: Python can also be freely modified and re-distributed, because it is available under an open source license although the language is copyrighted. The latest generation of Python is Python 3. There has been some discussions about the future Python 4. However, nothing is released by Python.org as of the day this lecture is written. This lecture and all its sample codes are designed based on Python 3. Getting Python Most Windows operating system users starts the learning journey with downloading and installing the Python interpreter which is a program that reads Python codes and converts the Python codes to machine codes at the runtime. However, the Python codes will remain being a text-based contents stored in a text file. Python source codes Python intepreter Operating system Linux users probably do not need to go through the installation process, because most Linux distributions come with Python pre-installed. Some Linux distributions provide Python 2, but are readily for upgrading to Python 3. Mac OS X 10.8 comes with Python 2.7 pre-installed, while Microsoft Windows operating systems do not have Python pre-installed. With that being said, some Linux and Mac OS users might have to upgrade from Python 2.7 to Python 3. A later section will provide some guidelines for Linux users. Although Mac OS is not a supported platform for this course, students who choose to use Mac OS can visit the https://docs.python.org/3/using/mac.html site for details about installation and upgrading of Python. Microsoft Windows users can download the Python package from many sources including: • Python.org (http://python.org/download/). As of July 2020, the latest stable release is Python 3.8.3, which was released on 13 May 2020. The file name is python- Python Programming – Penniel P. Wu, PhD. 1 3.8.3.exe for Microsoft Windows users. By the way, this is the primary source, and the entire Python platform can be installed in a USB drive. • ActivePython (http://www.activestate.com/activepython/downloads). • Portable Python (http://www.portablepython.com/). This is a Python package preconfigured to run directly from any USB storage device, enabling users to have, at any time, a portable programming environment. For Windows users, the instructor recommends students to install the Python package in a USB drive for the sake of portability. For Linux users, the instructor suggests using a “Live USB” version of Linux (e.g. such as Ubuntu). This course, however, does not suggest students to use Mac OS. Launch the An “interpreter” of a programming language is a program that reads and converts a sequence python of instructions in a “script” (a text file containing the source codes) into machine codes for the interpreter computer to execute the instructions on the fly. One major difference between Python and C, C++, Java, and C# are that Python does not use “compiler”. A compiler is a program designed to read and convert the source code into machine language to produce an individually executable program (such as those of “.ext”). An “interpreter” only reads the script file and convert the source codes to machine codes at the runtime, but it does not produce any individually executable program. Python relies on the interpreter to effectively read and convert the source code while a Python program is called for execution. In other words, a Python script is the program. Only when the Python script is present, the program is ready to be called for execution. Python C, C++, Java, and C# Source Interpreter Source Compiler Executable Code Code Output Executable Output On the C, C++, Java, and C# side, once compiled, the source code is no longer needed. The compiled code is the program. On the Python side, the source code (script) is the only file needed to be called for execution. Another benefit of using interpreter (instead of compiler) is that individual statement (typically is only one single line) can be interpreted to produce immediate result, without the need of compilation as shown below. During the first few lectures, the lecture notes will guide students through how to use the Python interpreter to execute individual Python statements before organizing them as a Python script. >>> print("Hello, World!") Hello, World! The Python interpreter is a console application, which means it only runs in a command-line interface (CLI) environment such as the “Command Prompt” of a Windows operating system or a terminal emulator of the Linux operating system, as shown below. Windows Command Prompt Terminal emulator Python Programming – Penniel P. Wu, PhD. 2 The prompt (or shell prompt) is defaulted to display the home drive (e.g. “C:” of Microsoft Windows or “/” of Linux) and the home directory (the directory the user is defaulted to use by the system settings). The following is a sample prompt, in which “C” is the drive name, and “C:\Users\D0213657” is the home directory, while “~” home directory of Linux. The greater than sign (>) is the symbol of prompt for Windows operating system, while the dollar sign ($) or pound sign (#) is the shell prompt for Linux. In a nutshell, the dollar sign ($) is for regular Linux user, while the pound (#) sign is for the superuser (such as “root”). Microsoft Windows Linux C:\Users\D02132657> [liveuser@localhost ~]$ By typing cd \ (or cd / in Linux) and press [Enter] in the prompt, the “presently working directory” changes to the root (\) directory which is typically represented by a letter (such as “C”) in the Windows OS and a “/” in Linux, as illustrated below. Microsoft Windows Linux C:\Users\D02132657>cd \ [liveuser@localhost ~]$ cd / [liveuser@localhost /]$ C:\> As stated previously, most Linux distributions come with Python preinstalled and pre- configured. Ubuntu, for example, is one of the most popular distributions of Linux. Python 3.6 is installed on all stable release of Ubuntu 14.04 or later. In a Linux machine, the Python interpreter is usually installed in the “/usr/local/bin/” directory of the file system. In a Python 3 pre-installed Linux environment, Linux users can simply type python3 and press [Enter] in the shell prompt to launch Python. Once launched, the Python shell (“>>>”), as shown below, will appear. [Details about using Python 3 in Linux platform are available at the https://docs.python.org/3/tutorial/interpreter.html site.] [liveuser@localhost ~]$ python3 Python 3.8 (default, Sep 16 2019, 09:25:04) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Interestingly, users of Microsoft Windows operating systems need to add the path of the Python directory in the “PATH” environment variable in order for the operating systems to be able to locate the Python interpreter. The “PATH” variable is an operating systems variable that specifies a set of directories where executable programs are located. By default, the path to Python interpreter such as “C:\Python\” is not added to the “PATH” environment variable. The following demonstrates how to manually configure the path settings (assuming the path is “C:\python\”). By the way, environment variables in Windows are denoted with moduli surrounding the name; therefore, the value of the “PATH” variable is denoted by “%PATH%”. C:\>PATH = %PATH%;C:\python; Python Programming – Penniel P. Wu, PhD. 3 The following is another way to set the path. It uses the DOS “set” command. C:\>set path=%path%;C:\python; After the path setting, Microsoft Windows user can open the Command Prompt, and then type python.exe (or simply python) and press [Enter] to launch the Python interpreter. If the path setting went successfully, the following (or similar) message will appear. C:\>Users\D00182312>python Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> It is necessary to note that “>>>” is the Python prompt. It is the intermediary between the Python programmer and the Python interpreter. The prompt takes a Python statement (which consists of Python commands, arguments, expressions, or a combination of them), interprets the Python statement, and then produce the output. The following is a sample Python statement. >>> print("Hello World!") The given Python statement will be temporarily store in the memory (such as DRAMs). The programmer must press the [Enter] key to notify the shell prompt to pass the given Python statement to the Python interpreter for execution.
Recommended publications
  • The Linux Kernel Module Programming Guide
    The Linux Kernel Module Programming Guide Peter Jay Salzman Michael Burian Ori Pomerantz Copyright © 2001 Peter Jay Salzman 2007−05−18 ver 2.6.4 The Linux Kernel Module Programming Guide is a free book; you may reproduce and/or modify it under the terms of the Open Software License, version 1.1. You can obtain a copy of this license at http://opensource.org/licenses/osl.php. This book is distributed in the hope it will be useful, but without any warranty, without even the implied warranty of merchantability or fitness for a particular purpose. The author encourages wide distribution of this book for personal or commercial use, provided the above copyright notice remains intact and the method adheres to the provisions of the Open Software License. In summary, you may copy and distribute this book free of charge or for a profit. No explicit permission is required from the author for reproduction of this book in any medium, physical or electronic. Derivative works and translations of this document must be placed under the Open Software License, and the original copyright notice must remain intact. If you have contributed new material to this book, you must make the material and source code available for your revisions. Please make revisions and updates available directly to the document maintainer, Peter Jay Salzman <[email protected]>. This will allow for the merging of updates and provide consistent revisions to the Linux community. If you publish or distribute this book commercially, donations, royalties, and/or printed copies are greatly appreciated by the author and the Linux Documentation Project (LDP).
    [Show full text]
  • Writing Your First Linux Kernel Module
    Writing your first Linux kernel module Praktikum Kernel Programming University of Hamburg Scientific Computing Winter semester 2014/2015 Outline ● Before you start ● Hello world module ● Compile, load and unload ● User space VS. kernel space programing ● Summary Before you start ● Define your module’s goal ● Define your module behaviour ● Know your hardware specifications ○ If you are building a device driver you should have the manual ● Documentation ○ /usr/src/linux/Documentation ○ make { htmldocs | psdocs | pdfdocks | rtfdocks } ○ /usr/src/linux/Documentation/DocBook Role of the device driver ● Software layer between application and device “black boxes” ○ Offer abstraction ■ Make hardware available to users ○ Hide complexity ■ User does not need to know their implementation ● Provide mechanism not policy ○ Mechanism ■ Providing the flexibility and the ability the device supports ○ Policy ■ Controlling how these capabilities are being used Role of the device driver ● Policy-free characteristics ○ Synchronous and asynchronous operations ○ Exploit the full capabilities of the hardware ○ Often a client library is provided as well ■ Provides capabilities that do not need to be implemented inside the module Outline ● Before you start ● Hello world module ● Compile, load and unload ● User space VS. kernel space programing ● Summary Hello world module /* header files */ #include <linux/module.h> #include <linux/init.h> /* the initialization function */ /* the shutdown function */ static int __init hello_init(void) { static void __exit hello_exit(void)
    [Show full text]
  • Name Synopsis Description
    Perl version 5.10.0 documentation - vmsish NAME vmsish - Perl pragma to control VMS-specific language features SYNOPSIS use vmsish; use vmsish 'status';# or '$?' use vmsish 'exit'; use vmsish 'time'; use vmsish 'hushed'; no vmsish 'hushed'; vmsish::hushed($hush); use vmsish; no vmsish 'time'; DESCRIPTION If no import list is supplied, all possible VMS-specific features areassumed. Currently, there are four VMS-specific features available:'status' (a.k.a '$?'), 'exit', 'time' and 'hushed'. If you're not running VMS, this module does nothing. vmsish status This makes $? and system return the native VMS exit statusinstead of emulating the POSIX exit status. vmsish exit This makes exit 1 produce a successful exit (with status SS$_NORMAL),instead of emulating UNIX exit(), which considers exit 1 to indicatean error. As with the CRTL's exit() function, exit 0 is also mappedto an exit status of SS$_NORMAL, and any other argument to exit() isused directly as Perl's exit status. vmsish time This makes all times relative to the local time zone, instead of thedefault of Universal Time (a.k.a Greenwich Mean Time, or GMT). vmsish hushed This suppresses printing of VMS status messages to SYS$OUTPUT andSYS$ERROR if Perl terminates with an error status. and allowsprograms that are expecting "unix-style" Perl to avoid having to parseVMS error messages. It does not suppress any messages from Perlitself, just the messages generated by DCL after Perl exits. The DCLsymbol $STATUS will still have the termination status, but with ahigh-order bit set: EXAMPLE:$ perl -e"exit 44;" Non-hushed error exit%SYSTEM-F-ABORT, abort DCL message$ show sym $STATUS$STATUS == "%X0000002C" $ perl -e"use vmsish qw(hushed); exit 44;" Hushed error exit $ show sym $STATUS $STATUS == "%X1000002C" The 'hushed' flag has a global scope during compilation: the exit() ordie() commands that are compiled after 'vmsish hushed' will be hushedwhen they are executed.
    [Show full text]
  • A Concurrent PASCAL Compiler for Minicomputers
    512 Appendix A DIFFERENCES BETWEEN UCSD'S PASCAL AND STANDARD PASCAL The PASCAL language used in this book contains most of the features described by K. Jensen and N. Wirth in PASCAL User Manual and Report, Springer Verlag, 1975. We refer to the PASCAL defined by Jensen and Wirth as "Standard" PASCAL, because of its widespread acceptance even though no international standard for the language has yet been established. The PASCAL used in this book has been implemented at University of California San Diego (UCSD) in a complete software system for use on a variety of small stand-alone microcomputers. This will be referred to as "UCSD PASCAL", which differs from the standard by a small number of omissions, a very small number of alterations, and several extensions. This appendix provides a very brief summary Of these differences. Only the PASCAL constructs used within this book will be mentioned herein. Documents are available from the author's group at UCSD describing UCSD PASCAL in detail. 1. CASE Statements Jensen & Wirth state that if there is no label equal to the value of the case statement selector, then the result of the case statement is undefined. UCSD PASCAL treats this situation by leaving the case statement normally with no action being taken. 2. Comments In UCSD PASCAL, a comment appears between the delimiting symbols "(*" and "*)". If the opening delimiter is followed immediately by a dollar sign, as in "(*$", then the remainder of the comment is treated as a directive to the compiler. The only compiler directive mentioned in this book is (*$G+*), which tells the compiler to allow the use of GOTO statements.
    [Show full text]
  • Windows BATCH Scripting Loops
    Windows BATCH Scripting_Loops Table of Contents Loops ............................................................................................................................................... 2 Loops Multiple File Example ........................................................................................................... 5 Loops Directory Example ................................................................................................................ 8 Loops Multiple Lines in a File Example ........................................................................................... 9 Loops Running a Command Multiple Times ................................................................................. 10 For Loops ....................................................................................................................................... 11 Tokenizing Loop Example -1 ........................................................................................................ 13 Tokenizing Loop Example -2 ........................................................................................................ 16 Notices .......................................................................................................................................... 17 Page 1 of 17 Loops Loops A core component of scripts – allow one thing many times Windows batch scripts use “FOR – DO” and has 4 different constructs depending on which switches are used with “FOR” • Multiple Files – perform one command on each file FOR %a
    [Show full text]
  • Shell Code for Beginners
    Shell Code For Beginners Beenu Arora Site: www.BeenuArora.com Email: [email protected] ################################################################ # .___ __ _______ .___ # # __| _/____ _______| | __ ____ \ _ \ __| _/____ # # / __ |\__ \\_ __ \ |/ // ___\/ /_\ \ / __ |/ __ \ # # / /_/ | / __ \| | \/ <\ \___\ \_/ \/ /_/ \ ___/ # # \____ |(______/__| |__|_ \\_____>\_____ /\_____|\____\ # # \/ \/ \/ # # ___________ ______ _ __ # # _/ ___\_ __ \_/ __ \ \/ \/ / # # \ \___| | \/\ ___/\ / # # \___ >__| \___ >\/\_/ # # est.2007 \/ \/ forum.darkc0de.com # ################################################################ What is a shell Code? Shellcode is defined as a set of instructions injected and then executed by an exploited program. Shellcode is used to directly manipulate registers and the functionality of a exploited program. We can of course write shell codes in the high level language but would let you know later why they might not work for some cases, so assembly language is preferred for this. I would take an clean example of the exit() syscall used for exiting from a program. Many of you might be wondered to see why this being used is, the reason is the newer kernel don’t allow anymore the code execution from the stack so we have to use some C library wrapper or libc (responsible for providing us the malloc function). Usage at darker site: We write shellcode because we want the target program to function in a manner other than what was intended by the designer. One way to manipulate the program is to force it to make a system call or syscall. System calls in Linux are accomplished via software interrupts and are called with the int 0x80 instruction.
    [Show full text]
  • Chapter 10 Introduction to Batch Files
    Instructor’s Manual Chapter 10 Lecture Notes Introduction to Batch Files Chapter 10 Introduction to Batch Files LEARNING OBJECTIVES 1. Compare and contrast batch and interactive processing. 2. Explain how batch files work. 3. Explain the purpose and function of the REM, ECHO, and PAUSE commands. 4. Explain how to stop or interrupt the batch file process. 5. Explain the function and use of replaceable parameters in batch files. 6. Explain the function of pipes, filters, and redirection in batch files. STUDENT OUTCOMES 1. Use Edit to write batch files. 2. Use COPY CON to write batch files. 3. Write and execute a simple batch file. 4. Write a batch file to load an application program. 5. Use the REM, PAUSE, and ECHO commands in batch files. 6. Terminate a batch file while it is executing. 7. Write batch files using replaceable parameters. 8. Write a batch file using pipes, filters, and redirection. CHAPTER SUMMARY 1. Batch processing means running a series of instructions without interruption. 2. Interactive processing allows the user to interface directly with the computer and update records immediately. 3. Batch files allow a user to put together a string of commands and execute them with one command. 4. Batch files must have the .BAT or .CMD file extension. 5. Windows looks first internally for a command, then for a .COM files extension, then for a .EXE file extension, and finally for a .BAT or .CMD file extension. 6. Edit is a full-screen text editor used to write batch files. 7. A word processor, if it has a means to save files in ASCII, can be used to write batch files.
    [Show full text]
  • An Introduction to Python
    An Introduction to Python Day 1 Simon Mitchell [email protected] Why Python? * Clear code * Great beginner language * Powerful text manipulation * Wrangle large data files * Great compliment to other languages * Large user group * Supports many advanced features Warning: Spacing is important! Wrong: Error: Correct: No Error: Open A Terminal * Open a terminal: * Mac: cmd + space then type terminal and press enter * Windows: Start -> Program Files -> Accessories -> Command Prompt. * Type “python” (no quotes). Exit() to exit python. This is python Hello World Launch python Call the built in function print, which displays whatever comes after the command. Put any message in quotes after the print command. The command has finished and python is ready for the next command. >>> means tell me what to do now! Getting help - interactive Getting help – single command But usually just Google! If you got stuck on something, someone else probably has. Let’s get programming - Variables Set a variable with equals Display a variable by typing its name Variables can be text, numbers, boolean (True/ False) and many more things. Capitalization is important for True/ False Numeric Operators Add + Subtract – Multiply * Divide / Power ** Modulo (remainder) % Reassigning Variables Reassign with equals. (Same as assigning) ????? Warning! In some version of python division might not do what you expect. Integer division gives an integer result. Types of number Integer: Plus and minus. No decimal points or commas Float: Decimal points or scientific notation okay. 2e-2 = 2 x 10-2 Working With Numbers What is the minimum of these numbers: What is the maximum of these numbers: What type of variable is this? Remember that str(anything) makes that variable into a string: Working With Text Single or double quotes.
    [Show full text]
  • Learning Objectives ECHO Commands. Command. 10. Explain
    . SA Learning Objectives After completing this chapter you will be able to: 1. List commands used in batch files. 2. List and explain batch file rules. 3. Use a batch file with a shortcut. 3. Explore the function of the REM, 4. Use the SHIFT command to move param- ECHO commands. eters. 4. Explain the use of batch files with shortcuts. 5. Use the IF command with strings for condi- 5. Explain the purpose and function of the tional processing. GOTO command. 6. Test for null values in a batch file. 6. Explain the purpose and function of the 7. Use the IF EXIST /IF SHIFT command. test for the existence of a file or a 7. Explain the purpose and function of the IF subdirectory. command. 8. Use the SET command. 8. Explain the purpose and function of the IF 9. Use the environment and environmental EXIST /IF variables in batch files. 9. Explain the purpose and function of the IF 10. Use the IF ERRORLEVEL command ERRORLEVEL command. XCOpy to write a batch file for testing exit 10. Explain the purpose and function of writing codes. programs. 11. Use the FOR...IN...OO command for repeti- 11. Explain the purpose and function of the tive processing. environment and environmental variables. 12. Use the CALL command in a batch file. 12. Explain the use of the SET command. 13. Explain the purpose and function of the Chapter Overview FOR...IN...OO command. You learned in Chapter 10 how to write simple 14. Explain the purpose and function of the batch files and use replaceable parameters.
    [Show full text]
  • Starting a Batch File Example
    LA Solutions ShellBatch.doc Starting a Batch File from MicroStation There have been a couple of questions in the MicroStation newsgroups along the lines of “How do I start an operating system batch file without leaving MicroStation?” One answer to the question is to use Visual Basic for Applications (VBA), which is part and parcel of MicroStation V8. VBA provides extensive functionality, which you can extend by referencing built-in Visual Basic (VB) methods, and even by calling the Win32 native application programming interface (API) directly. VB provides a Shell() method, which means ‘attempt to start whatever executable program I give you’. A batch file (having a .bat extension) is not an executable file. The way to ‘execute’a batch file is to give its path to the Windows built-in command executable cmd.exe. The way to persuade the operating system to do something with a batch file is to put these ideas together like this… Shell(“cmd.exe /k batchfile.bat”) Unfortunately, things aren’t always as simple as we would like, because Shell() can’t itself divine the location of the executable file. The VBA project ShellBatch.mvba takes care of these details, and all you have to know is how to start it. 1. Copy ShellBatch.mvba to one of the folders in your computer’s VBA search path (MS_VBASEARCHDIRECTORIES). C:\Program Files\Bentley\Workspace\Standards\VBA is a good choice 2. Open MicroStation’s key-in window from the Utilities menu 3. Start your batch file with the following key-in: you must know the full path to the file: vba run [ShellBatch].Module1.Main <batch file path> For example: vba run [ShellBatch]Module1.Main D:\temp\test.bat Copyright © LA Solutions 2003…2005 visit http://www.la-solutions.co.uk.
    [Show full text]
  • Standardizing SAS Code for Quality Programs Clarence Wm
    Standardizing SAS Code for Quality Programs Clarence Wm. Jackson, CQA, Change Manager City of Dallas, Communication and Information Services, Change Management Group Abstract and Introduction SAS software is a powerful programming system that allows even casual users to write very complicated solutions for business problems. It is free form, meaning that it has no syntactical constraints for defining the program structure, as is found in such programming languages as COBOL and ALC. However, the free form of SAS code can be a mixed blessing, where code maintenance is concemed. Whenever changes in the SAS code are required, if someone other than the original programmer has to make the changes, this may result in errors, lost productivity and a reduction in the consistency and overall quality of the program. This situation may be avoided by the implementation of appropriate standards for the writing of SAS programs. This paper will review industry standards for other programming languages, and will discuss how SAS code could be standardized. The paper also will review the benefits and opportunities for quality improvement. Standards Provide Basis for Quality What is a "Standard"? The American Heritage dictionary defines "standard" as "an acknowledged measure 0/ comparison/or quantitative or qualitative value; criterion; nonn; a degree or level 0/ requirement, excellence or attainment. " There are two categories of standards related to Information Technology, 'industry' and 'installation'. The industry standards are those set by a recognized standards organization meant to facilitate the efficient interchange of information between organizations and companies. The installation standards serve the purpose of providing guidelines for the efficient operation of a single installation or shop.
    [Show full text]
  • Exit Legacy: Atos Syntel's Solution Accelerator for Faster, Cheaper
    Exit Legacy: Atos Syntel’s Solution Accelerator for Faster, Cheaper, and Derisked Legacy Transformation Legacy software is embedded in customer organizations with extreme complexity. The problems with legacy applications are lack of agility, skills shortage, and high costs of ownership. In the new digital era, having IT systems that are agile, proactive, and flexible is the key to business growth. Customers typically face the following challenges while transforming their legacy applications: • Migration of legacy applications/systems is a time consuming and costly affair • A number of errors arise due to the manual method of execution • Generally migration is done for legacy technologies and finding the right resources is a challenge Legacy modernization provides solutions to all these problems and helps customers get into a non-legacy distributed platform with cloud adoption, and digital and analytics capabilities. Atos Syntel’s Exit Legacy portal hosts various solution accelerators that help in legacy modernization. With Exit Legacy, transforming your legacy is faster, risk-free, and cheaper. Exit Legacy: Atos Syntel’s Solution Accelerator for Faster, Cheaper, and Derisked Legacy Transformation BUSINESS Atos Syntel’s Solution BENEFITS Atos Syntel’s Exit Legacy portal is aligned to the modernization of project life cycles to ensure the • ~50% faster assessment modernization of the entire eco-system, instead of just application components or data. • ~50% reduction in manual Exit Legacy Tool Set efforts Inventory Analysis Tool: • ~50% costs
    [Show full text]