Chủ Nhật, 29 tháng 12, 2013

Exception

1.Exception
Mặc dù một câu lệnh hoặc một biểu thức chính xác về mặt cú pháp nhưng vẫn có thể gây ra lỗi khi chạy thử. Lỗi được phát hiện trong suốt quá trình chạy thử này gọi là " Exception ", và chúng ta không bao giờ hoàn toàn tránh được các lỗi này. Hầu hết các exception không thể sử lý bằng programs. Tuy nhiên, các thông báo lỗi sẽ hiện ra:

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects

 ở dòng cuối thông báo chuyện gì đã xảy ra. Các Exception có nhiều loại,được in ra ở đầu các messages.
Phần còn lại sẽ thông báo chi tiết loại của exception và điều gì đã xảy ra. Nó thông báo contextexception xảy ra

2. Xử lý Exception

Có thể viết chương trình xử lý Exception được định trước. Các Exception thường được phát hiện sau khi chạy thử các trương trình hoặc do kinh nghiệm của người code khi biết chắc chắn nó sẽ xảy ra.
 Xét một ví dụ: Báo cho người dùng nhập vào cho tới khi là một số nguyên:

>>> while True:
...     try:
...         x = int(raw_input("Please enter a number: "))
...         break
...     except ValueError:
...         print "Oops!  That was no valid number.  Try again..."
...

+Đầu tiên, mệnh đề try được thực hiện
+Nếu không có Exception nào xảy ra trong suốt quá trình thực hiện mệnh đề try thì mệnh đề Except sẽ được bỏ qua
+Nếu trong quá trình thực hiện  mệnh đề try mà có exception xảy ra:
 - Nếu exception xảy ra trùng với tên exception trong mệnh đề except thì thông báo xé hiện ra và lại quay lại tiếp tục mệnh đề try
 - Nếu exception xỷ ra không trùng thì thông báo lỗi sẽ xảy ra và không thực hiện tiếp mệnh để try nữa

Một mệnh đề try có thể có nhiều hơn một mệnh đề except . Và hanhdler chỉ xử lý except xảy ra trong mệnh đề try. Một mệnh đề except có thể có nhieefy loại exception:
... except (RuntimeError, TypeError, NameError):
...     pass

 Mệnh đề except cuối cùng có thể bỏ qua tên của ngoại lệ, nhưng hãy cẩn thận vì nó có thể làm bỏ qua lỗi của chương trình

Câu lệnh Try...except còn có một mệnh đề else ở sau tất cả các mệnh đề except . Nó được dùng cho đoạn mã sẽ thực hiện nếu mệnh để Try không đưa ra bất kì một exception nào. Ví dụ:
 
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        print arg, 'has', len(f.readlines()), 'lines'
        f.close()

Sử dụng mệnh đề else giúp chúng ta ngăn ngừa  được exception ngẫu nhiên gây ra bởi mệnh đề try mà lại không được nêu ra trong mệnh đề except


3. Câu lệnh Raise 
Câu lệnh Raise cho phép tác động đến một exception cụ thể để cho nó  xảy ra:


>>> raise NameError, 'HiThere'
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: HiThere

Đối số đầu tiên đưa ra tên của exception đó, đối số thứ 2 xác định đối số của except đó

4.Exception do người dùng định nghĩa

Bằng cách tạo ra một Exception class mới, người dùng có thể tự định nghĩa một exception. Các exception thường được thừa kế từ các exception class bằng cách trực tiếp hoặc gián tiếp.

>>> class MyError(Exception):
...     def __init__(self, value):
...         self.value = value
...     def __str__(self):
...         return repr(self.value)
...
>>> try:
...     raise MyError(2*2)
... except MyError as e:
...     print 'My exception occurred, value:', e.value
...
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'


Trong ví dụ này, hàm __init__ bị ghi chèn lên. Một thuộc tính giá tị mới được tạo ra.  Thuộc tính này thay thế cho các cách thức mặc định tạo ra thuộc tính args

Thứ Hai, 23 tháng 12, 2013

Logging Application Errors

Logging Application Errors


Dù code của bạn đúng 100% thì một lúc nào đó bạn cũng sẽ tìm thấy các exceptions.
Nếu app của bạn chạy trong production mode, flask sẽ đưa ra một page rất đơn giản cho bạn và log lại các exception tới Logger( các logger có tác dụng ghi lại các message)
 Nhưng bạn có thể làm tốt hơn thế với một số các các thiết lập sau:

 Error mails


ADMINS = ['yourname@example.com']
if not app.debug:
    import logging
    from logging.handlers import SMTPHandler
    mail_handler = SMTPHandler('127.0.0.1',
                               'server-error@example.com',
                               ADMINS, 'YourApplication Failed')
    mail_handler.setLevel(logging.ERROR)
    app.logger.addHandler(mail_handler)


 +create a SMTPHandler, sẽ gửi các mail báo lỗi cho bạn khi chương trình chay trên localhost 127.0.0.1 , với Subject là 'Your Application Failed'

+ Các Handler có thể chỉ gửi khi có lỗi hoặc gửi các tin nhắn cảnh báo theo ý của chúng ta


Logging to a file


Mặc dù bạn có thể nhận mail cảnh báo nhưng có lẽ bạn vẫn thích lưu lại các cảnh báo và báo lỗi ở một file của bạn để có được nhiều thông tin hơn. Bạn có thể làm theo cách sau:


if not app.debug:
    import logging
    from themodule import TheHandlerYouWant
    file_handler = TheHandlerYouWant(...)
    file_handler.setLevel(logging.WARNING)
    app.logger.addHandler(file_handler)


có thể dụng các handler sau:

FileHandler : ghi laị các tin trong filesystem
RoratingFilehandler: ghi lại các tin trong filesystem và luân phiên sau một lượng tin nào đó











Thứ Ba, 17 tháng 12, 2013

Using SQLite 3 with Flask




SQLite 3 sử dụng để mở các database connection  và đóng chúng lại khi tắt context. Khi chúng ta mở một database connection thì sẽ sinh ra một connection object() được gọi là db

Một ví dụ:

import sqlite3
from flask import g

DATABASE = '/path/to/database.db'

def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = connect_to_database()
    return db

@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()


Tất cả các application cần khi sử dụng database contection là một active app context. Get_db() function có thể tạo ra một current database connection. Khi context bị hủy thì các database connection cũng sẽ bị ngăt


Initial schema:


Các kết nối Database cần các schema . các schema.sql file  tạo ra các database cho các app.
để tạo ra một database dựa trên một schema thì có thể dùng function sau:



def init_db():
    with app.app_context():
        db = get_db()
        with app.open_resource('schema.sql', mode = 'r') as f :
              db.cursor().executescript(f.read())
        db.comit()






























Chủ Nhật, 15 tháng 12, 2013

Nếu một ngày nào đó mình được lấy lương, mình sẽ mua một cây guitar thật đẹp thay cho cây guitar .' nhà mình. Nào, cố lên !!!

Kỹ thuật LOGGING

Kỹ thuật LOGGING <P2>


Bổ xung hơn các kiến thức thực tế về Logging, bài trước chỉ mang tính lý thuyết

Logging tutorial


Các từ khóa quan trọng của Logging API được cung cấp bởi một thư viện chuẩn Python. Thư viện chuẩn Python hỗ trợ cho việc viết các log messages to file, HTTP GET/POST locations, Email via SMTP, generic Socket, hoặc OS- specific logging mechansms. Hoặc bạn có thể tạo ra các  log destination class cho riêng mình với các điều kiện cụ thể mà các built-in classes không có

Để quản lý nhiều hơn size file, bạn có thể sử dụng RotatingFileHandler:

import glob
import logging
import logging.handlers

LOG_FILENAME = 'logging_rotatingfile_example.out'

# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
              LOG_FILENAME, maxBytes=20, backupCount=5)

my_logger.addHandler(handler)

# Log some messages
for i in range(20):
    my_logger.debug('i = %d' % i)

# See what files are created
logfiles = glob.glob('%s*' % LOG_FILENAME)

for filename in logfiles:
    print(filename)

 kết quả sẽ hiện ra 6 file, hiển thị các phần log history của applicaticon
logging_rotatingfile_example.out
logging_rotatingfile_example.out.1
logging_rotatingfile_example.out.2
logging_rotatingfile_example.out.3
logging_rotatingfile_example.out.4
logging_rotatingfile_example.out.5

The most current file sẽ là LOG_FILENAME
Mỗi lần nó tách size limit thì file sẽ được đổi tên với suffix là ".i"
maxBytes dùng để giới hạn size của file

Tính năng useful khác của logging là hiển thì các log messages khác nhau trong các level khác nhau.

import logging
import sys

LEVELS = {'debug': logging.DEBUG,
          'info': logging.INFO,
          'warning': logging.WARNING,
          'error': logging.ERROR,
          'critical': logging.CRITICAL}

if len(sys.argv) > 1:
    level_name = sys.argv[1]
    level = LEVELS.get(level_name, logging.NOTSET)
    logging.basicConfig(level=level)

logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical error message')
 

chạy file trên ở level Debug hoặc Info thì các log message sẽ hiện ra khác nhau như sau:
$ python logging_level_example.py debug
DEBUG:root:This is a debug message
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical error message

$ python logging_level_example.py info
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical error message
 
Các bạn thấy rằng, trong mỗi log messages đều có root , Và bạn có thể thay đổi được điều này.
Hãy xem một ví dụ log từ các module khác nhau để dễ dàng phát hiện ra file nguồn của các messages:

import logging

logging.basicConfig(filename = 'hehe.log', filemode = 'w', level=logging.WARNING)
logger1 = logging.getLogger('package1.module1')
logger2 = logging.getLogger('package2.module2')

logger1.warning('This message comes from one module')
logger2.warning('And this message comes from another module')

kết quả output:
 
$ python logging_modules_example.py
WARNING:package1.module1:This message comes from one module
WARNING:package2.module2:And this message comes from another module
  
trong file có tên "hehe.log"





Communication protocol HTTP 


Có nhiều protocol để giao tiếp như TCP, IP, HTTP, FTP...nhưng nghe bà con nói học làm web thì phải nắm chắc HTTP nó mới dễ hiểu. Anh em xem qua cái này phát

HTTP: HyperText Tranfer Protocol tạm hiểu là một giao thức làm việc trên quy tắc trao đổi chính là ''siêu văn bản" thông qua internet,( với hai hình thức chính là "Get" và "Post"), với nhiệm vụ chính là nhận thông tin từ webClient về webserver và nhận phản hồi từ Webserver  thông qua một interface là một trang web, cho phép  dùng cho world Wide web WWW.  HTTP là giao thức ứng dụng của bộ giao thức nền tảng TCP/IP

Mô hình HTTP


Giao thức HTTP là một giao thức có dạng yêu cầu/đáp ứng. Khi một máy khách gửi một yêu cầu đến máy chủ gồm phương thức yêu cầu (gồm GET, POST, HEAD,…), URI, phiên bản giao thức, kèm với thông điệp kiểu MIME gồm các tham số chỉnh sửa của yêu cầu, thông tin máy khách và nội dung chính thông qua kết nối đến máy chủ. Máy chủ sẽ đáp ứng bằng dòng trạng thái, gồm phiên bản giao thức thông điệp và mã thông báo thành công hay lỗi, kèm với thông điệp kiểu MIME có chứa thông tin về máy chủ, các thông tin thêm về đối tượng và nội dung chính của đối tượng.

Hầu hết giao tiếp HTTP được khởi tạo từ UA và một yêu cầu sử dụng nguồn tài nguyên trên máy chủ gốc (Origin Server - O). Trong trường hợp đơn giản nhất, giao tiếp này có thể được thực hiện thông qua một kết nối duy nhất (v) giữa UA và O như Hình 1.




Tình huống phức tạp hơn xảy ra khi có một hoặc nhiều điểm trung gian trong chuỗi yêu cầu/đáp ứng. Có ba dạng trung gian phổ biến như: proxy, gateway và tunnel (Một chương trình trung gian hoạt động như một điểm trung chuyển giữa hai kết nối). 
    Proxy: là một điểm chuyển tiêp, nhận các yêu cầu từ một Url, viết lại tất cả hoặc một phần yêu cầu và chuyển tiếp yêu cầu đã đươc định dạng về webserver xác định bởi Url.
    Gateway: Hoạt động như một phần phía trên của một máy chủ khác UA và nếu cần thiết thì sẽ biên dịch và gửi yêu cầu tới máy chủ khác UA
     Hoạt động như một điểm trung chuyển giữa hai kết nối mà không cần biên dịc lại yêu cầu. Các tunnel sử dụng cần chuyển yêu cầu qua một điểm trung gian khác( như Tường lửa ..) mặc dù điểm này có thể không hiểu nội dung thông điệp.

  

                

Hình 2 mô tả ba điểm trung gian (A, B và C) giữa tác nhân người dùng và máy chủ gốc. Một thông điệp yêu cầu/đáp ứng sẽ truyền qua toàn bộ các điểm này bằng bốn kết nối riêng biệt. Mỗi điểm trung gian có thể được tham gia vào nhiều kết nối và các giao tiếp khác tại cùng một thời điểm. Ví dụ, điểm B có thể nhận yêu cầu từ nhiều máy khách khác ngoài A, hay chuyển tiếp yêu cầu đến nhiều máy chủ khác ngoài C đồng thời với việc xử lý yêu cầu từ điểm A.



Bất cứ thành phần nào tham gia kết nối mà không hoạt động như một tunnel đều có thể sử dụng một bộ nhớ đệm (cache) nội bộ để xử lý các yêu cầu. Bộ nhớ đệm giúp cho chuỗi yêu cầu/đáp ứng được xử lý nhanh hơn khi một trong các thành phần tham gia trong chuỗi có yêu cầu về dữ liệu. Hình 3 sau đây minh họa chuỗi yêu cầu/đáp ứng từ điểm UA đến điểm B khi tại điểm B có lưu trữ dữ liệu tạm thời từ điểm O (thông qua điểm C), không được lưu trữ tạm thời tại UA hay tại điểm A.

    Người ta goi HTTP là một giao thức Stateless( phi trạng thái), nghĩa là các nhóm lệnh hoạt động độc lập với nhau, lệnh sau không có bất kì mối liên hệ gì với nhóm lệnh trước. Đây là một hạn chế của HTTP vì nó rất khó trong việc thiết kế các website thông minh có thể sử lý nhanh nhạy các yêu cầu phức tạo và đa dạng của người dùng nhập vào.
    An toàn bảo mật của giao thức HTTP phiên bản 1.1 (phiên bản HTTP mới nhất) cũng là một vấn đề hết sức quan trọng đối với các nhà phát triển ứng dụng, nhà cung cấp thông tin và người dùng cuối. Các vấn đề an toàn bảo mật cần xem xét bao gồm: Bảo vệ thông tin cá nhân (lạm dụng thông tin đăng nhập máy chủ, truyền thông tin nhạy cảm, mã hóa thông tin nhạy cảm ở dạng URI, vấn đề riêng tư khi kết nối để nhận các tiêu đề), các tấn công tệp tin và tên đường dẫn, hệ thống tên miền (Domain Name System – DNS) giả, các tiêu đề giả, các vấn đề sắp xếp nội dung, vấn đề xác thực và máy khách không hoạt động, vấn đề về proxy và cache, các tấn công từ chối dịch vụ trên proxy. Do đó, để đảm bảo an toàn khi truyền thông trên mạng, có thể sử dụng HTTPS (Hypertext Transfer Protocol Secure – đây là sự kết hợp giữa giao thức HTTP và giao thức bảo mật SSL (Secure Socket Layer) hay TLS (Transport Layer Security) cho phép trao đổi thông tin một cách bảo mật trên Internet).
 

Ứng dụng

HTTP được ứng dụng trong các phần mềm máy chủ Web và trong các trình duyệt Web để trao đổi thông tin giữa máy chủ Web và máy khách Web trên môi trường mạng. Trong Thông tư số 01/2011/TT-BTTTT ngày 04/01/2011 của Bộ Thông tin và Truyền thông Công bố Danh mục tiêu chuẩn kỹ thuật về ứng dụng công nghệ thông tin trong cơ quan nhà nước quy định Bắt buộc áp dụng tiêu chuẩn HTTP phiên bản 1.1 và được xếp vào nhóm Tiêu chuẩn về kết nối.



Thứ Bảy, 14 tháng 12, 2013

Cái khó nhất là đọc tiếng anh vì mình chằng hiểu nó là cái gì?????===> học học học

Logging

Logging là gì?


Giống Print, logging là một kĩ thuật Debugging, nhưng có level cao hơn print.
Logging dùng để ghi lại những thông tin cần thiết khi chạy một chương trình như info, log lỗi...
Thông tin log có thể được in ra màn hình hoặc file log.

Logging có 5 mức độ khác nhau ( thường được dùng): DEBUG, INFO, WARNING, ERROR và CRITICAL theo trật tự ưu tiên tăng dần.


Khi sử dụng logging cần khai báo và config:
import logging
logging.basicConfig(filename='example.log',level=logging.INFO)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too') 
 Trong ví dụ trên:
+ File log để ghi thông tin là "logging_example.out"
Nếu không config file log, output sẽ được print ra màn hình.
+ Chế độ min là INFO.
Khi chạy, các thông tin ở mức độ INFO và WARNING sẽ được print ra.
Chế độ DEBUG thấp hơn INFO nên không được print ra.


Thứ Năm, 12 tháng 12, 2013

Làm một vòng quanh các python's library :) (tiếp)

Làm một vòng quanh các python's library :)  (tiếp)

 

1. Định dạng đầu ra (output formatting)

Module Repr(): hiển thị vắn tắt các containers( kiểu kiểu như là các đối tượng chứa) lớn hoặc bị trùng lặp nhau:
>>> import repr
>>>repr.repr('conbocon') ===> "'conbocon'"===> đầu ra dạng string thêm "  "
>>>repr.repr(set('con bò')) ===> set(['b', 'c','n','o'])===> hiển thị các kí tự có mặt trong container (theo thứ tự a,b..)

 Module 'pprint' - pretty print 

có tác dụng in các dữ liệu lớn một cách khoa học hơn giúp cho người đọc dễ nhận biết mà interpreter có thể đọc và operation được. Khi kết quả dài hơn một dòng thì "prety print" sẽ xuống dòng ,thụt đầu dòng và hiển thị dấu thụt đầu dòng ===> người dùng dễ dàng đọc dữ liệu hơn. ex:
>>> import pprint
>>> t = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta',
...     'yellow'], 'blue']]]
...
>>> pprint.pprint(t, width=30)
[[[['black', 'cyan'],
   'white',
   ['green', 'red']],
  [['magenta', 'yellow'],
   'blue']]]
 
 
second argument đơn giản để bạn căn độ rộng dữ liệu ban muốn thể hiện, nghĩa là số kí tự không quá lượng width ấy. ví dụ bạn cho "width = 10" thì mỗi dòng sẽ hiển thị một số lượng kí tự là 10( cả while space...).

Module "textwrap "
Sửa file text. Nó căn cho file text của bạn chia dòng ra, hiển thị theo độ rộng mà bạn thích . width = 40 , sẽ có tối đa 40 kí tự hiện trên một dòng :)

>>>import textwrap
>>>textwrap.textwap('hehe haha hihi', width=3)
===>hehe -có một  whitespace nhé :)
          haha 
          hihi


2. Templating - quá trình tạo ra mẫu

module "string" cung cấp một "template" class với cú pháp đơn giản và bạn có thể dễ dàng edit chúng. Điều này cho phép bạn có thể tùy biến các application mà không cần phải thay đổi nhiều

>>>from string import Template 
>>>x = Template('${Obj}nh has $$10 for $obj')
>>>x.substitute(Obj = 'tha', object = 'Hung')
===>'thanh has $10 for Hung'

$ : là placehoder (một loại kí tự đánh dấu)==>tên biến hợp lệ của python,'{}' giúp Obj khong bị ngăn cach với kí tự trước(sau) nó.==>'$$' $ đầu tiên tạo một single escapes tránh $ thứ 2 bị lẫn với placehoders ==> '$' cuối đánh dấu kí tự hợp lệ tiếp theo của python

Khi $  không được cung cấp đầy đủ từ một dict hay người dùng nhập thiếu arguament thì sẽ xuất hiện lỗi. safe_substitute() khắc phục điều đó, nó sẽ giữ nguyên spacehoders nếu data nhập vaò bị thiếu

>>>from string import Template 
>>>x = Template('${Obj}nh has $$10 for $obj')
>>>x.substitute(Obj = 'tha')
===>'thanh has $10 for $obj'
 
 Template subclass có khả năng xác định một delimiter ( một phần tử giới hạn) tùy biến. Dùng dấu % như một spacehoder :

>>> import time, os.path
>>> photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']
>>> class BatchRename(Template):
...     delimiter = '%'
>>> fmt = raw_input('Enter rename style (%d-date %n-seqnum %f-format):  ')
Enter rename style (%d-date %n-seqnum %f-format):  Ashley_%n%f

>>> t = BatchRename(fmt)
>>> date = time.strftime('%d%b%y')
>>> for i, filename in enumerate(photofiles):
...     base, ext = os.path.splitext(filename)
...     newname = t.substitute(d=date, n=i, f=ext)
...     print '{0} --> {1}'.format(filename, newname)

img_1074.jpg --> Ashley_0.jpg
img_1076.jpg --> Ashley_1.jpg
img_1077.jpg --> Ashley_2.jpg

Logging

Module "logging' cung cấp một hệ thống loging rất linh hoạt và đầy đủ các tính năng. Logging system được hỗ trợ trực tiếp từ python hoặc có thể được load từ một configuration file mà user có thể thay đổi được cho logging tùy biến mà không cần sửa đổi application
Xét ví dụ đơn giản,log messagers được chuyeent tới một file hoặc tới sys.stderr và được ghi tại đó
 
import logging
logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')

Đầu ra của đoạc code trên:

WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down
  
Hiểu được đến đây thôi :)







Thứ Tư, 11 tháng 12, 2013

Nói chung là ƯC VL. chung quy lại cũng là do mình dốt nên chẳng trách dc ai

Classes

http://docs.python.org/2/tutorial/classes.html

Cấu trúc class:


class Classname:
       <statement 1>

 
       <statement n>
Các class phải được định nghĩa trước khi được sử dụng
Thực tế , các statement trong class chính là các định nghĩa function
Khi một class difinition kết thúc, chúng ta sẽ tạo ra được một class object
Class object
Class objectsn hỗ trợ hai kiểu operations là attribute references và instantiation
1. Attribute references trong class có cú pháp chuẩn :
   Obj.name
Khi một Class Object được tạo ra thì sẽ có một namespace được tạo ra.Các name tham chiếu thích hợp là tất cả các tên tồn tại trong namespace đó
ví dụ:

class MyClass:
    """A simple example class"""
    i = 12345
    def f(self):
        return 'hello world'
thì MyClass.i và MyClass.f ở đây là các Valid Attribute references sẽ return lại số i và f function. Bạn có thể thay đổi giá trị của i bằng một phép gán
    __doc__ là một valid atrribute và MyClass.__doc__ sẽ return lại docstring của Class

Class instantiation được sử dụng như function instantiation. Nghĩa là coi như class object là một parameterless function . tạo ra một instance mới của class. ví dụ:
 x = MyClass
 tạo ra một instance mới của class và gắn nó với local variable x

 "__init__()" Method
Nhằm tạo ra một object rỗng để thỏa mãn các trạng thái khởi tạo xác định mà chúng ta muốn:
   
def __init__(self):
       self.data = []

Khi sử dụng __init__() method, class instantiation sẽ tự động liên kết __init__() với class instance mới vừa đc tạo x

__init__() method có thể có các đối số linh hoạt hơn:


Class complex():
  def __init__(self,realpart,imagpart):
      self.r = self.realpart
      self.i = self.imagpart


x= complex(3,4)
x.i  ==>4
x.r ==>3

Instance Object:

instance object chỉ cho phép operation với attribute reference . Có hai loại valid attribute names là "data attribite " và "method"

Ví dụ:
x.counter = 1 # x  đã được gọi như ở trên

thì x.couter chính là data attributer

"method" là một function thuộc một instance object
trong ví dụ trên:
MyClass.f là một function
x.f là một "Method object" là một function thuộc class object

Thông thường ta có thể gọi hàm f theo cách sau:
x.f()
ta có thể lưu nó lại và gọi khi cần:
ví dụ:

xf=x.f
while True:
    print xf()

Cứ như vây, hàm f sẽ được gọi cho đến khi bạn kết thúc chương trình 
Thực ra thì bạn chằng cần lưu cũng được vì đoạn trên có thể viết đơn giản như sau:
x = MyClass()
while True:
    print x.f()
và nó sẽ cứ chạy mãi .he. Nhưng với các chương trình dài nó có thể có nhiều tác dụng.heheh


còn nữa, nhưng học đến đây để viết class's syntax thôi :))




 


 

Flask

Flask

 

http://flask.pocoo.org/docs/
https://github.com/mitsuhiko/flask/tree/master/flask

Học Flask để làm gì? Ờ, đơn giản nó dùng để tạo ra các complete web application
   Nếu bạn muốn đi sâu hơn nữa vào nội dung của Flask, bạn có thể check out tài liệu API. Các  bản mẫu chung được miêu tả trong  phần "Pattern for Flask"
  Flask sử dụng hai thư viện hỗ trợ : engine mẫu JinJa2 và bộ công cụ WSGI werkzeug

User's Guide

Trong phần này của tài liệu, Chủ yếu làvăn xuôi, bắt đầu với một số Background information về Flask. Rồi sau đó từng bước hướng dẫn phát triển Web với Flask

Lời tựa
Hãy xem phần này trước khi bạn bắt đầu. Hi vọng nó sẽ giải quyết các câu hỏi về mục đích cũng như kết quả của Project này. bạn có thể hoặc khong cần sử dụng chúng tùy vào mỗi người

Flask là một microflamework

Cấu hình và quy ước

 Flask có một số configuration values (giá trị cấu hình-trong việc lựa chon cấu hình), các mặc định phù hợp  và một số quy ước khi chương trình dc bắt đầu. Các mẫu quy ước và các file tĩnh được tập hợp bên trong các subdirectories trong mã nguồn python ứng dụng của bạn với các static name và temparate name riêng biệt. Chúng có thể chuyển đổi được khi chương trình được khởi động

Phát triển với Flask


   Khi bạn đã cài flask và chạy chúng, bạn sẽ tìm thấy sự đa dạng của các mở rộng có sẵn trong chưongw trình để tích hợp các project của bạn cho production. Nhóm flask Core đánh giá các mở rộng này và đẳm bảo các extension đã được chấp nhận này không bị phá vỡ trong các phiên bản sau này
   khi codebase của bạn phát triển, bạn có thể tự do tạo ra các quyết đinh thiết kế phù hợp cho project của bạn. Flask sẽ tiếp tục cung cấp cho bạn một lớp keo gắn đơn giản (a very simple glue layer ) để chương trình của bạn tốt nhất. bạn có thể thục hiện các mô hình tối ưu trong SQLAlchemy hoặc các công cụ database khác............
 Flask có chứa nhiều các hooks để điều chỉnh các behavier của nó. Nếu bạn cần điều chỉnh nhiều hơn thì trong Flask class tạo lên các subclassing....

Installation

http://flask.pocoo.org/docs/installation/#installation

Flask phụ thuộc và hai thư viên là jinja2 và werkzeug .Werkzeug là một toolkit cho WSGI - Giao diện Python chuẩn giữa các ứng dụng web và một sự đa dạng các server cho cả phát triển và triển khai . Jinja2 đưa ra các khuôn mẫu
 Để thực hiện tất cả những thứ đó trên máy tính của bạn , có rất nhiều cách. Và một cách tối ưu là dùng virtualent: Một không gian ảo khiến abnj có thể cài đặt bất kì cái gì lên đó mà không hề ảnh hưởng đến các project khác

Quickstart


http://flask.pocoo.org/docs/quickstart/#quickstart

Chắc chắn rằng, virtualenv của bạn đã cài đặt Flask
Một ứng dụng nhỏ:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()


trong ví dụ trên:
1. đầu tiên chúng ta goi Flask ra từ flask
2. Tạo ra một instance app. Đối số đầu tiên là tên của module hay package của ứng dụng. Nếu bạn sử dụng một single module thì bạn nên sử dụng __name__ vì còn phụ thuộc vào việc nó được khởi động như một application hay là được import như module thì tên sẽ khác nhau.(__main___ có tác dụng so sananh name với tên thực tế được nhập) Điều này là caanf thiết để cho Flask biết nơi để tìm các template và các static files và thực thi chúng
3. Chúng ta sử dụng Route() decorator để chỉ cho Flask biết URL nào khởi động Function của chúng ta
 4. The function được nhận một cái tên để tạo ra URL kiên kết với Function riêng đó, và trả về những gì bạn muốn hiển thị trên trình duyệt của người dùng
5. Cuối cùng chúng ta sử dụng hàm Run() để chạy ứng dụng đó trên local server của chúng ta. If __name__== "__main_" là để chắc chắn rằng chúng ta chạy ứng dụng đó như một script chứ không phait từ một module được import 


để stop server chúng ta ấn ctrl c
 ứng dụng sẽ được hiện trên host : http://127.0.0.1:5000/ khi chúng ta chạy nó


 Để đổi tên host, chúng ta có thể làm như sau:
                      Run(host = '0.0')
Khi ấy host hiển thị sẽ là : http://0.0.1:5000/


   Chế độ Debug:
Là chế độ khởi chạy chương trình bằng các dòng lệnh mà không cần thao tác bằng tay mỗi khi chúng ta change code
                      .....
                      app.debug = True
                      run()
hoặc
                      run(debug=True)



Routing
 
các ứng dụng web hiện nay có các URL tuyệt vời. Điều này giúp cho người dùng có thể nhớ được các URL, đặc biệt thuận tiện cho các ứng dụng được sử dụng trên các thiết bị lưu động. Nếu người dùng có thể trực tiếp tới trang được yêu cầu chỉ bằng một cái click  vào bảng liệt kê danh mục ứng dụng (index)
 thì người ta sẽ rất thích và sẽ quay trở lại
    The Route() decorator đùng để liên kết các function tới URL :

@app.route('/')
def index():      => cai này giúp khi bạn nhấn chữ "G" trên Url sẽ hiện google.com.Kiểu thế
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello World'

 Bạn có thể tạo ra các phần nhất định cho một URLs động và  đính nhiều Ruler  tới một Function

 Các variable rules (là các rule có thể tùy biến)
Để add các variable parts và một Rule, bạn có thể dùng các section đặc biệt như <variable_name>, được côi như là các keywords arguament để liên kết với các function của bạn. hoặc chúng ta có thể dùng <converter: variable_name> để xác định rõ một rule với Converter:

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

1. dùng để đưa ra user profile cho người dùng khi bạn đăng nhập vào một trang web
2. Hiển thị  mã ID


Xây dựng URL


Để xây dựng nên một Url liên kết với một function , bạn có thể dùng hàm url_for(a,b)
a:tên hàm liên kết
b:một số các keyword arguaments phù hợp với mỗi variable part của Url
Đây là một hàm tuyệt vời

>>> from flask import Flask, url_for
>>> app = Flask(__name__)
>>> @app.route('/')
... def index(): pass
...
>>> @app.route('/login')
... def login(): pass
...
>>> @app.route('/user/<username>')
... def profile(username): pass
...
>>> with app.test_request_context():
...  print url_for('index')
...  print url_for('login')
...  print url_for('login', next='/')
...  print url_for('profile', username='John Doe')
...
/
/login
/login?next=/
/user/John%20Doe


HTTP methods
HTTP method chuyển đến cho server những gì mà khách hàng muốn làm với trang được yêu cầu
GET:
Upload dữ liệu từ webserver đến webclient 
POST:
upload dữ liệu từ webclient đến webserver

Flask giúp chúng ta sử lý các GET questions và POST questions

Ví dụ về GET questions là tạo ra "localhost: 5000" ở đầu
Ví dụ về POST questions là :

from flask import Flask, request
app = Flask(__name__)

@app.route("/", methods=["POST", "GET"])
def index():
    if request.method == "GET":
        return '<html><body><p>Chao ban, ban ten la gi?</p><form action="." method="POST"><input type="text" name="name"/><input type="submit" value="Gui ten"/></form></body></html>'
    elif request.method == "POST":
        return '<html><body><p>ban <strong>%s</strong>! la con cun</p><form action="." method="POST"><input type="text" name="name"/><input type="submit" value="Gui ten"/></form></body></html>' % request.form["name"]
    else:
        return 'Unknown method'



if __name__ == "__main__":
    app.run(host='0.0.0.0')


ở đây:
    tạo ra url http://localhost:5000
    request co the la GET hoach POST
    la GET khi nguoi dung danh url vao browser de load
    la POST khi nguoi dung submit form
    o vi du nay chung ta co form voi mot input la name


Để tạo một text input, bạn dùng tag <INPUT> với attribute TYPE="text". Những gì bạn viết vào ô trống trên đây sẽ là dữ liệu được thu thập
Attribute NAME="name" được dùng để đặt tên cho input, trong đó name là tên do bạn lựa chọn


Static file

Để tạo ra các URL cho các Static file bạn sử dụng cấu trúc:

url_for('static', filename = "style.css")

 Rendering template

một ví dụ nhé:
from flask import Flask, render_template_string
app = Flask(__name__)


@app.route('/')
@app.route('/<name>')
def hello(name='would'):
    return render_template_string('''<!doctype html><title>hello {{name}}!</title><h1>Hello {{name}}, {{name}} dep trai!<h1>''', name= "thanh")

if __name__ == '__main__':
    app.run()

nó sẽ in ra Hello thanh, thanh dep trai :)

Sự tạo ra một HTML trong python không đơn giản, khá khó khăn bởi vì bạn phải làm HTML escaping của bạn để giữ cho application đảm bảo. vì thế Flask configures





  

 Các khái niệm cơ bản trong tin học

1. Host: là thiết bị đầu cuối trong một mạng để người dùng tham gia chia sẻ tài liệu . ex: máy tính của người dùng, điện thoại...Mỗi host hình thành nên 1 nút mạng
2. Media: là các kênh vật lý , là môi trường truyền dữ liệu
3. LAN: <Local Area Network >mạng cục bộ
4. MAN <Metropolitian Area Network> mạng khu vực
5. WAN <Wide Area Network> : mạng rộng
http://uet.vnu.edu.vn/~anhnv/courses/thcs/12_Mang_may_tinh.pdf
6. Local server :là server chạy trên máy mày, ở đây nói đến http server. Các web framework python thường có sẵn server để tiện develop.
7. Production machine: là máy sẽ chạy code để phục vụ mục đích thật (chứ không phải để chạy chơi chơi, chạy để develop), khi ấy không thể dùng mấy cái server develop được vì mấy cái server đấy không đầy đủ tính năng/ không bảo mật.
8. Ruler : String mẫu

Lệnh tạo một file trong file system:
sudo gedit /ect/apt...../filename

lệnh sửa file:
sudo nano /../...
fff

Thứ Ba, 10 tháng 12, 2013

Chương 10 : Tóm tắt một lượt thư viện tiêu chuẩn

http://docs.python.org/2/tutorial/stdlib.html

10.1 Giao diện hệ thống hiện hành

Module Os cung cấp hàng tá các module cho quá trình tương tác với hệ thống hiện hành:
 
>>> import os
>>> os.getcwd()      # Return the current working directory
'C:\\Python26'
>>> os.chdir('/server/accesslogs')   # Change current working directory
>>> os.system('mkdir today')   # Run the command mkdir in the system shell
0


Hãy chắc chắn dùng '' import os " thay cho kiểu :"from os import * ", điều này sẽ giữ cho Os.open() được ánh xạ từ built-in open() function ,thứ mà hiện hành theo nhiều cách khác nhau
 Các built- in dir() và help() function là các hàm bỗ trợ quá trình tương tác cho working với các module lớn như "os":

>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>


Hỗ trợ cho các daily file và các nhiệm vụ quản lý directory, module 'Shutil" cung cấp một giao diện cấp cao hơn dễ dàng sử dụng hơn:

>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
>>> shutil.move('/build/executables', 'installdir')

10.2 File wildcard

Module Glob cung cấp một function để tao lên một list các file được file wildcard tìm thấy theo yêu cầu

>>> import glob
>>>Glob.glob('*.py*')
[thanh.py, conbo.py]

10.3 Các đối số dòng lệnh<command line arguments>

Các script có ích nói chung thường được tiến hành nhờ các đối số dòng lệnh. Các đối số này được lưu trữ ở trong "argv" của module sys có thuộc tính như môt
list. ví dụ dưới đây là kết quả đầu ra của quá trình chạy " python demo.py one two three" với dòng lệnh:
 >>>import sys
>>>print sys.argv
['demo.py', 'one',' two', 'three']

Module "getopt()" tiến hành sys.argv sử dụng quy ước của UNIX getopt() function
Quá trình sử lý các dòng lệnh mạnh mẽ và tiện lợi hơn nhờ được cung cấp bởi "argparse" module

10.4 Lỗi lệch hướng đầu ra và sự kết thúc chương trình

 Module "sys" có thuộc tính stdin, stdout, và stderr. sau này huux ích cho hành động cảnh báo trước và tin nhắn lỗi báo cho chúng thấy khi stdout bị đổi hướng

>>>sys.stderr.write('wanring, log file not found starting a new one\n')
wanring, log file not found starting a new one

Cách thường sử dụng để kết thúc một script: sys.exit()

10.5 Đối sánh mẫu string ( pattern watching)


<Việc đối sánh mẫu diễn ra với nhiều lần thử trên các đoạn khác nhau của văn bản. Trong đó cửa sổ là một chuỗi M ký tự liên tiếp trên văn bản. Mỗi lần thử chương trình sẽ kiểm tra sự giống nhau giữa mẫu với cửa sổ hiện thời. Tùy theo kết quả kiểm tra cửa sổ sẽ được dịch đi sang phải trên văn bản cho lần thử tiếp theo>
huhj
 Module "re" cung cấp những công cụ biểu thức tiện dụng giúp sử lý các string thuận lợi. Khi đối sánh phức tạp và thao tác, các biểu thức này đưa ra những cách giải quyêt ngắn gọn và tối ưu
     
 còn nữa

10.6 Toán học

Module "math" được đưa ra để truy cập vào thư viện để floating point math
Module "random" cung cấp công cụ đê tạo ra một sự lựa chọn ngẫu nhiên:

>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(xrange(100), 10)   # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # random float
0.17970987693706186
>>> random.randrange(6)    # random integer chosen from range(6)
4
hàm này để đánh lô đề ngon :3

10.7 truy cập internet

Có một số module để truy cập và xử lý protocol internet <Trong lập trình máy tính, đây là một câu lệnh của chương trình đã được thông dịch hoặc biên dịch thành ngôn ngữ máy là loại ngôn ngữ, mà máy tính có thể hiểu và thực hiện. >
có hai cách đơn giản nhất là "urllib2" cho việc retrieving data từ  URLs và "smtplib" cho sending mail

>>> import urllib2
>>> for line in urllib2.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
...     if 'EST' in line or 'EDT' in line:  # look for Eastern Time
...         print line

<BR>Nov. 25, 09:43:32 PM EST

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()
 chú ý rằng ví dụ 2 cần một mailsever đang chạy trên localhost

10.8 Date và time

Module "datetime" cung cấp các class hỗ trợ cho việc sử lý date và time bằng cả hai cách đơn giản và phức tạp. Các cách tính toán date và time đêù được hỗ trợ.
Nguyên tắc của các thao tác là tách các bộ phân một cách hiệu quả cho định dạng đầu ra và sử lý chúng.
Module hỗ trợ các object có cùng chung múi giờ.
>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368 

10.9 Quá trình nén data

sự lưu trữ data và các định dạng quá trình nén đều được hỗ trợ bởi các module bao gồm: zlip, gzip, bz2, zipfile và tarfile

>>> import zlib
>>> s = 'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979






bai 14 pee
def f(n):
    a=[n]
    if n == 1:
        return []
    while n > 1:
        if n%2 == 0:
            n = n/2
            a.append(n)
        else:
            n= 3*n + 1
            a.append(n)
    return a
i = 2
max = len(f(i))
while i < 1000000:
    if max < len(f(i)):
        max = len(f(i))
        c=i
    i = i+1
print max ,c
cách tách các chữ khỏi 1 file:
 f = open('filename','r')
 p = f.read().split()
 strip(): tách một văn bản thành các dòng


Cách tách các số:
f = open('baitap.txt','r')
p = f.read()

x=[int(char) for l in p.split() for char in l]
print sum(k for k in x)

Thứ Hai, 9 tháng 12, 2013

Mục đích của việc lập có blog này là lưu trữ. hết

http://www.w3schools.com/