Апр 27

AVR CMake

Clion & AVRВот уже несколько лет пользуюсь CMake-ом, чтобы собирать проекты под AVR. Сподвиг на этом конечно же вышедший осенью 2014 Jetbrains CLion, который как оказалось идеально подходит для написания кода под Atmel AVR. Короче, рекомендую.
Возможно, для корректной работы нужно будет установить переменную среды AVR_FIND_ROOT_PATH — на папку с avr (содержащую lib и include), а так же папка с avr-gcc, avr-g++, avr-objcopy, avr-size должны находиться в PATH. Ну или доработать напильником generic-gcc-avr.cmake

В общем, шаблон тут: https://github.com/bevice/avr_cmake_template
Continue reading

Июн 15

UART размер экрана

Для общения через UART с железками (avr, stm32 и прочими) в основном использую GNU screen:

$ screen /dev/tty.ubserial 9600

А вот что-то дернуло, раскрасить вывод микроконтроллера и раскрасил (не мудрено, печатаем что-то вроде \033[31m и вперед, ну только цвета меняем). А потом поехало: захотелось печатать в разных местах экрана (\033[y;xH), а вот как напечатать в центре? Надо же знать размер экрана, а он у меня (да и у всех) каждый раз разный.
Долго возился, выяснил, что screen отдавать размер окна (\033[18t) не умеет. Зато DCS передает напрямую терминалу из которого запущен: вот и нашелся грязный хак: оборачиваем запрос размера в ESC-P последовательность, и вот уже знаем размер экрана.
Печатаем хитрую строку:

\033P\033[18t033\

и получаем ответ:

\[8;31;163t

31 строка, 163 колонки, а 8 — это номер CSI-репорта. Он всегда такой.

вот тут большой список похоже что вообще всех ESC-последовательностей которые терминалы поддерживают: ttssh2.osdn.jp

P.S.
Ну а бонусом — таким же способом можно поставить заголовок окна который screen ставить умеет только через жопу.

\033P\033]0;New Window Title\a\033\\
Дек 13

responseText ошибки при AJAX-запросе

За формирование страницы ошибки отвечает функция technical_500_response из django.views.debug,
программисты джанги пошли странным путем, жестко задав (без возможности настройки): если запрос AJAX — ответ будет текстом, в остальных случаях HTML.
Все бы ничего, но raise Http404(), например, плевать на этот механизм хотела, и все равно выбрасывает HTML, если выводить ошибку в консоль — сущий ад.
Изменить поведение можно например так:
Добавить Middleware которая, в случае ошибки уберет из request соответствующий заголовок,
дальше джанга отработает по своему алгоритму и вернет красивый HTML.
Криво конечно, т.к. пропадает возможность узнать был Ajax или не было, но не нужно патчить Django

1
2
3
4
class DisableAjaxException(object):
    @staticmethod
    def process_exception(req, exception):
        req.META['HTTP_X_REQUESTED_WITH'] = None

Ну и остается напомнить, порядок Middleware в settings.py важен

Июн 07

MySQL и foreign key constraint fails

Cannot add or update a child row: a foreign key constraint fails
Такое случается, если включена проверка InnoDB foreign key, но ссылается ключ на таблицу не InnoDB (например MyISAM)
лечится:

  • конвертированием всех таблиц в InnoDB
  • конвертирование всех таблиц в MyISAM
  • или отключением проверки:
DATABASES = {
'default': {
    ...         
    'OPTIONS': {
         "init_command": "SET foreign_key_checks = 0;",
    },
 }
}

Статейка про InnoDB

Апр 26

Плеер в iOS

Music player

 
 
//Тут лежит MPNowPlayingInfoCenter и прочие MP*    
#import <mediaplayer /MediaPlayer.h>
 
 
 
 NSString * path = [[NSBundle mainBundle]pathForResource:@"some_track" ofType:@"mp3"];
 NSURL *url = [NSURL fileURLWithPath:path];
//Создаем плеер
 
AVAudioPlayer * player;
player  = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
//Задаем громкость
player.volume = 1.0f;
//Загружаем файл в буффер 
[player prepareToPlay];	
//Разрешаем играть в фоне
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback  error:nil];
 
//Загружаем обложку
UIImage * artwork = [UIImage imageNamed:@"Artwork.jpg"];
//Создаем словарь с параметрами now playing
NSDictionary * info = @{MPMediaItemPropertyAlbumTitle: @"Astronimia",
                        MPMediaItemPropertyArtist: @"TONY IGY",
                        MPMediaItemPropertyArtwork: [[MPMediaItemArtwork alloc] initWithImage:artwork]
                        };
//Отправляем созданное в куда следует
[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = info;
 
 
// Управление, со шторки, наушников, экрана блокировки
 
//Начинаем принимать события
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//Заканчиваем принимать события
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
 
//Обработчик событий
-(void) remoteControlReceivedWithEvent:(UIEvent *)event {
    if(event.type == UIEventTypeRemoteControl){
        switch (event.subtype) {
            case UIEventSubtypeRemoteControlTogglePlayPause:
            case UIEventSubtypeRemoteControlPlay:
            case UIEventSubtypeRemoteControlPause:
                [self togglePlayPause];
                break;
            default:
                break;
        }
    }
}
</mediaplayer>

Янв 21

Apache mod_wsgi и SQLite база

Если вдруг внезапно unable to open database file — это апачу не хватает прав на запись в папку с базой. Ну это если других косяков нет

Июл 15

Логи на удаленный syslog-ng

А все просто, стандартный модуль logging вполне справляется с этим:

import logging
from logging.handlers import SysLogHandler
log = logging.getLogger('loggername')
log.addHandler(SysLogHandler(address=('localhost', 514)))
log.setLever(logging.INFO)
log.info('Log test')

Крайне рекомендуется прочесть logging-cookbook

Июл 14

Как использовать Django из внешнего скрипта

Для асинхронной задачи можно создать команду (django management command), или подключить джагну к своему сприпту:

import sys
sys.path.append('/path/to/django/projectname')
from projectname import settings
from django.core.management import setup_environ
setup_environ(settings)
#Получаем настроенную среду django:
from main.models import Model1
print Model1.objects.all()
Июн 01

OpenOCD & OSX & FTDI-CoLink

Если установлены драйвера FTDI VCP (Virtual Com Port) OpenOCD к Colink не подцепится — канал A уже используется.
Или выгрузить кекст или поправить
/System/Library/Extensions/FTDIUSBSerialDriver.kext/Contents/Info.plist
на предмет комментирования секции подключения канала А:

                <key>FT2232C_A</key>
                <dict>
                        <key>CFBundleIdentifier</key>
                        <string>com.FTDI.driver.FTDIUSBSerialDriver</string>
                        <key>IOClass</key>
                        <string>FTDIUSBSerialDriver</string>
                        <key>IOProviderClass</key>
                        <string>IOUSBInterface</string>
                        <key>bConfigurationValue</key>
                        <integer>1</integer>
                        <key>bInterfaceNumber</key>
                        <integer>0</integer>
                        <key>idProduct</key>
                        <integer>24592</integer>
                        <key>idVendor</key>
                        <integer>1027</integer>
                </dict>

ну и перезагрузить кекст.