{"id":60,"date":"2019-04-03T10:02:13","date_gmt":"2019-04-03T09:02:13","guid":{"rendered":"http:\/\/guillemrueda.com\/blog\/?p=60"},"modified":"2019-04-03T10:02:38","modified_gmt":"2019-04-03T09:02:38","slug":"utilizar-google-optimization-tools-en-una-azure-function","status":"publish","type":"post","link":"https:\/\/guillemrueda.com\/blog\/2019\/04\/03\/utilizar-google-optimization-tools-en-una-azure-function\/","title":{"rendered":"Google Optimization Tools en una Azure Function"},"content":{"rendered":"<p>La suite de Optimizaci\u00f3n de Google, <a href=\"https:\/\/developers.google.com\/optimization\/\">Google Optimization Tools<\/a>\u00a0(ortools), ofrece un amplio abanico de herramientas de constraint programming que normalmente son de pago (como <a href=\"https:\/\/www.solver.com\/\">Frontline<\/a>, <a href=\"http:\/\/www.gurobi.com\/\">Groubi<\/a>\u00a0).<\/p>\n<p>Debido a la necesidad de desarrollo de prototipos este solver ofrece una posibilidad de prototipar un desarrollo de manera funcional para saber si los modelos matem\u00e1ticos son sadisfactibles antes de facturar al cliente un proyecto complejo.<\/p>\n<p>Para desgracia de nuestro entorno de trabajo y como ya es constumbre en Google, los wrappers de C# estan en funciones obsoletas. Para nuestra fortuna, la libreria de Python est\u00e1 al d\u00eda aunque a d\u00eda de hoy (09-2018) Python en<a href=\"https:\/\/lnx.azurewebsites.net\/python-support-on-azure-functions-is-really-experimental\/\"> Azure Functions<\/a> a dia de hoy est\u00e1 en experimental.<\/p>\n<h2>1.- Instalar Python x64 a la Azure Function<\/h2>\n<p>La versi\u00f3n que por defecto funciona en Azure Function es la 2.6, la cual el package de ortools NO soporta. Tambi\u00e9n por defecto se ejecuta en x86 as\u00ed que procederemos a activar el x64 y posteriormente instalar la versi\u00f3n m\u00e1s reciente que nos permiten desde Azure, la 3.6.4.<\/p>\n<p>Primero activamos el modo x64 al servidor de funciones:<\/p>\n<p>Platform features &gt; Application settings y click a 64-bit a Platform<\/p>\n<p>A partir de ahora tendremos que realizar acciones de consola. Algunas se pueden hacer visualmente, pero a trav\u00e9s de consola se explican <a href=\"https:\/\/lnx.azurewebsites.net\/python-3-6-deployments-on-azure-function-apps\/\">aqu\u00ed<\/a>\u00a0o <a href=\"http:\/\/www.get-vm.com\/blog\/2018\/04\/11\/python-modules-azure-functions\/\">aqu\u00ed<\/a>. De manera visual hay que acceder al kudu a trav\u00e9s de esta direcci\u00f3n:<\/p>\n<p>https:\/\/[NombreDelServerDeFunciones].scm.azurewebsites.net<\/p>\n<p>Accedemos entonces a &#8220;Site extensions&#8221; y a\u00f1adimos Python 3.6.4 x64<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-61 size-large\" src=\"http:\/\/guillemrueda.com\/blog\/wp-content\/uploads\/2018\/09\/captura1-1024x665.png\" alt=\"\" width=\"660\" height=\"429\" srcset=\"https:\/\/guillemrueda.com\/blog\/wp-content\/uploads\/2018\/09\/captura1-1024x665.png 1024w, https:\/\/guillemrueda.com\/blog\/wp-content\/uploads\/2018\/09\/captura1-300x195.png 300w, https:\/\/guillemrueda.com\/blog\/wp-content\/uploads\/2018\/09\/captura1-768x499.png 768w, https:\/\/guillemrueda.com\/blog\/wp-content\/uploads\/2018\/09\/captura1.png 1085w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/p>\n<p>Posteriormente volvemos a\u00a0Platform features &gt; Application settings para a\u00f1adir estas lineas:<\/p>\n<p>Handler mappings<\/p>\n<div class=\"settings-wrapper\">\n<table class=\"tbl fixed stretch\" tabindex=\"-1\" role=\"grid\" aria-label=\"Handler mappings\">\n<tbody>\n<tr>\n<th class=\"one-third-col padded-col\" tabindex=\"0\">\n<div class=\"cell-liner\">EXTENSION<\/div>\n<\/th>\n<th class=\"one-third-col padded-col\" tabindex=\"0\">\n<div class=\"cell-liner\">SCRIPT PROCESSOR<\/div>\n<\/th>\n<th class=\"one-third-col padded-col\" tabindex=\"0\">\n<div class=\"cell-liner\">ARGUMENTS<\/div>\n<\/th>\n<\/tr>\n<tr>\n<td class=\"one-third-col padded-col pristine\" tabindex=\"0\">\n<div class=\"cell-liner\">\n<div class=\"click-to-edit-wrapper\">\n<div class=\"read-only-text\">fastCgi<\/div>\n<\/div>\n<\/div>\n<\/td>\n<td class=\"one-third-col padded-col\" tabindex=\"0\">\n<div class=\"cell-liner\">\n<div class=\"click-to-edit-wrapper\">\n<div class=\"read-only-text\">D:\\home\\python364x64\\python.exe<\/div>\n<\/div>\n<\/div>\n<\/td>\n<td class=\"one-third-col padded-col\" tabindex=\"0\">\n<div class=\"cell-liner\">\n<div class=\"click-to-edit-wrapper\">\n<div class=\"read-only-text\">D:\\home\\python364x64\\wfastcgi.py<\/div>\n<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Application settings<\/p>\n<table class=\"tbl fixed stretch\" tabindex=\"-1\" role=\"grid\" aria-label=\"Application settings\">\n<tbody>\n<tr>\n<th class=\"one-third-col padded-col\" tabindex=\"0\">\n<div class=\"cell-liner\">APP SETTING NAME<\/div>\n<\/th>\n<th class=\"two-thirds-col padded-col\" tabindex=\"0\">\n<div class=\"cell-liner\">VALUE<\/div>\n<\/th>\n<\/tr>\n<tr>\n<td class=\"one-third-col padded-col pristine\" tabindex=\"0\">\n<div class=\"cell-liner\">\n<div class=\"click-to-edit-wrapper\">\n<div class=\"read-only-text\">WEBSITE_USE_PLACEHOLDER<\/div>\n<\/div>\n<\/div>\n<\/td>\n<td class=\"two-thirds-col padded-col\" tabindex=\"0\">\n<div class=\"cell-liner\">\n<div class=\"click-to-edit-wrapper\">\n<div class=\"read-only-text\">0<\/div>\n<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Una vez\u00a0finalizados estos pasos, podemos proceder a reiniciar\u00a0el servidor de App Functions y proceder a instalar la libreria ortools con pip.<\/p>\n<p>Volvemos a Kudu y tecleamos\u00a0la instalaci\u00f3n de ortools a trav\u00e9s a pip:<\/p>\n<p style=\"padding-left: 30px;\">python -m pip install ortools<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La suite de Optimizaci\u00f3n de Google, Google Optimization Tools\u00a0(ortools), ofrece un amplio abanico de herramientas de constraint programming que normalmente son de pago (como Frontline, Groubi\u00a0). Debido a la necesidad de desarrollo de prototipos este solver ofrece una posibilidad de prototipar un desarrollo de manera funcional para saber si los modelos matem\u00e1ticos son sadisfactibles antes &hellip; <a href=\"https:\/\/guillemrueda.com\/blog\/2019\/04\/03\/utilizar-google-optimization-tools-en-una-azure-function\/\" class=\"more-link\">Continua la lectura de <span class=\"screen-reader-text\">Google Optimization Tools en una Azure Function<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-60","post","type-post","status-publish","format-standard","hentry","category-general"],"_links":{"self":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts\/60","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/comments?post=60"}],"version-history":[{"count":2,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts\/60\/revisions"}],"predecessor-version":[{"id":67,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts\/60\/revisions\/67"}],"wp:attachment":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/media?parent=60"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/categories?post=60"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/tags?post=60"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}