<script type="text/javascript" src="/Core.js"></script>
<script type="text/javascript" src="/HTML.js"></script>
<script type="text/javascript" src="/Runtime.js"></script>
<script type="text/javascript" src="/Website.js"></script>
<script type="text/javascript">
//-----------------------------------------------------------------------------
// Page Customization
//-----------------------------------------------------------------------------
addStyleSheet(STYLE_SHEET_WHITE);
setWindowTitle("Resume");
setPageTitle("Peter A. Kemmer");
setPageTitleRight("Resume");
//-----------------------------------------------------------------------------
// ResumeItem - A convenience class to define/render a resume item
//-----------------------------------------------------------------------------
/**
* ResumeItem 'Constructor'
*
* A convenience class to define/render a resume item
*
* @param name - The name of the item
* @param date - The dates involved
* @param role - The role performed
* @param info - The item information
*/
function ResumeItem(name, info, date, role) {
// class functions
this.toString = _ResumeItem_toString;
// class variables
this.name = name;
this.info = info;
this.date = date;
this.role = role;
}
/**
* ResumeItem.toString
*
* Gets the HTML used to render an ResumeItem object
*/
function _ResumeItem_toString() {
var html = new StringBuffer("\n");
// Date span comes first because it floats, it only APPEARS second!
if (this.date != null) {
html.append(getSpan("resumename right", this.date));
}
// Note the <br> that drops the role/info down below the name/date!
if (this.name != null) {
html.append(getSpan("resumename", this.name) + "<br>");
}
// Note that I'm sneaking in a colon after the value of the role!!!
if (this.role != null) {
html.append(getSpan("resumerole", this.role + ":"));
}
if (this.info != null) {
html.append(getSpan("resumeinfo", this.info));
}
return html.toString();
}
//-----------------------------------------------------------------------------
// Constants - DON'T FORGET TO ESCAPE YOUR QUOTES!!!
//-----------------------------------------------------------------------------
var BACKGROUND_SUMMARY = "Over a decade and a half of experience designing and programming business and entertainment software on a variety of platforms, combined with a technical understanding of electronic media founded on a visual arts education. A focus on graphical user and programming interface design, thin and thick-client network storage administration software, web design, iPhone apps, and game engine design. Proven skills in problem solving, streamlining, communication, teamwork, and the ability to work independently.";
var EMPLOYMENT_EXPERIENCE = new Array(
new ResumeItem(
getA("http://www.netapp.com", "NetApp") + ", Sunnyvale, CA",
"Designed and built Java and Web-based network storage administration software. Created extensible Java, JavaScript, and C/C++ application frameworks used to implement multiple products across company, enforce consistent look & feel, provide hooks for navigation and help, and standardize server access. Ran usability tests. Reviewed and improved usability and consistency of projects outside team. Mentored junior engineers to improve coding standards. Acted as architectural and project gatekeeper.",
"Jun. 2000 - Present",
"Senior Software Designer & Engineer / Project Lead"
),
new ResumeItem(
getA("http://www.wunderkemmer.com", "Wunderkemmer") + ", San Jose, CA",
"Designed and built multiple iPhone apps from concept through test and publication. Created all artwork and audio resources. Created Cocoa View-based sprite animation and AI engine. Wrote documentation and set up marketing website. Wrote JavaScript/CSS libraries to drive website look and feel. Published applications through iTunes portal. Customer and technical support.",
"Aug. 2008 - Present",
"Software Designer & Engineer / Owner"
),
new ResumeItem(
getA("http://www.blizzard.com", "Blizzard North") + ", San Mateo, CA",
"Designed and implemented random level generation engine with dynamic layout and on-demand resource streaming. Managed large quantities of art resources to create engaging and diverse environments for game-play, with a minimal impact on system memory. Acted as liaison to art department to ensure timely delivery of resources that fit the needs of the game. Supported and extended tools used in creation of a large project.",
"Nov. 1998 - Jun. 2000",
"Software Designer & Engineer"
),
new ResumeItem(
"PF.Magic, San Francisco, CA",
"Designed and implemented game engine and user interface. Created artificial intelligence system. Defined product concept, look, and feel. Created functional and technical specifications. Content quality control.",
"May 1996 - Nov. 1998",
"Software Designer & Engineer"
),
new ResumeItem(
"Berkeley Systems Inc., Berkeley, CA",
"Defined product concept, look and feel. Created functional specifications, provided and directed creative content. Content quality control. Created art schedules. Tuned interfaces, behavior, and art. Created technical specifications and implemented program functionality. Application quality control from pre-Alpha through Golden Master. Provided marketing materials/concepts.",
"Sep. 1993 - May 1996",
"Software Engineer & Artist / Creative Director"
),
new ResumeItem(
getA("http://www.ibm.com/", "International Business Machines") + ", Essex Junction, VT",
"Programmed utilities for department use, ported software across operating systems. Assisted in the production of experimental product, overseeing manufacturing to make sure that product was processed correctly and in a timely manner, R&D to manufacturing liaison. Created presentation graphics for department meetings and open houses.",
"May 1989 - Sep. 1992",
"Expeditions, Programmer, Interdepartmental Liaison, Creative Director"
)
);
var SHIPPED_PRODUCTS = new Array(
new ResumeItem(
getA("http://www.netapp.com", "NetApp"),
"NetCache (multiple versions), DataFabric Manager (multiple versions), DataFabric Backup Manager, DataFabric Disaster Recovery Manager, Operations Manager, NetApp Management Framework & Console, Protection Manager (multiple versions), Protection Manager + Disaster Recovery, Provisioning Manager, System Manager, Performance Advisor"
),
new ResumeItem(
getA("http://www.wunderkemmer.com", "Wunderkemmer"),
"iPurr, Expositor, Expositor Lite"
),
new ResumeItem(
getA("http://www.blizzard.com", "Blizzard North"),
"Diablo II"
),
new ResumeItem(
"PF.Magic",
"Oddballz, Dogz II, Catz II, Dogz II Premium, Dogz and Catz II Add-On Pack, Dogz 3, Catz 3"
),
new ResumeItem(
"Berkeley Systems Inc.",
"After Dark 3.0, The Simpsons Screen Saver, The Star Trek: TNG Screen Saver, The Marvel Screen Saver, The Looney Tunes Saver, After Dark 4.0"
)
);
var SKILLS = new Array(
new ResumeItem(
"Programming",
"Fluent in C, C++, Java, JavaScript, CSS, Python, and Objective-C. Experienced in programming for Windows, Unix, iPhone, Mac OS, and cross-platform libraries and applications. Emphasis on multi-machine administration interfaces, web design, iPhone apps, Java applets, CGI, dynamic HTML and game layout, resource streaming, physical and behavioral modeling, artificial life, and sprite animation. Familiarity with Perl, PHP, XML, MXML, ActionScript, and Agile/iterative development."
),
new ResumeItem(
"Tools & Toolkits",
"IntelliJ IDEA, Eclipse, JFormDesigner, JGoodies, SAM, JPF, ILOG, Swing, JavaHelp, AJAX, TeamCity, Flex Builder, Visual Studio, Perforce, Photoshop, Lightroom, Corel Draw, Version 1, and MediaWiki."
),
new ResumeItem(
"Media",
"Photography, image processing, digital audio, and classical art skills including drawing and illustration."
)
);
var PATENTS = new Array(
new ResumeItem(
"A Method And An Apparatus To Perform Authentication",
"The present invention includes a method to perform authentication in a networked data storage system. In one embodiment, the method includes allowing a user to select objects from a number of objects in a networked data storage system via a graphical user interface (GUI), receiving authenticating information from the user, and sending the authenticating information to the user-selected objects in response to a single user input. Docket 005693.P044, Patent pending."
)
);
var EDUCATION = new Array(
new ResumeItem(
"Bachelor of Fine Arts: Computer Graphics",
getA("http://www.syr.edu/", "Syracuse University") + ", " + getA("http://vpa.syr.edu/", "College of Visual and Performing Arts") + ", Department of Art Media Studies, Syracuse, NY",
"Sep. 1989 - May 1993"
),
new ResumeItem(
"Bachelor of Fine Arts: Art Video",
getA("http://www.syr.edu/", "Syracuse University") + ", " + getA("http://vpa.syr.edu/", "College of Visual and Performing Arts") + ", Department of Art Media Studies, Syracuse, NY",
"Sep. 1989 - May 1993"
)
);
var EXTRACURRICULAR = new Array(
new ResumeItem(
"Dean's List",
"7 out of 8 semesters at Syracuse University while pursuing dual majors."
),
new ResumeItem(
"Comix Plus",
"Writer/Illustrator/Editor for a professionally printed compilation of student illustrative and narrative artwork from 1990-1992. Treasurer for organization in Fall of 1991, co-president in Spring of 1992."
),
new ResumeItem(
"National Merit Scholar",
"Earned the National Merit Scholarship for academic excellence senior year of high school."
)
);
//-----------------------------------------------------------------------------
// Functions
//-----------------------------------------------------------------------------
/**
* getResumeSection
*
* Get a section of the resume
*
* @param subtitle - The subtitle of the section
* @param content - The content
*/
function getResumeSection(subtitle, content) {
var html = new StringBuffer("\n");
html.append(getSubtitleBar(subtitle));
html.newline();
// If we're just displaying single primitive/string, don't wrap in list
if (content != null) {
if (typeof content != "object") {
html.append(content);
} else {
html.append(new List(content, false, "resumelist", "thinBottom", false));
}
}
html.newline();
return html.toString();
}
/**
* writeResumeSection
*
* Write a section of the resume
*/
function writeResumeSection(subtitle, content) {
write(getResumeSection(subtitle, content));
}
//-----------------------------------------------------------------------------
// Page Header
//-----------------------------------------------------------------------------
writePageHeader();
//-----------------------------------------------------------------------------
// Page Content
//-----------------------------------------------------------------------------
</script>
<span class="resumeaddress">
523 Broderick Dr.<br>
San Jose, CA 95111<br>
408.226.6377<br>
job at peterkemmer dot com
</span>
<script type="text/javascript">
writeResumeSection("Background Summary", BACKGROUND_SUMMARY);
writeResumeSection("Employment Experience", EMPLOYMENT_EXPERIENCE);
writeResumeSection("Shipped Products", SHIPPED_PRODUCTS);
writeResumeSection("Skills", SKILLS);
writeResumeSection("Patents", PATENTS);
writeResumeSection("Education", EDUCATION);
writeResumeSection("Extracurricular Activities/Accomplishments", EXTRACURRICULAR);
writeResumeSection("References and portfolio available upon request");
//-----------------------------------------------------------------------------
// Page Footer
//-----------------------------------------------------------------------------
writePageFooter();
</script>