пятница, 27 июня 2014 г.

Как вывести список свойств и ivar ios Objective-c

Бывают случаи, когда нужно вывести список свойств и переменных класса, вот как это сделать:

        Class  downloadTaskClass = [downloadTask class];
        Class  taskClass = [downloadTaskClass superclass];
        Class  superTaskClass = [taskClass superclass];
        Class  superSuperTaskClass = [superTaskClass superclass];
        
        unsigned int count;
        Ivar * ivars = class_copyIvarList(downloadTaskClass, &count);
        for(unsigned int i = 0; i < count; ++i)
        {
            NSLog(@"%@::%s", downloadTaskClass, ivar_getName(ivars[i]));
        }
        NSLog(@"Properties: ");
        
        unsigned int outCount;
        objc_property_t * properties = class_copyPropertyList(downloadTaskClass, &outCount);
        for (unsigned int i = 0; i < outCount; i++)
        {
            objc_property_t property = properties[i];
            NSLog(@"%s %s\n", property_getName(property), property_getAttributes(property));
        }

четверг, 5 июня 2014 г.

Базовые операторы (Отрывок из незаконченного перевода книги Swift)

Оператор - это специальный символ или фраза, которые Вы используете для проверки, изменения или комбинирования значений. Например, оператор сложения (+) складывает два числа вместе ( как let i = 1 +1 ). Более сложные примеры включают логический оператор и && ( как в if enteredDoorCode && passedRetinScan ) и оператор инкремента ++i, который является упрощенным оператором (shortcut) увеличения значения  i на 1.

Swift поддерживает большинство стандартных операторов языка C и улучшает несколько возможностей для устранения частых ошибок при программировании. Оператор присваивания (=) не возвращает значение, что предотвращает его ошибочное использование вместо оператора равенста (==). Арифметические операторы ( +, -, *, /, % и т.д.) определяют и запрещают переполнение значений, чтобы избежать неожиданных результатов, когда работаешь с числами которые становятся больше или меньше того, что позволяет диапазон принимающей переменной. Вы можете изменять поведение переполнения значения, используя операторы переполнения, которые описаны в Операторы Переполнения

В отличии от C, Swift дает возможность выполнять оператор остатка от деления (%) для чисел с плавающей запятой. Swift также предоставляет два оператора диапазона ( a..b и a...b ), которых не было в C, как упрощенный оператор для выражения диапазона значений.

Эта глава описывает самые частые операторы Swift. Продвинутые Операторы охватывает продвинутые операторы Swift и описывает как определить Ваши собственные операторы и написать стандартные операторы для Ваших типов.

Терминология

Операторы бывают унарные, бинарные и тернарные:

  • Унарные оперируют одним значением (как например -a). Унарные префиксные операторы определяются сразу перед выражением ( как !b) и унарные постфиксные операторы сразу после (  i++ )
  • Бинарные оперируют двумя выражениями ( 2 + 3 ) и только
  • Тернарные операторы используют три выражения. Как и в C, в Swift есть только один тернанрный оператор, оператор состояния  ( a ? b : c )  
Значения, с которыми операторы взаимодействуют, называются операндами .
В выражении 1 + 2 ,  + это бинарный оператор, а 1 и 2 - это операнды.

Оператор Присваивания 

Оператор присваивания ( a = b ) инициализирует или обновляет значение a значением :

let b = 10
var a = 5
a = b

//а сейчас равно 10

Если правая сторона присваивания это tuple с множеством значений, то его значения сразу раскладываются и присваиваются каждой переменной или константе

let (x, y ) = (1, 2)
//x сейчас равен одному, а y равен 2

В отличии от оператора присваивания в C и Objective-C , оператор присваивания в Swift не возвращает значение. Следующие выражение не допустимо:

if x = y
{
    //это не допустимо поскольку x = y не возвращает значение
    
}

Это предотвращает использование оператора присваивания (=) как оператора сравнения равенства (==).  Не допуская if x = y, Swift помогает Вам избежать эти виды ошибок в Вашем коде.

Арифметические операторы

Swift поддерживает четыре стандартных арифметических оператора для всех числовых типов:
  • Сложение (+)
  • Вычитание (-)
  • Умножение (*)
  • Деление (/)

1 + 2 // равно 3
5 - 3 // равно 2
2 * 3 // равно 6
10.0 / 2.5 // равно 4.0 

В отличие от арифметических операторов в C и Objective-C, арифметические операторы в  Swift  не позволяют значениям переполняться по умолчанию.  Вы можете изменять поведение переполнения значения, используя операторы переполнения ( вроде a &+ b) , которые описаны в Операторы Переполнения

Оператор сложения также поддерживает конкатенацию строк :


"hello," + "world" //равно "hello,world"

Два символьных(character)  значения или одно символьное значение и одна строка(String) могут быть сложены вместе и создают новую строку :

let A: Character = "A"
let B: Character = "B"

let AB = A + B
//AB сейчас равно строке AB


Оператор Остатка 

Оператор Остатка ( a % b )  вычисляет сколько останется от деления a на b  и возвращает это значение

Заметьте:
Оператор остатка (%) еще известен как оператор модуля в других языках. Однако, в Swift это звучит как Оператор Остатка, поскольку он работает одинаково и с отрицательными числами .

Вот как этот оператор работает. Чтобы вычислить 9 % 4,  сначала посчитайте сколько 4ок поместится в 9ти:
         4          4 1
1 2 3 4 5 6 7 8 9

Вы можете поместить две 4ки внутри 9ки и у вас останется 1.

В Swift это может быть записано как:
9 % 4 //равно 1 
Чтобы определить ответ для a % b , оператор % считает следующее уравнение и возвращает остаток как значение 
a = (b x какой-то множитель ) + остаток 
Где "какой-то множитель" это самое большое количество множителей b, которое поместится в a.
Подставив 9 и 4 в это уравнение, получим:
9 = (4 x 2) +

Тот же метод применяется, когда рассчитывается остаток для отрицательного значения a:

-9 % 4 // равно - 1

Подставив -9 и в это уравнение, получим:
-9 = (4 x 2) + -
возвращаемый остаток = - 1

Знак b игнорируется для отрицательных значений b. Это значит, что a % b и a % -b всегда возвращают тот же ответ.

Остаток для чисел с плавающей запятой
В отличии от оператора остатка C и Objective-C, в Swift оператор остатка от деления также может работать с числами с плавающей запятой:

8 % 2.5 // равно 0.5

В этом примере, 8 разделенное на 2.5 равно 3 с остатком 0.5, т.е. оператор остатка возвращает Double значение 0.5

2.5  2.5  2.5 .5
1 2 3 4 5 6 7 8

Операторы Инкремента и Декремента

Как и в C, в Swift есть операторы инкремента ( ++ )  и декремента ( -- ) как упрощенный вариант ( shortcut ) для увеличения и уменьшения значения числовой переменной на 1. Вы можете использовать эти операторы с переменными целого типа и с плавающей запятой.

var i = 0
++i // i сейчас равно 1

Каждый раз когда Вы вызываете ++i , значение i увеличивается на 1. По существу, ++i это сокращенный способ сказать i = i + 1. Также, --i используется для сокращения i = i - 1.
Символы ++ и -- могут быть использованы как префикс и постфикс. ++i и i++  - оба выражения допустимые способы увеличить значение i на 1.  Точно как, --и i--  -допустимые способы уменьшить значение i на 1.

Заметьте что эти операторы изменяют i и также возвращают значение. Если вы хотите только уменьшить или увеличить значение, хранимое в i,  достаточно игнорировать возвращаемое значение.  И если вы используете возвращаемое значение, оно будет различным, в зависимости от того,  используете вы префиксную или постфиксную версию оператора, в соответствии со следующими правилами :
  • Если оператор написан перед переменной, он инкрементирует переменную перед тем как вернуть её значение.
  • Если оператор написан после переменной, он инкрементирует переменную после того как вернет значение.
var a = 0
let b = ++a
// a и b сейчас равны 1
let c = a++
// a рано 2 , с = 1

В примере выше, let b= ++a увеличивает a перед возвращением значения. Это почему a и b оба равны 1.
Также , let c = a++ увеличивает a после возвращения значения . Т.е. c получает старое значение 1, инкрементится a и становится равным 2.
За исключением, когда вам нужно специфичное поведение i++, рекомендуется использовать ++i и --i во всех случай, потому что у них типичное поведение изменения и возвращения значения. 

Унарный Оператор Минус

Знак численных значений может быть переключен, используя префикс -, известный как унарный оператор минус:
let three = 3  // равно 3

let minusThree = -three  // равно -3

let plusThree = -minusThree // равно 3

Унарный оператор минус (-) добавляется сразу перед значением, которым он оперирует, без пробелов.

Унарный Оператор Плюс

Унарный оператор плюс (+) возвращает значение перед которым стоит, ничего не изменяя:
let minusSix = -6  // равно 6

let alsoMinusSix = +minusSix // тоже равно 6

Хотя оператор плюс ничего по-существу не делает, Вы можете использовать его чтобы обеспечить симметрию в Вашем коде для положительных чисел, когда используете оператор минус для отрицательных чисел.

Составные операторы присваивания

Как C, Swift предоставляет составные операторы присваивания,  которые комбинируют операторы присваивания с другими операторами. К примеру,  присваивание с суммированием(+=):
var a = 1

a += 2 //a сейчас равно 3

Выражение a += 2 это упрощение для a = a + 2. Фактически, сложение и присваивание скомбинированы в один оператор, который выполняет обе задачи сразу.

Заметьте
Составное присваивание не возвращает значение . Вы не можете написать let b = a += 2 , например. Это поведение отличается от операторов инкремента и декремента.

Полный список составных операторов приваивания можно найти в Выражения .

Операторы сравнения 

Swift поддерживает все стандартные операторы сравнения C :
  • Равно ( a == b )
  • Не равно ( a !=b )
  • Больше чем ( a > b )
  • Меньше чем ( a < b )
  • Больше чем или равно ( a >= b )
  • Меньше чем или равно ( a <= b )
Заметьте
Swift также предоставляет два оператора равенства ( === и !== ), которые Вы используете для проверки являются ли два объекта-ссылки ссылающимися на тот же экземпляр объекта. Больше информации в Классах и Структурах . 

Каждый из операторов сравнения возвращает Булевое значение (Bool), которые показывает является ли выражение верным(true):
1 == 1  //true(верно) поскольку 1 равен 1
2 != 1  //true, поскольку 2 не равно 1
2 > 1   //true, поскольку 2 больше чем 1
1 < 2   //true, поскольку 1 меньше 2
1 >= 1  //true, поскольку 1 больше чем либо равно 1
2 <= 1  //false( не верно), поскольку 2 не меньше и не равно 1

Операторы сравнения часто используются в условных выражениях, таких как if :
let name = "world"

if name == "world"
{
    println("hello, world")
}
else
{
    println("Im sorry \(name),but I don't recognize you")
}

// Напечатается "hello, world", поскольку name == "world"
Для большего о if выражениях смотрите Control Flow .

Тернарный условный оператор

Тернарный условный оператор это специальный оператор с тремя частями, которые принимают форму question ? answer1 : answer2. Это упрощенный вариант для оценки одного из двух выражений, основанный на тот верно или нет выражение question . Если question верно (true), выполняется answer1 и возвращает значение; если не верно, то считается и возвращается  значение answer2. 
Тернарный условный оператор это упрощение для следующего кода:
if question
{
    answer1
}
else
{
    answer2
}

Здесь пример, который подсчитывает пиксели высоты для ячейки таблицы(table row).   Высота должна быть выше на 50 пикселей, чем высота контента, если у ячейки есть заголовок, и на 20 пикселей выше, если у ячейки нет заголовка:

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
//rowHeight равно 90 
//прим.переводчика: если Вы поставите ? сразу после hasHeader,будет ошибка

Предшествующий пример это сокращенный вариант кода :
let contentHeight = 40
let hasHeader = true
var rowHeight = contentHeight
if hasHeader
{
    rowHeight = rowHeight + 50
}
else
{
    rowHeight = rowHeight + 20
}

Первый пример использования тернарного условного оператора значит что rowHeight может установлен в нужное значение в единственной строке кода. Это более кратко, чем второй пример и позволяет rowHeight быть не переменной, а константой, поскольку её значение не будет изменено внутри if.
Тернарный условный оператор предоставляет эффективный способ решения какое из двух выражений принять. Используйте тернарный оператор с осторожностью. Его сжатость может привести к трудночитаемости кода. Избегайте комбинирование нескольких экземпляров тернарного оператора в одном сравнении. 

Операторы Диапазона 

Swift включает два оператора диапазона, которые упрощают обозначение диапазона значений

Оператор Закрытого Диапазона

Оператор закрытыго диапазона (a...b ) определяет диапазон который идет от a до b включая значения a и b

Оператор закрытого диапазона полезен когда итерации в диапазоне, в котором вы хотите использовать все значения, как for-in цикл:

for index in 1...5
{
    println("\(index) times 5 is \(index * 5)")
    index
}

// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

Для большей информации о for-in циклов смотрите Control Flow

Оператор Полузакрытого Диапазона


Оператор полузакрытого диапазона (a..b) определяет диапазон который идет от a до b, не включая b. Называется так, поскольку включает первое значение, но не последнее.

Полузакрытый диапазаон особенно полезен когда Вы работаете со списками типа массив(Array), где счет начинается с 0, а значит полезно использовать значение длина-1:

let names = ["Anna","Alex","Brian","Jack"]
let count = names.count
for i in 0..count
{
    println("Person \(i+1) is called \(names[i])")
}

// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack 

 Заметьте, что массив содержит четыре значения, но 0..count считает только до 3(индекс последнего элемента в массиве), поскольку используется полузакрытый диапазон. 
Для большей информации о массивах, смотрите Массивы

Логические Операторы

Логические Операторы изменяют или комбинируют Булевскиие логические значения true и false. Swift поддерживает три стандартных логических оператора из C-основанных языков:
  • Логическое отрицание ( !a )
  • Логическое и ( a && b )
  • Логическое или ( a || b )

Логическое Отрицание 

Оператор логического отрицания ( !a ) инвертирует Булевское значение, т.е. true становится false, и false становится true.
Этот оператор является префиксным, и появляется сразу перед значение над которым он работает, без пробелов. Это можно прочесть как "не a". Например:
let allowedEntry = false
if !allowedEntry
{
    println("Access Denied")
}

// напечатается "Access Denied"

Фраза if !allowedEntry может звучать как "не allowedEntry". Следующая строка выполнится только, если "не allowedEntry" равен true; это так, поскольку allowedEntry = false.
Как и в этом примере внимательный выбор Булевской константы и имени переменной, могут помочь сохранить коду читаемость и краткость, пока избегается двойное отрицание или запутанные логические выражения.

Логический Оператор И

Логический оператор И ( a && b ) создает логические выражения, где оба выражения должны быть true, чтобы общее выражение тоже было true.
Если любое значение false, то общее выражение тоже будет false. По факту, если первое значение false, второе не будет даже вычиcляться, поскольку невозможно чтобы общее выражение стало true . Это известно как быстрая схема вычисления .

В этом примере сравниваются две Булевые переменные и доступ разрешен, только если оба значения true:

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan
{
    println("Welcome!")
}
else
{
    println("Access Denied")
}

//напечатается "Access Denied"

Логический оператор ИЛИ

Логический оператор или  ( a || b ) это оператор, который используется для создания выражений, в которых общее значение будет true, если хотя бы одно из значений true.
Как и логический оператор и, логический или использует быструю схему вычисления. 
Если левая сторона выражения true, правая не вычисляется, поскольку правая уже не может изменить общего значения.
В примере ниже, первая Булевая переменная (hasDoorkey) равна false, однако второе значение (knowsOverridePassword) равна true. Поскольку одно значение true, общее выражение также считается true, и доступ разрешен:
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword
{
    println("Welcome")
}
else
{
    println("Access Denied")
}


//напечатается "Welcome!"

Комбинирование Логических Операторов

Вы можете комбинировать несколько логических операторов, чтобы увеличить количество сравнений:

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword
{
    println ("Welcome")
}
else
{
    println("Access Denied")
}

Этот пример использует несколько && и || операторов чтобы создать длинное смешанное сравнение. Однако, && и || всё еще работает с двумя операндами, т.е. это три маленьких выражения связанных вместе. Это можно прочесть как :
Если enteredDoorCode и passedRetinaScan; или если hasDoorKey ; или если knowsOverridePassword, то выполнить println("Welcome"), иначе  println("Access Denied").
Основываясь на enteredDoorCode, passedRetinaScan, and hasDoorKey, первые два выражения
false. Однако, knowsOverridePassword true, а значит и всё выражение true.

Явные скобки

Иногда полезно использовать скобки, когда они не необходимы, чтобы сделать общее выражение более читаемым. В верхнем выражении полезно добавить скобки в первую часть общего выражения, чтобы явно выделить выражение:

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword
{
    println ("Welcome")
}
else
{
    println("Access Denied")
}

Скобки делают понятнее, что первые два значения являются частью общего разделенного выражения. Вывод объединного выражения не изменяется, однако общий замысел более понятен читающему. Читаемости всегда отдается предпочтение перед краткостью; используйте скобки там, где они помогают сделать идею более ясной.

(Отрывок из перевода книги о Swift, правда сам проект закрылся, так что только несколько глав переведено)

пятница, 28 марта 2014 г.

Семь привычек высокоэффективного Objective-C


[Перевод] Семь привычек высокоэффективного Objective-C


Это вольный перевод статьи "Seven Habits of Highly Effective Objective-C" от Ash Furrow

В этой статье мы рассмотрим несколько эффективных привычек, которые помогут вам стать более продуктивным разработчиком. Эти советы я собрал из своего личного опыта, есть и другие, многие другие советы (я буду говорить о семи). Итак, давайте начнем. 

1. Используйте #pragma
Директива препроцессора #pragma является полезным инструментом для организации кода и для других интересных вещей. Я использую дерективу #pragma в первую очередь для объединения методов внутри класса в группы. Для примера:

#pragma mark - UICollectionViewDataSource & UICollectionViewDelegate Methods
//Методы делегата и данных
#pragma mark - Private Custom Methods
//Приватные методы

Когда я открываю выпадающий список для файла, на панели быстрого перехода, мои методы будут сгруппированы с добавлением заголовков. Дефис в начале метки добавляет горизонтальную строку в выпадающем списке


2. Используйте Core Data
Я колебался включать этот совет или нет и делаю это с оговоркой: используйте Core Data обдумано. Например, если нет необходимости в сохранении данных между запусками приложения или вам необходим полный контроль над структурой генерируемого SQL, то Core Data вам не подходит.

Core Data не является объектно-реляционной моделью. Фактически это просто менеджер графа объектов, у которого есть бэкэнд — SQLite.

Различие тонкое, но важное. Core Data полезна, если у вас слишком много объектов, чтобы сразу их разместить в памяти — это запросто может произойти на iPhone. Core Data может сохранять объекты в базе данных SQLite, plist или бинарном файл. Core Data также обеспечивает высоко-уровневый интерфейс запросов для извлечения объектов из графа.

Это очень полезный инструмент, который убережет вас от написания большого количества кода для управления памятью, кэшем и доступом к диску. Если вы будете использовать NSKeyedArchiver c NSUserDefaults или сохранять все в Plist, то вы должны рассмотреть возможность использования Core Data вместо этого.

У Core Data крутая кривая обучения, но как только вы освоите основы, это поможет вам сконцентрироваться на коде, который делает ваши приложения уникальными.

3. Пишите самодокументируемый код
Это может показаться очевидным, но тут есть некоторые тонкости. Очевидно, что имена переменных должны быть описательными (чтобы можно было понять назначение переменных). Другая практика самодокументируемого кода — использование Objective-C синтаксиса передачи сообщений. Для примера, следующие объявление метода вполне допустимо:

-(void)doSomethingWithInt:(int)anInt :(float)aFloat;

Этот метод вы вызвали бы так:

[obj doSomethingWithInt:13 :0.5f];

Но не будет ли больше смысла, если метод будет вызываться так?

[obj doSomethingWithInt:13 float:0.5f];

Теперь вы знаете больше о методе, потому что он был назван правильно. Я никогда не думал, что это проблема, пока не погрузился в некоторых проекты с открытым кодом. Я не буду называть эти проекты здесь. Это простой способ сделать ваш код более ясным, и другие будут благодарны вам за это.

Конечно, это не означает, что комментарии не важны. Я обнаружил, что комментарии к коду являются очень полезны для объяснения, почему часть кода делает что-то так, а не иначе. В любом случае, обе практики хороши.

4. Используйте иерархии View Controller
Иерархии View Controller были впервые введены в iOS 5. Они позволяют разработчикам разделить иерархии представлений на логические блоки, управляемые соответствующими контролерами представлений.

Когда вы отделяете логику управления иерархией подвидов (sub view) в отдельный View Controller, вы мгновенно делаете код пригодным для повторного использования. Это также позволяет сохранять небольшие файлы (следующий пункт).

Иерархии View Controller супер полезны и имеют много смысла. Я очень рекомендовал бы видео с WWDC 2011 года, где обсуждают их использование.

5. Храните небольшие файлы
Я обнаружил, что мне нравится иметь небольшие классы. Я думаю, что есть два типа больших классов: либо вы копируете и вставляете реализацию других классов и новый класс немедленно раздувается, либо класс накапливает все больше и больше логики с течением времени.

Рефакторинг кода в пользу категорий или расширений классов является отличным способом для минимизации повторяющегося кода. Перенос части кода в категории или расширения класса может помочь заставить вас хранить код раздельно, что позволяет его легко тестировать и рефакторить.

Сохраняя файлы небольшими, вы изначально ограничиваете количество логики содержащийся в каждом из них. Это гарантирует, что каждый класс выполняет только то, что от него требуется, это очень важно для поддержания кода. Это добавляет некоторые накладные расходы с точки зрения количества классов и количества пересылаемых между ними сообщений, но эти накладные расходы будут с лихвой компенсированы.

6. Изучите сочетания клавиш Xcode
Это общее правило использования компьютера: если часто выполняете одни и те же задачи мышью, то вместо этого попытайтесь выучить сочетания клавиш.

XCode изобилует ими. Левая панель поделена на области (список файлов, поиск, и др.), эти области могут быть показаны с помощью сочетания ⌘+X, где X — индекс области. Для примера, список файлов это первая область, так сочетание ⌘+1 показывает список файлов. ⌘+0 полностью скрывает левую панель.

Области на панели утилит с правой стороны, могут быть открыты и закрыты тем же сочетаниями с добавлением ⌥. Так, для открытия инспектора файлов, нажмите ⌘+⎇+1

Эти два набора сочетаний позволили мне добиться продуктивного, рабочего процесса.

Их много, очень много, но я думаю, что лучший способ изучать сочетания клавиш — это начать выполнять задачу, а затем выяснить как можно ускорить выполнение.

(Одно из моих любимых сочетаний — «Быстрое открытие» ⌘⇧-O. Это откроет приглашение для ввода, куда вы можете ввести строку поиска по файлам проекта и библиотекам. При поиске используется нечеткого соответствия, вы можете пропустить буквы в имени файла. Это просто фантастика для открытия заголовочных файлов!))

7. Практикуйте целеустремленность
Одной только практики не достаточно, вы должны быть целеустремленными в собственном развитии.

Это звучит глупо, я знаю. Я хочу сказать, что если вы хотите стать хорошим, действительно хорошим разработчиком, то вы должны себе внушать это.

Если вам нравится Objective-C, то вы должны читать других разработчиков в твиттере, читать Objective-C блоги. Найдите возможность учиться и вы станете лучшим разработчиком. Я знаю это.

суббота, 8 марта 2014 г.

Полезные ссылки для начинающих iOS разработчиков

#общие
Уроки cocos2d
HIG на русском
Storyboard Статья
Отличный сайт
Статьи IPhone
Блог OBJ-C
Создание xib-file ( brainforce)
Сайт посвященный всему, что связано Maс OS и IOS
http://touchdev.ru/
Всё о UIViewTable и Прочее
http://dou.ua/forums/topic/8933/
Полезные штуки для ios developer

http://makeappicon.com/
Утилита для создания appIcon.
Просто бросаете туда большую иконку и оно выдает вам все необходимые размеры

#Git
Основные команды для работы с - bash ( terminal) 

ls - показать список файлов в дериктории
cd someDirectory - перейти в директорию someDirectory
cd .. - выйти на уровень выше из текущей директории
touch имяфайла.расширение - создать файл в текущей директории
vim имяфайла - открыть для редактирования
выйти из vim - ZZ (именно капс) - выйти и сохранить,
- ZQ - выйти и не сохранить

(Но лучше используйте SourceTree)

Шпаргалка по Git
Git
Книга Git на русском
https://github.com/progit/progit/blob/master/ru/04-git-server/01-chapter4.markdown
Отличное видео "Terminal, Git and Github for the rest of Us"

http://jsonlint.com - сервис, где можно проверить ваш json  на валидность.