О чём это?

Snippet — небольшой фрагмент програмного кода, иллюстрирующий решение конкретной задачи, пригодный для повторного использования. Большинство из 158 статей на этом сайте посвящено вопросам веб-программирования и администрирования веб-серверов.

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

Библиотека Eagle CAD для STM8S103

17.01.2012 22:42 / Артём Волк / 47 просмотров / ...

Выложил на GitHub библиотеку с паябельными в домашних условиях версиями контроллеров STM8S103.

Как посмотреть код после препроцессора Cosmic для STM8

16.01.2012 21:31 / Артём Волк / 33 просмотра / ...

При отладке сложных макросов бывает нужно посмотреть на код, сгенерированный препроцессором. Для компилятора под 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

31.12.2011 11:04 / Артём Волк / 135 просмотров / ...

Для микроконтроллеров 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 — номер по порядку.

Снова об отрицании в регулярном выражении

29.12.2011 17:53 / Артём Волк / 88 просмотров / ...

Реализовать условие «строка не содержит подстроку» напрямую в регулярном выражении нельзя, но можно воспользоваться т.н. 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

11.12.2011 17:48 / Артём Волк / 252 просмотра / ...

Проект WinAVR больше не поддерживается автором, вместо него Atmel предлагает AVR Toolchain (в виде отдельного пакета и в составе AVR Studio 5).

Возникла необходимость пересобрать старый проект, make-файл которого основывался на шаблоне из комплекта WinAVR, новым тулчейном. Для этого понадобились небольшие правки make-файла. Большинство из них необходимы потому, что в WinAVR был эмулятор оболочки (sh), а в AVR Toolchain его нет, поэтому команды оболочки заменены на консольные команды Windows. Изменения в формате diff-файла ниже (автоматически накатить patch, скорее всего не получится, номера строк могут быть разными).

читать дальше...

Настройки Arduino IDE для ATmega8(A) с optiboot

11.12.2011 17:19 / Артём Волк / 291 просмотр / ...

В платах от проекта 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 (памятка)

27.11.2011 14:00 / Артём Волк / 281 просмотр / ...

Более двух лет назад был написан сниппет «Паттерны организации кода на чистом JavaScript, JQuery и Prototype». За это время многое изменилось, сегодня выкладываю обновление в виде памятки по самым популярным способам создания reusable component'ов отсортированных от простого к сложному (в случае, если не нашел устоявшегося названия — пришлось придумать своё):

Чистый JavaScript без фреймворков

jQuery

Нумерация записей коллекции средствами LINQ

27.11.2011 12:25 / Артём Волк / 114 просмотров / ...

Для получения индекса элемента коллекции в 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

10.11.2011 17:37 / Артём Волк / 161 просмотр / ...

Отслеживать один сайт в нескольких аккаунтах 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

09.11.2011 23:18 / Артём Волк / 195 просмотров / ...

Регистрация и отслеживание 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.


Страница 1 из 16