Mostrando entradas con la etiqueta informatica. Mostrar todas las entradas
Mostrando entradas con la etiqueta informatica. Mostrar todas las entradas

viernes, 20 de septiembre de 2013

Programa de Facturacion V.6

Bueno ya lo termine espero que les guste, lo subo aquí al principio.
Es un archivo .Rar, lo descomprimes y hay un ejecutable denominado Facturacion_6v.exe.
Instalara todo lo nesesario para su funcionamiento.

Como mejora, está el guardar la factura en formato .xlsm y poderse modificar.
He mejorado el inventario, se puede llevar un control de Stock.
Control de Entradas, Salidas.
Se puede llevar la contabilidad, buscar por periodos la contabilidad.

Cualquier duda o futura mejora, aquí estoy.

En breve hare un pequeño tutorial.
Las primeras versiones eran muy simples, creo que no hacia falta muchas explicaciones.Me comento una Amiga que lo usa en el trabajo, que cuando habian muchos clientes al agregar mas clientes iba muy lento, SOLUCIONADO.

Descarga el Archivo Aqui:

domingo, 9 de junio de 2013

Algunos Scripts para monitorear SQL Server

Para monitorear el estado de los jobs que fallaron en su última ejecución:
SELECT name FROM msdb.dbo.sysjobs A, msdb.dbo.sysjobservers B 
WHERE A.job_id = B.job_id AND B.last_run_outcome = 0
Espacio en cada disco para la instancia SQL:
EXEC master..xp_fixeddrives
el resultado lo probe en mi maquina y salio lo siguiente
Para ver un listado de Jobs Deshabilitados:
SELECT name FROM msdb.dbo.sysjobs 
WHERE enabled = 0 ORDER BY name
Para ver un listado de los jobs que están actualmente en ejecución:
msdb.dbo.sp_get_composite_job_info
NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL
Para ver logines que son miembros de los roles de servidor (este script funciona en SQL 2000 pero no en SQL 2005 o superiores porque la tabla master.dbo.sysxlogins no existe):
SELECT 'ServerRole' = A.name, 'MemberName' =  B.name 
FROM master.dbo.spt_values A, master.dbo.sysxlogins B 
WHERE A.low = 0 AND A.type = 'SRV' AND B.srvid IS NULL
Para ver la última vez que las bases de datos fueron backupeadas:
SELECT  B.name as Database_Name, ISNULL(STR(ABS(DATEDIFF(day, GetDate(),
 MAX(Backup_finish_date)))), 'NEVER') as DaysSinceLastBackup,
 ISNULL(Convert(char(10), MAX(backup_finish_date), 101), 'NEVER') as LastBackupDate
 FROM master.dbo.sysdatabases B LEFT OUTER JOIN msdb.dbo.backupset A
 ON A.database_name = B.name AND A.type = 'D' GROUP BY B.Name ORDER BY B.name
Para leer las ultimas entradas del archivo de log (NO el transaction log):
CREATE TABLE #Errors (vchMessage varchar(255), ID int)
CREATE INDEX idx_msg ON #Errors(ID, vchMessage)
INSERT #Errors EXEC xp_readerrorlog
SELECT vchMessage
FROM #Errors
WHERE vchMessage
NOT LIKE '%Log backed up%' AND vchMessage
NOT LIKE '%.TRN%' AND vchMessage
NOT LIKE '%Database backed up%' AND vchMessage
NOT LIKE '%.BAK%' AND vchMessage
NOT LIKE '%Run the RECONFIGURE%' AND
vchMessage NOT LIKE '%Copyright (c)%'
ORDER BY ID

DROP TABLE #Errors

[SQL-2008] Buscar texto en definiciones de Objetos MS SQL Server.

Saludos amigos en esta ocasión les dejo un ejemplo de como poder buscar “Cadenas de Texto” en la definición de nuestros Procedimientos almacenados.
En este ejemplo vamos a buscar la palabra ‘HumanResources’ en los procedimientos almacenados de la base de datos ‘AdventureWorks2008’.
Necesitamos ejecutar el siguiente script con la cadena de texto que se va a buscar.
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%HumanResources%'
GO
Si se encontraron resultados, a continuación se mostrara un listado con los nombres de los procedimientos almacenados que contienen nuestra palabra.
Bien amigos, para comprobar el resultado elegiremos uno de los procedimientos para ver su definición e identificar que contiene la palabra que buscamos ‘HumanResources’.
USE AdventureWorks2008;
EXEC sp_HelpText 'uspGetManagerEmployees'
Como pueden ver el resultado es sobre un Procedimiento almacenado de los de la lista que contienen la palabra a buscar, las palabras encerradas en color morado son las que coinciden con nuestra búsqueda, de esta manera podemos buscar lo que deseemos dentro de nuestros Stored Procedures y ver su definición rápidamente.
Bueno amigos, espero les sea de ayuda, espero sus comentarios y por favor voten por este blog.

Ver las relaciones de todas las tablas de la base de datos


Si se requiere reportar las relaciones que tienen en su base de datos, este pequeño codigo sirve mucho.
select name as relacion, object_name(parent_object_id) as tabla
from sys.objects where type in (N'F')
pero con eso solo podemos ver la relacion y en que tabla esta, ahora podemos cambiar a esto:
select name as relacion_fk, object_name(parent_object_id) as tabla ,
object_name(referenced_object_id) as tabla_referencia from sys.foreign_keys
que nos muestra la tabla a la que pertenece la relacion y la tabla a la que hace referencia la clave foranea.
Ahora si agregamos una tablita mas podemos ver las columas relacionadas:
select f.name as relacion_fk, object_name(f.parent_object_id) as tabla ,
        col_name( c.parent_object_id, c.parent_column_id) as columna,
        object_name(f.referenced_object_id) as tabla_referencia,
        col_name( c.referenced_object_id, c.referenced_column_id) as columna_referencia
from sys.foreign_keys f inner join sys.foreign_key_columns as c
       on f.object_id = c.constraint_object_id

Contar el número de filas de todas las tablas en SQL Server

Aqui hay otro script SQL que encontre por los foros que quisiera compartirles aqui: Como contar registros en todas las tablas. Al utilizarlo se vera de la siguiente forma (tome la bd AdventureWorks para esta captura)
A quien no le ha sucedido en mas de una vez que queremos saber cuales son las tablas con mas registros en relacion al numero de filas?
Se podria pensar en hacer la siguiente consulta: SELECT COUNT(*) from each user table, pero es muy ineficiente. Un mondo mejor para consultar las tablas es con el script de abajo:
SELECT
    sysobjects.Name
    , sysindexes.Rows
FROM
    sysobjects
    INNER JOIN sysindexes
    ON sysobjects.id = sysindexes.id
WHERE
    type = 'U'
    AND sysindexes.IndId < 2
ORDER BY
    sysobjects.Name

viernes, 7 de junio de 2013

Obtener número de registros de varias tablas en SQL

Mira por donde, hoy estoy encontrando solución a varias cosillas que había querido hacer antes y por tiempo no me habían salido. En este caso, lo que pretendía era obtener el número de registros de todas las tablas de una base de datos, para saber cuales son las más pesadas. La manera rápida y potente que he encontrado es usar la tabla sysindexes. En mi caso la he usado de esta forma:
select object_name(id) nombreTabla, convert(varchar(50), cast(rowcnt as money),1) nRegistros from sysindexes
Si se quiere la de una tabla en concreto, se puede poner un where indicando el nombre de tabla:
select object_name(id) nombreTabla, convert(varchar(50), cast(rowcnt as money),1) nRegistros from sysindexes where id=object_id('Nombre de tabla')

Agregar un Trigger para auditar tu base de datos SQL Server

Aqui les dejo un ejemplo de como hacer un trigger que sirve para auditar tus bases de datos de SQL Server.
Navegando me encontre con una excelente solucion hecha por Jon Galloway, en la cual consiste en crear un solo script y que este se encarge de crear los triggers necesarios para cada tabla de la base de datos seleccionada, la diferencia con SQLTableHistory es que con nuestra herramienta podemos seleccionar las tablas que queremos que se le haga su respectiva auditoria y con la solucion presentada en este blog.
Aqui un ejemplo de como se verian los datos con la solucion de Jon Galloway

Con esta informacion podemos hacer reportes de una manera sencilla tales como:
  • Cuales tablas han sufridos cambios recientemente.
  • Cuales tablas no sufrieron cambios el pasado año.
  • Cuales tablas jamaz han sufrido cambios.
  • Mostrar todos los cambios a las tablas por un usuario y periodo especifico.
  • Mostrar las tablas mas activas en un determinado periodo.Con estas herramientas es posible volver al estado anterior de la tabla y volver en un punto especifico, claro esta ya depende de las nuevas extensiones que ustedes le hagan.Aqui os dejo el script completo que crea la tabla de auditoria y corre el script para crear los triggers a todas las tablas de la base de datos.
USE Northwind
GO
 
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME= 'Audit')
CREATE TABLE Audit
(
AuditID [int]IDENTITY(1,1) NOT NULL,
Type char(1),
TableName varchar(128),
PrimaryKeyField varchar(1000),
PrimaryKeyValue varchar(1000),
FieldName varchar(128),
OldValue varchar(1000),
NewValue varchar(1000),
UpdateDate datetime DEFAULT (GetDate()),
UserName varchar(128)
)
GO
 
DECLARE @sql varchar(8000), @TABLE_NAME sysname
SET NOCOUNT ON
 
SELECT @TABLE_NAME= MIN(TABLE_NAME)
FROM INFORMATION_SCHEMA.Tables
WHERE
TABLE_TYPE= 'BASE TABLE'
AND TABLE_NAME!= 'sysdiagrams'
AND TABLE_NAME!= 'Audit'
 
WHILE @TABLE_NAME IS NOT NULL
 BEGIN
EXEC('IF OBJECT_ID (''' + @TABLE_NAME+ '_ChangeTracking'', ''TR'') IS NOT NULL DROP TRIGGER ' + @TABLE_NAME+ '_ChangeTracking')
SELECT @sql =
'
create trigger ' + @TABLE_NAME+ '_ChangeTracking on ' + @TABLE_NAME+ ' for insert, update, delete
as
 
declare @bit int ,
@field int ,
@maxfield int ,
@char int ,
@fieldname varchar(128) ,
@TableName varchar(128) ,
@PKCols varchar(1000) ,
@sql varchar(2000),
@UpdateDate varchar(21) ,
@UserName varchar(128) ,
@Type char(1) ,
@PKFieldSelect varchar(1000),
@PKValueSelect varchar(1000)
 
select @TableName = ''' + @TABLE_NAME+ '''
 
-- date and user
select @UserName = system_user ,
@UpdateDate = convert(varchar(8), getdate(), 112) + '' '' + convert(varchar(12), getdate(), 114)
 
-- Action
if exists (select * from inserted)
if exists (select * from deleted)
select @Type = ''U''
else
select @Type = ''I''
else
select @Type = ''D''
 
-- get list of columns
select * into #ins from inserted
select * into #del from deleted
 
-- Get primary key columns for full outer join
select @PKCols = coalesce(@PKCols + '' and'', '' on'') + '' i.'' + c.COLUMN_NAME + '' = d.'' + c.COLUMN_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
where pk.TABLE_NAME = @TableName
and CONSTRAINT_TYPE = ''PRIMARY KEY''
and c.TABLE_NAME = pk.TABLE_NAME
and c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
 
-- Get primary key fields select for insert
select @PKFieldSelect = coalesce(@PKFieldSelect+''+'','''') + '''''''' + COLUMN_NAME + ''''''''
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
where pk.TABLE_NAME = @TableName
and CONSTRAINT_TYPE = ''PRIMARY KEY''
and c.TABLE_NAME = pk.TABLE_NAME
and c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
 
select @PKValueSelect = coalesce(@PKValueSelect+''+'','''') + ''convert(varchar(100), coalesce(i.'' + COLUMN_NAME + '',d.'' + COLUMN_NAME + ''))''
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,   
INFORMATION_SCHEMA.KEY_COLUMN_USAGE c  
where  pk.TABLE_NAME = @TableName  
and CONSTRAINT_TYPE = ''PRIMARY KEY''  
and c.TABLE_NAME = pk.TABLE_NAME  
and c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
 
if @PKCols is null
begin
raiserror(''no PK on table %s'', 16, -1, @TableName)
return
end
 
select @field = 0, @maxfield = max(ORDINAL_POSITION) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName
while @field < @maxfield
begin
select @field = min(ORDINAL_POSITION) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName and ORDINAL_POSITION > @field
select @bit = (@field - 1 )% 8 + 1
select @bit = power(2,@bit - 1)
select @char = ((@field - 1) / 8) + 1
if substring(COLUMNS_UPDATED(),@char, 1) & @bit > 0 or @Type in (''I'',''D'')
begin
select @fieldname = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName and ORDINAL_POSITION = @field
select @sql = ''insert Audit (Type, TableName, PrimaryKeyField, PrimaryKeyValue, FieldName, OldValue, NewValue, UpdateDate, UserName)''
select @sql = @sql + '' select '''''' + @Type + ''''''''
select @sql = @sql + '','''''' + @TableName + ''''''''
select @sql = @sql + '','' + @PKFieldSelect
select @sql = @sql + '','' + @PKValueSelect
select @sql = @sql + '','''''' + @fieldname + ''''''''
select @sql = @sql + '',convert(varchar(1000),d.'' + @fieldname + '')''
select @sql = @sql + '',convert(varchar(1000),i.'' + @fieldname + '')''
select @sql = @sql + '','''''' + @UpdateDate + ''''''''
select @sql = @sql + '','''''' + @UserName + ''''''''
select @sql = @sql + '' from #ins i full outer join #del d''
select @sql = @sql + @PKCols
select @sql = @sql + '' where i.'' + @fieldname + '' <> d.'' + @fieldname
select @sql = @sql + '' or (i.'' + @fieldname + '' is null and  d.'' + @fieldname + '' is not null)''
select @sql = @sql + '' or (i.'' + @fieldname + '' is not null and  d.'' + @fieldname + '' is null)''
exec (@sql)
end
end
'
SELECT @sql
EXEC(@sql)
SELECT @TABLE_NAME= MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.Tables
WHERE TABLE_NAME> @TABLE_NAME
AND TABLE_TYPE= 'BASE TABLE'
AND TABLE_NAME!= 'sysdiagrams'
AND TABLE_NAME!= 'Audit'
END

viernes, 5 de abril de 2013

¿Qué es el número IP? ¿Qué significa IP? ¿Qué es una dirección IP?

Vamos a intentar aclarar un poco el concepto de IP: básicamente es un número que identifica un dispositivo en una red (o en la red de redes, esto es, en internet). Para comprender mejor el concepto hagamos una similitud con el número de telefono: Todas las conexiones telefónicas, ya sean fijas o móviles, tienen un número de télefono asignado y único que las identifica y que permite la comunicación. Basta marcar el número de la persona con la cual quiero charlar para comenzar la comunicación. A grandes rasgos la comunicación entre dispositivos dentro de una red es muy similar: cada uno tiene su número que lo identifica y que permite la comunicación con el mismo.
IP significa “Internet Protocol” y es un número que identifica un dispositivo en una red (un ordenador, una impresora, un router, etc…). Estos dispositivos al formar parte de una red serán identificados mediante un número IP único en esa red. La dirección IP está formada por 4 números de hasta 3 cifras separados por “.” (punto). Los valores que pueden tomar estos números varian entre 0 y 255, por ejemplo, una dirección IP puede ser 192.168.66.254 (cuatro números entre 0 y 255 separados por puntos).
IP Pública: Se denomina IP pública a aquella dirección IP que es visible desde Internet. Suele ser la que tiene tu router o modem. Es la que da “la cara” a Internet. Esta IP suele ser proporcionada por tu ISP (empresa que te da acceso a internet: Telefonica, Ya.com, Tele2, etc). Si quieres ver tu IP pública entra aquí (www.vermiip.es)
IP Privada: La dirección IP privada es aquella que pertenece a una red privada. Suele ser la IP de la tarjeta de red de tu ordenador, de una impresora de red, del router de tu red, etc… Para ver tu IP privada entra aquí. Hay unos rangos de IP reservados para este tipo de red:
  1. De 10.0.0.0 a 10.255.255.255
  2. De 172.16.0.0 a 172.31.255.255
  3. De 192.168.0.0 a 192.168.255.255
Al configurar tu red interna puedes elegir de entre estos 3 rangos la IP que desees, siempre y cuando no asignes la misma IP a 2 equipos de la red (conflicto de IP) y que todos los equipos de la red tengan en común las 3 primeros números (ej.: 192.168.0.XXX)
Una configuración típica es:
IP del router: 192.168.1.1
IP del ordenador fijo: 192.168.1.30
IP del ordenador portatil: 192.168.1.31
IP de la impresora en red: 192.168.1.100
Ésta sería la configuración de la red interna formada por 4 elementos: 1 router de acceso a internet, 2 equipos y 1 impresora.

Todos los equipos de la red interna que salgan a Internet a traves del router tendrán la IP Pública de éste. En el ejemplo, el portatil con IP Interna 192.168.1.31 si entra en www.vermiip.es verá que su IP Pública en 212.179.234.234, o sea, la del router. Esto es debido a que es el router el encargado de comunicarnos con Internet y de “dar la cara” hacia la parte pública.

jueves, 14 de marzo de 2013

Cambiarle el nombre a un archivo en Visual Basic.NET 2008


para este ejemplo agregamos 2 botones y en el boton examinar ponemos este codigo:
' presentar al usuario un cuadro de diálogo
        Dim openFile As New OpenFileDialog
        ' si elegimos algún archivo
        Dim result As DialogResult = openFile.ShowDialog()
        If result = DialogResult.OK Then
            TextBox1.Text = openFile.FileName
        End If
al pulsar el boton nos saldra este objeto:

Escribimos eln ombre del archivo en el textbox2 y al pulsar el boton Cambiar Nombre lo habra cambiado, para esto escribimos este codigo en el evento click del boton Cambiar Nombre
My.Computer.FileSystem.RenameFile(TextBox1.Text, TextBox2.Text)

Eliminar un directorio completo en Visual Basic .NET 2008

Este articulo nos permitira buscar un archivo y luego eliminarlo. para este articulo crearemos un proyecto y con los objetos que aparecen en la imagen. y usaremos la libreria System.IO.

Imports System.IO

Dentro del boton examinar definiremos un FolderBrowserDialog que nos permitira identificar la carpeta donde se encuentran los archivos en los cuales haremos la busqueda. agregaremos al Textbox (Textbox1) la ruta del directorio.


Dim Dir As New FolderBrowserDialog
        If Dir.ShowDialog = Windows.Forms.DialogResult.OK Then
            TextBox1.Text = Dir.SelectedPath
        End If
Ahora que tenemos la ruta del archivo en nuestro textbox este sera el codigo en el boton eliminar:
Try
            Dim midirectorio As String = TextBox1.Text

            My.Computer.FileSystem.DeleteDirectory(midirectorio, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin, FileIO.UICancelOption.DoNothing)

        Catch ex As Exception
            MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
        End Try
al pulsar el boton eliminar nos saldra este mensaje

pulsamos el boton Si y listo se eliminara la carpeta con todo su contenido dentro. Espero este ejemplo les haya servido.

martes, 12 de marzo de 2013

lunes, 11 de marzo de 2013

Truco C# en .NET 2008:Como generar passwords aleatorios


creamos una clase RandomPassword.cs y agregamos este codigo:

using System.Security.Cryptography;

namespace WindowsFormsApplication1
{
    public class RandomPassword
    {
        // Define default min and max password lengths.
        private static int DEFAULT_MIN_PASSWORD_LENGTH = 8;
        private static int DEFAULT_MAX_PASSWORD_LENGTH = 10;

        // Define supported password characters divided into groups.
        // You can add (or remove) characters to (from) these groups.
        private static string PASSWORD_CHARS_LCASE = "abcdefgijkmnopqrstwxyz";
        private static string PASSWORD_CHARS_UCASE = "ABCDEFGHJKLMNPQRSTWXYZ";
        private static string PASSWORD_CHARS_NUMERIC = "23456789";
        private static string PASSWORD_CHARS_SPECIAL = "*$-+?_&=!%{}/";


        public static string Generate()
        {
            return Generate(DEFAULT_MIN_PASSWORD_LENGTH,
                            DEFAULT_MAX_PASSWORD_LENGTH);
        }


        public static string Generate(int length)
        {
            return Generate(length, length);
        }


        public static string Generate(int minLength,
                                      int maxLength)
        {
            // Make sure that input parameters are valid.
            if (minLength <= 0 || maxLength <= 0 || minLength > maxLength)
                return null;


            char[][] charGroups = new char[][] 
        {
            PASSWORD_CHARS_LCASE.ToCharArray(),
            PASSWORD_CHARS_UCASE.ToCharArray(),
            PASSWORD_CHARS_NUMERIC.ToCharArray(),
            PASSWORD_CHARS_SPECIAL.ToCharArray()
        };

            // Use this array to track the number of unused characters in each
            // character group.
            int[] charsLeftInGroup = new int[charGroups.Length];

            // Initially, all characters in each group are not used.
            for (int i = 0; i < charsLeftInGroup.Length; i++)
                charsLeftInGroup[i] = charGroups[i].Length;

            // Use this array to track (iterate through) unused character groups.
            int[] leftGroupsOrder = new int[charGroups.Length];

            // Initially, all character groups are not used.
            for (int i = 0; i < leftGroupsOrder.Length; i++)
                leftGroupsOrder[i] = i;




            byte[] randomBytes = new byte[4];

            // Generate 4 random bytes.
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            rng.GetBytes(randomBytes);

            // Convert 4 bytes into a 32-bit integer value.
            int seed = (randomBytes[0] & 0x7f) << 24 |
                        randomBytes[1] << 16 |
                        randomBytes[2] << 8 |
                        randomBytes[3];

            // Now, this is real randomization.
            Random random = new Random(seed);

            // This array will hold password characters.
            char[] password = null;

            // Allocate appropriate memory for the password.
            if (minLength < maxLength)
                password = new char[random.Next(minLength, maxLength + 1)];
            else
                password = new char[minLength];

            // Index of the next character to be added to password.
            int nextCharIdx;

            // Index of the next character group to be processed.
            int nextGroupIdx;

            // Index which will be used to track not processed character groups.
            int nextLeftGroupsOrderIdx;

            // Index of the last non-processed character in a group.
            int lastCharIdx;

            // Index of the last non-processed group.
            int lastLeftGroupsOrderIdx = leftGroupsOrder.Length - 1;

            // Generate password characters one at a time.
            for (int i = 0; i < password.Length; i++)
            {

                if (lastLeftGroupsOrderIdx == 0)
                    nextLeftGroupsOrderIdx = 0;
                else
                    nextLeftGroupsOrderIdx = random.Next(0,
                                                         lastLeftGroupsOrderIdx);

                // Get the actual index of the character group, from which we will
                // pick the next character.
                nextGroupIdx = leftGroupsOrder[nextLeftGroupsOrderIdx];

                // Get the index of the last unprocessed characters in this group.
                lastCharIdx = charsLeftInGroup[nextGroupIdx] - 1;

                // If only one unprocessed character is left, pick it; otherwise,
                // get a random character from the unused character list.
                if (lastCharIdx == 0)
                    nextCharIdx = 0;
                else
                    nextCharIdx = random.Next(0, lastCharIdx + 1);

                // Add this character to the password.
                password[i] = charGroups[nextGroupIdx][nextCharIdx];

                // If we processed the last character in this group, start over.
                if (lastCharIdx == 0)
                    charsLeftInGroup[nextGroupIdx] =
                                              charGroups[nextGroupIdx].Length;
                // There are more unprocessed characters left.
                else
                {
                    // Swap processed character with the last unprocessed character
                    // so that we don't pick it until we process all characters in
                    // this group.
                    if (lastCharIdx != nextCharIdx)
                    {
                        char temp = charGroups[nextGroupIdx][lastCharIdx];
                        charGroups[nextGroupIdx][lastCharIdx] =
                                    charGroups[nextGroupIdx][nextCharIdx];
                        charGroups[nextGroupIdx][nextCharIdx] = temp;
                    }
                    // Decrement the number of unprocessed characters in
                    // this group.
                    charsLeftInGroup[nextGroupIdx]--;
                }

                // If we processed the last group, start all over.
                if (lastLeftGroupsOrderIdx == 0)
                    lastLeftGroupsOrderIdx = leftGroupsOrder.Length - 1;
                // There are more unprocessed groups left.
                else
                {
                    // Swap processed group with the last unprocessed group
                    // so that we don't pick it until we process all groups.
                    if (lastLeftGroupsOrderIdx != nextLeftGroupsOrderIdx)
                    {
                        int temp = leftGroupsOrder[lastLeftGroupsOrderIdx];
                        leftGroupsOrder[lastLeftGroupsOrderIdx] =
                                    leftGroupsOrder[nextLeftGroupsOrderIdx];
                        leftGroupsOrder[nextLeftGroupsOrderIdx] = temp;
                    }
                    // Decrement the number of unprocessed groups.
                    lastLeftGroupsOrderIdx--;
                }
            }

            // Convert password characters into a string and return the result.
            return new string(password);
        }
    }
}
ahora en el boton ponemos este codigo:
textBox1.Text = RandomPassword.Generate(8,10);
y listo =) espero les haya servido el ejemplo

Truco Visual Basic .NET 2008:Paginando el gridview con Lista de paises en XML

Hola, quiero mostrar como podemos hacer una paginación elegante y un poco más funcional de nuestros afamado gridview.
Muchas veces, necesitamos y queremos q nuestra interfaz de usuario sea más amigable y bonita, puesto que lo que el usuario ve es la interfaz (muchas veces no le importa lo que está por detrás)…
En ejemplo vamos a cargar un gridview desde un archivo xml el cual contiene la lista de todos los paises del mundo (si falta alguno disculpen); dicha lista contine 241 paises, lo cual haría que nuestro gridview se extendiera demasiado hacia abajo, para evitar que esto suceda vamos a usar la paginación.
La idea es disponer de un dropdownlist el cual va a contener todas las páginas del gridview, así podremos cambiar de página facilmente. Además, se visualizará cuatros imagenes las cuales tendrán la función de ir al primer, anterior, siguiente y último registro.
Es decir, al final nuestro gridview debe lucir parecido a:

Para lograr esta funcionalidad, ahi varias cosas que se deben definir.
1.Establecer la propiedad AllowPaging=”true” del gridview
2.Establecer el número de filas o registros que deseamos ver por página en el grid (ej: PageSize=”10″)
3.Personalizar el pagertemplate.
4.En el dropdownlist del pagertemplate, se ha definido el evento OnSelectedIndexChanged=”GoPage”, en este evento vamos a cambiar el la página q estamos visualizando, asi en nuestro codebehind, vamos a definir un procedimiento protected (protected para que pueda ser accedido desde el html).

Además de los pasos anteriores es necesario
1.Definir el procedimiento para cargar el gridview
2.Añadir la lógica necesaria en el evento PageIndexChanging para que nuestros botones de navegación funcionen, en este caso, con la variable e podemos acceder al numero de la página a traves de la propiedad NewPageIndex.
3.En el evento RowDataBound del gridview, se debe cargar el dropdownlist; y el label para mostrar el número total de páginas.

Los eventos que van a programar son el RowDataBound
Protected Sub GridViewDatos_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridViewDatos.RowDataBound
        If e.Row.RowType = DataControlRowType.Pager AndAlso Not GridViewDatos.DataSource Is Nothing Then
            'TRAE EL TOTAL DE PAGINAS
            Dim _TotalPags As Label = e.Row.FindControl("lblTotalNumberOfPages")
            _TotalPags.Text = GridViewDatos.PageCount.ToString

            'LLENA LA LISTA CON EL NUMERO DE PAGINAS
            Dim list As DropDownList = e.Row.FindControl("paginasDropDownList")
            For i As Integer = 1 To CInt(GridViewDatos.PageCount)
                list.Items.Add(i.ToString)
            Next
            list.SelectedValue = GridViewDatos.PageIndex + 1
        End If
    End Sub
en el evento PageIndexChanging del DataGridView ponemos este codigo
Protected Sub GridViewDatos_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridViewDatos.PageIndexChanging
        GridViewDatos.PageIndex = e.NewPageIndex
        Call CargaGridView()
    End Sub
y la funcion CargaGridView tendra este codigo
Private Sub CargaGridView()
        Try
            Dim oDataSet As New DataSet
            oDataSet.ReadXml(Server.MapPath("~/App_Data/Paises.xml"))

            GridViewDatos.DataSource = oDataSet
            GridViewDatos.DataBind()
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
    End Sub
para los que deseen el codigo completo aqui tienen el link

Descarga del ejemplo !

jueves, 7 de marzo de 2013

Los blogs en el imaginario de la educación de la sociedad 2.0

La Web 2.0 representa una contribución definitiva en la remediación de la educación. Los blogs han conformado un nuevo ambiente de aprendizaje que vuelve anacrónicas a plataformas digitales como Blackboard o Learning Space. La educación móvil representa el ambiente educativo lógico de la Web 3.0 El imaginario posible de la sociedad de la ubicuidad –fase superior de la economía del conocimiento-, supone profundas transformaciones en la ecología cultural de instituciones y, por supuesto, en la ecología
cultural de las sociedades.
Introducción
La ecología de medios (Media Ecology), conocida también como “Escuela de Toronto”, “Escuela de Nueva York” ó “Escuela de San Luis”, fundamentalmente parte del pensamiento de Marshall McLuhan, y se ha enriquecido en su breve pero fecunda historia con las relevantes contribuciones teóricas de pensadores como Neil Postman, Joshua Meyrowitz, Paul Levinson, Harold Innis, Walter Ong, Lewis Mumford, Jacques Ellul, Elizabeth L. Eisenstein, Eric Havelock, Edmund Carpenter, Jack Goody, Robert K. Logan, James W. Carey, Jay David Bolter y Lance Strate, entre otros.
Una de mejores definiciones que se han propuesto procede de Neil Postman:
“La ecología de los medios analiza como los medios de comunicación afectan la opinión
humana, la comprensión, la sensación, y el valor; y cómo nuestra interacción con los
medios facilita o impide nuestras posibilidades de supervivencia. La palabra ecología
implica el estudio de ambientes: su estructura, contenido e impacto en la gente”.
Entre las distintas escuelas o corrientes de las ciencias de la comunicación que se han interesado por analizar de forma integral el complejo proceso de la comunicación, la ecología de medios particularmente se distingue por conceder particular énfasis al estudio de las tecnologías y los ambientes comunicativos, pues como afirmó Marshall McLuhan en Comprender los medios de comunicación. Las extensiones del ser humano –cuya primera edición fue publicada en 1964-, en última instancia los medios de comunicación admiten ser comprendidos como tecnologías. De acuerdo con Marshall McLuhan, toda tecnología puede ser considerada como lógica extensión de los órganos, sentidos, facultades o funciones del ser humano:
“Cualquier invento o tecnología es una extensión o autoamputación del cuerpo físico, y, como tal extensión, requiere además nuevas relaciones o equilibrios entre los demás órganos y extensiones del cuerpo”
(McLuhan. 1996:64).
Algunos detractores de McLuhan -entre los cuales destaca el belga Armand Mattelart, afirman que las tesis de McLuhan representan un cómodo y acrítico tecno-optimismo, subordinado a objetables propósitos de legitimación ideológica del imperialismo cultural (Mattelart. 2000: 365-370). Tales cuestionamientos evidentemente representan una objetable simplificación del pensamiento de McLuhan. A diferencia de lo que supone Mattelart, en cada metáfora de McLuhan es posible advertir razonadas críticas al desarrollo de las tecnologías de información. Marshall McLuhan y, principalmente Neil Postman, emprendieron enérgicos
cuestionamientos a los medios de comunicación por alterar de forma dramática como profunda la cultura y las tradiciones. Postman –quien falleció el 5 de octubre de 2003-, hoy es considerado como uno de los principales críticos de los medios de comunicación. En el libro Amusing ourselves to death: Public discourse in the age of show business (1986), por ejemplo, Postman expresó algunas de las más enérgicas y razonadas críticas que ha recibido la televisión en su historia.
De acuerdo con el célebre marxista francés Louis Althusser, en las sociedades capitalistas las escuelas y las tecnologías de información cumplen las funciones de aparatos ideológicos del Estado –los cuales fundamentalmente operan a través de la persuasión con menores dosis de violencia, situación que permite distinguirles de los aparatos represivos-. Los aparatos ideológicos del Estado contribuyen a garantizar la reproducción ampliada de la ideología dominante como la reproducción de la calificación diversificada de la fuerza de trabajo. La instrucción escolar en las sociedades capitalistas avanzadas, según Althusser, reproduce la desigualdad social, perpetuando el sistema de explotación clasista. El aparato ideológico escolar (AIE) –el cual comprende el conjunto de distintas escuelas-, admite ser considerado como uno de los aparatos ideológicos hegemónicos de las sociedades capitalistas. De acuerdo con el destacado investigador mexicano Javier Esteinou Madrid, en las formaciones capitalistas contemporáneas, el aparato ideológico informativo se ha convertido en el aparato ideológico hegemónico. De acuerdo con Javier Esteinou, el aparato ideológico informativo es el que mejor cumple en las formaciones capitalistas avanzadas el rol de contribuir a la reproducción ampliada de la ideología dominante como a la reproducción ampliada de la calificación diversificada de la fuerza de trabajo. Para la tradición marxista, la ideología observa un rol fundamental en la fenomenología del cambio tecnológico.
De acuerdo con Marshall McLuhan, los medios de comunicación, como las tecnologías, en general, inciden en la incesante transformación de la ecología cultural de las sociedades, derivándose inevitables cambios culturales que inclusive alteran nuestra percepción del tiempo. Los efectos de la tecnología, sostenía McLuhan (1996: 39) “no se producen al nivel de las opiniones o de los conceptos, sino que modifican los índices sensoriales, o pautas de percepción, regularmente y sin encontrar resistencia”. Los medios – sostenía McLuhan- configuran nuestra conciencia y experiencias. La fenomenología del cambio tecnológico se encuentra íntimamente asociada con los procesos de aprendizaje y, por supuesto, de transmisión del
legado cultural de todas las sociedades. Las “remediaciones” que experimentan los medios inevitablemente producen cambios significativos en los “ambientes educativos”.
En el desarrollo de todo medio de comunicación es posible percibir una progresiva transformación que
responde el propósito, no siempre deliberado, de hacer al medio más parecido al hombre. Ese proceso es
designado como “remediación”. La “remediación” efectivamente no es un proceso sencillo, y por supuesto
no todas las personas consiguen percibirlo. El concepto “remediación” por lo menos admite dos
interpretaciones en la ecología de medios. En el libro The Soft Age, Paul Levinson (1997) empleó el término
“medio remedial” para describir cómo nuestras sociedades utilizan un medio para reformar o mejorar a otro.
De acuerdo con Levinson, en un esfuerzo del cual no siempre somos conscientes, intentamos hacer que los
medios se parezcan más al hombre. En uno de sus recientes libros: Cellphone. The story of the world’s
most mobile medium and how it has transformed everything, Levinson afirmó que los medios de
comunicación aún compiten -y de forma más intensa- por la atención de las personas (Levinson. 2004: 12).
En términos darwinianos -sugiere Levinson-, la selección del ambiente mediático queda en manos de las personas, quienes contribuyen con su preferencia a la evolución de un medio determinado. Constantemente se decide entre ir al cine o quedarse en casa a ver televisión, leer un libro o ver un video, hablar por celular o enviar un correo electrónico. Los medios no evolucionan por una selección natural sino por una elección humana. El medio que mejor evoluciona es aquel que se ajusta más a las diversas necesidades del hombre.
El proceso de remediación de los medios de comunicación sintetiza tal adecuación dialéctica que permite a los medios de comunicación “imitar” las facultades u órganos del ser humano.
Jay Bolter y Richard Grusin emplean el concepto remediación para describir las relaciones formales de interdependencia cultural que existen entre dos o varios medios, argumentando que en las primeras líneas de Comprender a los medios de comunicación: Las extensiones del ser humano, Marshall McLuhan afirmó que el contenido de todo medio es otro medio. Para Jay D. Bolter y Richard Grusin, Internet es un nuevo medio remediador, pues asimila a los medios que le antecedieron. El contenido de Internet son los medios que le antecedieron.

Los blogs. Ambiente comunicativo y de aprendizaje en el imaginario de la web 2.0
“Los blogs están dando voz y presencia pública a la gente corriente que tienen cosas que
decir, que no necesariamente saben acerca de tecnología, de diseño, o de programación
(…) Es un cambio fundamental que está ocurriendo con los blogs (texto), con flickr
(fotografía) y con YouTube (video)”.
“Blogs, el quinto poder”. Entrevista de Amaia Arribas a José Luis Orihuela. Excelsior,
Suplemento Dinero, página 11, 21 de agosto de 2006.
Los weblogs, blogs o bitácoras representan el corazón mismo de la Web. Tal aseveración adquiere particular significado si reparamos en el siguiente hecho: Tim Berners-Lee –el creador de la web-, desde enero de 1992 registraba la evolución de su proyecto e investigaciones en el sitio What´s New in ´92. Ese sitio precisamente ha sido considerado como el primer blog por algunos especialistas, entre los cuales destaca Dave Winer. De acuerdo con Winer [http://www.scripting.com], citado por el destacado bloguer argentino José Luis Orihuela (2006:40): “el primer weblog fue el primer sitio web”.
José Luis Orihuela, autor del blog e-cuaderno.com [hyyp://www.ecuaderno.com], y catedrático de la Universidad de Navarra, España –propiedad del Opus Dei-, propone la siguiente definición de blog:

“un sitio web que se compone de entradas individuales llamadas anotaciones o historias
dispuestas en orden cronológico inverso. Cada historia publicada queda archivada con su
propia dirección URL a modo de enlace permanente, así como la fecha y hora de su
publicación. En inglés el término log designa el registro de la actividad de un servidor, y en
un sentido más amplio se refiere a un diario, como travelog, para los clásicos diarios de
viaje. Así, para el diario de navegación del internauta por la Web se acuñó en 1997 el
término weblog, que se usa indistintamente en su forma abreviada blog” (Orihuela. 2006:
34):

El término weblog, señala Orihuela, fue introducido por Jorn Barrer en el sitio Robot Wisdom, en diciembre de 1997: “para designar una colección de enlaces hacia sitios interesantes que había descubierto al navegar en la Red” (Orihuela. 2006: 40).
En 1998 el número de blogs apenas llegaba a 20, destacando: Scripting News -de Dave Winer-; Tomalak´s Realm -de Lawrence Lee-; y CamWorld -de Cameron Barret-. En 1999 fueron incorporadas a Internet las primeras herramientas gratuitas para la edición y publicación de blogs: Pitas, en el mes de julio, y Blogger, en agosto. Pitas y Blogger contribuyeron a incrementaron el número de bloguers, extendiendo, además, las posibilidades expresivas de un nuevo ambiente de comunicaciones que se desarrollaba rápidamente en Internet: la blogósfera. En octubre de 1999 fueron publicados en Internet los primeros blogs en español:
Bitácora Tremendo [http://www.tremendo.com/bitácora/], y Subte [http://www.subte.com/v01/].
De 2000 a 2002 el crecimiento de la blogósfera apenas fue perceptible. Quizá el hecho más relevante ocurrió en noviembre de 2002, cuando dieron inicio las operaciones de Technorati, una de las principales fuentes de información en la investigación de la blogósfera.

En 2003 dos hechos favorecieron la expansión de la blogósfera: en el mes de febrero Google compró Blogger a Pyra Labs, una pequeña compañía ubicada en San Francisco, California, Estados Unidos; en segundo lugar, hacia mediados del el mes de marzo dio inicio la más reciente guerra emprendida por el gobierno de Estados Unidos contra Irak.
En la insensata invasión a Irak, un hecho dio gran visibilidad mediática a los blogs: la censura impuesta por la cadena noticiosa CNN al blog del periodista Kevin Sites. El viernes 21 de marzo de 2003, un día después del inicio de las operaciones del ejército estadounidense en territorio iraquí, Kevin Sites, corresponsal de guerra de Cable News Network (CNN), informó que no publicaría en su blog [http://www.kevinsites.net] más información relativa a la cobertura noticiosa que realizaba en Irak, debido a presiones ejercidas por altos directivos de CNN:

“Pausing the warblog, for now.
Dear readers:
I've been asked to suspend my war blogging for awhile.
But I don't want let you down -- I'm chronicling the events of my war experiences, the same
as I always have, and hope to come to agreement with CNN in the near future to make
them available to you in some shape or form, perhaps on this site.
In the meantime, thanks for participating in this remarkable forum. It's been a remarkable
experience to be your witness here.
-- Kevin Sites”.

Algunos bloguers enseguida manifestaron su solidaridad hacia Kevin Sites, objetando el proceder de CNN. Para atajar las críticas y cuestionamientos, Edna Johnson, vocera de CNN declaró: “La cobertura para CNN es trabajo de tiempo completo y le hemos pedido (a Kevin Sites) que se concentre en eso exclusivamente”. El 10 de octubre de 2003, Kevin Sites volvió a publicar en su blog.
Mientras la televisión estadounidense confería a la guerra en Irak el tratamiento de macabro “reality show”, algunos periodistas estadounidenses optaron por desarrollar blogs informativos para intentar evadir la mordaza impuesta por la administración del presidente Bush Jr. a los medios informativos estadounidenses, al amparo de la llamada “Acta Patriótica”.
Los llamados “warblogs” –bitácoras de guerra-, representaron una importante contribución al desarrollo de la blogósfera al afirmar las posibilidades informativas de los blogs. La audiencia de noticias en línea creció notablemente en 2003 gracias a la oportuna contribución de blogs destinados al análisis y el relato de tan absurdo episodio bélico.
Los blogs han sido objeto de frecuentes remediaciones en su brevísima historia.La incorporación de
avanzadas tecnologías a Internet ha propiciado el desarrollo de fotoblogs y videoblogs. Los llamados “blogs de nueva generación” (2.0) permiten incorporar imágenes, sonido y video.
En octubre de 2004 –de acuerdo con información de Technorati-, el total de blogs fue estimado en 4 millones. Entonces diariamente se publicaban 12 mil nuevos blogs (un nuevo blog se producía, en promedio, cada 7,4 segundos). Los comentarios (posts) publicados en blogs ascendían diariamente a 400,000 (4.6 notas por segundo). Además cada cinco meses la blogósfera duplicaba sus dimensiones.
En 2005 se registró otra importante remediación de Internet -y por supuesto también de los blogs-, con la introducción del “podcasting”, tecnología que permite grabar audio en formato mp3 para ser distribuido en Internet mediante sindicación RSS. El impacto del podcasting lógicamente se extendió a los blogs. Cuando los contenidos son publicados desde un teléfono móvil, se habla de moblogs.
En octubre de 2005 Technorati estimó 19,6 millones de blogs. Entonces se generaban 70 mil nuevos blogs diariamente (uno cada segundo). El número de textos y comentarios publicados cada día en los blogs oscilaba entre 700,000 y 1.3 millones (33,000 notas publicadas por hora y 9.2 por segundo). En el estudio realizado por Technorati en 2005 por primera vez se mencionó la práctica de spam en la blogósfera. Los llamados “fake blogs” y “spam blogs” representaban entre el 2 y el 8 por ciento de los nuevos blogs
generados.
En octubre de 2006, 12 blogs fueron ubicados entre los 100 sitios más populares en Internet. La preferencia de los usuarios de Internet empezaba a desplazarse de los sitios web convencionales hacia los blogs.
De acuerdo con estadísticas de Technorati [http://technorati.com/], a comienzos del mes de abril de 2007, el número estimado de blogs ascendía a 70 millones, y cada día son generados 120 mil nuevos blogs [1.4 por segundo, en promedio].
Gráfico 2. Crecimiento de la blogósfera de marzo de 2003 a marzo de 2007

En cuanto al número de textos que diariamente son publicados en blogs, Technorati estimó un promedio diario de 1.5 millones por día (17 comentarios o posts por segundo).
Por lo que respecta a los idiomas más empleados en la blogósfera –la información procede del otoño de 2006-, sorprende advertir que el japonés se encuentra en primer lugar.

De acuerdo con los resultados que arrojó el estudio 2007 de Technorati, el número y porcentaje de nuevos
splogs (spam blogs) registró un sensible incremento en la Navidad de 2006. En esa temporada decembrina
diariamente eran generados entre tres mil y siete mil nuevos splogs. La proliferación de mensajes publicitarios de carácter intrusivo definitivamente representa una delicada amenaza para el desarrollo de la web 2.0
José Luis Orihuela sostiene que los blogs admiten ser considerados como un nuevo medio de comunicación. En cambio Fernando Gutiérrez, desde la óptica de la ecología de medios (Media Ecology),
afirma que los blogs representan un nuevo “ambiente” digital que favorece la positiva remediación de Internet. Orihuela y Gutiérrez coinciden en destacar la formidable contribución de los blogs al desarrollo de la web 2.0. El advenimiento de la web 2.0 definitivamente afirma la pertinencia de quienes, con formidable visión del futuro, anticiparon el inexorable tránsito hacia la llamada economía del conocimiento, como Alvin Toffler, en La Tercera Ola:
“A medida que avanza la tercera ola, los medios de comunicación, lejos de extender su
influencia, se ven de pronto obligados a compartirla. Están siendo derrotados en muchos
frentes a la vez por lo que yo llamo los “medios de comunicación desmasificados” (Toffler.
1981: 164).
La nueva educación
La incorporación de las nuevas tecnologías de información hoy afortunadamente es uno de los principales objetivos de las políticas y programas educativos impulsados por los gobiernos. La “inclusión digital” representa un factor determinante en el desarrollo de la economía del conocimiento. El discurso pronunciado desde los gobiernos destaca que la implantación de las nuevas tecnologías en la educación ayuda a disminuir las brechas educativas, si entendemos que la desigualdad de oportunidades que padecen los niños, jóvenes y adolescentes de sectores desfavorecidos es un problema que no radica sólo en lo económico, sino que tiene sus raíces en lo cultural, lo político y, lo que aquí nos concierne, lo pedagógico.
La implementación de las nuevas tecnologías a la educación obedece a generar espacios de apropiación significativas de las mismas, donde las escuelas han sido proveídas de equipos informáticos, pero sin una capacitación a los docentes, o en su defecto, la capacitación sólo se dio con los docentes de áreas muy específicas, donde la utilización de la informática venía dado por la materia.
Con las nuevas tecnologías y su incursión en el ámbito docente, el centro de saber, por lo menos el que se consideraba el legítimo, ya no son los centros educativos, siendo éstos cuestionados, suponiendo como salida posible la modificación de las estrategias de la enseñanza junto con el diseño de nuevas propuestas didácticas.
Existen dos posturas respecto a la incorporación de las nuevas tecnologías de la información en la práctica docente. Desde las resistencias, asociadas al miedo, a lo desconocido, a hacer un mal papel ante los alumnos, los verdaderos expertos en tecnologías, hasta la postura de conformismo (“no nos queda más remedio que actualizarnos”), pasando por la más optimista que señala que la educación necesitaba de una revolución.
El origen del rechazo a las tecnologías radica en la dificultad de pensar sobre las culturas juveniles (Reguillo. 2000), que les impide ver lo que los jóvenes están experimentando, y en definitiva, viviendo. Así, la diferencia generacional, sobre la que en cierta manera se asienta el vínculo pedagógico, se convierte en un obstáculo, una brecha muy difícil de superar.
Ante este escenario, las preguntas que nos podemos formular versan sobre qué ocurre en nuestras
instituciones ante la irrupción de los nuevos espacios ocupados por las herramientas informáticas, cómo se utilizan, cómo se le dan significado y sentido, los imaginarios que se articulan y las prácticas que se generan en torno a ellas.
Entonces, ¿por qué seguir pensando en el espacio aúlico como un concepto que tiene límites espaciales?,
¿por qué solamente se concibe la tecnología como algo directamente relacionado con los grandes centros de desarrollo tecnológico y económico?. Eso sí, podemos disponer de la tecnología punta pero debemos ser capaces de crear, innovar un nuevo pensamiento y conocimiento a través de las tecnologías.
Los blogs definitivamente desbordan a las plataformas educativas adoptadas por algunas instituciones –como Learning Space o Blackboard-, por ejemplo, las cuales fueron respuesta lógica de los ambientes educativos que desplazó consigo el desarrollo de la Web 1.0
Algunas instituciones universitarias disponen de sofisticados campi virtuales que sirven para tareas administrativas y docentes así como para la comunicación interna con los alumnos. A pesar de haber desarrollado estas herramientas, reproducen la enseñanza universitaria tradicional ya que trasladan muchos elementos (exámenes, clase magistral) de la docencia tradicional combinados con atractivas utilidades. De esta manera, los campi virtuales no aprovechan las potencialidades de Internet y las nuevas tecnologías como la interactividad y el movimiento, por ejemplo, factores distintivos de la denominada sociedad de la ubicuidad, cuyo lema es comunicación para todos, en cualquier lugar, a toda hora.
En cuanto a los blogs, si bien existen intentos individuales de sacarles partido, no es una herramienta frecuente en las universidades pero sí entre universitarios. Los blogs son muy populares, están siendo adoptados masivamente por los jóvenes gracias a su gratuidad y su alta capacidad de difusión de la información. Quizás, su aspecto más conocido es su impacto en los medios de comunicación tradicionales.
El antecedente más directo en el ámbito universitario es Universia´s blog (http://blogs.universia.net/), donde los estudiantes muestran su capacidad para asimilar esta nueva herramienta. Por tanto, si nos preguntamos la idoneidad de un blog en el ámbito de la docencia y de la actividad universitaria tendríamos que asumir que permite el desarrollo de sus capacidades comunicativas y asimilación de las diversas fuentes de información que existen en Internet.
Una de las grandes ventajas que tiene el uso de los blogs en la docencia es que la mayoría de los alumnos los adoptan con facilidad ya que ven en ellos no sólo una herramienta de trabajo interactiva sino que crean una comunidad de intereses, más allá a veces de los propios equipos de trabajo.

La pasividad, de la que tanto se quejan los profesores, queda atrás ya que se percibe un aprendizaje más activo. Con las nuevas tecnologías, se hace una búsqueda de información en la Red, misma que se debate, critica o comparte. Así, los alumnos aprenden a buscar y contrastar la información para debatir en las aulas temas de actualidad.
Si algo diferencia a los blogs de las plataformas virtuales de las universidades es precisamente la no privacidad. Los contenidos abiertos de los blogs permiten aumentar esa comunidad de “amigos” y no quedar aislados únicamente con los compañeros de clase. Estar abiertos a las opiniones de visitantes enriquece la visión del equipo. La estrategia de contenidos abiertos fue impulsada por el MIT, anticipando el éxito de los blogs.
Así, los estudiantes se conciencian de la importancia de aprender a desarrollar la capacidad de innovación del propio sistema (lo que comúnmente llamamos open source). Precisamente, el gran número de herramientas y desarrollos de los blogs, frente a los contenidos cerrados de las plataformas virtuales, son la clave de su atractivo ya que los alumnos ven la importancia de introducir innovaciones y generar contenidos nuevos, estimulando su participación y creatividad. Por ello, debe fomentarse el uso y desarrollo del software libre, puesto que está sirviendo de soporte para las experiencias innovadoras, que resultan económicamente inviables con herramientas comerciales, facilitando además el acceso a las TIC´s.
A pesar de las bondades de los blogs, no se trata de sustituir los blogs de las plataformas virtuales. El campus virtual admite un ámbito restringido de comunicación entre alumnos y docentes, y quizás es deseable para determinados ámbitos. Los blogs pueden entenderse también para este tipo de usos (ya que también se le puede poner passwords), pero estaría en desventaja ya que no fue concebido para ese fin.
Por ello, es conveniente pensar en una herramienta complementaria y compatible con los campus virtuales.
La incorporación de las nuevas tecnologías a la educación es ya una realidad que nos facilita el aprendizaje y la comunicación por los que es un objetivo irrenunciable. Por ellos, se hace completamente necesario que las tecnologías formen parte del currículum con competencias bien definidas. La formación del profesorado es fundamental en materia tecnológica ya que tiene que actualizarse en el uso de las herramientas, que sus alumnos dominan a la perfección. La alfabetización digital queda como asignatura pendiente de los profesores, quienes deben reorientar sus prácticas a proyectos donde el aprendizaje instrumental sea un medio y no un fin, donde se creen motivaciones y la máxima sea “querer hacer para querer aprender, querer actuar para querer producir”:
Evidentemente, la cuestión de la infraestructura, con Internet de banda ancha en todos los centros educativos es requisito fundamental. Además, sería interesante difundir el uso de esquemas abiertos de propiedad intelectual que fomenten el trabajo colaborativo y la participación, uno de los ejes vertebrales del uso de los blogs en el aula.
Eso sí, no debemos confundir la conectividad e infraestructura con los contenidos. Se debe estimular a los alumnos a la construcción de sus propios contenidos, con prácticas abiertas donde se estimule el enfrentamiento a la tecnología desde la intuición y la reflexión. Es el verdadero reto de los blogs.
Prospectiva posible: el Aprendizaje móvil
Las primeras generaciones de “nativos digitales” han llegado a las universidades. Ellos tenían 5 o 6 años de edad en 1994 cuando Tim Berners-Lee introducía la web, innovación que detonaría el desarrollo de Internet.
Hoy las primeras generaciones de “nativos digitales tienen 18 o 19 años. En su tiempo libre la televisión ya jugó un papel secundario. Ellos dedicaron más horas a jugar con avanzadas consolas –como Nintendo o X Box- y a navegar en Internet.
Para los “nativos digitales” la educación se encuentra íntimamente asociada al empleo de avanzadas tecnologías de información y comunicaciones, e Internet representa para ellos un natural ambiente de aprendizaje.
El empleo de avanzadas tecnologías en la educación por supuesto no es reciente. Sin embargo, como consecuencia del formidable desarrollo que han registrado las comunicaciones digitales, escuelas y universidades efectivamente dedicadas a la educación se han visto en la necesidad de destinar considerables recursos para transformar los viejos espacios áulicos. En los salones de clase se han incorporado avanzadas tecnologías de información y comunicaciones para adaptarlos a los ambientes y escenarios de aprendizaje que demanda el imaginario de la Educación 1.0 Ello, sin embargo, no es suficiente.
La sociedad de la información y el conocimiento es también la sociedad de la ubicuidad.
En el imaginario de la sociedad de la ubicuidad aprenderemos a desenvolvernos indistintamente en el
mundo real y los mundos virtuales. Las exigencias educativas que supone el imaginario de la sociedad de la
ubicuidad evidentemente resultan mucho más complejas. Además debemos tener muy presente el
desarrollo de una nueva Web: la Web 2.0 El aprendizaje móvil representa el principal reto educativo que
nos impone el desarrollo de la Web 2.0
El jueves 6 de septiembre, a través del portal Campus Technology [http://www.campustechnology.com/] Howard Rheingold –autor del bestseller Smart Mobs. The next social revolution. Transforming cultures and communities in the age of instant access- y Jerry Kane, profesor del Boston College y experto en temas de tecnología educative, dictaron un “webinar” sobre estrategias para el empleo de wikis y otras tecnologías asociadas con el desarrollo de la Web 2.0, destinadas a estimular la discusión en procesos de aprendizaje, asegurando una efectiva gestión de los conocedores.
El repertorio de temas abordados por los referidos expertos en realidad forma parte de la agenda de exigencias educativas que hoy forman parte del difícil tránsito de los modelos educativos propios de la Educación 1.0 a la Educación 2.0
Crear comunidades en línea para trascender la experiencia educativa más allá del espacio áulico tradicional.
Transformar el proceso de aprendizaje en efectiva gestión de conocedores.
Estimular el desarrollo de proyectos wikis y blogs entre estudiantes.
Diseñar estrategias para el efectivo empleo de IPods, celulares, PDAs en programas de educación móvil.
En septiembre de 2007 el Tecnológico de Monterrey presentó sus primeros programas de maestría en la modalidad de aprendizaje móvil. El ingeniero Patricio López del Puerto, rector de la Universidad Virtual del Tecnológico de Monterrey, explicó la necesidad de pasar del curso en línea en computadora personal –propio de la Educación 1.0-, al curso en aprendizaje móvil –congruente con la ecología cultural de la Web 2.0-.
El primer programa de postgrado que precisamente se impartirá bajo la modalidad de aprendizaje móvil es la maestría en administración de tecnologías de información (MATI) –el cual cursé a finales de la década de 1990 precisamente bajo la modalidad de curso en línea-.
En enero de 2008 el Tecnológico de Monterrey impartirá bajo la modalidad de aprendizaje móvil la maestría en administración de empresas, programas empresariales de educación continua y algunas clases de licenciatura.
El aprendizaje móvil representa una profunda remediación educativa que definitivamente va más allá de la Web 2.0. El aprendizaje móvil admite ser considerado como una de las principales “ideas fuerza” del futuro.

sábado, 15 de diciembre de 2012

Deshabilitar boton Cerrar en winforms en Visual Basic.NET


Aqui les dejo este codigo que encontre navegando por Internet, este codigo lo ponen debajo de Public Class:
Dim _enabledcerrar As Boolean = False
     _
    Public Property enabledcerrar() As Boolean
        Get
            Return _enabledcerrar
        End Get
        Set(ByVal value As Boolean)
            If _enabledcerrar <> value Then
                _enabledcerrar = value
            End If
        End Set
    End Property
    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
        Get
            Dim cp As CreateParams = MyBase.CreateParams
            If _enabledcerrar = False Then
                Const CS_NOCLOSE As Integer = &H200
                cp.ClassStyle = cp.ClassStyle Or CS_NOCLOSE
            End If
            Return cp
        End Get
    End Property

domingo, 11 de noviembre de 2012

Agregar y Grabar en datagridview para guardar en SQL con Transacciones en Visual Basic .NET

Crearemos una forma con los objetos como aparece en la imagen, ademas agregaremos la libreria de sqlclient

Imports System.Data.SqlClient
para el ejemplo crearemos una base de datos con el nombre DBPRUEBA, que nos permita almacenar los datos.
CREATE DATABASE DBPRUEBA
USE DBPRUEBA
CREATE TABLE datos(  
id_datos INT PRIMARY KEY IDENTITY(1,1),  
nombre VARCHAR(50),  
deporte VARCHAR(50),  
fecha_inscripcion datetime    )
Ahora crearemos 4 columnas dentro del datagrid. que nos permitan agregar los datos ingresados.
Ahora para agregar los datos, hemos determinado un textbox para un nombre un combobox con unos deportes y por ultimo un datetimepicker para una fecha. tenemos un boton agregar que nos permitira, agregar un row al datagridview.
Este es el codigo para el boton agregar
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        If Me.TextBox1.Text <> String.Empty Then
            If Me.ComboBox1.Text <> String.Empty Then                  'agregamos la informacion a un row o fila del datagrid                  
                Me.DataGridView1.Rows.Add(Me.TextBox1.Text, Me.ComboBox1.Text, Me.DateTimePicker1.Value.ToShortDateString)                  'limpiamos los controles
                Me.TextBox1.Text = String.Empty
                Me.ComboBox1.SelectedItem = String.Empty
                Me.DateTimePicker1.Value = Today.Date
            Else
                MessageBox.Show("Ingrese un deporte", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        Else
            MessageBox.Show("Ingrese un nombre", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub
una vez tenemos datos dentro de nuestro datagrid, si deseamos eliminar uno de nuestros rows o filas damos click en el boton eliminar, la cual quitara la fila del datagrid.
Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
        'se puede hacer referencia al nombre de la columna para saber donde hicieron click o solo con el e.columnindex sabiendo la posicion de la columna          
        'yo lo manejo asi por que se daran cuenta que en algun caso las columnas pueden aumentar o disminuir           
        'y se complicaria la cosa por que si cambia el numero de columnas habria que corregir siembre el indice            
        'si hicieron clic en la columna eliminar          
        If DataGridView1.Columns(e.ColumnIndex).Name = "Eliminar" Then              'eliminar row
            DataGridView1.Rows.RemoveAt(e.RowIndex)
        End If
    End Sub
Ahora podremos guardar nuestra informacion al hacer click en el boton guardar, aqui se validara que existan datos o mejor filas en el datagrid, ahora recorreremos nuestro datagrid por medio de un For. tendremos una varia de tipo string (SqlString ) donde agregaremos la sentencia para guardar en la base de datos (INSERT INTO), ademas de un araylist para agregar las sentencias.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If DataGridView1.Rows.Count > 0 Then
            Dim SqlString As String = String.Empty ' variable a la que asignaremos la sentencia              
            Dim ListSqlStrings As New ArrayList  'arregla donde ingresaremos las sentencias              
            'recorremos el datagrid como ya sabemos siempre se toma desde cero
            For i As Integer = 0 To DataGridView1.Rows.Count - 1                  'creamos la sentencia el row siempre tendra el valor de i para ir pasando de row en row                  
                'el campo .cells(0) indica la columna que esta ese dato, tambien puede hacerlo con el nombre de la celda .cells("Nombre")
                SqlString = "INSERT INTO datos (nombre,deporte,fecha_inscripcion) VALUES ('" + DataGridView1.Rows(i).Cells(0).Value.ToString() + "','" + DataGridView1.Rows(i).Cells(1).Value.ToString() + "','" + DataGridView1.Rows(i).Cells(2).Value.ToString() + "')"
                'agregamos la sentencia a la lista                  
                ListSqlStrings.Add(SqlString)
            Next
            If EjecutarTransaccion(ListSqlStrings) Then
                MessageBox.Show("Info. guardada correctamente")
                Close()
            Else
                MessageBox.Show("La Info. no se guardo")
            End If
        Else
            MessageBox.Show("No hay informacion para guardar")
        End If
    End Sub
Ahora una vez hallamos recorrido el datagrid y tengamos nuestras sentencias, podremos ejecutar nuestra transaccion SQl para guardar en la base de datos. En este punto haciendo un parentesis igualmente podra ejecutar una a una las sentencias si lo desea por medio de un executenonquery, pero para mi lo mas optimo es una transaccion. Volviendo al evento guardar la funcion Public Function EjecutarTransaccion(ByVal ListaSentencias As ArrayList) As Boolean recibira el arraylist y retornara un valor booleano para identificar si se realizo la transaccion. para ejecutar nuestra transaccion necesitamos una conexion como la siguiente.
Public Connection1 As New SqlConnection("Data Source=XSaint;Initial Catalog=DBPRUEBA;Integrated Security=SSPI")
Ahora la funcion ejecutartransaccion se ejecutara, si es correcta la transaccion retornara true de ser incorrecta podremos ver un mensaje y retornara un false
Public Function EjecutarTransaccion(ByVal ListaSentencias As ArrayList) As Boolean
        Dim band As Boolean = False
        If AbrirConexion() Then
            Dim command As SqlCommand = Connection1.CreateCommand()
            Dim transaction As SqlTransaction
            Dim strSentencia As Object
            Dim sentencia As String = ""
            transaction = Connection1.BeginTransaction()
            command.Connection = Connection1
            command.Transaction = transaction
            Try
                For Each strSentencia In ListaSentencias
                    sentencia = strSentencia.ToString()
                    command.CommandText = sentencia.ToString()
                    command.ExecuteNonQuery()
                Next
                transaction.Commit()
                band = True
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Try
                    transaction.Rollback()
                Catch ex2 As Exception
                    MessageBox.Show(ex2.Message)
                End Try
            Finally
                CerrarConexion()
            End Try
        End If
        Return band
    End Function
Si la transaccion es satisfactoria veremos un mensaje de satisfaccion. la clase transaccion utiliza dos funciones dicionales de abrir y cerrar conexion que nos permite establecer si la conexion es correcta o no.
Public Function AbrirConexion() As Boolean
        Dim band As Boolean = False
        Connection1.Open()
        Try

            band = True
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        Return band
    End Function
    Public Function CerrarConexion() As Boolean
        Dim band As Boolean = False
        Connection1.Close()
        Try
            band = True
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        Return band
    End Function
ahora podremos ver nuestra informacion, en la base de datos.

viernes, 5 de octubre de 2012

AutoCompletar TextBox desde base de datos con Northwind y VB.NET

Hay que tener en cuenta que para utilizar esta opción, debes asignar las siguientes propiedades:
AutoCompleteMode: que sirve para indicar cómo queremos que se muestren los datos que encuentra mientras se escribe en el control.
AutoCompleteSource: que sirve para indicarle de dónde se obtendrán los datos que se usarán mientras se escribe.
En este ejemplo se utiliza AutoCompleteSource asignado a CustomSource debido a que la fuente de datos la obtenemos desde una ruta personalizada.
En el evento Load del formulario, se llama a la función AutoCompletar como se muestra debajo, asignándole el control TextBox.
Imports System.Data.SqlClient
Public Class Form1

    Dim myCommand As SqlCommand
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AutoCompletar(Me.TextBox1)
        Me.ActiveControl = TextBox1
    End Sub
Esta es la función AutoCompletar que se deberá utilizar asignándole el control TextBox.
Public Function AutoCompletar(ByVal Control As TextBox) As AutoCompleteStringCollection
        Dim Coleccion As New AutoCompleteStringCollection
        Dim Comando, Coneccion As String
        'Dim myConnection As SqlConnection
        Comando = "select LastName from Employees"
        'Creamos una nueva cadena de coneccion 
        Coneccion = "Data Source=XSaint;Initial Catalog=Northwind;Integrated Security=SSPI"
        'myConnection = New SqlConnection(Coneccion)
        Using myConnection As New SqlConnection(Coneccion)
            Dim Ejecutar As New SqlClient.SqlCommand(Comando, myConnection)
            'Abrimos la coneccion
            myConnection.Open()
            Dim Lector As SqlDataReader = Ejecutar.ExecuteReader()
            ' Realizamos un Loop mientras se est‚ leyendo.
            While Lector.Read()
                Coleccion.AddRange(New String() {Lector(0)})
            End While
            'Cerramos el SqlReader
            Lector.Close()
            'Cerramos la coneccion
            myConnection.Close()
        End Using
        'Ajustamos el control TextBox o ComboBox para recibir los datos de la siguiente manera.
        With Control
            .AutoCompleteMode = AutoCompleteMode.Suggest
            .AutoCompleteSource = AutoCompleteSource.CustomSource
            .AutoCompleteCustomSource = Coleccion
        End With
        'Devolvemos los datos recuperados de la base de datos
        Return Coleccion
    End Function
End Class

Cambiar color de filas en un dataGridView con CheckBox en VB.NET

Ejemplo para alternar mediante la propiedad backcolor del objeto alternatingrowsdefaultcellstyle , el color de filas en un control datagridview
CONTROLES
  1. Un DataGridview ( DataGridView1 )
  2. un CheckBox
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With ListBox1.Items
            .Add("1")
            .Add("2")
            .Add("3")
            .Add("1")
            .Add("2")
            .Add("3")
            ListBox1.SelectedIndex = 0
        End With
        Button1.Text = "Eliminar duplicados "
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(Eliminar(ListBox1), MsgBoxStyle.Information, "Elementos duplicados en el List ")
    End Sub
    Function Eliminar(ByVal LB As ListBox) As Int32
        Dim i As Int32
        Dim j As Int32
        Dim n As Int32           ' Recorre los items ( compara empezando desde el primero , de abajo hacia arriba)         
        For i = 0 To LB.Items.Count - 2
            For j = LB.Items.Count - 1 To i + 1 Step -1                 ' ... si es el mismo                 
                If LB.Items(i).ToString = LB.Items(j).ToString Then
                    LB.Items.RemoveAt(j) ' elimina el elemento indicando el índice                     
                    n += 1 'lleva la cuenta de los duplicados                 
                End If
            Next
        Next
        Return n ' retorna los eliminados     End Function End Class 
    End Function

Eliminar duplicados de un listbox en VB.NET

Simple función en vb.net que recorre todos los elementos de la lista de un
combo o listbox para poder eliminar los elementos o items duplicados
El ejemplo comienza comparando desde el primer item con todos los demás
empezando desde abajo hacia arriba. Si el elemento es el mismo lo elimina con el
método RemoveAt del ListBox indicando el índice
Colocar en el formulario
  1. Un control ListBox llamado Listbox1
  2. Un control Button llamado Button1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With ListBox1.Items
            .Add("1")
            .Add("2")
            .Add("3")
            .Add("1")
            .Add("2")
            .Add("3")
            ListBox1.SelectedIndex = 0
        End With
        Button1.Text = "Eliminar duplicados "
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(Eliminar(ListBox1), MsgBoxStyle.Information, "Elementos duplicados en el List ")
    End Sub
    Function Eliminar(ByVal LB As ListBox) As Int32
        Dim i As Int32
        Dim j As Int32
        Dim n As Int32           ' Recorre los items ( compara empezando desde el primero , de abajo hacia arriba)         
        For i = 0 To LB.Items.Count - 2
            For j = LB.Items.Count - 1 To i + 1 Step -1                 ' ... si es el mismo                 
                If LB.Items(i).ToString = LB.Items(j).ToString Then
                    LB.Items.RemoveAt(j) ' elimina el elemento indicando el índice                     
                    n += 1 'lleva la cuenta de los duplicados                 
                End If
            Next
        Next
        Return n ' retorna los eliminados     End Function End Class 
    End Function

domingo, 30 de septiembre de 2012

Truco:Abrir una dirección URL o un Programa con C++

Para abrir enlaces a través de un programa en c++ , se debe utiliza la función ShellExecute de la API de Windows.
Una sencilla aplicación que pregunte al usuario si desea visitar mi nuevo blog sería:
#include <windows.h>
#include <iostream>

using namespace std;
int main()
{
int val = MessageBox(NULL,"Quieres Visitar mi nuevo Blog?","Ventantita",MB_YESNO);
cout<<"Valor Retornado: "<<val;

if(val==6)
 {
        ShellExecute(NULL, "open", "http://www.elnaufragodelared.com/",NULL, NULL, SW_SHOWNORMAL);

 }
return 0;
}
De igual manera si deseo Ejecutar un programa externo como el Emule sería así:
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
        ShellExecute(NULL, "open", "C:/Archivos de programa/eMule/emule.exe",NULL, NULL, SW_SHOWNORMAL);
        return 0;
}

NOTA:
El ejemplo fue compilado utilizando el IDE , Codeblocks.