SlideShare a Scribd company logo
Go в автобусе
Oпыт использования Go
во встраиваемых
системах
Максим Чечель
maximchick@gmail.com
Почему Go?
● Небольшой размер исполняемого файла (“Hello world” ~ 1.5 мб)
● Простота кросс-компиляции (в т.ч. под ARM)
● Статически скомпилированные зависимости
● Малый размер потребляемой памяти
● Наличие необходимых библиотек для работы с внешним
оборудованием: https://github.com/tarm/serial
● GC, встроенные примитивы для “многопоточного” программирорования,
самодостаточная стандартная библиотека
Размер исполняемого файла
● Почему это важно?
○ Ограниченный объём носителя и ОЗУ
○ Обновление на медленных соединениях
○ Ограничения по трафику, либо очень дорого, либо очень медленно.
● Сжатие исполняемого файла с помощью
upx --best -o program-compressed program
Было 9.4Мб стало 3.4Мб, коэффициент сжатия примерно один и тот же
для исполняемых файлов go любого размера.
http://upx.sourceforge.net/
Обновление ПО бортовых терминалов
● Привычные сценарии не работают
○ Лишь часть автобусов в онлайне
○ Могут отсутствовать выделенные IP адреса
○ Проблемы со связью из-за которых приходится повторять процедуру обновления
● Выход - самообновление
○ Простое скачивание сжатого исполняемого файла
○ Обновление через bsdiff-патчи https://github.com/inconshreveable/go-update
○ Откуда ваша программа узнает собственную версию?
■ go build -ldflags "-X main.my_version 1.0.5" program.go
■ go run -ldflags "-X main.my_version 1.0.5" program.go
○ Работа с версиями: https://github.com/hashicorp/go-version
Обновление через bsdiff-патчи
● Определяем собственную версию
● Получив от сервера информацию об актуальной версии запрашиваем
соотв. патч: https://someserv.er/armv5/1.0.5/1.0.8.bsdiff (если необходимо)
● Генерировать патчи можно как при сборке новой версии так и скриптом
на сервере, потому что в “полях” может быть огромный зоопарк версий и
генерировать патчи для всех возможных пар версий может быть
утомительно
● Размер патча между двумя исполняемыми файлами написанными на Go
~45-200Кб при относительно небольших изменениях (до нескольких
десятков строк исходного кода). Время генерации патча ~10c (в моём
случае)
Спасибо!

More Related Content

What's hot

Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Yandex
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Yandex
 
Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016
Nikita Baksalyar
 
Зачем нужен Go?
Зачем нужен Go?Зачем нужен Go?
Зачем нужен Go?
Alexander Borzunov
 
Go и fuse
Go и fuseGo и fuse
Go и fuse
Daniel Podolsky
 
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3it-people
 
Готовим код 
в мир открытых исходников
Готовим код 
в мир открытых исходниковГотовим код 
в мир открытых исходников
Готовим код 
в мир открытых исходников
Elena Grahovac
 
Shytikov on git Magic
Shytikov on git MagicShytikov on git Magic
Shytikov on git Magicshytikov
 
Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)
AvitoTech
 
Отладка в Python: 2016 edition
Отладка в Python: 2016 editionОтладка в Python: 2016 edition
Отладка в Python: 2016 edition
Кирилл Борисов
 
БЭМ: новости проектов и последние релизы — Владимир Гриненко
БЭМ: новости проектов и последние релизы — Владимир ГриненкоБЭМ: новости проектов и последние релизы — Владимир Гриненко
БЭМ: новости проектов и последние релизы — Владимир Гриненко
Yandex
 
Подключение внешних библиотек в python
Подключение внешних библиотек в pythonПодключение внешних библиотек в python
Подключение внешних библиотек в python
Maxim Shalamov
 
Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)
AvitoTech
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
Nikita Baksalyar
 
Владимир Гриненко — Библиотеки блоков bem-core и bem-components
Владимир Гриненко — Библиотеки блоков bem-core и bem-componentsВладимир Гриненко — Библиотеки блоков bem-core и bem-components
Владимир Гриненко — Библиотеки блоков bem-core и bem-components
Yandex
 
Women Techmakers Novosibirsk, первый митап
Women Techmakers Novosibirsk, первый митапWomen Techmakers Novosibirsk, первый митап
Women Techmakers Novosibirsk, первый митап
Elena Grahovac
 
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
IT-Доминанта
 
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...CodeFest
 
Rozum robotics release cycle
Rozum robotics release cycleRozum robotics release cycle
Rozum robotics release cycle
Nikolay Lagutko
 

What's hot (20)

Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
 
Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016
 
Зачем нужен Go?
Зачем нужен Go?Зачем нужен Go?
Зачем нужен Go?
 
Go и fuse
Go и fuseGo и fuse
Go и fuse
 
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3
 
Готовим код 
в мир открытых исходников
Готовим код 
в мир открытых исходниковГотовим код 
в мир открытых исходников
Готовим код 
в мир открытых исходников
 
Shytikov on git Magic
Shytikov on git MagicShytikov on git Magic
Shytikov on git Magic
 
Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)
 
Кляшко -
Кляшко - Кляшко -
Кляшко -
 
Отладка в Python: 2016 edition
Отладка в Python: 2016 editionОтладка в Python: 2016 edition
Отладка в Python: 2016 edition
 
БЭМ: новости проектов и последние релизы — Владимир Гриненко
БЭМ: новости проектов и последние релизы — Владимир ГриненкоБЭМ: новости проектов и последние релизы — Владимир Гриненко
БЭМ: новости проектов и последние релизы — Владимир Гриненко
 
Подключение внешних библиотек в python
Подключение внешних библиотек в pythonПодключение внешних библиотек в python
Подключение внешних библиотек в python
 
Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
 
Владимир Гриненко — Библиотеки блоков bem-core и bem-components
Владимир Гриненко — Библиотеки блоков bem-core и bem-componentsВладимир Гриненко — Библиотеки блоков bem-core и bem-components
Владимир Гриненко — Библиотеки блоков bem-core и bem-components
 
Women Techmakers Novosibirsk, первый митап
Women Techmakers Novosibirsk, первый митапWomen Techmakers Novosibirsk, первый митап
Women Techmakers Novosibirsk, первый митап
 
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
 
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
 
Rozum robotics release cycle
Rozum robotics release cycleRozum robotics release cycle
Rozum robotics release cycle
 

Viewers also liked

Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в Openprovider
Igor Dolzhikov
 
Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runit
Alexander Shcherbinin
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
Anton Piskunov
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object model
Alex Mikitenko
 
Ruby строки
Ruby строкиRuby строки
Ruby строки
Evgeny Smirnov
 
OOP в Go
OOP в GoOOP в Go
OOP в Go
Artem Kovardin
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015
Mikhail Salosin
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruAlexander Shcherbinin
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивами
Evgeny Smirnov
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwords
Daniel Podolsky
 
Machine Learning in Magento 2
Machine Learning in Magento 2Machine Learning in Magento 2
Machine Learning in Magento 2
Alexander Makeev
 
Применение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахПрименение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектах
Alex Chistyakov
 
Лямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связьюЛямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связью
Alexander Makeev
 
1. ruby великолепный. вступление история и философия
1. ruby великолепный. вступление   история и философия1. ruby великолепный. вступление   история и философия
1. ruby великолепный. вступление история и философия
Александр Вагин
 
HR-аналитика и автоматизация рекрутинга: лучшие практики
HR-аналитика и автоматизация рекрутинга: лучшие практикиHR-аналитика и автоматизация рекрутинга: лучшие практики
HR-аналитика и автоматизация рекрутинга: лучшие практики
Alexander Krass
 
4. ruby великолепный. фреймворки
4. ruby великолепный. фреймворки4. ruby великолепный. фреймворки
4. ruby великолепный. фреймворки
Александр Вагин
 
Dynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friendsDynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friends
Alex Mikitenko
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyAlex Chistyakov
 

Viewers also liked (20)

Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в Openprovider
 
Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runit
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object model
 
Ruby строки
Ruby строкиRuby строки
Ruby строки
 
OOP в Go
OOP в GoOOP в Go
OOP в Go
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ru
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивами
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwords
 
Machine Learning in Magento 2
Machine Learning in Magento 2Machine Learning in Magento 2
Machine Learning in Magento 2
 
Применение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахПрименение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектах
 
Лямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связьюЛямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связью
 
1. ruby великолепный. вступление история и философия
1. ruby великолепный. вступление   история и философия1. ruby великолепный. вступление   история и философия
1. ruby великолепный. вступление история и философия
 
HR-аналитика и автоматизация рекрутинга: лучшие практики
HR-аналитика и автоматизация рекрутинга: лучшие практикиHR-аналитика и автоматизация рекрутинга: лучшие практики
HR-аналитика и автоматизация рекрутинга: лучшие практики
 
4. ruby великолепный. фреймворки
4. ruby великолепный. фреймворки4. ruby великолепный. фреймворки
4. ruby великолепный. фреймворки
 
Dynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friendsDynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friends
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 

Similar to Go в автобусе

Multithreading in go
Multithreading in goMultithreading in go
Multithreading in go
Lohika_Odessa_TechTalks
 
HBase on Dev{Highload}
HBase on Dev{Highload}HBase on Dev{Highload}
HBase on Dev{Highload}
Alex Chistyakov
 
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
IT-Portfolio
 
Инструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаИнструменты профайлинга С++ кода
Инструменты профайлинга С++ кода
corehard_by
 
Couchbase, что за зверь и на что способен.
Couchbase, что за зверь и на что способен.Couchbase, что за зверь и на что способен.
Couchbase, что за зверь и на что способен.Alexey Rusnak
 
My talk on Salt and Ansible from DevConf 2014
My talk on Salt and Ansible from DevConf 2014My talk on Salt and Ansible from DevConf 2014
My talk on Salt and Ansible from DevConf 2014
Alex Chistyakov
 
Оптимизация JavaScript в Drupal
Оптимизация JavaScript в DrupalОптимизация JavaScript в Drupal
Оптимизация JavaScript в Drupal
Vlad Savitsky
 
Презентация на тему Форматы графических файлов.ppt
Презентация на тему Форматы графических файлов.pptПрезентация на тему Форматы графических файлов.ppt
Презентация на тему Форматы графических файлов.ppt
ssuser4393fb
 
Там, где Rails не справляются
Там, где Rails не справляютсяТам, где Rails не справляются
Там, где Rails не справляются
Max Lapshin
 
My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016
Alex Chistyakov
 
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)Ontico
 
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
HLL
 
Использование ленточных технологий для сокращения стоимости файловых хранилищ
Использование ленточных технологий для сокращения стоимости файловых хранилищИспользование ленточных технологий для сокращения стоимости файловых хранилищ
Использование ленточных технологий для сокращения стоимости файловых хранилищ
Alexander Reytman
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
ITCrowd Almaty
 
presentation_r00t_conf
presentation_r00t_confpresentation_r00t_conf
presentation_r00t_confMax Glekov
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
Python Meetup
 
архивация данных
архивация данныхархивация данных
архивация данных
ANSevrukova
 
Внутренняя память компьютера
Внутренняя память компьютераВнутренняя память компьютера
Внутренняя память компьютера
Nick535
 

Similar to Go в автобусе (20)

Rpm5
Rpm5Rpm5
Rpm5
 
Multithreading in go
Multithreading in goMultithreading in go
Multithreading in go
 
HBase on Dev{Highload}
HBase on Dev{Highload}HBase on Dev{Highload}
HBase on Dev{Highload}
 
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
 
Инструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаИнструменты профайлинга С++ кода
Инструменты профайлинга С++ кода
 
Couchbase, что за зверь и на что способен.
Couchbase, что за зверь и на что способен.Couchbase, что за зверь и на что способен.
Couchbase, что за зверь и на что способен.
 
My talk on Salt and Ansible from DevConf 2014
My talk on Salt and Ansible from DevConf 2014My talk on Salt and Ansible from DevConf 2014
My talk on Salt and Ansible from DevConf 2014
 
Оптимизация JavaScript в Drupal
Оптимизация JavaScript в DrupalОптимизация JavaScript в Drupal
Оптимизация JavaScript в Drupal
 
Operden1
Operden1Operden1
Operden1
 
Презентация на тему Форматы графических файлов.ppt
Презентация на тему Форматы графических файлов.pptПрезентация на тему Форматы графических файлов.ppt
Презентация на тему Форматы графических файлов.ppt
 
Там, где Rails не справляются
Там, где Rails не справляютсяТам, где Rails не справляются
Там, где Rails не справляются
 
My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016
 
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
 
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
 
Использование ленточных технологий для сокращения стоимости файловых хранилищ
Использование ленточных технологий для сокращения стоимости файловых хранилищИспользование ленточных технологий для сокращения стоимости файловых хранилищ
Использование ленточных технологий для сокращения стоимости файловых хранилищ
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
 
presentation_r00t_conf
presentation_r00t_confpresentation_r00t_conf
presentation_r00t_conf
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
 
архивация данных
архивация данныхархивация данных
архивация данных
 
Внутренняя память компьютера
Внутренняя память компьютераВнутренняя память компьютера
Внутренняя память компьютера
 

More from Artem Kovardin

Cервер на Go для мобильной стратегии
Cервер на Go для мобильной стратегииCервер на Go для мобильной стратегии
Cервер на Go для мобильной стратегии
Artem Kovardin
 
Garbage collector и управление памятью в Go
Garbage collector и управление памятью в GoGarbage collector и управление памятью в Go
Garbage collector и управление памятью в Go
Artem Kovardin
 
C-spirit reborn: why Go was bound to be created
C-spirit reborn: why Go was bound to be createdC-spirit reborn: why Go was bound to be created
C-spirit reborn: why Go was bound to be created
Artem Kovardin
 
Fraser Graham Killer Robots
Fraser Graham Killer RobotsFraser Graham Killer Robots
Fraser Graham Killer RobotsArtem Kovardin
 
Go database/sql
Go database/sqlGo database/sql
Go database/sql
Artem Kovardin
 
Best practices-for-production-environments
Best practices-for-production-environmentsBest practices-for-production-environments
Best practices-for-production-environmentsArtem Kovardin
 

More from Artem Kovardin (7)

Cервер на Go для мобильной стратегии
Cервер на Go для мобильной стратегииCервер на Go для мобильной стратегии
Cервер на Go для мобильной стратегии
 
Garbage collector и управление памятью в Go
Garbage collector и управление памятью в GoGarbage collector и управление памятью в Go
Garbage collector и управление памятью в Go
 
C-spirit reborn: why Go was bound to be created
C-spirit reborn: why Go was bound to be createdC-spirit reborn: why Go was bound to be created
C-spirit reborn: why Go was bound to be created
 
Anthony Starks - deck
Anthony Starks - deckAnthony Starks - deck
Anthony Starks - deck
 
Fraser Graham Killer Robots
Fraser Graham Killer RobotsFraser Graham Killer Robots
Fraser Graham Killer Robots
 
Go database/sql
Go database/sqlGo database/sql
Go database/sql
 
Best practices-for-production-environments
Best practices-for-production-environmentsBest practices-for-production-environments
Best practices-for-production-environments
 

Go в автобусе

  • 1. Go в автобусе Oпыт использования Go во встраиваемых системах Максим Чечель maximchick@gmail.com
  • 2. Почему Go? ● Небольшой размер исполняемого файла (“Hello world” ~ 1.5 мб) ● Простота кросс-компиляции (в т.ч. под ARM) ● Статически скомпилированные зависимости ● Малый размер потребляемой памяти ● Наличие необходимых библиотек для работы с внешним оборудованием: https://github.com/tarm/serial ● GC, встроенные примитивы для “многопоточного” программирорования, самодостаточная стандартная библиотека
  • 3. Размер исполняемого файла ● Почему это важно? ○ Ограниченный объём носителя и ОЗУ ○ Обновление на медленных соединениях ○ Ограничения по трафику, либо очень дорого, либо очень медленно. ● Сжатие исполняемого файла с помощью upx --best -o program-compressed program Было 9.4Мб стало 3.4Мб, коэффициент сжатия примерно один и тот же для исполняемых файлов go любого размера. http://upx.sourceforge.net/
  • 4. Обновление ПО бортовых терминалов ● Привычные сценарии не работают ○ Лишь часть автобусов в онлайне ○ Могут отсутствовать выделенные IP адреса ○ Проблемы со связью из-за которых приходится повторять процедуру обновления ● Выход - самообновление ○ Простое скачивание сжатого исполняемого файла ○ Обновление через bsdiff-патчи https://github.com/inconshreveable/go-update ○ Откуда ваша программа узнает собственную версию? ■ go build -ldflags "-X main.my_version 1.0.5" program.go ■ go run -ldflags "-X main.my_version 1.0.5" program.go ○ Работа с версиями: https://github.com/hashicorp/go-version
  • 5. Обновление через bsdiff-патчи ● Определяем собственную версию ● Получив от сервера информацию об актуальной версии запрашиваем соотв. патч: https://someserv.er/armv5/1.0.5/1.0.8.bsdiff (если необходимо) ● Генерировать патчи можно как при сборке новой версии так и скриптом на сервере, потому что в “полях” может быть огромный зоопарк версий и генерировать патчи для всех возможных пар версий может быть утомительно ● Размер патча между двумя исполняемыми файлами написанными на Go ~45-200Кб при относительно небольших изменениях (до нескольких десятков строк исходного кода). Время генерации патча ~10c (в моём случае)