ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τµήµα Πληροφορικής ΕΠΛ 646 Προχωρηµένα Θέµατα Βάσεων Δεδοµένων ΑΣΚΗΣΗ 3 ΝοSQL Βάσεις Δεδοµένων (Δηµιουργία Εφαρµογής για Επερωτήσεις σε Web 2.0 APIs) Ι. Στόχος Άσκησης Ηµεροµηνία Ανάθεσης: Πέµπτη, 12/11/2015 Ηµεροµηνία Παράδοσης: Σάββατο, 21/11/2015 (9 ηµέρες) Διδάσκων: Δηµήτρης Ζεϊναλιπούρ (Να υποβληθούν όλα τα Design Documents µέσω του Moodle) Ο στόχος της άσκησης είναι η δηµιουργία µιας υποθετικής εφαρµογής στη βάση εγγράφων CouchDB και η εισαγωγή σε αυτή δεδοµένων JSON τα οποία θα έχετε ανακτήσει από το GitHub API (http://developer.github.com/). Τελικός στόχος της άσκησης είναι η δηµιουργία ανάλογων Design Views για την εξαγωγή των δεδοµένων που θα ζητηθούν πιο κάτω από τη CouchDB µέσω curl (http://curl.haxx.se/) και η προσοµοίωση του δικού σας GitHub API µε επαυξηµένες δυνατότητες (enhanced GitHub API). Επίσης, µέρος της άσκησης έχει σαν στόχο τη δηµιουργία Master-Master replicas της βάσης σας στην ίδια τοποθεσία µε τον διαθέτη σας. ΙΙ. Προεργασία Εγκαταστήστε την CouchDB και το curl αν δεν είναι ήδη εγκατεστηµένα στο Virtual Machine (VM) που σας έχει δοθεί ή στον προσωπικό σας Η/Υ. Στη συνέχεια σιγουρευτείτε ότι εγκαταστήσατε επιτυχηµένα την CouchDB ανοίγοντας το τερµατικό στο VM και εκτελώντας την εντολή: curl http://127.0.0.1:5984/ Η απάντηση η οποία θα πάρετε θα πρέπει να είναι JSON µορφής και να µοιάζει: {"couchdb":"welcome","uuid":"ef4ae6807d42cfc62aa32a787f961332","version":"1.6.1","vendor":{"version":"1.6.1-1","name":"homebrew"}} Σηµείωση: Μην ξεχνάτε ότι αν δεν έχετε ρυθµίσει το CouchDB service να ξεκινάει µε την εκκίνηση του συστήµατος σας θα πρέπει να το κάνετε αλλιώς δεν θα µπορείτε να πάρετε καµία απάντηση. Για να το ξεκινήσετε χρησιµοποιείστε την εντολή: service couchdb start σαν root χρήστης 1 από 5
ΙΙΙ. Εξαγωγή δεδοµένων από το GitHub και εισαγωγή δεδοµένων στη δική σας βάση Χρησιµοποιώντας τo curl και µέσω του GitHub API (το οποίο µπορείτε να βρείτε στο http://developer.github.com/) προσπαθήστε να εξάγετε όλα τα διαθέσιµα αποθετήρια του Twitter και του Facebook (παράδειγµα δίνεται στο τέλος της εκφώνησης). Για να σιγουρευτείτε ότι έχετε εξάγει τα σωστά αποτελέσµατα µπορείτε να ελέγξετε και να συγκρίνετε τα αποτελέσµατα σας µε τα αποθετήρια τα οποία µπορείτε να βρείτε στους ακόλουθους συνδέσµους: Facebook GitHub Page: https://github.com/twitter Twitter GitHub Page https://github.com/facebook Δηµιουργήστε τη δική σας βάση στην CouchDB την οποία είχατε εγκαταστήσει στο προηγούµενο βήµα και εισάγετε τα δεδοµένα τα οποία εξάγατε από το GitHub API σε αυτή. ΙV. Δηµιουργία Design Documents και MAP/REDUCE επερωτηµάτων Χρησιµοποιώντας τη βάση την οποία θα έχετε σε αυτό το στάδιο προσπαθήστε να δηµιουργήσετε τα ανάλογα Design Documents µε τα ανάλογα Views και τις ανάλογες Map/Reduce συναρτήσεις µε την βοήθεια των οποίων θα προσπαθήσετε να δώσετε απαντήσεις στις πιο κάτω επερωτήσεις δηµιουργώντας έτσι τη δική σας version του GitHub API (enhanced GitHub API). Κατά τη διάρκεια αυτή της άσκησης θα πρέπει να δηµιουργήσετε ένα Design Document ως ακολούθως: _design_both Και τα οποία παράγουν τον πιο κάτω σύνδεσµο: http://127.0.0.1:5984/mydb/_design/both Στο πιο πάνω Design Document θα πρέπει να προσθέσετε τα Views (Q1, Q2,, Q14) έτσι ώστε να καταφέρετε να απαντήσετε τα παρακάτω ερωτήµατα (queries). Οι επί µέρους όψεις πρέπει να είναι διαθέσιµες µέσω: http://127.0.0.1:5984/github/_design/both/_view/qid ή µε επιπλέον ορίσµατα στο URL (π.χ., http://127.0.0.1:5984/github/_design/both/_view/qid?group=true, ascending, descending, startkey, endkey, limit, κτλ., βλέπε https://wiki.apache.org/couchdb/http_view_api) ΙV. MAP/REDUCE ερωτήµατα Q1. Επιλέξτε όλα τα name των διαθέσιµων αποθετηρίων. Αποτέλεσµα: {"id":"facebook","key":165883,"value":"codemod"... Q2. Επιλέξτε όλα τα name των διαθέσιµων αποθετηρίων που ανήκουν στο Twitter. Αποτέλεσµα: {"id":"twitter","key":578435,"value":"elephant-bird"... Q3. Επιλέξτε όλα τα name των διαθέσιµων αποθετηρίων που ανήκουν στον owner.id 69631. Αποτέλεσµα: {"id":"facebook","key":165883,"value":"codemod"... Q4. Επιλέξτε το αποθετήριο µε τους πιο πολλούς watchers από όλα τα αποθετήρια. Αποτέλεσµα: {"id":"<repository>","key":<watchers>,"value":[<id>,"<name>"]} 2 από 5
Q5. Επιλέξτε το αποθετήριο µε τους πιο πολλούς watchers από τα αποθετήρια του Twitter Αποτέλεσµα: {"id":"<repository>","key":<watchers>,"value":[<id>,"<name>"]} Q6. Επιλέξτε τα δύο πιο διακλαδωµένα (forked) αποθετήρια από όλα τα αποθετήρια Αποτέλεσµα:[ {"id":"<repository>","key":<forks>,"value":[<id>,"<name>"] ] Q7. Επιλέξτε τα δύο πιο διακλαδωµένα (forked) αποθετήρια από τα αποθετήρια του Facebook Αποτέλεσµα:[ {"id":"<repository>","key":<forks>,"value":[<id>,"<name>"] ] Q8. Επιλέξτε το πιο παλιό χρονολογικά (created_at) αποθετήριο του Twitter Αποτέλεσµα:{"id":"<repository>","key":<created_at>,"value":[<id>,"<name>"]} Q9. Επιλέξτε τα 5 πιο ανανεωµένα (updated_at) αποθετήρια του Twitter που είναι υλοποιηµένα στην (language) Java. Αποτέλεσµα:[ {"id":"<repository>","key":<updated_at>,"value":[<id>,"<name>","<language>"]},... ] Q10. Επιστρέψετε τον αριθµό των συνολικών forks για τα αποθετήρια του Twitter Αποτέλεσµα:{"key":null,"value":<answer>} Q11. Επιστρέψετε τον αριθµό των συνολικών forks για τα ΟΛΑ τα αποθετήρια Αποτέλεσµα:{"key":null,"value":<answer>} Q12. Επιστρέψετε τον αριθµό των συνολικών forks για τα όλα τα αποθετήρια ανά κατηγορία Twitter και για το Facebook στο ίδιο JSON αποτέλεσµα. Αποτέλεσµα: [ {"key":"facebook","value":<answer>{"key":"twitter","value":<answer>} ] Παραδοτέα Παραδώσετε όλα τα πηγαία αρχεία σας µέσω του Moodle σε 1 συµπιεσµένο αρχείο (as3.zip): Α) download.txt: καταγράψετε τις εντολές που χρησιµοποιήσατε για ανάκτηση και προσθήκη των δεδοµένων από το Github στην CouchDB. Β) queries.txt: καταγράψετε για κάθε επί µέρους Query τα πιο κάτω: Map/Reduce συνάρτηση URL για εκτέλεση του Query Απάντηση 3 από 5
Παράδειγµα διαλογικής επικοινωνίας µε github.com curl i https://api.github.com/users/facebook/repos [ { "id": 39573797, "name": "android-jsc", "full_name": "facebook/android-jsc", "owner": { "login": "facebook", "id": 69631, "avatar_url": "https://avatars.githubusercontent.com/u/69631?v=3", "gravatar_id": "", "url": "https://api.github.com/users/facebook", "html_url": "https://github.com/facebook", "followers_url": "https://api.github.com/users/facebook/followers", "following_url": "https://api.github.com/users/facebook/following{/other_user}", "gists_url": "https://api.github.com/users/facebook/gists{/gist_id}", "starred_url": "https://api.github.com/users/facebook/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/facebook/subscriptions", "organizations_url": "https://api.github.com/users/facebook/orgs", "repos_url": "https://api.github.com/users/facebook/repos", "events_url": "https://api.github.com/users/facebook/events{/privacy}", "received_events_url": "https://api.github.com/users/facebook/received_events", "type": "Organization", "site_admin": false "private": false, "html_url": "https://github.com/facebook/android-jsc", "description": "Scripts for building JSC for Android", "fork": false, "url": "https://api.github.com/repos/facebook/android-jsc", "forks_url": "https://api.github.com/repos/facebook/android-jsc/forks", "keys_url": "https://api.github.com/repos/facebook/android-jsc/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/facebook/androidjsc/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/facebook/android-jsc/teams", "hooks_url": "https://api.github.com/repos/facebook/android-jsc/hooks", "issue_events_url": "https://api.github.com/repos/facebook/androidjsc/issues/events{/number}", "events_url": "https://api.github.com/repos/facebook/android-jsc/events", "assignees_url": "https://api.github.com/repos/facebook/android-jsc/assignees{/user}", "branches_url": "https://api.github.com/repos/facebook/android-jsc/branches{/branch}", "tags_url": "https://api.github.com/repos/facebook/android-jsc/tags", "blobs_url": "https://api.github.com/repos/facebook/android-jsc/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/facebook/android-jsc/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/facebook/android-jsc/git/refs{/sha}", "trees_url": "https://api.github.com/repos/facebook/android-jsc/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/facebook/android-jsc/statuses/{sha}", "languages_url": "https://api.github.com/repos/facebook/android-jsc/languages", "stargazers_url": "https://api.github.com/repos/facebook/android-jsc/stargazers", "contributors_url": "https://api.github.com/repos/facebook/android-jsc/contributors", "subscribers_url": "https://api.github.com/repos/facebook/android-jsc/subscribers", "subscription_url": "https://api.github.com/repos/facebook/android-jsc/subscription", "commits_url": "https://api.github.com/repos/facebook/android-jsc/commits{/sha}", "git_commits_url": "https://api.github.com/repos/facebook/android-jsc/git/commits{/sha}", "comments_url": "https://api.github.com/repos/facebook/android-jsc/comments{/number}", "issue_comment_url": "https://api.github.com/repos/facebook/androidjsc/issues/comments{/number}", "contents_url": "https://api.github.com/repos/facebook/android-jsc/contents/{+path}", "compare_url": "https://api.github.com/repos/facebook/android-jsc/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/facebook/android-jsc/merges", "archive_url": "https://api.github.com/repos/facebook/android-jsc/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/facebook/android-jsc/downloads", "issues_url": "https://api.github.com/repos/facebook/android-jsc/issues{/number}", "pulls_url": "https://api.github.com/repos/facebook/android-jsc/pulls{/number}", "milestones_url": "https://api.github.com/repos/facebook/android-jsc/milestones{/number}", "notifications_url": "https://api.github.com/repos/facebook/android- 4 από 5
jsc/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/facebook/android-jsc/labels{/name}", "releases_url": "https://api.github.com/repos/facebook/android-jsc/releases{/id}", "created_at": "2015-07-23T15:01:12Z", "updated_at": "2015-11-08T15:15:02Z", "pushed_at": "2015-10-05T10:10:39Z", "git_url": "git://github.com/facebook/android-jsc.git", "ssh_url": "git@github.com:facebook/android-jsc.git", "clone_url": "https://github.com/facebook/android-jsc.git", "svn_url": "https://github.com/facebook/android-jsc", "homepage": "", "size": 192, "stargazers_count": 27, "watchers_count": 27, "language": "C", "has_issues": true, "has_downloads": true, "has_wiki": true, "has_pages": false, "forks_count": 5, "mirror_url": null, "open_issues_count": 2, "forks": 5, "open_issues": 2, "watchers": 27, "default_branch": "master" { "id": 21265042, "name": "AsyncDisplayKit", "full_name": "facebook/asyncdisplaykit",...... ] Σηµείωση για Github API v3: Rate Limiting For requests using Basic Authentication or OAuth, you can make up to 5,000 requests per hour. For unauthenticated requests, the rate limit allows you to make up to 60 requests per hour. Unauthenticated requests are associated with your IP address, and not the user making requests. Καλή Επιτυχία! 5 από 5