Annotation of doc/techtips/worktime-new-1.html, revision 1.2
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;
1.2 ! albertel 209: <i>$r->print("The workshop handler is in use by $env{'user.name'}");</i>
1.1 albertel 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;
1.2 ! albertel 226: <i>$r->print("The workshop handler is in use by $env{'user.name'} looking for "
1.1 albertel 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;
1.2 ! albertel 247: $r->print("The workshop handler is in use by $env{'user.name'} looking for "
1.1 albertel 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;
1.2 ! albertel 269: $r->print("The workshop handler is in use by $env{'user.name'} looking for "
1.1 albertel 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: }
1.2 ! albertel 282: if ($env{'form.info'}) {
! 283: $r->print("<br>Now you say $env{'form.info'}");
! 284: $hash{'info'}=$env{'form.info'};
1.1 albertel 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>