File:  [LON-CAPA] / doc / techtips / worktime-new-1.html
Revision 1.2: download - view: text, annotated - select for diffs
Thu Apr 7 06:56:20 2005 UTC (19 years, 6 months ago) by albertel
Branches: MAIN
CVS tags: version_2_9_X, version_2_9_99_0, version_2_9_1, version_2_9_0, version_2_8_X, version_2_8_99_1, version_2_8_99_0, version_2_8_2, version_2_8_1, version_2_8_0, version_2_7_X, version_2_7_99_1, version_2_7_99_0, version_2_7_1, version_2_7_0, version_2_6_X, version_2_6_99_1, version_2_6_99_0, version_2_6_3, version_2_6_2, version_2_6_1, version_2_6_0, version_2_5_X, version_2_5_99_1, version_2_5_99_0, version_2_5_2, version_2_5_1, version_2_5_0, version_2_4_X, version_2_4_99_0, version_2_4_2, version_2_4_1, version_2_4_0, version_2_3_X, version_2_3_99_0, version_2_3_2, version_2_3_1, version_2_3_0, version_2_2_X, version_2_2_99_1, version_2_2_99_0, version_2_2_2, version_2_2_1, version_2_2_0, version_2_1_X, version_2_1_99_3, version_2_1_99_2, version_2_1_99_1, version_2_1_99_0, version_2_1_3, version_2_1_2, version_2_1_1, version_2_1_0, version_2_12_X, version_2_11_X, version_2_11_5_msu, version_2_11_5, version_2_11_4_uiuc, version_2_11_4_msu, version_2_11_4, version_2_11_3_uiuc, version_2_11_3_msu, version_2_11_3, version_2_11_2_uiuc, version_2_11_2_msu, version_2_11_2_educog, version_2_11_2, version_2_11_1, version_2_11_0_RC3, version_2_11_0_RC2, version_2_11_0_RC1, version_2_11_0, version_2_10_X, version_2_10_1, version_2_10_0_RC2, version_2_10_0_RC1, version_2_10_0, version_2_0_X, version_2_0_99_1, version_2_0_2, version_2_0_1, version_2_0_0, version_1_99_3, version_1_99_2, version_1_99_1_tmcc, version_1_99_1, version_1_99_0_tmcc, version_1_99_0, loncapaMITrelate_1, language_hyphenation_merge, language_hyphenation, bz6209-base, bz6209, HEAD, GCI_3, GCI_2, GCI_1, BZ4492-merge, BZ4492-feature_horizontal_radioresponse, BZ4492-feature_Support_horizontal_radioresponse, BZ4492-Support_horizontal_radioresponse
- ENV -> env

    1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2: <html>
    3:   <head>
    4:     <title>Worktime Install, Changes Intro, Handler Creation</title>
    5:   </head>
    6: 
    7:   <body>
    8:     <h1>Worktime Install, Changes Intro, Handler Creation</h1>
    9: 
   10:     <h2> Install </h2>
   11:     <p>
   12:       To familiarise you with the system, first we will update these
   13:       systems from the current STABLE release to the latest release
   14:     </p>
   15:     <h3> CVS </h3>
   16:     <p>
   17:       First you will need to check out LON-CAPA from CVS
   18:     </p>
   19:     <p>
   20:       Login
   21:     </p>
   22:     <p>
   23:       <tt>cvs -d :pserver:username@zaphod.lite.msu.edu:/home/cvs login</tt>
   24:     </p>
   25:     <p> Checkout the LON-CAPA source code </p>
   26:     <p>
   27:       <tt>cvs -d :pserver:username@zaphod.lite.msu.edu:/home/cvs checkout LON-CAPA</tt>   
   28:     </p>
   29: 
   30:     <p> Add you current hosts.tab file to the CVS checkout </p>
   31:     <p><tt>cp /home/httpd/lonTabs/hosts.tab ~/loncapa/loncom/hosts.tab</tt></p>
   32: 
   33:     <p> Build and Install the newest version of LON-CAPA </p>
   34:     <p><tt>cd ~/loncapa/loncom/build</tt></p>
   35:     <p><tt>su</tt></p>
   36:     <p><tt>make build</tt></p>
   37:     <p><tt>make install</tt></p>
   38: 
   39:     <p> Restart the necessary services</p>
   40:     <p><tt>/etc/init.d/httpd restart</tt></p>
   41:     <p><tt>/etc/init.d/loncontrol restart</tt></p>
   42: 
   43: 
   44:     <hr />
   45: 
   46:     <h2>Using CVS</h2>
   47:     
   48:     <p> CVS is a code versioning system, that tracks changes in code
   49:       and supports multiple features to make multiple developers able
   50:       to coexist with the same central repository of code. It has many
   51:       options and commands. I highly suggest reading the CVS man page
   52:       <tt>man cvs</tt> at some time.
   53:     </p>
   54: 
   55:     <p> The most useful commands you will have access to are</p>
   56:     <ul>
   57:       <li>
   58: 	<tt>annotate</tt> this will number the code lines and also
   59: 	print out who, when, and in what version a line was last
   60: 	modified, this can be useful for tracking down when a change
   61: 	was made, and discovering the reason behind it.
   62:       </li>
   63:       <li>
   64: 	<tt>diff</tt> produces a diff between specified versions of
   65: 	the code, if given no options if will inform you of the
   66: 	differences between the current local file and the version
   67: 	that was checked out. It also accepts all of the options that
   68: 	the normal diff command accepts. I highly suggest using the -u
   69: 	option (unified diffs).
   70:       </li>
   71:       <li>
   72: 	<tt>log</tt> shows the log messages for a files or files,
   73: 	those messages should provide a description of what the
   74: 	changes in the code at least hoped to accomplish.
   75:       </li>
   76:       <li>
   77: 	<tt>update</tt> will modify your local files to be 'updated'
   78: 	to a specific repository version, by default it will update it
   79: 	to the latest version of the code. You can also uses this
   80: 	command to select a specific version and prevent cvs from
   81: 	updating it. This happens by specifying a specific revision, tag
   82: 	or date when running update. You can remove this 'stickiness'
   83: 	with the use of the -A option. Also update by default won't
   84: 	create any new directories that have been added by default, if
   85: 	you want it to add directories use the -d option.
   86:       </li> 
   87:     </ul>
   88:     <p>Common options to cvs commands</p>
   89:     <ul>
   90:       <li>
   91: 	<tt>-r</tt> specify a specific file revision, (like -r 1.43)
   92: 	or a specific tag (like -r STABLE)
   93:       </li>
   94:       <li>
   95: 	<tt>-D</tt> specify a specific revision date, is accepts
   96: 	absolute dates 
   97: 	(ex. 'Nov 30 23:30 2001') or relative dates
   98:         (ex. 'last week' or 'today')
   99:       </li>
  100:     </ul>
  101: 
  102:     <p>
  103:       Some commands to try (in the loncom directory)
  104:     </p>
  105:     <pre>
  106: cvs diff -u -r 1.40 -r 1.43 lond | less
  107: cvs diff -u -r STABLE -r HEAD loncron | less
  108: cvs log loncron | less
  109: cvs update -r STABLE loncron
  110: cvs update -D 'last week'
  111: cvs update -A loncron
  112: cvs annotate loncron | less
  113:     </pre>
  114: 
  115:     <h3>Changing Code and detecting errors</h3>
  116:     <p>
  117:       We will change the lonhomework handler to act differently, and
  118:       we will cause it to throw errors
  119:     </p>
  120:     
  121:     <ul>
  122:       <li>
  123: 	Bring up loncapa/loncom/homework/lonhomework.html in a text
  124: 	editor, and introduce a syntax error. (For example delete a ;
  125: 	somewhere). Then save this version.
  126:       </li>
  127:       <li>
  128: 	Open up a terminal and su to root. In this new window copy the
  129: 	new version of lonhomework.html to the directory
  130: 	<tt>/home/httpd/lib/perl/Apache</tt>. Then restart the webserver with
  131:   <tt>/etc/init.d/httpd restart</tt>
  132:   
  133: </li>
  134:   <li>
  135:       Note the error message you have just received.
  136:   </li>
  137:   <li>
  138:     Use the command <tt>cvs diff -u lonhomework.pm</tt> to see what
  139:     you changed.
  140:   </li>
  141:   <li>
  142:     Fix the previous error, and then in the subroutine <tt>handler</tt> add a
  143:     call to a function that doesn't exist. (Example, on line 438 on
  144:     lonhomework.html, add the line
  145:     <pre>
  146: &amp;idontexist();
  147:     </pre>
  148:   </li>
  149:   <li>
  150:     Repeat the copy, and httpd restart that you did before. And then
  151:     go a visit a homework problem.
  152:   </li>
  153:   <li>
  154:     You can find a perl error report in the file
  155:     /var/log/httpd/error_log You can use the tail command to quickly
  156:     see the end of a file.
  157:   </li>
  158: </ul>
  159: 
  160:     <h2>Making a new Handler</h2>
  161:     <p>
  162:       In the examples below <i>italicised</i> lines are lines of code
  163:       that changed from the previous example, <b>bold</b> lines are
  164:       lines that have been added to the example, and any time
  165:       "username" appears it should be replaced by your specific
  166:       username.
  167:     </p>
  168:     <h3>Example 1</h3>
  169:     <pre>
  170: package Apache::workshop;
  171: use strict;
  172: use Apache::Constants qw(:common :http);
  173: sub handler {
  174: 	my $r=@_[0];
  175: 	$r->content_type('text/html');
  176: 	$r->send_http_header;
  177: 	return OK if $r->header_only;
  178: 	$r->print("The workshop handler");
  179: 	return OK;
  180: }
  181: 1;
  182: __END__
  183:     </pre>
  184:     <h3>Example 2</h3>
  185:     <pre>
  186: &lt;Location /adm/workshop&gt;
  187: PerlAccessHandler       Apache::lonacc
  188: SetHandler perl-script
  189: PerlHandler Apache::workshop
  190: ErrorDocument     403 /adm/login
  191: ErrorDocument     500 /adm/errorhandler
  192: &lt;/Location&gt;
  193: 
  194: &lt;LocationMatch "^/(res|\~).*\.workshop$"&gt;
  195: SetHandler perl-script
  196: PerlHandler Apache::workshop
  197: &lt;/LocationMatch&gt;
  198:     </pre>
  199:     <h3>Example 3</h3>
  200:     <pre>
  201: package Apache::workshop;
  202: use strict;
  203: use Apache::Constants qw(:common :http);
  204: sub handler {
  205: 	my $r=@_[0];
  206: 	$r->content_type('text/html');
  207: 	$r->send_http_header;
  208: 	return OK if $r->header_only;
  209: 	<i>$r->print("The workshop handler is in use by $env{'user.name'}");</i>
  210: 	return OK;
  211: }
  212: 1;
  213: __END__
  214:     </pre>
  215:     <h3>Example 4</h3>
  216:     <pre>
  217: package Apache::workshop;
  218: use strict;
  219: use Apache::Constants qw(:common :http);
  220: <b>use Apache::lonnet;</b>
  221: sub handler {
  222: 	my $r=@_[0];
  223: 	$r->content_type('text/html');
  224: 	$r->send_http_header;
  225: 	return OK if $r->header_only;
  226: 	<i>$r->print("The workshop handler is in use by $env{'user.name'} looking for "
  227:                      .$r->uri."&lt;br&gt;");</i>
  228: 	<b>my $file=&amp;Apache::lonnet::filelocation("",$r->uri);</b>
  229: 	<b>my $contents=&amp;Apache::lonnet::getfile($file);</b>
  230: 	<b>$r->print($contents);</b>
  231: 	return OK;
  232: }
  233: 1;
  234: __END__
  235:     </pre>
  236:     <h3>Example 5</h3>
  237:     <pre>
  238: package Apache::workshop;
  239: use strict;
  240: use Apache::Constants qw(:common :http);
  241: use Apache::lonnet;
  242: sub handler {
  243: 	my $r=@_[0];
  244: 	$r->content_type('text/html');
  245: 	$r->send_http_header;
  246: 	return OK if $r->header_only;
  247: 	$r->print("The workshop handler is in use by $env{'user.name'} looking for "
  248:                    .$r->uri."&lt;br&gt;");
  249: 	my $file=&amp;Apache::lonnet::filelocation("",$r->uri);
  250: 	my $contents=&amp;Apache::lonnet::getfile($file);
  251: 	<b>$contents=~s/simple/complex/g;</b>
  252: 	$r->print($contents);
  253: 	return OK;
  254: }
  255: 1;
  256: __END__
  257:     </pre>
  258:     <h3>Example 6</h3>
  259:     <pre>
  260: package Apache::workshop;
  261: use strict;
  262: use Apache::Constants qw(:common :http);
  263: use Apache::lonnet;
  264: sub handler {
  265:         my $r=@_[0];
  266:         $r->content_type('text/html');
  267:         $r->send_http_header;
  268:         return OK if $r->header_only;
  269:         $r->print("The workshop handler is in use by $env{'user.name'} looking for "
  270:                    .$r->uri."&lt;br&gt;");
  271:         my $file=&amp;amp;Apache::lonnet::filelocation("",$r->uri);
  272:         my $contents=&amp;amp;Apache::lonnet::getfile($file);
  273:         $contents=~s/simple/complex/g;
  274:         $r->print($contents);
  275:         <b>my %hash=&amp;Apache::lonnet::get('workshop',['info']);
  276:         #handle any errors
  277:         if ($hash{'info'} =~ m/^error:.*/) {
  278:                 $r->print("&lt;br&gt;An error -$hash{'info'}- occured");
  279:         } else {
  280:                 $r->print("&lt;br&gt;Last time you said $hash{'info'}");
  281:         }
  282:         if ($env{'form.info'}) {
  283:                 $r->print("&lt;br&gt;Now you say $env{'form.info'}");
  284:                 $hash{'info'}=$env{'form.info'};
  285:                 &amp;Apache::lonnet::put('workshop',\%hash);
  286:         }</b>
  287:         return OK;
  288: }
  289: 1;
  290: __END__
  291:     </pre>
  292:     <h3>Example 7</h3>
  293:     <pre>
  294: &lt;html&gt;
  295: 	&lt;head&gt;&lt;title&gt; A simple file &lt;/title&gt;&lt;/head&gt;
  296: 	&lt;body&gt;
  297: 		This is a simple file
  298: 	&lt;/body&gt;
  299: &lt;/html&gt;
  300:     </pre>
  301:     <h3>Example 8</h3>
  302:     <pre>
  303: &lt;html&gt;
  304: 	&lt;head&gt;&lt;title&gt; A simple file &lt;/title&gt;&lt;/head&gt;
  305: 	&lt;body&gt;
  306: 		This is a simple file
  307: 	        <b>&lt;form method="POST" action="/~domcc/a.workshop"&gt;
  308: 		       &lt;input type="text" name="info"&gt;&lt;/input&gt;
  309: 		       &lt;input type="submit" name="Submit"&gt;&lt;/input&gt;
  310:                 &lt;/form&gt;</b>
  311: 	&lt;/body&gt;
  312: &lt;/html&gt;
  313: 
  314:     </pre>
  315:     <ol>
  316:     <li>
  317:      You will need to add the author role to the domcc user, use the
  318:      CUSR button on the remote, type in the username 'domcc' and then
  319:      add the author role. Logout, and log back in. (You will also need
  320:      to let the webserver have permission to enter domcc's home
  321:      directory, do this by having domcc do<tt>chmod a+x
  322:      /home/domcc</tt>
  323:     </li>
  324:     <li> 
  325:       Create the file loncapa/loncom/workshop.pm using your
  326:       favourite unix text editor and type in example 1
  327:     </li>
  328:     <li>
  329:       Add example 2 to the file /etc/httpd/conf/loncapa_apache.conf
  330:     </li>
  331:     <li>
  332:       Copy the workshop.pm file to /home/httpd/lib/perl/Apache, and
  333:       restart the webserver. You will need to do this after every
  334:       change of the workshop.pm file.
  335:     </li>
  336:       <li>
  337: 	Point netscape at "http://cc313-pc-XX.cl.msu.edu/adm/workshop". You
  338: 	should see the simple message the handler prints out.
  339:       </li>
  340:       <li>
  341: 	Change workshop.pm to be what is in Example 3, the
  342: 	italicised line is the only one that changed.
  343:       </li>
  344:       <li>
  345: 	In netscape reload
  346: 	"http://cc313-pc-XX.cl.msu.edu/adm/workshop". You should see the
  347: 	output of the handler should now have your lon-capa name, which it
  348: 	got from the session environment.
  349:       </li>
  350:       <li>
  351: 	Next in netscape goto
  352: 	"http://cc313-pc-XX.cl.msu.edu/~domcc/a.workshop". You should
  353: 	see the same output as before.
  354:       </li>
  355:       <li>
  356: 	Using the terminal edit the file ~/public_html/a.workshop and
  357: 	put in it Example 7 using your favourite unix text editor.
  358:       </li>
  359:       <li>
  360: 	Change ~/workshop.pm to be what is in Example 4, the
  361: 	italicised lines are changed and the bold lines should be
  362: 	added.
  363:       </li>
  364:       <li>
  365: 	In netscape reload
  366: 	"http://cc313-pc-XX.cl.msu.edu/~domcc/a.workshop". You should
  367: 	see the output of the handler contains the contents of the file
  368: 	that you created along with the name of the file.
  369:       </li>
  370:       <li>
  371: 	Change ~/workshop.pm to be what is in Example 5, the
  372: 	bold line should be added.
  373:       </li>
  374:       <li>
  375: 	In netscape reload
  376: 	"http://cc313-pc-XX.cl.msu.edu/~domcc/a.workshop". You should
  377: 	see the output of the handler contains the contents of the
  378: 	file that you created along with the name of the file, except
  379: 	that this time all instances of the word "simple" have been
  380: 	replaced with the word "complex", this includes the one in the
  381: 	title and the one in the body of the file.
  382:       </li>
  383:       <li>
  384: 	<ol>
  385: 	  <li>
  386: 	    Change what is in ~/workshop.pm to be what is in Example
  387: 	    6. The bold section of code needs to be added.
  388: 	  </li>
  389: 	  <li>
  390: 	    Change what is in ~/public_html/a.workshop to be what is
  391: 	    in Example 8. The bold section needs to be added
  392: 	  </li>
  393: 	  <li>
  394: 	    In netscape reload
  395: 	    "http://cc313-pc-XX.cl.msu.edu/~domcc/a.workshop". The web
  396: 	    page should now contain a form, and say that an error
  397: 	    occurred.
  398: 	  </li>
  399: 	  <li>
  400: 	    Type something into the form field and click the submit button.
  401: 	  </li>
  402: 	  <li>
  403: 	    The handler should still report an error, but also echo
  404: 	    back what you typed into the error handler.
  405: 	  </li>
  406: 	  <li>
  407: 	    Type in the terminal
  408: 	    <pre>
  409: ls -l /home/httpd/lonUsers/pcXX/d/o/m/domcc
  410: 	    </pre>
  411: 	    Notice that there is a workshop.db file and a
  412: 	    workshop.hist file.
  413: 	  </li>
  414: 	  <li>
  415: 	    Type in the terminal
  416: 	    <pre>
  417: cat /home/httpd/lonUsers/pcXX/d/o/m/workshop.hist
  418: 	    </pre>
  419: 	    You should see the information that you submitted.
  420: 	  </li>
  421: 	  <li>
  422: 	    In netscape revisit
  423: 	    "http://cc313-pc-XX.cl.msu.edu/~domcc/a.workshop". (Do
  424: 	    this by hitting return in the URL field of netscape, Don't
  425: 	    use the reload button.) Notice that the handler no longer
  426: 	    has an error. Also notice that the handler tells you what
  427: 	    you said last time.
  428: 	  </li>
  429: 	  <li>
  430: 	    Type something new into the text field and hit submit. The
  431: 	    handler should tell you the first submission and the last
  432: 	    submission.
  433: 	  </li>
  434: 	</ol>
  435:       </li>
  436: <!--
  437:       <li>
  438: 	Extra credit: convert Example 5 to use store/restore instead
  439: 	of the get/put. You will need to publish a .workshop file and
  440: 	include it into a map. (Note that violin.sequence is the
  441: 	toplevel map for you course.
  442:       </li>
  443:       <li>
  444: 	Extra credit: Use Apache::lonxml::xmlparse to properly process the html file.
  445: 	Use &lt;window&gt;&lt;/window&gt; in your example .workshop file.
  446:       </li>
  447: -->
  448:     </ol>
  449:     <h2>Helpful Notes</h2>
  450:     <ul>
  451:       <li>
  452: 	Remember that Apache::lonnet::put and Apache::lonnet::get
  453: 	store data that is user wide. I use them for simplicity sake
  454: 	here. Every .workshop file will read and write to the same
  455: 	data location in the last example. Use store/restore if you
  456: 	want to have data stored per unique resource instance in a
  457: 	specific course. However this means that store/restore will
  458: 	throw errors if you attempt to use them in a context in which
  459: 	a resource isn't published or isn't uniquely identified
  460: 	(i.e. browsing resources.)
  461:       </li>
  462:     </ul>
  463:     <hr />
  464:     <address><a href="mailto:albertel@msu.edu">Guy Albertelli</a></address>
  465: <!-- Created: Wed May 23 02:34:54 EDT 2001 -->
  466: <!-- hhmts start -->
  467: Last modified: Tue Jun 11 14:18:30 EDT 2002
  468: <!-- hhmts end -->
  469:   </body>
  470: </html>

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>