• Стоит ли отказываться от JS в мобильных версиях сайта?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    В принципе, верно все написали, что экономить трафик вырезанием JS - не лучшая история. Однако, лично меня жутко бесят сайты, что нагромоздили JS донельзя и что не ткнёшь пальцем - подвисает на пол секунды. Сам по себе браузер вещь довольно громоздкая и жрёт ресурсы неимоверно, а JS рад украсть ещё пару... миллионов тактов. Тогда как по производительности нынешние мобильные камни едва догоняют Pentium D, а это, простите, лет десять назад когда рендер JS-ом ещё только появлялся, а красивые странички напичканные (или полностью из) флешем (который имел GPU-ускорение) были пиком моды.
    Так что по правде - важно соблюдать компромисс. Да где угодно его важно соблюдать - пока грузится голый html, а потом рендерится JS-ом ещё несколько секунд (ибо не сразу всё подгружается) и начинает сиять всеми цветами радуги - чувствуется вся убогость www. Просто помните, что Вы пишите под браузер, который далеко не такой умный и быстрый, как хвалят его в Google, Apple, MS или Mozilla, а наоборот - неповоротливый, жадный до ресурсов и очень зависимый от качества Интернет-соединения.
    Так что вот правильный воркфлоу:
    1. Рендер на сервере в html.
    2. Упаковка JS и CSS скриптов в один .js и .css файл соответственно.
    3. Сжатие GZIPом упакованных .js и .css файлов и рендеренный .html файл.
    4. Передача сжатых данных на клиентское приложение (браузер).

    А вот небольшие наблюдения по поводу JS:
    Ответ написан
    4 комментария
  • Почему приложение x64 в два раза медленнее x86?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Отвечать на этот вопрос без какой-либо дополнительной информации - это как гадать на кофейной гуще. Какой CPU - если это древний Pentium D с допотопным конвейером и глупыми регистрами - одно дело, а если это новейший Core i7 на Haswell - другое. Что до настроек - вот честно, "стандартные" вообще ни о чём не говорит. Я уже не говорю, что было бы не плохо указать количество опытов с максимальным и минимальным - вполне возможно глупые ОС с планировщиком как-то неудачно распределяют время. Любой ответ, который можно тут указать может быть техническим грамотным, но совершенно не соответствующий истине.

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

    Теперь давайте вместе подумаем о том, какие различия между x86-64 и x86. На самом деле, вопрос поставлен не очень корректно - x86-64 почти полностью включает в себя x86. Из изменённого - размер указателя (адреса), да немного переделана логика регистров (хотя все они на месте, просто добавилось ещё лишние несколько десятков) - теперь часть аргументов в функцию передаётся через дополнительные регистры, тогда как в x86 все идут через стек. Однако получить здесь преимущество не так уж и просто - процессор тоже не дурак, в случае линейной обработки информации (или любая длительная работа с небольшими участками памяти) он прекрасно всё кэширует и работа со стеком в общем случае не сильно медленнее работы с регистрами.

    Теперь смотрим на код. Что там? Куча адресной арифметики, немного функций, да и аргументов почти нет. 8 миллионов слов? Не думаю что рекурсия вынудит вылезти стеку за пределы кэша, так что есть подозрение о паритете архитектур в данном случае. Однако большое количество адресной арифметики и увеличенный размер адреса в битах... во сколько раз? В два раза?

    Ну да ладно, ясное дело, сложение реализовано за 1 такт. Скорее всего. Конечно, здесь вопрос процессора, но даже узнав модель будет сложно узнать наверняка, разве только синтетическим тестом (много раз обращаться по адресу - сумме двух случайных чисел). Да и Windows 8.1 никогда не был стандартом производительности (скорее с точностью наоборот), и VC++ никогда не был лучшим компилятором.

    Попробуйте gcc (меня разве только интересует откуда на Windows взялся gcc) с флагом -O3. И посмотрите машинный код для 64 бита и 32 бита (можно пользоваться objdump из binutils или посмотреть машинный код в IDE Visual Studio - точно расположение кнопки не помню, но можно поискать в менюшках). Скорее всего причина не одна, их множество. Так, вызов функции сопровождается сохранением контекста, тогда как в x64 регистров больше, больше и контекст. Собираем такие моменты по крупицам... Вот и получаем.

    P.S. Давным давно, разговаривал с преподавателем. Простая перекомпиляция под 64 бита ускорила код на 30%. Это был колхозный кодек, немного похожий на libx264 (от туда была сдёрнута часть кода). Естественно, проект собирался со всеми оптимизациями, со всем расширениями инструкций - со всем, чем можно. И сборка под платформу x86-64 (с SSE, MMX, FMA и прочие). Жутко наукоёмкий разношёрстный код (писали все - от зелёных аспирантов, до ровесников Страуструпа и профессоров университета) - туева хуча функций, структур, объединений и очень, очень много параметров, многие из которых передают в аргументы функций. Ну и целевая платформа - жутко порезанный и переделанный Windows Embedded - там просто не чего было планировать.
    Ответ написан
    Комментировать
  • Как сравнить два массива и оставить только совпадающие данные, не загружая массивы в память?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ха. Ха ха. Ха ха ха. А как, простите, они сравниваться будут? На логической схеме диска? Ну можно читать по четыре байта (если речь идёт об int), обращаться как к int'у, сравнивать и записывать если одинаковые, передвигаясь дальше, иначе наибольшее оставляем.
    Ответ написан
  • Есть ли книга (гайд) по введению в разработку 3D игр для бывалых в других сферах программистов?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Товарищ, могу сказать как человек, который чего только не попробовал разрабатывая игру. Началось всё с чистого Си, был и C# (банальная формочка с кучей кнопочек), был и С++ (чистый opengl и box2d для физики), потом XNA - мощный фреймворк для C#, правда умер к сожалению. Был pygame, правда ничего дальше пары хэлоу ворлдов не продвинулось. Вот сейчас ковыряюсь в юнити. Нередко организуюсь с другом на хакатоны - надо заметить, что с каждым разом продвигаемся всё дальше и дальше. Правда каждый раз и начинаем заново.

    В общем, заметил несколько вещей. Во-первых, нужен не программист, а скриптер, по рангу он недалеко ушёл от кодера. То есть он и есть кодер, с тем лишь отличием, что скриптует сцены. Ну и да, было бы не плохо обзавестись другим скриптером, который напишет текст. Сегодня, для разработки игр программисты нужны лишь для ААА-проектов, когда требуется сварганить целый фреймворк и почти с нуля сотворить движок, ну или адаптировать старый к новому железу, что по сути одно и то же. Во-вторых, надо вообще много всякой шпаны - художники, дизайнеры, тестеры, звуковики. В общем, полный набор требуется. Конечно, можно совмещать все должности в одной, но это обычно плохо кончается.
    Алсо, выбрав путь не стоит с него сворачивать. Это я говорю как опытный сворачиватель с путей - код переписывать не стоит, иначе как только он более менее разрастётся только и будете, что переписывать. Рефакторинг тоже делать надо очень осторожно. Чем модульнее тем лучше. И так далее.

    По поводу манов - их дофига. Разной степени упоротости. Например, есть такой неплохой движок, как OGRE, у него на странице куча ссылок на демки, вики, книги, доки. Но это скорее для любителей хардкора. Для любителей велосипедов есть openal + opengl, ну или sdl + opengl. По opengl тоже много литературы, очень много. К тому же есть Unity3D, но программистам с ним, имхо, делать особо нечего - лишь ограничивает, да и по удобству он далеко не самый лучший, а производительность - ужс какой-то, хотя в большинстве задач хватает с головой.

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

    В любом случае, удачи в начинаниях!
    Ответ написан
    4 комментария
  • Как перехватить сигнал с видеокарты?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ну и какой мы хотим сигнал перехватить? Экран? Для этого есть фрейм граберы. А можно подключить композит и отдельной платой собирать аналог. Да и цифровой HDMI пусть и передаёт цифру, таки физика всё равно остаётся - снимаем напряжение и дело в шляпе, разве только делать это придётся очень быстро, да ещё и ошибки корректировать. Из софта можно хукнуть directx или opengl, но там скорее всего не будет шейдеров - издержки конвейера, или же создать виртуальный монитор, но здесь сложности с аппаратным ускорением. Есть более специализированные методы, вроде отслеживания участка памяти или общение с видеокартой посредством одного из множества API. Но эти способы очень платформозависимые.
    Ответ написан
    9 комментариев
  • Возможно ли использование смартфона без тачскрина?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Можно. Но вариантов тысячи и у всех телефонов они разные. Кто-то не хостует usb - его нужно запитать отдельно, у кого-то вообще провода чипованные (видали и такое). Некоторые не умеют через usb, но умеют через дебаговый input/output. Есть и другие вариант - через дебаговый i/o выкачать память, там распаковать её или прошить на донор (донор тела, кхм). Есть ещё вариант просто подключить по usb к компьютеру, включит и вытащить файлы как с usb. Вариантов много. Если почта нужна очень и срочно, или же просто нет желания разбираться во всём - проще просто сдать в сервис. Впрочем, хоть и адекватный сервис не будет много драть, таки адекватных сервисов мало и весьма вероятна ситуация, когда восстановить информацию будет дороже, чем поменять сенсор, да и не на много быстрее. Но другого выхода в общем-то и нет.
    Ответ написан
    Комментировать
  • Как делать ролики webm?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -c:v libvpx output.webm
    Ответ написан
    2 комментария
  • Как сжимать изображения без потери качества?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Приведённые фотографии имеют не очень высокое разрешение - 1280х795. При этом, на фотографии практически отсутствуют шумы.

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

    Источники бывают разные. К тому же, разные бывают и приёмники. Некоторые, такие как наш глаз и мозг, имеют серьёзные ограничения. Так, например, два рядом стоящие пиксели имеющие близкие значения (то есть кодирующие похожие оттенки), мозг обработает так, что оттенки различаться не будут. То есть можно сделать эти пиксели одинаковые - разницы для мозга не будет, а вот для одинаковых последовательностей прибавится, позволяя эффективнее сжать информацию.

    Если вы внимательно посмотрите на изображения, то заметите несколько интересных моментов - само изображения однотонное, редкие контрастные границы разделяют практически одноцветные области. Такое отлично сжимается и png.

    Вот мы и пришли к проблеме - во-первых, шумы делают сжатие очень не эффективным - их надо убрать. Ретуширование вам в помощь. Если изображение весьма разноцветное, стоит лишние ненужные цвета убрать - кадрированием или наложением фильтров. К тому же, некоторые моменты, весьма естественные, такие как прыщи и угри на лицах, складки на одеждах и в интерьере, резкий фон мало того, что придают не очень эстетический вид объекту фотографирования, а также усложняет восприятие композиции. То есть удаление ненужных объектов не только улучшит сжатие, но и весьма поспособствует восприятию. Наконец, цветокоррекция - если важно получить минимальное по размеру изображение, сильно увеличивать контраст и динамический диапазон - не лучшая идея, однако можно пойти на компромисс - расширяя диапазон уменьшать контраст и наоборот. Найдя баланс можно получить очень не плохое изображение в весьма компактном файле.
    Ответ написан
    1 комментарий
  • Как быстро вставить html с скриптами с помощью jquery?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Товарищ, если вам требуется загрузить страницу со скриптами, которых нет на вашей странице - что-то не так с архитектурой. Совсем не так. Но если засела асинхронная ересь в голове - грузите страницу, выпарсивайте скрипты и грузите отдельно.
    Ответ написан
    Комментировать
  • Телефон для фаната Palm Treo?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Вот вроде не плохой аппарат. К тому же уже года 3 как Xperia Pro с четвёртым андроидом. Ну а вообще, здесь все или почти все.
    Ответ написан
    Комментировать
  • Сжать 84гб одного видео?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4
    Ответ написан
  • Есть ли бесплатный почтовый сервис для своего домена вне РФ?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Товарищ. Бесплатный сыр только в мышеловке. В том смысле, что если что-то free, как free beer, то это лишь маркетинг. Туча ограничений, наверняка ещё и спам и никакой поддержки.

    Лучше купите небольшой VPS, да навесьте на него что-нибудь такое.
    Ответ написан
  • Инъекция рекламы в HTTP трафик, как реализовать и при помощи чего?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ну почему всё всегда сложно? Читай - не гугли, сразу спроси.

    Конкретно у вас - зависит от того, как настроено зеркало. Но если это не перенаправление запроса (что в общем-то глупо), то достаём любой веб-сервер, любые запросы зеркалим на целевой ресурс, в полученный ответ вставляем баннер (предварительно его надо будет распарсить, да). Радуемся жизни. Правда есть ли в этом смысл? Если ресурс популярный и вашим способом часто пользуются - проще сделать аккурат кнопку донат. Если нет - то с рекламы доход будет чуть более чем никакой.
    Ответ написан
    8 комментариев
  • Как складывать буквы?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    В Си есть функция itoa, которая принимает base в качестве базы системы исчисления. Внезапно, 36 - то что вам нужно. Правда сначала будут идти цифры, потом уже буквы. Если надо наоборот, смотрим реализацию, исправляем где надо.
    Ответ написан
  • Есть ли возможность вывода 3D графики на NES?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Нет. То есть да. Но не совсем. Почитайте, чтобы примерно понимать, что умеет NES.

    Окай. Что имеет NES? 1.5 мегамерца ЦП, да пара килобайт ОЗУ. Плюс 5 мегагерц очень специфического ГП, который умеет разве что спрайты рисовать, также имеющий пара килобайт памяти. Учитывая такие очень ограниченные характеристики, создать настоящее 3д не представляется возможным - NES, что забавно, даже тормозить не умеет. Так что выход - это подобие изометрии, с очень странным скроллингом фона и очень простой сценой.

    Впрочем, возможно, есть вариант с тем, чтобы похимичить над картриджем: там мы можем добавить ещё немного видеопамяти, которую можно попробовать изменять напрямую, извне, в самом картридже. Но это уже не NES.
    Ответ написан
    3 комментария
  • Как обрезать видео без пережатия?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ответ написан
    Комментировать
  • Как закодировать цифры в символы?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Окай. Делается это очень просто - мощность алфавита равняется 12ти, то есть нам потребуется 4 бита, чтобы его закодировать (хотим меньше - придётся обратится к хафманам). То есть свичём или ифами выбираем нужный квартет битов. Другими словами имеем отображение из символа в полубайт. Чтобы получать нормальные байты нужно разбивать на пары и складывать побитово результаты каждого символа с соответствующим смещением.

    Есть способ попроще, возможно даже быстрее в скорости работы. Берём все пары [0-9\,\-]{2} и строим по ним хэш-таблицу, или те же самые ифы-свичи. Таким образом мы отказались от мутных складываний, а если использовали хэш-таблицу это ещё и быстрее будет. То есть в результате у нас будет отображение пар небольшого алфавита в байт.

    Что-то мы естественно потеряем - мощность алфавита не кратна двойке - так что если требуется минимизировать трафик, возможно стоит сразу поточно жать в gzip, без предварительных манипуляций.
    Ответ написан
    Комментировать
  • Как составить уравнение?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    print random.choice([i for i in xrange(25, 326, 25)])


    Я к тому, что кроме приведения (0, 1] к требуемому промежутку можно использовать более простые методы. Тем более, два рандома не айс, если они честные, то есть их мало или они медленные. В вашем языке программирования (вернее, в вашей библиотеке) скорее всего есть что-то подобное.
    Ответ написан
    Комментировать
  • Как получить элементы массива или списка через рефлекцию (отражение, reflection)?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Не понял, что значит "поверхностный гугл".

    if (obj.GetType().IsArray)
      {
        obj.GetType().GetMethod("GetValue", typeof(int)).Invoke(obj, index);
      }


    Однако, возможно проще будет использовать DLR.
    Ответ написан
    1 комментарий
  • Нужна симка безлимит, что можете посоветовать?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Надо тогда взять несколько симок с абонентской по 300 рублей. Там в пакете 200 минут на всех + безлимит внутри сети: мегафон, мтс, билайн. Да, не очень удобно менять симки. Впрочем если совсем хард дискаунт, то надо брать всех операторов тарифы без абонентской со спец условиями внутри сети.

    А можно вообще подумать об одном билайне: получаем по два часа в день на разговоры, то около 3к в месяц. И это включая роуминг.
    Ответ написан
    Комментировать