Translate

jueves, 28 de noviembre de 2013

Road bike in the Söderåsen: Ljungbyhed and Röstånga

Easy road bike route of about 50km in Skåne, Sweden. Starting in Ljunbyhed and passing throw the Söderåsen National Park heading to Röstånga. Partially hilly road with a first hard climb of about three kilometers.


miércoles, 27 de noviembre de 2013

CSS: Repetir imagen de fondo

Sirve por ejemplo para colocar una imagen de fondo que queramos que se repita. Posicionándola en la derecha y repitiéndola de arriba hacia abajo.

Este trozo de código habría que ponerlo en un fichero CSS que haga referencia al componente body, pero también puede integrarse en el HTML poniéndola entre tags del tipo "style"

body
{
background-image:url('gradient2.png');
background-repeat:repeat-y;
background-position:right top;
}


Con repeat-x la imagen se repetirá en sentido horizontal.

martes, 26 de noviembre de 2013

SQL Server: Manejar Time mayor de 24h con función escalar.

Este ejemplo resuelve el post Anterior pero ahora usando una función en vez de un procedimiento, lo que permite llamar a dicha función desde dentro del Select y así poder usar Group By:
CREATE FUNCTION dbo.floatToTimeChar
(
    – Add the parameters for the function here
    @timeAsFloat float
)
RETURNS varchar(14)
AS
BEGIN
    DECLARE @TotTimeVC varchar(14)
    declare @h int;
    declare @m int;
    declare @s int;
    set @h=CAST(@timeAsFloat/3600 as int);
    set @m=CAST( (CAST(@timeAsFloat as Int)%3600)/60 as int);
    set @s=(CAST(@timeAsFloat as Int)%3600)%60;
    declare @mVC varchar(2);
    declare @sVC varchar(2);
    set @mVC=Convert(varchar(2),@m);
    set @sVC=Convert(varchar(2),@s);
    if LEN(@mVC)=1
    begin
        set @mVC=’0′+@mVC;
    end;
    if LEN(@sVC)=1
    begin
        set @sVC=’0′+@sVC;
    end;
    set @totTimeVC=Convert(varchar(8),@h)+’:'+@mVC+’:'+@sVC;    
    – Return the result of the function
    RETURN @TotTimeVC
END
Para usar esa función usamos el siguiente Select:
select
       (Select ST.SportTypeName from SportTypes ST where ST.SportTypeID=Sessions.SportTypeID) as SportName,      
       COUNT(SessionID) as SesionsCant,       
       CAST(SUM(Distance)as decimal(7,2))as TotDist,
       CAST(AVG(Distance)as decimal(7,2)) as AvgDist,
       MAX(Distance) as MaxDist,
                    
       dbo.floatToTimeChar(SUM(CAST(Time As Float)*24*60*60)) As TotTimeCalc,
       dbo.floatToTimeChar(AVG(CAST(Time As Float)*24*60*60)) As AvgTimeCalc,                       
       dbo.floatToTimeChar(MAX(CAST(Time As Float)*24*60*60)) As MaxTimeCalc,                       
                           
       CAST(AVG(CAST(MedHR as float)) as decimal (7,2) )as AvgMedHR,
       MAX(MedHR) as MaxMedHR,
       CAST(AVG(CAST(MaxHR as float)) as decimal (7,2) )as AvgMaxHR,
       MAX(MaxHR) as MaxMaxHR,
       CAST(AVG(CAST(Value as float)) as decimal (7,2) )as AvgValue,
       MAX(Value) as MaxValue,
       
       CONVERT(varchar,MIN(Date),106) as firstDate,
       CONVERT(varchar,MAX(Date),106) as lastDate,
       DATEDIFF (day, CONVERT(varchar,MIN(Date),106), CONVERT(varchar,MAX(Date),106))+1 as days
       
from Sessions
where UserID=@userID
group by SportTypeID;

SQL Server: Manejar time mayores de 24horas

La idea es, tengo un programa donde controlo las sesiones de entrenamiento de una persona. Necesito obtener el total de distancia y tiempo recorrido por el atleta.

Con los datos de tipo time no puedo controlar más de 24horas. Si bién las sesiones son siempre muy inferoiores a 24horas, al sumarlas si se nos presenta el problema. Para resolverlo, ántes de sumar el tiempo de cada sesión los transformamos a float para sumarlos todos. Obtenemos un float que tiene la suma total, y luego con un procedimiento que crearemos en la BD podremos transformar a formato hhhh:mm:ss de manera que así ya podamos mostrarlo.

El procedure sería así:
@timeAsFloat es el float de entrada que contiene la suma de tiempos, y @totTimeVC será el resultado en formato varchar conteniendo el tiempo total.

create procedure [dbo].[floatToTime] @timeAsFloat float, @totTimeVC varchar(14) output 
as
   declare @h int;
   declare @m int;
   declare @s int;
   set @h=CAST(@timeAsFloat/3600 as int);
   set @m=CAST( (CAST(@timeAsFloat as Int)%3600)/60 as int);
   set @s=(CAST(@timeAsFloat as Int)%3600)%60;
   declare @mVC varchar(2);
   declare @sVC varchar(2);
   set @mVC=Convert(varchar(2),@m);
   set @sVC=Convert(varchar(2),@s);
   if LEN(@mVC)=1
   begin
      set @mVC=’0′+@mVC;
   end;
   if LEN(@sVC)=1
   begin
      set @sVC=’0′+@sVC;
   end;
   set @totTimeVC=Convert(varchar(8),@h)+’:'+@mVC+’:'+@sVC;

La consulta necesaria y que usa el procedimiento anterior sería:

use TrainIT;
declare @userID bigInt;
set @userID=85;
       declare @totTime float;
       set @totTime=(select SUM(CAST(Time As Float)*24*60*60) from Sessions where       UserID=@userID);
       declare @totTimeVC varchar(14);

execute floatToTime @totTime,@totTimeVC output;
select COUNT(SessionID) as SesionsCant,
           SUM(Distance) as TotDist,
           CAST(AVG(Distance)as decimal(7,2)) as AvgDist,
           MAX(Distance) as MaxDist,                                                
           @totTimeVC As TotTimeCalc,              
from Sessions
where UserID=@userID;

domingo, 24 de noviembre de 2013

SQL Server: Primer y último día del mes

Consulta para calcular el número de sesiones, así como la suma de las distancia y tiempo en las sesiones realizadas en el mes en curso para el usuario dado (este se pasa por parámetro a la consulta en @userID)

Declare @firstDayOfMonth varchar;
Set @firstDayOfMonth=Convert(varchar,DATEADD(d,-day(GetDate())+1,GetDate()),105);


Declare @LastDayOfMonth varchar;
Set@LastDayOfMonth = Convert(varchar,DATEADD(d,-day(GetDate()),DATEADD(m,1,GetDate())),105);


select COUNT(SessionID) As SesionsCant,
          SUM(Distance) as TotDist,
          CONVERT(char(8),CAST(SUM(CAST(Time As Float)*24 )AS DateTime),108 )As TotTime
from Sessions
where UserID=@userID 

           AND (  (CONVERT(varchar,Sessions.Date,105)>=@firstDayOfMonth )         
          AND     (CONVERT(varchar,Sessions.Date,105)<=@LastDayOfMonth )   );

C#: float to String with two decimal digits only


string aString="";
float aFloat=32,78654F;
aString= String.Format (“{0:0.00}”,Convert.ToDecimal(aFloat));

viernes, 22 de noviembre de 2013

Java: Control Frame closing

Sometimes you need to control the closing of a given frame, for example, the main frame. You would need to do any special task before the closing, to save any king of data before the closing, do not permit the closing of the fame, etc...



Then you need to implement an interface for the given Frame. For windows you have the WindowsListener, which includes controls for the following actions:

  • WindowClosing
  • WindowOpened
  • WindowClosed
  • WindowIconified
  • WindowDeiconified
  • WindowActivated
  • WindowDeactivated.
To control the closing we are going to use the first one, and for this task we need to perform the following steps:

  1. Add implements WindowListener to de definition of the class.
  2. Implements all the methods (mandatory) defined before, even if you are going to use only the first one. You can do it mannually or using the options given by Eclipse and indicated with an error in the name of the class. In this case, put the cursor over the error indicated and a message will appear given the option to create automatically all the methods.
  3. In the constructor for the class add: addWindowListener(this)
  4.  Add the code for the method, in our case WindowClosing
The code wil be as shown



import java.awt.BorderLayout;


public class FMain extends JFrame implements WindowListener{

    private JPanel contentPane;
    private JTextField txtTo;


    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Frame frame = new FMain();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    public FMain() {
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
      
        txtTo = new JTextField();
        txtTo.setBounds(54, 6, 134, 28);
        contentPane.add(txtTo);
        txtTo.setColumns(10);
      
        JLabel lblNewLabel = new JLabel("To :");
        lblNewLabel.setHorizontalAlignment(SwingConstants.RIGHT);
        lblNewLabel.setLabelFor(txtTo);
        lblNewLabel.setBounds(6, 12, 45, 16);
        contentPane.add(lblNewLabel);
      
        JButton btnNewButton = new JButton("Borrar");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                txtTo.setText("");
            }
        });
        btnNewButton.setBounds(188, 7, 97, 29);
        contentPane.add(btnNewButton);
      
        addWindowListener(this);
    }
   
   
    public void windowClosing (WindowEvent e){
         JFrame frame = (JFrame)e.getSource(); //Gets The Form invoking the WindowClosing method
        String botonY = "SI";
        String botonN = "No";
        Object[] options={botonY,botonN};
        int n=JOptionPane.showOptionDialog(frame, "¿Desea cerrar la aplicación?", "Atención",            JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null,
                options, botonY);
        System.out.println("Option="+n);
        if (n==JOptionPane.YES_OPTION) //Exit
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        else frame.setVisible(true);
    }


    @Override
    public void windowOpened(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void windowClosed(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void windowIconified(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void windowActivated(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }
   

}

jueves, 21 de noviembre de 2013

SQL Server: DateTime To Float

La idea sería calcular la velocidad a partir de dos campos en una tabla que contienen la distancia en km y el tiempo invertido. El cálculo es fácil, distancia/tiempo, pero ántes tendremos que convertir el tiempo a float.

La tabla posee por lo tanto dos campo, uno DateTime (time) y otro float(distance). Necesitaremos hacer un CAST del time para convertir a float, lo que nos da un número que multiplicado por 24 serán horas, por 24*60 serán minutos, y 24*60*60 serán segundos. Así para obtener un campo que contenga la velocidad en km/h haremos un select de la siguiente manera:

select distance,time, distance/(CAST(time AS float)*24) AS “Speed” from Table1 where CAST(time AS float)>’0′

 La columna Speed contendrá el dato de la velocidad. En el campo time hay que usar el tipo DateTime ya que permite el casting a float, no así con el tipo Time.
Un DateTime cuyo valor sea “1900/01/01 00:00:00.000″ al hacer el cast a float devolverá 0.

La clausula where evita que dividamos por cero, pero eliminará aquellos registros que no tengan el dato tiempo. Para evitar eso podemos cambiar la consulta a :

select distance,time,
       CASE
         WHEN CAST(time AS float)>’0′ THEN distance/(CAST(time AS float)*24)
         ELSE ’0′
       END AS “Speed”       
from Table1

De esta manera si encontramos un time menor o igual a cero pondremos automáticamente la velocidad a 0, en otro caso si haremos el cálculo.

Si queremos mostrar el dato de la velocidad con solo dos dígitos tendremos que dar la salida haciendo un casting a decimal, para ello la consulta quedaría así:

select distance,time,
       CASE
         WHEN CAST(time AS float)>’0′ THEN CAST (
                     distance/(CAST(time AS float)*24) AS decimal (7,2)     )
         ELSE ’0′
       END AS “Speed”       
from Table1

Por último y para evitar que el campo time, de tipo datetime, nos devuelva un dato del tipo “1900-01-01 00:00:00.000″, tenemos que hacer una conversión, para lo cual usaremos la función CONVERT con el valor 108, que devuelve la parte time del campo en formato hh:mm:ss. Quedará la consulta así:

select distance, CONVERT(Char(8),time,108) As “ShortTime”,
       CASE
         WHEN CAST(time AS float)>’0′ THEN CAST (
         distance/(CAST(time AS float)*24)
         AS decimal (7,2) )
         ELSE ’0′
       END AS “Speed”       
from Table1

SQL Server: Manejar datos tipo Money en Visual Studio y C#

Para usar el tipo de datos money de Sql en visual necesitaremos las siguientes referencias al framework:

Using System.Data.SqlTypes;
Using System.Xml;

Para definir un campo de este tipo en el código lo haremos así:

SqlMoney ammount;

Para asignar datos partiremos de un valor float, double o int que transformaremos a SqlMoney ántes de asignar a la variable:

Double aValue = 100.23F;
SqlMoney amount =(SqlMoney)aValue;

Si hemos usado un SQL reader para obtener los datos a través de una consulta usaremos el método GetSQqlMoney:

using (SqlConnection conn = new SqlConnection(connString))
{
     string query = “select * from Materials where MatID = @matID”;
     using (SqlCommand cmd = new SqlCommand(query, conn))
    {
           cmd.Parameters.Add(new SqlParameter(“@matID”,     SqlDbType.Int));
           cmd.Parameters["@matID"].Value = matID;
           conn.Open();
           SqlDataReader reader = cmd.ExecuteReader();
           while (reader.Read())
           {
                  matID = reader.GetInt32(0);
                  matCost = reader.GetSqlMoney(7);
                  matInitTime = reader.GetString(8);
                  matInitDist = reader.GetDecimal(9);
                  matRecTime = reader.GetString(10);
                  matRecDist = reader.GetDecimal(11);
                  matBuyMemo = reader.GetString(12);
                  userID = reader.GetInt32(13);
          }
         reader.Close();
     }
}  

Visual Studio: Moverse por un DataGridView de manera manual

Si, ya lo se, existe un componente llamado Binding Navigator que implementa todo esto sin necesidad de escribir una sola línea de código, pero … algunas veces puede resultar útil saber como hacerlo de manera manual (programáticamente)

Para ello usaremos las propiedades del Datagrid:

CurrentRow.Index devuelve la fila actual.

CurrentCell sirve para obtener o fijar la posición en una celda dada. y se pasa de la forma [columna, fila]

RowCount devuelve el número de filas mostradas en el Datagrid.

De esta manera implementar los método First, Previous, Next y Last sería tan fácil como:

moveoverdatagrid

10 Lessons Running Teaches You About Life

Copied from : http://thedailyrunnerpage.com

 

1. When things get tough, just keep going.

When most people encounter a rough patch, they quit.  The truly successful people in the world keep going no matter what.  Never let your setbacks win.

2. Consistency creates habit.

To incorporate anything into your life, you have to make it a habit.  To make something a habit, you have to be consistent.  Whatever it is you’re aiming for, make it a part of your life.

3. You’ll have to get through hell before you get to heaven.

Like all things worth pursuing, you are going to get knocked down, stepped on, and rejected along the way.  Consider this to be part of the path to your goals.  Sometimes it’s more about the journey than the destination.

4. Reaching your goals will take a lot of work.

If it doesn’t, it’s either not a goal, not worth pursuing, or will not have any fulfillment.  Never expect to not put in work and get somewhere.

5. Every aspect of life is mental.

It’s not about what you do or what happens to you, it’s about how to respond to it.  It’s how you decide to carry on.  Your power comes from inside your head.

6.  You do have time– you just have to make it.

If something is important to you, you’ll make time for it.  If not, you’ll make excuses.

7. You define your own limits.

Your limits aren’t put unto you by your parents, other people, or the universe.  You are in total control of it.  You decide whether or not to shoot for the moon or stay right where you are.

8. If you wait for the right conditions, you’ll never get anything done.

Don’t wait for anything or anybody.  You know what you have to do to reach your goals and get things done. Just go do them!

9. Go beyond your limits every day and watch the magic happen.

You’ll be amazed at what you can achieve if you just push yourself a little further.

10. There is peace even in the most chaotic times.

No matter now grueling, stressful, sorrowful, or painful your situation is, there is always a silver lining and something positive to be found.  Seek it out, learn from it, and keep moving on.

miércoles, 20 de noviembre de 2013

SQL Server: Almacenar un campo encriptado

La idea es encriptar un campo de una tabla para poder almacenar un password. Para ello usaremos el tipo de datos varBinary y los comandos pwdencrypt y pwdcompare de SQL.

La idea es al usar el insert encriptar el campo de manera que no se podrá volver a desencriptar. Para poder comparar si una entrada pasada corresponde con una clave usaremos un select con el comando pwdcompare.

Supondremos una tabla que contendrá a los Usuarios, llamada Users de la siguiente manera:

tabla

Para grabar el dato usaremos el código:

save new user 

Mientras que para comprobar una clave dado un nombre de usuario usaremos:

checkLogin
pwdencrypt encripta usando una clave hash aleatoria y que no se guarda, lo que evita que podamos desenciptar la clave para verla. No podremos editarla, tendremos que establecer algún mecanismo para que cuando una clave se olvide haya que generar una clave nueva.

Orbea Gredos revival….Parte I


El pasado verano encontré buscando por ahí una Orbea Gredos que mas o menos debe ser del año 1982-83. El estado general no era malo salvo en las ruedas, donde faltaban varios radios y además tenía el piñon (de cinco velocidades) completamente atrancado.

17 Juntas
18 Sola

19 Sola
20 Sola

Los componentes de esta bici eran para la época, digámoslo de una manera suave, “de marca”, sin ser tope de gama, pero si de aceptable calidad para lo que se estilaba. Curiosamente la mayoría de ellos provenientes de Francia. El despiece era de la siguiente manera:
  • Cuadro de acero fabricado en Francia para Orbea por la marca, Brifont. Es una talla para 1,70 – 1,80.
  • Potencia, muy bonita, cromada de la marca durbic.
  • El manillar cromado de la marca fracesa Belleri.
  • Manetas y puentes de freno Weinnmann
  • Platos y bielas Rigida con desarrollo 46,52
  • Llantas Weinnmann con piñon trasero de 5 velocidades
  • Desviadores delantero y trasero de la marca Simplex.
La idea es desmontar todo, revisar rodamientos y sustituir, pintar de nuevo, buscar las pegatinas originales y volver a montar cambiando algunos componentes, en especial las ruedas, para dejar la bicicleta totalmente operativa.

Comenzamos para ello desmontamos la rueda trasera y la subimos al caballete. Comenzamos quitando los pedales, el sillín, los frenos, y el cableado tanto de los frenos como de los cambios, todo de la misma manera que en una bici actual. Por ahora no hay problemas, todo está suave y fácil de salir.

00 Inicio

Quitamos la cadena, de la misma manera que con una bici actual, esto es usando el tronchacadenas.

02 Cadena

Quitamos los dos desviadores, y aquí encontramos la primera diferencia. El cambio trasero no va roscado a la patilla, sinó que rosca sobre un tornillo que pasa a través del orificio de la patilla que no tiene estriado alguno. Hay que usar por lo tanto dos llaves allen, una para cada lado.

03 Cambio
04 Cambio

Lo siguiente serán las bielas y el eje, para lo que necesitamos un extractor de bielas de cuadradillo. Quitamos previamente unas tapas de goma que van roscadas con un destornillador plano grande.

05 Tapon bielas

Queda visible la tuerca que sujeta a las bielas en su sitio que quitaremos mediante una llave de vaso.

06 Tornillo bielas

Por último roscamos el extractor en la biela y apretamos el extractor para que extraiga la biela. Repetimos la operación con la otra biela.

07 Extractor
08 Extractor

Pasamos ahora a quitar el eje del pedalier, usando para ello una llave de vaso grande para desenroscar uno de los laterales, el izquierdo,  y asi poder extraer la cazoleta con su rodamiento. Sacamos el eje, y repetimos la operación para el otro lado.

09 Eje
10 Soltar tapa eje
11 Eje izqdo

Por último retiramos la cinta del manillar, las palancas de freno quitando previamente las fundas de goma de los escaladores, el manillar y finalmente la tija del manillar.
Queda por desmontar la dirección quitando la tuerca superior con una llave, la arandela intermedia, y la tuerca inferior que rosca a mano. Queda la horquilla suelta.

12 Direccion

13 Direccion
14 Direccion
15 Direccion

De esta manera ya está el cuadro listo para quitar la pintura y pintar.

16 Despiece final

Visual Studio: GetSchemaTable para obtener el schema de una tabla

GetSchemaTable, devuelve el schema de una tabla dada, pero para sacar la información interesante del resto que sobra tendremos que interpretar los datos que se nos devuelven en forma de tabla.
Pongo aquí abajo el código de una forma de hacerlo que se me ha ocurrido, la idea es que al final se nos devuelva en un listBox algo parecido a esto:

Captura

El primer método devuelve el Schema según lo hace la función GetSchemaTable, y el segundo descompone la información:

     public DataTable readSchemaFromTable(string conString, string queryString)
        {
            using (SqlConnection connection = new SqlConnection(conString))
            {
                using (SqlCommand command = new SqlCommand(queryString, connection))
                {
                    connection.Open();
                    using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo))
                    {
                        DataTable table = reader.GetSchemaTable();
                        return table;
                    }
                }
            }            
        }
        private void readTableDataMenuItem_Click(object sender, EventArgs e)
        {
            //Leo datos de la tabla
            string conn = @”Integrated Security = true;
                            Initial catalog = ” + tBxCatalog.Text + @”;
                            Data Source = ” + tBxServer.Text + @”;”;
            string query = @”SELECT * FROM ” + tBxTable.Text;
            using (DataTable table = readDataToTable(conn, query))
            {
                //Conectamos al grid
                dBSrcSQL.DataSource = table;
                dGVTable.DataSource = dBSrcSQL;
            }
            //Leo el schema de la tabla
            using (DataTable schema = readSchemaFromTable(conn, query))
            {
                
                string cadena = “”;                
                string name =”";
                string dataType =”";
                string sizeData=”";
                string isKey=”";
                string isAuto = “”;
                //Pasamos los datos al list Box
                foreach (DataRow row in schema.Rows)
                {
                    foreach (DataColumn column in schema.Columns)
                    {
                        if (column.ColumnName == “ColumnName”)  
                            name = row[column].ToString();
                        else if (column.ColumnName == “DataTypeName”)
                                dataType = row[column].ToString();
                             else if (column.ColumnName == “ColumnSize”)
                                     sizeData=row[column].ToString();
                                  else if (column.ColumnName == “IsKey”)
                                        {
                                            if (row[column].ToString()==”True”) isKey = “isKey”;
                                            else isKey = “”;
                                            //isKey = row[column].ToString();
                                        }
                                        else if (column.ColumnName == “IsAutoIncrement”)
                                        {
                                            if (row[column].ToString()==”True”) isAuto = “isAutoIncrement”;
                                            else isAuto = “”;
                                        }
                            
                    }
                    cadena = name + ” ” + dataType + “(” + sizeData + “) ” + isKey + ” ” + isAuto;
                    lBxFields.Items.Add(cadena);
                    cadena = “”;
                }
            }
        }

martes, 19 de noviembre de 2013

First and Last Day of Week Month and Year

        //Calculates first day of year
        public static DateTime firstDayOfYear(DateTime dateTime)
        {
            DateTime result;
            result = dateTime.AddDays(-(dateTime.Day - 1));
            result = result.AddMonths(-(dateTime.Month - 1));
            return result;
        }

        //Calculates last day of year
        public static DateTime lastDayOfYear(DateTime dateTime)
        {
            DateTime result;
            result = dateTime.AddYears(1);
            result = result.AddMonths(-(dateTime.Month-1));
            result = result.AddDays(-(dateTime.Day));
            return result;
        }

        //Calculates first day of month
        public static DateTime firstDayOfMonth(DateTime dateTime)
        {
            DateTime result;
            result=dateTime.AddDays(-(dateTime.Day-1));
            return result;
        }

        //Calculates last day of month
        public static DateTime lastDayOfMonth(DateTime dateTime)
        {
            DateTime result;
            result = dateTime.AddMonths(1);
            result = result.AddDays(-(dateTime.Day));           
            return result;
        }

        //Calculates first day of week
        public static DateTime firstDayOfWeek(DateTime dateTime)
        {
            DateTime result;
            result = dateTime.AddDays(-(Convert.ToInt32(dateTime.DayOfWeek)-1));
            return result;
        }

        //Calculates last day of week
        public static DateTime lastDayOfWeek(DateTime dateTime)
        {
            DateTime result;
            result = dateTime.AddDays((7-Convert.ToInt32(dateTime.DayOfWeek)));
            return result;
        }

Visual Studio C#: Cargar un excel en un DataGridView

La idea sería cargar un fichero de excel que contiene datos en una tabla para que se muestren en un DataViewGrid y así poder pasar a una base de datos SQL.

Para ello vamos a hacer uso de OLE DB, (Object Linking and Embeding for Data Bases), que no es mas que una tecnología propia de Microsofot para permitir el acceso a datos. OLE DB forma parte de la tecnología MDAC (Microsoft Data Access Componentes) de microsoft, que divide OLE DB en dos componentes principales, consumidores, y proveedores en referencia a como tratan los datos.
Usaremos así los proveedores OLE DB para acceder a cualquier tipo de dato, desde una hoja de excell a una base de datos SQL, Oracle, etc…
Para hacer nuestro ejemplo crearemos un simple projecto del tipo WFA (Windows Form Application), al que añadiremos cuatro componentes:
  • Un Data GridView que llamaremos: dGVExcel
  • Un Binding Source que llamaremos: dBSource
  • Un Text Box que llamaremos: txBxPath, y que en la propiedad Text tendrá el nombre del excell que queremos abrir, incluyendo el path de búsqueda, en mi caso C:\Users\uge\Desktop\excell1.xlsx
  • Y un botón, que al hacer click sobre el abrira el excel indicado en el TextBox mostrando los datos en el DataGridView.
Para poder hacer uso de OLE DB tenemos que añadir a los using del fichero:

using System.Data.OleDb;

Una vez hecho esto hacemos doble click sobre el botón para escribir el código correspondiente, que será como sigue:
Primero necesitamos crear un string que contenga la siguiente info:

1- La configuración de nuestro OLE DB Provider. Existen muchos tipos de proveedores implementados, así que tenemos que tener claro cual vamos a usar. En nuestro caso es una hoja de excel creada con office 2010, así que usaremos como provider Microsoft.ACE.OLEDB.12.0;

En esta página http://www.connectionstrings.com/ podéis acceder a información relativa a conexiones, no solo para OLE DB, sinó también para otras formas de conexion. Para excel podeis encontrarlas en http://www.connectionstrings.com/excel

2 – El DataSource del que obtendremos los datos, esto es, nuestro fichero de excel, que sacaremos del campo Text del objeto txBxPatx.

3 – Propiedades del fichero a abrir, es decir las Extended properties. en nuestro caso usaremos Excel 12.0 XMml; HDR=YES. Esta última indica por ejemplo que se añada la primera fila con los títulos de las columnas.

Añadimos al código:

         string connectionString = @”Provider=Microsoft.ACE.OLEDB.12.0;
                                         Data Source=” + txBxPath.Text + @”;
                                         Extended Properties=”"Excel 12.0 Xml;HDR=YES”"”;

Lo siguiente será preparar una consulta que extraiga los datos del provider, la consulta se hace en SQL y el nombre que incluimos será el de la Hoja dentro del excel de la que sacar los datos, en mi caso es Hoja1, y se le añadirá $ por detrás:

string query = “SELECT * FROM [Hoja1$]“;

Una vez tenemos el string que configura al provider, y la consulta que extrae los datos vamos a crear la conexión y extraer los datos hacia una tabla que también crearemos en el código:

//Creamos el provider
OleDbConnection excelConnection = new OleDbConnection(connectionString);
//Lo abrimos
excelConnection.Open();
//Creamos un Data Adapter que extraiga los datos necesarios(todos) del provider
OleDbDataAdapter data = new OleDbDataAdapter(query, excelConnection);
//Creamos una tabla
DataTable dTable = new DataTable();
//Usando el Data Adapter que tiene los datos seleccionados, rellenamos la tabla.
data.Fill(dTable);
// Conectamos el BindingSource con la Tabla.
dBSource.DataSource = dTable;
// Conectamos el DataGridView con el BindingSource
dGVExcel.DataSource = dBSource;

Si compilamos y ejecutamos el proyecto deberíamos obtener una pantalla similar a esta:

Capture

A partir de aquí ya podemos trabajar con los datos en nuestra aplicación VS.


Configurar VPN entre Mac y Windows7

En este tutorial vamos a configurar una VPN entre un servidor y un cliente. En mi caso el servidor de VPN será un equipo con Windows 7, es posible hacerlo mediante un router que admita VPN, o incluso mediante un Servidor Linux, Mac, Windows XP, etc..

Para el cliente usaré un Mac con Mountain Lion instalado.

Para el servidor usaremos openVPN, por su facilidad de configuración y por ser gratuito. Puedes descargarlo aquí:


openvpn

Para el cliente usaremos tunnelblick que permite el uso de openVPN en MacOS. Puedes descargarlo aquí:  https://code.google.com/p/tunnelblick/

starbux-tunnelblick-7

Lo pasos generales a seguir serán:
1 Descargar e instalar ambos
2 Crear las claves necesarias para servidor y clientes
3 Crear los ficheros de configuración que se usaran en las conexiones de servidor y clientes.
4 Preparar la conexión Bridging en el servidor.
5 Testear y lanzar las conexiones.

1 Descargar e instalar ambos. En este punto no hay nada reseñable, tan solo que en nuestro Windows 7 tendremos que editar las propiedades del ejecutable openVPN GUI y activar que se pueda ejecutar como administrador. (Botón derecho sobre el)


runas


2 Crear las claves necesarias para servidor y clientes. Necesitaremos crear las siguientes claves y certificados:
1 Certificado y clave para Master Certificate Authority (CA) : Abrimos línea de comandos, e iremos al path c:\Program Files\openVPN\easy-rsa
Ejecutamos:

init-config  (copia el fichero vars.bat en vars.bat.sample)

Editamos el fichero vars.bat y modificamos las entradas KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG y KEY_EMAIL

Ejecutamos:

vars
clean-all
build-ca  (Con esto hemos creado las claves y certificados para la CA).

2 Certificado y clave para Servidor: ejecutamos el comando build-key-server server para crear las claves del servidor. Aquí a veces podemos encontrar un problema con la generación de claves si repetimos esta tarea varias veces, para ello es importante que usemos TODOS los datos que se nos pide de manera igual tanto en el cliente como en el servidor, A EXCEPCIÓN del grupo que es preferible poner algo distinto para cada certificado.

3 Certificado y clave para cada uno de los clientes que se vayan a conectar: igual que para el servidor, pero ejecutando el comando build-key client , donde client será un nombre distinto para cada uno de los clientes que queramos conectar.

4 Por último generamos los parámetros Diffie Hellman: ejecutando el comando build-df

Una vez creados los ficheros con los certificados y las claves los copiamos en su lugar correspondiente. Todos estos ficheros se generan y se guardan en la carpeta keys dentro de easy-rsa. En principio los del servidor se copiarán en la carpeta config y son ca.crt, dh{1}.pem, server.crt y server.key.


3 Preparar la conexión Bridging en el servidor. Cuando realizamos la instalación de openVPN se nos ha añadido un nuevo adaptador a los adaptadores de red de nuestro Windows. En este caso un adaptador llamado TAP-Win32. Lo renombraremos a MyTAP.




La idea aquí será trabajar con los dos adptadores, el físico correspondiente a nuestra tarjeta de red y el TAP añadido creando un bridge entre los dos. Para ello seleccionando ámbos adaptadores a la vez y pulsando con el botón derecho podremos seleccionar la opción Bridge Conections. Aparecerá un nuevo adaptador del tipo bridge. A este adaptador le daremos una configuración IP, que será la IP de nuestro Servidor VPN. En mi caso 192.168.1.3.
En este punto hay que decir que hay que tener cuidado con coger redes de este tipo, es decir 192.168.1.x, ya que si la red desde la que conectamos posee un rango de este tipo crearemos problemas en la VPN, ya que cuando hablemos de una ip dada de ese rango, no sabrá decir en que subred está, en la local o en la remota.


4 Crear los ficheros de configuración que se usaran en las conexiones de servidor y clientes. Para ello iremos a la carpeta simple-config y allí encontraremos ejemplos para el servidor y para el cliente. Los copiamos también a la carpeta config y los editamos para configurarlos.
Abrimos el fichero server.ovpn y lo configuramos. Los puntos a tocar serán:
Comentamos dev tun (añadir un ; para que quede así ;dev tun)
Descomentamos

dev tap

dev-node MyTAP

Comentamos la línea que empieza por server
Descomentamos server-bridge y la dejamos así:

Server-bridge 192.168.8.4 255.255.255.0 192.168.8.128 192.168.8.254

Lo que indica la IP y mascara del servidor VPN y el rango de IPs a servir a los clientes.
No olvidar desactivar el filtrado del firewall para el bridge y el TAP.
Grabamos y abrimos el fichero client, en este caso tan solo tendremos que indicar la IP del servidor VPN así como el puerto a usar, el resto debe ponerse igual que para el servidor.


5 Copiar los ficheros necesarios en el cliente. En este paso crearemos una conexión vpn para tunnelblick. Para ello abrimos tunnelblick y en la ventana que aparece escogemos la opción  Tengo Archivos de Configuración, y en la siguiente opción Cofiguración(es) VPN
Se abre entonces una carpeta donde copiaremos los certificados, clave y fichero de configuración creados para el cliente previamente: client.crt, client.key, ca.crt y cliente.ovpn
Una vez copiados los ficheros dentro de la carpeta le ponemos un nombre representativo para la conexión y añadimos una extensión del tipo tblk, por ejemplo miVPN.tblk, de esa forma se crea un paquete de configuración al que haremos doble click para instalar en tunnelblick.

Captura de pantalla 2013-09-23 a la(s) 17.45.51

6 Testear y lanzar las conexiones. En este paso podemos testear las conexiones haciendo click con el botón derecho sobre los ficheros del Servidor y del cliente y escogiendo la opción Iniciar OpenVPN con este fichero de config. En el caso del servidor deberemos obtener una pantalla similar a esta:

test

Lo mismo con el fichero del cliente
Una vez todo este ok podemos lanzar las conexiones, primero en el servidor para que quede escuchando, lo cual podemos hacerlo desde el icono de openVPNGUI justo al lado del reloj y en el cliente a través del icono tunnelblick y escogiendo la VPN configurada.

Captura de pantalla 2013-09-23 a la(s) 17.28.21