sp-tutorial 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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,604 @@
1
+ #### {% title "Przegląd poleceń Uniksowych" %}
2
+
3
+ # Przetrwać z uniksem
4
+
5
+ <blockquote>
6
+ {%= image_tag "/images/alan_perlis.jpg", :alt => "[Alan Perlis]" %}
7
+ <p>
8
+ Computer Science is embarrassed by the computer.
9
+ </p>
10
+ <p class="author">— Alan Perlis</p>
11
+ </blockquote>
12
+
13
+
14
+ ## Logowanie i wylogowywanie
15
+
16
+ * Hasła. Co mierzy [The Password Meter] [password meter]
17
+ * Zmiana hasła: polecenie `passwd`
18
+ * Logowanie zdalne: `ssh`. [Getting started with SSH] [started with ssh]
19
+ * Wylogowywanie: `exit`, `logout`
20
+ * Blokowanie i odblokowywanie terminala: ctrl+s, ctrl+q
21
+ * Kto pracuje: `who`, `w`.
22
+
23
+ Uzyskiwanie pomocy: polecenie `man`.
24
+ Składnia polecenia uniksowego.
25
+
26
+ Tworzenie aliasów:
27
+
28
+ :::shell-unix-generic
29
+ alias l='ls -l'
30
+
31
+ Polecenie *alias*:
32
+
33
+ alias ls
34
+ alias rm
35
+
36
+ Aliasy nazw plików: *ln*. Przykłady:
37
+
38
+ ln -s TARGET LINK_NAME
39
+ ln -s TARGET... DIRECTORY
40
+ ls -s LINK
41
+ rm LINK
42
+
43
+ ## SSH: secure shell
44
+
45
+ Generujemy klucze: prywatny i publiczny:
46
+
47
+ :::shell-unix-generic
48
+ ssh-keygen
49
+ ... Enter, Enter…
50
+ cat ~/.ssh/id_rsa.pub
51
+
52
+
53
+ ## Limity dyskowe
54
+
55
+ Polecenia: `quota`, `du -h` i `du -sh`, `df -h`.
56
+
57
+ Do wypróbowania:
58
+
59
+ :::shell-unix-generic
60
+ df -k
61
+ df -m
62
+ df -h
63
+ du /tmp
64
+ du -s /tmp # -s = zestawienie
65
+ du -h -s /tmp
66
+
67
+ Konfiguracja przeglądarki: zmiana wielkości pamięci podręcznej
68
+ przeglądarki (ang. *cache*).
69
+
70
+
71
+ ## Znaki specjalne powłoki
72
+
73
+ Wklepując polecenia powinniśmy zwrócić uwagę, że *Bash* rezerwuje
74
+ niektóre ze znaków. Zarezerwowane znaki dzielimy na dwie kategorie:
75
+ *metaznaki*
76
+
77
+ | & ; ( ) < > space tab
78
+
79
+ oraz *operatory sterujące*:
80
+
81
+ || & && ; ;; ( ) | |& <newline>
82
+
83
+ W powłoce możemy cytować (*quoting*) znaki na trzy sposoby,
84
+ korzystając ze znaku:
85
+
86
+ * escape \(&nbsp;\\&nbsp;\)
87
+ * pojedynczego cudzysłowu \(&nbsp;'&nbsp;\)
88
+ * podwójnego cudzysłowu \(&nbsp;"&nbsp;\)
89
+
90
+ Niecytowane *metaznaki* oddzielają słowa.
91
+
92
+ Cytowanie znaków jest opisane w manualu programu *bash*
93
+ w sekcji *QUOTING*. Mały przykład:
94
+
95
+ :::shell-unix-generic
96
+ echo "The # here does not begin a comment."
97
+ echo 'The # here does not begin a comment.'
98
+ echo The \# here does not begin a comment.
99
+ echo The # here begins a comment.
100
+
101
+ echo ${PATH#*:} # podstawienie parametru
102
+ echo $(( 2#101 )) # zmiana podstawy na 10
103
+
104
+ echo hello; echo world
105
+
106
+ for file in /{,usr/}bin/*calc
107
+ # ^ wyszukaj wszystkie pliki wykonywalne
108
+ # o nazwie kończącej się na "calc"
109
+ # w katalogach /bin i /usr/bin
110
+ do
111
+ if [ -x "$file" ]
112
+ then
113
+ echo $file
114
+ fi
115
+ done
116
+
117
+ echo {a..z}
118
+ echo {0..4}
119
+
120
+
121
+ ## Jedno po drugim
122
+
123
+ Wykonywanie kilku poleceń kolejno:
124
+
125
+ ls ; ls -l
126
+
127
+
128
+ ## Przekierowanie
129
+
130
+ Standard input, output i error: STDIN, STDOUT, STDERR.
131
+ Przykłady:
132
+
133
+ echo 'hello world' > test.txt
134
+ read x
135
+ good bye
136
+ echo $x
137
+ good bye
138
+ read x < test.txt
139
+ echo $x
140
+ hello world
141
+
142
+
143
+ ## Dopisywanie
144
+
145
+ Przykład:
146
+
147
+ echo 'ala > test.txt
148
+ echo 'ma kota' >> test.txt
149
+ cat test.txt
150
+ ala
151
+ ma kota
152
+ tac test.txt
153
+
154
+ Inny przykład:
155
+
156
+ nl test.txt
157
+
158
+
159
+ ## Grupowanie
160
+
161
+ Przykład:
162
+
163
+ (ls ; df -h; who) > result.txt
164
+
165
+
166
+ ## Potoki
167
+
168
+ Zestawianie poleceń w potok:
169
+
170
+ :::shell-unix-generic
171
+ who | sort
172
+ who | wc -l
173
+ ls | wc -l
174
+ who | grep wbzyl
175
+ echo 'czas na przerwę' | tee result.txt
176
+
177
+
178
+ <blockquote>
179
+ <h1>Bashowy hardcore</h1>
180
+ <pre>rm -rf $( du -s * | \
181
+ sort -rn | head -1 | cut -f 2 )
182
+ kill -9 $( ps augxww | \
183
+ sort -rnk +3,+4 | \
184
+ head -1 | \
185
+ awk '{print $2}' )
186
+ </pre>
187
+ </blockquote>
188
+
189
+ Wyszukiwanie katalogów zajmujących najwięcej miejsca na dysku:
190
+
191
+ :::shell-unix-generic
192
+ du -m ~ | sort -k1nr | head
193
+
194
+
195
+ ## Operacje na plikach
196
+
197
+ Zawartość katalogu `/`. Katalog domowy użytkownika: `pwd`.
198
+ Ścieżka, ścieżka względna, katalog bieżący, rodzicielski.
199
+
200
+ <blockquote>
201
+ <h1>Bashowe dziwadełka</h1>
202
+ <pre>alias kitty=cat
203
+ alias dir=ls
204
+ alias erase=rm
205
+ alias process_table=ps
206
+ setenv DISPLAY=vt100
207
+ </pre>
208
+ </blockquote>
209
+
210
+ Pliki: tworzenie, usuwanie, przenoszenie, zmiana nazwy.
211
+ Polecenia: `ls`, `tree`, `cp`, `cd`, `rm`, `rmdir`.
212
+
213
+ Rozwijanie nazw plików: globbing.
214
+
215
+ *Pliki ukryte*, to pliki których nazwy zaczynają się od kropki:
216
+
217
+ :::shell-unix-generic
218
+ ls -la | egrep ' \.'
219
+
220
+ Wyświetlanie zawartości pliku: `cat`:
221
+
222
+ :::shell-unix-generic
223
+ cat /etc/bashrc
224
+ cat -n /etc/bashrc
225
+ cat /etc/bashrc /etc/passwd > ~/tmp/etc.txt
226
+ cat /etc/passwd | tr a-z A-Z
227
+ tr a-z A-Z < /etc/passwd
228
+
229
+ Polecenia: `wc`, `head` oraz `tail`.
230
+
231
+ Zdalne kopiowanie plików: `scp`.
232
+
233
+
234
+ ## Korzystamy z archiwum plików
235
+
236
+ Polecenia: *tar*, *gzip*, *gunzip*, *zip*, *unzip*.
237
+
238
+ Jak utworzyć archiwum *.tar.gz*? Na przykład
239
+ w katalogu nadrzędnym wykonujemy polecenie:
240
+
241
+ tar zcf backup.tar.gz public_git
242
+
243
+ Jak rozpakować archiwum *backup.tar.gz*?
244
+
245
+ tar zxf backup.tar.gz
246
+
247
+ Jak podejrzeć co zawiera archiwum *.tar.gz*:
248
+
249
+ tar ztf backup.tar.gz
250
+
251
+ Zwykle w opcjach dopisujemy *v*, co oznacza
252
+ *verbose*, po polsku to chyba gadatliwość?
253
+
254
+
255
+ ## Uprawnienia
256
+
257
+ Polecenia `chmod` i `chown`. Przykład:
258
+
259
+ :::shell-unix-generic
260
+ cd ~/tmp
261
+ mkdir xxx
262
+ ls -ld xxx
263
+ # drwxr-xr-x 2 wbzyl pracinf 4096 09-14 12:48 xxx/
264
+ chmod 701 xxx
265
+ ls -ld xxx
266
+ # drwx-----x 2 wbzyl pracinf 4096 09-14 12:48 xxx/
267
+ touch xxx/readme
268
+ ls -l xxx/readme
269
+ # -rw-r--r-- 1 wbzyl pracinf 0 09-14 12:52 xxx/readme
270
+ chmod 600 xxx/readme
271
+ ls -l xxx/readme
272
+ # -rw------- 1 wbzyl pracinf 0 09-14 12:52 xxx/readme
273
+
274
+ Dlaczego nie ma przykładów dla polecenia `chown`:
275
+
276
+ :::shell-unix-generic
277
+ groups
278
+
279
+
280
+ ## Przykład: własna strona WWW na *Sigmie*
281
+
282
+ Własna strona na *Sigmie* krok po kroku:
283
+
284
+ :::shell-unix-generic
285
+ cd
286
+ chmod 711 ../wbzyl
287
+ mkdir public_html
288
+ chmod 711 public_html
289
+ cd public_html
290
+ cat > index.html
291
+ ... wklejamy zawarość pliku index.html poniżej ...
292
+ ... wciskamy ctrl-D
293
+ cat > main.css
294
+ ... wklejamy zawarość pliku main.css poniżej ...
295
+ ... wciskamy ctrl-D
296
+
297
+ Plik *index.html*:
298
+
299
+ :::html
300
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
301
+ "http://www.w3.org/TR/html4/strict.dtd">
302
+ <html>
303
+ <head>
304
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
305
+ <link href="/favicon.ico" rel="SHORTCUT ICON">
306
+ <link href="main.css" media="all" rel="Stylesheet" type="text/css" charset="utf-8">
307
+ <title>HTML4 + CSS</title>
308
+ </head>
309
+ <body>
310
+ <h1>HTML4 + CSS</h1>
311
+ <p>Przykładowy akapit.</p>
312
+ </body>
313
+ </html>
314
+
315
+ Plik *main.css*:
316
+
317
+ :::css_experimental
318
+ html {
319
+ background-color: #AAAAAA;
320
+ }
321
+ body {
322
+ margin: 20px 100px;
323
+ padding: 2em;
324
+ font-family: Verdana, sans-serif;
325
+ background-color: #EEEEEE;
326
+ }
327
+
328
+ Na koniec walidujemy stronę.
329
+
330
+
331
+ ## Przykład: repozytorium Git
332
+
333
+ Zakładamy repozytorium:
334
+
335
+ :::shell-unix-generic
336
+ cd ~/tmp
337
+ mkdir test
338
+ cd test
339
+ touch README.md
340
+ git init
341
+ git add .
342
+ git commit -m "pierwsza wrzutka"
343
+ ... edycja README.md, add – zmiany, commit – co zostało zrobione
344
+
345
+
346
+ ## Praca z *Emacsem* czystym relaksem
347
+
348
+ Edytory ASCII i non-ASCII. [Emacs kontra Vi] [wojny edytorowe].
349
+
350
+ [**Real Programmers**](http://xkcd.com/378/)
351
+
352
+ {%= image_tag "/images/real_programmers.png", :alt => "[real programmers comics]" %}
353
+
354
+ Użyteczne linki:
355
+
356
+ * [A Guided Tour of Emacs] [emacs-tour]
357
+ * {%= link_to "Skróty klawiszowe edytora Emacs", "/doc/survival.pdf" %}
358
+ * [Emacs Wiki] [emacs-wiki]
359
+ * [Emacs Starter Kit] [emacs-starter-kit] —
360
+ All the code you need to get started, with an emphasis on dynamic languages.
361
+ * [GNU Emacs manual] [emacs-manual]
362
+ * [Programming in Emacs Lisp (Second Edition)] [emacs-lisp-intro]
363
+ * [An Introduction to Programming in Emacs Lisp] [elisp]
364
+
365
+ Zobacz też edytor [Bespin » Code in the Cloud] [bespin].
366
+
367
+
368
+ ## Przykład: udostępniamy repozytorium Git
369
+
370
+ Tworzymy *bare* repo *test.git* z repozytorium *test*:
371
+
372
+ :::shell-unix-generic
373
+ mkdir ~/public_git # katalog na publiczne repozytoria
374
+ git clone --bare ~/tmp/test ~/public_git/test.git
375
+
376
+ Teraz każdy, korzystając z protokołu git, może sklonować na swój
377
+ komputer repo *test.git*:
378
+
379
+ :::shell-unix-generic
380
+ git clone git://sigma.inf.ug.edu.pl/~wbzyl/test.git
381
+
382
+ Właściciel repo, czyli ja, klonuje repo korzystając z protokołu
383
+ **ssh**:
384
+
385
+ :::shell-unix-generic
386
+ git clone ssh://sigma.inf.ug.edu.pl/~wbzyl/public_git/test.git
387
+
388
+ Właściciel repo może wykonać `pull` i `push`, a pozostali
389
+ tylko `pull`.
390
+
391
+
392
+ ## Przykład: blog
393
+
394
+ Skorzystamy z gotowego bloga [Jekyll-Bloga] [jblog]
395
+ który specjalnie przygotowałem na tę okazję.
396
+
397
+ Wchodzimy na serwer *http://github.com*, gdzie zakładamy darmowe publiczne
398
+ konto (do 300MB): zakładka *Pricing and Signup*.
399
+
400
+ Po zalogowaniu się na swoje konto, klikamy w zakładkę *account*
401
+ i dodajemy klucz publiczny z *Sigmy*: zakładka *SSH Public Keys*.
402
+
403
+ <blockquote>
404
+ <p>
405
+ <em>fork</em> – widelec, widły, <b>rozwidlenie</b><br/>
406
+ <em>branch</em> – gałąź, odnoga; <b>odgałęzienie</b>
407
+ </p>
408
+ </blockquote>
409
+
410
+ Przechodzimy na konto: *http://github.com/wbzyl/*, gdzie klikamy
411
+ w projekt *jblog*. Forkujemy projekt. Na koniec, klonujemy
412
+ sforkowany przed chwilą projekt na swój komputer.
413
+
414
+ Teraz przechodzimy do katalogu z projektem:
415
+
416
+ :::shell-unix-generic
417
+ cd jblog
418
+
419
+ i dodajemy oryginalne repozytorium jako **remote**:
420
+
421
+ :::shell-unix-generic
422
+ git remote add wbzyl git://github.com/wbzyl/jblog.git
423
+
424
+ Umożliwi to pobieranie i scalanie uaktualnień z oryginału:
425
+
426
+ :::shell-unix-generic
427
+ git fetch wbzyl
428
+ git diff wbzyl/master
429
+ git merge wbzyl/master
430
+
431
+ Piszemy pierwszy wpis do swojego bloga: [instrukcje są tutaj] [jblog].
432
+
433
+
434
+ ## Zmienne środowiska
435
+
436
+ Polecenie: `env` i `set`.
437
+
438
+ Zmienna `PATH`.
439
+
440
+ I18N: `LANG`, `LC_XXX`.
441
+
442
+ Pliki: `.bashrc`, `.bash_profile`, `.bash_history`.
443
+
444
+
445
+ ## Przekierowywanie wejścia/wyjścia
446
+
447
+ Jakieś przykłady: `>`, `>>`, `<`.
448
+
449
+ :::shell-unix-generic
450
+ cd
451
+ echo "export PATH=$PATH:." >> .bashrc
452
+ cd ~/.ssh
453
+ cat ../id_rsa.pub >> authorized_keys
454
+
455
+
456
+ ## Polecenie find
457
+
458
+ Proste przykłady:
459
+
460
+ :::shell-unix-generic
461
+ find | LC_ALL=C sort
462
+ find -ls | sort -k11
463
+ grep POSIX_OPEN_MAX /dev/null $(find /usr/include -type f | sort)
464
+ getconf ARG_MAX
465
+ find /usr/include -type f | xargs grep POSIX_OPEN_MAX /dev/null
466
+
467
+ Znajdź pliki puste lub nie otwierane od ponad roku:
468
+
469
+ :::shell-unix-generic
470
+ find . -size 0 -o -atime +365
471
+
472
+ Więcej przykładów:
473
+
474
+ :::shell-unix-generic
475
+ find . -name "*.c" -print
476
+ find . -mmin -5 # pliki modyfikowane w ostatnich 5 minutach
477
+ find . -mmin +5 # ?
478
+ find . -name "*.c" | xargs ls -l
479
+
480
+ Polecenie *locate*.
481
+
482
+
483
+ ## Polecenie diff
484
+
485
+ Tworzymy dwa pliki testowe:
486
+
487
+ :::shell-unix-generic
488
+ echo Test 1 > test.1
489
+ echo Test 2 > test.2
490
+
491
+ Sprawdzamy różnice:
492
+
493
+ :::shell-unix-generic
494
+ diff test.[12]
495
+ diff -c test.[12]
496
+
497
+ Tworzymy łatę (ang. patch):
498
+
499
+ :::shell-unix-generic
500
+ diff -c test.1 test.2 > test.diff
501
+
502
+ Nakładamy łatę:
503
+
504
+ :::shell-unix-generic
505
+ patch < test.diff
506
+ cat test.1
507
+
508
+
509
+ <blockquote>
510
+ {%= image_tag "/images/tparr.jpg", :alt => "[Terence Parr]" %}
511
+ <p>
512
+ I can safely say that I am crippled without grep and feel naked
513
+ (believe me, that ain't pretty) without sed, awk, and wc.
514
+ <p>
515
+ <p class="author">
516
+ — <a href="http://www-128.ibm.com/developerworks/xml/library/x-sbxml.html">Terence Parr</a>
517
+ </p>
518
+ </blockquote>
519
+
520
+ ## Wyrażenia regularne
521
+
522
+ Samouczek: [Learning to Use Regular Expressions] [regexp tutorial].
523
+
524
+ Program <kbd>egrep</kbd>.
525
+
526
+ Testowanie wyrażeń regularnych: [Regular Expression Tester] [regexp tester]
527
+
528
+
529
+ ## Fuse filesystem
530
+
531
+ Krótka ściąga z [Fuse filesystem] [fuse].
532
+
533
+ Łączenie ze zdalnym hostem:
534
+
535
+ :::shell-unix-generic
536
+ sshfs username@host: mountpoint
537
+
538
+ Odmontowanie systemu zdalnego:
539
+
540
+ :::shell-unix-generic
541
+ fusermount -u mountpoint
542
+
543
+
544
+ <blockquote>
545
+ <p>
546
+ A novice programmer was explained the meaning of RTFM. He showed up
547
+ the next day saying:
548
+ „So I went out and bought the Kama Sutra. Now what?”
549
+ </p>
550
+ <p><i>Meta</i>:
551
+ If you tell the joke above to a non-programmer, he will ask:
552
+ „What's RTFM?” A programmer will ask: „What's Kama Sutra?”
553
+ </p>
554
+ </blockquote>
555
+
556
+ ## Do poduszki…
557
+
558
+ Klasyczny esej pisarza science-fiction N. Stephenson'a:
559
+ <a href="http://www.cryptonomicon.com/beginning.html">In the Beginning
560
+ was the Command Line</a> — obowiązkowa lektura guru uniksowego!
561
+
562
+ Praktyczne:
563
+ <a href="http://www.pixelbeat.org/cmdline.html">Linux command: A practical reference</a>.
564
+
565
+ Samouczek:
566
+ <a href="http://www.ee.surrey.ac.uk/Teaching/Unix">UNIX Tutorial for Beginners</a>.
567
+
568
+ W utrwaleniu składni poleceń uniksowych może pomóc lektura
569
+ tej krótkiej satyry science-fiction: [Spłuczka w linuxie] [spluczka].
570
+
571
+ Też warte przeczytania:
572
+ <a href="http://bashcurescancer.com">BASH Cures Cancer</a>.
573
+
574
+
575
+ ## Alternatywa
576
+
577
+ [Ruby shell] [rush]. Instalacja:
578
+
579
+ :::shell-unix-generic
580
+ gem install rush
581
+
582
+
583
+ #### Linki
584
+
585
+ [password meter]: http://www.passwordmeter.com "Password Strength Checker"
586
+ [started with ssh]: http://kimmo.suominen.com/docs/ssh "Getting started with SSH"
587
+ [rush]: http://rush.heroku.com "Ruby shell"
588
+ [fuse]: http://fuse.sourceforge.net/sshfs.html "SSH Filesystem"
589
+ [regexp tutorial]: http://gnosis.cx/publish/programming/regular_expressions.html "Learning to Use Regexp"
590
+ [regexp tester]: http://www.roblocher.com/technotes/regexp.aspx "Regular Expression Tester"
591
+ [spluczka]: http://www.piotr.nabielec.com/index.php?option=com_content&task=view&id=41 "Spłuczka w linuxie"
592
+
593
+ [emacs-starter-kit]: http://github.com/technomancy/emacs-starter-kit "Emacs Starter Kit"
594
+ [emacs-wiki]: http://www.emacswiki.org "Emacs Wiki"
595
+ [emacs-manual]: http://www.gnu.org/software/emacs/manual/emacs.html "GNU Emacs manual"
596
+ [emacs-lisp-intro]: http://www.gnu.org/software/emacs/emacs-lisp-intro/emacs-lisp-intro.html "Programming in Emacs Lisp (Second Edition)"
597
+ [elisp]: http://www.gnu.org/software/emacs/manual/elisp.html "An Introduction to Programming in Emacs Lisp"
598
+ [emacs-tour]: http://www.gnu.org/software/emacs/tour "A Guided Tour of Emacs"
599
+
600
+ [jblog]: http://github.com/wbzyl/jblog "Jekyll-Blog dostosowany do Sigmy"
601
+
602
+ [bespin]: https://bespin.mozilla.com/ "Bespin » Code in the Cloud"
603
+
604
+ [wojny edytorowe]: http://pl.wikipedia.org/wiki/Wojny_edytorowe "Wojny edytorowe"