Escrito por Juanjo el Saturday, 7 de February del 2009 a las 2:22 am
Después del primer tip de supervivencia sobre la autenticación automática vía SSH (que me permite ahorrar unos cuantos segundos al día) publico este otro sobre los atajos de teclado en Eclipse, para aprovechar una de las características más útiles del editor.
Todos los programas tienen shortcuts (atajos de teclado), y prácticamente todo el mundo utiliza alguno. Probablemente todo el que trabaje con algún entorno de programación hace uso de varios de ellos con total naturalidad, casi sin percatarse. Pero también me he dado cuenta de que hay muchos compañeros de clase que se conforman con muy pocos, casi todos básicos, bien porque no conocen los demás atajos, bien porque no consideran necesario realizar el esfuerzo de aprenderlos y utilizarlos (no solo en Eclipse, sino en otras herramientas: Vim, la Terminal, etc). Bien, yo creo que son indispensables si se desea programar con rapidez y soltura, o manejar las perspectivas/opciones/vistas de Eclipse con celeridad sin tener que hacer uso del ratón, que si bien es más cómodo, nos obliga a retirar las manos del teclado (nuestra herramienta de codificación), haciéndonos perder algunos segundos innecesariamente.
Yo no los aprendí todos de golpe; poco a poco los fui asimilando paulatinamente, conforme alguien me revelaba su existencia y su utilidad. Paso a detallar los shortcuts que utilizo diariamente:
Primero, los más básicos no sólo de Eclipse, sino de cualquier editor (de texto, imágenes, etc):
- CTRL + X : Cortar la selección.
- CTRL + C : Copiar la selección.
- CTRL + V : Pegar la selección.
- CTRL + Z : Deshacer última acción.
- CTRL + Y : Rehacer última acción desecha.
Estoy seguro que todos los usamos periódicamente. Es más cómodo también realizar la selección desde el teclado, haciendo uso de SHIFT + Flechas, ayudado de las teclas Inicio, Fin, RevPág, AvPág, y CTRL (Windows/Linux) o ALT (Mac).
Los siguientes son específicos de Eclipse, y son los que contienen la verdadera chicha del tema. Están organizados de mayor relevancia (bajo mi singular y subjetivo punto de vista) a menor:
- CTRL + BARRA_ESPACIADORA : Autocompletado de metodos/variables/etc.
- CTRL + SHIFT + R : Búsqueda de un recurso (código fuente, jar, xml, properties…) en los proyectos abiertos (sin tener que ir al explorador de paquete a buscarlo).
- CTRL + SHIFT + G : Buscar referencias al método/clase en el Workspace. El único caso en que yo prefiero usar el botón derecho -> References -> Proyect, porque si hay muchos proyectos abiertos tarda más en hacer la búsqueda.
- CTRL + O : Ver métodos/atributos de la Clase.
- CTRL + D : Eliminar una línea.
- CTRL + M : Maximizar/Minimizar la ventana activa.
- CTRL + I : Corregir indentacion.
- ALT + UP_ARROW / DOWN_ARROW : Subir/Bajar una línea. Respecto a éste, me costó muchísimo quitarme la maña de seleccionar las líneas que deseaba, cortarlas, moverme a donde quería, y pegarlas.
- CTRL + T : Arbol de Herencia (para ver las clases que implementan una interfaz, por ejemplo).
- CTRL + F : Búsqueda en el fichero actual.
- CTRL + H : Buscar en todo el proyecto/workspace (dentro de ficheros java, jars, xmls, htmls, Spring beans…)
- CTRL + ‘/’ (CTRL + SHIFT + 7): Añadir/quitar comentarios “//”.
- CTRL + L : Ir a una línea específica.
- CTRL + SHIFT + L : Ver todos los atajos de teclado.
- ALT + SHIFT + C : Cambiar la firma del método actual (parámetros, nombre, tipo retornado, etc… los cambia en todas las clases que hagan uso del método).
- CTRL + AV_PAG / REV_PAG : Siguiente/Anterior pestaña de las abiertas en la ventana activa.
- CTRL + E : Ver las pestañas de código fuente para seleccionar una.
- CTRL + ‘+’ (del teclado numérico) : Expandir un bloque entre llaves (cuando solo se muestra la firma).
- CTRL + ‘-’ (del teclado numérico) : Contraer un bloque (para mostrar sólo la firma).
En modo Debug añadiría también:
- F5 : Entrar en una llamada.
- F6 : Ir a la siguiente línea de código (”Step”).
- F7 : Ir a la sentencia de retorno del método.
- F8 : Continuar hasta el siguiente breakpoint.
- CTRL + Q (sobre un elemento) : Inspeccionar estructura y valores del elemento (p.e. una variable).
Hay otros dos atajos que debería usar, pero no lo hago. El primero, porque utilizo CTRL + F, y el segundo, porque sigo usando el ratón (aunque ya me he comprometido conmigo mismo a cambiar esto :P)
- CTRL + J : Búsqueda incremental (como Firefox).
- CTRL + 1 : Arreglo rápido. Es equivalente a pulsar sobre la “x” que sale al lado de la línea que contiene errores en el código fuente, sugiriendo soluciones.
Para finalizar, dos apuntes más:
- Todos estos atajos son configurables; pueden ser adaptados a nuestras preferencias personales. En Windows->Preferences->General->Keys está la lista de todos los ellos y su configuración asociada
.
- Existe un Plugin para Eclipse llamado MouseFeed que te muestra el shortcut asociado a una acción que se lleve a cabo con el ratón, de tal forma que así podemos aprender nuevas funcionalidades en el teclado para irnos desprendiendo de Mickey.
¿Usas algún atajo más? Compartelo con todos en un comentario
Bonus Tip: escribir “syso” y luego hacer uso del shortcut de autocompletado (CTRL + Barra Espaciadora) nos da como resultado “System.out.println(”");. Ahi lo dejo, aunque como todos somos buenos programadores, los mensajes los imprimimos usando loggers, y la consulta de valores de variables lo hacemos mediante el debugger, ¿no? :P:P
Categoria: Coding, Informática, Tips Supervivencia
Escrito por Juanjo el Wednesday, 4 de February del 2009 a las 11:55 pm
“Algunas personas, cuando se encuentran con un problema, piensan «Ya lo tengo!, usaré expresiones regulares». En ese momento ya tienen dos problemas“.
Oído decir por Jamie Zawinski, desarrollador de NetScape. Yo lo vi en Intenta.
Categoria: Coding, Humor, Informática, Sabiduría Popular
Escrito por Juanjo el Monday, 2 de February del 2009 a las 3:50 pm
No me acuerdo exactamente donde fue que encontré las siguientes preguntas, pero si son verídicas, soy un completo ignorante (por cierto, no es lo mismo intuirlo que corroborarlo). Al parecer, son preguntas que se hacen en la parte “técnica” de las entrevistas de trabajo para ingenieros informáticos en el Reino Unido. Son bastante bastante concretas sobre Java… y no sé ni una. Creo que me queda mucho que estudiar para aspirar a las certificaciones Sun…
Aquí van las preguntas (en inglés):
1- Troubleshoot the following class that is producing performance errors on the site:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| package com.blah.dataaccess;
import java.sql.*;
import javax.sql.*;
import com.blah.data.*;
public class GetFormats {
private Connection con;
public static String GetFormat(String user) {
String format = "mpeg4_150k";
try {
con = ConnectionFactory.getConnection();
String sql_string = "select wfmt_urlroot from wprf, wfmt where wprf_value = wfmt_id and wprf_type = 'bandwidth' and wprf_wusr_id = ?";
PreparedStatement pstmt = con.prepareStatement(sql_string);
pstmt.setString(1, user);
ResultSet rs = pstmt.executeQuery();
if (rs != null) {
while (rs.next()) {
format = rs.getString(1);
}
}
} catch (SQLException e) {
String error = ""+ e.toString();
}
return formats;
}
}
} |
2- What’s wrong with the following Tag:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| package com.blah.webui;
import java.sql.*;
import java.lang.*;
import java.util.*;
import java.net.URLEncoder;
public class OutputFooter extends TagSupport {
public String Footer() {
String html = "";
html = html + "</body></html>";
return html;
}
public int doStartTag() throws JspException {
try {
// and write out the formatted content to the page
pageContext.getOut().write(Footer());
} catch (java.io.IOException ioe) {
throw new JspTagException(ioe.getMessage());
}
// and skip evaluating the body of the tag (as there shouldn't be one)
return SKIP_PAGE;
}
} |
3- If you need to obtain and return the referring URL into a JSP page, how would you do it?
4- Describe how you would set up servlet mappings in Tomcat or any other J2EE servlet container, what would you do to involve Apache in this process to provide a unified URL convention for static and dynamic elements of the site.
5- Describe the steps involved in making Apache and a servlet container such as Tomcat work together. Discuss the relative merits of mod_jk and mod_proxy.
6- Discuss the differences between redirection and forwarding in the Java server environment within a cluster, between servers in a cluster and between sites.
7- Describe how serving of static and dynamic fragments can best be done in a clustered environment for high efficiency under high load with maximum availability.
8- The company has decided to settle on memcached to provide a distributed cache store. Describe how you would create a set of custom tags to provide an interface to memcached to provide for creating, updating, invalidating and retrieving cached items.
9- Explain the steps, giving references to libraries you would use, to enable elements from a content management system to connect with XML-RPC services to provide pings.
10- What’s your preferred way of parsing incoming XML and why?
11- Describe the stages involved in getting Ant, subversion and Eclipse working together to automatically build a tree from a subversion repository and deploy it to Tomcat.
12- Discuss the relative merits of
and
13- Discuss the difference between a custom tag which supports EL and one which supports RT.
14- Describe (with code examples if possible) how you would use an EL based JSP fragment to iterate through a simple XML file and make decisions based on the values of certain nodes.
15- The introduction of JSR-220 brought with it JPA. Hibernate is an open source ORM solution. Briefly describe, with a small example if possible, the impact JPA has had on the Hibernate project, and what steps would need to be taken to convert an existing hibernate project to conform with the JPA specification in JSR-220. What advantages to would this conversion bring?
16- When using a persistence layer within a multi-threaded environment which has the potential for a long object lifetime, special precautions must be made to ensure the system can maintain a high degree of concurrency, and also work correctly in a clustered environment. Give a short explanation of the problem domain and a potential high-level solution.
17- Explain the following method signature:
<T extends Myobject> T getMyobject(Class<T> MyObjectType);
18- Explain the difference between phantom, soft, strong and weak references and give a context they would be used in.
19-Diagnose the following exception, found in the tomcat catalina.out file:
java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.1.244:80 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:459)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:214)
at sun.net.www.http.HttpClient.New(HttpClient.java:287)
at sun.net.www.http.HttpClient.New(HttpClient.java:299)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:917)
at org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireReader(ImportSupport.java:331)
.......
20- Design a simple three database table structure which would allow the creation, editing and publication of a webpage stored in a content management system.
Concurrencia, clústering, parsing XML, diseño DB, Templates….. En pocas palabras, la-le-che
Categoria: Coding, Informática
Escrito por Juanjo el Friday, 30 de January del 2009 a las 12:21 am
A pesar de que no se vean cambios a simple vista, he modificado el código del CSS completamente (cosa que para un noob en diseño web como yo, tiene mérito :P).
Ahora el blog aparece centrado (y no a la izquierda), y si se observa el css, las capas y los elementos se posicionan relativamente y no de modo “absoluto” como antes. Este cambio lo considero esencial, pues maquetar cualquier cosa (añadir un menú, modificar un tamaño) se convertía en una odisea. De todas formas aún no he logrado hacer que el título aparezca donde quiero, pero todo se andará.
Por otra parte he empezado a padecer las distintas intrepetaciones de la página que hacen los navegadores, y estoy padeciendo algo muy similar al trastorno bipolar: paso de una completa alegría y euforia al ver la página en Firefox, a la más vil de las miserias cuando abro Explorer. Y todo en décimas de seguro, qué barbaridad. En ese sentido espero poder descubrir como hacer un híbrido decente para ambos, que no me destrocen el layout en uno por verlo maravillosamente en otro.
También voy a agregar un pie de página, porque ahroa el final es algo soso. Más nada, hasta aquí los cambios en el blog.
(PD: Mi mente me está dando una mala pasada… en un continuo intento de postergar los posts con contenido de verdad que sé que debo escribir, me paso la tarde perdiendo el tiempo con estas chorradas :P)
Categoria: Blogs, Coding
Escrito por Juanjo el Saturday, 10 de January del 2009 a las 10:43 pm
Como comenté en el post anterior, he añadido al blog un cambio que me agrada bastante: la de poder cargar una imagen aleatoria al entrar en la página. Bastante fácil todo, excepto por un detalle: como el theme que utilizo define la propiedad de la imagen en el CSS (background-image:url(ruta-imagen)), la generación de la alatoriedad no sabía cómo llevarla a cabo exactamente, hasta que descubrí que jQuery permite la modificación de atributos de las hojas de estilo (enlace). jQuery es una librería de funciones JavaScript que, básicamente, hace mil virguerías. Recomiendo pasarse por la página y echarle un vistazo. Pues bien, al final el código quedó tal que así:
En la cabecera, añadimos la librería:
<script src="http://www.jjcoellov.es/scripts/jquery.js"
type="text/javascript"></script>
Y luego en el cuerpo agregamos este código:
<script type="text/javascript">
/* Cambiar la imagen de la cabecera aleatoriamente */
/* Calcular un valor aleatorio entre 0 y el tamaño del array
* pasado por parametro */
function randomPos(a) {
return Math.floor((Math.random() * a.length) % a.length);
}
/* Array con las rutas de las imágenes a utilizar */
var rutasImg = [ "/imagenes/cabecera1.jpg",
"/imagenes/cabecera2.jpg",
"/imagenes/cabecera3.jpg",];
/* Hacemos uso de jQuery para modificar (o asignar) el valor
* del atributo "background-image" al elemento
* con id "cabecera" */
$(document).ready(function() {
var imagen = "url(" + rutasImg[randomPos(rutasImg)] + ")";
$("#cabecera").css("background-image", imagen);
});
</script>
Y eso es todo. Podría ser mucho más sofisticado: obtener todas las imagenes de un directorio especificado (aunque necesitaría algún lenguaje del lado del servidor para llevarlo a cabo), o generalizarlo para que obtenga una imagen aleatoria en cualquier elemento, simplemente ubicando el código dentro del mismo. Tambiés puede resultar innecesario añadir jQuery para hacer esta nimiedad, pero como resulta bastante sencillo utilizarlo decidí incluirlo. Es muy probable que haya métodos alternativos haciendo uso de funciones nativas de javascript, pero como primera aproximación creo que es adecuado. Si alguien busca algo similar, espero que le sirva de ayuda.
Categoria: Coding