sp-tutorial 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. data/README.markdown +42 -0
  2. data/Rakefile +36 -0
  3. data/TODO +6 -0
  4. data/VERSION.yml +4 -0
  5. data/config.ru +15 -0
  6. data/lib/config.ru +15 -0
  7. data/lib/public/doc/Cyklop-otf-0_91.zip +0 -0
  8. data/lib/public/doc/ex/sp_lab01_zad.odt +0 -0
  9. data/lib/public/doc/ex/sp_lab02_zad.odt +0 -0
  10. data/lib/public/doc/ex/sp_lab03_zad.odt +0 -0
  11. data/lib/public/doc/ex/sp_lab04_zad.odt +0 -0
  12. data/lib/public/doc/latexsheet.pdf +0 -0
  13. data/lib/public/doc/survival.pdf +0 -0
  14. data/lib/public/images/Thatll_Flat_Git_It_Vol_20.jpg +0 -0
  15. data/lib/public/images/alan_kay.jpg +0 -0
  16. data/lib/public/images/alan_perlis.jpg +0 -0
  17. data/lib/public/images/albert_einstein.jpg +0 -0
  18. data/lib/public/images/algorithm.png +0 -0
  19. data/lib/public/images/biuletyn-snall.jpg +0 -0
  20. data/lib/public/images/bop.jpg +0 -0
  21. data/lib/public/images/borenstein.jpg +0 -0
  22. data/lib/public/images/commits.png +0 -0
  23. data/lib/public/images/gitk-branches.png +0 -0
  24. data/lib/public/images/jkew.jpg +0 -0
  25. data/lib/public/images/jwz.gif +0 -0
  26. data/lib/public/images/knuth.jpg +0 -0
  27. data/lib/public/images/marcin_wolinski.jpg +0 -0
  28. data/lib/public/images/objects-example.png +0 -0
  29. data/lib/public/images/perlis.gif +0 -0
  30. data/lib/public/images/real_programmers.png +0 -0
  31. data/lib/public/images/richard_stallman.jpg +0 -0
  32. data/lib/public/images/sp.png +0 -0
  33. data/lib/public/images/sp.svg +117 -0
  34. data/lib/public/images/spowrotem.jpg +0 -0
  35. data/lib/public/images/staging_area.png +0 -0
  36. data/lib/public/images/the_thinker.jpg +0 -0
  37. data/lib/public/images/tparr.jpg +0 -0
  38. data/lib/public/images/wide-gitk.gif +0 -0
  39. data/lib/public/javascripts/sp.js +1 -0
  40. data/lib/public/stylesheets/fonts/Cyklop-Italic.otf +0 -0
  41. data/lib/public/stylesheets/icons/doc.png +0 -0
  42. data/lib/public/stylesheets/icons/email.png +0 -0
  43. data/lib/public/stylesheets/icons/external.png +0 -0
  44. data/lib/public/stylesheets/icons/feed.png +0 -0
  45. data/lib/public/stylesheets/icons/im.png +0 -0
  46. data/lib/public/stylesheets/icons/pdf.png +0 -0
  47. data/lib/public/stylesheets/icons/visited.png +0 -0
  48. data/lib/public/stylesheets/icons/xls.png +0 -0
  49. data/lib/public/stylesheets/ie.css +27 -0
  50. data/lib/public/stylesheets/print.css +30 -0
  51. data/lib/public/stylesheets/screen.css +249 -0
  52. data/lib/public/stylesheets/sp.css +194 -0
  53. data/lib/public/stylesheets/src/grid.png +0 -0
  54. data/lib/public/stylesheets/uv.css +121 -0
  55. data/lib/sp-tutorial.rb +78 -0
  56. data/lib/views/answers.rdiscount +7 -0
  57. data/lib/views/exercises.rdiscount +154 -0
  58. data/lib/views/favicon.ico.rdiscount +0 -0
  59. data/lib/views/git.rdiscount +558 -0
  60. data/lib/views/labs01.rdiscount +54 -0
  61. data/lib/views/labs02.rdiscount +32 -0
  62. data/lib/views/labs03.rdiscount +28 -0
  63. data/lib/views/labs04.rdiscount +41 -0
  64. data/lib/views/latex.rdiscount +498 -0
  65. data/lib/views/layout.rdiscount +41 -0
  66. data/lib/views/ll.rdiscount +78 -0
  67. data/lib/views/main.rdiscount +67 -0
  68. data/lib/views/scripts.rdiscount +618 -0
  69. data/lib/views/unix-commands.rdiscount +604 -0
  70. data/lib/views/unix-guru.rdiscount +696 -0
  71. data/sp-tutorial.gemspec +125 -0
  72. metadata +186 -0
@@ -0,0 +1,696 @@
1
+ #### {% title "Jak zostać Uniksowym guru w kwadrans" %}
2
+
3
+ [unix guru]: http://www.cs.usfca.edu/~parrt/course/601/lectures/unix.util.html "How To Look Like A UNIX Guru"
4
+
5
+
6
+ # Jak zostać Uniksowym guru w kwadrans
7
+
8
+ <blockquote>
9
+ {%= image_tag "/images/richard_stallman.jpg", :alt => "[Richard Stallman]" %}
10
+ <p>
11
+ Richard M. Stallman, Linus Torvalds,
12
+ and Donald E. Knuth engage in a discussion on whose impact
13
+ on the computerized world was the greatest.<br/>
14
+ Stallman: "God told me I have programmed
15
+ the best editor in the world!"
16
+ Torvalds: "Well, God told *me* that I have programmed
17
+ the best operating system in the world!"
18
+ Knuth: "Wait, wait &#x2013; I never said that."
19
+ </p>
20
+ <p class="author">[from rec.humor.funny]</p>
21
+ </blockquote>
22
+
23
+ UNIX is an extremely popular platform for deploying server software
24
+ partly because of its security and stability, but also because it has
25
+ a rich set of command line and scripting tools. Programmers use these
26
+ tools for manipulating the file system, processing log files, and
27
+ generally automating as much as possible.
28
+
29
+ If you want to be a serious server developer, you will need to have a
30
+ certain facility with a number of UNIX tools; about 15. You will start
31
+ to see similarities among them, particularly regular expressions, and
32
+ soon you will feel very comfortable. Combining the simple commands,
33
+ you can build very powerful tools very quickly—much faster than you
34
+ could build the equivalent functionality in C or Java, for example.
35
+
36
+
37
+ ## Wszystko jest strumieniem
38
+
39
+ The first thing you need to know is that UNIX is based upon the idea
40
+ of a *stream*. Everything is a *stream*, or appears to be. Device
41
+ drivers look like streams, terminals look like streams, processes
42
+ communicate via streams, etc… The input and output of a program are
43
+ streams that you can redirect into a device, a file, or another
44
+ program.
45
+
46
+ Here is an example device, the null device, that lets you throw output
47
+ away. For example, you might want to run a program but ignore the
48
+ output.
49
+
50
+ :::shell-unix-generic
51
+ ls > /dev/null # ignore output of ls
52
+
53
+ where "`# ignore output of ls`" is a comment.
54
+
55
+ Most of the commands covered in this lecture process `stdin`
56
+ and send results to `stdout`. In this manner, you can
57
+ incrementally process a data stream by hooking the output of one tool
58
+ to the input of another via a *pipe*. For example, the
59
+ following piped sequence prints the number of files in the current
60
+ directory modified in August.
61
+
62
+ :::shell-unix-generic
63
+ ls -l | grep ' 10-' | wc -l
64
+
65
+ Imagine how long it would take you to write the equivalent C or Java
66
+ program. You can become an extremely productive UNIX programmer if
67
+ you learn to combine the simple command-line tools. Even when
68
+ programming on a PC, I use MKS's UNIX shell and command library to
69
+ make it look like a UNIX box. Worth the cash.
70
+
71
+
72
+ ## Uzyskiwanie pomocy
73
+
74
+ If you need to know about a command, ask for the "man" page. For
75
+ example, to find out about the `ls` command, type
76
+
77
+ :::shell-unix-generic
78
+ man ls
79
+ LS(1) User Commands LS(1)
80
+
81
+ NAME
82
+ ls - list directory contents
83
+
84
+ SYNOPSIS
85
+ ls [OPTION]... [FILE]...
86
+
87
+ DESCRIPTION
88
+ List information about the FILEs (the current directory
89
+ by default). Sort entries alphabetically if none
90
+ of -cftuvSUX nor --sort.
91
+ ...
92
+
93
+ You will get a summary of the command and any arguments.
94
+
95
+ If you cannot remember the command's name, try using `apropos`
96
+ which finds commands and library routines related to that word.
97
+ For example, to find out how to do checksums, type
98
+
99
+ apropos '\bgit\b'
100
+ gitrepository [] (5) - layout - Git Repository Layout
101
+ gittutorial [] (7) - A tutorial introduction to git
102
+ gitworkflows [] (7) - An overview of recommended workflows with git
103
+
104
+
105
+ ## Special Directories and files
106
+
107
+ A shortcut for my home directory, `/home/pracinf/wbzyl`, is
108
+ `~wbzyl`.
109
+
110
+ When you are using the shell, there is the notion of <em>current
111
+ directory</em>. The dot '`.`' character is a shorthand for the current
112
+ directory and '`..`' is a shorthand for the directory above the
113
+ current. So to access file `test` in the current directory, `./test`
114
+ is the same as plain `test`. If `test` is a directory above, use
115
+ `../test`.
116
+
117
+ `/` is the root directory; there is no drive specification in UNIX.
118
+
119
+ The `.bash_profile` file is very important as it is how your shell
120
+ session is initialized including your ever-important `PATH`
121
+ environment variable. My `bash` shell initialization file is
122
+ `~wbzyl/.bash_profile` and has set up code like the following:
123
+
124
+ :::shell-unix-generic
125
+ PATH=$PATH:$HOME/bin
126
+ export PATH
127
+
128
+ The `export` means that the assignment to `PATH` is visible to
129
+ all child processes (that is, visible to all programs you run from the
130
+ shell).
131
+
132
+
133
+ ## Podstawowe polecenia
134
+
135
+ ### cd
136
+
137
+ Changing a directory is done with `cd` <em>dir</em> where <em>dir</em> can be "." or
138
+ ".." to move to current directory (do nothing) or go up a directory.
139
+
140
+ ### ls
141
+
142
+ Display files in a directory with `ls`. The `-l` option is used to
143
+ display details of the files:
144
+
145
+ :::shell-unix-generic
146
+ total 1234
147
+ drwxr-xr-x 5 wbzyl pracinf 4096 08-04 00:08 public_git
148
+ drwx--x--x 2 wbzyl pracinf 4096 08-02 20:20 public_html
149
+ drwxr-xr-x 7 wbzyl pracinf 4096 08-02 10:10 rpm
150
+ drwx--x--x 2 wbzyl pracinf 4096 08-02 10:00 tmp
151
+ ...
152
+
153
+ "pracinfo" is wbzyl's group.
154
+
155
+ If you want to see hidden files (those starting with "."), use `-a`.
156
+
157
+ Combinations are possible: use `ls -la` to see details of all files
158
+ including hidden ones.
159
+
160
+ ### wyświetlanie zawartości plików
161
+
162
+ There are 4 useful ways to display the contents or portions of a file.
163
+ The first is the very commonly used command `cat`. For example, to
164
+ display my email box, type:
165
+
166
+ :::shell-unix-generic
167
+ cat /var/mail/wbzyl
168
+
169
+ If a file is really big, you will probably want to use `more`,
170
+ which spits the file out in screen-size chunks.
171
+
172
+ :::shell-unix-generic
173
+ more /var/mail/wbzyl
174
+
175
+ If you only want to see the first few lines of a file or the last few
176
+ lines use `head` and `tail`.
177
+
178
+ :::shell-unix-generic
179
+ head /var//mail/wbzyl
180
+ tail /var/mail/wbzyl
181
+
182
+ You can specify a number as an argument to get a specific number of
183
+ lines:
184
+
185
+ :::shell-unix-generic
186
+ head -30 /var/mail/wbzyl
187
+
188
+ The most useful incantation of `tail` prints the last few lines of a
189
+ file and then waits, printing new lines as they are appended to the
190
+ file. This is great for watching a log file:
191
+
192
+ :::shell-unix-generic
193
+ tail -f /var/mail/wbzyl
194
+
195
+ If you need to know how many characters, words, or lines are in a
196
+ file, use `wc`:
197
+
198
+ :::shell-unix-generic
199
+ wc /var/mail/mail
200
+ 100 1000 40000 /var/mail/wbzyl
201
+
202
+ Where the numbers are, in order, lines, words, then characters. For
203
+ clarity, you can use `wc -l` to print just the number of lines.
204
+
205
+ ### pushd, popd
206
+
207
+ Instead of `cd` you can use `pushd` to save the current
208
+ dir and then automatically `cd` to the specified directory.
209
+ For example,
210
+
211
+ :::shell-unix-generic
212
+ pwd
213
+ /home/pracinf/wbzyl
214
+ pushd /tmp
215
+ /tmp ~
216
+ pwd
217
+ /tmp
218
+ popd
219
+ ~
220
+ pwd
221
+ /home/pracinf/wbzyl
222
+
223
+ ### top (htop)
224
+
225
+ To watch a dynamic display of the processes on your box in action, use
226
+ `top` or `htop`.
227
+
228
+ ### ps
229
+
230
+ To print out (wide display) all processes running on a box, use
231
+
232
+ :::shell-unix-generic
233
+ ps auxww # double w
234
+
235
+ ### chmod
236
+
237
+ To change the privileges of a file or directory, use `chmod`. The
238
+ privileges are 3 digit octal words with 3 bits per digit: rwxrwxrwx
239
+ where the first digit is for the file owner, the 2nd for the group,
240
+ and 3rd for anybody. 644 is a common word value file which means
241
+ 110100100 or
242
+
243
+ :::shell-unix-generic
244
+ rw-r--r--
245
+
246
+ When you do `ls -l` you will see these bits.
247
+
248
+ 755 is a common word value for directories:
249
+
250
+ :::shell-unix-generic
251
+ rwxr-xr-x
252
+
253
+ where directories need to be executable for `cd` to be able to enter that
254
+ dir. 755 is a shorthand for the more readable argument
255
+
256
+ u=rwx,go=rx
257
+
258
+ u is user, g is group, o is other.
259
+
260
+ Use `chmod -R` for recursively applying to all the dirs below the
261
+ argument as well.
262
+
263
+
264
+ ## Searching streams
265
+
266
+ One of the most useful tools available on UNIX and the one you may use
267
+ the most is `grep`. This tool matches regular expressions
268
+ (which includes simple words) and prints matching lines to
269
+ `stdout`.
270
+
271
+ The simplest incantation looks for a particular character sequence in
272
+ a set of files. Here is an example that looks for
273
+ lines begining with 'Return-Path:' in the IMAP mails
274
+ in the current directory.
275
+
276
+ :::shell-unix-generic
277
+ grep '^Return-Path:' *,{S,RS,ST,FRST}
278
+
279
+ You may find the dot '.' regular expression useful. It matches any
280
+ single character but is typically combined with the star, which
281
+ matches zero or more of the preceding item. Be careful to enclose the
282
+ expression in single quotes so the command-line expansion doesn't
283
+ modify the argument. The following example, looks for references to
284
+ any a forum page in a server log file:
285
+
286
+ :::shell-unix-generic
287
+ sudo egrep '/forum/.*' /var/log/httpd/access_log
288
+
289
+ or equivalently:
290
+
291
+ :::shell-unix-generic
292
+ sudo cat /var/log/access_log | grep '/forum/.*'
293
+
294
+ The second form is useful when you want to process a collection of
295
+ files as a single stream as in:
296
+
297
+ :::shell-unix-generic
298
+ sudo cat /var/log/httpd/*_log | grep '/forum/.*'
299
+
300
+ If you need to look for a string at the beginning of a line, use caret '^':
301
+
302
+ :::shell-unix-generic
303
+ grep '^153.19.7.230' /var/log/httpd/access_log
304
+
305
+ This finds all lines in all access logs that begin with IP address
306
+ 153.19.7.230.
307
+
308
+ If you would like to invert the pattern matching to find lines that do
309
+ not match a pattern, use `-v`. Here is an example that finds
310
+ references to non image `GET`s in a log file:
311
+
312
+ :::shell-unix-generic
313
+ sudo cat /var/log/access_log | grep -v '/images'
314
+
315
+ Now imagine that you have an http log file and you would like to
316
+ filter out page requests made by nonhuman spiders. If you have a file
317
+ called `spider.ips`, you can find all nonspider page views via:
318
+
319
+ :::shell-unix-generic
320
+ cat /var/log/httpd/access_log | grep -v -f /tmp/spider.ips
321
+
322
+ Finally, to ignore the case of the input stream, use `-i`.
323
+
324
+
325
+ ## Przekształcanie strumieni tekstu
326
+
327
+ Morphing a text stream is a fundamental UNIX operation.
328
+
329
+ ### tr
330
+
331
+ For manipulating whitespace, you will find `tr` very useful.
332
+
333
+ If you have columns of data separated by spaces and you would like the
334
+ columns to collapse so there is a single column of data, tell
335
+ `tr` to replace space with newline `tr ' ' '\n'`.
336
+ Consider input file `falski.txt`:
337
+
338
+ :::shell-unix-generic
339
+ ala ma kota
340
+ ola ma psa
341
+
342
+ To get all those names in a column, use
343
+
344
+ :::shell-unix-generic
345
+ cat falski.txt | tr ' ' '\n'
346
+
347
+ If you would like to collapse all sequences of spaces into one single
348
+ space, use `tr -s ' '`.
349
+
350
+ To convert a PC file to UNIX, you have to get rid of the '\r'
351
+ characters. Use `tr -d '\r'`.
352
+
353
+ ### sed
354
+
355
+ If dropping or translating single characters is not enough, you can
356
+ use `sed` (stream editor) to replace or delete text chunks matched by
357
+ regular expressions. For example, to replace all references to text
358
+ *TT* by *kbd* in the file *ug.rdiscount*, use
359
+
360
+ :::shell-unix-generic
361
+ cat /ug.rdiscount | sed -r 's/TT/kbd/g'
362
+
363
+ If there are multiple references to *TT* on a single line, use the `g`
364
+ suffix to indicate "global" on that line otherwise only the first
365
+ occurrence will be removed:
366
+
367
+ :::shell-unix-generic
368
+ ... | sed -r 's/TT/kbd/g'
369
+
370
+ If you would like to replace references to *view.html* with
371
+ *index.html*, use
372
+
373
+ :::shell-unix-generic
374
+ ... | sed 's/view.html/index.html/'
375
+
376
+ If you want any `.pas` file converted to `.p`, you must match the file
377
+ name with a regular expression and refer to it via `\1`:
378
+
379
+ :::shell-unix-generic
380
+ ... | sed 's/\(.*\).pas/\1.p/'
381
+
382
+ The `\(...\)` grouping collects text that you can refer to with `\1`.
383
+
384
+ If you want to kill everything from the ',' character to end of line,
385
+ use the end-of-line marker `$`:
386
+
387
+ :::shell-unix-generic
388
+ ... | sed 's/,.*$//' # kill from comma to end of line
389
+
390
+
391
+ ## Tarballs
392
+
393
+ Note: *The name comes from a similar word, **hairball** (stuff that
394
+ cats throw up), I'm pretty sure.*
395
+
396
+ To collect a bunch of files and directories together, use
397
+ `tar`. To tar up and gzip your entire home directory and
398
+ put the gzipped tarball into `/tmp`, do this
399
+
400
+ :::shell-unix-generic
401
+ cd ~/.. # go one dir above dir you want to tar.gz; why?
402
+ tar zcvf /tmp/wbzyl.backup.tar.gz wbzyl
403
+
404
+ By convention, use `.tar.gz` as the extension.
405
+ To ungzip and untar this file use
406
+
407
+ :::shell-unix-generic
408
+ cd ~/tmp
409
+ tar zxvf /tmp/wbzyl.backup.tar.gz
410
+
411
+ `tar` untars things in the **current** directory!
412
+
413
+ After running the untar, you will find a new directory,
414
+ `~/tmp/wbzyl`, that is a copy of your home directory. Note that
415
+ the way you tar things up dictates the directory structure when
416
+ untarred. The fact that I mentioned `wbzyl` in the tar
417
+ creation means that I'll have that dir when untarred. In contrast,
418
+ the following will also make a copy of my home directory, but without
419
+ having a `parrt` root dir:
420
+
421
+ :::shell-unix-generic
422
+ cd ~wbzyl
423
+ tar cvf /tmp/wbzyl.backup.tar *
424
+
425
+ It is a good idea to tar things up with a root directory so that when
426
+ you untar you don't generate a million files in the current directly.
427
+ To see what's in a tarball, use
428
+
429
+ :::shell-unix-generic
430
+ tar ztvf /tmp/wbzyl.backup.tar.gz
431
+
432
+ If you have a big file to compress, use `gzip`:
433
+
434
+ :::shell-unix-generic
435
+ gzip bigfile
436
+
437
+ After execution, your file will have been renamed `bigfile.gz`.
438
+ To uncompress, use
439
+
440
+ :::shell-unix-generic
441
+ gzip -d bigfile.gz
442
+
443
+ To display a text file that is currently `gzip`'d, use `zcat`:
444
+
445
+ :::shell-unix-generic
446
+ zcat bigfile.gz
447
+
448
+
449
+ ## Kopiowanie plików między komputerami
450
+
451
+ ### rsync
452
+
453
+ When you need to have a directory on one machine mirrored on another
454
+ machine, use `rsync`. It compares all the files in a directory
455
+ subtree and copies over any that have changed to the mirrored
456
+ directory on the other machine. For example, here is how you could
457
+ "pull" all css screencasts files from `renia.local` to the box from
458
+ which you execute the `rsync` command:
459
+
460
+ :::shell-unix-generic
461
+ hostname -f
462
+ wlodek.local
463
+ rsync -raz -e ssh -v wlodek@renia.local:screencasts/css-tricks.com \
464
+ ~/backup/
465
+ ls ~/backup/css-tricks.com/
466
+ VideoCast-57-css3.m4v
467
+ ...
468
+
469
+ `rsync` will delete or truncate files to ensure the files stay
470
+ the same. This is bad if you erase a file by mistake--it will wipe
471
+ out your backup file. Change the options above to `-rabz` to
472
+ tell `rsync` to make a copy of any existing file before it
473
+ overwrites it. Or change a filename of any existing file:
474
+
475
+ :::shell-unix-generic
476
+ rsync -rabz -e ssh -v --suffix .rsync_`date '+%Y%m%d'` \
477
+ wlodek@renia.local:screencasts/css-tricks.com ~/backup/
478
+
479
+ where ``date '+%Y%m%d'`` (in reverse single quotes) means
480
+ "execute this `date` command".
481
+
482
+ To exclude certain patterns from the sync, use `--exclude`:
483
+
484
+ :::shell-unix-generic
485
+ rsync -rabz --exclude=tmp/ --suffix .rsync_`date '+%Y%m%d'` \
486
+ -e ssh -v wbzyl@renia.local:screencasts/css-tricks.com' ~/backup/
487
+
488
+ ### scp
489
+
490
+ To copy a file or directory manually, use `scp`:
491
+
492
+ :::shell-unix-generic
493
+ scp lecture.html wbzyl@sigma.ug.edu.pl:public_html/
494
+
495
+ Just like `cp`, use `-r` to copy a directory recursively.
496
+
497
+
498
+ ## Pozostałe programy
499
+
500
+ ### find
501
+
502
+ Most GUIs for Linux or PCs have a search facility, but from the
503
+ command-line you can use `find`. To find all files with suffix
504
+ `.c` starting in directory `~/projects`, use:
505
+
506
+ :::shell-unix-generic
507
+ find ~/projects -name '.c'
508
+
509
+ The default "action" is to `-print`.
510
+
511
+ You can specify a globbing pattern to match. For example, to look
512
+ under your home directory for any xml files, use:
513
+
514
+ :::shell-unix-generic
515
+ find ~ -name '*.xml' -print
516
+
517
+ Note the use of the single quotes to prevent command-line
518
+ expansion--you want the '*' to go to the `find` command.
519
+
520
+ You can execute a command for every file or directory found that
521
+ matches a name. For example, do delete all xml files, do this:
522
+
523
+ :::shell-unix-generic
524
+ find ~ -name '*.xml' -exec rm {} \;
525
+
526
+ where "{}" stands for "current file that matches". The end of the
527
+ command must be terminated with ';' but because of the command-line
528
+ expansion, you'll need to escape the ';'.
529
+
530
+ You can also specify time information in your query. Here is a shell
531
+ script that uses `find` to delete all files older than 14 days.
532
+
533
+ :::shell-unix-generic
534
+ #!/bin/sh
535
+ BACKUP_DIR=$HOME/backup
536
+ # number of days to keep backups
537
+ AGE=14 # days
538
+ AGE_MINS=$[ $AGE * 60 * 24 ]
539
+ # delete dirs/files
540
+ find $BACKUP_DIR/* -cmin +$AGE_MINS -type d -exec rm -rf {} \;
541
+
542
+ ### fuser
543
+
544
+ If you want to know who is using a port such as HTTP (80), use
545
+ `fuser`. You must be root to use this:
546
+
547
+ :::shell-unix-generic
548
+ sudo /sbin/fuser -n tcp 80
549
+ 80/tcp: 1812 1884 1892 1898
550
+
551
+ The output indicates the list of processes associated with that port.
552
+
553
+ ### whereis
554
+
555
+ Sometimes you want to use a command but it's not in your `PATH`
556
+ and you can't remember where it is. Use `whereis` to look in
557
+ standard unix locations for the command.
558
+
559
+ :::shell-unix-generic
560
+ whereis fuser
561
+ fuser: /sbin/fuser /usr/man/man1/fuser.1 /usr/man/man1/fuser.1.gz
562
+ whereis ls
563
+ ls: /bin/ls /usr/man/man1/ls.1 /usr/man/man1/ls.1.gz
564
+
565
+ `whereis` also shows `man` pages.
566
+
567
+ ### which, type
568
+
569
+ Sometimes you might be executing the wrong version of a command and
570
+ you want to know which version of the command your `PATH`
571
+ indicates should be run. Use `which` to ask:
572
+
573
+ :::shell-unix-generic
574
+ which ls
575
+ alias ls='ls --color=tty'
576
+ /bin/ls
577
+ type ls
578
+ ls is aliased to `ls --color=auto'
579
+
580
+ If nothing is found in your path, you'll see:
581
+
582
+ :::shell-unix-generic
583
+ which fuser
584
+ /usr/bin/which: no fuser in (/usr/local/bin:/usr/X11R6/bin)
585
+
586
+ ### kill, pkill
587
+
588
+ To send a signal to a process, use `kill`. Typically you'll
589
+ want to just say `kill pid` where `pid` can be found
590
+ from `ps` or `top` (see below).
591
+
592
+ Use `kill -9 pid` when you can't get the process to die;
593
+ this means kill it with "extreme prejudice".
594
+
595
+ ### tracepath, traceroute
596
+
597
+ If you are having trouble getting to a site, use `traceroute`
598
+ to watch the sequence of hops used to get to a site:
599
+
600
+ :::shell-unix-generic
601
+ /usr/sbin/tracepath sigma.ug.edu.pl
602
+ 1: wlodek.local 0.391ms pmtu 1500
603
+ ...
604
+ 5: do.gda-ar3.z.gda-r2.tpnet.pl (213.25.12.95) 10.854ms asymm 6
605
+ 6: TP-tp-edu-gw.task.gda.pl (153.19.0.2) 42.373ms asymm 13
606
+ 7: tp-jra10ge.task.gda.pl (153.19.252.33) 34.889ms asymm 12
607
+ 8: area1-ug1-swr.task.gda.pl (153.19.254.228) 34.365ms asymm 12
608
+ 9: sigma.ug.edu.pl (153.19.7.230) 36.318ms reached
609
+ Resume: pmtu 1500 hops 9 back 52
610
+
611
+ sudo /bin/traceroute sigma.ug.edu.pl
612
+ traceroute to sigma.ug.edu.pl (153.19.7.230), 30 hops max, 60 byte packets
613
+ 1 wlodek.local 1.708 ms 2.529 ms 3.330 ms
614
+ ...
615
+ 5 do.gda-ar3.z.gda-r2.tpnet.pl (213.25.12.95) 21.905 ms 22.052 ms 30.636 ms
616
+ 6 TP-tp-edu-gw.task.gda.pl (153.19.0.2) 42.546 ms 33.290 ms 33.401 ms
617
+ 7 tp-jra10ge.task.gda.pl (153.19.252.33) 38.472 ms 38.876 ms 39.371 ms
618
+ 8 area1-ug1-swr.task.gda.pl (153.19.254.228) 41.536 ms 41.720 ms 41.916 ms
619
+ 9 sigma.ug.edu.pl (153.19.7.230) 39.618 ms 39.921 ms 40.236 ms
620
+
621
+
622
+ ### Jaki jest mój adres IP?
623
+
624
+ :::shell-unix-generic
625
+ /sbin/ifconfig
626
+
627
+ or
628
+
629
+ :::shell-unix-generic
630
+ /sbin/ifconfig eth0
631
+
632
+ Under the `eth0` interface, you'll see the `inet addr`:
633
+
634
+ :::shell-unix-generic
635
+ eth0 Link encap:Ethernet HWaddr 00:0E:35:95:80:44
636
+ inet addr:192.188.100.1 Bcast:192.188.100.255 Mask:255.255.255.0
637
+ inet6 addr: fe00::40a:32ca:c950:1234/64 Scope:Link
638
+
639
+
640
+ ## Użyteczne potoki: generowanie histogramu
641
+
642
+ A histogram is set of count, value pairs indicating how often the
643
+ value occurs. The basic operation will be to sort, then count how
644
+ many values occur in a row and then reverse sort so that the value
645
+ with the highest count is at the top of the report.
646
+
647
+ :::shell-unix-generic
648
+ ... | sort |uniq -c|sort -r -n
649
+
650
+ Note that `sort` sorts on the whole line, but the first column
651
+ is obviously significant just as the first letter in someone's last
652
+ name significantly positions their name in a sorted list.
653
+
654
+ `uniq -c` collapses all repeated sequences of values but prints
655
+ the number of occurrences in front of the value. Recall the previous
656
+ sorting:
657
+
658
+ :::shell-unix-generic
659
+ cut -d ' ' -f 7 access_log | egrep '^/sp/' | \
660
+ sort | \
661
+ uniq
662
+ /sp/
663
+ /sp/exercises
664
+ /sp/git
665
+ /sp/images/alan_kay.jpg
666
+ /sp/images/alan_perlis.jpg
667
+ /sp/images/albert_einstein.jpg
668
+ ...
669
+
670
+ Now add `-c` to `uniq`:
671
+
672
+ :::shell-unix-generic
673
+ cut -d ' ' -f 7 access_log | egrep '^/sp/' | \
674
+ sort | \
675
+ uniq -c
676
+ 22 /sp/
677
+ 6 /sp/exercises
678
+ 2 /sp/git
679
+ 1 /sp/images/alan_kay.jpg
680
+ 2 /sp/images/alan_perlis.jpg
681
+ 4 /sp/images/albert_einstein.jpg
682
+ ...
683
+
684
+ Now all you have to do is reverse sort the lines according to the first column numerically.
685
+
686
+ :::shell-unix-generic
687
+ cut -d ' ' -f 7 access_log | egrep '^/sp/' | \
688
+ sort | \
689
+ uniq -c | \
690
+ sort -r -n
691
+ 51 /sp/stylesheets/uv.css
692
+ 51 /sp/stylesheets/sp.css
693
+ 51 /sp/stylesheets/screen.css
694
+ 51 /sp/stylesheets/print.css
695
+ 50 /sp/stylesheets/icons/external.png
696
+ ...