Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam, pierwszy raz piszę na tym forum...
Najpierw może krótkie wprowadzenie.
Debiana uważam za najlepszą dystrybucją do pracy,
często też uruchamiam go na komputerach znajomych,
gdzie nie jeden raz zadomowił się na długie lata :)
Jednak nigdy nie podobał mi się pomysł instalowania
czegokolwiek - ani programów, ani systemów.
Instalowanie jest dobre tylko pod Win$hit :)
Nietrudno też zauważyć, że instalator z płytki Debianowej
jest bardzo niewygodny, jeśli trzeba instalować system
na wielu komputerach.
System można po prostu skopiować z jednego komputera
na inny (tar!), ale to nie zawsze jest dobry pomysł.
Często chcemy mieć świeżą, aktualną, pachnącą
jeszcze proszkiem do prania instalację.
Od dawna korzystałem z pakietu debootstrap,
żeby zainstalować podstawowy system wprost z repozytoriów.
Przy okazji "napisał się" skrypt, który robi różne różności,
które trzeba było zrobić za każdym razem po debootstrapowaniu...
Do tego jeszcze skrypt zmienia sytem, aby był "Live", tzn.
główna partycja tylko do odczytu - wtedy można to bez
zmian nagrać go na płytkę i jest już Live CD.
(to nie jest takie typowe Live, jakie ma np. ubuntu, ale takie,
że można np. używać z niego aptitude, jeśli system jest
na dysku/pendrivie, i paczki się na tym dysku zapiszą)
No a ostatnio wrzuciłem tenże skrypt, który już jest
porządnie dojrzałym owocem, na sourceforge, aby
każdy mógł sobie skorzystać.
Zaznaczam, że jest coś dla doświadczonych użytkowników,
i nie jest przeznaczony, aby go uruchamiać nie czytając uprzednio.
Każdy będzie pewnie chciał wyłączyć niektóre fragmenty.
Albo w ogóle tylko poczytać i zrobić sobie coś podobnego.
Ściągnąć można z [ http://linuxcreate.sourceforge.net ],
nazywa się to tam "debcreate".
Wcześniej trzeba: "aptitude install debootstrap"
Uruchamiać należy w jakimś pustym katalogu.
Chętnie przeczytam, co macie do powiedzenia na ten temat,
czy to w ogóle dobry pomysł itd.
Offline
Od Lenny'ego pojawiła się w instalatorze opcje nazwana "Instalacja automatyczna", choć nie wiem jak dokładnie działa.
Podobnie można stworzyć live'a, z możliwością późniejszej instalacji, za pomocą [url=http://www.grml.org/grml-live]grml-live[/url]. Wady: daleko bardziej skomplikowany. Zalety: dużo więcej rzeczy można skonfigurować, no i baza (po raz kolejny polecam [url=http://www.grml.org]grmla[/url] ;]) też jest niczego sobie. :)
Skrypt na razie pobieżnie przejrzałem. Kod na pierwszy rzut oka czysty, choć przydałyby się jakieś komentarze.
Na razie tylko dwie uwagi:
1. Chyba nie sprawdzasz czy skrypt wykonał root, a jego uprawnienia — jeśli się nie mylę — są wymagane.
2. Bashyzm w testach: jest [tt]test "$1" == "i"[/tt], powinno być [tt]test "$1" = "i"[/tt].
Wieczorem (lub jutro) przyjrzę się bliżej.
Ostatnio edytowany przez azhag (2009-05-07 09:37:25)
Offline
[quote=azhag]Podobnie można stworzyć live'a, z możliwością późniejszej instalacji, za pomocą [url=http://www.grml.org/grml-live]grml-live[/url][/quote]
No tak, według opisu ma znacznie większe możliwości (tylko, że nie mam ochoty dochodzić do tego, jak to uruchomić).
FAI (dla tych, co nie spojrzeli na stronę grml - Fully Automatic Installation) nie jest w ogóle osiągnięta przez mój skrypt,
w którym (celowo!) nie umieściłem nawet "-y" przy wywołaniu aptitude. (Jakoś wolę zawsze przeczytać listę pakietów do zainstalowania.)
Nie mówiąc o tym, że nie blokuję włączania demonów i przed odmontowaniem trzeba jakiegoś dbusa zakillować.
Więc jeśli komuś zależy na takiej bardzo FAI, to może używać skryptów z grml... albo zrobić jeden system, a potem "tar -c *" :)
[quote=azhag]1. Chyba nie sprawdzasz czy skrypt wykonał root, a jego uprawnienia — jeśli się nie mylę — są wymagane.
2. Bashyzm w testach: jest [tt]test "$1" == "i"[/tt], powinno być [tt]test "$1" = "i"[/tt].[/quote]
Dzięki - poprawiłem to.
Edit: azhag, co ja widzę w twoim podpisie: http://hag-linux.eu.org/ - idea bardzo podobna do moich skryptów :)
Ostatnio edytowany przez kguciek (2009-05-07 15:53:45)
Offline
[quote=kguciek]Nie mówiąc o tym, że nie blokuję włączania demonów i przed odmontowaniem trzeba jakiegoś dbusa zakillować.[/quote]
Nie mam problemów z włączeniem/wyłączenie dowolnego demona za pomocą prostego seda, umieszczonego w skrypcie wykonywanym podczas budowania systemu.
[quote=kguciek]Edit: azhag, co ja widzę w twoim podpisie: http://hag-linux.eu.org/ - idea bardzo podobna do moich skryptów :)[/quote]
Korzystam wlaśnie z [tt]grml-live[/tt]. :)
[quote=kguciek]nie umieściłem nawet "-y" przy wywołaniu aptitude[/quote]
A ja bym dodał jakąś flagę, która by [tt]-y[/tt] w aptitude włączyła. Podobnie z [tt]--with-[/tt]/[tt]--without-recommends[/tt].
A teraz zabieram się za bliższe przyjrzenie się skryptowi. Tymczasem możesz przyjrzeć się skryptowi [tt]idylla-live[/tt], który napisałem dla milygesowej Idylli (notabene wzorując się [tt]grml-live[/tt]):
skrypt: http://idyllaos.svn.sourceforge.net/viewvc/idyllaos/trunk/scripts/idylla-live
dodatkowe konfigi: http://idyllaos.svn.sourceforge.net/viewvc/idyllaos/trunk/scripts/conf/
———
Dopisek:
Przede wszystkim niepodoba mi się to, że wszystko jest w tym skrypcie. Osobiście bym go rozbił na skrypt i plik(i) konfiguracyjne. Do tego kilka flag, np. do wskazania alternatywnego konfigu, wybrania gałęzi Debiana, nazwy iso, wymuszenia pełnej autoamtyzacji (-y w aptitude) — niektórym może się przydać, np. do tworzenia iso w środku nocy, podczas gdy samemu się śpi :).
Jeśli chodzi o listy pakietów do instalacji — może zamiast przez zmienne, tworzyć je przez pliki (patrz klasy w grml-live i idylla-live).
Przydałoby się wykorzystać [tt]--exclude=A,B,C[/tt] w debootstrapie, nie wszyscy muszą chcieć instalować każdą paczkę z "debootstrapowego pakietu".
Nie podoba mi się sposób w jaki tworzysz pliki ([tt]save_script plik 'zawartość'[/tt]). Wg mnie znacznie praktyczniejsze byłoby zrobić mechanizm szablonów — kopiować do chroota pliki z jakiegoś katalogu (alternatywny katalog szablonów możnaby podać za pomocą flagi).
Na początku skryptu dodałbym sprawdzanie czy wymagane aplikacje (debootstrap, aptitude) są zainstalowane oraz czy skrypt uruchamia root (to robisz, ale później — wg mnie nie warto przetwarzać zmienne i funkcje, żeby potem skrypt wyszedł, bo nie uruchomił go root ;]). Warto też dodać [tt]set -e[/tt], żeby kończył pracę natrafiając na błąd.
Jakbyś zastosował się do przynajmniej części uwag (głównie rozbicie na skrypt i konfigi), to możnaby skrypt wrzucić do PATH. Wtedy mógłbym przygotować Ci pakiet *.deb.
test "$UID" != 0
Nie lepiej [tt]test "$UID" -ne 0[/tt]?
Przydałaby się możliwość skonfigurowania danych użytkownika (login, grupy do jakich należy), obecnie są wpisane na sztywno.
Zauważyłem, że wymuszasz instalację pewnych pakietów, prawdopodobnie nie wszyscy muszą chcieć je instalować (np. mi nic po
wireless-tools i wpasupplicant).
W tej chwili wszystko, ale jeszcze nie przyjrzałem się tak jakbym chciał.
Ostatnio edytowany przez azhag (2009-05-07 20:41:10)
Offline
[quote=azhag]Nie mam problemów z włączeniem/wyłączenie dowolnego demona za pomocą prostego seda, umieszczonego w skrypcie wykonywanym podczas budowania systemu.[/quote]
Wyraziłeś się raczej niejasno. Masz na myśli sedowanie listy procesów, wypisywanych komunikatów, jakiegoś pliku konfiguracyjnego, czy jeszcze czegoś innego?
[quote=azhag]tar cf ${TEMP_DIR}/idylla_iso/boot/rootfs.tar -C ${TEMP_DIR}/idylla_root/ $(ls ${TEMP_DIR}/idylla_root/)[/quote]
Ja robię to tak, myślę, że czytelniej:
(cd ${TEMP_DIR}/idylla_root && tar cf ${TEMP_DIR}/idylla_iso/boot/rootfs.tar *)
[quote=azhag]barelly[/quote]
Uuuuu :)
Ten skrypt jest znowuż zaskakująco podobny do mojego niedawnego "archcreate".
A cóż to za wynalazek, ten idyllaos?
Offline
[quote=kguciek][quote=azhag]Nie mam problemów z włączeniem/wyłączenie dowolnego demona za pomocą prostego seda, umieszczonego w skrypcie wykonywanym podczas budowania systemu.[/quote]
Wyraziłeś się raczej niejasno. Masz na myśli sedowanie listy procesów, wypisywanych komunikatów, jakiegoś pliku konfiguracyjnego, czy jeszcze czegoś innego?[/quote]
Inaczej: tak grml, jak i moja Wiedźma (a i mój desktop) wykorzystuje alternatywny model skryptów startowych — [url=http://packages.debian.org/squeeze/file-rc]file-rc[/url]. W uproszczeniu — zamiast kwadryliona symlinków typowych dla SysV, ma się pojedyńczy plik [tt]/etc/runlevel.conf[/tt], który wygląda tak (fragment)
# Format: # <sort> <off-> <on-levels> <command> 01 - S /etc/init.d/glibc.sh 01 0,1,6 - /etc/init.d/nodm 02 - S /etc/init.d/hostname.sh 02 - S /etc/init.d/mountkernfs.sh 03 - S /etc/init.d/udev 04 - S /etc/init.d/mountdevsubfs.sh 05 - 1 /etc/init.d/single 05 - S /etc/init.d/bootlogd 05 - S /etc/init.d/keymap.sh
i można go sobie edytować (a tym samym włączać/wyłączać/zmieniać poziomy demonów) dowolnym procesorem tekstu (np. sedem).
[quote=kguciek][quote=azhag]barelly[/quote]
Uuuuu :)[/quote]
hm, milyges mnie trochę ośmieszył — komentarz pochodzi ze starszej wersji, gdy pakiety instalowane był inaczej i ów fragment wyglądał tak:
echo 'Installing packages:' for CLASS in $(echo $CLASSES | tr ',' ' '); do if [ -r ${IDYLLA_DIR}/conf/classes/${CLASS}.pkgs ]; then echo " -> from $CLASS class:" for PACKAGE in $(grep -vE "^#" ${IDYLLA_DIR}/conf/classes/${CLASS}.pkgs); do echo -n " -> ${PACKAGE}... " if [ ${USE_DEVEL} -ne 1 ]; then # non devel # latest package PKGTGZ=$(find ${PKGS_DIR} ! -name "*-dev*" -name "${PACKAGE}-[0-9]*.${ARCH}.tgz" | sort | tail -1) else # devel # latest non-dev STBLPKGTGZ=$(find ${PKGS_DIR} ! -name "*-dev*" -name "${PACKAGE}-[0-9]*.${ARCH}.tgz" | sort | tail -1) # latest dev DEVPKGTGZ=$(find ${PKGS_DIR} -name "${PACKAGE}-[0-9]*-dev.${ARCH}.tgz" | sort | tail -1) # check which package is newer if [ -z ${DEVPKGTGZ} ]; then PKGTGZ=${STBLPKGTGZ} elif [ $(printf "${STBLPKGTGZ}\n$(echo ${DEVPKGTGZ} | sed 's:-dev::g')\n" | sort | tail -1) = ${STBLPKGTGZ} ]; then PKGTGZ=${STBLPKGTGZ} else PKGTGZ=${DEVPKGTGZ} fi fi # where to install # preinst and postinst are using this variable, need to export export ROOT_DIR=${TEMP_DIR}/idylla_root # and finally install # did package contains preinst script? if yes, unpack and execute if gunzip -c ${PKGTGZ} | tar -pt ./system/var/pkg/${PACKAGE}/preinst >/dev/null 2>&1; then tar --same-owner -p -xzf ${PKGTGZ} -C ${ROOT_DIR} ./system/var/pkg/${PACKAGE}/preinst sh ${ROOT_DIR}/system/var/pkg/${PACKAGE}/preinst fi # unpack tar --same-owner -p -xzf ${PKGTGZ} -C ${ROOT_DIR} # execute postinst (if exists) [ -r ${ROOT_DIR}/system/var/pkg/${PACKAGE}/postinst ] && sh ${ROOT_DIR}/system/var/pkg/${PACKAGE}/postinst echo 'OK' done fi done echo 'Packages installed succesfully'
Co nie zmienia faktu, że powinno być jedno „l” ;)
Ostatnio edytowany przez azhag (2009-05-07 20:57:09)
Offline
[quote=kguciek]A cóż to za wynalazek, ten idyllaos?[/quote]
http://milyges.jogger.pl/2008/06/16/idyllaos-dzialajacy-gnu-nano/
Offline
Muszę teraz odpowiedzieć na dopisek. Jeśli piszesz jakiś nie-drobny dalszy ciąg, to chyba nie jest nietaktem zrobienie następnego posta?
W jednej sprawie nie mogę się z tobą zgodzić: ja nie chcę rozbijać tego na różne pliki, to po prostu nie wchodzi w rachubę! Właśnie główne założenie tego skryptu to jedno-plikowość! Spróbuj dostrzec zalety tego podejścia!
Poza tym uważam, że zamiast czytać opisy opcji, szybciej jest dopisać coś niecoś do źródła :) ale w tym względzie mogę się chociaż częściowo zgodzić :)
Widzę, że twój skrypt jest napisany całkowicie zgodnie z twoimi metodami, a mój - z moimi :) co za piękna różnica poglądów :)
[quote=azhag]Warto też dodać [tt]set -e[/tt], żeby kończył pracę natrafiając na błąd.?[/quote]
To tylko teoria. Pamiętam, że "set -e" czasami nie działało tak, jak powinno, np. wewnątrz funkcji, a nawet pętli czy nawiasów itp.
[quote=azhag]Nie lepiej [tt]test "$UID" -ne 0[/tt]?[/quote]
Lubię notację "-lt", "-ne" itd., tylko że nawyki z C zazwyczaj biorą górę.
No ale chyba żadnej tragedii nie ma przez użycie wykrzyknika; znak "!" ma jakieś tam znaczenie w niektórych powłokach, ale nie pamiętam jakie...
Offline
[quote=kguciek]W jednej sprawie nie mogę się z tobą zgodzić: ja nie chcę rozbijać tego na różne pliki, to po prostu nie wchodzi w rachubę! Właśnie główne założenie tego skryptu to jedno-plikowość! Spróbuj dostrzec zalety tego podejścia![/quote]
Widzę tylko jedną: wszystko jest w jednym miejscy, nie trzeba latać tu i tam.
Wad za to widzę kilka:
- takim skryptem można wygenerować iso w tylko jeden sposób, jeśli chce się to zrobić inaczej trzeba edytować skrypt. Jeśli chce się raz tak, raz inaczej — trzeba mieć kilka skryptów
- nie można takiego skryptu umieścić w PATH (tzn. technicznie można, ale to mało „koszerne”)
- bardzo utrudniona jest aktualizacja skryptu — ktoś ustawił sobie w skrypcie wszystko po swojemu, wypuszczasz nową wersję i znów WSZYSTKO trzeba ustawiać
[quote=kguciek][quote=azhag]Nie lepiej [tt]test "$UID" -ne 0[/tt]?[/quote]
Lubię notację "-lt", "-ne" itd., tylko że nawyki z C zazwyczaj biorą górę.
No ale chyba żadnej tragedii nie ma przez użycie wykrzyknika; znak "!" ma jakieś tam znaczenie w niektórych powłokach, ale nie pamiętam jakie...[/quote]
[tt]!=[/tt] porównuje dwa wyrażenia, [tt]-ne[/tt] sprawdza wartość liczbową jednego wyrażenia
Widzę, że twój skrypt jest napisany całkowicie zgodnie z twoimi metodami, a mój - z moimi :) co za piękna różnica poglądów :)[/quote]
Mam swoją wizję i nie zawacham się jej użyć. ;)
__
Wracając do Idylli:
www.idyllaos.org
http://forum.dug.net.pl/viewtopic.php?id=11931Ostatnio edytowany przez azhag (2009-05-07 21:27:44)
Błogosławieni, którzy czynią FAQ.
[url=http://www.opencaching.pl]opencaching[/url] :: [url=http://dug.net.pl/sources.list]debian sources.list[/url] :: [url=http://www.linuxportal.pl/blogi/azhag/wpisy]coś jakby blog[/url] :: [url=http://dug.net.pl/]polski portal debiana[/url] :: linux user #403712
Offline
[quote=azhag]Wad za to widzę kilka:
- takim skryptem można wygenerować iso w tylko jeden sposób, jeśli chce się to zrobić inaczej trzeba edytować skrypt. Jeśli chce się raz tak, raz inaczej — trzeba mieć kilka skryptów
- nie można takiego skryptu umieścić w PATH
- bardzo utrudniona jest aktualizacja skryptu — ktoś ustawił sobie w skrypcie wszystko po swojemu, wypuszczasz nową wersję i znów WSZYSTKO trzeba ustawiać[/quote]
Zauważ, że te wady to NIE SĄ wady umieszczenia skryptu w jednym pliku! To są wady braku opcji przekazywanych do skryptu :)
Nie podałeś żadnego argumentu przeciw jednoplikowości.
Co do Idylli - nigdzie nie pisze wyraźnie, które części systemu są autorskie. Mam rozumieć, że dokładnie wszystko oprócz: bash, binutils, nasm, nano, make? Jeśli tak, to faktycznie niezła jest idylla :)
Offline
[quote=kguciek]Zauważ, że te wady to NIE SĄ wady umieszczenia skryptu w jednym pliku! To są wady braku opcji przekazywanych do skryptu :)[/quote]
Już widzę flagę podającą kilkadziesiąt pakietów do instalacji :)
Offline
[quote=azhag]Już widzę flagę podającą kilkadziesiąt pakietów do instalacji :)[/quote]
Może taką?
debcreate --packages="$(cat pkg.list)"
I co ty na to? Czy nie lepiej pozostawić tę kwestię użytkownikowi, tak jak wyżej?
Offline
[quote=kguciek]
debcreate --packages="$(cat pkg.list)"
I co ty na to? Czy nie lepiej pozostawić tę kwestię użytkownikowi, tak jak wyżej?[/quote]
I nagle się okazuje, że aby użyć skryptu, trzeba posiąść umiejętności — podstawowego, bo podstawowego, ale jednak... — skrypczenia. Mało KISS.
Offline
[quote=azhag]Mało KISS.[/quote]
Reguła KISS dotyczy raczej pracy programisty, a nie użytkownika :)
Moja metoda jest bardziej KISS, bo JA mam prościej.
W każdym razie zgadzam się, że lepiej jest dodawać opcje do skryptów :)
Można właściwie zrobić dwa rodzaje opcji, jedne przyjmujące listy nazw i drugie czytające dane z plików. Ale mniejsza z tym, to drobnostki.
Może wyjaśnisz, jakimi ścieżkami płyną pakiety lub źródła pakietów, zanim dotrą do twojej dystrybucji HAG?
Czy jest może tak:
Debian source packages -> Debian build system -> grml -> HAG
Czy raczej:
Debian source packages -> grml (source) -> you build packages for HAG
Offline
[quote=kguciek][quote=azhag]Mało KISS.[/quote]
Reguła KISS dotyczy raczej pracy programisty, a nie użytkownika :)
Moja metoda jest bardziej KISS, bo JA mam prościej.[/quote]
Programista powinien też dbać, żeby było KISS dla użytkownika.
[quote=kguciek]Może wyjaśnisz, jakimi ścieżkami płyną pakiety lub źródła pakietów, zanim dotrą do twojej dystrybucji HAG?
Czy jest może tak:
Debian source packages -> Debian build system -> grml -> HAG
Czy raczej:
Debian source packages -> grml (source) -> you build packages for HAG[/quote]
Korzystam bezpośrednio z repozytoriów Debiana, nadpisując je repozytoriami grmla, następnie nadpisując repozytoriami Haga (nie HAG-a!), po czym nadpisuję repozytoium dla live'ów grmla.
Do repozytorium Haga pakiety wprowadzam bezpośrednio, na Debiana i grmla staram się wpływać, jeśli znajdę jakiś błąd lub usprawnienie.
Offline
[quote=azhag]Korzystam bezpośrednio z repozytoriów Debiana, nadpisując je repozytoriami grmla, następnie nadpisując repozytoriami Haga (nie HAG-a!), po czym nadpisuję repozytoium dla live'ów grmla..[/quote]
To znaczy, że większość haga to binarne pakiety z Debiana? Ale dlaczego nie bazujesz bezpośrednio na Debianie?
Offline
[quote=kguciek]To znaczy, że większość haga to binarne pakiety z Debiana?[/quote]
Tak. Nie widzę potrzeby rekompilowania dla sztuki.
[quote=kguciek]Ale dlaczego nie bazujesz bezpośrednio na Debianie?[/quote]
Ponieważ grml jest dla mnie lepszą bazą.
Offline
[quote=azhag]Ponieważ grml jest dla mnie lepszą bazą.[/quote]
Może coś więcej na ten temat? Co dokładnie sprawia, że warto przedłużać łańcuch pokarmowy o kolejne ogniwo?
Aha, w hagu przydałyby się metapakiety z zależnościami, tak ułożone, aby np. stworzenie live cd haga polegało na tylko takich krokach:
1) podstawowa instalacja Debiana
2) dodanie repozytorium binarnych pakietów haga do /etc/apt/sources
3) aptitude install hag-desktop-fluxbox hag-boot #### albo coś podobnego
i tyle :)
Offline
Time (s) | Query |
---|---|
0.00018 | SET CHARSET latin2 |
0.00005 | SET NAMES latin2 |
0.00122 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.145.63.148' WHERE u.id=1 |
0.00069 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.145.63.148', 1732488546) |
0.00057 | SELECT * FROM punbb_online WHERE logged<1732488246 |
0.00428 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=14086 AND t.moved_to IS NULL |
0.00130 | SELECT search_for, replace_with FROM punbb_censoring |
0.00918 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=14086 ORDER BY p.id LIMIT 0,25 |
0.00125 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=14086 |
Total query time: 0.01872 s |