Định danh và kiểu dữ liệu trong Jython Định danh [identifier] trong Jython được quy định tương tự như Java, đó là tập các từ khóa có sẵn và quy tắc đặt tên cho biến, phương thức, … Danh sách các từ khóa có sẵn xin xem thêm tại:
//www.jython.org/jythonbook/en/1.0/LangSyntax.html#identifiers-and-declaring-variables Các đối tượng dữ liệu [data object] trong Jython Kiểu dữ liệu số [Numeric] – PyInteger: ứng với kiểu int trong Java, biểu diễn được 4 bytes Kiểu chuỗi [sequence] Chỉ số của phần tử trong sequence được tính từ 0 trở đi, từ trái sang phải. Chỉ số này có thể âm, khi đó nó sẽ
biểu diễn vị trí tính từ phải sang, khi đó kí tự cuối cùng sẽ có chỉ số là -1. Ví dụ: Việc lấy một chuỗi con [sequence’s slice] Một chuỗi con dạng S[index1:] sẽ lấy chuỗi tính từ index1 đến kết thúc. Còn một chuỗi con dạng S[4:-2] sẽ lấy từ vị trí thứ 4 đến trước vị trí thứ 2 từ phải sang. Jython cũng hỗ trợ sử dụng ba chỉ số để lấy chuỗi con trong một khoảng chỉ định nhưng “nhảy cóc” một số bước chứ không lấy liên tục. Ví dụ một chuỗi con xác định bởi S[2:8:3] sẽ xác định một chuỗi con tính từ vị trí thứ 2 tới trước vị trí thứ 8, trong đó mỗi bước nhảy để lấy
phần tử tiếp theo là 3. Cụ thể: Với các kiểu chuỗi mà không thay đổi được ví dụ như PyString hay PyTuple ta có thể truy cập tới các phần tử, nhưng không thể thay đổi giá trị của chúng được. Kiểu dữ liệu PyString Kiểu PyTuple >>>t = 1,2,3 >>> type[[1,2,3]] >>>myTuple = [1, "string", 11.5] # tuples can contain any object type Việc khai báo và khởi tạo một tuple đơn phần tử cũng đòi hỏi phải có thêm một dấu phảy sau phần tử đó: >>> type[t2] >>> print t1 Kiểu PyList Kiểu bảng băm, từ điển Một lưu ý quan trọng nữa về key đó là các giá trị số được sử dụng làm key sẽ được hash theo cách mà giá trị của chúng được so sánh. Giá trị PyInteger 1 là một object khác so với PyFloat 1.0, nhưng chúng được so sánh bằng nhau và do đó nảy sinh chuyện có hai key trong một từ điển. Kiểu từ điển thứ hai PyStringMap Kiểu PyNone
Các đối tượng dữ liệu trong Jython được xây dựng dựa trên các đặc tả của Python. Các kiểu được đặt tên như integer, long, float, complex, string, tuple, list, dictionary. Jython
không có kiểu dữ liệu nếu hiểu theo cách như các ngôn ngữ khác, bởi ở Jython chúng chỉ là các đặc tả dữ liệu [data descriptor] chứ không phải là một class hay instance nào cụ thể. Các dữ liệu được biểu diễn bởi các Java class nằm trong package org.python.core, do đó Jython không có kiểu dữ liệu nguyên thủy.
Tên các Java class biểu diễn các kiểu của Python được đặt tiếp đầu ngữ là “Py”, ví dụ PyInteger, PyComplex, PyTuple, … Các class dùng cho dữ liệu có tính động, và
được quyết định lúc thực thi.
Các class có vai trò biểu diễn các đối tượng numeric của Jython gồm có PyInteger, PyLong, PyFloat và PyComplex. Các biến kiểu numeric thu được từ việc gán một giá trị numeric phù hợp, và nếu như ta gán một biến cho một số dạng complex thì số đó sẽ được biểu diễn bởi class PyComplex.
– PyLong: ứng với kiểu long trong Java, số
được biểu diễn kèm kí tự l hoặc L ở cuối để chỉ định là long
– PyFloat: kiểu dấu chấm động, ứng với kiểu double trong Java, biểu diễn với 8 byte dữ liệu
– PyComplex: Một số phức tạp được biểu diễn bởi hai số chấm động. Trong đó, số đầu tiên biểu diễn phần thực và số thứ hai biểu diễn phần ảo.
Các dữ liệu kiểu chuỗi trong Jython được biểu diễn bởi các class PyString, PyTuple, PyList. Trong đó, PyString chỉ chứa các dữ liệu xâu
ký tự, còn PyTuple và PyList có thể chứa các phần tử kiểu dữ liệu bất kỳ.
Đặc trưng của kiểu chuỗi so với kiểu số đó là kiểu chuỗi có mô tả độ dài.
Các kiểu dữ liệu chuỗi có khác nhau chút ít về cách khởi tạo nhưng cùng chung cách truy cập các phần tử đó là dùng cặp ngoặc vuông [] để chỉ định index của phần tử đó. Ví dụ:>>>#khoi tao
>>>S = "abc" # This is a string
>>>T = ["a", "b", "c"] # This is a tuple
>>>L = ["a", "b", "c"] # This is a list
>>>#Truy cap
>>>S[1]
'b'
>>>T[1]
'b'
>>>L[1]
'b'>>> string="abc123"
>>> string[-1]
'3'
>>> string[0]
'a'
>>> string[-2]
'2'
>>>
Việc cắt một chuỗi con sẽ được thực hiện bằng cách chỉ định điểm mốc hai đầu chuỗi con cần lấy. Hai chỉ sổ này được phân tách nhau bởi dấu hai chấm. Trong đó, chuỗi được lấy sẽ gồm phần tử có index thứ nhất cho đến phần tử đứng trước vị trí index thứ hai, tức là không bao gồm phần tử index thứ hai.
Ví
dụ:>>>S = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>S[3:6] # slice from 3 up to, but not including 6
[4, 5, 6]>>> S = 'zahbexlwlvo2 fwzo4rslmd'
>>> S[2::2] # this slices from index 2 to the endpoint, steping by 2
'hello world'
>>>
>>> L = [1,2,3,4,5,6,7,8,9]
>>> L[-1:3:-1] # last index to third index, indexes step by -1
[9, 8, 7, 6, 5]
Java class này thừa kế các thuộc tính của Java string theo cách chúng được tạo thành từ các ký tự 2 byte dựa theo chuẩn Unicode 2.0, khác với Pyt thon dựa trên 8bit và 16bit theo chuẩn Unicode 3.0.
Một đối tượng string được tạo thành từ việc gán một string cho một biến. Để biểu diễn một string, có thể dùng cặp nháy đơn, nháy đôi [‘ hay “] hoặc cặp ba nháy [”’ hay “””]. Các dấu nháy loại này có thể xuất hiện bên trong cặp dấu nháy của loại kia một cách hợp lệ. Cách nhúng dấu nháy vào trong một string để hiển thị nó là hợp lệ, nhưng chỉ với phép ghép giữa các string thuần túy [literal string tức là các string không thay đổi được], chứ không thể đem ghép với các số hay các biến mang giá
trị.
Class PyTuple là một dạng chuỗi không sửa đổi được, có thể chứa các tham chiếu tới bất kỳ kiểu dữ liệu nào. Mặc dù nó là immutable nhưng có thể chứa các dữ liệu mutable, điều này có được là bởi vì bản thân nó không chứa dữ liệu thành viên mà chỉ chứa các tham chiếu tới chúng.
Để biểu diễn một tuple có thể dùng nhiều cách như bao trong cặp [] và mỗi thành phần tách nhau bởi dấu phảy; không dùng cặp ngoặc [] mỗi phần tử
tách nhau bởi dấu phảy; hoặc chỉ cặp ngoặc [] cho tuple trống.
Ví dụ:>>>t = [1,2,3]
>>>type[t]
>>>type[t] >>> t1 = ["element one",]
>>> t2 = "element one",
>>> type[t1]
['element one',]
>>> print t2
['element one',]
PyList tương đồng với PyTuple, có điều PyList là mutable, tức có thể sửa đổi trực tiếp giá trị các thành phần trong PyList. Các phần tử trong PyList được bao bởi cặp ngoặc vuông, giống như mảng trong
Java.
Trong Jython có hai kiểu bảng băm, ánh xạ, hay còn gọi là từ điển. Việc ánh xạ xem như là phép ánh xạ từ một key dạng immutable tới một value. Khác biệt giữa hai kiểu ánh xạ đó là kiểu dữ liệu mà key sử dụng.
Xét kiểu thứ nhất: PyDictionary
Kiểu từ điển này tổ hợp từ các cặp key:value được bao bởi cặp {}. Các key có thể có thuộc nhiều kiểu khác nhau, nhưng phải là
immutable. Một kiểu mutable không thể được dùng làm key của PyDictionary, ví dụ:>>> list=[1,2,3,4] # this is a mutable sequence / list
>>> D = {list:"my key is a list"}
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'
>>>
Với
kiểu từ điển này, chỉ có các xâu ký tự [string] được sử dụng làm key. Khác biệt so với PyDictionary vì PyDictionary nhận bất cứ kiểu immutable nào. Loại object này không đơn giản chỉ là sinh ra từ các nhà phát triển Jython, mà nó vốn được trả về mởi một số hàm có sẵn. Nó sinh ra vì một số lý do hiệu năng.
PyStringMap hầu hết được sử dụng cho các namespace do chúng sử dụng key là các string.
None là một trạng thái đặc biệt của giá trị, None
cũng tương đương như null trong Java. PyNone là class biểu diễn giá trị None.
Mô hình xử lý ngoại lệ trong Jython Tương tự Java, trong Jython cũng cung cấp mô hình try để thực hiện xử lý ngoại lệ [exception handling]. Một số logic xử lý như sau: # perform some task that may raise an exception except Exception, value: # perform some exception handling finally: # perform tasks that must always be completed [Will be performed before the exception is # raised.] >>> try: ... 1/0 ... except BaseException, e: ... global myvar ... myvar +=10 ... print "exec except block, because: ", e ... finally: ... global myvar ... myvar += 5 ... print "exec finally block." ... exec except block, because: integer division or modulo by zero exec finally block. >>> print myvar 25 >>> Cấu trúc try-finally # perform some tasks that may raise an exception finally: # perform tasks that must always be completed [Will be performed before the exception is # raised.] Ví dụ: >>> try: ... 1/0 ... print myvar ... finally: ... global myvar ... myvar += 30 ... print "exec finally" ... :5: SyntaxWarning: name 'myvar' declared global after use exec finallytry:
Trong logic try-exception-finally, đoạn code tiềm ẩn sẽ được thực thi bởi try, nếu có
xuất hiện exception, nó sẽ được đoạn except xử lý [tương tự catch trong Java]. Ví dụ:>>> myvar = 10
Điểm khác biệt so với Java đó là Jython không bắt buộc phải có except [tương đương catch], minh chứng là cấu trúc try-finallytry:
>>> myvar=10
Traceback [most recent call last]:
File "", line 2, in
ZeroDivisionError: integer division or modulo by zero
>>> print myvar
40
>>>
Cấu trúc try-except-else:
Mệnh đề else có thể được sử dụng cùng với mô hình xử lý ngoại lệ để đảm bảo rằng một số task sẽ chỉ được chạy nếu như không có
exception nào trả về. Đoạn code bên trong mệnh đề else chỉ được khởi tạo nếu như không có exception nào được throw và nếu như có bất kỳ exception nào được trả về trong quá trình thực thi else thfi sẽ không thể quay về except được nữa. Ví dụ các hành động commit database sẽ được đặt trong mệnh đề else, bởi vì nếu như một vài transaction được đặt trong try thì ta sẽ không hề mong muốn có một động thái commit nào nếu như có xảy ra exception.
Cú pháp:
try:# perform some tasks that may raise an exception
except:
# perform some exception handling
else:
# perform some tasks thatwill only be performed if no exceptions are thrown
Ví dụ:
>>> current_status = 'init'
>>> print current_status
init
>>> try:
... print "take some risks"
... 1/0
... except:
... global current_status
... current_status = 'fail_and_roll_backed'
... print "roll backed"
... else:
... global current_status
... current_status = "commited"
... print "commited."
...
take some risks
roll backed
>>> print current_status
fail_and_roll_backed
>>>
Ta có thể tùy chọn việc có chỉ định kiểu exception để bắt hoặc không, việc chỉ định được thực hiện ở khối except. Hoặc có thể chỉ định chung chung một khối except không kèm theo loại exception nào. Tối ưu nhất vẫn là chỉ định kiểu exception mà ta dự đoán trước và cung cấp các giải pháp xử lý nó tối ưu nhất.
Lấy thông tin từ exception trả về
Nếu như một ngoại lệ ở dạng tổng quát được trả về thì thật khó để xác định xem nguyên nhân xuất hiện nó. Xét ví dụ
như sau:
>>> try:... 8/0
... except Exception, ex1:
... 'An error has occurred'
...
'An error has occurred'
Để lấy thông tin của ngoại lệ được sinh ra, có một số cách như sau:
dùng hàm type[exception_object] để lấy về kiểu của ngoại lệ. Ví dụ
>>> type[ex1]>>>
Hoặc sử dụng một hàm được cung cấp sẵn bởi gói sys có tên là sys.exc_info[]. Ví dụ:
# Perform exception handling without explicitly naming the exception type>>> x = 10
>>> try:
... z = x / y
... except:
... print "Unexpected error: ", sys.exc_info[][0], sys.exc_info[][1]
...
Unexpected error: name 'y' is not defined
Bắt và xử lý nhiều exception
Tương tự như cách liệt kê nhiều mệnh đề catch trong Java, ta cũng có thể ghép nhiều mệnh đề except:
>>> x = 10>>> y = 0
>>> try:
... z = x / y
... except NameError, err1:
... print err1
... except ZeroDivisionError, err2:
... print 'You cannot divide a number by zero!'
...
You cannot divide a number by zero!
Cũng như Java, việc xử lý ngoại lệ trong Jython là một thao tác tốn kém, do đó nên cân nhắc việc này. Và nếu muốn bắt nhiều ngoại lệ, thì hãy xếp các ngoại lệ hay gặp lên trước nhất, để giảm thiểu các thao tác xử lý.
Tổ chức các cụm xử lý ngoại lệ lồng nhau
Một chương trình với nhiều cấp xử lý cũng sẽ cần tới nhiều cấp hỗ trợ bắt các ngoại lệ được sinh ra để đảm bảo toàn thể logic chương trình được chạy hết. Tương tự Java, trong Jython ta cũng có thể xây dựng
một cấu trúc bắt ngoại lệ đa cấp như sau:
# Perform some division on numbers entered by keyboardtry:
# do some work
try:
x = raw_input ['Enter a number for the dividend: ']
y = raw_input['Enter a number to divisor: ']
x = int[x]
y = int[y]
except ValueError:
# handle exception and move to outer try-except
print 'You must enter a numeric value!'
z = x / y
except ZeroDivisionError:
# handle exception
print 'You cannot divide by zero!'
except TypeError:
print 'Retry and only use numeric values this time!'
else:
print 'Your quotient is: %d' % [z]
Nếu như xuất hiện ValueError exception, thì vẫn có thể có khả năng xuất hiện ZeroDivisionError, TypeError bởi nó thuộc cặp try-except bên ngoài. Nếu tất cả các except không đón nhận được ngoại lệ nào và không có ngoại lệ nào khác sinh ra, thì khối lệnh else sẽ được thực thi.
Trả về một ngoại lệ
Trong Java ta sử dụng throw/throws để trả về các ngoại lệ, trong Jython
ta sử dụng raise để làm điều này. Cú pháp sử dụng raise như sau:
raise ExceptionType or String[, message[, traceback]]
Ngoại lệ được trả về có thể là ngoại lệ được xây dựng sẵn hoặc ngoại lệ tự định nghĩa.
Các vấn đề nâng cao hơn, xin vui lòng xem thêm chi tiết tại Jython exception handling
Các lệnh phức
hợp class Chi tiết hơn về đặc tính của class, cũng như OOP implement trên Jython ta sẽ bàn tới sau. def for Ví dụ: Minh họa sử dụng for để thao tác với dữ liệu của một đối tượng dữ liệu dạng từ điển: if while
Các lệnh phức hợp là các lệnh mà gom từ một nhóm [group] hoặc một khối [block] các lệnh đơn. Một số cấu trúc điều khiển như if, for, while đều được xét là các lệnh phức hợp. Cần nhớ lại rằng, Jython không sử dụng các cặp {} nhiều cấp để gom nhóm các khối lệnh theo level, mà Jython sử dụng dấu hai chấm : kèm theo đó là căn lề [indentation] để phân level các khối lệnh.
Lệnh class cho phép định nghĩa một class và scope của nó.
Việc gọi một class sẽ dẫn tới việc gọi constructor của nó [nếu được định nghĩa] và kết quả thu được là một instance của class đó. Ví dụ:
>>> class Hello:
... def __init__[self,name="John Doe"]:
... self.name=name
... def greeting[self]:
... print "Hello, %s" % self.name
...
>>> jane=Hello["Jane Doe"]
>>> joe=Hello["Joe"]
>>> default=Hello[]
>>> jane.greeting[]
Hello, Jane Doe
>>> joe.greeting[]
Hello, Joe
>>> default.greeting[]
Hello, John Doe
>>>
Lệnh này cho phép định nghĩa các hàm hoặc các phương thức. Cú pháp như sau:>def name[[parameters]]:
statements
For là một cấu trúc điều khiển rất phổ biến, cho phép duyệt lần lượt từng thành viên
của một chuỗi, danh sách. Một lệnh for có thể kèm theo một tùy chọn là mệnh đề else. Mệnh đề này sẽ được thực thi sau khi chuỗi/ danh sách trên được thực thi hoàn tất mà không có chỉ thị break hay exception nào xảy ra.
Ngoài việc hỗ trợ khả năng tự tăng index khi duyệt danh sách, Python cũng cung cấp sẵn một biến index tham chiếu tới chỉ số thứ tự của phần tử hiện thời đang duyệt, cho phép ta sử dụng [biến đó được quản lý tự động]. Việc này có thể có được thông qua hàm
enumerate[sequence_type]>>> myList = ['jython','java','python','jruby','groovy']
>>> for i in myList:
... print i
...
jython
java
python
jruby
groovy
>>>
>>> for index, value in enumerate[myList]:
... print index, value
...
0 jython
1 java
2 python
3 jruby
4 groovy
>>> >>> my_dict = {'Jython':'Java', 'CPython':'C', 'IronPython':'.NET','PyPy':'Python'}
>>> for key in my_dict:
... print key
...
Jython
IronPython
CPython
PyPy
>>> print my_dict.values[]
['Java', '.NET', 'C', 'Python']
>>> for value in my_dict:
... print value
...
Jython
IronPython
CPython
PyPy
>>>
Lệnh if thực thi một khối lệnh theo điều kiện được chỉ định
cú phápif expression:
statements
elif expression:
statements
else:
statements
Lệnh while thực thi một khối lệnh cho đến khi nào biểu thức được cung cấp làm điều kiện vẫn có giá trị true.
cú phápwhile expression:
statements
Tiếp theo phần 1, phần 2 này chúng ta bắt đầu ngay với việc viết cú pháp Các lệnh Các phép gán >>> myvar +=5 >>> print myvar >>> Lệnh break >>> for index in mylist: ... if index == 'is': ... break ... print index ... my name >>> lệnh continue ... if index == 'cuong': ... continue ... print index ... my name is pham >>> Lệnh del >>> del mylist[3] >>> for index in mylist: ... print index ... my name is pham
Đặc điểm cú pháp trong Jython script
lệnh đơn
các lệnh đơn trên Jython được viết bởi một mệnh đề đơn, phạm vi trong một dòng logic. Các lệnh này có thể gây
nhầm lẫn với các hàm cung cấp sẵn. Các lệnh gồm có các hàm hay các đối tượng đều có giới hạn trong namespace của nó.
assert
Kiểm tra tính đúng sai của biểu thức, nếu sai trả về exception. Nếu có hai biểu thức được sử dụng thì biểu thức thứ hai được sử dụng làm tham số để trả về thông in AssertException. Thiết lập __debug__=0 hoặc option -o ở dòng lệnh sẽ vô hiệu các assert.
Cú pháp:
assert expr [, expr]
Ngoài phép gán = thì các phép toán được sử
dụng cho phép gán gồm có + =, -=, *=, /=, * * =, %=, < > =, &=, |=, ^=.
var_name assigment_operator value
Ví dụ>>> myvar=3
8
Chức năng tương tự như trên các ngôn ngữ khác, nó ngắt luồng thực thi của khối lặp và tiếp tục thực hiện lệnh phía sau khối lặp.>>> mylist = ['my', 'name','is','cuong','pham']
ngắt xử lý ở vòng lặp hiện thời, tiếp tục lặp với phần tử tiếp theo
Sử dụng lại ví dụ ở trên.>>> for index in mylist:
lệnh del có tác dụng xóa một biến đã
được khai báo, biến này có thể nằm trong namespace hiện thời hoặc là một giá trị cụ thể nào đó của list hoặc dictionary. Có thể sử dụng lệnh này để xóa các khai báo biến tạm.
Ví dụ:>>> mylist = ['my', 'name','is','cuong','pham']
>>>
Lệnh exec
lệnh này được dùng để thực thi một đoạn code Jython. Lệnh này đòi hỏi phải có biểu thức đóng vai trò tham số, biểu thức này biểu diễn đoạn code nó cần thực thi. Biểu thức này có thể là một string, một đối tượng file, hay một đối tượng code.
Nếu có hai tham số được cung cấp cho
exec[] thì tham số thứ hai được coi là global directories mà đoạn code được thực thi. Nếu có ba tham số được truyền thì tham số thứ nhất là từ điển, tham số thứ hai là global namespace mà đoạn code được thực thi.
Ví dụ
>>> exec['''print "my"''']my
>>>
Lệnh global
lệnh này chỉ dẫn cho bộ parser [phân tích cú pháp] sử dụng các định danh [identifier] được chỉ định với phạm vi global. Nói cách khác việc này tương đương với khai báo một biến toàn cục.
Xét các ví dụ minh họa sau để thấy tác dụng của
lệnh global.
>>> global_var = 20>>> def test[]:
... print global_var #that is global variable
...
>>> test[]
20
>>>
Thêm một tham chiếu tới biến global_var ở trên và kiểm tra kết quả:
>>> global_var = 20>>> def test[]:
... print global_var # this is still global ?
... global_var = 15
...
>>> test[]
Traceback [most recent call last]:
File "", line 1, in
File "", line 2, in test
UnboundLocalError: local variable 'global_var' referenced before assignment
>>>
Trong ví dụ này, global_var được coi là một local variable. Tại sao lại xảy ra hiện tượng này ? Hãy nhớ lại cách thức jython xử lý kiểu và biến, tất cả đều được xử lý lúc runtime [bởi không có quá trình compile]. Trong quá trình phương thức test[] được gọi thực thi, nó sẽ được xử lý, trong thân của nó, có một phép gán tới biến global_var, do đó global_var trong phạm vi test[] sẽ được coi là local variable. Với câu lệnh print, biến global_var lúc đó chưa được định nghĩa, gán giá trị do đó một exception trả về.
Để giải quyết vấn đề này, ta sẽ sử dụng lệnh global như sau:
>>> def test2[]:... global global_var # indicate that global_var is on global scope
... print global_var # global_var is still global
... global_var = 30 # change it's value
...
>>> test2[]
20
>>> print global_var
30
>>>
Lệnh import
Lệnh này cho phép xác định các class có sẵn đặt chúng vào scope đang xử lý và sẵn sàng cho việc triệu gọi để sử dụng. Khác biệt so với Java đó là ta có thể đổi tên [dạng như Alias] các class được import thành
tên mình muốn.
Cú pháp:
import module_name
vd: import javax.swing
from module_name import names
vd: from java.utils import Scanner
from javax.swing import JFrame, JLabel
import module_name as new_name
vd: import javax.swing import JFrame as EnhancedFrame
Lệnh pass
Lệnh này đơn giản như là một placeholder để giữ chỗ, không thực hiện bất cứ một xử lý nào.
Lệnh print
Lệnh này sẽ ước lượng một biểu thức, chuyển đổi chúng sang dạng string nếu cần, và đẩy kết quả ra sys.stdout hoặc một object nào đó dạng file được chỉ định với toán tử >>
ví dụ:
print expression
print >> myfileobject, expression
Lệnh raise
Lệnh này sẽ ước lượng các biểu thức được cung cấp vào và đẩy ra một exception
cú pháp: raise [expression [, expression [,traceback]]]
Lệnh return
Lệnh này sẽ kết thúc việc thực thi của một phương thức hoặc một hàm, ước lượng kết quả của biểu thức được cung cấp và trả về giá trị của biểu thức đó.
cú pháp: return [expression]
Kết thúc phần 2. Xin mời đón xem Phần 3 – các lệnh phức hợp
How are you today? Today, I will note another tips for installing an Oracle Fusion Middleware product – that is Oracle Service Bus. Graphical setup is complicated for me, so I will choose silent install with response file method for this product. Now, let’s get to work! Firstly, you have to installed JDK and Oracle WebLogic Server that compatible to the version of this OSB. I think you have to do that step by yourself. If you have any issue for that task, please tell me,
I will help you. Secondly, you have to prepare your Linux system that matches some conditions: – create Linux group and user for installer, for example: oinstall [groupadd oinstall] and oracle [useradd oracle] Thirdly, you have to prepare a response file for installation options. It’s recommend to copy and edit sample files that located in stage/Response directory. In this post, I decide to use custom installation, so I will edit that file to something like this: #DO NOT CHANGE THIS. [GENERIC] #Set this to true if you wish to specify a directory where latest updates are downloaded. This option would use the software updates from the specified directory # #If the Software updates are already downloaded and available on your local system, then specify the path to the directory where these patches are available and set SPECIFY_DOWNLOAD_LOCATION to
true #Write the name of the Oracle Home directory. The Oracle Home directory name may only contain alphanumeric , hyphen [-] , dot [.] and underscore [_] characters, and it must begin with an alphanumeric character. #Write the complete path to a valid Middleware Home. #Set this to true if typical installation must be done. If this is
set to true then wariable "CUSTOM TYPE" must be set to false as the variables are mutually exclusive #Set this to true if custom installation must be done, all other required variables need to be provided. If this is set to true then variable "TYPICAL TYPE" must be set to false as the variables are mutually exclusive. #Set this to true if component Oracle Service Bus Examples must be installed. This input will be needed only in the case of
custom installation #Set this to true if component Oracle Service Bus IDE must be installed. This input will be needed only in the case of custom installation #Give the complete path to a valid WebLogic Server Home for the corresponding Middleware Home entered. #Give the complete path to a valid OEPE Home for the corresponding Middleware Home entered.
This input will be needed in both typical and custom installations. But in case of custom installation, Oracle Service Bus IDE must be set to true. [SYSTEM] Finally, just execute installation script to invoke installation wizard on silent mode and pass response file to it. While installation running, you have to provide location of JDK home. Look at my installation console screen Checking if CPU speed is above
300 MHz. Actual 2660 MHz Passed
Are you OK? — I hope so
Are you Happy? — I
hope so
– OS version: One of enterprise-5.4,enterprise-4,enterprise-5,redhat-5.4,redhat-4,redhat-5,SuSE-10,SuSE-11
– install prerequisite package, please note the version, your installed packages have to be equal or higher than required version: + gcc-4.1.0-28.4
+ gcc-c++-4.1.0-28.4
+ setarch-1.6-1
+ sysstat-5.0.5-1
+ libstdc++-4.1.0-28.4
+ libstdc++-devel-4.1.0-28.4
+ compat-libstdc++-296-2.96-132.7.2
+ compat-db-4.1.25-9
+ control-center-2.8.0-12
+ glibc-common-2.3.4-2.9
+ binutils-2.16.91.0.5-23.4
+ make-3.80-202.2
– create
oraInst.loc file. You can done that mission by your hand or executing the script stage/Response/createCentralInventory.sh with root permission[oracle@vm1 Disk1]$ mkdir ~/oraInventory
[oracle@vm1 Disk1]$ su
Password:
[root@vm1 Disk1]# sh stage/Response/createCentralInventory.sh /home/oracle/oraInventory/ oinstall
Setting the inventory to /home/oracle/oraInventory/
Setting the group name to oinstall
Creating inventory pointer file in /etc directory
Creating the Oracle inventory pointer file [/etc/oraInst.loc]
Changing permissions of /home/oracle/oraInventory/ to 770.
Changing groupname of /home/oracle/oraInventory/ to oinstall.
The execution of the script is complete
[root@vm1 Disk1]#[ENGINE]
Response
File Version=1.0.0.0.0
SPECIFY_DOWNLOAD_LOCATION=false
SKIP_SOFTWARE_UPDATES=true
SOFTWARE_UPDATES_DOWNLOAD_LOCATION=
ORACLE_HOME=/home/oracle/Oracle/Middleware/Oracle_OSB1
MIDDLEWARE_HOME=/home/oracle/Oracle/Middleware
TYPICAL TYPE=false
CUSTOM TYPE=true
Oracle Service Bus Examples=false
Oracle Service Bus IDE=false
WL_HOME=/home/oracle/Oracle/Middleware/wlserver_10.3
OEPE_HOME=
[APPLICATIONS]
[RELATIONSHIPS][oracle@vm1 Disk1]$ ./runInstaller -silent -responseFile /home/oracle/custom_installtype.rsp
Starting Oracle Universal Installer...
Checking Temp space: must be greater than 150 MB. Actual 1661 MB Passed
Checking swap space: must be greater than 512 MB. Actual 2996 MB Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2012-03-13_02-22-14PM. Please wait ...
Please specify JRE/JDK location [ Ex. /home/jre ], /bin/java should exist :/home/oracle/Oracle/Middleware/jrockit_160_24_D1.1.2-4
[oracle@vm1 Disk1]$ [WARN ][jrockit] MaxPermSize=512m
ignored: Not a valid option for JRockit
Log: /home/oracle/oraInventory//logs/install2012-03-13_02-22-14PM.log
Copyright [c] 1999, 2011, Oracle and/or its affiliates. All rights reserved.
Reading response file..
Expected result: One of enterprise-5.4,enterprise-4,enterprise-5,redhat-5.4,redhat-4,redhat-5,SuSE-10,SuSE-11
Actual Result: redhat-5.4
Check complete. The overall result of this check is: Passed
CertifiedVersions Check: Success.
Checking for gcc-4.1.0-28.4; found
gcc-4.1.2-51.el5-i386. Passed
Checking for gcc-c++-4.1.0-28.4; found gcc-c++-4.1.2-51.el5-i386. Passed
Checking for setarch-1.6-1; found setarch-2.0-1.1-i386. Passed
Checking for sysstat-5.0.5-1; found sysstat-7.0.2-11.el5-i386. Passed
Checking for libstdc++-4.1.0-28.4; found libstdc++-4.1.2-51.el5-i386. Passed
Checking for libstdc++-devel-4.1.0-28.4; found libstdc++-devel-4.1.2-51.el5-i386. Passed
Checking for compat-libstdc++-296-2.96-132.7.2; Not found. Failed