domingo, noviembre 23, 2014

Instalando en CENTOS7, MYSQL, WEBMIN, PHPMYADMIN, PENTAHO, JDK 32 Bits

1.- Remover todo java :

yum remove jdk
yum remove java

2.- Decargamos el paquete de JDK, procedemos a instalar

rpm -Uvg jdk-7u71-linux-i586.rpm

3.- Si reporta este problema:
/var/tmp/rpm-tmp.SkXgmf: /usr/java/jdk1.7.0_71/bin/unpack200: /lib/ld-linux.so.2                          : bad ELF interpreter: No existe el fichero o el directorio
Error: unpack could not create JAR file:

Se debe a la falta de ciertas librerias para que sea compatibles, ejecutamos el siguiente comando, para proceder a instalar las librerias faltantes:


yum install glibc.i686 elfutils-libelf.i686 elfutils-lib.i686s elfutils-libelf-devel.i686 elfutils-libelf-devel-static.i686 -y --disableexcludes=all
yum install libgcc_s.so.1

4.- Eliminar el paquete de java

yum remove jdk

5.- Ejecutamos

rpm -Uvg jdk-7u71-linux-i586.rpm

 6.-  Revisar la version de java
java -version


Instalar WebMin.
Desde esta url: WebMin, descargar el ultimo paquete de webmin

En este caso corresponde a:
wget http://prdownloads.sourceforge.net/webadmin/webmin-1.710-1.noarch.rpm

Ejecutamos:
rpm -U webmin-1.710-1.noarch.rpm

Instalar MySQL Server 5.6 en CentOS 7 / RHEL 7

Instalar MySQL Server 5.6 en CentOS 7 / RHEL 7

Siempre con el usuario root:

1.- Descargar el paquete, el permite crear el archvio repositorio yum repo para MySQL Server.
yum install wget

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm


2.- Instalar el paquete mysql-community-release-el7-5.noarch.rpm

rpm -ivh mysql-community-release-el7-5.noarch.rpm


3.- Instalando MySQL Server

yum install mysql-server

4.- Como start/stop/restart MySQL Server

Ahora MySQL Server esta instaldo en su sistema.

5.- Para start MySQL Service, ejecute este comando.
systemctl start mysqld

  
6.- Para stop MySQL Service, ejecute este comando
systemctl stop mysqld

7.- Para restart MySQL Service, ejecute este comando
systemctl restart mysqld

8.- Para revisar status of MySQL Service, ejecute este comando
systemctl status mysqld

9.- Reiniciar el servicio de MYSQL Server
systemctl restart mysqld

11.- Ejecutar este script para asignar un correcto password a MYSQL Server
mysql_secure_installation

12. Activar Mysql.
    service mysqld restart
    chkconfig mysqld on
13. Ingresar a mysql
    mysql -u root – p
14. Digitar password
15. En Mysql creamos el usuario root
    CREATE USER 'root'@'%' IDENTIFIED BY 'clave';
16. Proporcionamos todos los privilegios a este usuario.
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'clave' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
17. Desactivar Firewall
    service iptables stop

viernes, noviembre 21, 2014

CentOS: instalando Apache Portable Runtime (APR) para Tomcat en Pentaho



En Tomcat, conector HTTP es BIO (Blocking I/O) con estabilidad, pero baja concurrenciao. Para aumentar el rendimiento de Tomcat, las formas alternativas o bien adaptar NIO (sin bloqueo de E / S - Non-Blocking I/O) o con el conector APR (Apache Portable Runtime). Sobre todo, el rendimiento de APR es en general mejor que otros al utilizar el protocolo SSL. Para más detalles sobre el rendimiento entre estos conectores puede hacer referencia a la comparación de Mike Noordermeer.

Prerequisiteo para instalar APR.

  • Libreria APR
  • Libreria APR-util
  • Libreria OpenSSL
Para empezar nuestra instalación, se requiere instalar el OpenSSL, porque teniamos instalado CentOS 6.3 con soporte de instalación mínimo:

# yum install openssl-devel

Se debe ejecutar el comando configure o make en los siguientes pasos, primero se debe instalar las herramientas relacionadas, las mismas que se instalan con el siguiente comando:

# yum groupinstall "Development Tools"

Descargar y Instalar APR

# wget http://ftp.mirror.tw/pub/apache/apr/apr-1.4.8.tar.gz
# tar -zxvf apr-1.4.8.tar.gz
# cd apr-1.4.8
# ./configure
# make
# make install
 
El directorio por omisión de la instalación es: /usr/local/apr

Dedscargar e Instalar APR-util

# wget http://ftp.mirror.tw/pub/apache/apr/apr-util-1.5.2.tar.gz
# tar -zxvf apr-util-1.5.2.tar.gz
# cd apr-util-1.5.2
# ./configure --with-apr=/usr/local/apr
# make
# make install
 
El directorio por omisión de la instalación es: /usr/local/apr/lib

Instalar JNI Wrapper para APR usado por Tomcat (libtcnative)

# cd $CATALINA_HOME/bin
# tar -zxvf tomcat-native.tar.gz
# cd tomcat-native-1.1.27-src/jni/native
# ./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.7.0_25
# make
# make install
 
Las librerias native son instaladas en: /usr/local/apr/lib

Integrar APR con Tomcat

Los dos caminos se puede integrar APR con TOMCAT. Primero se puede adionar el siguiente parametro para que se ejecute cunado inicie el TOMCAT modificar el siguiente archivo:  bin/catalina.sh:

Incluyendo la siguiente sentencia:

CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
 
Segunda forma es adicionando una variable de ambiente llamada LD_LIBRARY_PATH en el archivo que genera las variables de ambiente:  /etc/profile:

Incluir la siguiente linea.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
 
Para que tenga efecto ejecutar lo siguiente:

# source /etc/profile 
 
Despues de reiniciar el servicio de Tomcat, se debe revisar el archivo de logs de mensajes llamado  catalina.out log revisar si el APR ha sido correctamente instalado.

Sep 06, 2013 2:10:09 AM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.27 using APR version 1.4.8.
Sep 06, 2013 2:10:09 AM org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].

Tomcat SSLEngine Error

SEVERE: Failed to initialize the SSLEngine.
org.apache.tomcat.jni.Error: 70023: This function has not been implemented on this platform
    at org.apache.tomcat.jni.SSL.initialize(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.catalina.core.AprLifecycleListener.initializeSSL(AprLifecycleListener.java:259)
    at org.apache.catalina.core.AprLifecycleListener.lifecycleEvent(AprLifecycleListener.java:110)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:99)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:640)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:665)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
 
Si desplega este mensaje de error su siio esta sin soporte de SSL, se puede corregir este error inicializando en apahgado dentro del siguiente archivo: conf/server.xml.

Modifique o inserte con el siguiente contenido:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
 

domingo, noviembre 16, 2014

¿Qué es Scrum?

Scrum es un proceso en el cuál se aplican conjuntos de buenas prácticas para que podamos trabajar colaborativamente, en grupo (equipo) y así poder obtener buenos resultados. La productividad es uno de los objetivos de la metodología Scrum.
Scrum está dedicado a proyectos que tienen un entorno un poco complejo, ya que se necesita obtener buenos resultados y en menor tiempo podemos destacar que los puntos fundamentales son la innovación, la competitividad y la productividad. Está metodología también sirve para agilizar las entregas con el producto final del cliente (los tiempos de entrega), cuándo es necesario identificar y darle solución a problemas de proyectos.
En metodología de Scrum se ejecuta por bloques temporales cortos y fijos, a continuación las actividades que se llevan a cabo en Scrum:

Planificación de la iteración (reunión)

Donde se ve la selección de los requisitos (con un máximo de 4 horas) el cliente es quién expone éstos requisitos priorizados del proyecto, aquí es dónde se aclaran dudas con el cliente, etc. Posteriormente el equipo elabora la lista de tareas de la iteración para desarrollar los requisitos del cliente con el que se ha comprometido (con un máximo de 4 horas) se asignan las tareas a los miembros del equipo.

Ejecución de la iteración (standup)

Todos los días se realiza una pequeña junta dónde generalmente se le llama cómo sincronización la cuál dura 15 minutos, cada miembro menciona el status de su tarea, progresos, obstáculos unas de las preguntas básicas que debe responder cada miembro del equipo es:
¿Qué es lo que ha realizado desde la última junta de sincronización?
¿Qué hará a partir de esté momento?
¿Cuáles son los obstáculos que tengo y cuáles obstáculos creó que tendré?
El líder tiene que estar muy al pendiente de que los miembros del equipo cumplan adecuadamente con sus tareas y con lo que harán para que la productividad no se vea afectada.

La inspección y adaptación

Aquí es dónde el último día de la iteración se hace una junta de revisión de la iteración la cuál tiene el objetivo de demostrar al cliente los requisitos completos en la iteración, en forma de incremento del producto (un máximo de 4 horas). Y por último la retrospectiva dónde el equipo es quién analiza cómo ha fue su manera de trabajar y ver los problemas presentados.
- See more at: http://www.codejobs.biz/es/blog/2013/08/20/que-es-scrum#sthash.6C1jaK85.dpuf

sábado, noviembre 15, 2014

Cinco claves para instaurar en la empresa los hábitos del trabajo productivo

Los líderes empresariales deben ser transparentes, accesibles, establecer metas y plazos realistas y contribuir con hechos, no solo palabras, al objetivo de la productividad y el éxito de la organización.
Implantar una cultura de la productividad en la empresa pasa por cinco puntos cardinales para ayudar a las organizaciones a consolidar unos derechos y hábitos del trabajo productivo.
Lo primero es la actitud. A la hora de seleccionar un grupo de candidatos estos deben estar técnicamente cualificados para los puestos pero, además, deben serpersonas entusiastas. “Profesionales que aprenden del fracaso, reaccionan rápidamente bajo presión y no trasladan culpas”, ha señalado Jenna Fernandes, CEO de CareBooker.com, a The Fast Company.
Además, las reuniones de equipo deben comenzar con una agenda clara y concisa que incluya los objetivos para tomar decisiones. Después debe hacerse un seguimiento de las medidas adoptadas con plazos realistas para su ejecución.
Las metas pueden diluirse si se asignan plazos poco realistas y si se imponen con demasiada frecuenciapeticiones “urgentes”.
Asimismo, un jefe debe ser accesible, estar disponible y conceder a los empleados tiempo para hablar y escucharles. Esto permite ejecutar más rápido los proyectos y extraer del diálogo ideas nuevas que pueden mejorar la empresa, sus procesos y productos.
Además, ser transparente y mostrar a los trabajadores cómo pueden conseguir sus metas, no solo con palabras sino con hechos, ayuda a que el equipo se sienta acompañado en el objetivo de la productividad y el éxito de la empresa.
En España, el año pasado un estudio reveló que el 78% de los ejecutivos nacionales valoró el trabajo flexible como medida para mejorar la productividad (tres puntos porcentuales por encima de la media mundial), no sólo por la reducción de desplazamientos o espacio de oficina no utilizado, sino también en cuanto a la eficiencia de los profesionales.
El 80% de los encuestados destacó el gran sentido de la responsabilidad que genera el trabajo flexible y el 71% lo asoció a un aumento de la creatividad.
Otras medidas valoradas para elevar la productividad de los empleados son ofrecer formación o formas saludables de ir al puesto de trabajo (andando o en bicicleta).

Cómo hacer un Procedimiento Almacenado en MySQL sin morir en el intento

Antes de escribir un sólo comando les recomiendo ampliamente instalar el MySQL Workbench no saben el dolor de cabeza que les quitará su validador (me lo agradecerán de por vida), lo pueden descargar de aquí.
Pues bien, lo primero que explicaré será el comando DROP PROCEDURE IF EXISTS, este comando sirve para eliminar el PA si previamente existe (NOTA: este debe ser agregado antes del DELIMETER), esto es útil por ejemplo cuando estamos modificando nuestro PA y necesitamos estar actualizandolo constantemente, la sintaxis sería así:
  1. DROP PROCEDURE IF EXISTS myProcedure;
Bien, una vez visto eso, el siguiente comando que veremos será el DELIMETER, se refiere a escribir un delimitador para nuestras consultas SQL, este delimitador se debe específicar cuando vamos a tener varias consultas dentro de nuestro PA para decirle a MySQL que todo lo que este dentro de ese delimitador formará parte de ese PA, tu puedes elegir cualquier delimitador, pero entre los más comunes están:
  1. DELIMETER //
  2. ....
  3. //
O bien:
  1. DELIMETER $$
  2. ....
  3. $$
Después de escribir nuestro delimitador, vamos a crear nuestro PA con el comando CREATE PROCEDURE, cuya sintaxis debe ser así:
  1. CREATE PROCEDURE myProcedure({[PARAMS]})
  2. BEGIN
  3. ....
  4. END
Sin duda muchos verán que esto es similar a cuando programabas en Pascal o un lenguaje prehístorico dónde tenías que específicar los bloques de INICIO y FIN, y los parámetros aquí son opcionales.

Parámetros

Cuando creamos un nuevo PA los parámetros son opcionales y sin duda estos son de gran ayuda cuando necesitamos pasar algunos valores, la forma de específicar estos parámetros es la siguiente:
  1. CREATE PROCEDURE myProcedure(
  2. IN _language VARCHAR(2),
  3. IN _page INT,
  4. IN _max INT)
  5. BEGIN
  6. ....
  7. END
Cuando son muchos parámetros una buena técnica de separación y para poder ordenar y ver mejor los parámetros es dar un enter a cada uno y separarlos por comas (,). La sintaxis para estos parámetros es simplemente escribir el comando IN seguido del nombre del parámetro (recomiendo poner guiones bajos al principio de cada parámetro, leer la explicación en el siguiente párrafo) y después específicar su tipo (INT, VARCHAR, TINYINT, etc.).

Declaración de variables

Cuando creamos un PA en MySQL esté nos permite crear variables para poder asignarles algún valor e inclusive hacer ciertas validaciones, para declarar una variable se debe utilizar el comando DECLARE, una recomendación personal es que todas las variables que vayas a crear en tu PA les antepongas un guión bajo (_) y además utilices la técnica de camelCase, esto se debe a que muchas veces utilizamos variables con nombres genéricos que pudieran ser palabras reservadas de MySQL y esto nos puede causar problemas sin que nos demos cuenta en un principio y es muy complicado encontrarlos, por ejemplo si declaramos la variable "status", nos puede causar conflicto puesto que STATUS es una palabra reservada que utiliza MySQL como comando, en este caso para ver los PAs existentes con SHOW PROCEDURE STATUS, este caso lo mejor sería declararla como "_status" y nos libramos de problemas, unos ejemplos de variables serían:
  1. DECLARE _start INT DEFAULT 0;
  2. DECLARE _limit1 INT DEFAULT 0;
  3. DECLARE _limit2 INT DEFAULT 0;
  4. DECLARE _language VARCHAR(2) DEFAULT 'en';
Una vez que hemos declarado nuestras variables si necesitamos asignarle algún valor diferente en algún punto de nuestro código podemos utilizar el comando SET, de la siguiente manera:
  1. IF _page > 0 THEN
  2. SET _limit1 = _page * _max - _max;
  3. END IF;

Comparaciones IF... THEN ... ELSE ... END IF

Cómo en todo lenguaje hay veces que necesitamos hacer bifurcaciones a nuestros códigos y tomar caminos distintos dependiendo de la situación, pues en MySQL tenemos la posibilidad de utilizar los IFs al crear nuestros PAs, aunque sin duda se utilizan un poco de manera un poco "rudimentaria" y me recuerda a Pascal sin duda alguna, pero bueno aquí te dejo algunos bloques de IFs que puedes utilizar.
  1. IF _variable1 > 0 AND _variable2 == 1 THEN
  2. ....
  3. END IF;
  1. IF _variable1 > 0 OR _variable2 == 1 THEN
  2. ....
  3. ELSE
  4. ....
  5. END IF;
  1. IF _variable1 == 0 OR _variable2 == 1 THEN
  2. ....
  3. ELSE
  4. IF _variable1 <> 5 THEN
  5. ....
  6. END IF;
  7. END IF;

Selects

Los SELECT en MySQL normalmente los utilizamos para "seleccionar" ciertos campos y hacer ciertas condiciones para que nos regresen ciertos registros dentro de X tabla. Aunque en un PA sirven para lo mismo también tienen otra funcionalidad y es la de "regresar" los valores seleccionados como resultados (es decir, como que si fueran un RETURN de una función, cabe destacar que con PA no se puede utilizar RETURN).
No tan sólo sirve para "Seleccionar" registros de una db, también sirve para "Seleccionar" una variable o ciertos valores que queramos enviar "de regreso cómo resultado".
Un claro ejemplo es cuando tenemos la necesidad de hacer un "debug" a nuestros PA, la manera más fácil de hacerlo es crear un PA llamado debug, de la siguiente manera:
  1. DELIMITER $$
  2. CREATE PROCEDURE debug(msg VARCHAR(255))
  3. BEGIN
  4. SELECT CONCAT("*** ", msg) AS '*** DEBUG:';
  5. END $$
  6. DELIMITER
En el PA debug, recibimos cómo parámetro un "mensaje" o texto el cual enviaremos cuando queramos "debuggear" algún valor o variable de otro PA. La función CONCAT cómo su nombre lo indica sirve para concatenar una cadena con otra, en este caso concatenar los *** con el mensaje, y esto para que podamos identificar fácilemente el mensaje de debug que nos regresa, en otro PA, se puede utilizar simplemente mandandolo a llamar de la siguiente manera:
  1. DROP PROCEDURE IF EXISTS getPosts;
  2.  
  3. DELIMITER $$
  4.  
  5. CREATE PROCEDURE getPosts(
  6. IN _language VARCHAR(2),
  7. IN _page INT,
  8. IN _max INT)
  9. BEGIN
  10. DECLARE _start INT DEFAULT 0;
  11. DECLARE _limit1 INT DEFAULT 0;
  12. DECLARE _limit2 INT DEFAULT 0;
  13.  
  14. SET _limit1 = 0;
  15. SET _limit2 = _max;
  16.  
  17. CALL debug(_limit2);
  18. END $$
  19. DELIMITER ;
De esa manera podremos saber que valor tiene la variable "_limit2", y ese valor lo podremos ver en nuestro resultset cuando ejecutemos nuestro PA.
Regresando un poco al tema de los SELECT, cómo decía, en un PA podemos tener tantos SELECT cómo queramos y cada uno nos regresará un resultset, quiere decir, supongamos que usamos PHP para llamar ese PA, normalmente cuando hacemos una consulta "sencilla" en PHP nos regresa los valores en una matriz algo tipo:
  1. [0] => Array([0] => ["Campo"] => valor);
Pero cuando mandamos 2 ResultSets, en este caso el del Debug y el de los valores, recibiremos algo así (espero se entienda la idea):
  1. [0] => Array([0] => ["**Debug:"] => 'EL MENSAJE DEL DEBUG'); // Debug resultset
  2. [1] => Array([0] => ["Campo"] => valor); // Valores resultset
Cómo último consejo les digo que la clausula LIMIT solamente acepta valores de tipo INT divididos en 2 variables, por eso ven las variables _limit1 y _limit2, en un principio yo intentaba hacerlo concatenando los valores en un string tipo "0, 12", pero jamás resulto, es un buen tip que les puede servir, y bueno aquí les dejo el PA que hice ayer y espero les pueda servir un poco cómo ejemplo, es para obtener los posts de un blog, los veo en la siguiente publicación, saludos. No olviden escribir sus dudas en los comentarios.
  1. DROP PROCEDURE IF EXISTS getPostsByCategory;
  2.  
  3. DELIMITER $$
  4.  
  5. CREATE PROCEDURE getPostsByCategory(
  6. IN _category VARCHAR(100),
  7. IN _language VARCHAR(2),
  8. IN _page INT,
  9. IN _max INT)
  10. BEGIN
  11. DECLARE _start INT DEFAULT 0;
  12. DECLARE _limit1 INT DEFAULT 0;
  13. DECLARE _limit2 INT DEFAULT 0;
  14.  
  15. SET _limit1 = 0;
  16. SET _limit2 = _max;
  17.  
  18. IF _page > 0 THEN
  19. SET _limit1 = _page * _max - _max;
  20. END IF;
  21.  
  22. SELECT COUNT(1) AS total
  23. FROM (
  24. SELECT blog_posts.id FROM blog_posts
  25. LEFT JOIN blog_re_categories2posts ON (blog_re_categories2posts.postId = blog_posts.id)
  26. LEFT JOIN blog_categories ON (blog_categories.id = blog_re_categories2posts.categoryId)
  27. WHERE blog_categories.slug = _category
  28. GROUP BY blog_posts.id
  29. ) AS Result;
  30.  
  31. SELECT title, blog_posts.slug, excerpt, content, author, mainImage, createdAt, day, month, year, blog_posts.language, GROUP_CONCAT(blog_categories.category SEPARATOR ', ') AS categories
  32. FROM blog_posts
  33. LEFT JOIN blog_re_categories2posts ON (blog_re_categories2posts.postId = blog_posts.id)
  34. LEFT JOIN blog_categories ON (blog_categories.id = blog_re_categories2posts.categoryId)
  35. WHERE blog_categories.slug = _category
  36. AND blog_posts.language = _language
  37. AND blog_categories.language = _language
  38. AND blog_posts.situation = 'Published'
  39. GROUP BY blog_posts.id
  40. ORDER BY blog_posts.id DESC
  41. LIMIT _limit1, _limit2;
  42. END $$
  43. DELIMITER ;
Para mandar a llamar los PA simplemente se utiliza el comando CALL en nuestra query.
  1. CALL myProcedure(1, 2, 'Valor string', 3);
  2.  
  3. // En PHP sería algo tipo:
  4.  
  5. $query = mysqli_query("CALL myProcedure(1, 2, 'Valor string', 3)");
- See more at: http://www.codejobs.biz/es/blog/2014/07/09/como-hacer-un-procedimiento-almacenado-en-mysql-sin-morir-en-el-intento#sthash.6X4pBcKv.eSPatRJj.dpuf