miércoles, 17 de septiembre de 2014

PHP + SQL

Holis les dejo aca una pequeña guia para los que quieran o esten empezando a programar en PHP o SQL. El link es de mediafire espero que les sirva el aporte...

PHP+SQL

domingo, 7 de septiembre de 2014

LENGUAJES DE PROGRAMACION

LENGUAJES DE PROGRAMACIÓN
Herramientas de Programación
Palabras clave. Usuario, programador, programación, lenguajes de programación, lenguaje maquina, lenguaje ensamblador, comando.
¿Qué es usuario? 
La interfaz de usuario es el medio con que el usuario puede comunicarse con una máquina, un equipo o una computadora, y comprende todos los puntos de contacto entre el usuario y el equipo, normalmente suelen ser fáciles de entender y fáciles de accionar.
Las interfaces básicas de usuario son aquellas que incluyen cosas como menús, ventanas, teclado, ratón, los beeps y algunos otros sonidos que la computadora hace, en general, todos aquellos canales por los cuales se permite la comunicación entre el ser humano y la computadora. La mejor interacción humano-máquina a través de una adecuada interfaz (Interfaz de Usuario), que le brinde tanto comodidad, como eficiencia.
¿Quién es el programador?
Un programador para el mundo de sistemas, es la persona que realiza desarrollo de software, o ejerce cualquier tipo de programación (valga la redundancia), es decir escribe sentencias que se ejecutan en un ordenador en un determinado lenguaje para cumplir tareas o actividades y obtener un resultado o producto. 
¿Que son los lenguajes de programación?
Las máquinas en general, y las computadoras en particular, necesitan de un lenguaje propio para poder interpretar las instrucciones que se les dan y para que nosotros podamos controlar su comportamiento. Ese lenguaje que permite esta relación con las computadoras es el lenguaje de programación (Basic, Java, JavaScript, ActionScript, Logo, etc.).
Asimismo, el lenguaje de programación está conformado por una serie de reglas sintácticas y semánticas que serán utilizadas por el programador y a través de las cuales creará un programa o subprograma. Por otra parte, las instrucciones que forman dicho programa son conocidas como código fuente.
Los lenguajes de programación pueden clasificarse de diversas manera, como por ejemplo según su nivel de abstracción: lenguaje de bajo nivel (es el código fuente de la máquina, es decir el que la máquina puede interpretar); lenguaje de nivel medio (un término entre el lenguaje de la máquina y el lenguaje natural) y lenguaje de alto nivel (los que están compuestos por elementos del lenguaje natural, es decir el humano, especialmente el inglés).
¿Cuáles son las principales características de los lenguajes de alto, medio y bajo nivel?
Lenguaje de bajo nivel.
Es el tipo de lenguaje que cualquier computadora es capaz de entender. 
Se dice que los programas escritos en forma de ceros y unos están en lenguaje de máquina, porque esa es la versión del programa que la computadora realmente lee y sigue.
Lenguaje de medio nivel
Es un lenguaje de programación informática como el lenguaje C, que se encuentran entre los lenguajes de alto nivel y los lenguajes de bajo nivel.
Suelen ser clasificados muchas veces de alto nivel, pero permiten ciertos manejos de bajo nivel. Son precisos para ciertas aplicaciones como la creación de sistemas operativos, ya que permiten un manejo abstracto (independiente de la máquina, a diferencia del ensamblador), pero sin perder mucho del poder y eficiencia que tienen los lenguajes de bajo nivel.
Una característica distintiva, por ejemplo, que convierte a C en un lenguaje de medio nivel y al Pascal en un lenguaje de alto nivel es que en el primero es posible manejar las letras como si fueran números (en Pascal no), y por el contrario en Pascal es posible concatenar las cadenas de caracteres con el operador suma y copiarlas con la asignación (en C es el usuario el responsable de llamar a las funciones correspondientes).
Una de las características más peculiares del lenguaje de programación C; es el uso de “apuntadores”, los cuales son muy útiles en la implementación de algoritmos como Listas ligadas, Tablas Hash y algoritmos de búsqueda y ordenamiento que para otros lenguajes de programación (como Java por ejemplo) les suele ser un poco más complicado implementar.
Lenguajes de alto nivel.
Son lenguajes de programación que se asemejan a las lenguas humanas usando palabras y frases fáciles de entender. · En un lenguaje de bajo nivel cada instrucción corresponde a una acción ejecutable por el ordenador, mientras que en los lenguajes de alto nivel una instrucción suele corresponder a varias acciones.
· Características de los lenguajes de alto nivel: Son independientes de la arquitectura física de la computadora. Permiten usar los mismos programas en computadoras de diferentes arquitecturas (portabilidad), y no es necesario conocer el hardware específico de la máquina. La ejecución de un programa en lenguaje de alto nivel, requiere de una traducción del mismo al lenguaje de la computadora donde va a ser ejecutado. Una sentencia en un lenguaje de alto nivel da lugar, al ser traducida, a varias instrucciones en lenguaje entendible por el computador. Utilizan notaciones cercanas a las usadas por las personas en un determinado ámbito. Se suelen incluir instrucciones potentes de uso frecuente que son ofrecidas por el lenguaje de programación. 
¿Cómo es el funcionamiento de un lenguaje interpretado (interprete)?
(Interpreted language). En programación, un lenguaje interpretado es un lenguaje de programación que necesita de un intérprete para implementar o ejecutar el código escrito en éste. Contrasta con los lenguajes compilados.  
En teoría, cualquier lenguaje de programación puede ser tanto interpretado como compilado; la distinción entre lenguajes interpretados y lenguajes compilados es puramente una cuestión de práctica y conveniencia, y no por propiedades inherentes al lenguaje. Dehecho, muchos lenguajes son implementados tanto por compiladores como por intérpretes (por ejemplo, Lisp, Basic, Python...). 
También existen lenguajes que se "pre- compilan" en un lenguaje intermedio (llamado bytecode) que luego debe ser interpretado o compilado para ejecutarse. 
Ventajas de los lenguajes interpretados 
* Flexibilidad frente a los lenguajes compilados.
 * Más facilidad para lograr independencia de plataformas (portabilidad).
* Tipado dinámico.
* Fácil debugging.
* Menor tamaño de programa. 
La principal, desventaja es que los programas interpretados suelen ejecutarse más lentamente. 
Algunos lenguajes usualmente interpretados 
* ASP
* BASIC
 * ECMAScript (ActionScript, DMDScript, E4X, Java Script, JScript).
 * Matemática: IDL, Maple, Mathematica, MATLAB
* Euphoria (interpretado o compilado).
* Inform
* Lisp, Scheme.
* Logo
* MUMPS (tradicionalmente interpretado, actualmente compilado).
 * Ruby
* Smalltalk.
* Lenguajes de scripts.
* Tcl. 
Lenguajes que suelen ser primero traducidos a un lenguaje intermedio, para luego ser interpretados o compilados: 
* Java
 * Lua
* Perl
 * PHP
* Pike
* Python
 * Visual FoxPro  
¿Cómo es el funcionamiento de un lenguaje compilado (compilador)? 
(compiled language). Un lenguaje compilado es un lenguaje de programación que suele necesitar de un compilador para ejecutar programas escritos en éste. Contrasta con los lenguajes interpretados. 
En teoría, cualquier lenguaje de programación puede ser tanto interpretado como compilado; la distinción entre lenguajes interpretados y lenguajes compilados es puramente una cuestión de práctica y conveniencia, y no por propiedades inherentes al lenguaje. De hecho, muchos lenguajes son implementados tanto por compiladores como por intérpretes (por ejemplo, Lisp, Basic, Python...). 
En otros casos, el código fuente de un programa es traducido a una forma intermedia (a menudo llamada bytecode), la cual luego debe ser interpretada o compilada para ejecutarse. 
Ventajas de los lenguajes compilados 
En general, un programa compilado suele ejecutarse mucho más rápido que el mismo interpretado.  Algunos lenguajes generalmente compilados :
* Ada                                                                   * Eiffel
* ALGOL                                                            * Fortran
* BASIC                                                              * Java
* C                                                                       * JOVIAL
* CLEO                                                                * Lush 
* COBOL                                                            * ML     
* Common Lisp                                                   * Pascal
* Delphi                                                               * Visual Basic
* Visual Foxpro                                                   * Visual Prolog
BASIC
Es un lenguaje de programación que originalmente fue desarrollado como una herramienta de enseñanza; se diseminó entre las microcomputadoras hogareñas a partir de la década de 1980. Actualmente continúa siendo muy popular, en muchos dialectos bastante distintos del original.
BASIC es el acrónimo de Beginners All- purpose Symbolic Instruction Code;[1] por correspondencia con Thomas E. Kurtz. (traducido al español: "código de instrucciones simbólicas de propósito general para principiantes") y está ligado al nombre de un trabajo sin publicar del coinventor del lenguaje, Thomas Kurtz[2] (el nombre no está relacionado con la serie de C. K. Ogden, Basic English).
El lenguaje BASIC fue inventado en 1964 por John George Kemeny (1926-1993) y Thomas Eugene Kurtz (1928-) en el Dartmouth College. En años subsiguientes, mientras que otros dialectos de BASIC aparecían, el BASIC original de Kemeny y Kurtz fue conocido como BASIC Dartmouth.
Los ocho principios que rigieron el diseño de BASIC fueron:
1. Ser fácil de usar para los principiantes.
2. Ser un lenguaje de propósito general (no orientado).
3. Permitir a los expertos añadir características avanzadas, conservando simple el lenguaje para los principiantes.
4. Ser interactivo.
5. Proveer mensajes de error, claros y amigables.
 6. Responder rápido en los programas pequeños.
7. No requerir un conocimiento del hardware de la computadora.
8. Proteger al usuario del sistema operativo.
Pascal
Es un lenguaje de programación desarrollado por el profesor suizo Niklaus Wirth a finales de los años 60. Su objetivo era crear un lenguaje que facilitara el aprendizaje de la programación a sus alumnos. Sin embargo con el tiempo su utilización excedió el ámbito académico para convertirse en una herramienta para la creación de aplicaciones de todo tipo.
Pascal se caracteriza por ser un lenguaje de programación estructurado fuertemente tipificado. Esto implica que: 
1. El código está dividido en porciones fácilmente legibles llamadas funciones o procedimientos. De esta forma Pascal facilita la utilización de la programación estructurada en oposición al antiguo estilo de programación monolítica.
 2. El tipo de dato de todas las variables debe ser declarado previamente para que su uso quede habilitado.
El nombre de Pascal fue escogido en honor al matemático Blaise Pascal.
El lenguaje de programación  C
Es un lenguaje conocido como de alto nivel.
Una de las características del lenguaje de programación en C, es que es un lenguaje estructurado, lo que permite generar código claro y sencillo, ya que está basado en la modularidad.
El lenguaje de programación en C, está estructurado en tres partes fundamentales, las cuales son, una librería estándar, un programa compilador y un preprocesador.
La librería estándar en el lenguaje de programación C, no es más que librerías realizadas en código objeto y puede haber sido realizada en otro lenguaje diferente que el C. Estas librerías se deben colocar el un programa de lenguaje programación en C , en la instrucción conocida como INCLUDE.
El programa compilador en el lenguaje de programación en C, es el que tiene como función traducir las instrucciones del programa fuente en C a el lenguaje conocido por las computadoras u ordenadores, el llamado lenguaje maquina. El programa compilador, depura y detecta los posibles errores en el lenguaje fuente, y es capaz de notificar el error ocurrido al programador, mediante un mensaje de texto.
En el lenguaje de programación en C, el preprocesador es un componente perteneciente propiamente al lenguaje C, el cual transforma el programa fuente traduciendo cada instrucción del programa fuente, de la siguiente forma: Elimina los comentarios colocados por el programador, incluye en el programa fuente el contenido de los archivos que se encuentran declarados en el INCLUDE, a estos archivos se le suele llamar cabeceras, y por último , sustituye los valores de las constantes declaradas en él define.
Por su flexibilidad y ser un lenguaje de alto nivel, es empleado por muchos programadores.
C++
Es un lenguaje de programación diseñado a mediados de los años 80 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido.
Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje multiparadigma.
Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT (enlace externo).
Una particularidad del C++ es la posibilidad de redefinir los operadores (sobrecarga de operadores), y de poder crear nuevos tipos que se comporten como tipos fundamentales.
C++ permite trabajar tanto a alto como a bajo nivel siendo muy óptimo.
El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C.
COBOL
 (COmmon Business Oriented Language, lenguaje común orientado a los negocios) fue desarrollado en 1959 por un comité de CODASYL (Conference on Data Systems Languages). A pesar del tiempo transcurrido, sigue siendo bastante usado en el ámbito de la gestión empresarial. Como es habitual en los lenguajes que perduran después de mucho tiempo ha sufrido distintas modificaciones de acuerdo con las nuevas tendencias.
COBOL es considerado un lenguaje de fácil aprendizaje. Los programas deben contener cuatro secciones: identificación, entorno, datos y procedimientos. Una herencia de sus lejanos orígenes es el uso de una convención basada en las columnas (por ejemplo, las sentencias deben estar entre las columnas 12 y 72), aunque versiones modernas pueden usarse de otra forma. 
Java
Es un lenguaje orientado a objeto, de una plataforma independiente. 
El lenguaje para la programación en Java, fue desarrollado por la compañía Sun Microsystems, con la idea original de usarlo para la creación de páginas WEB.
Esta programación Java tiene muchas similitudes con el lenguaje C y C++, así que si se tiene conocimiento de este lenguaje, el aprendizaje de la programación Java será de fácil comprensión por un programador que haya realizado programas en estos lenguajes.
Con la programación en Java, se pueden realizar distintos aplicativos, como son applets, que son aplicaciones especiales, que se ejecutan dentro de un navegador al ser cargada una pagina HTML en un servidor WEB, Por lo general los applets son programas pequeños y de propositos específicos.
Otra de las utilidades de la programación en Java es el desarrollo de aplicaciones, que son programas que se ejecutan en forma independiente, es decir con la programación Java, se pueden realizar aplicaciones como un procesador de palabras, una hoja que sirva para cálculos, una aplicación grafica, etc. en resumen cualquier tipo de aplicación se puede realizar con ella. Java permite la modularidad por lo que se pueden hacer rutinas individuales que sean usadas por más de una aplicación, por ejemplo tenemos una rutina de impresión que puede servir para el procesador de palabras, como para la hoja de cálculo.
La programación en Java, permite el desarrollo de aplicaciones bajo el esquema de Cliente Servidor, como de aplicaciones distribuidas, lo que lo hace capaz de conectar dos o más computadoras u ordenadores, ejecutando tareas simultáneamente, y de esta forma logra distribuir el trabajo a realizar. 
Ada
Es un lenguaje de programación orientado a objetos y fuertemente tipado de forma estática que fue diseñado por Jean Ichbiah de CII Honeywell Bull por encargo del Departamento de Defensa de los Estados Unidos. Es un lenguaje multipropósito, orientado a objetos y concurrente, pudiendo llegar desde la facilidad de Pascal hasta la flexibilidad de C++..
Fue diseñado con la seguridad en mente y con una filosofía orientada a la reducción de errores comunes y difíciles de descubrir. Para ello se basa en un tipado muy fuerte y en chequeos en tiempo de ejecución (desactivadles en beneficio del rendimiento). La sincronización de tareas se realiza mediante la primitiva rendezvous.
Ada se usa principalmente en entornos en los que se necesita una gran seguridad y fiabilidad como la defensa, la aeronáutica (Boeing o Airbus), la gestión del tráfico aéreo (como Indra en España) y la industria aeroespacial entre otros.
El lenguaje fue diseñado bajo encargo del Departamento de Defensa de los Estados Unidos (DoD). Durante los años 1970, este departamento tenía proyectos en una infinidad de lenguajes y estaba gastando mucho dinero en software. Para solucionarlo se buscó un lenguaje único que cumpliese unas ciertas normas recogidas en el documento Steelman. Después de un estudio de los lenguajes existentes en la época se decidió que ninguno las cumplía totalmente, por lo que se hizo un concurso público al que se presentaron cuatro equipos, cuyas propuestas se nombraron con un color: Rojo (Intermetrics), Verde (CII Honeywell Bull), Azul (SofTEch) y Amarillo (SRI International). Finalmente en mayo de 1979 se seleccionó la propuesta Verde diseñada por Jean Ichbiah de CII Honeywell Bull, y se le dio el nombre de Ada. Esta propuesta era un sucesor de un lenguaje anterior de este equipo llamado LIS y desarrollado durante los años 1970.
Lisp
Fue diseñado a finales de los años 50 por el pionero de la Inteligencia Artificial John McCarthy. Aunque (a diferencia de otros lenguajes posteriores, como Prolog) no contiene mecanismos de inferencia intrínsecos, éstos son fáciles de implementar. La estructura de datos esencial en Lisp es la lista, una secuencia ordenada de elementos que pueden ser átomos (funciones, nombres o números) u otras listas. Las listas son esenciales en IA debido a su flexibilidad. Y desde luego son esenciales en Lisp, cuyo nombre deriva, precisamente de List processing.
El Lisp original sólo tenía unas cuantas funciones de manipulación de listas con las cuales se debía ir construyendo otras funciones, cada vez de mayor complejidad. Las versiones actuales contienen muchas más funciones que facilitan la programación. Aunque existen muchas variantes, la llamada Commom Lisp sirve normalmente de referencia.
Prolog
Parte de los trabajos, a principios de los 70, de Robert A. Kowalski, de la Universidad de Edimburgo, y Alain Colmerauer, de la Universidad de Aix-Marseille. Forma parte de un conjunto de lenguajes llamados lógicos, ya que implementan una lógica formal. Se dice que Prolog es adecuado para buscar soluciones de problemas que no sabemos resolver, mientras que la mayoría de los demás lenguajes (llamados imperativos) son más útiles cuando conocemos de antemano la solución (que hay que «explicar» con detalle según la gramática del lenguaje).
Prolog se extendió rápidamente por Europa y Estados Unidos, pero quizá lo que le dio más fama fue su elección en 1982 por parte de un programa japonés de investigación sobre ordenadores de quinta generación. Normalmente se considera un lenguaje ligado a la investigación sobre Inteligencia Artificial, aunque hoy en día se utiliza también en campos diversos, incluyendo finanzas, defensa o ingeniería. 
Forth
Fue creado por Charles Moore en los años 60 desarrollando herramientas especializadas para varias aplicaciones. Fue formalizado como lenguaje para la automatización de telescopios cuando Moore trabajaba en el National Radio Astronomy Observatory, en 1970. Forth suele considerarse un lenguaje para aplicaciones científicas, sin alejarse mucho del campo en que se fraguó. Se considera especialmente adecuado para sistemas incrustados (en inglés, embedded).
Forth cuenta entre sus ventajas el ser pequeño (ocupa poca memoria), rápido y extensible. Y entre sus puntos débiles, que tiene una sintaxis extraña que lo hace difícil de aprender y posiblemente de usar (aunque sobre esto hay, como es natural, distintas opiniones). Una característica importante es que es un lenguaje basado en el uso de una pila (en inglés, stack). Por ejemplo, la sentencia equivalente a PRINT 5-3 (de BASIC) es 5 3 - ., donde 5 pone el número 5 en la cima de la pila, 3 pone el número 3 arriba del 5, - resta el elemento de la cima del que está debajo, elimina ambos operandos y pone en la pila el resultado, y . (Punto) muestra el número de la cima y lo elimina.
Como ejemplo de las posibilidades de Forth, lo siguiente es la definición de una función para calcular el máximo común divisor de dos números, basada en el algoritmo de Euclides:
: GCD ( n n--n) BEGIN DUP WHILE TUCK MOD REPEAT DROP ;
Después de introducir esta definición, podemos interactuar así con el intérprete:
12345 32325 GCD . 15 ok   
FORTRAN
(de FORmula TRANslation) fue creado por John Backus a mediados de la década de los 50 para la IBM, convirtiéndose en el primer lenguaje de programación de alto nivel. Fue pensado para aplicaciones matemáticas y científicas y sigue siendo muy usado en ese terreno.
Los dos estándares principales son FORTRAN 77 y Fortran 90 (a partir de esta versión se empezó a usar el término con minúsculas). El estándar 90 incorporó novedades importantes, como notación de vectores, localización dinámica de memoria, tipos derivados y sobrecarga de operadores, la mayoría de las modernas estructuras de control, etc.
Definición de Lenguaje máquina
(Machine code). El lenguaje máquina es el único lenguaje que puede ejecutar una computadora. El lenguaje de máquina es un código que es interpretado directamente por el microprocesador.
El lenguaje está compuesto por un conjunto de instrucciones ejecutadas en secuencia (con eventuales cambios de flujo causados por el propio programa o eventos externos) que representan acciones que la máquina podrá tomar. Un lenguaje máquina es específico de cada arquitectura de computadora. Todo código fuente en última instancia debe llevarse a un lenguaje máquina mediante el proceso de compilación o interpretación para que la computadora pueda ejecutarlo.
El lenguaje máquina es el único que entiende directamente la computadora, utiliza el alfabeto binario que consta de los dos únicos símbolos 0 y 1, denominados bits (abreviatura inglesa de dígitos binarios). 
Lenguaje ensamblador
El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador. Fue usado principalmente en los inicios del desarrollo de software, cuando aun no se contaba con los potentes lenguajes de alto nivel. Actualmente se lo utiliza particularmente en ambientes académicos y de investigación, especialmente cuando se requiere la manipulación directa de hardware, se pretenden altos rendimientos o un uso de recursos controlado y reducido.
 Muchos dispositivos programables (como los microcontroladores) aun cuentan con el Assembly como la única manera de ser manipulados.
Definición de Comando
Comando (informática)
Un comando (calco del inglés command, «orden, instrucción») o mandato es una instrucción u orden que el usuario proporciona a un sistema informático, desde la línea de comandos (como una shell) o desde una llamada de programación. Puede ser interno (contenido en el propio intérprete) o externo (contenido en un archivo ejecutable).    
Suele admitir parámetros (argumentos) de entrada, lo que permite modificar el comportamiento predeterminado del comando. Suelen indicarse tras una barra "/" (en sistemas operativos DOS) o un guión simple "-" o doble "--" (en sistemas operativos Unix).
Un comando es una orden que se le da a un programa de computadora que actúa como intérprete del mismo, para así realizar una tarea específica. Generalmente un comando se le da a una interfaz de línea de comandos, como un shell. Por ejemplo, el comando "dir" dentro de MS-DOS lista los archivos y subdirectorios del directorio actual. En Unix, la misma función la hace el comando "ls". Muchos comandos permiten argumentos, es decir, información que se le pasa a un comando para que cambie su comportamiento. Por ejemplo, "ls -l" ya no muestra una simple lista de nombres de archivos y subdirectorios, sino que además de los nombres indica fecha de creación, dueños, permisos, etc. En programación, un comando es una instrucción (o sentencia) dentro del código fuente.             

Conclusiones. En este trabajo se hablo sobre algunos lenguajes de programación de alto, medio y bajo nivel, así como también sus definiciones, ahora sabemos que el usuario es aquel que puede interactuar con la máquina para poder realizar algún trabajo, y los lenguajes de programación son los que usan las pc para poder realizar alguna actividad pero solo son entendidos por las personas que se dedican a la programación.

Programacion en HTML

HTML, siglas de HyperText Markup Language («lenguaje de marcas de hipertexto»), hace referencia al lenguaje de marcado para la elaboración depáginas web. Es un estándar que sirve de referencia para la elaboración de páginas web en sus diferentes versiones, define una estructura básica y un código (denominado código HTML) para la definición de contenido de una página web, como texto, imágenes, entre otros.

ACA les dejo un link con libros para los que estan o desean comenzar a programar es un lenguaje facil y sencillo (los dejo en una carpeta en MEDIAFIRE) -->LIBROS DE HTML

Entradas populares

Buscar este blog