Monday, April 8, 2013

KBP Assignment

Concepts of Programming Language 10th edition
Chapter 7

For Mr. TriDjoko Wahjono

Review Question


1. Define operator precedence and operator associativity.

Operator precedence is the order of the operations.
Operator associativity: if there are more than one operator, no matter evaluate the left operator first or evaluate the right operator first, the result will be the same.


2. What is a ternary operator?

An operator that has three operands.

3. What is a prefix operator?
An operator which precede their operands.

5. What is a nonassociative operator?
Non-associative operators are operators that have no defined behavior when used in sequence in an expression.

11. What is an overloaded operator?
The multiple use of an operator is called operator overloading.

14. What is a mixed-mode expression?
There are more than one type of operand in the expression.

18. What is short-circuit evaluation?
The result of expression is determined without all of the operands and/or operators.

Problem Set


1. When might you want the compiler to ignore type differences in an expression?

When you want to evaluate a string as a number and vice-versa

5. Should C's assigning operations (for example, +=) be included in other languages (that do not already have them)? Why or why not?
Yes, because it's simpler than the normal <operand> = <operand> + <some values> form, and it can save much time.

6. Should C's single-operand assignment forms (for example, ++count) be included in other languages (that do not already have them)? Why or why not?
Yes, because it's simpler than the normal addition <operand> = <operand> + 1; and it can save much time.

7. Describe a situation in which the add operator in a programming language would not be commutative.
An expression such as : x + fun(y), and fun(y) changes x.

20. Consider the following C program:
int fun(int *i) {
*i +=5;
return 4;
}
void main() {
int x = 3;
x = x+fun(&x);
}
What is the value of x after the assignment statement in main, assuming :
a. operands are evaluated left to right.
b. operands are evaluated right to left.
a.) 7
b.) 12

KBP Assignment

Concepts of Programming Language 10th edition
Chapter 6

For Mr. TriDjokoWahjono

Review Question

1. What is a descriptor?
The collection of the attributes of a variable.

2. What are the advantages and disadvantages of decimal data types?
Decimal data types store a fixed number of decimal digits, with the decimal point at a fixed position in the value. Decimal types have the advantage of being able to precisely store decimal values, at least those within a restricted range, which cannot be done with floating-point.
The disadvantages of decimal types are that the range of values is restricted because no exponents are allowed, and their representation in memory is wasteful.

3. What are the design issues for character string types?
A character string type is one in which the values consist of sequences of characters. The two most important design issues that are specific to character string types are the following :
Should strings be simply a special kind of character array or a primitive type (with no array-style subscripting operations)?
Should strings have static or dynamic length?

4. Describe the three string length options.
A static length string is a string whose length is static and set when the string is created.
A limited dynamic length string is a string that has a varying length up to a declared and fixed maximum set by the variable's definition. Such string variables can store any number of characters between zero and the maximum.
A dynamic length string is a string that has a varying length and no maximum. This option requires the overhead of dynamic storage allocation and deallocation but provides maximum flexibility.

5. Define ordinal, enumeration, and subrange types.
An ordinal type is one in which the range of possible values can be easily associated with the set of positive integers.
An enumeration type is one in which all of the possible values, which are named constants, are provided in the definition. Enumeration types proved a way of defining and grouping collections of name constants, which are called enumeration constants.
A subrange type is a contiguous subsequence of an ordinal type. For example, 12..14 is a subrange of integer type.

7. In what ways are the user-defined enumerations types of C# more reliable than those of C++?
The enumeration types in C# are better than those of C++, because enumeration type variables in C# are never coerced to integer types

14. Define row major order and column major order.
In row major order, the elements of the array that have as their 1st subscript the lower bound value of that subscript are stored first, followed by the elements of the second value of the first subscript, and so forth.
In column major order, the elements of an array that have as their last subscript the lower bound value of the subscript are stored first, followed by the elements of the second value of the last subscript, and so forth.
3 4 7   row major order : 3,4,7,6,2,5,1,3,8.
6 2 5   column major order : 3,6,1,4,2,3,7,5,8.
1 3 8

18. What is an access function for an array?
An access function for a multidimensional array is the mapping of its base address and a set of index values to the address in memory of the element specified by the index values.

19. What are the required entries in a Java array descriptor, and when must they be stored (at compile time or run time)?
In Java all arrays are fixed heap-dynamic arrays. Once created, tese arrays keep the same subscript ranges and storage. Secondarily, Java supports jagged arrays and not rectangular arrays. Being a fixed heap-dynamic array the entries will be established and fixed at run time.

21. What is the purpose of level numbers in COBOL records?
The level numbers in COBOL records are used to establish a hierarchical structure of related records.

22. Define fully qualified and elliptical references to fields in records.
A fully qualified reference to a record field is one in which all intermediate record names, from the largest enclosing record to the specific field, are named in the reference.
In an elliptical reference, the field is named, but any of the enclosing record names can be omitted, as long as the resulting reference is unambiguous in the referencing environment.

36. What are the two common problems with pointers?
One common problem with pointers is the dangling pointer, or dangling reference which is a pointer that contains the address of a heap-dynamic variable that has been deallocated.
The common problem is a lost heap-dynamic variable which is an allocated heap-dynamic variable that is not longer accessible to the user program, i.e. it hasn't a pointer. Such variables are called garbage because they are unusable.

38. What is a C++ reference type and what is its common use?
C++ includes a special kind of pointer type called a reference type. it is used primarily for the formal parameters in function definitions. A C++ reference type variable is a constant pointer that is always implicitly dereferenced.

Problem Set

2. How are negative integers stored in memory?
A negative integer could be stored in sign-magnitude notation, in which the sign bit is set to indicate negative and the remainder of the bit string represents the absolute value of the number.

5. What disadvantages are there in implicit dereferencing of pointers, but only in sertain contexts? For example, consider the implicit dereference of a pointer to a record in Ada when it is used to reference a record field.
When implicit dereferencing of pointers occurs only in certain contexts, it makes the language slightly less orthogonal. The context of the reference to the pointers determines its meaning. This detracts from the readability of the language and makes it slightly more difficult to learn.

7. Compare the pointer and reference type variable in C++.
- A pointer can be re-assigned any number of times while a reference can't be re-assigned after initialization.
- A pointer can point to NULL while reference can never point to NULL.
- You can't take the address of a reference like you can with pointers.
- There's no "reference arithmetics" (but you can take the address of an object pointed by a reference and do pointer arithmetics on it as in &obj +5).

19. Any type defined with typedef is type equivalent to its parent type. How does the use of typedef differ in C and C++?
C does not allow a given typedef to appear more than once in the same scope.
C++ handles typedefs and type names differently than C, and allows redundant occurrences of a given typedef within the same scope

21. In what way is dynamic type checking better than static type checking?
Dynamic type checking gives more freedom and flexibility to the programmer.



KBP Assignment

Concepts of Programming Language 10th Edition
Chapter 5

For Mr. TriDjokoWahjono

Review Question


1. What are the design issues for names?

The design issues for names are :
  • Are name case sensitive?
  • Are the special words of the language reserved words or keywords?
2. What is the potential danger of case-sensitive names?
The danger is that you might not be able to find the name in a reference even if you have spelled it correctly, because you haven't got the case right. Therefore, you won't find information that you need, or you might incorrectly create a new record with a different case, which nobody else will be able to find because it isn't with the rest of the information.

4. What is an alias?
An alternative name for an object, such as variable, file, or device.

7. Define binding and binding time.
Binding : an association between an attribute and an entity, such as between a variable and its type or value, or between an operation and a symbol.
Binding Time : The time at which a binding takes place.

9. Define static binding and dynamic binding.
Static Binding : the process of mapping a message to a specific sequence of code (method) at compile-time.
Dynamic Binding : the process of mapping a message to a specific sequence of code (method) at runtime.

Problem Set

2. What is l-value? Write a statement in C language which gives the compile time error "l-value required".

l-value is a value that can be the target of an assignment. The "l" stands for "left" or "locator".
A statement in C language which gives compile error :
1 = 2;
int i; (i+2) = 2;

6. Consider the following JavaScript skeletal program:
//the main program
var x;
function sub1(){
   var x;
   function sub2(){
   ...
   }
}
function sub3(){
...
}
Assume that the execution of this program is in the following unit order:
main calls sub1
sub1 calls sub2
sub2 calls sub3
a. Assuming static scoping, in the following, which declaration of x is the correct one for a reference to x?
   i. sub1
   ii. sub2
   iii. sub3
b. Repeat part a, but assume dynamic scoping.

a.) i.) sub1   ii.) sub1   iii.) Main
b.) i.) sub1   ii.) sub1   iii.) sub1

7. Assume the following JavaScript program was interpreted using static-scoping rules. What value of x is displayed in function sub1? Under dynamic scoping rules, what value of x is displayed in function sub1?

var x;
function sub1(){
   document.write("x = " + x + "<br />");
}
functin sub2(){
   var x;
   x = 10;
   sub1();
}
x = 5;
sub2();

Static scoping: x=5;
Dynamic scoping: x=10;

Saturday, March 30, 2013

KBP Assignment

Concepts of Programming Language 10th edition
Chapter 3

For Mr. TriDjokoWahjono

Review Question


1. Define syntax and semantics.

Syntax : The form of its expressions, statements, and program units.
Semantics : The meaning of those expressions, statements, and program units.

5. What is the difference between a sentence and a sentential form?
Sentence : The strings of a language.
sentential : Each of the strings in the derivation, including <program>.

7. What three extensions are common to mose EBNFs?
C if-else statement.
The use of braces in an RHS to indicate that the enclosed part can be repeated indefinitely or left out altogether.
The third common extension deals with multiple-choice options.

8. Distinguish between static and dynamic semantics.
Static semantics is more on the legal forms of programs (syntax rather symantics) and is only indirectly related to the meaning of the programs during execution. Static semantics is so named because the analysis required to check these specifications can be done at compile time. In many cases, the semantic rules of language state its type constraints.

Dynamic semantics is describing the meaning of the programs. Programmers need to know precisely what statements of a language do. Compile writers determine the semantics of a language for which they are writing compilers from English descriptions.


10. What is the difference between synthesized and an inherited attribute?
Synthesized attributes are used to pass semantic information up a parse tree. Inherited attributes pass semantic information down and across a tree.

12. What is the primary use of attribute grammars?
An attribute grammar is a device used to describe more of the structure of a programming language that can be described with a context-free grammar. An attribute grammar is an extension to a context-free grammar.

14. Why can machine languages not be used to define statements in operational semantics?
Machine language can’t be used to define statements in operational semantics because the individual steps in the execution of machine language and the resulting changes to the state of machine are too small and too numerous.

Problem Set

1. Syntax error and semantic error are two types of compilation error. Explain the difference between the two in a program with examples.
syntax error : if (a==1) b=2
-->syntax error : there's no semicolon (;) at the end of the statement

semantic error : for (int i=0;i<=n;i++) i--;
-->semantic error : basically a logical error

13. Write a grammar for the language consisting of strings that have n copies of the letter a followed by double the number of copies of the letter b, where n>0. For example, the strings abb, aabbbb, aaaabbbbbbbb, are in the language but a, aabb, ba, and aaabb are not.
<S> -> a<S>bb | abb

14. Draw parse trees for the sentences abb and aabbbb, as derived from the grammar of Problem number 13.
abb :            <S>
                   /   |   \
                 a    b   b

aabbbb :           <S>
                       /   |   \   \
                     a  <S>  b b
                         /  |  \
                        a  b  b

15. Convert the BNF of Example 3.1 to EBNF.
<program> -> begin {stmt} end
<stmt> -> <var> = <expression>
<var> -> A | B | C
<expression> -> <var> [ ( + | - ) <var> ]

16. Convert the BNF of Example 3.3 to EBNF.
<assign> -> <id> = <expr>
<id> -> A | B | C
<expr> -> <expr> { ( + | * ) <expr> }
                 | ( <expr> )
                 | <id>

17. Convert the following EBNF to BNF:
     S -> A{bA}
     A -> a[b]A
     
     <S> -> <A> | <S>b<A>
     <A> -> a<A> | ab<A>

18. What is a fully attributed parse tree?
– a parse tree with all attribute values computed
– conceptually attribute values are computed after
parse tree is constructed by compiler
–  not really the way it’s done.

Sunday, March 3, 2013

KBP Assignment

Concepts of Programming Languages 10th edition
Chapter 2

For Mr. TriDjoko Wahjono

Review Questions :

  1. Plankalkul was designed by Konrad Zuse between 1942 & 1945. He first published a paper on it in 1948. More information on the language was published in 1972.
  2. Its mixed one-dimensional and two-dimensional layout, which has puzzled many readers of the original document.
  3. Plankalkul means "plan kalkulus" which means "formal system for planning".
  4. Non-connotative names, and absolute addressing.
  5. 72 bits, grouped as 12 six-bit bytes.
  6. Its capabilities prompted the development of Fortran because it was able to support floating-point operations hardware.
  7. The speedcoding system developed by John Backus for the IBM 701.
  8. The shortcode was developed by John Mauchly in 1949. Shortcode called automatic programming because it was implemented with a pure interpreter, not translated to machine code.
  9. The environment in which Fortran was developed was as follows : Computers had small memories and were slow and relatively unreliable, the primary use of computers was for scientific computations, there were no existing efficient and effective ways to program computers, and because of the high cost of computers compared to the cost of programmers. The first version of Fortran is Fortran 0.
  10. Independent-compilation capability.
  11. Logical loop statements and IF with an optional ELSE.
  12. Fortran 90.
  13. Fortran 77.
  14. Linguists were concerned with natural language processing.
  15. Atoms and Lists.
  16. Common LISP allows for static scoping and dynamic scoping, Scheme only uses static scooping. Scheme is relatively small while Common LISP is large and complex.
  17. Scheme dialect.
  18. ACM and GAMM.
  19. The C programming language was devised in the early 1970s as a system implementation language for the nascent Unix operating system. It evolved a type structure, created on a tiny machine as a tool to improve a meager programming environment.
  20. Algol 58 introduced code blocks and the begin and end pairs for delimiting them, Algol 60 was the first language that implementing nested functions definitions with lexical scope.
  21. BNF Language.
  22. Flow-matic Language.
  23. COBOL design process began in 1959.
  24. Hierarchichal data structures (records).
  25. Department of Defense (DoD).
  26. Integer variables data type.
  27. Its smaller dialects could be implemented on computers with very small memories.
  28. PL/I was designed to replace Fortran and COBOL.
  29. The IBM system / 360 line of computers.
  30. The important feature is Data abstraction.
  31. User-defined data types.
  32. Orthogonality is the design criterion used extensively in ALGOL 68.
  33. ALGOL-W language introduced the case statement.
  34. For and switch statements, in its assigning operators, and in its treatment of pointers.
  35. Lack of complete type checking and flexibility.
  36. Because Prolog is concerned with the WHAT not the HOW. We have to specify what conditions the answer should satisfy, but not how to obtain it.
  37. The statements that populate Prolog database are Facts and Rules.
  38. The primary application area is Embedded systems.
  39. Tasks (using the rendezvous mechanism).
  40. C++ has both functions and methods.
  41. C++ is similiar to Ada. Anything C++ can do, Ada can do as well.
  42. Classes, Objects, and Methods.
  43. A goal of Ada was that it could be used for which Ada could be used, so virtually none of the features of Ada would be removed, not even those considered to be unsafe.
  44. From Smalltalk language.
  45. Doesn't support traditional object-oriented programming, as it has no form of inheritance.
  46. MacOS/iOS - iPhone.
  47. Ken Thompson.
  48. Both were popularized by the Department of Defense.
  49. A programming language for embedded consumer electronic devices.
  50. Similiar syntax.
  51. The dynamic nature of its strings and arrays, and its use of dynamic typing.
  52. Rectangular arrays is an array structure that is included in C# but not in C, C++, or Java.
  53. Two languages that was the original version of Perl meant to replace are Ksh and Awk.
  54. The application area is Web.
  55. They both complement each other. PHP or any server-side language is mandatory for client-server interaction while JavaScript is optional and not required.
  56. PHP's arrays are a combination of JavaScript's arrays and Perl's hashes.
  57. Primitive data types and Reference/Object Data Types.
  58. Both support multi-language programming.
  59. All operations are called via method calls.
  60. Java uses implicit storage deallocation for its objects, often called garbage collection.
  61. Lua is purely interpreted.
  62. Encapsulation, Inheritance, Polymorphism, Class (static) methods, Object initialization, Object finalization, Overloading, Abstract methods, Interfaces, Properties, Events, Collections, Runtime Type information, Exceptions, Single rooted classes, Extendable class library.
  63. -
  64. .NET framework.
  65. An XML data document and and XSLT document.
  66. XML document.
Problem Set :
  1. Logical data type and logical boolean expression, with this, we can create simple version of the complex compile, and link processes of earlier compilers.
  2. -
  3. -
  4. -
  5. -
  6. Undefined escape sequences in literal strings. The backslash character can be used in literal strings and characters:
    1. To escape various characters that have special significance in a literal string or character (",',\, and ?), and
    2. To introduce an escape sequence representing a character that it is impossible or impractical to include in the program literally (new-line, delete, etc.)
  7. Because that language continue to evolve from time to time.
  8. First, it is an interpreter type of language and focused on ease of use at the expense of system resources. Second, the running-time of a program that was written with the help of Speedcoding was usually ten to twenty times that of machine code.
  9. It is to shorten the initialization of a variable.
  10. -
  11. -
  12. Procedural programming is a classic programming where the program language is used to tell the computer exactly what to do, step by step. Non-procedural programming is where you tell the computer what you want, then the computer figures out how to get it. The incorporation of procedural and non-procedural features is used to overcome the lack of computer's knowledge to figure out some procedures by itself efficiently.
  13. The reasons why C is more popular than Fortran :
    1. Efficient compilers are universally available for all the main architechtures in use, and a good public compiler also exists (gcc). C compilers often come free with machines, while Fortran 90 compilers must be purchased, and often expensive.
    2. C is very broad in scope, and is more powerful of Fortran 90 in some areas, such as pointers, and manipulations of strings of characters.
    3. Acquired coding experience can be directly used outside the scientific world : C is very common in commercial world.
  14. Loosely typed languages, and Strongly typed languages
    • For : Flexibility, Brevity of syntax. It places stricter controls on what objects can receive and send, so making it easier to enforce design strategies throughout the application. When there are errors in types, there can be picked up during precompilation or in the IDE.
    • Against : Without type checking, there is no means to verify the integrity of the data without executing the application. The syntax of typed languages can be viewed as overly long or verbose. Typed languages aren't as flexible as untyped languages, as data structures need to be cast to the correct type before another object can receive them. It is also said that by using typed languages, the compiler spends less time dynamically typing objects and so executes faster.
  15. Yes, they are Fortran, C++, COBOL, Algol.
  16. It is good to make the program easier to be read, as long as it's stay out of ambiguous statements.

Saturday, March 2, 2013

KBP Assignment

Concepts of Programming Languages 10th edition
Chapter 1

For Mr. TriDjoko Wahjono

Review Questions :
  1. Increased capacity to express ideas, Improved background for choosing appropriate languages, Increased ability to learn new languages, Better understanding of the significance of implementation, Better use of languages that are already known, Overall advancement of computing.
  2. It makes learning a new language easier, make a newly written program language easier to be learnt by new user, and get more people involved in on a global scale which would actually benefit the entire computing community.
  3. Language that has dominated scientific computing over pas 50 years is Fortran.
  4. Language that has dominated business applications over pas 50 years is Cobol.
  5. Language that has dominated artificial intelligence over pas 50 years is LISP.
  6. Most UNIX is written in C language.
  7. If there are too many features then the basic simplicity of reading a program could be lost. The simpler and more user-friendly programming languages allow for a smoother creation process, especially if there are many people working on the same code.
  8. Because the build in operator has the precision and the compiler knows all the precision the operators,  and it works on that precision. But if user create his/her own operator, the compiler doesn't know how to make precision of this operator.
  9. C has 2 structured data types (arrays and structs). Arrays can be returned from functions, but structs can't.
  10. Algol 68 is using orthogonality as a primary design criterion.
  11. The selection statement plus GOTO is used to build more complicated control statement such as FOR loop.
  12. Sub-programs.
  13. A program is said to be reliable if it performs to its specifications under all conditions.
  14. Because it can lead to lots of hard-to-debug errors.
  15. Aliasing : two or more distinct names that can be used to access the same memory cell.
  16. The ability of the program to intercept run time error.
  17. If it is hard to read, then it is hard to write.
  18. Many run time checks will prohibit fast code execution. If optimization is used, compiling will be slower but execution will be faster.
  19. The basic architecture of computers (von Neumann).
  20. Imperative languages.
  21. Incompleteness of type checking and inadequacy of control statements.
  22. Data abstraction, inheritance and dynamic (run-time) method.
  23. Smalltalk.
  24. Reliability and Cost of execution.
  25. Compilation, Pure Interpretation, Hybrid Implementation System.
  26. Compiler.
  27. It serves as a database for the compilation process.
  28. A form of instruction set designed for efficient execution by a software interpreter.
  29. A compromise/combination of compilation and interpretation.
  30. The advantages of using JBuilder : 
    1. Reduce leaning curve by using the same IDE for multiple platforms.
    2. Speed development with support for the latest Java technologies.
    3. Enhanced usability and feature navigation.
    4. Easily move JBuilder and Eclipse projects forward.
    5. Experience unparalleled productivity and code reuse.
    6. Rapidly create sophisticated Swing-based applications.
    7. Analyze, debug, and tune applications within the IDE.
    8. Increase individual and team productivity.
    9. Accelerate creation of Web services.
    10. Improve productivity and code comprehension with UML modeling and code archeology.
    11. Improve code quality with audits and metrics.
    12. Leverage the latest Eclipse open source framework.
Problem Set :
  1. Yes, in programming, a problem can be solved by so many ways, but to solve it in a particular algorithmic step, the programmer required to have programming language skills. The programmer might have to use some of the built-in functions in specific programming language to solve it in a particular algorithmic step. The programmer have to have that specific programming language skills to be able to use the functions properly.
  2. According to historical accounts on who was the first programmer, Lord Byron's daughter, Augusta Ada Byron, the Countess of Lovelace, was the first person to write a computer program for Charles Babbage's Analytical engine.
  3. If we write a program with multiple programming language, sometimes the weakness of the language used in that program occurs unexpectedly. But if we can manage to use all the functions from each language properly, we can get so much advantages by using each language's strong point.
  4. The performance for each language is different based on the purpose of making the program. For example, for the business application, it's better using Cobol than C, but in the scientific application, it's better using C than Cobol.
  5. In languages for web software, the developer is obliged to define all the ways the web could follow during its life to solve the problems. In artificial intelligence, the developer only defines knowledge to be used, a software reasoning mechanism finds itself the right way to solve the problem.
  6. According to me, the readability characteristic is the most important for a programming language. By the high readability value, we can cover all other characteristics. A good high-level language will allow programs to be written in some ways that resemble a quite-English description of the underlying algorithms. If care is taken, the coding may be done in a way that is essentially self-documenting.
  7. The purpose of using semicolons to terminate a statement in Java is to make the statements look unambiguous, and most of programming languages had agreed to use this symbol to terminate a statement, although there are some languages that's using dot(.) to terminate a statement.
  8. The pros of using functions and subroutines are the usability of that statements many times without type it again and again, and in a project we can share our tasks to others by split it into many functions. The cons of using functions and subroutines are most of the function can only return one value, and it there might be a bug in that function if not coded properly.
  9. Orthogonality means that a relatively small set of primitive constructs can be combined in a relatively small number of ways to build the control and data structures of the language. The more orthogonal the design, the fewer exceptions, the simpler programming language will be made.

Thursday, January 17, 2013

PTI Assignment


Discovering Computers 2011 - Living in a Digital World
Chapter 15
For Mr. TriDjoko Wahjono


True / False
1. T   6. F
2. F   7. T
3. T   8. T
4. T   9. T
5. F   10. F

Multiple Choice
1. A   5. D
2. C   6. B
3. C   7. D
4. A   8. B

Matching
1. E   6. B
2. D   7. F
3. J   8. I
4. G   9. A
5. H   10. C

Short Answer
1. - Trade school programs often have smaller classrooms, which gives you more one-on-one time with the professor.
    - Student completion rate, placement record, facilities, tuition and fees, services.
2. - Keeping up to date of the informations about new products and services in technology.
    - Participate in educational activities such as workshops and seminars.
3. - Depends on your personal strengths and goals, follow your strengths and think about your long-term career.
    - Self-study, Online training classes, Instructor-led training, web resources.
4. ->to verify whether a person is capable as a programmer or developer.
     >Networking and Web Design certification.
    - Java programmers, Mobile application developers, Oracle database managers, Programming consultants, SQL programmers, Web Software developers, XML developers.
5. - The process through which computer hardware is tested to ensure it is compatible with specific software packages, and operates as intended in critical situations.
    - Cable installation technicians, computer repair technicians, corporate trainers, help desk specialists, IT consultants, system engineers and administrators.