martes, 30 de diciembre de 2014

Linux: Buscar archivos por consola

¿Cómo buscar archivos en linux desde consola de comandos?


Listo un conjuto de comandos útiles para realizar búsquedas en linux (Ubuntu):

  • Todos los pdf que hay en el directorio folder en forma recursiva:


find .  -iname "*.pdf"

(Nota: Se puede reemplazar el punto ‘.’ por el directorio donde uno desea buscar ‘./folder/’. Por ejemplo: find ./folder/  -iname "*.pdf")

  • Todos los archivos desde el directorio actual donde contenga un texto:


find . -type f -exec grep -H 'text-to-find-here' {} \;

(Nota: Esta instrucción ejecutaría en todos los ficheros la comparación con el patrón, esto lo hace a través de la opción ‘-exec’ acompañada de la instrucción a ejecutar ‘grep’, los corchetes ‘{}’ se refieren a los ficheros que la instrucción ‘find’ ha encontrado y la barra invertida ‘\;’ indica el final de la instrucción.)

Por ejemplo, cambiar los permisos de acceso a los directorios desde donde estamos ubicados:
find . -type d -­exec sudo chmod 755 '{}' \;

O cambiar los permisos de acceso a los ficheros desde donde estamos ubicados:
find . ­-type f ­-exec sudo chmod 644 '{}' \;

  • Todos los archivos menos los acabados en .pdf o .jpg.


find . ! -iname “*.pdf” ! -name “*.jpg”

  • Todos los jpg que no tengan en su nombre la letra “k”:


find . ! -iname “*k*” -iname “*.jpg”

  • Todos los enlaces simbólicos:

find . -type l




martes, 16 de diciembre de 2014

Ubuntu: Conectarse por SSH-FTP a servidor remoto


(How To Use SFTP to Securely Transfer Files with a Remote Server)

Acceso por el explorador de directorios (Nautilus):


Entramos a consola de comandos y tipeamos:
sudo nautilus

Seleccionar opción de menu:
GO > Location
Y agregamos:

Y despues adicionarlo como bookmarks:  Bookmarks>Add bookmarks

Solo por línea de comandos


sftp username@remote_hostname_or_IP


Referencia:

jueves, 13 de noviembre de 2014

Java: Hibernate 4 - Session Filter with Spring MVC

Configuracion de Filtro de Session de Hibernate en Spring


Cuando configuramos Hibernate en Spring (Configuring OpenSessionInViewFilter with Hibernate 4 and Spring 4 -Spring MVC-.) necesitamos configurar un filtro de SessionFactory para no encontrarnos con el problema de LazyInitializationException.


Problema:


Error reading org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Estado HTTP 500 - javax.el.ELException: Error reading 'atributoField' en el tipo MY.CLASS.OBJECT_INSTANCE_$$_jvst41b_2
type Informe de Excepción
mensaje javax.el.ELException: Error reading 'atributoField' en el tipo MY.CLASS.OBJECT_INSTANCE_$$_jvst41b_2
descripción El servidor encontró un error interno que hizo que no pudiera rellenar este requerimiento.
excepción
org.apache.jasper.JasperException: javax.el.ELException: Error reading 'atributoField' en el tipo MY.CLASS.OBJECT_INSTANCE_$$_jvst41b_2
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1217)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
causa raíz

javax.el.ELException: Error reading 'atributoField' en el tipo MY.CLASS.OBJECT_INSTANCE_$$_jvst41b_2
javax.el.BeanELResolver.getValue(BeanELResolver.java:110)
org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
org.apache.el.parser.AstValue.getValue(AstValue.java:183)
org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:46)
org.apache.el.parser.AstNot.getValue(AstNot.java:43)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:967)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspx_meth_c_005fif_005f0(person_jsp.java:256)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspx_meth_form_005fform_005f0(person_jsp.java:184)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspService(person_jsp.java:114)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1217)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
causa raíz

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)
org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
MY.CLASS.OBJECT_INSTANCE_$$_jvst41b_2.getatributoField(Person_$$_jvst41b_2.java)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
javax.el.BeanELResolver.getValue(BeanELResolver.java:99)
org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
org.apache.el.parser.AstValue.getValue(AstValue.java:183)
org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:46)
org.apache.el.parser.AstNot.getValue(AstNot.java:43)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:967)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspx_meth_c_005fif_005f0(person_jsp.java:256)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspx_meth_form_005fform_005f0(person_jsp.java:184)
org.apache.jsp.WEB_002dINF.view.person_jsp._jspService(person_jsp.java:114)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1217)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
nota La traza completa de la causa de este error se encuentra en los archivos de diario de Apache Tomcat/7.0.56.


Solución:

La solución es agregar una definición de un filtro en el archivo de configuración web.xml como sigue:


<!-- Spring Open Session In View Pattern filter -->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
                <!-- Hibernate 4 SessionFactory Bean (reference) -->
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>hibernate4AnnotatedSessionFactory</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 Y tener configurado una definición de Hibernate 4 SessionFactory Bean en el archivo de configuración application-config.xml (o applicationContext.xml) como sigue:

<!-- Hibernate 4 SessionFactory Bean (definition) -->
<beans:bean id="hibernate4AnnotatedSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="annotatedClasses">
<beans:list>
<beans:value>com.daro.rental.housing.model.PersonTable</beans:value>
<beans:value>com.daro.rental.housing.model.HouseTable</beans:value>
</beans:list>
</beans:property>
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</beans:prop>
<beans:prop key="hibernate.show_sql">true</beans:prop>
</beans:props>
</beans:property>
</beans:bean>


Referencias:

-Configurar el filtro de SessionFactory: http://cchweblog.wordpress.com/2009/10/10/using-opensessioninviewfilter-in-spring-web-application/
-Crear mi propio filtro de SessionFactory: http://programacionspring.blogspot.com.ar/2012/01/configuracion-hibernate-en-spring.html





miércoles, 12 de noviembre de 2014

Java: Install Maven on Ubuntu 12



sudo apt-get install maven
mvn -version
Apache Maven 3.0.4
Maven home: /usr/share/maven
Java version: 1.7.0_71, vendor: Oracle Corporation
Java home: /usr/lib/jvm/jdk1.7.0_71/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.2.0-69-generic", arch: "amd64", family: "unix"

Probar en eclipse:

Crear un Maven Project.
Si al crear un proyecto Maven en eclipse nos sale este error: "Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart:RELEASE from any of the configured repositories"

Podemos ir a Windows-Preference-Maven-UserSettings y agregar el el archivo setting.xml: /etc/maven/settings.xml

Tambien podemos editar el proxy (colocando la informacion necesaria) si fuera necesario editando /etc/maven/settings.xml:
     <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>dario</username>
      <password>pass</password>
      <host>proxy.corp.daro.com</host>
      <port>1232</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>

Y agregar:

<mirror>
  <id>ibiblio.org</id>
  <url>http://mirrors.ibiblio.org/maven2</url>
  <mirrorOf>central</mirrorOf>
</mirror>


To Remove:

sudo apt-get remove maven
sudo apt-get purge maven

martes, 11 de noviembre de 2014

Java: How to Install Tomcat 7 on Ubuntu 12.10 - Guide

Instalar Tomcat 7 sobre Ubuntu 12

Download and install:


Download from zip: http://tomcat.apache.org/download-70.cgi

tar xvzf apache-tomcat-7.0.8.tar.gz
sudo mv apache-tomcat-7.0.8/ /usr/share/tomcat7
#sudo geany /etc/environment
#sudo nano /etc/environment
sudo vim /etc/environment
JAVA_HOME="/usr/lib/jvm/jdk1.7.0_71"
JRE_HOME="/usr/lib/jvm/jdk1.7.0_71/jre"

sudo vim /usr/share/tomcat7/bin/catalina.sh
#insert the JAVA_HOME and JRE_HOME after the first line
JAVA_HOME="/usr/lib/jvm/jdk1.7.0_71"
JRE_HOME="/usr/lib/jvm/jdk1.7.0_71/jre"

Configure Users:

sudo geany /usr/share/tomcat7/conf/tomcat-users.xml
#Add user into file tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="admin"/>
<user username="usuario" password="contrasena" roles="manager-gui,admin-gui,manager,admin,manager-script,admin-script"/>

Configure Bash:

#Add in .bashrc :
export CATALINA_HOME=/usr/share/tomcat7
export WEBAPPS_HOME=/usr/share/tomcat7/webapps
alias tomcat_start='sudo /usr/share/tomcat7/bin/startup.sh'
alias tomcat_stop='sudo /usr/share/tomcat7/bin/shutdown.sh'

Start and stop:


#Start server:
#sudo /usr/share/tomcat7/bin/startup.sh
tomcat_start

#Web Test:
http://127.0.0.1:8080/

#Stop server:
#sudo /usr/share/tomcat7/bin/shutdown.sh
tomcat_stop

See the version:

$CATALINA_HOME/bin/version.sh

Using CATALINA_BASE:   /usr/share/tomcat7
Using CATALINA_HOME:   /usr/share/tomcat7
Using CATALINA_TMPDIR: /usr/share/tomcat7/temp
Using JRE_HOME:        /usr/lib/jvm/jdk1.7.0_71/jre
Using CLASSPATH:       /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.56
Server built:   Sep 26 2014 12:08:24
Server number:  7.0.56.0
OS Name:        Linux
OS Version:     3.2.0-69-generic
Architecture:   amd64
JVM Version:    1.7.0_71-b14
JVM Vendor:     Oracle Corporation

View Status:


ps -A | grep java
3453 pts/0    00:00:04 java
(Nota: para matar el proceso podemos usar: kill -9 3453)

ps -ax | grep tomcat7
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
3936 pts/0    Sl     0:04 /usr/lib/jvm/jdk1.7.0_71/jre/bin/java -Djava.util.logging.config.file=/usr/share/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms1024m -Xmx1024m -XX:MaxPermSize=1024m -XX:MaxNewSize=128m -XX:NewSize=128m -XX:SurvivorRatio=128 -XX:MaxTenuringThreshold=0 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseTLAB -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses -Dgrails.env=prod -Dspring.profiles.active=prod -Dport-offset=0 -Djboss.socket.binding.port-offset=0 -Dajp.port=8009 -Djboss.http.port=8080 -Dhttp.maxthreads=1000 -Dshutdown.port=8005 -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/share/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/usr/share/tomcat7/temp org.apache.catalina.startup.Bootstrap start
3979 pts/0    S+     0:00 grep --color=auto tomcat7

sudo netstat -tapen | grep ":8080 "
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      0          30018       3565/java

Web Admin:


(Nota: put the user and pass located into tomcat-users.xml)


References:
http://diegobenna.blogspot.com.ar/2011/01/install-tomcat-7-in-ubuntu-1010.html
http://www.liquidweb.com/kb/how-to-install-apache-tomcat-7-on-ubuntu-12-04/

lunes, 10 de noviembre de 2014

Java: Install JDK 7 on Ubuntu


Installing java-7-oracle apt-get 


sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer
sudo apt-get install oracle-java7-set-default

sudo vim /etc/environment
Agregar: JAVA_HOME="/usr/lib/jvm/java-7-oracle"
O hacer:
export JAVA_HOME=/usr/lib/jvm/java-7-oracle

Installing jdk1.7.0_71 from tar.gz


wget http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz
#Download from: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
sudo mv jdk-7u71-linux-x64.tar.gz /usr/lib/jvm/
cd /usr/lib/jvm/
sudo tar zxvf jdk-7u71-linux-x64.tar.gz
sudo rm jdk-7u71-linux-x64.tar.gz
#Now enable Java (by running individually):
sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                     Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-oracle/jre/bin/java   2         auto mode
* 1            /usr/lib/jvm/java-7-oracle/jre/bin/java   2         manual mode
  2            /usr/lib/jvm/jdk1.7.0_71/bin/java         1         manual mode

Press enter to keep the current choice[*], or type selection number: 2

sudo update-alternatives --config javac
There are 2 choices for the alternative javac (providing /usr/bin/javac).

  Selection    Path                                  Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-oracle/bin/javac   2         auto mode
* 1            /usr/lib/jvm/java-7-oracle/bin/javac   2         manual mode
  2            /usr/lib/jvm/jdk1.7.0_71/bin/javac     2         manual mode

Press enter to keep the current choice[*], or type selection number: 2
sudo update-alternatives --config javaws
There are 2 choices for the alternative javaws (providing /usr/bin/javaws).

  Selection    Path                                       Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-oracle/jre/bin/javaws   2         auto mode
* 1            /usr/lib/jvm/java-7-oracle/jre/bin/javaws   2         manual mode
  2            /usr/lib/jvm/jdk1.7.0_71/bin/javaws         2         manual mode

Press enter to keep the current choice[*], or type selection number: 2


#sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0_71/bin/java" 2
#sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.7.0_71/bin/javac" 2
#sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.7.0_71/bin/javaws" 2

sudo vim /etc/environment
Agregar: JAVA_HOME="/usr/lib/jvm/jdk1.7.0_71"

O agregar en el .bashrc:
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_71


Close all browsers.

Create a Mozilla plugins folder in your home directory:

user@host:~$ mkdir ~/.mozilla/plugins/

Create a symbolic link to your Mozilla plugins folder. For 64-bit systems, replace ‘i386’ with ‘amd64’:

user@host:~$ ln -s /usr/lib/jvm/jdk1.7.0_71/jre/lib/i386/libnpjp2.so ~/.mozilla/plugins/

Testing:

user@host:~$ java -version

Output:
java version "1.7.0_72"
Java(TM) SE Runtime Environment (build 1.7.0_72-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.72-b04, mixed mode)

javac -version
javac 1.7.0_72

Verify JRE at http://java.com/en/download/installed.jsp.


References:
http://askubuntu.com/questions/56104/how-can-i-install-sun-oracles-proprietary-java-jdk-6-7-8-or-jre


jueves, 6 de noviembre de 2014

SVN: PROPDEL SVN:MERGEINFO

svn propdel svn:mergeinfo


Subversion controla los "merges" haciendo seguimiento mediante la propiedad "svn:mergeinfo".
A veces es necesario borrar esa propiedad de algún archivo para solucionar algún problema. Para ello usamos:
              svn propdel svn:mergeinfo


Caso de ejemplo


Problema al querer hacer un reintegrate despues de haber hecho el revert de un reintegrate:

Cuando se hace un reintegrate de una rama al tronco no conviene seguir haciendo reintegrates subsiguientes. Pero en ocaciones es necesario revertir el reintegrate para hacerlo nuevamente y ello puede traer problemas, como es el siguiente ejemplo:

Se hizo un reintegrate y commit al trunk (Committed revision 531227).
Luego se hizo un revert del commite (svn merge -c -531227 ^/trunk) dando revision 531235 (Revert Committed revision 531235).
Luego, al intentar hacer un reintegrate nuevamente del trunk para commitear surgió un problema.
Esto se puede solucionar con "svn propdel svn:mergeinfo".

...
At revision 531236.
[USER@HOME trunk]$ svn merge ^/branches/MY_BRANCH  --reintegrate
svn: E195016: Reintegrate can only be used if revisions 527399 through 531236 were previously merged from https://repositorio/trunk to the reintegrate source, but this is not the case:
  branches/MY_BRANCH/
DIR/FILE_WITH_PROBLEM.TXT
    Missing ranges: /trunk/DIR/FILE_WITH_PROBLEM.TXT:530809
  branches/MY_BRANCH/MY_DIR/FILE_WITH_PROBLEM_2.TXT.t
    Missing ranges: /trunk/MY_DIR/FILE_WITH_PROBLEM_2.TXT.t:530809

Solución en el Branch:


...
[USER@HOME trunk]$ cd $HOME/svn_workingcopy/BranchWorkingCopy
[USER@HOME BranchWorkingCopy]$ svn st
[USER@HOME BranchWorkingCopy]$ svn propdel svn:mergeinfo MY_DIR/FILE_WITH_PROBLEM_2.TXT.t
property 'svn:mergeinfo' deleted from 'MY_DIR/FILE_WITH_PROBLEM_2.TXT.t'.
[USER@HOME BranchWorkingCopy]$ svn propdel svn:mergeinfo DIR/FILE_WITH_PROBLEM.TXT
property 'svn:mergeinfo' deleted from 'DIR/FILE_WITH_PROBLEM.TXT'.
[USER@HOME BranchWorkingCopy]$ svn st
 M      DIR/FILE_WITH_PROBLEM.TXT
 M      MY_DIR/FILE_WITH_PROBLEM_2.TXT.t

[USER@HOME BranchWorkingCopy]$ svn diff -N > $HOME/merge_propdel.txt
[USER@HOME BranchWorkingCopy]$ svn commit -F $HOME/merge_propdel.txt
Sending        DIR/FILE_WITH_PROBLEM.TXT
Sending        MY_DIR/FILE_WITH_PROBLEM_2.TXT.t

Committed revision 531254.
[USER@HOME BranchWorkingCopy]$ svn up --ignore-externals
Updating '.':
At revision 531254.
[USER@HOME BranchWorkingCopy]$ svn merge --record-only -c 531227 ^/trunk
--- Merging r531227 into '.':
 G   .
--- Recording mergeinfo for merge of r531227 into '.':
 U   .
[USER@HOME BranchWorkingCopy]$ svn commit -F $HOME/merge_propdel_post.txt
svn: E000002: Can't open file '/home/USER/merge_propdel_post.txt': No such file or directory
[USER@HOME BranchWorkingCopy]$ svn diff -N > $HOME/merge_propdel_post.txt
[USER@HOME BranchWorkingCopy]$ svn commit -F $HOME/merge_propdel_post.txt


Solución en el trunk:


...
cd $HOME/svn_workingcopy/trunk
[USER@HOME trunk]$ svn st
[USER@HOME trunk]$ svn up --ignore-externals
Updating '.':
 U   .
Updated to revision 531254.
[USER@HOME trunk]$ svn merge ^/branches/MY_BRANCH  --reintegrate
--- Merging differences between repository URLs into '.':
R    MY_DIR/FILE_WITH_PROBLEM_2.TXT.t
R    DIR/FILE_WITH_PROBLEM.TXT
 G   .
--- Recording mergeinfo for merge between repository URLs into '.':
 U   .
[USER@HOME trunk]$

Despues de esto se puede hacer el commit apropiadamente.



Referencias:
http://stackoverflow.com/questions/4737605/reintegrate-can-only-be-used-if-revisions-x-through-y-were-previously-merged-fro
http://svnbook.red-bean.com/en/1.7/index.html


martes, 4 de noviembre de 2014

SVN: Reintegrate a Branch to Trunk

SVN: Reintegrar una rama al tronco

¿Cómo reintegrar un branch al trunk?

La idea es que cuando trabajamos con un branch, que es una rama del trunk, despues de un tiempo, cuando hayamos finalizado de trabajar con esta rama habrá que reintegrarla en el trunk haciendo un merge al mismo. El proceso a seguir puede ser el siguiente:

1) Primero traemos los cambios del trunk al branch


svn co https://REPO/branches/BRANCH --ignore-externals
cd BRANCH
#BRANCH]$ svn up --ignore-externals
BRANCH]$ svn merge ^/trunk
BRANCH]$ svn diff -N > merge_log.txt
#BRANCH]$ svn commit -m "Leyenda del Merge"
BRANCH]$ svn commit -F merge_log.txt

Esto se puede hacer previamente cada vez que se hace el reintegrate. Luego de que nuestro branch tiene todos los cambios actualizados del trunk podemos mezclarlos con los del trunk en el trunk (o sea comitear al trunk).

2) Despues llevamos los cambios del branch al trunk


svn co https://REPO/trunk trunk_workingcopy --ignore-externals
cd trunk_workingcopy
#trunk_workingcopy ]$ svn up --ignore-externals
trunk_workingcopy ]$ svn merge --reintegrate ^/branches/BRANCH
#Revisar los cambios
trunk_workingcopy ]$ $svn st
trunk_workingcopy ]$ svn diff -N > reintegrate_branch_to_trunk.log
#Ejecutar el comando para eliminar los comentarios de merge info:
#trunk_workingcopy ]$ svn st *|grep '^.M'|sed -re 's/^ *[A-Z]+ +//'|xargs -r svn pd svn:mergeinfo
#Commitear con leyenda:
#trunk_workingcopy ]$ svn commit -m "Reintegrate X"
Committed revision 392.

3) Después borramos el branch 

Después que el branch fue reintegrado y que se sabe que no se va a trabajar mas en ese branch se puede borrar.

$ svn delete https://REPO/branches/BRANCH \
             -m "Remove my branch, reintegrated with trunk in r392"
Committed revision 393.

4) Observación del reintegrate


Una vez que se hizo reintegrate no se debe volver a usar el branch ni a hacer otra vez reintegrate. ¿Por qué? Luego de hacer el reintegrate y subir los cambios: a) El trunk queda con los cambios que están en el branch; b) Cuando se vuelva a hacer merge del trunk en el branch para reutilizarlo, es posible que salten conflictos. O sea que no se debería usar mas el branch y el branch conviene ser borrado. Pero en caso de que se quiera hacer la excepción se puede hacer lo siguiente:

Lo que se puede hacer, para que no salten conflictos despes de hacer un reintegrate o revertir un reintegrate, es puentear el merge (que viene después del commit, pongamosle que actualiza el branch a la version  222)
Ejemplo:
podemos puentear el merge (que viene después del commit)
[branch]$   svn merge --record-only -c 222 ^/trunk

Con esto evitamos que haga el merge con los cambios que ya fueron comiteados en la version 222.


O sea que, no es aconsejable reutilizar un branch despues de un reintegrate, pero es más que nada por una cuestión de conflictos. Que de requerirse se puede reutilizar usando svn merge --record-only -c  <version> luego del commit.


SVN: Branch of Branch (Copy of Branch)

¿Cómo hacer una rama de una rama en una revisión dada?


(How to Copy a Branch within a Folder in the Repository: Explain how to copy a given branch with a given version within another folder in the repository)

Para hacer un branch del branch en la revision 9999.

svn mkdir https://repos/repo/branches/BRANCH_copy -m 'Crete folder to new branch'

svn cp https://repos/repo/branches/BRANCH_01@9999 https://repos/repo/branches/BRANCH_copy -m 'Copy of BRANCH_01'

svn co https://repos/repo/branches/BRANCH_copy/BRANCH_01 WorkingCopy_BRANCH_copy --ignore-externals


Nota:
Para remover el branch hacemos:

svn rm https://repos/repo/branches/BRANCH_copy/BRANCH_01 -m 'Remove Copy of BRANCH_01'

domingo, 2 de noviembre de 2014

Java: JBoss - Configuration of Persistence with JPA and MySQL

Java: JBoss - Configuración de Persistencia con JPA...

¿Cómo configurar el Data Source (MySQL) y persistencia con JBOSS (7.1.1) y JPA en un proyecto Java?


Si queremos usar persistence JPA con JBoss y MySQL podemos hacer lo siguiente para configurar el Datasource de MySQL y buestra base de datos:

1) Instalar JBoss-as-7.1.1.Final


Primero debemos tener instalados JBoss (por ejemplo jboss-as-7.1.1.Final).

2) MYSQL connector


Bajar el JAR de mysql connector e instalarlo en <DIR_de_install>\modules\com\mysql\main\:

Por ejemplo:
C:\jboss-as-7.1.1.Final\modules\com\mysql\main\mysql-connector-java-5.1.33-bin.jar

Editar C:\jboss-as-7.1.1.Final\modules\com\mysql\main\module.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--  

C:\jboss-as-7.1.1.Final\modules\com\mysql\main\mysql-connector-java-5.1.33-bin.jar

  ~ JBoss, Home of Professional Open Source.  
  ~ Copyright 2010, Red Hat, Inc., and individual contributors  
  ~ as indicated by the @author tags. See the copyright.txt file in the  
  ~ distribution for a full listing of individual contributors.  
  ~  
  ~ This is free software; you can redistribute it and/or modify it  
  ~ under the terms of the GNU Lesser General Public License as  
  ~ published by the Free Software Foundation; either version 2.1 of  
  ~ the License, or (at your option) any later version.  
  ~  
  ~ This software is distributed in the hope that it will be useful,  
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of  
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  
  ~ Lesser General Public License for more details.  
  ~  
  ~ You should have received a copy of the GNU Lesser General Public  
  ~ License along with this software; if not, write to the Free  
  ~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  
  ~ 02110-1301 USA, or see the FSF site: http://www.fsf.org. 
  -->  

<module xmlns="urn:jboss:module:1.0" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-5.1.33-bin.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
<module name="javax.transaction.api"/>
<module name="javax.servlet.api" optional="true"/>
  </dependencies>
</module>


3) Agregar el Datasource en JBoss


Editar standalone.xml de JBoss:


    <datasources>
             
<datasource jndi-name="java:jboss/datasources/MysqlDS" enabled="true"
                      use-java-context="true" jta="true" use-ccm="true" pool-name="MysqlDS">
<connection-url>jdbc:mysql://localhost:3306/MY_DATA_BASE</connection-url>
<driver>mysql</driver>
<pool>
<max-pool-size>30</max-pool-size>
</pool>
<security>
<user-name>USER</user-name>
<password>my_sql_pass</password>
</security>
</datasource>
                <drivers>
  
<driver name="mysql" module="com.mysql">
<driver-class>com.mysql.jdbc.Driver</driver-class>
</driver>
                </drivers>
            </datasources>
         

 4) Configurar Persistence en el proyecto


Editar o agregar: src/META-INF/persistence.xml

 <?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
   <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:jboss/datasources/MysqlDS</jta-data-source>
      <!-- "java:jboss/datasources/MysqlDS" apunta al datasource del archivo STANDALONE.XML de JBOSS  -->
      <!-- Alli esta configurada jdbc:mysql://localhost:3306/MY_DATA_BASE  -->
      <class>package.domain.entity.MyTableEntity</class>
   
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
         <property name="hibernate.show_sql" value="false" />
      </properties>
   </persistence-unit>
</persistence>

 4) Configurar EntityManagerFactory en el código

...
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistenceUnit");
EntityManager em = entityManagerFactory.createEntityManager();
...

5) Lanzar JBoss

Si todo está bien JBoss debería loguear las líneas siguientes (en log o en consola):
...
20:14:33,717 INFO  [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 27) JBAS010404: Deploying non-JDBC-compliant driver class com.mysql.jdbc.Driver (version 5.1)
...
20:14:35,941 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-1) JBAS010400: Bound data source [java:jboss/datasources/MysqlDS]
...
20:14:36,037 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) JBAS015876: Starting deployment of "RentalHousingWebService.war"
20:14:37,258 INFO  [org.jboss.as.jpa] (MSC service thread 1-1) JBAS011401: Read persistence.xml for persistenceUnit
...





martes, 28 de octubre de 2014

SVN: Tree conflicts Solution

Solución de conflictos de árbol (Tree conflicts solution):

[user@dev]$ svn st
...
!     C t/unit/models/Toolbox/Restrictions
     >   local delete, incoming edit upon merge
Summary of conflicts:
 Tree conflicts: 32

[user@dev]$ mkdir t/unit/models/Toolbox/Restrictions
[user@dev]$ svn revert t/unit/models/Toolbox/Restrictions
Reverted 't/unit/models/Toolbox/Restrictions'

[user@dev]$ svn st
...
?       t/unit/models/Toolbox/Restrictions
Summary of conflicts:
 Tree conflicts: 31

#Luego enviar los cambios

Reference:
http://stackoverflow.com/questions/4317973/svn-how-to-resolve-local-edit-incoming-delete-upon-update-message
http://svnbook.red-bean.com/en/1.7/index.html

jueves, 23 de octubre de 2014

SVN: Machete de comandos mas usados

Status
svn st

Checkout
svn co https://URL/branches/branch --ignore-externals


Reintegrate del trunk
trunk]$ svn up --ignore-externals
trunk]$ svn merge ^/branches/branch --reintegrate
trunk]$ svn ci -m "message"

Enviar cambios

svn ci -m "msg”

svn commit PATH -m "Message"

Revertir cambios locales
svn revert . -R

Update
svn update --ignore-externals
svn up --ignore-externals



Referencias:
https://code.google.com/p/relaxtives/wiki/Subversion



SVN: Crear y aplicar un Patch

Crear y aplicar un Patch



svn diff > ~/BUG_FIXED_.diff

patch -p0 -i ~/BUG_FIXED_.diff




Patch para volver a hacer un commit revertido:



Si el commit revertido fue r999 y su commit anterior r998, como indica el log:
svn log -l2
------------------------------------------------------------------------
r999 | dario | 2015-01-13 17:32:35 +0000 (Tue, 13 Jan 2015) | 1 line
MY COMMIT: comment.
------------------------------------------------------------------------
r998 | juan | 2015-01-13 12:53:00 +0000 (Tue, 13 Jan 2015) | 1 line
PREVIOUS COMMIT: comment.


Se puede hacer un diff de la siguiente manera:


svn diff -r r998:r999 > Patch_MY_COMMIT.diff


Luego aplicamos el Patch:


patch -p0 -i Patch_MY_COMMIT.diff



Referencia:
- Quick-n-Dirty Guide to Creating and Applying diff-style Patches.
- Crear y aplicar parches (patches) en Linux.


SVN: Log (Consultar Historial)

¿Cómo recuperar información histórica de commits y revisiones?



Traigo mis commit
svn log -l 100 | grep USER
svn log -l 100 | grep -A 3 -B 3 USER

Todos los commit de un usuario entre dos fechas:
svn log -r '{2010-12-10}:{2010-12-11}'|sed -n '1p; 2,/^-/d; /USER/,/^-/p'
svn log -r '{2014-09-23}:{2014-10-15}'|sed -n '1p; 2,/^-/d; /USER/,/^-/p' > $HOME/resultado_USER_commits.log

Revisar commits de una revisión dada
svn log -r NRO_REVISION -v
svn log --revision NRO_REVISION

Revisar commits de un rango de revisión dado
svn log -r NRO_REVISION_1:NRO_REVISION_2

Listar commit entre fechas
svn log -v -r {2014-05-23}:{2014-05-28} --xml > $HOME/resultado_log_entre_fechas.xml
svn log -v -r {2014-08-20}:{2014-08-24} > $HOME/resultado_log_entre_fechas.log

Listar historia de un archivo
svn log FILE

Listar últimos 5 commit
svn log -l 5 -v

Show author and revision information inline for the specified files or URLs
svn blame -v filename
svn blame -v filename > $HOME/resultado_blame.xml


Referencias:

lunes, 20 de octubre de 2014

SVN: Rollback commit (revert revision)


Revertir los cambios de una revisión

¿Cómo deshacer un commit o una revisión?
Podemos querer revertir (deshacer) un commit que hicimos o volver a una revisión pasada.

Si queremos revertir un commit que hicimos con numero_de_revision dado, la forma general es:
                svn merge -r -numero_de_revision url-del-repositorio
... y despues hacer commit.

#Otra manera:
svn merge -c -1003 file:///path/my_project/trunk
svn commit -m "Rollback de la revisión 1003 (revert commit 1003)"

O podemos querer volver a una revisión pasada. La forma general es:
                svn merge -r version-actual:version-anterior url-del-repositorio
... y despues hacer commit.

#Por ejemplo:
svn merge -r 1003:1002 http://repo/project/trunk
svn commit -m "Revert a la revisión 1002"

#Otra forma:
cd ruta/de/miproyecto/
svn merge -r 1003:1002
svn commit -m "Reversión de cambios del ultimo commit"

#Otra
svn merge -r 1003:1002 .
svn commit -m "Rollback de la revisión 1003"

#También podemos indicar tan solo un dir o un archivo al que volver (no toda la rama).
svn merge -r HEAD:543 my_file.pm

#Una forma simulada:
svn merge --dry-run -r 1003:1002 http://repo/project/trunk
#La opción --dry-run lo que hace es mostrarte en la terminal el resultado del merge si hacerlo realmente.

#Si quieremos ver exactamente que cambiará en cada archivo y cada dir, también puedes hacer un:
svn diff -r 1003:1002 http://repo/project/trunk


lunes, 13 de octubre de 2014

Java: Static Analysis

Inspección y análisis de código Java.



1) Complejidad ciclomática (Cyclomatic Complexity)



2) Covertura de test (Coverage)



3) Análisis de dependencia (Dependancy Analysis)



4) Análisis de Bytecode  (Bytecode Analysis)



5) Análisis de código fuente (Source Code Analysis)


6) Monitoreo de memoria


JPS es similar a PS de linux y sirve para averiguar los procesos que estan corriendo en la VM java. Y JSTAT es una herramienta para benchmark para java incluida en el JDK.
Ejemplo para consultar la memoria PermGen que esta utilizando el proceso 666:

       jstat -gcpermcapacity 666


Ejemplo: jconsole processID



Referencia:
-Top 5 Static Analysis Plugins for Eclipse.
-Memoria PermGen en Java.
-Oracle: Using Jconsole.
-5 things you didn't know about ... Java performance monitoring, Part 2.
-InstallVisualVM and JSTAT.


lunes, 6 de octubre de 2014

Perl: Unit Test con Test::More

Unit Test con Test::More y Test::MockObject


El módulo Test::More es un módulo para hacer unit test en Perl y Test::MockObject es un módulo que permite hacer mocking en forma fácil.


Ejemplo de un simple UnitTest

A continuación un simple ejemplo de un unit test con Test::More (usando la estructura de clase de Moose).

Clase a probar:


#File: Person.pm
package Person;

    use Moose;
    use strict; 
    use warnings; 
    use namespace::autoclean;
   
    has '_firstName' => (
                is         => 'rw', 
                isa        => 'Str', 
                required => 1,
                reader => 'getFirstName',
                writer => 'setFirstName',
    );    

    has '_secondName' => (
                is         => 'rw',
                isa        => 'Str', 
                required => 1,
                reader => 'getSecondName', 
                writer => 'setSecondName',
    );
    
sub getFullName{
  my ( $self ) = @_;
  my $full_name = join ' ' => $self->getFirstName(), $self->getSecondName();
  return $full_name;
}

no Moose;
__PACKAGE__->meta->make_immutable;
1;

Unit Test:


#File: PersonTest.t
package PersonTest;

    use Moose;
    use Test::More tests => 3; #Cantidad de test
    use Test::MockObject; #uso de mocking
    use strict; 
    use warnings; 
    use namespace::autoclean; 
    use Person; #Clase a probar
    
    #Primer test
    subtest 'classTest' => sub {
      plan tests => 2; #Cantidad de evaluaciones (aserciones) de test
      require_ok( 'Person' ); #Comprueba que esté el módulo
      my $persona = Person->new(_firstName=>"", _secondName=>"",);
      isa_ok ($persona, 'Person'); #Comprueba si es la clase correcta   
    };
    
    #Segundo test
    subtest 'getFullName' => sub {
      plan tests => 3; #Cantidad de evaluaciones (aserciones) de test
      my $persona = Person->new(_firstName=>"Diego", _secondName=>"Maradona",);
      is($persona->getFullName(),"Diego Maradona",'Full name is right');
      isnt ($persona->getFullName(), "Other name", "Bad full name!");
      ok( length $persona->getFirstName() == 5,       'First Name length is ok!'  );
    };  

    #Tercer test
    subtest 'getFullName_Using_Mock' => sub {
      plan tests => 1;
        my $mockPerson = Test::MockObject->new();
        $mockPerson->mock( 'getFullName',
             sub { 'Ejemplo' } ); #Mocking de la clase Person
      is( $mockPerson->getFullName,"Ejenplo",'Full name is ok with mocking');
  };

no Moose;
__PACKAGE__->meta->make_immutable;
1;


Resultado de la corrida del test:


1..3
    1..2
    ok 1 - require Person;
    ok 2 - The object isa Person
ok 1 - classTest
    1..3
    ok 1 - Full name is right
    ok 2 - Bad full name!
    ok 3 - First Name length is ok!
ok 2 - getFullName
    1..1
    ok 1 - Full name is ok with mocking
ok 3 - getFullName_Using_Mock



Referencias:
-Test::More doc.
-Test::More wikipedia.
-Test::More Tutorial.
-Test::MockObject doc.