sysctl net.inet.tcp.tso=0
or write in rc.conf
ifconfig interface_name inet address_ipv4 netmask net_mask -tso
sysctl net.inet.tcp.tso=0
or write in rc.conf
ifconfig interface_name inet address_ipv4 netmask net_mask -tso
zalatwiamy to za pomoca:
cd src/Makefile odszperac
LDFLAGS_SHLIB_EXPORT=
i zamienic na
LDFLAGS_SHLIB_EXPORT=-Wl,-E
Króciutki skrypt w pythonie do zrobienia lokalnej kopii djangobook’a (http://djangobook.com/):
from BeautifulSoup import BeautifulSoup as Soup
from urllib import urlopen
Soup.QUOTE_TAGS['pre'] = None
plik=file('djangobook.html', 'w')
link = 'http://www.djangobook.com/en/2.0/' + 'chapter%02d/'
for i in range(1, 21):
#] + ['appendix%s/' % chr(i) for i in range(ord('A'), ord('I'))]:
print i
soup = Soup(urlopen(link % i))
content = soup.find('div', attrs={'class': 'yui-b'})
plik.write(content.renderContents())
link = 'http://www.djangobook.com/en/2.0/appendix%s/'
for i in 'ABCDEFGH':
#] + ['appendix%s/' % chr(i) for i in range(ord('A'), ord('I'))]:
print i
soup = Soup(urlopen(link % i))
content = soup.find('div', attrs={'class': 'yui-b'})
plik.write(content.renderContents())
plik.close()
Mały middleware zapisujący do pliku wszystkie żadania HTTP i zapytania SQL wraz z czasem ich wykonania.
W głównym katalogu naszego programu(tam gdzie mamy url.py, settings.py itd) tworzymy plik logowaczka.py o poniższej treści:
# logowaczka.py
from django.db import connection
from django.conf import settings
from datetime import datetimeclass Logowaczka(object):
def process_response(self, request, response):
file = open(‘logowaczka.txt’,'a’)
if not request.path_info.startswith(‘/media/’):
# Http
text = ‘-’ * 120
text += ‘nPrzetwarzany URL %s (for %s at %s)’ % (request.path, request.META.get(‘REMOTE_ADDR’), datetime.now())
text += ‘n ID sesji: %s’ % request.COOKIES.get(’sessionid’)
text += ‘n Parametry: [%s] %s %s’ % (request.method, request.raw_post_data, request.META.get(‘QUERY_STRING’))# SQL
for q in connection.queries:
sql, time = q['sql'], q['time']
text += ‘ > %sn Czas zapytania SQL: %sn’ % (sql, time)print >> file, text
file.close()
return response
W settings.py dodajemy do middleware naszą klasę:
MIDDLEWARE_CLASSES = (
‘django.middleware.common.CommonMiddleware’,
‘django.contrib.sessions.middleware.SessionMiddleware’,
‘django.contrib.auth.middleware.AuthenticationMiddleware’,
‘logowaczka.Logowaczka’,)
Tworzymy plik logowaczka.txt:
touch logowaczka.txt
Odpalamy django.
Kiedyś stanąłem wobec problemu zrobienia prostej wyszukiwarki. Jako że z natury rzeczy jestem bardzo leniwym stworzeniem, nie miałem wyjścia – użyłem google
Mister google powiedział tak:
Dodaj indeks FULLTEXT polom w których chcesz szukać:
ALTER TABLE news ADD FULLTEXT(news_tytul, news_tresc);
Zadaj pytanie używając poniższej składni:
SELECT * FROM news WHERE MATCH(news_tytul, news_tresc) AGAINST (‘szukane_slowo’);
Proste, szybkie i łatwe – prawda? Cóż więcej trzeba leniwcom
Po szczegóły odsyłam tutaj: http://devzone.zend.com/article/1304-Using-MySQL-Full-text-Searching
# Utworzenie użytkownika
CREATE USER user [IDENTIFIED BY [PASSWORD] ‘password’];
# Utworzenie bazy
$ mysqladmin -u <username> -p create <nazwa_bazy>
# Skazowanie bazy
$ mysqladmin -u <username> -p drop <nazwa_bazy>
# Wyświetlenie listy procesów
$ mysqladmin -u root -p proc
# Pokazanie statusu bazy co 5 sekund
$ mysqladmin -u root -p -i 5 status
# Zrzucenie bazy/baz
$ mysqldump –opt -u <user> -h <host> <nazwa bazy> -p > /sciezka/do_pliku/baza.sql
$ mysqldump –opt -u <user> -h <host> –all-databases -p > /sciezka/do_pliku/bazy.sql
# Import bazy
$ mysql -h <host> -u <user> <nazwa_bazy> -p < /sciezka/do_pliku/baza.sql
# Nadanie praw
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON <dbname>.* TO <dbuser@localhost> [IDENTIFIED BY '<password>'];
# Zdjęcie praw
REVOKE ALL ON <dbname> FROM <dbuser@localhost>;
# Dodawanie/usuwanie bazy/tabel
CREATE DATABASE <dbname>;
DROP DATABASE <dbname>;
DROP TABLE <tablename1[, table2, table3...]>;
# Przeładowanie uprawnień
FLUSH PRIVILEGES;
# Użycie bazy
USE <nazwa_bazy>;
# Pokazanie baz
SHOW DATABASES;
# Pokazanie tabel z prefix’em
SHOW TABLES LIKE ‘prefix%’;
# Różne takie
SELECT * FROM <nazwa_tabeli>;
DESCRIBE <nazwa_tabeli>;
INSERT INTO <tabela> <user, password, name1, name2, …> VALUES (‘user’, password(‘pass’), ‘wartosc1′, ‘wartosc2′ …);
CREATE TABLE <nowa_tabela> AS SELECT DISTINCT <pole> FROM <stara_tabela>;
INSERT INTO <nazwa_bazy.tabela> SELECT * FROM <nazwa_bazy.tabela> WHERE <pole> = <wartosc>;
ALTER TABLE <stara_nazwa_tabeli> RENAME <nowa_nazwa_tabeli>;
UPDATE <nazwa_tabeli> SET <pole> = <nowa_wartosc> [WHERE <pole2> = <wartosc>];
# Sprawdzenie indeksów:
mysql> SHOW INDEX FROM <nazwa_tabeli> [FROM <nazwa_bazy>]
# Dodanie indeksów:
mysql> ALTER TABLE `<naza_tabeli>` ADD INDEX (`<pole>`);
# Usunięcie indeksów:
mysql> ALTER TABLE `<nazwa_tabeli>` DROP INDEX `<pole>`;
# Zmiana zmiennych serwera mysql podczas pracy
# Ustawienie zmiennych globalnych
mysql> SET @@global.<zmienna>=<wartosc>;
# Ustawienie zmiennych sesji
mysql> SET @@session.<zmienna>=<wartosc>;
# Pokazanie zmiennych:
mysql> SELECT @@[global|session].<zmienna>
# Dodatkowy user z prawami root’a
mysql> GRANT ALL PRIVILEGES ON *.* TO ‘<user>’@'localhost’ IDENTIFIED BY PASSWORD ‘<password>’ WITH GRANT OPTION;
# Pokazanie praw danego usera
mysql> show grants for ‘user’@'localhost’;
# Usunięcie wszystkich praw danemu userowi
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ‘user’@'localhost’;
# Usunięcie anonimowych userów
mysql> DROP USER ''@'localhost';
# Optymalizacja tabel mysql
OPTIMIZE TABLE nazwa_tabeli1[,kolejna_nazwa_tabeli]…
mysqlcheck -o -u root -p –all-databases
$ myisamchk –quick –check-only-changed –sort-index –analyze *.MYI
# Naprawa tabel mysql
CHECK TABLE <nazwa_tabeli>
REPAIR TABLE <nazwa_tabeli>
myisamchk -e *.MYI
myisamchk -r -q <nazwa_tabeli> (-r -q means `quick recovery mode’)
Komenda python manage.py syncdb tworzy nowe tabele bez modyfikowania istniejących. Co zrobić jeśli chcemy rozbudować nasz model, a nie chcemy stracić danych już wprowadzonych? Proste rozwiązanie poniżej.
1) Robimy zrzut bazy danych:
python manage.py dumpdata nazwa_aplikacji > backup.sql
2) Dodajemy nowe atrybuty do modelu określając domyślne atrybuty, uzupełniając już istniejące o domyślne wartości
3) Resetujemy aplikację by wykreować zmodyfikowane tabele
python manage.py reset nazwa_aplikacji
4) Wczytujemy dane zrzucone w pkt 1.
python manage.py loaddata backup.sql
Alternatywną metodą jest użycie django-evolution, ale powyższa metoda pozwala na zmiany bez grzebania się w kodzie.
Dodajemy usera i grupę clamav:
pw group add clamav -g 106
pw user add clamav -c “ClamAVUser” -d “/nonexistent” -s “/sbin/nologin” -u 106 -g 106
Sciagamy źrodła, rozpakowujemy, configure+opcje (np. –prefix=/usr/local, generalnie polecam odpalic z –help), make, make install
Tworzymy katalog na sygnatury i ustawiamy prawa:
mkdir -p /var/lib/clamav
chown clamav:clamav /var/lib/clamav
Dostosowujemy zawartość plików /usr/local/etc/clamd.conf i /usr/local/etc/freshclam.conf, odpalamy z reki + dopisujemy do skryptów startowych.
Uruchamiam calość:
/usr/local/bin/freshclam –config-file=/usr/local/etc/freshclam.conf -d
/usr/local/sbin/clamd -c /usr/local/etc/clamd.conf
Ściągamy clamsmtpd,
http://memberwebs.com/stef/software/clamsmtp/clamsmtp-1.10.tar.gz
./configure –prefix=/usr/local
make
make install
Edytujemy /usr/local/etc/clamsmtpd.conf
/usr/local/sbin/clamsmtpd -f /usr/local/etc/clamsmtpd.conf -p /var/run/clamav/clamsmtpd.pid
Zmieniamy main.conf i master.cf, restartujemy postfix’a
Pliki konfiguracyjne postfix’a, clamd, clamsmtpd i freshclam’a:
W main.cf na końcu dodajemy linijkę:
content_filter = scan:[127.0.0.1]:10025
Zawartość master.cf:
smtp inet n – n – – smtpd
scan unix – – n – 16 smtp
-o smtp_send_xforward_command=yes
-o smtp_enforce_tls=no
127.0.0.1:10026 inet n – n – 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8pickup fifo n – n 60 1 pickup
cleanup unix n – n – 0 cleanup
qmgr fifo n – n 300 1 qmgr
tlsmgr unix – – n 1000? 1 tlsmgr
rewrite unix – – n – – trivial-rewrite
bounce unix – – n – 0 bounce
defer unix – – n – 0 bounce
trace unix – – n – 0 bounce
verify unix – – n – 1 verify
flush unix n – n 1000? 0 flush
proxymap unix – – n – – proxymap
proxywrite unix – – n – 1 proxymap
smtp unix – – n – – smtp
relay unix – – n – – smtp
-o smtp_fallback_relay=
showq unix n – n – – showq
error unix – – n – – error
retry unix – – n – – error
discard unix – – n – – discard
local unix – n n – – local
virtual unix – n n – – virtual
lmtp unix – – n – – lmtp
anvil unix – – n – 1 anvil
scache unix – – n – 1 scache
Zawartość clamd.conf:
LogSyslog yes
LogFacility LOG_MAIL
LogVerbose yes
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /tmp
DatabaseDirectory /var/db/clamav
LocalSocket /tmp/clamd.socket
FixStaleSocket yes
User clamav
ScanMail yes
Zawartość clamsmtpd.conf:
OutAddress: 10026
MaxConnections: 64
ClamAddress: /tmp/clamd.socket
Header: X-Virus-Scanned: AV Scaner 0.9
TempDirectory: /var/db/clamav/viruses
Action: drop
Quarantine: on
User: clamav
Zawartość freshclam.conf:
DatabaseDirectory /var/db/clamav
LogVerbose yes
LogSyslog yes
LogFacility LOG_MAIL
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups yes
DatabaseMirror database.clamav.net
MaxAttempts 5
ScriptedUpdates yes
Checks 24
NotifyClamd /usr/local/etc/clamd.conf
PgBouncer to niezła alternatywa dla pgpool’a. Jego głównym zadaniem jest odciążyć nieco naszego PostgreSQL’a zabijanego kolejnymi connect’ami. PgBouncer tworzy pulę połączeń do serwera bazy danych i wydajnie z niej korzysta. Dostępne są następujące tryby:
Session pooling -gdy klient się łączy, połączenie z serwerem zostanie przypisane do niego przez cały czas, po rozłączeniu wraca z powrotem do puli.
Transaction pooling – połączenie aktywne tylko podczas transakcji, po jej zakończeniu wraca.
Statement pooling – najbardziej agresywna metoda, połącznie wraca do puli natychmiast po wykonaniu kwerendy(generalnie nie polecana
)
Administracja PgBouncer‘em jest bardzo prosta i sprowadza się do kilku poleceń kiedy jesteśmy podłączeni do wirtualnej bazy PgBouncer‘a, ale o tym później.
Na początek zainstalujemy PgBouncer‘a, ściągamy źródła stąd: http://pgfoundry.org/projects/pgbouncer
Do prawidłowego zainstalowania w systemie potrzebujemy również libevent.
cd /usr/ports/devel/libevent
make
make install
Ok libevent siedzi na miejscu, teraz zróbmy sobie PgBouncer‘a:
Rozpakowujemy źródła i piszemy:
cd pgbouncer-1.2.3
./configure –with-libevent=/usr/local
gmake
gmake install
Teraz pora na przygotowanie plików konfiguracyjnych dla programu, potrzebne są 2, jeden plik dla PgBouncer‘a, drugi plik z userami i hasłami.
Prosta zawartość pierwszego z nich (/usr/local/etc/pgbouncer.ini):
[databases]
naszabaza = host=127.0.0.1 port=5432 dbname=naszabaza[pgbouncer]
listen_port = 6543
listen_addr = 127.0.0.1
auth_type = plain
auth_file = /usr/local/etc/users.txt
logfile = /var/log/pgbouncer.log
pidfile = /tmp/pgbouncer.pid
admin_users = uzytkownik
max_client_conn = 300
default_pool_size = 200
pool_mode = session
server_connect_timeout = 300
client_login_timeout = 300
Oraz drugiego (/usr/local/etc/users.txt):
“uzytkownik” “haslo_uzytkownika”
Uwierzytelnianie użytkowników:
- /usr/local/bin/pgbouncer -d /usr/local/etc/pgbouncer.ini
psql -h 127.0.0.1 -p 6543 -U user pgbouncer
Po zalogowaniu poleceniem show help; zobaczymy liste dostępnych komend.
pgbouncer=# show help;
NOTICE: Console usage
DETAIL:
SHOW [HELP|CONFIG|DATABASES|FDS|POOLS|CLIENTS|SERVERS|SOCKETS|LISTS|VERSION]
SET key = arg
RELOAD
PAUSE
SUSPEND
RESUME
SHUTDOWN
Zaczynamy od zainstalowania:
cd /usr/ports/sysutils/fusefs-sshfs; make install clean
By nasz fs wstawał przy starcie systemu do /etc/rc.conf dodajemy linijkę:
fusefs_enable=”YES”
Jeśli chcemy pozwolić userom na montowanie to klepiemy z konsoli:
sysctl vfs.usermount=1
Odpalamy z ręki nasz fs:
/usr/local/etc/rc.d/fusefs start
Aby sprawdzić czy moduł jest załadowany piszemy:
kldstat
Powinien pojawić się gdzieś tam napis
fuse.ko
Montowanie zdalnych udziałów jest banalne, robimy to za pomocą komendy:
sshfs login@host.domena.pl: /mnt/gdzie_zamontowac
Odmontowanie zasobu:
umonut /mnt/gdzie_zamontowac
Do czego można to wykorzystać? A na to pytanie trzeba sobie odpowiedzieć samemu
Ja mam kilka zastosowań