3ENGINE

Programación y otros cachivaches

Etiqueta: programacion

Página 1/20

Tecnologia

Cómo imprimir una lista de forma más agradable en Python por línea de comandos


A menudo en Python necesitamos imprimir una lista por la línea de comandos. La manera mas habitual y sencilla es imprimir los elementos de la lista separados por comas. Por ejemplo:

Código

fruit_list = ['Albaricoque', 'Cereza', 'Ciruela', 'Higo', 'Kaki', 'Manzana', 'Melocoton', 'Nectarina',
              'Nispero', 'Pera', 'Uva', 'Aguacate', 'Carambola', 'Chirimoya', 'Coco', 'Datil', 'Fresa',
              'Fruta de la pasion', 'Kiwi', 'Litchi', 'Mango', 'Papaya', 'Platano', 'Grosella negra']

print ','.join(fruit_list)

Resultado

Aguacate, Albaricoque, Carambola, Cereza, Chirimoya, Ciruela,.....

Pero yo encuentro que no es muy legible para el usuario. Voy a dejar aquí una pequeña función que imprime por línea de comandos la lista formateada en columnas, ordenando los elementos alfabéticamente. A la función se le pasa por parámetro la lista (obvio) y el número de columnas que deseas. Como parámetro opcional (con un valor por defecto de 2) se puede indicar el espacio entre columnas. Para un ajuste óptimo, la función calcula el espacio que necesita para cada una de las columnas.

Código

def print_sorted_list(data, columns, gap=2):
    if data:
        gap = 2
        ljusts = {}
        for count, item in enumerate(sorted(data), 1):
            column = count % columns
            ljusts[column] = len(item) if (column not in ljusts) else max(ljusts[column], len(item))

        for count, item in enumerate(sorted(data), 1):
            print item.ljust(ljusts[count % columns] + gap),
            if (count % columns == 0) or (count == len(data)):
                print

Demo

fruit_list = ['Albaricoque', 'Cereza', 'Ciruela', 'Higo', 'Kaki', 'Manzana', 'Melocoton', 'Nectarina',
              'Nispero', 'Pera', 'Uva', 'Aguacate', 'Carambola', 'Chirimoya', 'Coco', 'Datil', 'Fresa',
              'Fruta de la pasion', 'Kiwi', 'Litchi', 'Mango', 'Papaya', 'Platano', 'Grosella negra']

print_sorted_list(fruit_list, columns=3)

Resultado

Aguacate             Albaricoque      Carambola
Cereza               Chirimoya        Ciruela
Coco                 Datil            Fresa
Fruta de la pasion   Grosella negra   Higo
Kaki                 Kiwi             Litchi
Mango                Manzana          Melocoton
Nectarina            Nispero          Papaya
Pera                 Platano          Uva

Saludos.




Tecnologia

Acceso a IIS Express desde un equipo remoto


IIS Express es el servidor de desarrollo de ASP.NET que viene incorporado en Visual Studio y que también está disponible de manera gratuita para su descarga.

Esta versión recortada de IIS es perfectamente válida para desarrollos aunque esto no quita que al final para entornos de producción debas hacer el deploy en un IIS real.

Acceso desde un equipo remoto

A veces necesitamos hacer público el acceso al IIS Express para hacer pública nuestra aplicación. Por ejemplo para comprobar que la aplicación funciona en otros navegadores no disponibles en el entorno de producción, para que otras personas del equipo validen los desarrollos o simplemente porque no disponemos de un IIS real, etc..

Pasos

  1. Permitir conexiones de entrada
  2. * En Windows casi todas la conexiones de entrada están bloqueadas. Para comprobar conexiones de entrada permitidas ejecuta:

    > netsh http show urlacl
    

    * Para permitir conexiones ejecuta:

    > netsh http add urlacl url=http://08APC0501:61277/ user=todos
    

    donde url es la IP o nombre de máquina + puerto a publicar y user el nombre de usuario o grupo de usuarios (‘todos’ es ‘everyone’ si el S.O está en inglés)

  3. Añadir un regla al Firewall de Windows
  4. > netsh advfirewall firewall add rule name="IISExpressWeb" dir=in protocol=tcp localport=61277 profile=private remoteip=localsubnet action=allow
    

  5. Modificar applicationhost.config
  6. Es posible que necesites modificar el archivo de configuración de IIS Express.
    Normalmente se encuentra en C:\Users\TuUsuario\Documents\IISExpress\config\applicationhost.config

    <site name="NombreDeTuAplicacion" id="11">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
       <virtualDirectory path="/" physicalPath="C:\Projectes\TuProyecto\NombreProyecto" />
    </application>
    [....]
    <bindings>
    <binding protocol="http" bindingInformation="*:61277:localhost" />
    <binding protocol="http" bindingInformation="*:61277:08APC0501" />
    </bindings>
    </site>
    




Tecnologia

Cómo deshabilitar la tecla enter en una página web


De modo predeterminado el envio de un formulario se puede ejecutar con un botón submit asociado al formulario o pulsando enter.

deshabilitar la tecla enter en una página web

Para desactivar el envio del formulario mediante la tecla enter con javascript + jquery:

$(function () {
    $("form").keypress(function (e) {
        var key;
        if (window.event)
            key = window.event.keyCode; //IE
        else
            key = e.which; //firefox     
        return (key != 13);
    });
});

Este código asigna el evento keypress al formulario. Si queremos el mismo comportamiento para toda la página entonces tenemos que sustituir $(«form») por $(«body») u otro selector jquery que se adapte a tus necesidades.




Tecnologia

Cómo generar archivos Excel en C# con Open XML


Office Open XML es un formato de archivo abierto y estándar cuyas extensiones más comunes son .docx, .xlsx y .pptx. Principalmente contiene datos en XML comprimidos en un .zip. .NET dispone de librerias capaces de trabajar con este formato y de esta manera prescindir de instalar Office y sus temidas Microsoft.Office.Interop.

Generar archivos Excel en C# con Open XML

Para la demo es necesario instalar el paquete DocumentFormat.OpenXml:

generar archivos Excel en C# con Open XML

O desde la consola de Nuget:

Install-Package DocumentFormat.OpenXml 

El código es el siguiente:

 
namespace SaveExcelApp
{
    public static class SaveExcel
    {
        
        public static void BuildExcel(DataTable dataTable, string ExcelPath)        
        {
            using (SpreadsheetDocument myWorkbook = 
                SpreadsheetDocument.Create(ExcelPath, 
                SpreadsheetDocumentType.Workbook))
            {
                // workbook Part
                WorkbookPart workbookPart = myWorkbook.AddWorkbookPart();
                var worksheetPart = workbookPart.AddNewPart();
                string relId = workbookPart.GetIdOfPart(worksheetPart);

                // file Version
                var fileVersion = new FileVersion { ApplicationName = "Microsoft Office Excel" };

                // sheets               
                var sheets = new Sheets();
                var sheet = new Sheet { Name = dataTable.TableName, SheetId = 1, Id = relId };
                sheets.Append(sheet);

                // data
                SheetData sheetData = new SheetData(CreateSheetData(dataTable));

                // add the parts to the workbook and save
                var workbook = new Workbook();
                workbook.Append(fileVersion);
                workbook.Append(sheets);
                var worksheet = new Worksheet();
                worksheet.Append(sheetData);
                worksheetPart.Worksheet = worksheet;
                worksheetPart.Worksheet.Save();
                myWorkbook.WorkbookPart.Workbook = workbook;
                myWorkbook.WorkbookPart.Workbook.Save();
                myWorkbook.Close();
            }
        }

        private static List CreateSheetData(DataTable dataTable)
        {
            List elements = new List();

            // row header
            var rowHeader = new Row();
            Cell[] cellsHeader = new Cell[dataTable.Columns.Count];
            for (int i = 0; i < dataTable.Columns.Count; i++)
            {
                cellsHeader[i] = new Cell();
                cellsHeader[i].DataType = CellValues.String;
                cellsHeader[i].CellValue = new CellValue(dataTable.Columns[i].ColumnName);
            }
            rowHeader.Append(cellsHeader);
            elements.Add(rowHeader); 
            
           // rows data
           foreach (DataRow rowDataTable in dataTable.Rows)
           {     
                var row = new Row();
                Cell[] cells = new Cell[dataTable.Columns.Count];

                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    cells[i] = new Cell();
                    cells[i].DataType = CellValues.String;
                    cells[i].CellValue = new CellValue((string)rowDataTable[i]);
                }
                row.Append(cells); 
                elements.Add(row);            
            }                      
            return elements;
        }
    }
}

Para mi demo los datos que deseo guardar en el archivo Excel los tengo en un DataTable. Al método BuildExcel se le pasa el DataTable con los datos y la ruta completa del archivo Excel a generar. El método CreateSheetData se encarga de leer los datos del DataTable y generar las celdas. El nombre de la hoja Excel se obtiene del nombre de la tabla.

Se trata de un código sencillo pero que puede servir como punto de partida.

Y ahora una pequeña demo:

var demoTable = new DataTable("mi demo");
demoTable.Columns.Add("name");
demoTable.Columns.Add("surname");
demoTable.Columns.Add("favorite color");
demoTable.Rows.Add(new Object[] { "David", "Miro", "blue" });
demoTable.Rows.Add(new Object[] { "Pablo", "Iglesias", "yellow" });
demoTable.Rows.Add(new Object[] { "Ratoncito", "Perez", "green" });
SaveExcel.BuildExcel(demoTable, "demo.xlsx");

Y el archivo generado:

generar archivos Excel en C# con Open XML

Enlace a la demo: SaveExcel.zip