вторник, 5 февраля 2013 г.

iOS разработка или первое знакомство с Objective C

После долгого пропуска решил немного написать. Быть может это пригодится еще кому-нибудь. Сталкиваюсь с информацией, на которую большой спрос в англоязычной части интернета и весьма скудное описание в русскоязычной. Objective C. Это то, с чем мне пришлось познакомиться не так давно. Пока воспоминания свежи напишу, пока разрозненно, потом постараюсь "собрать в кучу". Итак. Кажется, что это C/C++ с небольшими отличиями.
1) вместо обычного расширения  .c или .cpp  - .m
2) вместо #include - #import/
3) вместо class - @interface в заголовочном файле и @implementation в основном. Чем-то такая конструкция напомнила pascal с его модулями unit. Но никак не ожидал подобное увидеть в C.
4) вместо static - "+". для nonstatic (то есть принадлежащих объектам, а не классам) членов - "-".

5) Конкатенация (слияние) строк - отдельная тема для разговора. Конструкции такие, как "string1"."string2" как в php или хотя бы "string1"+"string2" - как в javascript или C# не работают. Самый "простой" (без преобразования типов в NSMutableString или NSArray) вариант - вызов сообщения stringByAppendingString как пример -
NSString *str;
NSString *res;
...
res=[str stringByAppendingString:@"_"];

Второй вариант сцепления строк -

[NSString stringWithFormat:@"%@/%@/%@", one, two, three];
Третий вариант - написание собственной статичной функции:

+ (NSString *) append:(id) first, ...
{
    NSString * result = @"";
    id eachArg;
    va_list alist;
    if(first)
    {
     result = [result stringByAppendingString:first];
     va_start(alist, first);
     while (eachArg = va_arg(alist, id)) 
      result = [result stringByAppendingString:eachArg];
     va_end(alist);
    }
    return result;
}

среда, 28 марта 2012 г.

Форматирование даты в JavaScript с помощью regex



Столкнулся с задачей в JavaScript вывода даты/времени с добавлением "0" (аналог функций lpad в mySql или Oracle), если значение меньше 10. В интернете данная задача решается с помощью создания функции, например, такой:

function pad(num, size) {
    var s = num+"";
    while (s.length < size) s = "0" + s;
    return s;
}
или такие:
function pad(num, size) {
    var s = "000000000" + num;
    return s.substr(s.length-size);
}

function zeroPad(num, places) {
  var zero = places - num.toString().length + 1;
  return Array(+(zero > 0 && zero)).join("0") + num;
}

вторник, 31 января 2012 г.

Размышления об изменениях...

Вчера вечером получил письмо от Google. Озаглавлено оно было так:
Изменения в Политике конфиденциальности и Условиях использования сервисов Google 

Особенно "понравилась" часть насчет персонального поиска:

Персонализация

Если вы вошли в аккаунт Google, результаты поиска становятся по-настоящему персональными.
На основе ваших предыдущих запросов в Google+, Gmail и YouTube мы будем стараться найти
для вас то, что нужно именно вам. Например, если вы раньше интересовались машинами, то по запросу "калина красная" вы в первую очередь увидите информацию о машинах, а не о ягодах
или фильме.


На мой взгляд, такой подход является плохим. Чтобы узнать то, что человеку нужно именно в этот момент, необходимо прочитать его мысли. Так как до сих пор еще нет устройства, позволяющего их читать, то использование "личных предпочтений" будет весьма негативно для конечных пользователей. Одно дело, когда один и тот же человек на протяжении многих лет, интересуется, например, политикой или авто, рыбалкой или туризмом. И его взгляды неизменны  на протяжении многих лет. Но что делать мне? Или таким как я. Сегодня услышал про старый фильм, заинтересовался им, поискал, завтра - новым авто, а Google все запомнил и так и норовит мне предложить то, что когда-то интересовало (причем интерес был сиюминутным), а сейчас уже это не то, что неинтересно, а совершенно безразлично. Представляете, поиск будет работать как старая газета или книга. Один раз прочитал - интересно, второй, третий, пятый - уже не так... А про десятый уже и говорить неохота. В общем никакой новизны. Поискал один раз цитату из Пушкина и всё. Так и любой запрос будет Google'м сначала все книги из Пушкина проверяться... Не очень, скажу, радостная перспектива. А как же настроение? У меня же оно меняется... Зато Google всё запомнит... Не хочу такой персонализации!!! Это  мне придется целую кучу аккаунтов заводить под каждое настроение или жизненный случай. Что за однобокость в мышлении?

среда, 25 января 2012 г.

Управление службой .NET через WinApi

Предыстория.
Для службы сбора данных через DDE необходимо активировать "Взаимодействие с рабочим столом" в свойствах службы. По какой-то причине встроенные функции установки службы не позволяют управлять данной возможностью. Имеется в виду классы ServiceInstaller и ServiceProcessInstaller. Из-за этого, а также в виду необходимости перезапуска службы при наступлении определенных событий, не используя при этом bat-файлы, планировщики задач и отдельные программы, появился такой класс:


пятница, 20 января 2012 г.

Основы AGAL

Начну с того, что AGALMiniAssembler.as который активно используется во всех примерах официально не поддерживается компанией Adobe, вследствие чего содержит небольшие неточности.
Во-первых, в нем описаны инструкции AGAL, которые на самом деле еще не реализованы (исключены). Это:

инструкции ifzinzifeineifgifliegielelseifreperpbrk, sgn.
А во-вторых, в нем нет двух инструкций, которые поддерживаются Flash Player'ом:
seq, sne.
Эти две инструкции аналогичны sge, slt.

среда, 18 января 2012 г.

stage3D в ActionScript, история начинается...

Посмотрел немного на шейдеры и "обилие" информации в интернете о реализации эффектов в шейдерах с иcпользованием AGAL (Adobe Graphics Assembly Language) и решил немного поизучать. Создал тестовый образец - вращающийся кубик, на основе которого можно попробовать небольшие эксперименты для себя (чтобы потом не забыть).

Для написания кода ActionScript использую FlashDevelop. Чтобы создать простейшее приложение - вращающийся кубик с разноцветными гранями, необходимо создать новый проект, за основу выбрав AS3 Project. Затем из меню Project выбрать пункт Properties и в списке версии платформы выбрать 11.0 и нажать OK.

По поводу 3D

Закончен вариант для 10-й версии Flash Player'а.
На мой субъективный взгляд, все довольно неплохо. Есть реализация освещения - исходя из угла между источником света и нормали грани.
Насчет производительности.
Проделана значительная оптимизация. Конечно, не до такого, что все массивы переделаны на списки, но раза в полтора быстрее, чем первоначальный вариант, и в несколько раз по сравнению со сторонними 3D-движками.
Итоги примерно таковы:
9031 вершина, 7904 грани, почти 17 тысяч треугольников (16956) показывают 13 fps (200 кадров за 14,8 - 15,2 секунды). До оптимизации было примерно 8 fps. Сторонние движки при загрузке такой модели без текстуры и освещения выдавали 2-3 fps.

И все-таки решил переходить на 11-ую версию с аппаратной поддержкой и урезанной версией шейдеров.
Та же модель, с текстурой и освещением - 20 fps. При этом код сократился довольно значительно. Прогресс налицо. Буду двигаться в том же направлении.