Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение

Простой способ управления удалёнными устройствами

Время на прочтение4 мин
Количество просмотров23K
Что хотелось:

  • при завершении задачи в jenkins выводить уведомление на компьютере и как дополнение — вывести его на физический дисплей, подключенный к arduino;
  • интерфейс, который можно открыть на телефоне или планшете, для управления проигрывателем музыки на компьютере и видеоплеером на raspberry pi;
  • интерфейс, доступный снаружи локальной сети, для вывода значения с датчиков, установленных на arduino.

Что получилось:

  • клиент, запускаемый на устройстве, с декларацией методов на python;
  • RESTful api для запуска «методов»(картинка справа выведена через него);
  • «панели управления» с web-интерфейсом;
  • сервис для управления устройствами, методами и панелями.

Читать дальше →
Всего голосов 24: ↑22 и ↓2+20
Комментарии30

Пять способов улучшить Raspberry Pi

Время на прочтение3 мин
Количество просмотров173K
Стремительно набирает популярность одноплатный компьютер Raspberri Pi. Стремясь сделать его как можно дешевле, разработчики выкинули все «лишнее» и максимально упростили конструкцию там, где это было возможно. С одной стороны, это вынуждает пользователя терпеть некоторые неудобства при работе с системой. Но с другой стороны, оставляет простор для творчества и усовершенствований.

Итак, вашему вниманию предлагается обзор пяти полезных модификаций для Raspberry Pi.
Читать дальше →
Всего голосов 96: ↑87 и ↓9+78
Комментарии48

24 совета javascript-разработчику

Время на прочтение9 мин
Количество просмотров85K
От переводчика: Не смотря на то что оригинал данной статьи датирован январем 2009 года, она не потеряла актуальности и теперь. Я надеюсь что даже те, кто используют JavaScript не первый год, почерпнут для себя что-то полезное.

1. Используйте === вместо ==


В JavaScript существует два разных типа операций сравния: === / !== и == / !=. Считается хорошим тоном всегда использовать первую пару для сравнения.
“Если два операнда одного типа и значения, то === вернет true, а !== false”
JavaScript: The Good Parts
Читать дальше →
Всего голосов 145: ↑92 и ↓53+39
Комментарии185

RaZberry — умный дом на базе Z-Wave и Raspberry Pi

Время на прочтение8 мин
Количество просмотров216K
Raspberri Pi with RaZberry extention boardМногие пытаются собрать «Умный дом» своими руками. При выборе системы стоит учитывать не только ассортимент и стоимость конечных устройств, но и возможности контроллера. Большинство контроллеров сразу готовы к работе «из коробки», но представляют ограниченные возможности. Однако нередко именно гибкость и возможность лёгкой интеграции является основополагающим критерием при выборе.

И вот, появился долгожданный «кубик Lego» для систем автоматизации на базе технологии Z-Wave, который обладает желаемой гибкостью и в то же время большим функционалом и низкой ценой.

Плата расширения RaZberry для Raspberry Pi, превращает самый популярный и дешёвый мини-компьютер в Z-Wave контроллер домашней автоматизации.

Читать дальше →
Всего голосов 74: ↑65 и ↓9+56
Комментарии68

Как работают браузеры: принципы работы современных веб-браузеров

Время на прочтение2 мин
Количество просмотров189K
Просматривая одно из обучающих видео "Школы разработки интерфейсов" Яндекса, наткнулся на ссылку на офигенный труд израильской веб-программистки Тали Гарсиэль (Tali Garsiel) "How browsers work" (Как работают браузеры).

Она в течение нескольких лет отслеживала всю издаваемую информацию о внутреннем устройстве браузеров, изучала исходный код WebKit и Gecko и, в конце концов, собрала все воедино. Вот что пишет сама Тали:
Когда на 90% компьютеров был установлен IE, приходилось мириться с тем, что это загадочный «черный ящик», однако теперь, когда более половины пользователей выбирает браузеры с открытым исходным кодом, пришло время разобраться, что скрывается у них внутри, в миллионах строк программного кода на C++...
Пролистав, я был поражен — отличная работа. Внутреннее устройство браузеров, алгоритмы разбора — все хорошо иллюстрировано, доступно и понятно. И без излишних подробностей, страниц на 30-40. Как раз то, что нужно. Решил — это надо обязательно перевести. Покопался еще немного — оказалось перевод уже как 1,5 года есть!

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

Под катом содержание перевода, чтобы решить стоит ли читать.
Читать дальше →
Всего голосов 200: ↑179 и ↓21+158
Комментарии27

Эмуляция хвостовой рекурсии в JavaScript

Время на прочтение6 мин
Количество просмотров27K
Если кто-то ещё не знает, что такое хвостовая рекурсия, вот простой пример метода, складывающего в лоб натуральные числа от 1 до n (n≥0):
function add(n,acc) {
  if(n===0) return acc;
  return add(n-1,acc+n);
}

Изначально функция вызывается с параметром acc=0. В случае, если n не равно нулю, метод вызывает сам себя с другими параметрами и возвращает результат. Компилятор (или интерпретатор, или виртуальная машина) могут понять, что текущий вызов функции в стеке уже не нужен, стереть его и заменить следующим вызовом. Таким образом, рекурсия не приводит к разрастанию стека. Строго говоря, хвостовой вызов не обязан обращаться к текущей функции: вызов любой другой тоже может быть хвостовым. Главное условие: вызов функции и возврат её результата должны быть последними действиями в текущей функции. К примеру, в такой реализации метода хвостовой рекурсии нет, так как после вызова происходит ещё сложение:
function add(n) {
  if(n===0) return 0;
  return n+add(n-1);
}

По ряду причин хвостовая рекурсия в JavaScript не поддерживается (обсуждение на эту тему есть на StackOverflow). Поэтому вызов вроде add(100000,0) завершится исключением. На Хабре предпринимались попытки решить эту проблему через setTimeout, но это выглядит не очень честно и не очень красиво. Более изящное решение для языка Python было предложено с использованием «трамплина». Похожий подход для JavaScript рассмотрен здесь. Но мне захотелось, чтобы работало быстро и чтобы функцию можно было записать прямо как в примере выше. Посмотрим, что можно сделать.
Читать дальше →
Всего голосов 64: ↑60 и ↓4+56
Комментарии23

Тренировка NiMH аккумуляторов. Есть ли смысл?

Время на прочтение6 мин
Количество просмотров123K
Пролог



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

Собственно параметров, интересных потребителю, два — емкость батареи и ее внутреннее сопротивление. Возможных манипуляций тоже немного — разрядить да зарядить. Измеряя в процессе разряда ток и время можно оценить емкость аккумулятора. По разнице напряжения аккумулятора на холостом ходу и под нагрузкой можно оценить внутреннее сопротивление. Повторив цикл разряд-заряд (т. е. выполнив «тренировку») несколько раз, можно понять имеет ли вообще это действо смысл.

Соответственно сформировался такой план — делаем управляемые разрядник и зарядник с возможностью непрерывного измерения параметров процесса, производим над измеренными величинами простые арифметические действия, повторяем процесс нужное число раз. Сравниваем, делаем выводы, выбрасываем наконец аккумуляторы.
Приступим
Всего голосов 65: ↑61 и ↓4+57
Комментарии45

Java: executor с уплотнением по ключам

Время на прочтение6 мин
Количество просмотров16K
image

Существует типичная проблема в большом классе задач, которая возникает при обработке потока сообщений:

— нельзя пропихнуть большого слона через маленькую трубу, или другими словами, обработка сообщений не успевает «проглотить» все сообщения.

При этом существуют некоторые ограничения на поток данных:

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


На диаграмме приведён пример разрешения проблемы: нагребатор(tm), работающий на нитке T1, в то время как разгребатор(tm) работает на нитке T2
  • за время обработки события типа A успевают прийти новые события как типа B, так и A
  • после обработки события типа B необходимо обработать наиболее актуальное событие типа A

Т.о. стоит задача о выполнении задач по ключу, так, что выполняется только самая актуальная из всех задач по данному ключу.

На суд публике представляется созданный нами ThrottlingExecutor.

Замечание терминологии: stream есть поток данных, тогда как thread есть нитка или нить выполнения. И не стоит путать потоки с нитками.

Замечание 1: проблема осложняется ещё тем, что может быть несколько нагребаторов(tm), при этом каждый нагребатор(tm) может порождать только события одного типа; с другой стороны есть потребность в нескольких (конечно же, для простоты можно выбрать N=1) разгребаторах(tm).

Замечание 2: мало того, что данный код должен работать в многопоточной (конкурентной) среде — т.е то самое множество нагребаторов(tm)разгребаторов(tm), код должен работать с максимальной производительностью и низкими latency. Резонно к этим всем качествам добавить ещё и свойство garbage less.

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

Читать дальше →
Всего голосов 39: ↑34 и ↓5+29
Комментарии66

Прототипы JavaScript — программистам на C/C++/C#/Java

Время на прочтение10 мин
Количество просмотров31K
JavaScript отличается от многих других «объектно-ориентированных» языков программирования тем, что в нём объекты есть, а классов — нет. Вместо классов в JavaScript есть прототипные цепочки и некоторые другие хитрости, которые требуют времени на осмысление. Перед профессиональными программистами в других языках при переходе на JavaScript встаёт проблема быстрого вхождения в его объектную модель.

Этот текст написан для того, чтобы дать начинающему или эпизодическому разработчику на JavaScript представление о способах создания объектов в JavaScript, от простого «структурного», как в языке C, к более «объектно-ориентированному», как в C++/C#/Java.

Статья может быть рекомендована как новичкам в программировании, так и бэкенд-программистам, пишущим на JavaScript только эпизодически.
Читать дальше →
Всего голосов 40: ↑31 и ↓9+22
Комментарии30

Беспроводные коммуникации «умного дома»

Время на прочтение13 мин
Количество просмотров150K
Когда начинающие (или продолжающие) «радиолюбители» наигрались со светодиодами и устали поворачивать сервы в различные положения, некоторые из них начинают прикладывать полученные знания к обычной бытовой сфере.
Как правило, это применение находится в двух областях — автомобиль или дом.
«Тюнить» авто лично мне как-то не интересно, а вот сделать собственное жилье чуточку «умнее» и комфортнее — достойный выбор.

Как же до такого дойти...
Всего голосов 77: ↑73 и ↓4+69
Комментарии56

Пайка для начинающих

Время на прочтение6 мин
Количество просмотров829K
Мои отношения с радио- и микроэлектроникой можно описать прекрасным анекдотом про Льва Толстого, который любил играть на балалайке, но не умел. Порой пишет очередную главу Войны и Мира, а сам думает «тренди-бренди тренди-бренди...». После курсов электротехники и микроэлектроники в любимом МАИ, плюс бесконечные объяснения брата, которые я забываю практически сразу, в принципе, удается собирать несложные схемы и даже придумывать свои, благо сейчас, если неохота возиться с аналоговыми сигналами, усилениями, наводками и т.д. можно подыскать готовую микро-сборку и остаться в более-менее понятном мире цифровой микроэлектроники.

К делу. Сегодня речь пойдет о пайке. Знаю, что многих новичков, желающих поиграться с микроконтроллерами, это отпугивает. Но, во-первых, можно воспользоваться макетными платами, где просто втыкаешь детали в панель, без даже намека на пайку, как в конструкторе.
Читать дальше →
Всего голосов 131: ↑118 и ↓13+105
Комментарии100

Введение в разработку WinRT-приложений на HTML/JavaScript. Улучшение работы с данными

Время на прочтение9 мин
Количество просмотров9.9K
Эта статья продолжает серию материалов (первая часть, вторая часть), посвященных азам разработки WinRT-приложений на HTML/JS для Windows 8. В этой части мы постараемся улучшить надежность получения и качество отображения данных, а также немного поговорим о контрактах.



Напомню, что в предыдущей части мы остановились на том, что научились получать данные из внешних RSS-потоков и изменили стили отображения данных для различных состояний приложения, включая snapped-режим.
Читать дальше →
Всего голосов 40: ↑29 и ↓11+18
Комментарии1

Многопоточность в Java

Время на прочтение14 мин
Количество просмотров1.1M
Здравствуйте! В этой статье я вкратце расскажу вам о процессах, потоках, и об основах многопоточного программирования на языке Java.
Наиболее очевидная область применения многопоточности – это программирование интерфейсов. Многопоточность незаменима тогда, когда необходимо, чтобы графический интерфейс продолжал отзываться на действия пользователя во время выполнения некоторой обработки информации. Например, поток, отвечающий за интерфейс, может ждать завершения другого потока, загружающего файл из интернета, и в это время выводить некоторую анимацию или обновлять прогресс-бар. Кроме того он может остановить поток загружающий файл, если была нажата кнопка «отмена».

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

Давайте начнем. Сначала о процессах.
Читать дальше →
Всего голосов 75: ↑59 и ↓16+43
Комментарии97

Тернистый путь в Windows Store

Время на прочтение7 мин
Количество просмотров48K
Как и многие программисты, я с опаской относился (и отношусь) к Windows 8, но не удержался попробовать написать пару программ для Windows Store. Все-таки, это модная тенденция: .Net 4.5, C# 5, XAML.

Как раз в эти дни, 4го декабря, мне попалась на глаза статья про конкурс приложений для W8 от Microsoft. Выкладывать экспериментальные программы было как-то не серьезно (хотя маркет такими поделками буквально переполнен), потому я решился портировать достаточно масштабный проект с MonoTouch и iOS. Запаситесь попкорном, потому как кроме программистских деталей тут будет и комедия, и драма, и жизненный финал.

Поехали!
Всего голосов 111: ↑97 и ↓14+83
Комментарии107

Arduino LCD Informer

Время на прочтение9 мин
Количество просмотров97K
Заинтересовавшись таким хобби, как Ардуино, я вскоре понял, что суть этого замечательного проекта — позволить таким, как я, ничего не смыслящим в схемотехнике, пайке и микросхемах, зато немного понимающим в программировании, заставить работать что-либо кроме персонального компьютера; прошить микроконтроллер, не имея программатора и каких-либо специальных знаний на эту тему.

Поэтому я хочу помочь пропаганде этого проекта — программисты, это прекрасное развлечение именно для вас!

Пока моторчики для моего следующего, мобильного проекта едут в кибитке, запряжённой тройкою самых быстрых брюхоногих скакунов Почты России, я задумал и, надо сказать, осуществил, другой (разминочный) проект под звонким названием “Arduino LCD Informer”. Суть проекта в том, чтобы Ардуино отображал на LCD данные, получаемые с компьютера. На компьютере их собирает и отправляет отдельная программа.


Читать дальше →
Всего голосов 103: ↑90 и ↓13+77
Комментарии29

Живые тайлы (Live tiles) в Windows 8 (WinRT)

Время на прочтение21 мин
Количество просмотров24K
UI Windows 8 был существенно переработан и появился стартовый экран с тайлами (tiles – далее в скобках буду указывать используемые английские терминологии). Одним из основных преимуществ тайлов перед иконками – это возможность «оживления» (live tile) и предоставления важной для пользователя информации непосредственно на тайле. Кроме того, есть возможность создать вторичные тайлы (secondary tiles), которая позволяет переходить в приложение с определенными параметрами или на страницу вглубь приложения. В качестве примера можно привести погодное приложение отображающее погоду на основном тайле и погоду в выбранных городах на вторичных тайлах.

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

В этой статье рассмотрим следующие пункты.
подробнее
Всего голосов 62: ↑55 и ↓7+48
Комментарии6

Java собеседование. Коллекции vs null

Время на прочтение3 мин
Количество просмотров129K
Всем привет!

В топике Java собеседование. Коллекции подробно изложен вопрос работы с Set & Map в Java. Но у меня ещё есть парочка любимых вопросов из этой области:

  1. Может ли null использоваться в качестве ключа в Map?
  2. Может ли Set содержать null?

подсказка (HashMap.java)
   public V get(Object key) {  
        if (key == null)  
            return getForNullKey();  
        int hash = hash(key.hashCode());  
        for (Entry<K,V> e = table[indexFor(hash, table.length)];  
             e != null;  
             e = e.next) {  
            Object k;  
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))  
                return e.value;  
        }  
        return null;  
    }  
    /** 
     * Offloaded version of get() to look up null keys.  Null keys map 
     * to index 0.  This null case is split out into separate methods 
     * for the sake of performance in the two most commonly used 
     * operations (get and put), but incorporated with conditionals in 
     * others. 
     */  
    private V getForNullKey() {  
        for (Entry<K,V> e = table[0]; e != null; e = e.next) {  
            if (e.key == null)  
                return e.value;  
        }  
        return null;  
    }  


Предполагается, что пытливый читатель самостоятельно поразмыслит над ответами и затем сравнит их с моими. Самые нетерпеливые могут сразу проследовать под кат.
Читать дальше →
Всего голосов 62: ↑51 и ↓11+40
Комментарии47

Разбираемся с разработкой Windows 8 приложений на XAML/С#, реализуя простой RSS Reader. Ч.1

Время на прочтение8 мин
Количество просмотров32K


После поста Введение в разработку WinRT-приложений на HTML/JavaScript. От шаблона к приложению с данными вы уже знаете как разрабатывать RSS читалку под Windows 8 с использованием HTML и JavaScript. Пришло время попробовать сделать примерно то же самое, но с использованием XAML/C#. Это первая часть, но мы уже в ней сделаем красиво!
А теперь попробуем написать это на XAML и С#
Всего голосов 56: ↑40 и ↓16+24
Комментарии16

Введение в разработку WinRT-приложений на HTML/JavaScript. Стилизация приложения

Время на прочтение6 мин
Количество просмотров10K
Эта статья продолжает серию материалов (первая часть), посвященных азам разработки WinRT-приложений на HTML/JS для Windows 8. Мы последовательно пройдем путь от стартового практически пустого шаблона к полноценному приложению с серверной частью и живыми плитками.



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

В данной статье мы займемся внешним видом нашего приложения: добавим картинки, поменяем заголовки, стили, плитки и т.п. Всю работу можно провести в Visual Studio, хотя некоторые вещи удобнее и нагляднее менять в Expression Blend.

XAML/C#. Если вы заинтересованы в разработке с использованием XAML и C#, рекомендую обратить внимание на аналогичную серию статей моего коллеги — Стаса Павлова: Разбираемся с разработкой Windows 8 приложений на XAML/С#, реализуя простой RSS Reader.

Читать дальше →
Всего голосов 31: ↑23 и ↓8+15
Комментарии0

Разбираемся с разработкой Windows 8 приложений на XAML/С#, реализуя простой RSS Reader. Ч.2

Время на прочтение9 мин
Количество просмотров12K

Продолжаем разрабатывать простой RSS Reader. Начало было положено в статье Разбираемся с разработкой Windows 8 приложений на XAML/С#, реализуя простой RSS Reader. Ч.1, где мы создали проект получили данные RSS и начали делать красиво. В этой части мы добавим красоты и функциональности в нашу читалку.
Продолжаем делать красиво
Всего голосов 38: ↑27 и ↓11+16
Комментарии0

Информация

В рейтинге
Не участвует
Откуда
Россия
Зарегистрирован
Активность