STM32F103C — разработка в Arduino IDE под Linux

При прототипировании различных устройств на микроконтроллерах серии STM32F довольно удобно использовать среду разработки Arduino IDE. Большое количество готовых библиотек, отличная документация и огромное сообщество — и это только основные положительные моменты, что уж говорить о менее значимых преимуществах…

Sprint Layout: отображение отверстий в webGerber (Mayhew Labs)

Если вы занимаетесь проектированием печатных плат, то наверняка слышали о таком онлайн сервисе, как webGerber от компании Mayhew Labs. С его помощью можно буквально за пару кликов мыши простроить 3D модель вашего Gerber проекта, для визуального контроля перед отправкой его на производство.

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

АП узкое окно PIC 12F629 (прошивка одометра)

После достижения показаний одометра на моем авто (ВАЗ 2111) цифры в 99999 километров, счетчик сбросился на ноль (внезапно О_о) и, досчитав до отметки 7, полностью завис. По информации в интернете, чаще всего такое случается после неудачной «намотки» пробега (но не обязательно ТОЛЬКО из за этого) и последние значения, застывающие на дисплее, равняются 999990 (см. КДПВ).

Простой парсер URL адресов

function parseUrl(url) {
  var a = document.createElement('a');
  a.href = url;
  return a;
}
 
console.log(parseUrl('http://example.com:3000/pathname/?search=test#hash').hostname);
 
/*
  protocol; // => "http:"
  host;     // => "example.com:3000"
  hostname; // => "example.com"
  port;     // => "3000"
  pathname; // => "/pathname/"
  hash;     // => "#hash"
  search;   // => "?search=test"
  origin;   // => "http://example.com:3000"
*/

Перехват вызова функций в JavaScript

function emptyFunction() {};
 
function Interceptor(preInvoke, postInvoke) {
  var preInvoke = typeof preInvoke === 'function' ? preInvoke : emptyFunction,
  postInvoke = typeof postInvoke === 'function' ? postInvoke : emptyFunction;
  this.preInvoke = preInvoke;
  this.postInvoke = postInvoke;
}
 
Interceptor.prototype = {
  constructor: Interceptor,
  interceptInvokes: function (callback) {
    var self = this;
    return function () {
      var args = Array.prototype.slice.call(arguments, 0),
      result;        
      self.preInvoke.call(self, callback, args); 
      result = callback.apply(self, args);
      self.postInvoke.call(self, callback, args, result);
      return result;
    };
  }
}
 
/***
  Пример использования
***/
 
// Функция, вызов которой мы собираемся перехватить
function test(value) {
  value = value + 100;
  return value;
}
 
// Настраиваем перехватчик вызова
var logInterceptor = new Interceptor(function(callback, args) {
  console.log(args); // Покажем аргументы, перехваченного вызова
}, null);
test = logInterceptor.interceptInvokes(test); // Указываем фуекцию, которую хотим перехватить
 
console.log(test(2016)); // Вызываем тестовую функцию