Задать вопрос
  • Как сделать синхронизацию оффлайн приложения?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Очень хороший пример - devdocs.io
    + Автоматическая синхронизация
    + Хранилище - IndexedDB
    + полный стек оффлайн приложения с большими наборами данных
    + блин, все просто: 8 api вызовов к браузеру!

    Кстати, народ обычно забывает, что и WebKit, и Mozilla Local/Session Storage организованы поверх встроенного движка SQLite. Это я к тому, что некошерно хранить серьезные данные в Storage, когда есть в распоряжении мощный движок для хранения данных, не просто Key->ShortValue, а движок Key->Document (иначе обзываемый NoSQL).

    Поясню разницу: в Local/Session Storage уместно хранить небольшой набор часто используемых данных с небольшими конкретными значениями, для хранения документов - используйте движок IndexedDB. Нет смысла прятать в IDB куки - обращение к Storage в этом случае значительно быстрее, но впихивать в Storage документы - это уже полное извращение, в этом случае IDB будет в сотни раз быстрее.

    Вдогонку: модный некогда термин NoSQL, по сути свелся к механизмам хранения Key->Document, и современные документ-ориентированные хранилища теперь пытаются приспособить SQL к этим движкам.

    Учите матчасть, потомки!
    Ответ написан
    Комментировать
  • Есть ли уроки по современной разработке на JS?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    learn.javascript.ru
    если мало: https://google.com/, https://yandex.ru

    и вот там, наверху есть поиск по тостеру, где ваш "суперуникальный вопрос" уже как-то задавался раз так эдак сто-питсот.
    Ответ написан
    Комментировать
  • Какие плагины использовать веб разработчику в sublime text 3?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    ВСЕ!

    Ставлю по необходимости, ищу доступное на packagecontrol.io - настроен как поисковик в браузере.

    Раз в пару месяцев или чаще - сношу все нахрен, и далее по рекурсии.

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

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Донести до заказчика, что твоя подпись - аналог подписи Рембранта, которая поможет другим, его коллегам, при выборе исполнителя.

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

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

    Самая лучшая защита - работать так, чтобы клиенты могли хвастаться: "смотри, кто мне сайт разрабатывал!" :)
    Ответ написан
    1 комментарий
  • Что выбрать Slack или HipChat?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Небольшие бюджеты, маленькая команда, проекты короткой жизни - BitBucket.

    Open Source, Community, Long Term Projects или просто бабла немеряно и хочется прЫстижу - GitHub.

    И уже отсюда пляшем:

    • Slack крут в расширяемости и хорошо дружит c github.
    • HipChat дружит с bitbucket, позволяет выкинуть Скайп и массу другого сопутствующего барахла, что приятно для "оторванной удаленки", когда члены команды работают "с коленок", откуда-нибудь с теплого пляжа или сибирской тайги, и ради экономии батарейки вынуждены прибивать лишние процессы.


    Ну, уж если чего-то вдруг, то есть суперлегкий и супердемократичный телеграм с его суперпопулярными ботами, которым можно дополнить и то и другое.

    ЗЫ: пользуюсь и тем, и другим в разных командах - своё. И, черт бы его побрал, скайп пока совсем выкинуть не получается, да и остальной зоопарк хенгаутов, вайберов и вотсапов приходится держать про запас.
    Ответ написан
    Комментировать
  • Какая функция может выдавать случайные значения от 0 до 1 разной длинны?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    В Javascript доступна одна - Math.random(), все остальное рандомное и псевдорандомное в Javascript все-равно крутиться вокруг нее.
    Если нужно случайное число определенной длинны, проще создать искусственно.

    Случайное число длиной в 3 знака после запятой:

    '0.' + ((1+Math.random())*1000|0).toString().slice(1)


    или так:

    Math.random().toString().slice(0, 2 + 3 )
    Ответ написан
    Комментировать
  • Как найти подряд три идущих единицы с использованием битовой логики?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Судя по всему задание - учебное, задание, скорее всего, составлял спец по алгоритмам. Поэтому готового решения задачи приводить не буду, а дам подсказки.

    1. Массив Map можно конвертировать в массив байтов или просто рассматривать каждую строку, как массив битовых значений, соответствующих байту.
    Внешним циклом на этом этапе, будет перебор строк.
    В таком случае можно применять битовую логику:
    byteVal = Map[idx][0]*128+ Map[idx][1]*64+ Map[idx][2]*32+ Map[idx][3]*16+ Map[idx][4]*8+ Map[idx][5]*4+ Map[idx][6]*2+Map[idx][7]*1;


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

    2. теперь, последовательно сравним byteVal с числами, содержащими подряд 3 единицы в битовом выражении. Таких чисел, будет всего 6(!) - поиграйтесь с калькулятором, чтобы убедиться.
    Это можно записать в одну операцию (чисел для сравнения небольшое количество, их легко подготовить с помощью калькулятора и назначить константам), либо использовать операцию сдвига, взяв за основу число 7, которое есть 7 и одинаково 7 и в 8ми, и в 10ти, и в 16ти разрядных записях - все-равно: 7 = 0x7 = 0o7, и все остальные, нужные для тестирования значения получать в цикле используя побитовый сдвиг.
    Т.е. внутри цикла перебора строк, после вычисления значения байта:

    var testVal = 7;
    
    for (var i = 0; i < 6 OR ; i++) {
        if ( profit = byteVal & testVal === testVal )
            console.log('Profit найден в позиции %i', 6-i);
       testVal <<= 1;  // то же, что и возведение 2 в следующую степень
    }


    UPD: кого-то может удивить, а где оптимизация сдвига? дело в том, что принцип необходимо и достаточно, никто не отменял. Для слишком длинных строк, такой способ непременим - ограничение размера сдвига для Javascript - 32.
    Для вычисления актуального размера сдвига нужно ГОРАЗДО больше операций, чем лишние пару циклов с побитовым сравнением. Это справедливо даже для ассемблера, а для любой реализации Javascript в частности - ваабче в 100500 раз. Мы уже на каждой итерации внешнего цикла в данном шаге экономим пару циклов.

    Код приведен в соответствие со стандартами ECMA262 (ES5), новых фишек ES6 (ES2015) в нем нет.

    3. Внешний цикл, в отличие от предыдущего шага, лучше будет сделать - для тестового значения. Внутренний цикл - для номера строки, начинающей блок сравнения, состоящий из 3 смежных строк - для просмотра, совпадений по вертикали, проходим циклом по строкам 6(!) раз, вычисляем byteVal для каждой из 3х строк блока сравнения, будем проверять значения на совпадение одного бита, т.е. начальное значение testVal = 1, сдвигать влево, тоже будем на 1 бит.
    Для оптимизации алгоритма, будем сравнивать сначала byteVal для 1й тестируемой строки, если не совпадает, сразу увеличиваем индекс начальной строки на 1 и уходим на следующий шаг, иначе - (если 1е сравнение == profit) сравнение второй строки набора сравнения, если неудачно - прибавляем к индексу 2, а если сравнение неудачно только на 3й строке - 3, и соответственно - следующий шаг сравнений.
    Оптимизация заключается в том, что мы пропускаем комбинации строк, где заведомо не будет подряд значений. Т.е. если при проверке 3й строки мы выяснили, что профита не светит, то мы начинаем проверку, со следующей строки, но считаем ее первой строкой проверяемого набора, т.е. сдвигаем указатель начала проверяемого блока сразу на 3 позиции, т.к. последовательная проверка блоков со смещением +1 и +2 - заведомо не дадут профита, т.к. мы уже точно знаем, что на этом участке с профитом - облом.

    4. Второй вариант решения по нахождению совпадений по столбцам - это транспонировать ("развернуть" массив, сделав строки столбцами) массив Map, и к нему применить шаги 1 и 2. Либо относиться к нему как к заведомо транспонированному, заменив перебор строк, на перебор позиций, тогда при вычислении byteVal, каждое Map[idx][x], заменить на Map[x][idx].

    Подробнее о битовых операциях на DevDocs.io и на Javascript.ru (по-русски)

    По алгоритмам поиска, на основе которого построена оптимизация поиска, советую почитать Дональд Кнут "Сортировка и поиск", либо Томас Кормэн и др. "Алгоритмы. Построение и анализ".

    P.S.: Честно говоря, на написание рабочего решения, мне понадобилось, в 20(!) раз меньше времени и раз в 5 меньше текста. Цените ленивые неучи, для вас старался, а то помрет старая гвардия и ваши рабочие места займут старательные индусы и дотошные китайцы!

    UPD2: в литературе по графике, распознаванию образов и еще каким-то анализаторами, такие задачи встречаются, как части, только массивы данных дец поширше, и знаааачительно подлиннее.
    Ответ написан
    Комментировать
  • Как реализовать быстрый поиск в массиве объектов по значению свойства?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Не сваливать все в объект, а сразу писать в IndexedDB, а необходимые для оперативной обработки данные, например выборку по городу, брать средствами работы с IndexedDB.

    Для браузеров не умеющих работать с IndexedDB есть библиотека PouchDB, менее шустрая, чем нативные встроенные в браузер реализации (UPD: если их нет, в противном случае - используются нативные), но даже на старых браузерах (IE7,8) будет выигрыш, как по удобству манипуляции данными, так и по скорости.

    UPD: обращение к IndexedDB НЕ блокирует интерфейс и может использоваться в воркерах (см. issues на странице).

    UPD: кстати, PouchDB :
    • сам использует IndexedDB, когда она доступна, в старых WebKit, в т.ч. на Android использует WebSQL, когда совсем плохо (старые IE) - тоже чего-нибудь придумывает, как минимум - localStorage;
    • дает возможность работать с серверными данными, как c локальными, когда они доступны, идеальное решение для снижения заморочек с созданием "оффлайн" приложения или одностраничника с "миллионом записей", проводя "репликацию";
    • все танцы с бубном вокруг индексов - фоновая, абсолютно прозрачная задача.
    • если поставить на сервере CouchDB или эмулировать ее Rest api - можно забирать всех "Вась из Омска" прямо с сервера одним вызовом
    UPD: И когда, наконец, народ научиться подбирать подходящий инструмент для работы, а не валить лес пилкой для ногтей и не вскапывать грядки карьерным самосвалом?
    Ответ написан
    1 комментарий
  • Как защитить свою верстку от рипа?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    По-этапно.

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

    Обе стороны рискуют по минимуму небольшими суммами, небольшими объемами работы. Если заказчик кидоватор - понятно станет очень быстро, и не нужно будет тратить время и нервы, и заказчик будет видеть, насколько часто у вас "помирают любимые тети позапрошлой кошки".

    Еще один плюс и для заказчика и для исполнителя: можно скорректировать некоторые технические моменты, требования и т.п. на ранних этапах, не дожидаясь окончания всей работы.

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

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

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

    Заморочки с технической защитой себя не оправдывают, хитрованы наймут за 10$ студента, который ухитрится и все-же стащит вашу работу стоимостью в килобакс.

    Минусы других предложений:
    - тимвьюер - вы сами пускаете чужака в свой огород или городите лишнюю машину
    - скайп - заказчик не может сам потрогат ручками, поэтому придирается к несущественному и тратит свое и ваше время, тем более, что это даже не переговоры, нужно согласовывать время по нескольку раз
    - ПДФ, скриншот - это не серьезно, никого не убедите

    Ну и при любом варианте, должен быть свой демо-сервер, который в любой момент можно "вкл", а можно "выкл".
    Ответ написан
  • Gulp. Не удается добавить sourcemap к js. В чем ошибка?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Делай сначала uglify, потом concat.
    и будет тебе Щасте!
    И не забудь указать путь куда писать sourcemap: soucremap.write('./') или куда тебе там его надо положить
    Ответ написан
    1 комментарий
  • Как с помощью jquery отсортировать блоки в нужном порядке при изменении размера экрана?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Там где flex недоступен, нужно именно javascript'ом.
    Например с помощью вот такой штуки vnjs.net/www/project/freewall
    Ответ написан
    Комментировать
  • Как сделать, чтобы ссылки в iframe открывались на моем сайте, а не на сайте, что внутри iframe?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Способ номер раз:

    var moi_site = 'http://bla-bla-bla.com/';
    $('#iframe_id a').each( function (idx) {
        var link $(this).attr('href');
        if (!link.match(/^https?:\/\//))
            $(this).attr('href', moi_site + $(this).attr('href'));
    });


    2й Способ. Не уверен, что сработает как надо, в разных браузерах тэг BASE как-то странно себя ведет, поэтому редко кем используется.

    var moi_site = 'https://example.com/';
    $('#iframe_id head').append('<BASE href="'+moi_site+'">');
    Ответ написан
  • Почему перестала запускаться mongodb?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    stackoverflow.com/a/30502253/4882514
    и вот хотфикс, про кторой там хоилварят: https://support.microsoft.com/en-gb/kb/2731284
    Ответ написан
    Комментировать
  • Какие есть интересные блоги современных JavaScript ниндзя?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    javascript.ru - ниндзее некуда
    tympanus.com - конченые ниндзя фронтенда
    Ответ написан
    Комментировать
  • Модульность для Simpla CMS

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    В том-то и плюс "немодульных" систем - целостность. Т.е. если работает, то "уронить" сложно.
    Еще один плюс - логичность и богатый функционал "из коробки".

    В настояшее время практически не развивается, но есть куча профессиональных сборок под любые нужды.
    Вся фишка Симплы в этом и есть - цельная и неубиваемая, поищите тесты стабильности и производительности магазинных скриптов, их в сети множество.
    Нужна модульность, т.е. необходимость включить или выключить некий функционал "на лету" - берите другую систему. Много денег - берите Битрикс, пусть другие мучаются, главное - денег не жалеть. Мало денег - берите ImageCMS или PrestaShop и изучайте программирование, потому-что 90% специалистов продвигающих эти системы либо энтузиасты, либо начинающие программисты, во многом придется разбираться самостоятельно. Старый форумщик и есть сайт на Джумла - берите VirtuMart (популярное развлечение мазохистов), RedShop или любое из десятков других. Современный блоггер - ВордПресс в помощь. Опытный программист, хотите полного контроля и удобства, а скорость не главное - MODx.

    Ну, а если нужно торговать - берите Симплу.
    Симпла - это решение из коробки, со всеми вытекающими "плюсами" и "минусами".
    Ответ написан
    Комментировать
  • Как урезать свой перфекционизм?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Столько комментариев не видел ни в одном ответе.
    Сразу напрашивается вывод о соотношении урезанного перфекционизма к профессионализму.

    Сам прокристинатор со стажем, поэтому не буду давать советы, а приведу цитаты:
    Кот ежедневно вылизывает свое хозяйство, а профи сразу делает хорошо. Если сделано нехорошо, значит не профи, возможно, опыт этого проекта сделает тебя профи на следующем проекте. (старый препод по проектированию микропроцессоров, никогда не знал его фамилию)
    Опыт сын ошибок трудных, а гений - парадоксов друг. (А.Пушкин)
    Лучшее - враг хорошего, давно сказано (народная мудрость)
    А хорошее всегда полезно (т.е. работает) - давно замечено, нужное всегда просто, непростое - не нужно. (Михаил Калашников). И того же источника: простое сделать всегда сложнее, а сложное сделать гораздо проще.
    Профессионала отличает выбор инструмента и отношение к нему. (А. Макаренко)
    Правильно организованный процесс - хороший повод для успеха. (Генри Форд) и того же источника самую знаменитую фразу про цвет автомобиля переделаем: Рефакторинг может быть любой величины, главное, чтобы это был 0.
    Хорошее дело браком не назовут (немного не в тему, но в нашем случае - подойдет)

    В основном согласен с остальными специалистами по перфекционизму и прокристинации: главное следование цели в установленные сроки. Это наука, а как это сделать - уже исскуство, для которого нужны воля и талант. :)

    Успехов всем и не вешать нос!
    Ответ написан
    2 комментария
  • Как написать приложение на ios на js и html?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Apache Cordova или Node-Webkit от Intel. Оба в параллель позволяют собирать и для Android, и для iOS.
    Есть примеры довольно навороченных коммерческих играшек собранных на этих инструментах.
    Разработку можно вести в любой среде, отлаживать на симуляторе или iPhone, Mac машина совершенно не обязательна.
    Ответ написан
    Комментировать
  • Какой MongoDB ODM посоветуете?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    А смысл? Вы ж REST создаете! Что уже само по себе обертка и зачем делать обертку через обертку? А про Doctrine рекомендую вообще забыть - ее задача нивелировать лень для SQL подхода и реализация оставляет желать лучшего. Есть подозрение, что MongoDB была выбрана для скорости, поэтому и поддерживайте сей подход.
    Ответ написан
    Комментировать
  • Какую key/value базу данных выбрать для словаря?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Из самых популярных, по которым тонны документации, в том числе на русском: MongoDB и CouchDB.
    Монго более популярна, есть куча драйверов для любых сред, а Couch - на мой взгляд - проще и дружелюбнее.

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

    Для быстрого освоения рекомендую "Litle Mongo Book" для MongoDB (в Сети есть русская версия, поищите на GitHub), а у CouchDB есть свой букварь и веб-интерфейс, с которым можно поиграться.

    Обе системы есть и для Windows и для LINUX. Обе имеют сокетный и веб шлюзы. Обе могут работать как самостоятельные HTTP серверы, т.е. легко создать веб-приложение и кучу всего интересного. Особой фишкой обеих можно назвать возможность создания хранимых процедур на Javascript.

    Cassandra - избыточное решение для Вашей задачи, которое может быть оправдано лишь в том случае, если разработка ведется на Java и для Java среды и все кроме Java не "это ж не Java" :).
    Ответ написан
  • Просмотр веб страницы из локальной сети из сети интернет, как?

    SynCap
    @SynCap
    Делаю интернет с 1998 года
    Вариантов 2:
    1. настроить на своей машине или поставить маршрутизатор NAT. Может быть и софтовым, можно и отдельной коробочкой. Тупо все запросы и ответы перемещает между 2мя интерфейсами. Особо хитрые могут транслировать запрос с одного интерфейса в несколько других, либо с нескольких в один и обратно.

    2. поставить на своей машине nginx, который будет заниматься тем же самым, только конкретно проксить HTTP запросы, и сконфигурить его на отдчау внешнему запросу (браузер через интернет) результатов такого же запроса к ВЕБ серверу в локальной сети. По форумам пр nginx валяется куча готовых конфигов, в которых только свои адреса прописать.

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

    Может встать проблема, если внешний IP интерфеса, по которому ваша машина зацеплена к интернету, динамический. В таком случае - Dynamic DNS (напр. dyndns.com), а на веб страничках сайта, который в интернете прописать ссылки с этим DynDNS, на своей машине ставите софтетку, которая периодически актуализирует IP.
    Также имеются маршрутизаторы с поддержкой DynDNS.

    Гуглищите, да обрящете! Главное - понять, чего искать.
    Ответ написан
    1 комментарий