  Jak ustawić drukarkę używającą AppleTalk
  Autor: Werner Eugster, eugster@giub.unibe.ch
  Wersja polska: Bartosz Maruszewski
  B.Maruszewski@zsmeie.torun.pl
  v1.01, 26 Lipca 1997


  Jako użytkownik Linux-a chcesz mieć dostęp do drukarek Mac-a takich
  jak LaserWriter siedzących na sieci z kontrolerem EtherTalk. Jako
  użytkownik Mac-a chcesz mieć dostęp do wszystkich drukarek na Linux-
  ie. Aby ustawić taki serwis na Linux-ie musisz postępować według tej
  samej procedury w obu przypadkach.  Po skompilowaniu i zainstalowaniu
  oprogramowania AppleTalk netatalk (jeśli tego nie zrobiłeś, to
  przeczytaj najpierw Podręcznik instalacji atalk <http://thehamp­
  tons.com/anders/netatalk> napisany przez Andersa Brownwortha) pewnie
  już uruchomiłeś wszystkie demony poprzez rc.atalk w swoim katalogu
  /etc. Ale najpierw upewnij się, że serwis AppleTalk rzeczywiście
  działa zanim zaczniesz konfigurować drukarki.  Ja używam netatalk w
  wersji 1.3.3 z łatami opisanymi w Przewodniku instalacyjnym Andersa
  Brownwortha. Powiedziano mi, że ścieżka do filtrów netatalk zmieniła
  się w nowszych wersjach.

  1.  Moja strefa AppleTalk.


  Napisz /usr/local/atalk/bin/getzones, aby sprawdzić czy wszystkie
  strefy AppleTalk są widziane przez Linux-a. Powinieneś widzieć
  przynajmniej jedną nazwę, która jest twoją strefą lokalną, w innym
  przypadku bardzo prawdopodobne jest, że twój serwis AppleTalk nie
  działa poprawnie. Ja dostaję coś takiego (tylko kilka pierwszych
  linii):


          Pingo$ /usr/local/atalk/bin/getzones | more
          VLSB
          LSB-Integrative Biology
          LSB-Biology Library
          LSB-Herbaria
          LSB-UCMP
          LSB-MVZ
          Vanishing Packets
          MIP
          Barker Hall



  Przy pomocy opcji dowiesz się która jest twoją strefą:


          Pingo$ /usr/local/atalk/bin/getzones -m
          VLSB
          Pingo$



  Tak więc moją strefą lokalną jest VLSB, kompletną listę wszystkich
  lokalnych stref można uzyskać przy pomocy opcji -l (w razie gdy twoja
  drukarka nie jest w twojej strefie musisz znać dokładną nazwę strefy).


  2.  Dowiedz się jaka jest nazwa drukarki.


  Jeśli chcesz tylko, aby lokalna drukarka UNIX-owa była dostępna dla
  klientów AppleShare, to przeskocz tę sekcję i idź do ``sekcji nr 3''.

  Najpierw musimy się dowiedzieć jak są zdefiniowane nazwy Internetowe w
  AppleTalk. Jest to bardzo podobne do tego co znasz ze swojego Linux-a.
  Nazwy występują w formie: objekt:typ@strefa. Jeśli nie zależy ci na
  nazwie strefy lokalnej to użyj @*.

  Tak więc, aby znaleźć wszystkie objekty w twojej strefie, napisz
  /usr/local/atalk/bin/nbplkup, co wypluje wielką listę, z elementami
  jak ten:


  Pingo$ /usr/local/atalk/bin/nbplkup |more
           Sun ValleyUs Macintosh:Macintosh IIsi           12398.245:253
           Sun ValleyUs Macintosh:Workstation              12398.245:4
         IB Instructional Support:  Power Macintosh        12398.196:253
         IB Instructional Support:Workstation              12398.196:4
                    centris 660AV:  Macintosh              12398.51:253
                    centris 660AV:Workstation              12398.51:4
             Chapin Lab vx - JoeC:Macintosh IIvx           12398.101:253
             Chapin Lab vx - JoeC:Workstation              12398.101:4
                Pingo Mac Printer:LaserWriter              12398.164:129
            Pingo Default Printer:LaserWriter              12398.164:128
                            Pingo:AFPServer                12398.164:130
                            Pingo:netatalk                 12398.164:4
                            Pingo:Workstation              12398.164:4
                        Lucicutia:AFPServer                12398.123:248
             Theobald Chapin, III:LaserWriter              12398.73:191



  Jeśli chcesz znać tylko objekty konkretnego typu jak LaserWriter,
  musisz użyć /usr/local/atalk/bin/nbplkup :LaserWriter. Upewnij się, że
  wstawiłeś dwukropek, który oznacza, że chcesz znać tylko objekty typu
  LaserWriter. Słowo nie może zawierać dużych liter, ale nie możesz
  ominąć spacji. Tak więc, żeby zobaczyć Macintosh IIvx musisz wstawić
  nazwę typu w cudzysłowia:


  Pingo$ /usr/local/atalk/bin/nbplkup  :"Macintosh IIvx"
             Chapin Lab vx - JoeC:Macintosh IIvx           12398.101:253
  Pingo$



  Dobra. Krótko: Chcę móc drukować z mojego Linux-a na LaserWriter o
  nazwie Theobald Chapin, III. Zanim spróbujesz ustawić printcap dla
  kolejki tej drukarki, upewnij się czy masz dostęp do tej drukarki.

  Napisz /usr/local/atalk/bin/papstatus -p "Theobald Chapin, III"
  (zauważ, że cudzysłowia służą tylko temu, aby poinformować twoją
  powłokę, iż Theobald Chaplin, III to jeden argument a nie trzy) i
  powinieneś otrzymać coś takiego:


  status: idle



  Jeśli nie, to sprawdź czy AppleTalk rzeczywiście działa (może demon
  nie jest uruchomiony ? Sprawdź tak: ps -xa | grep atalkd i ps -xa |
  grep afpd).

  Ponieważ LaserWriter spodziewa się PostScriptu, powinieneś mieć pod
  ręką krótki plik testowy w PostScripcie. Nazwa mojego pliku to:
  test.eps i mogę go wysłać bezpośrednio do Theobald Chaplin, III
  uruchamiając klienta drukowania AppleShare:

  /usr/local/atalk/bin/pap -p "Theobald Chapin, III":LaserWriter@VLSB test.eps



  Zauważ, że dołaczyłem nazwę strefy tylko po to, żeby się upewnić, że
  wszystko działa dobrze. Jeśli twoje zadanie drukowania się pojawi (co
  sekundę - czy jakoś tak - otrzymasz komunikat jeśli ktoś inny używa
  drukarki w tym samym momencie. Obserwuj odpowiedź twojej drukarki i co
  robi kiedy zacznie drukować twój plik).

  Jeśli będziesz miał jakieś kłopoty, użyj aecho, aby sprawdzić objekty
  AppleTalk w ten sam sposób jakbyś używał ping-a przez TCP/IP (Ctrl-C
  zatrzymuje aecho):


  /usr/local/atalk/bin/aecho "Theobald Chapin, III":LaserWriter@VLSB
  14 bytes from 12398.73: aep_seq=0. time=15. ms
  14 bytes from 12398.73: aep_seq=1. time=14. ms
  14 bytes from 12398.73: aep_seq=2. time=14. ms
  14 bytes from 12398.73: aep_seq=3. time=14. ms

  ----12398.73 AEP Statistics----
  5 packets sent, 4 packets received, 20% packet loss
  round-trip (ms)  min/avg/max = 14/14/15
  Pingo$



  Powinieneś stracić tylko ostatni pakiet przy przerwaniu Ctrl-C, w
  innym wypadku coś jest nie talk z twoim połączeniem.


  3.  Ustawianie serwisu drukowania na Linux-ie.


  Będą dwa kroki. Najpierw upewnisz się, że możesz drukować na Linux-ie
  potem upewnisz się, że ta drukarka jest dostępna dla klientów
  AppleShare.

  Mówiąc jaśniej: najpierw ustawisz swoją drukarkę, żeby była dostępna
  dla UNIX-a (lpd - demona drukowania) (sekcja 3.1 do 3.2), a potem
  udostępnisz ją innym użytkownikom w strefie AppleTalk (sekcja 3.3) co
  jest oczywiście opcjonalne.

  Wielu ludzi nie lubi ustawiania z dwóch powodów:
  drukarka AppleTalk jest już dostepna w strefie AppleTalk, to
  użytkownicy Mac-ów mogą się do niej bezpośrednio dołączyć. Więc nie ma
  potrzeby istnienia kolejki na Linux-ie. Jednak ja jestem użytkownikiem
  Linux-a i chcę mieć dostęp do tej drukarki i dlatego mój poniższy opis
  robi dokładnie to: pozwala użytkownikowi Linux-a na drukowanie na
  drukarce AplleTalk.
  jest drukarką lokalną podłączoną do równoległego portu Linux-a (np.
  /dev/lp1), to jest kilka zmian w pliku /etc/printcap. Ja pokażę
  przykład ustawienia z drukarką lokalną, którego nie testowałem, ale
  dostałem od innego użytkownika. Przeczytaj ``sekcję 3.4'' na ten temat
  i sprawdź szczegółowe informacje na temat używania Ghostscript-u razem
  z Netatalk <http://artoo.hitchcock.org/~flowerpt/projects/linux-
  netatalk/ghostscript.html> napisane przez Mike'a Pearsona i Billa
  McGonigle'a.


  3.1.  Konfiguracja twojego /etc/printcap.


  Jeśli twoja drukarka może już drukować przy pomocy polecenia

  Pingo$ lpr -P lp test.eps



  to możesz przeskoczyć ten pierwszy krok.

  W innym przypadku stań się "root-em" i idź do katalogu /etc, żeby
  wyedytować plik printcap. Szczegóły znajdziesz na stronie podręcznika
  systemowego "man". Ja opiszę tylko jak ustawić LaseWriter, tak żeby
  działał z poleceniem lpr z Linux-a.

  Dodaj pozycję dla swojej drukarki do pliku printcap. Ja mam
  zdefiniowaną tylko LaserWriter i mój plik wygląda tak:


  lp|Pingo LaserWriter|Theobald Chapin, III:\
          :sd=/usr/spool/theobald:\
          :lp=/dev/null:\
          :pl#63:pw#85:\
          :mx#0:\
          :sh:sf:\
          :lf=/usr/adm/lpd-errs:\
          :if=/usr/local/bin/myif:\
          :of=/usr/local/atalk/etc/ofpap:




  3.1.1.  nazwa drukarki dla użytkowników Linux-a


  Pierwsza linia definiuje trzy logiczne nazwy, które nie muszą mieć
  żadnego podobieństwa do nazw, jakie chcesz nadać tej drukarce w
  kliencie AppleShare. Dlatego nazwałem ją lp, ponieważ jest to nazwa
  stosowana w większości UNIX-ów. Inne nazwy stosuję tylko po to, żeby
  wiedzieć co to właściwie za drukarka.


  3.1.2.  katalog zadań


  Potem musisz mieć katalog zadań, gdzie demon będzie składował zadania.
  Ja nazwałem swój katalog zadań /usr/spool/theobald w tej samej
  hierarchii co katalog poczty.


  Pingo$ ls -l
  drwxrwxr-x   2 root     mail         1024 Feb  8 08:46 mail
  drwxr-xr-x   2 root     mail         2048 Feb  8 17:23 mqueue
  drwxrwxr-x   5 news     news         1024 Sep  1  1994 news
  drwxrwxr-x   2 root     lp           1024 Feb  9 13:15 theobald



  Stwórz go używając mkdir a potem ustaw właściciela (root), grupę (lp)


  Pingo$ chown root.lp theobald



  i prawa dostępu


  Pingo$ chmod 775 theobald

  Potem stworzyłem dwa pliki: lock i status w tym katalogu:


  Pingo$ cd theobald
  Pingo$ touch lock; chown root.root lock; chmod 004 lock
  Pingo$ touch status; chown root.root status; chmod 664 status



  teraz możesz zdefiniować ten katalog jako katalog zadań jak ja to
  zrobiłem w linii 2.


  3.1.3.  urządzenie drukarki


  Jeśli twoja drukarka jest lokalną drukarką dołączoną do urządzenia
  takiego jak/dev/lp1, to to jest urządzenie, którego potrzebujesz.
  Użyjesz mknod, aby utworzyć to urządzenie jeśli go jeszcze nie ma. Dla
  drukarki w AppleTalk nie chcesz właściwie drukować do żadnego
  urządzenia, ale wysłać zadanie do tej drukarki używając programu pap z
  katalogu /usr/local/atalk/bin. Zrobi się to przy pomocy filtra psf,
  który uruchomi program pap, aby mieć dostęp do drukarki. Dlatego, po
  tym jak zadanie zostało wysłane do LaserWriter, jest ono ciągle w
  Linux-ie, ponieważ demon drukowania lpd ma na samym końcu wysłać to
  zadania na urządzenie. Dlatego zdefiniujemy urządzenie /dev/null jako
  urządzenie drukarki, które wyśle twoje zadanie w próżnię (bo chcesz
  mieć tylko to co się pojawiło na drukarce AppleTalk, prawda?). Dlatego
  w trzeciej linii wpiszemy :lp=/dev/null:\. Przeczytaj stronę
  podręcznika systemowego na temat psf, jeśli masz więcej niż jedną
  drukarkę AppleTalk i jeśli masz problemy z używaniem urządzenia
  /dev/null jako urządzenia drukarki.


  3.1.4.  rozmiar strony, maksymalny rozmiar pliku i nagłówek


  Użyj pól pl i pw dla określenia długości strony (linie) i szerokości
  (znaki). Polem mx możesz zdefiniować maksymalny rozmiar pliku
  drukowanego. Jeśli plik jest większy, demon drukarki obetnie go, albo
  odmówi drukowania. Jeśli ustawisz tę wartość na 0 (mx#0), oznacza to,
  iż można drukować pliki o nieograniczonych rozmiarach. Uważaj, bo
  przypadkowo papier może się skończyć jeśli nikt się nie będzie o to
  troszczyć. A twoja głodna drukarka będzie wołać o papier ! Tak więc
  radzę nie ustawiać pola mx na 0 jeśli skończyłeś już testować i
  wszystko jest w porządku.

  Polem sh możemy zabronić drukowania strony początkowej (z
  identyfikatorem właściciela itp.)

  Polem sf możemy zabronić drukowania feed forms.


  3.1.5.  zapisywanie błędów


  Ja zdefiniowałem do tego celu plik /usr/adm/lpd-errs. Będziesz musiał
  stworzyć ten plik samemu (np. poleceniem touch /usr/adm/lpd-errs)


  3.1.6.  filtry


  To jest ważne ! Jak już to opisałem, twoje zadanie zostanie wysłane do
  drukarki AppleTalk tylko jeśli zainstalujesz odpowiedni filtr, który
  uruchomi program, pap. Pakiet netatalk używa konceptu hackerskiego,
  używając filtru psf, ale z różnymi dołączeniami do niego. psf
  analizuje nazwę tego dołączenia, aby dowiedzieć się, czy ma uruchomić
  pap jeśli podłańcuch jest w nazwie dołączenia, i odwrócić kolejność
  drukowania jeśli w nazwie jest rev. Spójrz na to wydając polecenie:


  Pingo$ ls -l /usr/local/atalk/etc
  lrwxrwxrwx   1 root     root            3 Feb  8 14:44 ifpap -> psf
  lrwxrwxrwx   1 root     root            3 Feb  8 14:44 ifpaprev -> psf
  lrwxrwxrwx   1 root     root            3 Feb  8 14:44 ofpap -> psf
  -rwxr-xr-x   1 root     root        49299 Feb  8 14:44 papd
  -rw-r--r--   1 root     root           35 Feb  9 13:48 papd.conf
  -rwxr-xr-x   1 root     root        11395 Feb  8 14:44 psf
  lrwxrwxrwx   1 root     root            3 Feb  8 14:44 tfpap -> psf
  lrwxrwxrwx   1 root     root            3 Feb  8 14:44 tfpaprev -> psf
  Pingo$



  Tak więc filtr o nazwie ifpap uruchomi pap, ifpaprev odwróci kolejność
  stron i uruchomi pap. Zamienia on zwykły tekst na PostScript, tak
  żebyś nie skończył na komunikacie z błędem.

  Jedyny filtr jaki musisz zainstalować to of:


          :of=/usr/local/atalk/etc/ofpap:



  gdzie /usr/local/bin/myif jest prostym skryptem powłoki, który pozwala
  mi na przerywanie linii w tekście, które zostały zapisane programem,
  który automatycznie łamie linie (bp. textedit). Niestety filtr psf nie
  robi nic takiego i ignoruje ustawienia szerokości papieru. Ja
  napisałem swój własny filtr linebreak.c
  <http://www.giub.unibe.ch/~eugster/linebreak.c>, który robi to dla
  mnie i umieść następujące linie w "myif":


  #!/bin/sh
  /usr/local/bin/linebreak $* | /usr/local/atalk/etc/ifpap $*



  Jeśli w ten sposób ustawisz filtr tekstowy, to linbreak będzie uważał
  tylko na szerokość strony (ustawioną pw), podczas gdy ifpap (psf)
  sprawdza tylko długość. Wygląda na to, że psf zakłada, że pierwsza
  linia to 0, tak więc ustaw pl#63 jeśli chcesz mieć 64 linii na
  stronie.

  Jeśli nie chcesz łamania linii, to po prostu umieść linię:


          :if=/usr/local/atalk/etc/ifpap:\



  Teraz zapisz swój nowy printcap. Jeśli spróbujesz teraz coś
  wydrukować, dowiesz się, że jeszcze nie działa, więc czytaj następny
  paragraf.

  Jak wspomniałem wcześniej, UNIX-owa nazwa drukarki w printcapie nie ma
  odpowiednika dla nazwy drukarki w AppleTalk. Musisz stworzyć plik
  .paprc w swoim katalogu zadań, który będzie zawierał adres drukarki w
  AppleTalk. Jest to tylko jedna linia. Zauważ, że nie musiałem
  umieszczać nazwy drukarki w cudzysłowia w tym pliku, ale inni piszą
  mi, że u nich to działało tylko z cydzysłowami. To spróbuj najpierw
  bez cydzysłowów:


  Pingo$ cat /usr/spool/theobald/.paprc
  Theobald Chapin, III:LaserWriter@VLSB



  To teraz możesz zaczynać.

  Jeśli dostaniesz komunikat o błędzie jak np. "Turing:LaserWriter@Tech
  Support": NBP wtedy spróbuj z cudzysłowami. Może być też tak, że
  musisz wstawić tylko nazwe przed dwukropkiem w cudzysłowa, tak:
  "Theobald Chapin, III":LaserWriter@VLSB. Jeśli masz jeszcze jakieś
  problemy, to myśl i kombinuj ;) NIe znam żadnego uniwersalnego sposobu
  na rozwiązanie tego problemu.

  Więcej na temat hackowania i różnych obejść z filtrami znajdziesz w
  sekcji ``Znane problemy''.


  3.2.  Przetestuj drukarkę.


  Najpierw sprawdź czy demon drukarki jest rzeczywiście uruchomiony:


  Pingo$ ps -xa | grep lpd
     45  ?  SW    0:00 (lpd)
    346 pp0 D     0:00 grep lpd
  Pingo$



  Spróbuj wydrukować plik w PostScripcie i plik tekstowy, żeby się
  przekonać, że wszystko działa. Przypuszczalnie musisz zrestartować
  demona poleceniem lpc. Uruchom lpc i napisz restart lp, down lp i up
  lp. Potem sprawdź status:


  lpc> status
  lp:
          queuing is enabled
          printing is enabled
          no entries
          no daemon present
  lpc>
  lpc> quit



  Teraz wydrukuj swój plik poleceniem


  Pingo$ lpr -P lp filename



  Jeśli wszystko jest w porządku, to plik status w katalogu zadań
  powienien teraz zawierać najświeższe informacje na temat twojej
  drukarki:




  Pingo$ cat /usr/spool/theobald/status
  job: Paul; status: busy; source: LocalTalk
  Pingo$




  3.3.  Skojarz tę drukarkę z jakąś nazwą dla AppleTalk.


  Jeśli teraz pójdziesz do Mac-a i spróbujesz wybrac swoją nową drukarkę
  dowiesz się, że pokaże się ona z nazwą twojego serwera Linux-owego. To
  może nie być zbyt zadowalające, dlatego musisz stworzyć, albo
  wyedytować plik papd.conf w katalogu etc AppleTalk,
  /usr/local/atalk/etc/papd.conf (przeczytaj "man papd" jeśli chcesz
  znać więcej szczegółów). Minimum tego co musisz zrobić to umieszczenie
  w tym pliku nazwy jaką chcesz nadać drukarce, a na końcu dopisz :\ tak
  jak w printcap-ie. W drugiej linii podajesz nazwę jaką ta drukarka ma
  w Linux-ie opcją pr. Mój plik wygląda tak:


  Pingo$ cat /usr/local/atalk/etc/papd.conf
  Pingo Mac LaserWriter:\
          :pr=lp:
  Pingo$



  Oznacza to, że (domyślna) zmienna lp zawiera nazwę: Pingo Mac
  LaserWriter dla klienta AppleShare. Dowiesz się również, że teraz
  użytkownik na Mac-u może drukować bezpośrednio na drukarce Theobald
  Chaplin III jak i poprzez Linux-a, gdzie nazwa drukarki to Pingo Mac
  LaserWriter. Dla mnie jest ważne, aby móc drukować bezpośrenio na tej
  drukarce, a podczas pracy na Mac-u drukowanie poprzez Linux-a wydaje
  się o wiele szybsze, ponieważ Linux zkolejkuje zadanie i zniknie ono
  natychmiast z mojego desktopu.

  Jeśli chcesz zarejestrować swoją drukarkę w jakiejś strefie AppleTalk
  (nie w domyślnej strefie), po prostu podajesz tę strefę wraz z
  rozszerzeniem @nazwa_strefy w pliku papd.conf:


  MotorsLab@EEAP:\
          :pr=ee3rd:




  3.4.  Jaka jest różnica między lokalną drukarką podłączoną do komput­
  era Linux-owego?


  Ta sekcja nie jest jeszcze całkiem gotowa !!!


  /etc/princap:
  lp:lp=/dev/lp1:sd=/usr/spool/lp1:sh

  /usr/local/atalk/etc/papd.conf:
  HP LJIIIp:\
          :pr=lp:\
          :pd=/usr/local/atalk/etc/HP_LaserJet_IIIP.ppd:




  Sprawdź szczegóły na stronie Używanie ghostscript-a wraz z Netatalk
  <http://artoo.hitchcock.org/~flowerpt/projects/linux-
  netatalk/ghostscript.html>.


  4.  Rozwiązywanie problemów.



  4.1.  Ogólna strategia.


  Jeśli masz jakieś problemy podczas drukowania, nawet jeśli działało
  kiedy wszystko ustawiałeś tak jak opisałem, to spójrz do
  /usr/adm/mesaages (albo do /usr/log/messages albo /var/log/messages -
  przyp. tłum.) oraz do /usr/adm/syslog (patrz poprzednia uwaga). Jeśli
  tylko spróbujesz coś wydrukować używając filtru psf, to znajdziesz
  podobne linie w wymienionych wyżej plikach:


  Feb 12 17:47:52 Pingo ofpap[1443]: starting for ?
  Feb 12 17:47:52 Pingo ofpap[1443]: sending to pap[1444]
  Feb 12 17:47:52 Pingo ofpap[1443]: straight text
  Feb 12 17:47:59 Pingo ofpap[1443]: 1444 done
  Feb 12 17:47:59 Pingo ofpap[1443]: pausing
  Feb 12 17:48:01 Pingo ifpap[1447]: starting for ?
  Feb 12 17:48:01 Pingo ifpap[1447]: sending to pap[1448]
  Feb 12 17:48:01 Pingo ifpap[1447]: straight text
  Feb 12 17:48:09 Pingo ifpap[1447]: 1448 done
  Feb 12 17:48:09 Pingo ofpap[1443]: restarting
  Feb 12 17:48:09 Pingo ifpap[1447]: done
  Feb 12 17:48:09 Pingo ofpap[1443]: done
  Feb 12 18:00:46 Pingo ofpap[1481]: starting for ?
  Feb 12 18:00:46 Pingo ofpap[1481]: sending to pap[1482]
  Feb 12 18:00:46 Pingo ofpap[1481]: straight text
  Feb 12 18:00:51 Pingo ofpap[1481]: 1482 done
  Feb 12 18:00:51 Pingo ofpap[1481]: pausing
  Feb 12 18:00:52 Pingo ifpap[1485]: starting for ?
  Feb 12 18:00:52 Pingo ifpap[1485]: sending to pap[1486]
  Feb 12 18:00:52 Pingo ifpap[1485]: straight text
  Feb 12 18:00:57 Pingo ifpap[1485]: 1486 done
  Feb 12 18:00:57 Pingo ofpap[1481]: restarting
  Feb 12 18:00:57 Pingo ofpap[1481]: done
  Feb 12 18:00:57 Pingo ifpap[1485]: done



  Jeśli coś nie działa, otrzymasz komunikat w /usr/adm/syslog jak ten:


  Feb 12 10:04:59 Pingo papd[70]: No such printer: "lp"
  Feb 12 10:04:59 Pingo papd[70]: printcap problem: "lp"



  (twoja domyślna zmienna lp nie jest zdefiniowana)


  Feb 12 17:02:21 Pingo ofpap[1149]: 1150 died with 1
  Feb 12 17:02:21 Pingo lpd[1148]: lp: output filter died (1)
  Feb 12 17:02:26 Pingo lpd[1148]: lp: Daemon filter 'f' terminated (11)
  Feb 12 17:04:48 Pingo lpd[1195]: lp: Daemon filter 'f' terminated (11)
  Feb 12 17:08:03 Pingo lpd[1216]: lp: Daemon filter 'f' terminated (11)
  Feb 12 17:10:00 Pingo lpd[1228]: cannot execv /usr/local/bin/linebreak|/usr/local/atalk/ifpap
  Feb 12 17:11:51 Pingo lpd[1244]: /usr/adm/lpd-errs: No such file or directory

  (/etc/printcap nie akceptuje strumieni w definicji if; oto dlaczego
  używałem skryptu /usr/local/bin/myif. Zapomniałem także stworzyć pliku
  /usr/adm/lpd-errs, który zdefiniowałem w /etc/printcap)


  4.2.  Nieznane problemy


  Najpierw przeczytaj sekcję o ``Znanych    problemach''. Jeśli nie
  będzie tam nic pomocnego dla ciebie, to wyślij do mnie list i dołącz
  do niego pliki /etc/printcap oraz /usr/local/atalk/etc/papd.conf.

  nbplkup pokazuje nazwę drukarki i jej adres, ale ja nie dostaję żadnej
  odpowiedzi z programu papstatus od tej drukarki.


  4.3.  Znane problemy.


  Dostaję dużo listów od ludzi, którzy mają problemy, więc umieszczę
  tutaj rozwiązania dla wszystkich. Będzie to rosnąca, nieposortowana
  lista. Po prostu sprawdź czy twój problem jest tu opisany.


  4.3.1.  nie ma wydruku zwykłego pliku tekstowego


  Sprawdź czy nie masz w pliku /usr/adm/lpd-errs czegoś takiego:


  unprintable character (0x9a)!



  Jest to problem dotyczący psf, filtru użytego do drukowania.
  Zlokalizuj plik psf.c w swojej dystrybucji netatalk i uczyń go
  zapisywalnym


  chmod 644 psf.c



  Zlokalizuj drugą linię, w której jest łańcuch unprintable character.
  Pierwsze wystapienie (z dwóch) powino być w linii 402 a drugie - w 496
  lub podobnie. Druga linia to jest przypuszczalnie ta, która ci sprawia
  kłopoty. Zamień


    if ( !isascii( *p ) || !isprint( *p )) {
        if ( !literal ) {
            fprintf( stderr, "unprintable character (0x%x)!\n",
                    (unsigned char)*p );
            return( 2 );  /* Toss job */
        }
        printf( "\\%o", (unsigned)*p );



  na






    if ( !isascii( *p ) || !isprint( *p )) {
        if ( !literal ) {
            fprintf( stderr,
                    "unprintable character (0x%x) converted to ?!\n",
                    (unsigned char)*p );
            /* return( 2 );*/     /* Toss job */
            putchar( '?' );       /* Don't toss job!      */
        }
        else{
          printf( "\\%o", (unsigned)*p );
        }



  Teraz napisz "make" w wierszu poleceń w katalogu netatalk (nie w tym,
  w którym jest psf.c, bo make nie będzie w tym przypadku znało ścieżki
  do pap !). Potem skopiuj nowe psf do odpowiedniego katalogu
  (/usr/local/atalk/etc).

  To co się dzieje to: program zamienia niedrukowalny znak na znak "?" i
  nie przerywa pracy. Może ktoś ma lepszy pomysł na to jak
  przekonwertować niedrukowalny znak na jego odpowiednik w PostScripcie
  ?

  Ale jeśli to będziesz robił, to uważaj na prawa autorskie w psf !


  4.3.2.  nie ma umlautów, ani znaków narodowych


  Jak właśnie wyżej wspomniałem, psf nie obsługuje rozszerzonych zbiorów
  znaków. Ale nenscript to potrafi. Ale ponieważ nie jest to filtr,
  który mógłby zostać użyty bezpośrednio w printcap-ie, będziesz musiał
  to obejść. Ja mam zdefiniowaną dodatkową drukarkę, która obsługuje
  zwykły tekst używając nenscriptu.

  /etc/printcap wygląda tak:


  #
  # Apple LaserPrinter Select 360 on AppleTalk:
  #
  lp|Pingo LaserWriter|Theobald Chapin, III:\
          :sd=/usr/spool/theobald:\
          :lp=/dev/null:\
          :pl#61:\
          :pw#80:\
          :mx#0:\
          :sh:\
          :sf:\
          :lf=/var/adm/lpd-errs:\
          :if=/usr/local/bin/myif:\
          :of=/usr/local/atalk/etc/ofpap:
  #
  # Special setup for plain text files, to convert to PostScript using nenscript
  # instead of psf (which doesn't process the whole ISO characterset)
  #
  text:\
          :sd=/usr/spool/textprinter:\
          :lp=/dev/null:\
          :mx#0:\
          :sh:\
          :sf:\
          :lf=/var/adm/lpd-errs:\
          :of=/usr/local/bin/textfilter:

  /usr/local/bin/textfilter jest skryptem w powłoce:


  #!/bin/sh
  /usr/bin/nenscript -P lp -2 -r -T US -i "Werner Eugster"



  Niestety nie znalazłem sposobu na zachowanie nazwy pliku do drukowania
  i dlatego używam opcji -i z moim nazwiskiem, żeby oznaczyć wydruk.
  Może znajdziesz jakiś lepszy sposób używając np. Unix-owej zmiennej
  środowiskowej z loginem.

  W tym ustawieniu otrzymuję tekst na papierze w układzie poziomym
  (opcja -r) w dwóch kolumnach (-2) wysłany na standardową drukarkę lp.
  Aby wydrukować zwykły plik tekstowy używam polecenia


  lpr -P text plain.txt



  Tak więc przede wszystkim, drukarka zdefiniowana jako text zamienia
  zwykły tekstowy plik na PostScript używając nenscript (który obsługuje
  pełen zestaw znaków ISO), ktory przekazuje go dalej do drukarki
  zdefiniowanej jako lp. Przez to, używając polecenia lpq zobaczysz, że
  zadanie drukowania pojawi się przy drukarce lp i przychodzącego ze
  standardowego wejścia, co jest poprawne.

  Jeśli ktoś zna jakiś sposób, żeby umieścić na wydruku nazwę pliku, to
  będę bardzo wdzięczny za tę informację !


  4.3.3.  moje ustawienia długości i szerokości strony sa ignorowane


  To był mój błąd. Sprawdź część powyżej, gdzie opisuję myif. Musisz
  dodać $* dwa razy w drugiej linii w pliku, która teraz wygląda tak:


  #!/bin/sh
  /usr/local/bin/linebreak $* | /usr/local/atalk/etc/ifpap $*




  4.3.4.  zadanie jest wysłane do drukarki, ale nie zostaje wydrukowane


  Jest wiele takich problemów. Jeden, o którym dowiedziałem się od Paolo
  Supino to ten:

  "Podczas krótkiej inspekcji wydruku z nbplkup (żeby zobaczyć czy są
  tak jakieś dziwne rzeczy), zobaczyłem, że nasza drukarka na sieci ma
  ten sam numer co serwer NT (który kolejkuje zadania z PC-tów). To było
  źle.
  1. Serwer NT jest bardzo złym spoolerem.
  2. Powinien on kolejkować tylko maszyny Windows-owe.
  3. Pomimo tego, iż nie miał on przechwytywać wszystkiego co przez
  niego przeszło - on to robił.

  Rozwiązanie: Wyłączyć zupełnie serwer drukowania dla Mac-ów na NT.
  Wyedytować plik .paprc w katalogu zadań tak, żeby wskazywał on
  bezpośrednio na drukarkę. Zrestartować komputer, żeby mu się pamięc
  odświeżyła.

  4.3.5.  moja drukarka nie bierze papieru z tego zasobnika, z którego
  ja chcę


  Domyślnie wszystko jest drukowane na papierze ze standardowego
  zasobnika. Jeśli chcesz tak ustawić drukarkę, aby brała papier z
  innego zasobnika niż ze standardowego, to spróbuj tego:

  Zmodyfikuj swój plik /usr/local/bin/myif i przepuść wszystko przez
  program awk, czy jakiś inny, który potrafi zapisać dodatkową linię do
  strumienia po nagłówku.
  Np. Ja spróbowałem tak:


  #!/bin/sh
  /usr/local/bin/linebreak $* | awk '{if(NR==1&&$1~"%!"){print;print
  "statusdict begin /manualfeed true store end\n";}else{print}}' | /usr/local/atalk/etc/ifpap $*



  (upewnij się, że nie ma fizycznych łamań linii w linii drugiej).
  papier z podajnika ręcznego. Dla innych podajników zamień tekst w
  cuszysłowach ("statusdict begin /manualfeed true store end\n") na
  odpowiednie polecenie z tej listy:


  Podajnik          |             Polecenie PostScriptu
  ------------------+---------------------------------------------------
  przedni           | "statusdict begin 0 setpapertray end"
                    |
  tylny             | "statusdict begin 1 setpapertray end"
                    |
  automatyczny      | "statusdict begin /manualfeed true store end"



  Polecenia PostScriptu do zdefiniowania wyjściowych "szufladek":


  Szufladka         |              Polecenie PostScriptu
  ------------------+---------------------------------------------------
  górna             | "0 statusdict /setoutputtray get exec"
                    |
  dolna             | "1 statusdict /setoutputtray get exec"



  Oczywiście jeśli chcesz zdefiniować podajnik wejściowy i szufladkę
  wyjściową, to musisz wstawić dwie linie do pliku PostScriptowego.

  Chociaż to działa dla wejścia, które już jest PostScriptem. Jeśli
  chcesz to osiągnąć dla tekstu, który jest dopiero zamieniany na
  PostScript, to musisz zmodyfikować plik psf.c i skompilować nowy filtr
  psf. (nie zapomnij zainstalować go w katalogu /usr/local/atalk/etc !).
  Wszystko co musisz zrobić, to znaleźć linię %%!PS-Adobe-2.0 (ok. linii
  379, musi to być funkcja textps(). Dodaj nową linię:


  printf( "statusdict begin /manualfeed true store end\n" );



  (i znowu - możesz zamienić tekst w cudzysłowach na ten, który ci
  odpowiada). Potem skompiluj ponownie psf i zainstaluj go.


  Davis Goodman skończył na takim skrypcie myif, który sprawdza czy
  chcesz drukować w rozmiarach listowych czy normalnych. Jeśli jest to
  normalny, to wykonywane jest polecenie PostScriptu powodujące wybór
  tylnego podajnika, w innym przypadku papier pobierany jest z podajnika
  standardowego.


  #!/bin/sh
  bounding=`grep BoundingBox $8 | cut -d" " -f5 `
  if [ "$bounding" = "" ]; then
    /usr/bin/awk '{if(NR==1&&$1~"%!"){print;print "statusdict begin 1 setpapertray end\n";}else{print}}' | /usr/local/atalk/etc/ifpap $*
  else
    /usr/local/atalk/etc/ifpap $*
  fi



  To działa z Netscape a twoje własne oprogramowanie może przyjmować
  inne wartości. Załączyłem ten przykład tylko po to, żeby ci wskazać,
  gdzie należy zacząć jeśli chcesz robić podobne sztuczki.

  Jeszcze jeden przykład jest od Tomasa Pospiska, który zdefiniował
  nazwy drukarek dla różnych podajników w tej samej drukarce w
  /etc/printcap. Żeby wydrukować na papierze z konkretnego podajnika
  wysyłasz zadanie na odpowiednią drukarkę. Jego printcap wygląda tak:


  # LaserWriter Pro 630 (Default Tray)
  lp:\
          :sd=/usr/spool/lp1:\
          :lp=/dev/null:\
          :pl#63:pw#85:\
          :mx#0:\
          :sh:sf:\
          :lf=/var/log/lp-errs:\
          :if=/usr/lib/atalk/filters/myif:\
          :of=/usr/lib/atalk/filters/ofpap:
  #
  # LaserWriter Pro 630 (Manual Tray)
  lpm:\
          :sd=/usr/spool/lpm:\
          :lp=/dev/null:\
          :pl#63:pw#85:\
          :mx#0:\
          :sh:sf:\
          :lf=/var/log/lp-errs:\
          :if=/usr/lib/atalk/filters/myif_manual:\
          :of=/usr/lib/atalk/filters/ofpap:



  a filtr myif wygląda tak:


  #!/bin/sh
  /usr/bin/awk '{if(NR==1&&$1~"%!"){print;print "statusdict begin
  /manualfeed true store end\n";}else{print}}' |
  /usr/lib/atalk/filters/ifpap $*



  Jak dotąd dostałem konstruktywne komentarze i pytania od ludzi z




  COM domena              11
  EDU (USA)               12
  US domena (USA)         1
  GOV domena USA          2
  NET domena              1

  Australia               1
  Austria                 2
  Belgia                  1
  Francja                 2
  Niemcy                  5
  Islandia                1
  Włochy                  3
  Japonia                 1
  Holandia                1
  Portugalia              2
  Wileka Brytania         1
  Szwajcaria              1



  (C) 13 Marca 1997 Werner Eugster (eugster@giub.unibe.ch)


  5.  Od tłumacza.


  Tłumaczenie to jest chronione prawami autorskimi (C) Bartosza
  Maruszewskiego.  Dozwolone jest rozprowadzanie i dystrybucja na
  prawach takich samych jak dokument oryginalny.

  Jeśli znalazłeś jakieś rażące błędy ortograficzne, gramatyczne,
  składniowe, techniczne to pisz do mnie:

  B.Maruszewski@zsmeie.torun.pl

  Oficjalną stroną tłumaczeń HOWTO jest http://www.jtz.org.pl/

  Aktualne wersje przetłumaczonych dokumentów znajdują się na tejże
  stronie. Dostępne są także poprzez anonimowe ftp pod adresem
  ftp.ippt.gov.pl w katalogu /pub/Linux/JTZ/.

  Przetłumaczone przeze mnie dokumenty znajdują się także na mojej
  stronie WWW. <http://www.zsmeie.torun.pl/~bart/tlumaczenie.html> Są
  tam też odwołania do Polskiej Strony Tłumaczeniowej.

  Kontakt z naszą grupą, grupą tłumaczy możesz uzyskać poprzez listę
  dyskusyjną jtz@ippt.gov.pl. Jeśli chcesz sie na nią zapisać, to wyślij
  list o treści subscribe jtz Imię Nazwisko na adres
  listproc@ippt.gov.pl
















