BackTrack5 – Metasplioit svn update error

BackTrack5 – Metasplioit svn update error
„Failed to add directory ‘data/svn’: an unversioned directory of the same name already exists”
To fix it:
Delete svn folder in /opt/framework3/msf3/data
And then:

#svn up
#msfupdate.

Gdy Ci Padnie Linux ( Ubuntu 10.04 )

Gdy Ci padnie linux:

Target filesystem doesn’t have /sbin/init
 No init found. Try passing init= bootarg
 BusyBox v1.13.3 (Ubuntu 1:1.13.1-1ubuntu11) built-in shell (ash)
Enter ‘help’ for a list of built-in commands.

(initramfs)

Można spróbować użyć następujących sekwencji poleceń:

set prefix=(hd0,11)/boot/grub
set root=(hd0,11)
insmod linux
linux /vmlinuz root=/dev/sda11 ro
initrd /initrd.img
boot 

 

Category: Linux  Leave a Comment

Debugowanie Aplikacji Django

DjangoOd nie dawna mam „zaszczyt”  testowania aplikacji Django i pierwsze pytanie jakie postawiłem sobie było następujące:

  • W jaki sposób programiści aplikacji Django Debugują swoje aplikacje?

Najprościej zainstalować Django-Debug-Toolbar. Co należy zrobić?

  • Pobrać Django-Debug-ToolBar
  • Umieścić katalog debug_toolbar w katalogu projektu, lub  w dowolnym miejscu na dysku i dopisać lokalizację do  PYTHONPATH
  • W pliku settings.py naszego projektu szukamy MIDDLEWARE_CLASSES  i dodajemy
 'debug_toolbar.middleware.DebugToolbarMiddleware'
  • W tym samym pliku dodajemy konfigurację określającą wygląd panelu:
DEBUG_TOOLBAR_PANELS = ( 'debug_toolbar.panels.version.VersionDebugPanel',
   'debug_toolbar.panels.timer.TimerDebugPanel',
   'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
   'debug_toolbar.panels.headers.HeaderDebugPanel',
   'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
   'debug_toolbar.panels.template.TemplateDebugPanel',
   'debug_toolbar.panels.sql.SQLDebugPanel',
   'debug_toolbar.panels.signals.SignalDebugPanel',
   'debug_toolbar.panels.logger.LoggingPanel', )
  • W pliku stetings.py do INSTALLED_APPS dodajemy
'debug_toolbar'
  • Dodajemy listę IP, które będą widziały panel. Dla localhosta:
INTERNAL_IPS=['127.0.0.1:8000']

Wygląd Panelu Administracyjnego przykładowej aplikacji wygląda jak poniżej:

Django

C.D.N

Perl Book

1.     HTMLified Perl 5 Reference Guide – http://www.oopweb.com/Perl/Documents/Perl5Ref/VolumeFrames.html

2.     Perl 5 Documentation – http://www.oopweb.com/Perl/Documents/PerlDoc/VolumeFrames.html

3.     Perl for Perl Newbies – http://www.oopweb.com/Perl/Documents/P4PNewbies/VolumeFrames.html

4.     Perl for Win32 FAQ – http://www.oopweb.com/Perl/Documents/PerlWin32/VolumeFrames.html

5.     Beginning Perl – http://www.perl.org/books/beginning-perl/

6.     Impatient Perl – http://www.perl.org/books/impatient-perl/

7.     Extreme Perl – http://www.extremeperl.org/bk/home

8.     MacPerl: Power & Ease – http://macperl.com/ptf_book/r/MP/i2.html

9.     Embedding Perl in HTML with Mason – http://www.masonbook.com

10.   Perl for the Web - http://www.globalspin.com/thebook/

11.   Web Client Programming with Perl – http://www.oreilly.com/openbook/webclient/

12.   Perl 5 By Example – http://www.computer-books.us/perl_0010.php

13.   An Introduction to Perl – http://www.linuxtopia.org/Perl_Tutorial/index.html

14.   Beginning CGI Programming with Perl – http://www.learnthat.com/internet/learn-160-cgi_programming_perl.htm

15.   Perl Tutorial: Start – http://www.comp.leeds.ac.uk/Perl/start.html

16.   A Perl Tutorial – http://www.civeng.carleton.ca/Courses/Grad/1995-96/82.562/perl/

17.   Robert’s Perl Tutorial – http://www.sthomas.net/oldpages/roberts-perl-tutorial.htm

18.   Beginning Perl Tutorials – http://www.pageresource.com/cgirec/index2.htm

19.   Beginner’s Guide to CGI Scripting with Perl – http://www.lies.com/begperl/

20.   Practical Perl Programming – http://www.cs.cf.ac.uk/Dave/PERL/

21.   Perl 5 Unleashed – http://octopus.cdut.edu.cn/~yf17/perl5/

22.   Perl for System Administration – http://www.unix.org.ua/orelly/perl/sysadmin/index.htm

23.   PERL — Practical Extraction and Report Language – http://www-cgi.cs.cmu.edu/cgi-bin/perl-man

24.   Programming Perl – http://www.unix.org.ua/orelly/perl/prog3/

25.   Steve Litt’s Perls of Wisdom – http://www.troubleshooters.com/codecorn/littperl/index.htm

26.   Perl Regular Expression Tutorial – http://virtual.park.uga.edu/humcomp/perl/regex2a.html

27.   Perl Documentation – http://www.perl.com/pub/q/documentation

28.   Programming Perl 5 – http://www.squirrel.nl/pub/perlref-5.004.1.pdf

29.   Beginner’s Introduction to Perl - http://www.perl.com/pub/a/2000/10/begperl1.html

30.   Perl in a Nutshell – http://www.unix.org.ua/orelly/perl/perlnut/index.htm

31.   Programming Perl, 3rd Edition - http://www.unix.org.ua/orelly/perl/prog3/index.htm

32.   Advanced Perl Programming – http://www.unix.org.ua/orelly/perl/advprog/index.htm

33.   Perl Cookbook - http://www.unix.org.ua/orelly/perl/cookbook/index.htm

XML processing with Perl – http://www.xmltwig.com/tutorial/perl_xml/mtb04_01.html

Category: Perl  Tags: , ,  Leave a Comment

Python – SQLAlchemy

SQLAlchemy to ORM (relacyjny maper) baz danych dla pythona, konkurencyjny względem SQLObject.

Object-relational mapping (ORM, O/RM, and O/R mapping) in computer software is a programming technique for converting data between incompatible type systems in object-oriented programming languages. This creates, in effect, a „virtual object database” that can be used from within the programming language. There are both free and commercial packages available that perform object-relational mapping, although some programmers opt to create their own ORM tools...

Definicja przytoczona za – http://en.wikipedia.org/

Obecnie wspiera on następujące bazy poprzez podane pakiety:

Instalacja

Aby zainstalować SQLachemy Można skorzystać z easy_install:

easy_install SQLAlchemy
lub
pip  install SQLAlchemy

lub też ściągnąć paczkę i zainstalować standardowo:

python setup.py install

Aby sprawdzić poprawność instalacji uruchamiamy interpreter pythona i wpisujemy.

>> import sqlalchemy
>> sqlalchemy.__version__
0.7.0

Pakiet SQLalchemy została zainstalowany prawidłowo.

Podstawy, Łączenie się z bazą danych

By połączyć się z bazą danych należy zastosować:

from sqlalchemy import *

# postgres
pg_db = create_engine('postgres://scott:tiger@localhost:5432/mydatabase')

# sqlite

sqlite_db = create_engine('sqlite:////absolute/path/to/database.txt')
sqlite_db = create_engine('sqlite:///relative/path/to/database.txt')
sqlite_db = create_engine('sqlite://')

# mysql
mysql_db = create_engine('mysql://localhost/foo')
mysql_db = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')

#oracle

# oracle - cx_oracle
oracle_db = create_engine('oracle://scott:tiger@127.0.0.1:1521/sidname')
# oracle via TNS name
oracle_db = create_engine('oracle+cx_oracle://scott:tiger@tnsname')

By rozpocząć pracę z tabelami trzeba je przypisać do obiektu MetaData. Dopiero wtedy można na nich operować. Oto przykład przypisujący bazę do MetaData oraz tworzący tabelę:

from sqlalchemy import *

#driver://login:haslo@host:port/nazwa_bazy
>>> engine=create_engine('oracle://django:password@xe')
>>> conn=engine.connect()
>>> result=conn.execute('select id, domain, name from django_site')
>>> for row in result:
...    print 'id: %s Domena: %s Nazwa: %s' % ( row['id'],row['domain'],row['name
'])
...
id: 1 Domena: example.com Nazwa: example.com

# definicja tabeli 'user_sql'
>>> user_db=Table(
...    'user_sql',metadata,
...    Column('id',Integer, primary_key=True),
...    Column('user_name', Unicode(16),unique=True, nullable=False),
...    Column('email', Unicode(255), unique=True, nullable=False),
...    Column('password', Unicode(40), nullable=False),
...    Column('first_name', Unicode(255), default=''),
...    Column('last_name', Unicode(255), default=''))
# utworzenie tabeli 'user_sql'
user_db.create(engine)

Stworzyliśmy tabelę ‘user_sql’  – składnia  SQL:

(SQL wygenerowano za pomocą programu TOAD For Oracle – http://www.quest.com )

ALTER TABLE DJANGO.USER_SQL
DROP PRIMARY KEY CASCADE;

DROP TABLE DJANGO.USER_SQL CASCADE CONSTRAINTS;

CREATE TABLE DJANGO.USER_SQL
(
 ID          INTEGER                           NOT NULL,
 USER_NAME   NVARCHAR2(16)                     NOT NULL,
 EMAIL       NVARCHAR2(255)                    NOT NULL,
 PASSWORD    NVARCHAR2(40)                     NOT NULL,
 FIRST_NAME  NVARCHAR2(255),
 LAST_NAME   NVARCHAR2(255)
)
TABLESPACE USERS
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
 INITIAL          64K
 NEXT             1M
 MINEXTENTS       1
 MAXEXTENTS       UNLIMITED
 PCTINCREASE      0
 BUFFER_POOL      DEFAULT
 )
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;

ALTER TABLE DJANGO.USER_SQL ADD (
 PRIMARY KEY
 (ID)
 USING INDEX
 TABLESPACE USERS
 PCTFREE    10
 INITRANS   2
 MAXTRANS   255
 STORAGE    (
 INITIAL          64K
 NEXT             1M
 MINEXTENTS       1
 MAXEXTENTS       UNLIMITED
 PCTINCREASE      0
 ),
 UNIQUE (USER_NAME)
 USING INDEX
 TABLESPACE USERS
 PCTFREE    10
 INITRANS   2
 MAXTRANS   255
 STORAGE    (
 INITIAL          64K
 NEXT             1M
 MINEXTENTS       1
 MAXEXTENTS       UNLIMITED
 PCTINCREASE      0
 ),
 UNIQUE (EMAIL)
 USING INDEX
 TABLESPACE USERS
 PCTFREE    10
 INITRANS   2
 MAXTRANS   255
 STORAGE    (
 INITIAL          64K
 NEXT             1M
 MINEXTENTS       1
 MAXEXTENTS       UNLIMITED
 PCTINCREASE      0
 ));

users_db to obiekt odnoszący się do naszej tabeli. Jeżeli tabela już istnieje to odwołać możemy się do niej w następujący sposób:

users_db = Table('users_sql', metadata, autoload=True)

Dodawanie danych

By dodać dane do bazy danych możemy skorzystać z dwóch sposobów:

from sqlalchemy import *

#driver://login:haslo@host:port/nazwa_bazy
db = create_engine('oracle://django:password@xe')

# przypisanie tabel do MetaData
metadata = MetaData(engine)
metadata.echo = True

users_db = Table('users_sql', metadata, autoload=True)

# dodawanie wierszy
>>> metadata.echo=True
>>> i=user_db.insert()
>>> print i
# Polecenie SQL
INSERT INTO user_sql (id, user_name, email, password, first_name, last_name) VAL
UES (:id, :user_name, :email, :password, :first_name, :last_name)
>>> metadata.bind=engine
# sposób 1
>>> engine.execute(i,id=3,user_name='edyta123', email='ed@wp.pl', password='foo123')
<sqlalchemy.engine.base.ResultProxy object at 0x02CCBBB0>
>>>
# sposób 2
>>>engine.execute(i,{'id': 5, 'user_name': 'zdzichu', 'email': 'sw@wp.pl', 'password': '42zdzich'},
                 {'id': 6, 'user_name': 'lepper123', 'email': 'lepp@qo.pl', 'password': '0700LEP'},
                 {'id': 7, 'user_name': 'Carla', 'email': 'clara@wp.pl', 'password': 'foobar'})
<sqlalchemy.engine.base.ResultProxy object at 0x02D1A550>

Pierwszy sposób – dodaje jeden wiersz bazując na danych przypisany do zmiennych będących nazwami pól tabeli. Drugi zawiera listę słowników i służy do dodawania wielu wpisów. Dodatkowo SQLAlchemy ‘slaszuje’ wszystkie znaczące znaki w dodawanych danych. Tak więc praktycznie eliminuje to ataki SQL injection.

Pobieranie danych

Wygląda równie sprawnie:

>>> user_db=Table('user_sql', metadata, autoload=True)
>>> s=user_db.select()
>>> rs=s.execute()
>>> row=rs.fetchone()
>>> print 'id: ', row[0]
id:  5
>>> print 'user name: ', row['user_name']
user name:  zdzichu
>>> print 'password: ', row['password']
password:  42zdzich

Co pobierze jeden wiersz (fetchone()). By pobrać wszystkie należy skorzystać z fetchall()

>>> rs = s.execute()
>>> a = rs.fetchall()
>>> for row in a:
...     print row.user_name + ' - ' + row.password;
...
zdzichu - 42zdzich
lepper123 - 0700LEP
Carla - foobar
edyta - foo123
edyta123 - foo123
edyta1234 - for234

Ograniczanie pobieranych danych można wykonać na wiele sposobów, oto przegląd:

from sqlalchemy import *

#driver://login:haslo@host:port/nazwa_bazy
>>>db = create_engine('oracle://Django:password@xe')

# przypisanie tabel do MetaData
>>>metadata = MetaData(db)
>>>metadata.echo = True
>>>users_db = Table('users_sql', metadata, autoload=True)
>>> def run(stmt):
...    rs=stmt.execute()
...    for row in rs:
...      print row
...
>>>
>>> s=user_db.select(user_db.c.user_name=='Edyta')
>>> run(s)
>>> s=user_db.select(user_db.c.user_name=='edyta')
>>> run(s)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None)
>>> s=user_db.select(user_db.c.user_name=='Edyta')
>>> print s
#Zapytanie SQL wysłane do Bazy Danych Oracle
SELECT user_sql.id, user_sql.user_name, user_sql.email, user_sql.password, user_sql.first_name, user_sql.last_name
FROM user_sql
WHERE user_sql.user_name = :user_name_1
>>>
# Zapytanie z prostym warunkiem jednego pola
>>> s=user_db.select(user_db.c.user_name!='Edyta')
>>> run(s)
(5, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None)
(6, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None)
(7, u'Carla', u'clara@wp.pl', u'foobar', None, None)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None)
(4, u'edyta1234', u'test', u'for234', None, None)
>>>
>>>s = users_db.select(users_db.c.id < 40)
>>>run(s)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None)
(4, u'edyta1234', u'test', u'for234', None, None)
(5, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None)
(6, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None)
(7, u'Carla', u'clara@wp.pl', u'foobar', None, None)

# dostępne są też funkcje and_, or_ i not_
>>>s = users_db.select(and_(users_db.c.id < 40, users_db.c.user_name != 'Mary'))
>>>run(s)
(5, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None)
(6, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None)
(7, u'Carla', u'clara@wp.pl', u'foobar', None, None)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None)
(4, u'edyta1234', u'test', u'for234', None, None)
>>>

# Są też inne funkcje jak "like", "startswith", "endswith"
>>> s = user_db.select(user_db.c.user_name.startswith('e'))
>>> run(s)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None)
(4, u'edyta1234', u'test', u'for234', None, None)
>>>

>>>s = user_db.select(user_db.c.user_name.like('%a%'))
>>>run(s)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None)
(4, u'edyta1234', u'test', u'for234', None, None)
(6, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None)
>>>
>>>s = user_db.select(user_db.c.user_name.endswith('4'))
>>>run(s)
(4, u'edyta1234', u'test', u'for234', None, None)
>>>
# "func" służy do wywoływania funkcji SQL
>>>s = user_db.select(func.substr(user_db.c.user_name, 2, 1) == 'a')
>>>run(s)
(7, u'Carla', u'clara@wp.pl', u'foobar', None, None)
# pobieranie danych z określonych pól
>>>s = select([user_db.c.id, user_db.c.user_name], user_db.c.user_name != 'Carl')
>>>run(s)
(7, u'Carla')
(2, u'edyta')
(3, u'edyta123')
(4, u'edyta1234')
(6, u'lepper123')
(5, u'zdzichu')

# SQLowy count()
>>>s = select([func.count(user_db.c.id)])
>>>run(s)
(6,)

# count(*) czyli liczymy wszystko
s = select([func.count("*")], from_obj=[user_db])
run(s)
(6,)

Łączenie tabel – JOIN

Przykład wykonywania zapytań z łączonymi tabelami.

from sqlalchemy import *
#driver://login:haslo@host:port/nazwa_bazy</pre>
>>>engine = create_engine('oracle://django:password@xe')
>>>engine.echo = True
>>>metadata = MetaData(engine)

>>>emails2 = Table('emails2', metadata,
... Column('email_id', Integer, primary_key=True),
... Column('address', Unicode(20)),
... Column('user_id', Integer, ForeignKey('user_sql.id')),
)
>>>emails2.create(engine)

>>>i = emails.insert()
>>>metadata.bind=engine
>>> engine.execute(i,
...  {'email_id':1, 'address': 'mary@example.com', 'user_id': 1},
...  {'email_id':2, 'address': 'john@nowhere.net', 'user_id': 2},
...  {'email_id':3, 'address': 'john@example.org', 'user_id': 2},
...  {'email_id':4, 'address': 'carl@nospam.net', 'user_id': 4},
... )
<sqlalchemy.engine.base.ResultProxy object at 0x02D25FB0>
>>>
>>>def run(stmt):
...   rs = stmt.execute()
...   for row in rs:
...     print row

# pełen join, brak where, zwraca "dużo" wyników
>>>s = select([user_db, emails2])
>>>run(s)
(1, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None, 1, u'mary@example.com', 1)

(1, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None, 2, u'john@nowhere.net', 2)

(1, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None, 3, u'john@example.org', 2)
(1, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None, 4, u'carl@nospam.net', 4)
(5, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None, 1, u'mary@example.com',1)
(5, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None, 2, u'john@nowhere.net',2)
(5, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None, 3, u'john@example.org',2)
(5, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None, 4, u'carl@nospam.net',4)
(6, u'Carla', u'clara@wp.pl', u'foobar', None, None, 1, u'mary@example.com', 1)
(6, u'Carla', u'clara@wp.pl', u'foobar', None, None, 2, u'john@nowhere.net', 2)
(6, u'Carla', u'clara@wp.pl', u'foobar', None, None, 3, u'john@example.org', 2)
(6, u'Carla', u'clara@wp.pl', u'foobar', None, None, 4, u'carl@nospam.net', 4)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None, 1, u'mary@example.com', 1)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None, 2, u'john@nowhere.net', 2)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None, 3, u'john@example.org', 2)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None, 4, u'carl@nospam.net', 4)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None, 1, u'mary@example.com', 1)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None, 2, u'john@nowhere.net', 2)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None, 3, u'john@example.org', 2)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None, 4, u'carl@nospam.net', 4)
(4, u'edyta1234', u'test', u'for234', None, None, 1, u'mary@example.com', 1)
(4, u'edyta1234', u'test', u'for234', None, None, 2, u'john@nowhere.net', 2)
(4, u'edyta1234', u'test', u'for234', None, None, 3, u'john@example.org', 2)
(4, u'edyta1234', u'test', u'for234', None, None, 4, u'carl@nospam.net', 4)
>>>
# join z określonym warunkiem łączenia
>>>s = select([user_db, emails2], emails2.c.user_id == user_db.c.id)
>>>run(s)
(1, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None, 1, u'mary@example.com', 1)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None, 2, u'john@nowhere.net', 2)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None, 3, u'john@example.org', 2)
(4, u'edyta1234', u'test', u'for234', None, None, 4, u'carl@nospam.net', 4)
>>>

# obiekt join jest inteligentny
# i określi pole łączenia po ForeignKey
s = join(user_db, emails2).select()
run(s)
(1, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None, 1, u'mary@example.c,1)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None, 2, u'john@nowhere.net',2)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None, 3, u'john@example.org',3)
(4, u'edyta1234', u'test', u'for234', None, None, 4, u'carl@nospam.net',4)
>>>
# wszyscy userzy, nawet jak nie mają emaila
# potrzebny "outer" join.
s = outerjoin(user_db, emails2).select()
run(s)
(1, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None, 1, u'mary@example.com', 1)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None, 2, u'john@nowhere.net', 2)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None, 3, u'john@example.org', 2)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None, None, None, None)
(4, u'edyta1234', u'test', u'for234', None, None, 4, u'carl@nospam.net', 4)
(5, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None, None, None, None)
(6, u'Carla', u'clara@wp.pl', u'foobar', None, None, None, None, None)
>>>
# outer joiny są domyślnie "left outer join" czyli tabela po lewej + odpowiadające wartości z prawej tabeli.
# tutaj nie będzie rekordu z "Susane"
s = outerjoin(emails2, user_db).select()
run(s)
(1, u'mary@example.com', 1, 1, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None)
(2, u'john@nowhere.net', 2, 2, u'edyta', u'aw@wp.pl', u'foo123', None, None)
(3, u'john@example.org', 2, 2, u'edyta', u'aw@wp.pl', u'foo123', None, None)
(4, u'carl@nospam.net', 4, 4, u'edyta1234', u'test', u'for234', None, None)
>>>

Order By, Limit, Offset, distinct

>>> from sqlalchemy import *
>>> db=create_engine('oracle://django:password@xe')
>>> metadata=MetaData(db)
>>> metadata.echo=True
>>> def run(stmt):
...     rs = stmt.execute()
...     for row in rs:
...         print row
...
>>> user_db=Table('user_sql',metadata,autoload=True)
#proste sortowanie
>>> s=user_db.select(order_by=[user_db.c.user_name])
>>> run(s)
(6, u'Carla', u'clara@wp.pl', u'foobar', None, None)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None)
(4, u'edyta1234', u'test', u'for234', None, None)
(5, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None)
(1, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None)
>>>

# rosnące, malejące sortowanie na wielu kolumnach
>>>s= user_db.select(user_db.c.user_name>'J', order_by=[desc(user_db.c.id), asc(user_db.c.user_name)])
>>>run(s)
(5, u'lepper123', u'lepp@qo.pl', u'0700LEP', None, None)
(4, u'edyta1234', u'test', u'for234', None, None)
(3, u'edyta123', u'ed@wp.pl', u'foo123', None, None)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None)
(1, u'zdzichu', u'sw@wp.pl', u'42zdzich', None, None)
>>>
# wybieranie niepowtarzalnych wierszy
>>>s = select([user_db.c.user_name], distinct=True)
>>>run(s)
(u'Carla',)
(u'edyta',)
(u'edyta123',)
(u'edyta1234',)
(u'lepper123',)
(u'zdzichu',)
>>>
# limit i offset
>>>s = user_db.select(offset=2, limit=2)
>>>run(s)
(6, u'Carla', u'clara@wp.pl', u'foobar', None, None)
(2, u'edyta', u'aw@wp.pl', u'foo123', None, None)

Update

# zmiana 'zdzichu' na 'krzychu'
>>> user_db.update(user_db.c.user_name=='zdzichu').execute(user_name='krzychu')
<sqlalchemy.engine.base.ResultProxy object at 0x02ACD650>
# przypisane wartości
>>>u = user_db.update(user_db.c.user_name==bindparam('name'),
                values={'user_name':bindparam('newname')})
>>> u.execute(name='edyta', newname='ed')
<sqlalchemy.engine.base.ResultProxy object at 0x02B2C210>

# update jednej kolumny do drugiej
>>>user_db.update(values={user_db.c.password:user_db.c.user_name}).execute()

Delete

>>>user_db.delete(user_db.c.id==6).execute()
<sqlalchemy.engine.base.ResultProxy object at 0x02ACD9D0>
>>>

Przydatne Linki

Python GUI Timer

Timer

Python GUI Timer

Python GUI Timer

Timer napisany w pythonie z wykorzystaniem modułu Tkinter. Pełny opis modułu można znaleźć tutaj

http://www.pythonware.com/library/tkinter/introduction/

The Tkinter module („Tk interface”) is the standard Python interface to the Tk GUI toolkit from Scriptics (formerly developed by Sun Labs).Both Tk and Tkinter are available on most Unix platforms, as well as on Windows and Macintosh systems. Starting with the 8.0 release, Tk offers native look and feel on all platforms.Tkinter consists of a number of modules. The Tk interface is located in a binary module named _tkinter (this was tkinter in earlier versions). This module contains the low-level interface to Tk, and should never be used directly by application programmers. It is usually a shared library (or DLL), but might in some cases be statically linked with the Python interpreter.In addition to the Tk interface module, Tkinter includes a number of Python modules. The two most important modules are the Tkinter module itself, and a module called Tkconstants. The former automatically imports the latter, so to use Tkinter, all you need to do is to import one module:….

<pre>from Tkinter import *
#from Tkinter import tkMessageBox
import time
import sys

class StopWatch(Frame):
 """ Implements a stop watch frame widget. """
 def __init__(self, parent=None, **kw):
 Frame.__init__(self, parent, kw)
 self._start = 0.0
 self._elapsedtime = 0.0
 self._running = 0
 self.timestr = StringVar()
 self.makeWidgets()

 def makeWidgets(self):
 """ Make the time label. """
 l = Label(self, textvariable=self.timestr)
 self._setTime(self._elapsedtime)
 l.pack(fill=X, expand=NO, pady=2, padx=2)

 def _update(self):
 """ Update the label with elapsed time. """
 self._elapsedtime = time.time() - self._start
 self._setTime(self._elapsedtime)
 self._timer = self.after(50, self._update)

 def _setTime(self, elap):
 """ Set the time string to Minutes:Seconds:Hundreths """
 minutes = int(elap/60)
 seconds = int(elap - minutes*60.0)
 hseconds = int((elap - minutes*60.0 - seconds)*100)
 self.timestr.set('%02d:%02d:%02d' % (minutes, seconds, hseconds))

 def Start(self):
 """ Start the stopwatch, ignore if  running. """
 if not self._running:
 self._start = time.time() - self._elapsedtime
 self._update()
 self._running = 1

 def Stop(self):
 """ Stop the stopwatch, ignore if stopped. """
 if self._running:
 self.after_cancel(self._timer)
 self._elapsedtime = time.time() - self._start
 self._setTime(self._elapsedtime)
 self._running = 0

 def Reset(self):
 """ Reset the stopwatch. """
 self._start = time.time()
 self._elapsedtime = 0.0
 self._setTime(self._elapsedtime)

def callback():
 print('Test menu')

def main():
 root = Tk()
 root.title('PythonTimer')
 # create a menu
 menu = Menu(root)
 root.config(menu=menu)

 filemenu = Menu(menu)
 menu.add_cascade(label="File", menu=filemenu)
 filemenu.add_command(label="New", command=callback)
 #filemenu.add_command(label="Open...", command=callback)
 #filemenu.add_separator()
 filemenu.add_command(label="Exit", command=root.quit)

 helpmenu = Menu(menu)
 menu.add_cascade(label="Help", menu=helpmenu)
 helpmenu.add_command(label="About...", command=callback)

 sw = StopWatch(root)
 sw.pack(side=TOP)

 Button(root, text='Start', command=sw.Start).pack(side=LEFT)
 Button(root, text='Stop', command=sw.Stop).pack(side=LEFT)
 Button(root, text='Reset', command=sw.Reset).pack(side=LEFT)
 Button(root, text='Quit', command=root.quit).pack(side=LEFT)

 root.mainloop()

if __name__ == '__main__':
 main()
Category: Python  Tags:  Leave a Comment

Liczby Doskonałe

Problemem z klasycznego repertuaru podstawowych zadań w jakimś języku programowania jest np. szukanie liczb doskonałych w danym przedziale (od 1 do jakiejś liczby naturalnej). Kiedyś też to musiałem pisać na wprowadzeniu do programowania (to, co napisałem (metoda klasyczna) wlokło się jak mucha w smole). Nawet mnie się kiedyś o ten algorytm koleżanka pytała. Dzisiaj, na poczekaniu, z nudów wymyśliłem szybki algorytm realizujący to zadanie. Postanowiłem się nim podzielić.

more »

Python – PostgreSQL Database Backup Script

Simple script to backup some databases from PostgreSQL on unixlinux.


#!/usr/bin/env python
import os
import time

username = 'root'
defaultdb = 'postgres'
port = '5433'
backupdir='/www/backup/'
date = time.strftime('%Y-%m-%d')

#GET DB NAMES
get_db_names="psql -U%s -d%s -p%s --tuples-only -c 'l' | awk -F| '{ print $1 }' | grep -E -v '(template0|template1|^$)'" % (username, defaultdb, port)

#MAKE BACKUP OF SYSTEMGRANTS
os.popen("pg_dumpall -p%s -g|gzip -9 -c > %s/system.%s.gz" % (port, backupdir, date))

#MAKING DB BACKUP
for base in os.popen(get_db_names).readlines():
        base = base.strip()
        fulldir = backupdir + base
        if not os.path.exists(fulldir):
                os.mkdir(fulldir)
        filename = "%s/%s-%s.sql" % (fulldir, base, date)
        os.popen("nice -n 19 pg_dump -C -F c -U%s -p%s %s > %s" % (username, port, base, filename))
Category: Python  Tags: ,  Leave a Comment

MS Exel And Django

import csv
from django.http import HttpResponse, HttpResponseForbidden
from django.template.defaultfilters import slugify
from django.db.models.loading import get_model

def export(qs, fields=None):
   model = qs.model
   response = HttpResponse(mimetype='text/csv')
   response['Content-Disposition'] = 'attachment; filename=%s.csv' % slugify(model.__name__)
   writer = csv.writer(response)
   # Write headers to CSV file
    if fields:
     headers = fields
   else:
    headers = []
   for field in model._meta.fields:
     headers.append(field.name)
     writer.writerow(headers)
   # Write data to CSV file
   for obj in qs:
    row = []
  for field in headers:
    if field in headers:
      val = getattr(obj, field)
    if callable(val):
      val = val()
  row.append(val)
 writer.writerow(row)
# Return CSV file to browser as download
return response

def admin_list_export(request, model_name, app_label, queryset=None, fields=None, list_display=True):
"""
Put the following line in your urls.py BEFORE your admin include
 (r'^admin/(?P&lt;app_label&gt;[dw]+)/(?P&lt;model_name&gt;[dw]+)/csv/', 'util.csv_view.admin_list_export'),
"""
  if not request.user.is_staff:
    return HttpResponseForbidden()
  if not queryset:
    model = get_model(app_label, model_name)
 queryset = model.objects.all()
 filters = dict()
 for key, value in request.GET.items():
    if key not in ('ot', 'o'):
      filters[str(key)] = str(value)
    if len(filters):
     queryset = queryset.filter(**filters)
    if not fields:
      if list_display and len(queryset.model._meta.admin.list_display) &gt; 1:
          fields = queryset.model._meta.admin.list_display
      else:
         fields = None
  return export(queryset, fields)
"""
Create your own change_list.html for your admin view and put something like this in it:
{% block object-tools %}
&lt;ul&gt;
&lt;li&gt;&lt;a href="csv/{%if request.GET%}?{{request.GET.urlencode}}{%endif%}"&gt;Export to CSV&lt;/a&gt;&lt;/li&gt;
{% if has_add_permission %}
&lt;li&gt;&lt;a href="add/{% if is_popup %}?_popup=1{% endif %}"&gt;{% blocktrans with cl.opts.verbose_name|escape as name %}Add {{ name }}{% endblocktrans %}&lt;/a&gt;&lt;/li&gt;
{% endif %}
&lt;/ul&gt;
{% endblock %}
""" 

SQL Injection Walkthrough

[code]]czoxOlwiClwiO3tbJiomXX0=[[/code]

1.0 Introduction

When a machine has only port 80 opened, your most trusted vulnerability scanner cannot return anything useful, and you know that the admin always patch his server, we have to turn to web hacking. SQL injection is one of type of web hacking that require nothing but port 80 and it might just work even if the admin is patch-happy. It attacks on the web application (like ASP, JSP, PHP, CGI, etc) itself rather than on the web server or services running in the OS.

more »