Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Millard Ellingsworth ([email protected]) Nhà phát triển phần mềm IBM Corporation 29 06 2014 tiên vào ngày 20 01 (Xuất bản lần đầu 2015) Hackathon thường là khoảng thời gian ngắn, tập trung phát triển phối hợp một chủ đề hoặc mục tiêu cụ thể. Vấn đề là phải hoàn tất điều gì đó nhanh chóng, và tất nhiên việc bạn làm phải hoàn toàn thuyết phục được ban giám khảo. Trong khoảng thời gian ngắn quy định, đây có thể là thử thách khi thiết lập một số tính năng cơ bản như xác thực Facebook hoặc gửi email hoặc văn bản trong khi vẫn thực hiện tiến trình quan trọng về mục tiêu chính của bạn. Dự án Bộ khởi động Hackathon của Sahat Yalkabov, và cộng sự, được tổ chức tại GitHub, cung cấp tập hợp tuyệt vời về những khả năng được sử dụng làm nền tảng cho những nỗ lực về Hackathon của bạn. DevOps Services của IBM cung cấp môi trường phát triển trên web phối hợp và đường truyền phân phối liên tục trong khi IBM Bluemix cung cấp lưu trữ đám mây mà bạn cần để vận hành, tạo nên một cặp đôi hoàn hảo cho thành công về Hackathon. Tôi giải thích cách thiết lập bản sao của riêng bạn về Bộ khởi động Hackathon từ phiên bản mới của nguồn sử dụng DevOps Services và tự động triển khai nó sau mỗi lần chuyển sang Bluemix PaaS. Để xem video giới thiệu Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix , vui lòng truy cập bài viết trực tuyến. Ðăng ký IBM Bluemix™ Nền tảng đám mây này có sẵn dịch vụ, thời gian chạy (runtime) và cơ sở hạ tầng miễn phí để giúp bạn nhanh chóng tạo và triển khai ứng dụng web hoặc di động tiếp theo của bạn. Hackathon thường là khoảng thời gian ngắn, tập trung phát triển phối hợp quanh một chủ đề hoặc mục tiêu cụ thể. Vấn đề là phải hoàn tất điều gì đó nhanh chóng, và tất nhiên việc bạn làm phải hoàn toàn thuyết phục được ban giám khảo. Trong khoảng thời gian ngắn quy định, đây có thể là thử thách khi thiết lập các tính năng cơ bản như xác thực Facebook, hoặc gửi email hoặc văn bản, trong khi vẫn thực hiện tiến trình quan trọng về mục tiêu chính của bạn. “ IBM DevOps Services cung cấp môi trường phát triển trên web phối hợp và đường truyền phân phối liên tục, trong khi Bluemix cung cấp lưu trữ đám mây mà bạn cần để vận hành, tạo nên một cặp đôi hoàn hảo cho thành công về Hackathon. ” © Copyright IBM Corporation 2015 Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Nhẫn hiệu đăng ký Trang 1 của 14 developerWorks® ibm.com/developerWorks/vn/ Dự án Bộ khởi động Hackathon của Sahat Yalkabov và cộng sự, được tổ chức tại GitHub, cung cấp tập hợp tuyệt vời về các khả năng được sử dụng làm nền tảng cho những nỗ lực về Hackathon của bạn. DevOps Services cung cấp môi trường phát triển trên web phối hợp và đường truyền phân phối liên tục, trong khi Bluemix cung cấp lưu trữ đám mây mà bạn cần để vận hành, tạo nên một cặp đôi hoàn hảo cho thành công về Hackathon. Tôi giải thích cách thiết lập bản sao của riêng bạn về Bộ khởi động Hackathon từ phiên bản mới của nguồn sử dụng DevOps Services và tự động triển khai nó sau mỗi lần chuyển sang Bluemix PaaS. Chạy ứng dụng Lấy mã Nếu bạn thắc mắc về Hackathon, hãy đọc nhật ký của Tim Fall TẠI SAO lại là Hackathon? trên SendGrid. Nó trình bày mô tả sâu sắc về lý do Hackathon tồn tại và giá trị mà chúng tạo ra. Nếu bạn muốn thử tham gia Hackathon, hãy xem 10 lời khuyên để thành công về Hackathon của Appsembler và Hướng dẫn quan trọng cho lần đầu bạn tham gia Hackathon của Michelle Sun. Bộ khởi động Hackathon cung cấp bảng mẫu ứng dụng web Node.js sử dụng khung Express và cơ sở dữ liệu MongoDB NoSQL. Nó thực hiện nhiều kiểu xác thực khác nhau, bao gồm xác thực cục bộ (người dùng thiết lập chứng danh riêng của họ) và xác thực Oauth sử dụng Twitter, Facebook, Google, Linkedln, và những thứ khác. UI mặc định sử dụng Chương trình khởi động 3 và đáp ứng phù hợp với các kích cỡ màn hình khác nhau. Có biểu mẫu liên hệ cùng với sự hỗ trợ qua email, khả năng quản lý tài khoản người dùng chung (bao gồm hỗ trợ mật khẩu bị mất), và ngăn chặn việc mượn quyền trái phép (CSRF). Còn có các ví dụ API về những trang web phổ biến khác nhau, bao gồm Facebook, Foursquare, Tumbler, Twitter, Stripe, và các trang khác. Bộ khởi động Hackathon README.md tại GitHub được trình bày chi tiết và được viết tốt. Nó bao gồm hướng dẫn về cách nhận khóa API của riêng bạn cho nhiều dịch vụ sẵn có khác nhau, tài liệu Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 2 của 14 ibm.com/developerWorks/vn/ developerWorks® cấp cao hữu ích về cấu trúc dự án, và chi tiết về cách thực hiện thao tác nhất định cần thiết cho thành công về Hackathon, như thêm trang/định tuyến mới. Ngoài ra còn có danh sách các tham chiếu đề nghị và số lượng mã hoạt động đáng kinh ngạc, khiến nó trở thành công cụ học tập và tài liệu tham khảo tuyệt vời ngay cả khi bạn không dự định tham gia Hackathon. Sahat đã làm việc để giúp cho dự án đơn giản và dễ hiểu trong khi vẫn tiếp nhận sự đóng góp của trên 30 cộng tác viên. Bạn sẽ cần điều gì để khởi đầu những nỗ lực của bạn về Hackathon Đối với người bắt đầu: • ID IBM được đăng ký tại DevOps Services và Bluemix. Nếu bạn không có ID IBM, bạn có thể tạo tại các trang này. • Máy khách Git. Tôi sử dụng dòng lệnh trong mục này. • Tập tin ZIP của Dự án Bộ khởi động Hackathon. Có một nút để tải xuống tập tin ZIP của nguồn ở phía trên cùng README.md trên trang GitHub. Tại sao không phải là bản sao của Bộ khởi động Hackathon? Vì chúng tôi muốn bản sao của bạn tại DevOps Services sẽ là bản chính, và sẽ đơn giản hơn nếu chúng ta tạo kho lưu trữ tại đó và đưa vào mã Bộ khởi động Hackathon. Việc này cũng tạo cơ hội cho chúng ta thực hiện một số thay đổi cần thiết trước thời hạn. • Sự hiểu biết cơ bản về JavaScript, Node.js, MongoDB, Express, Jade, và Git sẽ hữu ích, nhưng chúng ta sẽ sử dụng mã của người khác làm điểm khởi đầu để hoàn tất các bước trong mục này, vì vậy việc này không cần thiết. Trong khi bạn chỉ có thể phân nhánh bản sao mà tôi đã thiết lập tại DevOps Services để làm việc với mục này, bạn chỉ nhận được phiên bản 2.1. Nếu muốn sử dụng phiên bản mới nhất, bạn cần thiết lập bản sao của riêng mình, tôi sẽ hướng dẫn cụ thể cho bạn. Tôi đã thực hiện việc này theo các cách khác nhau và tôi muốn chia sẻ suy nghĩ của mình nhằm mang đến cho bạn điểm khởi đầu tốt nhất với các bước ngắn gọn và đơn giản nhất: dự án DevOps Services tự động triển khai sang Bluemix mỗi khi đồng đội của bạn đẩy một thay đổi mới vào kho lưu trữ mã nguồn của bạn. Dù vậy, nếu bạn phân nhánh dự án hiện tại, bạn cần hiệu chỉnh tập tin manifest.yml và cung cấp: • Máy chủ khác: giá trị (tên máy chủ trở thành một phần của định tuyến phải là duy nhất trong BlueMix) • Tên của dịch vụ MongoDB riêng của bạn, thay thế "hackathon-db-service" Sáu bước để sẵn sàng cho việc lập trình Đây là tổng quan về các bước: 1. Tạo dự án cho mã Bộ khởi động Hackathon của bạn. Lập cấu hình cho dự án để sử dụng Git cho mã nguồn của bạn và để “Triển khai sang Bluemix” khi chúng ta đẩy các thay đổi. Việc này cung cấp URL Git cho kho lưu trữ chính để đẩy các thay đổi cục bộ. 2. Sử dụng bản sao Git để tạo bản sao dự án cục bộ. Đưa vào nguồn Bộ khởi động Hackathon. 3. Vào Bluemix để tạo dịch vụ MongoDB để sử dụng cho kho dữ liệu. 4. Hiệu chỉnh một tập tin, secrets.js, để truy xuất URL cơ sở dữ liệu cho dịch vụ MongoDB từ Bluemix và thêm tập tin manifest.yml, cần thiết cho việc triển khai tự động. Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 3 của 14 developerWorks® ibm.com/developerWorks/vn/ 5. Đẩy các thay đổi đến đám mây và xem điều kỳ diệu xảy ra. 6. Thực hiện một số thay đổi nhỏ từ đám mây, đồng bộ hóa chúng, và thúc đẩy thực hiện triển khai tự động. Vì vậy, sáu bước đơn giản để thành công trong đám mây cho việc khởi đầu những nỗ lực của bạn về Hackathon. Hãy cùng thực hiện! Bước 1. Tạo Dự án DevOps Services 1. Đến DevOps Services, đăng nhập và nhấp vào Creat Project. Tôi đã gọi bộ khởi động Hackathon của tôi trong ví dụ bên dưới— sử dụng tên bất kỳ phù hợp với dự án của bạn. ĐỌC: Xâm nhập vào đám mây với IBM Bluemix và DevOps Services 2. Cài đặt dự án để sử dụng kho lưu trữ Git nắm giữ mã của bạn. Bạn sẽ lưu trữ dữ liệu cho khóa API mà bạn không muốn những người ngoài đội của mình nhìn thấy, vì vậy hãy để chế độ Riêng tư. 3. Thêm các tính năng về sự phát triển linh hoạt. Chúng ta sẽ không sử dụng các tính năng đó trong mục này, nhưng bạn sẽ muốn theo dõi các tác vụ và sai sót khi thực hiện dự án. 4. Chọn Deploy to Bluemix để thiết lập triển khai tự động mà chúng ta sẽ lập cấu hình sau này. 5. Sau khi tạo dự án, bạn nên mời các thành viên khác trong dự án của bạn. Bạn có thể thực hiện việc này sau, nhưng chỉ các thành viên của dự án mới có thể nhìn thấy và làm việc trên mã nguồn. Tất cả thành viên của dự án cần ID IBM và cần được đăng ký tại Bluemix và DevOps Services. Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 4 của 14 ibm.com/developerWorks/vn/ Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix developerWorks® Trang 5 của 14 developerWorks® ibm.com/developerWorks/vn/ Bước 2. Thiết lập mã 1. Từ trang dự án mở đầu, bạn có thể tìm thấy URL Git cho dự án của bạn: 2. Hãy tìm thư mục phù hợp trên máy cục bộ của bạn để sao chép dự án. Bản sao Git tạo thư mục con với tên bất kỳ mà bạn đã sử dụng trước đó cho dự án. Hãy xem đó là thư mục làm việc hiện tại của bạn. Việc này dẫn đến hai tập tin được tạo theo mặc định khi dự án của bạn đã được tạo tại DevOps Services. Nó cũng lập cấu hình cho vị trí đó là vị trí từ xa mà chúng ta sẽ đẩy các thay đổi đến. 3. Trích xuất nội dung của tập tin ZIP về Bộ khởi động Hackathon mà bạn đã tải xuống trước đó cho thư mục mới. Bạn sẽ gặp xung đột trên tập tin README.md. Lưu tập tin từ DevOps Services. Nó nhỏ hơn và bạn sẽ cần sử dụng cho dự án của bạn. Nếu bạn không gặp xung đột, bạn đã không trích xuất nội dung cho vị trí đúng. Trong trường hợp này, hãy xóa những gì bạn đã trích xuất và chắc chắn hướng đến vị trí đúng, nếu không nguồn mới sẽ không là một phần của kho lưu trữ Git mới của bạn, hoặc thư mục cấp cao nhất của bạn sẽ khác với thư mục được sử dụng trong ví dụ bên dưới, tạo ra xung đột với các bước đã trình bày. Bước 3. Tạo dịch vụ MongoDB tại Bluemix Bộ khởi động Hackathon phụ thuộc vào MongoDB để lưu trữ cơ sở dữ liệu. Khi thực hiện chỉnh sửa mã cần thiết để chạy tại Bluemix, chúng ta sẽ cần tên của dịch vụ MongoDB trước khi có thể triển khai thành công. Dù sao dịch vụ này cũng cần phải tồn tại, vì vậy hãy thực hiện việc đó sau. Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 6 của 14 ibm.com/developerWorks/vn/ developerWorks® Đi đến tài khoản Bluemix của bạn và đăng nhập, sau đó đến Danh mục và cuộn xuống phần Quản lý dữ liệu cho dịch vụ. Chọn tạo dịch vụ MongoDB. Bạn có thể nhận tên mặc định hoặc tạo tên. Hãy ghi chép tên vì bạn sẽ cần cho bước tiếp theo. Phải chắc chắn bạn không kết hợp nó với bất kỳ ứng dụng hiện tại nào. Tập tin manifest.yml của chúng ta sẽ tạo sự liên kết khi chúng ta triển khai. Bước 4. Thực hiện một số thay đổi nhỏ về mã Trước tiên, chúng ta sẽ thay đổi mã để kết nối với dịch vụ MongoDB. Trong khi triển khai, ứng dụng của bạn được liên kết với dịch vụ. Thông tin kết nối được tạo vào lúc đó và được lưu làm một phần của cấu hình ứng dụng của bạn. Vì nó khả dụng trong môi trường thực thi, chúng ta có thể truy vấn nó và trích xuất giá trị URL từ chứng danh để tạo kết nối cơ sở dữ liệu. Tôi cung cấp mã để thực hiện việc này dưới đây và cho bạn biết vị trí chèn mã. Nếu bạn thắc mắc về cách thức hoạt động, hãy đọc về biến môi trường VCAP_SERVICES trong Bluemix FAQ. Nếu bạn nhìn vào mã chưa được giải nén, bạn sẽ thấy rằng thông tin kết nối cơ sở dữ liệu đến từ / config/secrets.js. Hiện nó được lập cấu hình để kiểm tra về biến môi trường chung, hoặc bạn có thể sử dụng tham chiếu localhost chuẩn. db: process.env.MONGODB|| 'mongodb://localhost:27017/test', Chúng ta sẽ thêm check cho mục nhập Bluemix được lập cấu hình vào phía trước của mục nhập. Nó sẽ trả về 0 nếu không có biến để mã hiện hành vẫn hoạt động trong trường hợp các thành viên trong đội của bạn làm việc cục bộ. Đây là công cụ diff: Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 7 của 14 developerWorks® ibm.com/developerWorks/vn/ Đây là hàm mới nên bạn có thể sao chép và dán nó: //fixup to retrieve MongDb creds from BlueMix if configured var getBlueMixDbUrl = function() { var dbUrl = ""; if (process.env.VCAP_SERVICES) { var env = JSON.parse(process.env.VCAP_SERVICES); if (env['mongodb-2.2']) { dbUrl = env['mongodb-2.2'][0].credentials.url; } } if (dbUrl === "") return null; else return dbUrl; }; Đừng quên đánh dấu getBlueMixDbUrl() || vào trước biểu thức trên dòng db: . Hãy lưu lại. Thêm tập tin mới có tên manifest.yml vào thư mục gốc của dự án. Đặt mã sau đây vào trong thư mục, thay tên khi cần. Ví dụ, dự án của tôi có tên là "hackathon-starter", bạn sẽ phải sử dụng tên khác nữa, ít nhất là cho thuộc tính máy chủ. Thuộc tính máy chủ được sử dụng để tạo định tuyến/url cho ứng dụng: http://hackathon-starter.mybluemix.net. Thay thế hackathon-starter ở hai vị trí (name: và host:) và tên dịch vụ hackathon-starter-db bằng tên dịch vụ của bạn. applications: - services: - hackathon-starter-db host: hackathon-starter disk: 1024M name: hackathon-starter command: node app.js path: . domain: mybluemix.net mem: 512M instances: 1 Bước 5. Hãy khởi động! Dù tin hay không, chúng ta đã sắp hoàn tất. Chỉ vài bước nữa thôi: 1. Chúng ta cần thêm các thay đổi này cho kho lưu trữ Git cục bộ, xác nhận chúng, và đẩy các thay đổi đến kho lưu trữ tại DevOps Services. Sử dụng các lệnh này từ cửa sổ lệnh của bạn: git add . git commit -m "initial commit" git push Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 8 của 14 ibm.com/developerWorks/vn/ developerWorks® 2. Giờ quay lại DevOps Services và vào trang Hiệu chỉnh mã để xem qua, sau đó nhấp vào BUILD & DEPLOY. 3. Trên trang BUILD & DEPLOY, đảo kiểu triển khai sang SIMPLE (Đơn giản). Lần triển khai đầu tiên của bạn sẽ bắt đầu và hiển thị dưới dạng chưa xử lý trong cột Kết quả của bảng Triển khai tự động gần đây. 4. Lần triển khai đầu tiên sẽ lâu hơn một chút vì npm cần giải quyết các phụ thuộc Node.js khác nhau và thực hiện các thiết lập ban đầu như đã được xác định trong tập tin package.json. Hãy chờ một chút, sau đó chuyển sang Bluemix và kiểm xuất trang tổng quan của ứng dụng. Bạn Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 9 của 14 developerWorks® ibm.com/developerWorks/vn/ có thể nhìn thấy nó đang chạy, và dịch vụ MongoDB đã được liên kết tự động thông qua tập tin manfiest.yml . 5. Nhấp vào liên kết kế bên Định tuyến: bên dưới tên ứng dụng. Việc này đưa bạn đến dự án mới. Bước 6. Chỉnh sửa dự án trong đám mây Trông rất ổn! Nhưng nó chỉ là tổng quát. Hãy thay đổi tên dự án thành tên khác và thay thế tiêu đề trên trang HTLM mở đầu. Và để thú vị hơn, hãy thực hiện việc này trong đám mây sử dụng trình soạn thảo trực tuyến của DevOps Services và giao diện Git. 1. Quay lại DevOps Services và đến trang Hiệu chỉnh mã. Mở thư mục dạng xem và nhấp vào home.jade. Bên dưới block content, thay đổi dòng h1 (được Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 10 của 14 ibm.com/developerWorks/vn/ developerWorks® tô sáng) như trong hình, hoặc với văn bản bất kỳ mà bạn thích. Hãy lưu lại. 2. Mở thư mục từng phần bên dưới thư mục dạng xem và nhấp vào navigation.jade. Thay tên dự án bằng Bắt đầu với DevOps Services (dòng được tô sáng). Lưu lại. 3. Nhấp vào biểu tượng "đĩa" bên trái (thứ hai từ trên xuống) để đến trang trạng thái Git. Tại đây bạn sẽ thấy các thay đổi chưa được phân cấp. Hãy chọn cả hai rồi nhấp vào nút STAGE . Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 11 của 14 developerWorks® ibm.com/developerWorks/vn/ Nếu bạn từng thắc mắc các thay đổi nào sẽ được thực hiện, bạn có thể nhấp vào twistie bên trái mục nhập bất kỳ để hiển thị công cụ diff của tập tin: 4. Chọn cả hai tập tin, nhấp vào COMMIT, thêm chú thích và gửi các thay đổi. 5. Mặc dù chúng ta đã đẩy các tập tin đến kho lưu trữ Git, chúng ta vẫn làm việc trong vùng làm việc cục bộ khi đang ở máy khách web. Trước khi có thể đẩy các thay đổi, chúng ta cần đồng bộ hóa với kho lưu trữ chính. Vì vậy, hãy tìm nạp để đồng bộ hóa trước khi bạn đẩy các thay đổi hoặc bạn sẽ nhận lỗi. Nhấp vào BUILD & DEPLOY, và bạn sẽ nhìn thấy sự triển khai mới đã được khởi động tự động. 6. Sau một hoặc hai phút, hãy làm mới trang trình duyệt hiển thị ứng dụng bộ khởi động của bạn. Thành quả là nếu bạn thay đổi kích thước cửa sổ, bạn sẽ nhận thấy rằng ứng dụng có các đặc tính thiết kế web thuận lợi, ẩn tùy chọn trình đơn bên dưới nút khi thu nhỏ màn hình đáng kể. Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 12 của 14 ibm.com/developerWorks/vn/ developerWorks® Chúc mừng lập trình thành công! Nếu bạn sử dụng lập trình này cho Hackathon tại Bluemix, vui lòng thêm chú thích cho mục mô tả dự án của bạn, cùng với một liên kết nếu bạn dự định thiết lập nó. Kết luận DevOps Services cung cấp môi trường linh hoạt, dễ sử dụng để thực hiện dự án của bạn, dù đối với Hackathon hoặc các thứ khác, cho phép bạn làm việc cục bộ hoặc trên web, tự động triển khai các thay đổi mới nhất để người dùng theo dõi. Còn nhiều điều chúng ta chưa đề cập trong ví dụ này. Việc lập kế hoạch, theo dõi, và bảng điều khiển giúp người dùng có thể gửi các yêu cầu nâng cấp (hoặc những sai sót bất thường) một cách dễ dàng, và giúp các nhà tài trợ dự án biết được những việc gì đang được thực hiện. Thậm chí còn có nhiều tùy chọn tạo và triển khai linh hoạt khả dụng. Khi bạn hoàn tất Hackathon, hãy quay trở lại và quan sát. Lời cảm ơn Chân thành cảm ơn John Kellerman, Michele Chilanti, Annie Cheng, và Erik Mats đã kiểm tra và đóng góp ý kiến về mặt kỹ thuật. Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 13 của 14 developerWorks® ibm.com/developerWorks/vn/ Đôi nét về tác giả Millard Ellingsworth Nhà phát triển phần mềm Millard Ellingsworth sống ở Portland, Oregon, tại đây ông làm việc với cộng đồng IBM Rational Collaborative Lifecycle Management, công việc là cải tiến việc làm thế nào để một đội lập trình làm việc với nhau tốt hơn. Khi rỗi rãi ông thích chơi gôn, đàn ghi ta. Bạn có thể theo dõi ông trên Twitter tại @millard3 and on Google+. © Copyright IBM Corporation 2015 (www.ibm.com/legal/copytrade.shtml) Nhẫn hiệu đăng ký (www.ibm.com/developerworks/vn/ibm/trademarks/) Bắt đầu nỗ lực của bạn trong cuộc thi lập trình Hackathon với DevOps Services và Bluemix Trang 14 của 14