tag:blogger.com,1999:blog-63639951932113928302024-03-14T09:15:32.990+03:00/home/pa23Заметки о GNU/Linux, Emacs, C++ и собственных разработкахpa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.comBlogger358125tag:blogger.com,1999:blog-6363995193211392830.post-26823434525490573022021-01-07T12:21:00.000+03:002021-01-07T12:21:50.867+03:00Emacs Lisp. Представление чисел в различных системах счисления (dec, hex, bin)<p>При работе с текстом мне постоянно приходится менять представление чисел, переводя из одной системы счисления в другую. Что я хотел сказать? Emacs прекрасен. Взял и накидал несколько функций на elisp. Теперь, выделив число в тексте, можно быстро представить его в другой системе. Ниже привожу листинг.<br /></p>
<p>
<pre><code class="lisp"><span class="comment">;; convert decimal to binary</span>
<span class="list">(<span class="title">defun</span><span class="body"> pa<span class="number">23</span>-dec<span class="number">2</span>bin <span class="list">(<span class="title">start</span><span class="body"> end)</span></span>
<span class="string">"Convert decimal to binary."</span>
<span class="list">(<span class="title">interactive</span><span class="body"> <span class="string">"r"</span>)</span></span>
<span class="list">(<span class="title">let</span><span class="body"> <span class="list">(<span class="body"><span class="list">(<span class="title">var</span><span class="body"> <span class="number">0</span>)</span></span> <span class="list">(<span class="title">res</span><span class="body"> <span class="string">""</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> var <span class="list">(<span class="title">string-to-number</span><span class="body"> <span class="list">(<span class="title">buffer-substring-no-properties</span><span class="body"> start end)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">while</span><span class="body"> <span class="list">(<span class="title">not</span><span class="body"> <span class="list">(<span class="title">=</span><span class="body"> var <span class="number">0</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> res <span class="list">(<span class="title">concat</span><span class="body"> <span class="list">(<span class="title">if</span><span class="body"> <span class="list">(<span class="title">=</span><span class="body"> <span class="number">1</span> <span class="list">(<span class="title">logand</span><span class="body"> var <span class="number">1</span>)</span></span>)</span></span> <span class="string">"1"</span> <span class="string">"0"</span>)</span></span> res)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> var <span class="list">(<span class="title">lsh</span><span class="body"> var <span class="number">-1</span>)</span></span>)</span></span> )</span></span>
<span class="list">(<span class="title">if</span><span class="body"> <span class="list">(<span class="title">string=</span><span class="body"> res <span class="string">""</span>)</span></span> <span class="list">(<span class="title">setq</span><span class="body"> res <span class="string">"0"</span>)</span></span>)</span></span>
<span class="list">(<span class="title">delete-region</span><span class="body"> start end)</span></span>
<span class="list">(<span class="title">insert</span><span class="body"> res)</span></span> )</span></span> )</span></span>
<span class="comment">;; convert decimal to hexadecimal</span>
<span class="list">(<span class="title">defun</span><span class="body"> pa<span class="number">23</span>-dec<span class="number">2</span>hex <span class="list">(<span class="title">start</span><span class="body"> end)</span></span>
<span class="string">"Convert decimal to hexadecimal."</span>
<span class="list">(<span class="title">interactive</span><span class="body"> <span class="string">"r"</span>)</span></span>
<span class="list">(<span class="title">let</span><span class="body"> <span class="list">(<span class="body"><span class="list">(<span class="title">var</span><span class="body"> <span class="number">0</span>)</span></span> <span class="list">(<span class="title">res</span><span class="body"> <span class="string">""</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> var <span class="list">(<span class="title">string-to-number</span><span class="body"> <span class="list">(<span class="title">buffer-substring-no-properties</span><span class="body"> start end)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> res <span class="list">(<span class="title">upcase</span><span class="body"> <span class="list">(<span class="title">format</span><span class="body"> <span class="string">"%x"</span> var)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">delete-region</span><span class="body"> start end)</span></span>
<span class="list">(<span class="title">insert</span><span class="body"> res)</span></span> )</span></span> )</span></span>
<span class="comment">;; convert hexadecimal to binary</span>
<span class="list">(<span class="title">defun</span><span class="body"> pa<span class="number">23</span>-hex<span class="number">2</span>bin <span class="list">(<span class="title">start</span><span class="body"> end)</span></span>
<span class="string">"Convert hexadecimal to binary."</span>
<span class="list">(<span class="title">interactive</span><span class="body"> <span class="string">"r"</span>)</span></span>
<span class="list">(<span class="title">let</span><span class="body"> <span class="list">(<span class="body"><span class="list">(<span class="title">var</span><span class="body"> <span class="string">""</span>)</span></span> <span class="list">(<span class="title">res</span><span class="body"> <span class="string">""</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> var <span class="list">(<span class="title">string-to-number</span><span class="body"> <span class="list">(<span class="title">buffer-substring-no-properties</span><span class="body"> start end)</span></span> <span class="number">16</span>)</span></span>)</span></span>
<span class="list">(<span class="title">while</span><span class="body"> <span class="list">(<span class="title">not</span><span class="body"> <span class="list">(<span class="title">=</span><span class="body"> var <span class="number">0</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> res <span class="list">(<span class="title">concat</span><span class="body"> <span class="list">(<span class="title">if</span><span class="body"> <span class="list">(<span class="title">=</span><span class="body"> <span class="number">1</span> <span class="list">(<span class="title">logand</span><span class="body"> var <span class="number">1</span>)</span></span>)</span></span> <span class="string">"1"</span> <span class="string">"0"</span>)</span></span> res)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> var <span class="list">(<span class="title">lsh</span><span class="body"> var <span class="number">-1</span>)</span></span>)</span></span> )</span></span>
<span class="list">(<span class="title">if</span><span class="body"> <span class="list">(<span class="title">string=</span><span class="body"> res <span class="string">""</span>)</span></span> <span class="list">(<span class="title">setq</span><span class="body"> res <span class="string">"0"</span>)</span></span>)</span></span>
<span class="list">(<span class="title">delete-region</span><span class="body"> start end)</span></span>
<span class="list">(<span class="title">insert</span><span class="body"> res)</span></span> )</span></span> )</span></span>
<span class="comment">;; convert hexadecimal to decimal</span>
<span class="list">(<span class="title">defun</span><span class="body"> pa<span class="number">23</span>-hex<span class="number">2</span>dec <span class="list">(<span class="title">start</span><span class="body"> end)</span></span>
<span class="string">"Convert hexadecimal to decimal."</span>
<span class="list">(<span class="title">interactive</span><span class="body"> <span class="string">"r"</span>)</span></span>
<span class="list">(<span class="title">let</span><span class="body"> <span class="list">(<span class="body"><span class="list">(<span class="title">var</span><span class="body"> <span class="number">0</span>)</span></span> <span class="list">(<span class="title">res</span><span class="body"> <span class="string">""</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> var <span class="list">(<span class="title">string-to-number</span><span class="body"> <span class="list">(<span class="title">buffer-substring-no-properties</span><span class="body"> start end)</span></span> <span class="number">16</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> res <span class="list">(<span class="title">number-to-string</span><span class="body"> var)</span></span>)</span></span>
<span class="list">(<span class="title">delete-region</span><span class="body"> start end)</span></span>
<span class="list">(<span class="title">insert</span><span class="body"> res)</span></span> )</span></span> )</span></span>
<span class="comment">;; convert binary to decimal</span>
<span class="list">(<span class="title">defun</span><span class="body"> pa<span class="number">23</span>-bin<span class="number">2</span>dec <span class="list">(<span class="title">start</span><span class="body"> end)</span></span>
<span class="string">"Convert binary to decimal."</span>
<span class="list">(<span class="title">interactive</span><span class="body"> <span class="string">"r"</span>)</span></span>
<span class="list">(<span class="title">let</span><span class="body"> <span class="list">(<span class="body"><span class="list">(<span class="title">var</span><span class="body"> <span class="number">0</span>)</span></span> <span class="list">(<span class="title">res</span><span class="body"> <span class="string">""</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> var <span class="list">(<span class="title">string-to-number</span><span class="body"> <span class="list">(<span class="title">buffer-substring-no-properties</span><span class="body"> start end)</span></span> <span class="number">2</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> res <span class="list">(<span class="title">number-to-string</span><span class="body"> var)</span></span>)</span></span>
<span class="list">(<span class="title">delete-region</span><span class="body"> start end)</span></span>
<span class="list">(<span class="title">insert</span><span class="body"> res)</span></span> )</span></span> )</span></span>
<span class="comment">;; convert binary to hexadecimal</span>
<span class="list">(<span class="title">defun</span><span class="body"> pa<span class="number">23</span>-bin<span class="number">2</span>hex <span class="list">(<span class="title">start</span><span class="body"> end)</span></span>
<span class="string">"Convert binary to hexadecimal."</span>
<span class="list">(<span class="title">interactive</span><span class="body"> <span class="string">"r"</span>)</span></span>
<span class="list">(<span class="title">let</span><span class="body"> <span class="list">(<span class="body"><span class="list">(<span class="title">var</span><span class="body"> <span class="number">0</span>)</span></span> <span class="list">(<span class="title">res</span><span class="body"> <span class="string">""</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> var <span class="list">(<span class="title">string-to-number</span><span class="body"> <span class="list">(<span class="title">buffer-substring-no-properties</span><span class="body"> start end)</span></span> <span class="number">2</span>)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> res <span class="list">(<span class="title">upcase</span><span class="body"> <span class="list">(<span class="title">format</span><span class="body"> <span class="string">"%x"</span> var)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">delete-region</span><span class="body"> start end)</span></span>
<span class="list">(<span class="title">insert</span><span class="body"> res)</span></span> )</span></span> )</span></span></code></pre>
</p>pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-10232028955542781102021-01-05T21:01:00.007+03:002021-01-05T21:04:57.028+03:00cmake и wxwidgets на archlinux<p>Так уж получается, что потянуло меня опять по ряду причин на WxWidgets. Системой моей по-прежнему является ArchLinux, а для сборки программ я предпочитаю cmake. Подготовил файлы, запускаю</p><p><b>cmake -G "Unix Makefiles"</b></p><p>и получаю сообщение об ошибке</p><p><img alt="" height="144" src="data:image/png;base64,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" width="400" /></p><p>Расследование привело меня к файлу /usr/lib/wx/config/gtk3-unicode-3.0, на который есть символическая ссылка в /usr/bin. Вот только называется файл-ссылка wx-config-gtk3, а cmake хотел просто wx-config.</p><p>Решение проблемы:</p><p><b>sudo ln -s /usr/lib/wx/config/gtk3-unicode-3.0 /usr/bin/wx-config</b></p><p>И наш<b> </b></p><p><b>cmake -G "Unix Makefiles"</b></p><p>теперь отрабатывает без ошибок.<b> <br /></b></p>pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-69465060662570483682020-01-07T17:44:00.008+03:002023-04-29T13:29:18.372+03:00Настройка шрифтов в Arch Linux<div dir="ltr" style="text-align: left;" trbidi="on">
<div>
Хотелось бы еще раз остановиться на вопросе настройки шрифтов в Arch, так как, столкнувшись с чистой установкой, которую не делал уже не знаю даже сколько лет, пришлось искать информацию для решения некоторых проблем, и это оказалось непросто.<br />
<ol style="text-align: left;">
<li>Устанавливаем желаемую версию интерпретатора freetype2 в файле <b>/etc/profile.d/freetype2.sh</b>. Для этого необходимо раскомментировать строку <b>export FREETYPE...</b> и отредактировать ее. Лично я предпочитаю версию 35 (classic mode), ибо только она дает прекрасное сглаживание шрифтов (в основном я использую шрифты семейств Dejavu и Ubuntu).</li>
<li>Настраиваем шрифты, создавая/удаляя символические ссылки (symlinks) в <b>/etc/fonts/conf.d</b> на соответствующие файлы в <b>/etc/fonts/conf.avail</b>. Для себя я считаю необходимым добавить ссылки на следующие файлы:<br /><b>10-hinting-full.conf<br />10-sub-pixel-rgb.conf<br />11-lcdfilter-default.conf</b></li>
<li>Настраиваем шрифты в окружении рабочего стола. Я использую xfce4, поэтому привожу снимок окна для этого DE.<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxiRy-DojNRXoYpdl28SUHyCpztxAOVHbQxMQzSmUhTSbnOUy059dIfb247J6wH_HzM5VuYOCHSZR-RbbVmGtaQU-26zemAmOgKwSOsSUH_hTudTQQnJpy9ZkTv5Dyqk4iE2qzAc4Gt6N5/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0_2020-01-07_17-54-38.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="564" data-original-width="529" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxiRy-DojNRXoYpdl28SUHyCpztxAOVHbQxMQzSmUhTSbnOUy059dIfb247J6wH_HzM5VuYOCHSZR-RbbVmGtaQU-26zemAmOgKwSOsSUH_hTudTQQnJpy9ZkTv5Dyqk4iE2qzAc4Gt6N5/s320/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0_2020-01-07_17-54-38.png" width="300" /></a></div>
</li>
<li>Если необходимо перезагрузиться, перезагружаемся и убеждаемся, что шрифты во всех приложениях выглядят идеально, просто прекрасно, за исклюнием некоторых, использующих qt5 (например, virtualbox и vlc). В следующих пунктах решаем эту проблему.</li>
<li>Проверяем, установлен ли пакет <b>qt5ct</b>. Если нет, его необходимо установить.</li>
<li>В файле <b>/etc/profile</b> дописываем пару строк:<br /><b>export QT_QPA_PLATFORMTHEME="qt5ct"<br />export QT_AUTO_SCREEN_SCALE_FACTOR=0</b><br />Сколько же у меня ушло времени на поиск второй строки. Весь интернет говорит только о первой (а этого мало, эффект ноль), и только установив на виртуальную машину manjaro и поковырявшись в ней, я понял что нужно.</li>
<li>Выбираем желаемые шрифты для приложений, использующих qt5 в конфигураторе <b>qt5ct</b>. Достаточно просто выбрать шрифты, создавать fonts.conf не нужно.<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwUbNWAN8m0eSBJXO7I5R0DfDpaQEXNPPb-kmMH9bFJfYhxWTB-_UnInx3Cx_lntc2jgJhbzV0upcbWXj174pRuVXW-J6sL9mTGo6fGy2XfURS_4nwDHUjDCtAQSE4eAoBSUjondoThObC/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0_2020-01-07_17-55-05.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="609" data-original-width="610" height="319" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwUbNWAN8m0eSBJXO7I5R0DfDpaQEXNPPb-kmMH9bFJfYhxWTB-_UnInx3Cx_lntc2jgJhbzV0upcbWXj174pRuVXW-J6sL9mTGo6fGy2XfURS_4nwDHUjDCtAQSE4eAoBSUjondoThObC/s320/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0_2020-01-07_17-55-05.png" width="320" /></a></div>
</li>
</ol>
</div>
Ну вот и все. Теперь абсолютно все программы выглядят замечательно и пользоваться системой приятно, глаза благодарны.<br />
Вот так теперь выглядят шрифты в разных приложениях.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIy_vbl7B0fvUeEKf53lr8NHgnqd6EQtWSaZfIY4l_IE2rs9zRdA1vdxrpNXFwSyR7AyMo_HRiar9mpTRs89tJF1aTxOKjDEwiXv1aDUR5ZebjQj8_6msFMg-gv4t9sJnlaeJaHBqDF_3P/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0_2020-01-07_17-57-54.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="93" data-original-width="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIy_vbl7B0fvUeEKf53lr8NHgnqd6EQtWSaZfIY4l_IE2rs9zRdA1vdxrpNXFwSyR7AyMo_HRiar9mpTRs89tJF1aTxOKjDEwiXv1aDUR5ZebjQj8_6msFMg-gv4t9sJnlaeJaHBqDF_3P/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0_2020-01-07_17-57-54.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhELobqAq19R4o5fAQDgn2A0ZOnLSAJQr0lAdxSzGUndNXROzbwltKoGYG_yiEhyphenhyphenVq0geI-QqYfUzWzsUYdU1EXUP-uF2SFyMM8OBhlSSCErxiDItorULSYDlzYmIMVugp1MQZTUINke6C4/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0_2020-01-07_18-01-01.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="122" data-original-width="379" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhELobqAq19R4o5fAQDgn2A0ZOnLSAJQr0lAdxSzGUndNXROzbwltKoGYG_yiEhyphenhyphenVq0geI-QqYfUzWzsUYdU1EXUP-uF2SFyMM8OBhlSSCErxiDItorULSYDlzYmIMVugp1MQZTUINke6C4/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0_2020-01-07_18-01-01.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdla9NZ-pwlcgcZvtjP4RtTTA4G1rBtB1jE_Ih7G9nTK5Rq3bCGo3fTj4AhwCQnpOUeuirAzLe9txIC4jOeFDjh5GbxfJB8zRckQqVuUReqQdaUtVojkOQKPOODlucwo4VYvk8jsm3TvpF/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0_2020-01-07_17-51-02.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="109" data-original-width="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdla9NZ-pwlcgcZvtjP4RtTTA4G1rBtB1jE_Ih7G9nTK5Rq3bCGo3fTj4AhwCQnpOUeuirAzLe9txIC4jOeFDjh5GbxfJB8zRckQqVuUReqQdaUtVojkOQKPOODlucwo4VYvk8jsm3TvpF/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0_2020-01-07_17-51-02.png" /><span id="goog_794983624"></span><span id="goog_794983625"></span><span id="goog_794983618"></span><span id="goog_794983619"></span></a></div>
</div><div dir="ltr" style="text-align: left;" trbidi="on"> </div><div dir="ltr" style="text-align: left;" trbidi="on"><b>UPD 2023-04-29</b></div><div dir="ltr" style="text-align: left;" trbidi="on"> </div><div dir="ltr" style="text-align: left;" trbidi="on">При переходе некоторых приложений на использование библиотеки gtk4 отрисовка шрифтов у них поломалась. Шрифты выглядят размыто. Для исправления этой ситуации необходимо создать файл конфигурации ~/.config/gtk-4.0/settings.ini, в котором прописать параметры gtk-hint-font-metrics, gtk-xft-antialias, gtk-xft-hinting, gtk-xft-hintstyle и gtk-xft-rgba. Привожу содержимое моего файла.</div><div dir="ltr" style="text-align: left;" trbidi="on"> </div><div dir="ltr" style="text-align: left;" trbidi="on">[Settings]<br />gtk-hint-font-metrics=1<br />gtk-theme-name=Adwaita<br />gtk-icon-theme-name=elementary<br />gtk-font-name=DejaVu Sans ExtraLite 10<br />gtk-cursor-theme-name=Adwaita<br />gtk-cursor-theme-size=0<br />gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ<br />gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR<br />gtk-button-images=1<br />gtk-menu-images=1<br />gtk-enable-event-sounds=0<br />gtk-enable-input-feedback-sounds=0<br />gtk-xft-antialias=1<br />gtk-xft-hinting=1<br />gtk-xft-hintstyle=hintfull<br />gtk-xft-rgba=none<br />gtk-application-prefer-dark-theme=0<br />
<div>
<ol style="text-align: left;">
</ol>
</div>
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-37438992582826123512019-01-20T17:51:00.000+03:002019-01-20T17:56:14.659+03:00Таблично заданные функции и линейная интерполяция на C++<div dir="ltr" style="text-align: left;" trbidi="on">
Время от времени в наших программах, при решении различных расчетных задач, возникает необходимость получать значения таблично заданных функций одной или двух переменных. Наиболее простым и надежным решением в данном случае является линейная интерполяция. В данной заметке я хочу привести пример определения значения таблично заданной функции двух переменных в виде реализации на C++.<br />
В случаях, когда значения аргументов функции выходят за пределы таблицы, можно поступать по-разному: останавливать расчет и возвращать код ошибки или урезать значение аргумента до крайнего, представленного в таблице. В примере приведем первый вариант.<br />
Стоит также учесть, что в зависимости от значений аргументов наш подход к работе с таблицей будет отличаться.<br />
<ol style="text-align: left;">
<li>Значения обоих аргументов совпадают со значениями сетки. В этом случае, не прибегая ни к каким вычислениям, мы выбираем значение функции из таблицы.</li>
<li>Один из аргументов функции совпал со значением сетки. Тогда следует воспользоваться формулой линейной интерполяции для функции одной переменной.</li>
<li>Ни один из аргументов функции не совпал со значениями сетки. Используем в таком случае формулы линейной интерполяции для функции двух переменных, что, собственно, не сильно отличается от работы по п.2 - то же самое, только в два захода.</li>
</ol>
Хорошо, теперь, наконец, переходим к коду. Пусть наша таблица определена несколькими векторами, содержащими значения сетки по оси X, значения сетки по оси Y и сами значения функции, то есть Z.
<br />
<pre><code class="cpp"><span class="keyword">const</span> <span class="stl_container"><span class="built_in">vector</span><<span class="keyword">double</span>></span> X = { <span class="number">1</span>, <span class="number">1.5</span>, <span class="number">2</span>, <span class="number">2.5</span> };
<span class="keyword">const</span> <span class="stl_container"><span class="built_in">vector</span><<span class="keyword">double</span>></span> Y = { <span class="number">25</span>, <span class="number">30</span>, <span class="number">40</span> };
<span class="keyword">const</span> <span class="stl_container"><span class="built_in">vector</span>< <span class="stl_container"><span class="built_in">vector</span><<span class="keyword">double</span>></span> ></span> Z =
{ {<span class="number">0.392</span>, <span class="number">0.476</span>, <span class="number">0.574</span>, <span class="number">0.658</span>},
{<span class="number">0.406</span>, <span class="number">0.588</span>, <span class="number">0.770</span>, <span class="number">1.050</span>},
{<span class="number">0.434</span>, <span class="number">0.700</span>, <span class="number">0.980</span>, <span class="number">1.119</span>} };</code></pre>
Затем приведем функции линейной интерполяции. В случае 3D, для пущей наглядности, я привожу в коде схему обозначения точек.<br />
<pre><code class="cpp"><span class="keyword">double</span> linInterp2D(
<span class="keyword">double</span> x1, <span class="keyword">double</span> y1,
<span class="keyword">double</span> x2, <span class="keyword">double</span> y2,
<span class="keyword">double</span> x
) {
<span class="keyword">double</span> y = y1 + (x - x1) * (y2 - y1) / (x2 - x1);
<span class="keyword">return</span> y;
}
<span class="keyword">double</span> linInterp3D(
<span class="keyword">double</span> x1, <span class="keyword">double</span> y1,
<span class="keyword">double</span> x2, <span class="keyword">double</span> y2,
<span class="keyword">double</span> z11, <span class="keyword">double</span> z21, <span class="keyword">double</span> z12, <span class="keyword">double</span> z22,
<span class="keyword">double</span> x, <span class="keyword">double</span> y
) {
<span class="comment">/*
|
y2-| z12 z22
|
y-| z
|
y1-| z11 z21
|_______________
| | |
x1 x x2
*/</span>
<span class="keyword">double</span> z1 = z11 + (z12 - z11) * (y - y1) / (y2 - y1);
<span class="keyword">double</span> z2 = z21 + (z22 - z21) * (y - y1) / (y2 - y1);
<span class="keyword">double</span> z = z1 + (z2 - z1) * (x - x1) / (x2 - x1);
<span class="keyword">return</span> z;
}</code></pre>
И, наконец, нахождение значения таблично заданной функции по заданным x и y.<br />
<pre><code class="cpp"><span class="keyword">double</span> findZ(<span class="keyword">double</span> x, <span class="keyword">double</span> y) {
<span class="keyword">double</span> x1 = <span class="number">0</span>; <span class="keyword">double</span> x1i = <span class="number">0</span>;
<span class="keyword">double</span> y1 = <span class="number">0</span>; <span class="keyword">double</span> y1i = <span class="number">0</span>;
<span class="keyword">double</span> x2 = <span class="number">0</span>; <span class="keyword">double</span> x2i = <span class="number">0</span>;
<span class="keyword">double</span> y2 = <span class="number">0</span>; <span class="keyword">double</span> y2i = <span class="number">0</span>;
<span class="keyword">double</span> z11 = <span class="number">0</span>;
<span class="keyword">double</span> z21 = <span class="number">0</span>;
<span class="keyword">double</span> z12 = <span class="number">0</span>;
<span class="keyword">double</span> z22 = <span class="number">0</span>;
<span class="keyword">bool</span> x_inside_range = <span class="keyword">false</span>;
<span class="keyword">bool</span> y_inside_range = <span class="keyword">false</span>;
<span class="keyword">for</span> (size_t i=<span class="number">0</span>; i<X.size()-<span class="number">1</span>; i++) {
<span class="keyword">if</span> ( x == X[i] ) {
x1 = x2 = X[i];
x1i = x2i = i;
x_inside_range = <span class="keyword">true</span>;
<span class="keyword">break</span>;
}
<span class="keyword">else</span> <span class="keyword">if</span> ( (x > X[i]) && (x < X[i+<span class="number">1</span>]) ) {
x1 = X[i];
x1i = i;
x2 = X[i+<span class="number">1</span>];
x2i = i+<span class="number">1</span>;
x_inside_range = <span class="keyword">true</span>;
<span class="keyword">break</span>;
}
<span class="keyword">else</span> <span class="keyword">if</span> ( x == X[i+<span class="number">1</span>] ) {
x1 = x2 = X[i+<span class="number">1</span>];
x1i = x2i = i+<span class="number">1</span>;
x_inside_range = <span class="keyword">true</span>;
<span class="keyword">break</span>;
}
}
<span class="keyword">if</span> ( !x_inside_range ) {
<span class="built_in">cout</span> << <span class="string">"x is outside of X axis range!\n"</span>;
<span class="keyword">return</span> -<span class="number">666</span>;
}
<span class="keyword">for</span> (size_t i=<span class="number">0</span>; i<Y.size()-<span class="number">1</span>; i++) {
<span class="keyword">if</span> ( y == Y[i] ) {
y1 = y2 = Y[i];
y1i = y2i = i;
y_inside_range = <span class="keyword">true</span>;
<span class="keyword">break</span>;
}
<span class="keyword">else</span> <span class="keyword">if</span> ( (y > Y[i]) && (y < Y[i+<span class="number">1</span>]) ) {
y1 = Y[i];
y1i = i;
y2 = Y[i+<span class="number">1</span>];
y2i = i+<span class="number">1</span>;
y_inside_range = <span class="keyword">true</span>;
<span class="keyword">break</span>;
}
<span class="keyword">else</span> <span class="keyword">if</span> ( y == Y[i+<span class="number">1</span>] ) {
y1 = y2 = Y[i+<span class="number">1</span>];
y1i = y2i = i+<span class="number">1</span>;
y_inside_range = <span class="keyword">true</span>;
<span class="keyword">break</span>;
}
}
<span class="keyword">if</span> ( !y_inside_range ) {
<span class="built_in">cout</span> << <span class="string">"y is outside of Y axis range!\n"</span>;
<span class="keyword">return</span> -<span class="number">666</span>;
}
z11 = Z[y1i][x1i];
z21 = Z[y1i][x2i];
z12 = Z[y2i][x1i];
z22 = Z[y2i][x2i];
<span class="keyword">if</span> ( (x1 == x2) && (y1 == y2) ) {
<span class="keyword">return</span> Z[y1i][x1i];
}
<span class="keyword">else</span> <span class="keyword">if</span> ( (x1 == x2) && (y1 != y2) ) {
<span class="keyword">return</span> linInterp2D(y1, z11, y2, z12, y);
}
<span class="keyword">else</span> <span class="keyword">if</span> ( (x1 != x2) && (y1 == y2) ) {
<span class="keyword">return</span> linInterp2D(x1, z11, x2, z21, x);
}
<span class="keyword">else</span> {
<span class="keyword">return</span> linInterp3D(x1, y1, x2, y2, z11, z21, z12, z22, x, y);
}
}</code></pre>
Вот и все. Вроде бы совершенно ничего сложного, но такие вот заготовочки весьма полезны, когда сроки поджимают, а некоторые функции уже написаны. Это здорово экономит время.</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-44938941675248786052017-11-10T22:57:00.001+03:002017-11-10T22:57:45.847+03:00ogg в mp3 без лишней возьни с мышью и окошками<div dir="ltr" style="text-align: left;" trbidi="on">
До чего же мне нравится команда find. Итак, если, к примеру, у вас в машине магнитола отказывается читать правильные форматы типа ogg и требует mp3, то деваться некуда, придется ее уважить, ибо музыку в дороге послушать иногда хочется, особенно если дорога дальняя. Для конвертирования всех файлов ogg в текущем каталоге в mp3 с битрейтом, например, 320 кбит/с, можно использовать связку find и ffmpeg следующим образом:
<br />
<pre><code class="bash">find . -name <span class="string">"*.ogg"</span> -exec ffmpeg -i {} -ab 320k {}.mp3 \;</code></pre>
<br /></div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-61841282267851885042017-05-15T22:17:00.000+03:002017-05-15T22:17:38.686+03:00Релиз r49-20170515<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="text-align: center;">
<b><a href="https://sourceforge.net/projects/r49/files/2017/v20170515/" target="_blank"><span style="font-size: large;">СКАЧАТЬ</span></a></b></div>
<br />
Версии компонентов:<br />
<ul style="text-align: left;">
<li>libtoxic v7.5.4</li>
<li>cr49 v1.3.0</li>
<li>Qr49 v3.12.9</li>
</ul>
Изменения:<br />
<ol style="text-align: left;">
<li>Qr49: устранена ошибка, приводившая к неверному выбору файла для диалога "Отладочные данные" (проявлялась случайным образом);</li>
<li>Qr49: улучшен алгоритм выбора файлов для вкладки "Отчеты" (по завершению расчетов). </li>
</ol>
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-17268015207581238892017-03-05T11:06:00.004+03:002017-03-05T11:07:44.235+03:00Релиз r49-20170305<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="text-align: center;">
<b><a href="https://sourceforge.net/projects/r49/files/2017/v20170305/" target="_blank"><span style="font-size: large;">СКАЧАТЬ</span></a></b></div>
<br />
Версии компонентов:<br />
<ul style="text-align: left;">
<li>libtoxic v7.5.4</li>
<li>cr49 v1.3.0</li>
<li>Qr49 v3.12.7</li>
</ul>
Изменения:<br />
<ol style="text-align: left;">
<li>Qr49: устранена ошибка с диапазонами данных в диалоге ввода масс фильтров ТЧ;</li>
<li>Общее: сборка под Windows выполнена с использованием Qt версии 5.8.0. </li>
</ol>
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-68383882303595980612016-12-31T15:01:00.000+03:002016-12-31T15:01:49.961+03:00Релиз r49-20161231<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="text-align: center;">
<b><a href="https://sourceforge.net/projects/r49/files/2016/v20161231/" target="_blank"><span style="font-size: large;">СКАЧАТЬ</span></a></b></div>
<br />
Версии компонентов:<br />
<ul style="text-align: left;">
<li>libtoxic v7.5.4</li>
<li>cr49 v1.3.0</li>
<li>Qr49 v3.12.6</li>
</ul>
Изменения:<br />
<ol style="text-align: left;">
<li>libtoxic: устранена ошибка, приводящая к появлению мусора в отчете ReportGAS_OST_37.001.234-81 при некоторых сочетаниях исходных данных;</li>
<li>Qr49: некоторые внутренние улучшения;</li>
<li>Общее: сборка под Windows выполнена с использованием Qt версии 5.7.1. </li>
</ol>
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-35242404378127078752016-12-31T13:32:00.000+03:002016-12-31T14:56:05.140+03:00Релиз reup-1.11.0<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="text-align: center;">
<span style="font-size: large;"><b><a href="https://sourceforge.net/projects/reup/files/v1.11.0/" target="_blank">СКАЧАТЬ</a></b></span> </div>
</div>
<br />
Да, вот так после 1.7.0 сразу 1.11.0. На самом деле скачка не было, просто промежуточные версии не публиковались. Из изменений в 1.11.0: обеспечена работа с файлами edc, оптимизированы правила генерации makefile, незначительные внутренние улучшения.</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-61242874580934249912016-12-29T18:27:00.001+03:002021-02-06T12:24:57.678+03:00Emacs Lisp. Конвертирование массива ASCII в текст и обратно<div dir="ltr" style="text-align: left;" trbidi="on">
По работе мне достаточно часто приходится работать с текстовыми файлами, содержащими строки в виде массивов ASCII, где значения отдельных символов разделены точкой с запятой. Что-то типа "118;50;48;49;54;49;50;50;57". Разумеется, хотелось бы увидеть эту информацию в более комфортном для человека виде, как то "v20161229", откорректировать и преобразовать обратно в массив ASCII. Так как с текстом я почти всегда работаю в emacs, то самым логичным решением было бы написать пару функций на emacs lisp. Тем более, что пользоваться какими-то приложениями, таская текст из редактора в буфер, потом в специальный конвертер, потом опять в буфер и, наконец, обратно в редактор, ну вообще не вариант.<br />
Код функций получился вот таким.<br />
<pre><code class="lisp"><span class="list">(<span class="title">defun</span><span class="body"> pa<span class="number">23</span>-ascii<span class="number">2</span>text <span class="list">(<span class="body">start end)</span></span>
<span class="string">"Convert ASCII codes to text."</span>
<span class="list">(<span class="title">interactive</span><span class="body"> <span class="string">"r"</span>)</span></span>
<span class="list">(<span class="title">let</span><span class="body"> <span class="list">(<span class="body"><span class="list">(<span class="title">text</span><span class="body">)</span></span>)</span></span>
<span class="list">(<span class="title">progn</span><span class="body">
<span class="list">(<span class="title">setq</span><span class="body"> line <span class="list">(<span class="title">buffer-substring-no-properties</span><span class="body"> start end)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> ascii <span class="list">(<span class="title">split-string</span><span class="body"> line <span class="string">";"</span>)</span></span>)</span></span>
<span class="list">(<span class="title">mapc</span><span class="body">
<span class="list">(<span class="title">lambda</span><span class="body"> <span class="list">(<span class="title">code</span><span class="body">)</span></span>
<span class="list">(<span class="title">push</span><span class="body"> <span class="list">(<span class="title">string-to-number</span><span class="body"> code)</span></span> text)</span></span>
)</span></span>
ascii )</span></span>
)</span></span>
<span class="list">(<span class="title">delete-region</span><span class="body"> start end)</span></span>
<span class="list">(<span class="title">insert</span><span class="body"> <span class="list">(<span class="title">apply</span><span class="body"> 'string <span class="list">(<span class="title">reverse</span><span class="body"> text)</span></span>)</span></span>)</span></span>
)</span></span>
)</span></span>
<span class="list">(<span class="title">defun</span><span class="body"> pa<span class="number">23</span>-text<span class="number">2</span>ascii <span class="list">(<span class="body">start end)</span></span>
<span class="string">"Convert text to ASCII codes."</span>
<span class="list">(<span class="title">interactive</span><span class="body"> <span class="string">"r"</span>)</span></span>
<span class="list">(<span class="title">let</span><span class="body"> <span class="list">(<span class="body"><span class="list">(<span class="title">temp</span><span class="body">)</span></span> <span class="list">(<span class="title">ascii</span><span class="body">)</span></span>)</span></span>
<span class="list">(<span class="title">progn</span><span class="body">
<span class="list">(<span class="title">setq</span><span class="body"> temp <span class="list">(<span class="title">string-to-list</span><span class="body"> <span class="list">(<span class="title">buffer-substring-no-properties</span><span class="body"> start end)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">mapc</span><span class="body">
<span class="list">(<span class="title">lambda</span><span class="body"> <span class="list">(<span class="title">code</span><span class="body">)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> ascii <span class="list">(<span class="title">concat</span><span class="body"> ascii <span class="list">(<span class="title">number-to-string</span><span class="body"> code)</span></span> <span class="string">";"</span>)</span></span>)</span></span>
)</span></span>
temp )</span></span>
)</span></span>
<span class="list">(<span class="title">delete-region</span><span class="body"> start end)</span></span>
<span class="list">(<span class="title">insert</span><span class="body"> <span class="list">(<span class="title">substring</span><span class="body"> ascii <span class="number">0</span> <span class="number">-1</span>)</span></span>)</span></span>
)</span></span>
)</span></span></code></pre>
Работа с функциями выглядит следующим образом: выделяем нужный текст, вызываем соответствующую функцию, выделенный текст будет заменен выхлопом функции.</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-33453584688141355922016-08-12T20:21:00.000+03:002016-08-12T20:21:47.663+03:00ICU for Windows (MinGW)<div dir="ltr" style="text-align: left;" trbidi="on">
Для одного из проектов мне потребовался драйвер <a href="http://doc.qt.io/qt-5/sql-driver.html#qsqlite" target="_blank">qsqlite</a> с поддержкой <a href="http://site.icu-project.org/" target="_blank">icu</a>. Разумеется, для пересборки драйвера мне, в данном случае, потребовались также и сами библиотеки icu, которые, ввиду отсутствия необходимых бинарников, пришлось собирать из исходников.<br />
Для тех, кто под Windows тоже использует gcc, я решил выложить бинарники icu на <a href="https://sourceforge.net/projects/icumingw/files/?source=navbar" target="_blank">sourceforge</a>. Пожалуйста, пользуйтесь.</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-36136172950095298802016-04-12T20:06:00.000+03:002016-04-13T19:16:23.697+03:00Arch Linux. Глобальные настройки сглаживания шрифтов<div dir="ltr" style="text-align: left;" trbidi="on">
Похоже, что какое-то из последних обновлений отключило мне сглаживание шрифтов в системе. Я много работаю с текстом, поэтому для меня очень важно, чтобы шрифты выглядели идеально, причем во всех программах.<br />
Для GTK2 мы можем использовать такие удобные конфигураторы как lxappearance или obconf, гномофилы в курсе о gnome-tweak-tool. Но даже если мы зарядим необходимые настройки сглаживания шрифтов во всех этих программах, то тот же Firefox все равно будет выглядеть паршиво.<br />
Что же делать? Понятно что - идти в каталог /etc/fonts. Здесь вы найдете каталог с доступными конфигурациями шрифтов (conf.avail) и каталог с символическими ссылками на используемые системой файлы из этих доступных (conf.d). Мне необходимо было включить полный хинтинг и субпиксельное отображение rgb. Для этого я создал символические ссылки в каталоге /etc/fonts/conf.d на файлы /etc/fonts/conf.avail/10-hinting-full.conf и /etc/fonts/conf.avail/10-sub-pixel-rgb.conf. Вот и все. Теперь у меня опять все четко.</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-78848779472273627442016-04-11T17:02:00.000+03:002016-04-11T17:02:53.780+03:00Emacs. Горячие клавиши в русской раскладке<div dir="ltr" style="text-align: left;" trbidi="on">
Для использования горячих клавиш emacs в русской раскладке клавиатуры необходимо добавить в файл конфигурации следующий код
<br />
<pre><code class="lisp"><span class="list">(<span class="title">defun</span><span class="body"> cfg<span class="keyword">:reverse-input-method</span> <span class="list">(<span class="title">input-method</span><span class="body">)</span></span>
<span class="string">"Build the reverse mapping of single letters from INPUT-METHOD."</span>
<span class="list">(<span class="title">interactive</span><span class="body">
<span class="list">(<span class="title">list</span><span class="body"> <span class="list">(<span class="title">read-input-method-name</span><span class="body"> <span class="string">"Use input method (default current): "</span>)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">if</span><span class="body"> <span class="list">(<span class="title">and</span><span class="body"> input-method <span class="list">(<span class="title">symbolp</span><span class="body"> input-method)</span></span>)</span></span>
<span class="list">(<span class="title">setq</span><span class="body"> input-method <span class="list">(<span class="title">symbol-name</span><span class="body"> input-method)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">let</span><span class="body"> <span class="list">(<span class="body"><span class="list">(<span class="title">current</span><span class="body"> current-input-method)</span></span>
<span class="list">(<span class="title">modifiers</span><span class="body"> <span class="quoted">'(nil (control) (meta) (control meta))</span>)</span></span>)</span></span>
<span class="list">(<span class="title">when</span><span class="body"> input-method
<span class="list">(<span class="title">activate-input-method</span><span class="body"> input-method)</span></span>)</span></span>
<span class="list">(<span class="title">when</span><span class="body"> <span class="list">(<span class="title">and</span><span class="body"> current-input-method quail-keyboard-layout)</span></span>
<span class="list">(<span class="title">dolist</span><span class="body"> <span class="list">(<span class="title">map</span><span class="body"> <span class="list">(<span class="title">cdr</span><span class="body"> <span class="list">(<span class="title">quail-map</span><span class="body">)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">let*</span><span class="body"> <span class="list">(<span class="body"><span class="list">(<span class="title">to</span><span class="body"> <span class="list">(<span class="title">car</span><span class="body"> map)</span></span>)</span></span>
<span class="list">(<span class="title">from</span><span class="body"> <span class="list">(<span class="title">quail-get-translation</span><span class="body">
<span class="list">(<span class="title">cadr</span><span class="body"> map)</span></span> <span class="list">(<span class="title">char-to-string</span><span class="body"> to)</span></span> <span class="number">1</span>)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">when</span><span class="body"> <span class="list">(<span class="title">and</span><span class="body"> <span class="list">(<span class="title">characterp</span><span class="body"> from)</span></span> <span class="list">(<span class="title">characterp</span><span class="body"> to)</span></span>)</span></span>
<span class="list">(<span class="title">dolist</span><span class="body"> <span class="list">(<span class="title">mod</span><span class="body"> modifiers)</span></span>
<span class="list">(<span class="title">define-key</span><span class="body"> local-function-key-map
<span class="list">(<span class="title">vector</span><span class="body"> <span class="list">(<span class="title">append</span><span class="body"> mod <span class="list">(<span class="title">list</span><span class="body"> from)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">vector</span><span class="body"> <span class="list">(<span class="title">append</span><span class="body"> mod <span class="list">(<span class="title">list</span><span class="body"> to)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">when</span><span class="body"> input-method
<span class="list">(<span class="title">activate-input-method</span><span class="body"> current)</span></span>)</span></span>)</span></span>)</span></span>
<span class="list">(<span class="title">cfg</span><span class="body"><span class="keyword">:reverse-input-method</span> 'russian-computer)</span></span></code></pre>
<br />
Данное решение было найдено здесь <a href="http://reangdblog.blogspot.com/2015/05/emacs.html">http://reangdblog.blogspot.com/2015/05/emacs.html</a></div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-44381767875149769362016-03-21T21:34:00.000+03:002017-04-23T21:07:38.087+03:00QSqlRelationalTableModel и setFilter()<div dir="ltr" style="text-align: left;" trbidi="on">
При использовании класса QSqlRelationalTableModel для работы с таблицей БД, содержащей внешние ключи, я столкнулся с проблемой установки фильтров посредством функции setFilter(). К сожалению, документация Qt не изобилует объяснениями по работе с данной функцией (что для Qt весьма нетипично), а стоило бы кое-что прояснить...<br />
Особенность заключается в том, что для фильтрации данных по столбцу, для которого вы установили, к примеру
<br />
<pre><code class="cpp">my_relation_table_model->setRelation(<span class="number">3</span>, QSqlRelation(<span class="string">"customers"</span>, <span class="string">"id"</span>, <span class="string">"name"</span>));</code></pre>
фильтр будет выглядеть следующим образом
<br />
<pre><code class="cpp">my_relation_table_model->setFilter(<span class="string">"relTblAl_3.name='"</span> + some_text + <span class="string">"'"</span>);</code></pre>
Вы поняли? Такая дикая неочевидность, да еще и никак не отраженная в документации, меня весьма удивила.<br />
<br />
Спасибо <a href="http://www.databasesql.info/article/4635259296/" target="_blank"><b>вот этой заметке</b></a>. Сам бы я долго гадал.
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-90921167270487912942016-03-21T21:18:00.000+03:002016-03-21T21:20:13.942+03:00Qt. Деактивация консольного окна в приложении с GUI<div dir="ltr" style="text-align: left;" trbidi="on">
Если по каким-либо причинам запуск вашего приложения с GUI на Qt происходит совместно с консольным окном (случается под Windows, например, при использовании функционала из модуля testlib), а оно вам совсем не надо, то не отчаивайтесь, все поправимо ) Для деактивации консольного окна необходимо добавить в файл проекта следующие указания
<pre><code class="bash">QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,windows</code></pre>
</div>pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-39790851845230186062016-03-21T20:55:00.000+03:002016-03-21T20:55:42.412+03:00sqlite и таблицы с внешними ключами<div dir="ltr" style="text-align: left;" trbidi="on">
Если вы столкнулись с тем, что у вас не работают внешние ключи в базе данных sqlite, то я более, чем уверен, что вы забыли о том, что первым запросом к такой БД должен быть
<pre><code class="sql"><span class="operator"><span class="keyword">PRAGMA</span> foreign_keys=<span class="keyword">ON</span></span></code></pre>
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-32287118299622974502016-03-21T20:51:00.000+03:002016-03-21T20:51:03.323+03:00sqlite. Экспорт и импорт данных на примерах<div dir="ltr" style="text-align: left;" trbidi="on">
В данной заметке я хочу привести примеры экспорта и импорта данных при работе с sqlite. Будем использовать утилиту sqlite3.<br />
<br />
Пример экспорта таблиц базы в файлы формата csv.<br />
<pre><code class="bash">[pa23@pa23comp 1]$ sqlite3 my_database.db
SQLite version 3.11.1 2016-03-03 16:17:53
Enter ".help" for usage hints.
sqlite> .tables
table1 table2
sqlite> .header on
sqlite> .mode csv
sqlite> .once table1.csv
sqlite> select * from table1;
sqlite> .once table2.csv
sqlite> select * from table2;
sqlite> .exit
[pa23@pa23comp 1]$ ls
my_database.db table1.csv table2.csv
[pa23@pa23comp 1]$ </code></pre>
Пример импорта данных из файлов csv в таблицы базы.<br />
<pre><code class="bash">[pa23@pa23comp 1]$ ls
my_database.db table1.csv table2.csv
[pa23@pa23comp 1]$ sqlite3 my_database.db
SQLite version 3.11.1 2016-03-03 16:17:53
Enter ".help" for usage hints.
sqlite> .tables
table1 table2
sqlite> .mode csv
sqlite> .import table1.csv table1
sqlite> .import table2.csv table2
sqlite> .exit
[pa23@pa23comp 1]$
</code></pre>
Пример сохранения схемы базы данных в файл sql.
<pre><code class="bash">[pa23@pa23comp 1]$ ls
my_database.db
[pa23@pa23comp 1]$ sqlite3 my_database.db .schema > my_database_schema.sql
[pa23@pa23comp 1]$ ls
my_database.db my_database_schema.sql
[pa23@pa23comp 1]$ cat my_database_schema.sql
CREATE TABLE table1 (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
CREATE TABLE table2 (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
[pa23@pa23comp 1]$ </code></pre>
Пример полного бэкапа базы данных в файл sql (схема и данные).
<pre><code class="bash">[pa23@pa23comp 1]$ ls
my_database.db my_database_schema.sql
[pa23@pa23comp 1]$ sqlite3 my_database.db .dump > my_database_dump.sql
[pa23@pa23comp 1]$ ls
my_database.db my_database_dump.sql my_database_schema.sql
[pa23@pa23comp 1]$ cat my_database_dump.sql
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE table1 (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
INSERT INTO <span class="string">"table1"</span> VALUES(1,<span class="string">'Yaroslavl'</span>);
INSERT INTO <span class="string">"table1"</span> VALUES(2,<span class="string">'Vologda'</span>);
INSERT INTO <span class="string">"table1"</span> VALUES(3,<span class="string">'Kostroma'</span>);
INSERT INTO <span class="string">"table1"</span> VALUES(4,<span class="string">'Ivanovo'</span>);
CREATE TABLE table2 (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
INSERT INTO <span class="string">"table2"</span> VALUES(1,<span class="string">'Volga'</span>);
INSERT INTO <span class="string">"table2"</span> VALUES(2,<span class="string">'Toshnya'</span>);
INSERT INTO <span class="string">"table2"</span> VALUES(3,<span class="string">'Kostroma'</span>);
INSERT INTO <span class="string">"table2"</span> VALUES(4,<span class="string">'Uvod'</span>);
COMMIT;
[pa23@pa23comp 1]$ </code></pre>
Пример восстановления базы данных из скрипта sql.
<pre><code class="bash">[pa23@pa23comp 1]$ ls
my_database.db my_database_dump.sql my_database_schema.sql
[pa23@pa23comp 1]$ sqlite3 my_new_database.db
SQLite version 3.11.1 2016-03-03 16:17:53
Enter ".help" for usage hints.
sqlite> .read my_database_schema.sql
sqlite> .exit
[pa23@pa23comp 1]$ </code></pre>
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com3tag:blogger.com,1999:blog-6363995193211392830.post-5478349145963798742016-03-11T22:23:00.000+03:002016-03-11T22:23:44.784+03:00Emacs Lisp. HEX to DEC and DEC to HEX<div dir="ltr" style="text-align: left;" trbidi="on">
Последнее время частенько требуется по-быстрому перевести значения каких-нибудь параметров из hex в dec или наоборот. Наш самый надежный друг и товарищ Emacs всегда под рукой, а его служебный буфер *scratch*, в котором можно выполнять код Emacs Lisp, всегда готов услужить. Калькуляторами я не пользуюсь давно, ибо с помощью Emacs прикинуть какие-то цифры весьма и весьма удобно. И не только прикинуть, а еще и сконвертировать из одной системы счисления в другую. Да, я знаю о встроенном в Emacs калькуляторе, но работать с кодом Emacs Lisp, лично мне, как-то удобнее.<br />
Итак, для того, чтобы преобразовать десятичное число в шестнадцатеричное или наоборот, следует воспользоваться встроенной в Emacs Lisp функцией format. Привожу примеры ее использования.<br />
<pre><code class="lisp"><span class="list">(<span class="title">format</span><span class="body"> <span class="string">"%d"</span> <span class="number">#x07d0</span>)</span></span>
<span class="string">"2000"</span>
<span class="list">(<span class="title">format</span><span class="body"> <span class="string">"%x"</span> <span class="number">505</span>)</span></span>
<span class="string">"1f9"</span>
<span class="list">(<span class="title">format</span><span class="body"> <span class="string">"%04x"</span> <span class="number">505</span>)</span></span>
<span class="string">"01f9"</span>
<span class="list">(<span class="title">upcase</span><span class="body"> <span class="list">(<span class="title">format</span><span class="body"> <span class="string">"%04x"</span> <span class="number">505</span>)</span></span>)</span></span>
<span class="string">"01F9"</span></code></pre>
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-82178453301749708062015-06-07T23:58:00.000+03:002015-06-07T23:58:57.458+03:00Релиз mixan-2.4.4<div dir="ltr" style="text-align: left;" trbidi="on">
Изменений не так много. Обеспечена поддержка последней версии qwt и обновлено руководство пользователя, внесены некоторые поправки в файл проекта. Сборка для windows выполнена с использованием последних версий Qt4 и qwt.<div>
Исходный код доступен здесь <a href="https://github.com/pa23/mixan" target="_blank">https://github.com/pa23/mixan</a>, а сборка для windows - здесь <a href="https://sourceforge.net/projects/mixan/files/v2.4.4/" target="_blank">https://sourceforge.net/projects/mixan/files/v2.4.4/</a>.</div>
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-19534579256592863042015-06-07T15:46:00.001+03:002015-06-07T15:47:48.377+03:00emacs multiple cursors<div dir="ltr" style="text-align: left;" trbidi="on">
Что же еще может эта потрясающая программа? Как насчет множественных курсоров? Очень удобную реализацию предоставляет пакет multiple cursors, который можно установить, например, из репозитория melpa. Делюсь статьей с описанием <a href="http://pragmaticemacs.com/emacs/multiple-cursors/" target="_blank">http://pragmaticemacs.com/emacs/multiple-cursors/</a> и интересным видео с дополнительными примерами <a href="http://www.youtube.com/watch?v=jNa3axo40qM" target="_blank">http://www.youtube.com/watch?v=jNa3axo40qM</a>.</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-71905483145162198672015-04-26T17:50:00.000+03:002015-04-26T17:50:12.118+03:00Релиз reup-1.7.0<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="text-align: center;">
<span style="font-size: large;"><b><a href="https://sourceforge.net/projects/reup/files/v1.7.0/" target="_blank">СКАЧАТЬ</a></b></span> </div>
</div>
<br />
В данной версии reup добавлен код, обеспечивающий работу с новым каталогом dat, в котором будут храниться калибровки (патчи) в формате ДК-5.</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-69744913223497368612015-04-25T19:23:00.000+03:002015-04-25T19:23:50.411+03:00Чиним Cheese после обновления Gnome до версии 3.16<div dir="ltr" style="text-align: left;" trbidi="on">
Как-то так получилось, что после обновления Gnome до версии 3.16 Cheese перестал работать. Запускается, но камеру не включает и выдает сообщение, что ему не хватает модуля cluttervideosink. И это при том, что в системе установлены: clutter, clutter-gst и clutter-gst2. Решение было найдено на одном из <a href="https://bbs.archlinux.org/viewtopic.php?pid=1522558#p1522558" target="_blank">форумов</a>.<br />
Итак, для того, чтобы все заработало как прежде, необходимо сделать 2 вещи:
<br />
<ol style="text-align: left;">
<li>удалить пакет clutter-gst;</li>
<li>удалить каталог ~/.cache/gstreamer-1.0.</li>
</ol>
<div>
После вышеуказанных манипуляций наш Cheese снова работает.</div>
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-21660676754343403472015-02-06T15:37:00.000+03:002015-02-06T15:37:06.307+03:00Манипуляции с PDF<div dir="ltr" style="text-align: left;" trbidi="on">
Время от времени возникает необходимость выполнения таких действий, как сборка нескольких PDF в один или извлечение из PDF отдельных страниц. Как оказалось, пакет poppler (в Arch Linux он присутствует в штатном репозитории extra) содержит такие замечательные и простые в использовании утилиты как pdfunite и pdfseparate. Первая из них позволяет собирать PDF из нескольких. Пример использования может выглядеть так.<br />
<pre><code class="bash">pdfunite chapter*.pdf book.pdf</code></pre>
Вторая же позволит извлечь необходимые страницы из документа. Например, таким вот образом.<br />
<pre><code class="bash">pdfseparate book.pdf -f 100 -l 102 page_%d.pdf</code></pre>
Такая команда позволить извлечь из документа book.pdf страницы с 100-й по 102-ю, каждая из которых окажется в отдельном PDF, имя которого задано шаблоном page_%d.pdf.<br />
Вот, собственно, и все.</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-46717254700827513442015-01-14T01:48:00.001+03:002015-01-14T01:48:24.803+03:00Пакетное конвертирование изображений с рекурсивным обходом каталогов<div dir="ltr" style="text-align: left;" trbidi="on">
Еще одни полезный однострочничек, по аналогии с <a href="http://pa2311.blogspot.ru/2014/11/flac-ogg.html" target="_blank">flac в ogg без лишней возьни с мышью и окошками</a>, на сей раз конвертирующий изображения из одного формата в другой (например, из tif в jpg) с рекурсивным обходом каталогов. Обход каталогов (от текущего) с поиском файлов для обработки выполняется с помощью утилиты find, а конвертирование изображений - с помощью утилиты mogrify из пакета imagemagick.<br />
<pre><code class="bash">find . -name <span class="string">"*.tif"</span> -exec mogrify -format jpg {} \;</code></pre>
</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0tag:blogger.com,1999:blog-6363995193211392830.post-48792442388571730862015-01-11T15:28:00.000+03:002015-04-26T17:46:42.502+03:00Релиз reup-1.6.0<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="text-align: center;">
<span style="font-size: large;"><b><a href="https://sourceforge.net/projects/reup/files/v1.6.0/" target="_blank">СКАЧАТЬ</a></b></span> </div>
</div>
<br />
Учитывая, что структура имени hex-файлов, с которыми работает reup, узаконена и содержит номер платформы и версию ПО ЭБУ, reup 1.6.0 обновляет идентификацию hex-файла используя эту информацию. Т.о., в файле конфигурации более не требуется указывать адрес массива *_swver* и его длину, а reup отныне может пакетно обрабатывать наборы hex-файлов с различными версиями ПО ЭБУ. Версии ПО, известные reup (986.2.0.0, 766.1.2.0, 772.7.6.0, 772.8.5.1), прописаны в функции k2rei_swver::setECUSW.</div>
pa23http://www.blogger.com/profile/14782802727985121280noreply@blogger.com0