|
|
1 khảo sát
2 phân tích
3 tạo csdl
4 viết giao diện
5 code
------------------cần thì liên hệ với tui tui giúp cho cái này trước học mãi rồi
|
|
|
o hay chưa kìa lâu lâu hok online được hok nghĩ là có người quan tâm
|
|
|
nấu admin không đồng tình bài viết này thì xin xoá luôn cũng chả sao cả, xoá luôn tên thành viên là tui dùm nấu xoá luôn bài này thì cám ơn rất nnhiều!)
oặc ông viết thế này thì sao ai xoá nổi chứ còn nữa tui đây nè có nhiều bài viết mình tổng hợp từ những gì học được thế mà ai đó lại kêu mình lấy bài ở đâu đó về những bài nào mình lấy đều ghi rõ nguồn mà coi thường tui quá. dạo này chán luôn
|
|
|
oặc mình bị loại này nhiều còn bị mất cả folder/options nữa nhưng mình quét = AVG là hết luôn.
|
|
|
oặc thế mà ông có biết là tác giả của bkv đã mất nhiều đêm để tìm cách diệt ko tui đọc đâu đó trong một trang tin tức thấy nói chính tác giả của bkv đã nói như vậy. báo chí nói ông đã làm loạn cả vn lên rồi đó thấy báo chí kêu dữ quá trời, mà ông bạn bi phạt tới 10t kia à nhờ vụ con virut gái xinh của ông mà nhiều người nổi tiếng quá rồi đó.
|
|
|
lấy đâu ra chỉ có Windows Media Player 9 thôi muốn có Windows Media Player 10 hay 11 thì phải cài. địa chỉ download Media Player 10
http://www.microsoft.com/windows/windowsmedia/mp10/default.aspx
địa chỉ download Media Player 11:
http://www.microsoft.com/windows/windowsmedia/player/11/default.aspx
media 11 chỉ chạy được trên windows p2 trở lên.
|
|
|
kô cần phải cài lại làm gì hết có một file bạn chỉ cần chạy file này là lên được p2 khi gỡ ra lại thành p1. mình ko nhớ tên nhưng bạn ra cửa hàng đĩa hỏi là có.
|
|
|
VB6 không đuợc thiết kế để hổ trợ Unicode. Do đó khi dùng VB6 làm ngôn ngữ lập trình để làm việc với Unicode ta chạm phải những trở ngại vì giới hạn của nó.
VB6 gần như không đá động gì đến Unicode. Người ta nói bên trong data type loại String của VB6 thì nó có khả năng chứa Unicode characters, nhưng thế thôi.
Có một số nhu cầu ta cần phải giải quyết nếu ta muốn dùng VB6 cho Unicode. Ðó là:
Làm sao hiển thị chữ Việt trong Textbox, Listbox .v.v..
Làm sao đọc và viết Text file chứa Unicode chữ Việt
Làm sao xử lý Text String chứa Unicode chữ Việt
Trong giai đoạn giao thời khi các kiểu chữ VNI, VPS, VISCII, TCVN ..v.v. còn thịnh hành, làm sao ta hoán chuyển các encodings ấy ra Unicode.
Trong bài nầy ta sẽ tìm hiểu cách đáp ứng các nhu cầu trên qua việc viết một program bằng VB6 để hoán chuyển các Text files có kiểu chữ VNI, VPS, VISCII, TCVN ..v.v. ra Unicode và ngược lại, nhân đó biểu diển cách giải quyết tất cả 4 nhu cầu nói trên.
Trước hết muốn hiển thị Unicode cho chữ Việt ta cần phải dùng Menu command của VB6 IDE để Project | Components Microsoft Forms 2.0 Object Library. Cái ActiveX nầy cho ta những Label, TextBox, Listbox và ComboBox cần thiết để hiển thị chữ Việt trong Unicode.
Kế đó, để đọc và viết chữ Việt dưới dạng UTF-8 Unicode, ta chứa Unicode text file trong một XML file giữa một cặp tags tên Text (đó cũng là root node) , rồi dùng Microsoft Document Object Model (DOM) để đọc và viết chữ Việt. Bạn nhớ Project | References Microsoft XML, v3.0 và Microsoft Scripting Runtime. Nguyên phần Text là nodeTypedValue của root node của DOM.
Làm như thế ta tránh phải đọc từng byte rồi tìm cách chuyển data ấy qua Unicode String. Ở đây phải nhấn mạnh là bạn phải vui lòng dùng MSWindowsNT hay MSWindows2000 mới được. Bạn có thể dùng Notepad trong WindowsNTđể edit XML file chứa chữ Việt và lưu trử dưới format UTF-8 như trong hình dưới đây:
Việc đọc và viết Việt Unicode text file được làm cho dễ dàng ra bằng cách dùng một VB6 Class tên clsUnicodeText như sau:
Code:
Dim MyUnicodeText As clsUnicodeText
Set MyUnicodeText = New clsUnicodeText
' Read Unicode Text from file txtFileName and display in TextBox1(0)
TextBox1(0).Text = MyUnicodeText.ReadUnicode(txtFileName)
Listing của Class clsUnicodeText như sau:
Code:
Option Explicit
Private mDOMTextFile As DOMDocument ' Document Object Model
Private mXMLPath As String ' XML filename
Public Function ReadUnicode(TXMLPath)
' Read Unicode text from XML file
Dim objTextFileRoot As IXMLDOMElement
Set mDOMTextFile = New DOMDocument
' Remember the XML file name to update later
mXMLPath = TXMLPath
' Read the XML file and create a DOM
mDOMTextFile.Load mXMLPath
'start at the root element of the XML
Set objTextFileRoot = mDOMTextFile.documentElement
' Return the root node's text
ReadUnicode = objTextFileRoot.nodeTypedValue
End Function
Public Sub WriteUnicode(OutText, Optional TXMLPath)
' Update Unicode Text of same XML file or write to another XML file
If IsMissing(TXMLPath) Then
' Assign the Text to write out to the Root node of DOM
mDOMTextFile.documentElement.Text = OutText
' Update the XML file
mDOMTextFile.save mXMLPath
Else
' Read a dummy file to create a DOM
ReadUnicode GetLocalDirectory & "Dummy.xml"
' Assign the Text to write out to the Root node of DOM
mDOMTextFile.documentElement.Text = OutText
' Write the Text to the given XML file
mDOMTextFile.save TXMLPath
End If
End Sub
Khi dùng Sub WriteUnicode ta có thể cho nó tên một XML file nếu ta muốn lưu trử Text trong một file khác với input XML file. Trong trường hợp đó, Sub WriteUnicode đọc một XML file trống tên Dummy.xml để tạo một DOM.
Các nguyên âm có dấu của các encodings VPS, VNI, VISCII, TCVN .v.v được chứa trong các ANSI text file như VPSVowles.txt, VNIVowels.txt, VISCIIVowels.txt, TCVNVowels.txt, .v.v..
Trong khi đó các nguyên âm có dấu của Unicode chữ Việt đuợc chứa trong một XML file và đuợc đọc vào cùng một cách như mọi XML Unicode text files khác. Nó giống như dưới đây:
Một khi Unicode text đã đuợc đọc vào trong VB6 Text String rồi, nó đuợc dùng y hệt như cho ANSI characters. Ðó là vì bên trong VB6 Unicode characters đuợc chứa đàng hoàng, không cần biết mỗi character cần bao nhiêu bytes. Nói như thế có nghĩa là các Functions Left, Mid, InStr đều có thể đuợc dùng cho Unicode Text String như một ANSI String bình thường.
Do đó khi hoán chuyển một nguyên âm từ encoding VPS hay VISCII ra Unicode, và ngược lại, ta có thể dùng mối liên hệ từng nguyên âm một (one-to-one correspondence). Hãy xem cái Function StringToString dùng trong công việc hoán chuyển nầy
Code:
Function StringToString(Vowel1, Vowel2) As String
' Direct one-to-one character mapping from one encoding to another
Dim letter As String
Dim Text1 As String
Dim Text2 As String
Dim i, Pos
' Use Text1 to execute a litle faster than TextBox1(0)
Text1 = TextBox1(0).Text
' Iterate through each character of the from Text string
For i = 1 To Len(Text1)
letter = Mid(Text1, i, 1)
' Leave Carriage Return and Line Feed characters as is
If (letter = vbCr) Then
Text2 = Text2 & vbCr
ElseIf (letter = vbLf) Then
Text2 = Text2 & vbLf
Else
' Find position of character in the vowel list
Pos = InStr(Vowel1, letter)
If Pos <= 0 Then
' Not found - so do not map
Text2 = Text2 & letter
Else
' Found - so pick the corresponding character in the other vowel list
Text2 = Text2 & Mid(Vowel2, Pos, 1)
End If
End If
Next
StringToString = Text2
End Function
Program nầy chỉ hoán chuyển từ các encodings ra Unicode và ngược lại, chớ không có hoán chuyển giữa các encodings không phải là Unicode. Nếu bạn thích thì có thể thêm cho program feature đó. Hay nếu làm biếng thì cứ để program y nguyên rồi hoán chuyển hai lần qua trung gian Unicode.
Các encodings như VNI và VIQR thì dùng 2 hay 3 characters cho một nguyên âm có dấu. Việc hoán chuyển từ Unicode ra VNI hay VIQR thì đơn giản vì ta có thể look-up trực tiếp. Nhưng từ VNI hay VIQR ra Unicode thì ta thực hiện bằng 2 bước. Bước thứ nhất là thay thế tất cả nguyên âm có dấu bằng dòng chữ như |016 cho a^~ của VIQR lấy từ file VIQRVowelMap.txt. Bước thứ hai là lấy ra Vowel thứ 16, tức là ẫ trong danh sách các Unicode Vowels trong file UnicodeVowels.xml như trình bày phía trên.
Khi hoán chuyển text files có nhiều lúc bạn sẽ thấy một số chữ trong các encodings không đuợc hiển thị đúng, thí dụ như không display chữ ư của TCVN. Ðó là các trục trặc của MSWindows. Bạn cứ kiểm lại kỷ từ kết quả trong ANSI text file, nó không sai đâu. Unicode text thì luôn luôn hiển thị đúng.
http://www.vovisoft.com/VisualBasic/UnicodeConvert.htm
|
|
|
Vb6 cho ta Winsock Control để dùng cho việc giúp một program VB6 nói chuyện với một program khác trên mạng TCP/IP.
Ta có thể dùng Winsock Control trong một program để làm Winsock Server hay Winsock Client. Sự khác biệt nầy rất nhỏ, mặc dầu ta phải lưu ý để phân biệt sự khác nhau của hai trường hợp. Giả sử ta dùng Winsock Control làm Server trong một VB6 program để chạy trên một computer và dùng Winsock Control làm Client trong một VB6 program để chạy trên một computer khác trên mạng TCP/IP. Ðể cho hai programs nói chuyện (communicate) trước hết ta cần phải connect (nối) chúng lại với nhau.
Ta cho Winsock Server Listen (lắng nghe) qua một LocalPort (một cổng có mang một con số, thí dụ như 101). Kế đó ta cho Winsock Client Connect (móc nối) qua LocalPort đó ở địa chỉ TCP của Computer nơi ta chạy Winsock Server program. Sở dỉ ta cần phải nói rõ LocalPort số mấy là vì Server Computer có thể Listen qua nhiều LocalPorts cùng một lúc để nhiều Clients có thể Connect đến cùng một Computer TCP address.
Bên Winsock Server, giả dụ tên của Winsock control là myWinsock và myPortNo là một con số thí dụ như 101, ta viết:
Code:
myWinsock.LocalPort = myPortNo
myWinsock.Listen
Bên Winsock Client, giả dụ tên của Winsock control là myWinsock, myPortNo là một con số dùng cho Winsock Server và TCPAddress là địa chỉ TCP của Server computer (hay có thể là tên của Server Computer mà System đổi thành TCP address được) ta viết:
Code:
myWinsock.Connect TCPAddress, myPortNo
Nếu mọi việc êm xuôi bên Client sẽ nhận được một Event ConnectionRequest với một RequestID. Bên Client lập tức phải Accept RequestID đó như sau:
Code:
Private Sub myWinsock_ConnectionRequest(ByVal RequestID As Long)
' Pass the value of the requestID parameter to the Accept method.
myWinsock.Accept RequestID
End Sub
Ðến đây thì Connection đã được thiết lập. Sau đó cả hai bên đều có thể tự do gởi những Text messages cho nhau. Mỗi khi một bên gởi một Text message, đầu kia sẽ nhận được một Event DataArrival và sẽ đọc message như sau:
Code:
Private Sub myWinsock_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
' Read the incoming data
myWinsock.GetData strData, vbString
' Process message ....
' ....
End Sub
Nếu chuyện đời chỉ đơn giản như vậy thôi thì không có gì phải nói thêm. Khổ nổi nếu một trong hai program terminates (stop), đầu kia không biết chuyện ấy cho đến khi nó vô tình gởi một message kế đó mới khám phá ra đối tượng đã cuốn gói sang ngang.
Bây giờ làm sao nối lại duyên xưa? Giả sử Server stops trước, thì Client phải cố gắng Connect nhiều lần mới hy vọng có kết quả. Ngược lại, nếu Client stops trước, dầu Server có Listen thêm cũng không biết chừng nào nghe được vì nó phải Close cái Connection rồi Listen trở lại mới được.
Do đó ta có Class clsWinsock nầy.
Ðặc điểm của clsWinsock là nó có thể nối lại Connection bất cứ lúc nào, tức là hể khi nào hai program cùng chạy là chúng nối nhau. Và hể khi một trong hai program stop là bên kia biết ngay. Ðể đạt được các ưu điểm ấy ta làm các việc sau:
Khi có Connection, cứ mỗi chút xíu (1 hay 2 seconds) mỗi program hỏi bên kia còn thức không. Nếu gặp Error thì là bên kia đã stop. Nếu bên kia nghe được nó sẽ trả lời OK. Thật ra việc trả lời không quan trọng lắm. Ðể làm việc nầy ta cần một Timer gọi là WatchdogTimer hay DeadManTimer.
Khi biết đầu kia đã stop, thì bên nầy tìm cách nối lại. Nếu là Server thì Listen, nếu là Client thì Connect, và mỗi lần tìm cách nối lại (every 2 seconds) nhớ Close cái existing Connection. Ðể làm việc nầy ta cần một Timer gọi là ReconnectTimer.
Trong thí dụ nầy bạn có một program chánh tên là WinsockTest.vbp. Bạn có thể sửa một chút trong Sub Form_Load để dùng nó làm Server hay Client để test cho hai programs nói chuyện với nhau.
Listing của Sub Form_Load như sau:
Code:
Private Sub Form_Load()
Set Winsck = New clsWinsock
' There's no need to supply the TCP address
' The port number is arbitrary, but must be the same in both Server and Client, eg: 102
'-------- Use the next three lines for a server.
Me.Caption = "Winsock Server"
Text1.Text = "Greeting from Server"
Call Winsck.MakeConnection(Winsock1, "", 102, True, Timer1, Timer2)
'-------------------------------------------END for Server
' You must supply the TCP address of the Server, eg: "192.168.0.1"
'-------- Use the next three lines for a client.
' Me.Caption = "Winsock Client"
' Text1.Text = "Hello Server, this is Client calling"
' Call Winsck.MakeConnection(Winsock1, "192.168.0.1", 102, False, Timer1, Timer2)
'-------------------------------------------END for Client
lblStatus.Caption = "No Connection"
End Sub
Hình của Form gồm có một Winsock Control và hai Timers như sau:
Vì một VB6 Class không có Controls và không thể nhận parameters lúc initialise nên ta dùng một Public Sub MakeConnection để cung cấp cho clsWinsock các Controls cần thiết như Winsock và Timers.
Code:
Public Sub MakeConnection(theWinsock, theTCPAddress, PortNo, beingAServer, Timer1, Timer2)
On Error Resume Next
Set myWinsock = theWinsock
Set DeadManTimer = Timer1 ' Use Timer1 as DeadManTimer
DeadManTimer.Enabled = False ' Disable DeadManTimer initially
DeadManTimer.Interval = 2000 ' 2 seconds
Set ReConnectTimer = Timer2 ' Use Timer2 as ReConnectTimer
ReConnectTimer.Enabled = False ' Disable ReConnectTimer initially
ReConnectTimer.Interval = 2000 ' 2 seconds
TCPAddress = theTCPAddress ' the address may also be the server computer name, i.e: "server01"
myPortNo = PortNo ' same Port No. must be used for both server and client
IamServer = beingAServer
' No Connection initially
ConnectionEstablished = False
' Server listens , Client connects, both refreing to the same Port No.
If IamServer Then
myWinsock.LocalPort = myPortNo
myWinsock.Listen
Else
myWinsock.Connect TCPAddress, myPortNo
End If
' Schedule to reconnect
ReConnectTimer.Enabled = True
End Sub
clsWinsock có thể raise ba Events là Connected, Disconnected và DataArrived (Mess). Trong frmTestWinsock ta dùng các Events Connected và Disconnected để update property Caption của Label nằm ở góc bên trái phía dưới để display "No connection" hay "Connection established". Trong thực tế ta có thể dùng các Event nầy để display một hình tròn nhỏ màu xanh lá cây hay màu đỏ, chẳng hạn. Parameter Mess của Event DataArrived là incoming message mà ta cần xử lý.
Có điểm bạn cần lưu ý là nhiều khi hai ba messages khác nhau nối thành một message mà bạn nhận được. Do đó bạn cần phải có cách để tách chúng ra. Thí dụ bạn nhận được một message gồm ba messages nhỏ đến liên tiếp như sau:
Code:
<V>Cardkey 1234 Valid entry<E>Cardkey 4356 Exit<I>Cardkey 6423 Invalid Cardkey
Bạn có thể dùng Class clsString để ngắt khúc chúng dựa vào delimiter character < rồi xử lý chúng như sau:
Code:
Dim i, AMessage
Dim DString as clsString
Set DString = New clsString
' prefix the dummy character "*"
IncomingMessage = "*" & IncomingMessage
DString.Text = IncomingMessage
DString.Delmiter = "<"
' Ignore the first token which is the dummy character "*"
For i= 2 to DString.TokenCount
AMessage = "<" & DString.TokenAt(i)
Select Case Left(AMessage,3)
Case "<E>"
' Process Exit Cardkey
Case "<I>"
' Process Invalid Cardkey
Case "<V>"
' Process Valid Entry Cardkey
End Select
Next
http://www.vovisoft.com/visualbasic/clsWinsock.htm
|
|
|
T rong VB6 Integrated Development Environment, khi ta edit source codes các hàng Comment (chú thích) được hiển thị bằng màu xanh lá cây và các Reserved Words của VB6 đuợc hiển thị bằng màu xanh dương đậm. Ðiều nầy làm mát mắt, khiến cho codes dễ đọc.
Tiếc thay khi ta copy các hàng codes ấy ra và paste vào trong một trang Web thì chúng bị mất đi đặc tính màu sắc. Nếu codes không có comment thì khó hiểu. Ngược lại nếu comment nhiều quá, người đọc dễ lẫn lộn codes với comment.
Do đó trong bài nầy ta viết một program VB6 để thực hiện hai chuyện:
Làm cho source code đẹp bằng cách thêm phía trước mỗi hàng codes một số blank spaces để ta thấy rõ phần nào nằm trong phần nào trong cấu trúc của codes.
Thêm màu xanh lá cây cho comment và màu xanh dương cho VB6 reserved words để hiển thị trên trang Web.
Làm cho codes đẹp phát xuất từ chữ Pretty Printer hồi thời Pascal rất thịnh hành. Pascal là ngôn ngữ lập trình đuợc sang tác bởi giáo sư N. Wirth, người Thụy Sĩ, để dùng làm phương tiện dạy sinh viên những kiến thức và kỹ thuật căn bản về Software Engineering. Một trong những đặc điểm của Pascal là nó có những Statement Blocks (đoạn codes) để dùng trong Structured Programming, tức là có IF..THEN..ELSE, REPEAT..UNTIL, CASE .v.v.., thay vì cái gì cũng Goto làm cho khó theo dõi codes vì nó nhảy lung tung giống như spaghetti (bánh tầm Ý).
Statement Block trong Pascal được bắt đầu bằng chữ Begin và chấm dứt bằng chữ End. Cái đó không có gì đáng nói, nhưng khi cái Structure (cơ cấu) của program chúng ta trở nên rắc rối, ta cần phải thấy từng cặp Begin-End rõ ràng. Tốt hơn hết là làm sao mỗi chữ End nằm ngay phía dưới chữ Begin của nó, dầu có cách bao nhiêu hàng. Codes sẽ lồi ra, thụt vô theo đẳng cấp rõ ràng, trông rất ÐẸP (PRETTY).
Vì hồi xưa có phương tiện Edit source code trên một Terminal ( một trong những màn ảnh nối về một computer chánh) là có phước lắm rồi, nên đòi hỏi Editor làm Pretty Codes cho mình thì hơi quá đáng. Do đó người ta phải dùng một program khác để làm Pretty Codes.
Ở đây, chúng ta sẽ thực hiện công tác Pretty Code, đồng thời đi thêm một bước nữa là thêm màu cho codes trong trang Web. Ta sẽ tận dụng Listbox và các String Functions của VB6. Ðầu tiên, ta Load content của một Text File chứa VB6 source code vào ListBox lstCodes. Khi User clicks nút Pretty Codes program sẽ làm hai chuyện sau đây:
Làm cho code đẹp
Kết quả của code đẹp được chứa trong Listbox lstPretty. Nguyên tắc chính trong công tác nầy là lưu ý những chữ như IF, DO, WHILE ..v.v. là những chữ đứng đầu của một Statement Block. Các statements thuộc về Statement Block ấy sẽ nằm thụt vô một TAB position (3 spaces chẳng hạn).
Kế đó khi gặp môt chữ END hay LOOP, là chữ đúng cuối một Statement Block, thì chính nó sẽ nằm lồi ra một TAB position trở lại.
Có một trường hợp cần lưu ý là Statement IF có thể kết thúc trên cùng một hàng, tức là nó có thêm code nằm sau chữ THEN. Trong trường hợp ấy, chữ IF không phải là đầu một Statement Block nên ta không cần phải tăng TAB position, tức là hàng kế tiếp không cần phải thụt vô.
Các chữ ELSE, ELSEIF và CASE là những chữ vừa là cuối một Statement Block, vừa là đầu một Statement Block kế đó. Nên chỉ có chính nó lồi ra thôi, hàng code kế tiếp thụt vô trở lại. Pretty Codes hiện ra như trong hình dưới đây:
Thêm màu cho trang Web
Một bảng liệt kê các Reserved Words của VB6 cũng đuợc loaded vào trong Listbox lstReservedWords. Nếu danh sách ấy chưa đủ, bạn có thể Edit thêm các chữ khác vào file ReservedWords.txt.
Hầu hết các Reserved Words đều nằm riêng một mình và cách một blank space với characters kế nó. Tuy nhiên bạn phải coi chừng khi chữ ấy nằm ở đầu hay cuối hàng. Trong trường hợp đó nó không có leading (nằm phía trước) hay trailing (nằm phía sau) blank space.
Sở dĩ ta phải chú ý điểm nầy là vì khi ta so sánh whole-word (nguyên chữ) ta phải phân biệt chữ As đứng riêng một mình (là một Reserved Word) với chữ HAs. Thành ra ta tìm chữ " As " (có space hai đầu), chớ không phải chữ "As".
Một hàng Comment thường bắt đầu bằng dấu single quote '. Ðôi khi phía sau một hàng code cũng có Comment. Do đó ta xem trường hợp thứ nhất như là đặc biệt khi Comment không có codes nằm phía trước. Trong program ta dùng một Browser để display kết quả trang Web.
Program nầy cho phép bạn Paste VB6 Source code từ Clipboard vào ListBox lstCodes, bằng cách click nút Paste Codes hay press Ctrl-V. Nó sẽ thay thế codes có sẵn trong lstCodes. Sau khi làm pretty code, kết quả HTML sẽ được tự động lưu trử trong file codes.htm. Bạn cũng có thể copy một số hàng HTML codes trong Listbox lstColor bằng cách multiselect nhiều hàng rồi click nút Copy HTML hay press Ctrl-C.
Dưới đây là mẫu của HTML codes với màu:
Code:
Function SimilarWords(ByVal Word, ByVal ILen, ByVal TWord, ByVal Tlen) As Boolean
' Two words are considered Similar if the shorter word has at least (its length minus 2)
' characters that are found in the other word.
' In other words, the two words differ only a couple characters at the most.
Dim L1, L2, W1, W2
Dim i, MatchCount, Pos
' Identify the shorter Word and its length
If ILen > Tlen Then
L1 = ILen
L2 = Tlen
W1 = UCase(Word)
W2 = UCase(TWord)
Else
L1 = Tlen
L2 = ILen
W1 = UCase(TWord)
W2 = UCase(Word)
End If
MatchCount = 0
' Iterate through each character of the shorter word, i.e. W2
For i = 1 To L2
' Locate a character of W2 in W1
Pos = InStr(W1, Mid(W2, i, 1))
If Pos > 0 Then
' Increment the number of same characters
MatchCount = MatchCount + 1
' Temporary remove the matched character from W1
W1 = Left(W1, Pos - 1) & Mid(W1, Pos + 1)
End If
Next
If MatchCount >= (L2 - 2) Then
SimilarWords = True
Else
SimilarWords = False
End If
End Function
http://www.vovisoft.com/webdev/PrettyCode.htm
|
|
|
ISO (International Standard Organisation) 10646 là tiêu chuẩn quốc tế nhằm cung ứng đủ số ký tự để dùng cho mọi chữ của tất cả ngôn ngữ trên thế giới. Thay vì dùng 8 bits để biểu diễn chỉ 255 dấu hiệu, bây giờ người ta dùng đến 16 bits để có thể biểu diễn đến trên 65000 dấu hiệu.
Hãy tưởng tượng một bài viết có thể chứa nhiều ngôn ngữ cùng một lúc. Hay môt chương trình hiển thị các đề mục bằng ngôn ngữ địa phương, vì khi chương trình phát động nó nhận diện ra ngay là nó đang đuợc chạy ở xứ nào bằng cách đọc Locale từ Windows .
Một trong những ưu điểm của tiêu chuẩn nầy là sự cố gắng để xáp nhập các tiêu chuẩn 8 bit có sẵn để không cần phải thay đổi chúng. Thật ra ISO 10646 là tiêu chuẩn quốc tế chính thức, còn Unicode thì được Unicode Consortium (tập hợp đại diện các công ty Tin Học lớn) soạn ra. Nhưng cả hai tiêu chuẩn gần như y hệt nhau khi nói đến con số dùng để biểu diễn một chữ, con số nầy đuợc gọi là code point. Thí dụ như code point của chữ ả là 1EA3, của chữ ơ là 01A1. Ðể biểu diễn một code point, tùy theo cách encoding, có khi ta cần 1, 2, 3 hay 4 bytes .v.v., mỗi byte dùng cho code point người ta không gọi là byte hay octet, mà lại gọi là code unit. Thỉnh thoảng, Unicode được cập nhật hóa, và ấn bản mới nhất hiện giờ là 3.0.1.
ISO 10646 định nghĩa hai bộ CCS (Coded Character Sets), UCS-2 và UCS-4. UCS-2 dùng 16 bits và là một phần nhỏ (subset) của UCS-4.
UCS-4 là một CCS dùng 31bits, chia thành 4 nhóm như sau:
7 bits 8 bits 8 bits 8 bits
1111111 11111111 11111111 11111111
Group Plane Row Cell
Cái Plane đầu tiên của UCS-4 với giá trị Group=0, Plane=0 cũng là chính UCS-2. Nó còn đuợc gọi là BMP (Basic Multilingual Plane).
Code points trong UCS thường được viết dưới dạng u+????, mà ???? là con số hexadecimal của code point. Characters có giá trị trong khoảng từ u+0021 đến u+007E thì giống như ASCII và các characters trong khoảng từ u+00A0 đến u+00FF thì giống như ISO 8859-1. Do đó rất dễ cho ta hoán chuyển giữa ASCII hay ISO 8859-1 với UCS.
Unicode (version 3.0.1) thì dùng 20bit subset của UCS-4 làm Coded Character Set.
Những Character Encoding Schemes
Có vài Character Encoding Schemes được đưa ra dùng: đó là UTF-8, UTF-16, UTF-16LE, và UTF-16BE. UTF là viết tắt chữ Unicode Transformation Format.
UTF-16
UTF-16 là một cách encoding dùng 20bit Unicode. Các characters trong BMP được diễn tả bằng cách dùng giá trị 16bit của code point trong Unicode CCS. Có hai cách để viết 16bit value trong một dòng (stream) 8bit . Có lẽ bạn đã nghe qua chữ endian. Big Endian có nghĩa là cho Most Significant Byte đi trước, tức là nằm bên trái - do đó ta có UTF-16BE. Còn Little Endian thì ngược lại, tức là Least Significant Byte đi trước - do đó ta có UTF-16LE. Thí dụ, giá trị 16bit của con số Hex1234 được viết là Hex12 Hex34 trong big endian và Hex34 Hex12 trong little endian.
Những characters không nằm trong BMP đuợc biểu diễn bằng cách dùng surrogate pair (cặp thay thế). Code points có giá trị từ u+D800 đến u+DFFF được dành riêng ra để dùng cho mục đích nầy. Trước hết, một code point có 20 bits được phân ra làm hai nhóm 10 bits. Nhóm Most Significant 10 bits đuợc mapped vào một giá trị 10bit nằm trong khoảng từ u+D800 đến u+DBFF. Nhóm Least Significant 10 bits đuợc mapped vào một giá trị 10bit nằm trong khoảng từ u+DC00 đến u+DFFF. Theo cách đó UTF-16 có thể biểu diễn được những characters Unicode có 20bits.
UTF-8
UTF-8 là một cách encoding để có tác dụng y như UCS-4 (cũng là UTF-16), chớ không phải có code point nào khác. UTF-8 được thiết kế cho upward-compatible với ASCII. UTF-8 không phải là chỉ dùng một byte, nhưng là dùng nhiều bytes - từ 1 đến 6 bytes.
Cách hoán chuyển UTF-16 qua UTF-8 và ngược lại đuợc làm theo bảng dưới đây. Trong Table dưới đây, những binary (Nhị phân) bits nằm bên trái của UTF-16 đuợc chuyển qua bên phải của UTF-8 theo cùng một màu như chỉ dẩn. Ta hãy thử lấy thí dụ chữ ả với code point, hay UTF-16, 1EA3. UTF-8 bytes của nó là E1BAA3
UCS-4 (UTF-16)
1 E A 3
0001 1110 1010 0011
UTF-8
1110 ???? 10?? ???? 10?? ????
1110 0001 1011 1010 1010 0011
E 1 B A A 3
UTF-16 (Nhị phân) UTF-8 (Nhị phân)
00000000 00000000 00000000 0??????? 0???????
00000000 00000000 00000??? ???????? 110????? 10??????
00000000 00000000 ???????? ???????? 1110???? 10?????? 10??????
00000000 000????? ???????? ???????? 11110??? 10?????? 10?????? 10??????
000000?? ???????? ???????? ???????? 111110?? 10?????? 10?????? 10?????? 10??????
0??????? ???????? ???????? ???????? 1111110? 10?????? 10?????? 10?????? 10?????? 10??????
Vì chúng ta chỉ làm việc với một số tương đối ít Unicode code points ( tổng cộng 134 ký tự) và UTF-8, bạn có thể hoặc dùng một Look-up table dựa theo Bản đối chiếu, hoặc dùng hai Functions ToUTF8 và ToUTF16 với Listings như dưới đây để hoán chuyển từ encoding UTF-16 ra UTF-8, và ngược lại:
Code:
Function ToUTF8(ByVal UTF16 As Long) As Byte()
' Convert a 16bit UTF-16BE to 2 or 3 UTF-8 bytes
Dim bArray() As Byte
If UTF16 < &H80 Then
ReDim bArray(0) ' one byte UTF-8
bArray(0) = UTF16 ' Use number as is
ElseIf UTF16 < &H800 Then
ReDim bArray(1) ' two byte UTF-8
bArray(1) = &H80 + (UTF16 And &H3F) ' Least Significant 6 bits
UTF16 = UTF16 \ &H40 ' Shift UTF16 number right 6 bits
bArray(0) = &HC0 + (UTF16 And &H1F) ' Use 5 remaining bits
Else
ReDim bArray(2) ' three byte UTF-8
bArray(2) = &H80 + (UTF16 And &H3F) ' Least Significant 6 bits
UTF16 = UTF16 \ &H40 ' Shift UTF16 number right 6 bits
bArray(1) = &H80 + (UTF16 And &H3F) ' Use next 6 bits
UTF16 = UTF16 \ &H40 ' Shift UTF16 number right 6 bits again
bArray(0) = &HE0 + (UTF16 And &HF) ' Use 4 remaining bits
End If
ToUTF8 = bArray ' Return UTF-8 bytes in an array
End Function
Function ToUTF16(bArray) As Long
' Convert 2 or 3 UTF-8 bytes to a 16bit UTF-16BE
Dim IntUB
IntUB = UBound(bArray) ' Find out how many bytes UTF-8 takes
Select Case IntUB
Case 0 ' one byte UTF-8. Note that bArray starts with index=0
ToUTF16 = bArray(0) ' Use number as is
Case 1 ' two byte UTF-8
ToUTF16 = (bArray(0) And &H1F) * &H40 + (bArray(1) And &H3F)
Case 2 ' three byte UTF-8
ToUTF16 = (bArray(0) And &HF) * &H1000 + (bArray(1) And &H3F) * &H40 + (bArray(2) And &H3F)
End Select
End Function
Dưới đây là kết quả khi bạn click nút UTF-16 -->UTF-8 rồi click nút UTF-8 -->UTF-16:
BOM (Byte Order Mark)
Vì Unicode nói chung hổ trợ UTF-16BE, UTF-16LE và UTF-8, nên để có thể biết được Text file trong Microsoft Windows đang chứa Unicode encoding kiểu nào, ở đầu mỗi Unicode Text file có 2 hay 3 bytes gọi là Byte Order Mark như sau:
Character Encoding Scheme Byte Order Mark
UTF-16BE FE FF
UTF-16LE FF FE
UTF-8 EF BB BF
Khi viết Unicode ra Text file trong MSWindows, nếu dùng UTF-8 bạn chỉ cần viết ở đầu file Byte Order Mark EF BB BF. Các bytes kế tiếp cứ theo đúng hoặc UTF-8 characters thì dùng 2 hay 3 bytes hoặc ANSI characters thì dùng 1 byte.
Nếu dùng UTF-16LE (còn gọi gọn là Unicode trong ngôn ngữ Microsoft) thì viết Byte Order Mark FF FE. Kế đó mỗi character phải viết ra 2 bytes dù là Unicode hay không. Nếu character chỉ cần 1 byte, kể cả các characters như Carriage Return (&H0D) và LineFeed (&H0A), thì viết thêm byte thứ nhì là 00 (Null byte). Thí dụ:
Character Encoding Scheme Các bytes viết ra Text file
Text của file á à ả
UTF-16LE FF FE E1 00 20 00 E0 00 20 00 A3 1E
UTF-8 EF BB BF C3 A1 20 C3 A0 20 E1 BA A3
Khi bạn đọc Text file vào từng byte một bằng VB6, nhớ mở File dưới dạng Binary (as Binary) để có thể thấy luôn cả các Null bytes. Nếu bạn mở File dưới dạng Text File (as Input) thì sẽ không thấy các Null bytes. Câu hỏi đặt ra là Text File với encoding UTF-16LE hay UTF-8 chiếm nhiều chỗ hơn. Câu trả lời là tùy theo trường hợp. Ðối với UTF-16 thì mỗi character cần 2 bytes, kể cả ANSI characters. Ðối với UTF-8 thì nếu là Unicode character thì cần 2 hay 3 bytes, còn ANSI character thì chỉ cần 1 byte.
Các Functions thông dụng cho Unicode
Hoán chuyển ký tự từ Thường ra Hoa
Chúng ta có tổng cộng 134 ký tự dùng cho các nguyên âm có dấu và hai chữ đ, Ð. Nếu trong program có chứa danh sách các Unicode với 67 chữ Thường theo sau bởi 67 chữ Hoa, ta có thể biến đổi một chữ từ LowerCase ra UpperCase, hay ngược lại rất dễ dàng.
Dưới đây là Listing của Function UpperUniChar
Code:
Function UpperUniChar(Ch) As String
' Return the Uppercase for a given vowel or dd
Dim Pos ' Position of character in Unicode vowel list
' Locate the character in list of Unicode vowels
Pos = InStr(UVowels, Ch)
If (Pos > 67) Then
UpperUniChar = Ch ' It's already uppercase - leave it alone
ElseIf (Pos > 0) Then
' It's a Lowercase Unicode Vowel - so get the corresponding Uppercase vowel in the list
UpperUniChar = Mid(UVowels, Pos + 67, 1)
Else
' It's just a normal ANSI character
UpperUniChar = UCase(Ch)
End If
End Function
Dưới đây là kết quả khi bạn click nút ToUppercase
Tương tự như vậy ta có Function LowerUniChar. Ðể hoán chuyển cả một Unicode String ra chữ thường hay chữ Hoa ta có các Function UpperUniStr và LowerUniStr.
Ngoài ra ta cũng có các Functions IsUniChar, IsUpperUniChar để kiểm tra xem character có phải là một Unicode Vowel hay là một Unicode Vowel Hoa.
Function GetFileEncoding giúp ta nhận diện một Text file đã được encoded theo UTF-16LE, UTF-8 hay ANSI.
Hoán chuyển ký tự cho trang Web
Và sau cùng Function ToUniDecimal đổi Unicode characters ra dạng ✏ thích hợp cho các trang Web. Listing của Function ToUniDecimal như sau:
Code:
Function ToUniDecimal(UniString As String) As String
' Return the HTML equivalent string of a Unicode string
Dim i As Integer ' Must declare as integer for CopyMemory to work
Dim TLen, TStr
Dim b1 As Byte
Dim b2 As Byte
Dim UTF16 As Long
TLen = Len(UniString) ' Get Length of input Unicode string
If TLen = 0 Then Exit Function ' Get out if null string
' Iterate through each character in the string
For i = 1 To TLen
If IsUniChar(Mid(UniString, i, 1)) Then
' Cast the String character to 2 bytes
CopyMemory b1, ByVal StrPtr(UniString) + ((i - 1) * 2), 1
CopyMemory b2, ByVal StrPtr(UniString) + ((i - 1) * 2) + 1, 1
' Combine the 2 bytes into the Unicode UTF-16
UTF16 = b2 ' assign b2 to UTF16 before multiplying by 256 to avoid overflow
UTF16 = UTF16 * 256 + b1
' Convert UTF-16 to format ✏ for HTML
TStr = TStr & "" & Trim(CStr(UTF16)) & ";"
Else
' Get here if it;s an ANSI character
TStr = TStr & Mid(UniString, i, 1)
End If
Next
ToUniDecimal = TStr ' Return the HTML string
End Function
Dưới đây là kết quả khi bạn click nút ToUniDecimal
Ðọc viết Text file dưới dạng Unicode và UTF-8
Program Microsoft Notepad trong WindowsNT cho ta đánh Text dưới dạng ANSI, Unicode hay UTF-8. Ta có thể lập trình VB6 để đọc và viết Text file dưới cả hai dạng của Unicode. Khi Microsoft dùng chữ Save As Unicode là nói đến UTF-16LE.
Cách gọn và tiện nhất để đọc và viết Unicode (UTF-16LE) là dùng FileSystemObject của Microsoft Script Runtime. Khi Fs.OpenTextFile nhớ dùng TristateTrue để cho biết bạn muốn đọc viết Unicode Text.
Code:
Public Function ReadTextFile(FileName) As String
' Write a Unicode String to UTF-16LE Text file
' Remember to Project | References "Microsoft Scripting Runtime" to support
' FileSystemObject & TextStream
Dim Fs As FileSystemObject
Dim TS As TextStream
' Create a FileSystem Object
Set Fs = CreateObject("Scripting.FileSystemObject")
' Open TextStream for Input.
' TriStateTrue means Read Unicode UTF-16LE
Set TS = Fs.OpenTextFile(FileName, ForReading, False, TristateTrue)
ReadTextFile = TS.ReadAll ' Read the whole content of the text file in one stroke
TS.Close ' Close the Text Stream
Set Fs = Nothing ' Dispose FileSystem Object
End Function
Public Sub WriteTextFile(FileName, StrOutText)
' Read a Unicode String from UTF-16LE Text file
' Remember to Project | References "Microsoft Scripting Runtime" to support
' FileSystemObject & TextStream
Dim Fs As FileSystemObject
Dim TS As TextStream
' Create a FileSystem Object
Set Fs = CreateObject("Scripting.FileSystemObject")
' Open TextStream for Output, create file if necesssary
' TriStateTrue means Write Unicode UTF-16LE
Set TS = Fs.OpenTextFile(FileName, ForWriting, True, TristateTrue)
TS.Write StrOutText ' Write the whole StrOutText string in one stroke
TS.Close ' Close the Text Stream
Set Fs = Nothing ' Dispose FileSystem Object
End Sub
Cách gọn và tiện nhất để đọc và viết UTF-8 text files là dùng một VB6 Class tên clsUnicodeText dựa vào MS DOM (Document Object Model) và XML như sau:
Code:
Dim MyUnicodeText As clsUnicodeText
Set MyUnicodeText = New clsUnicodeText
' Read Unicode Text from file txtFileName and display in TextBox1
TextBox1.Text = MyUnicodeText.ReadUnicode(txtFileName)
Listing của Class clsUnicodeText như sau:
Option Explicit
Private mDOMTextFile As DOMDocument
Private mXMLPath As String
Public Function ReadUnicode(TXMLPath)
Dim objTextFileRoot As IXMLDOMElement
Set mDOMTextFile = New DOMDocument
mXMLPath = TXMLPath
mDOMTextFile.Load mXMLPath
'start at the root element of the XML
Set objTextFileRoot = mDOMTextFile.documentElement
ReadUnicode = objTextFileRoot.nodeTypedValue
End Function
Public Sub WriteUnicode(OutText, Optional TXMLPath)
Dim tDOMNode As IXMLDOMElement ' Temporary Node for DOM
If IsMissing(TXMLPath) Then
' Save the information on the screen by creating a new element and add its children to the DOM object
mDOMTextFile.documentElement.Text = OutText
' Update the XML file
mDOMTextFile.save mXMLPath
Else
Set mDOMTextFile = New DOMDocument
' Create a Node called "Text" in DOM
Set tDOMNode = mDOMTextFile.createElement("Text")
' Make it the Root Node
mDOMTextFile.appendChild tDOMNode
' Assign Output Text to Root Node
mDOMTextFile.documentElement.Text = OutText
' Update the XML file
mDOMTextFile.save TXMLPath
End If
End Sub
Nhưng nếu bạn muốn viết và đọc trực tiếp một Text file với encoding UTF-16LE hay UTF-8 thì bạn cũng có thể làm được với VB6 bằng cách đọc và viết trong Binary mode, tức là Open file as Binary.
Khi viết ra thì sau khi viết BOM bytes, ta viết hoặc 2 bytes cho mỗi UTF-16 character trong UTF-16LE encoding, hoặc 2 hay 3 bytes cho Unicode character và 1 byte cho ANSI trong UTF-8 encoding.
Khi đọc vào, đối với UTF-16LE thì ta dùng trực tiếp 2 bytes cho mỗi character, nhưng đối với UTF-8 thì ta phải nhận ra &HE1 là byte đi đầu của 3 byte character , &HC3, &HC4, &HC5 và &HC6 là byte đi đầu của 2 byte character, để có thể hoán chuyển ra Unicode character cho input string. Các kỹ thuật nầy được cắt nghĩa trong Listing của Function UTF8ToUniStr như dưới đây:
Code:
Function UTF8ToUniStr(BArray) As String
' Convert a byte stream of UTF-8 to Unicode String
Dim i As Long
Dim TopIndex As Long
Dim TwoBytes(1) As Byte
Dim ThreeBytes(2) As Byte
Dim AByte As Byte
Dim TStr As String
TopIndex = UBound(BArray) ' Number of bytes equal TopIndex+1
If TopIndex = 0 Then Exit Function ' get out if there's nothing to convert
i = 0 ' Initialise pointer
' Iterate through the Byte Array
Do While i <= TopIndex
AByte = BArray(i) ' fetch a byte
If AByte = &HE1 Then
' Start of 3 byte UTF-8 group for a character
' Copy 3 byte to ThreeBytes
ThreeBytes(0) = BArray(i): i = i + 1
ThreeBytes(1) = BArray(i): i = i + 1
ThreeBytes(2) = BArray(i): i = i + 1
' Convert Byte array to UTF-16 then Unicode
TStr = TStr & ChrW(ToUTF16(ThreeBytes))
ElseIf (AByte >= &HC3) And (AByte <= &HC6) Then
' Start of 2 byte UTF-8 group for a character
TwoBytes(0) = BArray(i): i = i + 1
TwoBytes(1) = BArray(i): i = i + 1
' Convert Byte array to UTF-16 then Unicode
TStr = TStr & ChrW(ToUTF16(TwoBytes))
Else
' Normal ANSI character - use it as is
TStr = TStr & Chr(AByte): i = i + 1 ' Increment byte array index
End If
Loop
UTF8ToUniStr = TStr ' Return the resultant string
End Function
Những References và Components hổ trợ Unicode trong VB6
Trước hết muốn hiển thị Unicode cho chữ Việt ta cần phải dùng Menu command của VB6 IDE để Project | Components Microsoft Forms 2.0 Object Library. Cái ActiveX nầy cho ta những Label, TextBox, Listbox và ComboBox cần thiết để hiển thị chữ Việt trong Unicode.
Kế đó, để tiện việc đọc và viết chữ Việt dưới dạng UTF-8, ta chứa Unicode text file trong một XML file giữa một cặp tags tên Text hay tên gì cũng được (đó cũng là root node) , rồi dùng Microsoft Document Object Model (DOM) để đọc và viết chữ Việt. Bạn nhớ Project | References Microsoft XML, v3.0. Nguyên phần Text là nodeTypedValue của root node của DOM.
Làm như thế ta khỏi phải đọc từng byte rồi tìm cách chuyển data ấy qua Unicode String. Ở đây xin nhấn mạnh là bạn phải vui lòng dùng MSWindowsNT hay MSWindows2000 mới được. Bạn có thể dùng Notepad trong WindowsNTđể edit XML file chứa chữ Việt và lưu trử dưới format UTF-8.
Ngoài ra để hiển thị record data chữ Việt Unicode trong một Grid bạn cũng cần phải Project | Components Microsoft Hierarchical FlexGrid Control 6.0 (OLEDB).
Một khi Unicode text đã đuợc đọc vào trong VB6 Text String rồi, nó đuợc dùng y hệt như cho ANSI characters. Ðó là vì bên trong VB6 mỗi Unicode character hay ANSI character đều chiếm 2 bytes. Nói như thế có nghĩa là các Functions Left, Mid, InStr đều có thể đuợc dùng cho Unicode Text String như một ANSI String bình thường.
Xin lưu ý: Hình chữ Ð có hai code points: &HD0 và &H110. Code point &HD0 là của chữ Latin Eth hoa ( chữ Latin Eth thường là ð) , còn code point &H110 là của chữ Latin d hoa với stroke ( chữ Latin d thường với stroke là đ ) . Do đó ta phải dùng code point &H110. Bạn có thể copy chữ Ð nầy ngay từ Browser để paste vào chỗ nào cần thiết
(vovisoft)
|
|
|
bạn chỉ cần tìm được driver của nó về cài là chạy được rồi.
|
|
|
sql server 2000
SQL Server 2000 là một hệ thống quản lý cơ sở dữ liệu (Relational Database Management System (RDBMS) ) sử dụng Transact-SQL để trao đổi dữ liệu giữa Client computer và SQL Server computer. Một RDBMS bao gồm databases, database engine và các ứng dụng dùng để quản lý dữ liệu và các bộ phận khác nhau trong RDBMS.
SQL Server 2000 được tối ưu để có thể chạy trên môi trường cơ sở dữ liệu rất lớn (Very Large Database Environment) lên đến Tera-Byte và có thể phục vụ cùng lúc cho hàng ngàn user. SQL Server 2000 có thể kết hợp "ăn ý" với các server khác như Microsoft Internet Information Server (IIS), E-Commerce Server, Proxy Server....
SQL Server có 7 editions:
Enterprise : Chứa đầy đủ các đặc trưng của SQL Server và có thể chạy tốt trên hệ thống lên đến 32 CPUs và 64 GB RAM. Thêm vào đó nó có các dịch vụ giúp cho việc phân tích dữ liệu rất hiệu quả (Analysis Services)
Standard : Rất thích hợp cho các công ty vừa và nhỏ vì giá thành rẻ hơn nhiều so với Enterprise Edition, nhưng lại bị giới hạn một số chức năng cao cấp (advanced features) khác, edition này có thể chạy tốt trên hệ thống lên đến 4 CPU và 2 GB RAM.
Personal: được tối ưu hóa để chạy trên PC nên có thể cài đặt trên hầu hết các phiên bản windows kể cả Windows 98.
Developer : Có đầy đủ các tính năng của Enterprise Edition nhưng được chế tạo đặc biệt như giới hạn số lượng người kết nối vào Server cùng một lúc.... Ðây là edition mà các bạn muốn học SQL Server cần có. Chúng ta sẽ dùng edition này trong suốt khóa học. Edition này có thể cài trên Windows 2000 Professional hay Win NT Workstation.
Desktop Engine (MSDE): Ðây chỉ là một engine chạy trên desktop và không có user interface (giao diện). Thích hợp cho việc triển khai ứng dụng ở máy client. Kích thước database bị giới hạn khoảng 2 GB.
Win CE : Dùng cho các ứng dụng chạy trên Windows CE
Trial: Có các tính năng của Enterprise Edition, download free, nhưng giới hạn thời gian sử dụng.
Cài Ðặt SQL Server 2000 (Installation)
Các bạn cần có Developer Edition và ít nhất là 64 MB RAM, 500 MB hard disk để có thể install SQL Server. Bạn có thể install trên Windows Server hay Windows XP Professional, Windows 2000 Professional hay NT Workstation nhưng không thể install trên Win 98 family.
Vì một trong những đặc điểm của các sản phẩm Microsoft là dễ install nên chúng tôi không trình bày chi tiết về cách install hay các bước install mà chỉ trình bày các điểm cần lưu ý khi install mà thôi. Nếu các bạn gặp trở ngại trong việc install thì có thể đưa lên forum để hỏi thêm. Khi install bạn cần lưu ý các điểm sau:
Ở màn hình thứ hai bạn chọn Install Database Server. Sau khi install xong SQL Server bạn có thể install thêm Analysis Service nếu bạn thích.
Ở màn hình Installation Definition bạn chọn Server and Client Tools.
Sau đó bạn nên chọn kiểu Custom và chọn tất cả các bộ phận của SQL Server. Ngoài ra nên chọn các giá trị mặc định (default)
Ở màn hình Authentication Mode nhớ chọn Mixed Mode . Lưu ý vì SQL Server có thể dùng chung chế độ bảo mật (security) với Win NT và cũng có thể dùng chế độ bảo mật riêng của nó. Trong Production Server người ta thường dùng Windows Authetication vì độ an toàn cao hơn và dễ dàng cho người quản lý mạng và cả cho người sử dụng. Nghĩa là một khi bạn được chấp nhận (authenticated) kết nối vào domain thì bạn có quyền truy cập dữ liệu (access data) trong SQL Server. Tuy nhiên ta nên chọn Mixed Mode để dễ dàng cho việc học tập.
Sau khi install bạn sẽ thấy một icon nằm ở góc phải bên dưới màn hình, đây chính là Service Manager. Bạn có thể Start, Stop các SQL Server services dễ dàng bằng cách double-click vào icon này.
Một chút kiến thức về các Version của SQL Server
SQL Server của Microsoft được thị trường chấp nhận rộng rãi kể từ version 6.5. Sau đó Microsoft đã cải tiến và hầu như viết lại một engine mới cho SQL Server 7.0. Cho nên có thể nói từ version 6.5 lên version 7.0 là một bước nhảy vọt. Có một số đặc tính của SQL Server 7.0 không tương thích với version 6.5. Trong khi đó từ Version 7.0 lên version 8.0 (SQL Server 2000) thì những cải tiến chủ yếu là mở rộng các tính năng về web và làm cho SQL Server 2000 đáng tin cậy hơn.
Một điểm đặc biệt đáng lưu ý ở version 2000 là Multiple-Instance. Nói cho dễ hiểu là bạn có thể install version 2000 chung với các version trước mà không cần phải uninstall chúng. Nghĩa là bạn có thể chạy song song version 6.5 hoặc 7.0 với version 2000 trên cùng một máy (điều này không thể xảy ra với các version trước đây). Khi đó version cũ trên máy bạn là Default Instance còn version 2000 mới vừa install sẽ là Named Instance.
Các thành phần quan trọng trong SQL Server 2000
SQL Server 2000 được cấu tạo bởi nhiều thành phần như Relational Database Engine, Analysis Service và English Query.... Các thành phần này khi phối hợp với nhau tạo thành một giải pháp hoàn chỉnh giúp cho việc lưu trữ và phân tích dữ liệu một cách dễ dàng.
Relational Database Engine - Cái lõi của SQL Server:
Ðây là một engine có khả năng chứa data ở các quy mô khác nhau dưới dạng table và support tất cả các kiểu kết nối (data connection) thông dụng của Microsoft như ActiveX Data Objects (ADO), OLE DB, and Open Database Connectivity (ODBC). Ngoài ra nó còn có khả năng tự điều chỉnh (tune up) ví dụ như sử dụng thêm các tài nguyên (resource) của máy khi cần và trả lại tài nguyên cho hệ điều hành khi một user log off.
Replication - Cơ chế tạo bản sao (Replica):
Giả sử bạn có một database dùng để chứa dữ liệu được các ứng dụng thường xuyên cập nhật. Một ngày đẹp trời bạn muốn có một cái database giống y hệt như thế trên một server khác để chạy báo cáo (report database) (cách làm này thường dùng để tránh ảnh hưởng đến performance của server chính). Vấn đề là report server của bạn cũng cần phải được cập nhật thường xuyên để đảm bảo tính chính xác của các báo cáo. Bạn không thể dùng cơ chế back up and restore trong trường hợp này. Thế thì bạn phải làm sao? Lúc đó cơ chế replication của SQL Server sẽ được sử dụng để bảo đảm cho dữ liệu ở 2 database được đồng bộ (synchronized). Replication sẽ được bàn kỹ trong bài 12
Data Transformation Service (DTS) - Một dịch vụ chuyển dịch data vô cùng hiệu quả
Nếu bạn làm việc trong một công ty lớn trong đó data được chứa trong nhiều nơi khác nhau và ở các dạng khác nhau cụ thể như chứa trong Oracle, DB2 (của IBM), SQL Server, Microsoft Access....Bạn chắc chắn sẽ có nhu cầu di chuyển data giữa các server này (migrate hay transfer) và không chỉ di chuyển bạn còn muốn định dạng (format) nó trước khi lưu vào database khác, khi đó bạn sẽ thấy DTS giúp bạn giải quyết công việc trên dễ dàng như thế nào. DTS sẽ được bàn kỹ trong bài 8.
Analysis Service - Một dịch vụ phân tích dữ liệu rất hay của Microsoft
Dữ liệu (Data) chứa trong database sẽ chẳng có ý nghĩa gì nhiều nếu như bạn không thể lấy được những thông tin (Information) bổ ích từ đó. Do đó Microsoft cung cấp cho bạn một công cụ rất mạnh giúp cho việc phân tích dữ liệu trở nên dễ dàng và hiệu quả bằng cách dùng khái niệm hình khối nhiều chiều (multi-dimension cubes) và kỹ thuật "đào mỏ dữ liệu" (data mining) sẽ được chúng tôi giới thiệu trong bài 13.
English Query - Một dịch vụ mà người Việt Nam chắc là ít muốn dùng (?)
Ðây là một dịch vụ giúp cho việc query data bằng tiếng Anh "trơn" (plain English).
Meta Data Service:
Dịch vụ này giúp cho việc chứa đựng và "xào nấu" Meta data dễ dàng hơn. Thế thì Meta Data là cái gì vậy? Meta data là những thông tin mô tả về cấu trúc của data trong database như data thuộc loại nào String hay Integer..., một cột nào đó có phải là Primary key hay không....Bởi vì những thông tin này cũng được chứa trong database nên cũng là một dạng data nhưng để phân biệt với data "chính thống" người ta gọi nó là Meta Data. Phần này chắc là bạn phải xem thêm trong một thành phần khác của SQL Server sắp giới thiệu sau đây là SQL Server Books Online vì không có bài nào trong loạt bài này nói rõ về dịch vụ này cả.
SQL Server Books Online - Quyển Kinh Thánh không thể thiếu:
Cho dù bạn có đọc các sách khác nhau dạy về SQL server thì bạn cũng sẽ thấy books online này rất hữu dụng và không thể thiếu được( cho nên Microsoft mới hào phóng đính kèm theo SQL Server).
SQL Server Tools - Ðây là một bộ đồ nghề của người quản trị cơ sở dữ liệu (DBA )
Ðầu tiên phải kể đến Enterprise Manager. Ðây là một công cụ cho ta thấy toàn cảnh hệ thống cơ sở dữ liệu một cách rất trực quan. Nó rất hữu ích đặc biệt cho người mới học và không thông thạo lắm về SQL.
Kế đến là Query Analyzer. Ðối với một DBA giỏi thì hầu như chỉ cần công cụ này là có thể quản lý cả một hệ thống database mà không cần đến những thứ khác. Ðây là một môi trường làm việc khá tốt vì ta có thể đánh bất kỳ câu lệnh SQL nào và chạy ngay lập tức đặc biệt là nó giúp cho ta debug mấy cái stored procedure dễ dàng.
Công cụ thứ ba cần phải kể đến là SQL Profiler. Nó có khả năng "chụp" (capture) tất cả các sự kiện hay hoạt động diễn ra trên một SQL server và lưu lại dưới dạng text file rất hữu dụng trong việc kiểm soát hoạt động của SQL Server.
Ngoài một số công cụ trực quan như trên chúng ta cũng thường hay dùng osql và bcp (bulk copy) trong command prompt.
(vovisoft)
|
|
|
có lẽ lên dùng mộtk phần mềm kiểm tra những chương trình chạy ẩn có thể phát hiện được một số loại.
|
|
|
mình kô được tham gia gửi bài ở phần (Forum Các bài viết giá trị của mục lập trình ) phải kô mình có thể tham gia ở phần này được chứ. mình mong muốn đựoc đóng góp kiến thức của mình tại phần này
Edited by NguyenTracHuy: Màu bạn chọn chói mắt quá ,rất khó đọc .Mình chỉnh lại cho dễ đọc tí .
|
|
|
HVA trước đây là 1 diễn đàn về IT nổi tiếng nhất VN
Nơi hội ngộ của biết bao anh tài và những người quan tâm đến IT
Biết bao bài viết được post lên để chia sẻ kinh nghiệm cũng như học hỏi
Nhưng sau sự kiện 1/5/2006 tàon bộ dữ liệu mất sạch...
Giờ đêy phượng hoàng lại hồi sinh từ đống tro tàn
phsvn tôi xin có đôi lời góp ý cho diễn đàn:
Tại sao admin không đưa ra lời kêu gọi để những thành viên cũ gửi lại những file chứa bài viết mà có thể họ đã lưu lại trên máy
phsvn cam đoan sẽ có rất nhiều người hưởng ứng hành động này
Mong admin xem xét việc này
trước kia mình đã lấy cả trang HVA về máy ở nhà rùi mình nghĩ có rất nhiều bạn cũng đã làm như vậy. vì thế nếu cần có thể post lại những bài viết có giá trị lên được ko.
|
|
|
màn hình của tui đang dùng ngon lành sau mấy bữa ko động tới giờ mở thì màn hình ko lên đèn báo điện ko vào. kiểm tra thấy có tiếng nổ lách tách nho nhỏ.
edit by ghet_em. Lý do để màu không nhìn thấy gì cả.
|
|
|
cái này đôi khi phải trả giá cao hơn một khoá học phần cứng đó.
|
|
|
đâu cần để một hồi như máy ko hư phần nào thì có lẽ chỉ một số bộ phận nào đó bị lỏng mà thui.
|
|
|
2:Các quy ước về mạng (Networking Protocols)
2.1 Phân loại các quy ước về mạng
Trước khi bàn sâu về TCP/IP, thiết tưởng ta cũng cần nhắc sơ qua các quy ước về mạng từ ngày 'tạo thiên lập ... mạng' đến nay. Các di sản này không ít thì nhiều góp phần quan trọng trong việc duy trì và phát triển mạng điện toán (Computer Network). Nhiều quy ước vẫn còn được dùng cho đến bây giờ.
Các hệ quy ước (protocol families) có thể phân loại dựa trên cơ sở kiểm tuyến hay phi kiểm tuyến (routable hay non-routable protocols) và cơ sở tiêu chuẩn hay độc quyền (standard hay proprietary protocols).
Một quy ước thuộc loại phi kiểm tuyến (non-routable protocol) có thể được thiết kế và thực hiện đơn giản nhưng chỉ có thể dùng trong mạng cục bộ (local area network) và trên thực tế, giới hạn việc phát triển có tính cách quy mô rộng lớn hơn. Ngược lại, một quy ước thuộc loại kiểm tuyến (routable protocol) cho phép chuyển dữ kiện xuyên mạng nhưng cần phải có một phương thức hợp lý đế ấn định điạ chỉ của từng máy vi tính một trong phạm vi toàn cầu (some need of global addressing) cũng như phương pháp phát hiện vị trí của nó (a way of discover) trong mạng điện toán (Computer Network).
Còn các hệ quy ước (protocol families) phân loại dựa trên cơ sở tiêu chuẩn hay độc quyền (standard và proprietary) đặc trưng hay chuyên biệt của mỗi công ty. Các hệ này không mở (open) và phổ biến rộng rãi, các công ty khác không được dùng mà không xin phép. Trong khi các quy ước TCP/IP, OSI, XTP và SCPS được phát triển, sử dụng và phổ biến 1 cách tổng quát, các quy ước SNA, DECnet hay AppleTalk được giữ độc quyền sử dụng bởi các công ty thiết kế ra nó, tỷ như: IBM với SNA, Digital với DECnet hay Apple với AppleTalk nhằm mục đích nối các máy vi tính do công ty sản xuất mà thôi. Mặc dù, sau này có nhiều cung cấp máy vi tính sử dụng quy ước độc quyền do tính phổ thông của nó, tỷ như: NetBEUI (thuộc Micosoft) hay IPX/SPX (thuộc Novell) nhưng các công ty mẹ vẫn nắm giữ phần kiểm soát các đặc điểm kỹ thuật (specifications).
Phân loại trên cơ cở kiểm tuyến:
Routable Protocols Non-routable protocols
TCP/IP
AppleTalk
IPX/SPX
OSI
Banyan VINES SNA
NetBEUI
DECnet
Các hệ quy ước này cũng có thể phân loại dựa trên cơ sở tiêu chuẩn và độc quyền:
Standard Proprietary
TCP/IP
XTP
OSI
SCPS SNA
NetBEUI
DECnet
AppleTalk
IPX/SPX
XNS
Banyan VINES
2.2 XNS
Xerox Network System (XNS) là một trong các quy ước về mạng đã có từ những ngày đầu tiên. Năm 1970, Xerox phát triển quy ước này để chuyển hồ sơ và in ấn (print and file server protocol) cho các server của mình. XNS, cũng giống như các đóng góp tiền phong khác của Xerox, tỷ như: Ethernet, mouse, giao diện hình (graphical interface), ... đã được phổ biến rộng rãi nhờ các công ty khác. Novell va Banyan nuôi dưỡng, sửa đổi và sử dụng cho các sản phẩm server chuyên trị hồ sơ và in ấn trong khi chính Xerox chỉ dùng XNS để nối các máy in cao tốc (high-speed printers) vào máy cung cấp dịch vụ in ấn (print servers) của mình.
2.3 SNA
IBM phát triển SNA (System Network Architecture) để nối các máy vi tính đơn giản (dump terminals) và các máy ngoại vi (components và peripherals) vào mainframe của mình. SNA có thể dùng trên mạng X.25, Point-to-Point connection hay cả mạng cục bộ Token Ring. Khởi đầu, SNA không thuộc quy ước kiểm tuyến và chỉ dùng nối máy vi tính IBM vào mainframe nhưng thế hệ thứ nhì được cải tiến thành APPN (Advanced Peer-to-Peer Networking) là quy ước kiểm tuyến (routable protocol).
2.4 AppleTalk
Công ty Apple tiên phong trong việc thiết kế quy ước nối mạng ngay trước cả Novell. Những ai sử dụng máy vi tính Apple Macintosh đã trao đổi hồ sơ và dùng chung một máy in hay các thiết bị ngoại vi từ lâu. Quy ước AppleTalk cách mạng trong việc nối mạng hết sức đơn giản và gần như tự động nối không cần người sử dụng bố trí gì rắc rối cả. Tuy nhiên, quy ước này chỉ dùng trong mạng và máy vi tính do Apple cung cấp. Trong những phiên bản Hệ Điều Hành gần đây chẳng hạn OS X, để theo nhịp phát triển của Internet, Apple dùng TCP/IP làm quy ước chính về mạng trong khi vẫn giữ AppleTalk nối các máy in và các máy ngoại vi vào máy vi tính Macintosh.
2.5 Netware Protocols
Công ty Novell với các sản phẩm Netware đột phá và dẫn đầu thị trường mạng với quy ước IPX/SPX (Internetwork Packet Exchange/Sequenced Packet Exchange) trong nhiều năm. IPX và SPX phát xuất từ XNS, có công dụng và trách nhiệm tương tự như IP và TCP. Nhắc lại ở đây, khi đó TCP/IP chỉ phổ biến trong các đại học và là quy ước mạng chính trong các máy Unix. Netware yểm trợ nối các máy vi tính loại PC (Personal Computer), tỷ như: các máy vi tính hệ DOS, Windows 3.1, Windows 3.11, ... vào các máy cung cấp dịch vụ về hồ sơ (file servers), các máy in, e-mail. Netware tương đối dễ dùng và mau chóng trở nên phổ biến trong những thập niên 1980 đến 1990.
Tuy nhiên, cuối thập niên 1990, khi Internet bùng nổ, quy ước TCP/IP được dùng như quy ước tiêu chuẩn trong Hệ Điều Hành Microsoft Windows nhanh chóng đẩy lùi IPX/SPX xuống hàng thứ yếu. Novell chuyển các sản phẩm mới dùng TCP/IP (từ Netware phiên bản 4) làm quy ước mặc định nhưng không còn dẫn đầu như trước đây và càng lúc càng mất thị trường mạng.
2.6 OSI Protocol
Như đã trình bày ở bài 1, kiểu mẫu OSI được hình thành do cố gắng của ISO nhằm tiêu chuẩn hóa các quy ước về mạng cho mọi công ty Tin Học. Quy ước này xây dựng khái niệm trên cơ sở quy ước TCP/IP nhưng phân chia trách nhiệm khắc khe và nghiêm ngặc hơn nhằm yểm trợ mọi nhu cầu của mạng điện toán (Computer Network) vì TCP/IP, mặc dù chứng minh sự hữu dụng của mình trong packet switching và mạng điện toán (Computer Network), nhưng vẫn chưa được thiết kế đúng mức, đặt ra nhiều vấn đề khi mở rộng mạng.
ISO và đa số cơ quan chính quyền, đặc biệt ở Âu Châu, không công nhận nhóm IETF (1 nhóm nhỏ gồm 1 số ít Giáo Sư Đại Học và 1 số sinh viên mới tốt nghiệp thiết kế quy ước TCP/IP) là nhóm chính thức đặt các quy ước về mạng và do đó không chịu kế thừa, nuôi dưỡng hay sửa đổi hoàn chỉnh quy ước TCP/IP mà phát triển 1 quy ước riêng, tạo ra cái gọi là chiến tranh quy ước (protocol wars) từng sôi nổi 1 thời gian.
Tiến trình thiết kế quy ước OSI rất chậm chạp do việc phối hợp thiếu hiệu quả của quá nhiều cơ quan chính quyền thuộc các quốc gia khác nhau. Trong khi đó, TCP/IP đã phổ biến rộng rãi và trỡ thành tiêu chuẩn de-facto (tuy không được công nhận chính thức nhưng ai cũng dùng) cho mạng điện toán (Computer Network). Mặc dù, các chính phủ đã yểm trợ tối đa OSI và có nhiều nơi cấm dùng TCP/IP trong công quyền hay quân đội nhưng OSI thất bại trong việc xâm chiếm thị trường mạng điện toán (Computer Network) và lùi bước dần trước TCP/IP. Hiện nay, OSI thường được dùng như cơ sở hay nền tảng để tham khảo thiết kế về mạng điện toán (Computer Network).
2.7 NetBIOS
NetBIOS (Network Basic Input/Output System) và NetBEUI (NetBIOS Extended User Interface) được biết đến trong sản phẩm LanManager của công ty Microsoft và IBM cạnh tranh với Novell. NetBIOS là quy ước dùng ở tầng Session yểm trợ việc xài chung máy in và hồ sơ. Quy ước NetBEUI đơn giản và không kiểm tuyến (non-routable protocol) nhằm nối các máy vi tính với các File Server hay Print Server. Quy ước NetBIOS là thành phần quan trọng trong mạng Windows và thường được chạy bên trên quy ước TCP/IP (còn gọi là NetBIOS over TCP/IP).
2.8 XTP
Những năm cuối thập niên 1980, mạng điện toán (Computer Network) trở nên 1 thành phần quan trọng không thể thiếu trong việc sử dụng máy vi tính trong phạm vi Công Nghệ Tin Học. TCP/IP đẩy lùi mọi quy ước khác về mạng, ngay cả OSI cũng ... 'vang bóng một thời'. Nhưng khi băng truyền (băng thông hay bandwidth) càng lúc càng nở phình ra và nhiều ứng dụng (application) mới đơm bông kết trái, khuyết điểm của TCP/IP bắt đầu bộc lộ. Để đáp ứng nhu cầu phát triển nhanh chóng của Internet cũng như các hệ quy ước cao cấp (high-performance protocol family) dùng cho các ứng dụng (applications) cao tốc (high speed) trong băng thông rộng (broadband), các nhà nghiên cứu, các chuyên gia, các kỹ sư Tin Học chế ra XTP (Xpress Transfer Protocol).
Trong môi trường như vậy, XTP không những yểm trợ hiệu quả hơn TCP/IP mà còn cung ứng nhiều đặc trưng mới khác, tỷ như: đa truyền tin cậy (reliable multicast) và dịch vụ công nhận datagram (acknowledged datagram service). Mặc dù XTP đã được giới thiệu đầu năm 1990 nhưng XTP đã ... 'trễ chuyến tàu đêm'. Để phối hợp với mạng hiện hành cùng giải quyết các yêu cầu như đã nêu trên, XTP bỏ rơi tầng Network và thay đổi tầng Transport của mình để chạy bên trên quy ước TCP/IP.
XTP được dùng rộng rãi trong quân đội và đa số các ứng dụng (application) đa truyền (multicast).
Nhờ khả năng thích nghi với môi trường băng thông rộng với những thay đổi bất ngờ, tỷ như: sự chậm trể (high delay), sự mất mát (high loss) và các điều kiện băng thông bất xứng (asymmetric bandwidth conditions), XTP rất lý tưởng trong mạng điện toán (Computer Network) qua vệ tinh (satellite), vô tuyến (wireless).
2.9 SCPS
SCPS (Space Communications Protocol Standards) được thiết kế đáp ứng môi trường không gian (space environment). SCPS còn đọc là 'skips'. Các chuyên gia thiết kế SCPS cho các nối có băng truyền rất chậm, lỗi cao (extremely high-error links) tới vệ tinh hay các phi thuyền không gian, trong đó, một vòng đi đi về về có thể kéo dài từ vài phút đến vài giờ. SCPS thiết kế bao gồm TCP/IP và thêm các công dụng và quy ước chuyên biệt cho việc chuyển hồ sơ (File Transfer), an ninh mạng (security) và chuyển vận (transport).
Hiện nay, cơ quan NASA gần như độc quyền quy ước SCPS. Tuy nhiên, tầng transport (được biết như SCPC Transport Protocol hay SCPS-TP) được sửa đổi nhiều để kết hợp các đặc điểm của XTP vào nền tảng TCP nhằm thay thế TCP trong mạng điện toán (Computer Network) qua vệ tinh.
2.10 Các hệ quy ước khác
Nhiều quy ước về mạng điện toán (Computer Network) khác, tỷ như: DECnet hay Banyan Vines cũng được nhiều người biết danh. DEC (Digital Electronics Corporation) sử dụng DECnet nối máy vi tính đơn giản của mình vào main computers và khơi mào việc thiết kế quy ước OSI trong khi Banyan Vines (phát xuất từ XNS) đã cạnh tranh kịch liệt Novell trong việc chiếm lĩnh thị trường mạng điện toán (Computer Network).
Tổng quát, rất nhiều quy ước về mạng được sử dụng và cạnh tranh mãnh liệt cho đến khi Internet bùng nổ, TCP/IP trở thành tiêu chuẩn de-facto dần dần đẩy lùi các quy ước khác.
Hiện nay, Công Nghệ Tin Học yểm trợ tối đa TCP/IP cho mạng điện toán (Computer Network) nối các máy vi tính, servers cùng các thiết bị, công cụ ngoại vi như máy in, thiết bị dư trữ ngay cả điện thoại cầm tay (mobile phone), PDA, tủ lạnh, ...
Lưu ý ở đây, nhiều quy ước khác cũng quan trọng không kém, nhất là trong các lĩnh vực mà TCP/IP không thể cung cấp hay yểm trợ các dịch vụ về mạng hiệu quả như XTP hay SCPC, tuy nhiên khóa học này sẽ không đào sâu chi tiết kỹ thuật của các quy ước đó mà chỉ chú trọng đến TCP/IP mà thôi.
|
|
|
mình nghĩ lên có một số bài hướng dẫn cơ bản như thế này được ko vậy
1:Computer Network và kiểu mẫu OSI
Mạng điện toán (Computer Network) là một tập hợp gồm nhiều máy vi tính cá nhân, các máy cung cấp dịch vụ (servers) thông tin liên lạc với nhau qua nhiều loại thiết bị truyền và nối mạng khác nhau. Mạng chuyển vận dữ kiện trong nhiều môi trường khác nhau, tỷ như: nhà, thương nghiệp nhỏ và lớn, công tư sở, đại học, ... Nếu mạng trãi rộng, có thể chia thành đơn vị như trụ sở trung ương (main office) và các chi nhánh phụ (branch office), ngay cả home office và các người dùng máy vi tính lưu động (mobile users).
Tại sao ta cần mạng điện toán (Computer Network)?
Mục đích để trao đổi hay dùng chung tài nguyên, cương liệu cũng như nhu liệu với nhau, tỷ như: máy in, file server, application server, email server, chỗ chứa dữ kiện, backup devices, cơ sở dữ liệu (Database) hay các ứng dụng (application), các dữ kiện, các thông tin, hình ảnh, ...
Vào năm 1960, ARPA (U.S. Department of Defense's Advanced Research Projects Agency) lưu tâm vận dụng các nghiên cứu về packet switched networks vì mạng này có khả năng cắt các chuỗi dữ kiện (data stream) thành các đơn vị nhỏ hơn và chuyển vận từng đơn vị đó một cách độc lập xuyên qua một mạng chung (shared network).
Nhắc lại, mạng điện thoại cổ điển dựa trên phương thức circuit switching, nghĩa là phải thiết lập một nối thường trực với băng truyền cố định giữa 2 máy. Đến khi nào, không còn dùng để thông tin nữa, nối mới được tháo bỏ. Như vậy, nếu không đủ thiết bị để nối, ta không thể nào gọi được. Tuy nhiên, một khi nối được thành lập, chất lượng tải được bảo đảm vì nối được dành riêng với băng truyền cố định. Circuit switching còn cho phép máy của người dùng thiết kế 1 cách đơn giản, tỷ như: máy điện thoại với một vài công dụng vì tổng đài sẽ quản lý và kiểm tra mọi chuyện.
Ngược lại, packet switching network yểm trợ băng truyền chung 1 cách công bằng giữa các người dùng. Tuy nhiên, không bảo đảm chất lượng truyền và có thể chậm trể. Nhưng, khi truyền dữ kiện, ta đâu cần sự đáp ứng tức khắc mặc dù trên thực tế sự truyền và đáp ứng này rất nhanh. Khi nào, các đơn vị chuyên chở dữ kiện đó tới nơi tới chốn bình an, ta sẽ ... 'hạ hồi phân giải'. Hiển nhiên, packet switching network đặt nhiều hy vọng vào sự thông minh của máy vi tính ở nơi gởi và nơi nhận (end nodes or end hosts) và mạng chỉ đơn giản thực hiện sự chuyển vận các đơn vị dữ kiện nhỏ từ nơi này đến nơi khác qua đủ 'vạn nẻo đường ... phù sa'. Như vậy, còn gì thích hợp cho mạng điện toán hơn. Packet switching network không những vận dụng hiệu quả tài nguyên mạng (vì dùng mọi băng truyền chứ không để dành cho riêng một ai) mà còn dễ dàng thiết kế mạng để kiểm tra, rà tìm các nối hay thiết bị hư hỏng, ngoài ra mạng còn dễ dàng bành trướng nhanh chóng với ngân sách tiết kiệm.
1.2 Kiểu Mẫu OSI (OSI Model)
Theo truyền thống, mọi giải thích về mạng điện toán (Computer Network) đều bắt đầu với kiểu mẫu OSI (Open System Interconnection) do ISO (International Organisation for Standardisation) thành hình.
Tuy nhiên, không giống như cách trình bày của đa số tài liệu đã có từ trước, bắt đầu với tầng (hay lớp, layer) thứ nhất là tầng Network lần lượt đến tầng 2, 3, ... rất khó hiểu, ta bắt đầu với tầng thứ 7 (tầng Application) trước.
Trước tiên, ta cần biết kiểu mẫu OSI đã dùng khái niệm về công dụng khác nhau chia làm 7 tầng ( 7 layers) khi chuyển vận dữ kiện từ 1 máy này đến máy kia. Mỗi tầng đều riêng biệt, có công dụng và trách nhiệm khác nhau. Mỗi tầng chỉ có thể thông tin với tầng trên và tầng dưới nó mà thôi.
Nhưng tại sao, ISO lại làm chia như vậy?
Xin thưa, cho đời ta ... bớt khổ.
Nhờ chia công việc và trách nhiệm rõ ràng như thế, ta có thể quản lý, thiết kế hay kiểm tra, tìm lỗi dễ dàng trong mạng điện toán (Computer Network).
Hãy quan sát kiểu mẫu OSI như sau:
Layer 7: Application Layer
Giả dụ như ta dùng ứng dụng (application) Internet Explorer ở máy vi tính A, nhập 1 URL (Universal Resource Locator) tỷ như: http://www.vovisoft.com vào hộp chữ Address để theo học khóa Tự Học TCP/IP của Vovisoft. Internet Explorer (IE) chạy trong máy A muốn đối thoại trực tiếp với Web Server của Vovisoft (máy vi tính B) để yêu cầu gởi về trang chủ và hiển thị trang này trên máy A của ta.
Tuy nhiên, tầng ứng dụng thứ 7 này (Application Layer) chỉ chịu trách nhiệm về ứng dụng (application) và giao diện của người dùng (user interface) chứ không nối trực tiếp với ứng dụng (application) của Web Server trên máy B nên máy A đành ... 'ngậm ngùi đưa em sang sông' bằng cách đóng thùng gởi xuống tầng kế dưới là tầng thứ 6: tầng Trình Bày (Presentation Layer). Đó là lý do ta biểu hiện một đường nối không liền lạc giữa 2 tầng Application.
Khi đóng thùng gởi đi như vậy, application layer cẩn thận ghi rõ chi tiết thông tin của tầng mình vào 1 chổ gọi là Header. Trong thí dụ ở đây, Layer 7 Header bao gồm mọi thông tin về ứng dụng (application) IE để web server ở máy B hiểu phải làm những gì (hay cung cấp dịch vụ gì) hầu đáp ứng thỏa đáng yêu cầu máy A.
Lưu ý: ứng dụng (application) dùng trong tầng này không chỉ có IE mà còn e-mail, chuyển vận tập tin (file transfer), terminal emulaition, ... Ngay cả ứng dụng chứng thực người dùng (user authentication) cũng nằm trong tầng 7.
Layer 6: Presentation Layer
Tầng Presentation chịu trách nhiệm phiên dịch hay chuyển nguồn mã từ dạng này qua dạng khác, mục đích cho người gởi (máy A) và người nhận (máy B) hiểu nhau, tỷ như: máy A có thể dùng EBCDIC (Extended Binary Coded Decimal Interchange Code) nhưng máy B lại dùng ASCII hay Unicode.
Cũng giống như tầng Application, tầng Presentation của máy A không đối thoại trực tiếp với tầng Presentation của máy B (web server) nên lại đóng thùng gởi xuống tầng kế dưới là tầng thứ 5: tầng Session (Session Layer). Khi đóng thùng gởi đi như vậy, presentation layer cẩn thận ghi rõ chi tiết thông tin của tầng mình vào Layer 6 Header (hay Presentation Layer Header).
Trong trường hợp này, user data ở tầng 6 bao gồm Header tầng 7 cộng với user data tầng 7 (hay còn gọi là payload của tầng 6). Cứ như thế, tiếp tục cho tới tầng cuối cùng trước khi đem con bỏ chợ, ... à không, 'đưa em vào siêu xa lộ thông tin'.
Layer 5: Session Layer
Tầng Session chịu trách nhiệm thành lập, quản lý và kiểm tra các nối giữa 2 máy A và B. Tầng này cũng chịu trách nhiệm trao đổi, quản lý các đối thoại hay trao đổi, quản lý dữ kiện giữa các tầng presentation của máy A và B. Ngoài ra, còn cung cấp các dự tính sao cho việc chuyển vận dữ kiện hiệu quả, chất lượng (CoS - Class of Service) và quản lý, báo cáo các ngoại lệ nếu có (exception reporting).
Cũng giống như tầng Presentation, tầng Session của máy A không đối thoại trực tiếp với tầng Session của máy B (web server) nên lại đóng thùng gởi xuống tầng kế dưới là tầng thứ 4: tầng Transport (Transport Layer). Khi đóng thùng gởi đi như vậy, session layer cẩn thận ghi rõ chi tiết thông tin của tầng mình vào Layer 5 Header (hay Session Layer Header).
Layer 4: Transport Layer
Tầng Transport chịu trách nhiệm quản lý và chuyển vận dữ kiện (end-to-end transmission of data) giữa 2 máy A và B. Sự chuyển vận có tin cậy hay không cũng được thực hiện ở tầng này.
Dữ kiện (ở đây là user data) được chia thành các đơn vị dữ kiện nhỏ hơn gọi là segment trước khi chuyển đi qua phương thức packet switching (trình bày ở phần 1). Các đơn vị nhỏ này sẽ được ... tái hợp (như ... Thuý Kiều tái hợp Kim Trọng sau nhiều năm xa cách) trở lại thành user data ở máy B.
Tầng Transport dùng 2 quy ước:
TCP (Transport Control Protocol): cho sự chuyển vận tin cậy (reliable communication).
UDP (User Datagram Protocol): cho sự chuyển vận cố gắng, hiệu quả tới đâu hay tới đó và không cần biết dữ kiện đi tới nơi an toàn hay không (best effort communication).
Cũng giống như tầng Session, tầng Transport của máy A không đối thoại trực tiếp với tầng Transport của máy B (web server) nên lại đóng thùng gởi xuống tầng kế dưới là tầng thứ 3: tầng Network (Network Layer). Khi đóng thùng gởi đi như vậy, transport layer cẩn thận ghi rõ chi tiết thông tin của tầng mình vào Layer 4 Header (hay Transport Layer Header).
Tầng Transport và tầng Network còn gọi chung ở kiểu mẫu TCP/IP là TCP/IP (Transport Protocol/Internet Protocol). Đây chính là kiểu mẫu đuợc tham khảo chi tiết trong khoá học này.
Layer 3: Network Layer
Tầng Network chịu trách nhiệm quản lý các tuyến đường chuyển vận dữ kiện giữa 2 máy A và B. Anh Ngữ gọi là routing. Đây cũng chính là chỗ hoạt động của thiết bị Router hay Gateway.
Các đơn vị dữ kiện ở tầng này gọi là packets (network layer packets) được chuyển vận theo kiểu điện tín (datagram) không tin cậy. Sự chuyển vận dữ kiện tin cậy hay không được phó thác cho tầng Transport với quy ước TCP. Ở đây, tầng Network chỉ chuyển các đơn vị dữ kiện tùy theo phán đoán của mình, tỷ như: điện tín đi Sài Gòn qua cổng A, đi Hà Nội qua cổng B, ... Nếu điện tín dài quá, tầng này còn có nhiệm vụ cắt thành các đơn vị dữ kiện nhỏ hơn, có đánh số (sequence number) cho dễ phân biệt. Sự cắt nhỏ này gọi là fragmentation. Các đơn vị này sẽ được tái hợp trở lại (de-fragmentation) ở tầng Network của máy B.
Cũng giống như tầng Transport, tầng Network của máy A không đối thoại trực tiếp với tầng Network của máy B (web server) nên lại đóng thùng gởi xuống tầng kế dưới là tầng thứ 2: tầng Data Link (Data Link Layer). Khi đóng thùng gởi đi như vậy, transport layer cẩn thận ghi rõ chi tiết thông tin của tầng mình vào Layer 3 Header (hay Network Layer Header).
Một trong những thông tin quan trọng trong header tầng này có thể kể là địa chỉ IP (Internet Protocol Address) của nguồn gởi (source address) và nguồn nhận (destination address). Các IP address này phải duy nhất, không được trùng hợp.
Layer 2: Data Link Layer
Tầng Data Link chịu trách nhiệm soạn thảo khuôn dạng việc chuyển vận dữ kiện (how data is formatted) và kiểm tra sự xuất nhập các frames vào tầng kế dưới là tầng Physical. Nói gọn lại là đóng khung chuỗi dữ kiện (framing) trước khi chuyển xuống tầng kế dưới. Tầng này cũng chịu trách nhiệm rà tìm và điều chỉnh lỗi (error detection and correction) bảo đảm việc chuyển vận tin cậy. Tầng Data Link kết hợp chặc chẻ với tầng Physical qua địa chỉ MAC (Media Access Control address) của NIC (Network Interface Card) gắn trong máy vi tính. MAC address gồm 48 bits như sau:
Broadcast bit Local bit 22 bits OUI 24 bits VA
Broadcast bit = 1: báo cho nơi nhận là frame broadcast (truyền cho tất cả) hay multicast (riêng 1 nhóm).
Local bit = 1: cho mạng cục bộ
22 bits OUI: Organisational Unique Identifier dành riêng mỗi công ty chế tạo NIC. Mỗi công ty có 1 số OUI khác nhau do IEEE (Hiệp Hội Kỹ Sư Điện, Điện Tử) quy định.
24 bist VA: do mỗi công ty quy định (Vendor Assigned) cho mỗi NIC.
Cũng giống như tầng Network, tầng Data Link của máy A không đối thoại trực tiếp với tầng Data Link của máy B (web server) nên lại đóng thùng gởi xuống tầng kế dưới là tầng cuối cùng: tầng Physical (Physical Layer). Khi đóng thùng gởi đi như vậy, data link layer cẩn thận ghi rõ chi tiết thông tin của tầng mình vào Layer 2 Header (hay Data Link Layer Header). Một trong những thông tin quan trọng trong header tầng này có thể kể là địa chỉ MAC (MAC Address) của nguồn gởi (source address) và nguồn nhận (destination address).
Layer 1: Physical Layer
Tầng này định rõ các chi tiết kỹ thuật, tỷ như: dòng điện thế (voltage levels), chu kỳ, tần số, physical data rates, khoãng cách truyền, các đầu nối (physical connectors), dòng điện tử, cơ khí, phương thức, thủ tục và chức năng, ... để khởi động, quản lý, bảo trì hay đóng mở các nối nhằm yểm trợ sự chuyển vận dữ kiện giữa 2 máy A và B. Từ đó, máy vi tính nối liền vào mạng điện toán (Computer Network) chằng chịt toàn cầu qua đủ loại thiết bị, tỷ như: internal or external analog modem với PSTN (public siwtching telephone network), X25, ISDN, ADSL, Cable, Optical Fibre, leased line, Frame Relay, ATM, ... và qua các công ty viễn thông và cung cấp dịch vụ (ISP - Internet Service Provider). Trong trường hợp mạng cục bộ (LAN - Local Area Network) phổ biến nhất vẫn là Category 5 cable, còn gọi là UTP (Unshield Twisted Pairs) cable.
Như vậy, một cách tổng quát, tầng Physical chịu trách nhiệm chuyển vận các chuỗi (streams) những số 0 (đóng hay OFF hay False) và 1 (mở hay ON hay True) trong hệ thống nhị phân (hệ thống này sẽ được trình bày trong những bài sau). Các số 0 hay 1 được gọi là bit. Các chuỗi này bao gồm tất cả thông tin các tầng 2 đến tầng 7.
Streams of BITS
Các chuỗi này khi chuyển vận từ máy A đến máy B, sẽ được xử lý và khai thác theo một chu kỳ nghịch với chu kỳ vừa trình bày ở trên, nghĩa là bắt đầu từ tầng 1 (tầng Physical) nối với máy B đi ngược trở lên tầng 7 (tầng Application). Máy B có thể được nối với máy A qua mạng cục bộ hay mạng toàn cầu. Cứ mỗi khi chuỗi dữ kiện được chuyển vận đến tầng nào, tầng đó sẽ tham khảo thông tin trong header của tầng mình, xử lý thích ứng và sau đó tháo bỏ header tầng (de-encapsulation) của mình để chuyển lên tầng kế. Cuối cùng, dữ kiện (user data) của máy A được đến máy B, trong trường hợp này là máy cung cấp dịch vụ về mạng (web server) của Vovisoft.
Máy B (Vovisoft web server) hiểu rõ yêu cầu máy A và gởi trả về trang chủ (Home Page) của Vovisoft. Thế là ... 'bánh xe lịch sử lại tiếp tục xoay vần', các dữ kiện lại đóng thùng gởi đi một chu kỳ y chang như ở máy A. Cuối cùng, ta có thêm một dịch vụ thành công trong dòng siêu xa lộ thông tin toàn cầu.
1.3 Kiểu Mẫu Internet (Internet Model of Networking)
Mặc dầu mọi tranh luận về các quy ước (protocols) trong mạng điện toán (Computer Network) đều trích dẫn từ kiểu mẫu OSI nhưng kiểu mẫu Internet với quy ước TCP/IP không tuân theo các tiêu chuẩn đệ trình của ISO. Lý do đơn giản là kiểu mẫu Internet đã được dùng và phổ biến rộng khắp, ta gọi là tiêu chuẩn de-facto. Tuy nhiên, kiểu mẫu Internet vẫn phù hợp các đòi hỏi của mạng như kiểu mẫu OSI. Ta có thể phân chia và xếp loại như sau:
Như vậy, tầng Network của kiểu mẫu Internet chứa đựng tất cả mọi đặc tính của các tầng Physical và Data Link mà tầng Internet (hay còn gọi là tầng IP - Internet Protocol) đòi hỏi. Tầng Internet của kiểu mẫu Internet tương đương với tầng Network của kiểu mẫu OSI. Tương tự như vậy cho các tầng Transport và tầng Application của kiểu mẫu Internet.
Tổng quát, ta chia các quy ước thành các tầng riêng biệt để hoạt động 1 cách độc lập với quy ước của tầng kế trên hay kế dưới. Giữa các tầng này, đương nhiên là các giao diện tiêu chuẩn (standardised interfaces) và do đó, có thể áp dụng rộng rãi mọi kiểu mạng. Chẳng hạn, trong mạng Ethernet, người dùng có thể sử dụng IP (Internet Protocol) hay IPC hay NetBEUI hay bất cứ một Layer 3 Protocol nào cũng được. Ngược lại, IP cũng có thể chạy trong mạng Token Ring, X.25, Frame Relay, PPP (Point-to-Point Protocol), HDLC, FDDI, ATM hay bất cứ một Layer 2 Protocol nào cũng được, ngay cả trong mạng Satellite hay vô tuyến (wiresless physical network). Lưu ý ở đây, TCP/IP hay UDP/IP được cải biên để dùng trong mạng Satellite, vẫn có nhiều quy ước thích hợp khác, tỷ như: XTP, SCPS, ... sẽ được trình bày sơ lược ở các bài sau.
Header ở mỗi tầng và dữ kiện (user data) sẽ trở thành dữ kiện ở tầng kế (ta gọi là payload). Tiến trình gói / mở bao bì hay đóng / mở thùng này gọi là encapsulation / de-encapsulation. Mặc dù, encapsulation giúp tính linh hoạt của mạng nhưng đôi khi trở thành vấn đề cho mạng. Thí dụ, trong mạng ATM, mỗi tổ dữ kiện (ATM cell) gồm tổng cộng 55 bytes (với 1 byte bằng 8 bits) mà TCP và IP header chiếm hết 40 bytes, chừa lại 15 bytes cho payload, quả là quá ít cho việc chuyển vận thông tin trong mạng, đó là chưa kể vài thông số lựa chọn tùy ý (optional parameters).
Tóm lại, mặc dù có rất nhiều quy ước (protocols) hiện hành không tuân thủ các tiêu chuẩn OSI như đã trình bày ở trên nhưng kiểu mẫu OSI được chấp nhận và khuyến khích rộng rải khắp nơi nhờ phân chia trách nhiệm rõ ràng cho mỗi tầng một khiến cho việc thiết kế, phát triển hay kiểm tra mạng dễ dàng hơn. Nói chung, ta có khuynh hướng dựa vào kiểu mẫu OSI để phân tích và đánh giá các protocols khác.
(Vũ Năng Hiền)
|
|
|
những bài viết copy ở diễn đàn khác cũng rất hay nhưng có cần phải nói rõ tác giả hay nguồn ở đâu ko nhỉ ( bản quyền đó).
|
|
|
admin trước kia tui nhân được một mail mail thế này
Xin chào hong_xanh001, Nhằm thúc đẩy cho HVA ngày càng lớn mạnh, làm sao để chia sẻ kiến thức IT của mình cho các thành viên trong diễn đàn cũng như cộng đồng người Việt Nam yêu thích tin học. Mong muốn lớn nhất của các thành viên trong BQT là làm hết sức mình nhằm đưa cộng đồng HVA chúng ta trở thành Tổ chức An ninh mạng lớn nhất, có tổ chức nhất, và hoạt động có hiệu quả nhất của người Việt. Nhưng muôn làm được điều đó thì cần có sự đóng góp rất lớn của các thành viên trong diễn đàn. Chúng tôi biết rằng tham dự vào diễn đàn này có rất nhiều người rất giỏi có thể bạn chỉ là Register member, hay HVA member nhưng ngoài XH các bạn đều là những ngừoi có trình độ, chúng tôi mong muốn các bạn hay chia sẻ các kiến thức các bạn có với các thành viên trong diễn đàn. Chúng ta sẽ cùng nhau trao đổi bổ xung kiến thức cho nhau để cùng hoàn thiện hơn. Hiện nay HVA đang có một số việc cần đến sự đóng góp của các bạn, bạn có thể làm được gì cho HVA xin hay đăng ký với chúng tôi 1- Nếu HVA xuất bản sách báo sẽ cần người dàn trang chế bản, bạn có thể làm được việc đó không ? 2- Nếu HVA xuất bản tạp chí, sách báo bạn có thể cộng tác viết bài cho tạp chí được không ? Nếu bạn viết thì bạn sẽ định viết về chủ đề gì ? 3- Nếu phân phối sách báo hay tạp chí theo kênh phân phối của nhà xuất bản thì thường mất 30-40 % cho phí phát hành. Để giảm bót chi phí, chúng tôi cần một hệ thống phân phối sách báo , tạp chí tại các tỉnh thành của VN và ở nước ngoài. Ở HN và SG sẽ cần khoảng 10 điểm phát hành, Ở ĐN cần khoảng 4 điểm. Ngoài ra ở các thành phố khác sẽ cần 1-2 điểm 4- HVA cần thành lập một đội lập trình viên chuyên nghiệp để thiết kế Website, Outsoft cho các khách hàng ở trong nước và Oversea ( khoảng 7 ngừoi viết Code và 3 Designer ) Ngoài ra bạn có thể có ý tưởng gì hoặc đóng góp gì cho HVA cũng có thể đăng ký ở đây hoặc gủi thư về cho tôi theo địa chỉ phuongdonghva@yahoo.com Rất mong nhận được các đóng góp của các bạn Thay mặt BQT diền đàn HVA .
-------------------------------------------------
vậy mình đã mail lại vậy nhưng ko thấy trả lời. hôm nay mình tiện hỏi luôn. dự định ra tạp chí của HVA còn ý định thực thi tiếp hay ko theo mình nghĩ thì khi ra tạp chí thì những công việc bạn nói trên các thành viên có thể làm được khá nhiều đó.
|
|
|
không nghĩ là mình lại được dùng lại cái nick yêu thích này của mình cứ nghĩ là sau khi khôi phục lại được thì phải đăng kí nick mới chứ chúc mừng những bạn phục hồi lại được nick.
|
|
|
click vô cái link này là được mà Diễn đàn
vi dụ: Diễn đàn_ Góp ý và Hỏi đáp thắc mắc chung _ co' vai` cho~ can` su*a?
|
|
|
có cái này cũng được mà, khi đăng nhập có thông báo mừ, như ai online ở nhà thì có thể để tự động đăng nhập được mà.
|
|
|
nhiều khi có những bài viết ko có mục đích phá hoại nhưng nội dung ko được trong sạch cũng loại bỏ hết phải ko nhỉ.
|
|
|
hix hix mọi người ơi HVA mới gây dựng lại được mong các bạn đừng tranh luận kiểu nầy nữa dễ bung nổ lắm.
fazofhacker
các mems có thể đóng góp phần nào công sức của mình vào sự phát triển của HVA.
theo mình nghĩ thì mỗi thành viên của HVA khi tham gia post bài đã là góp phần xd HVA rùi tuy nhiên như mình nghĩ thành viên HVA luôn muốn góp phần phát triển HVA nhiều hơn nữa. BQT xem lại nhé làm thế nào để các thành viên HVA có thể làm được nhiều hơn nữa
|
|
|
host dành cho sinh viên thì có nhiều đó là host free
|
|
|
làm web đơn giản nhất là làm bằng frontpage còn làm rum thì dùng vbb, tbb, còn nhiều nữa
|
|
|
|
|
|
|