tag:blogger.com,1999:blog-821785256302556482023-06-20T21:59:27.663-07:00Математика, программирование, алгоритмы.Блог о математике, программировании, алгоритмах. И немного о работе операционной системы Linux.Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.comBlogger23125tag:blogger.com,1999:blog-82178525630255648.post-53014994798890082015-07-14T12:40:00.001-07:002015-07-14T12:40:10.602-07:00★ Прочитайте ваше сообщение до того, как оно будет удалено!<div style="max-width: 800px; margin: 0; padding: 15px 0; direction:ltr;"> <table width="80%" border="0" cellpadding="0" cellspacing="0"> <tr> <td width="10%"></td> <td align="left" width="90%" style="font: 13px/18px Arial, sans-serif;"> <div style="color: #666; padding: 0 0 20px; font-size: 13px/18px; line-height: 18px;">See this email in <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=3&g=57-0-1&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010" style="color: #3366cc;">English</a>, <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=5&g=57-1-1&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010" style="color: #3366cc;">Deutsch</a>, <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=6&g=57-2-1&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010" style="color: #3366cc;">Français</a>, <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=8&g=57-3-1&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010" style="color: #3366cc;">Italiano</a>, <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=7&g=57-4-1&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010" style="color: #3366cc;">Español</a>, <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=61&g=57-5-1&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010" style="color: #3366cc;">Português</a> or <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-6-1&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010" style="color: #3366cc;">36 other languages</a>.</div> <h2 style="font: normal 24px/27px Arial, sans-serif; margin: 0; padding: 0 0 18px; color: black;">Егор отправил вам сообщение. Прочитайте его до того, как оно будет удалено!</h2> <br /><br /> <table style="border-collapse: collapse;" cellpadding="0" cellspacing="0"> <tr> <td style="padding-right: 22px;"><a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-7-2&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010"><img src="http://pcache-pv-eu1.badoocdn.com/p5/10252/7/3/3/443921644/d1309855/t1423383030/c_uZIGGhd9vITx4LLwjsiynrknttGSILs8XBSZaoMkOZc/1309855679_medium.jpg" width="72" height="72" border="0" style="background-color: #ebeef1;" alt="" /></a></td> <td><big style="font: 16px/18px Arial, sans-serif;"><b><a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-8-1&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010" style="color: #3366cc;">Прочитать сообщение</a></b></big></td> </tr> </table> <br /> <hr style="height: 1px; color: #e5e5e5;" /> <br /> <big style="font: 13px/18px Arial, sans-serif;">Некоторые люди из вашего региона:</big><br /> <br /> <table style="border-collapse: collapse;" cellpadding="0" cellspacing="0"> <tr> <td style="padding-right: 13px;"><a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-9-2&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010"><img src="http://pcache-pv-eu1.badoocdn.com/p43/10101/7/5/1/261203011/d329/t1433753152/c_njVNIuJsi3Fs0-myK-1BWFlm4mYdBFFeRLetYAm.TZk/329036_mmp.jpg" width="72" height="72" border="0" style="background-color: #ebeef1;" alt="" /></a></td> <td style="font-size: 11px; padding-right: 35px; color: #999; vertical-align: middle;"> <span style="font-size: 14px; color: #333;">Дима</span><br /> Санкт-Петербург, Россия </td> <td style="padding-right: 13px;"><a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-10-2&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010"><img src="http://pcache-pv-eu1.badoocdn.com/p5/10277/7/5/3/462875772/d1312130/t1435798668/c_lCqB7MSu0POu6WhYq4D2bj3ZqEU5pLYVfTYKcuPMAqI/1312130461_mmp.jpg" width="72" height="72" border="0" style="background-color: #ebeef1;" alt="" /></a></td> <td style="font-size: 11px; padding-right: 35px; color: #999; vertical-align: middle;"> <span style="font-size: 14px; color: #333;">Lika</span><br /> Санкт-Петербург, Россия </td> </tr> <tr> <td style="height: 20px;" colspan="4" height="20px"> </td> </tr> <tr> <td style="padding-right: 13px;"><a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-11-2&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010"><img src="http://pcache-pv-eu1.badoocdn.com/p41/10183/8/0/8/469150118/d1312142/t1436456742/c_wvVgd4ghIs7x1HsOxIoIjUchoTah3LnxFIHob2BapVs/1312142931_mmp.jpg" width="72" height="72" border="0" style="background-color: #ebeef1;" alt="" /></a></td> <td style="font-size: 11px; padding-right: 35px; color: #999; vertical-align: middle;"> <span style="font-size: 14px; color: #333;">Anastasiya</span><br /> Москва, Россия </td> </tr> <tr> <td style="height: 20px;" colspan="4" height="20px"> </td> </tr> </table> <br /> <br /> Это письмо является частью процедуры доставки сообщения от Егор. Если вы получили это письмо по ошибке, просто проигнорируйте его. Через некоторое время сообщение будет удалено. <br /> <br /> Удачи!<br /> Команда Badoo <br /><br /> <img src="http://badoocdn.com/55a5659a000000000002004d00000000000000411a75b4ec-3291732004686041616/v2/-/-/i/badoo.16.gif" width="80" height="23" alt="" /> <p style="margin-top:10px;color:#666666;font:13px/18px Arial,sans-serif;">Вы получили это письмо от Badoo Trading Limited (почтовый адрес ниже). Отписаться от уведомлений можно <a href="https://eu1.badoo.com/impersonation.phtml?lang_id=2&email=faraslacks.posting%40blogger.com&block_code=1da6f7&m=65&mid=55a5659a000000000002004d05b5d29a00b18c490010&g=0-0-1" style="color: #3366cc;">здесь</a>.<br /> Badoo Trading Limited - компания с ограниченной ответственностью, зарегистрированная в Англии и Уэльсе под номером CRN 7540255 по юридическому адресу: Media Village, 131 - 151 Great Titchfield Street, London, W1W 5BB. </p> </td> </tr> </table> </div> Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-11514495969145456392015-07-06T11:15:00.001-07:002015-07-06T11:15:06.503-07:00★ Faraslacks Posting, Егор оставил для вас сообщение<table class="o__body" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="m__wrapper" style="width: 800px; margin: 0; padding: 15px 0; direction:ltr;"> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <td align="left" style="font: 13px/18px Arial, sans-serif;" class="m__content"> <center><center style="text-align: left; max-width: 560px; width: 100%;"> <!--[if gte mso 10]> <table border="0" cellpadding="0" cellspacing="0" class="m__table"><tr><td> <![endif]--> <div style="color: #666; padding: 0 0 20px; font-size: 13px/18px; line-height: 18px;" class="m__lang m__padding_b-0 m__padding_t-0">See this email in <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=3&g=57-0-1&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="color: #3366cc;">English</a>, <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=5&g=57-1-1&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="color: #3366cc;">Deutsch</a>, <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=6&g=57-2-1&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="color: #3366cc;">Français</a>, <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=8&g=57-3-1&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="color: #3366cc;">Italiano</a>, <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=7&g=57-4-1&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="color: #3366cc;">Español</a>, <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=61&g=57-5-1&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="color: #3366cc;">Português</a> or <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-6-1&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="color: #3366cc;">36 other languages</a>.</div> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="m__padding_b-15" style="padding:0 0 24px 0;"> <span class="m__body-title m__padding_b-15" style="font: normal 20px/20px Arial, sans-serif; margin: 0; color: #000000 !important;padding-bottom:20px;display:block;direction:ltr;"><b>Егор</b> оставил для вас сообщение</span> <!--[if gte mso 10]><img src="http://p1.badoocdn.com/v2/-/-/i/email_promo/wel_l.14.png" border="0" width="580" height="3"><![endif]--> <table background="http://p1.badoocdn.com/v2/-/-/i/email_promo/wel_l.14.png" style="padding:0;border-collapse:collapse;width:100%;"><tr><td style="padding:0;font-size:0;line-height:3px;"> </td></tr></table> </td> </tr> </table> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="m__content-border m__padding_b-15" style="padding-bottom:25px;border-bottom:1px solid #e5e5e5;"> <table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td class="m__padding_b-10" style="padding-bottom:20px;"> <table align="left"> <tr> <td> <a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-7-2&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="text-decoration:none;"><img class="m__user-big_pic" src="http://pcache-pv-eu1.badoocdn.com/p5/10252/7/3/3/443921644/d1309855/t1423383030/c_uZIGGhd9vITx4LLwjsiynrknttGSILs8XBSZaoMkOZc/1309855679_medium.jpg" alt="" width="120" height="120" style="border:none;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;" /></a> </td> <td width="15%" class="m__user-side"> </td> </tr> </table> <table cellpadding="0" cellspacing="0" style="direction:ltr; border-collapse: collapse;"> <tr><td> <table cellpadding="0" cellspacing="0" background="http://p1.badoocdn.com/v2/-/-/i/email_promo/btn-grd.6.png" bgcolor="#017ac2" style="border-collapse: collapse; background-repeat:repeat-x;"> <tr> <td width="100%" height="5" background="http://p1.badoocdn.com/v2/-/-/i/email_promo/btn-tl.6.png" class="mso-btn__td" style="background-repeat: no-repeat; vertical-align: top; font-size: 0; line-height: 0;"><!--[if gte mso 10]><img src="http://p1.badoocdn.com/v2/-/-/i/email_promo/btn-mso-tl.6.png" alt="" width="5" height="5" border="0"><![endif]--></td> <td width="5" height="5" background="http://p1.badoocdn.com/v2/-/-/i/email_promo/btn-tr.6.png" style="background: url(http://p1.badoocdn.com/v2/-/-/i/email_promo/btn-tr.6.png) no-repeat 100% 0; background-repeat: no-repeat; background-position: 100% 0; vertical-align: top; text-align: right; font-size: 0; line-height:0;"><!--[if gte mso 10]><img src="http://p1.badoocdn.com/v2/-/-/i/email_promo/btn-mso-tr.6.png" alt="" width="5" height="5" border="0"><![endif]--></td> </tr> <tr> <td colspan="2" class="mso-btn__link" style="direction:ltr; text-align: center;"><a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-8-1&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="display: block; padding:6px 20px; border-left: 1px solid #0063A0; border-right: 1px solid #0063A0; text-decoration: none; color: #ffffff; font-weight:700; font-size: 16px; line-height: 20px;"> Открыть сообщение </a></td> </tr> <tr> <td width="100%" height="5" background="http://p1.badoocdn.com/v2/-/-/i/email_promo/btn-bc.6.png" class="mso-btn__td" style="background-repeat: repeat-x; vertical-align: bottom; text-align: left; font-size: 0; line-height: 0;"><img src="http://p1.badoocdn.com/v2/-/-/i/email_promo/btn-bl.6.png" alt="" width="5" height="5" border="0"></td> <td width="5" height="5" background="http://p1.badoocdn.com/v2/-/-/i/email_promo/btn-bc.6.png" style="background-repeat: repeat-x; vertical-align: bottom; text-align: right; font-size: 0; line-height: 0;"><img src="http://p1.badoocdn.com/v2/-/-/i/email_promo/btn-br.6.png" alt="" width="5" height="5" border="0"></td> </tr> </table> </td></tr> </table> <table class="m__width_full" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="m__padding_b-10 m__padding_t-0" style="padding:10px 0 0 0;"> <span class="m__body-txt" style="font-size:15px;"> Вы можете прочитать сообщение и ответить на него через наш чат. </span> </td> </tr> </table> </td></tr></table> <table style="border-collapse: collapse;" cellpadding="0" cellspacing="0" width="100%"> <tr><td class="m__content-border_t" style="border-top: 1px solid #e5e5e5; padding-top: 20px;"> <big style="font: 13px/18px Arial, sans-serif;">Они ждут встречи с вами:</big><br /> <br /> <table border="0" cellpadding="0" cellspacing="0" align="left" ><tr><td style="padding:0;"><a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-9-2&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="text-decoration:none;"><img src="http://pcache-pv-eu1.badoocdn.com/p53/10263/8/2/7/461318111/d1311318/t1432243661/c_-dmakthgFJaxY1ojmVtrITO08bNMPaYTK-qWIzjCpSU/1311318301_mmp.jpg" class="m__user-pic" alt="" width="72" height="72" style="border:none;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;" /></a></td><td> </td></tr></table> <table border="0" cellpadding="0" cellspacing="0" align="left" ><tr><td style="padding:0;"><a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-10-2&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="text-decoration:none;"><img src="http://pcache-pv-eu1.badoocdn.com/p43/10101/7/5/1/261203011/d329/t1433753152/c_njVNIuJsi3Fs0-myK-1BWFlm4mYdBFFeRLetYAm.TZk/329036_mmp.jpg" class="m__user-pic" alt="" width="72" height="72" style="border:none;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;" /></a></td><td> </td></tr></table> <table border="0" cellpadding="0" cellspacing="0" align="left" ><tr><td style="padding:0;"><a href="http://eu1.badoo.com/0443921644/in/j.dGGR26Fx4/?lang_id=2&g=57-11-2&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c" style="text-decoration:none;"><img src="http://pcache-pv-eu1.badoocdn.com/p5/10277/7/5/3/462875772/d1311343/t1433714277/c_ppruyieDwh9KkD.KnCWr0FRgn9UFK5KKvxGRZUQvofY/1311343377_mmp.jpg" class="m__user-pic" alt="" width="72" height="72" style="border:none;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;" /></a></td><td> </td></tr></table> </td> </tr> </table> <br /> </td></tr></table> <!--[if gte mso 10]> </td></tr></table> <![endif]--> </center></center><br /> <center><center style="text-align: left; max-width: 560px; width: 100%;"> <!--[if gte mso 10]> <table border="0" cellpadding="0" cellspacing="0" class="m__table"><tr><td> <![endif]--> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="m__padding_b-15" width="90%" style="padding-bottom:40px;"> До скорого!<br /> Команда Badoo </td> <td class="m__padding_b-15" style="padding-bottom:40px;"><img src="http://badoocdn.com/559ac5a9000000000002004d000000000000001d1a75b4ec-3267807151010116108/v2/-/-/i/badoo.16.gif" width="80" height="23" alt="" /></td> </tr> </table> <!--[if gte mso 10]> </td></tr></table> <![endif]--> </center></center> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr><td class="m__footer" style="padding:30px 10px; background: #f2f2f2;" colspan="3"> <center><center style="text-align: left; max-width: 560px; width: 100%;"><table border="0" cellpadding="0" cellspacing="0" class="m__table"> <tr> <td> <span style="color:#666666;font:13px/18px Arial,sans-serif;">Вы получили это письмо от Badoo Trading Limited (почтовый адрес ниже). Отписаться от уведомлений можно <a href="https://eu1.badoo.com/impersonation.phtml?lang_id=2&email=faraslacks.posting%40blogger.com&block_code=1da6f7&m=29&mid=559ac5a9000000000002004d05ab32a901273839000c&g=0-0-1" style="color: #3366cc;">здесь</a>.<br /> Badoo Trading Limited - компания с ограниченной ответственностью, зарегистрированная в Англии и Уэльсе под номером CRN 7540255 по юридическому адресу: Media Village, 131 - 151 Great Titchfield Street, London, W1W 5BB. </span> </td> </tr> </table> </center></center> </td></tr> </table> </td> </tr> </table> </td> </tr> </table> Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-70000475776206211012012-01-11T23:54:00.000-08:002012-01-11T23:54:57.448-08:00Tips & Tricks #6. Вывод текущей ветки git в приглашение командной строки bash. Ubuntu 10.04.<div dir="ltr" style="text-align: left;" trbidi="on">
Для того, чтобы приглашение командной строки <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">bash</span> отображало текущую ветку <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">git</span>, в случае если текущая папка содержит git-репозиторий нужно изменить переменную окружения PS1.<br />
Я решил эту проблему следующим образом. В корне домашней директории создал скрипт <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">gitbranch.sh</span> следующего содержания:<br />
<pre class="brush:shell">#!/bin/bash
GIT_BR=`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`
if [ "$GIT_BR" = "" ]; then
echo -n
else
echo -n "($GIT_BR)"
fi
</pre>
Этот скрипт возвращает название ветки в том случае, если текущая папка содержит репозиторий. Осталось только вписать его в нужное место в переменную <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PS1</span>. В файле .bashrc, в домашнем каталоге нужно найти строчку инициализации переменной <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">PS1</span>. У меня это строка 52 и выглядит она так:
<br />
<pre class="brush:shell">if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[1;32m\]\u@\h\[\e[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
</pre>
Здесь строки вида <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">\[\033[1;31m\]</span> — это escape-последовательности задающие цвет. Нужно вставить в строку инициализации вызов созданного нами скрипта. Поскольку у меня подсветка shell-а включена, я менял первую строку. После изменения этот кусок кода стал выглядеть вот так:
<br />
<pre class="brush:shell">if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\e[1;32m\]\u@\h\[\e[1;31m\] `~/gitbranch.sh`\[\e[00m\]:\[\e[01;34m\]\w\[\e[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
</pre>
Символы <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">\e</span> — это краткая запись <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">\033</span>.
После сохранения говорим:
<br />
<pre>source ~/.bashrc
</pre>
И вуаля! У меня это выглядит так:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-pq2lCNsuI4I/Tw6RbD0Bx9I/AAAAAAAAAVc/NQ_R4EW7xd8/s1600/git_highlight.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-pq2lCNsuI4I/Tw6RbD0Bx9I/AAAAAAAAAVc/NQ_R4EW7xd8/s1600/git_highlight.png" /></a></div>
<br /></div>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-6861690133401732262011-10-27T02:10:00.000-07:002012-01-09T04:19:48.296-08:00graphviz, dot2tex, tikz: вставка графов прямо в тело LaTeX документа (TeXLive, Ubuntu 10.04).<div dir="ltr" style="text-align: left;" trbidi="on">
Изветсно, что LaTeX является de-facto стандартом оформления научной (особенно математической, физической и химической) документации. В случае с математикой (особенно дискретной), возникает острая потребность вставки изображений графов в текст документа. Обычно, для визуализации графов используется <a href="http://www.graphviz.org/">набор утилит graphviz</a>, который использует для описания графа свой, простой в изучении, <a href="http://www.graphviz.org/content/dot-language">язык DOT</a>, но для того, чтобы вставить в LaTeX документ граф, нужно сначала создать файл с описанием графа, потом скомпилировать его, а потом только вставить картинку в документ. Для автоматизации этого процесса создан пакет dot2texi, который использует утилиту dot2tex.<br />
<br />
Положим, что у нас есть LaTeX документ, со стандартной преамбулой:
<br />
<pre>% Задает класс документа, размер шрифта, и двустороннюю разметку
\documentclass[12pt,a4paper,twoside]{book}
% Указывает на то, что будет использована кодировка UTF-8
\usepackage[utf8x]{inputenc}
% Включает пакет babel с поддержкой русского и английского языков
\usepackage[english,russian]{babel}
% Добавляет пакет asmmath (Ameriacn Mathematical Society)
\usepackage{amsmath}
% Дает возможность включать в документ графику
\usepackage[dvips]{graphicx}
\begin{document}
\end{document}
</pre>
Прямо перед <code>\begin{document}</code> мы вставляем следующие строки:
<br />
<pre>\usepackage{dot2texi}[dot,mathmode]
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
</pre>
После чего в документе, то есть между <code>\begin{document}</code> и <code>\end{document}</code> можем вставлять следующее:
<br />
<pre>\begin{dot2tex}
digraph G {
x_1 -> x_2;
x_1 -> x_3;
}
\end{dot2tex}
</pre>
То что стоит между <code>\begin{document}</code> и <code>\end{document}</code> является записью структуры графа на языке DOT.
Теперь давайте разберемся. <code>dot2texi</code> — пакет, который переводит запись на языке DOT в TeX представление, а <code>tikz</code> — пакет все это отрисовывающий.
Я пользовался пакетом <code>texlive</code> на Ubuntu 10.04. При установке всего этого я столкнулся со следующими проблемами:<br />
<ol style="text-align: left;">
<li>Пакет dot2texi не установлен (LaTeX предлагал мне указать где лежит файл стиля *.sty). Для устранения этой ошибки нужно поставить пакет <span class="Apple-style-span" style="font-family: monospace;">texlive-pictures</span><pre>sudo apt-get install texlive-pictures</pre>
</li>
<li>Также нужно поставить пакет <span class="Apple-style-span" style="font-family: monospace;">texlive-pstricks</span><span class="Apple-style-span" style="font-family: inherit;">.</span></li>
<li>
При попытке компиляции файла выдавалась ошибка: <code>Package dot2texi Warning: Conversion of latex-dot2tex-fig1.dot failed..</code>. Я точно не знаю почему возникает эта ошибка (почему-то при запуске из TeX-скриптов не получается найти утилиту dot2tex), но она решается добавлением аттрибута <code>--shell-escape</code> к команде <code>latex</code>, то есть результирующая строка будет выглядеть так:
<pre>latex --shell-escape your_filename.tex
</pre>
</li>
<li>
Я не помню зачем, но мне понадобилось установить пакет <code>texlive-latex-extras</code>. Но если вы постоянно пользуетесь LaTeX для верстки документов, то у вас он, скорее всего уже стоит.
</li>
<li>Были обнаружены проблемы при работе с утилитой <span class="Apple-style-span" style="font-family: monospace;">dvipdfm</span><span class="Apple-style-span" style="font-family: inherit;">. Вместо нее нужно использовать </span><span class="Apple-style-span" style="font-family: monospace;">dvipdf</span><span class="Apple-style-span" style="font-family: inherit;">.</span></li>
</ol>
Для правильной работы пакета <code>dot2texi</code> нужно, чтобы была установлена утилиты <code>dot2tex</code> и <code>graphviz</code>. Они присутствуют в стандартном репозитории.
<code>dot2tex</code>-у можно задать параметры, например, каким визуализатором графов из набора <code>graphviz</code> пользоваться. В нашем случае это <code>dot</code>. Подробнее о работе пакета <code>dot2texi</code> можно почитать в <a href="http://mirror.macomnet.net/pub/CTAN/macros/latex/contrib/dot2texi/dot2texi.pdf">официальном руководстве</a>.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
</div>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com2tag:blogger.com,1999:blog-82178525630255648.post-70713453649108167412011-10-22T21:08:00.000-07:002011-10-22T21:09:52.994-07:00Tips & Tricks #5. Создание анимации. Соединение кадров в видеопоток.<div dir="ltr" style="text-align: left;" trbidi="on">
Для того, чтобы соединить отдельные кадры (например кадры вашего собственного мультика :) в видеопоток (с заданым FPS) можно использовать грандиозную по своей мощности утилиту <a href="http://en.wikipedia.org/wiki/MEncoder">mencoder</a>. Предполагается, что все кадры уже лежат в отдельной папке и названы «по порядку» Зайдите в папку из командной строки и скажите:
<br />
<pre>mencoder "mf://*.jpg" -mf fps=30 -o output.avi -ovc lavc -lavcopts vcodec=mpeg4
</pre>
Строкой "mf://*.jpg" вы задаете маску файлов, которые будут соединяться в видео, -mf fps=30, задает количество кадров в секунду, -o output.avi говорит утилите, что результат нужно положить в файл output.avi. Остальные параметры расшифровываются следующим образом: -ovc lavc, устанавливает, что для кодирования будет использоваться кодек libavcodec, а -lavcopts vcodec=mpeg4 говорит, что видео будет кодироваться в MPEG-4.
Под Ubuntu Linux утилита устанавливается стандартно:
<br />
<pre>sudo apt-get install mencoder
</pre>
Под Windows можно скачать <a href="http://www.mplayerhq.hu/design7/dload.html">MPlayer</a>, в составе которого она идет.
</div>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-12383558150519960342011-10-22T05:57:00.000-07:002011-10-23T01:06:17.926-07:00Утечки памяти, malloc и valgrind.<div dir="ltr" style="text-align: left;" trbidi="on">
Утечки памяти — это ситуации, при которых выделенная в процессе выполнения программы память не освобождается, а указатель на эту память затирается. Вообще говоря, существует два базовых способа отладки как таковой. Отладка с исползованием сторонних средств (таких, например, как <a href="http://www.gnu.org/s/gdb/">GDB</a>) и отладка с использованием отладочных выводов (MessageBox-ами или выводом в консоль).<br />
<br />
<span style="font-size: xx-small;"><i>Способ первый.</i></span><br />
Для локализации утечек памяти под Linux-ом (для программ скомпилированных GCC) есть прекрасное средство valgrind. Для того, чтобы проанализировать приложение нужно сделать следующее:<br />
<pre>valgrind --tool=memcheck --leak-check=full --log-file=<log file name> <program name></pre>
Здесь <log file name> имя файла в который будет записан вывод анализатора, а <program name> — название вашего приложения (и путь к нему). Стоит отметить, что для того, чтобы valgrind смог произвести анализ, нужно, чтобы ваше приложение было собрано с отладочной информацией для отладчика GDB (ключ -g компилятора). Так же стоит заметить, что valgrind запускает приложение в собственной виртуальной среде, что позволяет отследить все ошибки сегментации (приложение не вылетит, и закончит свое выполнение).
Вывод valgrind-а имеет примерно следующий вид:<br />
<pre>==5454== Memcheck, a memory error detector
==5454== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==5454== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==5454== Command: ./calc
==5454== Parent PID: 3856
==5454==
==5454==
==5454== HEAP SUMMARY:
==5454== in use at exit: 252 bytes in 24 blocks
==5454== total heap usage: 60,776 allocs, 60,752 frees, 269,156 bytes allocated
==5454==
==5454== 126 (16 direct, 110 indirect) bytes in 1 blocks are definitely lost in loss record 7 of 8
==5454== at 0x402425F: calloc (vg_replace_malloc.c:467)
==5454== by 0x80498CA: allocateMatrix (calc.c:476)
==5454== by 0x804981E: loadMatrix (calc.c:454)
==5454== by 0x8049F15: main (calc.c:669)
==5454==
==5454== 126 (16 direct, 110 indirect) bytes in 1 blocks are definitely lost in loss record 8 of 8
==5454== at 0x402425F: calloc (vg_replace_malloc.c:467)
==5454== by 0x80498CA: allocateMatrix (calc.c:476)
==5454== by 0x804981E: loadMatrix (calc.c:454)
==5454== by 0x8049F25: main (calc.c:670)
==5454==
==5454== LEAK SUMMARY:
==5454== definitely lost: 32 bytes in 2 blocks
==5454== indirectly lost: 220 bytes in 22 blocks
==5454== possibly lost: 0 bytes in 0 blocks
==5454== still reachable: 0 bytes in 0 blocks
==5454== suppressed: 0 bytes in 0 blocks
==5454==
==5454== For counts of detected and suppressed errors, rerun with: -v
==5454== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 20 from 7) </pre>
Здесь число стоящее между символами «==» — это PID потока, а блоки которые начинаются с числа 126 — сообщения о найденых утечках памяти. 126 здесь — это число утеряных байт, а ниже приведен стек вызовов, который привел к утечке. В каждой строчке стека вызовов есть информация о том, в каком файле и в какой строке был сделан данный вызов. Ниже приводится ссумарная информация об ошибках и утечках. Подробнее про valgrind можно прочитать на <a href="http://valgrind.org/">официальном сайте (англ.)</a>.<br />
<br />
<span style="font-size: xx-small;"><i>Способ второй.</i></span><br />
Однако, если программа мала или нет возможности использовать valgrind, можно воспользоваться более «низкоуровневым» способом отладки. Если ваша программа написана на C, с использованием стандартного malloc, тогда вы в любой момент времени, можете спросить сколько памяти уже выделено malloc-ом. Для этого используется структура mallinfo. Работу с ней можно организовать, например, таким образом:
<br />
<pre class="brush:c">#include <malloc.h>
int
main()
{
struct mallinfo info;
info = mallinfo();
printf("%d\n", info.uordblks);
/**
* Здесь происходит что-то, через что течет память.
*/
printf("%d\n", info.uordblks);
return 0;
}</pre>
Функция mallinfo возвращает информацию о работе менеджера памяти в <a href="http://www.delorie.com/gnu/docs/glibc/libc_35.html">структуру mallinfo</a>. Эта структура содержит поле uordblks, которое хранит количество байт, которое было выделено malloc.
</div>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-7440069984852104212011-10-18T22:22:00.000-07:002011-10-22T02:51:38.765-07:00CSS, HTML, vertical-align и все точки над i.<div dir="ltr" style="text-align: left;" trbidi="on">
HTML-верстка окутана туманом путаницы и тайны. Мне очень долго не давал покоя вопрос: «Почему, в некоторых случаях выравнивание по вертикали работает, а в некоторых нет». Начнем с того, что выравнивание по вертикали можно задать двумя способами. Указав атрибут элемента <span style="color: #990000;">valign</span> элемента, которому вы задаете выравнивание, или указать свойство CSS <span style="color: #990000;">vertical-align</span>. Оба этих параметра могут принимать значения <span style="color: #990000;">'baseline|bottom|middle|sub|super|text-bottom|text-top|top|inherit'</span>. Не буду вдаваться в подробности относительно каждого из них, тут все итак понятно. Важнее то, что выравнивание по высоте работает не всегда. В качестве разъяснения привожу перевод одной коротенькой статейки.
HTML элементы бывают блочными (block) и строчными (inline). Блочные элементы характеризуются тем, что:
<br />
<ul>
<li>Они всегда переносятся на новую строку.</li>
<li>У них можно задать высоту, высоту линии, а также верхнюю и нижнюю границы.</li>
<li>Ширина равна 100% ширины родительского элемента, если не задана отдельно.</li>
</ul>
Примерами блочных элементов могут служить <span style="color: #990000;"><div>, <p>, <h1>, <form>, <ul></span> и <span style="color: #990000;"><li></span>. Строчные элементы, с другой стороны, являются противоположностью блочным:
<br />
<ul>
<li>Они начинаются на той же строке. </li>
<li>У них невозможно задать высоту, высоту строки, а также верхнюю и нижнюю границы.</li>
<li>Ширина равна ширине текста/картинки и не может быть изменена.</li>
</ul>
Примерами строчных элементов могут являться <span style="color: #990000;"><span>, <a>, <label>, <input>, <img>, <strong></span> и <span style="color: #990000;"><em></span>. Для того, чтобы сменить тип элемента, вы можете использовать CSS-свойство <span style="color: #990000;">display: inline</span> или <span style="color: #990000;">display: block</span>. Но какой смысл делать блочный элемент строчным или наоборот? Ну, поначалу сложно представить, зачем использовать этот прием, но на самом деле это очень мощная техника, которая может быть использована когда вы хотите:
<br />
<ul>
<li>Заставить строчный элемент начинаться с новой строки.</li>
<li>Заставить блочный элемент оставаться на той же строке.</li>
<li>Менять ширину строчных элементов (иногда полезно для навигационных ссылок).</li>
<li>Менять высоту строчных элементов.</li>
<li>Установить фоновый цвет на всю ширину текста для блочных элементов, не без необходимости задавать ширину.</li>
</ul>
</div>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-24215730982386541512011-10-18T01:20:00.000-07:002011-10-18T01:24:36.671-07:00Tips & Tricks #4. Функция переводящая координаты Excel ячейки во внутренний адрес<div dir="ltr" style="text-align: left;" trbidi="on">
Недавно, волею судеб, мне пришлось писать Excel-приложение. В процессе работы с таблицей, очень часто возникает необходимость обращаться к ячейкам или диапазонам по их адресу. Иногда удобнее обращаться к ячейкам по координатам. Почему-то мне не удалось использовать формат адресов "R1C1". При попытке сказать:<br />
<pre class="brush:vb">
Worksheets(1).Range("R1C1").Value = "Hello, World"
</pre>
вылезала ошибка номер 1004 "Application-defined or object-defined error". В голову пришла идея написать функцию для преобразования координат ячейки или диапазона в его классическое Excel пердставление (знаменитые "A1:B2"). В общем-то вот она. Может быть кому-нибудь пригодится.
<pre class="brush:vb">
' Возвращает Excel адрес ячейки по её координатам, если правый нижний угол не задан,
' возвращает адрес ячейки, если задан - адрес диапазона
Function Addr(nLeft As Long, nTop As Long, _
Optional nRight As Long = -1, _
Optional nBottom As Long = -1) As String
Dim sCol As String
Dim nK1 As Integer, nK2 As Integer
If (nLeft > 256 Or nRight > 256) Then
Addr = ""
Exit Function
End If
If (nTop > 65536 Or nBottom > 65536) Then
Addr = ""
Exit Function
End If
If (nLeft <= 26) Then
sCol = Chr(Asc("A") + ((nLeft - 1) Mod 26))
Else
sCol = Chr(Asc("A") + ((nLeft - 27) \ 26)) + Chr(Asc("A") + ((nLeft - 1) Mod 26))
End If
Addr = sCol + CStr(nTop)
If (nRight > 0 And nBottom > 0) Then
If (nRight <= 26) Then
sCol = Chr(Asc("A") + ((nRight - 1) Mod 26))
Else
sCol = Chr(Asc("A") + ((nRight - 27) \ 26)) + Chr(Asc("A") + ((nRight - 1) Mod 26))
End If
Addr = Addr + ":" + sCol + CStr(nBottom)
End If
End Function
</pre>
</div>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-26925428168286624542011-09-27T23:56:00.000-07:002011-10-18T01:10:56.993-07:00Tips & Tricks # 3. Отключение автоматического обрезания "http://" в новом Firefox.<div dir="ltr" style="text-align: left;" trbidi="on">
Для того, чтобы отключить автоматическое обрезание «http://» в новом Firefox (версия 7) нужно перейти по адресу about:config, найти там настройку «browser.urlbar.trimURLs» и установить её в <b>false</b>. Profit.</div>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-36962729400154196922011-05-11T07:52:00.000-07:002011-11-09T14:42:00.074-08:00Булевы функции. Хозяйке на заметку.<div dir="ltr" style="text-align: left;" trbidi="on">
Бинарных булевых функций существует 16.<br />
<table align="center" cellpadding="10" cellspacing="0" class="list" valign="top"> <tbody>
<tr>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_2" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=0" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cdownarrow+x_2" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=%5Coverline%7Bx_1+%5Cleftarrow+x_2%7D" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=%5Coverline%7Bx_1%7D" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=%5Coverline%7Bx_1+%5Crightarrow+x_2%7D" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=%5Coverline%7Bx_2%7D" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Coplus+x_2" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%7C+x_2" /></th>
</tr>
<tr>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
</tr>
</tbody>
</table>
<table align="center" cellpadding="10" cellspacing="0" class="list" valign="top"> <tbody>
<tr>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_2" />
</th><th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cwedge+x_2" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cequiv+x_2" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_2" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Crightarrow+x_2" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cleftarrow+x_2" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cvee+x_2" /></th>
<th width="5.5%"><br />
<img src="https://chart.googleapis.com/chart?cht=tx&chl=1" /></th>
</tr>
<tr>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
</tr>
</tbody>
</table>
Причем только 10 из них являются по настоящему бинарными. 0 и 1 — нульарные функции. Скролько бы переменных мы в них не предполагали, они все будут не существенными. Функции <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1" style="vertical-align: middle;" />, <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_2" style="vertical-align: middle;" />, а также их отрицания являются функциями одной переменной.<br />
Перечислим те из приведенных выше операций, которые являются ассоциативными. То есть: <img src="https://chart.googleapis.com/chart?cht=tx&chl=%28x_1+%5Cstar+x_2%29+%5Cstar+x_3+%3D+x_1+%5Cstar+%28x_2+%5Cstar+x_3%29+%3D+%28x_1+%5Cstar+x_2+%5Cstar+x_3%29" style="vertical-align: middle;" /><br />
<ol>
<li>Конъюнкция (логическое И): <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cwedge+x_2" style="vertical-align: middle;" /></li>
<li>Дизъюнкиця (логическое ИЛИ): <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cvee+x_2" style="vertical-align: middle;" /></li>
<li>Исключающее ИЛИ: <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Coplus+x_2" style="vertical-align: middle;" /></li>
<li>Эквивалентность: <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cequiv+x_2" style="vertical-align: middle;" /></li>
</ol>
Перечислим те из них, которые являются коммутативными: <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Ctriangleleft+x_2+%3D+x_2+%5Ctriangleleft+x_1" style="vertical-align: middle;" /> Заметим, что для того, чтобы операция была коммутативной, достаточно, чтобы значения для этой операции во второй и третьей строках совпадали. Таких операций будет 6.<br />
<ol>
<li>Стрелка Пирса: <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cdownarrow+x_2" style="vertical-align: middle;" /></li>
<li>Исключающее ИЛИ (сложение по модулю 2): <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Coplus+x_2" style="vertical-align: middle;" /></li>
<li>Штрих Шеффера: <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%7C+x_2" style="vertical-align: middle;" /></li>
<li>Конъюнкция (логическое И): <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cwedge+x_2" style="vertical-align: middle;" /></li>
<li>Эквивалентность: <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cequiv+x_2" style="vertical-align: middle;" /></li>
<li>Дизъюнкиця (логическое ИЛИ): <img src="https://chart.googleapis.com/chart?cht=tx&chl=x_1+%5Cvee+x_2" style="vertical-align: middle;" /></li>
</ol>
</div>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-62408079297625287082011-03-19T08:31:00.000-07:002011-10-18T01:05:53.004-07:00Язык Vala<div dir="ltr" style="text-align: left;" trbidi="on">
Давненько я сюда ничего не писал. Поэтому расскажу о том, как опробовал новый для меня язык программирования Vala. Язык Vala работает с системой объектов GLib и создан для разработки прикладных и системных приложений для GNOME. Являясь языком высокого уровня (по сравнению с C :), и будучи компилируемым в C код, использующий стандартный GLib, он одновременно содержит бинарную совместимость с другими приложениями для GNOME и «удобства» таких языков как C# или Java.<br />
Для того, чтобы установить компилятор языка в мою Ubuntu 10.10, я сказал:<br />
<pre>sudo apt-get install valac
</pre>
Затем, я создал файл first.vala и открыл его редактором Geany. Так как я не писал ещё на этом языке, мне нужен был экзампл, который я радостно слямзил из <a href="http://ru.wikipedia.org/wiki/Vala">википедии</a>. Надо отметить, что Geany сама поняла, каким компилятором ей нужно собирать этот текст, так что простого нажатия F9 хватило, чтобы я получил рабочее приложение. Постить сюда код из википедии негоже, поэтому я несколько видоизменил исходную программу. Теперь она считает 10-ое число Фибоначчи (хотел проверить есть ли рекурсия). Полезно, не правда ли? :-)<br />
<pre class="brush:java">using GLib;
class Sample : Object
{
static int main (string[] args)
{
var my_sample = new MySamlpe ();
var i = my_sample.fibonacci(10);
stdout.printf("I is %d\n", i);
return 0;
}
}
class MySamlpe : Object
{
public int fibonacci(int i)
{
if (i < 0) {
stdout.printf ("I cann't! I just cann't");
return -1;
}
if (i == 1) {
return 1;
}
return (i + fibonacci(i - 1));
}
}
</pre>
Скомпилировал и запустил: <br />
<pre>numlock@oligochaeta:~/temp/exp$ ./first
I is 55
</pre>
Вуаля!<br />
На все вместе ушло около 20 минут и ни в какие туториалы я не заглядывал. Так что все очень просто. Кстати, среда Unity, которая будет средой по умолчанию в Ubuntu 11.04 частично написана на Vala.</div>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-56431452644444050432010-12-20T23:04:00.000-08:002011-10-18T01:30:06.586-07:00Корень n-ой степени из числаДля вычисления корня <i>n</i>-ой степени из какого-либо действительного числа <i>x</i> достаточно вот таких простых преобразований:<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="http://4.bp.blogspot.com/_CI4ErtFmTwM/TRBQ0c-QAcI/AAAAAAAAAPQ/beG-XzK6_t4/s1600/equation.render.png" /></div>Т.е. на языке, скажем C++, это будет выглядеть так:<br />
<pre class="brush:cpp">double res = exp((1/n) * log(x));
</pre>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-70911556660204792552010-12-20T19:19:00.000-08:002011-10-18T01:29:51.261-07:00Сбалансированность дереваИногда (при работе с деревьями очень часто) бывает нужно понять, насколько дерево сбалансированно. Проблема в том, что эта характеристика более-менее понятна в отношении бинарных деревьев (для них она равна отношению мощности левого и правого поддеревьев), а для «обычных» деревьев, в общем-то, не понятно, что на <br />
что делить.<br />
<br />
Итак, пусть <i>T</i> — «обычное» ориентированное дерево, и из каждой вершины может исходить <i>n</i> ребер. В зависимоти от задачи, можно считать сбалансированность разными способами:<br />
<br />
Если <i>n</i> четно, тогда сбалансированность можно считать по следующей формуле:<br />
<div style="text-align: center;"><img border="0" src="http://2.bp.blogspot.com/_CI4ErtFmTwM/TRASLPbbILI/AAAAAAAAAOg/aUnqhHwjtuA/s1600/formula17719.gif" /> </div>где <img border="0" src="http://4.bp.blogspot.com/_CI4ErtFmTwM/TRAS5KPBskI/AAAAAAAAAOo/2FV3YcNgD4Q/s1600/formula17721.gif" /> — мощность поддерева, с корнем в <i>j</i>-той вершине данного дерева. Нумерация здесь соответсвует обходу в ширину, а корень дерева имеет нулевой индекс. То есть, мы берем все ребра исходящие из корня дерева и делим это множество на два. Ссуммируем мощность подмножеств, которые начинаются с вершин, в которые входят эти ребра, и делим одну сумму на другую.<br />
Если <i>n</i> нечетно, тогда формула видоизменяется следующим образом:<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" height="55" src="http://3.bp.blogspot.com/_CI4ErtFmTwM/TRAYASUvadI/AAAAAAAAAOw/epeYd75b4SI/s320/formula17726.gif" width="181" /></div>Смысл формулы здесь не изменился, но мы учитываем также половину мощности «центрального» поддерева и в делимом и в делителе.<br />
<br />
Также сбалансированностью можно считать следующую величину:<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" height="39" src="http://4.bp.blogspot.com/_CI4ErtFmTwM/TRAcQaU4zjI/AAAAAAAAAO4/glvhtRJpbFQ/s320/formula17727.gif" width="36" /></div>где <img border="0" height="18" src="http://1.bp.blogspot.com/_CI4ErtFmTwM/TRAcYF4mKoI/AAAAAAAAAPA/grSIGJhAi3c/s320/formula17728.gif" width="17" /> — мощность множества уровней дерева, которые содержат листья, а <img border="0" height="16" src="http://4.bp.blogspot.com/_CI4ErtFmTwM/TRAcoBYBh3I/AAAAAAAAAPI/SEq0a4oYvag/s320/formula17729.gif" width="34" /> — количество уровней всего.Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-61001343157300556952010-12-17T09:23:00.000-08:002011-10-18T01:29:38.758-07:00Генерация случайного разбиенияУ Кнута в 4-ой части Искусства программирования есть описание алгоритма генерации всех разбиений <i>n</i>-элементного множества на <i>m</i>-частей (раздел 7.2.1.4). Положим, что нам нужно найти какое-нибудь случайное разбиение (например, мне это понадобилось для генерации случайного дерева заданной несбалансированности). Конечно, мы будем использовать случайные числа.<br />
Смысл следующий: берем массив из <i>m</i> элементов и заполняем его случайными числами в диапазоне от 0 до <i>n</i>. Последнему элементу присваиваем значение <i>n</i>. Мы получили массив, в котором содержатся "метки" — значения указывающие на то, в каком именно месте будет разбито наше множество.<br />
Затем сортируем массив, последовательно начиная с <i>m-1</i>-ого элемента находим разность между <i>i</i>-м и <i>i-1</i>-м элементами и записываем её в <i>i</i>-ую ячейку массива. Нулевой элемент массива оставляем без изменений.<br />
Проблема в том, что этот алгоритм не гарантирует, что в результирующем массиве не будут отсутствовать нулевые элементы. С этим можно бороться последующей балансировкой. Заводим специальную переменную (например, diff) для сохранения количества "балансировок" и пока эта переменная не станет равна нулю ходим по массиву и совершаем следующие действия:<br />
<ol><li>Если наткнулись на ячейку содержащую ноль, прибавляем к её значению единицу, а из переменной единицу вычитаем.</li>
<li>Если diff меньше нуля, а текущий элемент массива больше нуля, то прибавляем diff единицу, а из текущего элемента её вычитаем.</li>
</ol>Вот как это выглядит у меня:<br />
<pre class="brush:cpp">void
getPartition(unsigned n, unsigned m)
{
if (n < m) {
throw out_of_range("N must be greater then M");
}
unsigned sum = 0;
vector< unsigned > partition;
partition.resize(m);
// заполнение массива случайными значениями
for (unsigned i = 0; i < m; i++) {
partition[i] = rand() % n;
}
partition[partition.size() - 1] = n;
// сортировка
sort(partition.begin(), partition.end());
// вычитаение
for (unsigned i = m - 1; i > 0; i--) {
partition[i] = partition[i] - partition[i - 1];
}
int diff = 0;
// балансировка
do {
for (unsigned i = 0; i < m; i++) {
if (partition[i] < 1) {
partition[i]++;
diff--;
}
if (diff < 0) {
if (partition[i] > 1) {
partition[i]--;
diff++;
}
}
}
} while (diff != 0);
// вывод на экран вместе с суммой всех элементов для проверки
for (unsigned i = m - 1; i > 0; i--) {
cout << partition[i] << " ";
sum += partition[i];
}
sum += partition[0];
cout << partition[0] << " " << sum;
cout << endl;
}
</pre>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-81184026019244598582010-12-15T01:26:00.000-08:002011-10-18T01:25:03.236-07:00Tips & Tricks #2. Удаленный рабочий стол Ubuntu 10.04 по RDP.Однажды у меня возникла необходимость подключиться стандартным "Удаленным рабочим столом" Windows к Ubuntu-машине. Сама Windows использует для этих целей протокол RDP, серверная часть которого в *nix-системах представлена продуктом xrdp.<br />
Итак, для начала, устанавливаем сам xrdp:<br />
<pre>sudo apt-get install xrdp
</pre>После этого, мы уже можем подключаться к нашему серверу, но по-умолчанию используется протокол VNC. С этим видом подключения у меня возникли проблемы переключения раскладок клавиатуры (по умолчанию удаленная сессия видела только одну раскладку en_US). Настроить переключение удалось только с бубном и через <a href="http://code.google.com/p/ibus/">IBus</a>, а не через <a href="http://www.x.org/wiki/XKB">xkb</a>. К тому же подключение более чем 5 машин вешало сеть. Я решил по-пробовать rdp.<br />
Оказалось, что для этого требуется бинарник x11rdp, который в стандартный пакет не входит. Гугл сказал мне, что исходники можно взять здесь:<br />
<pre>svn://server1.xrdp.org/srv/svn/repos/main/x11rdp_xorg71
</pre>Итак, качаем исходник куда-нибудь, а потом собираем.<br />
<pre>cd ~/
mkdir temp
cd temp
svn co svn://server1.xrdp.org/srv/svn/repos/main/x11rdp_xorg71
cd x11rdp_xorg71
sudo mkdir /opt/x11
sudo ./buildx.sh /opt/x11
</pre>В последней строчке мы сказали собирающему скрипту, чтобы он положил все собранное в каталог /opt/x11. У меня во время сборки скрипт вывалился с ошибкой и пожаловался, что нет библиотеки zlib. Ставим:<br />
<pre>sudo apt-get install zlib1g-dev
</pre>и запускаем скрипт заново. Он не будет повторять ту работу, что уже сделал.<br />
После сборки идем в каталог /opt/x11/bin, и просто копируем оттуда файл x11rdp в каталог /usr/bin.<br />
Для того, чтобы подключение через x11rdp было подключением по-умолчанию идем в каталог /etc/xrdp и в файле xrdp.ini помещаем блок настроек [xrdp6] перед блоком [xrdp1]. Все, теперь можно подключаться к нашей Ubuntu-машине, с помощью стандартного клиента Windows.<br />
<br />
P.S. Если пользователь ни разу не логинился непосредственно на сервер (например, если это доменный пользователь), то ему также придется добавить русскую раскладку клавиатуры и настроить сочетание клавиш для переключения. Все это можно сделать через Система->Параметры->Клавиатура.Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-7523583448076473742010-11-11T21:06:00.000-08:002012-05-02T21:20:07.511-07:00Генерация случайного дерева<div dir="ltr" style="text-align: left;" trbidi="on">
В ходе работы над дипломом мне пришлось столкнуться с необходимостью генерации дерева. Так как я точно не знаю, какое именно дерево будет описывать мою задачу (деревом представляется булева функция общего вида), я решил, что будет логично прогнать алгоритмы на достаточно большом количестве случайных деревьев. Итак, генерация случайного дерева.<br />
<br />
В качестве структуры данных, для хранения была выбрана матрица смежности. Будем считать, что дерево — ориентированный граф с полустепенью захода у каждой вершины равной 1 (кроме корня: у него 0). Также нам нужно сделать так, чтобы у нас был всего один корень (то есть нам нужно именно дерево, а не лес).<br />
Матрица смежности — это булева матрица, в <i>(i, j)</i> вершине которого содержится информация о том, присутствует ли в графе ребро изходящее из <i>i</i> и входящее в <i>j</i>. Из этого легко получить условия, которые мы должны наложить на матрицу, чтобы она описывала именно дерево.<br />
<ol>
<li>В столбце <i>i (i > 0)</i> должна стоять одна и только одна единица на месте <i>j (j < i)</i>. Таким образом мы обеспечим полустепень захода равную 1 для всех вершин графа, кроме корня. Будем, для удобства считать, что корнем является нулевая вершина.</li>
<li>Ниже главной диагонали (и на ней) должны стоять нули, это обеспечит ориентированность дерева, и тот факт, что вершины с большим номером будут являтся детьми, только вершинам с меньшим номером.</li>
</ol>
Ниже я привожу небольшу программку для примера, генерирующую случайное дерево и выводящую результат в dot-cовместимом формате.<br />
<pre class="brush:cpp">#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
int
main(int argc, char** argv)
{
using namespace std;
srand(time(NULL));
vector<vector<int> > matrix;
#define size 1000
matrix.resize(size);
for (int i = 0; i < size; i++) {
matrix[i].resize(size);
for (int j = 0; j < size; j++) {
matrix[i][j] = 0;
}
}
for (int i = size - 1; i > 0; i--) {
/**
* (rand() % i) - случайное число в множестве [0, i)
* i-тый столбец
*/
matrix[rand() % i][i] = 1;
}
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (matrix[i][j] == 1) {
cout << i << " -> " << j << ";" << endl;
}
}
}
}
</pre>
И на закуску небольшой пример:<br />
<pre>0 1 0 0 0
0 0 1 1 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
</pre>
Дерево, представленное этой матрицей будет выглядеть так:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/_CI4ErtFmTwM/TNzNdbPqAwI/AAAAAAAAAOc/2GsT3c_h4U4/s1600/test4.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/_CI4ErtFmTwM/TNzNdbPqAwI/AAAAAAAAAOc/2GsT3c_h4U4/s320/test4.gif" width="165" /></a></div>
Обратите внимание, что четвертая и пятая строки в матрице содержат только нули. На графе они стали листьями. Столбец содержащий одни нули (1-ый) является корнем.</div>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com2tag:blogger.com,1999:blog-82178525630255648.post-44649252512048463462010-09-29T23:40:00.000-07:002010-09-29T23:40:46.692-07:00Wikipedia лежитПо всей видимости, сейчас сайт открытой энциклопедии <a href="wikipedia.org">wikipedia.org</a> лежит. При попытке обращения через браузер подгрузка страницы останавливается на "Ожидание ответа", при попытке доступа через telnet срабатывает timeout.Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-38664176932707131252010-09-22T21:38:00.000-07:002010-09-22T21:38:04.363-07:00ЗадачаПредположим, что некий велосипедист проезжает круг со скоростью 30 километров в час. А потом едет тот же круг второй раз. С какой скоростью он должен двигаться, чтобы средняя скорость за два круга составляла 60 километров в час?<br />
<br />
P.S. Подсказка для решающих: предположите, что длина круга 30 километров.Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-10803624271615423052010-05-26T23:25:00.000-07:002010-05-26T23:25:13.925-07:00О взаимодействии flex и bison<p>flex — генератор лексических анализаторов, bison — синтаксических. Оба эти пакета действуют по одной и той же схеме: они берут описание грамматики (для flex этот файл содержит описание лексем с помощью регулярных выражений, для bison — описание грамматики в формате близком к BNF) и выдают файлы, содержащие C-программу, которая занимается разбором входного текста. Исторически сложилось так, что работают они в связке, а мануалы для них отдельные. Схема синтаксического разбора входного текста выглядит так:</p><ol><li>Лексер (результат работы flex) предоставляет для bison функцию yylex(); которая возвращает код следующей лексемы распознанной во входном файле yyin.<br />
</li>
<li>Парсер (результат работы bison) берет входные лексемы от flex (вызов yylex() происходит внутри функции yyparse(); и распознав то или иное правило, вполняет указанное действие.<br />
</li>
</ol><p></p>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-21177889627434574662010-04-19T01:43:00.000-07:002010-04-19T01:45:00.046-07:00Проблемы при запуске ANTLRWorks в Ubuntu 8.04Генератор синтаксических анализаторов ANTLR выгодно отличается от других программ из этого класса наличием IDE. Она носит название ANTLRWorks. Проблем при запуске может и не быть (если установлены все нужные пакеты), но у меня они возникли. Итак, для того, чтобы запустить её из-под Ubuntu 8.04 (на других не пробовал) нужно:<br />
1. Скачать <a href="http://www.antlr.org/download/antlrworks-1.3.1.jar">саму программу</a> с официального сайта. Она представляет из себя простой *.jar пакет.<br />
2. Иметь установленным пакет sun-java6-jdk (sudo apt-get install sun-java6-jdk).<br />
3. И (самый коварный момент) НЕ должен быть установлен пакет java-gcj-common (и остальные, начинающиеся с этого префикса). Как только я удалил эти пакеты программа запустилась.<br />
<br />
Запустить программу можно так:<br />
<pre>java -jar antlrworks-1.3.1.jar</pre>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-48915640149327301792010-04-19T01:36:00.000-07:002010-12-02T21:45:07.287-08:00Tips & Tricks #1: Забытый Dev-CppНедавно я установил новый QtSDK. Компиляция простого GUI проекта приводила к нелогичным ошибкам: <br />
<br />
<span style="font-family:courier new;">undefined reference to `_Unwind_Resume'</span><br />
<span style="font-family:courier new;">undefined reference to `__gxx_personality_v0'</span><br />
<br />
Решение оказалось чрезвычайно простым. Давным-давно я ставил на комп Dev-Cpp, и конечно же, не догадывался, что qmake берет MinGW именно оттуда. Удаление Dev-Cpp решило проблему. MinGW «стал браться» из нужного места (папки mingw в папке с QtSDK) и все заработало. Чтение maillist-а и makefile решает любые проблемы.Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-87867316333834682852010-04-05T17:24:00.000-07:002010-04-05T17:24:33.252-07:00Проблемы с install-info при установке пакетов в Ubuntu<p>При установке некоторых пакетов в Ubuntu (8.04) начала возникать ошибка:</p><pre>install-info: No dir file specified; try --help for more information.
dpkg: не удалось обработать параметр <название пакета> (--configure):
подпроцесс post-installation script возвратил код ошибки 1
При обработке следующих пакетов произошли ошибки:
<название пакета>
</pre><p>Осмотр пре- и постинсталляционных скриптов пакетов, при установке которых возникали ошибки (кэш пакетов находится в папке /var/cache/apt/archives), показал, что ошибка возникает именно на команде install-info.</p><p>Некоторые google-мучения подсказали, что нужно проверить версии установленных приложений.</p><pre>numlock@oligocheta:~$ whereis install-info
install-info: /usr/sbin/install-info /usr/local/bin/install-info /usr/share/man/man8/install-info.8.gz
numlock@oligocheta:~$ /usr/sbin/install-info --version
Debian install-info version 1.14.25.
...
numlock@oligocheta:~$ /usr/local/bin/install-info --version
install-info (GNU texinfo) 4.13
...
</pre><p>Я попытался поменять местами значения переменной PATH '/usr/sbin:' и '/usr/local/bin:'. но это не привело к должному эффекту. Поэтому я просто переименовал символическую ссылку install-info в install-info-gnu (в папке /usr/local/bin), чтобы dpkg находил не его, а версию для Debian.</p><pre>numlock@oligocheta:~$ sudo mv /usr/local/bin/install-info /usr/local/bin/install-info-gnu
</pre><p>Все заработало.</p><p>Рецепт взят из <a href="http://naveendageek.blogspot.com/2009/03/install-info-no-dir-file-specified-try.html">Naveen Kumar Molleti's Tech Blog</a></p>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0tag:blogger.com,1999:blog-82178525630255648.post-3887362356244132262009-03-14T22:46:00.000-07:002009-03-15T00:15:31.338-07:00Начало<p>Краткое описание: этот блог посвещен математике (в основном дискретной), программированию, алгоритмам и их анализу. Это - «затравочное» сообщение: надо же с чего-то начинать. Посмотрим, что получится.</p>Anonymoushttp://www.blogger.com/profile/08427609844721859193noreply@blogger.com0