пʼятниця, 19 січня 2018 р.

Прикрий баг в avt-gcc *** buffer overflow detected ***


 Якщо при компіляції проекту AVR avr-gcc видає подібну помилку, читайте далі, як її вирішити.

Linking: main.elf
avr-gcc -mmcu=atmega328p -I. -gdwarf-2 -DF_CPU=16000000UL  -DVARIANT= -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -MMD -MP -MF .dep/main.elf.d main.o uart/uart.o timer.o --output main.elf -Wl,-Map=main.map,--cref     -lm
*** buffer overflow detected ***: /usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fcf38d007e5]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x5c)[0x7fcf38da215c]
/lib/x86_64-linux-gnu/libc.so.6(+0x117160)[0x7fcf38da0160]
/lib/x86_64-linux-gnu/libc.so.6(+0x1166c9)[0x7fcf38d9f6c9]
/lib/x86_64-linux-gnu/libc.so.6(_IO_default_xsputn+0x80)[0x7fcf38d046b0]
/lib/x86_64-linux-gnu/libc.so.6(_IO_vfprintf+0xd1)[0x7fcf38cd6241]
/lib/x86_64-linux-gnu/libc.so.6(__vsprintf_chk+0x84)[0x7fcf38d9f754]
/lib/x86_64-linux-gnu/libc.so.6(__sprintf_chk+0x7d)[0x7fcf38d9f6ad]
/usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld[0x416c47]
/usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld[0x488174]
/usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld[0x411120]
/usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld[0x411ccf]
/usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld[0x411b9f]

        ................................................

7fcf39475000-7fcf3947c000 r--s 00000000 08:06 1312076                    /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7fcf3947c000-7fcf3947d000 r--p 00025000 08:06 671634                     /lib/x86_64-linux-gnu/ld-2.23.so
7fcf3947d000-7fcf3947e000 rw-p 00026000 08:06 671634                     /lib/x86_64-linux-gnu/ld-2.23.so
7fcf3947e000-7fcf3947f000 rw-p 00000000 00:00 0
7ffeec276000-7ffeec298000 rw-p 00000000 00:00 0                          [stack]
7ffeec2a9000-7ffeec2ab000 r--p 00000000 00:00 0                          [vvar]
7ffeec2ab000-7ffeec2ad000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
collect2: error: ld terminated with signal 6 [Перервано], core dumped
Makefile:557: спроба виконання рецепта для мети «main.elf» зазнала невдачі
make: *** [main.elf] Помилка 1

Рішення я випадково знайшов і хочу поділитися, бо ніде не знайшов рішення. Потратив 2 дні, дійшов до компіляції всього avr-toolchain. Так і не добився нічого. Аж поки в одному з вікон терміналу тестовий проект скомпілювався. В іншому вікні цей же проект видавав цю помилку. І, як і всі подібні баги, все було до непристойного просто: в тому терміналі, де лінковка проходила успішно, я перед цим змінив мову середовища на англійську: LANG=en !!!

З-за цього прикрого бага я більше року мусив вести розробку на AVR в Windows, добре що була наклейка на ноутбуці, бо я проти піратського софту.

Може комусь знадобиться.

Баг цей, здається, з'явився починаючи з xUbuntu 16.04. Зараз в мене Mint Cinnamon 17.3,
avr-gcc 4.9.2+Atmel3.5.0-1
avr-libc 1.8.0+Atmel3.5.0-1
binutils-avr 2.25+Atmel3.5.0-2
gdb-avr 7.7-2build1

Навздогін: також можна скористатися рішенням, що я надибав вже після того як знайшов своє рішення, на якомусь болгарському форумі: http://www.linux-bg.org/forum/index.php?topic=47519.msg300845#msg300845

В файлі Makefile чи в відповідних налаштуваннях IDE видалити опцію -Map=$(TARGET).map, тобто наприклад рядок


#---------------- Linker Options ----------------
#  -Wl,...:     tell GCC to pass this to linker.
#    -Map:      create map file
#    --cref:    add cross reference to  map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref

замінити на:

#---------------- Linker Options ----------------
#  -Wl,...:     tell GCC to pass this to linker.
#    -Map:      create map file
#    --cref:    add cross reference to  map file
LDFLAGS = -Wl,--cref


понеділок, 11 листопада 2013 р.

Перегнати відео з Youtube на Ex.ua

Вирішив забекапити відео збережене на Youtube. Хто зна що може статися, забанять в Україні чи просто глюкне, а деякі відео є лише там. Вирішив перекинути в перший, що попадеться відеохостинг. Попався Ex.ua.

Викачуємо всі відео з Y. з допомогою скрипта yuotube-dl.

Наприклад:

python26 youtube-dl -c --write-thumbnail --playlist-start 17 -o '%(playlist_index)s.%(title)s (%(format)s %(id)s).%(ext)s' --autonumber-size 3 -f 22/35/18 http://www.youtube.com/user/rivnegrace

Всі параметри прописані в довідці до скрипта.
Потрібні формати відео я підібрав проглянувши в яких форматах вон є збережені на Y.

python26 youtube-dl --get-filename -o '%(playlist_index)s.%(title)s (%(format)s %(id)s).%(ext)s' --autonumber-size 3 -F http://www.youtube.com/user/rivnegrace

Отримав для кожного відео щось на зразок:
Available formats:
22    :    mp4    [720x1280]
18    :    mp4    [360x640]
43    :    webm    [360x640]
5    :    flv    [240x400]
36    :    3gp    [240x320]
17    :    3gp    [144x176]
137    :    mp4    [1080p] (DASH Video)
136    :    mp4    [720p] (DASH Video)
135    :    mp4    [480p] (DASH Video)
134    :    mp4    [360p] (DASH Video)
133    :    mp4    [240p] (DASH Video)
160    :    mp4    [192p] (DASH Video)
141    :    m4a    [256k] (DASH Audio)
140    :    m4a    [128k] (DASH Audio)
139    :    m4a    [48k] (DASH Audio)


Інформація про формати тут:
http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs

Викачавши таким чином відео + превьюшки до них, перекачую їх на Ex.ua за допомогою скрипта ex.ua-loader.pl , котрого можна знайти на ньому ж.

ex.ua-loader.pl onivan пароль 74031054 '*.*' UTF8

 При цьому обов’язково потрібно взяти маску в лапки, щоб perl екранував пробіли і т.п. Також вказуємо UTF8, щоб імена файлів в кирилиці не викачалися на Ex.ua крякозяблами.

От і все!

О! Забувся додати, що всі ці маніпуляції я проводив на VPS де розміщений наш сайт, так що мав в своєму розпорядженні канал в 100Mbit/s, так що це перекачування зайняло зовсім небагато часу!



неділя, 17 березня 2013 р.

Онлайн відео трансляція з сайту в XBMC

Знадобилося налаштувати перегляд онлайн-трансляції з сайту http://grace.od.ua/ безпосередньо в плеєрі XBMC. Через веб-оглядач на Android, то не дуже зручно.

Запускаю будь-який сніфер, наприклад Wireshark.
Запускаю програвання на сайті і вводжу в фільтр rtmpt

Шукаю пакунок з командою play. Знаходжу mp4:grace.f4v. Це -- файл для програвання.

 Інший пакунок містить url плеєра та шлях до потоку.

Вставляю це все за зразком в файл example_streams.xml в папці addons\plugin.video.live.streams\
<item>
  <title>Благодать</title>        
  <link>rtmp://ms.grace.od.ua/liveg/ app=live swfUrl=http://grace.od.ua/plugins/content/jw_allvideos/includes/js/mediaplayer/player.swf pageURL=http://grace.od.ua/index.php?option=com_content&amp;view=article&amp;id=8&amp;Itemid=19 playpath=mp4:grace.f4v live=true</link>
 <thumbnail>http://grace.od.ua/images/Shape5_University_logo.png</thumbnail>
</item>


Перевірив на Windows версії XBMC. При нагоді перевірю й на Android.

вівторок, 12 лютого 2013 р.

Апгрейд процесора в ноутбуці

В HP Compaq 6720s (RM388UT) стояв Intel Celeron M 550 -- реальне гальмо, з яким нічого не можливо було робити, навіть звичайне відео на весь екран заїдало. Пошук в мережі дав надію, що можна поставити щось потужніше.
Вихідні дані:
Чіпсет: GL960.
Роз'єм: Socket P.
Процесор:  Intel Celeron M 550

Натрапив на дуже практичне обговорення стосовно саме цього чіпсета: http://forum.notebookreview.com/hardware-components-aftermarket-upgrades/212097-gl960-chipset-processor-upgradability-9.html#post6578101

На даному сайті знайшов список сумісних процесорів: http://www.sparepartswarehouse.com/HP-Compaq,6720s,RM388UT,Laptop,Processors-CPU.aspx

Як видно з цього сайту, серед підтримуваних є досить потужні http://www.notebookcheck.net/Mobile-Processors-Benchmarklist.2436.0.html

Ось зведена табличка в порядку спадання продуктивності:


На місцевій "барахолці" знайшов і придбав Intel Core 2 Duo T5450 за ~$20. На ebay був більший вибір, але хотілося мати можливість швидко повернути в разі невдачі.

Після того, як я поставив новий проц, комп преобразився, став дуже швидким! Але як і писалося в  обговоренні по посиланню вище, комп'ютер після виходу з режиму очікування зависав з артефактами на екрані. Також завантажитися можна було лише з другої спроби, зайшовши перед тим в BIOS.

Постало питання заміни однієї з планок пам'яті на DDR2 PC-4200, аби понизити частоту шини пам'яті відносно, якої встановлювалася частота графічного процесора і яка з новим процесором стала вище номінальної, так що він працював в розігнаному режимі і тому глючив.

На щастя я знайшов простіший вихід. Скачав SPDTool і перешив один з модулів пам'яті встановивши в прошивці найвишу її частоту в 267 МГц. Після перезавантаження, все стало на місця, при цьому процесор залишився працювати з FSB 667МГц. Табличка частот і множників, як я їх зрозумів, наведена в табличці вище.





Правильне сортування прізвищ в таблиці SQLite

Пам'ятка
При розробці бази імен з використанням SQLite3 вилізла одна маленька, але неприємна річ -- при сортуванні за іменами/прізвищами порядок виявився досить диким: на початку списку йшли люди з прізвищами на "Є", "І", "Ї". Потім йшли на "А" і далі, як і повинно бути, а в самому кінці, після "Я" тулилася нещасна літера "Ґ".

Спочатку я намагався вирішити цю проблему шляхом:
SELECT icu_load_collation('uk_UA', 'UKRAINIAN');
але проблема виявилася в тому, що це вимагало додаткової мороки з нестандартною збіркою sqlite3.dll/sqlite3.so.Також вилазили інші глюки.

Спочатку я залишив це як є, але оце вирішив все-таки побороти цю проблему.

Рішення (aka "милиця" aka "костиль").
SELECT name, CASE
WHEN SUBSTR(name,1,1) LIKE '%Ґ%' OR  SUBSTR(name,1,1)   LIKE '%ґ%'  THEN 'Гя' || SUBSTR (name, 2) 
WHEN SUBSTR(name,1,1) LIKE '%Є%' OR  SUBSTR(name,1,1) LIKE '%є%'  THEN 'Ея' || SUBSTR (name, 2)
WHEN SUBSTR(name,1,1) LIKE '%І%' OR  SUBSTR(name,1,1) LIKE '%і%'  THEN 'Ию' || SUBSTR (name, 2) 
WHEN SUBSTR(name,1,1) LIKE '%Ї%' OR  SUBSTR(name,1,1) LIKE '%ї%'  THEN 'Ия' || SUBSTR (name, 2) 
ELSE name END AS SortField 
FROM grace_people_c ORDER BY SortField ASC
Виглядає незвично, але працює як годинник! Мені достатньо було правильного сортування по першим буквам. Інакше можна аналогічно застосувати SQLite-функцію REPLACE

От що значить пару годин порухати мізками і вдумливо покурити мануали!


понеділок, 7 січня 2013 р.

Поштова система на VDS CentOS 5

Виникла потреба налаштувати повноцінну поштову систему. Після ознайомлення в мережі вибір впав на Postfix, MySQL, Squirrelmail, Dovecot, SSL.

Спочатку налаштував по ось цим керівництвам: http://daily-notes.ru/2011/11/vds_hetzner_hosting_mail_server/
http://sudouser.com/ustanovka-pochtovogo-servera-postfix-dovecot-mysql-i-virtualnyx-domenov.html

Потім натрапив на Postfixadmin і переналаштовую по ось цим:
http://www.houseoflinux.com/e-mail/postfix-dovecot-mysql-squirrelmail-on-centos-5-5-32-64-bits/all-pages
http://www.hilik.org.ua/%D1%81%D1%82%D1%80%D0%BE%D0%B8%D0%BC-%D0%BF%D0%BE%D1%87%D1%82%D0%BE%D0%B2%D1%83%D1%8E-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%83postfix-dovecot-postfixadmin-%D1%87%D0%B0%D1%81%D1%82%D1%8C-%D0%BF-2/

Наразі відправка пошти працює ідеально з правильними заголовками (в тому числі PTR). З отриманням пошти щось не так ще. Підозрюю, щось недопиляв з записами DNS.

Update:
На даний момент налаштував можливість відправки пошти з віддаленого клієнта по smtp з SSL/TLS  авторизацією. Мені це ніяк не вдавалося -- робив все що міг: міняв налаштування iptables, DNS записи, кілька разів заново переналаштовував postfix. Писав в підтримку хостинг-провайдера -- питав чи не закривають порти. В кінці кінців вияснилося, що доступ до 25-й порту закриває інтернет провайдер (Intertelecom). Та взагалі-то мені й не крепко те треба було, бо я врешті мав налаштувати на 587/465 порт. Але ці порти взагалі не відкликалися.

Після всього цього микання натрапив в тирнеті, як поміняти, щоб postfix слухав не 25-й порт, а якийсь інший. Це робиться в /etc/postfix/master.cf

smtp      inet  n       -       n       -       -       smtpd 
замінити на
425       inet  n       -       n       -       -       smtpd


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

submission inet n       -       n       -       -       smtpd
  -o smtpd_enforce_tls=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject


Тю! submission це 587 порт, а smtps -- 465 і вони закоментовані.

Після того, як я їх розкоментував, все запрацювало.

Я 4 дні рив тирнет, перечитав безліч інструкцій і ніде про ці рядки не було написано!

Треба ще розібратися, що потрібно залишити 465 чи 587.

Правда залишилася проблема з доставкою пошти від інших MTA ззовні на сервер. Поправив DNS-записи для домена (трохи наплутав там, поки розбирався) і логи показали, що сервери намагаються доставити пошту, але не можуть знайти користувачів. Ну та це вже треба знову заново начисто все налаштувати. Головну проблему я виявив. Теж саме з Dovecot. Але зараз мені це не є вкрай необхідним і немає коли розбиратися.




пʼятниця, 28 вересня 2012 р.

Антена для 3g CDMA модема


Так сталося, що переїхали в село. Там, поки що, єдиний доступний варіант -- 3g CDMA. Без антени хоч якийсь сигнал був лише якщо вивішувати модема за вікно. Тому постало питання виготовлення антени. Спочатку зробив схожу на таку:
http://i-net.com.ua/index.php?option=com_content&task=view&id=118&Itemid=20
або тут http://netobzor.org/forum/index.php?topic=554.0
Працювала непогано, але віддав її товаришеві, який живе в сусідньому селі.
Собі зробив таку як тут:
http://netobzor.org/forum/index.php?topic=1059.msg11359#msg11359

Антена -- те, що треба! За даними AxesstelPst підсилення разом з 7 метрами 50-омного кабелю Vector не менше 14 дБ! Принаймні, модем за вікном дає максимум -89..-93 дБ, а антена -74..-76!
Пропускна здатність каналу -- 3 мегабіта в секунду. Правда, в середньому є 500 кбіт/с, але без обривів і підвисань. Вранці, буває, можна зловити і 2 мбіт/с.

Джерело: 6-елементна рамкова антена для 3g CDMA 859МГц

Джерело: 6-елементна рамкова антена для 3g CDMA 859МГц
На антену пішло:
 - 2 метри мідного дроту перерізом 10мм2;
 - кусок витої пари для того, щоб зкрутити між собою в потрібних місцях рамки перед їх спаюванням;
 - кусок коаксіального 50-омного кабелю;
 - конектор на кабель;
 - самий дорогий компонент -- перехідник для модема;

 - пара годин терпіння і пара плоскогубців, щоб з товстенного дроту вигнути рамки максимально близько до потрібних розмірів.