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,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"