Errata for Training Kit (Exam 70-463): Implementing a Data Warehouse with Microsoft SQL Server 2012
Submit your own errata for this product.
The errata list is a list of errors and their corrections that were found after the product was released. If the error was corrected in a later version or reprint the date of the correction will be displayed in the column titled "Date Corrected".
The following errata were submitted by our customers and approved as valid errors by the author or editor.
Color Key: Serious Technical Mistake Minor Technical Mistake Language or formatting error Typo Question Note Update
| Version |
Location |
Description |
Submitted By |
Date Submitted |
Date Corrected |
| Printed, PDF, ePub, Mobi, Safari Books Online, Other Digital Version |
Page xxix
url |
Note About Companion Content & Sample Databases
All of the companion content and sample databases are freely available here for download: http://go.microsoft.com/FWLink/?Linkid=260986
If you cannot access the files, please contact our Customer Service department at msinput@microsoft.com.
An earlier version of the companion content web page contained an incorrect URL, which is now fixed. You may need to refresh your browser's cache before the new page will load for you.
We are sorry about any confusion caused by our error.
|
AdamZ |
Jan 15, 2013 |
|
| Printed |
Page xxix
Source Code |
The specified link for the source code zip TK70463_CodeLabSolutions.zip is displayed on front page but the link does not provide access to the file, just access to the sample databases.
Note from the Author or Editor: O'Reilly is informed about this issue and it should be resolved soon.
Thank you for reporting.
Dejan Sarka
You should be able to download the companion content from http://examples.oreilly.com/9780735666092-files/.
Thank you for your patience,
Dejan Sarka
|
Anonymous |
Dec 22, 2012 |
Jan 11, 2013 |
| Printed, PDF |
Page 9
4th paragraph |
"However, in the DimDate dimension, if you know the month, you obviously know the calendar quarter, and if you know the calendar quarter, you know the calendar year."
There is a functional dependency between month and quarter.
This is NOT true for quarter and year. For example, knowing it is the 2nd quarter does not identify the year, as each and every year has a 2nd quarter.
Note from the Author or Editor: The last statement in th e4th paragraph reads:
However, in the DimDate dimension, if you know the month, you obviously know the calendar quarter, and if you know the calendar quarter, you know the calendar year.
It should be:
However, in the DimDate dimension, if you know the month, you obviously know the calendar quarter, and if you know the calendar quarter, you know the calendar semester.
|
Malcolm |
Jan 16, 2013 |
|
| Printed, PDF |
Page 18
3rd paragraph |
On page 6, you wrote about using a DW to analyze data by country. "For example, you might have only the latest customer address, which might prevent you from calculating historical sales by country correctly."
On page 18, you write about how these values are member properties, rather than attributes (as your previous comment would indicate).
"A customer typically has an address, a phone number, and an email address. You do not analyze data on these columns. You do not need them for pivoting."
Not a big deal, but a good opportunity to point out the risks in confusing member properties and attributes. In different DWs, they may be different types.
Note from the Author or Editor: The reader is right, the statement on page 6 could be rephrased for clarification. This is the last statement of the third paragraph on page 6.
Instead of:
For example, you might have only the latest customer address, which might prevent you from calculating historical sales by country correctly.
Should read:
For example, you might have only the latest customer address (from which you extract customer's current country), which might prevent you from calculating historical sales by country correctly.
|
Malcolm |
Jan 16, 2013 |
|
| Printed, PDF |
Page 26
Exercise 2 - 4th bullet |
The text refers to a column in the DimSalesReason dimension table named "SalesReasonType", but the column name is actually "SalesReasonReasonType" in the AdventureWorksDW2012 database (and is correctly displayed in the screenshot on p25).
Note from the Author or Editor: The last sentence of the fourth bullet of Exercise 2 (top of the page) should be modified from
"In the DimSalesReason dimension, it seems that there is a natural hierarchy:
SalesReasonType ➝ SalesReasonName."
to
"In the DimSalesReason dimension, it seems that there is a natural hierarchy:
SalesReasonReasonType ➝ SalesReasonName.".
|
Daniel Dittenhafer |
May 02, 2013 |
|
| PDF |
Page 28
5th paragraph, 2nd sentence |
In the second sentence, "In addition, the Source Order Details table...", the word "Source" is capitalized and in italics. This makes it appear as if the table name is "Source Order Details". Change the word "Source" to be lower case and not italicized.
Note from the Author or Editor: The last sentence before table 1-8, which is "In addition, the Source Order Details
table has the ProductId foreign key column. The Quantity column is the measure.", should be modified. The word "Source" should no be capitalized and in italics.
|
truncheon411 |
May 01, 2013 |
|
| PDF |
Page 44
MORE INFO Shaded Area |
Just wanted to point out that due to word-wrapping the link in the PDF file for the SQLCAT Whitepaper doesn't work. There's a space between "06" and "/" which results in a not-found error on the SQLCAT Web Site. If you remove the space from the URL in your web browser it works. Perhaps you could replace the super-long hyperlink with a shortened version?
Note from the Author or Editor: Thank you for the observation. However, as the book template does not anticipate shortened URLs, we cannot do much now. A note to the publisher.
|
Zack Jones |
Apr 08, 2013 |
|
| Printed, PDF |
Page 51
Exercise 2, Item 2 |
This is a minor tweak to a great exercise, in a very helpful introductory chapter.
The calculation for Age
Age AS
CASE
WHEN DATEDIFF(yy, BirthDate, CURRENT_TIMESTAMP) <= 40
THEN 'Younger'
WHEN DATEDIFF(yy, BirthDate, CURRENT_TIMESTAMP) > 50
THEN 'Older'
ELSE 'Middle Age'
END
does not really deal with NULL values for BirthDate. Regardless of whether there are NULL values currently in the data, the BirthDate field allows them, so the code should be prepared to deal with them.
Age AS
CASE
WHEN BirthDate IS NULL THEN NULL
WHEN DATEDIFF(yy,BirthDate,CURRENT_TIMESTAMP) > 50
THEN 'Older'
WHEN DATEDIFF(yy,BirthDate,CURRENT_TIMESTAMP) > 40
THEN 'Middle Age'
ELSE 'Younger' END
Note from the Author or Editor: I agree with the reader. Just to make clear what needs the change: the code starts on page 49, at the bottom, bullet 2. The complete code for creating the dbo.Customers table, which spans over page 51 as well, is now:
CREATE TABLE dbo.Customers
(
CustomerDwKey INT NOT NULL,
CustomerKey INT NOT NULL,
FullName NVARCHAR(150) NULL,
EmailAddress NVARCHAR(50) NULL,
BirthDate DATE NULL,
MaritalStatus NCHAR(1) NULL,
Gender NCHAR(1) NULL,
Education NVARCHAR(40) NULL,
Occupation NVARCHAR(100) NULL,
City NVARCHAR(30) NULL,
StateProvince NVARCHAR(50) NULL,
CountryRegion NVARCHAR(50) NULL,
Age AS
CASE
WHEN DATEDIFF(yy, BirthDate, CURRENT_TIMESTAMP) <= 40
THEN 'Younger'
WHEN DATEDIFF(yy, BirthDate, CURRENT_TIMESTAMP) > 50
THEN 'Older'
ELSE 'Middle Age'
END,
CurrentFlag BIT NOT NULL DEFAULT 1,
CONSTRAINT PK_Customers PRIMARY KEY (CustomerDwKey)
);
and it should be changed to:
CREATE TABLE dbo.Customers
(
CustomerDwKey INT NOT NULL,
CustomerKey INT NOT NULL,
FullName NVARCHAR(150) NULL,
EmailAddress NVARCHAR(50) NULL,
BirthDate DATE NULL,
MaritalStatus NCHAR(1) NULL,
Gender NCHAR(1) NULL,
Education NVARCHAR(40) NULL,
Occupation NVARCHAR(100) NULL,
City NVARCHAR(30) NULL,
StateProvince NVARCHAR(50) NULL,
CountryRegion NVARCHAR(50) NULL,
Age AS
CASE
WHEN BirthDate IS NULL THEN NULL
WHEN DATEDIFF(yy,BirthDate,CURRENT_TIMESTAMP) > 50
THEN 'Older'
WHEN DATEDIFF(yy,BirthDate,CURRENT_TIMESTAMP) > 40
THEN 'Middle Age'
ELSE 'Younger'
END
CurrentFlag BIT NOT NULL DEFAULT 1,
CONSTRAINT PK_Customers PRIMARY KEY (CustomerDwKey)
);
GO
|
Malcolm |
Jan 18, 2013 |
|
| Printed, PDF, ePub |
Page 52
Exercise 3 Create a Fact Table |
The text has:
"In this example, you cannot use all foreign keys together as a composite primary key ... and the primary key would be duplicated. You could use ... however, in order to show how you can autonumber a column with the IDENTITY property, this exercise has you add your own integer column with this property. This will be your surrogate key.
CREATE TABLE dbo.InternetSales
(
InternetSalesKey INT NOT NULL IDENTITY(1,1),
CustomerDwKey INT NOT NULL,
ProductKey INT NOT NULL,
DateKey INT NOT NULL,
OrderQuantity SMALLINT NOT NULL DEFAULT 0,
SalesAmount MONEY NOT NULL DEFAULT 0,
UnitPrice MONEY NOT NULL DEFAULT 0,
DiscountAmount FLOAT NOT NULL DEFAULT 0,
CONSTRAINT PK_InternetSales PRIMARY KEY (InternetSalesKey)
);"
But FIGURE 2-1 does not have InternetSalesKey as a column of the InternetSale table and shows CustomerDwKey, ProductKey, and DateKey as the primary key.
Note from the Author or Editor: I already sent the corrected figure to the publisher.
|
Anil Das |
Apr 25, 2013 |
|
| Printed |
Page 60
Last Paragraph above Shaded NOte area |
The first sentence starts out with "The query returns 6343 rows..." Actually it returns 6434. This can be confirmed by running the following:
Select count(*) from dbo.FactInternetSales where CustomerKey <= 12000;
The result of that query is 6434.
Also not that it really matters but my logical read counts are significanty different than yours:
FactInternetSales logical reads - 4534
DimCustomer logical reads - 196
Worktable logical reads - 21314
What could cause such big differences?
Note from the Author or Editor: The beginning of the first sentence of the last paragraph before the note should be modified from
"The query returns 6,343 rows and performs..."
to
"The query returns 6,434 rows and performs...".
About different numbers for logical IO: you cannot guarantee that you would always get the same execution plan. This depends on your HW, database settings, indexes and more. There is actually a note at the bottom of the page: "Note Number of Logical Reads
You might get slightly different numbers for logical reads; nevertheless, you should get
many more logical reads from the first query than from the second query." The important thing here is that you definitely should get less logical reads from the second query, which uses the Window functions.
|
Zack Jones |
Apr 10, 2013 |
|
| Printed |
Page 63
2nd paragraph |
View 'sys.column_store_index_stats' no longer exists
Note from the Author or Editor: Yes, the reader is right, the view was removed in RTM. It was still there in CTP3 when I wrote the chapter. The second paragraph of the page should be changed from
"There are three new catalog views you can use to gather information about columnstore
indexes:
■■ sys.column_store_index_stats
■■ sys.column_store_segments
■■ sys.column_store_dictionaries"
to
"There are two new catalog views you can use to gather information about columnstore
indexes:
■■ sys.column_store_segments
■■ sys.column_store_dictionaries"
|
Anonymous |
Apr 01, 2013 |
|
| PDF |
Page 64
Quick Check frame |
Under Quick Check Answers there is a little typo:
2. No, you should use age compression only for data warehousing environments.
Should be page compression since I am not aware of age compression yet.
Note from the Author or Editor: The second answer in the Quick Check section should be changed from:
2. No, you should use age compression only for data warehousing environments.
to:
2. No, you should use page compression only for data warehousing environments.
|
Lars Utterström |
Jan 10, 2013 |
|
| Printed |
Page 68
Exercise 2 Steps 1, 3, and 8 |
The @updateusage parameter of the system stored procedure sp_spacedused is a varchar datatype not nvarchar so all references to @updateusage = N'TRUE' should be changed to @updateusage='TRUE'
Note from the Author or Editor: I checked, and this is correct. The sys.sp_spaceused system procedure's second parameter, the @updateusage parameter, is VARCHAR(5) data type. However, it seems to me that this is an inconsistency from MS. Nevertheless, the error is really minor, so I guess it makes no sense to change it all over the chapter.
|
Zack Jones |
Apr 11, 2013 |
|
| Printed |
Page 74
Step 5 |
Step 5 tells us to recreate the dbo.Internetsales table. Because it already exists the statement will fail. Before you can recreate it you must first drop it.
Recommend adding a step between 4 and 5 that tells the reader to drop internetsales before trying to recreate it.
Note from the Author or Editor: Actually, step 2 says to drop the table, so this is not an error. However, there is a real error in step 5, which reads:
"5. Re-create the FactInternetSales table."
This first sentence shoul be changed to
"5. Re-create the InternetSales table."
|
Zack Jones |
Apr 11, 2013 |
|
| PDF |
Page 89
Planning a Simple Data Movement |
Planning a Simple Data Movement
To determine whether the and Export Wizard is the right tool for a particular data movement, ask yourself a few simple questions
Maybe the word Import have fallen out and should be added as the 5th word in that sentence.
Note from the Author or Editor: Thank you for reporting this.
You are correct; the sentence should read:
To determine whether the Import and Export Wizard is the right tool for a particular data movement, ask yourself a few simple questions
ML
|
Lars Utterstrom |
Jan 16, 2013 |
|
| PDF |
Page 99,100
last section |
Lesson 1 Review Question 1 and Lesson 1 Review Question 2 lack the standard text, "(Choose all that apply.)". In the answer section, both questions have more than one answer specified as a solution. This is misleading to the reader. Add the standard text to both questions 1 and 2.
Note from the Author or Editor: Add the text "(Choose all that apply.)" to the end of questions 1 and 2 of Lesson 1 Review.
ML
|
truncheon411 |
May 03, 2013 |
|
| Printed |
Page 124
Lesson Review Question 1 |
Answer to review question 1. is "A, B"
Possibly should include "C" also as the SQL Task Editor is not just 'a text box into which you type or paste an SQL statement', it comes with its own query builder which can be used to both develop and test SQL statements.
Note from the Author or Editor: "Execute SQL Task Editor" should be replaced with "Execute T-SQL Statement Task Editor" on the following pages:
1) Page 124, Question 1, Answer C; and
2) Page 127, Question 1 for Lesson 3, Answer C.
|
Anonymous |
Apr 02, 2013 |
|
| Printed, PDF |
Page 180
EXAM TIP |
"At run time, the data flow task builds an execution plan from the data flow, and the data
flow engine executes the plan."
Would this be improved with the inclusion of "definition" before the second comma? As below?
"At run time, the data flow task builds an execution plan from the data flow definition, and the data
flow engine executes the plan."
Note from the Author or Editor: Agree. The existing text should be changed from:
"At run time, the data flow task builds an execution plan from the data flow, and the data flow engine executes the plan."
to: "At run time, the data flow task builds an execution plan from the data flow definition, and the data flow engine executes the plan."
|
Bodhi Densmore |
Feb 01, 2013 |
|
| Printed, PDF |
Page 201
Multicast |
Small typo - "Generates one or more identical outputs" not "Generates one or mode identical outputs"
Note from the Author or Editor: The text "Generates one or mode identical outputs" should be changed to "Generates one or more identical outputs".
Thank you for submitting this typo.
Grega
|
Anonymous |
Mar 04, 2013 |
|
| Printed, PDF |
Page 210
Exercise 1, Item 5 |
Small typo - the database to connect to is TK463DW, not TK463
Note from the Author or Editor: Thank you for noticing this.
The item 5 in Exercise 1 should be changed from :
5. Drag another OLE DB source adapter onto the workspace and rename it stgCustomer.
In the OLE DB Source Editor, set the OLE DB connection manager to TK463 and select
the stg.Customer table.
To:
5. Drag another OLE DB source adapter onto the workspace and rename it stgCustomer.
In the OLE DB Source Editor, set the OLE DB connection manager to TK463DW and select
the stg.Customer table.
|
Malcolm |
Jan 24, 2013 |
|
| PDF |
Page 226
2nd paragraph |
The last sentence in the paragraph is missing its closing parenthesis. However, it may be better so simply drop this sentence, since Chapter 2 provides no explanation of the T-SQL MERGE statement, other than a passing mention of its existence.
This:
(If you are not familiar with the T-SQL MERGE statement, see Chapter 2.
change to this:
(If you are not familiar with the T-SQL MERGE statement, see Chapter 2.)
Note from the Author or Editor: The last sentence of the 2nd paragraph, the sentence "(If you are not familiar with the T-SQL MERGE statement, see Chapter 2.", should be deleted.
|
truncheon411 |
May 06, 2013 |
|
| Printed, PDF |
Page 232
Lesson Review 1 |
Which data flow transformation would you use if had to combine data from two different database tables that exist on two different servers?
should read
Which data flow transformation would you use if YOU had to JOIN data from two different database tables that exist on two different servers?
The "incorrect" answers are the ones that combine data through methods other than joins, so the question is a bit imprecise.
Note from the Author or Editor: Agree. The question
"Which data flow transformation would you use if had to combine data from two different
database tables that exist on two different servers?" should be changed to
"Which data flow transformation would you use if you had to join data from two different
database tables that exist on two different servers?"
GJ
|
Malcolm |
Jan 25, 2013 |
|
| PDF |
Page 232
Question 2 |
Question 2 asks "How many Data Source adapters do you need?". One only NEEDS to use one adapter...one COULD use two or three if desired. I suggest rewording the question to make it clearer.
Note from the Author or Editor: Second sentence for question 2 on page 232, should be changed from "How many Data Source adapters do you need? (Choose all that apply.)" to "How many Data Source adapters could you use? (Choose all that apply.)"
|
truncheon411 |
May 06, 2013 |
|
| Printed |
Page 235
Lesson 2 question 3 Correct Answers |
Question 3 answer is stated as "Correct Answers: B and D", but should be "A and D" as shown by the detailed analysis of choices A through D.
Note from the Author or Editor: Thank you for noticing this typo.
Question 3 answer should be : "Correct Answers A and D".
Grega Jerkic
|
Curt Coker |
Jan 16, 2013 |
|
| PDF |
Page 269
Middle |
The name of the parent package variable must match the name of
the corresponding variable in the parent package.
should be
The name of the parent package variable must match the name of
the corresponding variable in the child package.
Note from the Author or Editor: The last sentence in paragraph 6 (under Package Configurations) should read:
"The name of the parent package variable must match the name of
the corresponding variable in the child package."
ML
|
ScottVK |
Jan 29, 2013 |
|
| Printed, PDF |
Page 274
ex3. step3 |
Step4 needs an extra first step:
Set "Evaluation operation" to "Expression".
Click the ellipsis (...)
Note from the Author or Editor: The text for Step 4 needs to be replaced with the following paragraph:
Change the Evaluation operation constraint option from “Constraint” to “Expression and Constraint”, leave “Success” as the evaluation value, then click the ellipsis (…) at the right of the Expression text box to open the Expression Builder dialog box, and build the expression shown in Listing 6-5.
|
Mark Pulles |
Apr 26, 2013 |
|
| PDF |
Page 317
Paragraph: Using Error Flows |
In 3rd sentence:
"In addition to the data paths, however,, there are also error paths."
The sentence feels a little bit truncated to me or just to commas that could be de-duplicated.
Note from the Author or Editor: Thanks for noticing this. The 3rd sentence should be changed from : "In addition to the data paths, however,, there are also error paths." to "In addition to the data paths, however, there are also error paths."
|
Lars Utterstrom |
Feb 22, 2013 |
|
| PDF |
Page 367
Question 3 Answer D |
Please retract my earlier report of this error. The error is actually in the Lesson Review section, not the Answers section.
'The Lookup task cache mode property'
should read
'The Lookup transformation SqlCommand property'
Note from the Author or Editor: Agree. The question 3, answer D should be changed from:
"The Lookup task cache mode property" to
"The Lookup transformation SqlCommand property".
GJ
|
ScottVK |
Feb 03, 2013 |
|
| Printed, PDF |
Page 408
2nd paragraph |
"After the package has been created from a user-defined template, the value of its ID property will be the same as the one in the template."
While this was true in previous versions of SSIS, this is no longer true in the current version. New Package ID's are generated automatically now.
Also, in Exercise 2 (page 410), steps 6 and 7 are no longer required for this same reason.
Note from the Author or Editor: We need to check this behavior with the vendor.
ML
|
Malcolm |
Feb 05, 2013 |
|
| Printed, PDF |
Page 469
2nd paragraph |
A couple of minor wording items, for your next printing.
You refer to the "Object Browser" in SSMS. The SQL Query Analyzer had an Object Browser, and SSDT has one too, but SSMS has always used "Object Explorer" for some reason.
Also, you describe SSDT variously as SQL Server Development Tools, and SQL Server Data Tools.
Note from the Author or Editor: The reference "SQL Server Development Tools" is used three times throughout the book; all of these occurrences should be replaced with "SQL Server Data Tools".
"Object Browser" (used 8 times) and "Object Explorer" (used >10 times) references must be verified against each particular context, where one or the other development tool is referenced.
ML
|
Malcolm |
Feb 06, 2013 |
|
| Printed, PDF |
Page 481
Principals section, 1st paragraph |
There isn't an SSISDB stored proc called "catalog.configure_server".
Perhaps you mean "catalog.configure_catalog"
Note from the Author or Editor: True. Any and all references to "catalog.configure_server" should be replaced with "catalog.configure_catalog" (that is, once on page 481 and once in the Index, on page 772).
ML
|
Malcolm |
Feb 07, 2013 |
|
| Printed, PDF |
Page 507
Top |
Quick Check Answer reads
"On the SSISDB, project, and package levels"
It should read
"On the SSISDB, Folder, and Package levels"
Predefined reports are not available on the Project level.
Note from the Author or Editor: Unable to check at the moment, but I suspect the reader is correct.
Will respond with a more definite answer ASAP.
ML
UPDATE: The reader is only partially correct.
The text of the Quick Check Answer should be changed to:
"On the SSISDB catalog, folder, project, and package levels."
ML
|
Malcolm |
Feb 08, 2013 |
|
| Printed |
Page 508
Exercise 1, Step 1 |
In addition to re-running the script from chapter 5 code folder you also need to open the TK463Chapter13.sql file and run the first section to create the stg.SalesTerritory table. This step is missing from the instructions.
Note from the Author or Editor: Exercise 1, Step 1 on page 508 should have an additional statement after the existing text "If you are missing the database objects from Chapter 5, “Designing and Implementing Data Flow,” execute the needed SQL code from that chapter to have all the stage and dimension tables available in the TK463DW database. "
Should have an additional sentence at the end:
Start SSMS and connect to your SQL Server instance. Open a new query window by clicking the New Query button. Select the TK463DW database in the database drop-down list. Create the stg.SalesTerritory staging table by executing the following SQL statement.
CREATE TABLE stg.SalesTerritory
(
TerritoryID INT NULL,
Name NVARCHAR(50) NULL,
CountryRegionCode NVARCHAR(10) NULL,
[Group] NVARCHAR(50) NULL,
ModifiedDate DATETIME NULL
);
|
Zack Jones |
May 02, 2013 |
|
| Printed, PDF |
Page 538
Exercise 1, Check for Data Quality Issues |
In the list of tables to check for data quality issues, there is a duplicate. Nice if you enjoy the irony. :-)
Note from the Author or Editor: Truly:-)
Delete the last row, i.e. the last bullet on the page, where DimDate appears for the second time.
|
Malcolm |
Feb 09, 2013 |
|
| Printed |
Page 628
Quick Check Answer |
Excel 2012 should be Excel 2010.
Note from the Author or Editor: The Quick Check answer should be corrected from
"Quick Check Answer
■■ Use Excel 2012 with MDS Add-in for Excel to update batches of data in an MDS
model."
to
"Quick Check Answer
■■ Use Excel 2010 with MDS Add-in for Excel to update batches of data in an MDS
model."
|
Zack Jones |
May 09, 2013 |
|
| PDF |
Page 644
Exercise 2 Step 18 |
"Then enter the following string as the
expression: \p{L}+\d\d@ADVENTURE-WORKS\.COM."
should read
"Then enter the following string as the
expression: \p{L}+\d@ADVENTURE-WORKS\.COM."
Note from the Author or Editor: The regular expression in step 18 at the bottom of the page, which is currently
\p{L}+\d\d@ADVENTURE -WORKS \.COM
should be modified to:
\p{L}+\d@ADVENTURE -WORKS \.COM
|
ScottVK |
Feb 05, 2013 |
|
| Printed, PDF |
Page 728
second and 3d paragraph Deploy.bat |
gacutil fails with "Failure adding assembly to the cache: Attempt to install an assembly without a strong name."
There should be a reference to instructions for signing the assembly.
Note from the Author or Editor: Additional steps must be added to Exercise 2 of Lesson 3, Chapter 19, instructing the student how to digitally sign the assembly.
|
Bodhi Densmore |
Mar 27, 2013 |
|
|