NullPointerException in trivial example

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

NullPointerException in trivial example

Dr. Michael Lipp
Hi,

I just wanted to give JSF a try and started with the "simplest possible
example". Here is the layout:

jsftest
  test.jsp
  WEB-INF
    faces-config.xml
    lib
      commons-beanutils-1.6.1.jar
      commons-codec-1.2.jar
      commons-collections-3.0.jar
      commons-digester-1.5.jar
      commons-el.jar
      commons-fileupload-1.0.jar
      commons-logging.jar
      commons-validator.jar
      jakarta-oro.jar
      jsp-2.0.jar
      jstl.jar
      myfaces-extensions.jar
      myfaces-impl.jar
      myfaces.jar
      myfaces-jsf-api.jar
      myfaces-wap.jar
      myfaces-xdoclet.jar
    web.xml

faces-config.xml is empty (expect for the <faces-config/>). test.jsp is
--------------------------
<%@ page contentType="text/html; charset=ISO-8859-1" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1"/>
            <title></title>
    </head>
    <body>
        <f:view>
            Hallo5
        </f:view>
    </body>
</html>
--------------------------

I'm using JBoss-3.2.7. I've packaged the above files and deployed them.

Everything worked fine until I added the <f:view> (i.e. really got
started ;-)). With this I get

14:41:00,665 ERROR [Engine] StandardWrapperValve[jsp]: Servlet.service()
for servlet jsp threw exception
java.lang.NullPointerException
        at
javax.faces.webapp.UIComponentTag.setupResponseWriter(UIComponentTag.java:646)
        at javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:254)
        at org.apache.myfaces.taglib.core.ViewTag.doStartTag(ViewTag.java:90)
        at org.apache.jsp.test_jsp._jspx_meth_f_view_0(test_jsp.java:88)
        at org.apache.jsp.test_jsp._jspService(test_jsp.java:63)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
        at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:75)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at
org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:66)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
        at
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:162)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:534)

Seems like some prerequisite for the doStartTag of
javax.faces.webapp.UIComponentTag is missing (assuming that the
NullPointer indicates that something has not been initialized). What am
I doing wrong?

Regards,

    Michael
Reply | Threaded
Open this post in threaded view
|

Re: NullPointerException in trivial example

Sean Radford
Dr. Michael N. Lipp wrote:

>
>faces-config.xml is empty (expect for the <faces-config/>). test.jsp is
>--------------------------
><%@ page contentType="text/html; charset=ISO-8859-1" %>
><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
>
><html>
>    <head>
>        <meta http-equiv="Content-Type" content="text/html;
>charset=ISO-8859-1"/>
>            <title></title>
>    </head>
>    <body>
>        <f:view>
>    Hallo5
> </f:view>
>    </body>
></html>
>--------------------------
>
You should be putting your text message in either an h:outputText or
f:verbatim tag.

Sean

--
Dr. Sean Radford, MBBS, MSc
[hidden email]
http://bladesys.demon.co.uk/ 

Reply | Threaded
Open this post in threaded view
|

RE: NullPointerException in trivial example

Broekelmann, Mathias
In reply to this post by Dr. Michael Lipp
Hi Michael,

Verify your web.xml for this content:

  <!-- Listener, that does all the startup work (configuration, init).
-->
  <listener>
 
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener<
/listener-class>
  </listener>

  <!-- Faces Servlet -->
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>

If the filter mapping is defined as *.faces use test.faces instead of
test.jsp to call the faces page.

Mathias


> -----Original Message-----
> From: Dr. Michael N. Lipp [mailto:[hidden email]]
> Sent: Monday, May 09, 2005 4:03 PM
> To: [hidden email]
> Subject: NullPointerException in trivial example
>
>
> Hi,
>
> I just wanted to give JSF a try and started with the
> "simplest possible
> example". Here is the layout:
>
> jsftest
>   test.jsp
>   WEB-INF
>     faces-config.xml
>     lib
>       commons-beanutils-1.6.1.jar
>       commons-codec-1.2.jar
>       commons-collections-3.0.jar
>       commons-digester-1.5.jar
>       commons-el.jar
>       commons-fileupload-1.0.jar
>       commons-logging.jar
>       commons-validator.jar
>       jakarta-oro.jar
>       jsp-2.0.jar
>       jstl.jar
>       myfaces-extensions.jar
>       myfaces-impl.jar
>       myfaces.jar
>       myfaces-jsf-api.jar
>       myfaces-wap.jar
>       myfaces-xdoclet.jar
>     web.xml
>
> faces-config.xml is empty (expect for the <faces-config/>).
> test.jsp is
> --------------------------
> <%@ page contentType="text/html; charset=ISO-8859-1" %>
> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
>
> <html>
>     <head>
>         <meta http-equiv="Content-Type" content="text/html;
> charset=ISO-8859-1"/>
>             <title></title>
>     </head>
>     <body>
>         <f:view>
>    Hallo5
> </f:view>
>     </body>
> </html>
> --------------------------
>
> I'm using JBoss-3.2.7. I've packaged the above files and
> deployed them.
>
> Everything worked fine until I added the <f:view> (i.e. really got
> started ;-)). With this I get
>
> 14:41:00,665 ERROR [Engine] StandardWrapperValve[jsp]:
> Servlet.service()
> for servlet jsp threw exception
> java.lang.NullPointerException
> at
> javax.faces.webapp.UIComponentTag.setupResponseWriter(UICompon
> entTag.java:646)
> at
> javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:254)
> at
> org.apache.myfaces.taglib.core.ViewTag.doStartTag(ViewTag.java:90)
> at org.apache.jsp.test_jsp._jspx_meth_f_view_0(test_jsp.java:88)
> at org.apache.jsp.test_jsp._jspService(test_jsp.java:63)
> at
> org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
> at
> org.apache.jasper.servlet.JspServletWrapper.service(JspServlet
> Wrapper.java:324)
> at
> org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet
> .java:292)
> at
> org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilt
> er(ApplicationFilterChain.java:252)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(Appli
> cationFilterChain.java:173)
> at
> org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyH
> eaderFilter.java:75)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilt
> er(ApplicationFilterChain.java:202)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(Appli
> cationFilterChain.java:173)
> at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardW
> rapperValve.java:214)
> at
> org.apache.catalina.core.StandardValveContext.invokeNext(Stand
> ardValveContext.java:104)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipel
> ine.java:520)
> at
> org.apache.catalina.core.StandardContextValve.invokeInternal(S
> tandardContextValve.java:198)
> at
> org.apache.catalina.core.StandardContextValve.invoke(StandardC
> ontextValve.java:152)
> at
> org.apache.catalina.core.StandardValveContext.invokeNext(Stand
> ardValveContext.java:104)
> at
> org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(Cust
> omPrincipalValve.java:66)
> at
> org.apache.catalina.core.StandardValveContext.invokeNext(Stand
> ardValveContext.java:102)
> at
> org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(
SecurityAssociationValve.java:162)

> at
> org.apache.catalina.core.StandardValveContext.invokeNext(Stand
> ardValveContext.java:102)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipel
> ine.java:520)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHost
> Valve.java:137)
> at
> org.apache.catalina.core.StandardValveContext.invokeNext(Stand
> ardValveContext.java:104)
> at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReport
> Valve.java:118)
> at
> org.apache.catalina.core.StandardValveContext.invokeNext(Stand
> ardValveContext.java:102)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipel
> ine.java:520)
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEn
> gineValve.java:109)
> at
> org.apache.catalina.core.StandardValveContext.invokeNext(Stand
> ardValveContext.java:104)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipel
> ine.java:520)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
> at
> org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.
> java:160)
> at
> org.apache.coyote.http11.Http11Processor.process(Http11Process
> or.java:799)
> at
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandle
> r.processConnection(Http11Protocol.java:705)
> at
> org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoi
> nt.java:577)
> at
> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(
> ThreadPool.java:684)
> at java.lang.Thread.run(Thread.java:534)
>
> Seems like some prerequisite for the doStartTag of
> javax.faces.webapp.UIComponentTag is missing (assuming that the
> NullPointer indicates that something has not been
> initialized). What am
> I doing wrong?
>
> Regards,
>
>     Michael
>
Reply | Threaded
Open this post in threaded view
|

Re: NullPointerException in trivial example

Dr. Michael Lipp
In reply to this post by Sean Radford
Sean Radford wrote:

> Dr. Michael N. Lipp wrote:
>
>>
>> faces-config.xml is empty (expect for the <faces-config/>). test.jsp is
>> --------------------------
>> <%@ page contentType="text/html; charset=ISO-8859-1" %>
>> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
>> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
>>
>> <html>
>>    <head>
>>        <meta http-equiv="Content-Type" content="text/html;
>> charset=ISO-8859-1"/>
>>            <title></title>
>>    </head>
>>    <body>
>>        <f:view>
>>         Hallo5
>>     </f:view>
>>    </body>
>> </html>
>> --------------------------
>>
> You should be putting your text message in either an h:outputText or
> f:verbatim tag.

Maybe I should (will read the taglib docu when I get the example
running), but neither helps with the NullPointer problem (as was to be
expected, as the problem arises at the <f:view> tag which is before my
text). Thanks anyway,

    Michael
Reply | Threaded
Open this post in threaded view
|

Re: NullPointerException in trivial example

Dr. Michael Lipp
In reply to this post by Broekelmann, Mathias
Broekelmann, Mathias wrote:
>  
>   <servlet-mapping>
>     <servlet-name>Faces Servlet</servlet-name>
>     <url-pattern>*.faces</url-pattern>
>   </servlet-mapping>
>
> If the filter mapping is defined as *.faces use test.faces instead of
> test.jsp to call the faces page.
>

Actually, it is "*.jsf" and if I call ".../test.jsf" it really does
work! Great! Didn't know that I had to call the JSPs "through" the JSF
servlet now. (I assume that the mapping from "test.jsf" to "test.jsp" is
somehow built into the JSF Servlet, right? 'Cause I didn't define it
nowhere.) Thanks.

    Michael

>>-----Original Message-----
>>From: Dr. Michael N. Lipp [mailto:[hidden email]]
>>Sent: Monday, May 09, 2005 4:03 PM
>>To: [hidden email]
>>Subject: NullPointerException in trivial example
>>
>>
>>Hi,
>>
>>I just wanted to give JSF a try and started with the
>>"simplest possible
>>example". Here is the layout:
>>
>>jsftest
>>  test.jsp
>>  WEB-INF
>>    faces-config.xml
>>    lib
>>      commons-beanutils-1.6.1.jar
>>      commons-codec-1.2.jar
>>      commons-collections-3.0.jar
>>      commons-digester-1.5.jar
>>      commons-el.jar
>>      commons-fileupload-1.0.jar
>>      commons-logging.jar
>>      commons-validator.jar
>>      jakarta-oro.jar
>>      jsp-2.0.jar
>>      jstl.jar
>>      myfaces-extensions.jar
>>      myfaces-impl.jar
>>      myfaces.jar
>>      myfaces-jsf-api.jar
>>      myfaces-wap.jar
>>      myfaces-xdoclet.jar
>>    web.xml
>>
>>faces-config.xml is empty (expect for the <faces-config/>).
>>test.jsp is
>>--------------------------
>><%@ page contentType="text/html; charset=ISO-8859-1" %>
>><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
>><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
>>
>><html>
>>    <head>
>>        <meta http-equiv="Content-Type" content="text/html;
>>charset=ISO-8859-1"/>
>>            <title></title>
>>    </head>
>>    <body>
>>        <f:view>
>>    Hallo5
>> </f:view>
>>    </body>
>></html>
>>--------------------------
>>
>>I'm using JBoss-3.2.7. I've packaged the above files and
>>deployed them.
>>
>>Everything worked fine until I added the <f:view> (i.e. really got
>>started ;-)). With this I get
>>
>>14:41:00,665 ERROR [Engine] StandardWrapperValve[jsp]:
>>Servlet.service()
>>for servlet jsp threw exception
>>java.lang.NullPointerException
>> at
>>javax.faces.webapp.UIComponentTag.setupResponseWriter(UICompon
>>entTag.java:646)
>> at
>>javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:254)
>> at
>>org.apache.myfaces.taglib.core.ViewTag.doStartTag(ViewTag.java:90)
>> at org.apache.jsp.test_jsp._jspx_meth_f_view_0(test_jsp.java:88)
>> at org.apache.jsp.test_jsp._jspService(test_jsp.java:63)
>> at
>>org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
>> at
>>org.apache.jasper.servlet.JspServletWrapper.service(JspServlet
>>Wrapper.java:324)
>> at
>>org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet
>>.java:292)
>> at
>>org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
>> at
>>org.apache.catalina.core.ApplicationFilterChain.internalDoFilt
>>er(ApplicationFilterChain.java:252)
>> at
>>org.apache.catalina.core.ApplicationFilterChain.doFilter(Appli
>>cationFilterChain.java:173)
>> at
>>org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyH
>>eaderFilter.java:75)
>> at
>>org.apache.catalina.core.ApplicationFilterChain.internalDoFilt
>>er(ApplicationFilterChain.java:202)
>> at
>>org.apache.catalina.core.ApplicationFilterChain.doFilter(Appli
>>cationFilterChain.java:173)
>> at
>>org.apache.catalina.core.StandardWrapperValve.invoke(StandardW
>>rapperValve.java:214)
>> at
>>org.apache.catalina.core.StandardValveContext.invokeNext(Stand
>>ardValveContext.java:104)
>> at
>>org.apache.catalina.core.StandardPipeline.invoke(StandardPipel
>>ine.java:520)
>> at
>>org.apache.catalina.core.StandardContextValve.invokeInternal(S
>>tandardContextValve.java:198)
>> at
>>org.apache.catalina.core.StandardContextValve.invoke(StandardC
>>ontextValve.java:152)
>> at
>>org.apache.catalina.core.StandardValveContext.invokeNext(Stand
>>ardValveContext.java:104)
>> at
>>org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(Cust
>>omPrincipalValve.java:66)
>> at
>>org.apache.catalina.core.StandardValveContext.invokeNext(Stand
>>ardValveContext.java:102)
>> at
>>org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(
>
> SecurityAssociationValve.java:162)
>
>> at
>>org.apache.catalina.core.StandardValveContext.invokeNext(Stand
>>ardValveContext.java:102)
>> at
>>org.apache.catalina.core.StandardPipeline.invoke(StandardPipel
>>ine.java:520)
>> at
>>org.apache.catalina.core.StandardHostValve.invoke(StandardHost
>>Valve.java:137)
>> at
>>org.apache.catalina.core.StandardValveContext.invokeNext(Stand
>>ardValveContext.java:104)
>> at
>>org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReport
>>Valve.java:118)
>> at
>>org.apache.catalina.core.StandardValveContext.invokeNext(Stand
>>ardValveContext.java:102)
>> at
>>org.apache.catalina.core.StandardPipeline.invoke(StandardPipel
>>ine.java:520)
>> at
>>org.apache.catalina.core.StandardEngineValve.invoke(StandardEn
>>gineValve.java:109)
>> at
>>org.apache.catalina.core.StandardValveContext.invokeNext(Stand
>>ardValveContext.java:104)
>> at
>>org.apache.catalina.core.StandardPipeline.invoke(StandardPipel
>>ine.java:520)
>> at
>>org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
>> at
>>org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.
>>java:160)
>> at
>>org.apache.coyote.http11.Http11Processor.process(Http11Process
>>or.java:799)
>> at
>>org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandle
>>r.processConnection(Http11Protocol.java:705)
>> at
>>org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoi
>>nt.java:577)
>> at
>>org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(
>>ThreadPool.java:684)
>> at java.lang.Thread.run(Thread.java:534)
>>
>>Seems like some prerequisite for the doStartTag of
>>javax.faces.webapp.UIComponentTag is missing (assuming that the
>>NullPointer indicates that something has not been
>>initialized). What am
>>I doing wrong?
>>
>>Regards,
>>
>>    Michael
>>

Reply | Threaded
Open this post in threaded view
|

Re: NullPointerException in trivial example

Csík Norbert
> servlet now. (I assume that the mapping from "test.jsf" to "test.jsp" is
> somehow built into the JSF Servlet, right? 'Cause I didn't define it
> nowhere.) Thanks.

Not at all. It's the deafult behaiour. You can define it as follows:

<context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.jspx</param-value>
</context-param>

--
 Csík Norbert          http://norbert.web.elte.hu/
 Programtervező matematikus
 Trilobita Informatikai Rt. - rendszertervező fejlesztőmérnök
___ keep sm:)ing _________________________ooo__C( O O )L__ooo__
http://www.aion.hu/ - A csik.NET otthona
http://www.spreadfirefox.com/ - Rediscover the web
Légy pontos: Mérj mikro-milliméterben! Jelölj krétával! Vágj baltával!