The best way to learn how to use the WebCore is by example. See the documentation for more information.
The requested URL is always shown first; if a page uses one or more WebCore templates, those are shown afterwards.
00 <?php
01 include_once ('webcore/init.php');
02
03 $Page->title->subject = "Marco Von Ballmoos - Curriculum Vitae";
04 $Page->template_options->title = "C.V.";
05
06 $Page->location->add_root_link ();
07 $Page->location->append ("Marco", "../");
08 $Page->location->append ("Curriculum Vitae", './');
09 $Page->location->append ("August 2002");
10
11 $dhtml = $Page->dhtml_allowed();
12 $closed = $dhtml && ! read_var ('open');
13
14 $Page->start_display ();
15 ?>
16 <div class="main-box">
17 <div class="text-flow">
18 <h1>Marco Von Ballmoos</h1>
19 <p>120-12 85th Avenue, Apt. 2E<br>
20 Kew Gardens, NY 11415<br>
21 718.441.6949 (Home)<br>
22 212.529.3913 x150 (Office)<br>
23 <a
24 href="mailto:marco@earthli.com">marco@earthli.com</a>
25 </p>
26 <h2>Skills</h2>
27 <dl>
28 <dt class="field">Experience/Expertise Matrix</dt>
29 <dd>
30 <?php
31 include_once('webcore/gui/layer.php');
32 $layer = new LAYER ($Page);
33 $layer->name = 'skills';
34 $layer->visible = !$closed;
35
36 if ($dhtml)
37 {
38 $layer->draw_toggle();
39 }
40 ?>
41 This matrix shows a detailed list of programming languages, libraries and
42 APIs that I have used.
43 <?php $layer->start(); ?>
44 <p class="notes">A <span class="reference">level</span> of 1-3 signifies beginner,
45 4-7 intermediate and 8-10 expert. <span class="reference">Experience</span>
46 is measured in years.</p>
47 <table class="basic columns left-labels numeric-data">
48 <tr>
49 <th>Programming</th>
50 <th>Level</th>
51 <th>Experience</th>
52 </tr>
53 <tr>
54 <td>OO Design</td>
55 <td>9</td>
56 <td>8</td>
57 </tr>
58 <tr>
59 <td>C++</td>
60 <td>9</td>
61 <td>6</td>
62 </tr>
63 <tr>
64 <td>MFC</td>
65 <td>8</td>
66 <td>6</td>
67 </tr>
68 <tr>
69 <td>STL</td>
70 <td>7</td>
71 <td>3</td>
72 </tr>
73 <tr>
74 <td>Object Pascal</td>
75 <td>7</td>
76 <td>4</td>
77 </tr>
78 <tr>
79 <td>VCL</td>
80 <td>6</td>
81 <td>3</td>
82 </tr>
83 <tr>
84 <td>Win32</td>
85 <td>9</td>
86 <td>7</td>
87 </tr>
88 <tr>
89 <td><span title="Metrowerks MacOS Framework">PowerPlant</span></td>
90 <td>6</td>
91 <td> 2</td>
92 </tr>
93 <tr>
94 <td>MacOS Toolbox</td>
95 <td>7</td>
96 <td>2</td>
97 </tr>
98 <tr>
99 <td>Eiffel</td>
100 <td>6</td>
101 <td>5</td>
102 </tr>
103 <tr>
104 <th>Database</th>
105 <th>Level</th>
106 <th>Experience</th>
107 </tr>
108 <tr>
109 <td>MySQL/SQL</td>
110 <td>7</td>
111 <td>2.5</td>
112 </tr>
113 <tr>
114 <td>SQL Server/T-SQL</td>
115 <td>7</td>
116 <td>1.5</td>
117 </tr>
118 <tr>
119 <th>Web</th>
120 <th>Level</th>
121 <th>Experience</th>
122 </tr>
123 <tr>
124 <td>PHP</td>
125 <td>9</td>
126 <td>2.5</td>
127 </tr>
128 <tr>
129 <td>ASP</td>
130 <td>8</td>
131 <td>1.5</td>
132 </tr>
133 <tr>
134 <td>JavaScript</td>
135 <td>8</td>
136 <td>6.5</td>
137 </tr>
138 <tr>
139 <td>CSS</td>
140 <td>9</td>
141 <td>5</td>
142 </tr>
143 <tr>
144 <td>HTML</td>
145 <td>10</td>
146 <td>6.5</td>
147 </tr>
148 <tr>
149 <td>DHTML</td>
150 <td>7</td>
151 <td>2</td>
152 </tr>
153 <tr>
154 <td>Graphic Design</td>
155 <td>6</td>
156 <td>8</td>
157 </tr>
158 <tr>
159 <td>Apache/MySQL Admin</td>
160 <td>6</td>
161 <td>2.5</td>
162 </tr>
163 </table>
164 <?php $layer->finish(); ?>
165 </dd>
166 </dl>
167 <dl>
168 <dt class="field">Systems</dt>
169 <dd>Windows 3.x - 2000; MacOS 8.x - OS X</dd>
170 <dt class="field">Tools</dt>
171 <dd>Metrowerks CodeWarrior for C++ 4.0 - 7.0; Borland Delphi 1.0 - 6.0; ISE
172 Eiffel 4.5 - 5.1; Microsoft Visual C++ 4.0 - 6.0; Visual Parse++ 2.1 - 4.0;
173 DreamWeaver 2.0 - 4.01; Photoshop 4.0 - 6.01; Perforce 99.1 - 2001.1<br>
174 </dd>
175 </dl>
176 <h2>Work Experience</h2>
177 <h3>
178 <?php
179 $layer->name = 'logicat';
180 if ($dhtml)
181 {
182 $layer->draw_toggle();
183 }
184 ?>
185 Logicat Inc., New York, NY <span class="detail">Aug
186 1994 - Aug 2002</span></h3>
187 <?php $layer->start(); ?>
188 <p><span class="field">Logicat Course Administrator</span> <span class="detail">May
189 2002 - Aug 2002</span></p>
190 <p>Designed and developed extensions to the CE Manager product to allow firms
191 to track a user's CLE from start to finish, especially in the role of a course
192 provider. Existing CE Manager features and new features were grouped into modules
193 to allow deployment of different sets of software for different firms. All pages
194 presented a dynamic view built from the features purchased by the firm combined
195 with the rights of the logged-in user. Commands, menu items and lists of information
196 available were all controlled by this feature/permission matrix. New functionality
197 included: </p>
198 <ul>
199 <li>Scheduled courses with a calendar view and rich view of scheduled courses
200 for each user
201 </li>
202 <li>Printable certificates for providers and individual users</li>
203 <li>Course evaluation and results aggregation</li>
204 <li>Authoring module for creating course evaluations</li>
205 </ul>
206 <p><span class="field">Logicat CE Manager</span> <span class="detail">Apr
207 2001 - Apr 2002</span></p>
208 <p>Designed and developed a web product that tracks continuing education credits
209 for attorneys in New York and California using IIS 5.0 and SQL Server 2000.
210 CE Manager includes:</p>
211 <ul>
212 <li>Validation for all data entry (users, courses, etc.).</li>
213 <li>A user search and reporting tool that lets administrators create customized
214 reports.
215 </li>
216 <li>Reminder and statement services for all licenses.</li>
217 </ul>
218 <p><span class="field">Logicat Online Testing</span> <span class="detail">Feb
219 2001 - Apr 2001</span></p>
220 <p>Worked with another developer to create a testing and test-authoring solution
221 for web sites using Microsoft IIS 5.0 and SQL Server 2000. This was used later
222 to build online learning solutions for clients.</p>
223 <p><span class="field">One-on-One with the SAT 2.0</span> <span class="detail">Jan
224 1999 - Feb 2001</span></p>
225 <p>Led a team of three developers to port the Logicat Test Engine to the MacOS
226 using Metrowerks CodeWarrior 5.0.</p>
227 <ul>
228 <li>Designed and developed a cross-platform library with a listener/broadcaster
229 event structure.
230 </li>
231 <li>Ported the ELF library to a custom cross-platform graphics library.</li>
232 <li>Implemented a cross-platform file-format with endian support.</li>
233 <li>Created new features such as arbitrarily nestable framesets and script/event
234 driven controls.
235 </li>
236 <li>Added support for dynamic/downloaded content.</li>
237 </ul>
238 <p><span class="field">Logicat Test Engine</span> <span class="detail">Nov
239 1997 - Dec 1998</span></p>
240 <p>Led a team of three developers to design and develop a system to create tests/tutorials
241 for multiple users for network or CD deployment on Windows using Visual C++
242 6.0.</p>
243 <ul>
244 <li>Test items and pages are created in an RTF-capable word processor with embedded
245 meta-tags.
246 </li>
247 <li>Item text can contain WYSIWYG text, paragraph and table formatting.</li>
248 <li>Items are compiled and assembled in a database using improved ELF technology
249 from the CPA software.
250 </li>
251 <li>Items can be scripted together with an event-based script language.</li>
252 <li>Tutorials can be enhanced using sounds, images and videos.</li>
253 <li>Tutorials can also gather and display user input and answers and can print
254 or e-mail results.
255 </li>
256 </ul>
257 <p><span class="field">Logicat CPA Review Software Update Release</span> <span class="detail">May
258 1997 - Nov 1997</span></p>
259 <p>Led a team of three developers to design and develop a study plan and calendar
260 to integrate the CPA software with a live course using Visual C++ 5.0. Used
261 Delphi 3.0 and OLE/COM to show PowerPoint presentations from the course.</p>
262 <p><span class="field">Performance Transfer Utility/Installer/Technical Manual</span> <span
263 class="detail">Feb
264 1997 - Apr 1997</span></p>
265 <p>Designed and developed a utility to manage a hardware copy protection library
266 using Delphi 2.0 and incorporated it into an installer using Wise 5.0. Created
267 a 100-page manual using HTML and CSS for the Technical Support department.</p>
268 <p><span class="field">Logicat CPA Review Software</span> <span class="detail">Aug
269 1996 - Jan 1997</span></p>
270 <p>Incorporated ELF into the <span class="reference">PassMaster</span> code base
271 as the main presentation and data storage engine. Created customized components
272 descended from the ELF object library.</p>
273 <p><span class="field">ELF</span> <span class="detail">Feb 1996
274 - Aug 1996</span></p>
275 <p>Designed and developed ELF, an object-oriented interactive document system
276 in Borland Delphi 2.0 and Microsoft Visual C++ 4.1. Created EML, an HTML-like
277 language, an RTF parser and a compound document format to convert existing data
278 from RTF to ELF.</p>
279 <p><span class="field">PassMaster CPA Review Web Site</span> <span class="detail">Dec
280 1995 - Jan 1996</span></p>
281 <p>Developed a web site for <span class="reference">PassMaster</span>, Logicat's
282 CPA test preparation product. Used JavaScript to present a 40-question demonstration
283 of the test preparation software.</p>
284 <p><span class="field">One-on-One with the SAT Counselor Utility</span> <span class="detail">Sep
285 1995 - Nov 1995</span></p>
286 <p>Created a management and reporting utility for One-on-One with the SAT for
287 multi-user networked school distributions using Borland Object Pascal 7.0.</p>
288 <p><span class="field">One-on-One with the SAT</span> <span class="detail">Aug
289 1994 - Sept 1995</span></p>
290 <p>Designed and developed a test preparation program for the SAT in conjunction
291 with The College Board using Borland Object Pascal 7.0.</p>
292 <hr>
293 <?php $layer->finish(); ?>
294 <h3>
295 <?php
296 $layer->name = 'earthli';
297 if ($dhtml)
298 {
299 $layer->draw_toggle();
300 }
301 ?>
302 earthli.com, New York, NY <span class="detail">Oct
303 1999 - Dec 2001</span></h3>
304 <?php $layer->start(); ?>
305 <p><span class="field"><a href="http://www.earthli.com/projects/view_revision.php?id=24">earthli WebCore 2.0</a></span> <span
306 class="detail">Apr
307 2002 - Aug 2002</span></p>
308 <p>Upgraded the <span class="reference">WebCore</span> library to use a more well thought out, entirely class-based
309 hierarchy. A new GUI library was built, with generic support for forms, grids, buttons, menus and more. All the GUI
310 objects have customized descendents that handle the basic webcore objects and integrate nicely with the query library.
311 Pages now access all functionality through application and page objects rather than a mass of global variables. This
312 eases customization, extension and documenation.</p>
313 <p><span class="field"><a href="http://www.earthli.com/projects">earthli Projects</a></span> <span
314 class="detail">Mar
315 2002 - Jul 2002</span></p>
316 <p>Developed a project manager based on the <span class="reference">WebCore</span>.
317 Includes changes to record work completed and jobs to indicate work to do. Generates
318 formatted changelists and tracks revisions.</p>
319 <p><span class="field"><a href="http://www.earthli.com/news">earthli News</a></span> <span
320 class="detail">Jan
321 2002 - Feb 2002</span></p>
322 <p>Rewrote the <span class="reference">Forums</span> as a <span class="reference">WebCore</span>
323 application called <span class="reference">earthli News</span>. Once again,
324 a large amount of code reuse helped create a stable, full-featured news service
325 quickly and easily. Includes a subscription service.</p>
326 <p><span class="field"><a href="http://www.earthli.com/recipes/">earthli Recipes</a></span> <span
327 class="detail">Jan
328 2002 - Feb 2002</span></p>
329 <p>Created a second <span class="reference">WebCore</span> application to manage
330 recipes. Most of the functionality for this application was incorporated unchanged
331 from the <span class="reference">WebCore</span>, like the user/security model,
332 comments and full-text searching.</p>
333 <p><span class="field"><a href="http://www.earthli.com/albums/">earthli Photo
334 Albums 2.0</a></span> <span class="detail">Oct 2001 - Dec 2001</span></p>
335 <p>Rebuilt the <span class="reference">earthli Photo Albums</span> to include
336 many of the ideas developed in the <span class="reference">Forums</span>. Most
337 of the actual technology was reworked and incorporated into a general-purpose
338 back-end called the <span class="reference">earthli WebCore</span>. The <span class="reference">WebCore</span>
339 is a content management system written in PHP that can be extended to serve
340 many purposes. The Photo Albums are one such extension and they inherit many
341 of their new features directly from the <span class="reference">WebCore</span>,
342 such as enhanced security, nested albums, content management, anonymous users
343 and comments.</p>
344 <p><span class="field"><a href="http://www.earthli.com/settings.php">earthli
345 Themes</a></span> <span class="detail">Jun 2001 - Sep 2001</span></p>
346 <p>Redesigned the web site using only one set of styles, converting all existing
347 content to a uniform namespace. Implemented several themes on top of this
348 system that completely change the look (though not the layout) of the site.</p>
349 <p><span class="field">earthli Forums</span> <span class="detail">Oct
350 2000 - Dec 2000</span></p>
351 <p>Designed and developed a bulletin board system using PHP 4.x and MySQL 3.x.
352 It includes a flexible security system that describes rights for anonymous
353 users, registered users, groups and individuals. Other standard features include
354 full-text searching, nested replies and user profile pages. In 2001, the system
355 was updated to integrate with the <span class="reference">earthli Themes</span>.</p>
356 <p><span class="field">earthli Photo Albums 1.0</span> <span class="detail">Oct
357 1999 - Jul 2000</span></p>
358 <p>Designed and developed an online photo album using PHP 3.x and MySQL 3.x.
359 The system included multiple users, albums, pictures, journal entries and
360 a calendar.</p>
361 <?php $layer->finish(); ?>
362 <h2>History</h2>
363 <h3>
364 <?php
365 $layer->name = 'display';
366 if ($dhtml)
367 {
368 $layer->draw_toggle();
369 }
370 ?>
371 Cross-Platform Content Engine </h3>
372 <?php $layer->start(); ?>
373 <p>I was first introduced to object-oriented programming in August of 1994 when
374 I started working at Logicat. I had been hired straight out of college and was
375 in charge of designing and programming an SAT test preparation program that
376 would later become known as <span class="reference">One-on-One with the SAT</span>.
377 I wrote the program in <span class="reference">Borland Object Pascal 7.0</span>
378 with the part-time aid of another programmer. The final product was only part
379 of the project, which also included a parser to convert RTF documents to a proprietary
380 format and several indexing tools for building the content database that the
381 program used. Soon after, I also wrote a utility for multi-user installations
382 that allowed an administrator to maintain the user database and print progress
383 reports. The utility was much easier to write because I was able to re-use much
384 of the code from <span class="reference">One-on-One</span> itself.</p>
385 <p>Early in 1996, with <span class="reference">One-on-One</span> shipped and most
386 support issues addressed, I wanted to focus on building software that wasn't
387 so project-specific. I began to write a new document renderer which would be
388 much more flexible and would concentrate only on displaying content and handling
389 events. I wrote the initial prototype in <span class="reference">Borland Delphi
390 1.0</span> and christened it <span class="reference">ELF</span>. The prototype
391 supported arbitrarily nested tables, images and multiple text styles.</p>
392 <p><span class="reference">ELF</span> would see use in the next incarnation of
393 Logicat's CPA test preparation software. First, I converted the prototype to
394 <span class="reference">Microsoft Visual C++ 4.0</span> to ease integration
395 into the existing code base. I also developed a very HTML-like document description
396 language called <span class="reference">EML</span>, complete with a parser and
397 an import filter for RTF documents. The RTF importer allowed content designers
398 to use all of the sophisticated editing capabilities of Microsoft Word to arrange
399 text. <span class="reference">EML</span> tags describe the structure, layout
400 and display properties of document data. Some tags break a document into separate
401 objects, whereas others describe the display properties of those objects. This
402 would form the core of the program.</p>
403 <p>The <span class="reference">CPA Software</span> also extended the <span class="reference">ELF</span>
404 library with objects that provided customized event handling. Much of the <span class="reference">CPA
405 Software's</span> program logic was still based on existing code from previous
406 versions of the <span class="reference">CPA Software</span>, but the content
407 creation, file format and data rendering/event handling were all based on <span class="reference">ELF</span>.
408 This project was also where I began using preconditions and postconditions,
409 which I simulated in C++ using assertions.</p>
410 <p>Towards the end of 1997, the <span class="reference">CPA Software</span> had
411 undergone more changes, but the <span class="reference">ELF</span> library was
412 still the only truly reusable portion. Seeing a need for a more flexible tool
413 that could address many different testing and training needs, Logicat set out
414 to build a <span class="reference">Test Engine</span>. It was to serve as a
415 development environment for building tutorials and testing materials and would
416 have to be more flexible to cover a broader range of needs.</p>
417 <p>The first step in making a more general <span class="reference">Test Engine</span>
418 was to move the content-specific program logic out of the executable. To this
419 end, I designed a simple scripting language and built a compiler and interpreter
420 for it. The language supports conditionals, loops and user-defined routines
421 and has an easily extensible library of built-in routines to access engine
422 functionality. Most of the user-defined routines serve as event handlers called
423 by other components of the <span class="reference">Test Engine</span>. There
424 were also some routines for manipulating the database of items created by
425 the content creation tools. Combined with support for sounds, images and movies,
426 a content designer could put together sophisticated presentations that varied
427 widely.</p>
428 <p>All of the code for the <span class="reference">Test Engine</span> makes
429 extensive use of preconditions and postconditions to ensure program correctness.
430 The two other developers on the project would build layers of more specific
431 objects atop the basic engine and the assertions answered many of their questions
432 before they were even asked. Since the engine was composed of so many components,
433 I implemented a subscriber/publisher system that connected them together using
434 abstract interfaces and kept them as separate as possible.
435 <!--Of course, in this
436 case, a system based on Eiffel's agent technology would have provided an even
437 more elegant solution, but a template-based version was acceptable.-->
438 </p>
439 <p>In January of 1999, Logicat began work on <span class="reference">One-on-One
440 with the SAT 2.0</span>. The <span class="reference">Test Engine</span> was
441 about to take its next step as they wanted this version to work on both Windows
442 and Macintosh. Starting in January of 1999, I spent several months reworking
443 the Windows version of the <span class="reference">Test Engine</span> to function
444 as a cross-platform version with Windows extensions. At this point, I was developing
445 in <span class="reference">Microsoft Visual C++ 6.0</span>. There were innumerable
446 dependencies on Windows or library-specific classes and functions that had to
447 be changed or eliminated. The MFC CString class was replaced with a version
448 based on the C++ Library string class. Direct calls to determine screen size
449 or amount of memory available were replaced with DISPLAY and SYSTEM classes,
450 respectively. At each juncture, I put as much functionality as possible into
451 cross-platform code and designed my classes so that the platform-specific version
452 was as thin as possible.</p>
453 <p>Once a rudimentary version of the <span class="reference">Test Engine</span>
454 was functioning in this way, we moved the code to the Macintosh using <span class="reference">Metrowerks
455 CodeWarrior 4.0/5.0</span>. With the <span class="reference">Test Engine</span>
456 using only platform-independent interfaces for system components, it was simple
457 to develop Macintosh versions of system objects and snap them into place. Very
458 quickly, the Macintosh version caught up to the Windows version in functionality.
459 The final product had most of the code in a cross-platform <span class="reference">Test
460 Engine</span> that encapsulated all of the program logic, with platform-specific
461 plugins filling in functionality. In the end, we had to write classes to handle
462 much of a common GUI program's functionality: file handling (based on C++ Library),
463 file system, 2-D graphics, sound, movies, printing, timers and window manager.
464 The data format was made compatible across platforms. </p>
465 <p>To support the feature set of a large program like <span class="reference">One-on-One</span>,
466 the <span class="reference">Test Engine</span> was expanded to support an arbitrary
467 number of windows, frames within frames (like HTML) and much more dynamic content.</p>
468 <p>The final product is a very web browser-like product that runs on both Windows
469 and Macintosh natively, with no performance advantage on either platform and
470 about 90% code shared. Most importantly, the <span class="reference">Test Engine</span>
471 has no code customized to <span class="reference">One-on-One Version 2.0</span>.
472 All functionality and content of <span class="reference">One-on-One</span> is
473 defined in RTF data files, a script file and supporting media like pictures,
474 sounds and movies and is completely separated from the <span class="reference">Test
475 Engine</span> code. Thanks to assertions, there was far less of a need for debugging
476 than on previous projects and the completion of <span class="reference">One-on-One
477 Version 2.0</span> was far easier than <span class="reference">One-on-One Version
478 1.0.</span></p>
479 <hr>
480 <?php $layer->finish(); ?>
481 <h3>
482 <?php
483 $layer->name = 'webcore';
484 if ($dhtml)
485 {
486 $layer->draw_toggle();
487 }
488 ?>
489 Web-based Content Management </h3>
490 <?php $layer->start(); ?>
491 <p>I started writing web applications in October 1999 on my own web site, <a
492 href="http://www.earthli.com">earthli.com</a>.
493 After some research, I chose the now familiar Apache/PHP/MySQL development environment.
494 My first real application was a photo gallery to share vacation photographs
495 online. Each photo album belonged to a user, who was able to edit it when logged
496 in. The public could browse through the entire album with read-only access.
497 Later, a list of editors was added to albums to allow collaboration between
498 users.</p>
499 <p>My next project was a project manager for keeping track of change lists, revisions
500 and build history for various projects. It occurred to me that this project
501 and the previous photo albums shared many similar characteristics, which would
502 be required of almost any collaborative web application. Each required user
503 accounts, user validation and rights management, support for user comments and
504 so on. I began creating these shared components with the goal of building the
505 project manager on top of them.</p>
506 <p>From this work grew the <span class="reference">earthli Forums</span>, which
507 implemented a robust security model, nested folders, nested comments, anonymous
508 user tracking etc., but still wasn't built generically enough; it didn't allow
509 easy adaptation to other applications. Late in 2001, I began work on the <span class="reference">WebCore</span>,
510 which would incorporate the code from the <span class="reference">Forums</span>,
511 but adapted to a more generic framework and whose API would be defined by a
512 class-hierarchy.</p>
513 <p>The <span class="reference">WebCore</span> has several properties:</p>
514 <ul>
515 <li>Content is treated as contained within a nested hierarchy of folders. Folders
516 can inherit rights from their parents. Any application can define multiple
517 types of objects.
518 </li>
519 <li>Anonymous browsing is supported seamlessly with logged-in users.</li>
520 <li>The security model is enforced within the library, returning only data that
521 the browser has been validated to see. Users can be granted individual rights
522 to create, modify, delete, purge content or modify rights within folders.
523 </li>
524 <li>Folder level rights can be granted to anonymous user, registered users,
525 to a group of users or to individual users.
526 </li>
527 <li>User level rights can be granted or denied regardless of folder to ban users
528 or create administrators.
529 </li>
530 <li>Every piece of data in the system is exposed as an object. Each object records
531 its creation and modification information. Objects are retrieved using query
532 objects that handle pagination and rights enforcement.
533 </li>
534 <li>Proper separation of code and display logic is emphasized. The web pages
535 themselves deal only with PHP objects; queries are made through an object
536 layer, so the pages themselves are not only unaware that a MySQL database
537 is used, they are unaware that an SQL database is being used at all. In many
538 cases, other PHP objects, like grids and trees, handle display and HTML generation
539 as well, .
540 </li>
541 <li>Full-text searching is supported in the query object.</li>
542 <li>Several other classes are available, including a browser class for determining
543 the user agent, a text formatter class for displaying HTML data and a grid
544 class that works with the query classes to paginate objects into a grid.
545 </li>
546 </ul>
547 <p>Version 2.0 of the <span class="reference">Photo Albums</span> was built on
548 top of the <span class="reference">WebCore</span> at the same time as the <span class="reference">WebCore</span>
549 itself was being developed. Soon after, the second application to be built with
550 the <span class="reference">WebCore</span> was <span class="reference">earthli
551 Recipes</span>, which was ready for testing and demonstration in just over a
552 week. During development of the <span class="reference">Recipes</span>, I created
553 a set of pages that handled setting user and folder rights and creating, editing,
554 deleting and viewing comments that could be used 'as is' if no customization
555 was required by the application. This would help bring future application up
556 to speed even more quickly.</p>
557 <p><span class="reference">earthli News</span> followed soon after and allowed
558 me to retire the old <span class="reference">Forums</span> software and use
559 only applications build with the <span class="reference">WebCore</span>. The
560 fact that the <span class="reference">WebCore</span> handled the bulk of the
561 processing, validation and querying left me free to focus on designing a better
562 interface for presenting news. Also, fixed bugs and new features are applied
563 to all earthli applications simultaneously because of the large amount of
564 shared code. My latest <span class="reference">WebCore</span> application
565 is creating the project manager I started over a year ago. Once again, it's
566 off to a quick start because so much of the functionality is already available
567 in the <span class="reference">WebCore</span>.</p>
568 <p>With the <span class="reference">WebCore</span> stabilized at version 1.1,
569 development on the next version began in mid-April and continued until mid-August
570 of 2002. This version had several goals in mind:</p>
571 <ol>
572 <li>Move more of the display code into a class-based GUI library that would
573 handle forms, grids, menus and more.
574 </li>
575 <li>Standardize the API, using similar feature names where possible and classes
576 to encapsulate all common tasks.
577 </li>
578 <li>Replace the labyrinthian startup code for the webcore with a simple class-based,
579 easily customizable interface.
580 </li>
581 <li>Remove dependencies on global variables, either constants, automatic PHP
582 variables or PHP special handling (like magic quotes).
583 </li>
584 <li>Allow a page to hold objects from multiple webcore applications at once
585 (remove reliance on shared constants and give all objects a reference to the
586 application environment in which they run).
587 </li>
588 <li>Clean up the file hierarchy to facilitate learning and documentation.</li>
589 </ol>
590 <p>The first release was version 1.2, to which all existing applications were
591 upgraded in mid-July. This release incorporated the new gui library; the forms
592 library was particularly useful for encapsulating a lot of shared code and fixing
593 many validatation errors that existed. The next release was version 2.0, which
594 changed the entire framework to use two global objects, a PAGE object and an
595 APPLICATION object. All other objects, be they queries, gui objects, application
596 objects, etc. are retrieved from these two objects using an intuitive API. The
597 move to this simpler, more powerful framework allowed goal 4 above to be satisfied
598 more easily and, since all code is now encapsulated, a page can reference multiple
599 <span class="reference">WebCore</span> applications, satisfying goal 5 above.</p>
600 <p>These updates haven't changed the functionality of the <span class="reference">WebCore</span>
601 applications on the surface, but the increased code-sharing and more maintainable
602 code fixed many errors and bugs and makes it much easier to create new functionality
603 going forward. Even more, the library is far more usable and extendable, since
604 the earthli-specific code has been extracted and re-cast as a layer on top of
605 the new library, moving the <span class="reference">WebCore</span> that much
606 closer to being released as a product.</p>
607 <?php $layer->finish(); ?>
608 <h2>Education</h2>
609 <h3>Hamilton College, Clinton, New York</h3>
610 <p>Bachelor of Arts in Mathematics in May, 1994<br>
611 Major: Mathematics; Minor: Physics</p>
612 </div>
613 </div>
614 <?php
615 $Page->finish_display ();
616 ?>
617