понедельник, 29 июня 2015 г.

Как обменять значения двух переменных без использования третей в языке си

Приведу пять способов, без комментариев:
switch2val(int *a, int* b){
    *a=*b+*a;
    *b=*a-*b;
    *a=*a-*b;
}

switch2val(int *a, int *b){
     *a=*a+*b-(*b=*a);
}

switch2val(int *a, int *b){
     *a=*a^*b;
     *b=*a^*b;
     *a=*b^*a;
}

switch2val(int *a, int *b){
     *a=*b-~*a-1;
     *b=*a+~*b+1;
     *a=*a+~*b+1;
}

switch2val(int *a, int *b){
      *a=*b+*a,*b=*a-*b,*a=*a-*b;
}

вторник, 23 июня 2015 г.

Objective-C шпоргалка, часть 1

  • Члены класса называются инвариантами;
  • Создаваемые в Objective-С объекты классов размещаются в динамической памяти;
  • Тип id является указателем на объект любого класса (как void *);
  • Если тип, возвращаемы методом, не указан, то считается, что возвращается значение типа id;
  • Нулевой указатель именуется константой nil;
  • Инвариант isa присутствует в любом объекте класса, унаследовавшего класс NSObject;
  • Все классы должны наследовать класс NSObject;
  • Каждый класс сам по себе тоже является объектом;
  • Каждый объект Objective-C содержит в себе атрибут (инвариант) isa - указатель на объект класса данного объекта (экземпляра). Объект класса для данного объекта (экземпляра) автоматически создается компилятором и существует как один экземпляр, на который через isa ссылаются все экземпляры данного класса;
  • Все зарезервированные слова Objective-C, отличающиеся от зарезервированных слов языка С, начинаются с символа @;
  • Строковая константа класса NSString записывается как @”my string”;
  • Директива @protected стоит по умолчанию. Ограничивает область видимости инвариантов класса методами класса и методами производных классов;
  • Тип BOOL (на самом деле это unsigned char) принимает только константные значения YES и NO;
  • Объект выполняет метод если ему приходит сообщение, именуемое так же, как и требуемый метод. Такое сообщение называется селектор метода;
  • Директива @selector(name_of_method) возвращает скомпилированный селектор для имени метода name_of_method;
  • При посылке сообщения в nil оно исчезает;
  • Если в начале прототипа метода поставить знак '+', то такой метод будет считаться методом класса;
  • Такой метод не принимает неявный параметр self, соответственно указатель super тоже работать не будет;
  • Если в начале прототипа метода поставить знак '-', то такой метод называется методом объекта (или экземпляра);
  • Указатель на данные экземпляра текущего(данного) объекта доступен посредством зарезервированного слова self, а указатель на данные экземпляра базового класса – через super;
  • Все методы объектов в Objective-C являются виртуальными и всегда следуют динамическому полиморфизму;
  • В метод объекта также передается неявный параметр _cmd – селектор этого метода из глобальной таблицы селекторов;
  • Примеры описания (объявления) методов - метода объекта класса, метода класса без аргументов, с одним, с двумя и с переменным числом аргументов, соответственно:
    + (id)method1;
    - (void) method2;
    - (void) method3: (float) the_value1;
    - (void) method4: (float) the_value2 second_part_of_name_method4: (float) the_value3;
    - method: (id) object, ...;
  • Синтаксис вызова метода без параметров, с фиксированным числом параметров, с переменным числом параметров, соответственно, таков:
    [receiver method];
    [receiver method_arg1: 10 arg2: 10] - в данном случае имя метода является таким - method_arg1:arg2:  Этот момент наиболее трудно воспринимаем;
    [receiver variable_number_parameters: var1, var2, var3]; 
  • При посылке сообщения объекту, который принадлежит классу, не реализовавшему заказанный метод, возникает исключение, которое приводит к незапланированному завершению;
  • Поэтому, когда такая ситуация возможна, лучше провести соответствующую проверку:
    if ([object respondsToSelector: @selector(method::)])
    {
    [object method: 10 : 10];
    }
    else
    {

    }
    respondsToSelector - это метод класса NSObject;
  • Сообщение [receiver method] преобразуется в Си функцию с прототипом:
    id objc_msgSend(id receiver, SEL method, ...);
  • Тип SEL определен как char const*;
  • Во время выполнения все селекторы индексируются целыми значениями согласно глобальной таблице селекторов;
  • Глобальная таблица селекторов - это такая таблица, в которой некоему уникальному целому числу (селектору) соответствует своя строка (имя метода);
  • Функция objc_msgSend пользуясь инварианом isa oбъекта просматривает локальный список селекторов класса, чтобы определить, отвечает ли объект данного класса на сообщение method. Если у объекта-приемника данный селектор отсутствует, функция objc_msgSend() просматривает список селекторов его базового класса и т.д.;

пятница, 19 июня 2015 г.

Комбинации клавиш необходимые для комфортной работы в Mac OS X

  • Вызвать mission control: ctrl+"стрелка вверх";
  • Перейти на рабочий стол слева (если он создан в mission control):                                    ctrl+"стрелка влево";
  • Перейти на рабочий стол справа (если он создан в mission control):ctrl+"стрелка вправо";
  • Показать рабочий стол: F11;
  • Вызвать dashboard: F12;
  • Переместить фокус в меню: ctrl+F2;
  • Переместить фокус в dock: ctrl+F3;
  • Перейти к следующему несвернутому окну данного рабочего стола: ctrl+F4;
  • Перейти к  следующему несвернутому окну данного приложения: command+` ;
  • Переключиться между запущенными приложениями: command+tab;
  • Переместить фокус в меню статуса: ctrl+F8;
  • Поменять раскладку клавиатуры: command+space;
  • Вызвать spotlight: ctrl+space;
  • Убить текущее зависшее приложение: option+command+shift+esc;
Конечно вы можете поменять эти комбинации клавиш в system preferences. Здесь представлены установки по умолчанию. Также по умолчанию отсутствуют горячие клавиши для следующих операций: 
  • Вызвать launch pad;
  • Вызвать notification center;
  • Усыпить дисплей;
Я бы рекомендовал их определить для этих трех последних пунктов.Также очень удобной является комбинация:  
  • "Перейти в директорию" - shift+command+g;
По умолчанию в finder дерево файловой структуры частично невидно. Иногда это удобно, иногда - нет. На тот случай, когда вам надо переместиться в директорию, которая "невидима", эта комбинация клавиш незаменима.
Уверен - твердое знание этих комбинаций ускорит и сделает более комфортной вашу работу.
Кстати, обратите внимание, что клавиша ctrl более "крута", чем command.

понедельник, 15 июня 2015 г.

Программа "Hello, World" в питоне

Создаем текстовый файл hello.py следующего содержания:
#!/usr/bin/env python
import sys

def main():
    print 'Hello, ', sys.argv[1]

if __name__ == '__main__':
    main()
Далее из консоли делаем:
#chmod +x hello.py
Теперь из этой же директории можно сделать:
#hello World
В результате увидим в выводе следующее:
Hello, World

среда, 10 июня 2015 г.

Как послать почтовое сообщение из командной строки UNIX

Существует много способов сделать это, конечно. Приведем примеры с использованием утилит mail и mutt:
#echo "message" | mutt -a /path/to/file/with/attachment -s "subject" 
        -- my@e.mail.address
#mutt -a /path/to/file/with/attachment -s "subject" -- my@e.mail.address 
        < /path/to/file/with/text
#echo "message" | mail -s "subject" my@e.mail.address
#mail -s "subject" my@e.mail.address < /path/to/file/with/text