{"id":2821,"date":"2019-11-12T18:22:13","date_gmt":"2019-11-13T00:22:13","guid":{"rendered":"https:\/\/ugit.siua.ac.cr\/?p=2821"},"modified":"2019-11-12T19:59:43","modified_gmt":"2019-11-13T01:59:43","slug":"curso-angular-2019-sobre-ubuntu-19","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=2821","title":{"rendered":"Curso: Angular 2019 sobre ubuntu 19"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Requisitos:<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Firefox developer<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Descargar: <a rel=\"noreferrer noopener\" aria-label=\"aqu\u00ed (abre en una nueva pesta\u00f1a)\" href=\"https:\/\/www.mozilla.org\/en-US\/firefox\/developer\/\" target=\"_blank\">aqu\u00ed<\/a><\/li><li>Ingresamos a descargas:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/Descargas\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Descomprimimos<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>tar -xvf firefox-*.tar.bz2 <\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Movemos a opt<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo -s mv firefox \/opt<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Hacemos un enlace<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ln -s \/opt\/firefox\/firefox \/usr\/local\/bin\/firefox<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Creamos una acceso directo<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo touch \/usr\/share\/applications\/firefox-developer.desktop<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Abrimos el archivo<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/usr\/share\/applications\/firefox-developer.desktop<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Agregamos<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>[Desktop Entry]\nName=Firefox Developer\nGenericName=Firefox Developer Edition\nExec=\/usr\/local\/bin\/firefox\nTerminal=false\nIcon=\/opt\/firefox\/browser\/chrome\/icons\/default\/default48.png\nType=Application\nCategories=Application;Network;X-Developer;\nComment=Firefox Developer Edition Web Browser<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Damos permisos<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chmod +x \/usr\/share\/applications\/firefox-developer.desktop<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Instalaci\u00f3n de Visual Studio Code<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Descargar e instalar: <a href=\"https:\/\/code.visualstudio.com\/?wt.mc_id=vscom_downloads\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Aqu\u00ed (abre en una nueva pesta\u00f1a)\">Aqu\u00ed<\/a><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Instalaci\u00f3n de Node JS<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Instalamos<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install curl<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Instalamos la ultima versi\u00f3n estable<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -sL https:\/\/deb.nodesource.com\/setup_12.x | sudo -E bash -\nsudo apt-get install -y nodejs<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Compobamos la versi\u00f3n<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>node -v\nv12.13.0<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Tambien podemos comprobar la versi\u00f3n de npm<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>npm -v \n6.12.0<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Instalaci\u00f3n de Typescript<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Vamos a la p\u00e1gina: <a rel=\"noreferrer noopener\" aria-label=\"aqu\u00ed (abre en una nueva pesta\u00f1a)\" href=\"https:\/\/www.typescriptlang.org\/#download-links\" target=\"_blank\">aqu\u00ed<\/a><\/li><li>Vemos que lo que hay que hacer es ejecutar el comando (-g: instalar de forma global)<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo npm install -g typescript<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Podemos verificar la versi\u00f3n<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>tsc -v\nVersion 3.7.2<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Instalaci\u00f3n de Angular-Cli<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>P\u00e1gina oficial: <a rel=\"noreferrer noopener\" aria-label=\"https:\/\/cli.angular.io\/ (abre en una nueva pesta\u00f1a)\" href=\"https:\/\/cli.angular.io\/\" target=\"_blank\">https:\/\/cli.angular.io\/<\/a><\/li><li>P\u00e1gina de documentaci\u00f3n: <a rel=\"noreferrer noopener\" aria-label=\"https:\/\/angular.io\/cli (abre en una nueva pesta\u00f1a)\" href=\"https:\/\/angular.io\/cli\" target=\"_blank\">https:\/\/angular.io\/cli<\/a><\/li><li>Para instalarlo ejecutamos:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo npm install -g @angular\/cli<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Podemos ver la versi\u00f3n<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ng version<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>RESULTADO:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>     _                      _                 ____ _     ___\n    \/ \\   _ __   __ _ _   _| | __ _ _ __     \/ ___| |   |_ _|\n   \/ \u25b3 \\ | '_ \\ \/ _` | | | | |\/ _` | '__|   | |   | |    | |\n  \/ ___ \\| | | | (_| | |_| | | (_| | |      | |___| |___ | |\n \/_\/   \\_\\_| |_|\\__, |\\__,_|_|\\__,_|_|       \\____|_____|___|\n                |___\/\n    \n\nAngular CLI: 8.3.18\nNode: 12.13.0\nOS: linux x64\nAngular: \n... \n\nPackage                      Version\n------------------------------------------------------\n@angular-devkit\/architect    0.803.18\n@angular-devkit\/core         8.3.18\n@angular-devkit\/schematics   8.3.18\n@schematics\/angular          8.3.18\n@schematics\/update           0.803.18\nrxjs                         6.4.0\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Podemos consultar la ayuda<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ng help<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>RESULTADO:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Available Commands:\n  add Adds support for an external library to your project.\n  analytics Configures the gathering of Angular CLI usage metrics. See https:\/\/v8.angular.io\/cli\/usage-analytics-gathering.\n  build (b) Compiles an Angular app into an output directory named dist\/ at the given output path. Must be executed from within a workspace directory.\n  deploy (d) Invokes the deploy builder for a specified project or for the default project in the workspace.\n  config Retrieves or sets Angular configuration values in the angular.json file for the workspace.\n  doc (d) Opens the official Angular documentation (angular.io) in a browser, and searches for a given keyword.\n  e2e (e) Builds and serves an Angular app, then runs end-to-end tests using Protractor.\n  generate (g) Generates and\/or modifies files based on a schematic.\n  help Lists available commands and their short descriptions.\n  lint (l) Runs linting tools on Angular app code in a given project folder.\n  new (n) Creates a new workspace and an initial Angular app.\n  run Runs an Architect target with an optional custom builder configuration defined in your project.\n  serve (s) Builds and serves your app, rebuilding on file changes.\n  test (t) Runs unit tests in a project.\n  update Updates your application and its dependencies. See https:\/\/update.angular.io\/\n  version (v) Outputs Angular CLI version.\n  xi18n Extracts i18n messages from source code.\n\nFor more detailed help run \"ng [command name] --help\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplo1: Typescript<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Creamos un directorio en el escritorio<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir ~\/Escritorio\/ejemplo1_typescript<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>He ingresamos al directorio<\/li><\/ul>\n\n\n\n<p>cd ~\/Escritorio\/ejemplo1_typescript\/<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Abrimos visual studio code <\/li><li>Arrastramos la carpeta recien creada<\/li><li>Creamos un archivo nuevo \u00abindex.html\u00bb con el siguiente c\u00f3digo:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html>\n&lt;html lang=\"en\">\n&lt;head>\n    &lt;meta charset=\"UTF-8\">\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    &lt;meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    &lt;title>Document&lt;\/title>\n&lt;\/head>\n&lt;body>\n    \n&lt;\/body>\n&lt;\/html><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Dentro de la etiqueta \u00ab&lt;body&gt;\u00bb, agregamos el c\u00f3digo que va incluir un archivo javascript de nombre \u00abapp.js\u00bb el cual va ser generador por typescript<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script src=\"app.js\">&lt;\/script><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Quedando as\u00ed:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html>\n&lt;html lang=\"en\">\n&lt;head>\n    &lt;meta charset=\"UTF-8\">\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    &lt;meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    &lt;title>Document&lt;\/title>\n&lt;\/head>\n&lt;body>\n    &lt;script src=\"app.js\">&lt;\/script>\n&lt;\/body>\n&lt;\/html><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora creamos un nuevo archivo de extensi\u00f3n \u00abts\u00bb (Typescript) y de nombre app.ts<\/li><li>Y le agregamos el siguiente c\u00f3digo:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>console.log(\"Hola mundo\");<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora para poder convertir el archivo .ts en un archivo .js para que lo entienda el navegador, necesitamos una terminal<\/li><li>Para esto dentro de VSC vamos al men\u00fa principal \u00abView-&gt;Terminal\u00bb, esto nos abre una terminal dentro del VSC<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"820\" src=\"\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_001-1024x820.png\" alt=\"\" class=\"wp-image-2827\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_001-1024x820.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_001-300x240.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_001-768x615.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_001.png 1204w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora debemos asegurarnos que estemos dentro de la carpeta del proyecto<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/Escritorio\/ejemplo1_typescript\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora para generar el archivo ejecutamos el comando \u00abtsc nombre_archivo_que_deseamos_compilar\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>tsc app.ts<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Con esto no crea un archivo \u00abapp.js\u00bb con el c\u00f3digo typescript compilado a javascript<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"998\" height=\"636\" src=\"\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_002.png\" alt=\"\" class=\"wp-image-2828\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_002.png 998w, https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_002-300x191.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_002-768x489.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_002-360x230.png 360w\" sizes=\"(max-width: 998px) 100vw, 998px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora si por ejemplo agregamos al archivo \u00abts\u00bb mas c\u00f3digo, por ejemplo:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>let nombre:string = \"gustavo\";<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Vemos que el archivo \u00abapp.js\u00bb no ha cambiado por lo que debemos ejecutar el comando \u00abtsc app.ts\u00bb, para que vuelva a compilar, pero esto puede ser muy tedioso<\/li><li>Para esto podemo crear un observador, para que cada vez que se detecte un cambio en el archivo \u00abapp.ts\u00bb compile y actualice el archivo \u00abapp.js\u00bb<\/li><li>Para esto ejecutamos: tsc \u00abnombre_archivo.ts -w\u00bb (-w = watch)<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>tsc app.ts -w<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora cuando guardemos el archivo ts podemos ver que se compila de forma autom\u00e1tica, comviertiendo el c\u00f3digo typescript:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>console.log(\"Hola mundo\");\nlet nombre:string = \"gustavo\";<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>En c\u00f3digo javascript:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>console.log(\"Hola mundo\");\nvar nombre = \"gustavo\";<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora una de las ventajas de utilizar typescript es que es un lenguaje \u00abtipado\u00bb, es decir en la declaraci\u00f3n de las variable se debe indicar el tipo de dato que va a almacenar, por ejemplo en el c\u00f3digo anterior la variable nombre es de tipo \u00abstring\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>let nombre:string = \"gustavo\";<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Y entonces que pasa si le asignamos un valor entero, pues nos muestra error en tiempo real<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"396\" height=\"171\" src=\"\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_003.png\" alt=\"\" class=\"wp-image-2831\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_003.png 396w, https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_003-300x130.png 300w\" sizes=\"(max-width: 396px) 100vw, 396px\" \/><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora viene otro problema o situaci\u00f3n:<\/li><li>\u00bfQue pasa si necesitamos trabajar con varios archivos ts a la vez?<\/li><li>No podemos tener muchas terminales abiertas con un \u00abobservador\u00bb para cada archivo<\/li><li>Para esto sobre la terminal que tiene el \u00abobservador\u00bb presionamaos \u00abCTRL-C\u00bb par aque detenga el proceso. <\/li><li>Creamos un nuevo archivo de nombre \u00abapp2.ts\u00bb<\/li><li>Y ahora le podemos indicar a typescript que la carpeta \u00abejemplo1_typescript\u00bb va ser toda un proyecto typescript, para esto ejecutamos el comando:<\/li><\/ul>\n\n\n\n<p>tsc -init<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>RESULTADO:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>message TS6071: Successfully created a tsconfig.json file<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Los que nos indica que se creo un proyecto typescript y principalmente que se cre\u00f3 un archivo de nombre \u00abtsconfig.json\u00bb<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"624\" src=\"\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_004-1024x624.png\" alt=\"\" class=\"wp-image-2833\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_004-1024x624.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_004-300x183.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_004-768x468.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2019\/11\/Selecci\u00f3n_004.png 1279w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>No se asuste de momento , tal vez lo importante es que observe que el archivo js, se esta compilando a la versi\u00f3n<strong> \u00abtarget\u00bb:&nbsp;\u00abes5\u00bb<\/strong><\/li><li>Ahora para que Typescript observe todos los cambios a los archivos \u00ab.ts\u00bb, ejecutamos<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>tsc -w<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Con esto ya puede observar que se cre\u00f3 el archivo \u00abapp2.js\u00bb.<\/li><li>Y si continua creando nuevos archivos \u00abts\u00bb todos se ir\u00e1n compilando.<\/li><li>Te recomiendo visitar la p\u00e1gina: <a rel=\"noreferrer noopener\" aria-label=\"documentaci\u00f3n typescript (abre en una nueva pesta\u00f1a)\" href=\"https:\/\/www.typescriptlang.org\/docs\/home.html\" target=\"_blank\">documentaci\u00f3n typescript<\/a>, para conocer un poco m\u00e1s<\/li><li>Descarga del <a href=\"\/wp-content\/uploads\/2019\/11\/ejemplo1_typescript.zip\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"c\u00f3digo_ejemplo1 (abre en una nueva pesta\u00f1a)\">c\u00f3digo_ejemplo1<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Requisitos: Firefox developer Descargar: aqu\u00ed Ingresamos a descargas: Descomprimimos Movemos a opt Hacemos un enlace Creamos una acceso directo Abrimos el archivo Agregamos Damos permisos Instalaci\u00f3n de Visual Studio Code Descargar e instalar: Aqu\u00ed Instalaci\u00f3n de Node JS Instalamos Instalamos la ultima versi\u00f3n estable Compobamos la versi\u00f3n Tambien podemos comprobar la versi\u00f3n de npm Instalaci\u00f3n [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2821","post","type-post","status-publish","format-standard","hentry","category-sin-categoria"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"_links":{"self":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/2821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2821"}],"version-history":[{"count":10,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/2821\/revisions"}],"predecessor-version":[{"id":2839,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/2821\/revisions\/2839"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}