// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= NetBeansCertifiedEngineerCourse
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki NetBeansCertifiedEngineerCourse
:description: Apache NetBeans wiki NetBeansCertifiedEngineerCourse
:toc: left
:toc-title:
:syntax: true

== NetBeans Certified Engineer Course

This is a wiki page for link:http://edu.netbeans.org/courses/nbplatform-certified-training/[NetBeans Certified Engineer Course], read more at
link:http://edu.netbeans.org/courses/nbplatform-certified-training/[our main website].

=== Exercises/Assignments

* link:NetBeansCertifiedEngineerExercises.asciidoc[NetBeansCertifiedEngineerExercises]
* link:http://wiki.netbeans.org/wiki/view/NetBeansDeveloperFAQ/RCP60Tutorials[Link to Tutorials You Can Write]
* link:Http://wiki.netbeans.org/wiki/view/Java_HintsFest.asciidoc[Link to Hints You Can Provide ]

=== Papers

* link:Http://www.netbeans.org/books/rcp.html.asciidoc[Rich Client Programming ]
* link:Http://platform.netbeans.org.asciidoc[NetBeans Platform ]

=== Slides from the Training on the First Day

* link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/nbp-outline_NetBeansCertifiedEngineerCourse.odp[ Presentation 1: NetBeans Platform] (link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/nbp-outline_NetBeansCertifiedEngineerCourse.pdf[ PDF Version])
* link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/first-application_NetBeansCertifiedEngineerCourse.odp[ Presentation 2: A First NetBeans Platform Application] (link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/first-application_NetBeansCertifiedEngineerCourse.pdf[ PDF Version])
* link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/nbp-lookup_NetBeansCertifiedEngineerCourse.odp[ Presentation 3: Dependency and Injection in Modular Systems] (link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/nbp-lookup_NetBeansCertifiedEngineerCourse.pdf[ PDF Version])
* link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/systemfs_NetBeansCertifiedEngineerCourse.odp[ Presentation 4: An Introduction to the System FileSystem]  (link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/systemfs_NetBeansCertifiedEngineerCourse.pdf[ PDF Version])
* link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/nbp-javabeans_NetBeansCertifiedEngineerCourse.odp[ Presentation 5: NetBeans JavaBeans] (link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/nbp-javabeans_NetBeansCertifiedEngineerCourse.pdf[ PDF Version])

=== Slides from the Training on the Second Day

* link:NbpLoaders.odp.asciidoc[Presentation 1: NetBeans ~ OS/2 ] (link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/nbp-loaders_NetBeansCertifiedEngineerCourse.pdf[ PDF Version])
* link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/window-system_NetBeansCertifiedEngineerCourse.odp[ Presentation 2: An Introduction to the Window System] (link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/window-system_NetBeansCertifiedEngineerCourse.pdf[ PDF Version])
* link:NbpContribute.odp.asciidoc[Presentation 3: Contributing to Open Source Projects ] (link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/nbp-contribute_NetBeansCertifiedEngineerCourse.pdf[ PDF Version])
* link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/ideas-for-modules_NetBeansCertifiedEngineerCourse.odp[ Presentation 4: Ideas for Modules] (link:http://wiki.netbeans.org/wiki/attach/NetBeansCertifiedEngineerCourse/ideas-for-modules_NetBeansCertifiedEngineerCourse.pdf[ PDF Version])

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/NetBeansCertifiedEngineerCourse[http://wiki.netbeans.org/NetBeansCertifiedEngineerCourse] , 
that was last modified by NetBeans user Geertjan 
on 2010-06-14T08:52:40Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
