tag:blogger.com,1999:blog-59371209819516113812024-03-14T01:29:07.511+05:00Записки на (электронных) манжетахIldarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.comBlogger84125tag:blogger.com,1999:blog-5937120981951611381.post-11380795835146479802021-01-24T15:20:00.001+06:002021-01-24T15:20:25.533+06:00Голос, как основа блога, подкаста, технического видео (урока): кухня<br /><p><br /> Как всегда любое новое дело начинается с осмысления самого этого дела, процесса. А уже потом можно приступать.</p><p></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-817L55EJKRo/YA07iIl4GWI/AAAAAAAAhIs/ezg6Q7WdnIspt5MLRQ1vrFL8kvffl4y2wCLcBGAsYHQ/s192/soundrecorder.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="192" data-original-width="192" src="https://1.bp.blogspot.com/-817L55EJKRo/YA07iIl4GWI/AAAAAAAAhIs/ezg6Q7WdnIspt5MLRQ1vrFL8kvffl4y2wCLcBGAsYHQ/s0/soundrecorder.jpg" /></a></div><a href="https://f-droid.org/repo/icons-640/com.github.axet.audiorecorder.349.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a></div><br /> <p></p><p>Сейчас я думаю о том, как построить комбинированный подход к блогу, к подкасту и к техническим видео или видеороликам с тематическим содержанием. Опираясь на опыт </p><p><span></span></p><a name='more'></a><p>старших товарищей и нарабатывая свой опыт, разумно было бы построить процесс следующим образом: на первом этапе записывать голосом текст по данной теме: максимум текста на диктофон. Затем скормить эту звуковую дорожку кому-нибудь распознавателю (это кстати хороший вопрос, какому). Идём дальше. Распознаватель выдаст текст (естественно, тоже черновой). После этого руками отредактировать текст: убираются все междометия, "экания" и "мэкания", а мысли располагаются по порядку, так, как они должны выглядеть уже в текстовом виде.</p><p>Как оказалось, требуется еще пара повторов. То есть снова начитать этот текст и распознать его. Полагаю двух-трёх таких итераций должно хватить для того, чтобы вычистить текст и привести его в нормальную, грамотную форму и получить уже, так сказать, вычитанный текст.<br /></p><p>После этого можно приступать к тому чтобы снова начитать: на этот раз уже готовый текст по бумажке. Таким образом, текст опять превратится в голос.</p><p>По необходимости надо продумать и добавить какие-либо иллюстрации или слайды, которые вместе со звуковой дорожкой можно выкладывать в YouTube, как видео-урок или тематический ролик с какой-то определенной темой, с определенным содержанием. И параллельно продублировать этот материал (то есть текст плюс иллюстрации) у себя в блоге. Я предполагаю, что лучше всего публиковать видео и статью блога одновременно, с перекрестными ссылками друг на друга.</p><p>Таким процессом можно сохранить и поделиться полезными знаниями, которые были приобретены или накоплены, доводя их до формы какого-то "продукта", то есть до готовых выпусков подкастов, статей в блоге или видео-уроков.<br /></p><p></p><p>По технической базе. Тут рабочий процесс продолжается. С Яндекс-Алисой пока не получается: она не даёт нормально распознавать длинные тексты. От Яндекса можно ещё попробовать клавиатуру с голосовым вводом. Также есть Google-клавиатура, которая тоже, возможно, справится с вводом длинного текста. Остальные средства: можно будет, видимо, использовать стандартный Audacity для выравнивания звука подкаста. И простой видео редактор (вроде Pitivi) для монтирования видео. Наверное, тут всё. Пожалуй, на эту тему мысли кончились.</p><p><b>Дополнение</b>. Для распознавания голоса на данный момент лучше всего подошла <a href="https://www.google.com/intl/en/chrome/demos/speech.html" target="_blank">страница Корпорации Добра</a> с распознавателем (работает только с Хромом).<br /></p>Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-15012417711000070802020-09-12T12:12:00.001+06:002020-09-12T12:19:43.812+06:00RE-ing BLE fitness smart watch protocol made easy. Part 2. Kaitai<p> </p><p>Parts: <a href="https://johan-notes.blogspot.com/2020/09/re-ing-ble-fitness-smart-watch-protocol.html">1</a>, 2.<br /></p><p>I'm not going to advertise the <a href="https://kaitai.io/" target="_blank">Kaitai set of instruments</a>. Just want to note that it may be very useful in simple RE cases.</p><p>E.g. you already have the BT network dump in PCAP format. And can open the <a href="https://ide.kaitai.io/devel/" target="_blank">Kaitai Web IDE</a>, open you dump there and see it parsed to a certain detalisation level.</p><p>But for a real KSY development we need to deploy our local copy of the IDE. </p><div class="separator" style="clear: both; text-align: center;"><a href="https://raw.githubusercontent.com/kaitai-io/kaitai_struct_webide/master/docs/zip_example.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="578" data-original-width="800" height="209" src="https://raw.githubusercontent.com/kaitai-io/kaitai_struct_webide/master/docs/zip_example.png" width="290" /></a></div><br /><br /><span><a name='more'></a></span><p>Surely the "true" and simplest way is to follow the official <a href="https://github.com/kaitai-io/kaitai_struct_webide#compile-and-run-locally" target="_blank">HOWTO</a>.<br /></p><p>Mine (ALTLinux chroot) is a little longer:</p><blockquote>$ hsh-no-update --initroot-only<br />$ cat /etc/resolv.conf | hsh-run --rooter tee /etc/resolv.conf<br />$ hsh-install less bash-completion rpm-utils idlewrap p7zip npm node<br />$ cp -a kaitai_struct_webide ~/.hasher/hasher/chroot/tmp<br />$ rm -f ~/.hasher/hasher/chroot/tmp/kaitai_struct_webide/{.git,LICENSE-3RD-PARTY.txt,doc/wiki/*}<br />$ chroot 777 ~/.hasher/hasher/chroot/tmp/kaitai_struct_webide/{.,lib,doc/wiki}<br />$ share_network=1 hsh-shell --mountpoints=/proc<br />[builder@localhost .in]$ cd /tmp/kaitai_struct_webide/<br />[builder@localhost kaitai_struct_webide]$ npm install<br />[builder@localhost kaitai_struct_webide]$ node serve.js --compile </blockquote>Check the local IDE, open <a href="http://127.0.0.1:8000/" target="_blank">URL</a>. <br />Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-43607691274583989702020-09-12T06:12:00.000+06:002020-09-12T06:12:34.408+06:00RE-ing BLE fitness smart watch protocol made easy. Part 1. Dump<p>You got your shiny new fitness bracelet or a smart watch. Great! You installed a companion app on your smartphone. Allright.</p><p>You could already be fine and happy using it. But if not... Want to know nuts and bolts of the protocol? Then go DEEPER</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://i.ytimg.com/vi/8z3C3DQkNcM/hqdefault.jpg?sqp=-oaymwEZCNACELwBSFXyq4qpAwsIARUAAIhCGAFwAQ==&rs=AOn4CLDmKQai20ettCyRPFhzIwsdyNHLAA" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="188" data-original-width="336" src="https://i.ytimg.com/vi/8z3C3DQkNcM/hqdefault.jpg?sqp=-oaymwEZCNACELwBSFXyq4qpAwsIARUAAIhCGAFwAQ==&rs=AOn4CLDmKQai20ettCyRPFhzIwsdyNHLAA" /></a></div><br /> <p></p><span><a name='more'></a></span><p> 1st you get the Bluetooth network dump between your phone and the gadget.</p><ul style="text-align: left;"><li>The "<span style="font-family: courier;">btsnoop</span>" is easily recorded on the (rooted Android) phone using Developer options. Easily googled.</li><li>Next, you get the file (<span style="font-family: courier;">btsnoop_hci.log</span>) on your PC and open it with the Wireshark. Cool!</li><li>The BLE protocol is carried in BT ATT/GATT so we apply filter "<span style="font-family: courier;">btatt</span>" in the wireshark. A-ha! Now it's clear!</li><ul><li>Let's save it to a separate PCAP file, might be useful in the future: File → Export specified packets → "All packets", "Displayed", "as: pcap" → Save!</li></ul><li>Besides usual discovery messages like "Read By Group Type ..." you can find protocol specific messages in types:</li><ul><li>Read Request / Response (filter: <span style="font-family: courier;">btatt.opcode==0x0b</span>)</li><li>Write Request / Response (filter: <span style="font-family: courier;">btatt.opcode==0x12</span>)</li><li>Handle Value Notification (filter: <span style="font-family: courier;">btatt.opcode==0x1b</span>)</li><li>(look closely, there might be some more!)</li></ul><li>It's a good idea to note the data shown in the app at the time. It definitely helps to decrypt the protocol fields</li><li>and then also change some parameters/options and record dump to see the change.<br /></li></ul><p>So you can see messages passing back and forth. Now it's time to dig them in. Let's get to the Part 2!<br /><br /></p>Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-39305403943396553082020-03-19T12:27:00.000+06:002020-03-19T12:27:06.922+06:00MITM for SSL using socat<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
Sometimes you need to look inside the SSL traffic without having keys. The alternative way would be to redirect the traffic to a decoder/encoder pair and listen in between.<br />
HOWTO:<br />
<br />
<a name='more'></a><br />
<ol style="text-align: left;">
<li>generate key&cert pair, use right IP for CN:</li>
<blockquote class="tr_bq">
<ul>
<li>openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem</li>
</ul>
</blockquote>
<li>MITM -> external host (SSL encrypted):</li>
<blockquote class="tr_bq">
<ul>
<li>socat TCP-L:9999,reuseaddr,fork SSL:3.3.3.33:443</li>
</ul>
</blockquote>
<li>client -> MITM:</li>
<blockquote class="tr_bq">
<ul>
<li>pkexec socat SSL-L:443,reuseaddr,fork,cert=/tmp/2/certificate.pem,key=/tmp/2/key.pem,verify=0 TCP:127.0.0.1:9999</li>
</ul>
</blockquote>
</ol>
</div>
then<br />
<blockquote class="tr_bq">
tcpdump -s 2000 -w /tmp/1.pcap port 9999</blockquote>
Piece of cake!<br />
<br /></div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-70930764180057890752019-10-02T17:35:00.003+06:002019-10-03T12:14:11.226+06:00RAM footprint of Tango RPC on NodeMCU<div dir="ltr" style="text-align: left;" trbidi="on">
Hi! It's about time to look at figures: is RPC light or a real burden for MCUs?<br />
Let's see...<br />
<br />
<a name='more'></a><br />
<br />
HW: ESP8266 in dev.board format.<br />
SW: NodeMCU Lua firmware.<br />
<blockquote class="tr_bq">
NodeMCU custom build by frightanic.com<br />
branch: master<br />
commit: c16adb5dfb8c02b692034bbd553502765b9733cc<br />
SSL: false<br />
modules: adc,bit,ds18b20,file,gpio,i2c,net,node,ow,pcm,perf,pwm,rtcfifo,rtcmem,rtctime,spi,tmr,uart,wifi<br />
build created on 2019-07-11 04:00<br />
powered by Lua 5.1.4 on SDK 2.2.1(6ab97e9)</blockquote>
<br />
Well, let's look at the baseline:<br />
> =node.heap()<br />
<b>43408</b><br />
<br />
Fine. Let's connect to a Wi-Fi:<br />
> dofile("init_draft.lua")
<br />
><br />
... <br />
Connected to [...] with IP 10.42.0.120
<br />
> =node.heap()
<br />
<b>41448</b>
<br />
🤔 ok.<br />
Let's start Tango server according to the README:<br />
>
=require "tango.server.nodemcu.net".new()
<br />
table: 3fff1058
<br />
> =node.heap()
<br />
<b>26768</b>
<br />
sux 😞<br />
<br />
Let's test from the PC remotely:<br />
$ TANGO_SERVER=10.42.0.120 lua5.1<br />
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio<br />
> tango = require'tango'<br />
> config = { address = os.getenv("TANGO_SERVER") }<br />
> connect = tango.client["socket"].connect<br />
> client = connect(config)<br />
> print (client.node.heap())<br />
<b>26400</b><br />
<br />
<h4 style="text-align: left;">
Summary</h4>
Looks like Tango eats 36% of free RAM. That's HUGE.<br />
Yet the situation is definitely optimizable:<br />
<ol style="text-align: left;">
<li>Tango is currently just uploaded in Lua src format right into SPIFFS. That's suboptimal. Use lc and LFS.</li>
<li>Another thing comes to mind about Tango library: serialization part (which is pluggable). It can be replaced by something smarter.</li>
</ol>
PRs welcome 😁</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-35162392412964058162019-09-20T17:33:00.001+06:002019-10-03T12:13:52.462+06:00Running hybrid approach to testing on an embedded target<div dir="ltr" style="text-align: left;" trbidi="on">
You might be one of those software engineers who love to be <a href="https://en.wikipedia.org/wiki/Agile_software_development" target="_blank">Agile</a>, use <a href="https://en.wikipedia.org/wiki/Behavior-driven_development" target="_blank">BDD</a> or <a href="https://en.wikipedia.org/wiki/Test-driven_development" target="_blank">TDD</a>. Then you are aware how important the choice of the testing framework is. E.g. <a href="https://olivinelabs.com/busted/" target="_blank">Busted</a> for Lua is a very good and feature-rich BDD framework.<br />
On the other hand, running a heavy framework on a small MCU with as little as 80 KB of RAM may be a challenge. So how to satisfy the two contradictory desires? Let's see:<br />
<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-uU3iWnoItQw/XYSz7G9V_KI/AAAAAAAAe9w/fKJhXGj-H6gUAn6abkfgYAGqonVUm3MzQCLcBGAsYHQ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="81" data-original-width="407" height="62" src="https://1.bp.blogspot.com/-uU3iWnoItQw/XYSz7G9V_KI/AAAAAAAAe9w/fKJhXGj-H6gUAn6abkfgYAGqonVUm3MzQCLcBGAsYHQ/s320/1.png" width="320" /></a></div>
<br />
One approach I suggest is using RPC mechanism. Then you can use any framework and any software you want on your PC and make MCU jobs remotely using RPC. The RPC can work on top of TCP/IP over Wi-Fi or using serial line.<br />
The proof of concept can be found here: <a href="https://github.com/ildar/tango/blob/master/README-NodeMCU.md">README-NodeMCU.md</a> .<br />
This is using Tango RPC module for Lua which runs good even on a tiny ESP8266 with NodeMCU firmware. On the PC side you can have the Tango client and any Lua software you like including Busted.<br />
Have fun!<br />
<br />
<br />
<span style="color: white;">PIC:</span><br />
<span style="color: white;">digraph G {<br /> rankdir=LR<br /> node [shape=rect]<br /> "MCU<br />NodeMCU<br />RPC server" -> <br />"PC<br />RPC client" <br />[ dir=back, label="TCP/IP over Wi-Fi" ]<br />}</span><br />
<!--more--></div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-68364570050086115672019-04-09T12:49:00.000+06:002019-04-09T13:24:07.811+06:00Введение в мир умных часов, часть ca2d82, платформы<div dir="ltr" style="text-align: left;" trbidi="on">
Как я уже <a href="https://johan-notes.blogspot.com/2019/04/515a60.html" target="_blank">писал</a>, то, что определяет функциональность таких гаджетов, это платформа.<br />
Вот лёгкий экскурс в современные платформы.<br />
<h4 style="text-align: left;">
Brand xWatch/Wear/...</h4>
<ul style="text-align: left;">
<li><b>+</b> OS: Linux/xOS, в общем, смарт-платформа. Это даёт множество возможностей по кастомизации и расширению функциональности</li>
<li><b>+</b> качественные компоненты и ПО (отсюда обоснованные претензии со стороны пользоваетелей таких часов к "дешёвым китайским часам".</li>
</ul>
<ul style="text-align: left;">
<li><b>-</b> ЦЕНА</li>
</ul>
Технически эти гаджеты представляют собой хорошо миниатюризованные "смартфоны", некторые даже с обычным Android-ом. Большинство не имеют GSM/3G/LTE (или все?).<br />
Есть попытки разрабатывать открытые прошивки, например, <a href="https://asteroidos.org/wiki/porting-status/" target="_blank">AsteroidOS</a>. Некоторые ОС (Pebble) позволяют расширение функций с помощью пользовательских программ.<br />
<ul style="text-align: left;">
</ul>
<h4 style="text-align: left;">
Смарт-браслеты</h4>
<ul style="text-align: left;">
<li><b>+</b> хорошая автономность</li>
<li><b>+</b> цена</li>
</ul>
<ul style="text-align: left;">
<li><b>-</b> бессмысленны без смартфона</li>
</ul>
Недорогая элементная база: микроконтроллер, небольшой экран, одна кнопка — это типичная начинка таких браслетов. Но при этом такой браслетик может снимать немало телесных параметров: пульс, движение руки, кое-что ещё, и показывать самые нужные сведения: входящие звонки, последние уведомления с телефона, погоду и даже время :P<br />
Маленький мозг браслета обычно загружается маленькой прошивкой без излишеств: что-то получить с датчиков, что-то показать на экране, передать в смартфон. К сожалению, открытых прошивок пока нет.<br />
<h4 style="text-align: left;">
Fernvale от Mediatek</h4>
Я считаю отдельной категорией смарт-часы на платформе Fernvale от Mediatek (MT626x, MT250x).<br />
<ul style="text-align: left;">
<li><b>+</b> форм-фактор и автономность "на уровне"</li>
<li><b>+</b> цена (Китай-таки)</li>
<li><b>+</b> GSM/2G</li>
</ul>
<ul style="text-align: left;">
<li><b>-</b> проблемный SDK, закрытая платформа.</li>
</ul>
Благодаря дешёвому и мощному (действительно мощному, в раз<b>ы</b>!) микроконтроллеру эти часики способны на многое, но, похоже, никому ещё не удалось этим воспользоваться.<br />
Есть частично открытая прошивка, <a href="https://github.com/loboris/RePhone_on_Linux" target="_blank">RePhone</a>.<br />
Обещает много интересного, поэтому больше — в отельной статье.</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-48448742580420422862019-04-09T12:43:00.001+06:002020-09-25T12:09:04.445+06:00Введение в мир умных часов, часть 515a60<div dir="ltr" style="text-align: left;" trbidi="on">
<div>
По состоянию на 2019 год у нас уже есть широчайший выбор носимых гаджетов, в том числе умных часов, смарт-браслетов и т.д. и т.п. Мне понадобилась пара лет, чтобы в моём мозгу хоть как-то устаканилось понимание всего этого разнообразия, и что из него мне интересно.<div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-WjyJgTzKazs/X22JbTdlo-I/AAAAAAAAgRw/G2QY-hnJlf8kZWdaNMtOUvvvMNG9Ci35wCLcBGAsYHQ/s875/1e683590fef511ea8e590bf502f417d3.map.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="579" data-original-width="875" src="https://1.bp.blogspot.com/-WjyJgTzKazs/X22JbTdlo-I/AAAAAAAAgRw/G2QY-hnJlf8kZWdaNMtOUvvvMNG9Ci35wCLcBGAsYHQ/s320/1e683590fef511ea8e590bf502f417d3.map.png" width="320" /></a></div><br /><br />
<h4 style="text-align: left;">
Классификация №1, поверхностная</h4>
<ol style="text-align: left;">
<li value="0">показывает время</li>
<li>считает шаги и прочую статистику жизнедеятельности</li>
<li>показывает уведомления с телефона</li>
<li>активно отслеживает движение и пытается общаться с пользователем</li>
<li>расширябельно / кастомизируемо / программируемо</li>
<li>варианты подключения: BLE, GSM</li>
</ol>
Этот список не исчерпывающий, можно дополнять всякими субъективными "хотелками".<br />
<h4 style="text-align: left;">
Классификация №2, движняковая</h4>
<ol style="text-align: left;">
<li value="0">считает шаги</li>
<li>пульс</li>
<li>всякие упражнения</li>
<li>велосипед</li>
<li>улавливает начало физической нагрузки и (как может) следит за состоянием тела (ну хоть бы и за пульсом)</li>
<li>отдаёт собранные данные в смартфон</li>
</ol>
<h4 style="text-align: left;">
Классификации прочие, технические</h4>
<ol style="text-align: left;">
<li>Конечно, то, что определяет функциональность таких гаджетов, это <a href="https://johan-notes.blogspot.com/2019/04/ca2d82.html" target="_blank">платформа</a>.</li>
<li>В большинстве случаев имеет большой смысл подключать часы к телефону. Поэтому немаловажны возможности и удобство сопутствующего приложения смартфона. </li>
</ol>
<ol style="text-align: left;">
</ol>
</div>
<div>
<ol style="text-align: left;">
</ol>
</div>
</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-34574061376017827962018-07-16T14:04:00.000+06:002019-12-16T19:47:21.147+06:00подготовка электронных книг: процесс<div dir="ltr" style="text-align: left;" trbidi="on">
от сырого текста до подготовленной электронной книги fb2.<br />
Мой маршрут по шагам с минимальными пояснениями:<br />
<a name='more'></a><br />
<ol style="text-align: left;">
<li>сырой текст (полученный в результате сканирования или из скачанного из сети файла HTML/DOC/...) закачиваем в Google Docs.</li>
<ul>
<li> тут, пожалуй, самое важное — не растерять то форматирование, которое сделали, работая над текстом до тебя.</li>
<li>Убрать все закладки, они будут потом только мешать. </li>
</ul>
<li>Правка текста:</li>
<ol>
<li>на Google Docs удобна совместная работа над текстом нескольких человек, а все исправления записываются;</li>
<li>главные цели правки:</li>
<ol>
<li>восстановить логическую структуру книги: части, главы, разделы;</li>
<li>восстановить повреждённый текст. Например, после сканирования
используются автоматические методы исправления текста. В результате
получается полусырой текст, который нуждается в вычитке и исправлении.</li>
<li>Вот несколько задач, которые нужно выполнить во время вычитки:</li>
<ol>
<li>некоторые слова разорваны переносом, их надо соединить;</li>
<li>курсив, полужирный шрифт и т.п. бывает неправильно установлен программой</li>
</ol>
<li>Особо следует выделить восстановление сносок и примечаний. Это очень
муторная работа, но для сложных книг необходимая. Тексты сносок после
сканирования ломают текст и мешают чтению (хотя должны, по идее,
помогать в понимании).</li>
<li>Ещё несколько мелочей:</li>
<ol>
<li>добавить обложку книги в самое начало документа, до заголовка;</li>
<li>если у книги нет аннотации, скомпилировать её из текстов введения и
т.п. и поместить (желательно) в конце книги</li>
</ol>
</ol>
<li>К сожалению, в Google Docs нет таких важных стилей абзацев, как "Цитата" и др. И даже нет возможности создать свои стили. Поэтому приходится использовать "костыль": помечать все такие случаи стилем "Заголовок 6", а затем заменять его на нужные стили в LO (см. ниже)</li>
<li>Ещё пара "лайфхаков":</li>
<ol>
<li>Для того, чтобы видеть скрытые символы, советую установить дополнение "Show".<br /><span style="font-family: "courier new" , "courier" , monospace;">Дополнения → Show → Show all</span> поможет увидеть лишние разрывы строк и т.п. артифакты форматирования.</li>
</ol>
<li>Критически важно иметь настоящую книгу или её графический скан, чтобы сверяться с её оригинальным форматированием.</li>
<li>Периодически можно (и нужно) выгружать документ и прогонять через
следующие этапы (LO+OOoFBTools), чтобы оценивать степень готовности
книги и необходимые дальнейшие действия. </li>
</ol>
<li>Конвертация</li>
<ol>
<li>Когда текст доведён до нужной степени готовности, скачиваем его, как документ OpenOffice (ODT)</li>
<li>Файл открываем в <a href="https://www.libreoffice.org/download/download/" target="_blank">LibreOffice</a> с установленным расширением <a href="https://extensions.libreoffice.org/extensions/fbtools" target="_blank">OOoFBTools</a>. Это великолепное расширение, которое позволяет готовить документы к экспорту в FB2 и, собственно, экспортировать их.</li>
<li>На этом этапе не забыть несколько технических действий:</li>
<ol>
<li>поменять LO-стиль "Заглавие" заголовка в "Книга - Название"</li>
<li>пометить нужный абзац, как "Книга - Аннотация"</li>
<li>заменить все абзацы с "костыльной" пометкой "Заголовок 6" на нужные: Цитата, ...</li>
</ol>
<li>Заполняем FB2-свойства</li>
</ol>
<li>Торжественное сохранение файла в FB2</li>
<li>Контроль: обязательно открыть получившийся файл FB2 в "читалке" и просмотреть/проверить:</li>
<ol>
<li>Структуру оглавления</li>
<li>Внешний вид текста</li>
<li>Работу сносок</li>
</ol>
<li>Пожалуй, после всего вышеперечисленного можно публиковать книгу, например, в <a href="https://flibusta.is/" target="_blank">Книжном Братстве</a>. Good job! Thumbs up!</li>
</ol>
<b>Правка/добавка от 20.07.2018</b>: использование "костыля" "Заголовок 6" для стилей абзацев.<br />
<b>Правка/добавка от 22.11.2019</b>: использование дополнения "Show".<br />
<b>Правка/добавка от 14.12.2019</b>: добавил "лайфхаки" форматирования.<br />
<ol style="text-align: left;">
</ol>
</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-76552307551981461642018-06-26T16:10:00.000+06:002018-06-26T16:10:05.689+06:00Elough E03 / Zrse magnet connector pinout<div dir="ltr" style="text-align: left;" trbidi="on">
FYI<br />
<br />
<br />
<table cellpadding="3" cellspacing="0">
<tbody>
<tr>
<td align="left" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">µUSB:</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">1</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">4</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">5</td>
</tr>
<tr>
<td style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000;"><br /></td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">VCC</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">D-</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">D+</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">ID</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">GND</td>
</tr>
<tr>
<td><br /></td>
<td><br /></td>
<td><br /></td>
<td><br /></td>
<td><br /></td>
<td><br /></td>
</tr>
<tr>
<td align="left" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">Elough E03 / Zrse magnet connector: cable</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>1</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>2</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>3</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>4</b></td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>5</b></td>
</tr>
<tr>
<td align="left" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">connected to USB</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">-</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">1</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">-</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">5</td>
</tr>
<tr>
<td style="border-left: thin solid #000000; border-top: thin solid #000000;"><br /></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>6</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>7</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>8</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>9</b></td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>10</b></td>
</tr>
<tr>
<td align="left" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">connected to USB</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">-</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">1</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">5</td>
</tr>
</tbody></table>
<style type="text/css">
tt {
font-family: courier;
}
td {
font-family: helvetica, sans-serif;
}
caption {
font-family: helvetica, sans-serif;
font-size: 14pt;
text-align: left;
}
</style><br />
<br /></div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-59505322808933036232018-06-25T12:12:00.000+06:002018-06-25T12:12:23.354+06:00QR code: show in Linux<div dir="ltr" style="text-align: left;" trbidi="on">
Well, in case you ever wanted to quickly (3 sec) pass a string to your phone, here is how:<br />
<br />
<a name='more'></a><br />
<ol style="text-align: left;">
<li>run the script <span style="font-family: "Courier New", Courier, monospace;">qr-show.sh</span> I list below</li>
<li>feed the string to it</li>
<li>scan the QR code with the Barcode Scanner with your phone (get from <a href="https://f-droid.org/packages/com.google.zxing.client.android/" target="_blank">F-Droid</a> or <a href="https://play.google.com/store/apps/details?id=com.google.zxing.client.android" target="_blank">Play Store</a>)</li>
<li>easy!</li>
</ol>
The script:<br />
<br />
<blockquote>
<span style="font-family: "Courier New", Courier, monospace;"> #!/bin/bash -e<br /><br />TEXT=`yad --entry --entry-label='Enter string to encode'`<br /><br />qrencode -o $TMP/qr.png "$TEXT" &&<br /> eog -ng $TMP/qr.png &</span></blockquote>
You can see a few tools used which of course can be replaced by alternatives:<br />
<ol style="text-align: left;">
<li><span style="font-family: "Courier New", Courier, monospace;">yad</span> with <span style="font-family: "Courier New", Courier, monospace;">zenity/gdialog/xdialog/dialog</span></li>
<li><span style="font-family: "Courier New", Courier, monospace;">eog</span> with <span style="font-family: "Courier New", Courier, monospace;">geeqie</span>/any other image viewing</li>
<li><span style="font-family: "Courier New", Courier, monospace;">Barcode Scanner</span> with any barcode scanner ))</li>
</ol>
</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-88248305368597715852018-05-29T12:21:00.001+06:002019-09-12T11:34:20.075+06:00fx2lp: логический анализатор и не только<div dir="ltr" style="text-align: left;" trbidi="on">
Однажды, когда мне приспичило заполучить логический анализатор, ноги повели меня на <a href="https://sigrok.org/" target="_blank">SiGrok</a>: отличное и универсальное <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%D0%B5_%D0%B8_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5" target="_blank">FOSS</a> ПО с анализом протоколов и поддержкой <a href="https://sigrok.org/wiki/Supported_hardware" target="_blank">большого количества железа</a> (представьте, не только логические анализаторы и осциллографы!)<br />
На канале мне сразу подсказали, что меньше чем за 5 баксов (<span style="color: white;">блин, дёшево!</span>) можно заполучить <a href="https://sigrok.org/wiki/Lcsoft_Mini_Board" target="_blank">плату</a> логического анализатора с приличными характеристиками: на базе чипа "fx2lp" CY7C68013A<br />
Ну-с, с чем её едят?<br />
<br />
<a name='more'></a><br />
Такой расклад мне очень понравился, я не думая заказал плату на AliExpress. Правда, через пару недель, играясь с <a href="http://wiki.stm32duino.com/index.php?title=Blue_Pill" target="_blank">Blue Pill</a> с прошивкой "логический анализатор SUMP" я понял, что не хватает щупов (легко находятся поиском "logic analyzer probe"), и я заказал и их.<br />
Когда плата пришла, начал разбираться. Почему-то не нашёл внятной "хаутушки", поэтому решил поделиться опытом тут.<br />
<h3 style="text-align: left;">
Назначение платы.</h3>
<div style="text-align: left;">
Когда <a href="http://www.cypress.com/products/ez-usb-fx2lp" target="_blank">Cypress</a> создала серию чипов fx/fx2/fxlp/... , идея была создать некий универсальный инструмент, о чём можно почитать немного на <a href="http://www.linux-usb.org/ezusb/" target="_blank">Linux-USB</a>. Поэтому можно найти ещё несколько любопытных применений этой платы.<br />
Немного подробностей: <a href="http://www.cypress.com/products/ez-usb-fx2lp" target="_blank">Сypress’s EZ-USB® FX2LP™ (CY7C68013A/14/15/16A)</a> — это микроконтроллер семейства 8051, "прокачанный" определённым образом (см. ссылку выше). <a href="http://www.cypress.com/node/106121" target="_blank">Даташит</a> доступен на 3-х языках.</div>
<h3 style="text-align: left;">
Назначение джамперов.</h3>
<div style="text-align: left;">
Если разъёмы у китайской платы подписаны, то назначение джамперов скрыты <i>кодами</i> "J1" и "J2" ☺</div>
<div style="text-align: left;">
<strike>Один и джамперов переключает режим EEPROM, второй непонятно, чем занят. Это белое пятно я хочу закрыть позже, когда соберу информацию.</strike><br />
Впрочем, на <a href="https://sigrok.org/wiki/Lcsoft_Mini_Board" target="_blank">wiki Sigrok</a> и <a href="https://www.geeetech.com/wiki/index.php/CY7C68013" target="_blank">странице производителя</a> эта информация есть. </div>
<div style="text-align: left;">
Эмм. Нужна картинка? </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-l2FgIYfq6xI/WwzR2RTutPI/AAAAAAAAbXs/zSZa4gCuxwABs0IfNeQKTn2fpUGXTj1WQCLcBGAs/s1600/EZ-USB-FX2LP-CY7C68013A-USB-Core-Board-Development-Board-USB-Logic-Analyzer-With-I2C-Serial-SPI.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="800" height="640" src="https://4.bp.blogspot.com/-l2FgIYfq6xI/WwzR2RTutPI/AAAAAAAAbXs/zSZa4gCuxwABs0IfNeQKTn2fpUGXTj1WQCLcBGAs/s640/EZ-USB-FX2LP-CY7C68013A-USB-Core-Board-Development-Board-USB-Logic-Analyzer-With-I2C-Serial-SPI.jpg" width="640" /></a></div>
<h3 style="text-align: left;">
Как работать с платой.</h3>
<div style="text-align: left;">
Как показало описание на Linux-USB и практика,</div>
<ol style="text-align: left;">
<li>Прошивка прекрасно грузится "на лету" прямо в чип и работает оттуда. То есть вшивать нужную прошивку необязательно: при подключении по USB загружаем прошивку, USB ресетится, после чего плата работает в соответствии с загруженной прошивкой</li>
<li>На плате есть также EEPROM, в который можно записать прошивку. В этом случае при включении плата уже будет работать под управлением прошивки</li>
</ol>
В целом, получается всё просто.<br />
<h3 style="text-align: left;">
Как работать с платой, как логическим анализатором.</h3>
<div style="text-align: left;">
Возвращаюсь к ребятам из команды SiGrok. У них присутствует "побочный" проект <a href="https://sigrok.org/wiki/Fx2lafw" target="_blank">Fx2lafw</a>. Это открытая прошивка (на самом деле набор прошивок) для целой плеяды плат FX2/FX2LP. Функциональность прошивок: Логический анализатор или Осциллограф. Поддержка железа — зашкаливает ))</div>
<div style="text-align: left;">
Однако, скачав, обнаружились 12 файлов прошивок без особых описаний ((</div>
<div style="text-align: left;">
</div>
<div style="text-align: left;">
Тут могу дать рекомендацию: <span style="font-family: "courier new" , "courier" , monospace;">fx2lafw-sigrok-fx2-8ch.fw</span> завелась сразу и без вопросов.</div>
<div style="text-align: left;">
По шагам:</div>
<ol style="text-align: left;">
<li>скачиваем <a href="https://sigrok.org/wiki/Fx2lafw#Pre-built_firmware_files" target="_blank">прошивку</a></li>
<li>её ещё немного нужно подготовить:<br /><blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ objcopy -I binary -O ihex fx2lafw-sigrok-fx2-8ch.fw </span><span style="font-family: "courier new" , "courier" , monospace;">fx2lafw-sigrok-fx2-8ch.fw.hex</span></blockquote>
<span style="font-family: "courier new" , "courier" , monospace;"></span></li>
<li>устанавливаем программу fxload (у меня Linux. Ребята, про M$ не спрашивайте). Что приятно, установилась прямо из репозитария</li>
<li>подключаем плату по USB. Обнаруживается примерно так (<span style="font-family: "courier new" , "courier" , monospace;">lsusb</span>):<br /><blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "courier new" , "courier" , monospace;">Bus 001 Device 096: ID 04b4:8613 Cypress Semiconductor Corp. CY7C68013 EZ-USB FX2 USB 2.0 Development Kit</span></span></blockquote>
</li>
<li>заливаем прошивку:<br /><blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ fxload -D /dev/bus/usb/001/096 -t fx2lp -I fx2lafw-sigrok-fx2-8ch.fw.hex</span></blockquote>
</li>
<li>Проверяем, что плата по USB видна уже иначе (в том же <span style="font-family: "courier new" , "courier" , monospace;">lsusb</span>):<br /><blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">Bus 001 Device 097: ID 1d50:608c OpenMoko, Inc. Fx2lafw</span></blockquote>
</li>
<li><span style="font-family: "courier new" , "courier" , monospace;"></span>Запускаем PulseView, наслаждаемся! ☺</li>
</ol>
<h3 style="text-align: left;">
Для удобства пишем правило udev.</h3>
<div style="text-align: left;">
Чтобы не отвлекаться во время работы, автоматизируем процесс заливки прошивки.</div>
<div style="text-align: left;">
Создаём файл и располагаем по пути <span style="font-family: "courier new" , "courier" , monospace;">/etc/udev/rules.d/90-fx.rules</span></div>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">ACTION!="add", GOTO="fx_rules_end"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">SUBSYSTEM!="usb", GOTO="fx_rules_end"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#Cypress Semiconductor Corp. CY7C68013 EZ-USB FX2 USB 2.0 Development Kit</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ATTR{idVendor}=="04b4", ATTR{idProduct}=="8613", \</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> SYMLINK+="fx2lp-devkit", \</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> RUN+="/usr/bin/fxload -D /dev/fx2lp-devkit -t fx2lp -I /lib/firmware/fx2lafw-sigrok-fx2-8ch.fw.hex"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">LABEL="fx_rules_end"</span></blockquote>
<div style="text-align: left;">
ну, можно работать!<br />
<br />
<b>UPD 12.09.19</b>: добавил полезные ссылки.</div>
</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-76677381315875936522018-05-22T12:38:00.000+06:002018-05-22T12:38:03.840+06:00профилируем программы, не умы<div dir="ltr" style="text-align: left;" trbidi="on">
Раз уж потратил изрядное количество времени на проблемку, так постараюсь минут за 10 это описать...<br />
Задача: получить читаемый лог вызовов функций программы.<br />
Решение "по учебнику" — профилировщик, в GCC это gprof. Не сработало! <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Criminal-Minds.svg/250px-Criminal-Minds.svg.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="166" data-original-width="250" src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Criminal-Minds.svg/250px-Criminal-Minds.svg.png" /></a></div>
<br />
<br />
<a name='more'></a>По-простому, по мануалу:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">gcc -pg 1.c</span></blockquote>
порождает исполнимый a.out, который содержит в себе код профилировщика, выдающий профиль программы. Окей, попробуем:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">cmake $PROJECT_DIR \<br />-DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_FLAGS=-pg<br />make</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">./$PROJECT_EXE</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">gprof -b ./$PROJECT_EXE</span></blockquote>
получаем на выходе:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">Each sample counts as 0.01 seconds.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> no time accumulated</span></blockquote>
воссааа? впрочем, интернет даёт объяснение:<br />
<blockquote class="tr_bq">
>> no time accumulated <br />
This can happen if the clock never ticks while the program has the CPU, such as if all execution takes place for very short times (less than 1/512 second) immediately after the clock ticks and the kernel schedules processes, which might happen to a simple GUI or other process whose execution is strongly correlated with scheduling.</blockquote>
ааа! так gprof не собирает точную, всю информацию, а только "время от времени". Ладно. чем его заменить? Оказывается, можно заменить valgrind-ом:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">valgrind --tool=callgrind ./$PROJECT_EXE</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">gprof2dot.py -n0 -e0 -p nfc -f callgrind callgrind.out.* > /tmp/1.dot</span></blockquote>
(nfc тут для фильтрации вызовов функций)<br />
посмотрим... <br />
<blockquote class="tr_bq">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-uY58xP-rgP0/WwOwMmpXMnI/AAAAAAAAbTc/iaqpsQhzpVEQfxnQT5ILTA5IdDhQHkPFACLcBGAs/s1600/shot-2018-05-22_11-50-36.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="329" data-original-width="399" src="https://4.bp.blogspot.com/-uY58xP-rgP0/WwOwMmpXMnI/AAAAAAAAbTc/iaqpsQhzpVEQfxnQT5ILTA5IdDhQHkPFACLcBGAs/s1600/shot-2018-05-22_11-50-36.jpg" /></a></div>
</blockquote>
Эмм.. как-то тут всё разрозненно. Почему? а!<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">gprof2dot.py -n0 -e0 -p nfc -p ld-2 -f callgrind callgrind.out.* > /tmp/1.dot</span></blockquote>
так-то лучше. Но что этот ld тут мешается? <br />
<blockquote class="tr_bq">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-9BKfPYPEyy8/WwOxbM9hQcI/AAAAAAAAbTk/ztpnBMzmge4xiHdmplz5WLRF7r8Rwpp1ACLcBGAs/s1600/shot-2018-05-22_11-55-14.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="385" data-original-width="507" src="https://4.bp.blogspot.com/-9BKfPYPEyy8/WwOxbM9hQcI/AAAAAAAAbTk/ztpnBMzmge4xiHdmplz5WLRF7r8Rwpp1ACLcBGAs/s1600/shot-2018-05-22_11-55-14.jpg" /></a></div>
</blockquote>
В исходниках функции <span style="font-family: "courier new" , "courier" , monospace;">nfc_init()</span> вызывается прямо из <span style="font-family: "courier new" , "courier" , monospace;">main()</span>. Не сразу до меня дошло, что это последствия динамического связывания (линковки) <span style="font-family: "courier new" , "courier" , monospace;">nfc-anticol</span> с библиотекой <span style="font-family: "courier new" , "courier" , monospace;">libnfc</span>. Быстренько поправим:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">-ADD_LIBRARY(nfc SHARED ${LIBRARY_SOURCES})<br />+ADD_LIBRARY(nfc STATIC ${LIBRARY_SOURCES})</span></blockquote>
о! ну вот! красота!!! Как на ладони: что откуда приходит и что куда уходит :)<br />
<blockquote class="tr_bq">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-0oamSplrrqg/WwO1ivCya4I/AAAAAAAAbTw/B5Eug8lKijUOazR38VuHgkhy_cfoNA7owCLcBGAs/s1600/shot-2018-05-22_12-12-13.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="475" data-original-width="438" src="https://3.bp.blogspot.com/-0oamSplrrqg/WwO1ivCya4I/AAAAAAAAbTw/B5Eug8lKijUOazR38VuHgkhy_cfoNA7owCLcBGAs/s1600/shot-2018-05-22_12-12-13.jpg" /></a></div>
</blockquote>
<br />
<b>Bonus</b>:<br />
оказалось, что если линковать библиотеку статически, то gprof тоже что-то показывает:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">gprof -b ./nfc-anticol > gmon.out.txt</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">gprof2dot.py -n0 -e0 gmon.out.txt > /tmp/1.dot</span></blockquote>
так, посмотрим. <br />
<blockquote class="tr_bq">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-tGAXrwhs4ko/WwO331ykdCI/AAAAAAAAbT8/bbC75MCr8dYsDRhljgCB3vL7gTYy2iHNQCLcBGAs/s1600/shot-2018-05-22_12-23-43.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="425" data-original-width="267" src="https://3.bp.blogspot.com/-tGAXrwhs4ko/WwO331ykdCI/AAAAAAAAbT8/bbC75MCr8dYsDRhljgCB3vL7gTYy2iHNQCLcBGAs/s1600/shot-2018-05-22_12-23-43.jpg" /></a></div>
</blockquote>
<br />
Чёёё? А где <span style="font-family: "courier new" , "courier" , monospace;">main()</span> ? И некоторых вызовов не хватает. Ладно, gprof "в печку", вместе с перепиской Энгельса "с этим...
Как его — дьявола — с Каутским.":<br />
<blockquote class="tr_bq">
—Зина! — кричал Борменталь.<br />
—Зина! — орал испуганный Шариков.<br />
Зина прибежала бледная.<br />
—Зина, там в приемной... Она в приемной?<br />
—В приемной, — покорно ответил Шариков, —
зеленая, как купорос.<br />
—Зеленая книжка...<br />
—Ну, сейчас палить, — отчаянно воскликнул
Шариков, — она казенная, из библиотеки!<br />
—Переписка — называется, как его...
Энгельса с этим чертом... В печку ее!<br />
Зина улетела.</blockquote>
P.S. за 10 минут, разумеется, не получилось. А получилось как всегда... </div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-41860706007065117652018-05-11T17:46:00.000+06:002018-05-15T16:35:36.562+06:00новая периферия: попытка выработать подход (на примере RFID-RC522)<div dir="ltr" style="text-align: left;" trbidi="on">
На правах "записок" на "манжетах".<br />
Имеется устройство, возможно, почти "безмозглое".<br />
Задача: дойти до состояния, когда устройство можно использовать.<br />
Тут попытка поставить вопросы и найти ответы, которые встретятся по ходу решения задачи: от вопроса подключения устройства до выбора API для работы с ним. В качестве подопытного — MF-RC522<br />
<a name='more'></a>Не так давно прилетел из Китая очень дешёвый считыватель RFID: RFID-RC522 (где-то проходит под именем MFRC522). На его примере можно как раз и посмотреть, какие возникнут вопросы и какие найдутся ответы. Не знаю, получится ли по ходу HOWTO-шка для этого девайся, там посмотрим.<br />
Итак, устройство на руках. Здравый смысл подсказал несколько первых шагов <br />
<ol style="text-align: left;">
<li>Осматриваем. Находим чип с надписями:</li>
<ul>
<li><blockquote class="tr_bq">
RC522<br />
12 02<br />
TXD6080<br />
NXP</blockquote>
</li>
</ul>
<ul>
<li>О! амэрикэн кампани! Вери гуд!</li>
<li><a href="https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf" target="_blank">Даташиттен</a> доступен, быстро качаем.</li>
</ul>
<li>Гуглим.</li>
<ol>
<li>Быстро находится <a href="https://mysku.ru/blog/aliexpress/23114.html" target="_blank">статья одного умельца</a>. Там есть <b>фотки</b> и описаны несколько хороших грабель, будем иметь в виду</li>
<li><a href="http://cxem.net/guard/3-91.php" target="_blank">Статья на известном cxem.net</a> , содержит (сюрприз) <b>схему</b>. Но схема очень <i>принципиальная</i>, содержит только часть того, что на плате</li>
<li>Впрочем <b>нормальная схема платы</b> тоже <a href="https://www.sunrom.com/p/mifare-rfid-readerwriter-1356mhz-rc522" target="_blank">нашлась</a>.</li>
<li>Кстати, попутно прояснил для себя <a href="https://elinux.org/images/a/a9/Elce11_venancio_ortiz.pdf" target="_blank">разницу между RFID и NFC</a>. Знание — свет! :)</li>
</ol>
</ol>
Как и обещал, по ходу действия встали некоторые довольно принципиальные вопросы (надо же, опять это слово!)<br />
<ol style="text-align: left;">
<li>Ок, вот плата. Как будем подключать?</li>
<ol>
<li>Уважаемый китайский производитель платы "прибил гвоздями" SPI, о чём честно предупредил при продаже</li>
<li>Однако, даташит поведал, что на самом деле вариантов целых 3: UART (TTL), SPI, I2C</li>
<li>Разница очевидна: SPI и I2C — хороши для сцепки с МК. Купленная плата позиционируется именно как "шилд" для Ардуино, поэтому и интерфейс установлен SPI.</li>
<li>UART хорош для сцепки с PC, но тут, конечно, нельзя забывать, что это не совсем "обычный COM-порт", а UART TTL</li>
<li>Несмотря на то, что производитель запаял ножки "I2C = 0" и "EA = 1", всегда можно что-то сделать, да? 😉 Один умный человек подсказал отрезать дорожку, что и было сделано для EA. Теперь, соединяя EA на питание, получаем интерфейс SPI, а на землю — UART.</li>
<li>Мне ардуины не чужды, но считыватель я хотел использовать с компьютера. Поэтому МК был бы лишней прокладкой. Желаю UART!</li>
</ol>
<li>Ещё раз о подключении этой платки к компьютеру:</li>
<ol>
<li>отрезаем дорожку Vcc ←→ EA</li>
<li>контактим EA ←→ GND</li>
<li>подключаем UART TTL согласно даташиту</li>
</ol>
<li>Как убедиться, что плата работает (работает правильно?)<br />этот, якобы тривиальный, вопрос в некоторых случаях ставит в тупик.</li>
<ol>
<li>Способ для богатых — осцилограф. Им, по определению, видно всё.</li>
<li>Способ чуть попроще — логический анализатор.</li>
<li>Способ "прямой", он же "бюджетный": смотреть на "выходе", возможно, подавая на "вход" тестовые команды</li>
<ul>
<li>для данной платы рецепт простой:</li>
</ul>
<ol>
<li>переводим UART в режим 9600 8N1</li>
<li>посылаем команду "выдай свою версию" и ловим ответ:</li>
</ol>
<ol>
<ul>
<li><span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "courier new" , "courier" , monospace;">cat /dev/ttyUSB0 > rc522.log &</span></span></li>
<li><span style="font-family: "courier new" , "courier" , monospace;">echo b7 | rax2 -s >> /dev/ttyUSB0</span></li>
</ul>
</ol>
<li><span style="font-family: inherit;"><span style="font-family: "courier new" , "courier" , monospace;">как показал</span> дальнейший процесс изучения считывателя, плата не</span><span style="font-family: inherit;"><span style="font-family: inherit;"> во всех случаях</span> работает правильно.</span></li>
</ol>
<li>Выбираем API,</li>
<ol>
<li>другими словами, какими программными средствами получить нужную функциональность от устройства?</li>
<li>Как ни странно, бывает, что способ подключения накладывает свои рамки. Впрочем, с открытым кодом возможнсти расширить эти рамки возможно, возможно!</li>
<li>Даташит поведает нам, что для нашего "подопытного" самым непосредственным "системным" способом работы является запись байтовых команд в шину (одну из перечисленных выше) и считывание данных из неё же.</li>
<li>Из доступного:</li>
<ol>
<li>достаточно популярный проект <a href="https://github.com/miguelbalboa/rfid" target="_blank">miguelbalboa/rfid</a> и пара других заточены для работы в Arduino и через SPI;</li>
</ol>
<li>из желаемого: <a href="https://github.com/nfc-tools/libnfc" target="_blank">nfc-tools/libnfc</a>, в том числе <a href="https://github.com/nfc-tools/mfoc/" target="_blank">mfoc</a> — взломщик <span class="col-11 text-gray-dark mr-2" itemprop="about">Mifare Classic. "Небольшая" проблемка состоит в том, что эта библиотека не поддерживает MF-RC522 и не собирается поддерживать RFID. Но появились пара ребят, которые захотели и кое-что закодили, чтобы запустить libnfc на этом чипе. Можно <a href="https://github.com/ildar/libnfc" target="_blank">продолжать</a> это благородное дело.</span></li>
</ol>
<li><span class="col-11 text-gray-dark mr-2" itemprop="about">Итак, есть библиотека, которая частично работает (автор патча утверждает, что <span style="font-family: "courier new" , "courier" , monospace;">nfc-anticol</span> работает стопудово). Переходим к тестам.</span><span class="col-11 text-gray-dark mr-2" itemprop="about"> Пропущу длинные логи, в сухом остатке видим следующие интересные моменты:</span></li>
<ol>
<li><blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;"><span class="col-11 text-gray-dark mr-2" itemprop="about">$ LIBNFC_LOG_LEVEL=3 ./nfc-anticol 2>&1 | tee /tmp/nfc.log | histring error</span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="col-11 text-gray-dark mr-2" itemprop="about">...</span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="col-11 text-gray-dark mr-2" itemprop="about">debug libnfc.chip.rc522 RD 37: 12</span></span></blockquote>
</li>
<ul>
<li><span class="col-11 text-gray-dark mr-2" itemprop="about">вот это да! в даташите написано чёрным по белому:<br /><span style="font-family: "courier new" , "courier" , monospace;">MFRC522 version 1.0 software version is: 91h.<br />MFRC522 version 2.0 software version is: 92h.</span></span> </li>
<li>А у нас тут <span style="font-family: "courier new" , "courier" , monospace;">"неопознанный енот"</span>! <span style="font-family: "courier new" , "courier" , monospace;">12h</span></li>
</ul>
<li><span class="col-11 text-gray-dark mr-2" itemprop="about">Смотрим дальше:</span></li>
<ul>
<li><blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;"><span class="col-11 text-gray-dark mr-2" itemprop="about">debug libnfc.driver.rc522_uart Upgrading baud rate to user-specified 115200 bps.</span><br /><span class="col-11 text-gray-dark mr-2" itemprop="about">debug libnfc.bus.uart Serial port speed requested to be set to 115200 baud.</span><br /><span class="col-11 text-gray-dark mr-2" itemprop="about">debug libnfc.bus.uart TX: 1f</span><br /><span class="col-11 text-gray-dark mr-2" itemprop="about">debug libnfc.bus.uart RX: 00</span><br /><span class="col-11 text-gray-dark mr-2" itemprop="about">debug libnfc.driver.rc522_uart rc522_uart_write ack does not match (sent 1F, received 00)</span><br /><span class="col-11 text-gray-dark mr-2" itemprop="about">error libnfc.chip.rc522 Unable to write register 1F!</span></span></blockquote>
</li>
<li><span class="col-11 text-gray-dark mr-2" itemprop="about">вот так.. порт на нормальные 115200 бод работать отказывается.</span></li>
<li><span class="col-11 text-gray-dark mr-2" itemprop="about">Чтобы продолжать, придётся дальше работать на 9600:</span></li>
<li><blockquote class="tr_bq">
<span class="col-11 text-gray-dark mr-2" itemprop="about">name = "MFRC522"</span><br />
<span class="col-11 text-gray-dark mr-2" itemprop="about">connstring = "rc522_uart:/dev/ttyUSB0:9600"</span></blockquote>
</li>
</ul>
<li><span class="col-11 text-gray-dark mr-2" itemprop="about">Совершенно шокирующим оказался результат Self-test (раздел 16.1.1 даташита). На выходе - одни нули.</span></li>
<li><span class="col-11 text-gray-dark mr-2" itemprop="about">Если идти ещё дальше, то получаются странные дела: при отсутвии RFID-карты около считывателя всё отрабатывает до сообщения: "Error: No tag available". А если приложить </span><span class="col-11 text-gray-dark mr-2" itemprop="about"><span class="col-11 text-gray-dark mr-2" itemprop="about">RFID-карту — ошибка при инициализации радио-части.</span></span></li>
</ol>
<li><span class="col-11 text-gray-dark mr-2" itemprop="about"><span class="col-11 text-gray-dark mr-2" itemprop="about">Как показал эксперимент (вот она, настоящая физика!),</span></span></li>
<ol>
<li><span class="col-11 text-gray-dark mr-2" itemprop="about"><span class="col-11 text-gray-dark mr-2" itemprop="about">чип явно нестандартный, либо работает сильно не так из-за неправильной платы. Полагаю, в данном случае второе — чисто гипотетическое предположение, которое, опять, один умный человек напомнил.</span></span></li>
<li><span class="col-11 text-gray-dark mr-2" itemprop="about"><span class="col-11 text-gray-dark mr-2" itemprop="about">практическое использование функций считывателя пока ещё не светит: надо выверять, что работает, а что — нет, двигаться по шагам, без хорошего обзора, сколько ещё впереди.</span></span></li>
</ol>
<ol>
</ol>
</ol>
Вот так. Вопросы пока подвисли, ответы нашлись не все.<br />
feedback is welcome, share your thoughts/experience/etc.<br />
<b>15.05 Добавил</b> результат Self-test<br />
<div>
<ol style="text-align: left;"><ol>
</ol>
</ol>
</div>
</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-91401372688586022712018-04-19T09:39:00.001+06:002019-05-01T11:50:03.260+06:00FlareRPG: secret overworld<div dir="ltr" style="text-align: left;" trbidi="on">
Hi! <a href="http://flarerpg.org/" target="_blank">FlareRPG version 1.0</a> came out recently. I looked around a bit.<br />
Then hailing Free and Open Source (FOSS) nature of the game I quickly "mapped" the maps of empyrean_campaign (the main SP game). Here's what I got:<br />
<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-AoJDXI6nQ44/WtgNFO8fXFI/AAAAAAAAa8k/FU7B9tHKq6oToQQ8I0juJLU0wpS0mySugCLcBGAs/s1600/flare.overworld.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="791" data-original-width="1600" height="158" src="https://1.bp.blogspot.com/-AoJDXI6nQ44/WtgNFO8fXFI/AAAAAAAAa8k/FU7B9tHKq6oToQQ8I0juJLU0wpS0mySugCLcBGAs/s320/flare.overworld.png" width="320" /></a></div>
Ah! You want some scalable format, e.g. PDF, for printing? <a href="https://drive.google.com/open?id=1nb4LyXj0YOVW-WFdVjEAjCBJR5rtex8C" target="_blank">Here</a>.<br />
<br />
How it's made? Easy:<br />
<blockquote class="tr_bq">
#!/bin/bash<br />
<br />
GAMEPATH=${GAMEPATH:-/usr/share/flare/mods/empyrean_campaign}<br />
<br />
cd "$GAMEPATH"/maps<br />
<br />
echo "digraph G {"<br />
<br />
grep intermap * */* 2>/dev/null | \<br />
sed -E 's|[A-Za-z/]*maps/||g' | \<br />
sed -E 's|.txt[^=]*=| -> |' | \<br />
sed -E 's|.txt.*$||' | \<br />
cat<br />
<br />
grep -m1 title= * */* 2>/dev/null | \<br />
sed -E 's|[A-Za-z/]*/||g' | \<br />
sed -E 's|.txt:title=| [label="|' | \<br />
sed -E 's|$|"]|' | \<br />
cat<br />
<br />
echo "}"</blockquote>
Then convert with Graphviz:<br />
<blockquote class="tr_bq">
$ dot -T pdf flare.intermap.dot > /tmp/flare.overworld.pdf<br />
$ dot -T png flare.intermap.dot > /tmp/flare.overworld.png</blockquote>
Enjoy!</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-77001272294693621792017-11-17T13:12:00.001+06:002017-11-17T13:12:49.654+06:00radare2 в ALTLinux<div dir="ltr" style="text-align: left;" trbidi="on">
тем, кого всерьёз интересует Reverse Engineering, никак не обойтись без radare2. А собирать его в репозитарий бессмысленно, т.к. пользоваться надо однозначно суперсвежаком из GIT HEAD. Поэтому вот <a href="https://drive.google.com/file/d/1r01wrMMO8EYOH4KM5h8pF9XtH_e5CjSh/view?usp=sharing" target="_blank">SPEC</a> для ALTLinux для сборки у себя на компьютере (в hasher тоже собирается). На здоровье.<br />
Бонус: есть <a href="http://beginners.re/" target="">книжка для начинающих REнжинеров</a> , даже на русском языке. Только про radare там ничего нет, лишь одно упоминание.</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-64995905364443034052017-07-17T14:34:00.001+06:002019-05-01T11:50:59.656+06:00GM to MT-32 translation<div dir="ltr" style="text-align: left;" trbidi="on">
Say, you have Roland MT-32 (a wonderful vintage synth) and want to play random MIDI files through it which obviously are General MIDI. But MT-32 is instrument-incompatible with GM because it was produced before GM was proposed.<br />
But it's possible to substitute the instruments (aka "Program Change" in MIDI).<br />
<a name='more'></a>In Windows 95/98 times it was done with Instrument Definition File (IDF). The file can be found in <a href="https://www.midimusicadventures.com/queststudios/mt32-resource/utilities/">QuestStudios</a>.<br />
<br />
Nowadays the IDF is useless. So I found a software that can do this in modern Linux environment: <a href="https://sourceforge.net/projects/alsamodular/">QMidiRoute from AlsaModularSynth project</a>. It can do the translation work for you.<br />
So I prepared the <a href="https://drive.google.com/file/d/0B3zKyJsDLT4GTHZHRXhFNUNCSG8/view?usp=sharing">QMR to do GM → MT-32 translation</a>. The script that generates the file is <a href="https://drive.google.com/file/d/0B3zKyJsDLT4GaDdSU1ZCQV9CLTA/view?usp=sharing">here</a>. Enjoy!</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-8024073242060041642017-04-13T18:18:00.001+06:002017-04-20T16:38:57.676+06:00Я — экспериментатор...<div dir="ltr" style="text-align: left;" trbidi="on">
Порой бывает полезно отойти на пару шагов от мэйнстрима и попробовать что-то новое, вроде как "сыграть новым мячом на старом поле". Эксперимент в этой статье <span style="color: black;">— программирование для микроконтроллеров на базе ARM Cotrex M3+ (линейка STM32) на новом и современном языке низкого уровня <a href="http://rust-lang.org/">Rust</a>.</span><br />
<a name='more'></a><br />
<span style="color: black;">До меня больших успехов добились <a href="https://spin.atomicobject.com/category/platforms-languages/embedded-systems/">иностранные комрады</a>, но в статьях нет результатов и сравнений, так что чтобы оценить, нужно самому собрать и посмотреть глазами.</span><br />
<b><span style="color: black;">1. Компилятор</span></b><br />
<span style="color: black;">Чтобы собирать "ржавые" программы для микроконтроллера, нужен кросс-компилятор. Так вот, в данном случае он не нужен. Ну, почти </span><span style="color: black;">☺ Объяснение тому очень простое: Rust сам не создаёт код под платформу, а генерирует Си-код, который потом отдаётся обычному Си-компилятору. Поэтому, правильно, кросс-Rust, как таковой, не нужен, а нужен обычный Rust и кросс-gcc. Впрочем, это же не проблема, т.к. он и так уже есть. Не хватает лишь core-библиотеки языка, собранной под нужную платформу.</span><br />
<span style="color: black;">Есть одна тонкость. Компилятор Rust и его окружение бывают двух видов: stable и nightly. Так вот, если у вас уже есть stable, например, из вашего дистрибутива, то он абсолютно бесполезен. Серьёзно. Они, как будто, существуют в парралельных вселенных, хотя собираются из одних и тех же исходников: библиотеки, собранные для stable не принимаются nightly и наоборот. На самом деле, даже собственную libcore стабильный компилятор собрать не может %)</span><br />
<span style="color: black;">Поэтому сносим стабильный Rust, скачиваем компилятор (rustc), библиотеку (rust-std) и исходники. Версии (или git-коммит) у всех трёх должны совпадать! Устанавливаем компилятор и библиотеку (вероятно, в /usr/local) и проверяем сборкой какого нибудь "Hello, world". Успешно? идём дальше!</span><br />
Далее разворачиваем где-нибудь исходники и компилируем кросс-библиотеку core:<br />
<blockquote class="tr_bq">
rustc -C opt-level=2 -Z no-landing-pads --target thumbv7m-none-eabi -g path-to-rust/src/libcore/lib.rs</blockquote>
Довольно быстро получаем libcore.rlib которую помещаем, опять же, в дерево rust, например в папку /usr/local/lib/rustlib/thumbv7m-none-eabi/lib/<br />
На этом шаге уже можно компилировать какие-нибудь исходники в объектные файлы (*.o), которые можно уже линковать в прошивки.<br />
Проверим это прямо на микроконтроллере:<br />
<ol style="text-align: left;">
<li>Берём <a href="https://github.com/ildar/stm32-tests/tree/RustTest">демонстрационный код</a></li>
<li>Собираем</li>
<li>Запускаем на STM32</li>
</ol>
Результаты по размеру кода: 8360 байт против 3916 байт (без rust-кода). Итого добавление минимальной rust-функции отъело <b>4444 байта</b> флеш-памяти.<br />
Продолжение следует. </div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-70066733984055644542017-02-08T19:24:00.003+06:002017-02-08T19:24:51.685+06:00Модуль DevHelp для API STM32 HAL<div dir="ltr" style="text-align: left;" trbidi="on">
пришло время написать о новом увлечении: микроконтроллеры. Понятно, что я неминуемо бы ими занялся, т.к. эмбедщина <span style="color: black;">— </span> это в первую очередь микроконтроллеры.<br />
Начав с так популярного сейчас Arduino, скакнул к STM32 на вычислительном ядре ARM Cortex-M. Ну, пока не продвинулся сильно дальше "Hello, world!", что в мире МК выглядит, как Blink, то есть моргание светодиодом<span style="color: black;"> 😉</span> <br />
Так что первый побочный выхлоп <span style="color: black;">— <a href="https://drive.google.com/file/d/0B3zKyJsDLT4GY0FKaVpzUjlUTlk/view?usp=sharing">документация</a></span><a href="https://drive.google.com/file/d/0B3zKyJsDLT4GY0FKaVpzUjlUTlk/view?usp=sharing"> для программирования "STM32F1xx HAL Drivers"</a><span style="color: black;">. </span><br />
Установка элементарная: надо распаковать в папку $HOME/.local/share/devhelp/books/<br />
<br />
<a name='more'></a>изготовлено с помощью <a href="https://github.com/ildar/doxygen_to_devhelp">набора утилит</a>.<br /></div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-21683301110237363922015-11-30T23:51:00.001+06:002015-11-30T23:51:37.830+06:00новая батарея... новая жизнь!<div dir="ltr" style="text-align: left;" trbidi="on">
Завелась такая беда с планшетом: при заряде батареи меньше половины экран временами начинал моргать, планшет выключался. В результате даже пару раз (!) <a href="http://johan-notes.blogspot.com/2015/05/unbriking-samsung-galaxy-note-80.html">повреждался /efs</a>.<br />
<a name='more'></a>Понятно, что проблемы были в районе питания. Я пессимистично начал думать, что питание экрана "накрылось", но, к счастью, оказался неправ. Просто батарея износилась и состарилась чуть более чем за год. Так что когда приехала дешёвенькая замена из китайского магазина Aliexpress, она и дала вторую жизнь вполне ещё актуальному (и, кстати, изначально недешёвому) планшету.<br />
Вывод: проблемы бывают не такими страшными, какими кажутся! :-)</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-41278451406527145742015-05-24T22:50:00.003+06:002016-10-04T21:58:51.178+06:00Unbricking Samsung Galaxy Note 8.0<div dir="ltr" style="text-align: left;" trbidi="on">
Случилось с планшетом жены: планшет не грузится. Покрутил так и этак. Зашёл в рекавери. В стандартном рекавери, понятно, много не сделаешь.<br />
Сделал сброс к заводским настройкам (прощай, содержимое /sdcard! :( ).<br />
Ничего не помогло. Планшет не грузится, бесконечный процесс загрузки даже с очищенными /data и /cache .<br />
Единственный намёк на источник проблемы --- сообщение о невозможности примонтировать /efs в стандартном рекавери. Но решения-то нет!<br />
Что ж, прошиваем <a href="http://teamw.in/devices/samsunggalaxynote80.html">кастомный рекавери</a> с помощью Heimdall.<br />
Ура нормальному рекавери! есть доступ через adb.<br />
Действительно, проблема с разделом /efs . Чиним <b>*), **)</b>:<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">e2fsck /dev/block/mmcblk0p3</span></blockquote>
На все вопросы соглашаемся. <br />
Порядок!<br />
<br />
*) конечно, я подстраховался перед этой операцией, сделав бэкап:<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">adb pull /dev/block/mmcblk0p3</span></blockquote>
**) команда e2fsck запускается на самом планшете, куда можно попасть с <span style="font-family: "Courier New",Courier,monospace;">adb shell</span></div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-85968124766549329592015-02-14T00:21:00.000+06:002015-02-14T00:21:40.494+06:00Новая пачка словарей<div dir="ltr" style="text-align: left;" trbidi="on">
Для Aard2 стоило бы иметь побольше словарей, обычных, например, Русско-Английский, а, поскольку формат довольно новый и официально нестабильный, то их пока не так много.<br />
В качестве небольшого упражнения я сконвертировал свободные словари Stardict.<br />
Скрипт конвертации <a href="https://drive.google.com/open?id=0B3zKyJsDLT4GOGlVaU80UE5lNjg&authuser=0">тут</a>. Его можно использовать, чтобы аналогичную операцию провести над другими словарями, которые можно найти в репозитариях дистрибутивов Linux.<br />
Собственно, получившиеся словари:<br />
<ul style="text-align: left;">
<li><a href="https://drive.google.com/open?id=0B3zKyJsDLT4GNU5LZUt6a2FKVUE&authuser=0">В формате slob</a> (для aardict2)</li>
<li><a href="https://drive.google.com/open?id=0B3zKyJsDLT4GNjZpRmN0UWtveW8&authuser=0">В формате aar</a> (Aard1)</li>
<li><a href="https://drive.google.com/open?id=0B3zKyJsDLT4GbF9OM0phUUNOdzQ&authuser=0">XDXF</a></li>
</ul>
В aar и xdxf форматах словари не все, но недостающие легко получить, запустив скрипт самостоятельно.<br />
Как всегда, если есть пожелания или вопросы — прошу в комментариях.</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-87676874050671444772014-12-15T21:56:00.001+06:002014-12-15T21:56:19.564+06:00BCM43142/Linux problem<div dir="ltr" style="text-align: left;" trbidi="on">
There's a problem using notebook Wi-Fi card BCM43142 by Broadcom in Linux.<br />
It sometimes rejects to connect to a network. Kernel log shows the problem:<br />
<blockquote class="tr_bq">
Dec 7 19:39:56 it kernel: [10269.636717] WARNING: CPU: 0 PID: 450 at net/wireless/sme.c:790 cfg80211_roamed+0x92/0xa0 [cfg80211]()<br />Dec 7 19:39:56 it kernel: [10269.636718] Modules linked in: ...<br />Dec 7 19:39:56 it kernel: [10269.636762] CPU: 0 PID: 450 Comm: wl_event_handle Tainted: P C O 3.14.22-std-def-alt1 #1<br />Dec 7 19:39:56 it kernel: [10269.636764] Hardware name: ASUSTeK COMPUTER INC. X555LN/X555LN, BIOS X555LN.308 08/06/2014</blockquote>
That's so unpleasant...<br />
I was confused that unloading/reloading the module (wl) doesn't help!<br />
Then I found that should also kill wpa_supplicant!<br />
<blockquote class="tr_bq">
# modprobe -r wl ; killall wpa_supplicant ; modprobe wl</blockquote>
Then it helps!<br />I also reported to Broadcom but still no answer...</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-90804668642036834942014-12-15T21:41:00.000+06:002014-12-15T21:41:29.586+06:00Firefox profiler<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Проблема</b>: Firefox без особых причин начал потреблять много процессорного времени (загрузка процессора в top указывает на FF). Подозрение, что виновато одно из расширений. Но какое?<br />
<b>Решение</b>: воспользоваться встроенным профилировщиком FF.<br />
По шагам, во время проблемы:<br />
<ol style="text-align: left;">
<li>Alt, меню Инструменты → Веб-разработка → Производительность</li>
<li>Щёлкнуть по кнопочке, как и просит.</li>
<li>Выждать пару секунд, нажать снова</li>
<li>В открывшемся списке найти главного потребителя процессора (второй сверху)</li>
<li>Отключить или обновить провинившееся расширение</li>
</ol>
В моём случае это был Lazarus.</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0tag:blogger.com,1999:blog-5937120981951611381.post-81726101616134268572014-11-11T00:41:00.000+06:002014-11-11T00:41:06.588+06:00wine для запуска web-interface VMware vCenter<div dir="ltr" style="text-align: left;" trbidi="on">
Проприетарщики не устают удивлять нас своими решениями.<br />
VMware взяла курс на web-interface для управления виртуальными фермами через vCenter. Это хорошо. Но вместо нормального HTML5 они избрали в качестве платформы Adobe Flash.<br />
Впрочем, и это можно было некоторое время терпеть (хотя flash, отжирающий при запуске более 1Гб памяти - это уже неслабое испытание нервов линуксоидов). Но в последних версиях этот самый web-interface начал требовать версию Flash plugin >= 15. А Adobe для Linux не собирается выпускать версии выше 11. Поздравляю, вместе вы "сбрили" всех линуксовых админов!<br />
Впрочем, это опять лирика.<br />
Можно использовать WINE для запуска (хм!) IE8 + Adobe Flash plugin 15, что позволит получить желанный доступ к web-interface vCenter.<br />
<br />
<a name='more'></a>Собственно, скрипт:<br /><br />
<blockquote class="tr_bq">
#!/bin/bash<br /><br />ADDR=$1<br />PORT=${2:-9443}<br />export WINEPREFIX=$TMP/wine-vCenter.sandbox<br /><br />wine-sandbox.sh<br />winetricks -q ie8<br />ln -s ~/.winetrickscache/flash/install_flash_player_ax.exe "$WINEPREFIX/dosdevices/c:"<br />wine c:/install_flash_player_ax.exe /install >> "$WINEPREFIX"/wine.log 2>&1<br />socat tcp-l:9443,reuseaddr,fork openssl:$ADDR:$PORT,verify=0 &<br />wine-sandbox.sh "C:/Program Files/Internet Explorer/iexplore" http://localhost:9443/vsphere-client/<br />killall socat</blockquote>
Из этого скрипта вызывается другой скрипт, <a href="http://johan-notes.blogspot.com/2014/11/wine-windows.html">wine-sandbox.sh</a><br />
Также используется socat для "распаковки" SSL, т.к. <a href="https://appdb.winehq.org/objectManager.php?sClass=version&iId=16041">IE8 не работает нормально с https</a>.</div>
Ildarhttp://www.blogger.com/profile/07350234016259527548noreply@blogger.com0