{"action":"created","comment":{"url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/comments/221018425","pull_request_review_id":159566521,"id":221018425,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMTAxODQyNQ==","diff_hunk":"@@ -0,0 +1,206 @@\n+= Equoid\n+:page-link: equoid\n+:page-liquid:\n+:page-weight: 0 \n+:page-labels: [Scala, S2I, Infinispan, Spark, Artemis]\n+:page-layout: application\n+:page-menu_template: menu_tutorial_application.html\n+:page-description: Equoid is an implementation of a top-k (aka heavy hitters) tracking system built upon the notion of utilizing a Count-Min Sketch. The project demonstrates the utility of microserviced data streaming pipelines coupled with a temporal and spatial efficient approach to a common use case. The application contains a web server, web UI, caching layer, Apache Artemis broker with associated data publisher and receivers. \n+:page-project_links: [\"https://github.com/eldritchjs/equoid-data-publisher\", \"https://github.com/eldritchjs/equoid-data-handler\", \"https://github.com/eldritchjs/equoid-openshift\", \"https://github.com/Jiri-Kremser/equoid-ui\"]\n+\n+[[introduction]]\n+== Introduction\n+\n+Equoid is a microservice-driven application which implements a https://en.wikipedia.org/wiki/Streaming_algorithm#Frequent_elements[heavy hitter assessment] system for https://en.wikipedia.org/wiki/Streaming_algorithm[data streams]. As will be discussed, Equoid uses https://en.wikipedia.org/wiki/Count%E2%80%93min_sketch[Count-Min Sketch] objects as the foundation for its top-k computation. Furthermore, Equoid leverages https://spark.apache.org/[Apache Spark] for scalable processing of streaming data. \n+\n+Using the instructions that follow, you will be able to deploy Equoid on an OpenShift cluster with a simulated stream of a dataset provided in the Equoid repository. In addition, guidance is provided for using Equoid with the dataset or stream of your choosing. \n+\n+[[implementation]]\n+== Implementation\n+\n+=== Reducing transfer and storage quantity\n+\n+When thinking about keeping track of the top-k items received in a stream, it is tempting to pursue a counting approach wherein every element received has its count kept. This, while guaranteed to be correct, can be prohibitive with respect to data transfers and storage footprint. Consider a system where the streamed items to be counted have a massive or countably infinite range of values. In this case, storage must be allocated for a label and counter, each item of the stream will require a lookup and increment, and a check to see if a shuffle is needed, assuming the data is to be sorted in-place. \n+\n+Equoid, on the other hand, incorporates a Count-Min Sketch for keeping track of the heavy hitters received over the stream. Without delving into the math involved, a Count-Min Sketch is a probabilistic data structure which  provides a frequency table of events, in the top-k case these events would be a given item appearing on the stream. In terms of storage and computation it amounts to a set of hash functions mapping events to frequencies, so a table of hash functions is maintained. I said previously that the counting approach is guaranteed to be correct since it takes into account every item ever seen on the stream. In the Count-Min Sketch case, it is known that a measure of overcounting is possible and expected, however, for large scale data streams, the impact of this overcounting is usually neglible. Furthermore, parameters have been exposed in Equoid for tuning the sketches to the data stream as described further below; by tuning these parameters to your data stream you can optimize the performance of the model. Myriad theses have been published on this very subject and as such will not be discussed further herein. Another benefit of using the Count-Min sketch approach is the disregard of anomalous or spurious values. However, this also eliminates the potential for detecting similar but different values (e.g. itemN vs itemn.) This could be addressed by considering similarity measures of incoming values with those currently in the top-k. \n+\n+=== Data Sources\n+\n+In data streaming applications, an issue that arises is the availability of quality data streams. Indeed, seldom are organizations willing to part with their live streams gratis. One can consider a synthetic stream, wherein a dataset is transmitted piecemeal over a stream, in a temporal fashion if desired, or at random. However, this is still limited to available datasets which may not possess the characteristics one wishes to address in their solution. As such, this notion of a synthetic dataset could be extended such that controls are provided for adding randomness to the record selection and/or generation process. For illustrative purposes, Equoid has three sample use cases, all derived from the same dataset. Namely, the online retail dataset made available through the UC Irvine Machine learning library https://archive.ics.uci.edu/ml/datasets/online+retail[found here]. We address the cases where a dataset is to be passed linearly through the stream, the case where one column is chosen at random using a https://en.wikipedia.org/wiki/Zipf%27s_law[Zipfian distribution] and sent through the stream, and a case where two columns are chosen at random and sent through the stream. For convenience, we give a file for each of these which can be streamed to the data publisher.\n+\n+[[architecture]]\n+== Microservice Architecture\n+\n+Equoid is made up of a number of components giving users a means for visualizing the top-k elements in a stream during a specified temporal window. This is made possible through a hosted web UI and backend REST interface for parameter updates. \n+\n+The services of Equoid are: \n+\n+- A data publisher\n+- A message broker\n+- A data handler\n+- A caching layer \n+- A web UI\n+- A REST API for adding items to the set of possibilities the data publisher chooses from \n+\n+The following diagram shows the overall architecture of Equoid.\n+\n+pass:[<img src=\"/assets/equoid/Equoid-Architecture.png\" alt=\"Alt text\" class=\"img-responsive arch\" width=\"800px\">]\n+\n+Equoid utilizes a caching layer for storing the top-k values. The data publisher transmits records to Artemis, the data handler retrieves mesages from the Artemis broker, parses or converts them per user specification, then adds the information to the extant top-k object. It's worth noting that multiple instances of the data publisher and data handler can co-exist, which would be akin to a production system. \n+\n+== Software Components\n+\n+We chose to use Artemis for the message broker, with the expectation it would be scalable in terms of number of streams as well as volume of traffic. In the same vein, we utilized Spark for our microservice requiring scalability, namely the data handler. Since we wished to take advantage of extant Spark libraries, and the CMSketch() object is only (as of this writing) available in Java and Scala, we chose to implement the handler in Scala. In the interest of uniformity the sample data publisher is also written in Scala. Furthermore, the AMQP Spark connector used by the data handler is one developed by Paolo Patierno at Red Hat, with more information https://radanalytics.io/examples/amqpstreaming[this tutorial] and associated https://github.com/redhat-iot/amqp-spark-demo[upstream project].\n+\n+pass:[<img src=\"/assets/equoid/Equoid-Software-Components.png\" alt=\"Alt text\" class=\"img-responsive arch\" width=\"800px\">]\n+ \n+[[installation]]\n+== Installation\n+\n+As mentioned previously, Equoid consists of a number of microservices which require deployment to an OpenShift instance. In order to get you started as swiftly as possible, in this section a walkthrough of installing and configuring the Equoid services is given. These should be followed in the order presented. These steps follow the same flow as the equoid-openshift repository's https://github.com/EldritchJS/equoid-openshift/blob/master/start-full.sh[start-full.sh] script. \n+\n+[[prerequisites]]\n+=== Prerequisites\n+\n+You will need an OpenShift instance in place which you are able to access and create new projects on. This could be local using minishift https://docs.okd.io/latest/minishift/getting-started/quickstart.html[(tutorial here)] or the oc tooling https://github.com/openshift/origin/releases[(download found here)], or on an admistered cluster to which you have access. Be certain to log in to the OpenShift cluster, then you can created your project by running the following command:\n+\n+....\n+oc new-project <YOUR_PROJECT_NAME>\n+....\n+\n+where `<YOUR_PROJECT_NAME>` is whatever you choose to name your project (e.g. equoid).\n+\n+=== Image streams and templates\n+\n+Depending on your OpenShift instance, some of the image streams necessary for Equoid may not be available. To be certain you have what's necessary to build Equoid, run the following sequence of commands:\n+\n+....\n+oc create -f https://raw.githubusercontent.com/radanalyticsio/equoid-openshift/master/fabric8-image-streams.json\n+oc create -f https://radanalytics.io/resources.yaml\n+oc create -f https://raw.githubusercontent.com/infinispan/infinispan-openshift-templates/master/templates/infinispan-ephemeral.json\n+....\n+\n+These provide the Fabric8 fuse-java image stream for the data-publisher service, the radanalytics.io Oshinko resources for facilitating Spark cluster creation and deployment as well as S2I for the data-handler, and the Infinispan template for the caching microservice, respectively. \n+\n+=== Launch Artemis\n+\n+We'll get Artemis up and running, as it is necessary for both the publisher and handler:\n+\n+....\n+oc create -f https://raw.githubusercontent.com/radanalyticsio/equoid-openshift/master/artemis-rc.yaml\n+....\n+\n+\n+=== Launch Infinispan Cache\n+\n+We'll want our caching layer in place before we begin streaming and ingesting. The following will get an Infinispan pod running. `APPLICATION_USER`, `APPLICATION_PASSWORD`, `MANAGEMENT_USER` and `MANAGEMENT_PASSWORD` should be changed to your desired values. \n+\n+....\n+oc new-app --template=infinispan-ephemeral \\\n+    -l app=datagrid \\\n+    -p APPLICATION_NAME=datagrid \\\n+    -p NAMESPACE=`oc project -q` \\\n+    -p APPLICATION_USER=<YOUR_APP_USERNAME> \\\n+    -p APPLICATION_PASSWORD=<YOUR_APP_PASSWORD> \\\n+    -p MANAGEMENT_USER=<YOUR_MGMT_USERNAME> \\\n+    -p MANAGEMENT_PASSWORD=<YOUR_MGMT_PASSWORD>\n+....\n+\n+=== Launch Data Publisher\n+\n+We can next begin publishing our streaming data by starting an instance of the data publisher. `OP_MODE` described later should be set to the mode you wish. Also, `DATA_URL_PRIMARY` should be set to the location of your data set or data potential values file. \n+\n+....\n+oc new-app \\\n+    -l app=publisher \\\n+    -e OP_MODE={single|dual|linear} \\\n+    -e DATA_URL_PRIMARY=<YOUR_DATASET_URL> \\\n+    --image-stream=`oc project -q`/fuse-java \\\n+    https://github.com/radanalyticsio/equoid-data-publisher\n+....\n+\n+\n+=== Launch Data Handler\n+\n+We are now ready to start our data handler. Note that `INFINISPAN_HOST` and `INFINISPAN_PORT` need to be set to appropriate values, in the case of the template provided, these are `datagrid-hotrod` and `11222` respectively. In addition, `WINDOW_SECONDS` is the number of second for which you wish to track the top-k items, `SLIDE_SECONDS` represents the number of seconds to slide your data window each iteration, and `BATCH_SECONDS` is the size of samples you wish to acquire from the message stream at a time. Finally, `OP_MODE` needs to be set to the same value as set for the data publisher.\n+\n+....\n+oc new-app --template=oshinko-scala-spark-build-dc \\\n+    -l app=handler \\\n+    -p SBT_ARGS=assembly \\\n+    -p APPLICATION_NAME=equoid-data-handler \\\n+    -p GIT_URI=https://github.com/radanalyticsio/equoid-data-handler \\\n+    -p APP_MAIN_CLASS=io.radanalytics.equoid.DataHandler \\\n+    -e INFINISPAN_HOST=<YOUR_HOSTNAME> \\\n+    -e INFINISPAN_PORT=<YOUR_PORT> \\\n+    -e WINDOW_SECONDS=<YOUR_WINDOW_SIZE> \\\n+    -e SLIDE_SECONDS=<YOUR_SLIDING_SIZE> \\\n+    -e BATCH_SECONDS=<YOUR_BATCH_SIZE> \\\n+    -e OP_MODE={single|dual|linear} \\\n+    -p SPARK_OPTIONS='--driver-java-options=-Dvertx.cacheDirBase=/tmp'\n+....\n+\n+=== Launch Web UI and Set Up Keycloak\n+\n+Equoid's web UI is launched using a script developed by one of Equoid's contributors, Jiri Kremser. The following calls will utilize that script to set up the UI as well as a Keycloak instance for users and login. Finally, an edit role is given to the project's service account so additional data handler instances can be created/modified. \n+\n+....\n+BASE_URL=\"https://raw.githubusercontent.com/radanalyticsio/equoid-ui/master/ocp/\"\n+curl -sSL $BASE_URL/ocp-apply.sh | \\\n+    BASE_URL=\"$BASE_URL\" \\\n+    KC_REALM_PATH=\"web-ui/keycloak/realm-config\" \\\n+    bash -s stable\n+oc policy add-role-to-user edit system:serviceaccount:`oc project -q`:default\n+....\n+\n+[[usage]]\n+== Usage\n+\n+=== Web Interface\n+With all the microservices running, you can now view a visualization of the data stream's top-ks for the parameters you set. By browsing to the OpenShift webui for your cluster, logging in, and looking at your project's overview, you should see a pod/application named equoid-ui with an associated URI. By clicking on the latter, you will then be at the login screen for your equoid system. Log in using either of the default credential sets listed on the login page, then click on the graph tab. You should see a visualization of your stream's data which updates periodically. ","path":"_applications/equoid.adoc","position":160,"original_position":160,"commit_id":"a5c61e86775765438be8f3f4a32454574d54eca7","original_commit_id":"a5c61e86775765438be8f3f4a32454574d54eca7","user":{"login":"EldritchJS","id":10504328,"node_id":"MDQ6VXNlcjEwNTA0MzI4","avatar_url":"https://avatars2.githubusercontent.com/u/10504328?v=4","gravatar_id":"","url":"https://api.github.com/users/EldritchJS","html_url":"https://github.com/EldritchJS","followers_url":"https://api.github.com/users/EldritchJS/followers","following_url":"https://api.github.com/users/EldritchJS/following{/other_user}","gists_url":"https://api.github.com/users/EldritchJS/gists{/gist_id}","starred_url":"https://api.github.com/users/EldritchJS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EldritchJS/subscriptions","organizations_url":"https://api.github.com/users/EldritchJS/orgs","repos_url":"https://api.github.com/users/EldritchJS/repos","events_url":"https://api.github.com/users/EldritchJS/events{/privacy}","received_events_url":"https://api.github.com/users/EldritchJS/received_events","type":"User","site_admin":false},"body":"Agreed, added screen shots for the initial splash page and the graph page","created_at":"2018-09-27T17:52:21Z","updated_at":"2018-09-27T17:52:21Z","html_url":"https://github.com/radanalyticsio/radanalyticsio.github.io/pull/261#discussion_r221018425","pull_request_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/261","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/comments/221018425"},"html":{"href":"https://github.com/radanalyticsio/radanalyticsio.github.io/pull/261#discussion_r221018425"},"pull_request":{"href":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/261"}},"in_reply_to_id":218570877},"pull_request":{"url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/261","id":216330694,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE2MzMwNjk0","html_url":"https://github.com/radanalyticsio/radanalyticsio.github.io/pull/261","diff_url":"https://github.com/radanalyticsio/radanalyticsio.github.io/pull/261.diff","patch_url":"https://github.com/radanalyticsio/radanalyticsio.github.io/pull/261.patch","issue_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/issues/261","number":261,"state":"open","locked":false,"title":"Added Equoid writeup in applications/tutorials section","user":{"login":"EldritchJS","id":10504328,"node_id":"MDQ6VXNlcjEwNTA0MzI4","avatar_url":"https://avatars2.githubusercontent.com/u/10504328?v=4","gravatar_id":"","url":"https://api.github.com/users/EldritchJS","html_url":"https://github.com/EldritchJS","followers_url":"https://api.github.com/users/EldritchJS/followers","following_url":"https://api.github.com/users/EldritchJS/following{/other_user}","gists_url":"https://api.github.com/users/EldritchJS/gists{/gist_id}","starred_url":"https://api.github.com/users/EldritchJS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EldritchJS/subscriptions","organizations_url":"https://api.github.com/users/EldritchJS/orgs","repos_url":"https://api.github.com/users/EldritchJS/repos","events_url":"https://api.github.com/users/EldritchJS/events{/privacy}","received_events_url":"https://api.github.com/users/EldritchJS/received_events","type":"User","site_admin":false},"body":"Project Equoid has a space on the radanalytics.io site now! ","created_at":"2018-09-18T14:33:23Z","updated_at":"2018-09-27T17:52:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e30a7fc9f69c7f926a0662e54cdbf72015cdab99","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/261/commits","review_comments_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/261/comments","review_comment_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/comments{/number}","comments_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/issues/261/comments","statuses_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/statuses/a5c61e86775765438be8f3f4a32454574d54eca7","head":{"label":"EldritchJS:master","ref":"master","sha":"a5c61e86775765438be8f3f4a32454574d54eca7","user":{"login":"EldritchJS","id":10504328,"node_id":"MDQ6VXNlcjEwNTA0MzI4","avatar_url":"https://avatars2.githubusercontent.com/u/10504328?v=4","gravatar_id":"","url":"https://api.github.com/users/EldritchJS","html_url":"https://github.com/EldritchJS","followers_url":"https://api.github.com/users/EldritchJS/followers","following_url":"https://api.github.com/users/EldritchJS/following{/other_user}","gists_url":"https://api.github.com/users/EldritchJS/gists{/gist_id}","starred_url":"https://api.github.com/users/EldritchJS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EldritchJS/subscriptions","organizations_url":"https://api.github.com/users/EldritchJS/orgs","repos_url":"https://api.github.com/users/EldritchJS/repos","events_url":"https://api.github.com/users/EldritchJS/events{/privacy}","received_events_url":"https://api.github.com/users/EldritchJS/received_events","type":"User","site_admin":false},"repo":{"id":85085003,"node_id":"MDEwOlJlcG9zaXRvcnk4NTA4NTAwMw==","name":"radanalyticsio.github.io","full_name":"EldritchJS/radanalyticsio.github.io","private":false,"owner":{"login":"EldritchJS","id":10504328,"node_id":"MDQ6VXNlcjEwNTA0MzI4","avatar_url":"https://avatars2.githubusercontent.com/u/10504328?v=4","gravatar_id":"","url":"https://api.github.com/users/EldritchJS","html_url":"https://github.com/EldritchJS","followers_url":"https://api.github.com/users/EldritchJS/followers","following_url":"https://api.github.com/users/EldritchJS/following{/other_user}","gists_url":"https://api.github.com/users/EldritchJS/gists{/gist_id}","starred_url":"https://api.github.com/users/EldritchJS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EldritchJS/subscriptions","organizations_url":"https://api.github.com/users/EldritchJS/orgs","repos_url":"https://api.github.com/users/EldritchJS/repos","events_url":"https://api.github.com/users/EldritchJS/events{/privacy}","received_events_url":"https://api.github.com/users/EldritchJS/received_events","type":"User","site_admin":false},"html_url":"https://github.com/EldritchJS/radanalyticsio.github.io","description":"a developer oriented site for the radanalytics organization","fork":true,"url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io","forks_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/forks","keys_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/teams","hooks_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/hooks","issue_events_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/events","assignees_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/tags","blobs_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/languages","stargazers_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/stargazers","contributors_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/contributors","subscribers_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/subscribers","subscription_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/subscription","commits_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/merges","archive_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/downloads","issues_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/labels{/name}","releases_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/EldritchJS/radanalyticsio.github.io/deployments","created_at":"2017-03-15T14:52:07Z","updated_at":"2018-09-18T15:18:15Z","pushed_at":"2018-09-18T15:18:09Z","git_url":"git://github.com/EldritchJS/radanalyticsio.github.io.git","ssh_url":"git@github.com:EldritchJS/radanalyticsio.github.io.git","clone_url":"https://github.com/EldritchJS/radanalyticsio.github.io.git","svn_url":"https://github.com/EldritchJS/radanalyticsio.github.io","homepage":"http://radanalytics.io","size":21642,"stargazers_count":0,"watchers_count":0,"language":"CSS","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"radanalyticsio:master","ref":"master","sha":"48703c19e543c31ce1c5f3eb3e97921f1c5632b3","user":{"login":"radanalyticsio","id":8729017,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg3MjkwMTc=","avatar_url":"https://avatars3.githubusercontent.com/u/8729017?v=4","gravatar_id":"","url":"https://api.github.com/users/radanalyticsio","html_url":"https://github.com/radanalyticsio","followers_url":"https://api.github.com/users/radanalyticsio/followers","following_url":"https://api.github.com/users/radanalyticsio/following{/other_user}","gists_url":"https://api.github.com/users/radanalyticsio/gists{/gist_id}","starred_url":"https://api.github.com/users/radanalyticsio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/radanalyticsio/subscriptions","organizations_url":"https://api.github.com/users/radanalyticsio/orgs","repos_url":"https://api.github.com/users/radanalyticsio/repos","events_url":"https://api.github.com/users/radanalyticsio/events{/privacy}","received_events_url":"https://api.github.com/users/radanalyticsio/received_events","type":"Organization","site_admin":false},"repo":{"id":77063127,"node_id":"MDEwOlJlcG9zaXRvcnk3NzA2MzEyNw==","name":"radanalyticsio.github.io","full_name":"radanalyticsio/radanalyticsio.github.io","private":false,"owner":{"login":"radanalyticsio","id":8729017,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg3MjkwMTc=","avatar_url":"https://avatars3.githubusercontent.com/u/8729017?v=4","gravatar_id":"","url":"https://api.github.com/users/radanalyticsio","html_url":"https://github.com/radanalyticsio","followers_url":"https://api.github.com/users/radanalyticsio/followers","following_url":"https://api.github.com/users/radanalyticsio/following{/other_user}","gists_url":"https://api.github.com/users/radanalyticsio/gists{/gist_id}","starred_url":"https://api.github.com/users/radanalyticsio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/radanalyticsio/subscriptions","organizations_url":"https://api.github.com/users/radanalyticsio/orgs","repos_url":"https://api.github.com/users/radanalyticsio/repos","events_url":"https://api.github.com/users/radanalyticsio/events{/privacy}","received_events_url":"https://api.github.com/users/radanalyticsio/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/radanalyticsio/radanalyticsio.github.io","description":"a developer oriented site for the radanalytics organization","fork":false,"url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io","forks_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/forks","keys_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/teams","hooks_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/hooks","issue_events_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/events","assignees_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/tags","blobs_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/languages","stargazers_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/stargazers","contributors_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/contributors","subscribers_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/subscribers","subscription_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/subscription","commits_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/merges","archive_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/downloads","issues_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/labels{/name}","releases_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/deployments","created_at":"2016-12-21T15:25:31Z","updated_at":"2018-09-26T18:33:06Z","pushed_at":"2018-09-26T18:33:04Z","git_url":"git://github.com/radanalyticsio/radanalyticsio.github.io.git","ssh_url":"git@github.com:radanalyticsio/radanalyticsio.github.io.git","clone_url":"https://github.com/radanalyticsio/radanalyticsio.github.io.git","svn_url":"https://github.com/radanalyticsio/radanalyticsio.github.io","homepage":"https://radanalytics.io","size":21465,"stargazers_count":7,"watchers_count":7,"language":"CSS","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":21,"mirror_url":null,"archived":false,"open_issues_count":15,"license":null,"forks":21,"open_issues":15,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/261"},"html":{"href":"https://github.com/radanalyticsio/radanalyticsio.github.io/pull/261"},"issue":{"href":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/issues/261"},"comments":{"href":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/issues/261/comments"},"review_comments":{"href":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/261/comments"},"review_comment":{"href":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/pulls/261/commits"},"statuses":{"href":"https://api.github.com/repos/radanalyticsio/radanalyticsio.github.io/statuses/a5c61e86775765438be8f3f4a32454574d54eca7"}},"author_association":"NONE"}}
{"actor":{"display_login":"EldritchJS"}}