Jak umiejętnie zadawać pytania.

Slackware FAQ - czyli baza pytań i odpowiedzi.

Moderatorzy: Moderatorzy, Administratorzy

ODPOWIEDZ
Awatar użytkownika
Radek_R
Moderator
Posty: 1196
Rejestracja: 2004-06-14, 11:40
Lokalizacja: Kraków
Kontakt:

Jak umiejętnie zadawać pytania.

Post autor: Radek_R » 2006-10-06, 12:19

[center]Jak umiejętnie zadawać pytania.[/center]

Kod: Zaznacz cały

-1. Zanim zaczniesz czytać
0. Wstęp
1. Pytania wstępne
2. Opis problemu
3. Zbieranie materiałów
3.1. Problemy sprzętowe
3.2. Problemy softwarowe
3.3. Problemy z siecią
4. Wyslanie zapytania
5. Odnośniki hipertekstowe
-1. Zanim zaczniesz czytać
W drodze do rozwiązania problemu, przed zadaniem pytania na forum, wypadałoby wykazać się inicjatywą i poszukać na własną rękę odpowiedzi zamiast zadawać powtarzające się miliony razy pytania. Wiele rozwiązań można przecież samemu wygrzebać w internecie za pomocą google, lub chociaż wyszukać czy nie było rozwiązania na tym forum. Przecież to nic trudnego, a pamiętajcie, że nikt za Was nie rozwiąże problemu. Jeżeli sami nie będziecie chcieli sobie pomóc, to nie liczcie na czyjąś pomoc.
Więc w kolejności:
  • 1. google.pl
    Zobacz to, to, i to a w szczególności TO
    2. "Szukaj" na forum
    3. Zadajemy pytania.

A teraz zapraszam do lektury.

0. Wstęp
Problem. Pojawia się nagle, nieoczekiwanie. Zaskakuje nas, zwala z nóg i osłabia. Staramy się sami go usunąć, jednak nie zawsze jest to możliwe. Wtedy zgłaszamy się na forum, tworzymy nowy temat i... i dalej już jest tylko płacz. Informacje od części użytkowników są wyciągane jak na przesłuchaniu, inni zaś nie potrafią poprawnie sformułować swoich potrzeb. Niektórzy za to wklejają cała zawartość /var/log/, co utrudnia analizę problemu i opóźnia pomoc.
Tekst ten ma na celu zapoznanie userów z przejrzystym i klarownym formułowaniem pytań o zaistniałe problemy oraz przybliżenie "eliksirów prawdy", czyli programów, które wyciągną potrzebne informacje z naszego komputera.

1. Pytania wstępne
Przed przystąpieniem do pisania wątku należy się zastanowić czego dotyczy nasz problem. Czy jest to problem sprzętowy czy może oprogramowania, pracujemy na desktopie czy może też konfigurujemy serwer. Odpowiedź na to pytanie pomoże nam w wyborze odpowiedniego działu na forum, zaś innym (którzy np. przeglądają tylko wybrane działy) nie przysporzy bałaganu i nie zabierze zbędnego czasu.
Po wybraniu odpowiedniego działu następną czynnością jest...

2. Opis problemu
Przy opisywaniu swojego problemu nie używamy słów "coś", "gdzieś", "jakoś". Starajmy się pisać konkretnie "co zrobiliśmy", "gdzie wpisaliśmy", "jak próbowaliśmy rozwiązać problem". Pisanie tak ogólnie, jakbyśmy się wstydzili własnych prób rozwiązania problemu mija się z celem. Jeżeli było ok, da to innym informację, że nie tędy droga. Jeżeli czynności były błędne to we własnym interesie każdego leży, aby ktoś te błędy wytknął.
W przypadku gdy nie poczyniliśmy własnych kroków ku rozwiązaniu problemu, należy wrócić się przed punkt 0 tego tekstu i to poprawić :)
Pisanie "długo szukałem na google, ale nie znalazłem" nie jest dobrym pomysłem. Nie jesteśmy dziećmi i nikt w to nie uwierzy, a takie sformułowania trochę irytują (zapewne nie tylko Autora tego poradnika).

3. Zbieranie materiałów
Problem należy odpowiednio udokumentować. Dzięki temu ułatwimy innym odkrycie "w czym rzecz" i na pewno przyczynimy się do szybszego rozwiązania danego zagadnienia. Pamiętajmy, że jak wklejamy wynik jakiegoś polecenia, kawałek pliku konfiguracyjnego czy też logu to umieszczamy to bezwzględnie w znacznikach

Kod: Zaznacz cały

[code]
[/code].

Katalog gdzie zapisywane są logi z działania systemu i niektórych daemonów to /var/log/ - pamiętajmy o tym szukając błędów.

3.1 Problemy sprzętowe
Po opisaniu swojego problemu, należy dać wynik polecenia

Kod: Zaznacz cały

# lspci
Jeżeli kompilowaliśmy kernel, przy wklejaniu jego konfiguracji ograniczmy się tylko do wybranych fragmentów, tych które dotyczą bezpośrednio naszego problemu. Nie ma sensu wklejania sekcji V4L jeżeli dostajemy kernel panic przy montowaniu systemu plików.
Przydatnym narzędziem przy diagnozowaniu problemów jest także

Kod: Zaznacz cały

# dmesg
Wyświetla on komunikaty jądra z bootowania systemu. Należy w nim odszukać fragmentów dotyczących naszego sprzętu. Dzięki temu dowiemy się czy dane urządzenie jest wykrywane, czy też kernel nie potrafi sobie z nim poradzić. Może też zawierać informacje błędów występujące podczas np. ładowania modułów dla urządzeń z którymi są problemy.

Jeżeli rzecz dotyczy dysków twardych warto dołączyć (w zależności od problemu) plik /etc/fstab i/lub wynik polecenia

Kod: Zaznacz cały

# fdisk -l 
Innym narzędziem pomagającym przy problemach z dyskami (DMA i zbyt wolny transfer) jest też

Kod: Zaznacz cały

# hdparm -i -d -m -c /dev/<urzadzenie>
lub:
# hdparm -I /dev/<urzadzenie>
Wyświetli on podstawowe informacje na temat dysku i jego konfiguracji.

W przypadku kart graficznych pomocny może okazać się plik /var/log/Xorg.0.log względnie Xorg.0.log.old w którym wyszukujemy linijek oznaczonych (EE) oznaczających błąd (error), lub linijek z oznaczeniem (WW) oznaczających ostrzeżenie (warning). Choć (WW) nie są tak ważne jak (EE), czasami mogą pomóc.
Innym plikiem który określa używaną konfigurację X jest /etc/X11/xorg.conf.
Przy umieszczaniu (wklejaniu) starajmy się wklejać (umieszczać) tylko te sekcje które odpowiadają naszym problemom, co nie jest zadaniem zbyt trudnym ze względu na formę tego pliku.
Przy problemach z akceleracją do diagnozowania problemów można użyć

Kod: Zaznacz cały

$ glxinfo
$ glxgears
zawartych w pakiecie x11. Istotne są błędy wyrzucane przez te aplikacje, resztę informacji można w większości przypadków pominąć.

3.2 Problemy softwarowe
Najczęstsze problemy dotyczą kompilacji oraz konfiguracji i uruchamiania danego oprogramowania.
W przypadku kompilacji błędy mogą pojawić się już na poziomie konfiguracji przy wydawaniu polecenia ./configure. W takim wypadku skrypt konfigurujący często przekazuje nam wyczerpujące informacje o możliwości zażegnania problemu

Kod: Zaznacz cały

checking for libgnutls - version >= 1.0.0... no
*** The libgnutls-config script installed by LIBGNUTLS could not be found
*** If LIBGNUTLS was installed in PREFIX, make sure PREFIX/bin is in
*** your path, or set the LIBGNUTLS_CONFIG environment variable to the
*** full path to libgnutls-config.
configure: WARNING:
***
*** libgnutls was not found. You may want to get it from
*** ftp://ftp.gnutls.org/pub/gnutls/
Jeżeli nie możemy sobie poradzić to wystarczy wkleić te błędy, na których ./configure się zatrzymało. Można posiłkować się plikiem config.log względnie configure.log znajdującym się w katalogu ze źródłami. Dodajemy także wszelkie opcje jakie podawaliśmy w parametrach do tego skryptu a także ustawione flagi dla kompilatora.

Częstym przypadkiem przy samej już kompilacji jest takie podawanie błędu:

Kod: Zaznacz cały

make[3]: *** [ioctld.o] Błąd 1
make[3]: Opuszczenie katalogu `/usr/src/ekg2/plugins/ioctld'
make[2]: *** [all-recursive] Błąd 1
make[2]: Opuszczenie katalogu `/usr/src/ekg2/plugins'
make[1]: *** [all-recursive] Błąd 1
make[1]: Opuszczenie katalogu `/usr/src/ekg2'
make: *** [all] Błąd 2
Jak widać nic z niego nie można wywnioskować o podłożu błędów kompilacji i jest to bezcelowe zupełnie jak pisanie że "coś nie działa". W przypadku umieszczania błędu kompilacji należy zaopatrzyć go w linijki od momentu wystąpienia pierwszego error, np.:

Kod: Zaznacz cały

/usr/include/asm/byteorder.h:28: error: syntax error before "___arch__swab64"
/usr/include/asm/byteorder.h:28: error: syntax error before "val"
/usr/include/asm/byteorder.h: In function `___arch__swab64':
/usr/include/asm/byteorder.h:32: error: syntax error before "__u64"
/usr/include/asm/byteorder.h: At top level:
/usr/include/asm/byteorder.h:34: error: syntax error before '.' token
/usr/include/asm/byteorder.h:42: error: syntax error before string constant
In file included from /usr/include/linux/byteorder/little_endian.h:12,
                 from /usr/include/asm/byteorder.h:57,
                 from /usr/include/linux/cdrom.h:14,
                 from ioctld.c:40:
/usr/include/linux/byteorder/swab.h:160: error: syntax error before "__fswab64"
/usr/include/linux/byteorder/swab.h:160: error: syntax error before "x"
/usr/include/linux/byteorder/swab.h: In function `__fswab64':
/usr/include/linux/byteorder/swab.h:167: error: `x' undeclared (first use in this function)
/usr/include/linux/byteorder/swab.h:167: error: (Each undeclared identifier is reported only once
/usr/include/linux/byteorder/swab.h:167: error: for each function it appears in.)
/usr/include/linux/byteorder/swab.h: At top level:
/usr/include/linux/byteorder/swab.h:170: error: syntax error before "__swab64p"
/usr/include/linux/byteorder/swab.h:170: error: syntax error before '*' token
/usr/include/linux/byteorder/swab.h: In function `__swab64p':
/usr/include/linux/byteorder/swab.h:172: error: `x' undeclared (first use in this function)
/usr/include/linux/byteorder/swab.h: At top level:
/usr/include/linux/byteorder/swab.h:174: error: syntax error before '*' token
/usr/include/linux/byteorder/swab.h: In function `__swab64s':
/usr/include/linux/byteorder/swab.h:176: error: `addr' undeclared (first use in this function)
In file included from /usr/include/asm/byteorder.h:57,
                 from /usr/include/linux/cdrom.h:14,
                 from ioctld.c:40:
/usr/include/linux/byteorder/little_endian.h: At top level:
/usr/include/linux/byteorder/little_endian.h:43: error: syntax error before "__cpu_to_le64p"
/usr/include/linux/byteorder/little_endian.h:43: error: syntax error before '*' token
/usr/include/linux/byteorder/little_endian.h: In function `__cpu_to_le64p':
/usr/include/linux/byteorder/little_endian.h:45: error: `__le64' undeclared (first use in this function)
/usr/include/linux/byteorder/little_endian.h:45: error: `p' undeclared (first use in this function)
/usr/include/linux/byteorder/little_endian.h: At top level:
/usr/include/linux/byteorder/little_endian.h:47: error: syntax error before "__le64_to_cpup"
/usr/include/linux/byteorder/little_endian.h:47: error: syntax error before '*' token
/usr/include/linux/byteorder/little_endian.h: In function `__le64_to_cpup':
/usr/include/linux/byteorder/little_endian.h:49: error: `__u64' undeclared (first use in this function)
/usr/include/linux/byteorder/little_endian.h:49: error: `p' undeclared (first use in this function)
/usr/include/linux/byteorder/little_endian.h: At top level:
/usr/include/linux/byteorder/little_endian.h:67: error: syntax error before "__cpu_to_be64p"
/usr/include/linux/byteorder/little_endian.h:67: error: syntax error before '*' token
/usr/include/linux/byteorder/little_endian.h: In function `__cpu_to_be64p':
/usr/include/linux/byteorder/little_endian.h:69: error: `__be64' undeclared (first use in this function)
/usr/include/linux/byteorder/little_endian.h:69: error: syntax error before "__swab64p"
/usr/include/linux/byteorder/little_endian.h: At top level:
/usr/include/linux/byteorder/little_endian.h:71: error: syntax error before "__be64_to_cpup"
/usr/include/linux/byteorder/little_endian.h:71: error: syntax error before '*' token
/usr/include/linux/byteorder/little_endian.h: In function `__be64_to_cpup':
/usr/include/linux/byteorder/little_endian.h:73: error: `__u64' undeclared (first use in this function)
/usr/include/linux/byteorder/little_endian.h:73: error: syntax error before ')' token
make[3]: *** [ioctld.o] Błąd 1
make[3]: Opuszczenie katalogu `/usr/src/ekg2/plugins/ioctld'
make[2]: *** [all-recursive] Błąd 1
make[2]: Opuszczenie katalogu `/usr/src/ekg2/plugins'
make[1]: *** [all-recursive] Błąd 1
make[1]: Opuszczenie katalogu `/usr/src/ekg2'
make: *** [all] Błąd 2
Widać od razu w czym problem :). W tym wypadku problematyczne okazały się nagłówki jądra (tak mi sie wydaje ;)).
Warto dołączyć też wersje kompilatora użytego do kompilacji:

Kod: Zaznacz cały

$ gcc -v
$ gcc --version
Przy uruchamianiu programów dla środowiska X, należy je najpierw odpalać z konsoli a nie np. z menu KDE. Da nam to wgląd w komunikaty wysyłane przez program, a nierzadko w błędy które on generuje. Pamietajmy - program w ten sposób krzyczy wołając pomocy, dzieki temu usłyszymy to wołanie.
Dzięki temu możemy się dowiedzieć o brakujących bibliotekach, które to są przyczyną częstego niedziałania programów (szczególnie tych z paczki, te kompilowane potrafią się zastroszczyć o siebie już na etapie kompilacji).
W takim wypadku do wyszukiwania potrzebnych bibliotek używa się narzędzia:

Kod: Zaznacz cały

# ldd <nazwa_pliku>
Pokazuje ono z których bibliotek dzielonych program korzysta.
W przypadku wykrycia jakiegoś brakującego pliku, np.

Kod: Zaznacz cały

libhal.so.1 => not found
Należy wtedy poszukać danej biblioteki na wlasną rękę ( http://packages.slackware.it zmienic "package" na "file name", http://www.google.pl) a w przypadku negatywnych wyników poszukiwań zamieścić wynik tego polecenia na forum.

Przy problemach z konfiguracją, gdy plik konfiguracyjny nie jest zbyt długi, wklejamy go w całości, opisując co chcemy osiągnać. Jeżeli plik jest długi, starajmy się wyciąć tylko te najistotniejsze linijki. Z bezwzględną stanowczością pozbywamy się zbędnych komentarzy. Pomocne może być narzędzie grep. Jeżeli znakiem komentarza jest #:

Kod: Zaznacz cały

grep -ve "^#" <nazwa_pliku>
W przypadków uruchamiania skryptów firewalla/shapera/innego można się spotkać z wklejaniem gotowców nie w pełni dostosowanych do swoich potrzeb, pełnych komentarzy i różnych dziwnych zmiennych. Najlepiej jest przepisać taki skrypt dostosowując go do własnych potrzeb i pozbywając się śmieci. Dzięki temu zyska on na przejrzystości, a my nauczymy sie czegoś i przy okazji być może rozwiążemy problem. Jednak gdy zdecydujemy się go wkleić, starajmy się opisać co jest czym, np. przy firewallu/routerze opiszmy który interfejs jest lokalny a który to internet itp. Nikt nie będzie się musiał niczego domyślać.

3.3 Problemy z siecią
Przy problemach z siecią najważniejsze jest podanie aktualnej konfiguracji twojego komputera:

Kod: Zaznacz cały

# ifconfig
# route
# cat /etc/resolv.conf
można także dodać

Kod: Zaznacz cały

# cat /etc/rc.d/rc.inet1.conf
a dla problemów z WiFi pewnie przyda sie wynik

Kod: Zaznacz cały

# iwconfig
Przydatne też mogą być informacje o topologii sieci, a także inne np. wynik polecenia

Kod: Zaznacz cały

ping
Jeżeli masz problem z odpaleniem karty sieciowej to instrukcje znajdziesz w punkcie 3.1

4. Wysłanie zapytania
Zanim wyślemy nowego posta wypadałoby sprawdzić czy nigdzie nie ma literówki, błędów (szczególnie ortokrafidżnyh), czy zamieściliśmy wyczerpujący opis problemu i - najważniejsze - czy jest on zrozumiały. Nikt na forum nie jest wróżka (choć kilka osobników ma predyspozycje, pzdr dla nich :P) i nie ma obowiązku domyślać się o co Autorowi posta chodzi lub co ma na myśli.
Kiedy jednak będziemy pewni co do poprawności zadanego pytania, możemy śmiało kliknąć "Wyślij"

5. Odnośniki hipertekstowe
http://rtfm.killfile.pl
http://ag.bocznica.org
http://www.google.pl
http://packages.slackware.it

Autor: Radek_R
Przy udziale: Dawidmo, M4jkel, Sayetan
Ostatnio zmieniony 2006-11-20, 14:48 przez Radek_R, łącznie zmieniany 12 razy.

ODPOWIEDZ