Annotation of doc/techtips/worktime-new-1.html, revision 1.1

1.1     ! albertel    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>