<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5786062601235309767</id><updated>2026-06-21T23:48:52.264+02:00</updated><category term="php"/><category term="microsoft"/><category term="herramientas"/><category term="configuraciones"/><category term="tutoriales"/><category term="SQL Server"/><category term="javascript"/><category term="windows"/><category term="instalaciones"/><category term="comandos"/><category term="MySQL"/><category term="linux"/><category term="bases de datos"/><category term="bugs"/><category term="SQL"/><category term="script php"/><category term="managment studio"/><category term="curiosidades"/><category term="internet"/><category term="jquery"/><category term="apache"/><category term="optimización"/><category term="windows server"/><category term="actualizaciones"/><category term="clases php"/><category term="centos"/><category term="navegadores"/><category term="librerías php"/><category term="T-SQL"/><category term="queries"/><category term="google"/><category term="opinión"/><category term="recursos"/><category term="x64"/><category term="marketing"/><category term="php7"/><category term="benchmark"/><category term="programas"/><category term="software"/><category term="emails"/><category term="sistemas operativos"/><category term="x86"/><category term="AJAX"/><category term="windows 8"/><category term="códigos"/><category term="errores"/><category term="frameworks"/><category term="posicionamiento"/><category term="seguridad internet"/><category term="driver sql server php"/><category term="formularios"/><category term="funciones fecha"/><category term="hardware"/><category term="html5"/><category term="zend"/><category term="buscadores"/><category term="estadísticas"/><category term="plugins"/><category term="SEO"/><category term="html"/><category term="redes sociales"/><category term="htaccess"/><category term="nginx"/><category term="repositorios"/><category term="scripts shell linux"/><category term="servidores web"/><category term="windows 7"/><category term="windows 8.1"/><category term="1and1"/><category term="backup"/><category term="codificaciones"/><category term="deprecadas"/><category term="entornos de trabajo"/><category term="monitorado"/><category term="procedimientos"/><category term="blogs"/><category term="copias de seguridad"/><category term="css"/><category term="detalles"/><category term="discos duros"/><category term="facebook"/><category term="firewall"/><category term="innodb"/><category term="macos"/><category term="munin"/><category term="móviles"/><category term="nodejs"/><category term="opensuse"/><category term="versiones"/><category term="virtualización"/><category term="wamp server"/><category term="windows 10"/><category term="yum"/><category term="Hyper-V"/><category term="apple"/><category term="boletín electrónico"/><category term="consultas sql"/><category term="contraseñas"/><category term="cpu"/><category term="direcciones ip"/><category term="enlaces"/><category term="firefox"/><category term="ios"/><category term="jquery ui"/><category term="off topic"/><category term="php-fpm"/><category term="ssh"/><category term="trucos"/><category term="JSON"/><category term="POO"/><category term="XML"/><category term="anuncios"/><category term="brew"/><category term="carpetas compartidas"/><category term="catalina"/><category term="compilar"/><category term="criptografía"/><category term="cronología"/><category term="expresiones regulares"/><category term="expressive"/><category term="fotografía"/><category term="ftp"/><category term="google chrome"/><category term="imagemagick"/><category term="iphone"/><category term="listados"/><category term="manuales"/><category term="mediawiki"/><category term="odbc"/><category term="office 2010"/><category term="redes"/><category term="restaurar"/><category term="rss"/><category term="subversion"/><category term="triggers"/><category term="utf8"/><category term="wiki"/><category term="wordpress"/><category term="IDE"/><category term="adsense"/><category term="android"/><category term="antiguos"/><category term="antivirus"/><category term="blogger"/><category term="cache"/><category term="composer"/><category term="docker"/><category term="editores"/><category term="fraudes online"/><category term="graphql"/><category term="historial web"/><category term="http2"/><category term="iconos"/><category term="iis"/><category term="internacionalización"/><category term="internet explorer"/><category term="lftp"/><category term="microsoft excel"/><category term="monetizar"/><category term="nube"/><category term="openssl"/><category term="pdf"/><category term="proyectos"/><category term="rpm"/><category term="safe mode"/><category term="servicios google"/><category term="spam"/><category term="technical preview"/><category term="tecnología"/><category term="traducciones"/><category term="unidad de red"/><category term="xampp"/><category term="Dynamics"/><category term="GPS"/><category term="IPs"/><category term="aberración cromática"/><category term="api"/><category term="azure"/><category term="bi"/><category term="bigsur"/><category term="canvas"/><category term="captcha"/><category term="certificados seguridad"/><category term="cloud"/><category term="conectividad"/><category term="contenedores"/><category term="cors"/><category term="curl"/><category term="debug"/><category term="depurar"/><category term="devops"/><category term="divisas"/><category term="dnf"/><category term="eloquent"/><category term="euro"/><category term="fabricjs"/><category term="filtros fotográficos"/><category term="font awesome"/><category term="formdata"/><category term="geocoding"/><category term="git"/><category term="gráficas"/><category term="herencia"/><category term="i18n"/><category term="iama"/><category term="icloud"/><category term="idiomas"/><category term="jquery mobile"/><category term="juegos online"/><category term="laravel"/><category term="lens flare"/><category term="lentes fotografía"/><category term="llnode"/><category term="logitech"/><category term="mailman"/><category term="mediainfo"/><category term="mezzio"/><category term="migracion"/><category term="migraciones"/><category term="minify"/><category term="multimedia"/><category term="network"/><category term="nivel aislamiento"/><category term="números romanos"/><category term="objetivos fotográficos"/><category term="office"/><category term="opcache"/><category term="osx"/><category term="paralelismo"/><category term="parsoid"/><category term="path"/><category term="periféricos"/><category term="phishing"/><category term="photoshop"/><category term="planes de ejecucución"/><category term="powershell"/><category term="psexec"/><category term="psr"/><category term="reportes"/><category term="seguridad"/><category term="servidores"/><category term="shell"/><category term="ssl"/><category term="surface"/><category term="symbian"/><category term="sysadmin"/><category term="teamviewer"/><category term="terminal"/><category term="tipos de datos"/><category term="tortoise svn"/><category term="trabajos programados"/><category term="traits"/><category term="tráfico"/><category term="ttfb"/><category term="tuenti"/><category term="twitter"/><category term="ubuntu"/><category term="webservices"/><category term="yast"/><category term="yui compressor"/><title type='text'>Script Inside</title><subtitle type='html'>Hoy en día programar es una carrera entre los ingenieros del software intentando construir mayores y mejores programas a prueba de idiotas, y el Universo tratando de producir mayores y mejores idiotas. Por ahora, el Universo va ganando. (Rich Cook)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://scriptinside.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>397</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-764983524998376885</id><published>2026-03-09T16:14:00.005+01:00</published><updated>2026-03-09T16:14:49.879+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="backup"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="docker"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="migracion"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="nginx"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="seguridad"/><category scheme="http://www.blogger.com/atom/ns#" term="servidores"/><category scheme="http://www.blogger.com/atom/ns#" term="sysadmin"/><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu"/><category scheme="http://www.blogger.com/atom/ns#" term="wordpress"/><title type='text'>Recuperar y migrar un WordPress comprometido</title><content type='html'>&lt;p&gt;Hace unos días tuve que migrar un WordPress a un servidor nuevo después de que el anterior quedara comprometido. Cuando llegas a un punto en el que faltan binarios del sistema, hay procesos extraños o cron jobs que no reconoces, seguir intentando limpiar la máquina deja de tener sentido. En estos casos prefiero recuperar los datos necesarios y reconstruir el servidor desde cero. Este fue exactamente el proceso que seguí.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;1. Recuperar el WordPress del servidor antiguo&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p1&quot;&gt;Lo primero fue sacar la carpeta completa del WordPress.&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;En mi caso estaba en:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;/var/www/html/wordpress&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Desde mi máquina local ejecuté:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;scp -r root@&amp;lt;server_ip&amp;gt;:/var/www/html/wordpress .&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Con esto copié todo el código del sitio a mi máquina local.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;2. Recuperar la base de datos&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p1&quot;&gt;Para identificar la base de datos revisé el&amp;nbsp;&lt;span class=&quot;s2&quot;&gt;wp-config.php&lt;/span&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;grep DB_ wordpress/wp-config.php&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Una vez identificado el nombre de la base de datos y el usuario, generé el dump.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;mysqldump --no-tablespaces -u wordpress_user -p wordpress_db &amp;gt; /root/wordpress_no_tablespaces.sql&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;i&gt;Tuve que usar&amp;nbsp;&lt;span class=&quot;s1&quot;&gt;--no-tablespaces&lt;/span&gt;&amp;nbsp;porque el usuario no tenía permisos&amp;nbsp;&lt;span class=&quot;s1&quot;&gt;PROCESS&lt;/span&gt;.&lt;/i&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;Después lo copié a local:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;scp root@&amp;lt;server_ip&amp;gt;:/root/wordpress_no_tablespaces.sql .&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;3. Recuperar configuración del servidor&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p3&quot;&gt;También guardé algunas configuraciones del servidor antiguo por si necesitaba replicar algo.&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;nginx&lt;/b&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;scp -r root@&amp;lt;server_ip&amp;gt;:/etc/nginx ./backup_server/&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;PHP&lt;/b&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;scp -r root@&amp;lt;server_ip&amp;gt;:/etc/php ./backup_server/&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;certificados SSL&lt;/b&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;scp -r root@&amp;lt;server_ip&amp;gt;:/etc/letsencrypt ./backup_server/&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;logs&lt;/b&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;scp -r root@&amp;lt;server_ip&amp;gt;:/var/log/nginx ./backup_server/&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Al final terminé con esta estructura:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;wordpress/
wordpress_no_tablespaces.sql
backup_server/nginx
backup_server/php
backup_server/letsencrypt
backup_server/logs&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;4. Probar el WordPress en local con Docker&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p3&quot;&gt;Antes de restaurar nada en un servidor nuevo preferí comprobar que el backup funcionaba correctamente y que no había nada extraño en el código. Para hacerlo monté un entorno local con Docker.&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;La idea era reproducir el stack del servidor:&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;nginx&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;php-fpm&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;mysql&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;p3&quot;&gt;Primero construí el entorno:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;docker compose up -d --build&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Luego importé la base de datos dentro del contenedor:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;docker exec -i wp_db mysql -u root -pwordpress_root_password wordpress_db &amp;lt; wordpress_no_tablespaces.sql&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Después accedí al WordPress desde el navegador:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;http://localhost&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Esto me permitió comprobar:&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;que el sitio cargaba correctamente&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;que la base de datos estaba intacta&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;que los plugins funcionaban&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;que no había código sospechoso&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;p1&quot;&gt;Además ejecuté algunas comprobaciones básicas.&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;Buscar PHP en uploads:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;find wordpress/wp-content/uploads -name &quot;*.php&quot;&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Buscar funciones sospechosas:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;grep -R &quot;base64_decode(&quot; wordpress&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Una vez comprobado que todo funcionaba correctamente continué con la migración.&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;5. Montar un servidor nuevo&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p1&quot;&gt;Con el backup verificado monté un servidor nuevo con Ubuntu 24.04.&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;Actualicé el sistema:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;apt update
apt upgrade -y&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;6. Instalar el stack del servidor&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p1&quot;&gt;Ubuntu 24.04 instala PHP 8.3 por defecto, pero en mi caso quería utilizar&amp;nbsp;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;PHP 8.4&lt;/b&gt;&lt;/span&gt;, así que añadí el repositorio de PHP mantenido por Ondřej Surý.&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;Primero instalé las herramientas necesarias:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;apt install -y software-properties-common&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Después añadí el repositorio:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;add-apt-repository ppa:ondrej/php
apt update&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Una vez añadido el repositorio instalé nginx, MySQL y PHP 8.4 con las extensiones necesarias para WordPress:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;apt install -y nginx mysql-server php8.4-fpm php8.4-mysql php8.4-cli php8.4-curl php8.4-gd php8.4-mbstring php8.4-xml php8.4-zip php8.4-intl unzip certbot python3-certbot-nginx fail2ban&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Después comprobé la versión de PHP instalada:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;php -v&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;La salida debería mostrar algo similar a:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;PHP 8.4.x (cli)&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;También verifiqué que el socket de PHP-FPM estaba disponible:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ls /run/php/&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Debería aparecer:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;php8.4-fpm.sock&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Este es el socket que luego se utiliza en la configuración de nginx.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;7. Crear la base de datos&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p3&quot;&gt;Entré en MySQL:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;mysql&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Creé la base de datos y el usuario:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER &#39;wordpress_user&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;your_secure_password&#39;;
GRANT ALL PRIVILEGES ON wordpress.* TO &#39;wordpress_user&#39;@&#39;localhost&#39;;
FLUSH PRIVILEGES;
EXIT;&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;8. Subir el dump al servidor nuevo&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p3&quot;&gt;Desde mi máquina local:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;scp wordpress_no_tablespaces.sql root@&amp;lt;new_server_ip&amp;gt;:~&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Importé la base de datos:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;mysql -u wordpress_user -p wordpress &amp;lt; ~/wordpress_no_tablespaces.sql&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;9. Subir el WordPress&lt;/b&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;scp -r wordpress/* root@&amp;lt;new_server_ip&amp;gt;:/var/www/&lt;/code&gt;&amp;lt;domain&amp;gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Permisos correctos:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;chown -R www-data:www-data /var/www/&lt;/code&gt;&amp;lt;domain&amp;gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;10. Configurar nginx&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p3&quot;&gt;Creé el virtual host:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;nano /etc/nginx/sites-available/&lt;/code&gt;&amp;lt;domain&amp;gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Configuración básica:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    server_name &amp;lt;domain&amp;gt;;&lt;br /&gt;
    root /var/www/&amp;lt;domain&amp;gt;;&lt;br /&gt;    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Activé el sitio:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ln -s /etc/nginx/sites-available/&amp;lt;domain&amp;gt;&lt;/code&gt; /etc/nginx/sites-enabled/&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;11. Activar HTTPS&lt;/b&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;certbot --nginx -d &lt;/code&gt;&amp;lt;domain&amp;gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;12. Comprobaciones finales&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p3&quot;&gt;Verificar PHP en uploads:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;find /var/www/&amp;lt;domain&amp;gt;&lt;/code&gt;/wp-content/uploads -name &quot;*.php&quot;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Comprobar cronjobs:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;crontab -l
ls /etc/cron*&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;Verificar renovación SSL:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;certbot renew --dry-run&lt;/code&gt;&lt;/pre&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Conclusión&lt;/b&gt;&lt;/h3&gt;&lt;p class=&quot;p3&quot;&gt;Cuando un servidor ha sido comprometido realmente, la forma más rápida de volver a tener control sobre el sistema es reconstruir el entorno desde cero.&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;En mi caso el proceso fue:&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol start=&quot;1&quot;&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;recuperar WordPress y base de datos&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;validar el backup en Docker&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;montar un servidor limpio&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p class=&quot;p1&quot;&gt;restaurar el sitio&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;p3&quot;&gt;Puede parecer más trabajo que intentar limpiar el servidor original, pero a largo plazo suele ser mucho más seguro.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/764983524998376885?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/764983524998376885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/764983524998376885'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2026/03/recuperar-y-migrar-un-wordpress.html' title='Recuperar y migrar un WordPress comprometido'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-4057064741800225589</id><published>2021-04-07T09:57:00.002+02:00</published><updated>2021-04-07T09:59:39.438+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bigsur"/><category scheme="http://www.blogger.com/atom/ns#" term="debug"/><category scheme="http://www.blogger.com/atom/ns#" term="depurar"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="llnode"/><category scheme="http://www.blogger.com/atom/ns#" term="macos"/><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><title type='text'>Instalar llnode en macOS Big Sur</title><content type='html'>&lt;p&gt;&lt;span class=&quot;VIiyi&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;JLqJ4b ChMk0b&quot; data-language-for-alternatives=&quot;es&quot; data-language-to-translate-into=&quot;en&quot; data-phrase-index=&quot;0&quot;&gt;&lt;span&gt;El complemento llnode agrega la capacidad de inspeccionar el &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;VIiyi&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;JLqJ4b ChMk0b&quot; data-language-for-alternatives=&quot;es&quot; data-language-to-translate-into=&quot;en&quot; data-phrase-index=&quot;0&quot;&gt;&lt;span&gt;&lt;span class=&quot;VIiyi&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;JLqJ4b ChMk0b&quot; data-language-for-alternatives=&quot;es&quot; data-language-to-translate-into=&quot;en&quot; data-phrase-index=&quot;0&quot;&gt;&lt;span&gt;código fuente&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; JavaScript a las funciones de depuración estándar de C / C ++ cuando se trabaja con procesos Node.js o volcados de núcleo en LLDB. Digamos que es la herramienta imprescindible si queremos detectar fallos en la gestión de memoria en nuestro código.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;VIiyi&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;JLqJ4b ChMk0b&quot; data-language-for-alternatives=&quot;es&quot; data-language-to-translate-into=&quot;en&quot; data-phrase-index=&quot;0&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span class=&quot;VIiyi&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;JLqJ4b ChMk0b&quot; data-language-for-alternatives=&quot;es&quot; data-language-to-translate-into=&quot;en&quot; data-phrase-index=&quot;0&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoMH7xUg4hUmt4CF7R_1JidYbUDX_iwFdUp8DMUan9Lyb6Lz4iCN0DhV72GNPHaSHrsIDC7446B5oLz8ezVGgNLz67g11RxMVuYssfDKjlAjNkqUN60njaJbb8XUkDoUBCd9sNCHyDCTc/s885/yki6P.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;511&quot; data-original-width=&quot;885&quot; height=&quot;231&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoMH7xUg4hUmt4CF7R_1JidYbUDX_iwFdUp8DMUan9Lyb6Lz4iCN0DhV72GNPHaSHrsIDC7446B5oLz8ezVGgNLz67g11RxMVuYssfDKjlAjNkqUN60njaJbb8XUkDoUBCd9sNCHyDCTc/w400-h231/yki6P.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;VIiyi&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;JLqJ4b ChMk0b&quot; data-language-for-alternatives=&quot;es&quot; data-language-to-translate-into=&quot;en&quot; data-phrase-index=&quot;0&quot;&gt;&lt;span&gt;Entorno&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;macOS Big Sur 11.2.3&lt;/li&gt;&lt;li&gt;node 14.15.4&lt;/li&gt;&lt;li&gt;lldb-1200.0.44.2&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Al ser llnode un plugin para lldb necesitamos instalar este primero, en el caso de macOS es suficiente con instalar las herramientas de consola de Xcode, nada más, no es necesario tener la versión completa instalada.&lt;/p&gt;&lt;p&gt;&lt;code&gt;sudo xcode-select --install&lt;/code&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Para comprobar que todo es correcto podemos utilizar&lt;/p&gt;&lt;p&gt;&lt;code&gt;lldb --version&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Ahora vamos a instalar llnode y la mejor manera es utilizando brew:&lt;/p&gt;&lt;p&gt;&lt;code&gt;brew install llnode&lt;/code&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Es importante tener en cuenta que esto solo nos instala el plugin pero no lo vincula con lldb ni genera un comando con el que podamos llamar a llnode desde consola directamente así que es normal que una vez instalado tengamos esto si lo intentamos llamar desde consola:&lt;/p&gt;&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;% llnode
zsh: command not found: llnode&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Para comprobar realmente que el plugin se ha instalado correctamente podemos utilizar el siguiente truco, que además nos dará la ruta donde se ha instalado, dato necesario para los siguientes pasos.&lt;/p&gt;&lt;p&gt;&lt;code&gt;brew link llnode&lt;/code&gt;&lt;/p&gt;&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;Warning: Already linked: /usr/local/Cellar/llnode/3.2.0_1
To relink:
  brew unlink llnode &amp;amp;&amp;amp; brew link llnode&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Una&amp;nbsp; vez instalado tenemos que vincular (o agregar) llnode a nuestra instalación de lldb. Para activar este plugin basta con editar el archivo ~/.lldbinit y agregar la siguiente línea:&lt;/p&gt;&lt;p&gt;&lt;code&gt;plugin load /usr/local/Cellar/llnode/3.2.0_1/llnode.dylib&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Ahora solo nos queda utilizarlo. llnode puede correr con un proceso existente o con un volcado del core, en este post voy a utilizar la segunda opción. Primero necesitamos el PID del proceso de Node sobre el cual queremos generar el volcado, una vez tenemos este dato (ps aux | grep node) generamos el volcado:&lt;/p&gt;&lt;p&gt;&lt;code&gt;lldb --attach-pid {PID} -b -o &#39;process save-core &quot;core.{PID}&quot;&#39;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Con esto ya podemos utilizar llnode&lt;/p&gt;&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;lldb
(lldb) target create node -c core.{PID}&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;&lt;code&gt;(lldb) v8 nodeinfo
(lldb) v8 findjsobjects&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Podéis&amp;nbsp; encontrar información adicional en estos enlaces, pero no sigáis esas instrucciones de instalción&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/nodejs/llnode&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Github page&lt;/a&gt; &lt;span aria-hidden=&quot;true&quot; class=&quot;fabric-icon ms-Icon--NavigateExternalInline font-size&quot; role=&quot;presentation&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;https://medium.com/sthima-insights/taming-the-dragon-using-llnode-to-debug-your-node-js-application-fc54c6efd0f1&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Usage tutorial&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Otras formas de instalar llnode en Big Sur pueden dar diferentes errores, como los siguientes:&lt;/p&gt;&lt;p&gt;&lt;code&gt;npm install -g llnode&lt;/code&gt;&lt;/p&gt;&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;Reading lldb version...
xcode-select: error: tool &#39;xcodebuild&#39; requires Xcode,&amp;nbsp;but active developer directory
&#39;/Library/Developer/CommandLineTools&#39; is a command line tools instance
Error: Command failed: xcodebuild -version
xcode-select: error: tool &#39;xcodebuild&#39; requires Xcode, but active developer directory
&#39;/Library/Developer/CommandLineTools&#39; is a command line tools instance&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;brew update &amp;amp;&amp;amp; brew install --with-lldb --with-toolchain llvm
Error: invalid option: --with-lldb&lt;/code&gt;&lt;/pre&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/4057064741800225589?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/4057064741800225589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/4057064741800225589'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2021/04/instalar-llnode-en-macos-big-sur.html' title='Instalar llnode en macOS Big Sur'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoMH7xUg4hUmt4CF7R_1JidYbUDX_iwFdUp8DMUan9Lyb6Lz4iCN0DhV72GNPHaSHrsIDC7446B5oLz8ezVGgNLz67g11RxMVuYssfDKjlAjNkqUN60njaJbb8XUkDoUBCd9sNCHyDCTc/s72-w400-h231-c/yki6P.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-2267638583110334850</id><published>2020-04-29T10:23:00.000+02:00</published><updated>2020-04-29T10:26:30.305+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="deprecadas"/><category scheme="http://www.blogger.com/atom/ns#" term="expressive"/><category scheme="http://www.blogger.com/atom/ns#" term="frameworks"/><category scheme="http://www.blogger.com/atom/ns#" term="mezzio"/><category scheme="http://www.blogger.com/atom/ns#" term="migraciones"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="zend"/><title type='text'>Migrando zend expressive a mezzio</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Hace ya un tiempo se gestaron cambios en Zend, ahora es Láminas y el soporte a Zend Framework tal y lo conocíamos ha caducado, ahora el Framework es Mezzio.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibjTWRfiZSGPSYLUwoy0YfA6PW3jYxZm0HqDFJeTPbYJQknZP2UAX3FTIlKVTyuRpYDUwZsQeySlEQJbaEy-QVtiMNIOhJGOGk0hsIsqMOnhSwYXAqf8GtfbvN-qiLtMFfnIeyutLmG8s/s1600/EWSJMZjX0AAni7H.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;550&quot; data-original-width=&quot;800&quot; height=&quot;440&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibjTWRfiZSGPSYLUwoy0YfA6PW3jYxZm0HqDFJeTPbYJQknZP2UAX3FTIlKVTyuRpYDUwZsQeySlEQJbaEy-QVtiMNIOhJGOGk0hsIsqMOnhSwYXAqf8GtfbvN-qiLtMFfnIeyutLmG8s/s640/EWSJMZjX0AAni7H.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Esta es la equivalencia de los nuevos paquetes, la mayoría de cambios son solo de namespaces:&lt;/div&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-auradi-config =&amp;gt; laminas/laminas-auradi-config&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-cache =&amp;gt; laminas/laminas-cache&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-code =&amp;gt; laminas/laminas-code&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-component-installer =&amp;gt; laminas/laminas-component-installer&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-config-aggregator =&amp;gt; laminas/laminas-config-aggregator&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-db =&amp;gt; laminas/laminas-db&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-debug is abandoned, you should avoid using it. No replacement was suggested.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-diactoros =&amp;gt; laminas/laminas-diactoros&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-escaper =&amp;gt; laminas/laminas-escaper&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-eventmanager =&amp;gt; laminas/laminas-eventmanager&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive =&amp;gt; mezzio/mezzio&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-aurarouter =&amp;gt; mezzio/mezzio-aurarouter&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-authentication =&amp;gt; mezzio/mezzio-authentication&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-authentication-oauth2 =&amp;gt; mezzio/mezzio-authentication-oauth2&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-csrf =&amp;gt; mezzio/mezzio-csrf&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-flash =&amp;gt; mezzio/mezzio-flash&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-helpers =&amp;gt; mezzio/mezzio-helpers&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-router =&amp;gt; mezzio/mezzio-router&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-session =&amp;gt; mezzio/mezzio-session&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-session-ext =&amp;gt; mezzio/mezzio-session-ext&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-template =&amp;gt; mezzio/mezzio-template&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-expressive-tooling =&amp;gt; mezzio/mezzio-tooling&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-httphandlerrunner =&amp;gt; laminas/laminas-httphandlerrunner&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-problem-details =&amp;gt; mezzio/mezzio-problem-details&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-servicemanager =&amp;gt; laminas/laminas-servicemanager&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-stdlib =&amp;gt; laminas/laminas-stdlib&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zendframework/zend-stratigility =&amp;gt; laminas/laminas-stratigility&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zfcampus/zf-composer-autoloading =&amp;gt; laminas/laminas-composer-autoloading&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;zfcampus/zf-development-mode =&amp;gt; laminas/laminas-development-mode&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
El proceso de actualización es bastante sencillo y automático, lo unico que necesitamos es el paquete para la migración, que instalaremos con composer
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;# composer global require laminas/laminas-migration
Changed current directory to /root/.composer
Using version ^1.1 for laminas/laminas-migration
./composer.json has been created
Loading composer repositories with information
Updating dependencies (including require-dev)
operations: 7 installs, 0 updates, 0 removals
  - Installing psr/container (1.0.0): Loading from cache
  - Installing symfony/service-contracts (v2.0.1): Loading from cache
  - Installing symfony/polyfill-php73 (v1.14.0): Downloading (100%)
  - Installing symfony/polyfill-mbstring (v1.14.0): Downloading (100%)
  - Installing symfony/console (v5.0.5): Downloading (100%)
  - Installing laminas/laminas-zendframework-bridge (1.0.1): Downloading (100%)
  - Installing laminas/laminas-migration (1.1.0): Downloading (100%)
symfony/service-contracts suggests installing symfony/service-implementation
symfony/console suggests installing symfony/event-dispatcher
symfony/console suggests installing symfony/lock
symfony/console suggests installing symfony/process
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Luego debemos asegurarnos que el directorio de composer está en el path
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;# composer global config home
Changed current directory to /root/.composer
/root/.composer
# export PATH=/root/.composer/vendor/bin:$PATH
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Y ejecutamos el asistente
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;# laminas-migration migrate -e data

Migrating project at path &quot;/usr/share/nginx/html/api&quot; to Laminas
================================================================

Injecting laminas-dependency-plugin into composer.json
Performing migration replacements
Injecting Laminas\ZendFrameworkBridge\ConfigPostProcessor into /usr/share/nginx/html/api/config/config.php

                                                                                                                        
 [OK] Migration complete!                                                                                               
                                                                                                                        

 Next steps:
 - Perform a diff to verify the changes made.
 - Run &quot;composer install&quot;.
 - Run any tests (unit tests, integration tests, end-to-end tests, etc.).
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Es muy importante el parámetro -e porque aqui debemos incluir todos nuestros directorios de datos que no contengan código (imágenes, backups, etc...), porque de no hacerlo tendremos error de memoria.
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 285822984 bytes) 
in /root/.composer/vendor/laminas/laminas-zendframework-bridge/src/Replacements.php on line 30
&lt;/pre&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/2267638583110334850?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/2267638583110334850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/2267638583110334850'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2020/04/migrando-zend-expressive-mezzio.html' title='Migrando zend expressive a mezzio'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibjTWRfiZSGPSYLUwoy0YfA6PW3jYxZm0HqDFJeTPbYJQknZP2UAX3FTIlKVTyuRpYDUwZsQeySlEQJbaEy-QVtiMNIOhJGOGk0hsIsqMOnhSwYXAqf8GtfbvN-qiLtMFfnIeyutLmG8s/s72-c/EWSJMZjX0AAni7H.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-355814880828773691</id><published>2020-02-25T13:12:00.004+01:00</published><updated>2020-02-25T13:12:39.784+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="centos"/><category scheme="http://www.blogger.com/atom/ns#" term="dnf"/><category scheme="http://www.blogger.com/atom/ns#" term="imagemagick"/><category scheme="http://www.blogger.com/atom/ns#" term="librerías php"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="php7"/><category scheme="http://www.blogger.com/atom/ns#" term="yum"/><title type='text'>CentOS 8 ahora viene con DNF</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Uno de los cambios más radicales en CentOS 8 ha sido la sustitución del gestor de paquetes YUM por DNF, en la mayoría de los sitios comentan que la transición es casi trivial, pero esto no es del todo cierto, en este post veremos algunas consideraciones sobre este cambio.&lt;/div&gt;
&lt;br /&gt;
Primero veamos las 3 razones que se esgrimen para haber levado a cabo este cambio:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;La documentación de yum es casi inexistente para ampliar su funcionalidad&lt;/li&gt;
&lt;li&gt;YUM no soporta Python 3&lt;/li&gt;
&lt;li&gt;El gestor de dependencias utilizado por DNF es más estándar, ya vine siendo utilizado por SUSE hace mucho tiempo dentro de zypper.&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Ahora bien, pese a que la sintaxis es básicamente la misma el manejo de repositorios no lo es tanto, se van a poder agregar como se hacía con YUM, incluso dejando en el mismo directorio los archivos .repo pero algunas cosas cambian, en mi caso pondré las diferencias para trabajar con algunas librerías de PHP. Por ejemplo, en vez de habilitar diferentes repos para una u otra versión ahora se habilita un módulo para la versión de PHP y las librerías se instalan utilizando ese modulo.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;dnf module -y install php:remi-7.4
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Para instalar repositorios podemos hacerlo de la siguiente manera si es un archivo .repo
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;dnf -y install dnf-plugins-core
dnf config-manager --add-repo https://xxxxxx/xxxxxx.repo
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
O si viene dentro de un .rpm
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;dnf -y install https://xxxxxx/xxxxxx.rpm
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Una de las diferencias que he notado es que con este sistema de módulos algunos repos no vienen activos por defecto, con lo cual no se resuelven correctamente las dependencias, por ejemplo, dan problemas las librerías de mongodb e imagick, para instalarlas es necesario especificar el repo de sus dependencias, un paso más que no teníamos con YUM.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;dnf --enablerepo=PowerTools -y install tinyxml2
dnf -y install mediainfo php-pecl-imagick

dnf --enablerepo=remi -y install libbson mongo-c-driver
dnf -y install php-pecl-mongodb
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Los errores de no hacerlo así serían los siguientes&lt;br /&gt;
&lt;/div&gt;
&lt;pre&gt;Problem 1: cannot install the best candidate for the job
- nothing provides libbson(x86-64) &amp;gt;= 1.16.1 needed by php-pecl-mongodb-1.7.1-1.el8.remi.7.4.x86_64
- nothing provides mongo-c-driver-libs(x86-64) &amp;gt;= 1.16.1 needed by php-pecl-mongodb-1.7.1-1.el8.remi.7.4.x86_64
Problem 2: package mediainfo-19.09-1.el8.x86_64 requires libmediainfo.so.0()(64bit), but none of the providers can be installed
- conflicting requests
- nothing provides libtinyxml2.so.6()(64bit) needed by libmediainfo-19.09-1.el8.x86_64
&lt;/pre&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/355814880828773691?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/355814880828773691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/355814880828773691'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2020/02/centos-8-ahora-viene-con-dnf.html' title='CentOS 8 ahora viene con DNF'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-5611881704834742136</id><published>2020-02-12T11:46:00.000+01:00</published><updated>2020-02-12T11:46:04.890+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="curiosidades"/><category scheme="http://www.blogger.com/atom/ns#" term="detalles"/><category scheme="http://www.blogger.com/atom/ns#" term="microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="queries"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>SQL Server, columnas calculadas</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Aquí os dejo algunos apuntes básicos sobre las columnas calculadas en SQL Server.&lt;/div&gt;
&lt;h3&gt;
¿Cuando se calculan?&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Depende de cómo defina la columna calculada. Una columna calculada PERSISTIDA se calculará y luego se almacenará como datos dentro de la tabla al ser creada. Si no define la columna como PERSISTIDA, se calculará cada vez que se ejecute una consulta que la incluya.&lt;br /&gt;
&lt;br /&gt;
Mas info &lt;a href=&quot;https://blog.sqlauthority.com/2010/07/27/sql-server-computed-column-persisted-and-storage/&quot;&gt;aquí&lt;/a&gt;.&lt;/div&gt;
&lt;h3&gt;
Tablas temporales o versionadas&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
La modificación del esquema de una tabla versionada por el sistema (tablas temporales) falla porque no se admite agregar una columna calculada mientras el versionado del sistema está activado. Para solucionarlo:
&lt;/div&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Primero desactivar el versionado&lt;/li&gt;
&lt;li&gt;Luego agregar la columna calculada a la tabla base&lt;/li&gt;
&lt;li&gt;Verificar el tipo de la columna calculada resultante&lt;/li&gt;
&lt;li&gt;Agregar la columna con el tipo estático apropiado a la tabla de historial (tabla temporal o tabla versionada)&lt;/li&gt;
&lt;li&gt;Volver a activar el versionado&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Otra cosa a tener en cuenta es que una columna calculada que utiliza una función definida por el usuario no está permitida dentro de una tabla temporal porque realiza el acceso a los datos del usuario o del sistema, o se supone que realiza este acceso. Se asume que una función realiza de forma predeterminada el acceso a datos si no está &lt;a href=&quot;https://sqlstudies.com/2014/08/06/schemabinding-what-why/&quot;&gt;vinculada al esquema&lt;/a&gt; (schemabound).
&lt;/div&gt;
&lt;h3&gt;
Persistir columna no determinista&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Una columna calculada no se puede persistir si la columna no es determinista.
&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Las funciones deterministas siempre devuelven el mismo resultado cada vez que se llaman con un conjunto específico de valores de entrada y el mismo estado de la base de datos. Las funciones no deterministas pueden devolver resultados diferentes cada vez que se llaman con un conjunto específico de valores de entrada, incluso si el estado de la base de datos al que acceden sigue siendo el mismo. Por ejemplo, la función AVG siempre devuelve el mismo resultado si los datos no cambian, pero la función GETDATE, que devuelve el valor actual de fecha y hora, siempre devuelve un resultado diferente. Mas información &lt;a href=&quot;https://docs.microsoft.com/en-us/sql/relational-databases/user-defined-functions/deterministic-and-nondeterministic-functions&quot;&gt;aquí&lt;/a&gt; y &lt;a href=&quot;http://stackoverflow.com/questions/14124439/cannot-persist-computed-column-not-deterministic&quot;&gt;aquí&lt;/a&gt;.
&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/5611881704834742136?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/5611881704834742136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/5611881704834742136'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2020/02/sql-server-columnas-calculadas.html' title='SQL Server, columnas calculadas'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-7568477014752444244</id><published>2020-02-10T17:46:00.001+01:00</published><updated>2020-02-10T17:46:58.174+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="curiosidades"/><category scheme="http://www.blogger.com/atom/ns#" term="estadísticas"/><category scheme="http://www.blogger.com/atom/ns#" term="instalaciones"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="php7"/><category scheme="http://www.blogger.com/atom/ns#" term="proyectos"/><title type='text'>Ciclos de lanzamiento en PHP, curiosidades</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
A raíz de la cada vez más cercana versión 8 de PHP y sus &lt;a href=&quot;https://stitcher.io/blog/new-in-php-8&quot;&gt;esperadas mejoras&lt;/a&gt; han surgido algunos bulos sobre su fecha de lanzamiento, hasta ser confirmada finalmente el 10 de febrero con el siguiente tweet:&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdW8VbDETE5pUpk8DbwbOFO8PavtNs4uSrWV19eAd2MLebwuzvD2Xt9OHAoe-r3qvGegzljneNV85_-KLKD_jCL4z1kSALU9olD6VXYmeaqBtqys8ngjan62iQvrHSfek7AXMxrkUTGXg/s1600/Captura+de+pantalla+2020-02-10+a+las+17.00.22.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;740&quot; data-original-width=&quot;1180&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdW8VbDETE5pUpk8DbwbOFO8PavtNs4uSrWV19eAd2MLebwuzvD2Xt9OHAoe-r3qvGegzljneNV85_-KLKD_jCL4z1kSALU9olD6VXYmeaqBtqys8ngjan62iQvrHSfek7AXMxrkUTGXg/s640/Captura+de+pantalla+2020-02-10+a+las+17.00.22.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
En este tweet se habla de los ciclos de lanzamiento de PHP, puede parecer algo trivial o sin importancia, pero desde la versión 7, no sólo ha mejorado el lenguaje, sino la forma de trabajar del equipo de desarrollo. Si tomamos por ejemplo los 414 lanzamientos que se han publicado desde junio de 2003, de ellos 27 alfas, 30 betas y 52 candidatas, podemos ver una mayor organización y previsible agenda en los mismos.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Por citar un ejemplo, mientras en php 5 no siempre se publicaban alfas, betas o RC, en php 7 si, y además periódicamente, las versiones 0,1,2,3 y 4 de php 7 comparten los mismo tiempos, desde el lanzamiento de la primera beta hasta el lanzamiento de la primera versión candidata pasan exactamente 42 días, y también para la mayoría de transiciones de alfa a beta (7.1, 7.2 y 7.4), el paso de RC a versión estable si es ligeramente diferente, en php 5 la horquilla era desde 42 días con php 5.5 a 117 con la 5.0, mientras en php 7 van desde los 84 a los 104 días.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwZLCCgzW-U6Apx2PXcsJ2aTKQ2hSjJ8P_rdmF0xvR9ffMBOY8jo7S2QAmxN6vc-uJM0YpjnFw88pVFy8TBTCCvr6L7n_R67Bzv5PEmQcNVPOFYLyaT7fiU-YHCKnOa2PzXKQQYFx8NmQ/s1600/Imagen+1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;772&quot; data-original-width=&quot;1108&quot; height=&quot;445&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwZLCCgzW-U6Apx2PXcsJ2aTKQ2hSjJ8P_rdmF0xvR9ffMBOY8jo7S2QAmxN6vc-uJM0YpjnFw88pVFy8TBTCCvr6L7n_R67Bzv5PEmQcNVPOFYLyaT7fiU-YHCKnOa2PzXKQQYFx8NmQ/s640/Imagen+1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
De los lanzamientos también podemos deducir que el día preferido para sacar una nueva versión es el jueves, se nota claramente en el siguiente gráfico, y como nota importante, en php 7 no han tenido lanzamientos los fines de semana, con php 5 si, concretamente 5 (4 en sábado y 1 en domingo).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBjSkoQZXoJCNieHgLuaZPFZd2GDySE4y-GQWMLtbj3BqLQYGbqswTf2wLaIhIHCC_MdBcpp9By2oy9HgzE_sG4PTan1R4PE9Csc06V3estqNAxZk8uvXA6jvYdwUQrKZC_5lTZv8zHN0/s1600/Imagen+2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;452&quot; data-original-width=&quot;750&quot; height=&quot;384&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBjSkoQZXoJCNieHgLuaZPFZd2GDySE4y-GQWMLtbj3BqLQYGbqswTf2wLaIhIHCC_MdBcpp9By2oy9HgzE_sG4PTan1R4PE9Csc06V3estqNAxZk8uvXA6jvYdwUQrKZC_5lTZv8zHN0/s640/Imagen+2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Reafirmando el tweet de &lt;a href=&quot;https://twitter.com/nikita_ppv&quot;&gt;Nikita Popov&lt;/a&gt; podemos ver que en php 7 los lanzamientos de versiones iniciales (me refiero a 7.0.0, 7.1.0, etc) siempre han sido en noviembre o diciembre, no así con php 5 donde 7 lanzamientos de este tipo se hicieron en 5 meses distintos.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Y para terminar os dejo estos 3 gráficos, el primero con la evolución en el tiempo de cada lanzamiento, el segundo con la vida útil de cada uno (teniendo en cuenta el tiempo de desarrollo como el tiempo que pasa entre la primera beta o alfa publicada y la publicación de la versión 0 y tiempo en producción desde esta versión 0 hasta la última actualización publicada) y el tercero para ver cómo se han solapado las diferentes versiones en el tiempo.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU8oeNjgTSrY7Cq9b-cBEHtTr2uWFSQnP9Kk3w1hic_wzepGxglIAR2LJY6NxhmUn7pRG7Q5m5q0nD4Z8lmUu6DADfKBT-qL-3md0HociW4ox6CDXAEOMK-gv3M1l_8V0vtfxkppRl2f4/s1600/Imagen+3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;545&quot; data-original-width=&quot;827&quot; height=&quot;420&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU8oeNjgTSrY7Cq9b-cBEHtTr2uWFSQnP9Kk3w1hic_wzepGxglIAR2LJY6NxhmUn7pRG7Q5m5q0nD4Z8lmUu6DADfKBT-qL-3md0HociW4ox6CDXAEOMK-gv3M1l_8V0vtfxkppRl2f4/s640/Imagen+3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoyvFjB2u0QEAAbGlowzm6SZzqramwMFoscYdplF0_gVl6TCo9JKZ50RvRiULgDsukZl76Z20r10CbOOGuXWKLsmFPkOoAEGW-qe411WjV7_i27PJhO7hX6302q_wk3JflvBOzeKrC-2A/s1600/Imagen+4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;452&quot; data-original-width=&quot;827&quot; height=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoyvFjB2u0QEAAbGlowzm6SZzqramwMFoscYdplF0_gVl6TCo9JKZ50RvRiULgDsukZl76Z20r10CbOOGuXWKLsmFPkOoAEGW-qe411WjV7_i27PJhO7hX6302q_wk3JflvBOzeKrC-2A/s640/Imagen+4.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMwC4kv63TikoR5nh_W-iWafWGCFzaY0-pkZvmpqVjnMzgXkzP0VdwCsYC6JKU8bL8yyWJSkvjAcIQMyJPcIo7EjDmbMfWBPOPaB38gTTh5D2Q7tjWhPFzJ3h7bXewqAwQDiojcr6kaCw/s1600/Imagen+5.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1247&quot; data-original-width=&quot;1339&quot; height=&quot;596&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMwC4kv63TikoR5nh_W-iWafWGCFzaY0-pkZvmpqVjnMzgXkzP0VdwCsYC6JKU8bL8yyWJSkvjAcIQMyJPcIo7EjDmbMfWBPOPaB38gTTh5D2Q7tjWhPFzJ3h7bXewqAwQDiojcr6kaCw/s640/Imagen+5.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Si queréis la base de datos dejadme un comentario y os paso la tabla.&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/7568477014752444244?isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/7568477014752444244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/7568477014752444244'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2020/02/ciclos-de-lanzamiento-en-php.html' title='Ciclos de lanzamiento en PHP, curiosidades'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdW8VbDETE5pUpk8DbwbOFO8PavtNs4uSrWV19eAd2MLebwuzvD2Xt9OHAoe-r3qvGegzljneNV85_-KLKD_jCL4z1kSALU9olD6VXYmeaqBtqys8ngjan62iQvrHSfek7AXMxrkUTGXg/s72-c/Captura+de+pantalla+2020-02-10+a+las+17.00.22.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-957890813079283931</id><published>2020-02-10T16:00:00.000+01:00</published><updated>2020-02-10T16:00:02.182+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="actualizaciones"/><category scheme="http://www.blogger.com/atom/ns#" term="brew"/><category scheme="http://www.blogger.com/atom/ns#" term="catalina"/><category scheme="http://www.blogger.com/atom/ns#" term="comandos"/><category scheme="http://www.blogger.com/atom/ns#" term="imagemagick"/><category scheme="http://www.blogger.com/atom/ns#" term="instalaciones"/><category scheme="http://www.blogger.com/atom/ns#" term="librerías php"/><category scheme="http://www.blogger.com/atom/ns#" term="macos"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="php7"/><title type='text'>Instalar libreria PHP image magick en MacOS Catalina</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji2kQdG8DEqG7Ymt-KNMaIZg91lSlQ6ikNh49yAqo_zgeBGVbX9z670fYymKuHK9Qw-p5hG6IAoBo15Ve705vx8Xk40hgQZSpOZq2kQ182w3gAdEaTlG8mAGCJL09oGz1TLaL730Y0yLw/s1600/logo_liquid-60.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;284&quot; data-original-width=&quot;475&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji2kQdG8DEqG7Ymt-KNMaIZg91lSlQ6ikNh49yAqo_zgeBGVbX9z670fYymKuHK9Qw-p5hG6IAoBo15Ve705vx8Xk40hgQZSpOZq2kQ182w3gAdEaTlG8mAGCJL09oGz1TLaL730Y0yLw/s1600/logo_liquid-60.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Primero necesitamos instalar los pre requisitos, en caso que no los tengamos&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;brew install imagemagick
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Luego ejecutamos la instalación con PECL y le damos INTRO a cada pregunta para aceptar los valores por defecto&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;pecl install imagick

Please provide the prefix of ImageMagick installation [autodetect] : 
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Ignorar los siguientes errores&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;cp: /private/tmp/pear/temp/imagick/build/php.m4: Permission denied
cp: /private/tmp/pear/temp/imagick/build/shtool: Permission denied
cp: /private/tmp/pear/temp/imagick/build/libtool.m4: Permission denied
cp: /private/tmp/pear/temp/imagick/build/ax_check_compile_flag.m4: Permission denied
cp: /private/tmp/pear/temp/imagick/build/ax_gcc_func_attribute.m4: Permission denied
cp: /private/tmp/pear/temp/imagick/build/php_cxx_compile_stdcxx.m4: Permission denied
cp: /private/tmp/pear/temp/imagick/build/pkg.m4: Permission denied
cp: /private/tmp/pear/temp/imagick/build/config.guess: Permission denied
cp: /private/tmp/pear/temp/imagick/build/config.sub: Permission denied
cp: /private/tmp/pear/temp/imagick/build/ltmain.sh: Permission denied
cp: /private/tmp/pear/temp/imagick/build/Makefile.global: Permission denied
cp: /private/tmp/pear/temp/imagick/run-tests.php: Permission denied
&lt;/pre&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/957890813079283931?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/957890813079283931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/957890813079283931'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2020/02/instalar-libreria-php-image-magick-en.html' title='Instalar libreria PHP image magick en MacOS Catalina'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji2kQdG8DEqG7Ymt-KNMaIZg91lSlQ6ikNh49yAqo_zgeBGVbX9z670fYymKuHK9Qw-p5hG6IAoBo15Ve705vx8Xk40hgQZSpOZq2kQ182w3gAdEaTlG8mAGCJL09oGz1TLaL730Y0yLw/s72-c/logo_liquid-60.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-6886543666924373861</id><published>2020-02-06T12:09:00.000+01:00</published><updated>2020-02-06T12:09:47.618+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="actualizaciones"/><category scheme="http://www.blogger.com/atom/ns#" term="brew"/><category scheme="http://www.blogger.com/atom/ns#" term="cache"/><category scheme="http://www.blogger.com/atom/ns#" term="catalina"/><category scheme="http://www.blogger.com/atom/ns#" term="comandos"/><category scheme="http://www.blogger.com/atom/ns#" term="compilar"/><category scheme="http://www.blogger.com/atom/ns#" term="librerías php"/><category scheme="http://www.blogger.com/atom/ns#" term="macos"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="php7"/><title type='text'>Instalar librería memcached para PHP en MacOS Catalina</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbzveRuj-e3PMRcDQO5A83C2R7IaNQsVM30XTH-GbgEzHCkonPjh1UFbhEafqA6LxpiVpK3Z-Q7Klg5wGNHErDDSb6_mCgH3X98K4K075VSfRRpbXR4JlIe-GIqeLVwZPhDXqOkmZgD9M/s1600/vulnerabilidades-servidores-memcached.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;355&quot; data-original-width=&quot;690&quot; height=&quot;328&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbzveRuj-e3PMRcDQO5A83C2R7IaNQsVM30XTH-GbgEzHCkonPjh1UFbhEafqA6LxpiVpK3Z-Q7Klg5wGNHErDDSb6_mCgH3X98K4K075VSfRRpbXR4JlIe-GIqeLVwZPhDXqOkmZgD9M/s640/vulnerabilidades-servidores-memcached.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Primero necesitamos instalar los pre requisitos, en caso que no los tengamos&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;brew install zlib
brew install pkg-config
brew install libmemcached
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Luego ejecutamos la instalación con PECL y le damos INTRO a cada pregunta para aceptar los valores por defecto&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;pecl install memcached

libmemcached directory [no] : 
zlib directory [no] : 
use system fastlz [no] : 
enable igbinary serializer [no] : 
enable msgpack serializer [no] : 
enable json serializer [no] : 
enable server protocol [no] : 
enable sasl [yes] : 
enable sessions [yes] : 
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Ignorar el siguiente error&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;Warning: Use of undefined constant name - assumed &#39;name&#39; (this will throw an Error in a future version of PHP) in Builder.php on line 407&lt;/pre&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/6886543666924373861?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/6886543666924373861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/6886543666924373861'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2020/02/instalar-libreria-memcached-para-php-en.html' title='Instalar librería memcached para PHP en MacOS Catalina'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbzveRuj-e3PMRcDQO5A83C2R7IaNQsVM30XTH-GbgEzHCkonPjh1UFbhEafqA6LxpiVpK3Z-Q7Klg5wGNHErDDSb6_mCgH3X98K4K075VSfRRpbXR4JlIe-GIqeLVwZPhDXqOkmZgD9M/s72-c/vulnerabilidades-servidores-memcached.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-7154912959604217451</id><published>2020-02-05T12:35:00.002+01:00</published><updated>2020-02-05T12:35:45.183+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><category scheme="http://www.blogger.com/atom/ns#" term="traducciones"/><category scheme="http://www.blogger.com/atom/ns#" term="tutoriales"/><title type='text'>SQL Server schemabinding</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Este post es una traducción al castellano de este &lt;a href=&quot;https://sqlstudies.com/2014/08/06/schemabinding-what-why/&quot;&gt;otro&lt;/a&gt;. &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Cuando se utiliza la palabra clave SchemaBinding al crear una vista o función, lo que hace es vincular la estructura a las tablas o vistas subyacentes. ¿Qué significa? Significa que mientras un objeto exista como un objeto vinculado, está limitado en los cambios que se pueden realizar sobre él por las tablas o vistas que lo referencian. Si una tabla es referenciada por una función o vista vinculada, &lt;b&gt;solo las columnas a las que hace referencia la función o la vista no se pueden modificar&lt;/b&gt;, el resto si.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Cuando tienes objetos vinculados en una base de datos:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;No puedes cambiar la intercalación (collation) de la base de datos.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;No puedes usar SELECT * en las vistas vinculadas.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;No puedes ejecutar sp_refreshview en las vistas vinculadas.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Puedes realizar cualquier cambio en la tabla origen que no afecte la estructura de las columnas enlazadas.&lt;/li&gt;
&lt;li&gt;Puedes averiguar si un objeto está vinculado al esquema mirando la columna is_schema_bound en sys.sql_modules o la función del sistema OBJECTPROPERTY (object_id, ‘is_schema_bound’).&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Si haces referencia a una vista o función en una vista o función vinculada, entonces esa vista o función también debe estar vinculada.&lt;/li&gt;
&lt;li&gt;Los objetos que están vinculados (tablas / vistas) no se pueden borrar mientras otro objeto los referencia.&lt;/li&gt;
&lt;li&gt;Los objetos que están vinculados al esquema pueden cambiar su definición, pero los objetos a los que hacen referencia los objetos vinculados al esquema no pueden cambiar su definición. O sea, puedes cambiar la vista vinculada pero no los campos de las tablas de origen.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
El enlace de esquema establece efectivamente que los metadatos que se crean en el momento de la creación del objeto pueden ser confiables en todo momento y no es necesario el uso de sp_refreshsqlmodule.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
El enlace de esquema también puede aumentar significativamente el rendimiento de las funciones definidas por el usuario.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Aún así &lt;b&gt;schemabinding&lt;/b&gt; no es una herramienta de uso común, cada vez es más frecuente a raiz de las vistas indexadas, pero no exclusivamente. Se puede utilizar también para bloquear la estructura de una vista o función crítica pues, al incluir esta cláusula, se protege la vista o función de cambios inesperados en las tablas subyacentes &lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/7154912959604217451?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/7154912959604217451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/7154912959604217451'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2020/02/sql-server-schemabinding.html' title='SQL Server schemabinding'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-8665962101017284076</id><published>2020-02-04T15:20:00.004+01:00</published><updated>2020-02-04T16:09:51.833+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="actualizaciones"/><category scheme="http://www.blogger.com/atom/ns#" term="brew"/><category scheme="http://www.blogger.com/atom/ns#" term="catalina"/><category scheme="http://www.blogger.com/atom/ns#" term="comandos"/><category scheme="http://www.blogger.com/atom/ns#" term="configuraciones"/><category scheme="http://www.blogger.com/atom/ns#" term="instalaciones"/><category scheme="http://www.blogger.com/atom/ns#" term="librerías php"/><category scheme="http://www.blogger.com/atom/ns#" term="macos"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="php7"/><title type='text'>Instalar PHP 7.4+ en MacOS Catalina 10.15+</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhFJinEnNUcE9ar2v2PbSnxrOkQcw4ihjlIhrny0KAlQemeUw24uohb3SWbD7hI5iB080sKfkTtLn-CiZxUsHeodajQfqHWXeF9kyUuZMdxpdGtyVFV1EcUhUPaQLobhm8cfot7hGRP8o/s1600/unnamed.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;193&quot; data-original-width=&quot;512&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhFJinEnNUcE9ar2v2PbSnxrOkQcw4ihjlIhrny0KAlQemeUw24uohb3SWbD7hI5iB080sKfkTtLn-CiZxUsHeodajQfqHWXeF9kyUuZMdxpdGtyVFV1EcUhUPaQLobhm8cfot7hGRP8o/s1600/unnamed.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp; &lt;br /&gt;
Ahora instalar PHP es muchísimo más sencillo en Mac, con un solo comando podemos hacerlo tal y como se hace en CentOS.&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;brew install php
php -v
PHP 7.4.2 (cli) (built: Jan 22 2020 06:30:58) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Si la versión de PHP no es la última, es posible que hayas instalado una versión previa &lt;a href=&quot;https://php-osx.liip.ch/&quot;&gt;utilizando el script de liip&lt;/a&gt;, si es tu caso te recomiendo desinstalarlo, el problema es si liip te lo ha instalado en &lt;i&gt;/usr/bin/php&lt;/i&gt; en vez de &lt;i&gt;/usr/local/bin/php&lt;/i&gt;, que seguramente es tu caso porque brew lo instala en esta última ubicación.&lt;/div&gt;
&lt;h3&gt;
Desisntalar PHP instalado con liip&lt;/h3&gt;
&lt;pre&gt;sudo rm -rf /usr/local/php*
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Luego necesitas &lt;a href=&quot;http://osxdaily.com/2015/10/05/disable-rootless-system-integrity-protection-mac-os-x/&quot;&gt;deshabilitar System Integrity Protection&lt;/a&gt;, para ello tienes que reiniciar en modo recuperación (Command + R) y sin elegir ninguna opción del menú, ir al Terminal y ejecutar &lt;i&gt;csrutil disable&lt;/i&gt;, para más info puedes consultar este otro enlace. Una vez deshabilitado, reinicias y puedes borrar el archivo &lt;i&gt;rm -rf /usr/bin/php&lt;/i&gt;.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Con estos sencillos pasos deberías tener habilitado php en su última versión. En un futuro para actualizarlo bastaría con ejecutar brew upgrade php.&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/8665962101017284076?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/8665962101017284076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/8665962101017284076'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2020/02/instalar-php-74-en-macos-catalina-1015.html' title='Instalar PHP 7.4+ en MacOS Catalina 10.15+'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhFJinEnNUcE9ar2v2PbSnxrOkQcw4ihjlIhrny0KAlQemeUw24uohb3SWbD7hI5iB080sKfkTtLn-CiZxUsHeodajQfqHWXeF9kyUuZMdxpdGtyVFV1EcUhUPaQLobhm8cfot7hGRP8o/s72-c/unnamed.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-8788554962329219869</id><published>2019-07-31T16:21:00.001+02:00</published><updated>2019-07-31T16:21:14.031+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="actualizaciones"/><category scheme="http://www.blogger.com/atom/ns#" term="configuraciones"/><category scheme="http://www.blogger.com/atom/ns#" term="macos"/><category scheme="http://www.blogger.com/atom/ns#" term="osx"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="shell"/><category scheme="http://www.blogger.com/atom/ns#" term="terminal"/><title type='text'>Actualizar a PHP 7.3+ en MacOS Mojave 10.14+</title><content type='html'>Mac suele venir con alguna versión de PHP, pero al igual que CentOs estas versiones nunca son las últimas. Buscando por internet hay muchísimos manuales que te permiten actualizar a la última versión de PHP en MacOS, pero todo son para apache, si necesitas ejecutar PHP en el terminal siempre vas a tener la versión por defecto. Por suerte este se puede modificar muy fácilmente.&lt;br /&gt;
&lt;br /&gt;
Para instalarlo he seguido los pasos de este &lt;a href=&quot;https://coolestguidesontheplanet.com/upgrade-php-on-osx/&quot;&gt;manual&lt;/a&gt;, que, aunque en la página oficial diga que el soporte es hasta la versión 10.13 de OSX para la 10.14 también funciona.&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos editar nuestro terminal para que la versión sea la correcta, esto lo haremos de manera sencilla así:&lt;br /&gt;
&lt;br /&gt;
nano ~/.bash_profile&lt;br /&gt;
&lt;br /&gt;
Agregamos la siguiente línea&lt;br /&gt;
&lt;br /&gt;
export PATH=&quot;/usr/local/php5/bin:$PATH&quot;&lt;br /&gt;
&lt;br /&gt;
CTRL+O CTRL+X&lt;br /&gt;
&lt;br /&gt;
source ~/.bash_profile&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit-TVO1TxmgzVLuiL4GpHaTGWevRS2hRwI0vtcYhS7Gq5YzcXfc8EMFqFk8-XdNyHhyphenhyphenHs43SctfU-9yK4yeNufh_iKFeEfcVeR1n6mJUc560L5Zcy-YjAepzRCX2zaG4TkfFv_0f-o8Xs/s1600/Captura+de+pantalla+2019-07-31+a+las+16.19.11.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;139&quot; data-original-width=&quot;552&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit-TVO1TxmgzVLuiL4GpHaTGWevRS2hRwI0vtcYhS7Gq5YzcXfc8EMFqFk8-XdNyHhyphenhyphenHs43SctfU-9yK4yeNufh_iKFeEfcVeR1n6mJUc560L5Zcy-YjAepzRCX2zaG4TkfFv_0f-o8Xs/s1600/Captura+de+pantalla+2019-07-31+a+las+16.19.11.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/8788554962329219869?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/8788554962329219869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/8788554962329219869'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2019/07/actualizar-php-73-en-macos-mojave-1014.html' title='Actualizar a PHP 7.3+ en MacOS Mojave 10.14+'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit-TVO1TxmgzVLuiL4GpHaTGWevRS2hRwI0vtcYhS7Gq5YzcXfc8EMFqFk8-XdNyHhyphenhyphenHs43SctfU-9yK4yeNufh_iKFeEfcVeR1n6mJUc560L5Zcy-YjAepzRCX2zaG4TkfFv_0f-o8Xs/s72-c/Captura+de+pantalla+2019-07-31+a+las+16.19.11.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-3369258520630323210</id><published>2019-01-03T15:50:00.000+01:00</published><updated>2019-01-03T15:50:18.577+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cors"/><category scheme="http://www.blogger.com/atom/ns#" term="expressive"/><category scheme="http://www.blogger.com/atom/ns#" term="graphql"/><category scheme="http://www.blogger.com/atom/ns#" term="psr"/><category scheme="http://www.blogger.com/atom/ns#" term="zend"/><title type='text'>Habilitar CORS en GraphQL y Zend Expressive 3</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Encontré este &lt;a href=&quot;https://akrabat.com/implementing-tuupola-cors-in-expressive/&quot;&gt;artículo&lt;/a&gt; que me dió la pista de como hacerlo, pero es de 2017, con lo cual me encontré con múltiples errores. Aquí os dejo la guía detallada de cómo habilitar CORS para las últimas versiones de GraphQL y demás librerias implicadas.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Instalamos las dependencias&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;composer require tuupola/cors-middleware&lt;/pre&gt;
&lt;pre&gt;composer require zendframework/zend-problem-details&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Creamos la &lt;a href=&quot;https://github.com/sirio3mil/cinema-expressive/blob/master/src/App/src/Factory/CorsMiddlewareFactory.php&quot;&gt;factoría &lt;/a&gt;dónde pondremos nuestros valores por defecto y la gestión de errores en JSON (disponible en github)&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo de dependencias&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;Tuupola\Middleware\CorsMiddleware::class =&amp;gt; App\Factory\CorsMiddlewareFactory::class&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Y por último habilitamos el middleware en pipeline.php&lt;br /&gt;
&lt;/div&gt;
&lt;pre&gt;use Tuupola\Middleware\CorsMiddleware;

...

// $app-&amp;gt;pipe(ImplicitOptionsMiddleware::class);
$app-&amp;gt;pipe(CorsMiddleware::class);
&lt;/pre&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/3369258520630323210?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/3369258520630323210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/3369258520630323210'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2019/01/habilitar-cors-en-graphql-y-zend.html' title='Habilitar CORS en GraphQL y Zend Expressive 3'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-7576320349989646519</id><published>2018-11-12T17:14:00.001+01:00</published><updated>2018-11-12T17:15:14.328+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="off topic"/><title type='text'>Constitución cubana 1976 vs 2018</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Este post es bastante offtopic. Por curiosidad, y sin ser lingüista ni hacer un análisis muy detallado, he pillado la constitución cubana de 1976 y la he comparado con el nuevo proyecto que se quiere aprobar ahora. La comparación no va más allá que ver el uso de las palabras, si algún lingüista le apetece, yo encantado le paso los datos para que haga un análisis más profundo.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIxhsSR1acpqUAL9zlnV2EBzl6q_03gUbzMEicxgO7VcKsQb-iFywkqC4Wv3j4TafsC47BMG8KPXuM89CpztuolXBqa6gUeKtQ8HNHlHa8SdE9-NeBJ9sHrCQFX-7yRWYlaF5q2dyyfqc/s1600/0816-constitucion.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;454&quot; data-original-width=&quot;680&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIxhsSR1acpqUAL9zlnV2EBzl6q_03gUbzMEicxgO7VcKsQb-iFywkqC4Wv3j4TafsC47BMG8KPXuM89CpztuolXBqa6gUeKtQ8HNHlHa8SdE9-NeBJ9sHrCQFX-7yRWYlaF5q2dyyfqc/s1600/0816-constitucion.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
En fin, sin enrrollarme más, vamos al grano.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
¿Qué palabras son las más utlizadas?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Aquí no hay mucha diferencia, ¡qué sorpresa! Quitando artículos, conjunciones, preposiciones, etc..., nos quedaría que en ambas constituciones las palabras más utilizadas son: estado, poder, popular, nacional, ley (leyes), asamblea, consejo, constitución, república.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
¿Qué hay de nuevo?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
En el nuevo proyecto se han agregado alrededor de mil palabras nuevas, entre ellas, las más utilizadas son: conformidad, ministro, gobernador, garantizar, directivos, familias, información, autonomía, inversión, proteger, desastre, magistrados, financiero, etc...&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
¿Qué se ha quitado?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Alrededor de 500 palabras han sido eliminadas en el nuevo documento, entre ellas: agricultores, méritos, gratuita, facilidades, centrales, agropecuaria, escuela, disolver, cuadros, etc...&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Cómo decía antes, aqui no hago ningún análisis profundo, cada uno que saque sus propias conclusiones.&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/7576320349989646519?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/7576320349989646519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/7576320349989646519'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2018/11/consitucion-cubana-1976-vs-2018.html' title='Constitución cubana 1976 vs 2018'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIxhsSR1acpqUAL9zlnV2EBzl6q_03gUbzMEicxgO7VcKsQb-iFywkqC4Wv3j4TafsC47BMG8KPXuM89CpztuolXBqa6gUeKtQ8HNHlHa8SdE9-NeBJ9sHrCQFX-7yRWYlaF5q2dyyfqc/s72-c/0816-constitucion.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-8300246296521639072</id><published>2018-06-29T10:43:00.000+02:00</published><updated>2018-06-29T10:44:36.814+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="api"/><category scheme="http://www.blogger.com/atom/ns#" term="clases php"/><category scheme="http://www.blogger.com/atom/ns#" term="composer"/><category scheme="http://www.blogger.com/atom/ns#" term="curl"/><category scheme="http://www.blogger.com/atom/ns#" term="expressive"/><category scheme="http://www.blogger.com/atom/ns#" term="graphql"/><category scheme="http://www.blogger.com/atom/ns#" term="librerías php"/><category scheme="http://www.blogger.com/atom/ns#" term="php7"/><category scheme="http://www.blogger.com/atom/ns#" term="script php"/><category scheme="http://www.blogger.com/atom/ns#" term="zend"/><title type='text'>GraphQL en Zend Expressive 3</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Voy a intentar hacer una guia de paso a paso para utilizar &lt;a href=&quot;https://graphql.org/learn/&quot;&gt;GraphQL&lt;/a&gt; en &lt;a href=&quot;https://docs.zendframework.com/zend-expressive/&quot;&gt;Zend Expressive 3&lt;/a&gt;. Existe algo de documentación por la red pero, o está incompleta o desactualizada, por eso me he decidido a hacer este manual.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
¿Que vamos a utilizar?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
La última versión de &lt;a href=&quot;https://github.com/zendframework/zend-expressive&quot;&gt;Zend Expressive 3&lt;/a&gt; y la &lt;a href=&quot;https://github.com/webonyx/graphql-php&quot;&gt;implementación de GraphQLpara PHP hecha por webonyx&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Otro día hablaré del por qué Zend Expressive.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
¿Comenzamos?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Lo primero es crear un proyecto&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;$ composer create-project zendframework/zend-expressive-skeleton graphql-expressive
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Recuerda que el directorio graphql-expressive debe estar vacío.&lt;br /&gt;
&lt;br /&gt;
Ahora añadimos las dependencias para GraphQL&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;$ cd graphql-expressive
$ composer require webonyx/graphql-php
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Ahora vamos con el código, lo primero que haremos será configurar un middleware para procesar correctamente las peticiones en JSON, editamos el archivo config/pipeline.php agregando estas dos líneas:&lt;/div&gt;
&lt;pre&gt;use Zend\Expressive\Helper\BodyParams\BodyParamsMiddleware;
...
$app-&amp;gt;pipe(BodyParamsMiddleware::class);
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Primero vamos a crear una clase de registro para los tipos asociados a nuestras consultas, de esta forma nos será más fácil y práctico dividir por objetos las diferentes consultas a nuestra API, yo he decidido ubicarlo en src/App/src/GraphQL con el nombre de TypeRegistry.php y el siguiente contenido:&lt;/div&gt;
&lt;pre&gt;namespace App\GraphQL;

use GraphQL\Type\Definition\ObjectType;

class TypeRegistry
{
    public function get(string $name): ObjectType
    {
        $className = self::getClassName($name);
        return new $className($this);
    }

    protected static function getClassName(string $name): string
    {
        return __NAMESPACE__ . &#39;\\Type\\&#39; . ucfirst($name) . &#39;Type&#39;;
    }
}
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
No entraré en mucho detalle con los tipos pero del código anterior se deduce que estarán ubicados en el namespace App\GraphQL\Type y que la forma de llamarlos será invocando la función get del registro, si el tipo se llama BlogStoryType la llamada sería get(&#39;blogStory&#39;), esta implementación es libre, cada uno la puede hacer cómo mejor le parezca.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Una vez creado el registro y antes de crear la ruta necesitamos especificar el manejador, que lo ubicaremos en src/App/src/Handler con el nombre de GraphQLHandler.php y el siguiente contenido:&lt;/div&gt;
&lt;pre&gt;namespace App\Handler;

use App\GraphQL\TypeRegistry;
use GraphQL\Server\StandardServer;
use GraphQL\Type\Schema;
use GraphQL\Type\SchemaConfig;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Zend\Diactoros\Response\JsonResponse;

class GraphQLHandler implements RequestHandlerInterface
{
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $typeRegistry = new TypeRegistry();
        $config = SchemaConfig::create()
            -&amp;gt;setQuery($typeRegistry-&amp;gt;get(&#39;query&#39;));
        $schema = new Schema($config);
        $server = new StandardServer([
            &#39;schema&#39; =&amp;gt; $schema,
            &#39;queryBatching&#39; =&amp;gt; true,
            &#39;debug&#39; =&amp;gt; true
        ]);
        $response = $server-&amp;gt;executePsrRequest($request);
        return new JsonResponse($response);
    }
}
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Ahora configuramos la ruta en la que recibiremos las peticiones, en mi caso graphql (puede ser cualquiera) y solo admito peticiones por POST, esto ya es a gusto de cada uno.&lt;/div&gt;
&lt;pre&gt;$app-&amp;gt;post(&#39;/graphql&#39;, App\Handler\GraphQLHandler::class, &#39;graphql&#39;);
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Veamos un ejemplo&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
src/App/src/GraphQL/Type/UserType.php&lt;/div&gt;
&lt;pre&gt;namespace App\GraphQL\Type;

use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;

class UserType extends ObjectType
{
    public function __construct()
    {
        parent::__construct([
            &#39;fields&#39; =&amp;gt; [
                &#39;id&#39; =&amp;gt; Type::int(),
                &#39;name&#39; =&amp;gt; Type::string()
            ]
        ]);
    }
}
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
src/App/src/GraphQL/Type/BlogStoryType.php&lt;/div&gt;
&lt;pre&gt;namespace App\GraphQL\Type;

use App\GraphQL\TypeRegistry;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;

class BlogStoryType extends ObjectType
{
    public function __construct(TypeRegistry $types)
    {
        parent::__construct([
            &#39;fields&#39; =&amp;gt; [
                &#39;author&#39; =&amp;gt; [
                    &#39;type&#39; =&amp;gt; $types-&amp;gt;get(&#39;user&#39;),
                    &#39;resolve&#39; =&amp;gt; function (array $blogStory) {
                        $users = [
                            1 =&amp;gt; [
                                &#39;id&#39; =&amp;gt; 1,
                                &#39;name&#39; =&amp;gt; &#39;Smith&#39;
                            ],
                            2 =&amp;gt; [
                                &#39;id&#39; =&amp;gt; 2,
                                &#39;name&#39; =&amp;gt; &#39;Anderson&#39;
                            ]
                        ];
                        return $users[$blogStory[&#39;authorId&#39;]];
                    }
                ],
                &#39;title&#39; =&amp;gt; Type::string()
            ]
        ]);
    }
}
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
src/App/src/GraphQL/Type/QueryType.php&lt;/div&gt;
&lt;pre&gt;namespace App\GraphQL\Type;

use App\GraphQL\TypeRegistry;
use GraphQL\Type\Definition\ObjectType;

class QueryType extends ObjectType
{
    public function __construct(TypeRegistry $types)
    {
        parent::__construct([
            &#39;fields&#39; =&amp;gt; [
                &#39;lastStory&#39; =&amp;gt; [
                    &#39;type&#39; =&amp;gt; $types-&amp;gt;get(&#39;blogStory&#39;),
                    &#39;resolve&#39; =&amp;gt; function () {
                        return [
                            &#39;id&#39; =&amp;gt; 1,
                            &#39;title&#39; =&amp;gt; &#39;Example blog post&#39;,
                            &#39;authorId&#39; =&amp;gt; 1
                        ];
                    }
                ]
            ]
        ]);
    }
}
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Y lo podemos ejecutar por dos vías, o por un script&lt;/div&gt;
&lt;pre&gt;$query = &amp;lt;&amp;lt;&amp;lt;&#39;QL&#39;
{
  lastStory {
    title
    author {
      name
    }
  }
}
QL;

$chObj = curl_init();
curl_setopt($chObj, CURLOPT_URL, &#39;http://graphql.lcl/graphql&#39;);
curl_setopt($chObj, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chObj, CURLOPT_CUSTOMREQUEST, &#39;POST&#39;);
curl_setopt($chObj, CURLOPT_HEADER, true);
curl_setopt($chObj, CURLOPT_VERBOSE, true);
curl_setopt($chObj, CURLOPT_POSTFIELDS, $query);
curl_setopt($chObj, CURLOPT_HTTPHEADER,
    [
        &#39;User-Agent: PHP Script&#39;,
        &#39;Content-Type: application/graphql;charset=utf-8&#39;
    ]
);

$response = curl_exec($chObj);
echo $response;
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
O utilizando la extensión para Firefox o Chrome de Altair GraphQL Client&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWEL7WsLr6xOpgnwCJo9mHe-vTYP6A-jqYVoEd-EkceSQRoSFD1Ql7IJ1IVXgDtlKxW-A2-rsx8uy1hmns-iCqGCzrIvOB_3E-diSKFHTwHC2d23BSlqy_qEo8S1gUtPPUjVd4_iso81Y/s1600/2018-06-29+10_41_17-Altair+-+Firefox+Developer+Edition.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;417&quot; data-original-width=&quot;1387&quot; height=&quot;192&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWEL7WsLr6xOpgnwCJo9mHe-vTYP6A-jqYVoEd-EkceSQRoSFD1Ql7IJ1IVXgDtlKxW-A2-rsx8uy1hmns-iCqGCzrIvOB_3E-diSKFHTwHC2d23BSlqy_qEo8S1gUtPPUjVd4_iso81Y/s640/2018-06-29+10_41_17-Altair+-+Firefox+Developer+Edition.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Es importante saber el content type con el que vamos a hacer nuestras consultas, este método soporta ambos: application/graphql y application/json, la extensión para el navegador utiliza application/json y el ejemplo que os he puesto con curl utiliza application/graphql.&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/8300246296521639072?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/8300246296521639072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/8300246296521639072'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2018/06/graphql-en-zend-expressive-3.html' title='GraphQL en Zend Expressive 3'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWEL7WsLr6xOpgnwCJo9mHe-vTYP6A-jqYVoEd-EkceSQRoSFD1Ql7IJ1IVXgDtlKxW-A2-rsx8uy1hmns-iCqGCzrIvOB_3E-diSKFHTwHC2d23BSlqy_qEo8S1gUtPPUjVd4_iso81Y/s72-c/2018-06-29+10_41_17-Altair+-+Firefox+Developer+Edition.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-8724899250503046061</id><published>2018-04-21T23:32:00.001+02:00</published><updated>2018-04-21T23:32:55.184+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="clases php"/><category scheme="http://www.blogger.com/atom/ns#" term="eloquent"/><category scheme="http://www.blogger.com/atom/ns#" term="frameworks"/><category scheme="http://www.blogger.com/atom/ns#" term="laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="librerías php"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="php7"/><category scheme="http://www.blogger.com/atom/ns#" term="script php"/><title type='text'>Personalizar las tablas users y password_resets en Laravel 5.6</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
La &lt;a href=&quot;https://laravel.com/docs/5.6/authentication&quot;&gt;autenticación en Laravel&lt;/a&gt; es un proceso muy sencillo, pero de tan sencillo personalizarlo tiene sus detalles, en este post veremos como personalizar, en parte, las tablas de usuarios y reinicio de contraseñas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_WMrpwGJKtIGaGuBlUv51QrJRAx5wty4Ir_aWvZ2H73oFxGHdRjXcnOYg8BMoQBngFGvUH4BQHSSVzn-VhpnQwDaQQV8AjX2b36d6UyoSB58uYi_KcEKsYSbNL16hyphenhyphenPjtmpYaQaJTncs/s1600/laravel-56-is-released-5a8c604e2b02a.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;640&quot; data-original-width=&quot;1267&quot; height=&quot;322&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_WMrpwGJKtIGaGuBlUv51QrJRAx5wty4Ir_aWvZ2H73oFxGHdRjXcnOYg8BMoQBngFGvUH4BQHSSVzn-VhpnQwDaQQV8AjX2b36d6UyoSB58uYi_KcEKsYSbNL16hyphenhyphenPjtmpYaQaJTncs/s640/laravel-56-is-released-5a8c604e2b02a.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Según lo estricto que seas con la estructura de tu base de datos y el formato que hayas elegido seguir puede que los valores de los campos y las tablas por defecto de Laravel no sean de tu agrado, como es mi caso, por ejemplo: Laravel prefiere minúsculas y plurales para los nombres de las tablas, yo utilizo UpperCamelCase y singular. Para los nombres de los campos Laravel utiliza guión bajo (underscore) y minúsculas, yo prefiero lowerCamelCase, con lo cual, necesito renombrar los siguientes campos de estas tablas:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;remember_token - rememberToken&amp;nbsp;&lt;/li&gt;
&lt;li&gt;created_at - createdAt&lt;/li&gt;
&lt;li&gt;updated_at&amp;nbsp; - updatedAt&lt;/li&gt;
&lt;li&gt;id - userId &lt;/li&gt;
&lt;/ul&gt;
Y renombrar las tablas:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;users - User&lt;/li&gt;
&lt;li&gt;password_resets - PasswordReset &lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Si utilizas las migraciones de Laravel tienes que cambiar los nombres de las tablas y los campos en los archivos database/migrations/2016_01_01_000000_create_users_table.php y database/migrations/2016_01_01_100000_create_password_resets_table.php. Yo en mi caso no puedo utilizar migraciones porque uso SQL Server 2017 y mi tabla de usuarios es un nodo (graph database) actualmente no soportado por Eloquent.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Superado el paso de las migraciones vayamos al código para personalizar la tabla de usuarios, necesitamos modificar estos dos archivos:&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sirio3mil/cinema/commit/377abfd54c80100b9980830ebcd742a8441172da&quot;&gt;app/User.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;link-gray-dark&quot; href=&quot;https://github.com/sirio3mil/cinema/commit/2c6aab60ed302c63ce1b0313cac3b6cf06a5b85a#diff-0b57c1ea71f6c74b303f196ef2a0ab3f&quot; title=&quot;app/Http/Controllers/Auth/RegisterController.php&quot;&gt;app/Http/Controllers/Auth/RegisterController.php&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Personalizar la tabla password_resets es un poco más complicado pero no imposible, los pasos para hacerlo están en el siguiente &lt;a href=&quot;https://github.com/sirio3mil/cinema/commit/0c76913c6fc7775565cf0cbeb308ce838eea7c17&quot;&gt;commit de github&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Espero que os ayude.&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/8724899250503046061?isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/8724899250503046061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/8724899250503046061'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2018/04/personalizar-las-tablas-users-y.html' title='Personalizar las tablas users y password_resets en Laravel 5.6'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_WMrpwGJKtIGaGuBlUv51QrJRAx5wty4Ir_aWvZ2H73oFxGHdRjXcnOYg8BMoQBngFGvUH4BQHSSVzn-VhpnQwDaQQV8AjX2b36d6UyoSB58uYi_KcEKsYSbNL16hyphenhyphenPjtmpYaQaJTncs/s72-c/laravel-56-is-released-5a8c604e2b02a.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-2367536270383530676</id><published>2018-02-20T09:00:00.000+01:00</published><updated>2018-02-20T09:00:16.106+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cache"/><category scheme="http://www.blogger.com/atom/ns#" term="centos"/><category scheme="http://www.blogger.com/atom/ns#" term="librerías php"/><category scheme="http://www.blogger.com/atom/ns#" term="php7"/><title type='text'>Instalar PHP APCu en CentOS 6.9</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Utilizando los repositorios de &lt;a href=&quot;https://rpms.remirepo.net/&quot;&gt;remi&lt;/a&gt; podemos instalar muy fácilmente APCu siguiendo este comando&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;sudo yum install php-pecl-apcu
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Si os da este error con reiniciar apache o nginx es suficiente.&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;Installing : php-pecl-apcu-bc-1.0.3-6.el6.remi.7.1.x86_64 
PHP Warning:  PHP Startup: Unable to load dynamic library &#39;/usr/lib64/php/modules/apc.so&#39; - /usr/lib64/php/modules/apc.so: undefined symbol: zif_apcu_store in Unknown on line 0
&lt;/pre&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/2367536270383530676?isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/2367536270383530676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/2367536270383530676'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2018/02/instalar-php-apcu-en-centos-69.html' title='Instalar PHP APCu en CentOS 6.9'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-2165339660602105612</id><published>2018-02-19T09:00:00.000+01:00</published><updated>2018-02-19T09:00:08.460+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="centos"/><category scheme="http://www.blogger.com/atom/ns#" term="instalaciones"/><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><category scheme="http://www.blogger.com/atom/ns#" term="yum"/><title type='text'>Instalar última versión de Nodejs en CentOS 7 con yum</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Node proporciona en su web un rpm con los repositorios para instalar sus últimas versiones en CentOs.&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;cd /tmp
sudo curl --silent --location https://rpm.nodesource.com/setup_9.x | sudo bash -
sudo yum install -y nodejs gcc-c++ make
node -v
 v9.5.0
npm -v
 5.6.0
&lt;/pre&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/2165339660602105612?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/2165339660602105612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/2165339660602105612'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2018/02/instalar-ultima-version-de-nodejs-en.html' title='Instalar última versión de Nodejs en CentOS 7 con yum'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-2134095910896441714</id><published>2018-02-16T08:42:00.000+01:00</published><updated>2018-02-16T08:42:17.467+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="centos"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="instalaciones"/><category scheme="http://www.blogger.com/atom/ns#" term="yum"/><title type='text'>Instalar última versión de Git en CentOS 7 con yum</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Gracias a los repositorios del proyecto IUS podemos tener las últimas versiones de Git instaladas con yum en nuestro CentOs, es válido para las versiones 6 y 7 de esta distribución de linux.&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;sudo yum install https://$(rpm -E &#39;%{?centos:centos}%{!?centos:rhel}%{rhel}&#39;).iuscommunity.org/ius-release.rpm
sudo yum install yum-plugin-replace
sudo yum replace git --replace-with git2u
git --version
--- git version 2.16.1
&lt;/pre&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/2134095910896441714?isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/2134095910896441714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/2134095910896441714'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2018/02/instalar-ultima-version-de-git-en.html' title='Instalar última versión de Git en CentOS 7 con yum'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-6276368034731253436</id><published>2018-01-22T22:47:00.000+01:00</published><updated>2018-01-22T22:47:21.205+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="nginx"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="php-fpm"/><category scheme="http://www.blogger.com/atom/ns#" term="php7"/><category scheme="http://www.blogger.com/atom/ns#" term="servicios google"/><title type='text'>PHP en Google compute engine + cloud sql</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Hoy en día los servicios en la nube son una clara alternativa a la hora de alojar un sitio web, ya no es necesario un servidor dedicado con las prestaciones y herramientas que ofrecen Google, Amazon o Azure.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
En el caso de Google existen alternativas más sencillas para alojar un sitio web que las de utilizar compute engine (una maquina virtual), me refiero a app engine, pero a mi parecer se pierde mucho control sobre las prestaciones que queramos tener. En este post pienso hablar de como instalar nginx con soporte para http2 y php 7.2 en una maquina virtual con CentOS 7, además de enseñar a configurarlo para utilizar una base de datos MySQL 5.7 almacenada en el servicio cloud SQL de Google.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A la hora de sar de alta estos servicios es muy recomendable que esten en la misma zona geográfica, tanto la maquina virtual como la instancia de MySQL.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Una vez creada nuestra instancia de maquina virtual &lt;a href=&quot;http://scriptinside.blogspot.com.es/2018/01/centos-7-soporte-para-http2-con-nginx.html&quot;&gt;instalaremos nginx&lt;/a&gt; y comprobaremos su configuración con:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;nginx -V
nginx -t
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Ahora sólo nos queda ejecutarlo como servicio&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;# arrancamos el servicio
# si ejecutas sudo systemctl start nginx -&amp;gt; nginx: [emerg] open() &quot;/var/run/nginx.pid&quot; failed (13: Permission denied)
sudo service nginx start 
# lo habilitamos para que se inicie al iniciar la máquina
sudo systemctl enable nginx
# editamos el archivo de configuracion para permitir la conexión con la ip de la instancia
sudo vim /etc/nginx/conf.d/default.conf
# reinciamos el servicio ya es posible utilizar systemctl 
# sudo systemctl restart nginx
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;a href=&quot;https://scriptinside.blogspot.com/2018/01/microsoft-odbc-17-sql-server-driver-520.html&quot;&gt;Instalamos php&lt;/a&gt; y modificar en el archivo /etc/php-fpm.d/www.conf el usuario que ejecutará el servicio php-fpm para que sea nginx, al igual que el grupo.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;sudo systemctl enable php-fpm
sudo systemctl start php-fpm
sudo chown -R nginx:nginx /var/lib/php
# comprobamos que esté habilitada la conexión con mysql en selinux
getsebool -a | grep httpd_can_network
# si no lo está la habilitamos para evitar este error PHP Warning:  mysqli_connect(): (HY000/2002): Permission denied
sudo setsebool -P httpd_can_network_connect_db 1
# si tenemos alguna carpeta en la cual tendriamos que escribir, habilitamos los permisos en selinux también
sudo chcon -R -t httpd_sys_rw_content_t folder-name
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Así tenemos configurada nuestra instancia, vamos a configurar ahora la conexión con nuestra base de datos.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMk2D3hTQbGJw1zH1pjnsbgC4CnBjWXdqO4QqyesxtKDIxUJGzMQNzBgxY_mgx6qfPLNBi41rAlZJpssuauaadMQuU4m3Cfc9gtuLZuPiYgibwImEydBWoSFcIJ5-J-1mooMqAQhthEgE/s1600/2018-01-19+22_21_23-Visi%25C3%25B3n+general+de+SQL+-+eCine+-+Firefox+Developer+Edition.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;318&quot; data-original-width=&quot;1131&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMk2D3hTQbGJw1zH1pjnsbgC4CnBjWXdqO4QqyesxtKDIxUJGzMQNzBgxY_mgx6qfPLNBi41rAlZJpssuauaadMQuU4m3Cfc9gtuLZuPiYgibwImEydBWoSFcIJ5-J-1mooMqAQhthEgE/s640/2018-01-19+22_21_23-Visi%25C3%25B3n+general+de+SQL+-+eCine+-+Firefox+Developer+Edition.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Lo primero es hacer nuestra ip asignada estática (https://console.cloud.google.com/networking/addresses/list?project=xxxxxx), por defecto es dinámica y no queremos esto a la hora de conectarla a un servicio de Cloud SQL.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxcpCzl_WBGhgjyiKUwSna5GGPOG1NnlumcTb9Wk1kIa5U4ktVC2TXXpFPBf81Onc_xegrRpbve2T2VwyCXLWigLbBexXm8lBK4kaTLk-T1O40WVGzLtNuH50ZIrwy54Q9ivNG7bcJGI0/s1600/2018-01-19+22_19_19-Red+VPC+-+eCine+-+Firefox+Developer+Edition.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;315&quot; data-original-width=&quot;1162&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxcpCzl_WBGhgjyiKUwSna5GGPOG1NnlumcTb9Wk1kIa5U4ktVC2TXXpFPBf81Onc_xegrRpbve2T2VwyCXLWigLbBexXm8lBK4kaTLk-T1O40WVGzLtNuH50ZIrwy54Q9ivNG7bcJGI0/s640/2018-01-19+22_19_19-Red+VPC+-+eCine+-+Firefox+Developer+Edition.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Y por último habilitar esta ip para que se pueda conectar nuestra maquina virtual con PHP.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6LtrgLJ4JdMV3TZGhJPTNecqNBuGbj9pd1WzN_gsAE2db_oiTZJkJO3QlgUkBmDPbAgX08-QL5MZPiy3gg2Muj8Zaza5It4mJvamzdcVXC_23kvPOqlaLTyy-qe1kjcJCTr2vzEIPwfg/s1600/2018-01-19+22_22_11-ecine-db+SQL+-+eCine+-+Firefox+Developer+Edition.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;551&quot; data-original-width=&quot;510&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6LtrgLJ4JdMV3TZGhJPTNecqNBuGbj9pd1WzN_gsAE2db_oiTZJkJO3QlgUkBmDPbAgX08-QL5MZPiy3gg2Muj8Zaza5It4mJvamzdcVXC_23kvPOqlaLTyy-qe1kjcJCTr2vzEIPwfg/s400/2018-01-19+22_22_11-ecine-db+SQL+-+eCine+-+Firefox+Developer+Edition.png&quot; width=&quot;370&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota: es posible configurar usuarios para acceder a nuestra base de datos y que no sean root pero estos usuarios tendrán permisos para acceder a todas las bases de datos en esa instancia, no se pueden personalizar estos permisos ni configurarlos desde ningún cliente remoto.&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/6276368034731253436?isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/6276368034731253436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/6276368034731253436'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2018/01/php-en-google-compute-engine-cloud-sql.html' title='PHP en Google compute engine + cloud sql'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMk2D3hTQbGJw1zH1pjnsbgC4CnBjWXdqO4QqyesxtKDIxUJGzMQNzBgxY_mgx6qfPLNBi41rAlZJpssuauaadMQuU4m3Cfc9gtuLZuPiYgibwImEydBWoSFcIJ5-J-1mooMqAQhthEgE/s72-c/2018-01-19+22_21_23-Visi%25C3%25B3n+general+de+SQL+-+eCine+-+Firefox+Developer+Edition.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-5594180351738648476</id><published>2018-01-22T17:00:00.000+01:00</published><updated>2018-01-22T17:00:10.413+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="driver sql server php"/><category scheme="http://www.blogger.com/atom/ns#" term="odbc"/><category scheme="http://www.blogger.com/atom/ns#" term="php-fpm"/><category scheme="http://www.blogger.com/atom/ns#" term="php7"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Microsoft ODBC 17 + SQL server driver 5.2.0 RC1 previews</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Microsoft está apostando fuerte con SQL Server en Linux, aún le falta un IDE potente como SSMS pero el servidor y la conectividad con lenguajes como PHP está servida, ya no es necesario tener que compilar de cero PHP para tener paquetes que no están en producción, sobre todo de Microsoft, todo gracias a la ayuda del rempositorio de &lt;a href=&quot;https://rpms.remirepo.net/&quot;&gt;Remi&lt;/a&gt; y las contibuciones en &lt;a href=&quot;https://github.com/Microsoft/msphpsql&quot;&gt;github&lt;/a&gt; de la propia Microsoft.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0YG51vFehEK91BVezyEIziQObnGCRbJi5jTnzkUd9b_AZKB6nGajbPFm_A86g-n5H7m5p00epFARgVYLxyfmQzho55NR-l6rbyT7lp3Cle0zDqdtT_xKwWrIuUCqd2fbJkIm-5_tyKi4/s1600/mssql-php.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;200&quot; data-original-width=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0YG51vFehEK91BVezyEIziQObnGCRbJi5jTnzkUd9b_AZKB6nGajbPFm_A86g-n5H7m5p00epFARgVYLxyfmQzho55NR-l6rbyT7lp3Cle0zDqdtT_xKwWrIuUCqd2fbJkIm-5_tyKi4/s1600/mssql-php.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Con esta base previa, hoy, me centraré en instalar el nuevo driver ODBC con soporte para Always Encripted, el driver de PHP 5.2 y todo con la última versión en el mercado de PHP, la 7.2. Los pasos a seguir son estos:&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;sudo yum -y install epel-release wget yum-utils
sudo wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo rpm -Uvh remi-release-7*.rpm
sudo yum-config-manager --enable remi-php72
sudo yum install -y unixODBC-devel autoconf
sudo curl https://packages.microsoft.com/config/rhel/7/prod.repo &amp;gt; /etc/yum.repos.d/mssql-release.repo
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Ahora necesitamos instalar la última versión estable paa que resuelva las dependencias necesarias, luego la desisntalamos&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;sudo ACCEPT_EULA=Y yum install -y msodbcsql mssql-tools
sudo yum remove -y msodbcsql mssql-tools
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Ahora es el momento de instalar la versión previa del driver ODBC, los enlaces de descarga pueden variar y cuando sea una versión estable estos pasos ya no serán necesarios&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;sudo wget https://github.com/Microsoft/msphpsql/raw/master/ODBC%2017%20binaries%20preview/Red%20Hat%207/msodbcsql-17.0.0.5-1.x86_64.rpm
sudo wget https://github.com/Microsoft/msphpsql/blob/master/ODBC%2017%20binaries%20preview/Red%20Hat%207/mssql-tools-17.0.0.5-1.x86_64.rpm
sudo ACCEPT_EULA=Y yum localinstall -y msodbcsql-17.0.0.5-1.x86_64.rpm
sudo ACCEPT_EULA=Y yum localinstall -y mssql-tools-17.0.0.5-1.x86_64.rpm
sudo ln -sfnv /opt/mssql-tools/bin/* /usr/bin
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Es posible que mssql-tools de errores y no se pueda instalar, no afecta a la instalación de PHP&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Ahora instalamos PHP 7.2 y el driver para PHP en la versión 5.2 RC1&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;sudo yum install -y php-fpm php-cli php-common php-pear
sudo yum --enablerepo=remi-php72-test -y install php-sqlsrv
sudo yum clean all 
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Tengo contenedores docker con estos pasos, para las versiones estables y en desarrollo, aunque incluyen muchas librerías de PHP que tal vez no necesitéis.&lt;br /&gt;
&lt;br /&gt;
Nota: aquí solo instalo sqlsrv no la variante de PDO pero sólo sería agregarla al comando de yum install.&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/5594180351738648476?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/5594180351738648476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/5594180351738648476'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2018/01/microsoft-odbc-17-sql-server-driver-520.html' title='Microsoft ODBC 17 + SQL server driver 5.2.0 RC1 previews'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0YG51vFehEK91BVezyEIziQObnGCRbJi5jTnzkUd9b_AZKB6nGajbPFm_A86g-n5H7m5p00epFARgVYLxyfmQzho55NR-l6rbyT7lp3Cle0zDqdtT_xKwWrIuUCqd2fbJkIm-5_tyKi4/s72-c/mssql-php.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-1907658698383045923</id><published>2018-01-21T22:23:00.000+01:00</published><updated>2018-01-21T22:23:09.342+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="centos"/><category scheme="http://www.blogger.com/atom/ns#" term="compilar"/><category scheme="http://www.blogger.com/atom/ns#" term="http2"/><category scheme="http://www.blogger.com/atom/ns#" term="nginx"/><category scheme="http://www.blogger.com/atom/ns#" term="openssl"/><title type='text'>CentOS 7 soporte para HTTP2 con NginX</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Esta entrada sigue un poco la línea del artículo en el que comentaba que para dar soporte a &lt;a href=&quot;http://scriptinside.blogspot.com.es/2016/09/http2-para-los-usuarios-de-google-chrome.html&quot; rel=&quot;bookmark&quot; title=&quot;permanent link&quot;&gt;HTTP/2 para los usuarios de Google Chrome&lt;/a&gt; tendríamos que utilizar algún repositorio ya compilado o compilar nosotros mismos NginX con las últimas versiones de OpenSSL.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJKA8fgem7mZRumAQ2RxJIBk_1L-0fW4AdRea1fTr6d8PUH6J8oWxjA7FKzpimGCi6__pfFRYBhW4nZPOUya8em534MUugcqtFgHlLsR3A-ZF3aW70hBXvaQXUEQUA4weqJYhFjcd8pfs/s1600/HTTP2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;480&quot; data-original-width=&quot;975&quot; height=&quot;157&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJKA8fgem7mZRumAQ2RxJIBk_1L-0fW4AdRea1fTr6d8PUH6J8oWxjA7FKzpimGCi6__pfFRYBhW4nZPOUya8em534MUugcqtFgHlLsR3A-ZF3aW70hBXvaQXUEQUA4weqJYhFjcd8pfs/s320/HTTP2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
En el post citado elegí la primera opción, pero encontrarme con un repositorio fiable, con un buen mantenimiento, actualizaciones y las últimas versiones de OpenSSL ha sido difícil, es por ello que decidí compilar mi propia versión de NginX con las últimas versiones de OpenSSL en CentOS 7, y estos son los pasos:&lt;/div&gt;
&lt;br /&gt;
&lt;pre&gt;sudo yum -y groupinstall &#39;Development Tools&#39;
sudo yum -y install epel-release \
                   wget \
                   openssl \
                   openssl-devel \
                   zlib-devel \
                   pcre-devel \
                   redhat-lsb-core
sudo yum clean all 
sudo useradd builder 
sudo mkdir -p /opt/lib
sudo wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz -O /opt/lib/openssl-1.1.0g.tar.gz
sudo tar -zxvf /opt/lib/open* -C /opt/lib
sudo rpm -ivh http://nginx.org/packages/mainline/centos/7/SRPMS/nginx-1.13.8-1.el7_4.ngx.src.rpm
sudo sed -i &quot;s|--with-http_ssl_module|--with-http_ssl_module --with-openssl=/opt/lib/openssl-1.1.0g|g&quot; /root/rpmbuild/SPECS/nginx.spec
sudo rpmbuild -ba --clean /root/rpmbuild/SPECS/nginx.spec
sudo rpm -Uvh --force /root/rpmbuild/RPMS/x86_64/nginx-1.13.8-1.el7_4.ngx.x86_64.rpm
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
En concreto las versiones son la últimas hasta la fecha (openssl 1.1.0g y nginx 1.13.8), e incluye paquetes como redhat-lsb-core que su ausencia en las últimas versiones generaba el error lsb_release: command not found al ejecutar el penúltimo paso.&lt;br /&gt;
&lt;br /&gt;
Estaría también disponible un contenedor en &lt;a href=&quot;https://hub.docker.com/r/reynier3mil/centos-nginx-openssl/&quot;&gt;docker&lt;/a&gt; con estos cambios y que intento mantener actualizado.&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/1907658698383045923?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/1907658698383045923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/1907658698383045923'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2018/01/centos-7-soporte-para-http2-con-nginx.html' title='CentOS 7 soporte para HTTP2 con NginX'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJKA8fgem7mZRumAQ2RxJIBk_1L-0fW4AdRea1fTr6d8PUH6J8oWxjA7FKzpimGCi6__pfFRYBhW4nZPOUya8em534MUugcqtFgHlLsR3A-ZF3aW70hBXvaQXUEQUA4weqJYhFjcd8pfs/s72-c/HTTP2.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-4798080885148438627</id><published>2017-07-26T11:21:00.001+02:00</published><updated>2017-07-26T11:21:52.850+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="antiguos"/><category scheme="http://www.blogger.com/atom/ns#" term="subversion"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><title type='text'>Instalación y configuración de subversion en Windows</title><content type='html'>Así se&amp;nbsp;instalaba&amp;nbsp;y configuraba&amp;nbsp;Collbanet Subversion Edge en 2011.&lt;br /&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
¿Qué es Subversion?&lt;/h3&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Antes de saber que
es Subversion debemos tener en cuenta algunos conceptos previos cómo el de &lt;b&gt;versión&lt;/b&gt;, &lt;b&gt;control de versiones&lt;/b&gt; y &lt;b&gt;sistemas
de control de revisiones&lt;/b&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Una &lt;b&gt;versión&lt;/b&gt;, &lt;b&gt;revisión&lt;/b&gt; o &lt;b&gt;edición&lt;/b&gt; de un
producto, es el estado en el que se encuentra dicho producto en un momento dado
de su desarrollo o modificación. Se llama &lt;a href=&quot;http://es.wikipedia.org/wiki/Control_de_versiones&quot;&gt;control de versiones&lt;/a&gt;
a la gestión de los diversos cambios que se realizan sobre los elementos de
algún producto o una configuración del mismo. Los &lt;b&gt;sistemas de control de versiones&lt;/b&gt; facilitan la administración de las
distintas versiones de cada producto desarrollado, así como las posibles
especializaciones realizadas.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Un &lt;b&gt;Sistema de Control de Revisiones&lt;/b&gt; (&lt;a href=&quot;http://es.wikipedia.org/wiki/Revision_Control_System&quot;&gt;Revision Control
System&lt;/a&gt; - RCS) es una implementación de software para el &lt;b&gt;control de versiones&lt;/b&gt; que automatiza las
tareas de guardar, recuperar, registrar, identificar y mezclar versiones de
archivos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Resumiendo, &lt;a href=&quot;http://es.wikipedia.org/wiki/Subversion&quot;&gt;Subversion&lt;/a&gt; no es más que un &lt;b&gt;sistema de control de versiones&lt;/b&gt;
diseñado específicamente para reemplazar al popular &lt;a href=&quot;http://es.wikipedia.org/wiki/CVS&quot;&gt;CVS&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Instalación de Subversion en
Windows&lt;/span&gt;&lt;/h4&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Existen multitud de
instaladores de subversion, algunos más complicados que otros. Tenemos que
tener en cuenta que un sistema de control de versiones requiere de 3 elementos
fundamentales para funcionar: el propio sistema de control de revisiones, un
servidor web para poder servir los archivos y un visor para gestionar los
repositorios.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;En este manual
utilizaremos el más completo y sencillo de instalar a mi modo de ver, este
software es el &lt;a href=&quot;http://www.open.collab.net/downloads/subversion/&quot;&gt;Collabnet
Subversion Edge&lt;/a&gt; e instala en un solo clic subversión, Apache y ViewVC.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Aunque esta es la
parte que nos va a servir los archivos (la parte servidor) por tanto
necesitamos algún programa en nuestros ordenadores para gestionar estos
repositorios de manera sencilla, el programa elegido es el &lt;a href=&quot;http://tortoisesvn.net/downloads.html&quot;&gt;Tortoise SVN&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Ambas instalaciones
son las típicas de siguiente siguiente, no es necesario configurar nada
específico, lo único a tener en cuenta es del lado del servidor que el puerto
80 esté libre para el apache, en caso de no estarlo debemos modificar este
puerto una vez instalado el &lt;b&gt;Collabnet
Subversion Edge&lt;/b&gt; en su menú de Administración:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3IG05dKxdzBoVtZ94qJiONua-wTM4OFSQfs3hVIrJ9ZFUjSeaTmqqH9j3r087ffa2-7X-S4SWjeHBX2p5NIVjpr-XyRU3HUj1GZxRqJI6tM03oGpoXzwDb66Mr7PrAeaOa7-11Rcb8ek/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;626&quot; data-original-width=&quot;824&quot; height=&quot;303&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3IG05dKxdzBoVtZ94qJiONua-wTM4OFSQfs3hVIrJ9ZFUjSeaTmqqH9j3r087ffa2-7X-S4SWjeHBX2p5NIVjpr-XyRU3HUj1GZxRqJI6tM03oGpoXzwDb66Mr7PrAeaOa7-11Rcb8ek/s400/1.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype
 id=&quot;_x0000_t75&quot; coordsize=&quot;21600,21600&quot; o:spt=&quot;75&quot; o:preferrelative=&quot;t&quot;
 path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt;
 &lt;v:stroke joinstyle=&quot;miter&quot;/&gt;
 &lt;v:formulas&gt;
  &lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;/&gt;
  &lt;v:f eqn=&quot;sum @0 1 0&quot;/&gt;
  &lt;v:f eqn=&quot;sum 0 0 @1&quot;/&gt;
  &lt;v:f eqn=&quot;prod @2 1 2&quot;/&gt;
  &lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;/&gt;
  &lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;/&gt;
  &lt;v:f eqn=&quot;sum @0 0 1&quot;/&gt;
  &lt;v:f eqn=&quot;prod @6 1 2&quot;/&gt;
  &lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;/&gt;
  &lt;v:f eqn=&quot;sum @8 21600 0&quot;/&gt;
  &lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;/&gt;
  &lt;v:f eqn=&quot;sum @10 21600 0&quot;/&gt;
 &lt;/v:formulas&gt;
 &lt;v:path o:extrusionok=&quot;f&quot; gradientshapeok=&quot;t&quot; o:connecttype=&quot;rect&quot;/&gt;
 &lt;o:lock v:ext=&quot;edit&quot; aspectratio=&quot;t&quot;/&gt;
&lt;/v:shapetype&gt;&lt;v:shape id=&quot;_x0000_i1034&quot; type=&quot;#_x0000_t75&quot; style=&#39;width:425.25pt;
 height:323.25pt;visibility:visible;mso-wrap-style:square&#39;&gt;
 &lt;v:imagedata src=&quot;file:///C:/Users/sirio/AppData/Local/Temp/msohtmlclip1/01/clip_image001.jpg&quot;
  o:title=&quot;&quot;/&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;span lang=&quot;ES&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Nota: la primera
vez que instalamos subversion este no se inicia por defecto debemos iniciarlo
manualmente en la pantalla de status (ver imagen siguiente) si nos da error de
puerto debemos cambiarlo en la imagen anterior y además debemos marcar el
último check de esta página para iniciarlo siempre automáticamente.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape
 id=&quot;_x0000_i1033&quot; type=&quot;#_x0000_t75&quot; style=&#39;width:364.5pt;height:228.75pt;
 visibility:visible;mso-wrap-style:square&#39;&gt;
 &lt;v:imagedata src=&quot;file:///C:/Users/sirio/AppData/Local/Temp/msohtmlclip1/01/clip_image003.jpg&quot;
  o:title=&quot;&quot;/&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;span lang=&quot;ES&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq9VEOnnkOHaBu-lcA1kepM7_4zhvT2tbjYpdzhFRYi12LlYDlzCnsdFVneiGFDjmZBqTQTEGsSpUhbTY8noeC5oXYqR3i6KnVxBNLNciiv7ZczC3B2rltZ45ox_IG-GdvFbiOYaRi950/s1600/2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;305&quot; data-original-width=&quot;486&quot; height=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq9VEOnnkOHaBu-lcA1kepM7_4zhvT2tbjYpdzhFRYi12LlYDlzCnsdFVneiGFDjmZBqTQTEGsSpUhbTY8noeC5oXYqR3i6KnVxBNLNciiv7ZczC3B2rltZ45ox_IG-GdvFbiOYaRi950/s400/2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Algunas notas
adicionales: El &lt;b&gt;Tortoise SVN&lt;/b&gt; se integra
con el explorador de Windows por lo que es más que probable que necesitemos
reiniciar el equipo. También es importante recordar la contraseña del usuario
admin (en el proceso de instalación nos pide crear una) en el &lt;b&gt;Collabnet Subversion Edge&lt;/b&gt; aunque luego
la podamos cambiar.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Creación de repositorios&lt;/span&gt;&lt;/h4&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Aclaremos algunos
conceptos primero, un repositorio se crea en el servidor y los usuarios al
conectarse a este se descargan o suben archivos al mismos, un repositorio no
está en local, en local sólo tenemos una copia (puede que no sea actualizada)
del repositorio almacenado en el servidor.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Una vez aclarado
esto crearemos un repositorio en nuestro servidor:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_ej_PmXtQQypAo-C8sAc9dY-j_ditLXhghXqRPojraQxkzqxPEIwyOD0A34xvi0p36I5GgoMmSpj_UIf56uvwHxg0jr825-SIf9kK_Ie9PmYgb0JkXI0AnzAH-PidqFATIRq3Ly1IWkY/s1600/3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;206&quot; data-original-width=&quot;535&quot; height=&quot;153&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_ej_PmXtQQypAo-C8sAc9dY-j_ditLXhghXqRPojraQxkzqxPEIwyOD0A34xvi0p36I5GgoMmSpj_UIf56uvwHxg0jr825-SIf9kK_Ie9PmYgb0JkXI0AnzAH-PidqFATIRq3Ly1IWkY/s400/3.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;El único paso que
tenemos que hacer es darle un nombre, más nada. Sencillo ¿verdad?&amp;nbsp;&lt;/span&gt;Para ver nuestro
repositorio nos desplazamos hasta el listado:&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv5k4NdMu6a9ImnQil83dTk-UXGXPwN7V-rA5j-MjmmnSz2UE91e6te4Bx5RoHTATMVUC3XJqnsDTYgEhGMlfA0GbShhQr6KmX6sg1OlqAuJVwB5pvK9N4dtBKxm_vhSmRnK9p7qLhjFY/s1600/4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;204&quot; data-original-width=&quot;866&quot; height=&quot;93&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv5k4NdMu6a9ImnQil83dTk-UXGXPwN7V-rA5j-MjmmnSz2UE91e6te4Bx5RoHTATMVUC3XJqnsDTYgEhGMlfA0GbShhQr6KmX6sg1OlqAuJVwB5pvK9N4dtBKxm_vhSmRnK9p7qLhjFY/s400/4.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;De este listado con
lo que tenemos que quedarnos es con la url del repositorio (recuadro rojo) para
poder acceder remotamente al mismo desde nuestro ordenador.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Creación de usuarios en Subversion&lt;/span&gt;&lt;/h4&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Aunque podemos
acceder remotamente con el usuario admin a cualquier repositorio es muy
recomendable crear usuarios remotos para estos (también para cada repositorio
se puede denegar el acceso a unos usuarios y permitirlo a otros). Debemos tener
en cuenta que los usuarios creados en la siguiente pantalla tienen acceso a
todos los repositorios por defecto, para editar estos accesos en cada uno
debemos ir a cada repositorio y modificar las reglas de acceso.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Para crear un
usuario solo debemos rellenar los datos y elegir el rol del mismo, por defecto
siempre será un usuario normal:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ4AmN8thCIOndAHnX8y2sQVbqHyFxExGFkoIK_ByzxKGJgKbYCjYHxtDCYkrkyK4AKgchT1guCpqbuv6qcI9OOyNoxFtNrqdjCG93coaJQ2TirHjzhARk5L2wTDDOxhwyYWTekDWtgYo/s1600/5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;382&quot; data-original-width=&quot;591&quot; height=&quot;257&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ4AmN8thCIOndAHnX8y2sQVbqHyFxExGFkoIK_ByzxKGJgKbYCjYHxtDCYkrkyK4AKgchT1guCpqbuv6qcI9OOyNoxFtNrqdjCG93coaJQ2TirHjzhARk5L2wTDDOxhwyYWTekDWtgYo/s400/5.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Recordad que si no
editamos las reglas de acceso de nuestros repositorios todos los usuarios que
creemos aquí van a tener acceso a los mismos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Bien, hasta ahora
todo es bastante sencillo, y la siguiente parte también, aunque tenemos que
hacer algunos pequeños trucos para trabajar con proyectos que ya existen.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Actualizar un repositorio para un
proyecto con archivos ya creados&lt;/span&gt;&lt;/h4&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Este pequeño truco
se debe a una limitación por parte de Subversion que impide que vinculemos un
directorio local a un repositorio si este directorio no está vacío. La pregunta
sería ¿entonces como creo un repositorio para archivos que ya tengo? ¿Cómo los
incluyo en este repositorio nuevo?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;El truco es muy
sencillo y os describo los pasos a seguir:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Primero debemos subir los archivos al repositorio nuevo que hemos
creado&lt;/li&gt;
&lt;li&gt;&lt;span lang=&quot;ES&quot; style=&quot;text-indent: -0.25in;&quot;&gt;Luego debemos crear una carpeta local al mismo nivel que la que
contiene los archivos subidos.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span lang=&quot;ES&quot; style=&quot;text-indent: -0.25in;&quot;&gt;Después vinculamos esta carpeta nueva con el repositorio (con ello
tendría una copia exacta de todos los archivos subidos)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span lang=&quot;ES&quot; style=&quot;text-indent: -0.25in;&quot;&gt;Finalmente borramos la carpeta original y renombramos la nueva con el
nombre original.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;De esta forma ya
tenemos un directorio local vinculado a un repositorio con los archivos
antiguos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Importante: esto no
es necesario para proyectos nuevos en los cuales no hayamos creado ningún
archivo aún.&amp;nbsp;&lt;/span&gt;Veamos estos pasos
uno a uno.&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Subir archivos antiguos a un
repositorio nuevo&lt;/span&gt;&lt;/h4&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Para importar
archivos a nuestro repositorio lo podemos hacer de una manera muy simple con &lt;b&gt;Tortoise SVN&lt;/b&gt;, como os dije
anteriormente este programa se integra perfectamente con el explorador de
Windows por lo que el único paso necesario es hacer clic derecho sobre la
carpeta, elegir &lt;b&gt;Tortoise SVN&lt;/b&gt; y luego
importar:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjELAnlvexj8_HngvfItm_QF2_8lskpTUZWHamYVMYf7Dtgli3QoJPLFbapHOO5PdwgdRERa7N7q6N8pQZ51QMaZKzbTc4w736ceNQc5cy0qgWsp5mnqQuE052ul7MGg0QIYJuRhaDBZ7o/s1600/6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;557&quot; data-original-width=&quot;597&quot; height=&quot;372&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjELAnlvexj8_HngvfItm_QF2_8lskpTUZWHamYVMYf7Dtgli3QoJPLFbapHOO5PdwgdRERa7N7q6N8pQZ51QMaZKzbTc4w736ceNQc5cy0qgWsp5mnqQuE052ul7MGg0QIYJuRhaDBZ7o/s400/6.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;En la siguiente
ventana introducimos la url del repositorio (sin usuario) y en caso de que no
la tengamos cacheada en nuestro ordenador nos pedirá el usuario y la clave al
pulsar Aceptar, si todo está correcto se iniciará el proceso y tendremos ya
subidos los archivos a nuestro repositorio.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdoPhdZ41E7ZsMioxr-YP0ndhZDYwP9dDjS1igeu_Hha-XNXMcfR4C5VOgMaMDHSzshIBPhvRMAj-SeckWyHaIp2if1I4ml4u4_nSitPLUCPkgIrjh0MPtl33el0ff-QQ-G5B26OY5tlc/s1600/7.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;384&quot; data-original-width=&quot;499&quot; height=&quot;307&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdoPhdZ41E7ZsMioxr-YP0ndhZDYwP9dDjS1igeu_Hha-XNXMcfR4C5VOgMaMDHSzshIBPhvRMAj-SeckWyHaIp2if1I4ml4u4_nSitPLUCPkgIrjh0MPtl33el0ff-QQ-G5B26OY5tlc/s400/7.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Nota: Este paso
solo sube los archivos (los importa) a nuestro repositorio pero no vincula esta
carpeta con el mismo que es lo que necesitamos para subir las modificaciones o
descargarnos revisiones antiguas.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Vincular una carpeta local a un repositorio&lt;/span&gt;&lt;/h4&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Este paso si deben
seguirlo todos los que quieran vincular carpetas locales a un repositorio y
recordar que la carpeta local debe estar vacía y con permisos de escritura.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Igualmente que en
el paso anterior para obtener el código de un repositorio y vincularlo a
nuestra carpeta local lo único que debemos hacer es clic derecho y pulsar la
opción Obtener:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihtOi4rNz-ct5nNk4_jlMejyyEvjA-Lvze_C7MQfEM413Daq7nf_Y67gHle5l01OUu53oQIRTBXxP1mvlv8YQAAvyve5sdXN4T1XOIsGhQFVmgW34s7TVVVPTDESdg9LTUlV6YollM2CE/s1600/8.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;204&quot; data-original-width=&quot;580&quot; height=&quot;140&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihtOi4rNz-ct5nNk4_jlMejyyEvjA-Lvze_C7MQfEM413Daq7nf_Y67gHle5l01OUu53oQIRTBXxP1mvlv8YQAAvyve5sdXN4T1XOIsGhQFVmgW34s7TVVVPTDESdg9LTUlV6YollM2CE/s400/8.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;En el dialogo
siguiente seleccionamos el repositorio (nos pedirá igualmente el usuario y la
contraseña al pulsar aceptar si el mismo no está cacheado) y podemos
descargarnos cualquiera de las revisiones existentes, para la primera vez es
aconsejable descargarse la HEAD (la última):&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghJURmT0ZEh_ZCqc-KUb6md19jLNeSLg3urjV8esOAfrEI7vcrrpU2mEDwDXJIOuWUR9jCMGwZ6UfoGhSDVvTxyareBm3APG27eTKKyJ8OeyqBDpsOUFQDu0CvBirNb7rQQjOoROwuzGw/s1600/9.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;402&quot; data-original-width=&quot;502&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghJURmT0ZEh_ZCqc-KUb6md19jLNeSLg3urjV8esOAfrEI7vcrrpU2mEDwDXJIOuWUR9jCMGwZ6UfoGhSDVvTxyareBm3APG27eTKKyJ8OeyqBDpsOUFQDu0CvBirNb7rQQjOoROwuzGw/s400/9.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;De esta forma ya
tenemos vinculado nuestro directorio con un repositorio, si todo ha ido bien
aparte de descargarnos los archivos al pulsar clic derecho en la carpeta
veremos cómo cambian las opciones de la carpeta:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifdqmiTeOEa0a3rW5087nMWDuo1eCB42WFWkWDuZ1Qt6cg9Z5vdZ11nOMKP4E_x0Wcdka_dtwk-xjkvcwFpIx74iXrsYwl8B58VqKtOmxllcGCoGBEO03dO7IFVP2bJhkYb69n5q1O7zU/s1600/10.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;226&quot; data-original-width=&quot;610&quot; height=&quot;147&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifdqmiTeOEa0a3rW5087nMWDuo1eCB42WFWkWDuZ1Qt6cg9Z5vdZ11nOMKP4E_x0Wcdka_dtwk-xjkvcwFpIx74iXrsYwl8B58VqKtOmxllcGCoGBEO03dO7IFVP2bJhkYb69n5q1O7zU/s400/10.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Estas dos opciones
son las básicas de Subversion, SVN Actualizar nos permite obtener los archivos
del servidor mientras que SVN Confirmar nos permite importar al repositorio
nuestras modificaciones que pueden estar acompañadas o no por algún mensaje
identificativo de la operación o los cambios realizados.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;ES&quot;&gt;Nota adicional:
Podemos acceder y confirmar cambios en repositorios de unidades de red siempre
y cuando estos se hayan creado desde la máquina real, o sea si tú tienes en un
servidor un directorio vinculado a un repositorio y accedes a él desde tú
máquina puedes confirmar los cambios desde allí sin necesidad de hacerlo desde
la propia máquina.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/4798080885148438627?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/4798080885148438627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/4798080885148438627'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2017/07/instalacion-y-configuracion-de.html' title='Instalación y configuración de subversion en Windows'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3IG05dKxdzBoVtZ94qJiONua-wTM4OFSQfs3hVIrJ9ZFUjSeaTmqqH9j3r087ffa2-7X-S4SWjeHBX2p5NIVjpr-XyRU3HUj1GZxRqJI6tM03oGpoXzwDb66Mr7PrAeaOa7-11Rcb8ek/s72-c/1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-1617527787510625842</id><published>2017-07-26T11:12:00.000+02:00</published><updated>2017-07-26T11:12:12.767+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="antiguos"/><category scheme="http://www.blogger.com/atom/ns#" term="Dynamics"/><category scheme="http://www.blogger.com/atom/ns#" term="microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><category scheme="http://www.blogger.com/atom/ns#" term="versiones"/><title type='text'>Recomendaciones para SQL Server con Dynamics NAV</title><content type='html'>&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Max Server Memory&lt;/h3&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://technet.microsoft.com/es-es/library/ms180797.aspx&quot;&gt;MAX_SERVER_MEMORY&lt;/a&gt; = TOTAL_SERVER_MEMORY - [OS/Apps Memory] - [Threads * Thread Size]&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
TOTAL_SERVER_MEMORY = 24GB&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
OS/Apps Memory = 4 GB (systems with &amp;gt; 16GB of RAM)&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Threads = 576&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Thread Size = 2MB (x64)&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Recomendado MAX_SERVER_MEMORY = 18 GB&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Auto - Create Statistics&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Se recomienda fuertemente activar &quot;Auto Create Statistics&quot; ya que es una de las formas que utiliza el propio SQL Server para mejorar el rendimiento. El coste para ejecutar esta opción es mínimo en comparación con el problema de rendimiento que puede experimentar si una estadística necesaria falta y SQL Server no la puede crear. Las estadísticas son un factor muy importante en el plan de consultas eficientes que viene con SQL Server.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Auto - Update Statistics&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Se recomienda fuertemente activar &quot;Auto Update Statistics&quot; ya que es una de las formas que utiliza el propio SQL Server para mejorar el rendimiento. El coste para ejecutar esta opción es mínimo en comparación con el problema de rendimiento que puede experimentar si una estadística no está actualizada y SQL Server la utiliza para compilar la consulta y crear el plan de ejecución. Esto es muy importante con C/AL FINDFIRST,&amp;nbsp; FINDLAST, FIND(&#39;-&#39;), FIND(&#39;+&#39;), y&amp;nbsp; FINDSET para [Entrada No.] porque si la estadística en [N º Entrada] está fuera de fecha llevará a SQL Server más tiempo para encontrar el primer y último valor, bloqueando&amp;nbsp; el recurso durante mucho tiempo y causando un impacto negativo en la concurrencia del sistema y, posiblemente, resultando en tiempos muertos de bloqueo (Lock Time Outs).&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Auto-Grow&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://support.microsoft.com/kb/315512&quot;&gt;Auto-Growths&lt;/a&gt; (Auto-crecimientos) de la base de datos o del registro de transacciones en entornos de producción puede degradar el rendimiento pues todas las transacciones deben hacer cola y esperar al SQL Server para hacer crecer el archivo de registro o de datos antes de que pueda comenzar a procesar las transacciones de nuevo. Esto puede crear un cuello de botella. Recomendamos fuertemente el crecimiento de los datos y del archivo de registro durante las horas pico entre un 10 a 25% del tamaño actual. No recomendamos desactivar Auto-Grow pues en casos de emergencia es mejor tenerlo activado que quedarse sin espacio y poner la base de datos fuera de servicio.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Trace Flag 4119&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Si está ejecutando SQL Server 2005, le recomendamos que active el &lt;a href=&quot;http://support.microsoft.com/kb/942659&quot;&gt;indicador de traza 4119&lt;/a&gt; por razones de rendimiento. (Esto no es necesario en SQL 2008)&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
TempDB&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
El &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms175195.aspx&quot;&gt;número de archivos de datos de TempDB&lt;/a&gt; debe ser igual al número de núcleos de CPU utilizada por SQL Server, hasta un máximo de 8. Esto evita los cuellos de botella en el proceso de asignación de página SGAM (Shared Global Allocation Map) cuando los nuevos objetos temporales son creados. Los archivos de TempDB deben estar en una unidad separada de los datos y los archivos de registro.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Esta recomendación viene dada ya que cada objeto temporal que se crea en TempDB necesita páginas asignadas para ello. Estas páginas deben ser asignados a través de páginas SGAM y sólo hay una página SGAM por archivo de datos (no realmente, pero lo suficientemente cerca). Así que si tienes un solo archivo de datos y se está creando una gran cantidad de objetos temporales, como es posible con SSRS y RCSI (u otras bases de datos en el servidor, ya que todos utilizan la misma TempDB) puede crearse un cuello de botella pues está tratando de manejar las asignaciones de muchas peticiones al mismo tiempo. Es por eso que existe la&amp;nbsp; recomendación de crear un archivo de datos TempDB por núcleo de la CPU o hilos activos para aliviar la posibilidad de un cuello de botella en la asignación. Esto es raro pero puede suceder.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
NOTA: Cada archivo de TempDB no necesita estar en su propia unidad de disco, sólo tienen que estar separados de todos los datos de SQL y archivos de registro.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Disk Alignment&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
La alineación del disco puede tener un impacto significativo en el rendimiento del disco como un bloque puede abarcar dos discos físicos. Puesto que la configuración adecuada puede variar mucho según el fabricante, consulte a su fabricante de hardware para verificar la alineación del disco y la configuración adecuada. La asignación o el tamaño de banda debe ser&amp;gt; = 8k para evitar páginas rasgadas se recomienda 64k para que coincida con el tamaño de la extensión de SQL Server (8 - 8K páginas).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Para comprobar la alineación del disco:&lt;/div&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Click &quot;Start&quot; - &quot;Run&quot; and type MSINFO32&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Click &quot;Components&quot; - &quot;Storage&quot; - &quot;Disks&quot;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;Look at the value for &quot;Partition Starting Offset&quot; for the drive you wish to check&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Si el resultado de dividir el valor de Partition Starting Offset por (64 * 1024) es un número entero entonces los discos están alineados en esa unidad, si por el contrario es un número decimal entonces los discos no están alineados.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
NOTA: En todas las unidades formateadas con Windows Server 2008 o posteriores se alinearán automáticamente los discos.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Read Committed Snapshot Isolation (RCSI)&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Con el lanzamiento de SQL Server 2005, un nuevo nivel de aislamiento se introdujo llamado &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/tcbchxcb(v=VS.90).aspx&quot;&gt;Read Committed Snapshot&lt;/a&gt;. Este nivel de aislamiento imita el &quot;Nivel 1&quot; de lectura confirmada, que es el predeterminado de SQL Server, pero permite una mayor concurrencia y menos bloqueo ya que utiliza un principio de versiones en los registros bloqueados. Los procesos de lectura y escritura reciben diferentes &quot;versiones&quot; del registro para que no bloquee cada vez que mantiene la coherencia transaccional. Estas versiones de filas se ayudan del almacén de versiones que se mantiene en TempDB. Desde la perspectiva de Microsoft Dynamics NAV no es muy útil como NAV envía sugerencias de nivel de aislamiento con la mayoría de los estados que anularán RCSI, sino que tendrá un beneficio cuando las aplicaciones externas accedan a los registros en la base de datos de producción NAV tales como informes, opiniones, y aplicaciones secundarias . (SSRS, los procesos ETL, etc.)&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
ALTER DATABASE MyDatabase SET SINGLE_USER WITH ROLLBACK_INMEDIATE&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
ALTER DATABASE DatabaseName&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
SET READ_COMMITTED_SNAPSHOT ON&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
GO&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
NOTA: TempDB debe ser configurado según las recomendaciones o la asignación de páginas pueden producir cuellos de botella.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Max Degree of Parallelism&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Cuando &lt;a href=&quot;http://technet.microsoft.com/es-es/library/ms181007.aspx&quot;&gt;SQL Server&lt;/a&gt; se ejecuta en un equipo con más de un microprocesador o CPU, detecta el mejor grado de paralelismo, es decir, el número de procesadores que se emplea para ejecutar una única instrucción en cada ejecución de planes en paralelo. Puede utilizar la opción max degree of parallelism para limitar el número de procesadores utilizados en la ejecución de planes paralelos. Para que el servidor pueda determinar el Grado máximo de paralelismo, establezca esta opción en 0, que es el valor predeterminado. Si se establece el grado máximo de paralelismo en 0, &lt;a href=&quot;http://technet.microsoft.com/es-es/library/ms189094.aspx&quot;&gt;SQL Server&lt;/a&gt; puede utilizar todos los procesadores disponibles hasta un número de 64. Para suprimir la generación del plan paralelo, establezca max degree of parallelism en 1.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Microsoft Dynamics NAV se comunica con el servidor SQL a través de ODBC. El C / AL se convierte en simples declaraciones TSQL a través de la librería NDBCS.DLL. Estas declaraciones son muy simples Select, Update, Insert y Delete de SQL y no requieren de la ejecución en paralelo en SQL Server. Esto no impide que el compilador a veces trate de utilizar la ejecución en paralelo en la planificación de las consultas y esto, a veces, puede afectar negativamente al rendimiento. Es por eso que se recomienda establecer el&amp;nbsp; grado máximo de paralelismo en SQL Server en 1 para evitarlo.&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot; style=&quot;text-align: justify;&quot;&gt;
sp_configure &#39;max degree of parallelism&#39;, 1&lt;br /&gt;RECONFIGURE&lt;br /&gt;GO&lt;/blockquote&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
NOTA: Si está ejecutando los trabajos de mantenimiento de SQL Server Enterprise Edition estos son multi-hilo, pero si usted pone como grado máximo de paralelismo 1 estos se ejecutarán en un solo subproceso. Le recomendamos que en el trabajo de mantenimiento regrese el grado máximo de paralelismo a 0 y al ejecutar el trabajo de mantenimiento volver a 1. Esto se puede hacer con el código de TSQL dentro del propio trabajo de mantenimiento.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Dynamics NAV Default Isolation Level&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Con el lanzamiento de Microsoft Dynamics NAV 5.00 SP1 (Build 30482 / KB 979135) y posteriores tenemos la opción de cambiar el nivel de aislamiento predeterminado de NAV de SERIALIZABLE a REPEATABLEREAD.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
SERIALIZABLE: Este es el nivel de aislamiento más restrictivo. Cuando se utiliza, los valores fantasmas no pueden ocurrir pues impide que otros usuarios actualicen o inserten filas en el conjunto de datos hasta que la transacción se complete.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
REPEATABLEREAD: Cuando se utiliza, las lecturas ‘sucias’ y no repetibles no pueden ocurrir. Esto significa que los bloqueos se colocarán en todos los datos que se utilizan en una consulta y otra transacción no puede actualizarlos. En resumen SERIALIZABLE es más restrictiva y bloquea más registros que REPEATABLEREAD que puede causar más tiempos de espera de bloqueos y desbloqueos. REPEATABLEREAD es menos restrictiva y permite una mayor concurrencia en general.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Configuración por defecto del nivel de aislamiento en NAV de SERIALIZABLE a REPEATABLEREAD&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot; style=&quot;text-align: justify;&quot;&gt;
UPDATE [$ndo$dbproperty] SET diagnostics = 4194304&lt;/blockquote&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Microsoft Dynamics NAV &quot;Lock Timeout&quot;&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Este &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd338811.aspx&quot;&gt;ajuste&lt;/a&gt; significa básicamente que si un usuario intenta acceder a un recurso y está bloqueado por otro usuario espere los segundos que usted ha especificado y vuelva a intentarlo antes de emitir un mensaje de error. Le recomendamos que esta opción no se utilice en absoluto o que se establezca entre unos 10 a 20 segundos, un valor muy alto para el bloqueo estático de tiempo de espera puede causar problemas. Por lo general, cuando un cliente tiene un gran valor que para esto es porque hay un problema de rendimiento subyacente. Esto realmente depende de cada configuración y puede ser mayor si hay circunstancias específicas.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Para cambiar el valor por defecto en Microsoft Dynamics NAV, click File, click Database, y luego click Alter para abrir la ventana de Alter Database. Click en la pestaña Advanced y marque o desmarque la casilla de Lock timeout field.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Microsoft Dynamics NAV &quot;Always Rowlock&quot;&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Microsoft Dynamics NAV siempre bloquea las filas por una compatibilidad con sistemas de 32 bits y sobre SQL Server 2000. En el 99% de los casos en SQL Server 2005 y posteriores esto se puede desactivar liberando la memoria de bloqueo que SQL puede utilizar para otros fines sin ninguna pérdida de rendimiento.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
NOTA: En algunas pruebas de rendimiento sin tener esta opción habilitada la concurrencia y el rendimiento aumentaron.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Maintenance Jobs&lt;/h3&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
Statistics&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Incluso con la opción de &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/ms173804.aspx&quot;&gt;actualizar estadísticas automáticamente&lt;/a&gt; activada se recomienda ejecutar un trabajo de mantenimiento periódico para actualizar las mismas. Esto se debe a que la actualización automática de estadísticas sólo se activa cuando el 5% de los datos de esta estadística ha cambiado y en las tablas como Value Entry, Item Ledger Entry, G/L Entry, y aquellas que pueden tener entre los 10 de millones de registros un pequeño porcentaje de los datos en una estadística dada como [N º de entrada] puede cambiar con un efecto significativo sobre la distribución general de los datos de esta estadística causando planes de ejecución de consultas ineficientes mucho antes de que el umbral del 5% se alcance provocando como resultado un rendimiento degradado. Se recomienda el uso de sp_updatestats para realizar esta tarea, ya que sólo se actualizarán las estadísticas donde los datos se han cambiado. Le recomendamos la creación de un trabajo de SQL que se ejecute diaria o semanal mente (dependiendo del volumen de transacciones) en las horas pico para actualizar todas las estadísticas donde los datos han cambiado.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
NOTA: No use &quot;FULLSCAN&quot;, ya que es una pérdida de tiempo pues se sobrescribirá en el momento en que la estadística se auto actualiza.&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
USE AdventureWorks2008R2;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
GO&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
EXEC sp_updatestats&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
Index defragmentation&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Los índices se fragmentan al igual que los discos duros y pueden tener un impacto negativo en el rendimiento general. Se recomienda utilizar la siguiente secuencia de comandos que reconstruye y reorganiza las funciones de desfragmentación de índices. Le recomendamos la creación de un trabajo de SQL que se ejecute diaria o semanalmente (dependiendo del volumen de transacciones) durante las horas pico para actualizar todos los índices.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Instant File initialization&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
En SQL Server 2005 y versiones posteriores, los archivos de datos se pueden inicializar de forma instantánea, lo que permite la ejecución rápida de la base de datos o grupo de archivos de restauración. La inicialización instantánea de archivos utiliza espacio de disco sin necesidad de rellenar ese espacio con ceros. En cambio, el contenido del disco se sobrescribe según los nuevos datos se escriben en los archivos. El registro del archivo de inicialización aún requiere rellenarse con ceros pero esto sucede en paralelo con la transferencia de los datos de la copia de seguridad. El siguiente paso de la restauración no se iniciará hasta que todos los datos han sido transferidos y todo el registro se ha inicializado.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Para utilizar la &lt;a href=&quot;http://www.guillesql.es/Articulos/SQLServer_Instant_File_Initialization.aspx&quot;&gt;inicialización instantánea de archivos&lt;/a&gt; se debe ejecutar el servicio MSSQLSERVER en una cuenta de Windows y asignar el privilegio especial de Windows SE_MANAGE_VOLUME_NAME a dicha cuenta. Este privilegio se asigna al grupo de administradores de Windows por defecto. Si tiene derechos de administrador del sistema puede asignar este privilegio mediante la adición de la cuenta de Windows a la política de seguridad para Realizar &lt;a href=&quot;http://msdn.microsoft.com/es-es/library/ms175935.aspx&quot;&gt;tareas de mantenimiento del volumen&lt;/a&gt;.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
&quot;Page Verify&quot; - Checksum vs. Torn Page Detection&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Se recomienda para verificar la paginación de la base de datos (&lt;a href=&quot;http://msdn.microsoft.com/es-es/library/bb402873.aspx&quot;&gt;Database Page Verify&lt;/a&gt;) el uso de la opción suma de comprobación (Checksum) pues es mucho más robusto en la detección de la corrupción de base de datos física.&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
ALTER DATABASE DatabaseName&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
SET PAGE_VERIFY CHECKSUM;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
GO&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Lock Pages in Memory&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Le recomendamos &lt;a href=&quot;http://technet.microsoft.com/es-es/library/ms190730.aspx&quot;&gt;activar la opción&lt;/a&gt; para bloquear páginas en memoria y de esta forma el sistema operativo no interfiere en la página de SQL Server. Sin embargo en 64 bits sólo tendrá que conceder el derecho de bloqueo de páginas en memoria a la cuenta de SQL para que SQL Server pueda utilizar esta característica.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/1617527787510625842?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/1617527787510625842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/1617527787510625842'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2017/07/recomendaciones-para-sql-server-con.html' title='Recomendaciones para SQL Server con Dynamics NAV'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-853717262048616366</id><published>2017-07-13T11:53:00.000+02:00</published><updated>2017-07-13T11:53:36.087+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="consultas sql"/><category scheme="http://www.blogger.com/atom/ns#" term="managment studio"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Actualizando columnas identity en SQL Server</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Aclaremos algunos conceptos&amp;nbsp;primero, la propiedad &lt;a href=&quot;https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property&quot;&gt;identity&lt;/a&gt; puede ser utilizada para generar automáticamente valores clave en una columna, con esto quiere decir que una columna identity no tiene que ser necesariamente una clave primaria, y una clave primaria no tiene que llevar necesariamente la propiedad identity.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Una columna identity no puede ser modificada (&lt;b&gt;Cannot update identity column&lt;/b&gt;), la opción identity_insert sólo permite insertar valores en este tipo de columnas, pero nunca actualizarlos. ¿cómo actualizarlos entonces?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisujoPAQEi1QNBzEwjkWQcOrtkgsewnhgYMT_a0ohSDaqS3KgbTSaYa0MtebaDFkTOCO8Ig2RiTqWctkQWRMGy82N1TyZ6tbAAEUy_huq6v9DhIhsosmY9WfkuDhkGxZzz2BtH_UbTO8I/s1600/sp_help_table1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;757&quot; data-original-width=&quot;866&quot; height=&quot;558&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisujoPAQEi1QNBzEwjkWQcOrtkgsewnhgYMT_a0ohSDaqS3KgbTSaYa0MtebaDFkTOCO8Ig2RiTqWctkQWRMGy82N1TyZ6tbAAEUy_huq6v9DhIhsosmY9WfkuDhkGxZzz2BtH_UbTO8I/s640/sp_help_table1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Pongámonos en el peor de los casos, una clave primaria de tipo identity a la que hacen referencia foreign keys de otras tablas, si necesitásemos actualizar los valores deberíamos seguir el siguiente procedimiento:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;identificar todas las foreign keys que apuntan a la columna identity que deseamos modificar (esto lo podemos hacer con el SSMS escribiendo el nombre de la tabla, seleccionándolo y pulsando Alt&amp;nbsp;+ F1, o lo que es lo mismo ejecutando el procedimiento almacenado &lt;a href=&quot;https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-help-transact-sql&quot;&gt;sp_help&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;crear y ejecutar un script para modificar todas esas foreign key de manera que al actualizar la columna de referencia se actualicen las columnas de destino ON UPDATE CASCADE&lt;/li&gt;
&lt;li&gt;desde el SSMS quitarle la propiedad identity a la columna&lt;/li&gt;
&lt;li&gt;cambiar los valores como una consulta UPDATE normal&lt;/li&gt;
&lt;li&gt;habilitar nuevamente la propiedad identity en la columna (automáticamente pondrá el valor de la semilla en 1 más que el máximo valor que hayamos insertado)&lt;/li&gt;
&lt;li&gt;modificar las foreign keys si tenían otro valor ON UPDATE&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
De esta forma podríamos actualizar columnas identity sin perder las referencias en otras tablas.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Recomiendo comprobar luego objetos que tengan &lt;a href=&quot;https://sqlstudies.com/2014/08/06/schemabinding-what-why/&quot;&gt;SCHEMABINDING&lt;/a&gt; que utilicen esta tabla porque el SSMS generalmente suele quitarles esta propiedad sin volverla a poner.&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/853717262048616366?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/853717262048616366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/853717262048616366'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2017/07/actualizando-columnas-identity-en-sql.html' title='Actualizando columnas identity en SQL Server'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisujoPAQEi1QNBzEwjkWQcOrtkgsewnhgYMT_a0ohSDaqS3KgbTSaYa0MtebaDFkTOCO8Ig2RiTqWctkQWRMGy82N1TyZ6tbAAEUy_huq6v9DhIhsosmY9WfkuDhkGxZzz2BtH_UbTO8I/s72-c/sp_help_table1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5786062601235309767.post-3046138817563737981</id><published>2017-06-01T00:45:00.001+02:00</published><updated>2017-06-01T00:45:37.005+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hardware"/><category scheme="http://www.blogger.com/atom/ns#" term="microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="surface"/><title type='text'>Trabajando con la Surface Pro 4 y accesorios</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Es mi primera entrada en dónde hablo directamente de hardware y me he animado a hacerla por los sentimientos encontrados que he sentido al probar diferentes productos de la gama Surface, en concreto la Surface Pro 4 i7 16 GB 512 SSD, &lt;a href=&quot;https://www.microsoftstore.com/store/mseea/es_ES/pdp/ARC-Touch-Mouse-Surface-Edition/productID.286995700&quot;&gt;Arc Touch Mouse&lt;/a&gt; y el &lt;a href=&quot;https://www.microsoftstore.com/store/mseea/es_ES/pdp/Microsoft-Surface-Dock/productID.326620500&quot;&gt;dock&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVLt1z5H4GwRIpD-fh7UDHAUKjwRb-oRTeRagslVsZAVi3qQ7pQaqo65Fnz2O1PqIpspSrqzhWrVraM_a1u8JdLRUX9wZy17uF06vU923LT9RrCy2KQCIsfFi8VNKOxR1uMRPPhOW_Gys/s1600/2e6b539f-cfb9-4187-bb6f-678e35343cce.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;970&quot; data-original-width=&quot;1488&quot; height=&quot;416&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVLt1z5H4GwRIpD-fh7UDHAUKjwRb-oRTeRagslVsZAVi3qQ7pQaqo65Fnz2O1PqIpspSrqzhWrVraM_a1u8JdLRUX9wZy17uF06vU923LT9RrCy2KQCIsfFi8VNKOxR1uMRPPhOW_Gys/s640/2e6b539f-cfb9-4187-bb6f-678e35343cce.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
La Surface es genial, dudaba mucho de su rendimiento pero su procesador &lt;a href=&quot;http://cpu.userbenchmark.com/SpeedTest/40238/IntelR-CoreTM-i7-6650U-CPU---220GHz&quot;&gt;i7-6650U&lt;/a&gt; de 2 núcleos no tiene nada que envidiarle a un&amp;nbsp;&lt;a href=&quot;http://cpu.userbenchmark.com/Intel-Core-i7-5930K/Rating/2578&quot;&gt;i7-5930K&lt;/a&gt; de 6. El comportamiento es excepcional, increíble pensar que en una &#39;tablet&#39; puedas tener Hyper-V activado con docker y correr un servidor SQL Server sin mayor problema. La única alteración al rendimiento ha sido habilitar mediante PowerShell el modo de energía de alto rendimiento, lo cual dispara el uso del ventilador, muy silencioso, nada comparable con mi anterior sistema de refrigeración líquida&amp;nbsp;Corsair Cooling Hydro Series H110i GT que hace un ruido infernal, sobre todo en verano.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
La única pega que tiene son los drivers, hay que estar actualizados a la última versión de Windows 10 para que todo funcione correctamente y aún así el sonido por el mini DisplayPort muchas veces no funciona y hay que reiniciar el driver. Tampoco es aconsejable utilizar las versiones de Windows Insider porque por ejemplo en la build 16199 Windows Hello deja de funcionar.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
El lápiz funciona muy bien, reconoce bastante bien lo que escribes, aunque no intentes poner una dirección web porque pone espacios donde no debe. Lo utilizo muy poco.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Los teclados funda de Microsoft para la Surface Pro 4 no están nada mal, son teclados delgados, silenciosos y cómodos, el trackpad muy bueno, lo único que no me gusta es la distribución de las teclas de función que en vez de priorizar las F prioriza funciones como subir y bajar el volumen, esto es normal en los teclados para tablets y no sería mayor problema si no fuera porque todos los teclados de la gama Surface son iguales en ese sentido, gran fallo de Microsoft en no pensar en los programadores.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
El Arc Touch Mouse es horrible, no puedes reiniciar el equipo con el encendido porque muchas veces no lo reconoce, ni apagándolo y volviéndolo a encender, tienes que apagar ambos (la Surface y el ratón) y encenderlos. No es nada intuitivo y la documentación está fatal, ¿tanto costaba poner en el manual que plegarlo o estirarlo era encenderlo y apagarlo? Es muy incómodo y el dolor de muñecas me ha obligado a dejar de utilizarlo y guardarlo sólo para viajes que es su cometido real, no es un ratón de uso diario.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
La estación de trabajo es otra cosa, acierto total con el tamaño diminuto aunque no tanto con elegir DisplayPort vs HDMI, tiene el mismo problema con los drivers. No necesita instalar nada, la Surface la detecta al instante con todas sus capacidades, puedes tener conectado un monitor externo, la tele y la Surface sin perder resolución en ninguna de las pantallas. Por ponerle una pega, no tiene botón de encendido y apagado.&lt;/div&gt;
</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5786062601235309767/3046138817563737981?isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/3046138817563737981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5786062601235309767/posts/default/3046138817563737981'/><link rel='alternate' type='text/html' href='http://scriptinside.blogspot.com/2017/06/trabajando-con-la-surface-pro-4-y.html' title='Trabajando con la Surface Pro 4 y accesorios'/><author><name>Reynier</name><uri>http://www.blogger.com/profile/05570094902277095656</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVLt1z5H4GwRIpD-fh7UDHAUKjwRb-oRTeRagslVsZAVi3qQ7pQaqo65Fnz2O1PqIpspSrqzhWrVraM_a1u8JdLRUX9wZy17uF06vU923LT9RrCy2KQCIsfFi8VNKOxR1uMRPPhOW_Gys/s72-c/2e6b539f-cfb9-4187-bb6f-678e35343cce.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>