{"action":"created","comment":{"url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/comments/138880321","pull_request_review_id":62724178,"id":138880321,"diff_hunk":"@@ -0,0 +1,254 @@\n+---\n+layout: post\n+title: Présentation de Protocol Buffer\n+authors: \n+    - qneyrat\n+permalink: /fr/presentation-protocol-buffer/\n+categories:\n+    - Api\n+    - Go\n+tags:\n+    - api\n+    - go\n+---\n+\n+Une problématique assez récurrente dans nos applications est la manière de rendre notre donnée, qu'elle soit transmise ou stockée. Le format qu'on utilise souvent aujourd'hui est le `JSON`. Cependant certain language le gère très mal tel que Java et Go. Google a donc développé un système pour palier à ce problème : `Protocol Buffer`.\n+\n+## Présentation\n+---\n+\n+Protocol Buffer est un système de sérialisation de données tout comme `JSON` et `XML`. Il est disponible pour la plupart des languages. Une application en Java peut envoyer des objets à une application en Go. Le système repose sur un fichier qui va permettre de structurer notre objet, les fichiers `.proto`. Ce fichier va un peu comme une interface décrire notre objet. Protobuf permet ensuite de générer le code source de l'objet dans plusieurs langage différent.\n+\n+Pour récapituler, on déclare un fichier proto, on génère notre objet dans notre application serveur et dans notre application client. Nos objets auront dans leurs déclaration des méthodes de sérialisation et de de-sérialisation et ce quelque soit le langage.\n+\n+Notre exemple va être le suivant :\n+\n+Notre api va retourné un objet `Post`. Un client va appeler cette api. Nous allons avoir besoin d'un fichier `proto` qui va générer le code source en Go. Le serveur va sérialisé un objet et le rendre au client. Ce qui nous donne :\n+\n+```\n+Go Struct  ↘                                              ↗ Go Struct\n+             Serialization -> bytes -> Deserialization \n+Proto file ↗                                              ↖ Proto file     \n+```\n+\n+Nous allons maintenant voir étape par étape comment ça fonctionne.\n+\n+## Fonctionnement\n+---\n+\n+Protobuf est un language qui va permettre de définir comment l'objet va être sérialisé et comment il va générer le code source.\n+Voici un example de fichier protobuf :\n+\n+```proto\n+message Person {\n+  string name = 1;\n+  int32 id = 2;\n+  string email = 3;\n+\n+  enum PhoneType {\n+    MOBILE = 0;\n+    HOME = 1;\n+    WORK = 2;\n+  }\n+\n+  message PhoneNumber {\n+    string number = 1;\n+    PhoneType type = 2;\n+  }\n+\n+  repeated PhoneNumber phones = 4;\n+}\n+```\n+\n+Dans cette example notre objet `Person` est constitué d'un `name`, d'un `id`, d'un `email` et de `phones`.\n+La déclaration d'une propriété est définie par un type `int32` ou `string` (et bien d'autres), du nom de la propriété puis d'un identifiant unique (la position) de cette propriété.\n+\n+On peut aussi faire de la composition est créant de nouveaux types comme ici `PhoneNumber` ou bien des énumérations.\n+Des modèles de données sont aussi disponible comme les `array` avec le mot clé `repeated` ou bien encore des maps avec `map<Key, Value>`.\n+\n+Vous pouvez retrouver tout les types et déclaration sur [la documentation de Protobuf](https://developers.google.com/protocol-buffers/docs/proto3).\n+\n+Une fois notre fichier proto prêt nous pouvons générer notre fichier Go ou autres avec la commande `protoc`.\n+par example `protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/person.proto` en lui donnant le fichier proto en entré et le dossier de destination en précisant le langage Go `--go_out` ou Java `--java_out`.\n+\n+Maintenant que notre fichier Go ou Java est généré, nous avons accès à la méthode de sérialisation.\n+\n+```Go\n+book := &pb.AddressBook{}\n+out, err := proto.Marshal(book)\n+```\n+\n+Pour comprendre comment Protocol Buffer sérialise un objet en binaire nous allons prendre la définition suivante :\n+\n+```Proto\n+message Test1 {\n+  int32 a = 1;\n+}\n+```\n+\n+Nous allons assigné à `a` la valeur 150. Une sérialisation en `json` donnerait :\n+\n+```JSON\n+{\"a\": 150}\n+``` \n+\n+Donne `7b 22 61 22 3a 31 35 30 7d` sur 9 octets.\n+\n+En sérialisant avec Protobuf on obtient `08 96 01` sur 3 octets. Ce binaire est composé pour chacune des propriétés de notre objet d'un couple clé/valeur.\n+\n+### Clé :\n+\n+Codage de la clé : `(POSITION << 3) | TYPE`\n+\n+La position ici est 1 et le type 0, soit :  \n+\n+```\n+(1 << 3) | 0 = 0000 1000\n+             = 08\n+\n+```\n+\n+### Valeur :\n+\n+Codage de la valeur : groupage en 7 bits avec l'ajout d'un msb (most significant bit), soit :\n+\n+```\n+96 01 = 1001 0110  0000 0001\n+       → 000 0001  ++  001 0110 (drop the msb and reverse the groups of 7 bits)\n+       → 10010110\n+       → 2 + 4 + 16 + 128 = 150\n+```\n+\n+Un binaire protobuf sera plus léger qu'un json et donc plus rapidement transmis dans une requête. De plus le parsing est très performant, retrouvez un article sur [les performances de Protobuf](https://medium.com/@fzambia/centrifugo-protobuf-inside-json-outside-21d39bdabd68).\n+\n+Nous allons maintenant voir tout ça en pratique.\n+\n+## Example d'application\n+---\n+\n+Nous allons tout d'abord installer `protoc` qui permet de générer notre code depuis les fichiers protobuf. [Installer la version pour votre système d'exploitation](https://github.com/google/protobuf/releases/latest). Une fois ceci fait on va déclarer notre fichier protobuf. Nous allons ensuite installer la librairie qui va permettre de gérer la génération des fichiers Go.\n+\n+```Bash\n+go get -u github.com/golang/protobuf/protoc-gen-go \n+```\n+\n+### Le fichier Proto :\n+\n+```proto\n+syntax = \"proto3\";\n+\n+package main;\n+\n+message Post {\n+    int32 id = 1;\n+    string title = 2;\n+    string author = 3;\n+}\n+\n+```\n+\n+Un `Post` est donc composé d'un `id`, d'un `title` et d'un `author`.\n+Nous allons donc générer le fichier `Post` grâce à `protoc`:\n+\n+```bash\n+protoc --proto_path=. --go_out=. post.proto \n+```\n+\n+Nous devons récupérer la librairie `proto` qui sera utilisé dans le client et dans le serveur.\n+\n+```Bash\n+go get github.com/golang/protobuf/proto\n+```\n+### Le serveur\n+Nous allons maintenant passer au code du serveur.\n+\n+```Go\n+package main\n+\n+import (\n+\t\"encoding/json\"\n+\t\"log\"\n+\t\"net/http\"\n+\n+\tproto \"github.com/golang/protobuf/proto\"\n+)\n+\n+var post = &Post{\n+\tId:     1,\n+\tTitle:  \"My awesome article\",\n+\tAuthor: \"Quentin Neyrat\",\n+}\n+\n+func protoHandler(w http.ResponseWriter, r *http.Request) {\n+\tout, err := proto.Marshal(post)\n+\tif err != nil {\n+\t\tlog.Fatalln(\"Failed to serialize post in protobuf:\", err)\n+\t}\n+\n+\tw.Write(out)\n+}\n+\n+func main() {\n+\thttp.HandleFunc(\"/posts/1\", protoHandler)\n+\thttp.ListenAndServe(\":8080\", nil)\n+}\n+```\n+\n+### Le client\n+Nous allons maintenant passer au code du client.\n+\n+```Go\n+package main\n+\n+import (\n+\t\"bufio\"\n+\t\"bytes\"\n+\tfmt \"fmt\"\n+\t\"log\"\n+\t\"net/http\"\n+\n+\tproto \"github.com/golang/protobuf/proto\"\n+)\n+\n+func main() {\n+\tpost := &Post{}\n+\tresp, err := http.Get(\"http://127.0.0.1:8080/posts/1\")\n+\tif err != nil {\n+\t\tlog.Fatal(err)\n+\t}\n+\tdefer resp.Body.Close()\n+\n+\tsca := bufio.NewScanner(resp.Body)\n+\tsca.Split(bufio.ScanRunes)\n+\n+\tvar buf bytes.Buffer\n+\tfor sca.Scan() {\n+\t\tbuf.WriteString(sca.Text())\n+\t}\n+\n+\terr = proto.Unmarshal(buf.Bytes(), post)\n+\tif err != nil {\n+\t\tlog.Fatal(\"unmarshaling error: \", err)\n+\t}\n+\n+\tfmt.Printf(\"Id: %d \\n\", post.GetId())\n+\tfmt.Printf(\"Title: %s \\n\", post.GetTitle())\n+\tfmt.Printf(\"Author: %s \\n\", post.GetAuthor())\n+}\n+```\n+\n+## Conclusion\n+---\n+\n+Protocol Buffer est un système maintenu par Google qui va permettre de jouer plus facilement avec nos données et de pouvoir travailler avec différents langages. Ceci est relativement important dans une architecture micro-services où chaque service doit communiquer avec d'autres quelque soit le langage.","path":"_posts/2017-09-20-presentation-protocol-buffer.md","position":243,"original_position":243,"commit_id":"343df4bb700baaefc0c5ad427b57ddec6eaf6eae","original_commit_id":"343df4bb700baaefc0c5ad427b57ddec6eaf6eae","user":{"login":"eko","id":103900,"avatar_url":"https://avatars1.githubusercontent.com/u/103900?v=4","gravatar_id":"","url":"https://api.github.com/users/eko","html_url":"https://github.com/eko","followers_url":"https://api.github.com/users/eko/followers","following_url":"https://api.github.com/users/eko/following{/other_user}","gists_url":"https://api.github.com/users/eko/gists{/gist_id}","starred_url":"https://api.github.com/users/eko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eko/subscriptions","organizations_url":"https://api.github.com/users/eko/orgs","repos_url":"https://api.github.com/users/eko/repos","events_url":"https://api.github.com/users/eko/events{/privacy}","received_events_url":"https://api.github.com/users/eko/received_events","type":"User","site_admin":false},"body":"`Protocol Buffer` -> `Protocol Buffers`","created_at":"2017-09-14T12:38:30Z","updated_at":"2017-09-14T12:38:47Z","html_url":"https://github.com/eleven-labs/eleven-labs.github.io/pull/224#discussion_r138880321","pull_request_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/224","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/comments/138880321"},"html":{"href":"https://github.com/eleven-labs/eleven-labs.github.io/pull/224#discussion_r138880321"},"pull_request":{"href":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/224"}}},"pull_request":{"url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/224","id":140819909,"html_url":"https://github.com/eleven-labs/eleven-labs.github.io/pull/224","diff_url":"https://github.com/eleven-labs/eleven-labs.github.io/pull/224.diff","patch_url":"https://github.com/eleven-labs/eleven-labs.github.io/pull/224.patch","issue_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/issues/224","number":224,"state":"open","locked":false,"title":"présentation de protobuf","user":{"login":"qneyrat","id":12870790,"avatar_url":"https://avatars1.githubusercontent.com/u/12870790?v=4","gravatar_id":"","url":"https://api.github.com/users/qneyrat","html_url":"https://github.com/qneyrat","followers_url":"https://api.github.com/users/qneyrat/followers","following_url":"https://api.github.com/users/qneyrat/following{/other_user}","gists_url":"https://api.github.com/users/qneyrat/gists{/gist_id}","starred_url":"https://api.github.com/users/qneyrat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qneyrat/subscriptions","organizations_url":"https://api.github.com/users/qneyrat/orgs","repos_url":"https://api.github.com/users/qneyrat/repos","events_url":"https://api.github.com/users/qneyrat/events{/privacy}","received_events_url":"https://api.github.com/users/qneyrat/received_events","type":"User","site_admin":false},"body":"\r\n\r\n","created_at":"2017-09-13T13:06:52Z","updated_at":"2017-09-14T12:38:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"29bccc450790d7a1583bdabd89d84d3a16ec0979","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/224/commits","review_comments_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/224/comments","review_comment_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/comments{/number}","comments_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/issues/224/comments","statuses_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/statuses/343df4bb700baaefc0c5ad427b57ddec6eaf6eae","head":{"label":"qneyrat:feat/post/protobuf","ref":"feat/post/protobuf","sha":"343df4bb700baaefc0c5ad427b57ddec6eaf6eae","user":{"login":"qneyrat","id":12870790,"avatar_url":"https://avatars1.githubusercontent.com/u/12870790?v=4","gravatar_id":"","url":"https://api.github.com/users/qneyrat","html_url":"https://github.com/qneyrat","followers_url":"https://api.github.com/users/qneyrat/followers","following_url":"https://api.github.com/users/qneyrat/following{/other_user}","gists_url":"https://api.github.com/users/qneyrat/gists{/gist_id}","starred_url":"https://api.github.com/users/qneyrat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qneyrat/subscriptions","organizations_url":"https://api.github.com/users/qneyrat/orgs","repos_url":"https://api.github.com/users/qneyrat/repos","events_url":"https://api.github.com/users/qneyrat/events{/privacy}","received_events_url":"https://api.github.com/users/qneyrat/received_events","type":"User","site_admin":false},"repo":{"id":103156795,"name":"eleven-labs.github.io","full_name":"qneyrat/eleven-labs.github.io","owner":{"login":"qneyrat","id":12870790,"avatar_url":"https://avatars1.githubusercontent.com/u/12870790?v=4","gravatar_id":"","url":"https://api.github.com/users/qneyrat","html_url":"https://github.com/qneyrat","followers_url":"https://api.github.com/users/qneyrat/followers","following_url":"https://api.github.com/users/qneyrat/following{/other_user}","gists_url":"https://api.github.com/users/qneyrat/gists{/gist_id}","starred_url":"https://api.github.com/users/qneyrat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qneyrat/subscriptions","organizations_url":"https://api.github.com/users/qneyrat/orgs","repos_url":"https://api.github.com/users/qneyrat/repos","events_url":"https://api.github.com/users/qneyrat/events{/privacy}","received_events_url":"https://api.github.com/users/qneyrat/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/qneyrat/eleven-labs.github.io","description":"Blog Jekyll Eleven-labs","fork":true,"url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io","forks_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/forks","keys_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/teams","hooks_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/hooks","issue_events_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/events","assignees_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/tags","blobs_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/languages","stargazers_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/stargazers","contributors_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/contributors","subscribers_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/subscribers","subscription_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/subscription","commits_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/merges","archive_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/downloads","issues_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/labels{/name}","releases_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/qneyrat/eleven-labs.github.io/deployments","created_at":"2017-09-11T15:56:50Z","updated_at":"2017-09-11T15:56:52Z","pushed_at":"2017-09-13T21:03:09Z","git_url":"git://github.com/qneyrat/eleven-labs.github.io.git","ssh_url":"git@github.com:qneyrat/eleven-labs.github.io.git","clone_url":"https://github.com/qneyrat/eleven-labs.github.io.git","svn_url":"https://github.com/qneyrat/eleven-labs.github.io","homepage":"http://blog.eleven-labs.com","size":152357,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"eleven-labs:master","ref":"master","sha":"78a09b43d4827000b10ed4e54721779369cc9e09","user":{"login":"eleven-labs","id":5772631,"avatar_url":"https://avatars0.githubusercontent.com/u/5772631?v=4","gravatar_id":"","url":"https://api.github.com/users/eleven-labs","html_url":"https://github.com/eleven-labs","followers_url":"https://api.github.com/users/eleven-labs/followers","following_url":"https://api.github.com/users/eleven-labs/following{/other_user}","gists_url":"https://api.github.com/users/eleven-labs/gists{/gist_id}","starred_url":"https://api.github.com/users/eleven-labs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eleven-labs/subscriptions","organizations_url":"https://api.github.com/users/eleven-labs/orgs","repos_url":"https://api.github.com/users/eleven-labs/repos","events_url":"https://api.github.com/users/eleven-labs/events{/privacy}","received_events_url":"https://api.github.com/users/eleven-labs/received_events","type":"Organization","site_admin":false},"repo":{"id":86694854,"name":"eleven-labs.github.io","full_name":"eleven-labs/eleven-labs.github.io","owner":{"login":"eleven-labs","id":5772631,"avatar_url":"https://avatars0.githubusercontent.com/u/5772631?v=4","gravatar_id":"","url":"https://api.github.com/users/eleven-labs","html_url":"https://github.com/eleven-labs","followers_url":"https://api.github.com/users/eleven-labs/followers","following_url":"https://api.github.com/users/eleven-labs/following{/other_user}","gists_url":"https://api.github.com/users/eleven-labs/gists{/gist_id}","starred_url":"https://api.github.com/users/eleven-labs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eleven-labs/subscriptions","organizations_url":"https://api.github.com/users/eleven-labs/orgs","repos_url":"https://api.github.com/users/eleven-labs/repos","events_url":"https://api.github.com/users/eleven-labs/events{/privacy}","received_events_url":"https://api.github.com/users/eleven-labs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/eleven-labs/eleven-labs.github.io","description":"Blog Jekyll Eleven-labs","fork":false,"url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io","forks_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/forks","keys_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/teams","hooks_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/hooks","issue_events_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/events","assignees_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/tags","blobs_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/languages","stargazers_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/stargazers","contributors_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/contributors","subscribers_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/subscribers","subscription_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/subscription","commits_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/merges","archive_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/downloads","issues_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/labels{/name}","releases_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/deployments","created_at":"2017-03-30T11:27:14Z","updated_at":"2017-09-01T19:03:42Z","pushed_at":"2017-09-13T21:03:11Z","git_url":"git://github.com/eleven-labs/eleven-labs.github.io.git","ssh_url":"git@github.com:eleven-labs/eleven-labs.github.io.git","clone_url":"https://github.com/eleven-labs/eleven-labs.github.io.git","svn_url":"https://github.com/eleven-labs/eleven-labs.github.io","homepage":"http://blog.eleven-labs.com","size":147589,"stargazers_count":14,"watchers_count":14,"language":"HTML","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":6,"mirror_url":null,"open_issues_count":30,"forks":6,"open_issues":30,"watchers":14,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/224"},"html":{"href":"https://github.com/eleven-labs/eleven-labs.github.io/pull/224"},"issue":{"href":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/issues/224"},"comments":{"href":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/issues/224/comments"},"review_comments":{"href":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/224/comments"},"review_comment":{"href":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/pulls/224/commits"},"statuses":{"href":"https://api.github.com/repos/eleven-labs/eleven-labs.github.io/statuses/343df4bb700baaefc0c5ad427b57ddec6eaf6eae"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"eko"}}