Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#5461
.NET (C#, VB.NET, ASP) / Re: Array vb.net 2010
29 Marzo 2015, 10:39 AM
Estoy convencido de que lo que estás intentando hacer, llenar con ceros, no es la solución más adecuada y debe ser causa de un problema que viene detrás.

Muestra las declaraciones de dichos Arrays, de la variable tmp1, y el método de escritura que te genera problemas, explica el problema que tienes un poco más a fondo para poder proponerte el enfoque adecuado.

De todas formas, ten en cuenta que puedes inicializar el Array al declararlo, de la siguiente manera por ejemplo:
Código (vbnet) [Seleccionar]
Dim arr1 As Integer() = Enumerable.Repeat(Of Integer)(element:=-1, count:=10).ToArray()

Eso podría evitar los problemas de elementos nulos que comentas y que no sabemos exactamente por qué tienes ese problema.

Saludos
#5464
La solución es:
Código (ruby) [Seleccionar]
libros.sort! {
   |primerLibro, segundoLibro|
   segundoLibro <=> primerLibro
}


La solución que pensaste sobre hacerle un reversal (inversión) a la colección también sería válida fuera del ejercicio,
pero supongo que el ejercicio no lo puede tomar por válido ya que obviamente la intención del ejercicio es demostrar la implementación de un bloque de código que compare entre A y B, devolviendo -1, 0, o +1,
vamos, que en mi opinión los algoritmos de validación de Code Academy no parecen permitir mucho "libre albedrio".

PD: Formula futuras preguntas sobre Ruby en el foro de Scripting.

Saludos
#5465
Cita de: Meta en 28 Marzo 2015, 18:10 PMPueden darme consejos de cómo lo harían ustedes.

Yo quizás lo hiciese de la siguiente manera...



Por un lado una Class para definir un item de menu:

Código (vbnet) [Seleccionar]
   ''' <summary>
   ''' Defines a Console Menu Item.
   ''' </summary>
   Public NotInheritable Class ConsoleMenuItem

       ''' <summary>
       ''' Gets or sets the item text.
       ''' </summary>
       ''' <value>The item text.</value>
       Public Property Text As String

       ''' <summary>
       ''' Gets or sets the <see cref="ConsoleKey"/> that activates this item.
       ''' </summary>
       ''' <value>The <see cref="ConsoleKey"/> that activates this item.</value>
       Public Property Key As ConsoleKey

       ''' <summary>
       ''' Gets or sets the associated <see cref="Command"/> for this item.
       ''' </summary>
       ''' <value>The associated <see cref="Command"/> for this item.</value>
       Public Property Command As Action

   End Class


Con ello, compongo los items del menú y sub-menúes:

Código (vbnet) [Seleccionar]
   ''' <summary>
   ''' The main menu items.
   ''' </summary>
   Private ReadOnly mainMenuItems As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Show first submenu",
                   .Key = ConsoleKey.D1,
                   .Command = New Action(Sub()
                                             ShowMenu(subMenuItems1)
                                         End Sub)
               },
           New ConsoleMenuItem With
               {
                   .Text = "[2] Show second submenu",
                   .Key = ConsoleKey.D2,
                   .Command = New Action(Sub()
                                             ShowMenu(subMenuItems2)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' The first submenu items.
   ''' </summary>
   Private ReadOnly subMenuItems1 As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Print a 'Hello World!'",
                   .Key = ConsoleKey.D1,
                   .Command = New Action(Sub()
                                             Console.WriteLine("Hello World!")
                                         End Sub)
               },
           New ConsoleMenuItem With
               {
                   .Text = "[R] Return",
                   .Key = ConsoleKey.R,
                   .Command = New Action(Sub()
                                             ShowMenu(mainMenuItems)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' The second submenu items.
   ''' </summary>
   Private ReadOnly subMenuItems2 As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Print the current date.",
                   .Key = ConsoleKey.D1,
                   .Command = Sub()
                                  Console.WriteLine(Date.Today.ToLongDateString)
                              End Sub
               },
           New ConsoleMenuItem With
               {
                   .Text = "[R] Return",
                   .Key = ConsoleKey.R,
                   .Command = New Action(Sub()
                                             ShowMenu(mainMenuItems)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' A menu item that exists from console.
   ''' </summary>
   Private ReadOnly menuItemExit As New ConsoleMenuItem With
   {
       .Text = "[X] Exit...",
       .Key = ConsoleKey.X,
       .Command = AddressOf EndConsole
   }


El resto ya solo es darle el formato de texto deseado al menú, y procesar la entrada del teclado:

Código (vbnet) [Seleccionar]
   ''' <summary>
   ''' Defines the entry point of the application.
   ''' </summary>
   Public Sub Main()

       ShowMenu(mainMenuItems)
       System.Threading.Thread.Sleep(Integer.MaxValue)

   End Sub

   ''' <summary>
   ''' Shows a console menu.
   ''' </summary>
   ''' <param name="menuItems">The items that composes the menu.</param>
   ''' <param name="itemIndicator">A string that indicates the current menu item.</param>
   Private Sub ShowMenu(ByVal menuItems As IEnumerable(Of ConsoleMenuItem),
                        Optional ByVal itemIndicator As String = " -> ")

       ' The selected menu item.
       Dim selectedItem As ConsoleMenuItem = menuItems(0)

       ' The index of the selected menu item.
       Dim selectedIndex As Integer

       ' The object to read the user-input pressed key.
       Dim currentKey As ConsoleKey

       ' Flag that determines wether the user pressed a valid menu item key.
       Dim itemKeyIsPressed As Boolean

       ' Wait for a valid menu item key.
       Do Until itemKeyIsPressed

           ' Iterate the menu items to format the menu string.
           Dim sb As New System.Text.StringBuilder
           With sb

               sb.AppendLine("===============================")
               sb.AppendLine("=========== My Menu ===========")
               sb.AppendLine("===============================")
               sb.AppendLine()

               For Each menuItem As ConsoleMenuItem In menuItems
                   If menuItem Is selectedItem Then
                       sb.AppendLine(String.Format("{0}{1}", itemIndicator, menuItem.Text))
                   Else
                       sb.AppendLine(menuItem.Text.Insert(0, New String(" "c, itemIndicator.Length)))
                   End If
               Next menuItem

               sb.AppendLine()
               sb.AppendLine("===============================")

           End With

           ' Clear the screen.
           Console.Clear()

           ' Print the menu items.
           Console.WriteLine(sb.ToString)

           ' Wait for user-input.
           currentKey = Console.ReadKey(True).Key

           ' Handle the pressed key.
           Select Case currentKey

               Case ConsoleKey.DownArrow ' Decrease current item selection.
                   selectedIndex = menuItems.ToList.IndexOf(selectedItem)
                   If selectedIndex < (menuItems.Count - 1) Then
                       selectedItem = menuItems(selectedIndex + 1)
                   Else
                       selectedItem = menuItems.First
                   End If

               Case ConsoleKey.UpArrow  ' Increase current item selection.
                   selectedIndex = menuItems.ToList.IndexOf(selectedItem)
                   If selectedIndex <> 0 Then
                       selectedItem = menuItems(selectedIndex - 1)
                   Else
                       selectedItem = menuItems.Last
                   End If

               Case ConsoleKey.Enter ' Run the selected item's command.
                   itemKeyIsPressed = True
                   selectedItem.Command.Invoke()

               Case ConsoleKey.Backspace ' Return to previous menu (if any).
                   Dim foundItem As ConsoleMenuItem =
                       (From item As ConsoleMenuItem In menuItems
                        Where item.Key = ConsoleKey.R).FirstOrDefault

                   If foundItem IsNot Nothing Then
                       itemKeyIsPressed = True
                       selectedItem = foundItem
                       selectedItem.Command.Invoke()
                   End If

               Case Else
                   Dim foundItem As ConsoleMenuItem =
                       (From item As ConsoleMenuItem In menuItems
                        Where item.Key = currentKey).FirstOrDefault

                   If foundItem IsNot Nothing Then
                       itemKeyIsPressed = True
                       selectedItem = foundItem
                       selectedItem.Command.Invoke()
                   End If

           End Select

       Loop

   End Sub

   ''' <summary>
   ''' Terminates the application.
   ''' </summary>
   Private Sub EndConsole()

       Environment.Exit(exitCode:=0)

   End Sub





El source completo, en VB:

Código (vbnet) [Seleccionar]
Module Module1

   ''' <summary>
   ''' Defines a Console Menu Item.
   ''' </summary>
   Public NotInheritable Class ConsoleMenuItem

       ''' <summary>
       ''' Gets or sets the item text.
       ''' </summary>
       ''' <value>The item text.</value>
       Public Property Text As String

       ''' <summary>
       ''' Gets or sets the <see cref="ConsoleKey"/> that activates this item.
       ''' </summary>
       ''' <value>The <see cref="ConsoleKey"/> that activates this item.</value>
       Public Property Key As ConsoleKey

       ''' <summary>
       ''' Gets or sets the associated <see cref="Command"/> for this item.
       ''' </summary>
       ''' <value>The associated <see cref="Command"/> for this item.</value>
       Public Property Command As Action

   End Class

   ''' <summary>
   ''' A menu item that exists from console.
   ''' </summary>
   Private ReadOnly menuItemExit As New ConsoleMenuItem With
   {
       .Text = "[X] Exit...",
       .Key = ConsoleKey.X,
       .Command = AddressOf EndConsole
   }

   ''' <summary>
   ''' The main menu items.
   ''' </summary>
   Private ReadOnly mainMenuItems As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Show first submenu",
                   .Key = ConsoleKey.D1,
                   .Command = New Action(Sub()
                                             ShowMenu(subMenuItems1)
                                         End Sub)
               },
           New ConsoleMenuItem With
               {
                   .Text = "[2] Show second submenu",
                   .Key = ConsoleKey.D2,
                   .Command = New Action(Sub()
                                             ShowMenu(subMenuItems2)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' The first submenu items.
   ''' </summary>
   Private ReadOnly subMenuItems1 As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Print a 'Hello World!'",
                   .Key = ConsoleKey.D1,
                   .Command = New Action(Sub()
                                             Console.WriteLine("Hello World!")
                                         End Sub)
               },
           New ConsoleMenuItem With
               {
                   .Text = "[R] Return",
                   .Key = ConsoleKey.R,
                   .Command = New Action(Sub()
                                             ShowMenu(mainMenuItems)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' The second submenu items.
   ''' </summary>
   Private ReadOnly subMenuItems2 As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Print the current date.",
                   .Key = ConsoleKey.D1,
                   .Command = Sub()
                                  Console.WriteLine(Date.Today.ToLongDateString)
                              End Sub
               },
           New ConsoleMenuItem With
               {
                   .Text = "[R] Return",
                   .Key = ConsoleKey.R,
                   .Command = New Action(Sub()
                                             ShowMenu(mainMenuItems)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' Defines the entry point of the application.
   ''' </summary>
   Public Sub Main()

       ShowMenu(mainMenuItems)
       System.Threading.Thread.Sleep(Integer.MaxValue)

   End Sub

   ''' <summary>
   ''' Shows a console menu.
   ''' </summary>
   ''' <param name="menuItems">The items that composes the menu.</param>
   ''' <param name="itemIndicator">A string that indicates the current menu item.</param>
   Private Sub ShowMenu(ByVal menuItems As IEnumerable(Of ConsoleMenuItem),
                        Optional ByVal itemIndicator As String = " -> ")

       ' The selected menu item.
       Dim selectedItem As ConsoleMenuItem = menuItems(0)

       ' The index of the selected menu item.
       Dim selectedIndex As Integer

       ' The object to read the user-input pressed key.
       Dim currentKey As ConsoleKey

       ' Flag that determines wether the user pressed a valid menu item key.
       Dim itemKeyIsPressed As Boolean

       ' Wait for a valid menu item key.
       Do Until itemKeyIsPressed

           ' Iterate the menu items to format the menu string.
           Dim sb As New System.Text.StringBuilder
           With sb

               sb.AppendLine("===============================")
               sb.AppendLine("=========== My Menu ===========")
               sb.AppendLine("===============================")
               sb.AppendLine()

               For Each menuItem As ConsoleMenuItem In menuItems
                   If menuItem Is selectedItem Then
                       sb.AppendLine(String.Format("{0}{1}", itemIndicator, menuItem.Text))
                   Else
                       sb.AppendLine(menuItem.Text.Insert(0, New String(" "c, itemIndicator.Length)))
                   End If
               Next menuItem

               sb.AppendLine()
               sb.AppendLine("===============================")

           End With

           ' Clear the screen.
           Console.Clear()

           ' Print the menu items.
           Console.WriteLine(sb.ToString)

           ' Wait for user-input.
           currentKey = Console.ReadKey(True).Key

           ' Handle the pressed key.
           Select Case currentKey

               Case ConsoleKey.DownArrow ' Decrease current item selection.
                   selectedIndex = menuItems.ToList.IndexOf(selectedItem)
                   If selectedIndex < (menuItems.Count - 1) Then
                       selectedItem = menuItems(selectedIndex + 1)
                   Else
                       selectedItem = menuItems.First
                   End If

               Case ConsoleKey.UpArrow  ' Increase current item selection.
                   selectedIndex = menuItems.ToList.IndexOf(selectedItem)
                   If selectedIndex <> 0 Then
                       selectedItem = menuItems(selectedIndex - 1)
                   Else
                       selectedItem = menuItems.Last
                   End If

               Case ConsoleKey.Enter ' Run the selected item's command.
                   itemKeyIsPressed = True
                   selectedItem.Command.Invoke()

               Case ConsoleKey.Backspace ' Return to previous menu (if any).
                   Dim foundItem As ConsoleMenuItem =
                       (From item As ConsoleMenuItem In menuItems
                        Where item.Key = ConsoleKey.R).FirstOrDefault

                   If foundItem IsNot Nothing Then
                       itemKeyIsPressed = True
                       selectedItem = foundItem
                       selectedItem.Command.Invoke()
                   End If

               Case Else
                   Dim foundItem As ConsoleMenuItem =
                       (From item As ConsoleMenuItem In menuItems
                        Where item.Key = currentKey).FirstOrDefault

                   If foundItem IsNot Nothing Then
                       itemKeyIsPressed = True
                       selectedItem = foundItem
                       selectedItem.Command.Invoke()
                   End If

           End Select

       Loop

   End Sub

   ''' <summary>
   ''' Terminates the application.
   ''' </summary>
   Private Sub EndConsole()

       Environment.Exit(exitCode:=0)

   End Sub

End Module


Traducción online a C# (sin testear):
Código (csharp) [Seleccionar]

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;

static class Module1
{
/// <summary>
/// Defines a Console Menu Item.
/// </summary>
public sealed class ConsoleMenuItem
{
/// <summary>
/// Gets or sets the item text.
/// </summary>
/// <value>The item text.</value>
public string Text { get; set; }

/// <summary>
/// Gets or sets the <see cref="ConsoleKey"/> that activates this item.
/// </summary>
/// <value>The <see cref="ConsoleKey"/> that activates this item.</value>
public ConsoleKey Key { get; set; }

/// <summary>
/// Gets or sets the associated <see cref="Command"/> for this item.
/// </summary>
/// <value>The associated <see cref="Command"/> for this item.</value>
public Action Command { get; set; }

}

/// <summary>
/// A menu item that exists from console.
/// </summary>
private static readonly ConsoleMenuItem menuItemExit = new ConsoleMenuItem {
Text = "[X] Exit...",
Key = ConsoleKey.X,
Command = EndConsole

};
/// <summary>
/// The main menu items.
/// </summary>
private static readonly IEnumerable<ConsoleMenuItem> mainMenuItems = {
new ConsoleMenuItem {
Text = "[1] Show first submenu",
Key = ConsoleKey.D1,
Command = new Action(() => { ShowMenu(subMenuItems1); })
},
new ConsoleMenuItem {
Text = "[2] Show second submenu",
Key = ConsoleKey.D2,
Command = new Action(() => { ShowMenu(subMenuItems2); })
},
menuItemExit

};
/// <summary>
/// The first submenu items.
/// </summary>
private static readonly IEnumerable<ConsoleMenuItem> subMenuItems1 = {
new ConsoleMenuItem {
Text = "[1] Print a 'Hello World!'",
Key = ConsoleKey.D1,
Command = new Action(() => { Console.WriteLine("Hello World!"); })
},
new ConsoleMenuItem {
Text = "[R] Return",
Key = ConsoleKey.R,
Command = new Action(() => { ShowMenu(mainMenuItems); })
},
menuItemExit

};
/// <summary>
/// The second submenu items.
/// </summary>
private static readonly IEnumerable<ConsoleMenuItem> subMenuItems2 = {
new ConsoleMenuItem {
Text = "[1] Print the current date.",
Key = ConsoleKey.D1,
Command = () => { Console.WriteLine(System.DateTime.Today.ToLongDateString); }
},
new ConsoleMenuItem {
Text = "[R] Return",
Key = ConsoleKey.R,
Command = new Action(() => { ShowMenu(mainMenuItems); })
},
menuItemExit

};
/// <summary>
/// Defines the entry point of the application.
/// </summary>

public static void Main()
{
ShowMenu(mainMenuItems);
System.Threading.Thread.Sleep(int.MaxValue);
}

/// <summary>
/// Shows a console menu.
/// </summary>
/// <param name="menuItems">The items that composes the menu.</param>
/// <param name="itemIndicator">A string that indicates the current menu item.</param>

private static void ShowMenu(IEnumerable<ConsoleMenuItem> menuItems, string itemIndicator = " -> ")
{
// The selected menu item.
ConsoleMenuItem selectedItem = menuItems(0);

// The index of the selected menu item.
int selectedIndex = 0;

// The object to read the user-input pressed key.
ConsoleKey currentKey = default(ConsoleKey);

// Flag that determines wether the user pressed a valid menu item key.
bool itemKeyIsPressed = false;

// Wait for a valid menu item key.

while (!(itemKeyIsPressed)) {
// Iterate the menu items to format the menu string.
System.Text.StringBuilder sb = new System.Text.StringBuilder();
var _with1 = sb;

sb.AppendLine("===============================");
sb.AppendLine("=========== My Menu ===========");
sb.AppendLine("===============================");
sb.AppendLine();

foreach (ConsoleMenuItem menuItem in menuItems) {
if (object.ReferenceEquals(menuItem, selectedItem)) {
sb.AppendLine(string.Format("{0}{1}", itemIndicator, menuItem.Text));
} else {
sb.AppendLine(menuItem.Text.Insert(0, new string(' ', itemIndicator.Length)));
}
}

sb.AppendLine();
sb.AppendLine("===============================");


// Clear the screen.
Console.Clear();

// Print the menu items.
Console.WriteLine(sb.ToString);

// Wait for user-input.
currentKey = Console.ReadKey(true).Key;

// Handle the pressed key.
switch (currentKey) {

case ConsoleKey.DownArrow:
// Decrease current item selection.
selectedIndex = menuItems.ToList.IndexOf(selectedItem);
if (selectedIndex < (menuItems.Count - 1)) {
selectedItem = menuItems(selectedIndex + 1);
} else {
selectedItem = menuItems.First;
}

break;
case ConsoleKey.UpArrow:
// Increase current item selection.
selectedIndex = menuItems.ToList.IndexOf(selectedItem);
if (selectedIndex != 0) {
selectedItem = menuItems(selectedIndex - 1);
} else {
selectedItem = menuItems.Last;
}

break;
case ConsoleKey.Enter:
// Run the selected item's command.
itemKeyIsPressed = true;
selectedItem.Command.Invoke();

break;
case ConsoleKey.Backspace:
// Return to previous menu (if any).
ConsoleMenuItem foundItem = (from item in menuItemswhere item.Key == ConsoleKey.R).FirstOrDefault;

if (foundItem != null) {
itemKeyIsPressed = true;
selectedItem = foundItem;
selectedItem.Command.Invoke();
}

break;
default:
ConsoleMenuItem foundItem = (from item in menuItemswhere item.Key == currentKey).FirstOrDefault;

if (foundItem != null) {
itemKeyIsPressed = true;
selectedItem = foundItem;
selectedItem.Command.Invoke();
}
break;
}
}
}

/// <summary>
/// Terminates the application.
/// </summary>
private static void EndConsole()
{
Environment.Exit(exitCode: 0);
}
}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//Facebook: facebook.com/telerik
//=======================================================


Saludos
#5466
Cita de: crisoof en 27 Marzo 2015, 18:24 PMalguien sabe si el bat puede escribir en una celda de un xls o odf??, muchas gracias :huh:
No, no es posible, Batch es una herramienta simple, totalmente incapacitado para llevar a cabo la tarea que requieres.

Cita de: crisoof en 27 Marzo 2015, 20:42 PMsi es que quiero contar las celdas de un archivo, tengo que necesariamente abrir ese archivo ? o como (abriendolo me refiero con algun comando)

Cómo ya te han comentado, puedes utilizar una macro en Excel mediante VBA, pero sobre la automatización desde un lenguaje de programación te diré algo más:

Solo debes usar un lenguaje de programación que sea capaz de leer/interpretar el formato ODF/XLS/XLSX, cómo por ejemplo los componentes COM que se instalan con MS Office, los cuales puedes usar desde VBS (o VBA, Vb.Net, C#, etc), para .Net recomiendo la librería NPOI que no requiere MS Office instalado, y si usas otro lenguaje, entonces puedes buscar herramientas específicas para dicho lenguaje, cómo por ejemplo están xlrd o xlutils para Python, y cómo hay otras herramientas para otros lenguajes.

Para leer el formato de un documento de OpenOffice me da la sensación que vas a tener que buscar mucho más a fondo alguna API bastante especializada (en .Net y Java existen, pero no las he probado) o documentarte sobre las especificaciones del formato para comprender cómo puedes leer los datos sin necesidad de APIs que los interpreten por ti (cosa que no recomiendo por el esfuerzo y demora de tiempo).

Saludos
#5467
Cita de: TrashAmbishion en 24 Marzo 2015, 23:27 PMVoy a instalar el Visual Studio 2013 y me exige que tenga este navegador...

Me pide descargar actualizaciones.... no me deja instalarlo...

Solución alternativa:

El instalador de VS2013 comprueba un valor en el registro de Windows para determinar que IE10 o superior está instalado.

La clave de registro es la siguiente:
x86: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer
x64: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer

El valor se llama 'svcVersion', y los datos del valor contienen la build del IE instalado en el equipo, por ende, solo debes falsificar los datos del valor para asignarle una build igual a '10.0.0.0' o superior.

Recuerda revertir el cambio del registro a su valor original.

PD: Creo que no hace falta mencionarlo, pero espero que entiendas los inconvenientes que podrían surgir al bypassear esta limitación, ya que algunos escenarios de VS dependen de IE10 o superior instalado en el equipo, depende de tus necesidades de programación, bien puedes necesitarlo o bien no.

Saludos!
#5468
Buenas

Creo que no eres totalmente consciente de la tremenda labor, tanto por esfuerzo y dedicación cómo por la inversión de tiempo (traducido en meses cómo mínimo, o en años si se quiere enseñar bien), de lo que supone que alguien, ya sea amigo o desconocido, te hiciese de profesor gratuitamente para enseñarte los principios básicos del lenguaje hasta llegar a temáticas avanzadas pasando por los internals del lenguaje. Eso no lo hace nadie.

De todas formas, eres libre de pedir ayuda al igual que cualquier persona es libre de ofrecerse si está dispuesto a asumir tal responsabilidad, pero yo creo que lo que deberías hacer es pedir orientación para saber por donde debes empezar a aprender (a aprender por ti mismo), no pedir que alguien te ayude a aprender el lenguaje por que por tu cuenta te resulte bastante dificil...

En el foro puedes formular preguntas, para eso está ...entre otras cosas también para documentarse, utiliza el lenguaje para practicar y el foro para preguntar, y los usuarios te ayudarán a resolver dichas dudas y aprenderás de las soluciones, el resto del aprendizaje deberías tomártelo por tu cuenta de forma autodidacta, puedes empezar por un libro, ejercicios, o la documentación oficial de Ruby, que para eso está también, para aprender el lenguaje.

Te recuerdo que, preguntas del tipo: "¿Qué lenguaje aprender?", "¿Cómo empiezo a aprender?" o "¿Que manuales debo leer?", se han publicado cientos de veces por otras personas con los mismos intereses que tú en este foro, y antes de preguntar lo mismo lo primero que debes hacer es usar el buscador del foro, además en tu propio beneficio, ya que encontrarías multitud de opiniones y puntos de vista diferentes que te servirían para aprender.

Saludos
#5469
Está claro que este artículo ha salido de algún otro sitio, pero voy a hacer referencia al comentario de Engel.

1. Si esto lo hubiese escrito el mismo El_Andaluz, en mi opinión él se ganaría un mayor respeto por mi parte del respeto normal que yo le ofrezco a todas las demás personas que se limiten a leer y/o debatir, o a personas que no sean capaces de profundizar en el interior de su mente para tener opinión propia y poner en duda temas existenciales para así construir hipótesis y mostrar sus ideas en un artículo semejante.

Personas o artículos, ya hablen de agujeros negros, extraterrestres, o lagartos con aspecto humano, mientras cualquier hipótesis/teoría sea sincera por el único interés de aprender más sobre nosotros mismos y no con intención de dramatizar ni llamar la atención ni llenarse los bolsillos con mentiras, entonces ese tipo de personas que sean capaces de abrir su mente para pensar en una posibilidad diferente a lo que opine el resto y encima mostrarle esa idea al resto del mundo, se merecen RESPETO y un gran aplauso.

2. En mi opinión, el hecho de poder ignorar algo no le hace a nadie menos respetable, ya que aparte de que debemos comprender que todos y cada uno de nosotros ignoramos la impensable realidad tanto del Universo cómo de los agujeros negros cómo de nosotros mismos, todos los grandes científicos de la historía en su día ignoraban algo ...hasta que descubrieon el que, y para descubrir el que, siempre habrá que teorizar sobre ideas que puedan resultar absurdas en muchos casos, cómo lo fue "La tierra redonda" antaño, ¿tan absurdo cómo la existencia de extra-terrestres, verdad? (sarcasmo).

Lo que quiero decir con todo esto es que, porfavor, no os paseis de la lengua con este tema, con los autores que redactan esos artículos o con los usuarios que comparten este tipo de temas cómo El_Andaluz, ni con las teorías locas o ideas de los demás que puedan parecernos absurdas, se que a veces cuesta ...a mi por ejemplo cuando me hablan de Dios ...me pierdo, pero intentemos tener en cuenta que cualquier posibilidad puede ser cierta por ridícula que parezca.

Gran artículo, gracias por compartir cómo siempre.

Saludos!
#5470
Solo por dar una definición más específica de "Indentación":

La Indentación (o sangría) es una cantidad de espacios en blanco y/o tabulaciones que normalmente suelen estar presente a la izquierda del principio de una linea, ni es más, ni es menos.

Las aplicaciones de la Indentación sirven para darle un formato o estilo propio a cualquier tipo de texto, es una técnica usada de forma universal, en papel, archivos digitales, etc;
también se aplica a lenguajes programación, cuya finalidad normalmente también es la de formatear el texto, el texto del código fuente.

Lo que ocurre es que Python, es un lenguaje muuuuy restrictivo en este asunto (amado y odiado por el mismo motivo), cuya estructura se basa en unas reglas que dependen de un estilo de indentación específico, o dicho de otra forma, la indentación es parte de la sintaxis de Python, cómo en otros lenguajes lo podrían ser el uso de los brackets o corchetes {} y sus reglas, por lo tanto, es obligatorio el uso de la indentación en este lenguaje y además siguiendo unas reglas específicas para dicha indentación.

PD:
Te vendría bien leer las convenciones de indentación en Python:
http://www.python.org/dev/peps/pep-0008/#indentation

TL/DR:
El error de Python (y de otros lenguajes) en mi opinión es el hecho de hacer obligatorio el uso de una característica que es literalmente invisible cómo es la indentación, y eso puede llegar a resultar muy molesto e irritante,
en mi opinión, usar Python solo causa una notable disminuición en el rendimiento del programador (hablando en tiempo de productividad), puesto que, por ejemplo, no es lo mismo tener que ejercer tu mente y tus ojos para estar pendiente del formato de 100 lineas de código e ir comprobando eventualmente que todas las lineas cumplan unas reglas de indentación ...ir contando esos espacios invisibles (puaj), que añadir unos sencillos brackets al principio y al final de esas 100 lineas (por ejemplo) y opcionalmente darle tu estilo de indentación propia para el formato del código,
así que para mi, Python solo es algo negativo en el parogramación, aunque tenga una buena demanda en el mercado y sea multi-plataforma ...eso me resulta irrelevante, sus reglas de Indentación más que una utilidad favorable es la inutilidad más desfavorable tanto para el lenguaje cómo para el programador que use ese lenguaje,
y ojo, yo soy alguien que indento cualquer código que escribo en otros lenguajes, de hecho me gusta hacerlo y soy muy meticuloso en ello ya que siempre me ha gustado intentar hacer las cosas perfectas ...quiero decir lo mejor que pueda, es más, hay algunas IDEs para Python que tienen en cuenta dichas reglas y facilitan la tarea, pero aun así yo jamás me veré ovligado a indentar siguiendo unas estrictas reglas de estructuración impuestas en el lenguaje de programación, por que eso implica muchas cosas negativas de las cuales ya comenté alguna, y a mi personalmente no me apetece volver a pasar por ahí, ya toqué bastante en su día mi odiado y medio olvidado Python.

Algunas personas justifican la obligación de indentación de Python cómo forma de transmitir/instruir buenos hábitos de programación, pero esto en mi opinión es una chorrada inmensa, una especie de manipulación/tergiversación y/o el modo que tienen muchas personas de someterse a la aceptación de un problema que no tiene nada de positivo,
en realidad yo lo veo cómo si a un niño pequeño le gritasen sus padres cada vez que no quiere comer por que la comida que le han preparado no le gusta o por que no tiene hambre o por el motivo que sea, ese niño sabe cómo comer, y ese niño comería si sintiese la necesidad de hacerlo, pero al final el niño acaba comiendo de forma negativa y obligada, para no recibir más gritos.
Lo mismo es Python para mi, un mal "instructor".

De todas formas, al fin y al cabo, es solo una cuestión de gustos.

Saludos!