{"id":1884,"date":"2015-02-13T17:24:22","date_gmt":"2015-02-13T17:24:21","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1884"},"modified":"2022-12-15T19:19:24","modified_gmt":"2022-12-16T03:19:24","slug":"photodrop","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/photodrop\/","title":{"rendered":"Crear una aplicaci\u00f3n para compartir fotos entre iguales con Couchbase Mobile"},"content":{"rendered":"<p>Una de las caracter\u00edsticas interesantes de Couchbase Lite que no se ha presentado mucho es la capacidad de hacer la replicaci\u00f3n P2P entre dos dispositivos. Couchbase Lite viene empaquetado con un componente extra llamado Couchbase Lite Listener que permite a tu aplicaci\u00f3n aceptar conexiones HTTP desde otros dispositivos que ejecuten Couchbase Lite y sincronizar datos con ellos.<\/p>\n<p>Hace un par de meses, Wayne Carter (Arquitecto Jefe de M\u00f3viles) y Traun Leyden (ingeniero de Android) me llamaron por Skype y me vendieron la idea de crear una sencilla aplicaci\u00f3n P2P para compartir fotos que pudiera demostrar lo f\u00e1cil que es desarrollar una aplicaci\u00f3n P2P usando Couchbase Lite. Me compromet\u00ed desde entonces y pas\u00e9 un par de d\u00edas trabajando en esta peque\u00f1a aplicaci\u00f3n P2P iOS para compartir fotos llamada PhotoDrop. En esta entrada del blog, te mostrar\u00e9 c\u00f3mo utilic\u00e9 Couchbase Lite para desarrollar la aplicaci\u00f3n. Esto es lo que obtendr\u00e1s al final:<\/p>\n<h2 class=\"p1\"><span class=\"s1\"><strong><span class=\"s1\">Visi\u00f3n general<\/span><\/strong><\/span><\/h2>\n<p>PhotoDrop es una aplicaci\u00f3n P2P para compartir fotos similar a la funci\u00f3n AirDrop de iOS que puedes utilizar para enviar fotos entre dispositivos. Antes de entrar en el c\u00f3digo, me gustar\u00eda discutir brevemente las preocupaciones P2P y las opciones de dise\u00f1o que hice al desarrollar la aplicaci\u00f3n.<\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"s2\"><b>Descubrimiento entre iguales<\/b> se puede hacer de varias maneras. En iOS, puedes usar el Servicio Bonjour para descubrir pares pero esto podr\u00eda ser un problema si m\u00e1s tarde quieres desarrollar la aplicaci\u00f3n en otras plataformas. En PhotoDrop, estoy usando una forma m\u00e1s simple y directa usando un QRCode. Utilizo el QRCode para anunciar una URL de punto final adhoc que un remitente puede escanear y enviar fotos.<\/span><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"s2\"><b>Identidad entre iguales<\/b> es un tema relacionado con el Peer Discovery. La identificaci\u00f3n de pares suele ser dif\u00edcil de resolver sin introducir algunos pasos no deseados en la aplicaci\u00f3n, como el registro de usuarios, el inicio de sesi\u00f3n de usuarios y la aprobaci\u00f3n de pares. Utilizando un QRCode, y requiriendo que las dos personas tengan una interacci\u00f3n expl\u00edcita directa para enviar y recibir fotos, se mitiga el problema.<\/span><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"s2\"><b>Autenticaci\u00f3n<\/b> es necesario para asegurar que el control de acceso, en este caso el acceso de escritura para insertar fotos en la base de datos de otro par, se concede a la persona adecuada. En PhotoDrop, estoy usando el Basic Auth que Couchbase Lite ya soporta. Genero de forma segura un nombre de usuario y una contrase\u00f1a de un solo uso, los junto con el endpoint URL y los codifico todos en el QRCode presentado por el receptor al emisor. Una vez que el remitente escanea el QRCode, el remitente tendr\u00e1 el nombre de usuario y la contrase\u00f1a para la autenticaci\u00f3n b\u00e1sica.<\/span><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"s2\"><b>Canales de comunicaci\u00f3n seguros<\/b> especialmente para enviar informaci\u00f3n sensible. No implement\u00e9 la comunicaci\u00f3n segura en esta aplicaci\u00f3n. Sin embargo, recientemente Jen Alfke a\u00f1adi\u00f3 soporte TLS incluyendo una API para generar un certificado autofirmado sobre la marcha al iOS Couchbase Lite Listener. Como todo el trabajo duro ya est\u00e1 hecho, puedes a\u00f1adir soporte para esto f\u00e1cilmente.<\/span><\/span><\/p>\n<p class=\"p1\"><span class=\"s1\"><span class=\"s2\">Despu\u00e9s de todo, el flujo actual de PhotoDrop es bastante sencillo. Seleccionas las fotos que quieres compartir con tu amigo y abres el esc\u00e1ner QRCode para escanear el endpoint de destino al que se enviar\u00e1n las fotos seleccionadas. Por otro lado, tu amigo abre la aplicaci\u00f3n, muestra el QRCode y espera a que escanees y env\u00edes las fotos. La siguiente secci\u00f3n proporcionar\u00e1 todos los detalles de implementaci\u00f3n de la aplicaci\u00f3n.<\/span><\/span><\/p>\n<h2 class=\"p1\"><span class=\"s1\"><strong><span class=\"s1\">Selecci\u00f3n de fotos<\/span><\/strong><\/span><\/h2>\n<p>PhotoDrop utiliza ALAssetsLibrary para acceder a las fotos en el \u00e1lbum Camera Roll en un dispositivo iOS porque el UIImagePickerViewController que no soporta la selecci\u00f3n m\u00faltiple de fotos.<\/p>\n<p>Las fotos se muestran en un UICollectionViewController. Se crea una sencilla UICollectionViewCell personalizada denominada PhotoViewCell para mostrar una miniatura de la foto y una casilla de verificaci\u00f3n que indica el estado seleccionado de la foto.<\/p>\n<h2 class=\"p1\"><span class=\"s1\"><strong><span class=\"s1\">Env\u00edo de fotos<\/span><\/strong><\/span><\/h2>\n<p>Cuando las fotos seleccionadas est\u00e9n listas para enviar y se pulse el bot\u00f3n de env\u00edo, se presentar\u00e1 el SendViewController con las fotos seleccionadas.<\/p>\n<p>Una vez presentado el SendViewController, nos encontramos en la funci\u00f3n viewDidLoad() en la que obtenemos un objeto de base de datos vac\u00edo llamado \"db\" de la clase DatabaseUtil. La raz\u00f3n por la que obtenemos una base de datos nueva es para asegurarnos de que no hay documentos pendientes de una sesi\u00f3n de compartici\u00f3n anterior.<br \/>\nLa funci\u00f3n getEmptyDatabase() de la clase DatabaseUtil devuelve una base de datos vac\u00eda con el nombre dado, borrando la base de datos si existe y volviendo a crear una nueva.<\/p>\n<p>Una vez presentado el SendViewController, estaremos en la funci\u00f3n viewDidAppear(animated:Bool). En la funci\u00f3n viewDidAppear, iniciamos la sesi\u00f3n de captura QRCode de AVFoundation para presentar el esc\u00e1ner QRCode.<\/p>\n<p>Cuando se captura un QRCode, extraemos la URL del endpoint que es la URL remota a la que enviaremos las fotos. El c\u00f3digo central para crear y enviar documentos de fotos comienza y termina en la funci\u00f3n replicate(url: NSURL) que tiene unas 50 l\u00edneas de c\u00f3digo.<\/p>\n<p>El c\u00f3digo comienza con un bucle a trav\u00e9s de cada foto en la matriz sharedAssets. Para cada foto, obtenemos una representaci\u00f3n binaria y la adjuntamos a un documento vac\u00edo de Couchbase Lite.<\/p>\n<p>Cuando terminamos de crear los documentos fotogr\u00e1ficos, enviamos esos documentos al otro dispositivo. Para ello, creamos un replicador push y establecemos los identificadores de los documentos que queremos replicar. En general, establecer los ids de los documentos para el replicador es opcional. Si no se especifica, el replicador replicar\u00e1 todos los documentos de la base de datos.<\/p>\n<p>Antes de iniciar el replicador, configuramos un observador de notificaciones para observar el estado de replicaci\u00f3n, de forma que podamos mostrar el estado de replicaci\u00f3n de forma adecuada cuando la replicaci\u00f3n est\u00e9 en curso.<\/p>\n<h2 class=\"p1\"><span class=\"s1\"><strong><span class=\"s1\">Recepci\u00f3n de fotos<\/span><\/strong><\/span><\/h2>\n<p>La recepci\u00f3n de fotos se realiza en ReceiveViewController que se presenta desde la pantalla ViewController cuando un usuario toca el bot\u00f3n Receive. Cuando se presenta el ReceiveViewController, obtenemos una base de datos fresca llamada \"db\" en el m\u00e9todo viewDidLoad(). En la funci\u00f3n viewDidAppear(animated: Bool), llamamos a startListener() para crear e iniciar un objeto CBLListener. El CBLListener es un servidor HTTP ligero embebido que escucha las peticiones HTTP y enruta esas peticiones a los manejadores apropiados para realizar las operaciones de replicaci\u00f3n. Una vez iniciado el listener, podemos obtener la URL del listener y presentar un QRCode codificando la URL. Como bonus, iOS CoreImage soporta un filtro QRCode por lo que generar una imagen QRCode es realmente f\u00e1cil :)<\/p>\n<p>Cuando configuramos el receptor en startListener(), habilitamos la autenticaci\u00f3n b\u00e1sica con el par usuario\/contrase\u00f1a generado. El par nombre de usuario\/contrase\u00f1a generado sirve como un par de un solo uso que proporciona una soluci\u00f3n segura (suficiente) para evitar que usuarios no autorizados env\u00eden im\u00e1genes al receptor. Para generar el nombre de usuario y la contrase\u00f1a, utilizamos la API de servicios de aleatorizaci\u00f3n de iOS (SecRandomCopyBytes) que genera valores aleatorios criptogr\u00e1ficamente seguros.<\/p>\n<p>Al final de la funci\u00f3n startListener(), se llama a la funci\u00f3n startObserveDatabaseChange() para observar cualquier cambio que se produzca en la base de datos a trav\u00e9s de las notificaciones denominadas kCBLDatabaseChangeNotification. Ahora podemos observar cu\u00e1ndo se replican los documentos fotogr\u00e1ficos del otro dispositivo y guardar las fotos en el rollo de la c\u00e1mara del dispositivo.<\/p>\n<p>La funci\u00f3n para guardar una foto en el rollo de la c\u00e1mara del dispositivo es la siguiente. La funci\u00f3n simplemente obtiene la imagen del documento adjunto, crea una CGImage y la guarda en el carrete mediante la funci\u00f3n writeImageDataToSavedPhotosAlbum() de la ALAssetsLibrary. Despu\u00e9s de guardar una foto, mostramos una miniatura en la pantalla.<\/p>\n<h2 class=\"p1\"><span class=\"s1\"><strong><span class=\"s1\">Conclusi\u00f3n<\/span><\/strong><\/span><\/h2>\n<p>Hay muchas maneras de desarrollar la aplicaci\u00f3n PhotoDrop, y el uso de Couchbase Lite es quiz\u00e1s una de las m\u00e1s f\u00e1ciles. El c\u00f3digo central para enviar y recibir fotos es de apenas 100 l\u00edneas de c\u00f3digo y contiene cero l\u00edneas de c\u00f3digo directamente involucradas en la comunicaci\u00f3n de red. Espero que esta entrada del blog y la propia aplicaci\u00f3n PhotoDrop te den algo de inspiraci\u00f3n e ideas para usar Couchbase Lite para aplicaciones P2P. Clona el <a href=\"https:\/\/github.com\/couchbaselabs\/photo-drop\">Repo GitHub de PhotoDrop<\/a>Juega con \u00e9l y cu\u00e9ntame qu\u00e9 te parece.<\/p>","protected":false},"excerpt":{"rendered":"<p>One of the cool features of Couchbase Lite that hasn\u2019t been featured much is an ability to do P2P replication between two devices. Couchbase Lite is packaged with an extra component called Couchbase Lite Listener that allows your application to [&hellip;]<\/p>","protected":false},"author":52,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[9025],"class_list":["post-1884","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PhotoDrop: Peer-to-Peer Photo Sharing App | Couchbase Mobile<\/title>\n<meta name=\"description\" content=\"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/photodrop\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile\" \/>\n<meta property=\"og:description\" content=\"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/photodrop\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-02-13T17:24:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-12-16T03:19:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/\"},\"author\":{\"name\":\"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/22f722eb705c69cfaefcacc31109d3af\"},\"headline\":\"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile\",\"datePublished\":\"2015-02-13T17:24:21+00:00\",\"dateModified\":\"2022-12-16T03:19:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/\"},\"wordCount\":1278,\"commentCount\":10,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/photodrop\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/\",\"name\":\"PhotoDrop: Peer-to-Peer Photo Sharing App | Couchbase Mobile\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-02-13T17:24:21+00:00\",\"dateModified\":\"2022-12-16T03:19:24+00:00\",\"description\":\"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/photodrop\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/photodrop\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/22f722eb705c69cfaefcacc31109d3af\",\"name\":\"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/6db0719e0e3644e93ad9690b55026cd6\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/483ca6f8ae7cf9bfe34a9a62f5c2c06b6fcb7484387dbdb8a8a3932e42851a4c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/483ca6f8ae7cf9bfe34a9a62f5c2c06b6fcb7484387dbdb8a8a3932e42851a4c?s=96&d=mm&r=g\",\"caption\":\"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase\"},\"description\":\"Pasin Suriyentrakorn is a Senior Software Engineer at Couchbase for Couchbase Mobile. Prior, he was an engineer at Oracle where he led development of the Mobile User Interface rendering framework for Oracle Sales Cloud iOS and Android application.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/pasin-suriyentrakorn\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PhotoDrop: Peer-to-Peer Photo Sharing App | Couchbase Mobile","description":"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/photodrop\/","og_locale":"es_MX","og_type":"article","og_title":"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile","og_description":"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/photodrop\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-02-13T17:24:21+00:00","article_modified_time":"2022-12-16T03:19:24+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/"},"author":{"name":"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/22f722eb705c69cfaefcacc31109d3af"},"headline":"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile","datePublished":"2015-02-13T17:24:21+00:00","dateModified":"2022-12-16T03:19:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/"},"wordCount":1278,"commentCount":10,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/photodrop\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/","url":"https:\/\/www.couchbase.com\/blog\/photodrop\/","name":"PhotoDrop: Peer-to-Peer Photo Sharing App | Couchbase Mobile","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-02-13T17:24:21+00:00","dateModified":"2022-12-16T03:19:24+00:00","description":"PhotoDrop is a P2P photo sharing app like the iOS AirDrop feature that lets you send photos across devices. Get ready to jump into the code with Couchbase.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/photodrop\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/photodrop\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Building a Peer-to-Peer Photo Sharing App with Couchbase Mobile"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/22f722eb705c69cfaefcacc31109d3af","name":"Pasin Suriyentrakorn, Ingeniero Superior de Software, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/6db0719e0e3644e93ad9690b55026cd6","url":"https:\/\/secure.gravatar.com\/avatar\/483ca6f8ae7cf9bfe34a9a62f5c2c06b6fcb7484387dbdb8a8a3932e42851a4c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/483ca6f8ae7cf9bfe34a9a62f5c2c06b6fcb7484387dbdb8a8a3932e42851a4c?s=96&d=mm&r=g","caption":"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase"},"description":"Pasin Suriyentrakorn es Ingeniero de Software Senior en Couchbase para Couchbase Mobile. Anteriormente, fue ingeniero en Oracle, donde dirigi\u00f3 el desarrollo del marco de renderizaci\u00f3n de la interfaz de usuario m\u00f3vil para la aplicaci\u00f3n Oracle Sales Cloud iOS y Android.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/pasin-suriyentrakorn\/"}]}},"authors":[{"term_id":9025,"user_id":52,"is_guest":0,"slug":"pasin-suriyentrakorn","display_name":"Pasin Suriyentrakorn, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/483ca6f8ae7cf9bfe34a9a62f5c2c06b6fcb7484387dbdb8a8a3932e42851a4c?s=96&d=mm&r=g","first_name":"Pasin","last_name":"Suriyentrakorn","user_url":"","author_category":"","description":"Pasin Suriyentrakorn es Ingeniero de Software Senior en Couchbase para Couchbase Mobile. Anteriormente, fue ingeniero en Oracle, donde dirigi\u00f3 el desarrollo del marco de renderizaci\u00f3n de la interfaz de usuario m\u00f3vil para la aplicaci\u00f3n Oracle Sales Cloud iOS y Android."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=1884"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1884\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=1884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=1884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=1884"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=1884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}