diff options
-rw-r--r-- | bash.html.markdown | 7 | ||||
-rw-r--r-- | c.html.markdown | 140 | ||||
-rw-r--r-- | css.html.markdown | 231 | ||||
-rw-r--r-- | es-es/git-es.html.markdown | 411 | ||||
-rw-r--r-- | javascript.html.markdown | 16 | ||||
-rw-r--r-- | julia.html.markdown | 2 | ||||
-rw-r--r-- | pt-br/php-pt.html.markdown | 700 | ||||
-rw-r--r-- | python.html.markdown | 4 | ||||
-rw-r--r-- | ru-ru/c-ru.html.markdown | 483 | ||||
-rw-r--r-- | ru-ru/go-ru.html.markdown | 2 | ||||
-rw-r--r-- | ru-ru/objective-c-ru.html.markdown | 317 | ||||
-rw-r--r-- | zh-cn/bash-cn.html.markdown | 148 | ||||
-rw-r--r-- | zh-cn/brainfuck-cn.html.markdown | 70 |
13 files changed, 2513 insertions, 18 deletions
diff --git a/bash.html.markdown b/bash.html.markdown index d208b957..afc46eb0 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -115,6 +115,13 @@ do echo "$VARIABLE" done +# while loop: +while [true] +do + echo "loop body here..." + break +done + # You can also define functions # Definition: function foo () diff --git a/c.html.markdown b/c.html.markdown index c67f8b21..84856b32 100644 --- a/c.html.markdown +++ b/c.html.markdown @@ -20,6 +20,13 @@ memory management and C will take you as far as you need to go. Multi-line comments look like this. They work in C89 as well. */ +// Constants: #define <keyword> +#define DAYS_IN_YEAR 365 + +//enumeration constants are also ways to declare constants. +enum days {SUN = 1, MON, TUE, WED, THU, FRI, SAT}; +// MON gets 2 automatically, TUE gets 3, etc. + // Import headers with #include #include <stdlib.h> #include <stdio.h> @@ -31,8 +38,12 @@ Multi-line comments look like this. They work in C89 as well. // Declare function signatures in advance in a .h file, or at the top of // your .c file. -void function_1(); -void function_2(); +void function_1(char c); +int function_2(void); + +// Must declare a 'function prototype' before main() when functions occur after +// your main() function. +int add_two_ints(int x1, int x2); // function prototype // Your program's entry point is a function called // main with an integer return type. @@ -72,6 +83,10 @@ int main() { unsigned int ux_int; unsigned long long ux_long_long; + // chars inside single quotes are integers in machine's character set. + '0' // => 48 in the ASCII character set. + 'A' // => 65 in the ASCII character set. + // sizeof(T) gives you the size of a variable with type T in bytes // sizeof(obj) yields the size of the expression (variable, literal, etc.). printf("%zu\n", sizeof(int)); // => 4 (on most machines with 4-byte words) @@ -135,13 +150,25 @@ int main() { int cha = 'a'; // fine char chb = 'a'; // fine too (implicit conversion from int to char) + //Multi-dimensional arrays: + int multi_array[2][5] = { + {1, 2, 3, 4, 5}, + {6, 7, 8, 9, 0} + } + //access elements: + int array_int = multi_array[0][2]; // => 3 + /////////////////////////////////////// // Operators /////////////////////////////////////// - int i1 = 1, i2 = 2; // Shorthand for multiple declaration + // Shorthands for multiple declarations: + int i1 = 1, i2 = 2; float f1 = 1.0, f2 = 2.0; + int a, b, c; + a = b = c = 0; + // Arithmetic is straightforward i1 + i2; // => 3 i2 - i1; // => 1 @@ -181,6 +208,20 @@ int main() { 0 || 1; // => 1 (Logical or) 0 || 0; // => 0 + //Conditional expression ( ? : ) + int a = 5; + int b = 10; + int z; + z = (a > b) ? a : b; // => 10 "if a > b return a, else return b." + + //Increment and decrement operators: + char *s = "iLoveC" + int j = 0; + s[j++]; // => "i". Returns the j-th item of s THEN increments value of j. + j = 0; + s[++j]; // => "L". Increments value of j THEN returns j-th value of s. + // same with j-- and --j + // Bitwise operators! ~0x0F; // => 0xF0 (bitwise negation, "1's complement") 0x0F & 0xF0; // => 0x00 (bitwise AND) @@ -209,9 +250,8 @@ int main() { // While loops exist int ii = 0; - while (ii < 10) { - printf("%d, ", ii++); // ii++ increments ii in-place - // after yielding its value ("postincrement"). + while (ii < 10) { //ANY value not zero is true. + printf("%d, ", ii++); // ii++ increments ii AFTER using it's current value. } // => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, " printf("\n"); @@ -219,8 +259,7 @@ int main() { int kk = 0; do { printf("%d, ", kk); - } while (++kk < 10); // ++kk increments kk in-place, and yields - // the already incremented value ("preincrement") + } while (++kk < 10); // ++kk increments kk BEFORE using it's current value. // => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, " printf("\n"); @@ -233,6 +272,13 @@ int main() { printf("\n"); + // *****NOTES*****: + // Loops and Functions MUST have a body. If no body is needed: + int i; + for (i = 0; i <= 5; i++) { + ; // use semicolon to act as the body (null statement) + } + // branching with multiple choices: switch() switch (some_integral_expression) { case 0: // labels need to be integral *constant* epxressions @@ -309,7 +355,7 @@ int main() { printf("%d\n", x); // => Prints 1 // Arrays are a good way to allocate a contiguous block of memory - int x_array[20]; + int x_array[20]; //declares array of size 20 (cannot change size) int xx; for (xx = 0; xx < 20; xx++) { x_array[xx] = 20 - xx; @@ -385,8 +431,12 @@ int add_two_ints(int x1, int x2) } /* -Functions are pass-by-value, but you can make your own references -with pointers so functions can mutate their values. +Functions are call by value. When a function is called, the arguments passed to +the function are copies of the original arguments (except arrays). Anything you +do to the arguments in the function do not change the value of the original +argument where the function was called. + +Use pointers if you need to edit the original argument values. Example: in-place string reversal */ @@ -404,6 +454,19 @@ void str_reverse(char *str_in) } } +//if referring to external variables outside function, must use extern keyword. +int i = 0; +void testFunc() { + extern int i; //i here is now using external variable i +} + +//make external variables private to source file with static: +static int i = 0; //other files using testFunc() cannot access variable i +void testFunc() { + extern int i; +} +//**You may also declare functions as static to make them private** + /* char c[] = "This is a test."; str_reverse(c); @@ -494,6 +557,61 @@ typedef void (*my_fnp_type)(char *); // ... // my_fnp_type f; +//Special characters: +'\a' // alert (bell) character +'\n' // newline character +'\t' // tab character (left justifies text) +'\v' // vertical tab +'\f' // new page (formfeed) +'\r' // carriage return +'\b' // backspace character +'\0' // null character. Usually put at end of strings in C lang. + // hello\n\0. \0 used by convention to mark end of string. +'\\' // backspace +'\?' // question mark +'\'' // single quote +'\"' // double quote +'\xhh' // hexadecimal number. Example: '\xb' = vertical tab character +'\ooo' // octal number. Example: '\013' = vertical tab character + +//print formatting: +"%d" // integer +"%3d" // integer with minimum of length 3 digits (right justifies text) +"%s" // string +"%f" // float +"%ld" // long +"%3.2f" // minimum 3 digits left and 2 digits right decimal float +"%7.4s" // (can do with strings too) +"%c" // char +"%p" // pointer +"%x" // hexidecimal +"%o" // octal +"%%" // prints % + +/////////////////////////////////////// +// Order of Evaluation +/////////////////////////////////////// + +//---------------------------------------------------// +// Operators | Associativity // +//---------------------------------------------------// +// () [] -> . | left to right // +// ! ~ ++ -- + = *(type)sizeof | right to left // +// * / % | left to right // +// + - | left to right // +// << >> | left to right // +// < <= > >= | left to right // +// == != | left to right // +// & | left to right // +// ^ | left to right // +// | | left to right // +// && | left to right // +// || | left to right // +// ?: | right to left // +// = += -= *= /= %= &= ^= |= <<= >>= | right to left // +// , | left to right // +//---------------------------------------------------// + ``` ## Further Reading diff --git a/css.html.markdown b/css.html.markdown new file mode 100644 index 00000000..b16b364d --- /dev/null +++ b/css.html.markdown @@ -0,0 +1,231 @@ +--- +language: css +contributors: + - ["Mohammad Valipour", "https://github.com/mvalipour"] +--- + +In early days of web there was no visual elements, just pure text. But with the +further development of browser fully visual web pages also became common. +CSS is the standard language that exists to keep the separation between +the content (HTML) and the look-and-feel of web pages. + +In short, what CSS does is to provide a syntax that enables you to target +different elements on an HTML page and assign different visual properties to them. + +Like any other language, CSS has many versions. Here we focus on CSS2.0 +which is not the most recent but the most widely supported and compatible version. + +**NOTE:** Because the outcome of CSS is some visual effects, in order to +learn it, you need try all different things in a +CSS playground like [dabblet](http://dabblet.com/). +The main focus of this article is on the syntax and some general tips. + + +```css +/* comments appear inside slash-asterisk, just like this line! */ + +/* #################### + ## SELECTORS + ####################*/ + +/* Generally, the primary statement in CSS is very simple */ +selector { property: value; /* more properties...*/ } + +/* the selector is used to target an element on page. + +You can target all elments on the page! */ +* { color:red; } + +/* +Given an element like this on the page: + +<div class='some-class class2' id='someId' attr='value' /> +*/ + +/* you can target it by it's class name */ +.some-class { } + +/*or by both classes! */ +.some-class.class2 { } + +/* or by it's tag name */ +div { } + +/* or it's id */ +#someId { } + +/* or by the fact that it has an attribute! */ +[attr] { font-size:smaller; } + +/* or that the attribute has a specific value */ +[attr='value'] { font-size:smaller; } + +/* start with a value*/ +[attr^='val'] { font-size:smaller; } + +/* or ends with */ +[attr$='ue'] { font-size:smaller; } + +/* or even contains a value */ +[attr~='lu'] { font-size:smaller; } + + +/* and more importantly you can combine these together -- there shouldn't be +any spaaace between different parts because that makes it to have another +meaning.*/ +div.some-class[attr$='ue'] { } + +/* you can also select an element based on how it's parent is.*/ + +/*an element which is direct child of an element (selected the same way) */ +div.some-parent > .class-name {} + +/* or any of it's parents in the tree */ +/* the following basically means any element that has class "class-name" +and is child of a div with class name "some-parent" IN ANY DEPTH */ +div.some-parent .class-name {} + +/* warning: the same selector wihout spaaace has another meaning. +can you say what? */ +div.some-parent.class-name {} + +/* you also might choose to select an element based on it's direct +previous sibling */ +.i-am-before + .this-element { } + +/*or any sibling before this */ +.i-am-any-before ~ .this-element {} + +/* There are some pseudo classes that allows you to select an element +based on it's page behaviour (rather than page structure) */ + +/* for example for when an element is hovered */ +:hover {} + +/* or a visited link*/ +:visited {} + +/* or not visited link*/ +:link {} + +/* or an input element which is focused */ +:focus {} + + +/* #################### + ## PROPERTIES + ####################*/ + +selector { + + /* Units */ + width: 50%; /* in percent */ + font-size: 2em; /* times current font-size */ + width: 200px; /* in pixels */ + font-size: 20pt; /* in points */ + width: 5cm; /* in centimeters */ + width: 50mm; /* in millimeters */ + width: 5in; /* in inches */ + + /* Colors */ + background-color: #F6E /* in short hex */ + background-color: #F262E2 /* in long hex format */ + background-color: tomato /* can be a named color */ + background-color: rgb(255, 255, 255) /* in rgb */ + background-color: rgb(10%, 20%, 50%) /* in rgb percent */ + background-color: rgba(255, 0, 0, 0.3); /* in semi-transparent rgb */ + + /* Images */ + background-image: url(/path-to-image/image.jpg); + + /* Fonts */ + font-family: Arial; + font-family: "Courier New"; /* if name has spaaace it appears in double-quote */ + font-family: "Courier New", Trebuchet, Arial; /* if first one was not found + browser uses the second font, and so forth */ +} + +``` + +## Usage + +Save any CSS you want in a file with extension `.css`. + +```xml +<!-- you need to include the css file in your page's <head>: --> +<link rel='stylesheet' type='text/css' href='filepath/filename.css' /> + +<!-- you can also include some CSS inline in your markup. However it is highly +recommended to avoid this. --> +<style> + selector { property:value; } +</style> + +<!-- or directly set CSS properties on the element. +This has to be avoided as much as you can. --> +<div style='property:value;'> +</div> + +``` + +## Precedence + +As you noticed an element may be targetted by more than one selector. +and may have a property set on it in more than one. +In these cases, one of the rules takes precedence over others. + +Given the following CSS: + +```css +/*A*/ +p.class1[attr='value'] + +/*B*/ +p.class1 {} + +/*C*/ +p.class2 {} + +/*D*/ +p {} + +/*E*/ +p { property: value !important; } + +``` + +and the following markup: + +```xml +<p style='/*F*/ property:value;' class='class1 class2' attr='value'> +</p> +``` + +The precedence of style is as followed: +Remember, the precedence is for each **property**, not for the entire block. + +* `E` has the highest precedence because of the keyword `!important`. + It is recommended to avoid this unless it is strictly necessary to use. +* `F` is next, because it is inline style. +* `A` is next, because it is more "specific" than anything else. + more specific = more specifiers. here 3 specifiers: 1 tagname `p` + + class name `class1` + 1 attribute `attr='value'` +* `C` is next. although it has the same specificness as `B` + but it appears last. +* Then is `B` +* and lastly is `D`. + +## Compatibility + +Most of the features in CSS2 (and gradually in CSS3) are compatible across +all browsers and devices. But it's always vital to have in mind the compatiblity +of what you use in CSS with your target browsers. + +[QuirksMode CSS](http://www.quirksmode.org/css/) is one of the best sources for this. + +## Further Reading + +* [Understanding Style Precedence in CSS: Specificity, Inheritance, and the Cascade](http://www.vanseodesign.com/css/css-specificity-inheritance-cascaade/) +* [QuirksMode CSS](http://www.quirksmode.org/css/) +* [Z-Index - The stacking context](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context) + diff --git a/es-es/git-es.html.markdown b/es-es/git-es.html.markdown new file mode 100644 index 00000000..0623b29b --- /dev/null +++ b/es-es/git-es.html.markdown @@ -0,0 +1,411 @@ +--- +category: tool +tool: git +contributors: + - ["Jake Prather", "http://github.com/JakeHP"] +translator: + - ["Raúl Ascencio", "http://rscnt.github.io"] +filename: LearnGit.txt +language: es-es + +--- + +Git es un sistema de control de versiones distribuido diseñado para manejar +cualquier tipo de proyecto ya sea largos o pequeños, con velocidad y eficiencia. + +Git realiza esto haciendo "snapshots" del proyecto, con ello permite +versionar y administrar nuestro código fuente. + +## Versionamiento, conceptos. + +### Que es el control de versiones? +El control de versiones es un sistema que guarda todos los cambios realizados a +uno o varios archivos, a lo largo del tiempo. + +### Versionamiento centralizado vs Versionamiento Distribuido. + ++ El versionamiento centralizado se enfoca en sincronizar, rastrear, y respaldar + archivos. ++ El versionamiento distribuido se enfoca en compartir los cambios realizados. + Cada cambio tiene un único identificador. ++ El versionamiento distribuido no tiene una estructura definida, incluso se + puede mantener el estilo de los repositorios SVN con git. + +[Informacion adicional](http://git-scm.com/book/es/Empezando-Acerca-del-control-de-versiones) + +### Por que usar Git? + +* Se puede trabajar sin conexion. +* Colaborar con otros es sencillo!. +* Derivar, Crear ramas del proyecto (aka: Branching) es facil!. +* Combinar (aka: Marging) +* Git es rapido. +* Git es flexible. + +## Arquitectura de Git. + +### Repositorio + +Un repositorio es un conjunto de archivos, directorios, registros, cambios (aka: +comits), y encabezados (aka: heads). Imagina que un repositorio es una clase, +y que sus atributos otorgan acceso al historial del elemento, ademas de otras +cosas. + +Un repositorio esta compuesto por la carpeta .git y un "arbol de trabajo". + +### Directorio .git (componentes del repositorio) + +El directorio .git contiene todas las configuraciones, registros, branches, HEAD +y mas. + +[Lista detallada.](http://es.gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html) + +### Directorio de trabajo (componentes del repositorio) + +Es basicamente los directorios y archivos dentro del repositorio. La mayorioa de +las veces se le llama "directorio de trabajo". + +### Inidice (componentes del directorio .git) + +El inidice es la area de inicio en git. Es basicamente la capa que separa el +directorio de trabajo, del repositorio en git. Esto otorga a los desarrolladores +mas poder sobre lo que envia y recibe en el repositorio. + +### Commit (aka: cambios) + +Un commit es una captura de un conjunto de cambios, o modificaciones hechas en +el directorio de trabajo. Por ejemplo, si se añaden 5 archivos, se remueven 2, +estos cambios se almacenaran en un commit (aka: captura). Este commit puede ser o +no ser enviado (aka: "pusheado") hacia un repositorio. + +### Branch (rama) + +Un "branch", es escencialmente un apuntador hacia el ultimo commit (cambio +registrado) que se ha realizado. A medida que se realizan mas commits, este +apuntador se actualizara automaticamente hacia el ultimo commit. + +### "HEAD" y "head" (component of .git dir) + +"HEAD" es un apuntador hacia la rama (branch) que se esta utilizando. Un +repositorio solo puede tener un HEAD activo. En cambio "head", es un apuntador a +cualquier commit realizado, un repositorio puede tener cualquier numero de +"heads". + +### conceptos - recursos. + +* [Git para informaticos](http://eagain.net/articles/git-for-computer-scientists/) +* [Git para diseñadores](http://hoth.entp.com/output/git_for_designers.html) + + +## Comandos. + + +### init + +Crear un repositorio de git vacio. Las configuraciones, informacion almacenada y +demas son almacenadas en el directorio ".git". + +```bash +$ git init +``` + +### config + +Se utiliza para configurar las opciones ya sea globalmente, o solamente en el +repositorio. + +```bash +# Imprime y guarda algunas variables de configuracion basicas. (Globalmente) +$ git config --global user.email +$ git config --global user.name + +$ git config --global user.email "corre@gmail.com" +$ git config --global user.name "nombre" +``` + +[Mas sobre git config.](http://git-scm.com/book/es/Personalizando-Git-Configuración-de-Git) + +### help + +Otorga un accceso rapido a una guia extremadamente detallada de cada comando en +git. O puede ser usada simplemente como un recordatorio de estos. + +```bash +# Una vista rapido de los comandos disponibles. +$ git help + +# Chequear todos los comandos disponibles +$ git help -a + +# Obtener ayuda especifica de un comando - manual de usuario +# git help <comando> +$ git help add +$ git help commit +$ git help init +``` + +### status + +Muestra las diferencias entre el archivo indice y el commit al cual apunta el +HEAD actualmente. + + +```bash +# Mostrara el "branch", archivos sin añadir a la repo, cambios y otras +# diferencias +$ git status + +# Devuelve ayuda sobre el comando status. +$ git help status +``` + +### add + +Para añadir archivos al arbol (directorio, repositorio) de trabajo. Si no se +utiliza `git add`, los nuevos archivos no se añadiran al arbol de trabajo, por +lo que no se incluiran en los commits (cambios). + +```bash +# Añade un archivo en el directorio de trabajo actual. +$ git add FooBar.java + +# Añade un archivo que se encuentra bajo un directorio. +$ git add /directorio/del/archivo/Foo.c + +# Soporte para expresiones regulares! +$ git add ./*.py +``` + +### branch + +Administra las ramas del repositorios ("branches"). Puedes ver, editar, crear y +borrar ramas ("branches"), usando este comando. + +```bash +# lista todas las ramas (remotas y locales) +$ git branch -a + +# Añada una nueva rama ("branch"). +$ git branch branchNueva + +# Eliminar una rama. +$ git branch -d branchFoo + +# Renombra una rama. +# git branch -m <anterior> <nuevo> +$ git branch -m youngling padawan + +# Edita la descripcion de la rama. +$ git branch master --edit-description +``` + +### checkout + +Actualiza todos los archivos en el directorio de trabajo para que sean igual que +las versiones almacenadas en el indice, o en un arbol de trabajo especificado. + +```bash +# Despachar un repositorio. - Por defecto la master branch. (la rama principal llamada 'master') +$ git checkout +# Despacha una rama especifica. +$ git checkout padawan +# Crea una nueva rama y cambia hacia ella, es igual a utilizar: "git brach jedi; git checkout jedi" +$ git checkout -b jdei +``` + +### clone + +Clona, o copia, una repo existente en un nuevo directorio. Tambien añada el +seguimiento hacia las ramas existentes del repo que ha sido clonada, lo que +permite subir (push) los archivos hacia una rama remota. + +```bash +# Clonar la repo de jquery. +$ git clone https://github.com/jquery/jquery.git +``` + +### commit + +Almacena los cambios que almacenados en el indice en un nuevo "commit". Este +commit contiene los cambios hechos mas un resumen hecho por el desarrollador. + +```bash +# commit with a message +# realizar un commit y añadirle un mensaje. +$ git commit -m "jedi anakin wil be - jedis.list" +``` + +### diff + +Muestra las diferencias entre un archivo en el directorio de trabajo, el indice +y commits. + +```bash +# Muestra la diferencia entre un directorio de trabajo y el indice. +$ git diff + +# Muestra la diferencia entre el indice y los commits mas recientes. +$ git diff --cached + +# Muestra la diferencia entre el directorio de trabajo y el commit mas reciente. +$ git diff HEAD +``` + +### grep + +Permite realizar una busqueda rapida en un repositorio. + +Configuracion opcionales: + +```bash +# Gracias a Travis Jeffery por compartir lo siguiente. +# Permite mostrar numeros de lineas en la salida de grep. +$ git config --global grep.lineNumber true + +# Realiza una busqueda mas lejible, incluyendo agrupacion. +$ git config --global alias.g "grep --break --heading --line-number" +``` + +```bash +# Busca por "unaVariable" en todos los archivos ,java +$ git grep 'unaVariable' -- '*.java' + +# Busca por una linea que contenga "nombreArreglo" y , "agregar" o "remover" +$ git grep -e 'nombreArreglo' --and \( -e agregar -e remover \) +``` + +Mas ejemplos: +[Git Grep Ninja](http://travisjeffery.com/b/2012/02/search-a-git-repo-like-a-ninja) + +### log + +Muestra los commits (cambios) registrados en el repositotrio. + +```bash +# Muestra todos los commits. +$ git log + +# Muestra un numero x de commits. +$ git log -n 10 + +# Muestra solo los commits que se han combinado en el hisotrial +$ git log --merges +``` + +### merge + +Combina los cambios de commits realizados externamente dentro de la rama en la +que se trabaja. + +```bash +# Combina la rama especificada en la rama actual. +$ git merge jediMaster + +# Siempre genere un solo merge commit cuando se utilizar merge. +$ git merge --no-ff jediMaster +``` + +### mv + +Renombra o mueve un archivo + +```bash +# Renombrando un archivo +$ git mv HolaMundo.c AdiosMundo.c + +# Moviendo un archivo. +$ git mv HolaOtraVezMundo.c ./nuevo/directorio/NuevoArchivo.c + +# Sustituye un archivo. +$ git mv -f archivoA archivoB +``` + +### pull + +Sube (Empuja) de un repositorio y lo combina en otro en una rama diferente. + +```bash +# Actualiza el repositorio local, combinando los nuevos cambios. +# de las ramas remotas "origin" y "master". +# from the remote "origin" and "master" branch. +# git pull <remota> <rama> +$ git pull origin master +``` + +### push + +Push and merge changes from a branch to a remote & branch. + +```bash +# Push and merge changes from a local repo to a +# Empuja y combina cambios de un repositorio local hacian un repositorio remoto +# llamados "origin" y "master", respectivamente. +# git push <remota> <rama> +# git push => por defecto es lo mismo que poner => git push origin master +$ git push origin master +``` + + +Toma todos los cambios que fueron registrados en una rama, y los repite dentro +de otra rama. +*No reescribe los commits que se han empujado antes a un repositorio publico* + +```bash +# Integrar ramaExperimento dentro de la rama "master" +# git rebase <basebranch> <topicbranch> +$ git rebase master experimentBranch +``` + +[Informacion adicional.](http://git-scm.com/book/es/Ramificaciones-en-Git-Procedimientos-básicos-para-ramificar-y-fusionar) + +### reset (precaucion) + +Reinicia el cabezal actual hacia un estado especificado. Esto permite desacer +combinaciones (merges), pulls, commits, adds y mas. Es un comando util, pero +tambien peligrosa si no se sabe lo que se hace. + +```bash +# Reinica el area principal, con el ultimo cambio registrado. (deja los +# directorios sin cambios) +$ git reset + +# Reinica el area principal, con el ultimo cambio registrado, y reescribe el +# directorio de trabajo. +$ git reset --hard + +# Mueve la rama actual hacia el commit especificado (no realiza cambios a los +# directorios), todos los cambios aun existen el directorio. +$ git reset 31f2bb1 + +# Mueve la rama actual devuelta a un commit especificado asi como el +# directorios (borra todos los cambios que no fueron registros y todos los +# cambios realizados despues del commit especificado). +$ git reset --hard 31f2bb1 +``` + +### rm + +Lo contrario de git add, git rm remueve los archivos del directorio de trabajo +actual. + +```bash +# Remueve FooBar.c +$ git rm FooBar.c + +# Remueve un archivo de un directorio. +$ git rm /directorio/del/archivo/FooBar.c +``` + +## Informacion Adicional + +* [tryGit - Una forma entretenida y rapida de aprender Git.](http://try.github.io/levels/1/challenges/1) + +* [git-scm - Video-tutoriales](http://git-scm.com/videos) + +* [git-scm - Documentacion](http://git-scm.com/book/es) + +* [Atlassian Git - Tutoriales y Flujos de trabajo](https://www.atlassian.com/git/) + +* [SalesForce Chuleta](https://na1.salesforce.com/help/doc/en/salesforce_git_developer_cheatsheet.pdf) + +* [GitGuys](http://www.gitguys.com/) diff --git a/javascript.html.markdown b/javascript.html.markdown index b6d4c8b7..348cbff5 100644 --- a/javascript.html.markdown +++ b/javascript.html.markdown @@ -31,8 +31,8 @@ doStuff(); // wherever there's a newline, except in certain cases. doStuff() -// So that we don't have to worry about those certain cases (for now), we'll -// leave them on. +// Because those cases can cause unexpected results, we'll keep on using +// semicolons in this guide. /////////////////////////////////// // 1. Numbers, Strings and Operators @@ -218,6 +218,18 @@ function myFunction(thing){ } myFunction("foo"); // = "FOO" +// Note that the value to be returned must start on the same line as the +// 'return' keyword, otherwise you'll always return 'undefined' due to +// automatic semicolon insertion. Watch out for this when using Allman style. +function myFunction() +{ + return // <- semicolon automatically inserted here + { + thisIsAn: 'object literal' + } +} +myFunction(); // = undefined + // JavaScript functions are first class objects, so they can be reassigned to // different variable names and passed to other functions as arguments - for // example, when supplying an event handler: diff --git a/julia.html.markdown b/julia.html.markdown index c3d2195b..d05e165d 100644 --- a/julia.html.markdown +++ b/julia.html.markdown @@ -402,7 +402,7 @@ Set([1,2,3]...) #=> Set{Int64}(1,2,3) # this is equivalent to Set(1,2,3) x = (1,2,3) #=> (1,2,3) Set(x) #=> Set{(Int64,Int64,Int64)}((1,2,3)) # a Set of Tuples -Set(x...) #=> Set{Int64}(2,3,1) +Set(x...) #=> Set{Int64}(1,2,3) # You can define functions with optional positional arguments diff --git a/pt-br/php-pt.html.markdown b/pt-br/php-pt.html.markdown new file mode 100644 index 00000000..344df43a --- /dev/null +++ b/pt-br/php-pt.html.markdown @@ -0,0 +1,700 @@ +--- +language: php +contributors: + - ["Malcolm Fell", "http://emarref.net/"] + - ["Trismegiste", "https://github.com/Trismegiste"] +translators: + - ["Abdala Cerqueira", "http://abda.la"] + - ["Raquel Diniz", "http://twitter.com/raquelrdiniz"] +lang: pt-br +filename: learnphp-pt.php +--- + +Este documento descreve PHP 5+. + +```php +<?php // O código PHP deve estar incluso na tag <?php + +// Se o arquivo PHP só contém código PHP, a melhor prática +// é omitir a tag de fechamento PHP. + +// Duas barras iniciam o comentário de uma linha. + +# O hash (aka pound symbol) também inicia, mas // é mais comum + +/* + O texto envolto por barra-asterisco e asterisco-barra + faz um comentário de múltiplas linhas +*/ + +// Utilize "echo" ou "print" para imprimir a saída +print('Olá '); // Imprime "Olá " sem quebra de linha + +// () são opcionais para print e echo +echo "Mundo\n"; // Imprime "Mundo" com quebra de linha +// (Todas as declarações devem terminar com um ponto e vírgula) + +// Qualquer coisa fora da tag <?php é impresso automaticamente +?> +Olá mundo novamente! +<?php + + +/************************************ + * Tipos e variáveis + */ + +// Variáveis começam com o símbolo $. +// Um nome de variável válido se inicia com uma letra ou sublinhado, +// seguido por qualquer quantidade de letras, números ou sublinhados. + +// Valores booleanos não diferenciam maiúsculo de minúsculo (case-insensitive) +$boolean = true; // ou TRUE ou True +$boolean = false; // ou FALSE ou False + +// Inteiros +$int1 = 12; // => 12 +$int2 = -12; // => -12 +$int3 = 012; // => 10 (um 0 denota um número octal) +$int4 = 0x0F; // => 15 (um 0x denota um literal hex) + +// Flutuantes - Floats (aka doubles) +$float = 1.234; +$float = 1.2e3; +$float = 7E-10; + +// Excluir variável +unset($int1) + +// Aritmética +$soma = 1 + 1; // 2 +$diferenca = 2 - 1; // 1 +$produto = 2 * 2; // 4 +$quociente = 2 / 1; // 2 + +// Taquigrafia aritmética +$numero = 0; +$numero += 1; // Incrementa $number em 1 +echo $numero++; // Imprime 1 (incrementa após a avaliação) +echo ++$numero; // Imprime 3 (incrementa antes da avaliação) +$numero /= $float; // Divide e atribui o quociente de $numero + +// Strings podem ser colocadas entre aspas simples +$sgl_quotes = '$String'; // => '$String' + +// Evite o uso de aspas duplas, exceto para incorporar outras variáveis +$dbl_quotes = "Esta é uma $sgl_quotes."; // => 'Esta é uma $String.' + +// Os caracteres especiais só são escapados entre aspas duplas +$escapado = "Este contém um \t caractere tab."; +$naoescapado = 'Este contém somente a barra e o t: \t'; + +// Coloque uma variável entre chaves se necessário +$dinheiro = "Eu tenho $${numero} no banco."; + +// Desde o PHP 5.3, nowdocs podem ser usados para múltiplas linhas sem análise +$nowdoc = <<<'FIM' +múltiplas linhas +string +FIM; + +// Heredocs farão a análise +$heredoc = <<<FIM +múltiplas linhas +$sgl_quotes +FIM; + +// Concatenação de string é feita com . +echo 'Esta string ' . 'é concatenada'; + + +/******************************** + * Constantes + */ + +// Uma constante é definida usando define() +// e nunca pode ser mudada durante a execução! + +// Um nome de constante válida começa com uma letra ou sublinhado, +// seguido por qualquer quantidade de letras, números ou sublinhados. +define("FOO", "alguma coisa"); + +// Acesso a uma constante é possível usando diretamente o nome escolhido +echo 'Isto sairá '.FOO; + + +/******************************** + * Arrays + */ + +// Todos os arrays em PHP são arrays associativos (hashmaps), + +// Funciona com todas as versões do PHP +$associativo = array('Um' => 1, 'Dois' => 2, 'Tres' => 3); + +// PHP 5.4 introduziu uma nova sintaxe +$associativo = ['Um' => 1, 'Dois' => 2, 'Tres' => 3]; + +echo $associativo['Um']; // imprime 1 + +// Uma lista de literais atribui chaves inteiras implicitamente +$array = ['Um', 'Dois', 'Tres']; +echo $array[0]; // => "Um" + +// Adiciona um elemento no final do array +$array[] = 'Quatro'; + +// Remove um elemento do array +unset($array[3]); + +/******************************** + * Saída + */ + +echo('Olá Mundo!'); +// Imprime Olá Mundo! para stdout. +// Stdout é uma página web se executado em um navegador. + +print('Olá Mundo!'); // O mesmo que o echo + +// echo é atualmente um construtor de linguagem, então você pode +// remover os parênteses. +echo 'Olá Mundo!'; +print 'Olá Mundo!'; // O print também é + +$paragrafo = 'parágrafo'; + +echo 100; // Imprime valores escalares diretamente +echo $paragrafo; // ou variáveis + +// Se a abertura de tags curtas está configurada, ou sua versão do PHP é +// 5.4.0 ou maior, você pode usar a sintaxe de echo curto +?> +<p><?= $paragrafo ?></p> +<?php + +$x = 1; +$y = 2; +$x = $y; // $x agora contém o mesmo valor de $y +$z = &$y; +// $z agora contém uma referência para $y. Mudando o valor de +// $z irá mudar o valor de $y também, e vice-versa. +// $x irá permanecer inalterado com o valor original de $y + +echo $x; // => 2 +echo $z; // => 2 +$y = 0; +echo $x; // => 2 +echo $z; // => 0 + +// Despeja tipos e valores de variável para o stdout +var_dump($z); // imprime int(0) + +// Imprime variáveis para stdout em formato legível para humanos +print_r($array); // imprime: Array ( [0] => Um [1] => Dois [2] => Tres ) + +/******************************** + * Lógica + */ +$a = 0; +$b = '0'; +$c = '1'; +$d = '1'; + +// assert lança um aviso se o seu argumento não é verdadeiro + +// Estas comparações serão sempre verdadeiras, mesmo que os tipos +// não sejam os mesmos. +assert($a == $b); // igualdade +assert($c != $a); // desigualdade +assert($c <> $a); // alternativa para desigualdade +assert($a < $c); +assert($c > $b); +assert($a <= $b); +assert($c >= $d); + +// A seguir, só serão verdadeiras se os valores correspondem e são do mesmo tipo. +assert($c === $d); +assert($a !== $d); +assert(1 == '1'); +assert(1 !== '1'); + +// As variáveis podem ser convertidas entre tipos, dependendo da sua utilização. + +$inteiro = 1; +echo $inteiro + $inteiro; // => 2 + +$string = '1'; +echo $string + $string; // => 2 (strings são coagidas para inteiros) + +$string = 'one'; +echo $string + $string; // => 0 +// Imprime 0 porque o operador + não pode fundir a string 'um' para um número + +// Tipo de fundição pode ser utilizado para tratar uma variável +// como um outro tipo + +$booleano = (boolean) 1; // => true + +$zero = 0; +$booleano = (boolean) $zero; // => false + +// Há também funções dedicadas para fundir a maioria dos tipos +$inteiro = 5; +$string = strval($inteiro); + +$var = null; // valor Null + + +/******************************** + * Estruturas de controle + */ + +if (true) { + print 'Eu fico impresso'; +} + +if (false) { + print 'Eu não\'t'; +} else { + print 'Eu fico impresso'; +} + +if (false) { + print 'Não fica impresso'; +} elseif(true) { + print 'Fica'; +} + +// operadores ternários +print (false ? 'Não fica impresso' : 'Fica'); + +$x = 0; +if ($x === '0') { + print 'Não imprime'; +} elseif($x == '1') { + print 'Não imprime'; +} else { + print 'Imprime'; +} + + + +// Esta sintaxe alternativa é útil para modelos (templates) +?> + +<?php if ($x): ?> +Isto é exibido se o teste for verdadeiro. +<?php else: ?> +Isto é apresentado caso contrário. +<?php endif; ?> + +<?php + +// Use switch para salvar alguma lógica. +switch ($x) { + case '0': + print 'Switch faz coerção de tipo'; + break; // Você deve incluir uma pausa, ou você vai cair + // no caso 'dois' e 'tres' + case 'dois': + case 'tres': + // Faz alguma coisa, se a variável é 'dois' ou 'tres' + break; + default: + // Faz algo por padrão +} + +// While, do...while e for são repetições provavelmente familiares +$i = 0; +while ($i < 5) { + echo $i++; +}; // Imprime "01234" + +echo "\n"; + +$i = 0; +do { + echo $i++; +} while ($i < 5); // Imprime "01234" + +echo "\n"; + +for ($x = 0; $x < 10; $x++) { + echo $x; +} // Imprime "0123456789" + +echo "\n"; + +$rodas = ['bicicleta' => 2, 'carro' => 4]; + +// Repetições foreach podem iterar sobre arrays +foreach ($rodas as $contador_rodas) { + echo $contador_rodas; +} // Imprime "24" + +echo "\n"; + +// Você pode iterar sobre as chaves, bem como os valores +foreach ($rodas as $veiculo => $contador_rodas) { + echo "O $veiculo tem $contador_rodas rodas"; +} + +echo "\n"; + +$i = 0; +while ($i < 5) { + if ($i === 3) { + break; // Sai da repetição + } + echo $i++; +} // Imprime "012" + +for ($i = 0; $i < 5; $i++) { + if ($i === 3) { + continue; // Ignora esta iteração da repetição + } + echo $i; +} // Imprime "0124" + + +/******************************** + * Functions + */ + +// Define a função com "function": +function minha_funcao () { + return 'Olá'; +} + +echo minha_funcao(); // => "Olá" + +// Um nome de função válido começa com uma letra ou sublinhado, +// seguido por qualquer quantidade de letras, números ou sublinhados. + +function adicionar($x, $y = 1) { // $y é opcional e o valor padrão é 1 + $resultado = $x + $y; + return $resultado; +} + +echo adicionar(4); // => 5 +echo adicionar(4, 2); // => 6 + +// $resultado não é acessível fora da função +// print $resultado; // Dá uma aviso. + +// Desde o PHP 5.3 você pode declarar funções anônimas +$inc = function ($x) { + return $x + 1; +}; + +echo $inc(2); // => 3 + +function foo ($x, $y, $z) { + echo "$x - $y - $z"; +} + +// Funções podem retornar funções +function bar ($x, $y) { + // Utilize 'use' para trazer variáveis de fora + return function ($z) use ($x, $y) { + foo($x, $y, $z); + }; +} + +$bar = bar('A', 'B'); +$bar('C'); // Imprime "A - B - C" + +// Você pode chamar funções nomeadas usando strings +$nome_funcao = 'add'; +echo $nome_funcao(1, 2); // => 3 +// Útil para dinamicamente determinar qual função será executada. +// Ou utilize call_user_func(callable $callback [, $parameter [, ... ]]); + +/******************************** + * Includes (Incluir) + */ + +<?php +// PHP dentro de arquivos incluídos também deve começar com uma tag +// de abertura do PHP. + +include 'meu-arquivo.php'; +// O código meu-arquivo.php já está disponível no escopo atual. +// Se o arquivo não pode ser incluído (por exemplo, arquivo não encontrado), +//um aviso é emitido. + +include_once 'meu-arquivo.php'; +// Se o código no meu-arquivo.php foi incluído em outro lugar, ele não vai +// ser incluído novamente. Isso evita vários erros de declaração de classe + +require 'meu-arquivo.php'; +require_once 'meu-arquivo.php'; +// Faz o mesmo que o include(), exceto que o require() irá causar um erro fatal +// se o arquivo não puder ser incluído + +// Conteúdo de meu-include.php: +<?php + +return 'Qualquer coisa que você quiser.'; +// Fim do arquivo + +// Includes e requires também podem retornar um valor. +$valor = include 'meu-include.php'; + +// Arquivos são incluídos com base no caminho determinado ou, +// se este não for passado, com base na diretiva de configuração include_path. +// Se o arquivo não é encontrado no include_path, o include vai finalmente +// verificar no próprio diretório do script chamado e no diretório +// de trabalho atual antes de falhar. +/* */ + +/******************************** + * Classes + */ + +// As classes são definidas com a palavra-chave class + +class MinhaClasse +{ + const MINHA_CONST = 'valor'; // Uma constante + + static $valorEstatico = 'estatico'; + + // Variáveis estáticas e sua visibilidade + public static $valorEstaticoPublico = 'estaticoPublico'; + // Acessível somente dentro da classe + private static $valorEstaticoPrivado = 'estaticoPrivado'; + // Acessível a partir da classe e subclasses + protected static $valorEstaticoProtegido = 'estaticoProtegido'; + + // Propriedades devem declarar a sua visibilidade + public $propriedade = 'publica'; + public $propInstancia; + protected $prot = 'protegida'; // Acessível a partir da classe e subclasses + private $priv = 'privada'; // Acessível somente dentro da classe + + // Criar um construtor com o __construct + public function __construct($propInstancia) { + // Acesse variável de instância utilizando $this + $this->propInstancia = $propInstancia; + } + + // Métodos são declarados como funções dentro de uma classe + public function meuMetodo() + { + print 'MinhaClasse'; + } + + //palavra-chave final faz uma função não poder ser sobrescrita + final function voceNaoPodeMeSobrescrever() + { + } + +/* + * Declarando propriedades ou métodos de classe como estáticos faz deles + * acessíveis sem precisar instanciar a classe. A propriedade declarada + * como estática não pode ser acessada com um objeto + * instanciado da classe (embora métodos estáticos possam). +*/ + + public static function meuMetodoEstatico() + { + print 'Eu sou estatico'; + } +} + +echo MinhaClasse::MINHA_CONST; // Imprime 'valor'; +echo MinhaClasse::$valorEstatico; // Imprime 'estatico'; +MinhaClasse::meuMetodoEstatico(); // Imprime 'Eu sou estatico'; + +// Instantiate classes using new +$minha_classe = new MinhaClasse('Uma propriedade de instância'); +// Os parênteses são opcionais, se não passar algum argumento. + +// Acesse membros da classe utilizando -> +echo $minha_classe->propriedade; // => "publica" +echo $minha_classe->instanceProp; // => "Uma propriedade de instância" +$minha_classe->meuMetodo(); // => "MinhaClasse" + + +// Estender classes usando "extends" +class MinhaOutraClasse extends MinhaClasse +{ + function imprimePropriedadeProtegida() + { + echo $this->prot; + } + + // Sobrescrever um método + function meuMetodo() + { + parent::meuMetodo(); + print ' > MinhaOutraClasse'; + } +} + +$minha_outra_classe = new MinhaOutraClasse('Propriedade de instância'); +$minha_outra_classe->imprimePropriedadeProtegida(); // => Prints "protegida" +$minha_outra_classe->myMethod(); // Prints "MinhaClasse > MinhaOutraClasse" + +final class VoceNaoPodeMeEstender +{ +} + +// Você pode usar "métodos mágicos" para criar getters e setters +class MinhaClasseMapa +{ + private $propriedade; + + public function __get($chave) + { + return $this->$chave; + } + + public function __set($chave, $valor) + { + $this->$chave = $valor; + } +} + +$x = new MinhaClasseMapa(); +echo $x->propriedade; // Irá usar o método __get() +$x->propriedade = 'Algo'; // Irá usar o método __set() + +// Classes podem ser abstratas (usando a palavra-chave abstract) ou +// implementar interfaces (usando a palavra-chave implements). +// Uma interface é declarada com a palavra-chave interface. + +interface InterfaceUm +{ + public function fazAlgo(); +} + +interface InterfaceDois +{ + public function fazOutraCoisa(); +} + +// interfaces podem ser estendidas +interface InterfaceTres extends InterfaceDois +{ + public function fazOutroContrato(); +} + +abstract class MinhaClasseAbstrata implements InterfaceUm +{ + public $x = 'fazAlgo'; +} + +class MinhaClasseConcreta extends MinhaClasseAbstrata implements InterfaceDois +{ + public function fazAlgo() + { + echo $x; + } + + public function fazOutraCoisa() + { + echo 'fazOutraCoisa'; + } +} + + +// Classes podem implementar mais de uma interface +class UmaOutraClasse implements InterfaceUm, InterfaceDois +{ + public function fazAlgo() + { + echo 'fazAlgo'; + } + + public function fazOutraCoisa() + { + echo 'fazOutraCoisa'; + } +} + + +/******************************** + * Traits (Traços) + */ + +// Traits estão disponíveis a partir de PHP 5.4.0 e +// são declarados usando "trait" + +trait MeuTraco +{ + public function meuMetodoDeTraco() + { + print 'Eu tenho MeuTraco'; + } +} + +class MinhaClasseTracada +{ + use MeuTraco; +} + +$cls = new MinhaClasseTracada(); +$cls->meuMetodoDeTraco(); // Imprime "Eu tenho MeuTraco" + + +/******************************** + * Namespaces (Espaço nominal) + */ + +// Esta seção é separada porque a declaração de espaços nominais +// deve ser a primeira instrução em um arquivo. Vamos fingir, aqui não é o caso + +<?php + +// Por padrão, as classes existem no espaço nominal global e podem +// ser explicitamente chamadas com uma barra invertida. + +$cls = new \MinhaClasse(); + + + +// Definir o espaço nominal para o arquivo +namespace Meu\Espaconominal; + +class MinhaClasse +{ +} + +// (de outro arquivo) +$cls = new Meu\Espaconominal\MinhaClasse; + +//Ou de dentro de outro espaço nominal. +namespace Meu\Outro\Espaconominal; + +use My\Espaconominal\MinhaClasse; + +$cls = new MinhaClasse(); + +//Ou você pode usar como apelido de espaço nominal; + +namespace Meu\Outro\Espaconominal; + +use Meu\Espaconominal as OutroEspaconominal; + +$cls = new OutroEspaconominal\MinhaClasse(); + +*/ + +``` + +## Mais informações + +Visite a [documentação oficial do PHP](http://www.php.net/manual/) +para referência e participação da comunidade. + +Se você estiver interessado em melhores práticas atualizadas, visite +[PHP The Right Way](http://www.phptherightway.com/). + +Se você está vindo de uma linguagem com bom gerenciamento de pacotes, confira +[Composer](http://getcomposer.org/). + +Para os padrões comuns, visite o Grupo de Interoperabilidade de Framework PHP +[PSR standards](https://github.com/php-fig/fig-standards). diff --git a/python.html.markdown b/python.html.markdown index 22d236ac..941ba9f4 100644 --- a/python.html.markdown +++ b/python.html.markdown @@ -105,8 +105,8 @@ None is None #=> True # None, 0, and empty strings/lists all evaluate to False. # All other values are True -0 == False #=> True -"" == False #=> True +bool(0) #=> False +bool("") #=> False #################################################### diff --git a/ru-ru/c-ru.html.markdown b/ru-ru/c-ru.html.markdown new file mode 100644 index 00000000..874e0821 --- /dev/null +++ b/ru-ru/c-ru.html.markdown @@ -0,0 +1,483 @@ +--- +language: c +filename: learnc.c +contributors: + - ["Adam Bard", "http://adambard.com/"] + - ["Árpád Goretity", "http://twitter.com/H2CO3_iOS"] +translators: + - ["Evlogy Sutormin", "http://evlogii.com"] +lang: ru-ru +--- + +Что ж, Си всё ещё является лидером среди современных высокопроизводительных языков. + +Для большинствоа программистов, Си – это самый низкоуровневый язык на котором они когда-либо писали, +но этот язык даёт больше, чем просто повышение производительности. +Держите это руководство в памяти и вы сможете использовать Си максимально эффективно. + +```c +// Однострочный комментарий начинается с // - доступен только после С99. + +/* +Многострочный комментарий выглядит так. Работает начиная с С89. +*/ + +// Импорт файлов происходит с помощью **#include** +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +// Файлы <в угловых скобочках> будут подключаться из стандартной библиотеки. +// Свои файлы необходимо подключать с помощью "двойных кавычек". +#include "my_header.h" + +// Объявление функций должно происходить в .h файлах или вверху .c файла. +void function_1(); +void function_2(); + +// Точка входа в программу – это функция main. +int main() { + // для форматированного вывода в консоль используется printf + // %d – означает, что будем выводить целое число, \n переводит указатель вывода + // на новую строчку + printf("%d\n", 0); // => напечатает "0" + // Каждый оператор заканчивается точкой с запятой. + + /////////////////////////////////////// + // Типы + /////////////////////////////////////// + + // int обычно имеет длину 4 байта + int x_int = 0; + + // short обычно имеет длину 2 байта + short x_short = 0; + + // char гарантированно имеет длину 1 байта + char x_char = 0; + char y_char = 'y'; // Символьные литералы заключаются в кавычки '' + + // long как правило занимает от 4 до 8 байт + // long long занимает как минимум 64 бита + long x_long = 0; + long long x_long_long = 0; + + // float это 32-битное число с плавающей точкой + float x_float = 0.0; + + // double это 64-битное число с плавающей точкой + double x_double = 0.0; + + // Целые типы могут быть беззнаковыми. + unsigned short ux_short; + unsigned int ux_int; + unsigned long long ux_long_long; + + // sizeof(T) возвращает размер переменной типа Т в байтах. + // sizeof(obj) возвращает размер объекта obj в байтах. + printf("%zu\n", sizeof(int)); // => 4 (на большинстве машин int занимает 4 байта) + + // Если аргуметом sizeof будет выражение, то этот аргумент вычисляется + // ещё во время компиляции кода (кроме динамических массивов). + int a = 1; + // size_t это беззнаковый целый тип который использует как минимум 2 байта + // для записи размера объекта + size_t size = sizeof(a++); // a++ не выполнится + printf("sizeof(a++) = %zu, где a = %d\n", size, a); + // выведет строку "sizeof(a++) = 4, где a = 1" (на 32-битной архитектуре) + + // Можно задать размер массива при объявлении. + char my_char_array[20]; // Этот массив занимает 1 * 20 = 20 байт + int my_int_array[20]; // Этот массив занимает 4 * 20 = 80 байт (сумма 4-битных слов) + + // Можно обнулить массив при объявлении. + char my_array[20] = {0}; + + // Индексация массива происходит также как и в других Си-подобных языках. + my_array[0]; // => 0 + + // Массивы изменяемы. Это просто память как и другие переменные. + my_array[1] = 2; + printf("%d\n", my_array[1]); // => 2 + + // В C99 (а также опционально в C11), массив может быть объявлен динамически. + // Размер массива не обязательно должен быть рассчитан на этапе компиляции. + printf("Enter the array size: "); // спрашиваем юзера размер массива + char buf[0x100]; + fgets(buf, sizeof buf, stdin); + size_t size = strtoul(buf, NULL, 10); // strtoul парсит строку в беззнаковое целое + int var_length_array[size]; // объявление динамического массива + printf("sizeof array = %zu\n", sizeof var_length_array); + // Вывод программы (в зависимости от архитектуры) будет таким: + // > Enter the array size: 10 + // > sizeof array = 40 + + // Строка – это просто массив символов, оканчивающийся нулевым (NUL (0x00)) байтом + // представляемым в строке специальным символом '\0'. + // Нам не нужно вставлять нулевой байт в строковой литерал, + // компилятор всё сделает за нас. + char a_string[20] = "This is a string"; + printf("%s\n", a_string); // %s обозначает вывод строки + + printf("%d\n", a_string[16]); // => 0 + // байт #17 тоже равен 0 (а также 18, 19, и 20) + + // Если между одинарными кавычками есть символ – это символьный литерал, + // но это тип int, а не char (по историческим причинам). + + int cha = 'a'; // хорошо + char chb = 'a'; // тоже хорошо (подразумевается преобразование int в char) + + /////////////////////////////////////// + // Операторы + /////////////////////////////////////// + + // Можно использовать множественное объявление. + int i1 = 1, i2 = 2; + float f1 = 1.0, f2 = 2.0; + + // Арифметика обычная + i1 + i2; // => 3 + i2 - i1; // => 1 + i2 * i1; // => 2 + i1 / i2; // => 0 (0.5, но обрезается до 0) + + f1 / f2; // => 0.5, плюс-минус погрешность потому что, + // цифры с плавающей точкой вычисляются неточно! + + // Модуль + 11 % 3; // => 2 + + // Операции сравнения вам уже знакомы, но в Си нет булевого типа. + // Вместо него используется int. 0 это false, всё остальное это true. + // Операции сравнения всегда возвращают 1 или 0. + 3 == 2; // => 0 (false) + 3 != 2; // => 1 (true) + 3 > 2; // => 1 + 3 < 2; // => 0 + 2 <= 2; // => 1 + 2 >= 2; // => 1 + + // Си это не Питон – операции сравнения могут быть только парными. + int a = 1; + // ОШИБКА: + int between_0_and_2 = 0 < a < 2; + // Правильно: + int between_0_and_2 = 0 < a && a < 2; + + // Логика + !3; // => 0 (логическое НЕ) + !0; // => 1 + 1 && 1; // => 1 (логическое И) + 0 && 1; // => 0 + 0 || 1; // => 1 (лигическое ИЛИ) + 0 || 0; // => 0 + + // Битовые операторы + ~0x0F; // => 0xF0 (побитовое отрицание) + 0x0F & 0xF0; // => 0x00 (побитовое И) + 0x0F | 0xF0; // => 0xFF (побитовое ИЛИ) + 0x04 ^ 0x0F; // => 0x0B (исключающее ИЛИ (XOR)) + 0x01 << 1; // => 0x02 (побитовый сдвиг влево (на 1)) + 0x02 >> 1; // => 0x01 (побитовый сдвиг вправо (на 1)) + + // Будьте осторожны при сдвиге беззнакового int, эти операции не определены: + // - сдвиг в знаковый бит у целого числа (int a = 1 << 32) + // - сдвиг влево отрицательных чисел (int a = -1 << 2) + + /////////////////////////////////////// + // Структуры ветвления + /////////////////////////////////////// + + // Условный оператор + if (0) { + printf("I am never run\n"); + } else if (0) { + printf("I am also never run\n"); + } else { + printf("I print\n"); + } + + // Цикл с предусловием + int ii = 0; + while (ii < 10) { + printf("%d, ", ii++); // инкрементация происходит после того как + // знаечние ii передано ("postincrement") + } // => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, " + + printf("\n"); + + //Цикл с постусловием + int kk = 0; + do { + printf("%d, ", kk); + } while (++kk < 10); // инкрементация происходит перед тем как + // передаётся знаечние kk ("preincrement") + // => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, " + + printf("\n"); + + // Цикл со счётчиком + int jj; + for (jj=0; jj < 10; jj++) { + printf("%d, ", jj); + } // => prints "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, " + + printf("\n"); + + // Ветвление с множественным выбором + switch (some_integral_expression) { + case 0: // значения должны быть целыми константами (и могут быть выражениями) + do_stuff(); + break; // если не написать break; то управление будет передено следующему блоку + case 1: + do_something_else(); + break; + default: + // если не было совпадения, то выполняется блок default: + fputs("ошибка!\n", stderr); + exit(-1); + break; + } + + /////////////////////////////////////// + // Форматирование вывода + /////////////////////////////////////// + + // Каждое выражение в Си имеет тип, но вы можете привести один тип к другому, + // если хотите (с некоторыми искажениями). + + int x_hex = 0x01; // Вы можете назначать переменные с помощью шеснадцатеричного кода. + + // Приведение типов будет пытаться сохранять цифровые значения. + printf("%d\n", x_hex); // => Prints 1 + printf("%d\n", (short) x_hex); // => Prints 1 + printf("%d\n", (char) x_hex); // => Prints 1 + + // Типы могут переполняться без вызова предупреждения. + printf("%d\n", (unsigned char) 257); // => 1 (Max char = 255 if char is 8 bits long) + + // Для определения максимального значения типов `char`, `signed char` и `unisigned char`, + // соответственно используйте CHAR_MAX, SCHAR_MAX и UCHAR_MAX макросы из <limits.h> + + // Целые типы могут быть приведены к вещественным и наоборот. + printf("%f\n", (float)100); // %f formats a float + printf("%lf\n", (double)100); // %lf formats a double + printf("%d\n", (char)100.0); + + /////////////////////////////////////// + // Указатели + /////////////////////////////////////// + + // Указатель – это переменная которая хранит адрес в памяти. + // При объявлении указателя указывается тип данных переменной на которую он будет ссылаться. + // Вы можете получить адрес любой переменной, а потом работать с ним. + + // Используйте & для получения адреса переменной. + int x = 0; + printf("%p\n", (void *)&x); // => Напечатает адрес в памяти, где лежит переменная x + // (%p выводит указатель на void *) + + // Для объявления указателя нужно поставить * перед именем. + int *px, not_a_pointer; // px это указатель на int + px = &x; // сохранит адрес x в px + printf("%p\n", (void *)px); // => Напечатает адрес в памяти, где лежит переменная px + printf("%zu, %zu\n", sizeof(px), sizeof(not_a_pointer)); + // => Напечатает "8, 4" в 64 битной системе + + // Для того, чтобы получить знаечние по адресу, напечатайте * перед именем. + // Да, использование * при объявлении указателя и получении значения по адресу + // немного запутано, но вы привыкнете. + printf("%d\n", *px); // => Напечаатет 0, значение перемененной x + + // Вы также можете изменять значение, на которое указывает указатель. + (*px)++; // Инкрементирует значение на которое указывает px на единицу + printf("%d\n", *px); // => Напечатает 1 + printf("%d\n", x); // => Напечатает 1 + + // Массивы удобно использовать для болшого количества однотипных данных. + int x_array[20]; + int xx; + for (xx = 0; xx < 20; xx++) { + x_array[xx] = 20 - xx; + } // Объявление x_array с значениями 20, 19, 18,... 2, 1 + + // Объявление указателя на int с адресом массива. + int* x_ptr = x_array; + // x_ptr сейчас указывает на первый элемент массива (со значением 20). + // Это рабоатет, потому что имя массива возвращает указатель на первый элемент. + // Например, когда массив передаётся в функцию или назначается указателю, он + // невявно преобразуется в указатель. + // Исключения: когда массив является аргументом для оператор '&': + int arr[10]; + int (*ptr_to_arr)[10] = &arr; // &arr не является 'int *'! + // он является "указателем на массив" (из десяти 'int'ов). + // или когда массив это строчный литерал, используемый при объявлении массива символов: + char arr[] = "foobarbazquirk"; + // или когда массив является аргументом `sizeof` или `alignof` операторов: + int arr[10]; + int *ptr = arr; // то же самое что и "int *ptr = &arr[0];" + printf("%zu %zu\n", sizeof arr, sizeof ptr); // напечатает "40, 4" или "40, 8" + + // Декрементация и инкрементация указателей зависит от их типа + // (это называется арифметика указателей) + printf("%d\n", *(x_ptr + 1)); // => Напечатает 19 + printf("%d\n", x_array[1]); // => Напечатает 19 + + // Вы также можете динамически выделять несколько блоков памяти с помощью + // функции malloc из стандартной библиотеки, которая принимает один + // аргумент типа size_t – количество байт необходимых для выделения. + int *my_ptr = malloc(sizeof(*my_ptr) * 20); + for (xx = 0; xx < 20; xx++) { + *(my_ptr + xx) = 20 - xx; // my_ptr[xx] = 20-xx + } // Выделяет память для 20, 19, 18, 17... 2, 1 (как int'ы) + + // Работа с памятью с помощью указателей может давать неожиданные и + // непредсказуемые результаты. + printf("%d\n", *(my_ptr + 21)); // => Напечатает кто-нибудь-знает-что? + // Скорей всего программа вылетит. + + // Когда вы закончили работать с памятью, которую ранее выделили, вам необходимо + // освободить её, иначе это может вызвать утечку памяти или ошибки. + free(my_ptr); + + // Строки это массивы символов, но обычно они представляются как + // указатели на символ (как указатели на первый элемент массива). + // Хорошей практикой считается использование `const char *' при объявлении + // строчного литерала. При таком подходе литерал не может быть изменён. + // (например "foo"[0] = 'a' вызовет ошибку!) + + const char *my_str = "This is my very own string literal"; + printf("%c\n", *my_str); // => 'T' + + // Это не работает, если строка является массивом + // (потенциально задаваемой с помощью строкового литерала) + // который находиться в перезаписываемой части памяти: + + char foo[] = "foo"; + foo[0] = 'a'; // это выполнится и строка теперь "aoo" + + void function_1() +} // конец функции main() + +/////////////////////////////////////// +// Функции +/////////////////////////////////////// + +// Синтаксис объявления функции: +// <возвращаемый тип> <имя функции>(аргументы) + +int add_two_ints(int x1, int x2) { + return x1 + x2; // Используйте return для возврата значения +} + +/* +Данные в функцию передаются "по значению", но никто не мешает +вам передавать в функцию указатели и менять данные по указателям. + +Например: инвертировать строку прямо в функции +*/ + +// void означает, что функция ничего не возвращает +void str_reverse(char *str_in) { + char tmp; + int ii = 0; + size_t len = strlen(str_in); // `strlen()` является частью стандартной библиотеки + for (ii = 0; ii < len / 2; ii++) { + tmp = str_in[ii]; + str_in[ii] = str_in[len - ii - 1]; // ii-тый символ с конца + str_in[len - ii - 1] = tmp; + } +} + +char c[] = "This is a test."; +str_reverse(c); +printf("%s\n", c); // => Выведет ".tset a si sihT" + +/////////////////////////////////////// +// Типы и структуры определяемые пользователем +/////////////////////////////////////// + +// typedef используется для задания стандартным типам своих названий +typedef int my_type; +my_type my_type_var = 0; + +// Структуры это просто коллекция данных, память выделяется последовательно, +// в том порядке в котором записаны данные. +struct rectangle { + int width; + int height; +}; + +// sizeof(struct rectangle) == sizeof(int) + sizeof(int) – не всегда верно +// из-за особенностей компиляции (необычное поведение при отступах)[1]. + +void function_1() { + struct rectangle my_rec; + + // Доступ к структурам через точку + my_rec.width = 10; + my_rec.height = 20; + + // Вы можете объявить указатель на структуру + struct rectangle *my_rec_ptr = &my_rec; + + // Можно доступаться к структуре и через указатель + (*my_rec_ptr).width = 30; + + // ... или ещё лучше: используйте оператор -> для лучшей читабельночти + my_rec_ptr->height = 10; // то же что и "(*my_rec_ptr).height = 10;" +} + +// Вы можете применить typedef к структуре, для удобства. +typedef struct rectangle rect; + +int area(rect r) { + return r.width * r.height; +} + +// Если вы имеете большую структуру, можно доступаться к ней "по указателю", +// чтобы избежать копирования всей структуры. +int area(const rect *r) { + return r->width * r->height; +} + +/////////////////////////////////////// +// Указатели на функции +/////////////////////////////////////// + +/* +Во время исполнения функции находятся по известным адресам в памяти. +Указатель на функцию может быть использован для непосредственного вызова функции. +Однако синтаксис может сбивать с толку. + +Пример: использование str_reverse по указателю +*/ + +void str_reverse_through_pointer(char *str_in) { + // Определение функции через указатель. + void (*f)(char *); // Сигнатура должна полность совпадать с целевой функцией. + f = &str_reverse; // Присвоить фактический адрес (во время исполнения) + // "f = str_reverse;" тоже будет работать. + //Имя функции (как и массива) возвращает указатель на начало. + (*f)(str_in); // Просто вызываем функцию через указатель. + // "f(str_in);" или вот так +} +``` + +## На почитать + +Лучше всего найдите копию [K&R, aka "The C Programming Language"](https://en.wikipedia.org/wiki/The_C_Programming_Language) +Это **книга** написанная создателями Си. Но будьте осторожны, она содержит идеи которые больше не считаются хорошими. + +Другой хороший ресурс: [Learn C the hard way](http://c.learncodethehardway.org/book/). + +Если у вас появился вопрос, почитайте [compl.lang.c Frequently Asked Questions](http://c-faq.com). + +Очень важно использовать правильные отступы и ставить пробелы в нужных местах. +Читаемый код лучше чем красивый или быстрый код. +Чтобы научиться писать хороший код, почитайте [Linux kernel coding stlye](https://www.kernel.org/doc/Documentation/CodingStyle). + +Также не забывайте, что [Google](http://google.com) и [Яндекс](http://yandex.ru) – ваши хорошие друзья. + +[1] http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member
\ No newline at end of file diff --git a/ru-ru/go-ru.html.markdown b/ru-ru/go-ru.html.markdown index 8098f601..27b5d894 100644 --- a/ru-ru/go-ru.html.markdown +++ b/ru-ru/go-ru.html.markdown @@ -1,6 +1,4 @@ --- -name: Go -category: language language: Go filename: learngo-ru.go contributors: diff --git a/ru-ru/objective-c-ru.html.markdown b/ru-ru/objective-c-ru.html.markdown new file mode 100644 index 00000000..72e3b9e0 --- /dev/null +++ b/ru-ru/objective-c-ru.html.markdown @@ -0,0 +1,317 @@ +--- +language: Objective-C +filename: LearnObjectiveC.m +contributors: + - ["Eugene Yagrushkin", "www.about.me/yagrushkin"] + - ["Yannick Loriot", "https://github.com/YannickL"] +translators: + - ["Evlogy Sutormin", "http://evlogii.com"] +lang: ru-ru +--- + +Objective-C — компилируемый объектно-ориентированный язык программирования, используемый корпорацией Apple, +построенный на основе языка Си и парадигм Smalltalk. +В частности, объектная модель построена в стиле Smalltalk — то есть объектам посылаются сообщения. + +```cpp +// Однострочный комментарий + +/* +Многострочный +комментарий +*/ + +// Импорт файлов фреймворка Foundation с помощью #import +#import <Foundation/Foundation.h> +#import "MyClass.h" + +// Точка входа в программу это функция main, +// которая возвращает целый тип integer +int main (int argc, const char * argv[]) +{ + // Создание autorelease pool для управления памятью + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + + // Используйте NSLog для печати в консоль + NSLog(@"Hello World!"); // Напечатает строку "Hello World!" + + /////////////////////////////////////// + // Типы и переменные + /////////////////////////////////////// + + // Простое объявление + int myPrimitive1 = 1; + long myPrimitive2 = 234554664565; + + // Помещайте * в начало названия объекта для строго типизированного объявления + MyClass *myObject1 = nil; // Строгая типизация + id myObject2 = nil; // Слабая типизация + + NSLog(@"%@ and %@", myObject1, [myObject2 description]); // напечатает "(null) and (null)" + // %@ – это объект + // 'description' это общий для всех объектов метод вывода данных + + // Строка + NSString *worldString = @"World"; + NSLog(@"Hello %@!", worldString); // напечатает "Hello World!" + + // Символьные литералы + NSNumber *theLetterZNumber = @'Z'; + char theLetterZ = [theLetterZNumber charValue]; + NSLog(@"%c", theLetterZ); + + // Целочисленный литералы + NSNumber *fortyTwoNumber = @42; + int fortyTwo = [fortyTwoNumber intValue]; + NSLog(@"%i", fortyTwo); + + // Беззнаковый целочисленный литерал + NSNumber *fortyTwoUnsignedNumber = @42U; + unsigned int fortyTwoUnsigned = [fortyTwoUnsignedNumber unsignedIntValue]; + NSLog(@"%u", fortyTwoUnsigned); + + NSNumber *fortyTwoShortNumber = [NSNumber numberWithShort:42]; + short fortyTwoShort = [fortyTwoShortNumber shortValue]; + NSLog(@"%hi", fortyTwoShort); + + NSNumber *fortyTwoLongNumber = @42L; + long fortyTwoLong = [fortyTwoLongNumber longValue]; + NSLog(@"%li", fortyTwoLong); + + // Вещественный литерал + NSNumber *piFloatNumber = @3.141592654F; + float piFloat = [piFloatNumber floatValue]; + NSLog(@"%f", piFloat); + + NSNumber *piDoubleNumber = @3.1415926535; + double piDouble = [piDoubleNumber doubleValue]; + NSLog(@"%f", piDouble); + + // BOOL (булевый) литерал + NSNumber *yesNumber = @YES; + NSNumber *noNumber = @NO; + + // Массив + NSArray *anArray = @[@1, @2, @3, @4]; + NSNumber *thirdNumber = anArray[2]; + NSLog(@"Third number = %@", thirdNumber); // Print "Third number = 3" + + // Словарь + NSDictionary *aDictionary = @{ @"key1" : @"value1", @"key2" : @"value2" }; + NSObject *valueObject = aDictionary[@"A Key"]; + NSLog(@"Object = %@", valueObject); // Напечатает "Object = (null)" + + /////////////////////////////////////// + // Операторы + /////////////////////////////////////// + + // Операторы работают также как в Си. + // Например: + 2 + 5; // => 7 + 4.2f + 5.1f; // => 9.3f + 3 == 2; // => 0 (НЕТ) + 3 != 2; // => 1 (ДА) + 1 && 1; // => 1 (логическое И) + 0 || 1; // => 1 (логическое ИЛИ) + ~0x0F; // => 0xF0 (побитовое отрицание) + 0x0F & 0xF0; // => 0x00 (побитовое И) + 0x01 << 1; // => 0x02 (побитовый сдвиг влево (на 1)) + + /////////////////////////////////////// + // Структуры ветвления + /////////////////////////////////////// + + // Условный оператор + if (NO) + { + NSLog(@"I am never run"); + } else if (0) + { + NSLog(@"I am also never run"); + } else + { + NSLog(@"I print"); + } + + // Ветвление с множественным выбором + switch (2) + { + case 0: + { + NSLog(@"I am never run"); + } break; + case 1: + { + NSLog(@"I am also never run"); + } break; + default: + { + NSLog(@"I print"); + } break; + } + + // Цикл с предусловием + int ii = 0; + while (ii < 4) + { + NSLog(@"%d,", ii++); // ii++ инкрементирует ii после передачи значения + } // => напечатает "0," + // "1," + // "2," + // "3," + + // Цикл со счётчиком + int jj; + for (jj=0; jj < 4; jj++) + { + NSLog(@"%d,", jj); + } // => напечатает "0," + // "1," + // "2," + // "3," + + // // Цикл просмотра + NSArray *values = @[@0, @1, @2, @3]; + for (NSNumber *value in values) + { + NSLog(@"%@,", value); + } // => напечатает "0," + // "1," + // "2," + // "3," + + // Обработка исключений + @try + { + // Ваше исключение здесь + @throw [NSException exceptionWithName:@"FileNotFoundException" + reason:@"File Not Found on System" userInfo:nil]; + } @catch (NSException * e) + { + NSLog(@"Exception: %@", e); + } @finally + { + NSLog(@"Finally"); + } // => напечатает "Exception: File Not Found on System" + // "Finally" + + /////////////////////////////////////// + // Объекты + /////////////////////////////////////// + + // Создание объектов через выделение памяти и инициализацию. + // Объект не является полнофункциональным пока обе части не выполнятся. + MyClass *myObject = [[MyClass alloc] init]; + + // В Objective-C можель ООП базируется на передаче сообщений. + // В Objective-C Вы не просто вызваете метод; вы посылаете сообщение. + [myObject instanceMethodWithParameter:@"Steve Jobs"]; + + // Очищайте память, перед завершением работы программы. + [pool drain]; + + // Конец программы. + return 0; +} + +/////////////////////////////////////// +// Классы и функции +/////////////////////////////////////// + +// Объявляйте свой класс в файле МойКласс.h +// Синтаксис объявления: +// @interface ИмяКласса : ИмяКлассаРодителя <ИмплементируемыеПротоколы> +// { +// Объявление переменных; +// } +// -/+ (тип) Объявление метода(ов). +// @end + + +@interface MyClass : NSObject <MyProtocol> +{ + int count; + id data; + NSString *name; +} +// При объявлении свойств сразу генерируются геттер и сеттер +@property int count; +@property (copy) NSString *name; // Скопировать объект в ходе присвоения. +@property (readonly) id data; // Генерация только геттера + +// Методы ++/- (return type)methodSignature:(Parameter Type *)parameterName; + +// + для методов класса ++ (NSString *)classMethod; + +// - для метода объекта +- (NSString *)instanceMethodWithParameter:(NSString *)string; +- (NSNumber *)methodAParameterAsString:(NSString*)string andAParameterAsNumber:(NSNumber *)number; + +@end + +// Имплементируйте методы в файле МойКласс.m: + +@implementation MyClass + +// Вызывается при высвобождении памяти под объектом +- (void)dealloc +{ +} + +// Конструкторы – это способ осздания объектов класса. +// Это обычный конструктор вызываемый при создании объекта клсааа. +- (id)init +{ + if ((self = [super init])) + { + self.count = 1; + } + return self; +} + ++ (NSString *)classMethod +{ + return [[self alloc] init]; +} + +- (NSString *)instanceMethodWithParameter:(NSString *)string +{ + return @"New string"; +} + +- (NSNumber *)methodAParameterAsString:(NSString*)string andAParameterAsNumber:(NSNumber *)number +{ + return @42; +} + +// Методы объявленные в МyProtocol (см. далее) +- (void)myProtocolMethod +{ + // имплементация +} + +@end + +/* + * Протокол объявляет методы которые должны быть имплементированы + * Протокол не является классом. Он просто определяет интерфейс, + * который должен быть имплементирован. + */ + +@protocol MyProtocol + - (void)myProtocolMethod; +@end +``` +## На почитать + +[Wikipedia Objective-C](http://en.wikipedia.org/wiki/Objective-C) + +[Learning Objective-C](http://developer.apple.com/library/ios/referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/) + +[iOS For High School Students: Getting Started](http://www.raywenderlich.com/5600/ios-for-high-school-students-getting-started) + +[iOS разработчик: Обзор книг для новичка](http://habrahabr.ru/post/166213/) + +[Хочешь быть iOS разработчиком? Будь им!](http://www.pvsm.ru/ios/12662/print/) diff --git a/zh-cn/bash-cn.html.markdown b/zh-cn/bash-cn.html.markdown new file mode 100644 index 00000000..e3eed3a6 --- /dev/null +++ b/zh-cn/bash-cn.html.markdown @@ -0,0 +1,148 @@ +--- +category: tool +tool: bash +contributors: + - ["Max Yankov", "https://github.com/golergka"] + - ["Darren Lin", "https://github.com/CogBear"] + - ["Alexandre Medeiros", "http://alemedeiros.sdf.org"] +translators: + - ["Chunyang Xu", "https://github.com/XuChunyang"] +filename: LearnBash-cn.sh +lang: zh-cn +--- + +Bash 是一个为 GNU 计划编写的 Unix shell,是 Linux 和 Mac OS X 下的默认 shell。 +以下大多数例子可以作为脚本的一部分运行也可直接在 shell 下交互执行。 + +[更多信息](http://www.gnu.org/software/bash/manual/bashref.html) + +```bash +#!/bin/sh +# 脚本的第一行叫 shebang,用来告知系统如何执行该脚本: +# 参见: http://en.wikipedia.org/wiki/Shebang_(Unix) +# 如你所见,注释以 # 开头,shebang 也是注释。 + +# 显示 “Hello world!” +echo Hello, world! + +# 每一句指令以换行或分号隔开: +echo 'This is the first line'; echo 'This is the second line' + +# 声明一个变量: +VARIABLE="Some string" + +# 下面是错误的做法: +VARIABLE = "Some string" +# Bash 会把 VARIABLE 当做一个指令,由于找不到该指令,因此这里会报错。 + + +# 使用变量: +echo $VARIABLE +echo "$VARIABLE" +echo '$VARIABLE' +# 当你分配 (assign) 、导出 (export),或者以其他方式使用变量时,变量名前不加 $。 +# 如果要使用变量的值, 则要加 $。 +# 注意: ' (单引号) 不会展开变量(即会屏蔽掉变量)。 + + +# 在变量内部进行字符串代换 +echo ${VARIABLE/Some/A} +# 会把 VARIABLE 中首次出现的 "some" 替换成 “A”。 + +# 内置变量: +# 下面的内置变量很有用 +echo "Last program return value: $?" +echo "Script's PID: $$" +echo "Number of arguments: $#" +echo "Scripts arguments: $@" +echo "Scripts arguments separeted in different variables: $1 $2..." + +# 读取输入: +echo "What's your name?" +read NAME # 这里不需要声明新变量 +echo Hello, $NAME! + +# 通常的 if 结构看起来像这样: +# 'man test' 可查看更多的信息 +if [ $NAME -ne $USER ] +then + echo "Your name is you username" +else + echo "Your name isn't you username" +fi + +# 根据上一个指令执行结果决定是否执行下一个指令 +echo "Always executed" || echo "Only executed if first command fail" +echo "Always executed" && echo "Only executed if first command does NOT fail" + +# 表达式的格式如下: +echo $(( 10 + 5 )) + +# 与其他编程语言不同的是,bash 运行时依赖上下文。比如,使用 ls 时,列出当前目录。 +ls + +# 指令可以带有选项: +ls -l # 列出文件和目录的详细信息 + +# 前一个指令的输出可以当作后一个指令的输入。grep 用来匹配字符串。 +# 用下面的指令列出当前目录下所有的 txt 文件: +ls -l | grep "\.txt" + +# 重定向可以到输出,输入和错误输出。 +python2 hello.py < "input.in" +python2 hello.py > "output.out" +python2 hello.py 2> "error.err" +# > 会覆盖已存在的文件, >> 会以累加的方式输出文件中。 + +# 一个指令可用 $( ) 嵌套在另一个指令内部: +# 以下的指令会打印当前目录下的目录和文件总数 +echo "There are $(ls | wc -l) items here." + +# Bash 的 case 语句与 Java 和 C++ 中的 switch 语句类似: +case "$VARIABLE" in + # 列出需要匹配的字符串 + 0) echo "There is a zero.";; + 1) echo "There is a one.";; + *) echo "It is not null.";; +esac + +# 循环遍历给定的参数序列: +# 变量$VARIABLE 的值会被打印 3 次。 +# 注意 ` ` 和 $( ) 等价。seq 返回长度为 3 的数组。 +for VARIABLE in `seq 3` +do + echo "$VARIABLE" +done + +# 你也可以使用函数 +# 定义函数: +function foo () +{ + echo "Arguments work just like script arguments: $@" + echo "And: $1 $2..." + echo "This is a function" + return 0 +} + +# 更简单的方法 +bar () +{ + echo "Another way to declare functions!" + return 0 +} + +# 调用函数 +foo "My name is" $NAME + +# 有很多有用的指令需要学习: +tail -n 10 file.txt +# 打印 file.txt 的最后 10 行 +head -n 10 file.txt +# 打印 file.txt 的前 10 行 +sort file.txt +# 将 file.txt 按行排序 +uniq -d file.txt +# 报告或忽略重复的行,用选项 -d 打印重复的行 +cut -d ',' -f 1 file.txt +# 打印每行中 ',' 之前内容 +``` diff --git a/zh-cn/brainfuck-cn.html.markdown b/zh-cn/brainfuck-cn.html.markdown new file mode 100644 index 00000000..a6f3fa09 --- /dev/null +++ b/zh-cn/brainfuck-cn.html.markdown @@ -0,0 +1,70 @@ +--- +language: brainfuck +lang: zh-cn +contributors: + - ["Prajit Ramachandran", "http://prajitr.github.io/"] + - ["Mathias Bynens", "http://mathiasbynens.be/"] +translators: + - ["lyuehh", "https://github.com/lyuehh"] +--- + +Brainfuck 是一个极小的只有8个指令的图灵完全的编程语言。 + +``` +除"><+-.,[]"之外的的任何字符都会被忽略 (不包含双引号)。 + +Brainfuck 包含一个有30,000个单元为0的数组,和 +一个数据指针指向当前的单元。 + +8个指令如下: ++ : 指针指向的单元的值加1 +- : 指针指向的单元的值减1 +> : 将指针移动到下一个单元(右边的元素) +< : 将指针移动到上一个单元(左边的元素) +. : 打印当前单元的内容的ASCII值 (比如 65 = 'A'). +, : 读取一个字符到当前的单元 +[ : 如果当前单元的值是0,则向后调转到对应的]处 +] : 如果当前单元的值不是0,则向前跳转到对应的[处 + +[ 和 ] 组成了一个while循环。很明显,它们必须配对。 + +让我们看一些基本的brainfuck 程序。 + +++++++ [ > ++++++++++ < - ] > +++++ . + +这个程序打印字母'A'。首先,它把 #1 增加到6,使用它来作为循环条件, +然后,进入循环,将指针移动到 #2 ,将 #2 的值增加到10,然后 +移动回 #1,将单元 #1 的值减1,然后继续。循环共进行了6次。 + +这时,我们在 #1,它的值为0,#2 的值为60,我们移动到 +#2,将 #2 的内容加上5,然后将 #2 的内容打印出来,65在 +ASCII中表示'A', 所以'A'就会被打印出来。 + + +, [ > + < - ] > . + +这个程序从用户的输入中读取一个字符,然后把它复制到 #1。 +然后我们开始一个循环,移动到 #2,将 #2 的值加1,再移动回 #1,将 #1 +的值减1,直到 #1的值为0,这样 #2 里就保存了 #1 的旧值,循环结束时我们 +在 #1,这时我们移动到 #2,然后把字符以ASCII打印出来。 + +而且要记住的一点就是,空格在这里只是为了可读性,你可以将他们写成这样: + +,[>+<-]>. + +试着思考一下这段程序是干什么的: + +,>,< [ > [ >+ >+ << -] >> [- << + >>] <<< -] >> + +这段程序从输入接收2个参数,然后将他们相乘。 + +先读取2个输入,然后开始外层循环,以 #1 作为终止条件,然后将指针移动到 +#2,然后开始 #2 的内层循环,将 #3 加1。但是这里有一个小问题,在内层 +循环结束的时候,#2 的值是0了,那么下次执行外层循环的时候,就有问题了。 +为了解决这个问题,我们可以增加 #4 的值,然后把 #4 的值复制到 #2, +最后结果就保存在 #3 中了。 +``` +好了这就是brainfuck了。也没那么难,是吧?为了好玩,你可以写你自己的 +brainfuck程序,或者用其他语言写一个brainfuck的解释器,解释器非常容易 +实现,但是如果你是一个自虐狂的话,你可以尝试用brainfuck写一个brainfuk的 +解释器。 |