<body>

Sitios web relacionados: PingBlog | Fotos

martes, mayo 30, 2006

Reunión de Blogueros en New York City: ¡Se armó la guachafita!

Bueno, hace una semana escuché el alboroto de que querían hacer una reunión de Blogueros Venezolanos en NYC.

Me pasé por las páginas que me indicaron y no vi movimiento.
Les pregunté a algunos y me dijeron que estaba como la camita de Heidy... pura paja

Así que ¿que pasó?

Bueno, yo les tengo una propuesta: Puede ser un Viernes en la noche o Sabado, dentro de dos semanas a partir de esta fecha. El lugar: algún sitio en Times Square (es fácil llegar en Metro) o seguramente algún lugar recomendado por Sebastian (el cual conoce mejor la ciudad que yo :)).

Se escuchan sugerencias :D

lunes, mayo 29, 2006

¿Echando código? ¡La venida de el hibrido!

Java

Bueno, por una de esas cosas de la vida, me decidí poner a echar código y como aún no me decido a pagar $2 adicionales al mes por tener JSP y Servlets en este Blog para hacer una solución de el lado del servidor, me decidí a poner un Applet (no me gusta Flash y no tengo licencia de su entorno de desarrollo, me da ladilla matarme pensando como hacerlo con Javascript y AJAX). Sin Java como siempre puede hacer el trabajo.

¿Un Applet para qué? Bueno, quería poner un contador en modo regresivo el cual fuera fácil de configurar. Como no conseguí nada que me gustara entonces me decidí al final a jugar un poco con la clase JApplet.

Primero que nada el código (más abajo les comento cuales son las partes críticas):

   1:package com.kodegeek.blog.applet;
2:
3:import java.awt.BorderLayout;
4:import java.awt.GridBagConstraints;
5:import java.awt.GridBagLayout;
6:import java.text.DateFormat;
7:import java.text.SimpleDateFormat;
8:import java.util.Calendar;
9:import java.util.Date;
10:import java.util.ResourceBundle;
11:
12:import javax.swing.JPanel;
13:import javax.swing.JApplet;
14:import javax.swing.JProgressBar;
15:import javax.swing.JLabel;
16:import javax.swing.JToolTip;
17:import javax.swing.JTextField;
18:import javax.swing.SwingUtilities;
19:
20:public final class RegresiveCounter extends JApplet implements Runnable {
21:
22: private JPanel jContentPane = null;
23: private JProgressBar jProgressBar = null;
24: private JLabel jLabelLefTime = null;
25: private JLabel jLabelEndTime = null;
26: private JToolTip jToolTip = null;
27: private JTextField jTextFieldLeftTime = null;
28: private JTextField jTextFieldEndTime = null;
29: GridBagConstraints constraint = null;
30: private static final DateFormat DATE_FMT =
31: DateFormat.getDateInstance();
32:
33: private final static int ONE_SEC = 1;
34: private final static long MS_PER_SEC = 1000;
35: private final static long MS_PER_MIN = 1000 * 60;
36: private final static long MS_PER_HOUR = 1000 * 60 * 60;
37: private final static long MS_PER_DAY = 1000 * 60 * 60 * 24;
38:
39: private Calendar now;
40: private Calendar start;
41: private Calendar end;
42:
43: private SimpleDateFormat endTimeFormatter;
44:
45: /**
46: * The serial id of this class.
47: */
48: public static final long serialVersionUID = 200601141L;
49:
50: private static ResourceBundle BUNDLE;
51:
52: {
53: BUNDLE =
54: ResourceBundle.getBundle(RegresiveCounter.class.getName());
55:
56: }
57:
58: /**
59: * This is the default constructor
60: */
61: public RegresiveCounter() {
62: super();
63: getRootPane().putClientProperty("defeatSystemEventQueueCheck",
Boolean.TRUE);
64: constraint = new GridBagConstraints();
65: endTimeFormatter =
66: new SimpleDateFormat(
BUNDLE.getString("RegresiveCounter.endTimeLabel.format"));
67: }
68:
69: /**
70: * This method initializes the applet
71: *
72: * @return void
73: */
74: public void init() {
75: this.setSize(550, 200);
76: this.setContentPane(getJContentPane());
77: showStatus(BUNDLE.getString("RegresiveCounter.status"));
78: end = Calendar.getInstance();
79: now = Calendar.getInstance();
80: start = Calendar.getInstance();
81: }
82:
83: /**
84: * This method initializes jContentPane
85: *
86: * @return javax.swing.JPanel
87: */
88: private JPanel getJContentPane() {
89: if (jContentPane == null) {
90:
91: jContentPane = new JPanel();
92: jContentPane.setLayout(new BorderLayout());
93:
94: JPanel upperPanel = new JPanel();
95: upperPanel.setLayout(new GridBagLayout());
96:
97: // Add elements to the upper panel
98: constraint.gridx = 0;
99: constraint.gridy = 0;
100: constraint.anchor = GridBagConstraints.LAST_LINE_END;
101: upperPanel.add(getJlabelLefTime(), constraint);
102:
103: constraint.gridx = 1;
104: constraint.gridy = 0;
105: constraint.anchor = GridBagConstraints.LAST_LINE_START;
106: upperPanel.add(getJTextFieldLeftTime(), constraint);
107:
108: constraint.gridx = 0;
109: constraint.gridy = 1;
110: constraint.anchor = GridBagConstraints.LAST_LINE_END;
111: upperPanel.add(getJlabelEndTime(), constraint);
112:
113: constraint.gridx = 1;
114: constraint.gridy = 1;
115: constraint.anchor = GridBagConstraints.LAST_LINE_START;
116: upperPanel.add(getJTextFieldEndTime(), constraint);
117:
118: // Add elements to the main panel
119: jContentPane.add(upperPanel, BorderLayout.NORTH);
120: jContentPane.add(getJProgressBar(), BorderLayout.SOUTH);
121: }
122: return jContentPane;
123: }
124:
125: /**
126: * Get the app left side label
127: * @return
128: */
129: private JLabel getJlabelLefTime() {
130: if (jLabelLefTime == null) {
131: jLabelLefTime = new JLabel();
132: if (getParameter("lefTimelabel") != null) {
133: jLabelLefTime.setText(getParameter("lefTimelabel")
+
":");
134: } else {
135: jLabelLefTime.setText(
BUNDLE.getString("RegresiveCounter.lefTimelabel") + ":");
136: }
137: }
138: return jLabelLefTime;
139: }
140:
141: /**
142: * Get the app left side label
143: * @return
144: */
145: private JLabel getJlabelEndTime() {
146: if (jLabelEndTime == null) {
147: jLabelEndTime = new JLabel();
148: if (getParameter("endTimeLabel") != null) {
149: jLabelEndTime.setText(getParameter("endTimeLabel")
+
":");
150: } else {
151: jLabelEndTime.setText(
BUNDLE.getString("RegresiveCounter.endTimeLabel") + ":");
152: }
153: }
154: return jLabelEndTime;
155: }
156:
157: /**
158: * This method initializes jProgressBar
159: *
160: * @return javax.swing.JProgressBar
161: */
162: private JProgressBar getJProgressBar() {
163: if (jProgressBar == null) {
164: jProgressBar = new JProgressBar();
165: jProgressBar.setMinimum(1);
166: }
167: return jProgressBar;
168: }
169:
170: /**
171: * This method initializes jTextFieldLeftTime
172: *
173: * @return javax.swing.JTextField
174: */
175: private JTextField getJTextFieldLeftTime() {
176: if (jTextFieldLeftTime == null) {
177: jTextFieldLeftTime = new JTextField();
178: jTextFieldLeftTime.setText(
BUNDLE.getString("RegresiveCounter.remainingTime"));
179: jTextFieldLeftTime.setEditable(false);
180: jToolTip = new JToolTip();
181: jToolTip.setTipText(
BUNDLE.getString("RegresiveCounter.remainingTime.tooltip"));
182: jToolTip.setComponent(jTextFieldLeftTime);
183: }
184: return jTextFieldLeftTime;
185: }
186:
187: /**
188: * This method initializes jTextFieldLeftTime
189: *
190: * @return javax.swing.JTextField
191: */
192: private JTextField getJTextFieldEndTime() {
193: if (jTextFieldEndTime == null) {
194: jTextFieldEndTime = new JTextField();
195: jTextFieldEndTime.setText("");
196: jTextFieldEndTime.setEditable(false);
197: }
198: return jTextFieldEndTime;
199: }
200:
201: /**
202: * Hint for the user about how to use the Applet
203: * @return 3D Array of array with the information about how to use the applet
204: */
205: public String[][] getParameterInfo() {
206: String[][] info = {
207: {"initDate", "date string",
BUNDLE.getString("RegresiveCounter.help.initDate")},
208: {"endDate", "date string",
BUNDLE.getString("RegresiveCounter.help.endDate")},
209: {"title", "any string",
BUNDLE.getString("RegresiveCounter.help.title")},
210: {"endTimeLabel", "any string",
BUNDLE.getString("RegresiveCounter.help.endTimeLabel")},
211: {"lefTimelabel", "any string",
BUNDLE.getString("RegresiveCounter.help.lefTimelabel")}
212: };
213: return info;
214: }
215:
216: /**
217: * Start the countdown and update the display.
218: */
219: public void start() {
220: super.start();
221: try {
222: SwingUtilities.invokeLater(new Runnable() {
223: public void run() {
224:
225: if (getParameter("initDate") == null) {
226: throw new
227: IllegalArgumentException(
BUNDLE.getString("RegresiveCounter.error.missingArgument") + ": initDate");
228: }
229: if (getParameter("endDate") == null) {
230: throw new
231: IllegalArgumentException(
BUNDLE.getString("RegresiveCounter.error.missingArgument") + ": endDate");
232: }
233:
234: try {
235: Date initDate =
DATE_FMT.parse(getParameter("initDate"));
236: Date endDate =
DATE_FMT.parse(getParameter("endDate"));
237:
238: validateDate(initDate, endDate);
239: validateDate(now.getTime(), endDate);
240: // Adjust the calendars
241: end.setTime(endDate);
242: start.setTime(initDate);
243: } catch (Exception exp) {
244: throw new RuntimeException(exp);
245: }
246: }
247: });
248:
249: // Run the upate thread
250: Thread thread = new Thread(this);
251: thread.start();
252:
253: } catch (Exception exp) {
254: getJTextFieldLeftTime().setText(exp.getMessage());
255: throw new RuntimeException(exp);
256: } finally {
257: validate();
258: }
259: }
260:
261: /**
262: * Return the date tokens on the formatted form
263: * @param time
264: * @return
265: */
266: public StringBuffer createFormattedRemTimeString(int [] time) {
267: StringBuffer fTime = new StringBuffer();
268: for (int i = 0; i < time.length; i++) {
269: fTime.append(time[i]);
270: if (i < time.length - 1) {
271: fTime.append(":");
272: }
273: }
274: return(fTime);
275: }
276:
277: /**
278: * Check if there is no overlap with two boundary dates
279: * @param init
280: * @param end
281: * @throws IllegalArgumentException If init is greather than end
282: */
283: private void validateDate(Date init, Date end) throws IllegalArgumentException {
284: if (init.after(end)) {
285: throw new
286: IllegalArgumentException(
BUNDLE.getString("RegresiveCounter.error.invalidDate"));
287: }
288: }
289:
290: /**
291: * Return an array containing the number of hours, minutes and seconds
292: * for a given number of miliseconds.
293: * @param timeInMiliSeconds - Normally obtained by using getTime()
294: * @return Number of miliseconds now properly formatted
295: * <ul>
296: * <li> 0 - Days
297: * <li> 1 - Hours
298: * <li> 2 - minutes
299: * <li> 3 - Seconds
300: * </ul>
301: */
302: private int [] decompTime(long timeInMiliSeconds) {
303: int [] timePieces = new int[4];
304: timePieces[0] = (int) (timeInMiliSeconds / MS_PER_DAY); // Days
305: timeInMiliSeconds = timeInMiliSeconds - (timePieces[0] * MS_PER_DAY);
306: timePieces[1] = (int) (timeInMiliSeconds / MS_PER_HOUR); // Hours
307: timeInMiliSeconds = timeInMiliSeconds - (timePieces[1] * MS_PER_HOUR);
308: timePieces[2] = (int) (timeInMiliSeconds / MS_PER_MIN); // Minutes
309: timeInMiliSeconds = timeInMiliSeconds - (timePieces[2] * MS_PER_MIN);
310: timePieces[3] = (int) (timeInMiliSeconds / MS_PER_SEC); // Seconds
311: return timePieces;
312: }
313:
314: /**
315: * Update the contents of the GUI on a separate thread
316: */
317: public void run() {
318: while(now.before(end)) {
319: now.add(Calendar.SECOND, ONE_SEC); // Add 1 second
320: long remaining = end.getTimeInMillis() - now.getTimeInMillis();
321: long used = now.getTimeInMillis() - start.getTimeInMillis();
322: int [] rTime = decompTime(remaining);
323: int [] uTime = decompTime(used);
324: StringBuffer fTime = createFormattedRemTimeString(rTime);
325: getJTextFieldLeftTime().setText(fTime.toString());
326: getJTextFieldEndTime().setText(
endTimeFormatter.format(end.getTime()));
327: getJProgressBar().setMaximum(rTime[0] + uTime[0]);
328: getJProgressBar().setValue(uTime[0]);
329:
330: try {
331: Thread.sleep(MS_PER_SEC);
332: } catch (InterruptedException intExp) {
333: throw new RuntimeException(intExp);
334: } finally {
335: validate();
336: fTime.setLength(0);
337: }
338: }
339: }
340:
341: /**
342: * Get information about the apple
343: * @return
344: */
345: public String getAppletInfo() {
346: return BUNDLE.getString("RegresiveCounter.info")
+
", " + BUNDLE.getString("RegresiveCounter.status");
347: }
348:}

Básicamente este es el plan de acción:
  1. Obtener la fecha de inicio y la fecha final de el usuario. Para eso utilizamos parámetros desde la etiqueta APPLET en el HTML.
  2. Calculamos la diferencia en milisegundos entre la fecha final y la fecha actual. Usando ese valor (cantidad de milisegundos) lo convertimos a días, horas, minutos y segundos. Como es una operación que realizamos con frecuencia le dedicamos una método privado (línea 302).
  3. Calculamos la cantidad de días entre la fecha final y la fecha inicial. Con eso definimos los límites de la barra de progreso (línea 327).
  4. Repetimos el proceso de calcular la fecha mientras la fecha actual sea menor que la fecha de destino. Para ello incrementamos la fecha actual en un segundo a la vez, para luego calcular la diferencia explicada en el paso 2.
No hay mucho que agregar aquí, excepto que decidí probar la el método 'SwingUtilities.invokeLater' (línea 222) el cual según la gente de Sun puede ser utilizado para prevenir problemas de redibujado de pantalla cuando se usa Swing. las actualizaciones de la interfaz gráfica las hago desde otra hebra (línea 250).

Al final la llamada es bastante sencilla:

 1:<h3 class="date-header">Cuenta regresiva para la venida de el hibrido.</h3>
2:<APPLET
3:CODE="com.kodegeek.blog.applet.RegresiveCounter.class"
4:WIDTH="550"
5:HEIGHT="200"
6:ARCHIVE="RegresiveCounter.jar"
7:ALT="Contando los días para la venida de el hibrido">
8:<PARAM NAME="initDate" VALUE="2006-04-09">
9:<PARAM NAME="endDate" VALUE="2007-01-14">
10:<PARAM NAME="title" VALUE="¡Ya viene el hibrido!">
11:<PARAM NAME="label" VALUE="Tiempo faltante">
12:Tu navegador no soporta la etiqueta applet!
13:</APPLET>
14:
Los binarios y una página de HTML para que los utilice en su sitio web . El código fuente está en CVS y lo pueden compilar usando Ant. El Applet sólo funciona con el JDK 1.5, el cual se lo puede bajar e instalar en un momento desde acá.

Como siempre el código es gratuito, viene sin garantías. Creo que corre bien y lo invito a que lo use en su sitio web. Puede verlo en funcionamiento aquí.

Sin embargo quedan preguntas sin responder: ¿Porqué el contador? ¿Qué es un hibrido?. Paciencia, estas preguntas serán respondidas a su debido tiempo :D

Buscar en Technorati: , , , , ,
Buscar en Blogalaxia: , , , , ,

sábado, mayo 27, 2006

Opinión de pelicula: XMEN III, The last stand

Picture
¿Es de verdad la última película de los XMEN III? ¿Que secretos son revelados?


Hoy Vero y yo fuimos a ver XMEN III, the last stand. Es la mejor y más elaborada de las 3 peliculas, aunque no es perfecta. El director se tomó ciertas libertades con respecto a la historía en el comic original ya que se entremezclan al menos dos relatos, el surgimiento de Dark Phenix y los sentinelas contra la amenza mutante (hay una breve referencia a ellos en la película).

Los efectos especiales y la acción muy bien llevados, particularmente las escenas con Magneto, Iceman, Storm y sobre todo Wolverine; Este último tiene un rol mucho mayor que en las películas anteriores.

Mi única queja es que me pareció que ciertos caracteres pudieron desarrollarse mucho más, aunque con un universo como el de XMEN esa es una tarea titanica.

Como siempre Stan Lee sale en la película (no le diré en que escena) y le recomiendo (casi ruego) que no se vaya cuando finalicen los créditos ya que después de estos hay una escena final la cual le dará de que pensar.

XMEN III no decepciona para nada y si usted es un fan de los comics seguro recordará esta pelicula entre sus favoritas.

"Bitch, I am the Juggernaut"

ACTUALIZACIÖN: La pelicula es un record de taquilla. Reventó a el código de Da Vinci y hasta ahora es el 4to debut más grande de todos los tiempos.

Buscar en Technorati: ,
Buscar en Blogalaxia: ,

¿Qué es un packet Storm?

Tormenta de nieve Stamford: Casa del frente
Tormenta de nieve, no duró mucho


No les voy a dar una definición formal, pero ayer simplemente fué brutal lo que pasó a eso de las 10:00 AM. Lo primero que vimos fué como el servicio de mensajería interna (basado en Jabber) desconectó a todo el mundo, mientras que a los pocos segundos empezamos a ver discrepancias en los precios desde las diferentes fuentes de datos. Finalmente casi todos los servicios se desconectaron al mismo tiempo.

Corrimos como locos tratando de entender que era lo que estaba saliendo mal: Problemas con NFS, un switche malo. Nada, estabamos en total obscuridad. Colocamos sniffers en varios segmentos de la red y entonces vimos como la actividad de esta había alcanzado niveles lo suficientemente grandes como para saturar las líneas de 1GB.

Un "packet storm". Legitimo, nada de errores en la aplicación (nuestra o de otros) sino que el mercado se movió tan violentamente que simplemente saturó varios de los servicios produciendo a demás una reacción en cadena, ya que todo el mundo empezó a retransmitir al mismo tiempo.

La tormenta duró sólo 10 minutos pero nos tomó otros 20 dejar el sistema en un estado usable. Bestial, nunca había visto algo de semejante tamaño y además quebrando varios niveles de redundancia.

Buscar en Technorati:
Buscar en Blogalaxia:

miércoles, mayo 24, 2006

Código alfa de PinBlog

Java

En estos momentos estoy jugando con PinBlog y decidí soltar una versión "Alfa". Por ahora lo único que medio funciona es el código que hace Ping por línea de comandos (aunque el manejo de exceptiones es increiblemente primitivo), y el prototipo de la interfaz gráfica (que no hace nada aún). Sin embargo creo que poniendo el código fuente como un tar en SourceForge y el jar para que la gente juegue un poco con él quizas alguien se interese.

¿Que tiene de interesante el proyecto? Bueno, para empezar le va a permitir a mucha gente que no usa WordPress sino Blogger hacer ping a varios directorios. Lo otro es que podrá ser llamado desde la línea de comandos, o sea si quiere ponerlo en un cron puede hacerlo :)

No pido mucho, sólo gana de echarle bolas y ver que sale de aquí.

Se pueden bajar el tar de aqui, y el jar de acá. Si quiere ver el repositorio de CVS mucho mejor, y por supuesto necesita el JDK de SUN para correrlo.

Buscar en Technorati: , , ,
Buscar en Blogalaxia: , , ,

domingo, mayo 21, 2006

Grupo de Mazinger Z en Flicker

Mazinger Z
Hay aún una influencia fuerte de este robot


Es un clásico de el manga Japones. En venezuela se fué increiblemente popular hace 20 años atrás y en los estados Unidos han sacado algunos DVD. Hay un grupo en Flickr al cual todos están invitados.

¿Se anima a participar?

Buscar en Technorati: ,
Buscar en Blogalaxia: ,

sábado, mayo 20, 2006

Opinión de pelicula: El código de Da Vinci

Libro El Código de Da Vinci
El libro


Hoy fuimos a ver la pelicula El código de Da Vinci, basada en el libro de el mismo nombre. Yo no leí el libro (mismo caso que con la serie de Harry Potter). Para casi todo el mundo es conocido que el libro (y ahora la pelicula) está rodeada de controversia debido a que critica la posición de ciertos grupos conservadores dentro la Iglesia Catolica (Opus Dei) con respecto a la vida de Jesus; El libro se convirtió en un BestSeller internacional y como el libro la pelicula ha tenido reacciones de todo tipo, entre ellas el odio de los críticos.

La pregunta obligada es ¿le hace justicia al libro? otra aún más importante es ¿es una buena pelicula?

No puedo responder la primera con justicia, aunque mi esposa (que si leyó el libro asi como otros de el autor) me dice que es bastante fidedigna. En cuanto a la segunda pregunta, si creo que es una buena pelicula más no excelente.

El asunto de la religión catolica es complicado; Quienes se apegan a las reglas dicen que la religión no es como una cafetería, donde se toma lo que le provoca y se deja lo demás por fuera, ya que es una actitud muy conveniente. Yo pienso que se trata más bien de que el mensaje es bueno y que el hombre tiene libertad de decidir lo que mejor le conviene.

Si el mensaje es bueno y no te conviertes en dogmatico entonces la religión es buena. Lo otro es que la religión tiene sentido solamente si se tiene fé y eso es un asunto muy personal.

¿Y usted, piensa que la Iglesia Catolica está exagerando con el Código de Da Vinci o tienen la razón?

NOTA: Me faltó decir que el código de Da Vinci es un trabajo de ficción, al igual que libros parecidos como el Caballo de Troya.

Buscar en Technorati: , ,
Buscar en Blogalaxia: , ,

viernes, mayo 19, 2006

¿Seagate? ¿Maxtor? ¡Es la misma paja!

matrox usb hardrive
Mi disco duro externo


No, no es una exageración, sino que Seagate (NYSE:STX) va a adquirir a Maxtor (NYSE:MXO). Los terminos finales se deciden hoy Viernes (el el cual expiran las opciones y me tendrán corriendo como loco.

Así que cuando compre un disco duro de estos fabricantes, usted podrá decir con toda propiedad que son la misma vaina :)

Buscar en Technorati: ,
Buscar en Blogalaxia: ,

jueves, mayo 18, 2006

¿Java y Ubuntu?

Java

Como siempre Sun dió unas cuantas sopresas en JavaOne, entre ellas cambios en su licencia las cuales le permitiran incluirlo en Linux sin tantos problemas de distribución. Esto seguramente se debe a la presión de lenguajes como C# los cuales tienen representación en Linux gracias al proyecto Mono.

¿Muy poco y muy tarde? No se sabe aún, pero yo creo que es una movida acertada y en la dirección correcta. Yo soy de los que piensa que Sun eventualmente vendrá abriendo la máquina virtual de Java.

¿Usted que opina?


Buscar en Technorati: , ,
Buscar en Blogalaxia: , ,

sábado, mayo 13, 2006

Haciendo mis respaldos en Lunar Pages

backup index
Haciendo un respaldo desde el sitio de hospedaje


Mientras espero a que se hagan las 11:00 PM para ver en SCFI.com "The Return Of The lving Dead III" (esta vez los muertos vivientes retornan gracias a un barril del famoso gas zombie encontrado en Chernovil), me puse a escribir un programa para hacer un backup de mi sitio web. Yo lo estoy hospedando actualmente en LunarPages.com y ellos ofrecen una página web segura desde la cual te los puedes bajar.

Como la virtud de el Ingeniero es la pereza y me da un dolor testicular agudo (dolor de bolas) pensar que puedo perder mi sitio web sin poder recuperarlo, me decidí a escribir un script que haga el trabajo:

   1:#!/bin/bash
2:#
3:# This script will let you make a web backup of your website
4:# if you host it a lunarpages.com
5:#
6:# Author: josevnz@sourceforge.net
7:# License: LGPL
8:#
9:
10:declare -r SCRIPT=${0##*/}
11:declare -r UKNOWN="uknown"
12:declare -r BCK_DATE=`date +%m-%d-%Y|sed 's#^0##'`
13:declare password=$UNKNOWN
14:declare user=$UNKNOWN
15:declare destination=$HOME/webbackup
16:declare config
17:
18:function usage {
19:cat << EOF
20:$SCRIPT [-u|-d]
21:Where:
22:
23:-u User
24:-d Destination directory
25:-c config properties file
26:
27:You can use all the flags if you want!
28:
29:Blog: KodeGeek - http://kodegeek.com
30:EOF
31:}
32:
33:# Check if a parameter is missing
34:# Argument: Parameter to check
35:# Argument: Parameter name
36:#
37:function isMissing {
38: if [ "$1" == "$UNKNOWN" ]; then
39: printf "[ERROR]: %s is missing!\n" "$2"
40: usage
41: exit 192
42: fi
43:}
44:
45:if [ -z "$*" ]; then
46: usage
47: exit 192
48:fi
49:
50:while getopts "u:s:d:c:" option; do
51: case $option in
52: u)
53: user=$OPTARG
54: ;;
55: d)
56: destination=$OPTARG
57: ;;
58: c)
59: config=$OPTARG
60: ;;
61: *)
62: # Show the help
63: usage
64: exit 0
65: ;;
66: esac
67:done
68:
69:if [ ! -d "$destination" ]; then
70: mkdir -p "$destination"
71:fi
72:cd "$destination"
73:if [ $? != 0 ]; then
74: exit $?
75:fi
76:
77:server="`egrep lunarWebBackup.server $config|cut -f2 -d=`"
78:
79:isMissing "$user" "user name"
80:isMissing "$server" "server"
81:isMissing "$config" "config file"
82:if [ ! -f "$config" ]; then
83: printf "[ERROR]: Unable to open %s" "$config"
84: exit 192
85:fi
86:
87: