Speed in Object Creation and. Destruction. March 2016 Number 49. Tamar E. Granor, Ph.D.

Size: px
Start display at page:

Download "Speed in Object Creation and. Destruction. March 2016 Number 49. Tamar E. Granor, Ph.D."

Transcription

1 Speed in Object Creation and Destruction Does the approach you choose for creating and destroying objects have an impact on performance? Tamar E. Granor, Ph.D. March 2016 Number 49 1 Know How... Speed in Object Creation and Destruction Tamar E. Granor, PhD 7 Deep Dive Taking Advantage of the Windows API Doug Hennig 13 Future We Want To Go To SQL Whil Hentzen 16 VFPX Thor Creating and Sharing Tools Rick Schummer A client asked me to speed up part of an application. In doing so, I was forced to re-evaluate one of my personal best practices: using NewObject() rather than CreateObject() to instantiate objects. One of my goals is to let each line of code I write stand alone as much as possible. So, for example, I always include the IN clause to specify the work area for any command that accepts it. Similarly, I prefer to use NewObject() to create objects rather than CreateObject(), because the latter assumes that the right class library has already been identified via SET CLASSLIB or SET PROCEDURE. But a few months ago, a client asked me to see if I could speed up a key process in their application. Data from this application is stored as XML and, at the user s request, read into tables, and then converted into a complex object hierarchy. For a small dataset, the hierarchy might contain 1,500 objects; for a large one, perhaps 30,000. Users were finding the process of converting from XML to DBFs to objects painfully slow. In the process of speeding it up, I compared the performance of CreateObject() and NewObject(). I found that CreateObject() was faster by about a third, so changed the application to use CreateObject for almost all object instantiation. When I presented these results at Southwest Fox 2015 as part of a session on optimization, some interesting questions were raised about the speed of both instantiating and destroying objects. So I decided to dig deeper. Quick review Both CreateObject() and NewObject() can be used to instantiate classes from either VCX-based class libraries or PRG-based code classes. The primary difference between them is that NewObject() accepts a parameter to specify the class library (either VCX or PRG). CreateObject() expects to find the specified class in either a VCX or a PRG that has already been specified via SET CLASSLIB or SET PROCEDURE. Listing 1 shows a simple example of each.

2 Listing 1. With CreateObject(), the class definition must already be visible, while NewObject() lets you specify the class library on the fly. LOCAL o * With CREATEOBJECT(), make sure to * SET CLASSLIB first MyClasses O = CREATEOBJECT("cusMyClass") * With NEWOBJECT(), you can specify the * class library directly. O = NEWOBJECT("cusMyClass", "MyClasses") Given the additional work it must do to find the right class library, it s not surprising that CreateObject() is somewhat faster than NewObject(). What I wanted to know was how much faster and under what circumstances. Because the same application seemed very slow when closing, I was also interested in the speed of destroying objects, and whether some ways of doing so might be faster than others. Test methodology As I mentioned in my last article, doing timing tests in Windows is tricky. For these tests, I did my best to make sure not to have side effects that would interfere with accuracy. I ran each test on two different machines, closing any applications I could that might be doing things in the background. On my notebook, I ran one set of tests across my network (that is, using class libraries stored on a different machine) and one set locally. For the local tests on the notebook, I disconnected from the network. Most importantly for these tests, after each individual test, I shut down VFP and restarted it to avoid caching effects. My test code is included in this month s downloads as ObjectCDTests.PRG. (The classes used for testing are in ClassDefs.VCX, also included in this month s downloads.) The program accepts three parameters: a code for which test to run, a one-character code to identify the machine it s running on, and a flag to indicate whether it s running locally or across the network. Listing 2 shows a sample call. Listing 2. This line calls my program for testing object creation and destruction speed. This call runs test 3c on the laptop across the network. DO ObjectCDTests.PRG WITH "3c", "L",.T. The program is a giant CASE statement with a separate case for each test. Tests of the same thing use the same number, and are then lettered to distinguish them. For example, tests 1a through 1f test different ways of instantiating an object, while tests 2a through 2e test whether different ways of storing object references have an impact on instantiation speed. All told, there are nine sets of tests. Listing 3 shows one case. All the cases use the same basic structure; in particular, they all set up npasses, nstart and nend and use a DO WHILE loop to manage the timing test. Listing 3. Each test is one case in a large CASE statement. CASE m.ctest = "1a" * CreateObject() assuming SET CLASSLIB ClassDefs.VCX oobject = CREATEOBJECT("cusMinimal") CreateObject() vs. NewObject The first set of tests compare different ways of instantiating an object. Altogether, I tested six approaches to instantiating multiple copies of a single class: 1a) SET CLASSLIB once, then instantiate multiple instances with CreateObject() (Listing 3); 1b) Issue SET CLASSLIB right before each instantiation with CreateObject() (Listing 4); 1c) SET CLASSLIB once, then instantiate multiple instances with NewObject(); 1d) Do not SET CLASSLIB, instantiate multiple instances with NewObject(); 1e) SET CLASSLIB once, then check whether classlib is already set before each instantiation with CreateObject() (Listing 5); 1f) Do not SET CLASSLIB, then check whether classlib is already set before each instantiation with CreateObject(). Listing 4. This case tests CreateObject() with an explicit SET CLASSLIB for each instantiation. CASE m.ctest = "1b" * CreateObject() with explicit SET CLASSLIB ClassDefs.VCX oobject = CREATEOBJECT("cusMinimal") Listing 5. This code checks whether the appropriate class library has been set and SETs it, if not. In this test, it s already set. CASE m.ctest = "1e" * CreateObject() checking * SET CLASSLIB first ClassDefs.VCX Page 2 FoxRockX March 2016

3 IF NOT ("CLASSDEFS." $ SET("Classlib")) ClassDefs.VCX ENDIF oobject = CREATEOBJECT("cusMinimal") In these tests, the instantiated object is stored to the same variable on each pass, meaning that we don t hold on to the object between passes (which, of course, means that each object except the last is destroyed inside the test loop). The results of this group of tests make it obvious that the slow part is opening the VCX. The first version (1a), with a single SET CLASSLIB, is far faster than any of the others. The only one even close is 1e, and it still completes only about half as many passes in the same time. Version 1b, that issues SET CLASSLIB before each call to CREATEOBJECT(), is two orders of magnitude slower in the local case and three orders of magnitude slower in the networked case. With my computers, Test 1a averages over 300,000 instantiations per second with everything local, and around 250,000 instantiations per second across the network. Test 1b averages over 7,000 instantiations per second in the local case, and 330 instantiations per second in the networked case. The two versions that use NewObject(), 1c and 1d, get results very similar to case 1b. As with 1b, running them locally is about an order of magnitude faster than running them across the network. The cause of the slowness in cases 1b, 1c, and 1d became apparent when I looked at the results for 1e and 1f, the two cases that first check SET( CLASSLIB ) to see whether the VCX is already available. In 1e, where it is, my machines were able to instantiate over 170,000 objects per second. 1f, where the VCX is not already available and thus SET CLASSLIB is needed, completed about half as many instantiations as 1b, 1c and 1d in the local case; in the networked case, surprisingly, it was the same order of magnitude as 1b, 1c, and 1d, but it actually managed about 25% more passes. In other words, what makes NewObject() slower is finding and opening the VCX. When the file has to be found and opened before each instantiation, things slow down considerably. The one surprise in this group is 1c, where the specified class library is already available. I d expect VFP to notice that the class library is already open and not bother to open it. To understand why this case is also slow, I tried a very different test. I created a class with code in Init and Destroy to show the current value of SET( CLASSLIB ), as in Listing 6. Listing 6. This code in Init and Destroy helps us see how VFP handles access to class libraries with NewObject(). DEBUGOUT PROGRAM(), "Before DODEFAULT()", ; SET("classlib") DODEFAULT() DEBUGOUT PROGRAM(), "After DODEFAULT()", ; SET("classlib") I wrote a program (shown in Listing 7 and included in this month s downloads as TestSetClassLib.PRG) to instantiate an object using NewObject(), first with the appropriate class library not included in SET CLASSLIB, and then with it included. Listing 7. This code lets us see how NewObject() modifies SET( CLASSLIB ). LOCAL o DEBUGOUT "Test with NewObject" DEBUGOUT " " AddlClasses DEBUGOUT "Main before NO: ", SET("Classlib") o=newobject("cusnoteclasslib", "ClassDefs") DEBUGOUT "Main after NO: ", SET("Classlib") o=.null. DEBUGOUT " " DEBUGOUT "Test with NewObject with " + ; "classlib already set" DEBUGOUT " " AddlClasses, ClassDefs DEBUGOUT "Main before NO: ", SET("Classlib") o=newobject("cusnoteclasslib", "ClassDefs") DEBUGOUT "Main after NO: ", SET("Classlib") o=.null. Figure 1 shows the output from the program and explains why case 1c is slow. In order to ensure that the right class is instantiated, VFP rearranges the order of the class libraries (which, presumably, requires reopening one or more). After the object is instantiated, the original order of the list is restored. The lesson here is that if you can SET CLASSLIB and have some assurance that it won t change, CREATEOBJECT() is the way to go. Next best is to Figure 1. The underlined line, showing SET( CLASSLIB ) during instantiation, shows that the necessary class library has been moved to be first in the list of class libraries. March 2016 FoxRockX Page 3

4 check for the library and SET CLASSLIB, if necessary. In real applications, it s likely that you ll only have to SET CLASSLIB the first time you use a particular library, and after that, it ll be available. All that said, it s worth noting that even the slowest cases here were capable of instantiating my simple object hundreds of times per second. So, in many cases, it doesn t matter whether you use CreateObject() or NewObject(). My client s application, which involves instantiating thousands of objects while the user waits, is an exception. Where to store objects The next question I considered was whether it mattered how you store the object references, once you ve instantiated the objects. I tested storing to a single variable (thus releasing each object when the next was instantiated), storing each reference to a separate variable, storing all references to an array, storing all references to a collection that already existed, and storing them to a new collection. I tested these five cases with both CreateObject() (tests 2a-2e) and NewObject() (tests 3a-3e). Listing 8 shows three CreateObject() cases: storing to multiple variables, storing to an array, and storing to an existing collection. Listing 8. Testing whether it matters where you put the variable references. CASE m.ctest = "2b" * CreateObject to multiple vars ClassDefs.VCX * Declare the necessary variables FOR ncount = 1 TO ObjectCount cvarname = "oobject" + ; ALLTRIM(TRANSFORM(m.nCount)) LOCAL (cvarname) STORE CREATEOBJECT("cusMinimal") TO ; ("oobject" + ; ALLTRIM(TRANSFORM(m.nCount))) CASE m.ctest = "2c" * CreateObject to an array ClassDefs.VCX DIMENSION aobjects[objectcount] aobjects[m.ncount] = ; CREATEOBJECT("cusMinimal") CASE m.ctest = "2d" * CreateObject to an existing collection ClassDefs.VCX oobjectcollection = ; CREATEOBJECT("Collection") oobjectcollection.add( ; CREATEOBJECT("cusMinimal")) oobjectcollection.remove(-1) These tests didn t show much new information. The CreateObject() code was faster than the NewObject() code operating locally by an order of magnitude; similarly, the NewObject() version run locally was an order of magnitude faster than NewObject() across the network. With CreateObject(), the variation from fastest to slowest was less than an order of magnitude. Not surprisingly, storing to a single variable was fastest. (One weakness in this code is the need to use a name expression in the multiple variables case rather than hard-coding the appropriate variable name; that may slow down this test.) The slowest CreateObject() version was 2e, which creates a collection inside the loop and then adds each object to the collection. The network penalty with CreateObject() wasn t too big, varying from about 6% up to about 30%. With NewObject(), the single variable version was again fastest. But the difference between cases was small. The real differences here were local vs. network and between the two machines. As with the first group of tests, when using NewObject() and a locally stored VCX, my desktop machine completed an order of magnitude more passes than my notebook. (That s actually surprising, given that the notebook has a solid-state drive, and the desktop does not.) Once again, tests using a local VCX were an order of magnitude faster than those using a VCX stored elsewhere on the network. The bottom line here is that where you store object references doesn t matter very much. Use whichever works best for you. Page 4 FoxRockX March 2016

5 Instantiation from multiple classes My next set of tests was designed to see whether instantiating objects from more than one class changed the timing equation. The previous tests worked with cusminimal, a subclass of Custom with no added PEMs and no changes to the default. I added a second class to ClassDefs.VCX; cussmall is also subclassed from Custom, but has four custom properties added. I then repeated the first three groups of tests (except for 1e and 1f), with each pass instantiating one object from cusminimal and one from cussmall. For example, Listing 9 shows test 4d, which measures performance of NewObject() without a corresponding SET CLASSLIB. Listing 9. Test groups 4, 5 and 6 look at performance when instantiating from multiple classes in the same class library. CASE m.ctest = "4d" * NewObject() without SET CLASSLIB oobject = NEWOBJECT("cusMinimal", ; "ClassDefs.VCX") oobjectt2 = NEWOBJECT("cusSmall", ; "ClassDefs.VCX") On the whole, these tests give similar results to the earlier tests. Because two objects are being instantiated on each pass rather than one, they complete about half as many passes in the same time as the earlier tests, though some actually do better than that. Object destruction I also compared various ways of destroying objects I d instantiated. Many of the earlier tests included implicit destruction of objects, but I wanted to test in a more controlled way. For each group of destruction tests, I held the method of instantiation and the storage method constant, and varied the ways of destroying the objects. The first group (tests 7a to 7c) involved objects stored in distinct individual variables. I tested destroying them with RELEASE ALL (actually, RELEASE ALL LIKE since I couldn t release all variables used for the test), with individual RELEASE commands and by setting each to.null. Listing 10 shows the first of these tests, using RELEASE ALL LIKE. Listing 10. The first group of object destruction tests looks at objects stored in individual variables. Here, they re all destroyed by releasing all the variables. CASE m.ctest = "7a" * Destroy via RELEASE ALL. Can't test unless * we use RELEASE ALL LIKE. ClassDefs.VCX * Declare the necessary variables FOR ncount = 1 TO ObjectCount cvarname = "oobject" + ; ALLTRIM(TRANSFORM(m.nCount)) LOCAL (cvarname) STORE CREATEOBJECT("cusMinimal") TO ; ("oobject" + ; ALLTRIM(TRANSFORM(m.nCount))) * Now release RELEASE ALL LIKE oobject* I found no significant difference between the three approaches. The differences between the two machines and between different runs on the same machine were as large as the differences between the various approaches. The next set of tests (8a through 8c) looked at objects stored in a collection. Again, I tried three ways of destroying them: by releasing the collection variable; by calling the collection s Remove method, passing -1 as a parameter, so all were removed at once; and by setting the collection variable to.null. Note that in each of these cases, you end up with something slightly different. In the first case, not only are the objects gone, but so is the collection. In the second case, you re left with an empty collection. In the third case, the variable that held the collection still exists, but no longer holds a collection. Listing 11 shows test 8b, a call to the collection s Remove method. Listing 11. Here, we remove all objects from the collection, causing them to be destroyed. CASE m.ctest = "8b" * Objects in collection, REMOVE ClassDefs.VCX LOCAL oobjectcollection oobjectcollection = ; CREATEOBJECT("Collection") oobjectcollection.add( ; CREATEOBJECT("cusMinimal")) oobjectcollection.remove(-1) March 2016 FoxRockX Page 5

6 As with the prior group, the differences between the two machines, between the local and the networked cases, and between different runs of the same test were larger than any differences between the different approaches. The final group of tests compared two approaches to destroying members of a collection one by one. Both tests use the collection s Remove method. Test 9a loops backward, removing the specified item, while test 9b loops forward, always removing the first item. Listing 12 shows test 9a, looping backward. (Removing a specified item requires looping backward because the size of the collection changes with each item removed.) Listing 12. In removing collection items, there s no significant performance difference between looping backward removing the nth item on each pass, and looping forward, always removing the first item. CASE m.ctest = "9a" * Objects in collection, RELEASE ClassDefs.VCX LOCAL oobjectcollection oobjectcollection = ; CREATEOBJECT("Collection") oobjectcollection.add( ; CREATEOBJECT("cusMinimal")) FOR ncount = OBJECTCOUNT TO 1 STEP -1 oobjectcollection.remove(m.ncount) Again, there was no significant difference between the approaches. What about PRGs? I wondered whether the same rules would apply to classes defined with code in PRG files, so I created corresponding PRG-based classes and modified the tests to use those with SET PROCEDURE. The class definitions are included in this month s downloads as ClassDefs.PRG, while the tests are in ObjectCDTestsPrg.PRG I found that the same basic rules applied, in terms of which approaches were faster. What was a surprise to me was that in most cases, using VCXbased classes was faster. Specifically, in about 10% of my test runs (where a test run is the combination of a particular case, a particular machine and a particular setting of across the network or not), the PRG-based tests completed more passes. In those cases, the difference was mostly within 10%. A few tests were within 1%, close enough to be considered equivalent. In the remaining roughly 87% of the tests, the VCX-based version completed more passes. These tests averaged about 85% faster, but ranged from completing a little more than 1% more passes up to completing about four times (400%) as many passes. All of the tests where PRG was faster than VCX were run on my laptop and all but one were conducted across the network. That suggests to me that the real difference here might have to do with the fact that the PRG is 140 bytes, while the combination of the VCX and VCT is more than 4 KB. The bottom line The most important lesson here, I think, is that object creation and destruction is fast. Except when looking for class libraries across a network, VFP can create or destroy thousands, tens of thousands, even hundreds of thousands of objects per second. The second big takeaway is that SETting CLASSLIB once and using CreateObject() is an order of magnitude faster than using NewObject(). Finding a class library is actually the slow part; when doing so across a network, you lose another order of magnitude. That instantiating a class from a VCX is faster than doing so from a PRG is worth more investigation. One case to test is the difference between having the class defined in the same PRG that uses it vs. having it in a separate PRG. Another open question is how all this works when the class has lots of properties and custom code. These tests looked only at small classes. Finally, the slowness on closing my client s application turned out to have nothing to do with object destruction. About the same time I was performing these tests, I found that the code to save the data was doing a lot of extra work; a couple of minor tweaks to ensure that only changed data is resaved sped things up considerably in most cases. Author Profile Tamar E. Granor, Ph.D. is the owner of Tomorrow s Solutions, LLC. She has developed and enhanced numerous Visual FoxPro applications for businesses and other organizations. Tamar is author or co-author of a dozen books including the award winning Hacker s Guide to Visual Fox- Pro, Microsoft Office Automation with Visual FoxPro and Taming Visual FoxPro s SQL. Her latest collaboration is VFPX: Open Source Treasure for the VFP Developer, available at Her other books are available from Hentzenwerke Publishing ( Tamar was a Microsoft Support Most Valuable Professional from the program's inception in 1993 until She is one of the organizers of the annual Southwest Fox conference. In 2007, Tamar received the Visual FoxPro Community Lifetime Achievement Award. You can reach her at tamar@thegranors.com or through Page 6 FoxRockX March 2016

Try Thor s Terrific Tools, Part 2

Try Thor s Terrific Tools, Part 2 Try Thor s Terrific Tools, Part 2 Thor offers lots of tools for working with classes and forms. Learning to use them can make you more productive. Tamar E. Granor, Ph.D. In my last article, I showed a

More information

Give Thor Tools Options

Give Thor Tools Options Give Thor Tools Options The framework for specifying and using options for Thor Tools is elegant and easy to use. Tamar E. Granor, Ph.D. In my last article, I showed how to add your own tools to Thor.

More information

Splitting a Procedure File

Splitting a Procedure File Splitting a Procedure File It s easier to maintain separate program files rather than one monolithic procedure file. This utility makes it easy. Tamar E. Granor, Ph.D. Procedure files have been part of

More information

Consolidate data from a field into a list

Consolidate data from a field into a list Consolidate data from a field into a list This task is hard in VFP, but SQL Server provides two ways to do it. Tamar E. Granor, Ph.D. Some SQL commands were added to FoxPro 2.0 and I fell in love with

More information

Handling crosstabs and other wide data in VFP reports

Handling crosstabs and other wide data in VFP reports Handling crosstabs and other wide data in VFP reports When the data you want to report on has many columns, you have a few options. One takes advantage of VFP s fl exibility. Tamar E. Granor, Ph.D. In

More information

You can use PIVOT even when you don t know the list of possible values, and you can unpivot in order to normalize unnormalized data.

You can use PIVOT even when you don t know the list of possible values, and you can unpivot in order to normalize unnormalized data. More on PIVOT You can use PIVOT even when you don t know the list of possible values, and you can unpivot in order to normalize unnormalized data. Tamar E. Granor, Ph.D. In my last article, I explored

More information

Generating crosstabs in VFP

Generating crosstabs in VFP Generating crosstabs in VFP Several tools make it easy to change from normalized data to crosstabbed data with both rows and columns determined by the data in the set. Tamar E. Granor, Ph.D. One of the

More information

Including missing data

Including missing data Including missing data Sometimes an outer join isn t suffi cient to ensure that all the desired combinations are shown. Tamar E. Granor, Ph.D. In my recent series on the OVER clause, I failed to mention

More information

Extend your queries with APPLY

Extend your queries with APPLY Extend your queries with APPLY SQL Server offers a way to combine tables with table-valued functions, and to create the equivalent of correlated derived tables. Tamar E. Granor, Ph.D. As I ve been digging

More information

VFP: Ideal for Tools, Part 3

VFP: Ideal for Tools, Part 3 VFP: Ideal for Tools, Part 3 The VFP language supports programmatic manipulation of programs and projects, providing more options for creating developer tools. Tamar E. Granor, Ph.D. The first two parts

More information

Graphing crosstabs. Tamar E. Granor, Ph.D.

Graphing crosstabs. Tamar E. Granor, Ph.D. Graphing crosstabs A picture is said to be worth 1000 words, so it s not surprising that a graph or chart makes data much easier to understand. There are multiple ways to put VFP data into a graph or chart.

More information

Understanding Business Objects, Part 1

Understanding Business Objects, Part 1 Understanding Business Objects, Part 1 A well-designed set of business objects forms the engine for your application, but learning to create and use business objects has been a struggle for this author.

More information

Summarizing aggregated data, Part 1

Summarizing aggregated data, Part 1 Summarizing aggregated data, Part 1 SQL Server s ROLLUP clause lets you put totals, averages and more from subsets of your computed dta right into the same cursor. Tamar E. Granor, Ph.D. This series of

More information

PIVOT = Crosstabs, SQL Style

PIVOT = Crosstabs, SQL Style PIVOT = Crosstabs, SQL Style SQL Server s PIVOT keyword lets you create crosstabs Tamar E. Granor, Ph.D. A crosstab is a result table or cursor where the set of columns is based on data values in the source.

More information

Sending crosstabs to Excel

Sending crosstabs to Excel Sending crosstabs to Excel In many cases, users need the ability to do more with data once it s been crosstabbed. There are a number of ways to get it there, including creating Excel Pivot Tables. Tamar

More information

Handling hierarchical data

Handling hierarchical data Handling hierarchical data SQL Server offers two different tools that make working with hierarchies like organization charts and bills of materials much easier than in VFP. Tamar E. Granor, Ph.D. In my

More information

Splitting Up is Hard to Do Doug Hennig

Splitting Up is Hard to Do Doug Hennig Splitting Up is Hard to Do Doug Hennig While they aren t used everywhere, splitter controls can add a professional look to your applications when you have left/right or top/bottom panes in a window. This

More information

uilding Your Own Builders with BuilderB Doug Hennig and Yuanitta Morhart

uilding Your Own Builders with BuilderB Doug Hennig and Yuanitta Morhart uilding Your Own Builders with BuilderB Doug Hennig and Yuanitta Morhart Builders make it easy to set properties for objects at design time, which is especially handy for containers which you normally

More information

Working with dates and times in SQL Server

Working with dates and times in SQL Server Working with dates and times in SQL Server SQL Server gives you plenty of power for working with dates, times and datetimes. Tamar E. Granor, Ph.D. One of the things that makes VFP easy to work with is

More information

Making the Most of the Toolbox

Making the Most of the Toolbox Making the Most of the Toolbox Session 15 Tamar E. Granor, Ph.D. Tomorrow s Solutions, LLC 8201 Cedar Road Elkins Park, PA 19027 Phone: 215-635-1958 Email: tamar@tomorrowssolutionsllc.com Web: www.tomorrowssolutionsllc.com

More information

Taking Control Doug Hennig

Taking Control Doug Hennig Taking Control Doug Hennig This month, Doug Hennig discusses a simple way to make anchoring work the way you expect it to and how to control the appearance and behavior of a report preview window. There

More information

Custom UI Controls: Splitter

Custom UI Controls: Splitter Custom UI Controls: Splitter Doug Hennig Adding a splitter control to your forms gives them a more professional behavior and allows your users to decide the relative sizes of resizable controls. Over the

More information

Understanding Business Objects, Part 3

Understanding Business Objects, Part 3 Understanding Business Objects, Part 3 Once you have business objects, you need to connect them to the user interface. Plus changing the application is easier than when business logic and UI code are mingled

More information

A Generic Import Utility, Part 2

A Generic Import Utility, Part 2 A Generic Import Utility, Part 2 Doug Hennig Part 1 of this two-part series presented a set of classes making up a generic import utility you can add to your applications to provide import capabilities

More information

I Got Rendered Where? Part II Doug Hennig

I Got Rendered Where? Part II Doug Hennig I Got Rendered Where? Part II Doug Hennig Thanks to the new ReportListener in VFP 9, we have a lot more control over where reports are rendered. Last month, Doug Hennig showed a listener that collaborates

More information

A New IDE Add-on: FoxTabs Doug Hennig

A New IDE Add-on: FoxTabs Doug Hennig A New IDE Add-on: FoxTabs Doug Hennig FoxTabs provides easy access to all open windows in your VFP IDE. However, not only is it a great tool, it uses some very cool techniques to do its magic, including

More information

Manage Your Applications Doug Hennig

Manage Your Applications Doug Hennig Manage Your Applications Doug Hennig This month s article presents a simple yet useful tool, and discusses several reusable techniques used in this tool. If you re like me, your hard drive (or your server

More information

IntelliSense at Runtime Doug Hennig

IntelliSense at Runtime Doug Hennig IntelliSense at Runtime Doug Hennig VFP 9 provides support for IntelliSense at runtime. This month, Doug Hennig examines why this is useful, discusses how to implement it, and extends Favorites for IntelliSense

More information

The Mother of All TreeViews, Part 2 Doug Hennig

The Mother of All TreeViews, Part 2 Doug Hennig The Mother of All TreeViews, Part 2 Doug Hennig Last month, Doug presented a reusable class that encapsulates most of the desired behavior for a TreeView control. He discussed controlling the appearance

More information

Christmas Stocking Stuffers Doug Hennig

Christmas Stocking Stuffers Doug Hennig Christmas Stocking Stuffers Doug Hennig Visual FoxPro has a lot more places to put code than FoxPro 2.x. This month s column examines the advantages and disadvantages of creating classes for library routines.

More information

A New Beginning Doug Hennig

A New Beginning Doug Hennig A New Beginning Doug Hennig The development world is moving to reusable components. As goes the world, so goes Doug s column. We ll start off the new Best Tools column with SFThermometer, a handy progress

More information

Advanced Uses for Dynamic Form

Advanced Uses for Dynamic Form Advanced Uses for Dynamic Form Doug Hennig Dynamic Form is an under-used project in VFPX. Its ability to create forms quickly and dynamically isn t something every developer needs but if you need it, Dynamic

More information

Data Handling Issues, Part I Doug Hennig

Data Handling Issues, Part I Doug Hennig Data Handling Issues, Part I Doug Hennig The ability to handle multiple sets of data is a frequent requirement in business applications. So is the management of primary key values for tables. In this first

More information

CATCH Me if You Can Doug Hennig

CATCH Me if You Can Doug Hennig CATCH Me if You Can Doug Hennig VFP 8 has structured error handling, featuring the new TRY... CATCH... FINALLY... ENDTRY structure. This powerful new feature provides a third layer of error handling and

More information

Data-Drive Your Applications Doug Hennig

Data-Drive Your Applications Doug Hennig Data-Drive Your Applications Doug Hennig As VFP developers, we re used to storing application data in tables. However, another use for tables is to store information about application behavior. This month

More information

May I See Your License? Doug Hennig

May I See Your License? Doug Hennig May I See Your License? Doug Hennig If you develop commercial applications, you may want to provide multiple levels of your application depending on what your users paid for, and prevent unauthorized users

More information

Session V-STON Stonefield Query: The Next Generation of Reporting

Session V-STON Stonefield Query: The Next Generation of Reporting Session V-STON Stonefield Query: The Next Generation of Reporting Doug Hennig Overview Are you being inundated with requests from the users of your applications to create new reports or tweak existing

More information

Role-Based Security, Part III Doug Hennig

Role-Based Security, Part III Doug Hennig Role-Based Security, Part III Doug Hennig This month, Doug Hennig winds up his series on role-based security by examining a form class responsible for maintaining users and roles. In my previous two articles,

More information

## Version: FoxPro 7.0 ## Figures: ## File for Subscriber Downloads: Publishing Your First Web Service Whil Hentzen

## Version: FoxPro 7.0 ## Figures: ## File for Subscriber Downloads: Publishing Your First Web Service Whil Hentzen ## Version: FoxPro 7.0 ## Figures: ## File for Subscriber Downloads: Publishing Your First Web Service Whil Hentzen Web Services The Buzzword of the 02s! It s nothing really new, however, any more than

More information

Heuristic Evaluation of Team Betamax

Heuristic Evaluation of Team Betamax Heuristic Evaluation of Team Betamax Eric Gallimore Connor Riley Becky Scholl Chris Stone November 4, 2006 Overview Evaluation Let s just state for the record that we like this a whole lot better than

More information

Much ADO About Something Doug Hennig

Much ADO About Something Doug Hennig Much ADO About Something Doug Hennig The release of the OLE DB provider for VFP means better performance and scalability for applications that need to access VFP data via ADO. However, there are some interesting

More information

Extending the VFP 9 IDE Doug Hennig

Extending the VFP 9 IDE Doug Hennig Extending the VFP 9 IDE Doug Hennig One of the key themes in VFP 9 is extensibility. You can extend the VFP 9 Report Designer through report events and the reporting engine through the new ReportListener

More information

Using TLC to Check Inductive Invariance

Using TLC to Check Inductive Invariance Using TLC to Check Inductive Invariance Leslie Lamport 23 August 2018 1 Inductive Invariance Suppose we have a specification with initial predicate Init and next-state predicate Next, so its specification

More information

Warewolf User Guide 1: Introduction and Basic Concepts

Warewolf User Guide 1: Introduction and Basic Concepts Warewolf User Guide 1: Introduction and Basic Concepts Contents: An Introduction to Warewolf Preparation for the Course Welcome to Warewolf Studio Create your first Microservice Exercise 1 Using the Explorer

More information

FoxcodePlus - New features for IntelliSense Microsoft Visual FoxPro 9 By Rodrigo D. Bruscain Version Beta Last updated May 26, 2013

FoxcodePlus - New features for IntelliSense Microsoft Visual FoxPro 9 By Rodrigo D. Bruscain Version Beta Last updated May 26, 2013 FoxcodePlus - New features for IntelliSense Microsoft Visual FoxPro 9 By Rodrigo D. Bruscain Version Beta 3.13.2 Last updated May 26, 2013 FoxcodePlus does not replace VFP's IntelliSense; it enhances VFP

More information

Taking Advantage of Idle Cycles. Make Your Application Work When the User Isn't. The Idea. The Strategy. December, 2003

Taking Advantage of Idle Cycles. Make Your Application Work When the User Isn't. The Idea. The Strategy. December, 2003 December, 2003 Taking Advantage of Idle Cycles Make Your Application Work When the User Isn't by Tamar E. Granor, Technical Editor A couple of years ago at a conference, a fellow asked me if there was

More information

Windows Event Binding Made Easy Doug Hennig

Windows Event Binding Made Easy Doug Hennig Windows Event Binding Made Easy Doug Hennig A feature available in other development environments but missing in VFP is the ability to capture Windows events. VFP 9 extends the BINDEVENT() function to

More information

Web Page Components Doug Hennig

Web Page Components Doug Hennig Web Page Components Doug Hennig With its fast and powerful string functions, VFP is a great tool for generating HTML. This month, Doug Hennig shows how you can treat Web pages as a collection of reusable

More information

Build Your Own Project Tools

Build Your Own Project Tools Build Your Own Project Tools VFP makes it easy to write code to explore and manipulate projects and their contents. Tamar E. Granor, Ph.D. While Visual FoxPro's Project Manager doesn't offer much in the

More information

Taskbar: Working with Several Windows at Once

Taskbar: Working with Several Windows at Once Taskbar: Working with Several Windows at Once Your Best Friend at the Bottom of the Screen How to Make the Most of Your Taskbar The taskbar is the wide bar that stretches across the bottom of your screen,

More information

A File Open Dialog Doug Hennig

A File Open Dialog Doug Hennig A File Open Dialog Doug Hennig A File Open dialog is a better approach than having a long list of forms appear in the File menu. This article presents a reusable File Open dialog that supports grouping

More information

Working with the Registry. The Registry class makes it easy. The Registry Structure. January, By Tamar E. Granor

Working with the Registry. The Registry class makes it easy. The Registry Structure. January, By Tamar E. Granor January, 2002 Working with the Registry The Registry class makes it easy By Tamar E. Granor The Windows Registry is full of information about the user, his or her settings, the installed software and the

More information

COMP 273 Winter physical vs. virtual mem Mar. 15, 2012

COMP 273 Winter physical vs. virtual mem Mar. 15, 2012 Virtual Memory The model of MIPS Memory that we have been working with is as follows. There is your MIPS program, including various functions and data used by this program, and there are some kernel programs

More information

(Refer Slide Time 00:01:09)

(Refer Slide Time 00:01:09) Computer Organization Part I Prof. S. Raman Department of Computer Science & Engineering Indian Institute of Technology Lecture 3 Introduction to System: Hardware In the previous lecture I said that I

More information

Sets. Sets. Examples. 5 2 {2, 3, 5} 2, 3 2 {2, 3, 5} 1 /2 {2, 3, 5}

Sets. Sets. Examples. 5 2 {2, 3, 5} 2, 3 2 {2, 3, 5} 1 /2 {2, 3, 5} Sets We won t spend much time on the material from this and the next two chapters, Functions and Inverse Functions. That s because these three chapters are mostly a review of some of the math that s a

More information

Binary, Hexadecimal and Octal number system

Binary, Hexadecimal and Octal number system Binary, Hexadecimal and Octal number system Binary, hexadecimal, and octal refer to different number systems. The one that we typically use is called decimal. These number systems refer to the number of

More information

LECTURE 11. Memory Hierarchy

LECTURE 11. Memory Hierarchy LECTURE 11 Memory Hierarchy MEMORY HIERARCHY When it comes to memory, there are two universally desirable properties: Large Size: ideally, we want to never have to worry about running out of memory. Speed

More information

Efficient String Concatenation in Python

Efficient String Concatenation in Python Efficient String Concatenation in Python An assessment of the performance of several methods Source : http://www.skymind.com/~ocrow/python_string/ Introduction Building long strings in the Python progamming

More information

2

2 1 2 3 4 5 All resources: how fast, how many? If all the CPUs are pegged, that s as fast as you can go. CPUs have followed Moore s law, the rest of the system hasn t. Not everything can be made threaded,

More information

HIGH-IMPACT SEO DIY IN 5 MINUTES SEO OR LESS. Digital Marketer Increase Engagement Series

HIGH-IMPACT SEO DIY IN 5 MINUTES SEO OR LESS. Digital Marketer Increase Engagement Series DIY SEO HIGH-IMPACT SEO IN 5 MINUTES OR LESS Digital Marketer Increase Engagement Series DIY SEO: HIGH-IMPACT SEO IN 5 MINUTES OR LESS Brought To You By: Digital Marketer PUBLISHED BY: HOW TO SEO A WORDPRESS

More information

Chapter 2 The Office Servers

Chapter 2 The Office Servers Section I Chapter 2: The Office Servers 11 Chapter 2 The Office Servers Learning about the Office servers is a challenging task, but there are a variety of approaches, tools, and resources available. Certain

More information

REVIEW: A LOOK AT A PORTABLE USB3 NETWORK TAP WIRESHARK HEROES SERIES VISIT

REVIEW: A LOOK AT A PORTABLE USB3 NETWORK TAP WIRESHARK HEROES SERIES VISIT REVIEW: A LOOK AT A PORTABLE USB3 NETWORK TAP WIRESHARK HEROES SERIES VISIT WWW.PROFITAP.COM INTRODUCTION JASPER BONGERTZ TECHNICAL CONSULTANT FOR AIRBUS DEFENCE A while ago I wrote a post for LoveMyTool

More information

Zip it, Zip it Good Doug Hennig

Zip it, Zip it Good Doug Hennig Zip it, Zip it Good Doug Hennig This month s article presents a class to zip and pack the files in a project, and a class to interface VFP with a zipping utility like WinZip. Combining these classes with

More information

Divisibility Rules and Their Explanations

Divisibility Rules and Their Explanations Divisibility Rules and Their Explanations Increase Your Number Sense These divisibility rules apply to determining the divisibility of a positive integer (1, 2, 3, ) by another positive integer or 0 (although

More information

XP: Backup Your Important Files for Safety

XP: Backup Your Important Files for Safety XP: Backup Your Important Files for Safety X 380 / 1 Protect Your Personal Files Against Accidental Loss with XP s Backup Wizard Your computer contains a great many important files, but when it comes to

More information

Excel Basics: Working with Spreadsheets

Excel Basics: Working with Spreadsheets Excel Basics: Working with Spreadsheets E 890 / 1 Unravel the Mysteries of Cells, Rows, Ranges, Formulas and More Spreadsheets are all about numbers: they help us keep track of figures and make calculations.

More information

Virtualization. Q&A with an industry leader. Virtualization is rapidly becoming a fact of life for agency executives,

Virtualization. Q&A with an industry leader. Virtualization is rapidly becoming a fact of life for agency executives, Virtualization Q&A with an industry leader Virtualization is rapidly becoming a fact of life for agency executives, as the basis for data center consolidation and cloud computing and, increasingly, as

More information

» How do I Integrate Excel information and objects in Word documents? How Do I... Page 2 of 10 How do I Integrate Excel information and objects in Word documents? Date: July 16th, 2007 Blogger: Scott Lowe

More information

The Dynamic Typing Interlude

The Dynamic Typing Interlude CHAPTER 6 The Dynamic Typing Interlude In the prior chapter, we began exploring Python s core object types in depth with a look at Python numbers. We ll resume our object type tour in the next chapter,

More information

Midterm Exam, October 24th, 2000 Tuesday, October 24th, Human-Computer Interaction IT 113, 2 credits First trimester, both modules 2000/2001

Midterm Exam, October 24th, 2000 Tuesday, October 24th, Human-Computer Interaction IT 113, 2 credits First trimester, both modules 2000/2001 257 Midterm Exam, October 24th, 2000 258 257 Midterm Exam, October 24th, 2000 Tuesday, October 24th, 2000 Course Web page: http://www.cs.uni sb.de/users/jameson/hci Human-Computer Interaction IT 113, 2

More information

FoxTalk. LET S face it. You re going to have to learn Visual. Visual Basic for Dataheads: A New Beginning. Whil Hentzen

FoxTalk. LET S face it. You re going to have to learn Visual. Visual Basic for Dataheads: A New Beginning. Whil Hentzen FoxTalk Solutions for Microsoft FoxPro and Visual FoxPro Developers This is an exclusive supplement for FoxTalk subscribers. For more information about FoxTalk, call us at 1-800-788-1900 or visit our Web

More information

Your . A setup guide. Last updated March 7, Kingsford Avenue, Glasgow G44 3EU

Your  . A setup guide. Last updated March 7, Kingsford Avenue, Glasgow G44 3EU fuzzylime WE KNOW DESIGN WEB DESIGN AND CONTENT MANAGEMENT 19 Kingsford Avenue, Glasgow G44 3EU 0141 416 1040 hello@fuzzylime.co.uk www.fuzzylime.co.uk Your email A setup guide Last updated March 7, 2017

More information

9 R1 Get another piece of paper. We re going to have fun keeping track of (inaudible). Um How much time do you have? Are you getting tired?

9 R1 Get another piece of paper. We re going to have fun keeping track of (inaudible). Um How much time do you have? Are you getting tired? Page: 1 of 14 1 R1 And this is tell me what this is? 2 Stephanie x times y plus x times y or hm? 3 R1 What are you thinking? 4 Stephanie I don t know. 5 R1 Tell me what you re thinking. 6 Stephanie Well.

More information

Let's start by taking a look at the object generated by LIST OBJECTS. I used the following code to put a few objects in memory for testing:

Let's start by taking a look at the object generated by LIST OBJECTS. I used the following code to put a few objects in memory for testing: September, 2005 Advisor Answers Getting a list of objects in memory VFP 9/8 Q: I want to fill an array with a list of all the non-visual objects created using CreateObject() during runtime. Then, I can

More information

Public Meeting Agenda Formatting Best Practices

Public Meeting Agenda Formatting Best Practices DEFINITIVE GUIDE Public Meeting Agenda Formatting Best Practices In this guide, we will first walk you through some best practices with text and images. Then, we will show you how to execute the best practices

More information

Part I. Windows XP Overview, Installation, and Startup COPYRIGHTED MATERIAL

Part I. Windows XP Overview, Installation, and Startup COPYRIGHTED MATERIAL Part I Windows XP Overview, Installation, and Startup COPYRIGHTED MATERIAL Chapter 1 What s New in Windows XP? Windows XP suffers somewhat from a dual personality. In some ways it is a significant release,

More information

Introduction. 1.1 Who this book is for. This chapter covers. What the book will and won t teach The boundaries of this book Going beyond PowerShell

Introduction. 1.1 Who this book is for. This chapter covers. What the book will and won t teach The boundaries of this book Going beyond PowerShell Introduction This chapter covers What the book will and won t teach The boundaries of this book Going beyond PowerShell As of this writing, Windows PowerShell is approaching its sixth year of existence

More information

Base Classes Revisited Doug Hennig

Base Classes Revisited Doug Hennig Base Classes Revisited Doug Hennig Most VFP developers know you should never use the VFP base classes, but instead create your own set of base classes. It s time to blow the dust off the set of base classes

More information

In fact, as your program grows, you might imagine it organized by class and superclass, creating a kind of giant tree structure. At the base is the

In fact, as your program grows, you might imagine it organized by class and superclass, creating a kind of giant tree structure. At the base is the 6 Method Lookup and Constant Lookup As we saw in Chapter 5, classes play an important role in Ruby, holding method definitions and constant values, among other things. We also learned how Ruby implements

More information

Fractal Data Modeling

Fractal Data Modeling Fractal Data Modeling Fractal geometry creates beautiful patterns from simple recursive algorithms. One of the things we find so appealing is their self- similarity at different scales. That is, as you

More information

. social? better than. 7 reasons why you should focus on . to GROW YOUR BUSINESS...

. social? better than. 7 reasons why you should focus on  . to GROW YOUR BUSINESS... Is EMAIL better than social? 7 reasons why you should focus on email to GROW YOUR BUSINESS... 1 EMAIL UPDATES ARE A BETTER USE OF YOUR TIME If you had to choose between sending an email and updating your

More information

Cache Coherence Tutorial

Cache Coherence Tutorial Cache Coherence Tutorial The cache coherence protocol described in the book is not really all that difficult and yet a lot of people seem to have troubles when it comes to using it or answering an assignment

More information

Slide Set 8. for ENCM 369 Winter 2018 Section 01. Steve Norman, PhD, PEng

Slide Set 8. for ENCM 369 Winter 2018 Section 01. Steve Norman, PhD, PEng Slide Set 8 for ENCM 369 Winter 2018 Section 01 Steve Norman, PhD, PEng Electrical & Computer Engineering Schulich School of Engineering University of Calgary March 2018 ENCM 369 Winter 2018 Section 01

More information

Rescuing Lost Files from CDs and DVDs

Rescuing Lost Files from CDs and DVDs Rescuing Lost Files from CDs and DVDs R 200 / 1 Damaged CD? No Problem Let this Clever Software Recover Your Files! CDs and DVDs are among the most reliable types of computer disk to use for storing your

More information

1.7 Limit of a Function

1.7 Limit of a Function 1.7 Limit of a Function We will discuss the following in this section: 1. Limit Notation 2. Finding a it numerically 3. Right and Left Hand Limits 4. Infinite Limits Consider the following graph Notation:

More information

Contents Slide Set 9. Final Notes on Textbook Chapter 7. Outline of Slide Set 9. More about skipped sections in Chapter 7. Outline of Slide Set 9

Contents Slide Set 9. Final Notes on Textbook Chapter 7. Outline of Slide Set 9. More about skipped sections in Chapter 7. Outline of Slide Set 9 slide 2/41 Contents Slide Set 9 for ENCM 369 Winter 2014 Lecture Section 01 Steve Norman, PhD, PEng Electrical & Computer Engineering Schulich School of Engineering University of Calgary Winter Term, 2014

More information

Just Do This: Back Up!

Just Do This: Back Up! Just Do This: Back Up A Step-by-Step Plan To Back Up Your Computer Version 1.1 by Leo A. Notenboom An Ask Leo! ebook https:// ISBN: 978-1-937018-26-9 (PDF) ISBN: 978-1-937018-27-6 (ebook) ISBN: 978-1-937018-28-3

More information

Multiprocessor Cache Coherency. What is Cache Coherence?

Multiprocessor Cache Coherency. What is Cache Coherence? Multiprocessor Cache Coherency CS448 1 What is Cache Coherence? Two processors can have two different values for the same memory location 2 1 Terminology Coherence Defines what values can be returned by

More information

311 Predictions on Kaggle Austin Lee. Project Description

311 Predictions on Kaggle Austin Lee. Project Description 311 Predictions on Kaggle Austin Lee Project Description This project is an entry into the SeeClickFix contest on Kaggle. SeeClickFix is a system for reporting local civic issues on Open311. Each issue

More information

Module 6. Campaign Layering

Module 6.  Campaign Layering Module 6 Email Campaign Layering Slide 1 Hello everyone, it is Andy Mackow and in today s training, I am going to teach you a deeper level of writing your email campaign. I and I am calling this Email

More information

Tutorial on Using Windows 8

Tutorial on Using Windows 8 Tutorial on Using Windows 8 Finding things and doing things from the new Windows 8 interface. By Rand Morimoto (original blog post http://www.networkworld.com/community/blog/tutorial-using-windows-8#disqus_thread)

More information

Not long ago, home local area networks were proof of their owner s geekhood. They were very

Not long ago, home local area networks were proof of their owner s geekhood. They were very 03 54473X Ch01.qxd 12/24/03 8:35 AM Page 3 Chapter 1 What Is a LAN? Not long ago, home local area networks were proof of their owner s geekhood. They were very expensive, cantankerous, difficult to set

More information

It Might Be Valid, But It's Still Wrong Paul Maskens and Andy Kramek

It Might Be Valid, But It's Still Wrong Paul Maskens and Andy Kramek Seite 1 von 5 Issue Date: FoxTalk July 2000 It Might Be Valid, But It's Still Wrong Paul Maskens and Andy Kramek This month, Paul Maskens and Andy Kramek discuss the problems of validating data entry.

More information

Library Website Migration and Chat Functionality/Aesthetics Study February 2013

Library Website Migration and Chat Functionality/Aesthetics Study February 2013 Library Website Migration and Chat Functionality/Aesthetics Study February 2013 Summary of Study and Results Georgia State University is in the process of migrating its website from RedDot to WordPress

More information

Lecture 1: Overview

Lecture 1: Overview 15-150 Lecture 1: Overview Lecture by Stefan Muller May 21, 2018 Welcome to 15-150! Today s lecture was an overview that showed the highlights of everything you re learning this semester, which also meant

More information

Learn Linux in a Month of Lunches by Steven Ovadia

Learn Linux in a Month of Lunches by Steven Ovadia Learn Linux in a Month of Lunches by Steven Ovadia Sample Chapter 17 Copyright 2017 Manning Publications brief contents PART 1 GETTING LINUX UP AND RUNNING... 1 1 Before you begin 3 2 Getting to know Linux

More information

Give users a control that makes entering dates as easy as it is in Intuit Quicken.

Give users a control that makes entering dates as easy as it is in Intuit Quicken. April, 2005 Visual FoxPro 9/8/7 Easier Date Entry Give users a control that makes entering dates as easy as it is in Intuit Quicken. By Tamar E. Granor, technical editor As I've written previously, I think

More information

Q: I've been playing with the Microsoft Internet Transfer Control (inetctls.inet.1) and it would be great if only it worked.

Q: I've been playing with the Microsoft Internet Transfer Control (inetctls.inet.1) and it would be great if only it worked. August, 2000 Advisor Answers Using the Internet Transfer Control Visual FoxPro 6.0/5.0 Q: I've been playing with the Microsoft Internet Transfer Control (inetctls.inet.1) and it would be great if only

More information

DB2 is a complex system, with a major impact upon your processing environment. There are substantial performance and instrumentation changes in

DB2 is a complex system, with a major impact upon your processing environment. There are substantial performance and instrumentation changes in DB2 is a complex system, with a major impact upon your processing environment. There are substantial performance and instrumentation changes in versions 8 and 9. that must be used to measure, evaluate,

More information

ò Very reliable, best-of-breed traditional file system design ò Much like the JOS file system you are building now

ò Very reliable, best-of-breed traditional file system design ò Much like the JOS file system you are building now Ext2 review Very reliable, best-of-breed traditional file system design Ext3/4 file systems Don Porter CSE 506 Much like the JOS file system you are building now Fixed location super blocks A few direct

More information