¿Qué es lo mejor que has creado solo como programador?

Si alguna vez escuchó la frase “Algoritmos genéticos”, no necesitaría mucho tiempo para comprender de qué se trata mi proyecto.

Como estudiante universitario, estoy asistiendo a 2 profesores de Matemáticas en mi universidad en su investigación en Algoritmos de Optimización Multi-Objetivo inspirados en la Naturaleza.

Por favor, no te dejes intimidar, es muy simple, déjame desglosarlo.

Algoritmos de optimización : se utiliza en una amplia variedad de problemas de ingeniería en los que no es posible encontrar la solución más óptima o simplemente no es factible (es decir, no vale la pena el tiempo o el esfuerzo).

Inspirado en la naturaleza : estos algoritmos están inspirados en varios elementos naturales y en cómo se organizan y se comportan para lograr sus objetivos. Algoritmos genéticos (inspirados en la mutación genética y la selección natural: la supervivencia del más apto), las redes neuronales, la colonia de hormigas están inspiradas en la naturaleza).

Multi-objetivo : los problemas prácticos a menudo requieren que desarrollemos soluciones para optimizar MÁS de 1 variables. Entonces, tenemos más de 1 objetivos que cumplir.

Por ejemplo: quiero diseñar un motor de propulsión que cubra la mayor distancia posible por unidad de combustible pero, al mismo tiempo, produzca la menor cantidad de contenido de azufre posible.

Tengo 20 parámetros diferentes (valores numéricos de coma flotante, uno puede representar la cantidad de calor que se producirá, otro puede describir la presión del aire, etc.) para manipular y es probable que algunas combinaciones muy específicas obtengan la respuesta que estoy buscando. No es difícil darse cuenta de que probar cada combinación y luego probar para ver cuán “adecuada” es la solución es menos productiva que contar granos de arena.

Un algoritmo de fuerza bruta simple tendrá que probar un Gazillion (o tal vez infinito) configuraciones diferentes antes de llegar a una compensación razonable, pero los Algoritmos de Optimización alcanzan estas soluciones más rápido y son simplemente más efectivos.

Tales algoritmos comienzan explorando un espacio de solución definido (este espacio podría ser Finito o Infinito, y la Fuerza Bruta no puede funcionar en el espacio Infinito) y convergen gradualmente a mejores y mejores soluciones, eventualmente convergen a la solución óptima o casi óptima. en nuestro ejemplo, el espacio de solución se define por:

20 variables, todas pueden contener valores flotantes entre -Inf a + Inf

Ahora mi proyecto:

Desarrollé una biblioteca C ++ para uno de esos Algoritmos de Optimización conocido como Optimización de Enjambre de Partículas , inspirado en el comportamiento de las formaciones de Aves en el Cielo y la Escuela de Peces.

El usuario recibe una API limpia para establecer las restricciones, definir una función de evaluación (esta función evalúa cuán “buena” es la solución actual) y la biblioteca ejecuta PSO para encontrar la solución adecuada óptima.

Como no soy tan bueno nombrando, me tomé la libertad de llamarlo SwarmOpt. Aquí está:

duaraghav8 / SwarmOpt

¡Espero haber podido explicar claramente la ciencia detrás de esto, que en realidad es bastante simple y (COMO BONIFICACIÓN) no involucra muchas matemáticas!

Actualización: Ha pasado bastante tiempo desde que escribí esta respuesta, y ahora tengo un nuevo favorito (¡perdón por deshacerte de SwarmOpt!) – Fragmentos: Asistente de IA que recuerda todo para que no tengas que hacerlo – Ahora estoy construyendo un asistente personal que te permite cargar todos tus recuerdos a la nube simplemente hablando.

Personalmente, me siento abrumado por la información que ocupa mi cabeza, aunque no la necesito de inmediato: contraseñas, el bloque no. donde estacioné mi automóvil, dinero que la gente me debe, correos electrónicos importantes a los que tengo que responder y ¡qué no!

Solo deseaba un amigo que pudiera recordar esto por mí y que me lo dijera cada vez que lo pidiera. ¡Por lo tanto, nació la idea de Fragments!

Aquí hay un vistazo de cómo funciona:

Me encantaría compartir cómo lo construí si algún técnico está interesado, hágamelo saber 🙂

Actualización: dado que vi un interés nerd en cómo lo construí, lea sobre los temas a continuación y comprenderá exactamente cómo lo construí (pista: ¡es MUY fácil!):

Plataforma de PNL (Wit.ai, API.AI)

Modelos generativos Seq2Seq

Agrupación de texto (aprendizaje no supervisado)

Videos de Siraj Raval Chatbot en youtube

En 1982, programé la versión Atari 2600 de Donkey Kong. Yo diría que eso está en mi lista de “cosas más geniales” que he creado solo como programador. Programé el juego en lenguaje ensamblador 6502 en aproximadamente 3 meses, con poco descanso. Con una enorme presión para enviar el código final a tiempo para las ventas navideñas, terminé el juego con 72 horas seguidas sin dormir, después de lo cual me dijeron que parecía un zombie.

Para ser claros, no inventé Donkey Kong; Fue un gran éxito de Nintendo, diseñado en Japón por el legendario Shigeru Miyamoto. Fue el primer juego en presentar a Mario, que saltó a la fama en la serie de juegos de Super Mario Bros. Me encargaron crear una versión comercialmente viable del juego incorporada en un juego de monedas de $ 3,000 en un cartucho Atari de $ 30.

Los desafíos fueron muchos, incluyendo:

– Tenía unos 3 meses para escribirlo. Podría haber usado un año.

– Tenía 4.096 bytes de memoria para almacenar todo el código, gráficos y efectos de sonido. Además, tenía 128 bytes de memoria RAM para realizar un seguimiento de todo [NOTA: no kbytes, bytes]. El juego fue programado para ejecutarse en un microprocesador de 8 bits y 1 MHZ. Es casi seguro que esos números llevarán de rodillas a programadores expertos.

– Además de las limitaciones anteriores, la consola de juegos en la que estaba programando, la Atari 2600, estaba severamente limitada desde un punto de vista técnico (que es una discusión completamente separada), especialmente cuando se compara con una máquina arcade de $ 3,000. El chipset Atari 2600 fue diseñado originalmente para jugar 2 juegos: PONG y COMBAT. En consecuencia, las capacidades gráficas del 2600 se limitaron a mostrar dos (2) sprites (personajes animados, en movimiento), más una (1) bola y dos (2) misiles. La bola y los misiles eran simples objetos de proyectiles cuadrados / rectangulares, mientras que los dos sprites tenían 8 bits de ancho y podían mostrar cuadros de animación rudimentarios.

PONG tenía una paleta izquierda, una paleta derecha y una pelota. COMBAT tenía el tanque del jugador 1, el tanque del jugador 2 y dos misiles, uno para cada jugador. La suposición de Atari era que todos los juegos futuros tendrían dos sprites móviles y hasta tres objetos de proyectil. Esto contrastaba con la máquina arcade Donkey Kong, que era capaz de mostrar “128 sprites en primer plano a 16 × 16 píxeles cada uno”.

Además de la limitación en el número de objetos en la pantalla, debido a restricciones de memoria, el Atari 2600 se limitó a mostrar gráficos de fondo únicos para solo la mitad de la pantalla. En otras palabras, el lado derecho de la pantalla muestra una copia o un reflejo del lado izquierdo de la pantalla. En la imagen de arriba, los gráficos morados son los gráficos de fondo. Dado que las icónicas rampas inclinadas de Donkey Kong son de naturaleza no simétrica (no es una copia o un reflejo al comparar de izquierda a derecha), tuve que encontrar una forma de “solucionar” el hardware para lograr las rampas inclinadas.

Entonces, la imagen de arriba muestra las rampas inclinadas no simétricas, 4 barriles rodantes, Mario, Donkey Kong, Pauline, el martillo, una pantalla de “vidas” (2 bloques en la esquina superior derecha) y seis dígitos (en total) de puntaje . Todos los objetos enumerados cuentan contra los “dos (2) sprites más una (1) bola y dos (2) misiles”. Se utilizó un código de lenguaje de ensamblaje complejo e intrincadamente cronometrado para engañar al hardware para que muestre muchas copias únicas de los limitados objetos disponibles (ciertamente una discusión para otro momento).

Si bien siento que hice el mejor trabajo posible en una tarea casi imposible, el puerto no fue perfecto. Debido a limitaciones de memoria, solo pude incluir dos de las cuatro pantallas de arcade (había cuatro pantallas de juego distintas en la máquina original de monedas). A lo largo de los años, tuve mucha pena por esa decisión, pero era técnicamente imposible agregar algo más al cartucho, a menos que el editor, Coleco, accediera a ir a una memoria de cartucho más grande, lo que me hubiera dado 8.192 bytes. trabajar con. Dado el costo adicional de fabricación, disminuyeron. Con esa realidad, me concentré en hacer la versión del juego más jugable y gráficamente agradable que se pudiera hacer dadas las numerosas limitaciones.

El juego fue un éxito comercial para Coleco. Hace años leí un informe de un analista que decía que, si bien la versión Atari 2600 de Donkey Kong era uno de los 550 productos que Coleco lanzó ese año, representaba el 25% de sus ingresos totales.

Estoy agradecido de haber estado en el lugar correcto en el momento adecuado para trabajar en un juego tan icónico.

[NOTA: “creado solo como programador” en este contexto significa el 99% del código. Es posible que otro programador haya tocado el código de forma limitada, honestamente no estoy seguro. También tuve un gran apoyo (no de programación) de los empleados de Coleco].

Fuentes:

Shigeru Miyamoto – Wikipedia

Donkey Kong (videojuego) – Wikipedia

Una de las primeras aplicaciones de copiar / pegar para iPhone; Copiadora

En aquel entonces, cuando se lanzó inicialmente el iPhone, no tenía soporte para copiar / pegar y la gente se quejaba de eso en todas partes. En un foro, sugerí que se podría lograr con una aplicación intermedia que pueda leer los textos de otras aplicaciones y reenviarla a otra aplicación. No me tomaron en serio y la gente siguió quejándose. Decidí ver si puedo hacerlo yo mismo y comencé a trabajar.

Sin embargo, hubo algunos problemas;

  1. No tenía experiencia con ObjectiveC, deja el desarrollo de Mac solo
  2. El SDK oficial para iPhone aún no se lanzó, no había documentación, ningún IDE específico o una forma fácil de crear el entorno de desarrollo. La única alternativa era crear un pseudoambiente en una Mac
  3. Tampoco tenía una Mac

Pensé que el primer punto no sería un problema, podría manejar eso.

Para el segundo punto, había instrucciones para crear ese entorno, que tampoco debería ser un problema.

El tercero fue un problema. Traté de usar un “Hackintosh” pero tuve problemas con él (principalmente no poder conectarme a Internet) y fue un factor decisivo, ya que necesitaría buscar muchas cosas (debido al punto 1).

Luego, me topé con las instrucciones de Jay Saurik para crear un entorno de desarrollo en el iPhone. No fue una instalación sencilla, pero las instrucciones fueron lo suficientemente claras y, finalmente, tuve GCC ejecutándose en iPhone con los encabezados y bibliotecas Mac modificados.

Incluso crear un entorno de desarrollo en el iPhone fue genial en sí mismo. Podría conectarme a mi teléfono a través de SSH y hacer todo mi trabajo a través de la terminal. También instalé un emulador de terminal en el teléfono y pude continuar el desarrollo sobre la marcha.

Otro punto interesante fue tratar de descubrir cómo acceder a los datos de otras aplicaciones. Busqué en las carpetas de la aplicación, busqué bases de datos, archivos de configuración, etc. Descubrí que las bases de datos SQLite y los archivos plist se usaban para la mayoría de las aplicaciones. En mi aplicación, CopierciN, seleccionaría la fuente que desea copiar, leería su base de datos, enumeraría los elementos y le permitiría copiar el texto que desea. El más difícil fue Safari; para eso, escribí un JavaScript que se puede guardar como marcador y, al hacer clic en él, mostraría una forma textualizada de la página, guardaría el texto como otro marcador y también podría acceder a él a través de CopierciN.

Fue lo suficientemente bueno en su mayor parte, pero mi mayor error fue tratar de simular la selección de texto arrastrando el dedo. Estaba mostrando el texto como HTML y colocando un elemento para colorear el fondo del texto que ha seleccionado. Saldría mal cuando movías tu dedo. Ahora veo que sería mejor si agregara dos opciones: marcar inicio-finalización, en lugar de simular el arrastre.

Sin embargo, funcionó. Era completamente gratis (y de código abierto) pero la gente insistía en hacer donaciones, así que agregué una opción de donación. Fue genial, la gente estaba enviando dinero, aunque no estaba desbloqueando una funcionalidad, eliminando anuncios, etc., fue solo por agradecimiento y algunas de las donaciones fueron, bueno, realmente motivadoras (mi esposa todavía usa el collar que le compré con esas donaciones ) y me gustó mucho, pero finalmente dejé de trabajar en él como mejores soluciones (donde copiar / pegar estaba conectado al teclado, por lo que funcionaba en casi todas las aplicaciones automáticamente) y luego llegó la implementación oficial.

Una cosa genial fue que no hice anuncios, solo lo subí a un repositorio de Jailbreak y comencé a buscar en Google CopierciN. Durante las primeras horas, no hubo resultados. Luego apareció una página china, luego una rusa y una india. Fue como ver la rotación de la Tierra sobre los resultados de Google. En unas pocas horas, hubo cientos de resultados, videos y reseñas de CopierciN.

A veces pienso que debería haber comprado una Mac y continuar con el desarrollo del iPhone, pero en su lugar compré una motocicleta y monté 40000 km en dos años antes de abandonarla debido a un accidente en el que me rompí el brazo y la pierna derechos en algunos lugares, pero eso es otra historia…

Por cierto, aún puede verificar su código en mi cuenta de GitHub: gomercin / copiercin

Me di cuenta de que comencé a crear cosas interesantes a partir de la programación cuando descubrí el desarrollo del juego. Trabajé como programador junior en la industria del juego para un indie solo por curiosidad y fue una gran experiencia. Trabajé con Unity como motor, C # como lenguaje de programación y Visual Studio 2015 como IDE. Combo perfecto!

Después de un mes de aprender C #, trabajar con Unity, comprender la física sugerida por el motor, manipular botones, listas de desplazamiento, cámara, luces, etc., decidí ver cómo funcionan las cosas en diferentes motores y con diferentes lenguajes de programación, así que pensé Podría hacer eso con Python y probablemente importar mis juegos a mi Raspberry Pi.

Así que durante una semana, aprendí un poco de Python … quiero decir … justo lo que se necesita para hacer un juego básico. También fui a descubrir qué contiene la biblioteca Pygame, viendo tutoriales en Internet, y finalmente se me ocurrió la idea de hacer un clon básico del juego arcade Snake que llamé SnakePi jeje .

El juego es simple. la página principal contiene tres botones que le permiten jugar, verificar las reglas del juego / cómo jugar y el último botón es para salir del juego. el fondo es solo una foto de internet.

Los botones en realidad se ciernen en amarillo cuando se apuntan y generan un sonido divertido cuando se hace clic en ellos. Los efectos de sonido de audio también son de internet. Cuando hacemos clic en Controles, obtenemos esta página:

Y finalmente cuando jugamos el juego obtenemos esto:

Puedes pausar el juego y tienes la posibilidad de seguir jugando o abandonar todo el juego, y cuando llegas a los bordes aparece el mensaje Game Over.

No es una gran cosa que hacer, pero me parece genial y es interesante hacer las cosas con el conocimiento que uno tiene.

Debo admitir que crear un juego varía MUCHO de un lenguaje de programación a otro. Descubrí que con Python, tienes que hacer TODO tú mismo, crear los botones, pasar el mouse sobre ellos, agregar el fondo, agregar animación, ¡todo se hace mediante codificación! mientras que en Unity, por ejemplo, todo está ahí, simple y todo lo que tienes que pensar es en el juego que ayuda mucho y ahorra mucha energía.

PD: Estoy muy orgulloso de mi juego porque pude hacer una bonita manzana de píxeles en pintura, ¡sí!

En mayo de 1984, comencé a codificar el BIOS de PC de Phoenix Technologies ( era Phoenix Software en ese momento ) como consultor ( hice esto para entender qué implicaba la compatibilidad de software de PC, ya que quería diseñar placas base compatibles con PC que fueran mejores ) .

El BIOS fue un reemplazo del BIOS original de la computadora PC de IBM para ser vendido como BIOS legal de terceros para otros fabricantes. Fue codificado completamente en el lenguaje ensamblador MASM de Microsoft, y vinculado con el PLINK-86 de Phoenix, un enlazador avanzado.

El vinculador PLINK-86 tenía varias características agregadas para facilitar la vinculación del código de ensamblaje del BIOS. Podría alinear el código a una palabra o límite de palabra doble con directivas colocadas en el código manualmente (principalmente por velocidad, agregando NOP a los espacios anteriores). También podría forzar el código a una ubicación específica (permitiendo que los programadores salten al mismo lugar que el BIOS de IBM) y me diría el espacio libre o el desbordamiento entre ese lugar y el código anterior. También me permitió llenar espacios no utilizados con valores como NOP (Sin operación) o HLT (Detener) u otro valor de byte, para controlar otros usos inesperados del BIOS.

Phoenix requirió un programador que nunca había visto el código de BIOS de IBM publicado, lo cual no había hecho ( en enero de 1984, no pude encontrar el manual de referencia de IBM en ninguna de las tiendas locales en ese momento, lo cual fue algo bueno, de lo contrario No podría haber tomado el trabajo ). Como ingeniero electrónico digital (además de experto en ser un codificador de software de ensamblaje), escribí el código para ser tolerante con el hardware y el software mal diseñados. Otras personas especificaron las funciones y los problemas de compatibilidad en un documento que codifiqué.

Desde 1979, había escrito muchas BIOS CP / M, BIOS CP / M 3.0, MP / M BIOS, así como archivos de configuración genéricos para el programa de comunicación Modem7 en lenguaje ensamblador 8080. Además, había realizado una codificación limitada de ensamblaje 8086 mientras estaba en la División de Sistemas de Misiles Raytheon. Esto me dio precisamente el conjunto de habilidades correcto para escribir el primer BIOS del mundo, copiado legalmente, disponible para cualquier fabricante para su compra. La legalidad de la copia se discute en el libro Invisible Edge.

El código tenía que caber en una ROM de 8k y era extremadamente estricto (tanto que podría trabajar en él durante horas tratando de guardar un byte; la ROM XT de 16k y la ROM AT 64k no tenían tales problemas). Escribí todo el BIOS de la PC en 3 meses.

Probablemente fue 100% “libre de errores”, algo muy difícil de validar. Sin embargo, con tantos usuarios de Phoenix BIOS después de su lanzamiento, se estaba probando a fondo.

Recuerdo que la mayoría de los “errores” se debieron a programas que usaban incorrectamente el BIOS (que se encontró más típicamente en los primeros días de la PC hasta 1992), o las definiciones de compatibilidad. Por ejemplo, el código de IBM se bloquearía, donde mi código devolvió un código de error para varias llamadas a funciones que no se definieron o se utilizaron incorrectamente. ¿Cuál es el correcto o más útil? Chocar nunca tuvo un propósito, excepto decirle que algo es malo. Devolver un código de error (suponiendo que el programa lo revisó) como lo hizo Phoenix BIOS fue mucho más útil.

Otro ejemplo es cuando se usa el teclado numérico Alt para ingresar un código ASCII, IBM cambió el caso del carácter dependiendo de los estados de las teclas shift y Capslock (y no de una manera normal y esperada que podría agregar), lo que hace que no sentido. Sin embargo, algunos fabricantes querían esa operación extraña, por lo que se agregó como una opción del fabricante. (Obviamente, el código de teclado numérico alternativo de IBM cayó en su código de manejo de teclado estándar, y debe haber tenido banderas o código que nunca procesó los estados de mayúsculas y mayúsculas correctamente para el teclado numérico alternativo). Hubo muchos casos como este.

Y había programas (típicamente juegos) que saltaban a la mitad del código del BIOS, o que hacían referencia a algún byte del código del BIOS directamente. El mal uso del BIOS por parte de los programas definió esencialmente el concepto de lo que significaba la compatibilidad (y, por lo tanto, fue Phoenix quien sabía lo que significaba la verdadera compatibilidad, no IBM), pero estos eran claramente valores atípicos. Sin embargo, me esforcé por agregar esos usos extraños a la compatibilidad del BIOS. Con el tiempo, a medida que los programas se actualizaban y los programadores, que trataban con múltiples BIOS de origen (como IBM, Compaq, Phoenix, Award, AMI y más tarde, otros), comenzaron a codificar adecuadamente sus programas para usar los BIOS correctamente, por lo que esto se volvió menos importante.

Muchos fabricantes de PC usarían el código de BIOS de IBM para probar la compatibilidad de su hardware, y a menudo se sorprendían cuando IBM no funcionaba y el BIOS de Phoenix sí lo hacía. Pero Phoenix BIOS fue escrito para adaptarse dinámicamente a pequeñas diferencias de hardware, o simplemente tener un código que funcionaría incluso con esas diferencias de hardware, que el BIOS de IBM no tenía que hacerlo.

El código se escribió para mantener llena la cola de búsqueda previa del procesador para ejecutarla lo más rápido posible, así como para realizar un trabajo de procesamiento menor durante el retroceso horizontal y vertical del controlador de video para minimizar el flash de la pantalla. Las operaciones de movimiento de memoria se optimizaron para realizar la mayor parte del trabajo como movimientos de palabra doble (32 bits) o palabra (16 bits), y se alinearon palabras o palabras dobles según el procesador.

Además, el código tenía muchos ecualizadores de ensamblaje (interruptores) para que los fabricantes pudieran elegir exactamente qué características / compatibilidad, etc., querían tener. El código promedió aproximadamente 25 caracteres de texto de comentario por byte que se ensambló ( cifra de 4 a 6 bytes por línea de ensamblador, lo que significa de 100 a 150 caracteres de texto de comentario por línea ), lo que lo hace altamente documentado (en caso de que el proceso de copia se lleve a los tribunales ) De hecho, hice una instantánea de copia de seguridad del código todos los días, por lo que el proceso podría estar bien documentado. El código encajaría fácilmente en un disquete de 360k, disquete de 5.25 ″ (hasta que comencé a trabajar en el BIOS de AT).

Aunque no lo hice totalmente solo, en unos 3 meses más, escribí el BIOS XT (tenía soporte para disco duro), pero otro consultor, Al Weiner, escribió la mayor parte del soporte para disco duro desde un marco esqueleto que le di. En diciembre de 1984, comencé a escribir el AT BIOS, que tenía el apoyo de Stan Lyness (quien escribió el código del disco duro y el código para volver al modo real desde el modo protegido en el 80286) y otra persona que escribió el AT CMOS código de configuración El AT BIOS se completó en mayo de 1985.

El Phoenix AT BIOS agregó nuevas características, como la configuración de CMOS en ROM y accesible mediante una secuencia de teclado en el arranque, la capacidad de cambiar la velocidad de la CPU / Sistema por teclado para aquellos sistemas que podrían ser cambiados por software (el AST 286 Premium que diseñé la placa base tenía esta característica), así como soporte temprano para aumentar el tamaño de los discos duros cuando comenzaron a exceder las limitaciones del BIOS de IBM, la configuración de memoria automática para varios tamaños de memoria, etc.

Impacto del BIOS Phoenix
Las BIOS Phoenix permitieron el crecimiento completo de la industria de la clonación de PC y, por lo tanto, tuvieron un tremendo impacto en la industria. Otros BIOS de terceros escritos por otras compañías después del lanzamiento de Phoenix BIOS fueron generalmente menos compatibles, más lentos y con menos características (algunos fueron escritos en ensamblaje, otros en C). Si el primer BIOS legal de terceros no se hubiera escrito bien, la industria de clonación de PC podría no haber despegado nunca, los otros BIOS de clonación nunca se habrían escrito, y todos podríamos estar utilizando Apple Macs o alguna otra plataforma.

Con el crecimiento de los clones de PC, y por lo tanto, la industria electrónica (procesamiento, memoria, almacenamiento masivo, integración a gran escala) puede haber sido el impulso para DVD, Blue-Ray, HDTV, teléfonos inteligentes, cámaras digitales, IoT, incluso el crecimiento meteórico de internet ( difícil de hacer sin computadoras baratas en el escritorio de todos ), Windows ( sin una plataforma estándar, Microsoft nunca pudo haberlo creado y crecido como lo hicieron ), todo pudo haber resultado de la creación de un pequeño Pieza de 8k de código de software, el BIOS Phoenix .

Anexo 1:
Como ingeniero informático, mi objetivo de por vida era crear el hardware para habilitar la Inteligencia Artificial (IA). Creí que esto habría involucrado algún tipo de Computación Óptica usando Procesadores de Señal Óptica (OSP), ya que pueden realizar operaciones paralelas masivas, esencialmente lógica de múltiples valores, FFT , invertir grandes matrices, etc.

Sin embargo, el Watson de IBM (el que venció a los mejores jugadores de Jeopardy) es el más cercano que tenemos actualmente, compuesto por miles de servidores, esencialmente PC. Por lo tanto, una pieza de software que creé esencialmente permitió este objetivo de por vida, no cualquier hardware que haya creado. ¿Quien lo hubiera pensado?

Anexo 2:
Cuando comencé a programar el BIOS Phoenix, mis habilidades de programación de ensamblaje 8080 / Z80 estaban bastante perfeccionadas, pero mis habilidades de ensamblaje x86 para escribir el BIOS mucho menos.

Muchos aspectos del código fueron encabezados de comentarios, equivalentes de puertos de E / S y ubicaciones de memoria, etc. Para desarrollar mis habilidades x86, comencé a diseñar las estructuras de mis funciones y comencé a codificar algunas de las funciones más simples del BIOS. Con el tiempo, desarrollé las funciones más complicadas. En el camino, volvería a codificar porciones a medida que aprendiera mejores técnicas e instrucciones más eficientes.

Usaría fgrep y búsqueda global y reemplazo para ubicar el código en varios archivos del código y podría modificarlos muy rápidamente para mejorar la calidad.

Algunos hardware no estaban perfectamente documentados, por lo que escribiría un código pequeño o probaría manualmente el hardware para ver con precisión cómo respondía a varios comandos de E / S.

En 3 meses, se realizó el BIOS de PC ROM (tamaño 8k), y estaba muy bien versado en los matices de las instrucciones de ensamblado y montaje de instrucciones x86.

Anexo 3:
Phoenix BIOS fue más rápido, tenía más funciones y menos errores que otros BIOS escritos de otras compañías, incluida IBM.

Según mi trabajo posterior con el diseño de placas base y el manejo de otras BIOS que no sean Phoenix que los fabricantes de placas base usarían, parece que las otras BIOS (algunas escritas en C), no fueron escritas por programadores que entendieron los matices del hardware o de los programadores de aplicaciones y tenía mucha menos experiencia. Algunos pueden haber sido, de hecho, un “camello” (un caballo diseñado por un comité; en otras palabras, muchos programadores en lugar de básicamente uno).

Mi experiencia previa al escribir BIOS CP / M y código de configuración genérico para el módem 7, junto con mi experiencia en hardware y la comprensión de las secuencias de ejecución de la CPU, todo contribuyó a mi

  • Capacidad para escribir código más eficiente (espacio y velocidad)
  • Características de diseño que las placas base o los usuarios pueden necesitar (ya sea solicitado o no)
  • Piense tanto como un diseñador de placa base y un programador de aplicaciones, pudiendo predecir cosas que podrían afectar la compatibilidad antes de que existieran.
  • Agregue más selecciones de configuración de tiempo de ensamblaje para fabricantes

Anexo 4:
Calculo que produje alrededor de 15 a 20 líneas de código de ensamblaje comentado en línea terminado por día. Esto no incluye las líneas adicionales de Equates, Macros, comentarios de encabezado y otras líneas sin código, que no fueron insignificantes. Y esas líneas de código por día, también incluyen todos los gastos generales de la lectura (y comprensión) de la documentación del hardware, las pruebas de velocidad y compatibilidad, y las copias de seguridad diarias.

Referencias

  • La legalidad de la copia y el concepto de propiedad intelectual (IP) y la copia del BIOS de IBM se discuten en el libro The Invisible Edge: llevando su estrategia al siguiente nivel ( haga clic en el primer resultado de búsqueda ).
  • Para obtener una respuesta más completa sobre cómo escribir un BIOS, consulte
    ¿Cómo se escribe el BIOS para una placa base de computadora? ¿Cómo se escribió el primer BIOS?
  • Esto explica por qué los únicos sistemas que quedan son PC, Apple Macintosh y procesadores ARM.
    ¿Por qué falló Digital Equipment Corporation (DEC)?
  • Esto explica la historia temprana de la PC y la creación del primer sistema informático S-100, la computadora MITS Altair
    ¿Subieron las ventas de computadoras después de la invención de los videojuegos?
  • Esto describe las primeras necesidades de un botón “turbo”, mi diseño de la placa base AST 286 Premium (computadora PC más rápida de 1987), y por qué la persona promedio se preocupa por el tiempo de memoria para su PC
    Historia de la informática: ¿Qué hizo el botón “turbo” en las PC de principios de los 90?
  • Mejora de la velocidad del código del BIOS
    ¿Cómo funciona la predicción de rama en las CPU modernas? ¿Pueden los compiladores trabajar con procesadores para mejorar la predicción?
  • Entrar y salir de problemas de modo protegido
    ¿Por qué el BIOS inicializa la CPU en modo real?
  • Describe cómo se codificó el BIOS Phoenix para mejorar la ejecución
    ¿Cómo funciona la predicción de rama en las CPU modernas? ¿Pueden los compiladores trabajar con procesadores para mejorar la predicción?
  • Describe el uso del modo protegido y los problemas en las primeras computadoras PC-AT
    ¿Por qué el BIOS inicializa la CPU en modo real?
  • Describe cómo comencé en computadoras
    ¿Qué edad tenías cuando sabías lo que querías hacer para una carrera?

Cuando se lanzó por primera vez la computadora personal IBM original (con un procesador de 8 bits, que funciona a una velocidad de reloj de solo 4,77 MHz), era un asistente docente graduado a cargo del curso de Introducción al lenguaje de máquina del departamento de informática. Después de que la PC de IBM había madurado un poco, suficiente para ser utilizable, nuestro departamento decidió comprar un par de docenas de estas PC y equipar un laboratorio de computación lleno de ellas. Era un sistema de arquitectura abierta, por lo que teníamos mucha documentación sobre la arquitectura de la máquina que nos permitía profundizar en las entrañas del sistema. Esto fue bastante adecuado para enseñar el curso de lenguaje de máquina. La PC también tenía un intérprete BASIC bastante capaz, y otros compiladores de idiomas, y un editor de texto, por lo que también podía soportar la enseñanza de otros cursos.

El intérprete BASIC incluso incluyó soporte para la generación de sonido en el altavoz de la PC, a través de golpes de bits: no había chip generador de sonido. Un programa BÁSICO podría reproducir una nota a la vez. Como teníamos una sala llena de estas computadoras, pensé que sería interesante lograr una actuación musical con varias voces al hacer que varias de las PC en la sala cantaran juntas en armonía, cada PC tocando una de las voces.

El verdadero truco era sincronizar sus relojes internos para que todos comenzaran al mismo tiempo. La inicialización del reloj de la PC solo se puede hacer ingresando la hora deseada en el teclado y presionando Enter. Sin embargo, la variabilidad natural en la entrada del teclado humano podría permitir que los diferentes relojes de PC difieran en una fracción significativa de segundo, lo que sería muy notable y distraería para la generación de música.

Sin embargo, en lenguaje máquina (y en realidad me refiero al lenguaje ensamblador, utilizamos lenguaje ensamblador para codificar nuestros programas), uno podría tener acceso de lectura / escritura al registro interno del contador del reloj, esencialmente un número binario incremental que zumbaba a, oh … 1kHz Yo creo que. Entonces, a nivel de lenguaje de máquina, uno tenía la capacidad de configurar el reloj interno con una resolución de un milisegundo.

La PC IBM venía equipada con un puerto de comunicación en serie. Conecté un cable que podía llegar desde la PC del instructor a la computadora de cualquier estudiante en el laboratorio. Escribí dos pequeños programas de lenguaje de máquina. En la PC del instructor coloqué un programa que leía el valor del contador del reloj del sistema de bajo nivel, y lo transmití de inmediato a través del enlace en serie. En cada una de las PC de los estudiantes, coloqué un programa que esperaba la recepción de un valor a través del enlace serie, e inmediatamente lo almacené en el contador interno del reloj del sistema.

La PC del instructor fue la computadora de referencia de tiempo designada. El procedimiento consistía en conectar el cable de la PC del instructor a la PC de cada alumno por turno, y mientras el cable estaba conectado a una PC del alumno, ejecutar el programa de recepción del reloj en la PC del alumno y el programa de transmisión del reloj en la PC del instructor. Por supuesto, habría un retraso de transmisión en el enlace, por lo que el reloj de cada PC de un alumno se configuraría a una hora un poco por detrás del reloj del PC del instructor. Pero, dado que el retardo de transmisión siempre fue el mismo, el reloj de cada PC de los estudiantes se configuraría con el mismo desplazamiento del reloj de referencia. Por lo tanto, todos los relojes de PC de los estudiantes estarían sincronizados entre sí.

Yo era organista, así que para la actuación, elegí una de mis piezas favoritas, el coral Introducción de Suite Gothique de Leon Boellmann, por el que obtuve el puntaje.

Escribí varios programas BÁSICOS, uno para cada voz de la pieza. En voces bajas, donde la respuesta del altavoz de la PC era débil, empleé varias PC para duplicar o triplicar con una sola voz. El programa de rendimiento en cada PC aceptaría desde el teclado una hora de inicio del rendimiento de la hora del día, esperaría a que se moviera esa hora del reloj y luego comenzaría a tocar la pieza.

Su primera presentación pública se produjo involuntariamente un día después de una sesión de laboratorio exitosa realizada antes de que comenzaran las clases del día. Finalmente había ajustado y depurado la pieza lo suficiente como para que la actuación sonara realmente grandiosa. Estaba configurando las PC para hacer un rendimiento más cuando noté que los estudiantes comenzaban a entrar en el laboratorio. No me había dado cuenta de que el período de primera clase casi había llegado. Había establecido este último tiempo de actuación solo unos minutos antes de la clase. Empaqué mi equipo y me preparé para salir del laboratorio antes de que comenzara la clase, pero decidí dejar las PC configuradas y esperando su hora de inicio. Cuando llegó el momento de la presentación, los estudiantes que habían llegado temprano a la clase fueron repentinamente invitados a un sorprendente “concierto de órgano” por la sala llena de computadoras IBM.

Creé una extensión de Chrome para generar un resumen conciso de cualquier página web.

Además de generar un resumen de 2 párrafos, también

  • Extrae oraciones clave de cada párrafo y las clasifica, lo que le permite buscar a través de ellas por palabras clave.
  • Extrae todas las fechas en el artículo (este tomó un tiempo, porque hay muchos falsos positivos) y las clasifica en una línea de tiempo.
  • Análisis de datos: cosas simples como número de oraciones, palabras / párrafo promedio, nivel de lectura, etc.

Abridge Descargar en Chrome Store

Gavin-Song / Abridge : el código fuente para todos los programadores de código abierto 🙂

Comencé este proyecto cerca del final del año escolar y lo terminé durante el verano. Sin embargo, esto tardó un poco más de lo esperado. Algunas cosas que fueron sorprendentemente difíciles fueron

División precisa de oraciones:

Podrías dividir entre [“.”, “?”, “!”], Pero puede haber puntos en el medio de las oraciones. Por ejemplo,

El Dr. Brown va a St. John de vacaciones.

se convertiría

[“Dr”, “Brown va a St”, “John de vacaciones”]

lo cual obviamente no es aceptable. Podría ir más allá y dividirse solo por una frase que termina seguida de una letra mayúscula, pero luego fracasarán frases como “La empresa estadounidense se declara en quiebra”.

Mi solución fue iterar a través de la cadena, y solo detenerme en las terminaciones de oraciones si la palabra que la precedía no estaba en una lista de abreviaturas como Dr. o Rd., O si la palabra anterior podría dividirse en un acrónimo (Definido si la palabra podría dividirse por “.” en más de 2 partes, cada una con menos de 3 caracteres).

Comprobar si una oración contenía una fecha

Este es muy difícil, y todavía hay ocasionalmente falsos positivos. No hubo una buena solución para esto, y mi solución implicó eliminar muchos casos falsos positivos, como

[NÚMERO DE 4 DÍGITOS] [Palabra en una lista de unidades] – es decir, 2015 cm
[NÚMERO DE 4 DÍGITOS] [Palabra plural] – es decir, 1356 tablas
[ABREVIATURA DE 3 LETRAS] [NÚMERO DE 4 DÍGITOS] – es decir, ISO 1246

Otras fechas, como 10 AD, fueron más fáciles, ya que podrían coincidir con una expresión regular. Puede ver el código completo para la coincidencia de fechas aquí: Gavin-Song / Abridge

CSS

Dado que las pestañas se inyectan directamente en el sitio web, tuve que hacer mucho restablecimiento de CSS para todo, e incluso en ocasiones todavía hay errores en el CSS (debería haber usado una hoja de restablecimiento de CSS).

Desarrollé un programa de computadora de simulación HTML5 para mí mismo para ahorrar tiempo y esfuerzo proporcionalmente.

Hace unos años, solía trabajar en el Bloc de notas para escribir HTML y JavaScript para crear páginas web cuando lo estaba aprendiendo. Fue una idea muy ineficiente e irritante usar el Bloc de notas para escribir códigos porque para actualizar mi página web, cada vez que tenía que abrir eso en el Bloc de notas y hacer cambios. Finalmente, tuve que guardar el archivo nuevamente como html y abrirlo en algún navegador. Si algo salía mal, tenía que ir al Bloc de notas y continuar el ciclo una y otra vez.

Por lo tanto, pensé en hacer un programa que pueda

  • Trabaje en tiempo real, es decir, muéstreme los resultados tan pronto como se ingrese.
  • Programa escrito de guardado automático al salir / apagar / bloquear.
  • Trabaja sin conexión principalmente.
  • Controle el error de tiempo de ejecución y permita flexibilidad.

En pocas palabras, todo lo que quería era una solución única para todo el proceso para que mi trabajo sea más fácil. Por lo tanto, hice un editor usando HTML5 y JavaScript desde cero, que tardó dos años y medio en funcionar con éxito. Actualmente lo uso para escribir mis códigos HTML, JavaScript, CSS y funciona bien para todos los propósitos de prueba y desarrollo en tiempo real y de manera eficiente.

Recientemente, en 2015, llevé todo el programa en línea aquí pensando que podría ayudar a los estudiantes o principiantes que quieran codificar. Aquí está el enlace

VKC CodeBuilder HTML5 y JavaScript Simulador de código en tiempo real v2.0 por Vivek Choubey

Es la segunda versión del programa original allí. Funciona bien en el escritorio en lugar de en el teléfono móvil debido a algunas características que requieren pulsaciones de teclas especiales y problemas relacionados con la interfaz de usuario.

Estas son algunas de sus capturas de pantalla y videos que funcionan.

Por favor, revíselo o deje su sugerencia / comentario en el sitio (desplazándose hacia abajo) o aquí: VKCCodeBldr Live Feedback box

Gracias.

La mayoría de las respuestas aquí avergüenzan mis logros, como descargo de responsabilidad, solo tengo 20 años. Tampoco soy programador, así que si puedes, discúlpame. ¡Aquí va! He creado lo siguiente:

  • Un solucionador de problemas de n cuerpos con gráficos.
  • Una impresora y animador fractal

El primero es mi favorito porque siempre he querido simular sistemas solares y similares. También fue el primer proyecto que, en cierto sentido, completé. Esto fue cuando tenía 19 años.

Fue escrito en Java usando la biblioteca estándar. Fue un programa bastante grande. Puede agregar objetos, guardar la simulación, abrirla más tarde, etc., como un programa real.

Esencialmente, lo que hice fue un vector de objetos espaciales que tenían una ubicación, tamaño, densidad, masa, temperatura, etc. Luego hice que cada objeto interactúe con los demás. Luego creé la interfaz de usuario, incluido el panel de gráficos, que dibujó los objetos en función de sus ubicaciones.

El resultado final fue más o menos lo que ves aquí. Puede ver que los objetos interactúan gravitacionalmente entre sí, colisionando, fusionándose y siendo arrancados desde la pantalla. También podría generar, con una semilla aleatoria, un grupo de objetos con muchos parámetros, como desviación de masa, aleatoriedad de ubicación inicial, etc.

Tuve que enfrentar muchos problemas que nunca había enfrentado antes como estudiante, incluida la ejecución de múltiples subprocesos (gráficos y cálculos), desbordamientos de cálculo (cuando los objetos se acercaron tanto que las fuerzas se vuelven demasiado grandes para que la computadora pueda manejar) y la sincronización ( en caso de colisión, los objetos se eliminaban y otro objeto se colocaba a velocidades según la conservación del momento).

Una parte de mí desea continuar con este proyecto, pulirlo (no es perfecto como se puede ver en el GIF) y agregar más capas de complejidad como estrellas, atmósferas, fragmentación y similares. ¡Mejores gráficos también son algo que me gustaría hacer!

El segundo es más reciente y bastante más simple. Fue escrito en C ++ y la representación se realizó en Python usando matplotlib (¡MATLAB para la victoria!).

No me enfrenté a nada extremo para hacer esto, y lo construí en casi un día, pero realmente podría ser mejor. Es bastante lento y la paleta de colores (generada usando solo un número, los colores son Hue-Sat-Val) es horrible, pero todavía me encanta la animación que produjo. ¡Realmente muestra la belleza del mundo de los fractales!

Desearía poder crear una animación de mayor resolución, pero seguí enfrentando un error bad_alloc que todavía no tengo idea de cómo apareció. Además fue el período de examen! ¡Qué asco!

Un comentario sobre el gif, la leyenda de los ejes solo cuenta los píxeles, no es ningún valor significativo.

¡Gracias por leer!

Lo mejor que he construido como programador es un lenguaje de programación.

Es un lenguaje simple que comencé hace unos 3 meses en mi cumpleaños número 17 como un desafío para mí como un joven programador para subir de nivel mis habilidades.

Actualmente, el lenguaje tiene una sintaxis simple como declaraciones de variables y declaraciones if con funciones básicas integradas como print. Así es como se ve actualmente:

Si desea ver el código de su idioma que estoy haciendo, puede consultar mi repositorio de Github:

RyanMaugin / Tachyon

También estoy trabajando en un tutorial que publicaré en mi youtube en un mes una vez que termine y que enseñe a las personas a crear un lenguaje de programación de alto nivel en Python de principio a fin Bufferscope.

Este es uno de mis mejores proyectos porque a las personas les resulta difícil comprender cómo se hacen los lenguajes de programación y simplemente piensan que es mágico a menos que tengan un conocimiento profundo de los compiladores, por lo que me hace ver como un mago. También es genial porque tengo 17 años y emprendí esta gigantesca tarea como un desafío divertido y logré hacerlo.

La razón principal por la que hice este lenguaje es para demostrarles a las personas más jóvenes que están comenzando la programación que pueden hacer cosas que creen que son imposibles y no dejar que la edad o la experiencia te definan, lo cual es otro factor interesante.

Para empezar, también comencé una serie de YouTube sobre cómo enseñar a otros cómo hacer un lenguaje de programación de alto nivel en Python.

Hacer un lenguaje de programación en Python – YouTube

Entonces, si está interesado en crear su propio lenguaje de programación genial, ahora puede hacerlo.

Creé un robot de seguimiento de rostros y un dispositivo de control de gestos con un hardware mínimo.

Fue cuando aprendí a crear pequeñas aplicaciones de Android usando Processing e imprimir en 3D mis propios diseños. Así que decidí construir un proyecto que pudiera combinar Arduino, procesamiento e impresión 3D, por lo que terminé en este proyecto.

Robot de detección y seguimiento de rostros en tiempo real usando Arduino

Como puede ver en la imagen, la aplicación de Android funciona en un teléfono móvil y, por lo tanto, no necesitamos ninguna cámara especial para hacer esto.

Una vez que se detecta la cara, la información de su posición se envía al Arduino a través del Bluetooth del teléfono, que luego controlará el brazo robótico impreso en 3D para colocar el teléfono de tal manera que la cara llegue al centro de la pantalla. De esta manera, se puede rastrear la cara dentro del marco.

También he documentado este proyecto aquí.

Robot de detección y seguimiento de rostros en tiempo real usando Arduino

Si quieres ver este proyecto en acción, el video se muestra a continuación.

Proyecto de realidad virtual con Arduino y procesamiento

Para la mayoría de nosotros, la película Iron man de Jon Favreau siempre ha sido una inspiración para construir cosas nuevas que harán nuestra vida más fácil y divertida. Personalmente he admirado a los técnicos que se muestran en la película y siempre he querido construir algo similar a eso. Entonces, en este proyecto, he tratado de imitar las cosas de realidad virtual que suceden en la película, como si simplemente pudiéramos mover la mano frente a la computadora y mover el puntero a la ubicación deseada y realizar algunas tareas.

Si está interesado en ver esto en acción, el siguiente video podría ayudarlo

Gracias

Aswinth Raj

No hice esto solo, había tres de nosotros involucrados, y mi nombre no está en el archivo fuente; de hecho, Derek Smithies escribió la mayor parte del código y yo hice los cálculos. Pero es una historia genial.

Entonces, en los primeros días de WiFi no funcionaba tan bien como se podría esperar de la intensidad de la señal y los niveles de interferencia, y nos preguntamos por qué; ya que en el momento en que construíamos un producto de red de malla inalámbrica, esto importaba.

Descubrimos que los transmisores WiFi estaban seleccionando casi la peor configuración de modulación posible, y decidimos que podíamos hacerlo mejor. El resultado fue un algoritmo llamado Minstrel, que hoy vive en un archivo llamado rc80211_minstrel.c en el kernel de Linux.

En 2005, más o menos, Minstrel duplicó con creces el rango de dispositivos WiFi sin ningún cambio de hardware y redujo el consumo de energía al mismo tiempo. Lo lanzamos de código abierto, y se recogió con entusiasmo, se transfirió a otros controladores, se incluyó en el núcleo de la línea principal y luego se configuró el hardware predeterminado que podría admitirlo.

Hoy se ejecuta en miles de millones de dispositivos, no tengo forma de obtener una estimación confiable de cuántos. Las dos líneas principales de código para las que hice los cálculos se ejecutaron probablemente cien mil millones de veces por segundo, cada segundo, y lo he hecho desde al menos 2007, si no antes. Esencialmente, si ejecuta Linux y tiene WiFi, no es un teléfono Android, y el Wifi funciona, hay una posibilidad bastante decente de que el código esté involucrado.

Aún más genial, matemáticamente ese código resuelve un problema de bandidos con múltiples brazos usando una técnica que solo se demostró que funcionaba en 2015, y descubrimos empíricamente diez años antes.

Bueno, como soy un estudiante de licenciatura en Ciencias de la Computación, tengo algunos proyectos que tengo que hacer solo. Actualmente tengo 19 años (cuando escribo esta respuesta) y algunos proyectos se remontan a 2 años (entonces, 17 años). Aquí están algunos de los proyectos.

Línea de comando

Este no es un proyecto escolar. Estaba interesado en el sistema operativo cuando encontré una pregunta sobre Quora (veré si puedo encontrar la pregunta y vincularla aquí) sobre un niño de 13 años que hace un sistema operativo desde cero. Obtuvo la línea de comando funcionando pero aún no puede enviar argumentos de línea de comando al programa. Entonces, vi la oportunidad de ejercer mis habilidades de programación en C (actualmente en el primer semestre de mi programa de licenciatura) y decidí codificar el argumento de la línea de comando para el sistema operativo.

Inteligencia artificial

No solo una IA, sino 3 en el mismo mes. Uno de ellos es un desafío de mi superior. El primero es un solucionador de N-Queen. El solucionador mostrará toda la solución posible de la reina dada. El segundo es un solucionador de rompecabezas deslizante 3 × 3.

Se ve algo así. El último, un desafío de mi superior, una IA de tres en raya que siempre gana (o empata) y nunca pierde un partido.

Sistema de tickets electrónicos

Este proyecto no es para la escuela, sino para el evento de mi amigo. El evento requiere boletos físicos pero también sirven para compras electrónicas. En el día del evento, el boleto electrónico se intercambiará con el boleto físico. Necesito hacer el sistema de back-end y el sistema de front-end. El sistema de fondo requiere la capacidad de comprar, confirmar el boleto pagado y verificar el boleto electrónico para cambiarlo por el boleto físico. El sistema front-end requiere escaneo de códigos QR y E / S de datos rápidos. Además, la seguridad es una preocupación. Este sistema aún se está desarrollando y se agregarán características más avanzadas, como el flujo de datos en tiempo real. Haciendo posible que el departamento de venta de entradas para mi evento vea datos en vivo cuando alguien compró una entrada.

Sistema de back-end del foro

Este es un proyecto de escuela secundaria con mi amigo (el mismo amigo que me pide que haga el sistema de boletos electrónicos). Estoy inscrito en esta clase donde el proyecto final es hacer un foro en línea. He estado interesado en hacer ese sistema, pero no he encontrado el momento adecuado (excusa) para hacerlo. Entonces, cuando la maestra nos dijo que hiciéramos un foro, encontré el tiempo (y la excusa) para hacerlo.

Sistema de chat en vivo

Este es un verdadero desafío. Todavía contiene algunos errores (reaparecieron una vez que fusioné el módulo de chat con el sitio web) que se solucionarán pronto. También tengo ganas de hacer este proyecto durante los últimos 3 meses (antes de que un amigo me pida que haga este sistema). Entonces, la planificación de este sistema ya está en camino. 3 meses antes para ser exactos.

Reproductor de música

Este es el resultado de mucho tiempo libre (vacaciones de verano) y aburrimiento. Me preguntaba qué es lo más poco realista que puedo hacer con JavaScript. Entonces, decidí hacer un reproductor de música (porque sonaba fácil) con solo JavaScript, HTML5 y CSS con Electron framework (hasta donde puedo recordar, no utilicé la etiqueta de audio o video de HTML5). Tiene la función básica de un reproductor de audio con una función adicional de un visualizador y un ecualizador simple.

Probablemente hay algunos proyectos más que no he enumerado. Pero estos son mis proyectos favoritos y probablemente mi logro más loco.

Escribí un pequeño “SO” en hexadecimal.

Se llama Test OS, y el BIOS debe ejecutarlo desde un disquete. El BIOS cargaría el primer sector del disco (primeros 512 bytes) en la dirección 0x7C00, y el código se ejecuta desde allí.

Principalmente es un proyecto de aprendizaje, nada útil. Lo más que puede hacer es leer los caracteres e imprimirlos en la pantalla como un aviso, mientras los almacena en un búfer a 0x0500. Si fuera más lejos, podría haber utilizado este indicador para habilitar algunos comandos, como saltar a una dirección, escribir en una dirección y combinarlos para formar un simple “ensamblador” que puede ejecutar desde el arranque. ¡Ah, y se detiene al presionar “Ctrl-Q”! (Sorprendente cómo los logros pueden ser tan pequeños cuando se codifica en un nivel tan bajo).

Como solo tenía 512 bytes para trabajar, tuve que usar el ensamblado. Pero luego pensé “oye, ¿por qué no hacer todo lo posible?” Y se convirtió en hexadecimal en su lugar. El (pseudo-) ensamblaje todavía está allí en un archivo TXT, pero solo como comentarios. El código real está dentro del archivo .bin que utilicé un editor hexadecimal para editar.

Tardaron más de 2 semanas en terminar, con muchas referencias a la documentación de Intel. Y déjame decirte que la arquitectura x86 es muy, muy loca. Todavía no tengo idea de cómo lo hice funcionar, pero lo hizo. Eso probablemente también significa que no podría mejorarlo con demasiada facilidad, pero bueno, es genial.

También inventé una forma de guardar bytes al concatenar cadenas

Al desarrollar Test OS, noté que a veces las frases se reutilizan, como “Inicializado” e “Inicializando”. Los separé en 3 cadenas, “Initializ”, “ing” y “ed”. Sin embargo, esto requirió múltiples llamadas a la función de impresión de cadenas que no solo disminuyeron el rendimiento sino que también usaron más bytes en la parte del código que llama. Las cadenas de mi programa tenían terminación nula, por lo que hice que la función de impresión reconociera el byte 0xFF en las cadenas, ya que no se usaba en ASCII estándar. Lo llamé el “puente”. Cuando ve esto, comprueba el siguiente byte (que denominé “byte de puente”), que era la dirección del inicio de la siguiente cadena en relación con el byte de puente. Luego imprimiría la siguiente cadena, y así sucesivamente, hasta que vea un terminador nulo.

Calculé que me ahorró unos 8 bytes en este caso. Probablemente podría usarse para la concatenación sin un búfer adicional, solo cadenas que hacen referencia entre sí y cambian el byte del puente cuando sea necesario. Tengo que analizar esa idea más adelante.

Relacionado

Juego de adivinanzas en x86 Assembly: un programa Linux x86 en Assembly. De lo que estoy orgulloso es de que implementé mis propias funciones atoi e itoa y un generador de números aleatorios. El RNG funciona leyendo un byte de / dev / random, luego usando un módulo para ponerlo en el rango 1–100.

Al no usar ninguna biblioteca externa y codificación en ensamblado puro, el binario completo tenía solo 3.2kB , mientras que el equivalente en C es 9kB con enlace dinámico y 914.3kB con enlace estático.

Hello World sin biblioteca estándar: se utilizó algo de ensamblaje para crear Hello World en C sin importar nada.

Brainfuck Compiler: Un trabajo en progreso. Compila Brainfuck a NASM x86 Asamblea, objeto o formato ejecutable.

Space Cubes: Solo algo para demostrar que no hago todo en la Asamblea. Es un clon de Minecraft muy simple que usa LWJGL, escrito cuando tenía 14 años. Incluye carga de fragmentos, guardado, eliminación y algunas sombras, complementos y física muy simples.

Editar: ¡Muchas gracias por su aliento, muchachos! Realmente me ha hecho pasar estos pocos días, y me doy cuenta de que todavía tengo mucho que aprender. Edité la respuesta para incluir una captura de pantalla simulada del entorno de desarrollo de TestOS (perdí el original hace unos meses) ya que la respuesta es sobre TestOS, no Space Cubes.

Reconocimiento de patrones de mecanografía usando la dinámica Keystroke:

Ha pasado un año desde que creé esto solo por curiosidad, lo que resultó ser muy útil.

¿Qué es el reconocimiento de patrones de escritura?

Para autenticar al usuario en función de sus muestras de mecanografía, es necesario averiguar el parecido de las muestras de mecanografía de un usuario, independientemente del texto escrito. La sincronización de eventos clave se extrae de las características clave Latencia, Tiempo de permanencia, Intervalo de teclas, Hasta, Tiempo de vuelo, etc.

¿Qué es la dinámica de golpe de teclado?

La biométrica conductual de Keystroke Dynamics utiliza la manera y el ritmo en que un individuo escribe caracteres en un teclado o teclado.

Los ritmos de pulsación de teclas de un usuario se miden para desarrollar una plantilla biométrica única del patrón de escritura del usuario para la autenticación futura.

Las mediciones sin procesar disponibles de casi todos los teclados se pueden grabar para determinar el tiempo de permanencia (el tiempo que se presiona una tecla) y el tiempo de vuelo (el tiempo entre “tecla arriba” y la siguiente “tecla abajo”). Los datos de sincronización de pulsaciones de teclas grabados se procesan a través de un algoritmo neuronal único, que determina un patrón primario para futuras comparaciones.

De manera similar, la información de vibración puede usarse para crear un patrón para uso futuro tanto en tareas de identificación como de autenticación.

Los datos necesarios para analizar la dinámica de pulsación de tecla se obtienen mediante el registro de pulsación de tecla. Normalmente, todo lo que se retiene al registrar una sesión de escritura es la secuencia de caracteres correspondiente al orden en que se presionaron las teclas y se descarta la información de temporización. Al leer el correo electrónico, el receptor no puede distinguir al leer la frase “¡Vi 3 cebras!” ya sea:

  • que se tipeó rápida o lentamente
  • el remitente usó la tecla Mayús izquierda, la tecla Mayús derecha o la tecla Mayús para hacer que la “i” se convierta en una letra “I” en mayúscula
  • todas las letras se escribieron al mismo ritmo, o si hubo una pausa larga antes de la letra “z” o el número “3” mientras buscaba esa clave
  • el remitente escribió mal cualquier letra inicialmente y luego regresó y la corrigió, o si la recibió correctamente la primera vez

Hay pocos proyectos más que he hecho solo como profesional independiente y algunos proyectos personales. Pero esto se mantiene alto!

Procesos automatizados de encriptación One-Time-Pad para el USG.

One-Time-Pad sigue siendo la forma más segura de cifrado, siempre que la clave de cifrado sea conocida solo por el remitente y el destinatario y nunca se reutilice.

En 1979, muy temprano en las computadoras de escritorio “básicas”, jugué con la automatización del cifrado One-Time-Pad.

Yo era un joven oficial de telecomunicaciones, operador de radio morse / teletipo y encriptador / procesador de una sola vez dentro de la CIA. Mirando hacia atrás desde 2017, uno no podría ser más básico en el arte de las comunicaciones seguras.

La aplicación: en 16K, utilizando BASIC, diseñé una aplicación X / OR que eliminó en gran medida el error humano en la creación de mensajes cifrados de One-Time-Pad. La aplicación vino en múltiples sabores, dependiendo del tipo de clave y protocolos de mensaje. Una vez que la NSA (proveedores criptográficos para el USG) proporcionó la clave en forma magnética, el único error humano podría aparecer en el texto sin formato que podría verificarse fácilmente.

Alfa One-Time-Pad : cinco grupos de letras, usando Vigenere Tableau, donde dos caracteres alfabéticos: Texto criptográfico – Texto sin formato = Texto cifrado

Teclado numérico de una sola vez : cinco grupos de números, el texto sin formato se transcribe en texto numérico utilizando dos dígitos para cada letra del alfabeto: A = 01, B = 02, … Z = 26. Luego, el texto sin formato se coloca debajo del texto clave y se utiliza una resta falsa (se supone que el que se lleva en la resta, y no se toma de la siguiente columna) se crea el texto clave. Número de texto cifrado – Número de texto sin formato – Número de texto cifrado

Utilidad / Longevidad: Cuán útil fue la aplicación. Se usó durante más de 19 años, se actualizó solo ligeramente a medida que avanzó el tiempo y la tecnología.

¿Cuáles fueron las consecuencias del mundo real? Mensajes encriptados de una sola vez en gran medida libres de errores, y en el segundo año de uso, la reducción del personal dentro del equipo de encriptación de una sola vez. Ya no eran necesarios esos encriptadores manuales y procesadores de mensajes altamente calificados, sino que habían sido reemplazados por un programa BASIC.

¿Se sigue utilizando la tecnología?

Por diversión, es posible que desee ver este artículo de la BBC sobre estaciones de números y escuchar los grupos numéricos de cinco letras o cinco dígitos que se transmiten hoy.

El espeluznante mundo de las ‘estaciones de números’ – BBC Mundo


Mesa Vigenere:

Reverso de la tarjeta de entrenamiento:

Wow, esta es una pregunta divertida. He estado programando 35 años y siento que podría escribir un libro sobre todas las cosas interesantes que he hecho. Usted pregunta específicamente sobre cosas escritas usted mismo. Finalmente, la mayor parte del código que escribo termina en manos de un equipo. A menudo hago el trabajo de tecnología emergente y construyo prototipos funcionales y luego trabajo con mi equipo (u otro equipo) para producirlo. Al principio de mi carrera escribí una gran cantidad de código que se envió en producción (consulte la biblioteca TSR intercambiable a continuación).

Quédate conmigo, te prometo que son interesantes …

Una de las mejores cosas que hice fue mucho antes de tener un equipo, trabajar en Symantec o convertirme en CTO de startups. Solo era un chico universitario con un Commodore 64. También tocaba la guitarra y cantaba en bandas de rock / punk. Era el año 1982. Todavía no había cumplido 20. Hubo discusiones sobre si el rock orientado a la guitarra viviría o moriría. Muchos argumentaron que la música electrónica aplastaba el sonido del rock clásico. En el fondo, sabía que esto era tanto verdadero como falso. Habría un aumento de nuevos géneros y nuevas tecnologías para hacer música, pero el rock and roll nunca moriría. Hay algo primordial en una guitarra eléctrica conectada a un amplificador de válvulas overdriven. Parte de mi schtick atrás era ser contraria. Entonces, como la mayoría de mis amigos estaban en el campo de “guitarras para siempre”, decidí en secreto hacer algo impactante.

No tenía entrenamiento formal como programador. Pero yo era un experimentador geek y leí publicaciones y me uní a las primeras comunidades de programación en línea usando un módem. También leí los libros de texto de matemáticas y ciencias de mi padre sin ninguna razón en particular. Tenía una comprensión básica de álgebra, geometría, cálculo, física … Mientras hacía algo de programación relacionada con la clase de cálculo de honores universitarios, terminé introduciendo valores de entrada en ecuaciones y las reproduje a través del sistema de audio Commodores (Dispositivo de interfaz de sonido MOS). Descubrí que, dependiendo de la fórmula, la salida podría ser bastante musical e interesante. Tomando un poco de teoría musical, entendí que engordaba el sonido con notas en movimiento y un sentido del ritmo. Una noche tuve un concierto. La gente esperaba verme con una guitarra cubriendo canciones de Choque o algo así. En su lugar, iluminé el foco de una pequeña mesa con el comodoro 64. Me acerqué, me incliné ante la multitud y presioné la barra espaciadora. Dejé el escenario. Durante la siguiente hora, la pequeña computadora reprodujo música electrónica generada a través de la ecuación con un poco de ayuda de los conjuntos de valores de entrada. La mitad de la audiencia abucheó y la otra mitad me proclamó un genio y visionario. No creo que haya vuelto a ejecutar el código después de esa noche, pero en mi opinión aclaraba algunos pensamientos y estrategias. Por un lado, tenía que llevar mi trasero a California, donde estaba cayendo la verdadera mierda.

En 1984 llegué a California. Aunque no está directamente relacionado con esta pregunta, esto me sucedió poco después de llegar a California. Unos años más tarde me mudé al norte de Los Ángeles a Silicon Valley y me uní al proveedor de herramientas de programación boutique TurboPower Software. En TurboPower Software creé una biblioteca comercial para crear ventanas emergentes (Terminar y permanecer residente o TSR) para DOS. A diferencia de otras bibliotecas, la mía tomó solo 6kb de RAM porque era un pequeño cargador de lenguaje ensamblador que al invocar la tecla de acceso rápido salvó el estado del sistema operativo y la aplicación en primer plano al cambiar al disco e intercambiar el código del programador. Se escribieron muchos programas comerciales útiles y exitosos utilizando esa pequeña lib. He hablado de este código en otras respuestas de Quora.

No mucho después de eso, estaba trabajando en cosas geniales en Symantec. Frustrado con la respuesta a mis ideas sobre cómo mejorar dramáticamente la experiencia del usuario, ahorrar costos de soporte y proporcionar una forma infalible de distribuir actualizaciones de software, me quedé despierto toda la noche y preparé un prototipo de la herramienta ahora conocida como LiveUpdate. Se lo mostré al CEO a la mañana siguiente usando una vieja computadora portátil Toshiba en mi casa en una línea T1 como servidor. 3 meses después, la característica se envió en Norton AntiVirus 2.0 para Windows y sigue siendo una característica de marca en la línea de productos Symantec / Norton. Tengo una patente emitida directamente relacionada con ese sistema. Ver cómo funcionan sus ideas y hacer que millones y millones de personas usen su código es emocionante.

Después de eso comencé a cofundir o unirme a nuevas empresas en etapa temprana. Fui CTO de un pionero de radio por Internet líder. Tenía un equipo trabajando en la mayoría de las tareas de desarrollo que estaban bien definidas. Pero necesitaba una forma de inyectar metadatos en la transmisión de audio para que nuestros reproductores basados ​​en Internet pudieran mostrar información útil y tener llamadas a la acción en vivo sincronizadas con una canción, un DJ o un anuncio. Nadie más en la industria realmente tenía esta capacidad todavía, así que estaba reflexionando, teorizando y experimentando sobre cómo hacerlo en mi rol como CTO. Había diseñado la cadena de codificación que utilizamos y también había seleccionado manualmente los sistemas de programación de audio. Volé a Nueva York para trabajar con el proveedor del sistema de programación, Dalet, para exponerme una forma de generar eventos desde su sistema a través del puerto serie y usarlo para inyectar mis datos en tiempo real sincronizado a medida que la música salía de El proceso de codificación. Funcionó mágicamente y terminó alimentando las primeras estaciones de Lycos Radio, Earthlink Radio, About.com Radio, Scour Radio y muchas otras.

Literalmente podría seguir toda la noche. Trabajar en tecnología emergente es una aventura sin parar para mí. Soy tenaz y ferozmente independiente, pero también soy un jugador de equipo total. Como resultado, encuentro la oportunidad de tener un gran impacto casi a diario en mi trabajo. En estos días he estado trabajando en Jibo, creadores de un robot social, por más de 4.5 años. No hablo en detalle sobre la tecnología que yo u otras personas escribimos en Jibo, ya que nos gusta ser un poco reservados. Mi enfoque durante parte de mi tiempo estuvo relacionado con la seguridad y la privacidad y el establecimiento de la infraestructura de la nube. Pero también escribí código incrustado, código de fabricación, sistemas comerciales … Fui el séptimo empleado. Es increíblemente desafiante, emocionante y profundamente gratificante.

Me encantaría pasar más horas hablando de las buenas oportunidades que he tenido. Pero, en cambio, cerraré con lo que espero sea una nota inspiradora. Todos los días, cada uno de nosotros escucha y ve cosas que necesitan arreglarse. O tenemos ideas que podrían cambiar el mundo de alguna manera positiva. O quizás podamos mejorar nuestra propia vida o la de nuestra familia. Tienes que aprovechar esas oportunidades. Nadie te dará la oportunidad. Tienes que descubrirlo, innovar y entregar. Si lo buscas, lo encontrarás. Fallarás a veces. Quizás incluso la mayor parte del tiempo. Pero si eres como yo, la posibilidad de ganar de vez en cuando supera con creces el riesgo de fallar a veces. Algunas personas me escuchan decir esto y me dicen que es una mierda. Te aseguro que no es. Lea algunas de mis otras publicaciones, como trabajar en una tienda de computadoras en Beverly Hills, hacer lo correcto por un cliente y obtener acceso a la industria del cine y la música. Debes tener los ojos abiertos y buscar constantemente las oportunidades y saltar sobre ellas. Veamos, olvidé mencionar algunas de las bibliotecas de clase ganadoras de Jolt Cola a fines de los años 80 / principios de los 90, un juego de fútbol multijugador en línea en Internet en la era 2009, sitios de Internet que pudieron enfrentar y leer la construcción de emociones con mis compañeros de equipo, siendo pioneros bibliotecas y ejemplos de programación de datagramas y sockets que permitieron una explosión en tecnologías emergentes como el chat y la programación cliente / servidor en la década de 1980. Todos los días es una nueva oportunidad. Ojalá pudiera decirte en qué estoy trabajando ahora. ¡No se preocupe, lo hará pronto en su casa si todo sale bien!

Mi mayor proyecto de todos los tiempos fue un sitio web. Pero no cualquier sitio web.

Para aquellos que no saben, Chrome OS es un sistema operativo que ejecuta el navegador Chrome y casi nada más, además de las extensiones de Chrome Webstore.

Esto hace que el escritorio se sienta bastante desnudo para mí, especialmente teniendo en cuenta que cualquier herramienta básica que instales (editor de texto, por ejemplo) se sincroniza con cualquier otro dispositivo en el que no necesariamente lo necesites.

Esto me hizo pensar: ¿qué pasaría si tuviéramos nuestro propio escritorio persistente en la nube, compatible con cualquier navegador web, con todos sus datos accesibles al instante?

Os presento AaronOS.

Cargando aOS Beta …

(Los enlaces anteriores a la versión beta: la versión actualizada activamente)

AaronOS es un escritorio personalizado que vive únicamente en la nube. Toda la información y las configuraciones almacenadas se pueden cargar en otra computadora, simplemente a través de su navegador web. La mayoría de los navegadores modernos funcionan, pero Chrome funciona mejor.

Así es como se ve mi escritorio personal:

AOS ha sufrido recientemente un importante rediseño: todos los íconos de las aplicaciones se rehicieron y el estilo de las ventanas también cambió ligeramente.

He estado trabajando solo en aOS desde el comienzo de mi primer año de escuela secundaria: me gradué en el último año hace aproximadamente un mes. Recientemente, algunas personas han dado recursos como iconos y otros para el sistema operativo, y he hecho muchos buenos amigos a través de él.

Incluso hay un servicio de mensajería en el que puedes chatear con todos los usuarios del sistema operativo a la vez, como un chat grupal público. ¡Me encanta recibir sugerencias y cosas así!

Obviamente, aún no está terminado, ¡y todavía queda mucho trabajo por hacer! Aún no hemos llegado a la versión Beta 1.0: no he terminado con la gran función beta que pronto etiquetará a la versión Beta 1.0.

Incluso después de su lanzamiento “oficial”, aún puedo trabajar en él para siempre.

Los usuarios incluso pueden crear su propio contenido para el sistema operativo: hay varias aplicaciones que los ayudan a hacerlo.

Para crear sus propias aplicaciones, he incluido un App Maker que permite a los usuarios crear e instalar aplicaciones que escriben por su cuenta.

Para las personas que aman tener el 100% de control sobre la apariencia de su sistema, he incluido un editor de hojas de estilo. Dado que la interfaz de usuario del sistema operativo es HTML y CSS puro, esto significa que cada parte de la interfaz de usuario se puede personalizar al contenido de su corazón.

¡Incluso he escrito recientemente una aplicación que te permite convertir temas de Linux GTK3 en temas compatibles con AaronOS! Mint-Y-Dark es mi tema favorito para convertir, y funciona mejor con los que he probado. Arc-Dark también funciona bastante bien. Estos temas GTK convertidos se pueden copiar en el Editor de estilos mencionado anteriormente para aplicarlos a aOS.

Para cualquiera que busque el código fuente, puede mirar lo siguiente:

view-source: la página principal para HTML.

Visita https: // aaron-os-mineandcraft12 ….

Visita https: // aaron-os-mineandcraft12 ….

Estos tres archivos constituyen el 95% del código fuente.

Me he divertido mucho desarrollando aOS, y tengo la intención de seguir actualizándolo regularmente durante el mayor tiempo posible.

Aquí están todos los enlaces relacionados:

AaronOS Alpha: Cargando aOS Alpha …

AaronOS Beta: Cargando aOS Beta …

Y la versión sobreviviente más antigua de aOS: AaronOS V0.9

Espero que AaronOS sea un testimonio del hecho de que, con computadoras y determinación, puedes hacer casi todo lo que quieras a través de la programación. En la mayoría de los casos, si puedes imaginarlo, puedes hacerlo.

Editar: si no respondo a su comentario de inmediato, es porque Quora parece haber dejado de notificarme por completo. ¡No te preocupes, llegaré a cada uno y responderé lo que pueda!

Me uní a Cisco en el área de la bahía recién salida de la escuela de posgrado para trabajar en un grupo de enrutamiento y conmutación empresarial. La mayor parte del trabajo de desarrollo se realizó en C / C ++ en diferentes versiones de su base de código IOS (no la de Apple … destinada a equipos de redes), con decenas de millones de líneas de código.

Una de las cosas discordantes acerca de trabajar en Cisco inicialmente fue que vim era algo que tenía que aprender, y tags / cscope era la forma principal de navegar por la base de código. Estaba acostumbrado a desarrollar en eclipse, por lo que la interfaz de terminal para vim / cscope fue difícil de tragar (pero sabe bien una vez que superas la curva de aprendizaje). Más allá de eso, aprender y navegar por bases de código grandes es algo con lo que siempre he luchado, así que decidí dadas estas dificultades para crear una interfaz web para cscope que vendiera fácilmente todas las millones de líneas de código de Cisco en un navegador. Afortunadamente, era un nuevo empleado, y amplié el jugo de “todo es posible” de la escuela de posgrado.

Después de unas semanas de retoques y creación de prototipos por mi cuenta, me di cuenta de que mucho de lo que estaba imaginando era posible. Como este no era mi trabajo diario y estaba trabajando solo, gran parte del trabajo que realicé fue para no tener que participar activamente en el mantenimiento. También me centré en hacer que la experiencia de UI sea excelente (mucho mejor que las herramientas existentes como omnigrok). Utilicé la herramienta ampliamente para mi trabajo diario mientras estaba desarrollando, por lo que cada vez que necesitaba una nueva característica la codificaría rápidamente. La interfaz era un cuadro de búsqueda simple en la parte superior donde podía ingresar funciones, símbolos, nombres de archivos o cadenas para buscar en una rama específica, y cada vista era muy contextual. Por ejemplo, la vista de funciones le daría código para una función junto con enlaces a funciones llamadas por, y llamando … La vista de archivos mostró errores recientes vinculados a un archivo, otros nombres de archivos similares en otros directorios, etc.

Después de limpiarlo, lo liberé internamente y para mi decepción enfrenté resistencia por razones no técnicas. Resumió a no ser el status quo … la gente no podía comprender la necesidad de una herramienta en la que pudiera ver el código en una interfaz de usuario cuando ya existían herramientas como vim y cscope. A pesar de esto, continué trabajando en ello porque me fue útil y, en el transcurso de dos años, la herramienta se expandió a características como vistas de gráficos de llamadas en tiempo real y una mejor visualización del código. Cuando dejé Cisco estaba siendo utilizado por miles de desarrolladores, y una de las herramientas más utilizadas internamente.

Linus Torvalds fue entrevistado recientemente en Ted y habla sobre cómo desarrolló Linux y Git por necesidad. Eran proyectos auto motivados desarrollados solos y eventualmente abiertos. Trabajar en algo solo no siempre es algo malo … Me obligó a arrancar algo increíble y también ser más ingenioso en el proceso. Me quedé corto por no abrirlo debido al tiempo.

Un desafío importante que enfrentan la mayoría de los programadores es manejar los problemas relacionados con el saldo de existencias en un software de gestión de inventario o el saldo de cuentas en un software de contabilidad financiera.

Ejemplo:

Supongamos que hay un producto llamado “Artículo ABC”. Y a continuación se detallan las transacciones de compra y venta de este producto durante un período en particular.

Estas transacciones se guardarán en las tablas respectivas del software de gestión de inventario.

El propósito básico de registrar estas transacciones es obtener:

  1. Saldo de existencias como en cualquier fecha.
  2. Preparación del informe del estado contable.

Muchos desarrolladores de software mantienen una o dos tablas más en la base de datos que contienen las existencias por artículo. Estas tablas se actualizan después de cada transacción. De este modo, se puede obtener el saldo y el libro mayor en línea.

Pero como todos saben, mantener tales tablas adicionales para el stock crea un montón de problemas:

  1. En el caso de varios usuarios, la tabla o la base de datos pueden estar bloqueadas y no se puede realizar la actualización requerida. Lo que lleva a números incorrectos para el saldo de existencias.
  2. Si hay varias transacciones como “compra”, “venta”, “devolución de compra”, “devolución de venta”, “transferencias de existencias”, “bienes dañados”, etc., se convierte en un desafío importante actualizar estas tablas adicionales correctamente .
  3. En caso de modificaciones en las transacciones relacionadas con la fecha o la cantidad, las tablas adicionales mostrarán resultados incorrectos.
  4. Si se eliminan algunas transacciones anteriores, los saldos en las tablas adicionales saldrán mal.

Por lo tanto, crear tablas adicionales para el saldo de existencias o el saldo de la cuenta no es una buena idea.

Desarrollé consultas SQL de ” unión ” que manejan estos problemas de manera muy eficiente y siempre muestran el balance de existencias exacto y las declaraciones contables sin tener que depender de tablas adicionales.

El resultado de las consultas SQL de “unión” resultantes se ve así:

Además, estas consultas son de gran ayuda para varias validaciones en el programa que se requieren en cada etapa.

Como estas consultas SQL son “Unión” de consultas “Seleccionar”, se ejecutan en RAM y no requieren “Escribir” o “Actualizar” en el disco duro. Por lo tanto, la ejecución de informes y consultas del software se vuelve extremadamente eficiente y ahorra tiempo. El tiempo de respuesta del software mejora enormemente.

Fue sorprendente saber que la mayoría del software de contabilidad e inventario disponible en el mercado utiliza el viejo y tedioso sistema de “tablas adicionales” para saldos y libros de contabilidad en lugar de la “Unión Rana”.

Observé que pocos programadores hacen lo mismo incluso en algunas de las soluciones basadas en ERP.

La unión Rana evita muchos problemas no deseados y brinda eficiencia en las ejecuciones incluso si la base de datos es de gran tamaño.

Me encantó desarrollar esta metodología y siento que hasta ahora es lo mejor que he hecho solo como programador.