Chrome extension за выходные

image

Проблема

Как обычно поздней ночью, садясь в автобус, я достал телефон, и пока набирал “habr…” он отрубился. Я вслух подумал: “А раньше не мог сказать?”, немного пожалел, что телефоны редко пищат, пока разряжаются. А потом…

Потом мы с приятелем решили подойти к вопросу по-мужски. Он написал программулину для андроида, а я расширил Хром. О последнем и пойдёт речь.

Задача

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

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

За дело.

Решение

Расширять Хром оказалось не так уж сложно, но надо было всё сделать как можно быстрее. Выходные одни, а хотелок много. Для ускорения разработки хотелось не париться с обработкой событий и обновлением HTML и knockout тут подошёл лучше всех. А поскольку вся логика для Хром-расширения пишется на javascript, избежать многих граблей помогает typescript. Эти двое из ларца сразу пошли в оборот. С технологиями опередлился, теперь самое главное. Полезной нагрузки много не ожидалось, но огород нагородить из спагетти можно и здесь. Самый простой и надёжный вариант виделся в паттерне MVC. C knockout он немного не вязался, тот сам по себе MVVM, но ясно было, что управление будет вестись с фоновой страницы (об этом позже) на которой knockout не будет. Выбор сделан. Вперёд — кодить. Времени осталось уже на час меньше.

Исполнение

Начал я с создания нового проекта в Visual Studio 2013, для простоты выбрал ASP.NET Empty application. Видел, отцы тут используют более подходящие шаблон — HTML Application with TypeScript — у меня его в наличии не было, поэтому пришлось попотеть с настройкой typescript compile-on-save

Прокачал проект минимумом библиотек и их typescript декларациями. Очень помог дружище Борис Янков с шикарным набором typescript-деклараций, хотя некоторые пришлось допиливать самому по ходу дела.

Далее компоненты MVC:

M: модели сделал две, одна на весь список, одна на отдельное андроид-устройство (PopupViewModel и DeviceStatusViewModel). По сути они ViewModel, но далее по тексту просто Модель
V: представление на 2 разбивать больше мороки, чем пользы, создал только popup.html
С: ну он так и назвался — Controller

Ещё сделал DeviceStatus — это структура, пересылаемая между расширением и сервером, а заодно и между Контроллером и Моделью.

Суперважный файл — manifest.json, этот нужен Хрому для разпознавания расширения.

Ещё пара манипуляций, и получилась вот такая картинка:

image

Теперь предстояло всё это наполнить смыслом, то есть классами. Хром ограничивает возможности своих расширений и старательно расставляет везде грабли, поэтому Контроллер у меня сразу пошёл в фоновую страницу (background page), поскольку именно он разговаривает с сервером, а это можно только из фона. Об этом соответствующая запись в manifest.json:

  "background": {
    "scripts": ["lib/jquery-1.7.2.min.js", "src/DeviceStatus.js", "src/Controller.js"]
  }


После пары шишек стало ясно, что файлы должны перечисляться в порядке зависимости друг от друга (jQuery тут нужен для простоты ajax запросов и ещё пары мелочей).

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

Примерно так:
image

Для начала, надо через manifest.json дать Хрому знать что и когда открывать:

  "browser_action": {
    "default_icon": "images/icon.png",
    "default_popup": "views/popup.html"
  },


Код представления (popup.html) предельно простой — немного HTML и атрибуты привязки к модели knockout. Занудные подробности опустил, их можно и так посмотреть на живом примере. Одно важно здесь — просто так Хром не работает с knockout, ему нужно дать полномочий через manifest.json:

  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",


вот этот unsafe-eval и нужен для knockout. Подробности здесь.

image

Мяса наросло уже достаточно, чтобы подключать к Хрому и смотреть, что получается — очень помогает забыть про обед и продолжать работать. У Хрома есть для этого замечательная кнопка — Load Unpacked Extension, её я и направил в корень VS проекта. После пары корректировок manifest.json удалось получить кнопку в нужном месте и тестовую картинку.

Вдохновение подстёгнуто, дальше — модель. Она тоже очень простая — все свойства из класса DeviceStatus завёрнутые в observable и пара обработчиков событий — добавление устройства, удаление устройства и выбор активного. По ходу решили, что будем поддерживать несколько устройств, а какому соответствует иконка наверху — предоставим решать пользователю (отсюда разделение на PopupViewModel и DeviceStatusViewModel).

Теперь это уже выглядело так:
image

Настало время научить мой основной UI получать данные. Очередные грабли Хром подложил в виде невозможности прямо вызывать методы фоновой страницы (у меня там Контроллер сидит). Всё общение проходит через соответствующий API Хрома и только асинхронно.

Вызовы выглядят примерно так:

            chrome.extension.sendMessage({ method: "GetAllDevices" }, (allDevices: DeviceStatus[]) => {
                if (!allDevices || allDevices.length == 0) {
                    console.info("Received empty device list");
                    return;
                }

                ...

            });


А на фоновой странице небольшой велосипед раскидывает эти сообщения по методам Контроллера:

var server = new Controller();

chrome.extension.onMessage.addListener(
    function (request: any, sender: any, sendResponse: (result: any) => void ) {
        return server[request.method].call(server, request.data, sendResponse);
    });


Вызовов много не понадобилось:
  • дай все зарегистрированные устройства (сразу со статусами)
  • добавь новое устройство, он же — показывай это устройство на иконке
  • удали устройство
  • сохрани порог чувствительности для устройства


Обязанности Контроллера немного шире:
  • как проснулся (Хром стартовал), прочитать все зарегистрированные устройства и запросить их статус на сервере
  • периодически запрашивать статус всех устройств и обновлять иконку в соответствии со статусом активного устройства
  • реагировать на вызовы UI
  • если у какого-нибудь устройства заряд ниже заданного предела — дать знать через иконку и desktop notifications, на случай, если юзер вдруг переключился на Firefox/CounterStrike/Visual Studio.
  • при каждом удобном случае сохранять состояние где-то, где можно прочитать, проснувшись


Естественно, с первого раза ничего не заработало и пришлось отлаживать код. Причём одновременно на фоновой странице и в клиентской части. С клиентской частью всё просто — правой кнопкой по кнопке расширения и “Inspect popup”, тут и отладчик, и DOM можно посмотреть, и что очень важно — typescript мне породил кучу *.map файлов, а Хром их сам подхватил, и в Хромовой консоли я отлаживал typescript, а не javascript. Мне это очень понравилось, за исключением одного момента — typescript предусмотрительно создаёт переменную _this и записывает в неё ссылку на this. Это позволяет без потерь работать в рамках объектов, но отладчик этого не знал и часто выдавал всякую чушь, когда я пытался смотреть значения переменных. После нескольких шишек я понял, что во время отладки все this надо менять на _this, чтобы увидеть правдивое значение, тогда всё встало на свои места.

Теперь фоновая страница. По началу пользовался console.log, но очень скоро его стало не хватать, и тут обнаружилась очень полезная ссылка — на странице расширений, как оказалось (и почему не часом раньше?) есть такая строчка:
Inspect views: background page,
по ней-то и открывался отладчик фона.

Сохранять и читать состояние оказалось довольно просто, Хром предоставил API, и даже утверждает, что оно будет синхронизироваться вместе с остальными данными между разными Хромами, если настроено. Синхронизацию не проверял. А выглядит это так:

    private ReadState(callback: () => void): void {
        this.devices = [];
        chrome.storage.sync.get(["aid", "ds"], (storedValues: any) => {
            if (storedValues.aid != null && storedValues.aid != "")
                this.deviceId = storedValues.aid;

            var devicesJson = storedValues.ds;
            this.devices = JSON.parse(devicesJson);
            callback();
        });
    }

    private WriteState(): void {
        chrome.storage.sync.set({ "aid": this.deviceId, "ds": JSON.stringify(this.devices) });
    }


Запрос статуса с сервера — совершенно обычный ajax:
    private RequestStatus(data: any, successCallback: (status: DeviceStatus) => void , errorCallback: (error: string) => void ): void {
        $.ajax({
            url: "https://localhost/cbs/" + data.deviceId,
            type: "GET",
            success: successCallback,
            error: (xhr, error) => {
                console.error(error);
                errorCallback(error);
            }
        });
    }


Одни из самых изощрённых граблей на пути встретились при отладке привязки модели к представлению. Knockout никак не хотел регистрировать обработчик события, вместо этого прямо на месте его и вызывал. Обнаружить проблему помогло другое Хром-расширение — knockout context debugger.

И с уведомлениями пришлось попотеть. Хром предоставляет API для уведомлений, но с одним существенным ограничением — оно провисит на экране только 5 секунд, после чего от него почти ничего не останется, только маленький звоночек в system tray. И это никак не настраивается. После нескольких неудачных попыток проблема решилась через webkit notifications.

            var n = webkitNotifications.createNotification(opt.iconUrl, opt.title, opt.message);
            n.onclose = () => { ... };
            n.show();


И тогда Хром стал напоминать о батарейке примерно так:
image

С иконкой наверху тоже всё просто, Хром опять предоставил API, и при помощи нехитрых манипуляций с иконкой, подсказкой и текстом всё заработало как часы:
        if (updateIcon) {
            chrome.browserAction.setIcon({ path: path });
            chrome.browserAction.setTitle({ title: title });
            chrome.browserAction.setBadgeText({ text: "!" });
        }


После этого оставалось только поженить формат кода из андроид-приложения с расширением. Выбрали 12-символьный код во избежание повторений.

К полуночи в воскресенье первая версия была готова.

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

Update:
если кто заинтересован написанием клиента под iOS, дайте знать
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 66

    –6
    Молодцы конечно, но первый жирный минус — отсутствие кросс платформенности.
    Прощайте юзеры Линухи и Мака. Там требуется какой-то Intel Connector.

    Т.к. требуется связь с инетом, и тратится вам на свой сервер лениво (вроде софт денег не принесет), то можно было б написать простой сервер на php, который бы помогал связать расширение и телефон и отдать его умельцам, которые сами будут поднимать его для себя.

    А можно и с вашей стороны предоставить сервер за 0.5$ в месяцев. 10 юзеров окупят сервер, а 1000 уже принесет малый, но постоянный доход.

    В общем задумка 5+
    Реализация 4.

    Так что пилите.
      0
      У меня на маке заработало, думаю и с линуксом проблем не будет. Вас испугали слова .NET и Visual Studio?
        –1
        При установке плагина в хром, он просит установить Intel Connector.
        +17
        Такс, проблема возникла с прокладкой. В поиске по такому запросу названия выскочило другое приложение. Которое как-раз и требовало этот коннектор.

        Так что всё что было сказано выше — бред.
        Уж простите.
        +4
        немного пожалел, что телефоны редко пищат, пока разряжаются

        Никогда не понимал логику поведения, когда телефон разряжается, вместо экономии он, наоборот, начинает активно мигать, пищать, включать экран сообщая что батарея тютю, тем самым приближая это самое тютю.
          +4
          Судя по скорости, с которой современные телефоны кушают батарею при проигрывании музыки — пищать на одном заряде они могут пару лет не переставая.
            +1
            У бактерий научились: те тоже делают марш-бросок, когда у них заканчиваются запасы энергии. И, что характерно, такая стратегия оказывается выигрышной — проверено эволюцией.
            +3
            Найти приложения, конечно, нашел.
            А почему бы ссылки не добавить в статью?
              0
              Само extension: goo.gl/X9TSka
              И приложение для связки: goo.gl/09IAhf
                0
                Большое спасибо.
                Для brukva: В самой статье ссылки будут не лишние.
                  0
                  Согласен. Но на хабре ж как — либо статья без ссылок, либо нет статьи.
              +2
              Интересно, а на сколько быстрее стал разряжаться телефон, постоянно отправляя данные о заряде батареи? А вообще идея очень интересная
                0
                С учетом, что у меня трубка и так постоянно сеть использует (почту принимает, FB отслеживает, что-то там еще делает), почти незаметно, но прирост есть, ибо стал спамить.
                Побаловаться хорошо, но, видимо, как раз придется подумать об экономии заряда — деактивировать приложение ;)
                  0
                  Спасибо на добром слове. Батарейка проверяется каждые 10 минут, отправляя на сервер один запрос в несколько байт. Это реже проверки почты в общем случае. Пока хоть сколько заметной разницы никто не обнаружил, но на всякий случай добавим в настройки и разделим wifi и gprs/3g интервалы.
                    +1
                    Лучше ставить не фиксированный интервал времени, а по событию просыпания аппарата. А так вы его будите только для того, чтобы посмотреить батарейку. Во сне он и так почти ничего не тратит.
                      –1
                      Все фоновые приложения вроде почты и прочих разряжают батарею пока аппарат в фоне. И успешно за ночь могут съесть батарею с 50% до 20% к примеру.
                  +3
                  Ну и сама по себе полезность — достаточно странная, т.е. в браузер встраивать алерт на разрядку мобилки?
                  Как это решает исходный кейс?
                  Как обычно поздней ночью, садясь в автобус, я достал телефон, и пока набирал “habr…” он отрубился. Я вслух подумал: “А раньше не мог сказать?”, немного пожалел, что телефоны редко пищат, пока разряжаются. А потом…


                  Тут ведь как? Если поздней ночью — то как владелец Андроид трубки и так должен понимать — глубокой ночью заряда уже не должно остаться.
                  С другой стороны, если заряд с утра уже подошёл к концу, значит телефон более менее активно используется, а если так, то зачем вешать плагин в Хром чтобы отслеживать заряд? Когда его и так видно в самом мобильнике?
                  Если только не делать шпионскую бот-сеть по глобальному отслеживания напряжения в мобильниках в определённом регионе! :)
                    +1
                    Обычно так: сидишь, работаешь. Засиделся допоздна. Смотришь на часы: о! скоро последняя маршрутка уйдёт! Схватил вещи и домой. Садишься в маршрутку и понимаешь, что дорогу до дома уже не скрасит твой телефон. Надо было его подзарядить в конце рабочего дня потому, что сегодня пришлось по нему много разговаривать. Вот тут приложение будет полезно. Лично мне очень понравилась идея. Ну а пока работаешь, смотреть в телефон надобности нет, оттого и пропускаешь момент разрядки.
                      –1
                      Ну реально, если телефон разрядился, то он использовался активно, а как можно использовать телефон, если не смотреть в экран, всяко, нет нет да глянешь, даже после окончания разговора, и уж увидеть заряд ну совсем не сложно :)
                      В то же время, если телефон не трогать, то он ну не потеряет критически много заряда, ну просядет на 5-10%, ну так если до этого было 50% — то это не критично, а если после разговора уже было меньше 50, всяко нужно было начинать подключть зарядочку, причём если есть только провод, то в USB нужно ещё и сильно заранее включать, заряд то от USB зачастую идёт не так шустро как от розетки.

                      Ну а с другой стороны, ну раз есть приверженцы такого подхода, значит действительно кому то это нужно.
                      Мне лично понравилось что ребята всё красиво сделали.
                        +1
                        Наверное, это привычка с начала двухтысячных, когда телефон было лучше разряжать как можно более полно, чтобы не проявился эффект памяти аккумулятора. Возможно, именно она, ещё полностью не изжитая, играет со мной злую шутку. Особенно критично на смартфонах: смотрим днём — жёлтый уровень заряда — думаем, хватит ещё. Потом вечером в дороге включаем 3G, которого хватает на 10 минут.
                      +1
                      тут ещё один юз-кейс нарисовался. у знакомой — 7 детей, 4 из них с андроидами в школу ходят и им теперь не отмазаться, что не позвонил, потому что батарейка села
                        +1
                        Напомнило:

                        «Пат часто задышал. Очень неуверенно возразил:
                        — Ты не знаешь. Не можешь знать.
                        — Знаю. Что, рассказать?
                        — Я все твои скрипты вычистил!
                        — У-тю-тю. Вычистил. Когда все вычистишь, я тебе свой ноутбук подарю.»

                        Вот так хакеры из детишек и вырастают. Или новые луддиты, кто знает?
                      +2
                      Абстрагируйтесь от мобильников и взгляните на планшеты. Данная связки удобна тем, что ты за любым компом(в своём хром-окружении) знаешь о состоянии зарядки планшета, который валяется в сумке/машине/полке/столе… И собираясь отойти от ББ знаешь, стоит-ли брать с собой планшет или нужно его на зарядку врубить… Не поверю, что ни у кого небыло ситуации, когда взял с собой планшет и при включении увидел севший аккум. И кучу времени провёл за ББ, мог-бы и поставить на зарядку, да кто-же знал…
                        0
                        да, тоже думал, что это если и актуально, то в контексте планшетов.
                        Только это ж получается что у человека дефолтным софтом должен быть браузер?! Т.е. ориентация на web-разработчиков и т.п.?! :)
                          +2
                          Chrome-нотификации видны отовсюду. То есть браузер должен быть запущен, но вы не обязаны с ним постоянно работать. Вы не поверите, но количество людей, которые работают именно так весьма немало среди всех разработчиков.
                        0
                        В алёрты можно добавить условие по времени с последнего апдейта статуса — если телефон не присылал свой статус четыре часа, то возможно, он уже отключился.

                        Продолжение про серверную и телефонную части будет?
                          0
                          иконка в хроме краснеет, если давно апдейтов не было.
                          а алерт, когда покраснела — хорошая идея, спасибо

                          над серверной частью работаю. она очень маленькая, но там есть одна фишка, о которой стоит рассказать.

                          андроид в очереди
                          +5
                          Очень интересно было бы посмотреть на исходники андроид приложения. Не планируете ли вы их опубликовать на гитхабе, например?
                            +1
                            мой андроид-приятель вряд ли будет возражать, всё и так на гитхабе, надо с доступом поиграться.
                              0
                              Если было бы opensource то было бы просто прекрасно!
                            0
                            мне кажется, стоит реализовать настройку на устройстве с периодом обновления статуса.
                            точность больше, чем раз в полчаса лично для меня не важна.
                              0
                              Очень полезное приложение. Часто так заработаюсь что перед выходом замечаю что тел разряжен.

                              П.С, Было бы гуд еще добавить возможность выставлять интервал обновление с телефона.
                                +3
                                А сделайте АПИ, плиз, я приложения для Windows Phone напишу.
                                  0
                                  Ой было бы круто!
                                  0
                                  Скажите, а у вас уровень заряда батарейки нормальный, или как и у всех производителей телефонов вот уже лет так 14? Т.е. показывается в процентах то одно число. то друге в зависимости от того, что вы сейчас делаете. Смотришь кино — осталось 5% заряда. Читаешь книгу — 66%?

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

                                  Порой доходит до смешного, когда снижение яркости экрана с 3% доводит заряд до 15%.
                                    +1
                                    Могу предположить два варианта:
                                    а) У вас древний телефон с никелевым (NiMH или NiCd) аккумулятором
                                    б) Вы используете какой-то сторонний софт

                                    Потому что заряд аккумулятора измеряется двумя способами:
                                    1) по напряжению
                                    2) по статистике (кол-во отработанных часов при известных энергозатратах)
                                    Первый случай «хардверный», второй — «софтверный». У литиевых аккумуляторов по напряжению можно достаточно точно определить уровень заряда, в отличие от никелевых, у которых при снятии нагрузки может повышаться заряд.

                                    P.S. вот уже много лет у меня нет проблем ни в телефонах, ни в фотоаппаратах, ни в камерах с определением заряда литиевых аккумуляторов. Производители отображают заряд хардверным способом, а остаточное время считают софтверным. Не рассматриваю случаи с дохлыми аккумуляторами и неправильным использованием (нагрузка больше расчетной, температурные условия не соответствуют документированным и т.д.).
                                      0
                                      У литиевых аккумуляторов по напряжению можно достаточно точно определить уровень заряда, в отличие от никелевых, у которых при снятии нагрузки может повышаться заряд.

                                      Для литиевых тоже не все так просто. Напряжение на аккуме зависит, как минимум, от потребляемого тока и температуры. Потребляемый ток постоянно меняется скачками, например, при взаимодействии с базовыми станциями и запуске приложений. Также владелец может выйти на улицу в мороз, а потом опять вернуться в помещение. Поэтому мгновенные значения напряжения на аккуме ничего не скажет о его реальной остаточной емкости.

                                      Здесь я вижу два выхода:

                                      1. Периодически, например, раз в 5 минут отключать всю нагрузку от аккума на аппаратном уровне и производить измерение напряжения. Нагрузка при этом на микросекунды будет запитана от конденсатора. В таком режиме напряжение будет измеряться каждый раз в одинаковых условиях. Можно также вносить поправку на температурный режим встроенным датчиком температуры.

                                      2. Использовать статистический подход, запоминая на протяжении всей жизни устройства мгновенные значения напряжения на аккуме и значения внутренних датчиков температуры и потребляемого тока. И на основании полученных данных высчитывать среднестатистическую остаточную емкость аккума.
                                      0
                                      Мы показываем то, что андроид говорит. У него только одна цифра. Да может, он и прав — реальной-то цифры нет, всё магия. Представьте, что точка на прямой заряда на самом деле не точка, а отрезок, и в зависимости от интенсивности использования батарейки его длина меняется, как и расстояние от нуля до нижней границы этого отрезка. Как из этого проценты извлекать?
                                      +1
                                      Если я правильно проверил, приложение не позволяет добавлять устройства другого Google аккаунта, хотя довольно длинный код устройства давал надежду, что код будет «глобально-уникальным», а не уникальным в пределах текущего аккаунта. Мне это нужно для мониторинга батареи телефона ребенка, который сам может забыть зарядить телефон. Можно ли добавить такую функцию?
                                        0
                                        У меня получилось подсоединить устройство с другим аккаунтом.
                                          0
                                          Саша, там гугл аккаунт вообще не причём, на андроиде генерится код, его вбиваешь в хром и вуаля.
                                            0
                                            У меня выдает вот такую ошибку на второе устройство (см. рис.). Может ли это быть из-за того, что на устройстве не установлен Chrome (установлено только приложение)? А Chrome нельзя установить, потому что там Android версии 2.1… Но приложение установилось без проблем.
                                            image
                                              0
                                              нет, устройству хром не нужен. а что код пустой на втором устройстве? мне кажется в этом проблема. Удали второе и добавь ещё раз.
                                                0
                                                нет, сорри, код не пустой — я его просто стер на картинке. код показывает корректный. Код я уже пытался пере-генерировать — не помогло. Приложение не устройстве кстати тоже никаких ошибок не выдает (о том, например, что с сервером не может связаться).
                                                  0
                                                  на андроиде есть индикатор, горит зелёным, если удалось всё отправить нормально, краснеет от неудач.
                                                  и добавили побольше текста в расширение, если не получилось запросить состояние на сервере
                                          –1
                                          Спасибо.
                                          Можно еще background скрипты выгружать при простое, экономя ресурсы:
                                          developer.chrome.com/extensions/event_pages.html
                                            0
                                            Небольшое предложение со стороны: обзаведитесь внешним аккумулятором. Благо стоят они в районе 1-1.5 т.р, а зарядить телефон позволяют порядка 3-4 раз. С планшетами хуже, но все равно 1-2 обычно можно. Ну и у моделей подороже емкость побольше. Главное читайте отзывы, ибо производители любят с этой самой емкостью мухлевать.
                                              0
                                              Посоветуйте модели, пожалуйста.
                                                0
                                                Могу порекомендовать модель Canyon CNA-C05030W. При цене в 500 рублей имеет емкость 3Ач, 2 USB порта и (что мне было важно) удачную форму для ношения в кармане.
                                                Их великое множество разных цветов и вкусов. Сделаны все примерно по одинаковой схеме.
                                              0
                                              Подождите, Вы используете в расширении пару js-библиотек?
                                              Слышал что это очень некошерно с точки зрения оптимальности…
                                              У меня Adblock (судя по диспетчеру задач Хрома) использует 59 МБайт памяти — но ему я готов простить такой размер, а Ваше расширение сколько кушает?

                                              Да-да, я в курсе что планка DDR3 сейчас стоит копейки, но всё-же…
                                                0
                                                да, не совсем кошерно. это плата за скорость разработки. уйдут потом гои.
                                                0
                                                Отлично!
                                                Начал прикидывать — какие еще бытовые счетчики, индикаторы и фичи можно было бы вывести в подобном режиме в теории:
                                                — счетчики горяч./холодн. воды (кубы и стоимость),
                                                — температуры нагрева батареи отопления,
                                                — электроэнергии (киловатты и стоимость),
                                                — датчик наполненности кормом лотков для кормления домашних питомцев,
                                                — температурный режим холодильника и степень наморозки конденсата,
                                                — таймер стиральной машины,
                                                — таймер приготовления пищи в духовке / микроволновке,
                                                — степень заполненности мусорного ведра,
                                                — координаты нахождения членов семьи,
                                                — координаты нахождения машины, яхты, гулящего кота,
                                                — …
                                                что еще?
                                                  +1
                                                  Как то Вы перебарщиваете с микроволновкой (может стоит хоть на время обеда от браузера отходить? :)
                                                  При таком количестве параметров наверное удобнее будет держать страничку со всеми показателями? При выходе определённого показателя за пределы «мигать» заголовком страницы.
                                                  0
                                                  Можно подумать о расширении функционала до трансляции уведомлений от других приложений не имеющих десктопных аналогов.
                                                    0
                                                    В Android 2.3 не работает, пишет «couldn't get device code, device not found»
                                                      0
                                                      от версии андроида не зависит, как выяснилось. посмотрел статистику установок, большинство как раз на 2.3 работает. скорее всего первое обновление статуса ещё не добралось до нашего сервера.
                                                        0
                                                        После этого поставил и на 4.2 — данные сразу появились, с 2.3 по прежнему device not found.
                                                        Как бы отловить проблему?
                                                          0
                                                          на андроиде есть индикатор, горит зелёным, если удалось всё отправить нормально, краснеет от неудач.
                                                            0
                                                            красный
                                                              0
                                                              значит не может достучаться до cbs.loopsuite.com/ с телефона.
                                                      0
                                                      У меня часто показывает красный значок батареи с восклицательным знаком. При наведении — всплывающее окно «error fetching device info: error».
                                                        0
                                                        спасибо, улучшим сообщение. Если это происходит регулярно, причина скорее всего в инет соединении, не было вспышек DNS проблем или чего-то в этом роде?
                                                          0
                                                          Проблемы, как и на любом беспроводном соединении, конечно могут проскакивать. Но обычно они кратковременные — секунды, минуты… Возможно нужно сделать повторные попытки отправить данные при ошибках?
                                                        0
                                                        Попробовал на Nexus 7 и HTC Desire, оба не видны :(
                                                          0
                                                          Нашлось много желающих на такую штуковину для iOS.
                                                          Если кто готов взяться — обращайтесь.
                                                            0
                                                            Мы переехали на под-домен, это, к сожалению, хромом не позволяется, и он деактивировал расширение. Надо руками его активировать в хроме теперь после обновления.

                                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                            Самое читаемое