2019-08-09

Primer y ultimo dia del mes en curso con PHP o MySQL

Ejemplo simple de como calcular le primer y ultimo dia del mes con PHP o MySQL

PHP:
$f_date = 'Y-m-d';
$my_date = new DateTime();
$my_date->modify('first day of '.date('F Y'));
echo $my_date->format($f_date);
echo "<br>";
$my_date->modify('last day of '.date('F Y'));
echo $my_date->format($f_date);

MySQL:
select 
DATE_FORMAT(now(),'%Y-%m-01') AS 'primer_dia_del_mes',
LAST_DAY(DATE_FORMAT(now(),'%Y-%m-01')) AS 'ultimo_dia_del_mes'

2019-08-07

Problema después de hacer un APT UPDATE con la extension MSSQL 17 y PHP 7 en linux debian 9

Hola gente después de hacer un mantenimiento en mi server me encontré con un problema después de hacer APT Update.

En la lista de actualizaciones, tenia que actualizaba la versión de mi extensiones PHP para MSSQL de la msodbcsql17:amd64 (17.3.1.1-1, 17.4.1.1-1) y mssql-tools:amd64 (17.3.0.1-1, 17.4.1.1-1)

Pero como esto me trajo problema de conexión entre PHP y MSSQL dejo la solución para volver atrás esos cambio y que funcione de nuevo eso.

  1. Mira en ./../apt/history.log y recuperar las versión (vieja y nueva) en mi caso msodbcsql17:amd64 (17.3.1.1-1, 17.4.1.1-1) y mssql-tools:amd64 (17.3.0.1-1, 17.4.1.1-1)  
  2. apt install msodbcsql17=17.3.1.1-1 
  3. apt install mssql-tools=17.3.0.1-1
    Listo eso es todo para volver a una versión puntual con APT-GET

    Esto también es valido para volver atrás cualquier actualizacion por APT-GET a una versión puntal; el lugar útil para encontrar los datos correcto de los cambios lo podes ver en 

    /var/log/apt/history.log y /var/log/apt/term.log

    2019-05-27

    Redireccionar con IPTABLE puerto 80 a 8080 si el servicio web no corre como ROOT por la limitación de los puerto menores a 1024



    1. Primero como ROOT a nuestro Debian
    2. ip address (Miramos cual es la interfaz de red que escucha las llamadas con el exterior en mi caso es la enp0s3)
    3. iptables -A INPUT -i enp0s3 -p tcp --dport 80 -j ACCEPT
    4. iptables -A INPUT -i enp0s3 -p tcp --dport 8080 -j ACCEPT
    5. iptables -A PREROUTING -t nat -i enp0s3 -p tcp --dport 80 -j REDIRECT --to-port 8080

    Listo miramos que desde otra maquina funciones bien la nueva regla.
    El paso a seguir es que IPTABLES guarde los cambios de manera permanente en el sistema y sean cargados siempre que inicia el sistema por medio de un demonio en el arranque.

    1. Como ROOT en Debian
    2. apt install iptables-persistent (Para facilitar las cosas vamos a instalar iptables-persistent cuando pregunta si quiere que guarde las reglas actuales, indiquen que <SI> y listo)
    3. nano /etc/iptables/rules.v4 (Para ver que las reglas están guardadas)
    4. reboot (Para ver si esta todo ok y recuperar las reglas al iniciar el sistema solo)

    Eliminar UFW y limpiar todas las reglas viejas creadas por UFW dentro del IPTABLETS


    1. Primero entramos como ROOT
    2. service ufw stop
    3. update-rc.d -f ufw disable
    4. apt remove ufw
    5. service --status-all (si esta ufw en la lista corremos el siguiente comando PUNTO 4).
    6. rm /etc/init.d/ufw
    Listo con esto eliminamos UFW del sistema por completo.

    Los siguientes pasos son para limpiar IPTABLES por completo y no dejar ninguna regla o archivo vinculado a UFW

    1. Entro como ROOT
    2. iptables -t nat -F
    3. iptables -t mangle -F
    4. iptables -F
    5. iptables -X
    Listo quedo limpio IPTABLETS, para ver que no hay reglas solo ponemos

    1. Como ROOT
    2. iptables -L

    2018-12-28

    BackUp con PowerShell Copiar archivos modificados en las ultimas 8hs y guardarlos en un Zip

    Hola gentes acá dejo un simple linea de comando para PowerShell, que permite buscar los archivos que fueron modificados las ultima 8 horas en un PATH X y comprimirlo en un Destino X en formato ZIP.

    Get-ChildItem -Path "C:\Users\linux\Desktop\*.doc" | Where-Object CreationTime -GT (Get-Date).AddHours(-8) | Compress-Archive -DestinationPath "C:\BackUp\mis-docs.zip"

    2018-08-22

    Configurar Server OpenSSH en Debian 9.5 con PublicKey tipo ED25519 que es mas segura que RSA y conectar con Putty

    Hola Amigos acá les dejo todo lo que hay que hacer para configurar el Server OpenSSH en Debian 9.5

    En estos pasos damos por entendido que el usuario que esta realizando los pasos es "user1" y en algunos momento "root" para otros cambios. Y tambien esta mis PC es la que tiene instalado el Server OpenSSH an que queremos entrar desde otro PC con Linux o Putty con Windows

    Linux donde instalamos el server OpenSSH

    Paso 1)
    Ver si tenes instala Server OpenSSH
    su root /etc/init.d/ssh status

    Si no existe el servicio, es porque no esta instalado, si existe pasa al paso 3

    Paso 2)
    Instalar Server SSH ponemos todo "YES"

    su root apt install openssh-server

    Paso 3)
    Configurar el server para poder entrar solo con clave y cambiar alguna parámetros por seguridad.

    echo '' > /var/log/sshd_banners
    su root nano /etc/ssh/sshd_config
    Cambiar el archivo sshd_config con
    Protocol 2 # <= inserta si no esta en el archivo
    Port 22 # <= Por otro numero distinto al estándar eje 2822
    PermitRootLogin no
    AllowUsers user1 user2 # <= lista de usuario en el sistema /home/xxx que van a entrar por ssh
    PubkeyAuthentication yes
    LoginGraceTime 2m
    PasswordAuthentication no
    PermitEmptyPasswords no
    StrictModes yes
    UsePAM no
    X11Forwarding no # <= Solo si trabajamos en modo consola
    PermitTunnel no
    UsePrivilegeSeparation sandbox
    PrintMotd no
    PrintLastLog yes
    Banner /var/log/sshd_banners.log
    Paso 4)
    Generar la clave publica y privada de tipo ED25519 y es recomendable poner un password para mas seguridad a la key que vamos a generar, si alguien te la roba también tiene que saber el password para poder utilizarla. Damos todo entre y ponemos un password o lo dejamos en blanco.
    ssh-keygen -t ed25519
    Paso 5)
    Ya tenemos los dos  archivos generado en nuevos directorio /home/user1/.ssh/
    id_ed25519          <= privada
    id_ed25519.pub   <= publico

    Paso 6)
    Crear el archivo "authorized_keys" que va en ese mismo directorio que va ir a buscar el mismo Server OpenSSH, copiamos la key publica a authorized_keys.
    cp -p /home/user1/.ssh/id_ed25519.pub /home/user1/.ssh/authorized_keys
    Paso 7)
    Reiniciamos el servicio de OpenSSH, para que tome todo los cambios.
    su root /etc/init.d/ssh restart
    Paso 8)
    En la misma Pc que tiene el server SSH  que es a donde queremos entrar desde windows con Putty por ejemplo. Ya esta listo, el server linux. Lo que nos queda hacer es sacar la clave privada "id_ed25519"

    Sacar la key privada para copiarla y llevar a PuTTYgen.
    cat /home/user1/.ssh/id_ed25519
    Paso 9)
    Copiamos todo lo que salio por pantalla, lo guardamos en un archivo key-user1-pri.ppk y pegamos dentro todo.

    -----BEGIN OPENSSH PRIVATE KEY-----
    b3Bsasasasadwfrrfrferwfewfefewfewcxzffgfdasfsd
    ........
    ........
    7owz/DzjZrPx1ABOSWlsaskakjsakljfiedGLg/m0=
    -----END OPENSSH PRIVATE KEY-----


    Windows Putty

    Paso 10)
    Abrimos PuTTYgen => "Load" y buscar el archivo creado antes como ejemplo "key-user1-pri.ppk"
    le ponemo el password si lo pide.
    Aceptamos el mensaje que muestra el programa.
    Y después marcamos "ED25519"
    Cuando este marcado, apretar el botón "Save private key" y se puede pisar el archivo cargado o crear una nuevo.


    Paso 11)
    Abrimos Putty y poner
    IP del server linux a conectar
    Cambiar el puerto si es distinto a 22
    Connection =>  Data => Auto-login poner el nombre del usuario del key "user1"
    Connection => SSH => Auth => Private key ... buscar el archivo nuevo reformatiado con PuTTYgen
    Volvemos a Session => Saved Sessions, ponemos un nombre y click en "Save"
    Y por ultimo "Open"

    Y listo tendría que poder entrar al server OpenSSH sin problema, si tu key tiene password te la va a pedir, si no tiene entrar directo al server.





    2018-01-17

    Configurar Google Cloud AppEngine + PHP Flex + CakePHP 3.5.*

    Como configurar CakePHP 3.5 dentro de Google Cloud con AppEngine (PHP Flex) y me costo  mucho por  eso dejo acá los pasos a seguir con la versión 3.5.*.

    Primero pasos entrar a la consola shell de google por el navegador y pone estas lineas para instalar composer en AppEngine:

    mkdir -p ${HOME}/bin
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    php -r "if (hash_file('SHA384', 'composer-setup.php') === rtrim(file_get_contents('https://composer.github.io/installer.sig'))) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
    php composer-setup.php --filename=composer --install-dir=${HOME}/bin
    export PATH=${HOME}/bin:${PATH}

    Listo, ya poder ejecutar composer en la consola

    composer
       ______
      / ____/___  ____ ___  ____  ____  ________  _____
     / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
    / /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
    \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                        /_/
    Composer version 1.2.0 2018-01-17 01:28:52
    
    ...
    ...


    Después hay que bajar cakephp 3.5.* y sus dependencias con composer

    composer self-update && composer create-project --no-dev --ignore-platform-reqs --prefer-dist cakephp/app CK35 3.5.*


    Editar el archivo CK35/composer.json y agregar la extencion intl que es requerida para que la active AppEngine en el Deploy de manera automatica por Google Cloud

    "require": {
            "php": ">=5.6",
            "ext-intl": "*",
            "cakephp/cakephp": "3.5.*",
            .....,
            .....,
    },
    ......
    .....


    Crear un archivo en CK35/app.yaml para activar el entorno PHP Flex, indicar la carpeta root publica, el archivo por el que pasan todas las llamas, carpeta estaticos que son publicas. Y variables del sistema que pueden ser leidas por PHP, para configurar la DBs, Debug, etc.. esto ultimo es a gusto.

    runtime: php
    env: flex
    runtime_config:
      document_root: webroot
      front_controller_file: index.php
    
    handlers:
    - url: /css
      static_dir: webroot/css
    - url: /img
      static_dir: webroot/img
    - url: /js
      static_dir: webroot/js
    - url: /favicon\.ico
      static_files: webroot/favicon.ico
      upload: webroot/favicon.ico
    - url: /.*
      script: index.php
    
    env_variables:
      # Uncomment the following to enable debug mode.
      CAKEPHP_DEBUG: '1'
    
      # If connecting via TCP/IP to Google Cloud SQL
      PROD_DB_HOSTNAME: "__PROD_DB_HOSTNAME__"
      PROD_DB_PORT: "__PROD_DB_PORT__"
    
      # If connecting via App Engine to Google Cloud SQL
      PROD_DB_UNIXSOCKET: "__PROD_DB_SOCKET__"
      PROD_DB_USERNAME: "__PROD_DB_USERNAME__"
      PROD_DB_PASSWORD: "__PROD_DB_PASSWORD__"
      PROD_DB_DATABASE: "__PROD_DB_DATABASE__"
    
      # Change below to match your settings for local development.
    
      # If connecting to MySQL using TCP/IP
      DEV_DB_HOSTNAME: "__DEV_DB_HOSTNAME__"
      DEV_DB_PORT: "__DEV_DB_PORT__"
    
      # If connecting to MySQL using sockets.
      DEV_DB_UNIXSOCKET: "__DEV_DB_SOCKET__"
      DEV_DB_USERNAME: "__DEV_DB_USERNAME__"
      DEV_DB_PASSWORD: "__DEV_DB_PASSWORD__"
      DEV_DB_DATABASE: "__DEV_DB_DATABASE__"


    Con esto, ya estamos listo para ejecutar el deploy dentro de la carpeta CK35 donde esta el app.yaml

    CK35/gcloud app deploy


    Le comento que hay que comentar en bootstrap.php la linea que carga los plugins que son instalados por composer para DEV ya que cuando se hace un DEPLOY no van a estar disponible los archivos y va da error que no encuentra los archivos, este error tonto puede hacer buscar el problema por un rato.  Un ejemplo es el Plugin DebugKit que es un requerimiento DEV para composer.

    O manejar de manera correcta la variable de entorno y poder CAKEPHP_DEBUG = '0' para que los plugin que se cargan para DEV no se intenten cargar después de hacer el DEPLOY


    2016-09-28

    GulpJS y plugins base para un WordFlow de entorno Web.

    Comando a ejecutrar para tener todo instalado, mas informacion ver el link de abajo donde se documenta cada tack dentro de gulpfile.js
    Claro que se tomo que tiene instalado nodejs en su PC

    Comandos para el Terminal:
    npm install -g gulp-cli
    npm init
    npm install --save-dev gulp #admin de tareas wordflow
    npm install --save-dev gulp-sass #scss a css
    npm install --save-dev browser-sync #servidor web de desarrollo
    npm install --save-dev gulp-useref #Combinar multiples <script src="..." o <link rel="..."
    npm install --save-dev gulp-uglify #Compactar JS en ...min.js
    npm install --save-dev gulp-cssnano #Compactar CSS en ...min.css
    npm install --save-dev gulp-if #Se utiliza junto a gulp-uglify o gulp-cssnano
    npm install --save-dev gulp-imagemin #Optimiza imagenes
    npm install --save-dev gulp-cache #Cache lo de gulp-imagemin para evitar generar el proceso si no cambia la imagen
    npm install --save-dev del #Para limpiar la carpeta ./dist/* o ./builder/*
    npm install --save-dev run-sequence #Para ejecutar en orden despues que finaliza cada tarea por mas que alguna tarde menos y modifique la secuencia

    Mas info en Ingles:
    https://css-tricks.com/gulp-for-beginners/

    2016-02-18

    Tutorial para darle permiso remoto a un usuario Vagrant para entrar a MySQL desde una IDE Remota como Navicat.



    En la linea de comando en la consola, ponemos esto para tener permiso externos con el user root, para todas la database que tenga mysql dentro.

    mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION; FLUSH PRIVILEGES;"

    Con este código de abajo lo hacemos solo para el usuario user1demo y solo para una database: db1demo: en lugar de ver todas las DB que hay dentro, esto es para una mayor control.
    mysql -u root -e "GRANT ALL PRIVILEGES ON db1demo.* TO 'user1demo'@'%' IDENTIFIED BY '' WITH GRANT OPTION; FLUSH PRIVILEGES;"

    Y después nos conectamos vía SSH al equipo MySQL en mi caso lo estoy haciendo a una maquina virtual creada con Vagrant + Puphpet.com con Navicat Premium como IDE remota para trabajar con MySQL.

    Login con los datos para entrar a mysql desde la consola que utilizamos antes y que cargamos en Puphpet para configurar a mysql:


    Set datos para entrar por SSH a la maquina virtual vía Navicat:



    Datos de mi conexión de ejemplo con Navicat Premium lo importante esta en negrita y puede cambiar según los cargado en Puphpet.com, em nombre de mi maquina viertual es M1 pero puede ser cualquiera.


    ********************
    *General Information
    ********************
    Tipo de servidor: MySQL
    Nombre de Conexión: M1
    Nombre del Host/ Dirección IP: 127.0.0.1
    Puerto: 3306
    Nombre de usuario: dbuser
    Guardar contraseña: True

    ********************
    *Advanced Information
    ********************
    Configuración de Localización: C:\Users\xxTuUserxx\Documents\Navicat\MySQL\servers\M1
    Codificación: 65001 (UTF-8)
    Mantener el Intervalo (sec): N/A
    Usar conjunto de carácteres de MySQL: True
    Uso de Compresión: False
    Conexión automática: False
    Uso Avanzado de Conexiones: False

    ********************
    *SSL Information
    ********************
    Usar SSL: False
    Usar Autentificación: False
    Clave de Cliente: 
    Certificado de Cliente: 
    Certificado de CA: 

    ********************
    *SSH Information
    ********************
    Uso del túnel SSH: True
    Nombre del Host/ Dirección IP: 127.0.0.1
    Puerto: 2222
    Nombre de usuario: vagrant
    Método de autentificación: clave Pública
    Clave Privada: C:\test\m\.vagrant\machines\m1\virtualbox\private_key
    Guardar Frase de Contraseña: False

    ********************
    *HTTP Information
    ********************
    Usar túnel HTTP: False
    Túnel URL: 
    Codificar la consulta de salida con Base64: False
    Usar la autenticación de la contraseña: False
    Nombre de usuario: 
    Guardar contraseña: False
    Utilice la autenticación de certificado: False
    Clave de Cliente: 
    Certificado de Cliente: 
    Certificado de CA: 
    Use Proxy: False
    Proxy Host: 
    Proxy Puerto: 0
    Proxy Nombre de usuario: 
    Proxy Guardar contraseña: False

    ********************
    *Other Information
    ********************
    Versión de Servidor: N/A
    Protocolo: N/A
    Info: N/A