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: &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: <Location /adm/workshop>
! 187: PerlAccessHandler Apache::lonacc
! 188: SetHandler perl-script
! 189: PerlHandler Apache::workshop
! 190: ErrorDocument 403 /adm/login
! 191: ErrorDocument 500 /adm/errorhandler
! 192: </Location>
! 193:
! 194: <LocationMatch "^/(res|\~).*\.workshop$">
! 195: SetHandler perl-script
! 196: PerlHandler Apache::workshop
! 197: </LocationMatch>
! 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."<br>");</i>
! 228: <b>my $file=&Apache::lonnet::filelocation("",$r->uri);</b>
! 229: <b>my $contents=&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."<br>");
! 249: my $file=&Apache::lonnet::filelocation("",$r->uri);
! 250: my $contents=&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."<br>");
! 271: my $file=&amp;Apache::lonnet::filelocation("",$r->uri);
! 272: my $contents=&amp;Apache::lonnet::getfile($file);
! 273: $contents=~s/simple/complex/g;
! 274: $r->print($contents);
! 275: <b>my %hash=&Apache::lonnet::get('workshop',['info']);
! 276: #handle any errors
! 277: if ($hash{'info'} =~ m/^error:.*/) {
! 278: $r->print("<br>An error -$hash{'info'}- occured");
! 279: } else {
! 280: $r->print("<br>Last time you said $hash{'info'}");
! 281: }
! 282: if ($ENV{'form.info'}) {
! 283: $r->print("<br>Now you say $ENV{'form.info'}");
! 284: $hash{'info'}=$ENV{'form.info'};
! 285: &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: <html>
! 295: <head><title> A simple file </title></head>
! 296: <body>
! 297: This is a simple file
! 298: </body>
! 299: </html>
! 300: </pre>
! 301: <h3>Example 8</h3>
! 302: <pre>
! 303: <html>
! 304: <head><title> A simple file </title></head>
! 305: <body>
! 306: This is a simple file
! 307: <b><form method="POST" action="/~domcc/a.workshop">
! 308: <input type="text" name="info"></input>
! 309: <input type="submit" name="Submit"></input>
! 310: </form></b>
! 311: </body>
! 312: </html>
! 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 <window></window> 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>