|
|
Có lẽ bác conmale nên lập một cái poll về việc này, xem bao nhiêu thành viên gặp tình trạng này, trên máy có cài addon gì hay không. Em cũng gặp phải trường hợp thế này. Nhưng lạ ở chỗ , đó đều là các lần để tiêu đề bài viết khá dài, khi thử cắt ngắn tiêu đề, gửi lại thì lại thấy bình thường. Post bài xong rồi chỉnh lại nguyên tiêu đề như mình muốn hoặc reply -> không gặp vấn đề gì cả.
P/S 1 : Em đã thử lại , post bài 2 lần nữa với tiêu đề dài, nhưng đều báo "Chủ đề bạn xem không còn tồn tại". Xin phép thử một lần nữa trong box tán gẫu, post với tiêu đề ngắn xem sao .
P/S 2: Thử nghiệm lại với bài viết này : /hvaonline/posts/list/18065.html#108403
Việc post bài hoàn toàn bình thường , lần trước và lần này cách nhau chỉ vài phút.
|
|
|
RonRoyII wrote:
Bác có thể cho tôi ebook để tự hoc có phải là tốt hơn ko bác hướng dẫn như vay khó hoc lém phiền bác cho ebool đi!
bồ nghĩ tớ ngồi copy / paste từ quyển ebook nào đó ra đây chắc
Nếu bồ muốn đọc dần, thì nhấn vào nút bản in bên dưới bài viết rồi in ra, hoặc tự góp lại thành ebook.
|
|
|
@Golden Autumn : Thời buổi mới mẻ này, tự design đê Nếu không thì có template tealo, được download nhiều, nhưng xấu
Các thuật ngữ trong thiết kế Magento
Giao diện
Giao diện là tập hợp các themes xác định các kết quả hiển thị hình ảnh và chức năng ở mặt tiền của một store trong Magento. Một giao diện có thể được gán ở tầng Website, hay tầng Store hoặc cả 2 qua admin panel
Nếu bạn gán giao diện ở tầng website, tất cả các store sẽ kế thừa giao diện của website. Bạn cũng có thể gán giao diện ở tầng store. Giả sử bạn có 4 store khác nhau dưới website "John's Panacea" như các kịch bản dưới đây :
1.Khai báo ở tầng Website
Nếu bạn muốn tạo ra sự "look and feel" thống nhất cho 4 store, bạn sẽ gán 1 giao diện ở tầng website, và cả 4 store sẽ kế thừa giao diện của Website
2.Khai báo ở tầng Store
Nếu bạn muốn thay đổi giao diện theo từng store, bạn có thể gán giao diện cho mỗi store, và cả store sẽ có 4 phong cách "look and feel" khác nhau.
Themes
Theme là sự kết hợp của layout, template và /hoặc các file skin tạo ra sự cảm nhận hình ảnh của store. Magento được xây dựng với khả năng load nhiều themes cùng 1 lúc, vì thế chúng ta phân biệt themes thành 2 loại lớn :
Theme mặc định
Tất cả các giao diện đi kèm với theme gọi là "default" là theme chính của giao diện. Khi bạn gán một giao diện cho store, ứng dụng tự động tìm kiếm theme "default" và load nó cho front-end. Khi chỉnh sửa thiết kế store, bạn có thể chỉ chỉnh sửa theme này, hoặc tạo ra một theme non-default và load nó bên cạnh theme mặc định. Thêm mặc định phải bao gồm tất cả các layout, template và skin yêu cầu để làm cho store không bị lỗi khi chạy và nó ở bậc thấp nhất trong thứ bậc các themes=
Theme không mặc định(non-default)
Một theme không mặc định có thể chứ nhiều hoặc chỉ những file mà bạn thấy cần thiết. Kiểu theme này được dùng để tạo ra các thiết kế theo thời vụ cho store mà không cần phải tạo ra một theme mặc định mới. Bằng cách tạo ra vài bức ảnh và cập nhật CSS, bạn có thể dễ dàng thay đổi store từ thông thường sang một giao diện dành cho Giáng sinh
Một theme bao gồm một vài hoặc tất cả các thành phần sau :
- Layout (nằm trong app/design/frontend/your_interface/your_theme/layout/)
Đây là các file XML cơ bản xác định cấu trúc block cho các trang khác nhau , điều chỉnh thông tin META và page encoding.
- Templates (nằm trong app/design/frontend/your_interface/your_theme/template/)
Đây là các file PHTML chứa các (X)HTML markup và các tag PHP cần thiết để tạo cấu trúc logic cho trình bày giao diện.
- Skin ( nằm trong skin/frontend/your_interface/your_theme/)
Chứa các file Javascript, CSS và ảnh cần thiết.
Blocks
Dưới đây là 2 loại block : Block cấu trúc ( màu xanh ) và Block nội dung ( màu cam )
Block là cách Magento phân biệt các mảng chức năng trong hệ thống và tạo ra các module để quản lý theo cả hình ảnh và chức năng. Có 2 kiểu block và chúng cùng làm việc để tạo ra kết quả hình ảnh :
Block cấu trúc
Đây là các block tạo ra cho mục đích duy nhất là gán cấu trúc hình ảnh cho một trang store như header, cột trái , cột giữa hay footer ( Biểu đồ 1 )
Block nội dung
Đó là các block cung cập nội dung thực sự bên trong block cấu trúc. Chúng tái hiện từng hàm tính năng trong một trang và tận dụng các template files để tạo ra (X)HTML được chèn vào block cấu trúc ( Biểu đồ 2 )
Thay vì bao gồm các template sau template như các ứng dụng eCommerce thông thường sẽ theo thứ tự tập hợp tạo thành toàn thể kết quả (X)HTML, Magento tập hợp và sắp xếp nội dung trang qua block .
Mình sẽ nói thêm sau này nếu các bạn thật sự có hứng thú với Magento, vì mình đưa ra đây có vẻ còn rất sớm
|
|
|
Theo dự đoán, dù ra đời chưa lâu , Magento là tương lai của Ecommerce, và onlinehack cũng đã làm việc với Magento một thời gian , trong luồng này, mình muốn trao đổi về việc thiết kế và check bug cho Magento :
Magento is a new professional open-source eCommerce solution offering unprecedented flexibility and control. With Magento, never feel trapped in your eCommerce solution again.
Các bạn có thể xem
demo store : http://demo.magentocommerce.com
demo admin : http://demo-admin.magentocommerce.com
Về yêu cầu hệ thống :
Linux or another UNIX-compatible operating system (Windows is also supported, but see the Known Issues section below)
Apache Web Server (1.x or 2.x)
PHP 5.2.0 or newer, with the following extensions/addons:
o PDO/MySQL
o MySQLi
o mcrypt
o mhash
o simplexml
o DOM
MySQL 4.1.20 or newer
A Sendmail-compatible Mail Transfer Agent (MTA) - Magento will connect directly to an SMTP server if you don't have an MTA
Trong chủ đề này, mình sẽ tiếp tục giới thiệu tới các bạn về việc thiết kế cho Magento. Và cũng mong những bạn đã từng làm việc với Magento chia sẻ kinh nghiệm với mình. Vì trên thế giới, Magento vẫn còn rất mới
|
|
|
phstiger wrote:
hoanglinh_nb wrote:
Chào mọi người ,em đang tìm cách sử dụng file .htaccess và .htpasswd nhưng có 1 số thắc mắc mong mọi người giải đáp giùm:
thứ nhất là theo hướng dẫn thì trước khi dùng phải xem host có hỗ trợ .htaccess ko.vậy thì làm sao để biết host có hỗ trợ hay ko?
Chẳng lẽ phải upload và test thử à, hay hosting nào cũng hỗ trợ.Đang đợi câu trả lời.....
Bạn nhập kí tự bất kì vào file .htaccess rồi up lên host và kiểm tra site của bạn, nếu support .htaccess thì sẽ có thông báo server error. Còn nếu ko có thông báo lỗi, thì host bạn không support.
Còn câu hỏi của hoanglinh_nb thì canh_nguyen đã trả lời giúp mình.
Thân
|
|
|
Tóm lược cách hoạt động
Một blog sẽ không phải là một blog nếu bạn không thể thêm bài viết mới, do đó, bạn làm thế này:
Code:
>>> blog = blog + ["Entry moi"]
>>> blog
['Entry dau tien', 'Python that tuyet', 'Entry moi']
Ở đây ta thêm cho blog một giá trị mới, là blog cũ , và một entry mới. Chúng ta có thể rút gọn trong một hàm :
Code:
>>> def add_entry(blog, new_entry):
... return blog + [new_entry]
...
>>>
def là từ khóa được sử dụng để định nghĩa một hàm hoặc một phương thức mới ( chúng ta sẽ nói nhiều hơn về các hàm trong lập trình có cấu trúc và phương thức trong lập trình hướng đội tượng trong chủ đề này ) , tiếp theo là tên hàm. Trong dấu ngoặc đơn, chúng ta có các tham số chính thức.Sau dấu hai chấm, dấu nhắc đã chuyển từ >>> sang ... để cho thấy ta đang ở trong 1 hàm. Một hàm được bao gồm tất cả các dòng được lùi vào (theo bậc) so với dòng def.
Khi các ngôn ngữ lập trình khác sử dụng các dấu ngoặc hoặc từ khoá begin/end, Python sử dụng sự lùi vào ở đầu dòng. Ý tưởng ở đây là nếu bạn là lập trình viên giỏi, bạn sẽ tự làm việc đó.Đây là một vấn đề gây tranh luận; có thể bạn không thích nó lúc ban đầu, nhưng bạn phải học để làm việc đó
Khi làm việc với REPL, bạn có thể an toàn nhấn Tab để tạo một bậc lùi vào, và cho dù phím Tab có thể làm việc đó, sử dụng 4 lần space là một cách giới thiệu nhiều hơn. Nhiều text editor biết cách đặt 4 lần space khi bạn nhấn Tab khi chỉnh sửa file Python. Nhưng bạn đừng bao giờ kết hợp giữa Tab và space.Trong các ngôn ngữ lập trình khác, nó có thể làm cộng đồng không thích bạn, nhưng trong Python, nó có thể làm chương trình gặp những thông báo lỗi khó hiểu
Để luyện tập, chúng ta cùng tiếp tục làm, nhập header của lớp def add_entry(blog, new_entry):, nhấn Enter, nhấn Tab, nhập return blog + [new_entry] , nhấn Enter, nhấn Enter lần nữa.Chúng ta sẽ thấy :
Code:
>>> blog = add_entry(blog, "Entry thu 4")
>>> blog
['Entry dau tien', 'Python that tuyet', 'Entry moi',
'Entry thu 4']
>>>
add_entry sử dụng 2 tham số. Đầu tiên là chính blog, và nó được gán vào blog. Đó là một mánh khoé. Cái blog bên trong hàm không giống với blog bên ngoài hàm. Chúng ở các phạm vi khác nhau. Do đó
Code:
>>> def add_entry(blog, new_entry):
... blog = blog + [new_entry]
không làm việc, blog chỉ được chỉnh sửa bên trong hàm.
Blog của chúng ta lớn dần lên, và trước đây bài viết chỉ là những chuỗi đơn giản, giờ chúng ta muốn nó có cả tiêu đề và thân. Chúng ta có thể làm thế này :
Code:
>>> blog = []
>>> blog = add_entry(blog, ("Blog moi", "Entry dau tien"))
>>> blog = add_entry(blog, ("Tuyet ", "Python that tuyet"))
>>> blog
[('Blog moi', 'Entry dau tien'),
('Tuyet', 'Python that tuyet')]
>>>
Ở dòng thứ nhất, ta reset blog thành một danh sách trống. Sau đó, thêm 2 bài viết.
Danh sách các bài viết được tạo ra bởi các dấu ngoặc, và các thành phần được phân cách bởi các dấu phẩy. Nó tương tự với một danh sách, nhưng chúng khác nhau. Nó được gọi là tuple. Bạn có thể cập nhật thành phần của một tuple. Các tuple được sử dụng để xây dựng một vài kiểu cấu trúc với các thành phần cố định. Lấy ví dụ
Code:
Truy cập từng phần của bài viết cũng tương tự truy cập từng phần của blog
>>> blog[0][0]
'Blog moi'
>>> blog[0][1]
'Entry dau tien'
Đây có thể là một giải pháp tốt nếu bạn muốn lưu giữ chỉ tiêu đề và nội dung bài viết. Nhưng , khi ta muốn thêm vào ngày và thời gian, trích dẫn, tag hay tin nhắn ? Bạn có thể bắt đầu nghĩ bạn cần treo một tờ giấy lên tường, để nhớ mục lục của từng trường, như thế này :
Thật không dễ chịu chút nào . Để giải quyết vấn đề này. Python đưa đến cho chúng ta lập trình hướng đối tượng ..
Còn tiếp...
Tham khảo LinuxJournal
|
|
|
Python là ngôn ngữ lập trình được quan tâm bởi tính đơn giản và dễ sử dụng. Nó thường được giới thiệu cho những "programming newcomer" như một điểm khởi đầu tốt. Python cũng là chương trình thông dịch các chương trình viết bằng ngôn ngữ này. Có các phiên bản bổ sung khác của Python, như Jython , CLPython, IronPython ... Ở đây, chúng ta chỉ sử dụng Python
Cài đặt Python
Cài đặt Python và chạy là bước đầu tiên. Nó có thể rất dễ dàng. Nếu bạn đang sử dụng Gentoo GNU/Linux, bạn đã có sẵn Python 2.4 được cài đặt. Hệ thông packaging cho Gentoo, Portage, được viết bằng Python .
Nếu bạn đang chạy Debian GNU/Linux, Ubuntu, Kubuntu và MEPIS, hãy chạy lệnh sau :
Code:
sudo apt-get install python
Nếu bạn đang sử dụng các Linux distro khác, có thể Python là các package được chuẩn bị trước cho nó. Sử dụng tài nguyên và công cụ thông thường bạn sử dụng cho các package khác để tìm Python package
Nếu bạn không làm được tất cả các điều trên, bạn cần phải cài đặt bằng tay. Nó không khó, nhưng cần phải chú ý là dễ làm hỏng hệ thống của bạn trừ khi bạn làm theo hướng dẫn đơn giản này : cài đặt Python vào một vị trí độc lập, ví dụ /opt/python/2.4.3 hay gì đó tuỳ phiên bản Python ...
Để thực hiện cài đặt, download Python , unpack và chạy lênh sau :
Code:
./configure --prefix=/opt/python2.4/
make
make install
Cùng bắt đầu
Chúng ta bắt đầu tìm hiểu về phần lập trình, để khởi đầu, ta xây dựng một công cụ blog đơn giản, không có giao diện như Web, nhưng nó là một bài tập tốt.
Python đi kèm với REPL - một phát minh của cộng đồng Lisp. REPL là viết tắt của cụm từ Real Eval Print Loop, và nó có nghĩa là đây là chương trình có thể đọc được các biểu thức và câu lệnh, đánh giá, in kết quả và đợi . Giờ ta chạy REPL ( nhớ điều chỉnh được dẫn của bạn theo vị trí bạn đã cài đặt Python trước đây )
Code:
$ python
Python 2.4.3 (#1, Sep 1 2006, 18:35:05)
[GCC 4.1.1 (Gentoo 4.1.1)] on linux2
Type "help", "copyright", "credits" or "license" for
more information.
>>>
3 dấu lớn hơn ( >>> ) là dấu nhắc của Python, bạn sẽ viết các câu lệnh và biểu thức vào đây. Để thoát khỏi chương trình, nhấn Ctrl-D
Thử một vài biểu thức đơn giản:
Code:
Giá trị của 5, tất nhiên = 5.
Code:
Thú vị hơn không nào?
Có các kiểu biểu thức khác, như là một chuỗi:
>>> "Xin chao"
'Xin chao'
Dấu nháy được sử dụng để tạo chuỗi. Dấu nháy đơn hay kép đều như nhau. Trong thực tế, bạn có thể thấy ta đã sử dụng nháy kép, nhưng Python trả lại là nháy đơn.
Giờ ta thử một danh sách
Code:
Dấu ngoặc vuông được sử dụng để tạo các danh sách, mỗi item được phân cách bởi một dấu phẩy. Và như có thể cộng các số, ta có thể cộng ( hay ghép) các danh sách :
Code:
>>> [1,3,2] + [11,3,2]
[1, 3, 2, 11, 3, 2]
Giờ, chúng ta chuyển sang một thứ thú vị hơn , blog. Blog là một chuỗi các bài viết, và danh sách Python là một cách tốt để tái hiện một blog, với bài viết và chuỗi. Trong REPL, chúng ta có thể làm một blog đơn giản thế này :
Code:
>>> ["Entry thu nhat", "Python that tuyet"]
['Entry thu nhat', 'Python that tuyet']
>>>
Đó là một danh sách các chuỗi. Bạn có thể tạo một danh sách bất cứ cái gì bạn muốn, bao gồm cả danh sách của danh sách. Hạn chế là tất cả các biểu thức sẽ được đánh giá, trình bày và biến mất. Chúng ta không có cách nào để gọi blog lại và thêm cho chúng các item khác hay xem lại chúng.Do đó, ta thực hiện phép gán :
Code:
>>> blog = ["Entry thu nhat", "Python that tuyet"]
>>>
Giờ blog là một biến chứa danh sách. Không giống các ví dụ trước, không có gì được in ra tại thời điểm này, vì nó chỉ là một phép gán. Phép gán là một câu lệnh, và câu lệnh không trả lại giá trị. Đơn giản đánh giá biến cho chúng ta thấy nội dung :
Code:
>>> blog
['Entry thu nhat', 'Python that tuyet']
Truy cập blog của bạn thật dễ dàng. Chúng ta nhận biết mỗi bài viết bằng 1 số :
Code:
>>> blog[0]
'Entry thu nhat'
>>> blog[1]
'Python that tuyet'
Chú ý rằng Python bắt đầu đếm từ 0 .
còn tiếp...
|
|
|
Hình như bình thường mình login bằng login.yahoo.com
Hình như khi gõ yahoo.com -> www.yahoo.com
|
|
|
Nếu không nhầm thì gamma định nói đến cái này :
If you use cookies in your website, a cookie set from a subdomain
cannot be read from the main domain and vice versa because of the security
association feature tied to the domain which set it. This is also true for
session cookies, where, if the user is logged in on the main site, and
then moves to a subdomain, the subdomain site will not be able to access the
same session cookie, and will assign a new session (hence forcing the user
to login again). However, session persistence
across subdomains can be maintained by implementing URL rewriting instead
of session cookies.
và cái này
As explained earlier, cookies are not shared among subdomains or between the domain
and the subdomain. In order to set cookies accessible by all subdomains, use the
following techniques:
1. While writing the cookie, set the cookie domain to ".domain.ext" so that it applies
to all subdomains.
2. If the cookie domain is set to ".domain.ext", it will not be accessible by a user
who types in the address without the www before the domain (i.e. http://domain.ext).
Therefore, wwwect all requests without www to http://www.domain.ext.
There are some reported problems with the above approach. It is safe to set the default cookie
with no domain specified and then set another one with domain as ".domain.ext". In this case
there is no need for the wwwects.
However, remember that session cookies are set by the web server software and you may not
have control over how the cookie domain is set.
đủ chưa nhỉ
|
|
|
@nccm : cảm ơn vì giới thiệu project đó
Giờ ta cùng đi tiếp câu chuyện. Đầu tiên là về
Quines
Quine là một dạng chương trình tạo mã nguồn đặc biệt. http://www.catb.org/esr/jargon/ định nghĩa quine là một "chương trình tạo ra một bản sao chép mã nguồn của chính nó". Đây là một chương trình quine được viết bởi Ryan Davis, là môt trong những đoạn ngắn nhất của ngôn ngữ Ruby:
Code:
f="f=%p;puts f%%f";puts f%f
Chạy chương trình này , và nhận kết quả. Bạn có thể thử trong shell prompt như sau :
Code:
ruby -e 'f="f=%p;puts f%%f";puts f%f' | ruby
Bạn sử dụng tuỳ chọn -e từ dòng lệnh để chỉ định thi hành dòng code Ruby, và sau đó ta sử dụng pipe để gửi kết quả lại cho trình thông dịch. Kết quả lại một lần nữa chính là mã nguồn chương trình đó.
Chỉnh sửa chương trình trong thời gian thực
Các ngôn ngữ động , như Ruby, cho phép bạn chỉnh sửa các phần khác nhau của chương trình dễ dành trong thời gian thực mà không phải tạo ra mã nguồn rõ ràng như ta đã làm trước đó, core API và framework của Ruby, như Ruby on Rails, tận dụng điều kiện thuận lợi này để tự động hoá các tác vụ lập trình thông thường. Lấy ví dụ, khi định nghĩa lớp, bạn có thể sử dụng phương thức attr_accessor để tạo ra các phương thức truy cập đọc/ghi tự động cho một tên thuộc tính . Để dễ hiểu, bạn xem đoạn mã :
Code:
class Person
attr_accessor :name
end
là tương đương với đoạn mã dài dòng hơn sau :
Code:
class Person
def name
@name
end
def name=(new_name)
@name = new_name
end
end
Đoạn mã trước có một hạn chế nhỏ : biến chương trình tương ứng @name không thực sự được tạo ra cho đến khi bạn tạo giá trị khởi đầu cho nó. Có nghĩa là bạn sẽ nhận giá trị null nếu bạn cố gắng đọc thuộc tính của name trước khi ghi vào nó. Nếu bạn không cẩn thận, nó có thể tạo ra các lỗi khó thấy trong chương trình của bạn. Cách dễ nhất để tránh vấn đề này là gán cho biến @name một giá trị có nghĩa bằng phương thức Person#initialize. Vì nó là một kịch bản khá thông thường, sẽ đẹp hơn nếu phương thức này được tạo ra một cách tự động, trong tình huống truy cập đọc/ghi.
Ta cùng định nghĩa phương thức attr_initialize làm việc đó sử dụng sự tiện lợi của metaprogramming.
Đầu tiên, xác định hai phương thức là chìa khoá để thực hiện phép metaprogramming mong muốn :
Code:
cls.define_method(name) { body }
Nó thêm một phương thức mới cho lớp . Nó lấy các đối số là tên phương thức ( là kí tự hoặc chuỗi ) và thân ( code block )
Code:
obj.instance_variable_set(name, value)
Đoạn mã trên ràng buộc một biến chương trình vào một giá trị xác định. Tên của biến chương trình cần là kí tự hay chuỗi, và nó nên có tiền tố @ .
Bây giờ, chúng ta đã sẵn sàng định nghĩa lớp attr_initialize như phần mở rộng của lớp Object do đó các lớp khác có thể sử dụng nó
Code:
require 'generator'
class Object
def Object.attr_initialize(*attrs)
define_method(:initialize) do |*args|
if attrs.length != args.length
raise ArgumentError,
"wrong number of arguments " +
"(#{args.length} for #{attrs.length})"
end
SyncEnumerator.new(attrs, args).each do
|attr, arg|
instance_variable_set("@#{attr}", arg)
end
end
attr_accessor *attrs
end
end
Phương thức attr_initialize nhận giá trị vào là số biến - tên các thuộc tính (attrs). Mỗi tên thuộc tính có vị trí dành riêng cho nó trong danh sách tham số phương thức khởi tạo đã được tạo ra theo trình tự để gán giá trị khởi đầu. Ta tạo phương thức mới bằng cách kiểm tra số đối số được nhận bằng số thuộc tính ta đã chỉ định ban đầu. Nếu không, sẽ tạo ra thông báo lỗi. Sau này, chúng ta sử dụng đối tượng SyncEnumerator để lặp theo danh sách thuộc tính đã khai báo ( attrs ) và danh sách đối số thực sự (args ) để thực hiện từng đối số - thuộc tính ràng buộc một bằng phương thức instance_variable_set. Cuối cùng, ta uỷ quyền cho phương thức attr_accessor theo trình tự tạo phương thức truy cập đọc/ghi cho tất cả các thuộc tính đã được khai báo.
Sau đây là cách ta sử dụng phương thức attr_initialize
Code:
class Student
attr_initialize :name, :id, :address
end
s = Student.new('Erika', 123, '13 Fake St')
s.address = '13 Wrong Rd'
puts s.name, s.id, s.address
Kết quả sẽ là:
Code:
Tổng kết
Khi bạn đã quen thuộc với kĩ thuật này, metaprogramming không phức tạp như được nghe thấy ban đầu. Metaprogramming cho phép bạn giảm thiểu các việc buồn tẻ hoặc lỗi lập trình thường gặp. Bạn có thể sử dụng nó để khởi tạo các bảng dữ liệu, tạo ra các đoạn mã tự động mà không thể rút gọn trong một chương trình, hay đơn giản là thử nghiệm sự khéo léo bằng cách viết các đoạn mã tự tái tạo.
“Tôi thích viết các chương trình có thể viết chương trình viết được chương trình khác”—Richard Sites
Giờ mình xin kết thúc, chúc mọi người có những giờ phút thú vị với metaprogramming, chúng ta sẽ còn đề cập đến nó sau này
|
|
|
Bạn đọc bài này http://www.roseindia.net/jsp/Accessingdatabase-fromJSP.shtml
|
|
|
Ikut3 wrote:
Nó cũng tương tự như cái bây giờ đấy .Tại sao Mail của Blog lại kô nằm cùng với Mail chính nhỉ
Hồi đó Yahoo fix gần hết các bug XSS, chỉ còn lại bug của bồ. Cho nên cái bug mới này, tớ thấy kì kì
|
|
|
Cái Mail bug của Ikut3 thì Yahoo fix khoảng 5 năm rồi thì phải
|
|
|
Linuxcodon wrote:
Nêu rõ ra bạn ơi . Phần cứng cấu hình , có tiền lợi cho học tập ko .
Về cấu hình, bạn chủ động tìm hiểu theo tên các distro mình đưa cho bạn. Còn cái Linux kernel nó bé tẹo thôi à
Chỉ lưu ý là Gentoo nhanh nhất vì giữ nguyên cấu trúc cây thư mục của Unix , nhưng khó cài đặt nhất. Có vẻ Ubuntu là distro đặc biệt, giao diện đẹp, làm việc cũng tương đối ổn. Nếu bạn chưa làm quen với Linux thì nên dùng Ubuntu , còn nếu chỉ quan tâm tới yêu cầu đĩa trống thì nên dùng Live CD.
|
|
|
hvtuananh wrote:
Bạn ơi mình đã làm y hệt như vậy nhưng không được. Tức là sau khi nó load xong, nó nháy màn hình 2 lần rồi mới vào màn hình đăng nhập. Có ai biết cách giải quyết không? Khi mình đã login xong thì độ phân giải của mình là 1280x800
Như vầy bồ muốn độ phân giải bao nhiêu Chưa hiểu ý bồ
|
|
|
Bạn nên bắt đầu với Linux như thế này :
1) Đọc sách về Linux
2) Cài đặt Linux vào máy tính
3) Nói với mọi người về Linux, và nhờ giúp đỡ
Còn đây là một hình minh họa về tương quan giữa tính dễ cài đặt và nâng cấp của các Linux distribution
Chúc bạn làm việc tốt với Linux
|
|
|
Bạn download và install deb package 915Resolution ở đây : http://packages.debian.org/etch/915resolution
Thay đổi thông số trong file /etc/default/915resolution
Code:
MODE=5a
XRESO=1280
YRESO=768
Trong file /etc/init.d/bootmisc.sh thêm dòng này
Code:
sudo /usr/sbin/915resolution 5a 1280 768
trước dòng
Code:
|
|
|
nccnm wrote:
Rất thú vị, cơ mà đoạn script trên vẫn phải dùng vòng lặp, liệu có một cách khác không. Erika có thể đánh lừa ông thầy bằng cách đưa cho ông ý chương trình C mà đoạn script kia sinh ra nhưng như thế thì bình thường quá. Trong khi đó bạn lại quảng cáo Erika rất thông minh . Mong bài viết tiếp theo
Chào nccnm, như phần 1 của bài viết, metaprogramming có tác dụng là loại trừ hoặc giảm thiểu các công việc buồn tẻ hay lỗi lập trình thường gặp ( eliminate or reduce a tedious or error-prone programming task ) .Đoạn script trên đã hoàn thành được tác vụ đó . Còn một kiểu logic khác, onlinehack vẫn chưa nghĩ ra
|
|
|
@all : cảm ơn vì đã chú ý. Hy vọng sau phần 2 này, các bạn đã có thể tự viết một metaprogram
Mặc dù ví dụ trên dường như có một chút bịa đặt, nó minh hoạ việc viết một chương trình tạo ra source một chương trình khác dễ dàng thế nào. Kỹ thuật này có thể được sử dụng nhiều hơn trong thực tế.
Giờ ta cùng nghĩ đến việc, bạn có một chương trình C cần include một ảnh PNG, nhưng vì một lí do nào đó, nền sử dụng chỉ chấp nhận 1 file, là file khả chạy. Do đó, dữ liệu phù hợp với file PNG phải được tích hợp trong chính chương trình. Để làm được điều đó, bạn có thể đọc file PNG trước và tạo ra đoạn mã C có tác dụng khai báo mảng, khởi đầu với dữ liệu tương ứng . Đoạn script Ruby sau minh hoạ chính xác điều đó :
Code:
INPUT_FILE_NAME = 'ljlogo.png'
OUTPUT_FILE_NAME = 'ljlogo.h'
DATA_VARIABLE_NAME = 'ljlogo'
File.open(INPUT_FILE_NAME, 'r') do |input|
File.open(OUTPUT_FILE_NAME, 'w') do |output|
output.print "unsigned char #{DATA_VARIABLE_NAME}[] = {"
data = input.read.unpack('C*')
data.length.times do |i|
if i % 8 == 0
output.print "\n "
end
output.print '0x%02X' % data[i]
output.print ', ' if i < data.length - 1
end
output.puts "\n};"
end
end
Đoạn script đọc file ljlogo.png và tạo ra file mới là ljlogo.h. Đầu tiên, nó viết phần khai báo của biến ljlogo như một mảng unsigned char. Sau đó, nó đọc tất cả file đưa vào một lần và unpack tất cả các kí tự đưa vào thành các unsigned byte. Rồi ghi từng byte đó thành các số hexadecimal 2 kí tự , mỗi dòng 8 số . Như đòi hỏi, mỗi số được ngắt bởi một dấu phẩy, trừ số cuối cùng. Và phần cuối cùng là đoạn script viết dấu ngoặc đóng và dấu chấm phẩy
Sau đây là một mẫu file kết quả
Code:
unsigned char ljlogo[] = {
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A,
0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
/* Khoảng vài trăm dòng ở đây. */
0x0B, 0x13, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
};
Chương trình C sau minh hoạ cách bạn sử dụng code được tạo ra như C header file thông thường. Cần chú ý ( quan trọng ) rằng dữ liệu của file PNG sẽ được lưu ở bộ nhớ khi chương trình được load
Code:
#include <stdio.h>
#include "ljlogo.h"
/* In dữ liệu của mảng ljlogo theo các giá trị byte hexadecimal . */
int main(void) {
int i;
for (i = 0; i < sizeof(ljlogo); i++) {
printf("%X ", ljlogo[i]);
}
return 0;
}
Bạn cũng có thể có một chương trình vừa tạo ra source code và khởi chạy nó ngay lập tức. Có vài ngôn ngữ có "khả năng" eval, cho phép bạn dịch và khởi chạy một phần source code chứa bên trong một chuỗi kí tự khi đang chạy. "Khả năng" này thường có trong các ngôn ngữ thông dịch, như Lisp, Perl, Ruby, Python và JavaScript. Trong đoạn mã Ruby này :
Code:
x = 3
s = 'x + 1'
puts eval(s)
Chuỗi 'x+1' được thông dịch và thi hành khi đoạn mã được chạy, in ra kết quả là 5.
Đoạn mã Ruby sau minh hoạ một cách tìm kiếm kết quả của việc cộng tất cả các số nguyên giữa 1 và 100. Thay vì sử dụng một phương pháp lặp thông thường, chúng ta tạo ra một chuỗi lớn bao gồm biểu thức “1+2+3+...+99+100” và kế tiếp là tính giá trị của nó:
Code:
puts eval((1..100).to_a.join('+'))
Hàm eval nên được sử dụng thận trọng. Nếu chuỗi được sử dụng làm đối số của eval đến từ một nguồn không tin cậy ( ví dụ như do người dùng nhập vào chẳng hạn ), nó có thể có những nguy hiểm tiềm tàng ( tưởng tuợng việc gì có thể xảy ra nếu chuỗi được đánh giá chứa expression rm -r * ) Trong nhiều trường hợp, có thể thay thế "eval" để linh động, ít yếu kém về bảo mật hơn và không đòi hỏi tốc độ phân tích mã nguồn trong thời gian thi hành.
còn tiếp...
|
|
|
Làm thế nào để viết một chương trình có thể tự viết một chương trình khác ?
Metaprogram là chương trình có thể tự tạo ra chương trình hoặc một phần của chương trình khác. Do đó Metaprogramming nghĩa là " viết metaprogram". Có nhiều metaprogram hữu dụng trong Linux: phổ biến nhất là các trình dịch ( GCC hay FORTRAN 77), thông dịch ( Perl hay Ruby) parse generator ( Bison ), assembler ( AS hay NASM ) và preprocessor ( CPP hay M4) . Thông thường, bạn sử dụng metaprogram để loại trừ hay giảm thiểu các việc buồn tẻ hoặc lỗi lập trình thường gặp. Lấy ví dụ, thay vì viết một chương trình mã máy bằng tay, bạn sử dụng các ngôn ngữ lập trình bậc cao như C, và sau đó làm cho trình dịch C dịch thành các chỉ dẫn máy cấp thấp tương đương.
Metaprogramming ban đầu dường như là một chủ đề cao cấp, chỉ phù hợp chỉ dành cho những chuyên gia , nhưng nó không thực sự khó khi bạn biết cách sử dụng các công cụ thích hợp.
Tạo mã nguồn
Để trình bày một ví dụ rất đơn giản về metaprogramming, chúng ta thừa nhận trường hợp hư cấu hoàn toàn sau:
Erika là một cô sinh vien năm nhất ngành khoa học máy tính cực thông minh. Cô biết vài ngôn ngữ lập trình, gồm cả C và Ruby. Trong lớp lập trình cơ bản của cô, Giáo sư Gomez, người hướng dẫn khóa học, nhận thấy cô đang chat trong máy laptop. Để trừng phạt, ông yêu cầu Erika viết một chương trình in ra 1000 dòng chữ sau:
1. Toi khong duoc phep chat trong lop.
2. Toi khong duoc phep chat trong lop.
...
999. Toi khong duoc phep chat trong lop.
1000. Toi khong duoc phep chat trong lop
Một giới hạn nữa là chương trình không được sử dụng các vòng lặp hay chỉ dẫn goto. Nó có thể chỉ là một hàm main lớn voi 1000 chi dan printf, ví dụ như sau :
Code:
#include <stdio.h>
int main(void) {
printf("1. Toi khong duoc phep chat trong lop.\n");
printf("2. Toi khong duoc phep chat trong lop.\n");
/* 996 chi dan printf. */
printf("999. Toi khong duoc phep chat trong lop.\n");
printf("1000. Toi khong duoc phep chat trong lop.\n");
return 0;
}
Giáo sư Gomez không quá ngây thơ, do đó ông ta tin rằng Erika sẽ viết chỉ dẫn printf chỉ dẫn một lần, copy nó vào clipboard, thực hiện 999 lần paste, và tự tay thay đổi số. Ông nghĩ rằng công việc buồn tẻ và lặp lại này sẽ đủ để dạy cô một bài học. Nhưng Erika ngay lập tức nhận ra cách dễ nhất - metaprogramming. Thay vì viết chương trình này bằng tay, sao không viết một chương trình khác viết chương trình đó tự động cho cô? Và cô đã viết đoạn script Ruby sau :
Code:
File.open('trungphat.c', 'w') do |output|
output.puts '#include <stdio.h>'
output.puts 'int main(void) {'
1.upto(1000) do |i|
output.puts " printf(\"#{i}. " +
"Toi khong duoc phep chat trong lop.\\n\");"
end
output.puts ' return 0;'
output.puts '}'
end
Đoạn mã này tạo ra một file trungphat.c với 1000 dòng lệnh C
Dựa theo Linuxjournal
Còn tiếp...
|
|
|
Hôm nay thấy vui vui, tặng anh em http://www.box.net/shared/lip8psluso
Fagus - có nghĩa là cây sồi trong từ điển của vùng Celtic cổ . Sử dụng gam màu tối (dark stlye) và hilite bởi các gam màu nóng (màu da cam), màu có độ bắt sáng cao (blue) để tạo hiệu ứng thị giác tối đa cho người dùng. JA Fagus mang tính nghệ thuật cao, được lồng ghép bởi các hiệu ứng về độ trong suốt, ánh sáng ven, hiệu ứng phản quang glossy. Để tạo được ra bản layout cuối cùng, cả nhóm đã phải làm việc miệt mài trong hơn 1 tuần với gần 10 bản vẽ nháp cùng rất nhiều phương án thiết kế hiệu ứng ánh sáng nhằm đạt tới sự hoàn thiện cao nhất cho sản phẩm. Vì hơn ai hết chúng tôi hiểu rằng sản phẩm lần này sẽ do chính các nhà thiết kế đồ họa (Graphic designer) sử dụng và đánh giá.
|
|
|
MySQL database cũng hỗ trợ các C program API giống như PHP và Perl
Các C API code được phân phối với MySQL. Nó được bao gồm trong thư việc mysqlclient và cho phép chương trình C truy cập database
Nhiều client trong các bản phân phối source MySQL được viết bằng C. Nếu bạn muốn tìm kiếm ví dụ minh hoạ cách sử dụng C API, hãy tham khảo các client này. Bạn có thể tìm thấy chúng trong các thư mục client của bản phân phối source MySQL.
Yêu cầu :
Bạn phải chắc chắn là đã có môi trường phát triển được cài đặt chẳng hạn như gcc, mysql development package.. . Danh sách sau tóm tắc các package để biên dịch chương trình :
* mysql: Chương trình và thư viện chia sẻ MySQL client
* mysqlclient: Thư việc chia sẻ MySQL backlevel
* mysql-devel: Files để phát triển ứng dụng MySQL
* mysql-server: Mysql server
* gcc, make and other development libs: trình dịch GNU C
Một chương trình C đơn giản
Các chỉ dẫn sau nên làm trên các Linux distro hay UNIX. Đây là một chương trình nhỏ kết nối đến mysql server và liệt kê các table từ mysql database :
Code:
/* Simple C program that connects to MySQL Database server*/
#include <mysql.h>
#include <stdio.h>
main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server = “localhost”;
char *user = “root”;
char *password = “PASSWORD”; /* set me first */
char *database = “mysql”;
conn = mysql_init(NULL);
/* Connect to database */
if (!mysql_real_connect(conn, server,
user, password, database, 0, NULL, 0)) {
fprintf(stderr, “%s\n“, mysql_error(conn));
exit(1);
}
/* send SQL query */
if (mysql_query(conn, “show tables”)) {
fprintf(stderr, “%s\n“, mysql_error(conn));
exit(1);
}
res = mysql_use_result(conn);
/* output table name */
printf(“MySQL Tables in mysql database:\n“);
while ((row = mysql_fetch_row(res)) != NULL)
printf(“%s \n“, row[0]);
/* close connection */
mysql_free_result(res);
mysql_close(conn);
}
Làm thế nào để biên dịch chương trình sử dụng MySQL libs?
MySQL đi kèm với script đặc biệt gọi là mysql_config. Nó cung cấp cho bạn các thông tin hữu ích để biên dịch MySQL client và kết nối đến MySQL database server. Bạn cần làm theo các chỉ dẫn sau :
Tuỳ chọn –libs - Thư viện và tuỳ chọn đòi hỏi để kết nối với MySQL client library.
Code:
Kết quả:
Code:
-L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib64 -lssl -lcrypto
Tuỳ chọn –cflags - Compiler flag để tìm kiếm các include file và critical compiler flag sử dụng khi biên dịch thư viện libmysqlclient.
Code:
:
Kết quả
Code:
-I/usr/include/mysql -g -pipe -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing
Bạn gần phải sử dụng các option trên cho trình dịch GNU C . Do đó để biên dịch chương trình trên, nhập:
Code:
$ gcc -o output-file $(mysql_config –cflags) mysql-c-api.c $(mysql_config –libs)
Thực thi chương trình :
Code:
$ ./output-file
Kêt quả:
[code]
MySQL Tables in mysql database:
columns_priv
db
func
help_category
help_keyword
help_relation
help_topic
host
tables_priv
time_zone
time_zone_leap_second
time_zone_name
time_zone_transition
time_zone_transition_type
user
Tham khảo:
http://dev.mysql.com/doc/refman/5.0/en/c.html
Bài viết tham khảo từ nixCraft
|
|
|
vanhung123 wrote:
Website của mình nội dung chỉ là trang mua bán rao vặt ở một tỉnh lẻ,không biết vì lý do gì mà từ lúc up lên host tới giờ (chưa được 15 ngày) bị ddos liên tục,họ dùng X-Flash tấn công làm server treo luôn.Bên cho thuê host của Nhân Hòa khi website mình bị tấn công thì họ suspended website của mình.
Bên Nhân Hòa có hỏi mình "Anh có thù oán gì với ai không mà trong vòng 15 ngày hôm nay họ liên tục nhắm vào site anh".Mình nghe mà không biết giải thích thế nào.Một người ở tỉnh lẻ như mình(môi trường làm việc,tiếp xúc bên ngoài để học hỏi) có giỏi đến đâu thì cũng có giới hạn so với các bạn ở nơi khác làm sao có thể gây thù oán với ai cho được.Có thù oán thì chỉ thù oán với Nhân Hòa thôi chứ thù oán với mình làm gì.
Thôi đó chỉ là chuyện phụ,bạn nào có cách nào chỉ giúp mình hạn chế tình trạng này,mình sợ ddos đến mức không dám ghi site mình lên đây.
YM !: ducnam_dt_th
Email : ngdcnam@gmail.com
Mong các bạn giúp đỡ,cảm ơn nhiều.
Có đôi lời mạn bàn với bạn
Trong trường hợp của bạn, về mặt kĩ thuật, khả năng đối phó là không thể
Nhưng trong trường hợp thế này, bạn nên suy nghĩ rộng hơn về mặt xã hội.
Nếu Website của bạn là làm kinh tế, và có đủ khả năng, bạn nên bỏ khoảng 100$ 1 tháng thuê server để manage tốt hơn
Còn nếu thiệt hại kinh tế do site bị suspend là nhỏ, thì bạn có thể cho nó tạm dừng hoạt động một thời gian rồi trở lại hoạt động bình thường.
Đơn giản thế này, nếu bạn đang có một cọc giấy, nhưng có một thằng nhóc cứ thích chọc phá để lấy của bạn , mà bạn không thể đánh nó ( vì nó là em bạn chẳng hạn ) thì bạn làm gì? Nếu là mình, mình sẽ cho nó cả xấp , cho nó chơi chán thì thôi và lúc đó bạn rảnh tay làm việc khác .
|
|
|
Một tut nữa mừng HVA trước thềm năm mới
Bạn có thể tăng tốc việc download và truy cập trang web với module mod_deflate. Mod_deflate cung cấp một bộ lọc DEFLATE cho phép dữ liệu ra từ server có thể được nén lại truớc khi gởi tới client.
Việc này giúp giảm thời gian và dữ liệu trao đổi qua mạng, kết quả là web của bạn có thể được truy cập và download nhanh hơn
Bạn phải chắc chắn là trong Apache Server của bạn đã có mod_deflate
Mở file httpd.conf bằng cách sử dụng một text editor , chẳng hạn vi:
Code:
Bổ sung thêm dòng sau:
Code:
LoadModule deflate_module modules/mod_deflate.so
Bổ sung thêm chỉ dẫn cấu hình :
Code:
<Location />
AddOutputFilterByType DEFLATE text/html text/plain text/xml
....
...
<Location>
Dòng trên chỉ nén file html và xml. Bạn có thể cấu hình để nén các file khác như sau:
Code:
<Location />
...
...
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/x-httpd-eruby
AddOutputFilterByType DEFLATE text/html
...
...
<Location>
Đóng và lưu file lại. Sau đó restart lại Apache. Tất cả các file có phần mở rộng trên sẽ được nén bởi
mod_deflate:
# /etc/init.d/httpd restart
Bạn có thể chỉ định các thư mục và chỉ nén các file html. Lấy ví dụ thư mục /thu/muc/ :
Code:
<Directory "/thu/muc">
AddOutputFilterByType DEFLATE text/html
</Directory>
Trong thực tế, có vấn đề với việc nén các kiểu file khác như mp3 hoặc ảnh. Nếu bạn không muốn nén các file đó, thêm những dòng sau vào cấu hình
Code:
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.avi$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mov$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp3$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp4$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.rm$ no-gzip dont-vary
Chú ý rằng tiến trình này làm tiêu tốn thêm CPU và bộ nhớ trên server của bạn và trên trình duyệt người dùng. VÌ thế bạn phải quyết định tài liệu nào bạn cần nén .
|
|
|
Trước giờ khắc đón năm mới 2008, tặng một tut nho nhỏ dành cho người dùng Linux
Nguồn : http://www.cyberciti.biz/tips/linux-how-to-encrypt-and-decrypt-files-with-a-password.html
Encrypting file trong Linux
Để mã hóa 1 file , sử dụng lệnh gpg như sau:
$ gpg -c tenfile
Ví dụ để mã hóa file myfinancial.info , gõ lệnh:
$ gpg -c myfinancial.info
Bạn sẽ thấy:
Enter passphrase:<Password của bạn>
Repeat passphrase:<Password của bạn>
Việc này sẽ giúp tạo ra file myfinancial.info.gpg .
Tùy chọn:
* -c : Encrypt with symmetric cipher.
Chú ý : nếu bạn quên mật khẩu, rất khó recover lại dữ liệu vì file mã hóa rất tốt
Decrypt file
Để decrypt sử dụng lệnh:
$ gpg myfinancial.info.gpg
Bạn sẽ thấy:
gpg myfinancial.info.gpg
gpg: CAST5 encrypted data
Enter passphrase:<Password của bạn>
Để decrypt file và ghi kết quả ra file vivek.info.txt bạn có thể sử dụng:
$ gpg myfinancial.info.gpg –o vivek.info.txt
Hãy nhớ nếu phần mở rộng là .asc, đó là file encrypt ASCII và nếu là .gpg, đó là file encrypt nhị phân.
|
|
|
|
|
|
|