среда, 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. При этом код сократился довольно значительно. Прогресс налицо. Буду двигаться в том же направлении.

Еще одна мысль

Одним из аспектов искусственного интеллекта является способность к адаптации. Думаю, что можно реализовать такую адаптацию можно будет довольно легко. Если построить СИИ из нескольких блоков, одним из которых будет интерпретатор. И предусмотреть возможность изменения программной логики в процессе работы. Составить несложный язык программирования, скорее всего на основе байт-кодов, чтобы избежать возможных синтаксических ошибок при интерпретации. Желательно записывать тезисами мысли сразу после того, как они появились. После того, как проходит время, кое-что забывается, а тезисы помогают вспомнить даже последовательность логики, так сказать, вернуться в тоже состояние.

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

Несколько слов по поводу оптимизации ActionScript

В Интернете большое количество материалов, касающихся оптимизации как таковой, так и ActionScript в частности. Предлагается огромное количество способов записи арифметических выражений, циклов и прочего. Но заметно, что многие способы не тестируются или тестируются слишком поверхностно. Если говорить честно, то один и тот же способ при запуске несколько раз может показать различные результаты. Поэтому заявлять, что префиксный способ работает быстрее постфиксного, потому что один раз запустили, и первый способ показал прирост производительности на 1,1% не совсем корректно.
Что касается приложений по выводу графики, например, при срабатывании события ENTER_FRAME, то существуют, как минимум, две оценки - одна - время выполнения функции - обработчика события, а другая - периодичность вызовов данного обработчика. Не смотря на обилие источников информации об оптимизации, ни в одном из них вторая оценка не рассматривается. Казалось, бы это очевидно, что вызов данного обработчика происходит каждые (1000/framerate) мс. Но на самом деле, это далеко не так. В случае, когда обработчик выполняется дольше, чем время между вызовами, то частота вызовов снижается. Для вычисления обеих оценок можно выбрать такой способ - в начале обработчика засечь время, прошедшее со времени последнего запуска, потом в конце обработчика вычислить время выполнения функции и начать отсчет до следующего запуска.