О чём это?
Snippet — небольшой фрагмент програмного кода, иллюстрирующий решение конкретной задачи, пригодный для повторного использования. Большинство из 158 статей на этом сайте посвящено вопросам веб-программирования и администрирования веб-серверов.
Disclaimer. Статьи отражают личное мнение, взгляды и подходы авторов, а также могут содержать ошибки и неточности, но мы очень-очень стараемся :). К сожалению, любая информация имеет свойство устаревать, обращайте внимание на дату публикации статьи.
Библиотека Eagle CAD для STM8S103
Выложил на GitHub библиотеку с паябельными в домашних условиях версиями контроллеров STM8S103.
Как посмотреть код после препроцессора Cosmic для STM8
При отладке сложных макросов бывает нужно посмотреть на код, сгенерированный препроцессором. Для компилятора под STM8 от Cosmic для этого существует следующая опция:
-sp
create only preprocessed files and stop. Do not compile files produced. Preprocessed output defaults to<file>.p.The produced files can be compiled as C source files.
Её достаточно добавить в поле: Project -> Settings -> C Compiler -> User Defined Options, запустить сборку проекта и посмотреть в сгенерированные .p-файлы.
Важно не забыть, что пока указана эта опция, компиляция не будет происходить.
Использование avrdude с AVR Studio 5
Для микроконтроллеров AVR существует большое количество неофициальных программаторов, большинство из которых поддерживается avrdude и не поддерживается напрямую IDE AVR Studio 5.
Пока нашел следующие способы вызвать avrdude из IDE:
Post-build Events
В свойствах проекта (Project -> Properties -> Build Events) для каждой конфигурации в поле Post-build event command line можно указать команды, которые будут выполнены после успешной сборки проекта:
avrdude -v -c usbtiny -p $(avrdevice) -U flash:w:$(Name).hex
По умолчанию конфигурации две: Release и Debug, удобно создать ещё одну на основе Release, которая будет отличаться вызовом avrdude для прошивки.
External Tools
В пункте меню Tools -> External Tools можно указать команды для запуска внешних утилит. Минус решения — не нашел способа автоматически подставить тип контроллера из текущего проекта.
Вызывать внешнюю команду можно и по горячей клавише, которая выбирается в пункте Tools -> Options -> Environment -> Keyboard. Название команды для внешней утилиты выглядит так: Tools.ExternalCommandX, где X — номер по порядку.
Снова об отрицании в регулярном выражении
Реализовать условие «строка не содержит подстроку» напрямую в регулярном выражении нельзя, но можно воспользоваться т.н. negative lookahead (которые уже были описаны в предыдущем сниппете):
<pre> <?php $pattern = "/^(?!(.*?)HTC)/"; // Совпадение будет со строкой не содержащей 'HTC' preg_match($pattern, "HTC A310 Explorer", $matches); print_r($matches); preg_match($pattern, "Нетбук Acer Aspire 3750", $matches); print_r($matches); ?> </pre>
Другой вариант реализации предложен на stackoverflow.com.
Перенос make-файлов (Makefile) с WinAVR на AVR Toolchain
Проект WinAVR больше не поддерживается автором, вместо него Atmel предлагает AVR Toolchain (в виде отдельного пакета и в составе AVR Studio 5).
Возникла необходимость пересобрать старый проект, make-файл которого основывался на шаблоне из комплекта WinAVR, новым тулчейном. Для этого понадобились небольшие правки make-файла. Большинство из них необходимы потому, что в WinAVR был эмулятор оболочки (sh), а в AVR Toolchain его нет, поэтому команды оболочки заменены на консольные команды Windows. Изменения в формате diff-файла ниже (автоматически накатить patch, скорее всего не получится, номера строк могут быть разными).
Настройки Arduino IDE для ATmega8(A) с optiboot
В платах от проекта Arduino начиная с платы Arduino Uno используется новый бутлоадер optiboot (занимает всего 512 б флеш-памяти, прошивка на скорости 115200). С недавних версий этого бутлоадера появилась поддержка контроллера ATmega8 с внешним кварцем на 16 МГц. Для того, чтобы воспользоваться ею из среды Arduino 1.0 достаточно добавить в файл \hardware\arduino\boards.txt следующее (необходимые скомпилированные файлы бутлоадера уже есть в комплекте):
############################################################## atmega8optiboot.name=ATmega8 (optiboot, 16Mhz XTAL) atmega8optiboot.upload.protocol=arduino atmega8optiboot.upload.maximum_size=7680 atmega8optiboot.upload.speed=115200 atmega8optiboot.bootloader.low_fuses=0xBF atmega8optiboot.bootloader.high_fuses=0xCC atmega8optiboot.bootloader.path=optiboot atmega8optiboot.bootloader.file=optiboot_atmega8.hex atmega8optiboot.bootloader.unlock_bits=0x3F atmega8optiboot.bootloader.lock_bits=0x0F atmega8optiboot.build.mcu=atmega8 atmega8optiboot.build.f_cpu=16000000L atmega8optiboot.build.core=arduino atmega8optiboot.build.variant=standard
Командная строка avrdude (для прошивки без Arduino IDE, номер COM-порта нужно заменить):
avrdude -v -p atmega8 -c arduino -P COM2 -b 115200
Паттерны организации кода в JavaScript (памятка)
Более двух лет назад был написан сниппет «Паттерны организации кода на чистом JavaScript, JQuery и Prototype». За это время многое изменилось, сегодня выкладываю обновление в виде памятки по самым популярным способам создания reusable component'ов отсортированных от простого к сложному (в случае, если не нашел устоявшегося названия — пришлось придумать своё):
Чистый JavaScript без фреймворков
- Object Literal
- function constructor + object prototype (пример «Чистый JavaScript без использования фреймворков» в старом посте)
- Javascript Module Pattern
- Resig's Simple Inheritance (по результирующему синтаксису очень похож на подход Prototype)
jQuery
- «Минимальный» плагин (пример «jQuery» в старом посте)
- «Сбалансированный» плагин (мой пример в сниппете Шаблон jQuery-плагина, как оказалось, очень похож на jQuery Boilerplate)
- «Плагин с использование паттерна Bridge»
- jQuery UI widget factory (развитие подхода из предыдущего пункта)
Нумерация записей коллекции средствами LINQ
Для получения индекса элемента коллекции в LINQ существует специальная версия метода Select():
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LINQ_Indexing
{
class Program
{
static void Main(string[] args)
{
var data = new string[] { "First", "Second", "Third" };
var dataWithIndex = data.Select((x, index) => new
{
Index = index,
Title = x
});
foreach (var item in dataWithIndex)
{
Console.WriteLine("{0} {1}", item.Index, item.Title);
}
}
}
}
Отслеживание одного сайта в двух аккаунтах Google Analytics
Отслеживать один сайт в нескольких аккаунтах Google Analytics довольно просто, достаточно немного изменить стандартный код отслеживания:
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXXX-X']); // Идентификатор веб-ресурса с первого аккаунта
_gaq.push(['_trackPageview']);
_gaq.push(['_setAccount', 'UA-XXXXXX-X']); // Идентификатор веб-ресурса со второго аккаунта
_gaq.push(['_trackPageview']);
// Стандартный код загрузки
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
При отслеживании одновременно в двух аккаунтах, осуществляется два отдельных запроса на сервера Google Analytics.
Регистрация и отслеживание AJAX-запросов в Google Analytics
Регистрация и отслеживание AJAX-запросов в Google Analytics
Google-Analytics jQuery JavaScript AJAX
В API Google Analytics есть возможность программно регистрировать посещение страницы с помощью метода _trackPageview, это удобно использовать для отслеживания AJAX-запросов. Для упрощения использования этой функциональности в проектах, где есть jQuery был написан миниатюрный плагин:
(function ($) {
$.extend({
ga: {
trackAjax: function (url) {
if (window._gaq) {
_gaq.push(['_trackPageview', '/ajax-handlers' + url]);
}
}
}
});
})(jQuery);
Пример использования:
var ajaxUrl = '/get-some-data-via-ajax/';
$.ajax({
type: 'POST',
url: ajaxUrl
data: params,
dataType: 'json',
success: function (data) {
...
$.ga.trackAjax(ajaxUrl);
}
});
Важно помнить, что при каждом вызове функции _trackPageview делается дополнительный HTTP-запрос на сервера Google Analytics.
