<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8622169542119587655</atom:id><lastBuildDate>Sun, 29 Jan 2012 11:02:01 +0000</lastBuildDate><category>linux</category><category>web</category><category>fluxbox</category><category>tips'n'tricks</category><category>mcabber</category><category>programming</category><category>zsh</category><category>debian</category><category>holiday</category><category>mirror</category><category>windows</category><category>irssi</category><category>vim</category><category>Eee PC</category><category>review</category><category>blog</category><category>hardware</category><category>EULA</category><title>Debiania: просто ещё один блог о Debian</title><description /><link>http://debiania.blogspot.com/</link><managingEditor>noreply@blogger.com (Minoru)</managingEditor><generator>Blogger</generator><openSearch:totalResults>96</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Debiania" /><feedburner:info uri="debiania" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-1368765179913391208</guid><pubDate>Sun, 29 Jan 2012 11:02:00 +0000</pubDate><atom:updated>2012-01-29T13:02:01.323+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">windows</category><category domain="http://www.blogger.com/atom/ns#">hardware</category><title>Обновление Effire TR401</title><description>Двенадцатого января Effire выпустили обновление прошивки для &lt;a href='http://effire.ru/catalogue/ebooks/colorbook_tr401/'&gt;Colorbook TR401&lt;/a&gt; — небольшого медиаридера, который мне как раз недавно подарили. Учитывая кривоватость стандартной прошивки, я немедленно приступил к обновлению.&lt;br /&gt;
&lt;br /&gt;
Кстати говоря, впоследствии оказалось, что это не обновление вовсе, а та самая прошивка, которая была установлена на читалке при покупке. И этого поста вообще не было бы, если бы инструкция по обновлению, прилагаемая к прошивке, была работоспособна. Но увы…&lt;br /&gt;
&lt;br /&gt;
Сразу замечу, что для обновления понадобилась настоящая Windows-машина — XPюшка, запущенная под QEMU, вывалилась в BSOD на одном из диалогов программы обновления. Запускать же LiveSuit (так называется обновлялка) под Wine я не пробовал ввиду отсутствия последнего в Debian Wheezy.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Собственно, основная проблема прилагаемой к прошивке инструкции заключается в том, что предлагается сначала поставить драйвер для устройства, а потом уже проводить обновление. Но на деле при подключении читалки к компьютеру она сразу же определяется как USB Mass Storage Device и Windows XP ни в какую не хочет менять драйвер на тот, что поставляет Effire.&lt;br /&gt;
&lt;br /&gt;
Решается проблема элементарно: сначала запускаем LiveSuit, а потом уже подключаем ридер к компьютеру. Не знаю, что там делает запущенная обновлялка, но в такой последовательности устройство уже не считается флешкой и WinXP требует драйвера, которые мы и подсовываем в полном соответствии с инструкцией.&lt;br /&gt;
&lt;br /&gt;
На всякий случай приведу пошаговое описание процесса обновления:&lt;ol&gt;&lt;li&gt;Бекапим книги, фильмы, музыку — всё, что жалко будет потерять, если вдруг что-то пойдёт не так. Учтите также, что настройки сбросятся в любом случае, так что запомните, что на какой странице читаете. И закладки из книг тоже на листочек выпишите.&lt;/li&gt;
&lt;li&gt;Запускаем LiveSuit.&lt;/li&gt;
&lt;li&gt;Подключаем читалку.&lt;/li&gt;
&lt;li&gt;Windows определяет устройство и спрашивает про драйвера, скармливаем &lt;code&gt;usbdrv.inf&lt;/code&gt; согласно инструкции, прилагаемой к прошивке.&lt;/li&gt;
&lt;li&gt;Устройство переподключается и снова требует драйвер. Я на этом шаге снова подсунул мастеру установки &lt;code&gt;usbdrv.inf&lt;/code&gt;, но уверен, что можно просто кликать &lt;i&gt;Далее&lt;/i&gt; — драйвер-то мы поставили на предыдущем шаге.&lt;/li&gt;
&lt;li&gt;Нажимаем SysUpdate.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Важно&lt;/b&gt;: в появившемся диалоге нужно нажать &lt;i&gt;Да&lt;/i&gt;, иначе процесс обновления прекратится с ошибкой «Jump to update mode failed». О данных не волнуйтесь — про них ещё раз спросят позже.&lt;/li&gt;
&lt;li&gt;Спустя некоторое время появится диалог с вопросом о том, хотите ли вы форматировать внутреннюю память устройства. Вот это уже возможность потерять данные, так что хорошенько подумайте и отвечайте &lt;i&gt;Нет&lt;/i&gt; ☺&lt;/li&gt;
&lt;li&gt;Спустя некоторое время появилтся сообщение «Update success!» — поздравляю, всё прошло хорошо.&lt;/li&gt;
&lt;li&gt;Как и написано в инструкции, книга загрузится, попросит подождать, после чего предложит откалибровать экран.&lt;/li&gt;
&lt;li&gt;По завершении этих нехитрых манипуляций можете приступать к восстановлению своих настроек.&lt;/li&gt;&lt;/ol&gt;На этом всё. До новых встреч!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-1368765179913391208?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/GavvVgCM2Tw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/GavvVgCM2Tw/effire-tr401.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>0</thr:total><feedburner:origLink>http://debiania.blogspot.com/2012/01/effire-tr401.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-8935072323257145152</guid><pubDate>Mon, 23 Jan 2012 22:54:00 +0000</pubDate><atom:updated>2012-01-24T00:54:00.029+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">EULA</category><title>Google Terms of Service</title><description>С подачи друга решил перечитать &lt;a href="http://www.google.com/accounts/TOS?hl=en-GB_GB"&gt;гугловское соглашение об использовании сервиса&lt;/a&gt;. Как и в случае со Skype (который я, кстати, таки удалил — смотрите UPD к &lt;a href="http://debiania.blogspot.com/2010/04/skype-eula.html"&gt;соответствующему посту&lt;/a&gt;), представляю вашему вниманию наиболее интересные, с моей точки зрения, моменты.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
А моментов этих всего четыре штуки. Бо́льшая же часть соглашения представляет собой обыкновенную юридическую чепуху (я не юрист, но те же формулировки я уже видел в других EULA и ToS).&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;2.4 Before you continue, &lt;b&gt;you should print off or save a local copy of the Universal Terms&lt;/b&gt; for your records.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Совершенно непонятное мне требование. &lt;b&gt;Зачем&lt;/b&gt;?&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;4.4 &lt;b&gt;You acknowledge and agree that if Google disables access to your account, you may be prevented from accessing&lt;/b&gt; the Services, your account details or &lt;b&gt;any files or other content which is contained in your account&lt;/b&gt;.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Как и в случае с пунктом 4.A в &lt;a href='http://www.linkedin.com/static?key=user_agreement'&gt;LinkedIn EULA&lt;/a&gt;, спасти свои данные с тонущего корабля не получится.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;5.1 In order to access certain Services, you may be required to provide information about yourself (such as identification or contact details) as part of the registration process for the Service, or as part of your continued use of the Services. &lt;b&gt;You agree that any registration information you give to Google will always be accurate, correct and up to date&lt;/b&gt;.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
«У нас не хватает ресурсов, чтобы уследить за вами всеми, так что давайте как-нибудь сами, а?» ☺ Нет, я не верю, что Google — следующая империя зла, но всё же.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;5.3 You agree not to access (or attempt to access) any of the Services by any means other than through the interface that is provided by Google, unless you have been specifically allowed to do so in a separate agreement with Google. &lt;b&gt;You specifically agree not to access (or attempt to access) any of the Services through any automated means (including use of scripts or web crawlers)&lt;/b&gt; and shall ensure that you comply with the instructions set out in any robots.txt file present on the Services. &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Это что же, я теперь не могу получить количество непрочитанных писем с помощью самописного скрипта на bash? checkgmail мне тоже использовать нельзя?&lt;br /&gt;
&lt;br /&gt;
За бортом остались гугловские &lt;a href='https://www.google.com/intl/en/privacy/'&gt;Privacy Policies&lt;/a&gt;, которых насчитывается 36 штук — скорее всего, они станут темой следующего поста.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-8935072323257145152?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/BfWyKNiDKps" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/BfWyKNiDKps/google-terms-of-service.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>2</thr:total><feedburner:origLink>http://debiania.blogspot.com/2012/01/google-terms-of-service.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-2321096019293286072</guid><pubDate>Sun, 15 Jan 2012 21:46:00 +0000</pubDate><atom:updated>2012-01-15T23:46:07.459+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">EULA</category><title>Выдержки из LinkedIn User Agreement</title><description>Ранее я &lt;a href='http://debiania.blogspot.com/2010/04/skype-eula.html'&gt;уже писал о тех пунктах Skype EULA&lt;/a&gt;, которые привлекли моё внимание. Некоторое время назад я зарегистрировался на LinkedIn, и в данном посте хотелось бы перечислить те пункты &lt;a href='http://www.linkedin.com/static?key=user_agreement'&gt;их пользовательского соглашения&lt;/a&gt;, которые я счёл особо важными или волнующими.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Сначала приводится номер пункта, из которого взята выдержка, затем, собственно, сам текст (курсивом), в котором полужирным выделены вещи, которые привлекли моё внимание. После текста может следовать мой комментарий, поясняющий, что же такого особого я нашёл в указанном пункте условий.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;User Agreement&lt;/h3&gt;&lt;b&gt;4.A&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;For as long as LinkedIn continues to offer the Services, LinkedIn shall provide and seek to update, improve and expand the Services. As a result, we allow you to access LinkedIn as it may exist and be available on any given day and have no other obligations, except as expressly stated in this Agreement. We may modify, replace, refuse access to, suspend or discontinue LinkedIn, partially or entirely, or change and modify prices for all or part of the Services for you or for all our users in our sole discretion. All of these changes shall be effective upon their posting on our site or by direct communication to you unless otherwise noted. LinkedIn further reserves the right to withhold, remove and or discard any content available as part of your account, with or without notice if deemed by LinkedIn to be contrary to this Agreement. For avoidance of doubt, &lt;b&gt;LinkedIn has no obligation to store, maintain or provide you a copy of any content that you or other Users provide when using the Services.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Спасти свою инфу с тонущего корабля не получится.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;LINKEDIN DOES NOT HAVE ANY OBLIGATION TO VERIFY THE IDENTITY OF THE PERSONS SUBSCRIBING TO ITS SERVICES, NOR DOES IT HAVE ANY OBLIGATION TO MONITOR THE USE OF ITS SERVICES BY OTHER USERS OF THE COMMUNITY; THEREFORE, &lt;b&gt;LINKEDIN DISCLAIMS ALL LIABILITY FOR IDENTITY THEFT OR ANY OTHER MISUSE OF YOUR IDENTITY OR INFORMATION.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Если у меня что-то стырят, LinkedIn и пальцем не пошевелит, чтобы помочь найти вора. Это странно смотрится на фоне заявлений о том, что они при некоторых условиях могут получать доступ к пользовательской информации.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;6 и 6.A&lt;/b&gt;&lt;br /&gt;
… &lt;i&gt;This limitation of liability shall:&lt;br /&gt;
A. Apply regardless of whether (1) you base your claim on contract, tort, statute or any other legal theory, (2) &lt;b&gt;we knew or should have known about the possibility of such damages,&lt;/b&gt; or (3) the limited remedies provided in this section fail of their essential purpose; and&lt;/i&gt;…&lt;br /&gt;
&lt;br /&gt;
Если они знали, что сервера выходят из строя, но не было настроения чинить — они не виноваты, им EULA разрешает такое делать.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;10.B.12 (один из пунктов списка DON'Ts)&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;Utilize or copy information, content or any data you view on and/or obtain from LinkedIn to provide any service that is competitive, in LinkedIn’s sole discretion, with LinkedIn&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Что считается информацией? Так они меня за любую мелочь судить могут.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;10.B.14&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;Adapt, modify or create derivative works based on LinkedIn or technology underlying the Services, or other Users’ content, in whole or part, except as permitted under LinkedIn’s developer program&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
А если юзер разрешил использовать опубликованный им контент?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;10.B.17&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;Deep-link to the Site for any purpose, (i.e. including a link to a LinkedIn web page other than LinkedIn’s home page) unless expressly authorized in writing by LinkedIn or for the purpose of promoting your profile or a Group on LinkedIn as set forth in the Brand Guidelines;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
На EULA, выходит, ссылаться тоже нельзя?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;10.B.20&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;Collect, use, copy, or transfer any information, including, but not limited to, personally identifiable information obtained from LinkedIn except as expressly permitted in this Agreement or as the owner of such information may expressly permit;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Не сохранить понравившуюся картинку T_T&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;10.B.24, 10.B.25 и 10.B.27&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;24. Use manual or automated software, devices, scripts robots, other means or processes to access, “scrape,” “crawl” or “spider” any web pages or other services contained in the site;&lt;br /&gt;
&lt;br /&gt;
25. Use bots or other automated methods to access LinkedIn, add or download contacts, send or redirect messages, or perform other activities through LinkedIn, unless explicitly permitted by LinkedIn;&lt;br /&gt;
&lt;br /&gt;
27. Attempt to or actually access LinkedIn by any means other than through the interfaces provided by LinkedIn such as its mobile application or by navigating to http://www.linkedin.com using a web browser. This prohibition includes accessing or attempting to access LinkedIn using any third-party service, including software-as-a-service platforms that aggregate access to multiple services, including LinkedIn;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
…и скриптов для w3crapcli тоже не написать.&lt;br /&gt;
&lt;br /&gt;
Полный &lt;a href='http://www.linkedin.com/static?key=privacy_policy'&gt;Privacy Policy&lt;/a&gt; я читать не стал, удовлетворившись Highlights. Ничего особо интересного там не обнаружилось, так что и писать не о чем.&lt;br /&gt;
&lt;br /&gt;
До новых встреч!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-2321096019293286072?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/E02uToOroBY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/E02uToOroBY/linkedin-user-agreement.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>0</thr:total><feedburner:origLink>http://debiania.blogspot.com/2012/01/linkedin-user-agreement.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-4039126107878184770</guid><pubDate>Tue, 27 Dec 2011 22:00:00 +0000</pubDate><atom:updated>2011-12-30T01:40:14.143+02:00</atom:updated><title>Линусу 42!</title><description>Публикация поздравлений Линуса с днём рождения стали хоть и бессмысленной, но традицией этого блога. В этом году тем более грех не поздравить, ибо отцу-основателю ядрышка нашей любимой операционки исполняется 42 года! (Кто не понял намёка, гуглите «Автостопом по Галактике»). Так что здоровья ему, удачи и особенно — терпения, ведь от работы Торвальдса зависит судьба и Debian, и всего FOSS в целом.&lt;br /&gt;
&lt;br /&gt;
P.S. В Blogger поломали посты по расписанию, что ли? Эта заметка должна была быть опубликована ещё 28-го числа!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-4039126107878184770?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/Kgnwmde-ErU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/Kgnwmde-ErU/42.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>2</thr:total><feedburner:origLink>http://debiania.blogspot.com/2011/12/42.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-2642559254444967264</guid><pubDate>Tue, 30 Aug 2011 20:34:00 +0000</pubDate><atom:updated>2011-09-11T11:21:26.682+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debian</category><category domain="http://www.blogger.com/atom/ns#">hardware</category><title>Asus P52F-380M и Debian</title><description>Недавно я обзавёлся новой игрушкой — Asus P52F-380M. В общем и целом ноут хороший, но некоторые моменты вызывают раздражение. Например, клавиатура немного прогибается (в прямом смысле слова), но когда привыкаешь и начинаешь набирать, не глядя (я, к стыду своему, всё ещё не обучился слепому набору), этот недостаток перестаёт волновать. Гораздо больше раздражает идиотское расположение стрелочек:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-ci4gXw1ORic/TmNHhrltWII/AAAAAAAAAiQ/bY77G0lld_o/s1600/stupid_arrow_keys_design_ASUS_P52F-380.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 272px;" src="http://1.bp.blogspot.com/-ci4gXw1ORic/TmNHhrltWII/AAAAAAAAAiQ/bY77G0lld_o/s400/stupid_arrow_keys_design_ASUS_P52F-380.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5648437001614874754" /&gt;&lt;/a&gt;&lt;br /&gt;То есть кнопка «вправо» находится в области, занимаемой numpad'ом, что, поверьте мне, очень неудобно (в основном из-за огромного RgtCtrl, который я постоянно нажимаю вместо стрелочки влево). Даже на EeePC сделали лучше:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-3eS-NJsS2OU/TmNJS2K1_ZI/AAAAAAAAAiY/6NZLpHqdT9c/s1600/arrow_keys_design_ASUS_EeePC_900HA.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 333px;" src="http://2.bp.blogspot.com/-3eS-NJsS2OU/TmNJS2K1_ZI/AAAAAAAAAiY/6NZLpHqdT9c/s400/arrow_keys_design_ASUS_EeePC_900HA.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5648438945780202898" /&gt;&lt;/a&gt;&lt;br /&gt;Думаю, теперь я таки перейду на hjkl в vim'е ☺&lt;br /&gt;&lt;br /&gt;В остальном дизайн и сборка, к счастью, претензий не вызывают, так что перейдём наконец к теме поста — установке и последующей настройке моего любимого Debian.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Замечу, что в данном ноутбуке используется процессор Intel Core i3, а значит, лучше всего использовать Debian, собранный под amd64. Надеюсь, читатели этого блога в состоянии сами установить систему (если нет — &lt;a href='http://mydebianblog.blogspot.com/2006/08/in-true-debian-way.html'&gt;замечательная инструкция virens'а вам в помощь&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Сначала я попытался поставить Squeeze, но после установки наткнулся на неприятный баг: внешние колонки ноутбука продолжают играть даже когда воткнуты наушники. Мириться с этим никак нельзя, тем более что в LiveCD Ubuntu 10.10, оказавшемся под рукой, всё работало. Признаюсь, я не стал долго ковыряться и просто поставил Wheezy, в котором, к счастью, всё работало из коробки.&lt;br /&gt;&lt;br /&gt;Впрочем, даже в Wheezy с ходу не заработали некоторые вещи, в частности:&lt;ul&gt;&lt;li&gt;веб-камера выдавала перевёрнутое изображение;&lt;/li&gt;&lt;li&gt;&lt;code&gt;wicd-curses&lt;/code&gt; не видел мою Wi-Fi-точку;&lt;/li&gt;&lt;li&gt;из Fn-клавиш работали только три: Fn+F5/Fn+F6, регулирующие яркость монитора, и Fn+F7, которая монитор выключала;&lt;/li&gt;&lt;li&gt;&lt;code&gt;pm-suspend&lt;/code&gt; и &lt;code&gt;pm-hibernate&lt;/code&gt; вроде как работали, но не выключали машину;&lt;/li&gt;&lt;li&gt;противно пищал PC speaker (он не настоящий, конечно же, просто эмуляция).&lt;/li&gt;&lt;/ul&gt;Карт-ридер я на работоспособность не проверял из-за отсутствия подходящих карточек, но наличие в выводе &lt;code&gt;lspci&lt;/code&gt; SD Bridge внушает надежду.&lt;br /&gt;&lt;br /&gt;Ну-с, проблемы перечислены — вперёд, на барикады! ☺&lt;br /&gt;&lt;br /&gt;К счастью, для камеры и suspend'а решения приведены в &lt;a href='http://www.linlap.com/wiki/asus+p52f'&gt;Linux Laptop Wiki&lt;/a&gt;. Для полноты поста я размещу здесь вольный пересказ этих рецептов.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Веб-камера&lt;/h3&gt;Починить это раз и навсегда (слегка поправив какой-нибудь конфиг), к сожалению, не получится. Единственный выход — все приложения, использующие веб-камеру, запускать с библиотекой &lt;code&gt;v4l1compat.so&lt;/code&gt;. Для начала ставим соответствующий пакетик:&lt;code&gt;&lt;div class='code'&gt;$ sudo aptitude install libv4l-0&lt;/div&gt;&lt;/code&gt;После этого все приложения, использующие веб-камеру, следует запускать следующим образом (на примере MPlayer'а):&lt;code&gt;&lt;div class="code"&gt;LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so mplayer tv://&lt;/div&gt;&lt;/code&gt;Для удобства можно создать алиас — библиотека не нарушает работоспособность программы, так что можно подгружать её даже в тех случаях, когда веб-камера вам не нужна.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Suspend и hibernate&lt;/h3&gt;Как гласит Linux Laptop Wiki, питание не выключается из-за неотключенных USB-устройств. Чинится всё написанием скриптов, которые перед засыпанием отключают устройства, а потом подключают обратно, но тут всплывает неприятный баг: машинка успешно засыпает и просыпается, но в точках монтирования флешек становится пусто. Почему так и как это исправить, я ещё не понял. Stay tuned.&lt;br /&gt;&lt;br /&gt;В общем, сделать нужно следующее:&lt;ol&gt;&lt;li&gt;ставим любимый пакетик для suspend/hibernate. Я пользуюсь &lt;code&gt;pm-utils&lt;/code&gt;:&lt;code&gt;&lt;div class='code'&gt;$ sudo aptitude install pm-utils&lt;/div&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;создаём конфиг с модулями, которые нужно выгружать перед suspend'ом:&lt;code&gt;&lt;div class='code'&gt;$ sudoedit /etc/pm/config.d/modules&lt;/div&gt;&lt;/code&gt;и пихаем в него вот что:&lt;code&gt;&lt;div class='code'&gt;SUSPEND_MODULES="usb_storage mac80211 cfg80211 btusb bluetooth ahci libahci sdhci_pci sdhci led_class ath9k ath9k_common ath rfcomm sco bnep l2cap asus_laptop ehci_hcd"&lt;/div&gt;&lt;/code&gt;Не забываем разрешить утилитам читать его:&lt;code&gt;&lt;div class='code'&gt;$ sudo chmod a+r /etc/pm/config/d/modules&lt;/div&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;создаём скриптик, который будет отключать и подключать устройства:&lt;code&gt;&lt;div class='code'&gt;$ sudoedit /etc/pm/sleep.d/10_unbindusb&lt;/div&gt;&lt;/code&gt;и помещаем в него следующее:&lt;code&gt;&lt;div class='code'&gt;&lt;font face="monospace"&gt;&lt;font color="#0000c0"&gt;#!/bin/bash&lt;/font&gt;&lt;br /&gt;&lt;font color="#008080"&gt;function&lt;/font&gt;&amp;nbsp;&lt;font color="#008080"&gt;unbind_usb {&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;for&amp;nbsp;&lt;/font&gt;driver&amp;nbsp;&lt;font color="#8b0000"&gt;in&lt;/font&gt;&amp;nbsp;ehci ohci uhci&lt;font color="#8b0000"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;do&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;cd&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#c00000"&gt;/sys/bus/pci/drivers/&lt;/font&gt;&lt;font color="#c000c0"&gt;${&lt;/font&gt;&lt;font color="#c000c0"&gt;driver&lt;/font&gt;&lt;font color="#c000c0"&gt;}&lt;/font&gt;&lt;font color="#c00000"&gt;_hcd&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;ids&lt;/font&gt;=&lt;font color="#c000c0"&gt;$(&lt;/font&gt;&lt;font color="#8b0000"&gt;ls&lt;/font&gt;&lt;font color="#c000c0"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#8b0000"&gt;|&lt;/font&gt;&lt;font color="#c000c0"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#8b0000"&gt;grep&lt;/font&gt;&lt;font color="#c000c0"&gt;&amp;nbsp;:&lt;/font&gt;&lt;font color="#c000c0"&gt;)&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;echo&lt;/font&gt;&lt;font color="#c00000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#c000c0"&gt;$ids&lt;/font&gt;&lt;font color="#c00000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;/tmp/DISABLED_&lt;font color="#c000c0"&gt;$driver&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;for&amp;nbsp;&lt;/font&gt;id&amp;nbsp;&lt;font color="#8b0000"&gt;in&lt;/font&gt;&amp;nbsp;&lt;font color="#c000c0"&gt;$ids&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;do&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;echo&lt;/font&gt;&lt;font color="#c00000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#c00000"&gt;Unbinding&amp;nbsp;&lt;/font&gt;&lt;font color="#c000c0"&gt;$id&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;echo&lt;/font&gt;&lt;font color="#c00000"&gt;&amp;nbsp;-n&amp;nbsp;&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#c000c0"&gt;$id&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#c00000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;unbind&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;disabled&lt;/font&gt;=&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#c000c0"&gt;$disabled&lt;/font&gt;&lt;font color="#c00000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#c000c0"&gt;$id&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;done&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;done&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#008080"&gt;function&lt;/font&gt;&amp;nbsp;&lt;font color="#008080"&gt;bind_usb {&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;for&amp;nbsp;&lt;/font&gt;driver&amp;nbsp;&lt;font color="#8b0000"&gt;in&lt;/font&gt;&amp;nbsp;ehci ohci uhci&lt;font color="#8b0000"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;do&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;cd&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#c00000"&gt;/sys/bus/pci/drivers/&lt;/font&gt;&lt;font color="#c000c0"&gt;${&lt;/font&gt;&lt;font color="#c000c0"&gt;driver&lt;/font&gt;&lt;font color="#c000c0"&gt;}&lt;/font&gt;&lt;font color="#c00000"&gt;_hcd&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;for&amp;nbsp;&lt;/font&gt;id&amp;nbsp;&lt;font color="#8b0000"&gt;in&lt;/font&gt;&amp;nbsp;&lt;font color="#c000c0"&gt;$(&lt;/font&gt;&lt;font color="#c000c0"&gt;cat /tmp/DISABLED_&lt;/font&gt;&lt;font color="#c000c0"&gt;$driver&lt;/font&gt;&lt;font color="#c000c0"&gt;)&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;do&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;echo&lt;/font&gt;&lt;font color="#c00000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#c00000"&gt;Binding&amp;nbsp;&lt;/font&gt;&lt;font color="#c000c0"&gt;$id&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;echo&lt;/font&gt;&lt;font color="#c00000"&gt;&amp;nbsp;-n&amp;nbsp;&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#c000c0"&gt;$id&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#c00000"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;bind&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;done&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;rm&lt;/font&gt;&amp;nbsp;/tmp/DISABLED_&lt;font color="#c000c0"&gt;$driver&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;done&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#8b0000"&gt;case&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#c000c0"&gt;$1&lt;/font&gt;&lt;font color="#8b0000"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;in&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hibernate&lt;font color="#8b0000"&gt;|&lt;/font&gt;suspend&lt;font color="#8b0000"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unbind_usb&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thaw&lt;font color="#8b0000"&gt;|&lt;/font&gt;resume&lt;font color="#8b0000"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bind_usb&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unbind_usb&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bind_usb&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&lt;font color="#8b0000"&gt;)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;exit&lt;/font&gt;&amp;nbsp;&lt;font color="#c00000"&gt;1&lt;/font&gt;&lt;font color="#8b0000"&gt;;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#8b0000"&gt;esac&lt;/font&gt;;&lt;br /&gt;&lt;font color="#8b0000"&gt;exit&lt;/font&gt;&amp;nbsp;&lt;font color="#c00000"&gt;0&lt;/font&gt;;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;даём скрипту необходимые права:&lt;code&gt;&lt;div class='code'&gt;$ sudo chmod u=rwx,go=rx /etc/pm/sleep.d/10_unbindusb&lt;/div&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;Теперь можно спокойно ложить машинку в suspend командой &lt;code&gt;pm-suspend&lt;/code&gt; (от рута, конечно же). Не забывайте также о hibernate и suspend-hybrid.&lt;br /&gt;&lt;br /&gt;Если после просыпания у вас не определяются USB-устройства, перезагрузите модуль &lt;code&gt;ehci_hcd&lt;/code&gt;:&lt;code&gt;&lt;div class='code'&gt;$ sudo rmmod ehci_hcd&lt;br /&gt;$ sudo modprobe ehci_hcd&lt;/div&gt;&lt;/code&gt;&lt;br /&gt;&lt;h3&gt;Wi-Fi&lt;/h3&gt;Беспроводная сеть была чуть ли не самой простой проблемой из всех. Следать нужно следующее:&lt;ol&gt;&lt;li&gt;поставить менеджер сетевых соединений wicd (помимо curses-клиента существуют также gtk и cli):&lt;code&gt;&lt;div class='code'&gt;$ sudo aptitude install wicd wicd-curses&lt;/div&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;прописать в &lt;code&gt;/etc/network/interfaces&lt;/code&gt; беспроводной интерфейс:&lt;code&gt;&lt;div class='code'&gt;$ sudoedit /etc/network/interfaces&lt;/div&gt;&lt;/code&gt;В конец файла нужно дописать следующее:&lt;code&gt;&lt;div class='code'&gt;allow-hotplug wlan0&lt;br /&gt;iface wlan0 inet manual&lt;/div&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;прописать &lt;code&gt;wlan0&lt;/code&gt; в настройках wicd, для чего в curses-интерфейсе (запускаемом с помощью команды &lt;code&gt;wicd-curses&lt;/code&gt;) нужно нажать P (это большая английская буква P) и тут же в поле Wireless Interface написать заветное «wlan0» (без кавычек)&lt;/li&gt;&lt;li&gt;жмакнуть F10, чтобы сохранить настройки&lt;/li&gt;&lt;/ol&gt;После этих нехитрых манипуляций ноутбук начинает-таки видеть беспроводные точки доступа.&lt;br /&gt;&lt;br /&gt;Кстати говоря, Fn+F2 работает из коробки, только лампочка на передней панели, показывающая состояние Wi-Fi, не работает. Меня, впрочем, это мало волнует, поэтому я (пока что) не разбирался, почему так. &lt;b&gt;UPD&lt;/b&gt;: за лампочки отвечает модуль &lt;code&gt;asus_laptop&lt;/code&gt;. Не знаю, что там у меня случилось во время написания статьи, но сейчас, спустя неделю, модуль загружается сам, так что лампочки в порядке.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Fn-клавиши&lt;/h3&gt;Сразу после установки работали только клавиши, регулирующие яркость монитора, и Fn+F2, отключающая/включающая Wi-Fi. Мне очень сильно не хватало возможности регулировать громкость звука (и вообще выключать его), так что пришлось отлавливать события acpi и писать обработчики. На самом деле это не так сложно, как может показаться. Следуйте инструкции:&lt;ol&gt;&lt;li&gt;создаём файлы, задающие события, на которые мы хотим реагировать (надеюсь, вы уже запомнили команду &lt;code&gt;sudoedit&lt;/code&gt;, потому что на этот раз я просто покажу содержимое файлов, не расписывая процесс их создания):&lt;code&gt;&lt;div class='code'&gt;$ cat /etc/acpi/events/volume_mute&lt;br /&gt;event=hotkey ATK0100:00 00000032&lt;br /&gt;action=/etc/acpi/volume_mute.sh&lt;/div&gt;&lt;/code&gt;&lt;code&gt;&lt;div class='code'&gt;$ cat /etc/acpi/events/volume_up&lt;br /&gt;event=hotkey ATK0100:00 00000030&lt;br /&gt;action=/etc/acpi/volume_up.sh&lt;/div&gt;&lt;/code&gt;&lt;code&gt;&lt;div class='code'&gt;$ cat /etc/acpi/events/volume_down&lt;br /&gt;event=hotkey ATK0100:00 00000031&lt;br /&gt;action=/etc/acpi/volume_down.sh&lt;/div&gt;&lt;/code&gt;Если какой-то из Fn-хоткеев у вас работать не будет, запустите &lt;code&gt;acpi_listen&lt;/code&gt;, понажимайте хоткей и посмотрите, соответствует ли вывод строке «event» (обратите внимание, что acpi присваивает событиям последовательные номера — их включать в строку event &lt;b&gt;нельзя&lt;/b&gt;)&lt;/li&gt;&lt;li&gt;создаём обработчики:&lt;code&gt;&lt;div class='code'&gt;$ cat /etc/acpi/volume_mute.sh&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;amixer sset 'Master' toggle&lt;/div&gt;&lt;/code&gt;&lt;code&gt;&lt;div class='code'&gt;$ cat /etc/acpi/volume_up.sh&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;amixer sset 'Master' 2+&lt;/div&gt;&lt;/code&gt;&lt;code&gt;&lt;div class='code'&gt;$ cat /etc/acpi/volume_down.sh&lt;br /&gt;#/bin/sh&lt;br /&gt;&lt;br /&gt;amixer sset 'Master' 2-&lt;/div&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;заставляем &lt;code&gt;acpid&lt;/code&gt; перечитать настройки:&lt;code&gt;&lt;div class='code'&gt;$ sudo pkill -SIGHUP acpid&lt;/div&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h3&gt;PC speaker&lt;/h3&gt;«Пищалка» в данном ноуте детская, не настоящая даже — вместо взрослого PC speaker'а ноутбук пищит колонками. Отключается это тоже по-детски: достаточно открыть &lt;code&gt;alsamixer&lt;/code&gt; (выполнив в терминале одноимённую команду), выбрать ползунок Beep и выключить его (нажав m).&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;hr width='256px'/&gt;&lt;/center&gt;&lt;br /&gt;Как видим, ни одной серьёзной проблемы — все вещи настраиваются парой изменений в конфигах. И кто после этого посмеет сказать, что Linux не готов для потребителя? ☺&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-2642559254444967264?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/2dXH7rPSKvU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/2dXH7rPSKvU/asus-p52f-380m-debian.html</link><author>noreply@blogger.com (Minoru)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-ci4gXw1ORic/TmNHhrltWII/AAAAAAAAAiQ/bY77G0lld_o/s72-c/stupid_arrow_keys_design_ASUS_P52F-380.jpg" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://debiania.blogspot.com/2011/08/asus-p52f-380m-debian.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-7283582451382027759</guid><pubDate>Fri, 15 Jul 2011 18:55:00 +0000</pubDate><atom:updated>2011-07-19T19:36:09.413+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blog</category><title>Небольшие изменения в блоге</title><description>Здравствуйте, дорогие читатели!&lt;br /&gt;&lt;br /&gt;В последнее время я совсем перестал что-либо крутить-шатать в своей любимой Linux-системе и ударился в программирование. Именно по этой причине блог так долго молчал, и именно поэтому я решил, что пора бы немного расширить тематику.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Итак, с сегодняшнего дня у блога добавляется целых три новых RSS-ленты:&lt;ul&gt;&lt;li&gt;&lt;a href="http://feeds.feedburner.com/DebianiaDebian"&gt;лента, содержащая только посты о Debian&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://feeds.feedburner.com/DebianiaLinux"&gt;ещё одна, содержащая посты о Linux (что, конечно же, включает и то, что написано под тегом debian)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://feeds.feedburner.com/DebianiaProgramming"&gt;и ещё одна, содержащая посты о программировании&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;Старая лента со всеми постами блога продолжит работать.&lt;br /&gt;&lt;br /&gt;Что касается программирования, у меня нет никаких гениальных постов и даже черновиков — просто иногда таки хочется отписаться о каком-то занятном коде, в котором довелось ковыряться, или ещё какой-нибудь мелочи, а некуда.&lt;br /&gt;&lt;br /&gt;Олсо, я некоторое время веду микроблоги на &lt;a href="http://juick.com/Minoru"&gt;Juick&lt;/a&gt;, &lt;a href="http://minoru.psto.net/"&gt;Psto&lt;/a&gt; и, с недавних пор, &lt;a href="http://bnw.im/u/minoru"&gt;BNW&lt;/a&gt; (хотя там я пока что только комментирую), и эти вещи явно «паразитируют» на Дебиании — некоторые мысли так и не развились в полноценные посты, осев короткими очерками в микроблогах. И это печально. Надеюсь, я таки преодолею эту фигню и скоро вы увидите здесь новые статьи.&lt;br /&gt;&lt;br /&gt;Stay tuned, и удачи вам во всех начинаниях!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-7283582451382027759?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/92uwyLMHisk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/92uwyLMHisk/blog-post.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>2</thr:total><feedburner:origLink>http://debiania.blogspot.com/2011/07/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-508920541663002674</guid><pubDate>Tue, 05 Jul 2011 10:01:00 +0000</pubDate><atom:updated>2011-07-15T21:31:35.348+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">debian</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>gtk-vector-screenshot: теперь в Debian sid!</title><description>&lt;a href="http://www.joachim-breitner.de/various/pdf_screenshot_epiphany.pdf"&gt;&lt;img style="margin-right: 0.5em; float:left; width: 108px; height: 300px;" src="http://3.bp.blogspot.com/-zLJ1ityhhqA/Th8R4ObpEkI/AAAAAAAAAgw/Nv2Ih3CKHrQ/s400/pdf_screenshot_epiphany_thumbnail.png" border="0" /&gt;&lt;/a&gt;Вчера автор &lt;code&gt;gtk-vector-screenshot&lt;/code&gt;, Joachim Breitner, сообщил о том, что его разработка успешно создаёт скриншоты окна Epiphany (об этом ему в свою очередь сообщил Martin Borgert). Так что те, кто читал &lt;a href="http://debiania.blogspot.com/2011/06/pdf-gtk-3.html"&gt;мой предыдущий пост&lt;/a&gt; и заинтересовался идеей, могут подключать репозитории sid и ставить себе вкусняшку — она уже работает ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.joachim-breitner.de/blog/archives/508-gtk-vector-screenshot-works-with-epiphany.html"&gt;Оригинальный пост&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPD 14.07.2011:&lt;/b&gt; по просьбам трудящихся своро^Wскопировал из оригинального поста превьюшку PDF'ки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-508920541663002674?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/icRvl57lvtk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/icRvl57lvtk/gtk-vector-screenshot-debian-sid.html</link><author>noreply@blogger.com (Minoru)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-zLJ1ityhhqA/Th8R4ObpEkI/AAAAAAAAAgw/Nv2Ih3CKHrQ/s72-c/pdf_screenshot_epiphany_thumbnail.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://debiania.blogspot.com/2011/07/gtk-vector-screenshot-debian-sid.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-8047322577414699553</guid><pubDate>Mon, 20 Jun 2011 22:01:00 +0000</pubDate><atom:updated>2011-07-15T21:32:10.828+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Скриншоты в PDF с GTK 3</title><description>Для тех, кто не читает &lt;a href='http://planet.debian.org/'&gt;Planet Debian&lt;/a&gt;, маленький итог из двух тамошних постов.&lt;br /&gt;&lt;br /&gt;&lt;a href='http://www.joachim-breitner.de/'&gt;Joachim Breitner&lt;/a&gt; разработал небольшой модуль, который, будучи загруженным вместе с GTK3-приложением, отображает кнопку, с помощью которой можно создать скриншот окна и сохранить его в PDF, SVG, PostScript или даже PNG. Преимуществом таких скриншотов является то, что они представляют собой векторную графику, а значит:&lt;ul&gt;&lt;li&gt;текст на них индексируем и по нему можно производить поиск&lt;/li&gt;&lt;li&gt;они идеально масштабируются, а значит, электронные мануалы с их использованием выглядят привлекательно вне зависимости от разрешения экрана и размеров окна вьювера&lt;/li&gt;&lt;/ul&gt;На пример такого скриншота можно поглядеть в &lt;a href='http://www.joachim-breitner.de/various/pdf_screenshot_3.pdf'&gt;этой pdf'ке&lt;/a&gt;, а &lt;a href='http://www.joachim-breitner.de/various/pdf_screenshot_3.ogv'&gt;здесь&lt;/a&gt; можно скачать скринкаст (Ogg Theora, 2Mb), в котором показан процесс её создания. Архивы с исходниками можно скачать &lt;a href='http://www.joachim-breitner.de/archive/gtk-vector-screenshot/'&gt;здесь&lt;/a&gt;, а репозиторий — &lt;a href='https://gitorious.org/gtk-vector-screenshot'&gt;найти на gitorious.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Собственно, те самые два поста, в которых Joachim описывает свой модуль:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.joachim-breitner.de/blog/archives/494-Better-PDF-screenshots-with-gtk-3.html'&gt;Better PDF screenshots with gtk 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='https://www.joachim-breitner.de/blog/archives/502-gtk-vector-screenshot-code-published.html'&gt;gtk-vector-screenshot code published&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-8047322577414699553?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/nX4uDAocpv0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/nX4uDAocpv0/pdf-gtk-3.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>0</thr:total><feedburner:origLink>http://debiania.blogspot.com/2011/06/pdf-gtk-3.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-6280622005481339543</guid><pubDate>Mon, 02 May 2011 16:25:00 +0000</pubDate><atom:updated>2011-05-10T01:42:54.154+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">review</category><category domain="http://www.blogger.com/atom/ns#">web</category><title>w3crapcli — работаем с веб-сервисами из терминала</title><description>Эра Web 2.0 принесла нам множество чудесных сервисов с соответствующей степени ужасности интерфейсами. Пользователи вынуждены использовать сайт так, как им это навязывают разработчики — вы не можете сохранить видео из ВКонтакте, чтобы просмотреть его любимым проигрывателем; вы не имеете права скачать всю главу манги одним кликом и почитать её в &lt;code&gt;comix&lt;/code&gt; — можно только просматривать постранично в веб-интерфейсе… Примеров много, а выход один — разрабатывать утилиты, позволяющие избавиться от ограниченности предлагаемых интерфейсов. Именно этим и занимаются контрибьюторы проекта, названного w3crapcli — WWW Crap CLI.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;На &lt;a href="http://w3crapcli.tk/"&gt;официальной страничке проекта&lt;/a&gt; так и написано:&lt;div class="quote"&gt;This is an attempt to facilitate the unbearable PAIN while using modern web2.0ish wonders by providing command line interfaces for them.&lt;/div&gt;Впрочем, w3crapcli не зациклен на одних только неудобных интерфейсах — проект содержит также утилиты для работы с google.com, translate.google.com, hpaste.org и многими другими. Некоторые утилиты можно использовать вместо фортунок (например, творчески переосмысленный скрипт muhas'а, предназначенный для получения рандомных фраз с fucking-great-advice.ru), а некоторые — как часть других скриптов (например, &lt;code&gt;htmldecode&lt;/code&gt;, превращающий вещи вроде «&amp;amp;mdash;» в «—»).&lt;br /&gt;&lt;br /&gt;Написано это добро на всём, что попадалось под руку — BASH, Perl, POSIX Shell, даже Haskell. Любители головоломок по достоинству оценят манеру написания кода Сергея Алирзаева, создателя проекта: здесь вам и однобуквенные переменные, и длиннющие однострочники… :)&lt;br /&gt;&lt;br /&gt;Большинство кода распространяется под DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE — очень простой лицензией, которая, как ясно из названия, позволяет вам абсолютно всё. Код же, написанный вашим покорным слугой, лицензирован под моей любимой &lt;a href="http://www.opensource.org/licenses/bsd-license.php"&gt;3-clause BSD License&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Клонируйте &lt;a href="http://w3crapcli.tk/git"&gt;git-репозиторий&lt;/a&gt; (или его &lt;a href="http://repo.or.cz/w/w3crapcli.git"&gt;зеркало&lt;/a&gt;), используйте утилиты, а если у вас есть собственные наработки, которыми вы хотели бы поделиться с проектом — следуйте инструкциям на главной страничке!&lt;br /&gt;&lt;br /&gt;P.S. Прошу прощения перед читателями за столь длительное затишье. Я не бросил блог, меня не украли марсиане — просто не было повода написать. Так что, как говорится, stay tuned — подпишитесь на &lt;a href="http://feeds2.feedburner.com/Debiania"&gt;RSS-ленту&lt;/a&gt;, она не даст вам прозевать следующие посты ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-6280622005481339543?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/iKAzFb_4iOc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/iKAzFb_4iOc/w3crapcli.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>12</thr:total><feedburner:origLink>http://debiania.blogspot.com/2011/05/w3crapcli.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-1806070627311502639</guid><pubDate>Tue, 28 Dec 2010 06:25:00 +0000</pubDate><atom:updated>2010-12-28T08:28:33.013+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">holiday</category><title>День рождения Линуса Торвальдса</title><description>Итак, у Линуса снова день варенья. Сегодня ему исполняется 41, так что пожелаем ему прожить по меньшей мере столько же, успев за это время сделать из Linux ещё более крутое ядро. Пусть сообщество будет сплочённым, люди шлют патчи и объединяются для создания лучших в мире приложений, а обычные пользователи научатся наконец слать багрепорты :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-1806070627311502639?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/buAmA2tzf3s" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/buAmA2tzf3s/blog-post.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>0</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/12/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-6891521172116499471</guid><pubDate>Thu, 23 Dec 2010 15:20:00 +0000</pubDate><atom:updated>2011-12-11T14:53:22.324+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debian</category><title>Как использовать dpatch</title><description>Для полноты картины с пересборкой Debian–пакетов (см. мой &lt;a href="http://debiania.blogspot.com/2010/12/debian.html"&gt;предыдущий пост&lt;/a&gt;) решил перевести статью об использовании тулзы для менеджмента патчей — dpatch.&lt;br /&gt;
&lt;br /&gt;
&lt;p align="right"&gt;Эта статья является переводом поста&lt;br /&gt;
Сандро Тоси (Sandro Tosi) &lt;a href="http://matrixhasu.altervista.org/index.php?view=use_dpatch"&gt;“HowTo use &lt;code&gt;dpatch&lt;/code&gt;”&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
Важным правилом, которому должен следовать каждый сопровождающий пакета, заключается в том, чтобы не допускать изменения апстримового кода (&lt;i&gt;upstream — это разработчики программы, из которой потом создаётся пакет. Прим. переводчика&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Правильный Путь&lt;/i&gt; заключается в создании набора патчей, которые должны применяться к апстримовому коду при создании пакета; это позволит diff.gz содержать только изменения внутри директории debian/, что есть &lt;i&gt;Хорошо&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Популярным инструментом для управления патчами при создании пакетов является dpatch.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;0. Базовые вещи&lt;/h3&gt;&lt;br /&gt;
Прежде всего нужно установить &lt;code&gt;dpatch&lt;/code&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code"&gt;&lt;code&gt;# apt-get install dpatch&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
и добавить &lt;code&gt;dpatch&lt;/code&gt; в поле &lt;code&gt;Build-Depends&lt;/code&gt; в файле &lt;code&gt;debian/control&lt;/code&gt;. Более того, нужно создать директорию &lt;code&gt;debian/patches&lt;/code&gt;: это место, где хранятся патчи.&lt;br /&gt;
&lt;br /&gt;
В этой же директории будет файл &lt;code&gt;debian/patches/00list&lt;/code&gt;: он будет содержать список имён патчей и они будут применены в том порядке, в котором упоминаются в этом файле.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;1. Создание патча&lt;/h3&gt;&lt;br /&gt;
Поставленный ранее пакет содержит полезную утилиту — &lt;code&gt;dpatch-edit-patch&lt;/code&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;заходим в директорию с исходниками пакета&lt;/li&gt;
&lt;li&gt;выполняем&lt;div class="code"&gt;&lt;code&gt;dpatch-edit-patch &amp;lt;имя_патча&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;Будет создана копия директории с исходниками пакета, после чего будет запущен дочерний шелл; делайте свои правки и выходите из шелла (&lt;i&gt;Сделать это можно с помощью команды &lt;code&gt;exit&lt;/code&gt;. Если хотите покинуть шелл, не сохраняя сделанных правок, выполните &lt;code&gt;exit 230&lt;/code&gt;. Прим. переводчика&lt;/i&gt;). После этого будет создан патч &lt;code&gt;debian/patches/имя_патча&lt;/code&gt;, в который будут записаны все ваши правки.&lt;br /&gt;
&lt;br /&gt;
Не забудьте обновить &lt;code&gt;debian/patches/00list&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
Хорошей практикой является добавление в патч сообщения о копирайте. При этом можно использовать примерно такой подход: тривиальные патчи объявляются общественным достоянием, а более сложные лицензируются под той же лицензией, что и программа.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;2. Конвертирование патча&lt;/h3&gt;&lt;br /&gt;
Этот скрипт (спасибо Чарльзу Плесси (Charles Plessy)) принимает на вход модифицированный и оригинальный файлы, создаёт патч в универсальном формате и затем конвертирует его в формат dpatch'а.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code"&gt;&lt;code&gt;diff -u первоначальные-исходники/файл модифицированные-исходники/файл | \&lt;br /&gt;
dpatch patch-template -p "&amp;lt;номер&amp;gt;_&amp;lt;краткое_описание&amp;gt;"   \&lt;br /&gt;
"&amp;lt;что делает патч&amp;gt;" &amp;gt; путь/к/debian/patches/&amp;lt;номер&amp;gt;_&amp;lt;краткое_описание&amp;gt;.dpatch&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
(замените &amp;lt;теги&amp;gt; на подходящие значения).&lt;br /&gt;
&lt;br /&gt;
Обычно патч (по большей части тот, который присылается через систему отслеживания багов) представляет собой файл: для того, чтобы его сконвертировать, замените &lt;code&gt;diff -u ...&lt;/code&gt; на &lt;code&gt;cat /путь/к/файлу.patch&lt;/code&gt; — и всё.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;3. Тестирование патча&lt;/h3&gt;&lt;br /&gt;
Окей, вы только что сотворили патч, но как проверить, что он делает то, что должен? Примените его!&lt;br /&gt;
&lt;br /&gt;
Из распакованного пакета исходного кода (рабочей копии для создания пакета) выполните&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code"&gt;&lt;code&gt;dpatch apply-all&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
а для отмены&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code"&gt;&lt;code&gt;dpatch deapply-all&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;4. Использование &lt;code&gt;dpatch&lt;/code&gt; в &lt;code&gt;debian/rules&lt;/code&gt;&lt;/h3&gt;&lt;br /&gt;
Осталось только дописать &lt;code&gt;debian/rules&lt;/code&gt; таким образом, чтобы патчи из &lt;code&gt;debian/patches/&lt;/code&gt; применялись в порядке, указанном в &lt;code&gt;debian/patches/00list&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
Думаю, самым простым способом будет модифицирование &lt;code&gt;debian/rules&lt;/code&gt; следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code"&gt;&lt;code&gt;include /usr/share/dpatch/dpatch.make&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
build: build-stamp&lt;br /&gt;
build-stamp: patch-stamp&lt;br /&gt;
...&lt;br /&gt;
build stuff here&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
clean: unpatch&lt;br /&gt;
...&lt;br /&gt;
clean stuff here&lt;br /&gt;
...&lt;br /&gt;
...&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
Но если хотите, можете отдельно добавить цели &lt;code&gt;patch&lt;/code&gt; и &lt;code&gt;unpatch&lt;/code&gt;, как показано в следующем примере:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code"&gt;&lt;code&gt;build-stamp: patch&lt;br /&gt;
...&lt;br /&gt;
build stuff here&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
clean: clean1 unpatch&lt;br /&gt;
clean1:&lt;br /&gt;
...&lt;br /&gt;
clean stuff here&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
patch: patch-stamp&lt;br /&gt;
patch-stamp:&lt;br /&gt;
dpatch apply-all -v&lt;br /&gt;
#dpatch call-all -a=pkg-info &gt;patch-stamp&lt;br /&gt;
&lt;br /&gt;
unpatch:&lt;br /&gt;
dpatch deapply-all&lt;br /&gt;
rm -rf patch-stamp debian/patched&lt;br /&gt;
&lt;br /&gt;
binary: binary-indep binary-arch&lt;br /&gt;
.PHONY: build clean binary-indep binary-arch binary install patch unpatch \&lt;br /&gt;
clean1&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
В любом случае, советую следовать первому способу, так как он чище и более устойчив к ошибкам.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;5. Восстановление первоначального апстримового кода&lt;/h3&gt;&lt;br /&gt;
Самой первой вещью, которую должен запомнить каждый сопровождающий пакетов Debian, является: НИКОГДА не менять апстримовый код в своём пакете; вместо этого должны использоваться патчи. Даже если вы следуете этому Руководящему Правилу при создании своих пакетов, вы можете столкнуться с изменениями апстримового кода, когда будете усыновлять пакет.&lt;br /&gt;
&lt;br /&gt;
Существует способ сконвертировать такие изменения (сделанные предыдущим сопровождающим пакета) в патч для &lt;code&gt;dpatch&lt;/code&gt;:&lt;ul&gt;&lt;li&gt;используя &lt;code&gt;apt-get source &amp;lt;пакет&amp;gt;&lt;/code&gt; или какую–либо другую команду, получите пакет исходников; будем считать, что он будет распакован в директорию с именем &amp;lt;пакет-версия&amp;gt; — перейдите в неё (заметим, что исходный файл будет в родительской директории)&lt;/li&gt;
&lt;li&gt;измените &lt;code&gt;debian/rules&lt;/code&gt; так, как показано в предыдущей секции этой статьи&lt;/li&gt;
&lt;li&gt;используйте &lt;code&gt;dpatch-convert-diffgz&lt;/code&gt;: эта утилита берёт .diff.gz, извлекает изменения, выполненные над апстримовым кодом, и конвертирует их в файл dpatch, который будет применяться во время сборки пакета&lt;/li&gt;
&lt;/ul&gt;Если вы управляете своими пакетами старым способом (без контроля версий исходного кода), работа завершена. Я использую Subversion, чтобы управлять своими пакетами, и это требует нескольких дополнительных шагов:&lt;ul&gt;&lt;li&gt;скачиваете пакет с исходными кодами с зеркала репозитория Debian&lt;/li&gt;
&lt;li&gt;распаковываете его во временную директорию &amp;lt;tempdir&amp;gt; (или позвольте &lt;code&gt;apt-get source&lt;/code&gt; сделать это для вас)&lt;/li&gt;
&lt;li&gt;импортируйте в репозиторий SVN (будет произведена проверка рабочей директории — &amp;lt;workdir&amp;gt;)&lt;/li&gt;
&lt;li&gt;переходите в &amp;lt;tempdir&amp;gt; и меняете &lt;code&gt;debian/rules&lt;/code&gt; (после чего выполняете то же самое в &amp;lt;workdir&amp;gt;)&lt;/li&gt;
&lt;li&gt;выполняете &lt;code&gt;dpatch-convert-diffgz 01 restore_pristine_code&lt;/code&gt; (можете выбирать любое имя); будут созданы файлы &lt;code&gt;debian/patches/01_restore_pristine_code.dpatch&lt;/code&gt; и &lt;code&gt;debian/patches/00list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;перемещаете оба вышеупомянутых файла в &amp;lt;workdir&amp;gt; и добавляете их в репозиторий&lt;/li&gt;
&lt;li&gt;возвращаете назад апстримовый код, модифицированный предыдущим сопровождающим; это может означать копирование файлов руками (&lt;code&gt;cp -p ....&lt;/code&gt;) из распакованного апстримового тарболла, либо выполнение &lt;code&gt;fakeroot debian/rules patch ; fakeroot debian/rules unpatch&lt;/code&gt; (действенность последнего способа не гарантируется)&lt;/li&gt;
&lt;/ul&gt;Это немного сложно, но таким образом вы сможете «усыновить» пакет и использовать &lt;code&gt;dpatch&lt;/code&gt;, что есть хорошо.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-6891521172116499471?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/hwAmG6YgouI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/hwAmG6YgouI/dpatch.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>5</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/12/dpatch.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-7903659303355906961</guid><pubDate>Thu, 23 Dec 2010 13:47:00 +0000</pubDate><atom:updated>2010-12-23T20:01:43.366+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debian</category><title>Как пересобирать пакеты Debian</title><description>&lt;p align="right"&gt;Этот пост является переводом&lt;br /&gt;поста Рафаэля Герцога (Raphaël Hertzog)&lt;br /&gt;&lt;a href="http://raphaelhertzog.com/2010/12/15/howto-to-rebuild-debian-packages/"&gt;“Howto to rebuild Debian packages”&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;От переводчика&lt;/b&gt;: мне не хотелось переводить «source package» как «исходный пакет», т.к. такой перевод может наталкивать на мысль о распаковке deb–пакета с бинарниками. Поэтому в статье использован другой перевод — «пакет исходных кодов». Звучит, конечно, убого, но всяко лучше, чем первое.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Умение пересобирать пакеты Debian является очень полезным навыком. Он является необходимым для многих задач, с которыми может столкнуться администратор: включить фичу, выключенную в официальном пакете; пересобрать пакет для использования в другом дистрибутиве (например, пересобрать пакет из Debian Testing для Debian Stable — мы называем это обратным портированием (backporting)); добавить исправление бага, подготовленное разработчиками из апстрима, и так далее. Узнайте о четырёх шагах, позволяющих пересобирать пакеты Debian.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Скачивание пакета с исходным кодом&lt;/h3&gt;&lt;br /&gt;Предпочитаемым путём получения пакетов с исходным кодом является APT. Он может скачивать их из репозиториев с исходниками, прописанных у вас в &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;, например:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;code&gt;deb-src http://ftp.debian.org/debian unstable main contrib non-free&lt;br /&gt;deb-src http://ftp.debian.org/debian testing main contrib non-free&lt;br /&gt;deb-src http://ftp.debian.org/debian stable main contrib non-free&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Заметьте, что строки начинаются с «deb-src» вместо обычного «deb». Это говорит APT'у о том, что мы заинтересованы в пакетах с исходным кодом, а не бинарниками.&lt;br /&gt;&lt;br /&gt;После &lt;code&gt;apt-get update&lt;/code&gt; можно использовать &lt;code&gt;apt-get source publican&lt;/code&gt;, чтобы получить последнюю версию пакета с исходными кодами «publican». Можно также указать дистрибутив, из которого следует получать пакет, используя следующий синтаксис: &lt;i&gt;«package/distribution»&lt;/i&gt;. &lt;code&gt;apt-get source publican/testing&lt;/code&gt; получит пакет с исходниками publican и распакует их в текущую директорию (используя &lt;code&gt;dpkg-source -x&lt;/code&gt;, так что вам понадобится пакет &lt;a href="http://packages.debian.org/dpkg-dev"&gt;dpkg-dev&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;code&gt;$ &lt;b&gt;apt-get source publican/testing&lt;/b&gt;&lt;br /&gt;Reading package lists... Done&lt;br /&gt;Building dependency tree&lt;br /&gt;Reading state information... Done&lt;br /&gt;NOTICE: 'publican' packaging is maintained in the 'Git' version control system at:&lt;br /&gt;git://git.debian.org/collab-maint/publican.git&lt;br /&gt;Need to get 727 kB of source archives.&lt;br /&gt;Get:1 http://nas/debian/ squeeze/main publican 2.1-2 (dsc) [2253 B]&lt;br /&gt;Get:2 http://nas/debian/ squeeze/main publican 2.1-2 (tar) [720 kB]&lt;br /&gt;Get:3 http://nas/debian/ squeeze/main publican 2.1-2 (diff) [4728 B]&lt;br /&gt;Fetched 727 kB in 0s (2970 kB/s)&lt;br /&gt;dpkg-source: info: extracting publican in publican-2.1&lt;br /&gt;dpkg-source: info: unpacking publican_2.1.orig.tar.gz&lt;br /&gt;dpkg-source: info: unpacking publican_2.1-2.debian.tar.gz&lt;br /&gt;$ &lt;b&gt;ls -dF publican*&lt;/b&gt;&lt;br /&gt;publican-2.1/                 publican_2.1-2.dsc&lt;br /&gt;publican_2.1-2.debian.tar.gz  publican_2.1.orig.tar.gz&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Если APT использовать не хочется, или если пакет с исходными кодами лежит не в APT'овском репозитории, можно скачать его с помощью команды &lt;code&gt;dget -u &lt;i&gt;dsc-url&lt;/i&gt;&lt;/code&gt;, где &lt;i&gt;dsc-url&lt;/i&gt; — это URL .dsc–файла, представляющего пакет с сорцами. dget предоставляется пакетом &lt;a href="http://packages.debian.org/stable/devscripts"&gt;devscripts&lt;/a&gt;. Заметим, что опция -u отключает проверку источника пакета перед его распаковкой.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Установка сборочных зависимостей&lt;/h3&gt;&lt;br /&gt;И снова APT сделает за вас всю грязную работу: достаточно лишь запустить &lt;code&gt;apt-get build-dep foo&lt;/code&gt;, и сборочные зависимости для пакета foo будут установлены. Он поддерживает тот же синтаксический сахар, что и &lt;code&gt;apt-get source&lt;/code&gt;, так что для установки зависимостей, требуемых для сборки тестируемой версии publican, можно использовать команду &lt;code&gt;apt-get build-dep publican/testing&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Если пользоваться APT'ом нельзя, перейдите в директорию с распакованным исходным кодом и запустите &lt;code&gt;dpkg-checkbuilddeps&lt;/code&gt;. Он покажет список неудовлетворённых сборочных зависимостей (если такие есть; в противном случае ничего выведено не будет и можно будет спокойно продолжать). Немного копирования–вставки и вызовов apt-get install — и вы за пару секунд установите все необходимые пакеты.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Осуществление изменений&lt;/h3&gt;&lt;br /&gt;Я не буду подробно останавливаться на этом шаге, так как он сильно зависит от преследуемых вами целей. Возможно, вам придётся править debian/rules, а может, вы просто примените патч.&lt;br /&gt;&lt;br /&gt;Впрочем, вне зависимости от того, сделали вы изменения или просто пересобрали пакет в другом окружении, вам следует поменять версию пакета. Это можно сделать с помощью «&lt;code&gt;dch --local foo&lt;/code&gt;» (снова из пакета devscripts), где «foo» следует заменить на короткое имя, идентифицирующее вас как поставщика обновлённой версии. Эта команда обновит debian/changelog и пригласит вас написать короткую заметку о внесённых изменениях.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Сборка пакета&lt;/h3&gt;&lt;br /&gt;Последний шаг — самый простой, так как всё уже на своих местах. Вы должны находиться в директории с распакованными исходниками.&lt;br /&gt;&lt;br /&gt;Теперь запускайте либо «debuild -us -uc» (рекомендуемый выбор, требуется пакет devscripts), либо сразу «dpkg-buildpackage -us -uc». Опции «-us -uc» указывают на то, что шаг подписывания пакета будет пропущен; в противном случае в конце сборки было бы сгенерировано (безобидное) сообщение, если бы у вас не нашлось GPG–ключа для имени, указанного в первой записи в changelog'е.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;code&gt;$ &lt;b&gt;cd publican-2.1&lt;/b&gt;&lt;br /&gt;$ &lt;b&gt;debuild -us -uc&lt;/b&gt;&lt;br /&gt; dpkg-buildpackage -rfakeroot -D -us -uc&lt;br /&gt;dpkg-buildpackage: export CFLAGS from dpkg-buildflags (origin: vendor): -g -O2&lt;br /&gt;dpkg-buildpackage: export CPPFLAGS from dpkg-buildflags (origin: vendor):&lt;br /&gt;dpkg-buildpackage: export CXXFLAGS from dpkg-buildflags (origin: vendor): -g -O2&lt;br /&gt;dpkg-buildpackage: export FFLAGS from dpkg-buildflags (origin: vendor): -g -O2&lt;br /&gt;dpkg-buildpackage: export LDFLAGS from dpkg-buildflags (origin: vendor):&lt;br /&gt;dpkg-buildpackage: source package publican&lt;br /&gt;dpkg-buildpackage: source version 2.1-2rh1&lt;br /&gt;dpkg-buildpackage: source changed by Raphaël Hertzog &lt;br /&gt; dpkg-source --before-build publican-2.1&lt;br /&gt;dpkg-buildpackage: host architecture i386&lt;br /&gt;[...]&lt;br /&gt;dpkg-deb: building package `publican' in `../publican_2.1-2rh1_all.deb'.&lt;br /&gt; dpkg-genchanges  &gt;../publican_2.1-2rh1_i386.changes&lt;br /&gt;dpkg-genchanges: not including original source code in upload&lt;br /&gt; dpkg-source --after-build publican-2.1&lt;br /&gt;dpkg-buildpackage: binary and diff upload (original source NOT included)&lt;br /&gt;Now running lintian...&lt;br /&gt;Finished running lintian.&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Сборка завершена, обновлённые пакеты с исходным кодом и бинарниками были сгенерированы в родительской директории.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;code&gt;$ &lt;b&gt;cd ..&lt;/b&gt;&lt;br /&gt;$ &lt;b&gt;ls -dF publican*&lt;/b&gt;&lt;br /&gt;publican-2.1/                    publican_2.1-2rh1.dsc&lt;br /&gt;publican_2.1-2.debian.tar.gz     publican_2.1-2rh1_i386.changes&lt;br /&gt;publican_2.1-2.dsc               publican_2.1-2rh1_source.changes&lt;br /&gt;publican_2.1-2rh1_all.deb        publican_2.1.orig.tar.gz&lt;br /&gt;publican_2.1-2rh1.debian.tar.gz&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-7903659303355906961?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/s4qUiOgEI44" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/s4qUiOgEI44/debian.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>9</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/12/debian.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-8012981789957988729</guid><pubDate>Thu, 23 Dec 2010 13:10:00 +0000</pubDate><atom:updated>2011-07-15T21:11:14.224+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips'n'tricks</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Патч Advanced Copy для coreutils 8.5</title><description>Привет!&lt;br /&gt;&lt;br /&gt;Полтора часа назад в &lt;a href="http://psto.net/"&gt;псто&lt;/a&gt; пролетело упоминание об интересном патче для &lt;code&gt;coreutils&lt;/code&gt; &lt;a href="http://www.beatex.org/web/advancedcopy.html"&gt;Advanced Copy&lt;/a&gt;, добавляющем в &lt;code&gt;cp&lt;/code&gt; и &lt;code&gt;mv&lt;/code&gt; прогресс–бар. Выглядит это так:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;code&gt;% cp -g ~/torrents/downloads/Patent_Absurdity_HQ_768kbit.ogv /dev/null&lt;br /&gt;cp: переписать «/dev/null»? &lt;b&gt;y&lt;/b&gt;344                                      &lt;br /&gt;                                                                              &lt;br /&gt;0 files copied so far...                                 135,7 MiB / 159,5 MiB&lt;br /&gt;[||||||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------] 85,1 %&lt;br /&gt;Copying at   1,0 GiB/s (about 0h 0m 0s remaining)&lt;br /&gt;...ru/torrents/downloads/Patent_Absurdity_HQ_768kbit.ogv 135,7 MiB / 159,4 MiB&lt;br /&gt;[||||||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------] 85,2 %&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Польза этой штуки лично для меня под вопросом, но я решил всё же попробовать её. Так как в Debian Squeeze сейчас уже &lt;code&gt;coreutils&lt;/code&gt; версии 8.5, патч пришлось немного поправить. Модифицированную версию можно &lt;a href="http://ix.io/1kI"&gt;скачать&lt;/a&gt; или &lt;a href="http://ix.io/1kI/diff"&gt;смотреть онлайн&lt;/a&gt; (вторая ссылка отличается наличием подсветки). Также на всякий случай добавлю его в пост — как говаривал &lt;b&gt;virens&lt;/b&gt;, сторонние сервисы могут отказывать, но если уж упадёт блог…&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;code&gt;&lt;font face="monospace"&gt; &lt;font color="#008000"&gt;diff -Nru coreutils-8.5/src/copy.c coreutils-8.5-1/src/copy.c&lt;/font&gt;&lt;br&gt; &lt;font color="#008000"&gt;--- coreutils-8.5/src/copy.c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2010-04-20 22:52:04.000000000 +0300&lt;/font&gt;&lt;br&gt; &lt;font color="#008000"&gt;+++ coreutils-8.5-1/src/copy.c&amp;nbsp;&amp;nbsp;2010-12-23 13:51:23.000000000 +0200&lt;/font&gt;&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -457,6 +457,56 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; return lchmod (name, mode);&lt;br&gt; &amp;nbsp;}&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#008080"&gt;+/* BEGIN progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+static void file_progress_bar ( char * _cDest, int _iBarLength, int _iProgress, int _iTotal )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;// write number to progress bar&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;float fPercent = ( float ) _iProgress / ( float ) _iTotal * 100.f;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;sprintf ( _cDest + ( _iBarLength - 6 ), &amp;quot;%4.1f&amp;quot;, fPercent );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;// remove zero&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;_cDest[_iBarLength - 2] = ' ';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;// fill rest with '-'&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;int i;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;for ( i = 1; i &amp;lt;= _iBarLength - 9; i++ )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( fPercent &amp;gt; ( float ) ( i - 1 ) / ( _iBarLength - 10 ) * 100.f )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_cDest[i] = '|';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_cDest[i] = '-';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+int file_size_format ( char * _cDst, int _iSize, int _iCounter )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;int iCounter = _iCounter;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;double dSize = ( double ) _iSize;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;while ( dSize &amp;gt;= 1000. )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dSize /= 1024.;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iCounter++;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;/* get unit */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;char * sUnit;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;if ( iCounter == 0 )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sUnit = &amp;quot;B&amp;quot;;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;else if ( iCounter == 1 )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sUnit = &amp;quot;KiB&amp;quot;;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;else if ( iCounter == 2 )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sUnit = &amp;quot;MiB&amp;quot;;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;else if ( iCounter == 3 )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sUnit = &amp;quot;GiB&amp;quot;;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;else if ( iCounter == 4 )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sUnit = &amp;quot;TiB&amp;quot;;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;else&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sUnit = &amp;quot;N/A&amp;quot;;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;/* write number */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;return sprintf ( _cDst, &amp;quot;%5.1f %s&amp;quot;, dSize, sUnit );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+/* END progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;/* Copy a regular file from SRC_NAME to DST_NAME.&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If the source file contains holes, copies holes and blocks of zeros&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;in the source file as holes in the destination file.&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -709,8 +759,146 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf_alloc = xmalloc (buf_size + buf_alignment_slop);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf = ptr_align (buf_alloc, buf_alignment);&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* BEGIN progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* create a field of 6 lines */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char ** cProgressField = ( char ** ) calloc ( 6, sizeof ( char * ) );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* get console width */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int iBarLength = 80;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct winsize win;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( ioctl (STDOUT_FILENO, TIOCGWINSZ, (char *) &amp;amp;win) == 0 &amp;amp;&amp;amp; win.ws_col &amp;gt; 0 )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iBarLength = win.ws_col;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* create rows */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int it;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ( it = 0; it &amp;lt; 6; it++ )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[it] = ( char * ) malloc ( iBarLength + 1 );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* init with spaces */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int j;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ( j = 0; j &amp;lt; iBarLength; j++ )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[it][j] = ' ';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[it][iBarLength] = '\0';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* global progress bar? */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( g_iTotalSize )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* init global progress bar */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[2][0] = '[';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[2][iBarLength - 8] = ']';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[2][iBarLength - 7] = ' ';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[2][iBarLength - 1] = '%';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* total size */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[1][iBarLength - 11] = '/';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_size_format ( cProgressField[1] + iBarLength - 9, g_iTotalSize, 1 );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* show how many files were written */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int sum_length = sprintf ( cProgressField[1], &amp;quot;%d files copied so far...&amp;quot;, g_iFilesCopied );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[1][sum_length] = ' ';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* truncate filename? */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int fn_length;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( strlen ( src_name ) &amp;gt; iBarLength - 22 )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fn_length =&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf ( cProgressField[4], &amp;quot;...%s&amp;quot;, src_name + ( strlen ( src_name ) - iBarLength + 25 ) );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fn_length = sprintf ( cProgressField[4], &amp;quot;%s&amp;quot;, src_name );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[4][fn_length] = ' ';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* filesize */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[4][iBarLength - 11] = '/';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_size_format ( cProgressField[4] + iBarLength - 9, src_open_sb.st_size, 0 );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int iCountDown = 1;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char * sProgressBar = cProgressField[5];&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sProgressBar[0] = '[';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sProgressBar[iBarLength - 8] = ']';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sProgressBar[iBarLength - 7] = ' ';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sProgressBar[iBarLength - 1] = '%';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* this will always save the time in between */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct timeval last_time;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gettimeofday ( &amp;amp; last_time, NULL );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int last_size = g_iTotalWritten;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* END progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (;;)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (progress) {&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* BEGIN progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* update countdown */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iCountDown--;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( iCountDown &amp;lt; 0 )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iCountDown = 100;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* just print one line with the percentage, but not always */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( iCountDown == 0 )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* calculate current speed */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct timeval cur_time;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gettimeofday ( &amp;amp; cur_time, NULL );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int cur_size = g_iTotalWritten + n_read_total / 1024;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int usec_elapsed = cur_time.tv_usec - last_time.tv_usec;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double sec_elapsed = ( double ) usec_elapsed / 1000000.f;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sec_elapsed += ( double ) ( cur_time.tv_sec - last_time.tv_sec );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int copy_speed = ( int ) ( ( double ) ( cur_size - last_size )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/ sec_elapsed );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char s_copy_speed[20];&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_size_format ( s_copy_speed, copy_speed, 1 );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* update vars */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last_time = cur_time;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last_size = cur_size;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* how many time has passed since the start? */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int isec_elapsed = cur_time.tv_sec - g_oStartTime.tv_sec;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int sec_remaining = ( int ) ( ( double ) isec_elapsed / cur_size&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* g_iTotalSize ) - isec_elapsed;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int min_remaining = sec_remaining / 60;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sec_remaining -= min_remaining * 60;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int hours_remaining = min_remaining / 60;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_remaining -= hours_remaining * 60;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* print out */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf ( cProgressField[3],&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Copying at %s/s (about %dh %dm %ds remaining)&amp;quot;, s_copy_speed,&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hours_remaining, min_remaining, sec_remaining );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int fs_len;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( g_iTotalSize )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* global progress bar */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_progress_bar ( cProgressField[2], iBarLength,&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iTotalWritten + n_read_total / 1024, g_iTotalSize );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* print the global status */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs_len = file_size_format ( cProgressField[1] + iBarLength - 21,&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iTotalWritten + n_read_total / 1024, 1 );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[1][iBarLength - 21 + fs_len] = ' ';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* current progress bar */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_progress_bar ( sProgressBar, iBarLength, n_read_total, src_open_sb.st_size );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* print the status */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs_len = file_size_format ( cProgressField[4] + iBarLength - 21, n_read_total, 0 );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cProgressField[4][iBarLength - 21 + fs_len] = ' ';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* print the field */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ( it = g_iTotalSize ? 0 : 3; it &amp;lt; 6; it++ )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\033[K%s\n&amp;quot;, cProgressField[it] );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( strlen ( cProgressField[it] ) &amp;lt; iBarLength )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( g_iTotalSize )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\r\033[6A&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\r\033[3A&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fflush ( stdout );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* END progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; word *wp = NULL;&lt;br&gt; &amp;nbsp;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ssize_t n_read = read (source_desc, buf, buf_size);&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -791,6 +979,19 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/proc with linux kernels from at least 2.6.9 .. 2.6.29.&amp;nbsp;&amp;nbsp;*/&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;font color="#008080"&gt;+if (progress) {&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* BEGIN progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* update total size */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iTotalWritten += n_read_total / 1024;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iFilesCopied++;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ( i = 0; i &amp;lt; 6; i++ )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free ( cProgressField[i] );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free ( cProgressField );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* END progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* If the file ends with a `hole', we need to do something to record&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;the length of the file.&amp;nbsp;&amp;nbsp;On modern systems, calling ftruncate does&lt;br&gt; &lt;font color="#008000"&gt;diff -Nru coreutils-8.5/src/copy.h coreutils-8.5-1/src/copy.h&lt;/font&gt;&lt;br&gt; &lt;font color="#008000"&gt;--- coreutils-8.5/src/copy.h&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2010-04-20 22:52:04.000000000 +0300&lt;/font&gt;&lt;br&gt; &lt;font color="#008000"&gt;+++ coreutils-8.5-1/src/copy.h&amp;nbsp;&amp;nbsp;2010-12-23 13:52:40.000000000 +0200&lt;/font&gt;&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -223,6 +223,10 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Create destination directories as usual. */&lt;br&gt; &amp;nbsp;&amp;nbsp; bool symbolic_link;&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;/* if true, draw a nice progress bar on screen */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;bool progress_bar;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; /* If true, do not copy a nondirectory that has an existing destination&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with the same or newer modification time. */&lt;br&gt; &amp;nbsp;&amp;nbsp; bool update;&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -281,4 +285,15 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;bool chown_failure_ok (struct cp_options const *);&lt;br&gt; &amp;nbsp;mode_t cached_umask (void);&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#008080"&gt;+/* BEGIN progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+int file_size_format ( char * _cDst, int _iSize, int _iCounter );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+long g_iTotalSize;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+long g_iTotalWritten;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+int g_iFilesCopied;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+struct timeval g_oStartTime;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+int g_iTotalFiles;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+bool progress;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+/* END progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;#endif&lt;br&gt; &lt;font color="#008000"&gt;diff -Nru coreutils-8.5/src/cp.c coreutils-8.5-1/src/cp.c&lt;/font&gt;&lt;br&gt; &lt;font color="#008000"&gt;--- coreutils-8.5/src/cp.c&amp;nbsp;&amp;nbsp;2010-03-13 17:14:09.000000000 +0200&lt;/font&gt;&lt;br&gt; &lt;font color="#008000"&gt;+++ coreutils-8.5-1/src/cp.c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2010-12-23 13:55:44.000000000 +0200&lt;/font&gt;&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -139,6 +139,7 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; {&amp;quot;target-directory&amp;quot;, required_argument, NULL, 't'},&lt;br&gt; &amp;nbsp;&amp;nbsp; {&amp;quot;update&amp;quot;, no_argument, NULL, 'u'},&lt;br&gt; &amp;nbsp;&amp;nbsp; {&amp;quot;verbose&amp;quot;, no_argument, NULL, 'v'},&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;{&amp;quot;progress-bar&amp;quot;, no_argument, NULL, 'g'},&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; {GETOPT_HELP_OPTION_DECL},&lt;br&gt; &amp;nbsp;&amp;nbsp; {GETOPT_VERSION_OPTION_DECL},&lt;br&gt; &amp;nbsp;&amp;nbsp; {NULL, 0, NULL, 0}&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -176,6 +177,7 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; -f, --force&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if an existing destination file cannot be\n\&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;opened, remove it and try again (redundant if\n\&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;the -n option is used)\n\&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;-g, --progress-bar&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add progress-bar\n\&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; -i, --interactive&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prompt before overwrite (overrides a previous -n\n\&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; option)\n\&lt;br&gt; &amp;nbsp;&amp;nbsp; -H&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; follow command-line symbolic links in SOURCE\n\&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -612,6 +614,57 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quote (file[n_files - 1]));&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct timeval start_time;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+if (progress) {&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* BEGIN progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iTotalSize = 0;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iFilesCopied = 0;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iTotalWritten = 0;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* save time */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gettimeofday ( &amp;amp; start_time, NULL );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_oStartTime = start_time;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;Calculating total size... \r&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fflush ( stdout );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long iTotalSize = 0;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int iFiles = n_files;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( ! target_directory )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iFiles = n_files - 1;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int j;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (j = 0; j &amp;lt; iFiles; j++)&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* call du -s for each file */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* create command */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char command[1024];&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf ( command, &amp;quot;du -s \&amp;quot;%s\&amp;quot;&amp;quot;, file[j] );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* TODO: replace all quote signs in file[i] */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *fp;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char output[1024];&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* run command */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fp = popen(command, &amp;quot;r&amp;quot;);&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (fp == NULL || fgets(output, sizeof(output)-1, fp) == NULL) {&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;failed to run du.\n&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* isolate size */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strchr ( output, '\t' )[0] = '\0';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iTotalSize += atol ( output );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;Calculating total size... %ld\r&amp;quot;, iTotalSize );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fflush ( stdout );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* close */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pclose(fp);&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iTotalSize = iTotalSize;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* END progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; if (target_directory)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* cp file1...filen edir&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -754,6 +807,46 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ok = copy (source, new_dest, 0, x, &amp;amp;unused, NULL);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#008080"&gt;+if (progress) {&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* BEGIN progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* remove everything */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( g_iTotalSize )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ( i = 0; i &amp;lt; 6; i++ )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\033[K\n&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\r\033[6A&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ( i = 0; i &amp;lt; 3; i++ )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\033[K\n&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\r\033[3A&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* save time */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct timeval end_time;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gettimeofday ( &amp;amp; end_time, NULL );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int usec_elapsed = end_time.tv_usec - start_time.tv_usec;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double sec_elapsed = ( double ) usec_elapsed / 1000000.f;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sec_elapsed += ( double ) ( end_time.tv_sec - start_time.tv_sec );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* get total size */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char sTotalWritten[20];&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_size_format ( sTotalWritten, g_iTotalSize, 1 );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* TODO: using g_iTotalWritten would be more correct, but is less accurate */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* calculate speed */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int copy_speed = ( int ) ( ( double ) g_iTotalWritten / sec_elapsed );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char s_copy_speed[20];&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_size_format ( s_copy_speed, copy_speed, 1 );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* good-bye message */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;%d files (%s) copied in %.1f seconds (%s/s).\n&amp;quot;, g_iFilesCopied, sTotalWritten,&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sec_elapsed, s_copy_speed );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* END progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; return ok;&lt;br&gt; &amp;nbsp;}&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -785,6 +878,7 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; x-&amp;gt;recursive = false;&lt;br&gt; &amp;nbsp;&amp;nbsp; x-&amp;gt;sparse_mode = SPARSE_AUTO;&lt;br&gt; &amp;nbsp;&amp;nbsp; x-&amp;gt;symbolic_link = false;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;x-&amp;gt;progress_bar = false;&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; x-&amp;gt;set_mode = false;&lt;br&gt; &amp;nbsp;&amp;nbsp; x-&amp;gt;mode = 0;&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -923,7 +1017,7 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;we'll actually use backup_suffix_string.&amp;nbsp;&amp;nbsp;*/&lt;br&gt; &amp;nbsp;&amp;nbsp; backup_suffix_string = getenv (&amp;quot;SIMPLE_BACKUP_SUFFIX&amp;quot;);&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#c000c0"&gt;-&amp;nbsp;&amp;nbsp;while ((c = getopt_long (argc, argv, &amp;quot;abdfHilLnprst:uvxPRS:T&amp;quot;,&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;while ((c = getopt_long (argc, argv, &amp;quot;abdfgHilLnprst:uvxPRS:T&amp;quot;,&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long_opts, NULL))&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!= -1)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -975,6 +1069,10 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.unlink_dest_after_failed_open = true;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 'g':&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;progress = true;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 'H':&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.dereference = DEREF_COMMAND_LINE_ARGUMENTS;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br&gt; &lt;font color="#008000"&gt;diff -Nru coreutils-8.5/src/mv.c coreutils-8.5-1/src/mv.c&lt;/font&gt;&lt;br&gt; &lt;font color="#008000"&gt;--- coreutils-8.5/src/mv.c&amp;nbsp;&amp;nbsp;2010-01-01 15:06:47.000000000 +0200&lt;/font&gt;&lt;br&gt; &lt;font color="#008000"&gt;+++ coreutils-8.5-1/src/mv.c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2010-12-23 13:59:21.000000000 +0200&lt;/font&gt;&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -64,6 +64,7 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; {&amp;quot;target-directory&amp;quot;, required_argument, NULL, 't'},&lt;br&gt; &amp;nbsp;&amp;nbsp; {&amp;quot;update&amp;quot;, no_argument, NULL, 'u'},&lt;br&gt; &amp;nbsp;&amp;nbsp; {&amp;quot;verbose&amp;quot;, no_argument, NULL, 'v'},&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;{&amp;quot;progress-bar&amp;quot;, no_argument, NULL, 'g'},&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; {GETOPT_HELP_OPTION_DECL},&lt;br&gt; &amp;nbsp;&amp;nbsp; {GETOPT_VERSION_OPTION_DECL},&lt;br&gt; &amp;nbsp;&amp;nbsp; {NULL, 0, NULL, 0}&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -159,10 +160,94 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;static bool&lt;br&gt; &amp;nbsp;do_move (const char *source, const char *dest, const struct cp_options *x)&lt;br&gt; &amp;nbsp;{&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;struct timeval start_time;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;if(progress) {&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* BEGIN progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iTotalSize = 0;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iFilesCopied = 0;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iTotalWritten = 0;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gettimeofday (&amp;amp; start_time, NULL);&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_oStartTime = start_time;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&amp;quot;Calculating total size... \r&amp;quot;);&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fflush (stdout);&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long iTotalSize = 0;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* call du -s for each file */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* create command */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char command[1024];&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf ( command, &amp;quot;du -s \&amp;quot;%s\&amp;quot;&amp;quot;, source );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* TODO: replace all quote signs in file[i] */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *fp;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char output[1024];&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* run command */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fp = popen(command, &amp;quot;r&amp;quot;);&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (fp == NULL || fgets(output, sizeof(output)-1, fp) == NULL) {&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;failed to run du.\n&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* isolate size */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strchr ( output, '\t' )[0] = '\0';&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iTotalSize += atol ( output );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;Calculating total size... %ld\r&amp;quot;, iTotalSize );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fflush ( stdout );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* close */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pclose(fp);&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_iTotalSize = iTotalSize;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* END progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; bool copy_into_self;&lt;br&gt; &amp;nbsp;&amp;nbsp; bool rename_succeeded;&lt;br&gt; &amp;nbsp;&amp;nbsp; bool ok = copy (source, dest, false, x, &amp;amp;copy_into_self, &amp;amp;rename_succeeded);&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;if (progress) {&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* BEGIN progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* remove everything */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( g_iTotalSize )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ( i = 0; i &amp;lt; 6; i++ )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\033[K\n&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\r\033[6A&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ( i = 0; i &amp;lt; 3; i++ )&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\033[K\n&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;\r\033[3A&amp;quot; );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* save time */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct timeval end_time;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gettimeofday ( &amp;amp; end_time, NULL );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int usec_elapsed = end_time.tv_usec - start_time.tv_usec;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double sec_elapsed = ( double ) usec_elapsed / 1000000.f;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sec_elapsed += ( double ) ( end_time.tv_sec - start_time.tv_sec );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* get total size */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char sTotalWritten[20];&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_size_format ( sTotalWritten, g_iTotalSize, 1 );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* TODO: using g_iTotalWritten would be more correct, but is less accurate */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* calculate speed */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int copy_speed = ( int ) ( ( double ) g_iTotalWritten / sec_elapsed );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char s_copy_speed[20];&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_size_format ( s_copy_speed, copy_speed, 1 );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* good-bye message */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ( &amp;quot;%d files (%s) moved in %.1f seconds (%s/s).\n&amp;quot;, g_iFilesCopied, sTotalWritten,&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sec_elapsed, s_copy_speed );&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* END progress mod */&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; if (ok)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char const *dir_to_remove;&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -298,6 +383,7 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --backup[=CONTROL]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; make a backup of each existing destination file\n\&lt;br&gt; &amp;nbsp;&amp;nbsp; -b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; like --backup but does not accept an argument\n\&lt;br&gt; &amp;nbsp;&amp;nbsp; -f, --force&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do not prompt before overwriting\n\&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;-g, --progress-bar&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add progress-bar\n\&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp; -i, --interactive&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prompt before overwrite\n\&lt;br&gt; &amp;nbsp;&amp;nbsp; -n, --no-clobber&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do not overwrite an existing file\n\&lt;br&gt; &amp;nbsp;If you specify more than one of -i, -f, -n, only the final one takes effect.\n\&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -366,7 +452,7 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;we'll actually use backup_suffix_string.&amp;nbsp;&amp;nbsp;*/&lt;br&gt; &amp;nbsp;&amp;nbsp; backup_suffix_string = getenv (&amp;quot;SIMPLE_BACKUP_SUFFIX&amp;quot;);&lt;br&gt; &amp;nbsp;&lt;br&gt; &lt;font color="#c000c0"&gt;-&amp;nbsp;&amp;nbsp;while ((c = getopt_long (argc, argv, &amp;quot;bfint:uvS:T&amp;quot;, long_options, NULL))&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;while ((c = getopt_long (argc, argv, &amp;quot;bfint:uvgS:T&amp;quot;, long_options, NULL))&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!= -1)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (c)&lt;br&gt; &lt;font color="#8b0000"&gt;@@ -411,6 +497,9 @@&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 'v':&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.verbose = true;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 'g':&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;progress = true;&lt;/font&gt;&lt;br&gt; &lt;font color="#008080"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/font&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 'S':&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; make_backups = true;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; backup_suffix_string = optarg;&lt;br&gt; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-8012981789957988729?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/09Tb4v6XWo4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/09Tb4v6XWo4/advanced-copy-coreutils-85.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>11</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/12/advanced-copy-coreutils-85.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-4057795410255456529</guid><pubDate>Sun, 26 Sep 2010 18:41:00 +0000</pubDate><atom:updated>2011-07-15T21:12:17.379+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips'n'tricks</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>rm all but…</title><description>Иногда возникает такая вот задача: нужно удалить все файлы, кроме одного (или пары) из них. Раньше я не знал, как это сделать, но вчера научился — слава &lt;a href="http://www.commandlinefu.com/commands/view/6652/remove-all-but-one-specific-file"&gt;commandlinefu&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Итак, сначала вариант для моего любимого ZSH:&lt;br /&gt;&lt;div class="code"&gt;&lt;code&gt;$ setopt extended_globs&lt;br /&gt;$ rm ^file # удаляем всё, кроме file&lt;br /&gt;$ rm ^(some|files) # удаляем всё, кроме some и files&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;А теперь — для BASH:&lt;br /&gt;&lt;div class="code"&gt;&lt;code&gt;$ shopt -s extglob&lt;br /&gt;$ rm !(file)&lt;br /&gt;$ rm !(some|files)&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-4057795410255456529?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/Qg8ZfSZJhvo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/Qg8ZfSZJhvo/rm-all-but.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>1</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/09/rm-all-but.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-8827824926028427088</guid><pubDate>Fri, 06 Aug 2010 21:34:00 +0000</pubDate><atom:updated>2011-07-15T21:12:35.561+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips'n'tricks</category><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">debian</category><title>Пропуск проверки ФС при загрузке с CTRL-C</title><description>Эта маленькая заметка — перевод &lt;a href='http://www.lucas-nussbaum.net/blog/?p=511'&gt;поста Лукаса Нуссбаума (Lucas Hussbaum)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Согласно закону Мерфи, проверка &lt;code&gt;fsck&lt;/code&gt;, происходящая каждые n загрузок, всегда случается в самое неподходящее время. По умолчанию, прерывание проверки с помощью &lt;code&gt;CTRL-C&lt;/code&gt; заставляет &lt;code&gt;fsck&lt;/code&gt; возвращать код ошибки, что приводит к перемонтированию файловой системы в режиме «только чтение». Но это легко меняется правкой &lt;code&gt;/etc/e2fsck.conf&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;code&gt;[options]&lt;br /&gt;allow_cancellation = true&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-8827824926028427088?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/IlFRLmukBVk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/IlFRLmukBVk/ctrl-c.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>0</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/08/ctrl-c.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-1368272927494624296</guid><pubDate>Sun, 25 Jul 2010 18:43:00 +0000</pubDate><atom:updated>2011-07-15T21:12:43.992+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips'n'tricks</category><title>«Мигающие» субтитры в MPlayer</title><description>Недавно столкнулся с тем, что субтитры в MPlayer как бы «мигают»: появляются, через миг пропадают, а ещё через миг появляются снова, уже никуда не пропадая — до следующей фразы. Наблюдалось такое несчастье только с SubStation Alpha (расширение &lt;code&gt;.ssa&lt;/code&gt; или &lt;code&gt;.ass&lt;/code&gt;). Отключение опции &lt;code&gt;-ass&lt;/code&gt; помогает, но смотреть без оформления не так интересно…&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;К счастью, всё легко чинится — просто добавьте опцию &lt;code&gt;-correct-pts&lt;/code&gt;. Согласно ману:&lt;div class="quote"&gt;&lt;b&gt;&lt;code&gt;-correct-pts&lt;/code&gt; (экспериментально)&lt;/b&gt;&lt;br /&gt;Переключает MPlayer в экспериментальный  режим, в котором тайминг видео кадров рассчитываются независимо, и тем самым поддерживаются видео фильтры, добавляющие новые кадры или меняющие тайминг существующих. Более точный тайминг может быть заметен, например, при воспроизведении с опцией &lt;code&gt;-ass&lt;/code&gt; субтитров, привязанных к смене сцены. Без &lt;code&gt;-correct-pts&lt;/code&gt; тайминг субтитров, как правило, будет отключен некоторыми кадрами. С некоторыми демультиплексорами и кодеками эта опция работает некорректно.&lt;/div&gt;&lt;br /&gt;Ну а чтобы не указывать её каждый раз, допишите в конфиг такую строку:&lt;div class="code"&gt;&lt;code&gt;correct-pts=1&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-1368272927494624296?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/8BrTAAPtY_A" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/8BrTAAPtY_A/mplayer.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>3</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/07/mplayer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-3010948863410046262</guid><pubDate>Sun, 13 Jun 2010 22:36:00 +0000</pubDate><atom:updated>2010-11-16T21:52:17.603+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips'n'tricks</category><title>Создание Djvu документов в Linux от А до Я</title><description>Если с PDF всё ясно и понятно, то сборка djvu–документов часто является неким сокровенным знанием. &lt;a href="http://www.howtoforge.com/creating_djvu_documents_on_linux"&gt;Наиболее полный мануал&lt;/a&gt; почему–то обходит стороной такие (довольно важные) моменты, как кодирование цветных изображений и распознавание текста, так что я решил восполнить сей пробел и написать этот пост (позже было добавлено ещё несколько разделов — смотрите раздел &lt;a href="#updates"&gt;UPD&lt;/a&gt;). Большая его часть будет пересказом упомянутого руководства; дополнениями станут рассказ о кодировании полноцветных изображений и пояснения к созданию текстового слоя. Для удобства я разбил пост на отдельные части:&lt;ol&gt;&lt;li&gt;&lt;a href="http://debiania.blogspot.com/2010/06/djvu-linux.html#intro"&gt;Вводные замечания&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://debiania.blogspot.com/2010/06/djvu-linux.html#compressing_whitenblack_images"&gt;Кодирование чёрно–белых изображений&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://debiania.blogspot.com/2010/06/djvu-linux.html#compressing_grayscale_images"&gt;Кодирование оттенков серого&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://debiania.blogspot.com/2010/06/djvu-linux.html#compressing_fullcolor_images"&gt;Кодирование цветных изображений&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://debiania.blogspot.com/2010/06/djvu-linux.html#ocr"&gt;Распознавание текста (OCR) и создание текстового слоя&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://debiania.blogspot.com/2010/06/djvu-linux.html#links_in_table_of_contents"&gt;Ссылки в оглавлении&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://debiania.blogspot.com/2010/06/djvu-linux.html#metainformation"&gt;Метаинформация&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://debiania.blogspot.com/2010/06/djvu-linux.html#dealing_with_non-ascii_symbols"&gt;Работа с не–ASCII символами&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://debiania.blogspot.com/2010/06/djvu-linux.html#creating_djvu_file"&gt;Сборка итогового djvu–документа&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;a name="intro"&gt;&lt;/a&gt;&lt;h3&gt;Вводные замечания&lt;/h3&gt;Итак, последовательность создания djvu–документа примерно такова:&lt;ol&gt;&lt;li&gt;Сканирование книги и чистка сканов (по возможности, фон должен быть белым, а текст — чёрным) &lt;i&gt;(этот пункт в данной статье не рассматривается — предполагается, что сканы у вас уже есть; если это не так, сканируйте, обрабатывайте результат — кстати, комментаторы настоятельно рекомендуют использовать Scan Tailor — и возвращайтесь к этой статье);&lt;/i&gt;&lt;/li&gt;&lt;li&gt;сжатие каждой страницы &lt;u&gt;отдельно&lt;/u&gt; в зависимости от её содержания (не бойтесь слова «отдельно» — операции легко автоматизируются и, скорее всего, вам подойдёт сжатие всех страниц в оттенках серого);&lt;/li&gt;&lt;li&gt;опционально — добавление текстового слоя;&lt;/li&gt;&lt;li&gt;сборка из полученных отельных djvu–файлов одного, финального.&lt;/li&gt;&lt;/ol&gt;Теперь касательно используемых программ: фактически нам нужны только утилиты, входящие в пакеты &lt;code&gt;djvulibre-bin&lt;/code&gt;, &lt;code&gt;netpbm&lt;/code&gt; и &lt;code&gt;imagemagick&lt;/code&gt;. Всё это добро легко ставится из репозиториев:&lt;div class="code"&gt;&lt;code&gt;$ sudo aptitude install djvulibre-bin netpbm imagemagick&lt;/code&gt;&lt;/div&gt;Ну что же, план действий у нас есть, снаряжение подготовлено — в путь, друзья!&lt;br /&gt;&lt;br /&gt;&lt;a name="compressing_whitenblack_images"&gt;&lt;/a&gt;&lt;h3&gt;Кодирование чёрно–белых изображений&lt;/h3&gt;Сжимать сканы в чёрно–белом режиме имеет смысл только в том случае, когда полиграфия действительно качественная, а сканы практически идеальны — в противном случае вы рискуете получить некачественное изображение и/или много шума. Итак, для сжатия изображения в чёрно–белом режиме исходник надо перевести в формат pbm. Сделать это можно, используя утилиты из пакета &lt;code&gt;netpbm&lt;/code&gt;:&lt;div class="code"&gt;&lt;code&gt;$ anytopnm ИМЯ_ИСХОДНОГО_ФАЙЛА | ppmtopgm | pgmtopbm -value 0.499 &amp;gt; ВЫХОДНОЙ_ФАЙЛ.pbm&lt;/code&gt;&lt;/div&gt;Если вы именовали сканы последовательными номерами, можно использовать цикл. Так, следующая конструкция сконвертирует все tiff–файлы в pbm, меняя расширение:&lt;div class="code"&gt;&lt;code&gt;for file in *.tiff; do anytopnm $file | ppmtopgm | pgmtopbm -value 0.499 &amp;gt; ${file%tiff}pbm; done&lt;/code&gt;&lt;/div&gt;Коэффициент 0.499 взят из уже упоминавшегося англоязычного руководства, в котором данная настройка называется оптимальной для большинства случаев. Правда, экспериментировать вам никто не запрещает :)&lt;br /&gt;Наконец, преобразование pbm в djvu–файл выполняется командой:&lt;div class="code"&gt;&lt;code&gt;$ cjb2 -dpi DPI ВХОДНОЙ_ФАЙЛ.pbm ИТОГОВЫЙ_ДОКУМЕНТ.djvu&lt;/code&gt;&lt;/div&gt;Обратите внимание на опцию &lt;code&gt;-dpi&lt;/code&gt; — вы должны самостоятельно задать «плотность» получающегося документа.&lt;br /&gt;После конвертирования в djvu pbm–файлы могут быть удалены.&lt;br /&gt;Помимо &lt;code&gt;cjb2&lt;/code&gt;, существуют и другие инструменты для компрессии чёрно–белых изображений. В частности, monday2000 в комментариях советует использовать &lt;code&gt;minidjvu&lt;/code&gt; (в Debian есть существующий пакет), а лучше — DjVu Solo 3.1, запущенный под Wine.&lt;br /&gt;&lt;br /&gt;&lt;a name="compressing_grayscale_images"&gt;&lt;/a&gt;&lt;h3&gt;Кодирование оттенков серого&lt;/h3&gt;Скорее всего, сканы окажутся не идеальными, а типография оставит желать лучшего, так что кодирование изображений в оттенках серого — это то, чем вы будете заниматься основную часть времени.&lt;br /&gt;Для сжатия сканы придётся сконвертировать либо в JPEG (чего я &lt;b&gt;НЕ&lt;/b&gt; рекомендую), либо в PPM/PGM. Поступим разумно и пойдём по второму пути:&lt;div class="code"&gt;&lt;code&gt;$ anytopnm ИМЯ_ИСХОДНОГО_ФАЙЛА | ppmtopgm &amp;gt; ВЫХОДНОЙ_ФАЙЛ.pgm&lt;/code&gt;&lt;/div&gt;(думаю, для вас не составит труда самостоятельно написать цикл, автоматизирующий конвертирование всего набора сканов). Дальше в ход пойдёт утилита &lt;code&gt;cpaldjvu&lt;/code&gt;:&lt;div class="code"&gt;&lt;code&gt;$ cpaldjvu -dpi DPI -colors КОЛИЧЕСТВО_ОТТЕНКОВ_СЕРОГО ВХОДНОЙ_ФАЙЛ.pgm ВЫХОДНОЙ_ФАЙЛ.djvu&lt;/code&gt;&lt;/div&gt;Как видите, добавляется новая интересная деталь — количество используемых оттенков серого. Чем больше это значение, тем больший объём имеет сжатая страница. Для не очень качественных сканов подойдёт значение 3 или 4 — этого вполне достаточно, чтобы получить пусть и бледноватую, но читабельную картинку.&lt;br /&gt;&lt;br /&gt;&lt;a name="compressing_fullcolor_images"&gt;&lt;/a&gt;&lt;h3&gt;Кодирование цветных изображений&lt;/h3&gt;Теперь самое интересное — кодирование цветных страниц. Как правило, в цвете кодируются только обложки, но вы вольны поступать так, как сочтёте нужным.&lt;br /&gt;Сначала конвертируем обложку в PPM:&lt;div class="code"&gt;&lt;code&gt;$ convert ИСХОДНЫЙ_СКАН РЕЗУЛЬТИРУЮЩИЙ_ФАЙЛ.ppm&lt;/code&gt;&lt;/div&gt;Теперь сожмём её в Djvu:&lt;div class="code"&gt;&lt;code&gt;$ c44 -dpi DPI ИСХОДНИК.ppm РЕЗУЛЬТАТ.djvu&lt;/code&gt;&lt;/div&gt;Не забудьте заменить DPI на подходящее значение — всё остальное программа сделает сама.&lt;br /&gt;&lt;br /&gt;&lt;a name="ocr"&gt;&lt;/a&gt;&lt;h3&gt;Распознавание текста (OCR) и создание текстового слоя&lt;/h3&gt;Это опциональный пункт, можете пропустить его, если вам не нужен текстовый слой или вы попросту не хотите тратить время — операция распознавания довольно длительна, а вычитка получившегося текста — это вообще чуть ли не каторжный труд. «Думайте сами, решайте сами, иметь или не иметь…»&lt;br /&gt;В принципе, распознавать имеет смысл только техническую литературу — к примеру, программисты гораздо больше обрадуются книге, из которой можно скопировать листинги. Художественную же литературу распознавать, как мне кажется, особого смысла нет — вспомните, когда у вас последний раз появлялось желание что–то скопировать из художественной книги? То–то же.&lt;br /&gt;От слов перейдём к делу — поставим OCR–движок:&lt;div class="code"&gt;&lt;code&gt;$ sudo aptitude install ocrodjvu&lt;/code&gt;&lt;/div&gt;&lt;code&gt;ocrodjvu&lt;/code&gt; занимается распознанием текста непосредственно из djvu–файла. Он может как дописывать текстовый слой в обрабатываемый документ, так и создавать новый. Работает это чудо вот так:&lt;div class="code"&gt;&lt;code&gt;$ ocrodjvu -o ВЫХОДНОЙ_ФАЙЛ.djvu ВХОДНОЙ_ФАЙЛ.djvu&lt;/code&gt;&lt;/div&gt;или, если вы уверены, что хотите переписать оригинальный документ:&lt;div class="code"&gt;&lt;code&gt;$ ocrodjvu --in-place ВХОДНОЙ_ФАЙЛ.djvu&lt;/code&gt;&lt;/div&gt;Замечу, что &lt;code&gt;ocrodjvu&lt;/code&gt; является фронт–ендом для различных OCR–движков (по умолчанию используется оболочка для Tesseract под названием OCRopus). Движки эти, к сожалению, поддерживают не так уж много языков. Русский распознаётся только с помощью Cuneiform (который сейчас в non–free ветке sid'а) и уже упоминавшимся tesseract. C’est la vie…&lt;br /&gt;Ещё одним важным замечанием о распознавании является время его выполнения — вы можете распознавать документы и до, и после сборки их в единый файл. Правда, во втором случае вы наверняка потратите лишнее время на то, чтобы в цикле извлечь текст каждой страницы в отдельный файл, а потом так же запихнуть всё обратно. Тут уж поступайте, как знаете.&lt;br /&gt;И последняя, но, вероятно, самая важная заметка — на счёт редактирования текстового слоя. Тут у вас два варианта: либо воспользоваться довольно удобной программкой под названием &lt;code&gt;djvusmooth&lt;/code&gt; (спасибо за наводку, Lazy_Kent!), либо с помощью &lt;code&gt;djvused&lt;/code&gt; извлекать текстовый слой и править его. Т.к. использование GUI не должно составить особого труда, на &lt;code&gt;djvusmooth&lt;/code&gt; я останавливаться не буду — гораздо интереснее поковыряться во внутренностях Djvu и выяснить, как «руками» сделать всё то, что помогает делать графический интерфейс.&lt;br /&gt;Начнём с базовых операций; вынуть текстовый слой всего документа можно так:&lt;div class="code"&gt;&lt;code&gt;$ djvused ВХОДНОЙ_ФАЙЛ.djvu -e "print-txt" &amp;gt; ВЫХОДНОЙ_ФАЙЛ.txt&lt;/code&gt;&lt;/div&gt;После этого txt'шник можно открыть любимым vim'ом и править, править, править… О формате поговорим чуть позже. Когда закончите редактирование, вернуть текстовый слой на место помогут такие команды:&lt;div class="code"&gt;&lt;code&gt;$ djvused ВХОДНОЙ_ФАЙЛ.djvu -s -e "remove-txt"&lt;br /&gt;$ djvused ВХОДНОЙ_ФАЙЛ.djvu -s -e "set-txt ТЕКСТОВЫЙ_СЛОЙ.txt"&lt;/code&gt;&lt;/div&gt;Первая команда удаляет уже существующий текстовый слой, вторая добавляет тот, что сохранён у нас в текстовом документе и который мы исправили.&lt;br /&gt;Теперь касательно синтаксиса, используемого для описания текстового слоя. Тут всё базируется на списках, которые заключаются в круглые скобки и могут быть вложены друг в друга. Каждый список имеет следующую структуру:&lt;div class="code"&gt;&lt;code&gt;(type xmin ymin xmax ymax ... )&lt;/code&gt;&lt;/div&gt;На месте &lt;code&gt;type&lt;/code&gt; должен быть один из следующих идентификаторов: &lt;code&gt;page&lt;/code&gt; (страница), &lt;code&gt;column&lt;/code&gt; (колонка), &lt;code&gt;region&lt;/code&gt; (область), &lt;code&gt;para&lt;/code&gt; (параграф), &lt;code&gt;line&lt;/code&gt; (строка), &lt;code&gt;word&lt;/code&gt; (слово) или &lt;code&gt;char&lt;/code&gt; (символ). Дальше задаются координаты углов (левого верхнего и правого нижнего) прямоугольника, в котором лежит данный структурный элемент (страница, параграф, строка и т.д.).&lt;br /&gt;Как уже было сказано, каждый список может содержать в себе другие списки. Поэтому логично организовать структуру текстового слоя примерно так:&lt;pre class="code"&gt;&lt;code&gt;(page x1 y1 x2 y2&lt;br /&gt;  (column x1 y1 x2 y2&lt;br /&gt;    (region x1 y1 x2 y2&lt;br /&gt;      (para x1 y1 x2 y2&lt;br /&gt;        (line x1 y1 x2 y2&lt;br /&gt;          (word x1 y1 x2 y2 "This")&lt;br /&gt;          (word x1 y1 x2 y2 "is")&lt;br /&gt;          (word x1 y1 x2 y2 "an")&lt;br /&gt;          (word x1 y1 x2 y2 "example")&lt;br /&gt;          (word x1 y1 x2 y2 "of")&lt;br /&gt;          (word x1 y1 x2 y2 "possible")&lt;br /&gt;          (word x1 y1 x2 y2 "hidden")&lt;br /&gt;          (word x1 y1 x2 y2 "text")&lt;br /&gt;          (word x1 y1 x2 y2 "description")&lt;br /&gt;          (char x1 y1 x2 y2 ".")&lt;br /&gt;        )&lt;br /&gt;        (line x1 y1 x2 y2&lt;br /&gt;          (word x1 y1 x2 y2 "Here")&lt;br /&gt;          (word x1 y1 x2 y2 "goes")&lt;br /&gt;          (word x1 y1 x2 y2 "second")&lt;br /&gt;          (word x1 y1 x2 y2 "line")&lt;br /&gt;          (char x1 y1 x2 y2 ".")&lt;br /&gt;          (word x1 y1 x2 y2 "You")&lt;br /&gt;          (word x1 y1 x2 y2 "have")&lt;br /&gt;          (word x1 y1 x2 y2 "got")&lt;br /&gt;          (word x1 y1 x2 y2 "that")&lt;br /&gt;          (word x1 y1 x2 y2 "already")&lt;br /&gt;          (char x1 y1 x2 y2 ",")&lt;br /&gt;          (word x1 y1 x2 y2 "right")&lt;br /&gt;          (char x1 y1 x2 y2 "?")&lt;br /&gt;        )&lt;br /&gt;      )&lt;br /&gt;    )&lt;br /&gt;  )&lt;br /&gt;)&lt;/code&gt;&lt;/pre&gt;Как видим, тут описан один параграф, состоящий из двух строк. Править это счастье не так уж сложно, если только распознавалка не склеила несколько слов вместе или не проигнорировала какую–то строку или символ. Для упрощения работы очень советую экспортировать обрабатываемую страницу в RAW PPM (вы можете использовать утилиту &lt;code&gt;ddjvu&lt;/code&gt; или воспользоваться соответствующей возможностью стандартного просмотрщика &lt;code&gt;djview&lt;/code&gt;), открыть её, скажем, в Gimp'е и там с помощью любого инструмента определять границы слова — текущее положение курсора отображается в левом нижнем углу окна с изображением (по крайней мере, так себя ведёт Gimp 2.6.8). Отсчёт почему–то начинается с &lt;b&gt;левого нижнего&lt;/b&gt; угла, так что будьте внимательны.&lt;br /&gt;Отдельно следует поговорить о не–ASCII символах — все они должны быть представлены в виде «UTF–8 encoded sequence», т.е. чего–то вроде такого: «\320\222\320\262\320\265\320\264\320\265\320\275\320\270\320\265». Т.к. об этом не расскажешь в паре абзацев, я написал об этом &lt;a href="#dealing_with_non-ascii_symbols"&gt;отдельный раздельчик&lt;/a&gt; — если будете править текстовый слой или метаинформацию (см. ниже), обязательно прочтите его.&lt;br /&gt;Впрочем, можно обойтись и без этих премудростей с кодированием — у &lt;code&gt;djvused&lt;/code&gt; есть опция &lt;code&gt;-u&lt;/code&gt;, заставляющая его не перекодировать не–ASCII символы, а выводить их как есть, в UTF–8.&lt;br /&gt;На этом, я думаю, повесть о текстовом слое можно завершить — вы уже знаете достаточно, чтобы создать, вычитать и встроить в документ качественную текстовую «подкладку».&lt;br /&gt;&lt;br /&gt;&lt;a name="links_in_table_of_contents"&gt;&lt;/a&gt;&lt;h3&gt;Ссылки в оглавлении&lt;/h3&gt;Согласитесь, пользоваться djvu–книгой станет гораздо удобнее, если пункты оглавления будут не просто текстом, а ссылками на соответствующие страницы. Djvu позволяет реализовать это счастье, используя механизм так называемых аннотаций (annotations). Как и текстовый слой, аннотации описываются с помощью списков, заключённых в круглые скобки.&lt;br /&gt;Ссылки создаются с помощью структуры &lt;code&gt;maparea&lt;/code&gt;, имеющей следующий формат:&lt;div class="code"&gt;&lt;code&gt;(maparea url comment area ...)&lt;/code&gt;&lt;/div&gt;Рассмотрим аргументы этой структуры по порядку.&lt;br /&gt;Итак, &lt;code&gt;url&lt;/code&gt;. Вообще–то тут можно указать ссылку на любой документ, а не только на страницу текущего файла — если вам это интересно, читайте &lt;code&gt;man 1 djvused&lt;/code&gt;. Я же в дальнейшем буду говорить только о ссылках на страницы текущего документа. Они имеют очень простой формат: &lt;code&gt;#номер_страницы&lt;/code&gt;, например, &lt;code&gt;#9&lt;/code&gt;. Также допускаются относительные ссылки, имеющие знак — так, &lt;code&gt;#+1&lt;/code&gt; отправит читателя на следующую страницу, а &lt;code&gt;#-1&lt;/code&gt; — на предыдущую.&lt;br /&gt;Теперь &lt;code&gt;comment&lt;/code&gt;. Это — тот текст, который будет показан пользователю в виде всплывающей подсказки при наведении курсора мыши на ссылку. Его можно оставить пустым.&lt;br /&gt;&lt;code&gt;area&lt;/code&gt; — описание области, которая служит ссылкой. Тут разработчики дали нам довольно большую свободу — выделять можно не только прямоугольники, но также овалы и строки (строки, в принципе, можно было бы выделять прямоугольниками). Синтаксис всего этого добра вы можете найти в &lt;code&gt;man 1 djvused&lt;/code&gt;. Я думаю, что читатель сам справится с выбором крайних координат для &lt;code&gt;rect&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt; или &lt;code&gt;line&lt;/code&gt; (в зависимости от того, чем вы решите выделять пункты оглавления).&lt;br /&gt;Три точки в описании &lt;code&gt;maparea&lt;/code&gt; означают, что вы можете задать дополнительные параметры, описывающие рамку вокруг ссылки. Тут у нас тоже довольно много вариантов — можно сделать инверсионную рамку (она будет чёрной, если фон белый, и наоборот; идеальна для цветного фона, когда цветная рамка может слиться с фоном), задать ей определённый цвет и толщину, а для некоторых типов выделения можно также задать тень.&lt;br /&gt;Отдельно упомяну опцию &lt;code&gt;(border_avis)&lt;/code&gt; — по умолчанию рамка показывается только при наведении на ссылку курсора мыши; данная же опция заставляет рамку отображаться всегда.&lt;br /&gt;Теперь вы знаете всё необходимое. В качестве примера покажу секцию, которую я написал для оглавления одной из книг:&lt;pre class="code"&gt;&lt;code&gt;(maparea "#12" "Chapter 1"&lt;br /&gt;  (rect 220 759 93 23)&lt;br /&gt;  (xor)&lt;br /&gt;)&lt;/code&gt;&lt;/pre&gt;Таким образом, имеем рамку с подсказкой «Chapter 1» и инверсионной рамкой, отображающейся только при наведении курсора мыши.&lt;br /&gt;Наконец, встроим наши ссылки в файл:&lt;div class="code"&gt;&lt;code&gt;$ djvused ВХОДНОЙ_ФАЙЛ.djvu -s -e "select 6; set-ant ФАЙЛ_СО_ССЫЛКАМИ"&lt;/code&gt;&lt;/div&gt;Подразумевается, что оглавление находится на странице 6. Если это не так, поменяйте число после &lt;code&gt;select&lt;/code&gt; на правильное.&lt;br /&gt;Ещё раз обращаю ваше внимание на не–ASCII символы — они в обязательном порядке должны быть перекодированы в UTF–8 и представлены в восьмеричном виде! Почитайте &lt;a href="#dealing_with_non-ascii_symbols"&gt;соответствующий раздел этого поста&lt;/a&gt;, чтобы узнать больше.&lt;br /&gt;Напоследок замечу, что ссылки — не единственное применение аннотаций. Вы также можете задавать дефолтный фоновой цвет страницы, степень её увеличения, режим дисплея (цветной, оттенки серого…), положение в окне ридера (по умолчанию — по центру, но можно сместить, скажем, в левый верхний угол), а также хранить информацию об авторе, названии, даже издания книги — о последнем и пойдёт речь в следующем разделе.&lt;br /&gt;&lt;br /&gt;&lt;a name="metainformation"&gt;&lt;/a&gt;&lt;h3&gt;Метаинформация&lt;/h3&gt;Djvu позволяет вам добавить в файл особый блок, содержащий данные об авторе, названии книги, годе издания и прочем. Это — метаинформация. В последующем она может быть извлечена и использована: например, если все ваши книги содержат такой блок, вы можете в автоматическом порядке переименовать все книги по единому шаблону, разложить их по директориям по издательствами или годам — да что угодно! При этом для того, чтобы добавить в свой djvu файл такие данные, вам нужно приложить совсем немного усилий.&lt;br /&gt;Итак, хранение метаинформации в Djvu организовано с помощью того же механизма, что и ссылки, то есть с помощью аннотаций. Вот пример файла с метаинформацией:&lt;pre class="code"&gt;&lt;code&gt;(metadata&lt;br /&gt;  Author "Douglas Adams"&lt;br /&gt;  Title  "The Hitchhiker's Guide to the Galaxy"&lt;br /&gt;  Year   "1979"&lt;br /&gt;)&lt;/code&gt;&lt;/pre&gt;Обратите внимание на то, что внутри списка &lt;code&gt;metadata&lt;/code&gt; нет вложенных списков — только пары ключ–значение. В мане сказано использовать списки, но мои эксперименты показали, что так делать нельзя — вложенные списки «удваиваются», т.е. конструкция вида &lt;code&gt;(key value)&lt;/code&gt; превращается в &lt;code&gt;((key value))&lt;/code&gt;, в результате чего информация не распознаётся ни читалками, ни &lt;code&gt;djvused&lt;/code&gt;. Встроить метаинформацию в файл вам поможет следующая команда:&lt;div class="code"&gt;&lt;code&gt;$ djvused ВЫХОДНОЙ_ФАЙЛ.djvu -s -e "set-mete ФАЙЛ_С_МЕТАИНФОРМАЦИЕЙ"&lt;/code&gt;&lt;/div&gt;а извлечь — такая:&lt;div class="code"&gt;&lt;code&gt;$ djvused ВХОДНОЙ_ФАЙЛ.djvu -e "select-shared-ant; print-meta"&lt;/code&gt;&lt;/div&gt;Не забудьте, что не–ASCII символы должны быть представлены в виде UTF–8 строк, записанных в восьмеричном виде. Почитайте &lt;a href="#dealing_with_non-ascii_symbols"&gt;соответствующий раздел этого поста&lt;/a&gt; — там об этом рассказано подробнее.&lt;br /&gt;Учтите, что порядок полей не соблюдается, т.е. в выводе второй команды поля могут идти не в том порядке, в каком вы внесли их в файл с метаинформацией.&lt;br /&gt;&lt;br /&gt;&lt;a name="dealing_with_non-ascii_symbols"&gt;&lt;/a&gt;&lt;h3&gt;Работа с не–ASCII символами&lt;/h3&gt;Согласно стандарту Djvu, все текстовые файлы, получающиеся при использовании &lt;code&gt;djvused&lt;/code&gt; с командами &lt;code&gt;print-txt&lt;/code&gt;, &lt;code&gt;print-meta&lt;/code&gt; и прочими, должны быть представлены в кодировке ASCII. Для представления не–ASCII символов символ кодируется в UTF–8, а потом преобразуется в следующий вид: «\321\200\321\217\320\264\321\213,». Эта строка представляет собой набор восьмеричных значений, каждое из которых представляет один байт строки, закодированной в UTF–8.&lt;br /&gt;Для того, чтобы вы понимали суть сказанного, приведу пример. Пусть имеем слово «привет». В этом слове шесть символов. В UTF–8 русские символы представляются &lt;b&gt;двумя&lt;/b&gt; байтами, т.е. букве «п» соответствуют два байта — в восьмеричной форме они выглядят как 320 и 277. Добавляем бэкслеши в начале — voilà, мы получили именно то представление, которое используется в текстовых составляющих Djvu файлов.&lt;br /&gt;Это было теория, теперь же перейдём к практике. А задача у нас такая — получив txt–файл с символами, закодированными вышеописанным способом, надо его преобразовать в человеческий UTF–8, который в дальнейшем можно без проблем править любимым редактором. И вторая часть задачи — по завершении правки выполнить обратное преобразование. Поможет нам в этом нелёгком деле утилита &lt;code&gt;uni2ascii&lt;/code&gt; (спасибо, Camaleón!), которую мы с лёгкостью ставим из репозитория:&lt;div class="code"&gt;&lt;code&gt;$ sudo aptitude install uni2ascii&lt;/code&gt;&lt;/div&gt;Преобразовать файл из восьмеричного представления в Юникод позволяет такой однострочник:&lt;div class="code"&gt;&lt;code&gt;$ ascii2uni -q -a K &amp;lt; ВХОДНОЙ_ФАЙЛ.txt &amp;gt; ВЫХОДНОЙ_ФАЙЛ.txt&lt;/code&gt;&lt;/div&gt;а обратно — такой:&lt;div class="code"&gt;&lt;code&gt;$ uni2ascii -q -a K &amp;lt; ВХОДНОЙ_ФАЙЛ.txt &amp;gt; ВЫХОДНОЙ_ФАЙЛ.txt&lt;/code&gt;Впрочем, как я уже упоминал, этой рутины можно избежать, если при вызове &lt;code&gt;djvused&lt;/code&gt; использовать опцию &lt;code&gt;-u&lt;/code&gt;.&lt;br /&gt;&lt;/div&gt;&lt;a name="creating_djvu_file"&gt;&lt;/a&gt;&lt;h3&gt;Сборка итогового djvu–документа&lt;/h3&gt;Завершающим этапом ваших трудов должен стать многостраничный djvu–документ, который легко, просто и быстро собирается из уже сжатых одностраничных djvu'шек такой командой:&lt;div class="code"&gt;&lt;code&gt;$ djvm -c ВЫХОДНОЙ_ФАЙЛ.djvu *.djvu&lt;/code&gt;&lt;/div&gt;Всё! Теперь можете наслаждаться свежесозданным документом.&lt;br /&gt;&lt;br /&gt;До новых встреч!&lt;br /&gt;&lt;br /&gt;&lt;a name="updates"&gt;&lt;/a&gt;&lt;b&gt;UPD 21.06.2010:&lt;/b&gt;&lt;ul&gt;&lt;li&gt;добавлены разделы о текстовом слое, ссылках и метаинформации (keks.sw, это благодаря твоему комментарию!)&lt;/li&gt;&lt;li&gt;расширен раздел об OCR, добавлено упоминание об опции &lt;code&gt;ocrodjvu&lt;/code&gt; &lt;code&gt;--in-place&lt;/code&gt;, а также программ &lt;code&gt;djvusmooth&lt;/code&gt; и Cuneiform (спасибо, Lazy_Kent!)&lt;/li&gt;&lt;li&gt;исправлено неверное утверждение касательно способности PPM хранить цвет; соответствующий раздел обновлён (спасибо ещё раз, Lazy_Kent)&lt;/li&gt;&lt;li&gt;другие мелкие правки&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;UPD 16.11.2010 (спасибо monday2000):&lt;/b&gt;&lt;ul&gt;&lt;li&gt;добавлено упоминание о Scan Tailor&lt;/li&gt;&lt;li&gt;в качестве альтернативы &lt;code&gt;cjb2&lt;/code&gt; упомянуты &lt;code&gt;minidjvu&lt;/code&gt; и DjVu Solo 3.1, запускаемый под Wine&lt;/li&gt;&lt;li&gt;с недавних пор Tesseract начал понимать русский; упоминание об этом добавлено в статью&lt;/li&gt;&lt;li&gt;в &lt;code&gt;djvused&lt;/code&gt; теперь можно отключать представление не–ASCII символов в виде их кодов — используя опцию &lt;code&gt;-u&lt;/code&gt;, можно заставить &lt;code&gt;djvused&lt;/code&gt; выводить символы в UTF–8&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-3010948863410046262?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/TtzLBB1U4fw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/TtzLBB1U4fw/djvu-linux.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>26</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/06/djvu-linux.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-6895805272841560954</guid><pubDate>Thu, 27 May 2010 16:34:00 +0000</pubDate><atom:updated>2011-07-15T21:12:54.266+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips'n'tricks</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>nohup, dtach, screen, tmux — продвинутая магия управления процессами</title><description>&lt;a href="http://debiania.blogspot.com/2010/05/blog-post.html"&gt;В прошлый раз&lt;/a&gt; я рассказал вам о тех возможностях управления процессами, что предоставляет нам шелл. Сегодня же мы поговорим о приложениях, имеющих значительно более широкие возможности — некоторые из них фактически создают у вас в консоли отдельное рабочее пространство!&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;&lt;code&gt;nohup&lt;/code&gt;&lt;/h1&gt;Итак, начнём с самого простого — &lt;code&gt;nohup&lt;/code&gt;. Утилита эта принадлежит пакету &lt;code&gt;coreutils&lt;/code&gt;, а задача её сводится к тому, чтобы запустить какую-то программу независимо от шелла, перенаправив стандартный ввод на &lt;code&gt;/dev/null&lt;/code&gt;, а стандартный вывод — в &lt;code&gt;nohup.out&lt;/code&gt; (а если это невозможно — в &lt;code&gt;$HOME/nohup.out&lt;/code&gt;). Если хотите, чтобы вывод писался в другой файл, используйте перенаправление:&lt;div class="code"&gt;$ nohup aptitude -y upgrade &gt;upgrade.txt&lt;/div&gt;Точно такой же трюк можно проделать и со вводом.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;&lt;code&gt;dtach&lt;/code&gt;&lt;/h1&gt;Следующая рассматриваемая программа — &lt;code&gt;dtach&lt;/code&gt; — не намного более сложна. В её &lt;code&gt;man&lt;/code&gt;-странице написано, что &lt;i&gt;«&lt;code&gt;dtach&lt;/code&gt; is a program that emulates the detach feature of &lt;code&gt;screen&lt;/code&gt;»&lt;/i&gt;, т.е. &lt;code&gt;dtach&lt;/code&gt; занимается эмулированием одной-единственной фичи скрина, а именно — созданием отдельных сессий для каждого приложения. Весь смысл в том, чтобы запустить программу под &lt;code&gt;dtach&lt;/code&gt;'ем, а потом подключаться к ней, когда необходимо.&lt;br /&gt;&lt;br /&gt;Хорошим примером применения данной программы может служить консольный клиент &lt;code&gt;rtorrent&lt;/code&gt;: держать ради него постоянно открытый терминал попросту неудобно, а вот запустить приложение под &lt;code&gt;dtach&lt;/code&gt;'ем и забыть — это запросто. А когда мне захочется посмотреть рейтинг какого-то торрента или добавить новый, я просто подключусь к уже существующей сессии и выполню все необходимые действия.&lt;br /&gt;&lt;br /&gt;Интересной особенностью &lt;code&gt;dtach&lt;/code&gt; является то, что он требует явно указать, куда помещать сокет, с помощью которого идентифицируется сессия. Кстати говоря, доступ к сессии целиком и полностью определяется доступом к сокету, так что если вам хочется показать всему народу на мейнфрейме, как круто вы кодите в &lt;code&gt;emacs&lt;/code&gt;'е — запускайте &lt;code&gt;dtach&lt;/code&gt;, ставьте права на сокет равными &lt;code&gt;644&lt;/code&gt; и хвастайтесь на здоровье :)&lt;br /&gt;&lt;br /&gt;Специально для тех, кто не любит читать маны — маленький гайд.&lt;br /&gt;&lt;br /&gt;Создать сессию с &lt;code&gt;rtorrent&lt;/code&gt;'ом внутри (одноимённый сокет поместить в домашнюю директорию):&lt;br /&gt;&lt;div class="code"&gt;dtach -c $HOME/rtorrent rtorrent&lt;/div&gt;Насмотрелись? Нажмите &lt;code&gt;Ctrl+\&lt;/code&gt;, и вы покинете &lt;code&gt;dtach&lt;/code&gt;. Чтобы заново подключиться к существующей сессии, наберите:&lt;div class="code"&gt;dtach -a $HOME/rtorrent&lt;/div&gt;&lt;br /&gt;Собственно, на этом гайд заканчивается — треть возможностей я уже пересказал, а за остальными добро пожаловать в &lt;code&gt;man&lt;/code&gt;-страницу (она, кстати, совсем простая и крохотная — по крайней мере, по сравнению со &lt;code&gt;screen&lt;/code&gt;'овской :).&lt;br /&gt;&lt;br /&gt;Ну что же, простые решения мы рассмотрели — настало время гигантов. Начнём, пожалуй, со &lt;code&gt;screen&lt;/code&gt;'а.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;&lt;code&gt;GNU screen&lt;/code&gt;&lt;/h1&gt;Эта утилита позволяет пользователю создавать сессии, в каждой из которых может быть по нескольку окон, в каждом из которых выполняется отдельное приложение. Окнами можно управлять, причём не только открывать и закрывать, но и располагать их на экране — в частности, поддерживается горизонтальный и вертикальный сплиттинг. Фактически это целый оконным менеджер в консоли.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Nb6QYFUvBjY/TAJvGX8vDcI/AAAAAAAAAOE/I83TBA47Ibg/s1600/screen_mutt.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="http://1.bp.blogspot.com/_Nb6QYFUvBjY/TAJvGX8vDcI/AAAAAAAAAOE/I83TBA47Ibg/s320/screen_mutt.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477062252134600130" /&gt;&lt;/a&gt;&lt;center&gt;&lt;font size="-1"&gt;&lt;code&gt;mutt&lt;/code&gt;, запущенный в &lt;code&gt;screen&lt;/code&gt;'е&lt;/font&gt;&lt;/center&gt;&lt;br /&gt;Всех возможностей &lt;code&gt;screen&lt;/code&gt;'а и не пересчитать — это крупный (чтобы не сказать монструозный) проект. В рамках же данной статьи я зацеплю только основы — а именно создание сессий и управление окнами.&lt;br /&gt;&lt;br /&gt;Итак, для создания новой сессии вам достаточно просто запустить &lt;code&gt;screen&lt;/code&gt;:&lt;div class="code"&gt;screen&lt;/div&gt;Но т.к. в этом случае сессия получит невразумительное имя вида &lt;code&gt;PID.номер_терминала.имя_машины&lt;/code&gt; (например, &lt;code&gt;21701.pts-2.speedy&lt;/code&gt;), то полезным будет указать ключик &lt;code&gt;-S&lt;/code&gt;:&lt;div class="code"&gt;screen -S test&lt;/div&gt;&lt;br /&gt;Сразу после запуска вам покажут краткую справку по &lt;code&gt;screen&lt;/code&gt;. Она вам быстро надоест, так что советую прописать в &lt;code&gt;~/.screenrc&lt;/code&gt; такую строку:&lt;div class="code"&gt;startup_message off&lt;/div&gt;&lt;br /&gt;После справки вы увидите шелл, откуда можно запускать любое приложение. Чтобы отключиться от &lt;code&gt;screen&lt;/code&gt;'а, нужно последовательно нажать две комбинации клавиш — сначала &lt;code&gt;Ctrl+a&lt;/code&gt;, а потом &lt;code&gt;Ctrl+d&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Сразу же сделаю маленькую ремарку касательно хоткеев: &lt;code&gt;Ctrl+a&lt;/code&gt; означает, что следующий хоткей будет передан &lt;code&gt;screen&lt;/code&gt;'у, а не программе, запущенной в текущем окне. Если хотите передать &lt;code&gt;Ctrl+a&lt;/code&gt; именно программе, нажмите эту комбинацию дважды.&lt;br /&gt;&lt;br /&gt;Итак, вы отключились от сессии. Чтобы подключиться снова, наберите:&lt;div class="code"&gt;screen -r test&lt;/div&gt;Список доступных сессий можно посмотреть с помощью следующей команды:&lt;div class="code"&gt;screen -ls&lt;/div&gt;&lt;br /&gt;Теперь перейдём к окнам. Сразу скажу, что не буду затрагивать разбиение экрана на несколько частей, передвижение и ресайз окон — я в этом пока что не разобрался, да и особой потребности нет, ведь всё работает и так.&lt;br /&gt;&lt;br /&gt;Новое окно создаётся с помощью комбинации &lt;code&gt;Ctrl+a c&lt;/code&gt;. Чтобы переключиться на какое-то другое окно, у вас есть три пути:&lt;ul&gt;&lt;li&gt;&lt;code&gt;Ctrl+a n&lt;/code&gt; переключит вас на следующее окно, &lt;code&gt;Ctrl+a p&lt;/code&gt; — на предыдущее&lt;/li&gt;&lt;li&gt;&lt;code&gt;Ctrl+a "&lt;/code&gt; покажет вам список всех доступных окон; вы можете выбирать окно с помощью стрелочек (&lt;code&gt;Up/Down&lt;/code&gt;) или указать его номер, а потом перейти на него, нажав &lt;code&gt;Enter&lt;/code&gt;&lt;/li&gt;&lt;li&gt;если вы помните номер окна, вы можете нажать &lt;code&gt;Ctrl+a номер&lt;/code&gt; и сразу перепрыгнуть туда&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Nb6QYFUvBjY/TAJv0bJh6LI/AAAAAAAAAOM/S7vzvz7P68k/s1600/screen_list_of_windows.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="http://3.bp.blogspot.com/_Nb6QYFUvBjY/TAJv0bJh6LI/AAAAAAAAAOM/S7vzvz7P68k/s320/screen_list_of_windows.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477063043267553458" /&gt;&lt;/a&gt;&lt;center&gt;&lt;font size="-1"&gt;Список окон&lt;/font&gt;&lt;/center&gt;&lt;br /&gt;И последняя фича, касающаяся окон — их переименование: нажмите Ctrl+a A и наберите новое имя окна. Задав окнам имена, вы упростите навигацию по вышеупомянутому списку.&lt;br /&gt;&lt;br /&gt;Ну что же, на этом ликбез по &lt;code&gt;screen&lt;/code&gt;'у считаю оконченным — всё остальное вы можете прочесть в мане и разнообразных howto/manual/tutorial.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;&lt;code&gt;tmux&lt;/code&gt;&lt;/h1&gt;Наконец, завершающий этап нашего разговора — &lt;code&gt;tmux&lt;/code&gt;. Он разрабатывался как альтернатива &lt;code&gt;screen&lt;/code&gt;'у, лицензированная под BSD. Возможности у &lt;code&gt;tmux&lt;/code&gt;'а примерно такие же, как и у конкурента от GNU — программа умеет создавать отдельные сессии, в каждой из которых может быть произвольное количество окон с отдельными программами. Дабы не растекаться мыслью по древу, перейдём сразу к практике.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Nb6QYFUvBjY/TAJwEuhFCpI/AAAAAAAAAOU/XAzZ60nuOhU/s1600/tmux_mutt.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="http://4.bp.blogspot.com/_Nb6QYFUvBjY/TAJwEuhFCpI/AAAAAAAAAOU/XAzZ60nuOhU/s320/tmux_mutt.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477063323344505490" /&gt;&lt;/a&gt;&lt;center&gt;&lt;font size="-1"&gt;&lt;code&gt;mutt&lt;/code&gt; в &lt;code&gt;tmux&lt;/code&gt;'е&lt;/font&gt;&lt;/center&gt;&lt;br /&gt;Итак, новая сессия создаётся так же, как и в &lt;code&gt;screen&lt;/code&gt;'е, т.е. простым запуском &lt;code&gt;tmux&lt;/code&gt;'а:&lt;div class="code"&gt;tmux&lt;/div&gt;К сожалению, именовать можно только сокеты, а сами сессии задаются номерами. Просмотреть доступные сессии можно командой:&lt;div class="code"&gt;tmux ls&lt;/div&gt;а подключиться к одной из них — вот так:&lt;div class="code"&gt;tmux attach номер&lt;/div&gt;Отключится же от сессии можно комбинацией &lt;code&gt;Ctrl+b d&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Поехали дальше. Создать окно можно с помощью &lt;code&gt;Ctrl+b c&lt;/code&gt;, переключиться на следующее — &lt;code&gt;Ctrl+b n&lt;/code&gt;, на предыдущее — &lt;code&gt;Ctrl+b p&lt;/code&gt;. Можно переключаться и как в &lt;code&gt;screen&lt;/code&gt;'е — &lt;code&gt;Ctr+b номер&lt;/code&gt;. Хоткея для списка окон нету, да он и не нужен — он успешно заменён inline-списком внизу страницы. Переименование окна осуществляется с помощью &lt;code&gt;Ctrl+b ,&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Собственно, на этом рассказ о &lt;code&gt;tmux&lt;/code&gt;'е можно завершить — основы я дал, а всё остальное вы и сами можете выучить ;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Такие дела — не одним шеллом богаты :) Спасибо Павлу Вьязовому за подсказку касательно &lt;code&gt;tmux&lt;/code&gt; — автор, к своему стыду, об этой программе только слышал, но никогда не пробовал. Теперь же мой вердикт — она выглядит проще и понятней &lt;code&gt;screen&lt;/code&gt;'а :)&lt;br /&gt;&lt;br /&gt;Всем удачи и — до встречи!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-6895805272841560954?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/a7Ix9wU3RJ0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/a7Ix9wU3RJ0/nohup-dtach-screen-tmux.html</link><author>noreply@blogger.com (Minoru)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Nb6QYFUvBjY/TAJvGX8vDcI/AAAAAAAAAOE/I83TBA47Ibg/s72-c/screen_mutt.png" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/05/nohup-dtach-screen-tmux.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-9096448225639692395</guid><pubDate>Thu, 27 May 2010 06:45:00 +0000</pubDate><atom:updated>2011-07-15T21:13:03.043+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips'n'tricks</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Управление выполняющимися процессами в шелле</title><description>Уверен, многие новички, пытаясь пользоваться шеллом, наивно полагают, что в одном терминале может выполняться только одно приложение. Чуть более продвинутые слышали о (якобы монструозном) &lt;code&gt;screen&lt;/code&gt;'е, позволяющим делать разные страшные штуки, в том числе запускать в одной консоли много приложений сразу. При этом очень полезные built-in команды часто остаются незамеченными. О них и пойдёт речь.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Сразу замечу, что в посте будут описаны bash и zsh. Другие шеллы могут не поддерживать указанных команд.&lt;br /&gt;&lt;br /&gt;Итак, представим себе ситуацию: вы запустили какую-то долго выполняющуюся команду, скажем, &lt;code&gt;find&lt;/code&gt;, и ждёте её вывода. Тут у вас появилась какая-то идейка, и вы уже тянетесь к клавиатуре, но шелл ведь занят, верно? Не беда — жмите &lt;code&gt;ctrl+z&lt;/code&gt; и воплощайте идею в жизнь. Когда закончите, наберите &lt;code&gt;fg %1&lt;/code&gt; — и прерванная команда продолжит выполняться.&lt;br /&gt;&lt;br /&gt;Давайте теперь разберём, как же это работает. Когда вы нажимаете &lt;code&gt;ctrl+z&lt;/code&gt;, текущий процесс приостанавливается («&lt;i&gt;suspend&lt;/i&gt;» — «&lt;i&gt;приостанавливать&lt;/i&gt;»). Следует понимать, что пока процесс приостановлен, он никак не реагирует на внешние раздражители — например, если вы приостановили какое-то графическое приложение, его окно не будет перерисовываться, а если это был &lt;code&gt;wget&lt;/code&gt; — он не будет ничего качать.&lt;br /&gt;&lt;br /&gt;Команда &lt;code&gt;fg&lt;/code&gt; (название которой, как вы догадались, происходит от «&lt;i&gt;foreground&lt;/i&gt;» — «&lt;i&gt;передний план&lt;/i&gt;») выполняет абсолютно противоположную задачу — она запускает (можно сказать, снимает с паузы) приостановленное приложение. Аргумент указывает на то, какую именно задачу следует запустить.&lt;br /&gt;&lt;br /&gt;Из предыдущего абзаца можно сделать два полезных вывода:&lt;ol&gt;&lt;li&gt;вы можете приостанавливать более чем одну задачу одновременно;&lt;/li&gt;&lt;li&gt;каждая приостановленная задача имеет свой собственный номер, так что ими легко оперировать.&lt;/li&gt;&lt;/ol&gt;Таким образом мы приходим к третьей команде — &lt;code&gt;jobs&lt;/code&gt;. Несложно догадаться, что она выводит список всех задач вместе с их номерами.&lt;br /&gt;&lt;br /&gt;Менее очевидной, но всё же верной догадкой является то, что помимо &lt;code&gt;fg&lt;/code&gt; должна существовать и парная ей команда &lt;code&gt;bg&lt;/code&gt; («&lt;i&gt;background&lt;/i&gt;» — «&lt;i&gt;фон&lt;/i&gt;»). Её задача — продолжить выполнение приостановленного процесса &lt;i&gt;в фоне&lt;/i&gt;. Очень удобно с командами, вывод которых перенаправлен в файл: они ведь ничего не выводят на экран, так что нам нечего пялиться на занятый шелл — поместили её в фон и работаем дальше. Синтаксис &lt;code&gt;bg&lt;/code&gt; ничем не отличается от оного у &lt;code&gt;fg&lt;/code&gt; — команда принимает на вход номер задачи, выполнение которой следует продолжить в фоне. Кстати, отправить задачу в фон можно сразу же — достаточно просто дописать в конце команды амперсанд, например, вот так:&lt;code&gt;&lt;div class="code"&gt;updatedb &amp;&lt;/div&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Недостаток всей этой системы один: при закрытии шелла все задачи прерываются. Возможно, в годы чистой консоли такое поведение и не мешало спокойно работать, но в наше время, когда многие смешивают Иксы и терминал, нередки ситуации вроде такой: из терминала запускается графическая утилитка, после чего терминал можно было бы закрыть, но нет, нельзя, иначе утилита тоже закроется. Грустно…&lt;br /&gt;&lt;br /&gt;К счастью, даже для такой задачи у шелла есть решение, а имя ему — &lt;code&gt;disown&lt;/code&gt;. Эта команда делает именно то, что нам нужно — она открепляет определённую задачу от шелла. Синтаксис ничем не отличается от &lt;code&gt;fg&lt;/code&gt; и &lt;code&gt;bg&lt;/code&gt; — команда принимает номер задачи. Команду также можно использовать вот в таком виде:&lt;code&gt;&lt;div class="code"&gt;command &amp; disown&lt;/div&gt;&lt;/code&gt;(&lt;b&gt;обратите внимание, что амперсанд всего один!&lt;/b&gt;) При этом процесс, созданный командой &lt;code&gt;command&lt;/code&gt;, сразу же открепляется от шелла, так что вам не надо ничего больше вводить. Счастливые пользователи ZSH могут использовать сокращённую запись:&lt;code&gt;&lt;div class="code"&gt;command &amp;!&lt;/div&gt;&lt;/code&gt;&lt;br /&gt;Правда, &lt;code&gt;disown&lt;/code&gt; имеет некую специфику — если выполнить её для приостановленной задачи, задача так и останется приостановленной. Выход — сигнал &lt;code&gt;CONT&lt;/code&gt;. После того, как сделали disown приостановленной задачи, наберите:&lt;code&gt;&lt;div class="code"&gt;kill -CONT PID&lt;/div&gt;&lt;/code&gt;где PID — это номер процесса, который мы только что открепили от консоли. Не пугайтесь команды &lt;code&gt;kill&lt;/code&gt; — она вовсе не обязательно убивает процесс: как видите, с её помощью можно мирно передавать процессам какие-то команды (ещё один пример такого поведения — conky: если выполнить &lt;code&gt;kill -USR1 PID&lt;/code&gt;, коньки перечитают свой конфиг). Отдельное слово также надо сказать про PID — BASH говорит его сам:&lt;code&gt;&lt;div class="code"&gt;bash: warning: deleting stopped job 1 with process group 23710&lt;/div&gt;&lt;/code&gt;(последнее число и есть искомый IDшник), а ZSH и вовсе выдаёт готовую команду:&lt;code&gt;&lt;div class="code"&gt;disown: warning: job is suspended, use `kill -CONT -24309' to resume&lt;/div&gt;&lt;/code&gt;&lt;br /&gt;Собственно, на этом разговор об управлении процессами в шелле можно считать законченным. В качестве дополнительной литературы могу посоветовать вывод &lt;code&gt;help fg&lt;/code&gt;, &lt;code&gt;help bg&lt;/code&gt;, &lt;code&gt;help jobs&lt;/code&gt; и &lt;code&gt;help disown&lt;/code&gt;. До встречи!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-9096448225639692395?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/47yE6YtdkKA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/47yE6YtdkKA/blog-post.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>11</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/05/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-5185015113580468113</guid><pubDate>Sun, 09 May 2010 05:32:00 +0000</pubDate><atom:updated>2010-05-09T08:32:00.561+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">web</category><title>Requiem for a GMail webinterface</title><description>На днях я подписался на списки рассылки Debian, и моя привержённость к веб-интерфейсу гуглопочты дала трещину. Работа интерфейса не устраивает меня по ряду причин:&lt;ol&gt;&lt;li&gt;при ответе создаётся сообщение, адресованное автору поста, а не в список.&lt;/li&gt;&lt;li&gt;при цитировании используется неудобный формат текста перед цитатой оригинального поста — там присутствует email автора, но отсутствует часовой пояс цитируемого&lt;/li&gt;&lt;/ol&gt;Обе проблемы идут вразрез с этикетом рассылок, потому-то я и уделяю им столько внимания.&lt;br /&gt;&lt;br /&gt;Короче, назрел переход на локальный почтовик, что и было проделано в течении пары дней. Эта заметка написана, так сказать, по горячему следу. Она собрала в себе все проблемы, с которыми я столкнулся. В основном это какие-то мелочи, детали, которых я не знал, но которые оказались важными. Я постарался по возможности превратить пост в гайд, так что будет много ссылок и текста.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Итак, я выбрал популярную и многими обкатанную конфигурацию: &lt;code&gt;fetchmail&lt;/code&gt; → &lt;code&gt;procmail&lt;/code&gt; → &lt;code&gt;mutt&lt;/code&gt; → &lt;code&gt;msmtp&lt;/code&gt;. О том, как её настраивать, читайте в &lt;a href="http://www.gentoo.org/doc/ru/guide-to-mutt.xml"&gt;Gentoo wiki&lt;/a&gt; (для настройки &lt;code&gt;msmtp&lt;/code&gt; придётся заглянуть в &lt;a href="http://www.gentoo.org/doc/en/guide-to-mutt.xml"&gt;английскую версию&lt;/a&gt;). Чтобы лучше понять процесс обработки почты в *nix, советую почитать &lt;a href="http://wiki.mutt.org/?MailConcept"&gt;MailConcept&lt;/a&gt; — «A short introduction to the notorious MxA bunch». А чтобы понять наконец, как всё это конфигурировать применительно к GMail, взгляните на &lt;a href="http://www.andrews-corner.org/mutt.html"&gt;«Using Mutt with Gmail»&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Теперь обратим внимание на некоторые моменты, которые помешали мне быстро и качественно всё отконфигурировать.&lt;br /&gt;&lt;br /&gt;Во-первых, я возомнил себя шибко умным, а автора последнего гайда — не сведущим в моих задачах, и потому опцию &lt;code&gt;no keep&lt;/code&gt; в настройках &lt;code&gt;fetchmail&lt;/code&gt; сменил на &lt;code&gt;keep&lt;/code&gt; (мотивируя это тем, что я не хочу удалять почту с сервера). Но помощь гугла &lt;a href="http://mail.google.com/support/bin/answer.py?answer=13287"&gt;внятно утверждает&lt;/a&gt;, что ничего с моими письмами не произойдёт — получая от клиента команду удалить письмо, GMail предпринимает действие, заданное пользователем (их четыре — можно &lt;i&gt;оставить копию во Входящих&lt;/i&gt;, &lt;i&gt;пометить письмо как прочитанное&lt;/i&gt;, &lt;i&gt;архивировать&lt;/i&gt; или &lt;i&gt;удалить с сервера&lt;/i&gt;). По этой причине я долго не мог получить все письма — у меня их около полторы тысячи штук, а POP никак не хочет отдавать больше 460-488-ти за раз. Закончилось всё известной мерой — я попал в &lt;i&gt;Lockdown in section 4&lt;/i&gt; на период около шести часов. Эта блокировка распространяется только на POP и IMAP — доступ к веб-интерфейсу остаётся, так что можете не волноваться: что бы ни случилось, почта у вас будет :)&lt;br /&gt;&lt;br /&gt;Второй ошибкой было использование ящика типа mbox (все письма в одном файле). Когда я наконец-то пришёл к выводу, что пора бы перестать качать письма с GMail, а юзать локальную копию, оказалось, что предложенный мне рецепт:&lt;div class="code"&gt;find $MAILDIR -type f | while read mail; do procmail &lt; "$mail"; done&lt;/div&gt;работает только с ящиками типа Maildir (в ящике есть три поддиректории — cur, new и tmp; каждое письмо лежит в отдельном файле). Пришлось в срочном порядке искать способ сконвертировать mbox в maildir, который и нашёлся в лице &lt;a href="http://www.gerg.ca/hacks/mb2md/"&gt;mb2md&lt;/a&gt;. Правда, в конечном итоге я все равно качал всё заново — но уже в maildir ящик…&lt;br /&gt;&lt;br /&gt;Ещё одно важное замечание касается опции &lt;code&gt;fetchmail&lt;/code&gt;'а &lt;code&gt;sslfingerprint&lt;/code&gt;. По всему интернету приводятся хитрые рецепты вроде скачивания откуда-то SSL сертификата (или поиск оного в недрах &lt;code&gt;ca-certificates&lt;/code&gt;) и последующего вычисления отпечатка. Но можно пойти простым путём: указать заведомо неправильный отпечаток, после чего запустить &lt;code&gt;fetchmail&lt;/code&gt; с опцией &lt;code&gt;--verbose&lt;/code&gt; и посмотреть на вывод. В нём вы найдёте отпечаток, который выслал сервер — его-то и следует указать в конфиге.&lt;br /&gt;&lt;br /&gt;Дальше по плану у нас &lt;code&gt;mutt&lt;/code&gt;. Вобщем-то, кое-какую рабочую конфигурацию можно набросать уже после прочтения гентушной вики, но я бы посоветовал взглянуть также на &lt;a href="http://www.opennet.ru/docs/RUS/mutt4users/"&gt;«Настройку Mutt для чайника»&lt;/a&gt;. После этого у вас будет довольно юзабельный почтовик — можете начинать тестить.&lt;br /&gt;&lt;br /&gt;Впрочем, предела совершенству нет, и я рискну рассказать о том, что я добавил в &lt;code&gt;.muttrc&lt;/code&gt; сверх уже упомянутых в статьях настроек.&lt;br /&gt;&lt;br /&gt;Первым дополнением стала адресная книга. Прикрутить такое мирское благо помогла &lt;a href="http://www.linuxcenter.ru/lib/articles/networking/linuxmail.phtml?style=print"&gt;статья Дмитрия Аленичева «Настройка почтовой системы в Linux»&lt;/a&gt; — там упомянута замечательная тулза по имени &lt;code&gt;abook&lt;/code&gt;, реализующая весь необходимый функционал. Для того, чтобы управлять этим чудом прямо из mutt, нужно добавить в конфиг последнего две строки:&lt;div class="code"&gt;# Use abook with Mutt&lt;br /&gt;# Q to search&lt;br /&gt;# a to add sender to abook&lt;br /&gt;set query_command="abook --mutt-query '%s'"&lt;br /&gt;macro index,pager a     "|abook --add-email\n" 'add sender to abook'&lt;/div&gt;Комментарии, как мне кажется, исчерпывающи.&lt;br /&gt;&lt;br /&gt;Вторым важным дополнением стала реализация работы с рассылками (ведь именно они и сподвигли меня на переход к локальному почтовику). Итак, в первую очередь надо приучить &lt;code&gt;mutt&lt;/code&gt; отвечать не собственно автору поста, а прямиком в список рассылки:&lt;div class="code"&gt;set followup_to = yes&lt;br /&gt;set honor_followup_to = yes&lt;/div&gt;Во-вторых, следует объяснить почтовику, на какие рассылки я подписан:&lt;div class="code"&gt;subscribe e-mail_рассылки&lt;/div&gt;И последнее, чем я особо горжусь — локальные копии отсылаемых сообщений будут ложиться в ящики, соответствующие рассылке:&lt;div class="code"&gt;# дефолтный ящик&lt;br /&gt;set record = "+inbox"&lt;br /&gt;# выбираем ящик в зависимости от рассылки&lt;br /&gt;fcc-save-hook ~Cадрессрассылки ящик&lt;/div&gt;Прекрасно, не правда ли? ☺&lt;br /&gt;&lt;br /&gt;Кстати, вернусь немного назад и расскажу про сортировку рассылок в &lt;code&gt;procmail&lt;/code&gt;. К этой задаче есть несколько подходов: некоторые советуют писать правила, используя &lt;code&gt;^TO_&lt;/code&gt;, а некоторые настаивают на использовании более рассылко-специфичных полей. Наиболее полное описание проблемы и её решений дано &lt;a href="http://www.ii.com/internet/robots/procmail/qs/#alt2TO"&gt;здесь&lt;/a&gt;. На тему работы с рассылками в &lt;code&gt;mutt&lt;/code&gt; также написана неплохая статья &lt;a href="http://larve.net/people/hugo/2000/07/ml-mutt"&gt;«Using Mutt to send emails to mailing lists»&lt;/a&gt; — советую почитать и её тоже.&lt;br /&gt;&lt;br /&gt;С &lt;code&gt;msmtp&lt;/code&gt; — последним звеном нашей почтовой цепочки — проблем вообще никаких: всё просто работает; так что о нём я писать не буду вообще ничего ;)&lt;br /&gt;&lt;br /&gt;Happy &lt;code&gt;mutt&lt;/code&gt;ing, &lt;code&gt;procmail&lt;/code&gt;ing и всего такого прочего!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-5185015113580468113?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/VZQb_uu7E9A" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/VZQb_uu7E9A/requiem-for-gmail-webinterface.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>19</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/05/requiem-for-gmail-webinterface.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-7096106898615673218</guid><pubDate>Wed, 05 May 2010 12:57:00 +0000</pubDate><atom:updated>2011-07-15T21:14:02.797+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">Eee PC</category><category domain="http://www.blogger.com/atom/ns#">debian</category><title>Таппинг (tapping) на Eee PC 900HA</title><description>Недельки этак три назад у меня внезапно поломался таппинг — возможность совершать клики ударом по тачпаду. Благо, кнопки на тачпаде всё ещё работали, да и кликать приходилось только в браузере — менеджер окон, &lt;code&gt;dwm&lt;/code&gt;, завязан на клавиатуру.&lt;br /&gt;&lt;br /&gt;Ох, сколько же времени я провёл в гугле, пытаясь найти хоть какую-то ниточку к решению…&lt;br /&gt;&lt;br /&gt;Сегодня же бродил по спискам рассылки Debian и внезпно это самое решение нашёл. Как ни странно, оно &lt;a href="http://en.gentoo-wiki.com/wiki/Synaptics_Touchpad#Tapping_does_not_work_anymore"&gt;расположено в wiki Gentoo&lt;/a&gt; :D&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Вкратце рецепт сводится к следующему действию: файл &lt;code&gt;/usr/share/X11/xorg.conf.d/50-synaptics.conf&lt;/code&gt; следует привести к такому виду:&lt;br /&gt;&lt;div class="code"&gt;Section "InputClass"&lt;br /&gt;        Identifier "touchpad catchall"&lt;br /&gt;        Driver "synaptics"&lt;br /&gt;        MatchIsTouchpad "on"&lt;br /&gt;        Option      "TapButton1" "1"&lt;br /&gt;        Option      "TapButton2" "2"&lt;br /&gt;        Option      "TapButton3" "3"&lt;br /&gt;EndSection&lt;/div&gt;Ура! ☺&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-7096106898615673218?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/Y_Ur80x7FhE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/Y_Ur80x7FhE/tapping-eee-pc-900ha.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>3</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/05/tapping-eee-pc-900ha.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-3028844203183193192</guid><pubDate>Mon, 19 Apr 2010 01:13:00 +0000</pubDate><atom:updated>2010-04-22T22:27:16.453+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">EULA</category><title>Выдержки из Skype EULA</title><description>Решил зарегистрироваться в Skype. Т.к. уже пару месяцев читаю лицензионные соглашения всего, где регаюсь, решил почитать и Skype EULA. Самые интересные (на мой взгляд) моменты решил выложить тут. Приводятся полные абзацы, чтобы можно было уловить смысл; то, что привлекло моё внимание, выделено полужирным. Приятного чтения! ☺&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;2.3 Запрет на модификации: Ты обязуешься не предпринимать и не санкционировать модификаций Программного обеспечения Skype, его перевода на другие языки, &lt;b&gt;создания аналогичных продуктов&lt;/b&gt;, декомпилирования, обратного ассемблирования, нарушения целостности защитной системы Программного обеспечения, а также создания других программных продуктов на базе Программного обеспечения Skype либо его части за исключением случаев, допустимых в соответствии с законодательством.&lt;br /&gt;&lt;br /&gt;3.2.4 Лицензия. В соответствии с положениями настоящего Соглашения &lt;b&gt;ты предоставляешь Skype неисключительную, имеющую силу во всех странах мира, бессрочную, не подлежащую отзыву, бесплатную, подлежащую сублицензированию и переуступке лицензию на использование Контента на любых носителях информации в связи с услугами, предоставляемыми Skype.&lt;/b&gt; &lt;i&gt;(какая-то непонятная фигня — что же они имеют в виду?)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;3.6 &lt;b&gt;Запрет на использование с целью вызова экстренной помощи&lt;/b&gt;: Программное обеспечение Skype не предназначено для осуществления или поддержки связи со службами экстренной помощи и не может использоваться для телефонной связи с больницами, органами охраны правопорядка, учреждениями медицинской помощи и любыми другими службами экстренной помощи. Ты понимаешь и соглашаешься со следующими положениями: (i) никакие — ни местные, ни федеральные — правила, нормативные требования или законы не накладывают на Skype обязательств по предоставлению средств вызова экстренной помощи; (ii) для того чтобы получить возможность вызова экстренной помощи, ты обязан предпринять дополнительные меры и приобрести (отдельно от Программного обеспечения Skype) традиционные услуги сотовой или стационарной телефонной связи для обеспечения такой возможности вызова экстренной помощи; и (iii) Skype не предназначен для использования в качестве замены традиционных средств телефонной связи.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;UPD&lt;/b&gt;&lt;br /&gt;Всё-таки зря я его поставил. Ладно уж, пусть пишут всё, что я скажу — все равно я пока что ничего, кроме тестовых звонков, не предпринимал. Но когда я закрыл программу, а через полчаса получил уведомление, что один из контактов зашёл в сеть, мне скайп разонравился окончательно. И не надо говорить мне о трее — его в dwm нет.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-3028844203183193192?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/KEvSPJDFRVM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/KEvSPJDFRVM/skype-eula.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>11</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/04/skype-eula.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-6545712579274452194</guid><pubDate>Fri, 16 Apr 2010 23:35:00 +0000</pubDate><atom:updated>2010-04-17T03:59:26.070+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">vim</category><title>Окна в vim</title><description>Я никогда не пробовал работать с окнами в vim, потому что ни на моём десктопном монике (17", 1280x1024), ни на нетбуке (8,9", 1024x600) они не дают никаких преимуществ — места и так довольно мало. Но неделю назад мне довелось пару дней поработать на ноуте с широкоформатным экраном, и там несколько файлов в разных окнах выглядят просто замечательно!&lt;br /&gt;&lt;br /&gt;Вообще-то тема окон в vim не является чем-то очень новым или сложным — основную инфу можно легко нагуглить или получить, набрав в vim'е &lt;code&gt;:help window&lt;/code&gt; — но я всё же решил написать эту заметку: и себе на память, и потому, что &lt;a href="http://welinux.ru/post/2791/#cmnt51342"&gt;idler с welinux'а напомнил&lt;/a&gt; :)&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Прежде чем начать, замечу, что я использую исключительно консольную версию vim'а. Как нижеприведённые команды поведут себя в gVim, я не знаю. Не думаю, что вы что-то сломаете, но все равно — я предупредил :) И да, скриншоты я делал на своём десктопе, так что они будут 4:3.&lt;br /&gt;&lt;br /&gt;Итак, окна в vim ничем не отличаются от оконо в вашем любимом DE или WM — это просто участки экрана, содержащие какую-то информацию. В случае с вимом в роли информации чаще всего выступают файлы, хотя в окне может быть и плагин (например, &lt;a href="http://www.vim.org/scripts/script.php?script_id=1658"&gt;NERD_TREE&lt;/a&gt;). vim с несколькими открытыми окнами выглядит так:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Nb6QYFUvBjY/S8j8QLseHMI/AAAAAAAAAMM/jM9CanyIZOo/s1600/vim_windows_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 255px;" src="http://1.bp.blogspot.com/_Nb6QYFUvBjY/S8j8QLseHMI/AAAAAAAAAMM/jM9CanyIZOo/s320/vim_windows_1.png" border="0" alt="vim с несколькими окнами" id="BLOGGER_PHOTO_ID_5460891903134145730" /&gt;&lt;center&gt;&lt;font size="-2"&gt;vim с несколькими окнами&lt;br /&gt;Слева NERD_TREE, справа — сорцы любимого ядрышка&lt;/font&gt;&lt;/center&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Заставить vim открыть несколько файлов в разных окнах, расположив их горизонтально, можно такой командой:&lt;br /&gt;&lt;div class="code"&gt;vim -o attr.c open.c sync.c&lt;/div&gt;&lt;br /&gt;Окно NERD_TREE добавляется выполнением команды &lt;code&gt;:NERDTree&lt;/code&gt; Разбивка по вертикали задаётся опцией &lt;code&gt;-O&lt;/code&gt;:&lt;br /&gt;&lt;div class="code"&gt;vim -O attr.c open.c sync.c&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Nb6QYFUvBjY/S8j9P4QPbII/AAAAAAAAAMU/wnYCDfjoLmg/s1600/vim_windows_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 255px;" src="http://1.bp.blogspot.com/_Nb6QYFUvBjY/S8j9P4QPbII/AAAAAAAAAMU/wnYCDfjoLmg/s320/vim_windows_2.png" border="0" alt="Результат выполнения vim -O attr.c open.c sync.c"id="BLOGGER_PHOTO_ID_5460892997427096706" /&gt;&lt;center&gt;&lt;font size="-2"&gt;Результат выполнения &lt;code&gt;vim -O attr.c open.c sync.c&lt;/code&gt;&lt;/font&gt;&lt;/center&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Если vim уже открыт, новое окно можно создать несколькими путями:&lt;ul&gt;&lt;li&gt;пустое окно — &lt;code&gt;ctrl+w n&lt;/code&gt;&lt;/li&gt;&lt;li&gt;горизонтально разбить текущее окно на два — &lt;code&gt;ctrl+w s&lt;/code&gt;&lt;/li&gt;&lt;li&gt;вертикально разбить текущее окно на два — &lt;code&gt;ctrl+w v&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;Закрывается окно комбинацией &lt;code&gt;ctrl+w c&lt;/code&gt; Впрочем, для закрытия окна может использоваться и традиционное &lt;code&gt;:q&lt;/code&gt; (вместе с модификациями вроде &lt;code&gt;:q!&lt;/code&gt; и &lt;code&gt;:wq&lt;/code&gt;). Чтобы закрыть все окна и покинуть vim, наберите &lt;code&gt;:qall&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Теперь перейдём к самой частой операции — перемещению между окнами. Собственно говоря, здесь всё просто: жмём &lt;code&gt;ctrl+w&lt;/code&gt; и указываем направление: &lt;code&gt;h&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt;, &lt;code&gt;k&lt;/code&gt; или &lt;code&gt;l&lt;/code&gt; (не пугайтесь — стрелочки тоже работают :). Если кто забыл раскладку, напоминаю:&lt;br /&gt;&lt;div class="code"&gt;  k&lt;br /&gt;h j l&lt;/div&gt; Не забывайте про то, что вы в vim'е, т.е. очень продуманной и мощной среде — не стесняйтесь делать &lt;code&gt;ctrl+w 3l&lt;/code&gt; и т.п. :)&lt;br /&gt;&lt;br /&gt;Для переключения на предыдущее и следующее окна есть команды попроще — &lt;code&gt;ctrl+w p&lt;/code&gt; и &lt;code&gt;ctrl+w w&lt;/code&gt; соответственно.&lt;br /&gt;&lt;br /&gt;Более редкими операциями является передвижение и ресайз окон. Тут нет ничего сложного — двигать окна почти так же просто, как и переключаться между ними: нажимаем &lt;code&gt;ctr+w&lt;/code&gt; и говорим, куда двигать — &lt;code&gt;H&lt;/code&gt;, &lt;code&gt;J&lt;/code&gt;, &lt;code&gt;K&lt;/code&gt; или &lt;code&gt;L&lt;/code&gt; (обратите внимание на регистр). Увеличение и уменьшение окон также не представляют собой ничего сложного — сделать окно шире или у́же можно с помощью клавиш &lt;code&gt;&amp;gt;&lt;/code&gt; (шире) и &lt;code&gt;&amp;lt;&lt;/code&gt; (у́же), выше или ниже — с помощью &lt;code&gt;+&lt;/code&gt; и &lt;code&gt;-&lt;/code&gt;. Все эти команды меняют размер на единицу, но можно указывать и число — т.е. &lt;code&gt;ctrl+w 5+&lt;/code&gt; является абсолютно валидной командой.&lt;br /&gt;&lt;br /&gt;Напоследок хотелось бы привести некоторые команды, имеющие отношение к вимовским окнам. По большей части они будут полезны программистам:&lt;br /&gt;&lt;code&gt;vim -d файл1 файл2&lt;/code&gt; позволяет сравнивать файлы&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Nb6QYFUvBjY/S8kFGpj8PXI/AAAAAAAAAMc/BeDbSZ3c4yg/s1600/vim_windows_3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 255px;" src="http://2.bp.blogspot.com/_Nb6QYFUvBjY/S8kFGpj8PXI/AAAAAAAAAMc/BeDbSZ3c4yg/s320/vim_windows_3.png" border="0" alt="vim -d pk.new pk.old" id="BLOGGER_PHOTO_ID_5460901634957393266" /&gt;&lt;center&gt;&lt;font size="-2"&gt;&lt;code&gt;vim -d pk.new pk.old&lt;/code&gt;&lt;/font&gt;&lt;/center&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ctrl-w ]&lt;/code&gt; делит текущее окно, во второй половине открывает определение того, что под курсором&lt;br /&gt;&lt;code&gt;ctrl+w [idf]&lt;/code&gt; разделяет окно и во второй половине открывает:&lt;ul&gt;&lt;li&gt;&lt;code&gt;i&lt;/code&gt; — определение переменной&lt;/li&gt;&lt;li&gt;&lt;code&gt;d&lt;/code&gt; — определение (функции или чего там под курсором)&lt;/li&gt;&lt;li&gt;&lt;code&gt;f&lt;/code&gt; — файл, путь к которому находится под курсором&lt;/li&gt;&lt;/ul&gt;&lt;code&gt;ctrl+w o&lt;/code&gt; закрывает все окна, кроме текущего&lt;br /&gt;&lt;br /&gt;Пожалуй, всё. Напомню, что более подробно об окнах вы можете почитать в самом виме, набрав &lt;code&gt;:help window&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Happy vimming!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-6545712579274452194?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/Op4OYvDGDqA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/Op4OYvDGDqA/vim.html</link><author>noreply@blogger.com (Minoru)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Nb6QYFUvBjY/S8j8QLseHMI/AAAAAAAAAMM/jM9CanyIZOo/s72-c/vim_windows_1.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/04/vim.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-346079394795388478</guid><pubDate>Mon, 12 Apr 2010 10:21:00 +0000</pubDate><atom:updated>2011-12-11T15:03:15.539+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mirror</category><title>SSH за проксей</title><description>Этот пост является переводом статьи &lt;a href="http://daniel.haxx.se/docs/sshproxy.html"&gt;«SSH Over Proxy»&lt;/a&gt; Даниэля Стенберга (Daniel Stenberg), выполненный для &lt;a href="http://welinux.ru"&gt;welinux.ru&lt;/a&gt; &lt;a href="http://welinux.ru/post/2664/#cmnt48772"&gt;по просьбе пользователя |xed|&lt;/a&gt;&lt;br /&gt;
Переведена редакция статьи, датированная 24-м ноября 2009-го года, 23:53 (Центральная Европа, Стокгольм, Швеция).&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;SSH через или за прокси&lt;/h3&gt;В сегодняшнем жестоком сетевом мире мы слишком часто оказываемся за проксями компаний, ограничивающих наши возможности по использованию интернета на работе, у заказчика или, в некоторых случаях, даже дома или у друзей.&lt;br /&gt;
&lt;br /&gt;
Прокси-сервера не только ограничивают нас в том, что мы можем делать, какие протоколы можем использовать, какие сайты можем посещать и какие TCP порты являются открытыми, они также позволяют вашей компании или друзьям наблюдать и контролировать вас.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Заметьте:&lt;/b&gt; даже если вы используете HTTPS через прокси, имя сервера не шифруется, так что логирующий прокси увидит, к каким HTTPS серверам вы подключаетесь.&lt;br /&gt;
&lt;br /&gt;
Я покажу вам некоторые простые способы, позволяющие обойти ограничения большинства проксей, что даст вам больше свободы и не позволит наблюдателям исследовать ваши предпочтения в веб-серфинге!&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Что вам нужно&lt;/h3&gt;Вам нужен софт, установленный и работающий «снаружи» по отношению к тому месту, где вы находитесь. В этом документе я называю такое место «домом».&lt;br /&gt;
&lt;br /&gt;
Место, из которого вы хотите получить доступ, будет называться «работой». На работе вы находитесь за злым прокси-сервером.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Дома&lt;/h3&gt;&lt;b&gt;Вам нужен работающий HTTP-прокси&lt;/b&gt;, принимающий соединения с localhost'а. У многих людей есть уже работающий Apache, а подгрузить и сконфигурировать mod_proxy очень легко. Конечно же, вы можете использовать любой другой прокси, например, squid. В этом примере будет подразумеваться, что прокси работает на 80-м порту — том же, что и обычный апач.&lt;br /&gt;
&lt;br /&gt;
Вы можете включить HTTPS и FTP, а также любой другой протокол в конфиге прокси.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Вам также понадобится sshd, работающий на 443-м порту.&lt;/b&gt; Почти у каждого уже есть работающий sshd, вам просто нужно сделать так, чтобы он также слушал порт 443. 443-й часто используется для HTTPS, потому-то мы его и используем — большинство проксей позволяют к нему подключаться, так как компании разрешают своим работникам использовать банки и другие HTTPS сервисы в вебе.&lt;br /&gt;
&lt;br /&gt;
Наверное, этого можно и не говорить, но вы должны убедиться, что ваш Apache или другой httpd не использует 443-й порт для HTTPS.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;На работе&lt;/h3&gt;&lt;b&gt;Вам нужен SSH клиент&lt;/b&gt;, способный посылать CONNECT-запросы через ваш корпоративный HTTP прокси. Под Windows можно использовать Putty — в нём есть встроенная поддержка для туннелирования через HTTP прокси. Под unix/linux (или cygwin), вы можете использовать openssh и corkscrew для того, чтобы через прокси попасть на 443-й порт своего домашнего компьютера.&lt;br /&gt;
&lt;br /&gt;
Если вы используете openssh, добавьте в свой &lt;code&gt;~/.ssh/config&lt;/code&gt; такую строку:&lt;br /&gt;
&lt;div class="code"&gt;&lt;code&gt;ProxyCommand /usr/local/bin/corkscrew proxy.work.com 80 %h %p&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
Теперь вы должны указать вашему ssh клиенту пробросить локальный порт, скажем, 8080-й, на удалённый localhost:80. После этого вы получаете шифрованный канал к вашему домашнему компьютеру. Естественно, у вас также будет обыкновенный SSH, так что вы можете запускать X-приложения так, чтобы они появлялись на экране вашего рабочего компьютера, а также многое другое.&lt;br /&gt;
&lt;br /&gt;
Команда openssh для подключения и проброса порта через прокси выглядит примерно так:&lt;br /&gt;
&lt;div class="code"&gt;&lt;code&gt;ssh -L 8080:localhost:80 user@server.at.home -p 443&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Сконфигурируйте ваш браузер&lt;/b&gt; на работе так, чтобы для всех протоколов, которые вы включили на прокси-сервере дома, использовался прокси по адресу localhost:8080.&lt;br /&gt;
&lt;br /&gt;
Теперь все запросы браузера будут посылаться через SSH-соединение через прокси на ssh сервер дома, а потом — прокси-серверу и в мир.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Без CONNECT&lt;/h3&gt;В случае, если подключение к 443-у порту запрещены, вы можете попробовать другой (если CONNECT разрешен хоть где-то); вам может понадобится перенести ваш прокси/веб сервер с 80-го порта, если это единственный приемлемый путь.&lt;br /&gt;
&lt;br /&gt;
Если не можете найти подходящий порт или CONNECT запрещены насовсем, вы должны создать туннель с помощью обыкновенного HTTP, используя, например, &lt;a href="http://www.nocrew.org/software/httptunnel.html"&gt;httptunel&lt;/a&gt;. httptunel — это клиент-серверное приложение; вам нужен сервер («hts»), работающий на домашнем компьютере и слушающий 80-й порт, и клиент («htc»), запущенный на вашем рабочем компьютере и создающий тунель.&lt;br /&gt;
&lt;br /&gt;
Дома принимайте входящие соединения на 80-й порт и перенаправляйте их на 22-й (ssh):&lt;br /&gt;
&lt;code&gt;hts -F localhost:22 80&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
На работе подключайтесь к дому через корпоративный прокси и пробрасывайте локальный порт (8022-й, например) на SSH дома:&lt;br /&gt;
&lt;div class="code"&gt;&lt;code&gt;htc -P proxy.corp.com:80 -F 8022 server.at.home:80&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Дополнительные комментарии&lt;/h3&gt;С другими протоколами для начала надо просто пробросить больше портов с работы домой. Дальше всё зависит от протокола. Например, если вы хотите настроить работу IRC, вам понадобится «боунсер» (например &lt;a href="http://muh.sf.net/"&gt;muh&lt;/a&gt;), работающий на вашей домашней машине, так как в противном случае IRC не будет работать правильно.&lt;br /&gt;
&lt;br /&gt;
В случае, если на работе вас на самом деле не прячут за прокси, вы все равно можете использовать описанные методы (хотя вы можете пропустить часть, описывающую выполнение CONNECT, а также не обязаны привязывать ssh к 443-му порту) для того, чтобы не дать админам шпионить за вашим сетевым траффиком.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. перводчика: спасибо &lt;a href="http://welinux.ru/user/mrak018/"&gt;mrak018&lt;/a&gt; за советы и подсказки!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-346079394795388478?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/kRt-zND4yLk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/kRt-zND4yLk/ssh.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>4</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/04/ssh.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8622169542119587655.post-2474289750262055412</guid><pubDate>Thu, 08 Apr 2010 05:04:00 +0000</pubDate><atom:updated>2010-04-08T03:56:24.549+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tips'n'tricks</category><category domain="http://www.blogger.com/atom/ns#">review</category><category domain="http://www.blogger.com/atom/ns#">web</category><title>TorrentsFolder.ru — убийца традиционных файлообменников</title><description>Когда нам нужно передать друзьям фотки с праздника или отправить одногруппнику сканы заданий для лабораторных работ, мы, не задумываясь, пакуем rar, выкладываем его на Rapidshare или iFolder и отправляем получателю ссылку. Всё очень легко и просто, правда? Есть, конечно, маленькие нюансы — скажем, получателю наверняка придётся ждать очередь на скачивание, смотреть рекламу и вводить капчу, а в довесок ему ещё и скорость ограничат. Но это ведь &lt;u&gt;неизбежная&lt;/u&gt; плата за удобство, правда?&lt;br /&gt;&lt;br /&gt;Нет, не неизбежная.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;В наше время торрентами пользуется практически каждый. Так почему бы не использовать их в качестве файловой шары типа «рапиды»? TorrentsFolder предоставляет такую возможность.&lt;br /&gt;&lt;br /&gt;Всё предельно просто: вы создаёте &lt;code&gt;torrent&lt;/code&gt;-файл с тем, что хотите передать, указав в качестве трекера (announce URL) «&lt;code&gt;http://torrentsfolder.appspot.com/&lt;/code&gt;» (естественно, без кавычек). Полученный файл передаёте получателю любым удобным способом, будь то ICQ, Jabber или e-mail. Дальше всё как обычно: вы сидируете, а тот, кому вы передали файл — качает.&lt;br /&gt;&lt;br /&gt;Естественно, у этого метода есть свои недостатки — например, торрент «умрёт», как только вы уйдёте с раздачи. С другой стороны, если вы передаёте информацию больше чем одному человеку, TorrentsFolder выглядит наиболее подходящим решением — ведь чем больше пиров, тем быстрее идёт файлообмен. И самое главное — никаких очередей на закачку, капч и ограничений скорости!&lt;br /&gt;&lt;br /&gt;&lt;i&gt;P.S. Кстати говоря, этот пост я отправлял в песочницу хабра — не приняли. Жаль :(&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-2474289750262055412?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Debiania/~4/klln6AJXv9M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Debiania/~3/klln6AJXv9M/torrentsfolderru.html</link><author>noreply@blogger.com (Minoru)</author><thr:total>19</thr:total><feedburner:origLink>http://debiania.blogspot.com/2010/04/torrentsfolderru.html</feedburner:origLink></item></channel></rss>

