II.6.6. Google Account
Ứng dụng có thể yêu cầu xác nhận bằng tài khoản Google . Ứng dụng có thể phát hiê ̣n ngƣời dùng đã đăng nhâ ̣p tài khoản Google hay chƣa và chuyển hƣớng ngƣời dùng tới trang đăng nhập.
import java.io.IOException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.appengine.api.users.UserService; import com.google.appengine.api.users.UserServiceFactory; public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
Sinh viên thực hiê ̣n : Đào Phan Quang K50 Lớp CNPM 42
UserService userService = UserServiceFactory.getUserService(); String thisURL = request.getRequestURI();
if (request.getUserPrincipal() != null) {
response.getWriter().println("<p>Hello, " +
request.getUserPrincipal().getName() + "! You can <a href=\"" + userService.createLogoutURL(thisURL) + "\">sign out</a>.</p>"); } else {
response.getWriter().println("<p>Please <a href=\"" + userService.createLoginURL(thisURL) + "\">sign in</a>.</p>"); } } } Đặc điểm:
- Dùng tài khoản Google để xác thƣ̣c.
II.6.7. Image
AppEngine cung cấp khả năng xƣ̉ lý ảnh thông qua di ̣ch vu ̣ Image . Dịch vụ này có thể phóng to , cắt, xoay hay gô ̣p nhiều ảnh la ̣i ; nó cũng có thể chuyển đổi giữa nhiều đi ̣nh da ̣ng khá c nhau. Ngồi ra nó còn cung cấp các thuật tốn cải thiện ảnh . Ta cũng có thể lấy đƣợc thông tin về nhƣ chiều cao , độ rô ̣ng hay thâm chí cả histogram của ảnh.
import com.google.appengine.api.images.Image; import com.google.appengine.api.images.ImagesService; import com.google.appengine.api.images.ImagesServiceFactory; import com.google.appengine.api.images.Transform; // ... byte[] oldImageData; // ... ImagesService imagesService = ImagesServiceFactory.getImagesService();
Image oldImage = ImagesServiceFactory.makeImage(oldImageData); Transform resize = ImagesServiceFactory.makeResize(200, 300); Image newImage = imagesService.applyTransform(resize, oldImage); byte[] newImageData = newImage.getImageData();
Dịch vụ Image có thể thay đởi kích cỡ, xoay, lật, và cắt hình ảnh, và nâng cao chất lƣơ ̣ng hình ảnh. Nó cũng có thể tởng hợp nhiều hình ảnh thành mợt hình ảnh duy nhất.
Sinh viên thực hiê ̣n : Đào Phan Quang K50 Lớp CNPM 43
Hình 3. Phép thay đổi kích cỡ [4]
Hình 4. Phép xoay [4]
Hình 5. Phép lật ngang [4]
Hình 6. Phép lật dọc [4]
Hình 7. Phép cắt [4]
Hình 8. Phép I'm Feeling Lucky [4]
"I'm Feeling Lucky" giúp tăng cƣờng chuyển màu tối và sáng trong mợt hình ảnh và điều chỉnh cả màu sắc và độ tƣơng phản đến mức tối ƣu.
Sinh viên thực hiê ̣n : Đào Phan Quang K50 Lớp CNPM 44
Dịch vụ này chấp nhận các dữ liệu hình ảnh trong JPEG, PNG, GIF (kể cả GIF đợng), BMP, TIFF và các định dạng ICO.
Nó có thể trả lại hình ảnh đã đƣơ ̣c chủn đởi theo định dạng JPEG và PNG. Nếu đầu vào và đầu ra định dạng khác nhau, dịch vụ chuyển đổi dữ liệu đầu vào thành định dạng đầu ra trƣớc khi thực hiện phép biến đởi.
Dịch vụ Image có thể sử dụng một giá trị từ Blobstore nhƣ là đầu vào để biến đởi. Mợt hình ảnh từ Blobstore có thể có kích thƣớc tối đa nhƣ kích thƣớc tối đa của một giá trị Blobstore. Lƣu ý, kết quả của chuyển đổi sẽ đƣợc trả trực tiếp cho các ứng dụng, và phải do đó không đƣợc vƣợt quá giới hạn của Iamge API là 1 megabyte. Bạn có thể sử dụng tính năng này để thu nhỏ của hình ảnh đƣợc tải lên bởi ngƣời sử dụng khi ngƣờ i dùng xem danh sách ảnh , giảm dung lƣợng truyền tải , trong khi vẫn giƣ̃ ảnh gốc nếu cần.
import com.google.appengine.api.images.Image; import com.google.appengine.api.images.ImagesService; import com.google.appengine.api.images.ImagesServiceFactory; import com.google.appengine.api.images.Transform; // ... BlobKey blobKey; // ... ImagesService imagesService = ImagesServiceFactory.getImagesService();
Image oldImage = ImagesServiceFactory.makeImageFromBlob(blobKey); Transform resize = ImagesServiceFactory.makeResize(200, 300); Image newImage = imagesService.applyTransform(resize, oldImage); byte[] newImageData = newImage.getImageData();
Đặc điểm:
- Xử lý ảnh, cải thiện ảnh, chuyển đổi định dạng
- Có thể sử dụng ảnh trong BlobStore , khi đó kích thƣớc ảnh có thể bỏ qua tuy nhiên ảnh trả về vẫn bi ̣ giới ha ̣n nhỏ hơn 1MB.
Giới ha ̣n:
- Kích thƣớc tối đa của ảnh nhận và gửi là 1MB Loại tài
nguyên
Đi ̣nh mƣ́c miễn phí Đi ̣nh mƣ́c trả phí Giới ha ̣n hàng
ngày
Mƣ́c tối đa Giới ha ̣n hàng ngày
Mƣ́c tối đa Gọi API 864.000 lời
gọi
4.800 lần/phút 45.000.000 lờ i gọi
31.000 lần/phút Dƣ̃ liê ̣u gƣ̉i
đến
1 gigabyte 5
megabyte/phút
560 gigabyte 400
Sinh viên thực hiê ̣n : Đào Phan Quang K50 Lớp CNPM 45
Dƣ̃ liê ̣u gƣ̉i đi 5 gigabyte 28
megabyte/phút
427 gigabyte 300
megabyte/phút Số phép biến
đổi
2.500.000 lần 14.000 lần/phút 47.000.000 lần 32.000 lần/phút Bảng 13. Đi ̣nh mƣ́c di ̣ch vu ̣ Image
II.6.7. Task queue
Với di ̣ch vu ̣ Task queue , ứng dụng có thể thực hiện những công viê ̣c mà không cần request của ngƣời dùng. Nếu mô ̣t ƣ́ng du ̣ng cần thƣ̣c hiê ̣n mô ̣t vài công viê ̣c bên dƣới, nó có thể sử dụng Task Queue và chia công việc thành những đơn vị nhỏ , đô ̣c lâ ̣p go ̣i là Task. Ứng dụng sau đó thêm những Task đó vào một hay nhiều hàng đợi.
Một ứng dụng Java lập hàng đợi bằng cách sử dụng một tập tin cấu hình queue.xml đặt tên, trong thƣ mục / WEB-INF các bên trong WAR. Nếu một ứng dụng khơng có mợt tập tin queue.xml, nó có mợt tên mặc định xếp hàng với một số cài đặt mặc định.
import com.google.appengine.api.labs.taskqueue.Queue;
import com.google.appengine.api.labs.taskqueue.QueueFactory; import static
com.google.appengine.api.labs.taskqueue.TaskOptions.Builder.*; // ...
Queue queue = QueueFactory.getDefaultQueue(); queue.add(url("/worker").param("key", key))
Mỗi khi bạn đã tạo ra một Task và đƣa nó vào một hàng đợi để thƣ̣c thi , App Engine sẽ thực hiện nó sớ m nhất có thể (tùy tḥc vào tiêu chí xƣ̉ lý của ứng dụng, nếu đƣợc chỉ định). Mỗi Task sẽ đƣợc coi một offline web hook, vòng đời của nó cũng giống nhƣ bất kỳ yêu cầu nào khác trong App Engine - nó có thể sử dụng cùng một API và chịu sự ràng buộc giống nhƣ một yêu cầu 'online'. Đáng chú ý, điều này có nghĩa là thời gian thực hiện một nhiệm vụ giới hạn là 30 giây. Nếu viê ̣c thực hiện Task tới gần giới hạn 30 giây, App Engine sẽ đƣa ra mợt ngoại lệ mà bạn có thể bắt và sau đó nhanh chóng lƣu lại công việc của bạn hoặc quá trình đăng nhập.
Khi chèn một công việc mới vào hàng đợi, thứ tự mà Task sẽ thực hiện (liên quan đến các Task khác) đƣợc quy định bởi các nợi dung và tính chất của hàng đợi đó. Tuy nhiên, nó có thể xác định các tḥc tính nhất định (chẳng hạn nhƣ một ETA) trong đó yêu cầu lập lịch trình đặc biệt cho mỗi kiểu nhiệm vụ.
Nếu thực hiện một Task thất bại (bằng cách trả lại bất kỳ mã trạng thái HTTP bên ngoài phạm vi 200-299), App Engine sẽ cố gắng thử lại cho đến khi nó thành cơng. Hệ thống thƣ̣c hiê ̣n viê ̣c quay trở lại dần dần để không làm tràn ứng dụng của bạn với lƣợng yêu cầu quá nhiều, nhƣng nó sẽ thƣ̣c hiê ̣n la ̣i nhƣ̃ng Task khơng thành cơng ít nhất là mợt lần mợt ngày.
Sinh viên thực hiê ̣n : Đào Phan Quang K50 Lớp CNPM 46
Khi viết mã thƣ̣c thi cho các Task , điều quan trọng là bạn xem xét nhiệm vụ là idempotent*. Task Queue API đƣợc thiết kế để chỉ gọi một nhiệm vụ một lần, tuy nhiên nó có thể có trong trƣờng hợp đặc biệt nào đó, mợt Task có thể thực hiện nhiều lần. Do đó, mã của bạn phải đảm bảo rằng khơng có tác dụng phụ có hại khi mơ ̣t Task đƣợc thực hiện lặp đi lặp lại.
Nếu một nhiệm vụ thực hiện các hoạt động nhạy cảm (nhƣ sửa đổi các dữ liệu quan trọng), nhà phát triển có thể muốn bảo vệ các URL thƣ̣c thi để ngăn chặn một ngƣời dùng đợc hại từ bên ngồi gọi nó trực tiếp. Điều này có thể thƣ̣c hiê ̣n bằng cách giớ i ha ̣n quyền cho URL thƣ̣c thi ở mức admin-only trong file cấu hình.
Bạn có thể chỉ định URL thƣ̣c thi cho mợt Task bằng cách đƣa nó vào hàm tạo của đối tƣợng Task. Nếu bạn không chỉ định một URL thƣ̣c thi, Task sẽ sử dụng một URL thƣ̣c thi mặc định đƣợc đặt tên theo hàng đợi:
/_ah/queue/queue_name Đặc điểm:
- Thƣ̣c hiê ̣n các tác vu ̣ nền bằng cách thêm chúng vào các hàng đợi . - File queue.xml phải đƣơ ̣c cấu hình.
Giới ha ̣n:
- Mô ̣t đối tƣợng Task có kích thƣớc phải nhỏ hơn 10 KB. - Số hàng đợi tối đa là 10
- Tối đa 20 task đƣơ ̣c thƣ̣c thi 1 giây
Thời gian thƣ̣c hiê ̣n mô ̣t task tối đa là 30 ngày. Loại tài
nguyên
Đi ̣nh mƣ́c miễn phí Đi ̣nh mƣ́c trả phí Giới ha ̣n hàng
ngày
Mƣ́c tối đa Giới ha ̣n hàng ngày
Mƣ́c tối đa Gọi API 100.000 lờ i go ̣i n/a 1.000.000 lời
gọi
n/a Bảng 14. Đi ̣nh mƣ́c dịch vụ Task queue
II.6.8. Blobstore
Blobstore API cho phép chƣơng trình lƣu trƣ̃ dƣ̃ liê ̣u lớn hơn nhƣ̃ng gì mà cơ sở dƣ̃ liê ̣u cho phép (>1MB). Mỗi blob là mô ̣t đối tƣợng dƣ̃ liê ̣u đƣợc ta ̣o ra khi ngƣời dùng upload một file . Khi form đƣơ ̣c submit , Blobstore API sẽ ta ̣o mô ̣t blob tƣ̀ nô ̣i dung file và trả về mô ̣t tham chiếu đến đó , gọi là blob key , mà ta có thể sử dụng để lấy la ̣i file đã tải lên.
Để tạo và tải lên một blob, hãy làm theo trình tự sau này:
- Đặt blobstoreService.createUploadUrl là hành động của form, đƣờng dẫn đến khi phƣơng thƣc POST đƣợc hoàn tất.
<body>
Sinh viên thực hiê ̣n : Đào Phan Quang K50 Lớp CNPM 47
method="post" enctype="multipart/form-data"> <input type="file" name="myFile"> <input type="submit" value="Submit"> </form>
</body>
- Form phải bao gồm thẻ upload , và enctype của mẫu phải đƣợc đặt là multipart/form-data. Khi ngƣời dùng gửi form, dƣ̃ liê ̣u của POST sẽ đƣợc xử lý bởi các API Blobstore, và tạo ra các blob. API này cũng tạo ra các thông tin cho blob và lƣu trữ các chúng trong kho dữ liệu, và viết la ̣i yêu cầu đến đi ̣a chỉ mà ta chỉ ra trong hành động của form với tham số là khóa của blob . - Trong đoạn mã xƣ̉ lý , bạn có thể lƣu trữ các khóa blob với phần cịn lại của
mơ hình ứng dụng dữ liệu của bạn (chẳng hạn nhƣ ghi nhớ mà ngƣời dùng tải lên các tập tin). Chìa khóa blob cịn có thể truy cập đƣợc từ các đối tƣợng thông tin trong kho dữ liệu. Lƣu ý rằng sau khi ta gƣ̉ i form và mã xử lý đƣợc gọi, blob đã đƣợc lƣu lại và các thông tin đã đƣơ ̣c bổ sung vào kho dữ liệu. Nếu ứng dụng của bạn khơng muốn giữ blob, bạn nên xóa các blob ngay lập tức để tránh cho nó không đƣợc quản lý.
Trong đoạn mã sau, phƣơng pháp getUploadedBlobs trả về một tập hợp các blob đã đƣợc tải lên. Các đối tƣợng Map là một danh sách liên kết tên của các trƣờng tải file lên và khóa của blob.
Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req); BlobKey blobKey = blobs.get("myFile");
if (blobKey == null) { res.sendRedirect("/"); } else {
res.sendRedirect("/serve?blob-key=" + blobKey.getKeyString()); }
Khi Blobstore API ghi lại yêu cầu của ngƣời dùng, những phần MIME của các tập tin tải lên đã bị làm trống, và khóa của blob đƣợc thêm vào thành một tiêu đề phần MIME. Tất cả các trƣờng và bộ phận khác đƣợc giƣ̃ nguyên truyền cho mã xử lý.
Nếu bạn không chỉ định một loại nội dung, Blobstore API sẽ cố gắng để suy luận kiểu nợi dung từ phần mở rợng. Nếu khơng có kiểu nợi dung có thể đƣợc xác định, các blob mới tạo đƣợc phân công ứng dụng kiểu nội dung /octet-stream.
Để sƣ̉ du ̣ng các blob , ta phải tạo một đoạn mã đƣa ra nội dung blob nhƣ một đƣờng dẫn trong ứng dụng của bạn (serlet). Đoa ̣n mã x ử lý này nên đƣa khóa của muốn lấy vào blobstoreService.serve (blobKey, res);. Trong ví dụ này, khóa blob đƣơ ̣c đƣa vào tƣ̀ querystring để lấy nô ̣i du ̣ng blob đó (req.getParameter ('blob-key')). Trong thƣ̣c tế ta có thể lấy khóa blob bằng bất cƣ́ cách nào .
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
Sinh viên thực hiê ̣n : Đào Phan Quang K50 Lớp CNPM 48
BlobKey blobKey = new BlobKey(req.getParameter("blob-key")); blobstoreService.serve(blobKey, res);
Đặc điểm:
- Tạo ra cơ chế để lƣu trữ những thông tin không tổ chức , nhƣ ảnh,icon hoă ̣c file dƣ̃ liê ̣u
Giới ha ̣n:
- Kích thƣớc tối đa của blob là 50MB.
III. Quản lý ứng dụng trên GAE
Giao diê ̣n quản lý của Google App Engine cho phép ta khả năng quản lý ƣ́ng dụng của mình . Truy cập vào giao diê ̣n điều khiển bằng cách truy cập vào liên kết sau đây trong trình duyệt web của bạn:
https://appengine.google.com/
Đăng nhập bằng tài khoản Google của ta, đăng ký mới với một địa chỉ email và mật khẩu.
Nếu ta đang sử dụng App Engine với tài khoản Google Apps, ta có thể đăng nhập vào App Engine bằng cách sử dụng một URL nhƣ sau, vớ i your-domain.com là tên miền Google Apps:
https://appengine.google.com/a/your-domain.com
Bạn có thể sử dụng giao diện quản lý để:
* Tạo ra một ứng dụng mới, và thiết lập một tên miền appspot .com và sub- domain, hoặc một tên miền cấp cao nhất.
* Mời ngƣời khác cùng phát triển ứng dụng, để họ có thể truy cập và điều khiển phiên bản mới tải lên của mã nguồn.
* Xem dữ liệu và truy cập các bản ghi lỗi, và phân tích lƣu lƣợng truy cập. * Duyệt kho dữ liệu ứng dụng và quản lý danh mục.
* Xem trạng thái của các nhiệm vụ của ứng dụng mà ta đã thiết lập.
* Thử nghiệm phiên bản mới, và chuyển phiên bản mà ngƣời dùng sẽ sử dụng.
IV. Các ứng dụng điển hình
Về cơ bản , tất cả các ƣ́ng du ̣ng trên nền web đều có thể đƣợc đƣa lên GEA , tuy nhiên có mô ̣t số kiểu ƣ́ng du ̣ng phát huy hết đƣợc điểm ma ̣nh của GEA khi so sánh với viê ̣c nó đƣợc triển khai trên các máy chủ nhƣ thông thƣờng . Ta có thể kể ra ở đây :
- Nhƣ̃ng website cung cấp di ̣ch vu ̣ kiểu ƣ́ng du ̣ng (nhƣ Google Docs ) vớ i lƣơ ̣ng lớn ngƣời truy câ ̣p và lƣu lƣợng dƣ̃ liê ̣u xƣ̉ lý lớn . Đây cũng là mu ̣c tiêu của Google khi thiết kế GEA . Chrome OS cũng của Google là h ệ điều hành sẽ sử dụng ứng dụng kiểu này.
Sinh viên thực hiê ̣n : Đào Phan Quang K50 Lớp CNPM 49
- Nhƣ̃ng ƣ́ng du ̣ng cung cấp di ̣ch vu ̣ mà số lƣợng ngƣời truy câ ̣p có nhƣ̃ng thời điểm đô ̣t biến . Ví dụ dịch vụ chia sẻ ảnh có lƣợng ngƣời dùng tăng đột biến sau mỗi kỳ nghỉ hay các sƣ̣ kiê ̣n.
- Các website cần độ sẵn sàng cao nhƣ các hê ̣ thống phu ̣c vu ̣ giải đáp thắc mắc của khách hàng.
- Các ứng dụng sử dụng các dịch vụ của Google (nhƣ Google Docs, SpreadSheet, Calendar …). Tốc đô ̣ truyền tải dƣ̃ liê ̣u giƣ̃a GEA và các di ̣ch vu ̣ đó luôn rất cao.
V. Kết chƣơng:
Sau khi tìm hiểu tất cả nhƣ̃ng gì mà GEA cung cấp , ta đã có đƣợc hiểu biết cu ̣ thể về mô ̣t di ̣ch vu ̣ điê ̣n toán đám mây. Ta thấy rằng nhƣ̃ng gì GEA cung cấp là mô ̣t môi trƣờng phát triển ứng dụng dựa trên những dịch vụ thế mạnh mà Google đã xây dƣ̣ng sẵn. Điều này thúc đẩy ta xây dƣ̣ng mô ̣t ƣ́ng du ̣ng trên cở sở các di ̣ch vu ̣ này để có đƣợc một khuôn mẫu cũng nhƣ kinh nghiệm phát triển ứng dụng t rên GEA.
Sinh viên thực hiê ̣n : Đào Phan Quang K50 Lớp CNPM 50
Chƣơng 3 : Xây dƣ̣ng hê ̣ thống ma ̣ng EEL sƣ̉ du ̣ng kiến trúc GEA GEA
I. Đặt vấn đề :
Ngày nay việc internet ngày càng phổ biến đã thúc đẩy sự hình thành của những dịch vụ mạng thay thế cho những phƣơng thức sinh hoạt cũ của con ngƣời . Nhu cầu chia sẻ thông tin đã trở thành vấn đề cấp thiêt . Trƣớc đây ngƣời ta thƣờng dùng các thiết bi ̣ sao chép để chia sẻ hình ảnh , thông tin nhƣng hiê ̣n ta ̣i các di ̣ch vu ̣ lƣu trƣ̃ trên ma ̣ng đã phần nào thay thế chúng . Các dịch vụ chia sẻ ảnh , file hay blog là nhƣ̃ng ví du ̣ điển hình . Mạng xã hội là một mức phát triển cao hơn khi mà ngƣời dùng có thể chia sẻ gần nhƣ tất cả các loại thông tin thông qua chúng.
GEA là mô ̣t nền tảng ma ̣nh trong viê ̣c xây dƣ̣ng nhƣ̃ng ƣ́ng du ̣ng có khả năng mở rô ̣ng cao. Với viê ̣c chỉ phải trả tiền cho lƣợng tài nguyên sƣ̉ du ̣ng , nó trở thành dịch vụ hồn hảo cho việc xây dựng mợt mạng xã hội nhỏ nhƣng có thể phát triển lớn tùy yêu cầu trong tƣơng lai . Trong khuôn khổ đồ án này , em xin xây dƣ̣ng mô ̣t ma ̣ng xã hô ̣i đơn giản mà em go ̣i là EEL – eEnglish Learning.