<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_2"  />
<title>rulinux.net - Статьи</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Статьи</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>как из perl сделать rtf-документ с картинками и таблицами</title>
<link>https://rulinux.net/message.php?newsid=42980&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=42980&amp;page=1</guid>
<pubDate>Tue, 05 Sep 2017 12:22:32 +0300</pubDate>
<description><![CDATA[<p>делается это таким скриптом и его откроет и отобразит корректно любая версия Microsoft Word . Картинка вставляется в само тело rtf-файла.<br><br><fieldset><legend>perl</legend><div class="highlight perl"><br />
<br />
<span class="co1">#!/usr/bin/perl -w</span><br />
<br />
<span class="kw2">use</span> RTF<span class="sy0">::</span><span class="me2">Writer</span><span class="sy0">;</span><br />
<span class="kw2">use</span> utf8<span class="sy0">;</span><br />
<span class="kw2">use</span> strict<span class="sy0">;</span><br />
<br />
<span class="kw1">my</span> <span class="re0">$rtf</span> <span class="sy0">=</span> RTF<span class="sy0">::</span><span class="me2">Writer</span><span class="sy0">-&gt;</span><span class="me1">new_to_file</span><span class="br0">&#40;</span><span class="st0">&quot;/home/vilfred/test.rtf&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">prolog</span><span class="br0">&#40;</span> <span class="st_h">'title'</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;rrr&quot;</span><span class="sy0">,</span> <span class="st_h">'author'</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;eee&quot;</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw1">for</span><span class="br0">&#40;</span>1 <span class="sy0">..</span> 3<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<br />
&nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">paragraph</span><span class="br0">&#40;</span>\<span class="st_h">'\fi450\fs25\b\i'</span><span class="sy0">,</span><span class="st0">&quot;раздватри<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">paragraph</span><span class="br0">&#40;</span>\<span class="st_h">'\fs25\fi450\sl370\slmult1\sb190\sa270'</span><span class="sy0">,</span><span class="st0">&quot;развдатри<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">my</span> <span class="re0">$tab</span> <span class="sy0">=</span> RTF<span class="sy0">::</span><span class="me2">Writer</span><span class="sy0">::</span><span class="me2">TableRowDecl</span><span class="sy0">-&gt;</span><span class="me1">new</span><span class="br0">&#40;</span> <span class="st_h">'widths'</span> <span class="sy0">=&gt;</span> <span class="br0">&#91;</span> 800<span class="sy0">,</span> 1200 <span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">row</span><span class="br0">&#40;</span> <span class="re0">$tab</span><span class="sy0">,</span> <span class="st_h">'один'</span><span class="sy0">,</span> <span class="st_h">'два xxxxxxx'</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">row</span><span class="br0">&#40;</span> <span class="re0">$tab</span><span class="sy0">,</span> <span class="st_h">'три'</span><span class="sy0">,</span> <span class="st_h">'четыыре yyyyyyyyy'</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">paragraph</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; \<span class="st_h">'\qc'</span><span class="sy0">,</span> &nbsp; <br />
&nbsp; &nbsp; &nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">image</span><span class="br0">&#40;</span> <span class="st_h">'filename'</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;/home/vilfred/1.png&quot;</span><span class="sy0">,</span> scalex <span class="sy0">=&gt;</span> <span class="nu0">10</span><span class="sy0">,</span> scaley <span class="sy0">=&gt;</span> <span class="nu0">10</span> <span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; <span class="co1"># scale - масштаб в процентах от исходного размера картинки</span><br />
&nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">close</span><span class="sy0">;</span><br />
<br />
<br />
<br />
&nbsp;</div></fieldset></p>]]></description>
</item>
<item>
<title>Security FAQ (butthurt edition)\sup{(1)}</title>
<link>https://rulinux.net/message.php?newsid=42889&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=42889&amp;page=1</guid>
<pubDate>Thu, 20 Apr 2017 17:26:01 +0300</pubDate>
<description><![CDATA[<p><a href="http://www.internetdeclaration.org/">We believe that a free and open Internet can bring about a better world.</a><br /><br><br>NOTE: No warranties, either express or implied, are hereby given. All<br /> software is supplied as is, without guarantee.  The user assumes all<br /> responsibility for damages resulting from the use of these features,<br /> including, but not limited to, frustration, disgust, system abends, disk<br /> head-crashes, general malfeasance, floods, fires, shark attack, nerve<br /> gas, locust infestation, cyclones, hurricanes, tsunamis, local<br /> electromagnetic disruptions, hydraulic brake system failure, invasion,<br /> hashing collisions, normal wear and tear of friction surfaces, comic<br /> radiation, inadvertent destruction of sensitive electronic components,<br /> windstorms, the Riders of Nazgul, infuriated chickens, malfunctioning<br /> mechanical or electrical sexual devices, premature activation of the<br /> distant early warning system, peasant uprisings, halitosis, artillery<br /> bombardment, explosions, cave-ins, and/or frogs falling from the sky.<br /><br><br>к сожалению в Мире не так много вещей и событий, <b>всегда</b> доставляющих сугубо положительные эмоции. например - процесс мочеиспускания. ещё круче - испытать неимоверную лёгкость в теле, как будто можешь одной рукой дотянуться до звёзд, - после особо удачного.. гхм.. да.. и когда  на этом фоне некие Злые Люди хотят запретить тебе осуществлять естественные потребности (а потребность в Общении - одна из базовых, ибо      Homo - животное стадное), либо стремятся (силой) ограничить твоё любопытство (в стремлении познавать Мир) - именно тогда и возникает         <b>осознанное</b> неодолимое: <b>&quot;таки надо что-то делать..&quot;(ц)</b><br><br>не так давно у посетителей славного ресурса &quot;rulinux.net&quot; <a href="http://rulinux.net/                                  thread_42887_comment_220061#msg220047">возник житейский вопрос</a> свободы слова и вероисповедания в этих вот интернетах. один из &quot;анонимусов&quot; в трэде выражает          опасение, что вот эта-самая швабодка Слова (без тотального госконтроля) отольётся в итоге взрывом его личного мерседеса, переоборудованием   его загородной виллы в санаторий/базу отдыха/детсад и, как максимум, в преждевременное (насильственное) принятие ислама пациентом. страх или ещё какая причина не только сдвигает акцент от действий к словам, но и прямо игнорирует статьи <a href="http://www.constitution.ru/ 10003000/10003000-4.htm">Конституции</a>. как следствие - встаёт раком вопрос о сохранении анонимности, ибо <a href="http://www.           constitution.ru/10003000/10003000-4.htm">статьи 22-24, 28, 29</a> намекают на что-то подобное.<br><br>И я хотел познать добро и зло,<br /> Чтоб отличить добро от зла,<br /> Мне повезло, - я смог понять,<br /> Как труден шаг от слов к делам.<br /> И как глупо рубить с плеча,<br /> И как просто быть правым в речах,<br /> И как страшно бывает начать<br /> Всё сначала.<br /> (Воскресенье)<br><br>грубо говоря, некая степень &quot;<a href="https://habrahabr.ru/post/254217/">анонимности в интернете</a>&quot; возможна только после вытаскивания сетевого   кабеля из гнезда сетевой карты. как вариант - использование сторонних (wireless) точек доступа. при этом стоит контролировать наличие/       сектора обзора стационарных видеокамер наблюдения. получить &quot;анонимное&quot; проводное подключение возможно при регистрации договора с            провайдером на фиктивное/подставное юрлицо. при этом необходимо понимать одну простую вещь: провайдер видит весь твой трафик. из этого и     исходим.<br><br><b>1. Выбираем платформу</b><br><br>&quot;платформа&quot; - это программно-аппаратный комплекс, который ты используешь. <a href="https://stallman.org/stallman-computing.    html">Richard Stallman</a>, например, предпочитает &quot;Thinkpad X60&quot;. с недавних пор и <a href="http://www.securitylab.ru/contest/438339.php">AMD</a> (PSP) и               <a href="http://www.securitylab.ru/contest/437841.php">Intel</a> (AMT) комплектуют свои процессоры закладками на аппаратном уровне. что &quot;внутри&quot; -  неизвестно. отсюда мораль: использование <b>любого</b> корпоративного/proprietary/closed_source продукта - нежелательно. пока на &quot;бытовом&quot;      уровне реальных альтернатив &quot;проприетарному железу&quot; нет. остаётся надеяться, что десктоп на <a href="https://arstechnica.com/security/2016/ 05/chinese-arm-vendor-left-developer-backdoor-in-kernel-for-android-pi-devices/">ARM</a> как-то исправит ситуацию в лучшую сторону. <a href="http://hexus.net/tech/news/cpu/40037-china-made-us-military-chip-security-backdoor/">хотя..      </a> с &quot;железом&quot; всегда как-то сложно.. далее              рассматриваем исключительно Open Source Software - программные продукты с открытым исходным кодом<sup>(*)</sup>.<br><br><b>2. Soft</b><br><br>— Где умный человек прячет лист? В лесу.<br /> Фламбо молчал.<br /> — Если нет леса, он его сажает. И, если ему надо спрятать мертвый лист, он сажает мертвый лес.<br /> Ответа опять не последовало, и священник добавил еще мягче и тише:<br /> — А если ему надо спрятать мертвое тело, он прячет его под грудой мертвых тел.<br /> (“Сломанная шпага” Г.-К. Честертон)<br><br>любой софт сам по себе - песнь ни о чём. сферический конь в вакууме. его стоит проверить &quot;на вшивость&quot;. если знаний в программировании       нет -  сторонние ресурсы в помощь (для браузеров)<sup>(**)</sup>:<br /> 1) <a href="http://browserspy.dk/">раз</a><br /> 2) <a href="https://whoer.net/">два</a><br /> 3) <a href="http://ip-check.info/">три</a><br /> 4) <a href="http://html5test.com">четыре</a><br><br>в первую очередь выбираем &quot;альтернативные&quot; DNS, не логирующие запросы пользователя. иначе over 9000 прокси в супер-пупер контейнерах         <s>смело маршируют няхуй</s> теряют смысл. при желании (или по &quot;убедительной просьбе&quot; суда или ... ещё кого..) провайдер логирует весь ваш      трафик и разбирает его вплоть до хэдеров пакетов. дело это муторное, скучное и неблагодарное. в случае наличия DPI (deep packet              inspection) - дорогостоящее. как следствие - комбинация SOCKS[4/5] proxy + https proxy с перенаправлением всех DNS запросов через SOCKS для  браузеров даёт некий &quot;прожиточный минимум&quot; анонимности. другими словами - TOR + HTTPS Proxy. дёшево и сердито. если выбранный браузер по     какой-то причине не может в socks/tor - используем прокладку типа &quot;privoxy&quot; или любой иной проксирующий сервис, способный перенаправить      запросы в socks. при настройке &quot;user agent&quot;-а не забываем про &quot;лист в лесу&quot;..<br><br>более дорогим вариантом является приобретение vpn/vps &quot;где-то там, за горизонтом&quot;, установка защищённого соединения (vpn/ssh/stunnel) и      последующий роутинг всего трафика через него. добавим TOR + HTTPS Proxy при желании. схема с использованием стороннего vpn/vps в быту        маскирует ip конечного пользователя для torrent-ов. Tor работает только с tcp, а торренты наряду с tcp пользуют udp, что и позволяет в       некоторых случаях деанонимизировать пользователя tor.<br><br>если возникла неодолимая нужда помахать пинусом - смотрим в сторону \url[i2p]{http://anonymouse.org/cgi-bin/anon-www.cgi/http://lurkmore.to/ I2p}. сразу прощаемся с гигабайтными закачками в секунду. и с мегабайтными в секунду - тоже. by design.<br><br>в идеале стремимся полностью контролировать исходящий и входящий трафик. \url[LARTC]{http://lartc.org/} и \url[Iptables Tutorial]{https://   www.frozentux.net/iptables-tutorial/iptables-tutorial.html} в помощь. для \url[*BSD - pf]{https://www.openbsd.org/faq/pf/}<br><br>шифрование контента (от e-mail и до любимого прона) оставляем за \url[gpg]{https://www.gnupg.org/}/\url[pgp]{http://openpgp.org/}.<br><br>любителям экстремальных видов спорта целесообразно рассмотреть вопросы шифрования дисков и/или их разделов целиком и полностью. вдруг        украдут ноут с любимым проном.. в быту подобное шифрование является дополнительной нагрузкой на систему. при этом независимые специалисты по термо-ректальному криптоанализу дают 146% гарантии подбора необходимых ключей и паролей. тут скорее есть смысл смотреть в сторону mobile-    rack и (usb) flash-накопителей как для системы, так и для &quot;особо важных данных&quot;. в случае приезда пати-вэна с бенефисом маски-шоу и всякими  бумажками с печатями (т.е. в случае опечатывания и выноса всей техники в неизвестном направлении) что успеешь выдернуть (и перепрятать/      выкинуть в окно) - то и останется.. думайте сами, решайте сами..<br><br>про очистку/блокировку &quot;истории url&quot;, а также про настройки &quot;кукесов&quot; и хранение всех паролей исключительно в своей собственной голове и без того сотни историй, да только их никто не читает.. &quot;pwgen&quot; придумали для лузеров. лучшая файловая система - FAT32. &quot;спасибо, все в           курсе&quot;(ц)(тм)<br><br><b>3. Мама, мама, что я буду делать..<br />    Мама, мама, как мне дальше жить..</b><br /> (кю..)<br><br>итак, вы <s>прочли всю эту статью. вдумчиво и внимательно разобрали ключевые моменты и,</s> внезапно и неожиданно пришли к успеху <sup>(***)</sup>.  за вами приехал пати-вэн с дискотекой и отвёз в безопасное место, где все люди полны любви и обожания. (ваше..) будущее кристально ясно и    хрустально прозрачно<sup>(****)</sup>. &quot;что делать?&quot;(ц)(тм)..<br><br>поскольку у вас таки (в теории) появилось свободное время, попробуйте сперва ознакомиться с этим-самым законодательством: Конституция, УК,   ГК.. изучите материалы вашего дела (если позволят).. улыбайтесь, внимательно слушайте окружающих, не болтайте. всё, что вы скажете, может и  будет использовано против вас. не нужно никого убеждать в том, что вы - невиновны. это и так прописано в Конституции. все в курсе. &quot;их&quot;      задача - доказать вашу виновность. ваша - не дать &quot;им&quot; этого сделать. следите за собой и хорошенько думайте над каждым своим словом. ничего  не подписывайте. маркируйте/перечёркивайте любые пустые места на бумагах во избежание появления там совершенно лишних слов.. &quot;До судебного   решения лицо не может быть подвергнуто задержанию на срок более 48 часов.&quot;(ц)(Статья 22) - крепитесь, не сдавайтесь..<br><br>___________________<br><br>*) агрессивное внедрение &quot;systemd&quot; заставляет обратить пристальное внимание на &quot;традиционные&quot; системы: Slackware, Crux, *BSD, etc..<br /> **) спасибо \url[Lurkmore]{http://anonymouse.org/cgi-bin/anon-www.cgi/http://lurkmore.to/I2p} за грамотную статью!<br /> ***) таки довыёбывались и не успели вовремя съебаться..<br /> ****) тобі пiзда, хлопець.. <br /> 1) DRAFT! камменты, исправления, дополнения, уточнения и соточки аффтару на мобилку - огонь! </p>]]></description>
</item>
<item>
<title>vim. [^б^е^с]полезные настройки</title>
<link>https://rulinux.net/message.php?newsid=42727&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=42727&amp;page=1</guid>
<pubDate>Sun, 06 Nov 2016 16:43:34 +0300</pubDate>
<description><![CDATA[<p>немножко про правописание и hex-ы. если позволите. <br><br>vim умеет очешуительно проверять написание этого вашего рюсскага йезыка и магёт hex. можно хрюкнуть и vim-ом поправить бутлоадер. внезапно и неожиданно. <fieldset><legend>bash</legend><div class="highlight bash">&nbsp;<span class="kw2">vim</span> <span class="sy0">/</span>dev<span class="sy0">/</span>sda &nbsp;</div></fieldset> рисуем в ~/.vimrc:<br /> <fieldset><legend>vim</legend><div class="highlight vim">&nbsp;<br />
<span class="kw1">function</span> EditHexMode<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<span class="kw1">if</span> <span class="sy0">!</span><span class="kw3">exists</span><span class="br0">&#40;</span><span class="st0">&quot;b:editHex&quot;</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="sy0">!</span>b<span class="sy0">:</span>editHex<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setlocal binary<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">let</span> b<span class="sy0">:</span>editHex=1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">%!</span>xxd<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">echo</span> <span class="st0">&quot;converted to Hex mode&quot;</span><br />
&nbsp; &nbsp;<span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setlocal nobinary<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">let</span> b<span class="sy0">:</span>editHex=0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">%!</span>xxd <span class="sy0">-</span>r<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">echo</span> <span class="st0">&quot;converted back to binary format&quot;</span><br />
&nbsp; &nbsp;<span class="kw1">endif</span><br />
endfunc<br />
<br />
<span class="kw3">map</span> <span class="sy0">&lt;</span>F4<span class="sy0">&gt;</span> <span class="sy0">&lt;</span>Esc<span class="sy0">&gt;:</span><span class="kw1">call</span> EditHexMode<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span> </div></fieldset><br><br>тыкаем &lt;F4&gt;, прушечка и ! PROFIT ! . утилита &quot;xxd&quot; - в стандартной поставке vim. POSIX и Unix-way - йо!<br><br>грамотно пейсать рюсскага йэзыкка - задачка чуток сложней. vim использует отдельный словарь на каждый язык и кодировку. необходимые словари он качает с <a href="http://ftp.vim.org/vim/runtime/spell/README.txt">офсайта</a> сам. пример: <fieldset><legend>bash</legend><div class="highlight bash">&nbsp;<span class="sy0">&gt;</span> <span class="kw2">ls</span> ~<span class="sy0">/</span>.vim<span class="sy0">/</span>spell<br />
en.utf-8.spl &nbsp;en.utf-8.sug &nbsp;ru.cp1251.spl &nbsp;ru.cp1251.sug &nbsp;ru.koi8-r.spl &nbsp;ru.koi8-r.sug &nbsp;ru.utf-8.spl &nbsp;ru.utf-8.sug &nbsp;</div></fieldset> на том же офсайте можно конкретно <a href="http://vimdoc.sourceforge.net/htmldoc/spell.html">пофтыкать</a> за это дело, если влом набрать  <fieldset><legend>vim</legend><div class="highlight vim">&nbsp;<span class="sy0">:</span>help spell &nbsp;</div></fieldset> рисуем в ~/.vimrc:<br /> <fieldset><legend>vim</legend><div class="highlight vim">&nbsp;<br />
<span class="kw1">function</span> ChangeSpellLang<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="sy0">&amp;</span>spelllang =<span class="sy0">~</span> <span class="st0">&quot;ru,en&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setlocal spell spelllang=<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setlocal nospell<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">echo</span> <span class="st0">&quot;spelllang: off&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setlocal spell spelllang=ru,<span class="kw1">en</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">echo</span> <span class="st0">&quot;spelllang: ru,en&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">endif</span><br />
endfunc<br />
<span class="co1">&quot; map spell on/off for English/Russian</span><br />
<span class="kw3">map</span> <span class="sy0">&lt;</span>F10<span class="sy0">&gt;</span> <span class="sy0">&lt;</span>Esc<span class="sy0">&gt;:</span><span class="kw1">call</span> ChangeSpellLang<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
<br />
set spell spelllang=<br />
set nospell &nbsp;</div></fieldset><br><br>в последних двух линиях использован &quot;set&quot; вместо &quot;setlocal&quot;, чтобы vim не стартовал проверку автоматом при добавлении буферов. тыкаем &lt;F10&gt;, прёмся. правим ашипки и упячки. наводим курсор на бяку, набираем &quot;z=&quot;, выбираем няшечку из списка.<br><br>вступаем в секту &quot;Граммар-Наци&quot; и спускаем word-о-пидоров в говно, где им самое место! ня! </p>]]></description>
</item>
<item>
<title>баян: vim и multibyte encoding</title>
<link>https://rulinux.net/message.php?newsid=42726&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=42726&amp;page=1</guid>
<pubDate>Sat, 05 Nov 2016 16:17:28 +0300</pubDate>
<description><![CDATA[<p>жевание соплей по работе с различными кодировками файлов в vim. кто прошарен - идёт лесом или пишет Ъ камменты. остальным - можно пофтыкать, можно не фтыкать, можно аффтару стчку на телефон или обложить аффтара хуями. можно и не обкладывать, аффтар не абидицца.<br><br>цимес в том, что vim-у кодировка редактируемого файла не важна, а встречается всяко-разное. при сбое автоопределения единицы позволяют указывать кодировку файла вручную. соответственно задача редактирования файла в исходной кодировке порой требует наличия мозгов в межплечевой жопе. что не может не радовать.<br><br>типовые утилиты для работы с кодировками:<br><br>$ recode<br /> $ iconv<br /> $ enca<br /> $ chardet или же chardetect.py<br><br>последний позволяет &quot;угадывать&quot; возможные варианты кодировок. must have. <br><br>открываем vim, печатаем:<br /> <fieldset><legend>vim</legend><div class="highlight vim"><br />
<span class="sy0">:</span>h enc &nbsp;<br />
&nbsp;</div></fieldset> &quot; можно и нужно читать. читать не просто так, а пройти по всем &quot;ссылкам&quot;. даёт понять как vim работает с кодировками и что для этого использует. если очень грубо &quot;просуммировать&quot; - получим следующие четыре &quot;внутренних&quot; переменных vim, позволяющих худо-бедно оперировать кодировками. важно учитывать опции сборки vim (+multi_byte) и понимать, что: &quot;The conversion is done with iconv() or as specified with 'charconvert'.&quot;(ц)(vim). <br><br><fieldset><legend>vim</legend><div class="highlight vim"><br />
<span class="sy0">:</span>set encoding &nbsp;<span class="st0">&quot; &nbsp;показывает в какой кодировке vim работает по умолчанию (именно сейчас)<br />
:set termencoding &nbsp;&quot;</span> &nbsp;показывает в какой кодировке vim ожидает работу своего терминала<br />
<span class="sy0">:</span>set fileencoding &nbsp;<span class="st0">&quot; &nbsp;показывает в какой кодировке vim открыл рабочий файл<br />
:set fileencodings &nbsp;&quot;</span> &nbsp;показывает список кодировок, в которых vim ожидает найти соответствующую открываемому файлу<span class="sy0">.</span> первая <span class="st0">&quot;подходящая&quot;</span> принимается в работу<span class="sy0">.</span> следствие<span class="sy0">:</span> если первой стоит <span class="st0">&quot;latin1&quot;</span>, то про <span class="st0">&quot;угадывание&quot;</span> кодировок забываем<span class="sy0">.</span> именно тут корни многих ошибок в правильном определении кодировки рабочего файла<span class="sy0">.</span> <br />
&nbsp;</div></fieldset> допустим, что vim работает в UTF-8 окружении. пример записей в ~/.vimrc: <fieldset><legend>vim</legend><div class="highlight vim"><br />
<span class="co1">&quot; рабочая кодировка</span><br />
set encoding=utf<span class="sy0">-</span><span class="nu0">8</span><br />
<span class="co1">&quot; кодировка терминала</span><br />
set termencoding=utf<span class="sy0">-</span><span class="nu0">8</span><br />
<span class="co1">&quot; список кодировок файлов для автоопределения</span><br />
set fileencodings=ucs<span class="sy0">-</span>bom,utf<span class="sy0">-</span><span class="nu0">8</span>,cp1251,koi8<span class="sy0">-</span>r,iso<span class="sy0">-</span><span class="nu0">8859</span><span class="sy0">-</span><span class="nu0">5</span>,cp866,ucs<span class="sy0">-</span><span class="nu0">2</span>,ucs<span class="sy0">-</span>2le,utf<span class="sy0">-</span><span class="nu0">16</span>,utf<span class="sy0">-</span>16le,latin1<br />
&nbsp;</div></fieldset> fileencoding определяет сам vim, исходя из результатов записей в ~/.vimrc : UTF - лехко, а из 8-ми битных кодировок корректно отобразит лишь cp1251 (windows-1251). при открытии koi8-r,iso-8859-5,cp866 и прочего &quot;не юникода&quot; весьма вероятен фейл. по сути всё просто: если кракозябры на экране - сравниваем/проверяем кодировку файла с кодировкой, которую &quot;угадал&quot; vim (точнее не угадал). просим vim открыть файл в другой кодировке. в редких случаях - меняем кодировку терминала. пример:<br><br>$ vim current_file<br><br>ыПРЧЕММУ<br /> 4 ЙАМС<br /> тбуртпдбцб<br><br><fieldset><legend>vim</legend><div class="highlight vim"><br />
<span class="sy0">:</span>set fileencoding<br />
&nbsp; &nbsp; &nbsp; &nbsp; fileencoding=cp1251<br />
<span class="sy0">:!</span>chardetect<span class="sy0">.</span>py <span class="sy0">%</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; current_file<span class="sy0">:</span> KOI8<span class="sy0">-</span>R with confidence <span class="nu0">0.476283037726</span><br />
<span class="sy0">:</span>e <span class="sy0">++</span>enc=koi8<span class="sy0">-</span>r<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">!!!</span> &nbsp;PROFIT &nbsp;<span class="sy0">!!!</span><br />
&nbsp;</div></fieldset> Шопвеллс<br /> 4 июля<br /> РАСПРОДАЖА<br><br>можно в ~/.vimrc всю рутину с перекодировкой оформить в виде меню. пример:<br><br><fieldset><legend>vim</legend><div class="highlight vim"><br />
<span class="co1">&quot;&lt;F7&gt; EOL format (dos &lt;CR&gt;&lt;NL&gt;,unix &lt;NL&gt;,mac &lt;CR&gt;) &nbsp;&quot; &nbsp;определяем/меняем формат строк файла</span><br />
set &nbsp;wildmenu<br />
set &nbsp;wcm=<span class="sy0">&lt;</span>Tab<span class="sy0">&gt;</span><br />
menu EOL<span class="sy0">.</span>current <span class="sy0">:</span>set fileformat<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu EOL<span class="sy0">.</span>unix <span class="sy0">:</span>set fileformat=unix<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu EOL<span class="sy0">.</span>dos &nbsp;<span class="sy0">:</span>set fileformat=dos<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu EOL<span class="sy0">.</span>mac &nbsp;<span class="sy0">:</span>set fileformat=mac<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
<span class="kw3">map</span> &nbsp;<span class="sy0">&lt;</span>F7<span class="sy0">&gt;</span> <span class="sy0">:</span>emenu EOL<span class="sy0">.&lt;</span>Tab<span class="sy0">&gt;</span><br />
<br />
<span class="co1">&quot;&lt;F6&gt; Change termencoding &nbsp;&quot; &nbsp;выставляем кодировку терминала</span><br />
set &nbsp;wildmenu<br />
set &nbsp;wcm=<span class="sy0">&lt;</span>Tab<span class="sy0">&gt;</span><br />
menu tEnc<span class="sy0">.</span>current &nbsp; &nbsp;<span class="sy0">:</span>set termencoding<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu tEnc<span class="sy0">.</span>cp1251 &nbsp; &nbsp; <span class="sy0">:</span>set termencoding=cp1251<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu tEnc<span class="sy0">.</span>koi8<span class="sy0">-</span>r &nbsp; &nbsp; <span class="sy0">:</span>set termencoding=koi8<span class="sy0">-</span>r<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu tEnc<span class="sy0">.</span>iso<span class="sy0">-</span>8859<span class="sy0">-</span>5 <span class="sy0">:</span>set termencoding=iso<span class="sy0">-</span>8859<span class="sy0">-</span>5<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu tEnc<span class="sy0">.</span>cp866 &nbsp; &nbsp; &nbsp;<span class="sy0">:</span>set termencoding=ibm866<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu tEnc<span class="sy0">.</span>utf<span class="sy0">-</span>8 &nbsp; &nbsp; &nbsp;<span class="sy0">:</span>set termencoding=utf<span class="sy0">-</span>8<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu tEnc<span class="sy0">.</span>ucs<span class="sy0">-</span>2le &nbsp; &nbsp;<span class="sy0">:</span>set termencoding=ucs<span class="sy0">-</span>2le<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
<span class="kw3">map</span> &nbsp;<span class="sy0">&lt;</span>F6<span class="sy0">&gt;</span> <span class="sy0">:</span>emenu tEnc<span class="sy0">.&lt;</span>Tab<span class="sy0">&gt;</span><br />
<br />
<span class="co1">&quot;&lt;F8&gt; Change encoding &nbsp; &quot; &nbsp; здесь мы задаём рабочую (текущую) кодировку для vim</span><br />
set &nbsp;wildmenu<br />
set &nbsp;wcm=<span class="sy0">&lt;</span>Tab<span class="sy0">&gt;</span><br />
menu Enc<span class="sy0">.</span>current &nbsp; &nbsp;<span class="sy0">:</span>set enc<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Enc<span class="sy0">.</span>cp1251 &nbsp; &nbsp; <span class="sy0">:</span>set encoding=cp1251<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Enc<span class="sy0">.</span>koi8<span class="sy0">-</span>r &nbsp; &nbsp; <span class="sy0">:</span>set encoding=koi8<span class="sy0">-</span>r<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Enc<span class="sy0">.</span>iso<span class="sy0">-</span>8859<span class="sy0">-</span>5 <span class="sy0">:</span>set encoding=iso<span class="sy0">-</span>8859<span class="sy0">-</span>5<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Enc<span class="sy0">.</span>cp866 &nbsp; &nbsp; &nbsp;<span class="sy0">:</span>set encoding=cp866<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Enc<span class="sy0">.</span>utf<span class="sy0">-</span>8 &nbsp; &nbsp; &nbsp;<span class="sy0">:</span>set encoding=utf<span class="sy0">-</span>8<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Enc<span class="sy0">.</span>ucs<span class="sy0">-</span>2le &nbsp; &nbsp;<span class="sy0">:</span>set encoding=ucs<span class="sy0">-</span>2le<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
<span class="kw3">map</span> &nbsp;<span class="sy0">&lt;</span>F8<span class="sy0">&gt;</span> <span class="sy0">:</span>emenu Enc<span class="sy0">.&lt;</span>Tab<span class="sy0">&gt;</span><br />
<br />
<span class="co1">&quot;&lt;F5&gt; Convert file encoding &nbsp; &nbsp;&quot; &nbsp;это меню - для изменения кодировки файлов (перед сохранением)</span><br />
set &nbsp;wildmenu<br />
set &nbsp;wcm=<span class="sy0">&lt;</span>Tab<span class="sy0">&gt;</span><br />
menu Fenc<span class="sy0">.</span>current &nbsp; <span class="sy0">:</span>set fenc<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Fenc<span class="sy0">.</span>cp1251 &nbsp; &nbsp;<span class="sy0">:</span>set fenc=cp1251<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Fenc<span class="sy0">.</span>koi8<span class="sy0">-</span>r &nbsp; &nbsp;<span class="sy0">:</span>set fenc=koi8<span class="sy0">-</span>r<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Fenc<span class="sy0">.</span>iso<span class="sy0">-</span>8859<span class="sy0">-</span>5 <span class="sy0">:</span>set fenc=iso<span class="sy0">-</span>8859<span class="sy0">-</span>5<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Fenc<span class="sy0">.</span>cp866 &nbsp; &nbsp; <span class="sy0">:</span>set fenc=ibm866<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Fenc<span class="sy0">.</span>utf<span class="sy0">-</span>8 &nbsp; &nbsp; <span class="sy0">:</span>set fenc=utf<span class="sy0">-</span>8<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu Fenc<span class="sy0">.</span>ucs<span class="sy0">-</span>2le &nbsp; <span class="sy0">:</span>set fenc=ucs<span class="sy0">-</span>2le<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
<span class="kw3">map</span> &nbsp;<span class="sy0">&lt;</span>F5<span class="sy0">&gt;</span> <span class="sy0">:</span>emenu Fenc<span class="sy0">.&lt;</span>Tab<span class="sy0">&gt;</span><br />
<br />
<span class="co1">&quot; &lt;F9&gt; force read file with different encoding &nbsp;&quot; &nbsp;а здесь мы просим vim открыть файл именно в той кодировке, которая нам нужна</span><br />
set &nbsp;wildmenu<br />
set &nbsp;wcm=<span class="sy0">&lt;</span>Tab<span class="sy0">&gt;</span><br />
menu ForceEnc<span class="sy0">.</span>cp1251&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">:</span>e <span class="sy0">++</span>enc=cp1251<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu ForceEnc<span class="sy0">.</span>koi8<span class="sy0">-</span>r&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">:</span>e <span class="sy0">++</span>enc=koi8<span class="sy0">-</span>r<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu ForceEnc<span class="sy0">.</span>iso<span class="sy0">-</span>8859<span class="sy0">-</span>5&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">:</span>e <span class="sy0">++</span>enc=iso<span class="sy0">-</span>8859<span class="sy0">-</span>5<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu ForceEnc<span class="sy0">.</span>cp866 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">:</span>e <span class="sy0">++</span>enc=cp866<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu ForceEnc<span class="sy0">.</span>utf<span class="sy0">-</span>8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">:</span>e <span class="sy0">++</span>enc=utf<span class="sy0">-</span>8<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
menu ForceEnc<span class="sy0">.</span>ucs<span class="sy0">-</span>2le &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">:</span>e <span class="sy0">++</span>enc=ucs<span class="sy0">-</span>2le<span class="sy0">&lt;</span>CR<span class="sy0">&gt;</span><br />
<span class="kw3">map</span> &nbsp;<span class="sy0">&lt;</span>F9<span class="sy0">&gt;</span> <span class="sy0">:</span>emenu ForceEnc<span class="sy0">.&lt;</span>Tab<span class="sy0">&gt;</span><br />
&nbsp;</div></fieldset> как-то так.. </p>]]></description>
</item>
<item>
<title>Yet Another Game</title>
<link>https://rulinux.net/message.php?newsid=42714&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=42714&amp;page=1</guid>
<pubDate>Sun, 30 Oct 2016 21:39:28 +0300</pubDate>
<description><![CDATA[<p>Q: - а почему для Linux нет хороших игр?<br /> A: игры есть! замечательные, отличные игры! просто они другие.. не такие, как обычно..<br><br>O дeвки c цeлкoй нaoтлeт!<br /> O вы, зaмужниe, o вдoвы,<br /> Пoзвoльтe мнe вaм нaпepeд<br /> Cкaзaть o Linux двa-тpи cлoвa..<br><br>дорогие мальчики и девочки, лоли и медведы, красноглазики и толстомордики! до того как одни из станут беременными, а вторые - загремят на нары, мне бы хотелось пробудить в Вашей душе искру интереса к сборке ядра Linux. эта игра поможет скоротать долгие одинокие зимние вечера,  прижавшись к тёплому боку системника. Главная Цель игрушки - заставить Вас прочувствовать Силу и прочесть от и до Кернигана и Ричи. finally.<br><br>прежде чем продолжить, стоит прикинуть: - зачем люди делают Это? кому нужны простые по сути движения? причин тому - великое множество. от простейших - патамуштамагу! до изысканно-изощрённых: добавить лулзов всем Пользователям, закоммитив очередной патч в дерево исходников. и Джедай, и Ситх, и чёткий пацан на районе могут делать Это. можешь и ты..<br><br>процедура сборки ядра, описанная в &quot;README&quot; файла из корня исходников, проста:<br /> 1) лососнуть сырцов;<br /> 2) распаковать;<br /> 3) создать конфиг;<br /> 4) конпельнуть make-ом;<br /> 5) вставить... ;<br /> 6) словить приход от того, что взлетело!<br /> опционально:<br /> 7) поймать багу;<br /> 8) кошерно засадить баг-репорт;<br /> 9) пересобрать ядро с поддержкой gdb и засадить ещё более кошерный баг-репорт!<br /> итого: девять <s>кругов ада</s> уровней, требующих для своего прохождения развитый скилл &quot;Внимательность/Awareness&quot; помимо рабочего <s>депилятора</s> компилятора.<br><br>начало игры - трэш и отстой. скачивание и распаковка исходников - скука и тоска. переход на третий уровень резко включает задорное бескомпромиссное порево. без вазелина - лютый хардкор. пройти с наскока, следуя офф. гаеду &quot;README&quot;, - несложно. но.. &quot;это не наш метод&quot;(ц). тонких ценителей прекрасного порадует &quot;make randconfig&quot;, лентяев - &quot;make olddefconfig&quot;, кедерастов - &quot;make xconfig&quot;, гномеков - &quot;make gconfig&quot;. хипстота заценит &quot;make allyesconfig&quot;. старое папко утрёт скупую слезу с небритого сковородника и пройдёт квест &quot;make config&quot;-а. &quot;make menuconfig&quot; возбудит небыдло. девочки и все те, у кого <s>не выросло</s> хвастать нечем, кастанут &quot;make defconfig&quot;. что же делать тем, кого мучит Жажда? тем, чьи глаза алеют в темноте? тем, кто <s>не продал Родину</s> любит свой верный 486DX 16Mb RAM? <br><br>&quot;make allnoconfig&quot; и &quot;make tinyconfig&quot;, заботливо скрытый от посторонних глаз. вот тут-то и начинается самое интересное..<br><br>Господа и Дамы, не подумайте плохо. старый Изя не будет говорить вам за жизнь, живите счастливо. Изя просто хочет записать свою мысль, пока Сары нет дома. слушать или нет - дело Ваше.<br><br>&quot;make *config&quot; - отстой.  &quot;make O=../builddir *config &quot; - рулеззЪ, няшечка и кавай :)<br><br>FB_VESA [=y]  #  курим Documentation/fb/vesafb.txt .   рихтуем &quot;/etc/default/grub&quot; - дефолт для grub2 (например выставляем vga=775, если на старте не взлетает 16-ти битная или 24-ёх/32-ух битная консоль).  <fieldset><legend>bash</legend><div class="highlight bash">&nbsp;grub2-mkconfig <span class="re5">-o</span> <span class="sy0">/</span>boot<span class="sy0">/</span>grub2<span class="sy0">/</span>grub.cfg </div></fieldset> - апдейт меню загрузчика  без переустановки.<br><br>Device Drivers -&gt; USB support -&gt; ohci/ehci/xhci   # &quot;Надо брать&quot;(ц) - сказала Маша Защекова, хоть и была порядочной девушкой.. к USB могут и цепляют всяко-разное: от мышки до сетевого адаптера. без USB грустно и тоскливо.. особенно ноутам и одноплатникам.<br><br>KEYBOARD_ATKBD=n   #  внезапно и неожиданно, если всё через USB<br><br>DEBUG_INFO=n   #  иначе жопа в трамвай не влезет, даже после <s>липосакции</s> xz. &quot;обычная&quot; сборка легко зохавает 7Gb-10Gb на винте. дебаг вставят в каждую дырку. от безысходности.<br><br>STRIP_ASM_SYMS=y   #  вроде безопасно..<br><br>TRIM_UNUSED_KSYMS=n   #  или прощаемся со всеми сторонними модулями ядра типа nvidia и т.п..<br><br>Cryptographic API   #  после расстановки акцентов стоит заново прошерстить Networking support. откроются скрытые уровни..<br><br>для открытия секретных комнат с ништяками (например CONFIG_X86_POWERNOW_K8=m) внимательно луркаем строку &quot;Depends on: &quot; . соответственно отказ от некоторых &quot;предложений&quot; возможен только после разруливания зависимостей в строке &quot;Selected by:&quot; (искренне Ваш Кэп..)<br><br>отдельная категория субквестов - заставить работать всю периферию, включая сенсоры, гироскопы и т.п. и т.д.. нередко игра скатывается в &quot;multiple guess options&quot;. например:   <fieldset><legend>bash</legend><div class="highlight bash">IT8712 SuperIO detected.<br />
&nbsp;it87: Found IT8712F chip at 0x290, revision 7<br />
&nbsp;it87: VID is disabled <span class="br0">&#40;</span>pins used <span class="kw1">for</span> GPIO<span class="br0">&#41;</span><br />
&nbsp;ACPI Warning: SystemIO range 0x0000000000000295-0x0000000000000296 conflicts with OpRegion 0x0000000000000295-0x0000000000000296 <span class="br0">&#40;</span>\IP<span class="br0">&#41;</span> <span class="br0">&#40;</span>20160422<span class="sy0">/</span>utaddress-255<span class="br0">&#41;</span><br />
&nbsp;ACPI Warning: SystemIO range 0x0000000000000295-0x0000000000000296 conflicts with OpRegion 0x0000000000000295-0x0000000000000296 <span class="br0">&#40;</span>\_SB.PCI0.ASOC.HWRE<span class="br0">&#41;</span> <span class="br0">&#40;</span>20160422<span class="sy0">/</span>utaddress-255<span class="br0">&#41;</span><br />
&nbsp;ACPI: If an ACPI driver is available <span class="kw1">for</span> this device, you should use it instead of the native driver<br />
&nbsp; </div></fieldset> здесь этот наш Linux нашёл чип IT8712F и отказался с ним работать при помощи &quot;родного&quot; драйвера &quot;it87&quot;. вместо этого он сообщил, что хочет общаться с чипом при помощт ACPI и никак иначе. улыбаемся и ищем нужную опцию конфига, что характерно. где-то рядом стоят ноуты со своими &quot;спецклавишами&quot;, подсветкой дисплея, беспроводными адаптерами, винмодемами и прочей хнёй, способной имтировать бурную деятельность только под управлением Православной Windows(tm). nuff said.<br><br>ещё один тип скрытых квестов - выбор нужных опций/модулей для нормальной работы сервисов. тот же &quot;haveged&quot; порой превращается во вредную скотину и может как упасть на &quot;ровном&quot; месте, так и отказаться стартовать. т.е. после ребута с новым ядром тест всех используемых сервисов строго обязателен. во избежание.<br><br>переход на уровень 4 гарантированно доставит лулзов тупым владельцам многоядерников. рекомендованное<br /> <fieldset><legend>bash</legend><div class="highlight bash">&nbsp;<span class="kw2">make</span> <span class="re2">O</span>=..<span class="sy0">/</span>builddir </div></fieldset> обязательно когда-нибудь доконпеляет до победного. лучше пользовать  <fieldset><legend>bash</legend><div class="highlight bash">&nbsp;<span class="kw2">make</span> <span class="re5">-j5</span> <span class="re2">O</span>=..<span class="sy0">/</span>builddir </div></fieldset> на четырёхядернике или &quot;-j3&quot; на двуядерном проце. <br><br>5-ый уровень банален. 6-ой с тихой грустью и лютой пролетарской ненавистью покажет чего именно ты достиг на 3-ем уровне.. возможно, всё придётся повторить с самого начала. уровни с 7-го по 9-ый сугубо индивидуальны. описывать смысла нет. <br><br>как-то так.. всем - Счастливой Компиляшечки!<br /> чмоке в этом чатике :)) </p>]]></description>
</item>
<item>
<title> </title>
<link>https://rulinux.net/message.php?newsid=41830&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=41830&amp;page=1</guid>
<pubDate>Sat, 20 Sep 2014 08:06:14 +0400</pubDate>
<description><![CDATA[<p> </p>]]></description>
</item>
<item>
<title> </title>
<link>https://rulinux.net/message.php?newsid=41829&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=41829&amp;page=1</guid>
<pubDate>Sat, 20 Sep 2014 01:18:00 +0400</pubDate>
<description><![CDATA[<p> </p>]]></description>
</item>
<item>
<title> </title>
<link>https://rulinux.net/message.php?newsid=41827&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=41827&amp;page=1</guid>
<pubDate>Fri, 19 Sep 2014 16:56:06 +0400</pubDate>
<description><![CDATA[<p> </p>]]></description>
</item>
<item>
<title>Сборка KDevelop с поддержкой XDebug под OpenSuSE</title>
<link>https://rulinux.net/message.php?newsid=36814&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=36814&amp;page=1</guid>
<pubDate>Thu, 19 Apr 2012 05:38:26 +0400</pubDate>
<description><![CDATA[<p>У меня появилось немного свободного времени и я решил продолжить разработку движка rulinux-engine. Поставил и настройл связку Apache+php+PostgreSQL. Осталось дело за IDE. Обычно для разработки я использовал Kate а для отладки запускал NetBeans. Полностью перейти на него мешала его тормознутость. Он умудрялся тормозить даже на моей достаточно мощной машине. Поэтому я взялся за поиски phpIDE написанной не на Java. После долгих поисков выбор в итоге пал на KDevelop. Ондако в сборке по умолчанию он не содержит плагинов для отладки php. Поэтому мне пришлось устанавливать их самому. Притом в интернете довольно много устаревших сведений по этому поводу. Мне пришлось собирать информацию по крупицам из списков рассылки и блогов разработчиков. Поэтому я решил собрать ее в одном месте. Итак приступим к установке. Сперва нам придется поставить инструменты для сборки, git, cmake, сам KDevelop c devel пакетами, KDevPlatform, и devel пакеты KDE. Описывать процесс установки я не буду, ибо надеюсь что вы сами справитесь с этим. Версия KDevelop в моем репозитории 4.3.60git-****</p><p>kdevplatform - 1.3.60git-****. Запомните эти цифры, впоследствии мы вернемся к ним. После установки среды нам нужно скачать плагины kdev-xdebug и executebrowser. делаем это командами </p><p></p><p><i>git clone git://anongit.kde.org/scratch/nsams/kdev-xdebug.git ~/kdev-xdebug</i> </p><p></p><p>и</p><p></p><p><i>git clone git://anongit.kde.org/scratch/nsams/kdev-executebrowser.git ~/kdev-executebrowser</i></p><p></p><p>затем собираем плагин kdev-executebrowser</p><p></p><p><i>cd ~/kdev-executebrowser</p><p>mkdir build &amp;&amp; cd build</p><p>cmake -DCMAKE_INSTALL_PREFIX=/usr ..</p><p>make -j2</p><p>sudo make install</p><p>kbuildsycoca4</i></p><p></p><p>и переходим к плагину kdev-xdebug</p><p>если попытаться собрать его прямо сразу, то мы получитм ошибку что путь EXECUTESCRIPT_INCLUSE_DIR не найден. Поэтому нам придется немного подправить файл CMakeLists.txt. Сразу оговорюсь что cmake я знаю плохо, и вполне возможно что есть другой метод исправить ошибку, но я делал так. Удаляем из него строку </p><p></p><p><div class="quote"><pre>find_path( EXECUTESCRIPT_INCLUDE_DIR iexecutescriptplugin.h</p><p>PATH_SUFFIXES kdevexecutescript )</pre></div></p><p></p><p>а строку </p><p></p><p><div class="quote"><pre>include_directories(</p><p>    ${KDEVPLATFORM_INCLUDE_DIR}</p><p>    ${KDE4_INCLUDES}</p><p>    ${CMAKE_CURRENT_BINARY_DIR}</p><p>    ${CMAKE_CURRENT_SOURCE_DIR}</p><p>    ${EXECUTEBROWSER_INCLUDE_DIR}</p><p>    ${EXECUTESCRIPT_INCLUDE_DIR}</p><p>)</pre></div></p><p></p><p>заменяем на</p><p></p><p><div class="quote"><pre>include_directories(</p><p>    ${KDEVPLATFORM_INCLUDE_DIR}</p><p>    ${KDE4_INCLUDES}</p><p>    ${CMAKE_CURRENT_BINARY_DIR}</p><p>    ${CMAKE_CURRENT_SOURCE_DIR}</p><p>    ${EXECUTEBROWSER_INCLUDE_DIR}</p><p>    /usr/include/kdevplatform/executescript</p><p>)</pre></div> </p><p></p><p>В моей OpenSuSE путь до iexecutescriptplugin.h именно такой, в вашей системе этот путь может отличаться.</p><p>После того как мы подправили путь можно перейти к сборке.</p><p></p><p><i>cd ~/kdev-xdebug</p><p>mkdir build &amp;&amp; cd build</p><p>cmake -DCMAKE_INSTALL_PREFIX=/usr ..</p><p>make -j2</p><p>sudo make install</p><p>kbuildsycoca4</i></p><p></p><p>Теперь пришло время вернуться к версиям программ. Если у вас стоит релизная версия, то вам не придется выполнять следующие действия.</p><p>перейти в каталог /usr/share/kde4/services/</p><p></p><p><i>cd /usr/share/kde4/services/</i></p><p></p><p>и подправить там 2 файла kdevexecutebrowser.desktop и kdevxdebug.desktop.</p><p>Заменить </p><p><div class="quote"><pre>X-KDevelop-Version=13</pre></div> </p><p>на </p><p><div class="quote"><pre>X-KDevelop-Version=14.</pre></div></p><p>После этого можно проверять работоспособность свежеустановленных плагинов и переходить к их настройке. Процесс настройки хорошо описан в блоге одного из разработчиков среды - Niko Sams: <a href="http://nikosams.blogspot.com/2010/02/kdevelop-xdebug-php-debugger.html">http://nikosams.blogspot.com/2010/02/kdevelop-xdebug-php-debugger.html</a> На этом все. Успешной разработки сайтов. :)</p>]]></description>
</item>
<item>
<title>Локализация $@ в DESTROY</title>
<link>https://rulinux.net/message.php?newsid=34858&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34858&amp;page=1</guid>
<pubDate>Wed, 01 Jun 2011 18:31:00 +0400</pubDate>
<description><![CDATA[<p>Недавно обнаружил, что локализовывать переменную $@ в DESTROY методе бывает очень полезно. Даже, похоже, сабж можно поместить в мануал как best practice (или я невнимательно читал мануалы, и там такое уже есть?). Без лишних слов:</p><p><fieldset><legend>perl</legend><code><br />
<br />
<span style="color: #666666; font-style: italic;">#!perl -w</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span><br />
&nbsp;<br />
<a href="http://perldoc.perl.org/functions/package.html"><span style="color: #000066;">package</span></a> Animal<span style="color: #339933;">;</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <a href="http://perldoc.perl.org/functions/shift.html"><span style="color: #000066;">shift</span></a><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/return.html"><span style="color: #000066;">return</span></a> <a href="http://perldoc.perl.org/functions/bless.html"><span style="color: #000066;">bless</span></a> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">'a'</span> <span style="color: #339933;">=&gt;</span> <a href="http://perldoc.perl.org/functions/shift.html"><span style="color: #000066;">shift</span></a><span style="color: #339933;">,</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <a href="http://perldoc.perl.org/functions/ref.html"><span style="color: #000066;">ref</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">sub</span> moo<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$self</span> <span style="color: #339933;">=</span> <a href="http://perldoc.perl.org/functions/shift.html"><span style="color: #000066;">shift</span></a><span style="color: #339933;">;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span style="color: #000066;">print</span></a> <span style="color: #ff0000;">&quot;$self-&gt;{'a'} says: moo<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">sub</span> DESTROY<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$self</span> <span style="color: #339933;">=</span> <a href="http://perldoc.perl.org/functions/shift.html"><span style="color: #000066;">shift</span></a><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/eval.html"><span style="color: #000066;">eval</span></a> <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">$self</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">moo</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
&nbsp;<br />
<span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><br />
&nbsp;<br />
<a href="http://perldoc.perl.org/functions/package.html"><span style="color: #000066;">package</span></a> main<span style="color: #339933;">;</span><br />
&nbsp;<br />
<a href="http://perldoc.perl.org/functions/eval.html"><span style="color: #000066;">eval</span></a> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$a</span> <span style="color: #339933;">=</span> Animal<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'Cow'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">bark</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp;<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$@</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span style="color: #000066;">print</span></a> <span style="color: #ff0000;">&quot;Cow cannot bark<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span style="color: #000066;">print</span></a> <span style="color: #ff0000;">&quot;Cow can bark<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
&nbsp;</code></fieldset></p><p>Программа выведет: Cow says: moo Cow can bark</p><p>Ну, наверное, вам уже стало понятно почему корова может гавкать?! Тут всё довольно просто и прозрачно. А вот диагностировать подобную проблему в сложной системе с кучей используемых модулей и фреймворков довольно сложно. На это можно убить даже не несколько часов, а несколько дней. Так что, рекомендую локализовывать $@ в DESTROY методе ваших классов.</p><p>По этой же причине значению, которое вернул eval, вообще нельзя доверять (ты же не контролируешь код всех модулей, которые используешь), и стоит использовать Try::Tiny или что-то подобное.</p><p>(с) этот текст - найденная на просторах интернета копипаста</p>]]></description>
</item>
<item>
<title>Запуск Umineko no Naku Koro ni Chiru под openSUSE 11.3</title>
<link>https://rulinux.net/message.php?newsid=34859&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34859&amp;page=1</guid>
<pubDate>Fri, 24 Sep 2010 05:37:00 +0400</pubDate>
<description><![CDATA[<p>Я недавно посмотрел аниме Umineko no Naku Koro Ni(когда плачут чайки). Первый сезон заканчивается на четвертой арке, тогда как визуальная новелла имеет уже семь арок. Поэтому я решил скачать и поставить себе эту визуальную новеллу. При этом я столкнулся с определенными проблемами, и решил поделиться тем как я их решил. Сразу оговорюсь, что несмотря на то, что эта статья написана про сборку под опенсусе, вы можете с минимальными изменениями применить ее к любому дистрибутиву. Стоит только указывать свой пакетный менеджер вместо zypper. Итак начнем квест:</p><p>Первым делом нам нужно установить onscripter-en. Это кроссплатформенный клон nscripter-а. Скачиваем последнюю версию onscripter-а из свн командой </p><p><i>svn co &nbsp;<a href="http://svn.haeleth.net/onscr/trunk/">http://svn.haeleth.net/onscr/trunk/</a> </i></p><p>Качать исходники в архиве не советую, ибо они не собираются с помощью gcc выше версии 4.3.х. Следующим шагом нужно удовлетворить зависимости командой </p><p><i>sudo zypper install smpeg sdl sdl_mixer sdl_ttf sdl_image</i></p><p>libogg, libbzip2 и freetype уже установленны в вашей системе.</p><p>Теперь приступим непосредственно к сборке</p><p><i>cd trunk</i></p><p><i>./configure</i></p><p>Если эта команда выдала вам </p><p><i><b>Writing Makefile... done Now run "make" to build ONScripter-En.</b></i></p><p>то переходим к сборке, в противном случае удовлетворяем запрашиваемые зависимости. Дальше пробуем собрать программу.</p><p><i>make</i></p><p>Команда выдаст вам ошибку конвертирования <b>const char</b> в <b>char</b> в файле ONScripterLabel_command.cpp в строке 1139. Открываем этот файл с помощью любимого текстового редактора. Для кого-то это vim, для кого-то emacs, кто-то любит редакторы с gui, а я открою этот файл с помощью nano. </p><p><i>nano -w ONScripterLabel_command.cpp</i></p><p>переходим на 1139 строку и перед char добавляем const, сохраняем файл и выходим. И заново пытаемся выполнить команду <i>make</i>. Теперь сборка должна пройти успешно. Далее ставим onscripter командой </p><p><i>sudo make install</i></p><p>и для проверки пытаемся запустить его командой </p><p><i>onscripter-en</i></p><p>Если запускается, то все прошло гладко и мы переходим к следующей части, установке непосредственно игры. У вас должен быть образ игры When They Cry 4.iso и патч-англификатор [WH] Umineko Chiru English.zip Монтируем образ в вашу систему с помощью CDEmu, Acetone2iso или команды монтирования mount указав в качестве параметров -t iso9660 и -o loop. Я выбрал последний вариант.</p><p><i>sudo mkdir /mnt/umineko && sudo mount -t iso9660 -o loop /path/to/When\ They\ Cry\ 4.iso /mnt/umineko</i></p><p>где /path/to это путь к образу диска. Теперь с помощью wine(либо windows, если таковая есть у вас в наличии) ставим игру. Во многих мануалах рекомендуют скопировать содержимое диска в созданный заранее каталог, но я не советую этого делать, т.к. на диске все файлы в верхнем регистре, а для игры нужны файлы в разных регистрах. Исталлятор сам подправит регистр файлов. А т.к. он только для Windows, то приходится прибегать к таким манипуляциям. итак приступим к установке.</p><p><i>cd /mnt/umineko && LC_ALL=ja_JA.UTF8 wine launcher.exe</i> </p><p>Для установки запускаем wine с японской локалью и следуем инструкциям инсталлятора. Укажите путь к игре. Я указал ~/Umineko6. Теперь переходим к патчу. Распаковываем содержимое архива в каталог с игрой и переходим в полученный каталог.</p><p><i>cd [WH]\ Umineko\ Chiru\ English</i></p><p>и ставим патч. либо с помощью команды</p><p><i>LC_ALL=ja_JA.UTF8 wine Umineko\ no\ Naku\ Koro\ ni\ EP6.exe</i></p><p>либо просто запустив onscripter в данном каталоге</p><p><i>onscripter-en</i></p><p>В зависимости от того, каким способом вы ставите патч, и выбирайте в предложенном диалоге операционную систему. Все после установки патча можно начинать игру. команда для запуска все та-же</p><p><i>onscripter-en</i></p><p>в каталоге с игрой. Для удобства можно написать небольшой скрипт запуска:</p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1">
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;#!/bin/bash
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;cd ~/Umineko6/[WH]\ Umineko\ Chiru\ English
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;onscripter-en
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;</ol></fieldset></p><p>Сохраним его как umineko.sh в каталоге Umineko6. Теперь можно запускать игру с помощью одной команды, или повесить псевдоним на выполнение этой команы, либо создать симлинк. </p><p>А теперь скриншоты:</p><p><img src="http://www.lor-ng.org/gallery/e3a376908b561e147682b31a0b81b162.png" ></p><p>Приятной иг^WПриятного прочтения. </p>]]></description>
</item>
<item>
<title>Настройка проброса портов средствами iptables для беспроводного роутера Cmotech CNU-680PRO</title>
<link>https://rulinux.net/message.php?newsid=34860&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34860&amp;page=1</guid>
<pubDate>Sat, 14 Aug 2010 18:47:00 +0400</pubDate>
<description><![CDATA[<p>Данный модем содержит ARM 940T RISC Processor с kernel 2.4.22 на борту. Подобно большинству роутеров, он может настраиваться через web интерфейс. Однако в данном роутере отчего-то не стартует встроенный веб-сервер, так-как набрав в браузере &nbsp;<a href="http://192.168.0.1/">http://192.168.0.1/</a> ни ответа ни привета. Так как он несет на своем борту линукс, то на него можно зайти удаленно по телнету используя</p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1">
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;Login: root
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;password: inewdc</ol></fieldset></p><p>Правда этот пароль с логином поменять можно, только перепрошив целиком ОС роутера. В web-интерфейсе же логин и пароль admin:admin можно поменять весьма просто.</p><p>Далее запускаем web-сервер командой</p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1">
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;# webs -r /htdocs -p 80</ol></fieldset></p><p>Линукс в этом роутере минимальный - нет табов, башевского хистори, простейших редакторов и прочее. И вообще интернет совсем не пестрит упоминанием даже о параметрах команд находящихся там программ. Но там есть iptables.</p><p>После этого можно настраивать собственно сам роутер. Соединение держит он относительно стабильно, но имеются симптомы, аналогичные описанным в статье SkyLinux[1] от Stanson'a, посвященной более ранней модификации этого роутера CNU550. Иногда может пропадать соединение, видимо в CNU680pro так-же отваливается pppd как и в CNU550. С своей статье Stanson пересобрал прошивку и вообще очень детально разобрал как и что. В принципе, на CNU680 можно поставить и собственной сборки дистрибутив(но это только в том случае, если детально знать Unix, иначе можно угробить роутер):</p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1">От: Stanson	
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;В сообщении от Thursday 05 of August 2010 вы написали: 
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;> Здравствуйте!
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;>
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;> Являюсь обладателем сего чудного девайса, глючит и лагает, хотя в
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;> целом инет есть.
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;>
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;> Я так понимаю, что обновить прошивку до SkyLinux просто скачать
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;> бинарник или же надо собирать самому?
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;> Ибо ну очень напрягает минимальное отсутствие табов в баше, хистори и
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;> прочее
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;Увы, для 680pro прошивки нет, ибо ко мне в
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;руки этот девайс не попадал.
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;Теоретически, можно сделать следующее -
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;взять прошивку от 550pro и корейскую
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;от 680pro. Из корейской прошивки извлечь
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;ядро и модули usb_storage и acm и
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;засунуть в прошивку для 550pro. Тут ничего
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;компилировать не надо, достаточно 
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;стандартных утилит для cramfs. Кроме того,
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;нужно найти исходники переключалки 
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;модема из режима USB-CD (он по умолчанию
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;включается как USB-сидюк, на котором 
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;драйвера для модема под винду) в режим
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;модема. Эта штука
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;даёт ioctl команду (для чего и нужен модуль
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;usb_storage)
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;Называется эта штука как-то типа cmotech-tools,
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;можно найти в гугле по словам "CNU-680" (без pro)
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;+ Linux.
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;Там всё просто, утилитка маленькая,
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;просто открывает /dev/sgХХ и плюёт туда ioctl
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;SCSI_IOCTL_SEND_COMMAND
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;со строкой  "\xffRDEVCHG1" в качестве параметра.
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;Вот её и придётся собрать под ARM. Потом
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;сунуть куда-нибудь в загрузочные скрипты,
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;чтобы она 
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;при запуске срабатывала.
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;В прошивке для 550pro всей этой дребедени
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;нету, поэтому работать-то на 680pro оно,
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;конечно будет,
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;но только как коробочка с линуксом без
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;какого-либо модема.</ol></fieldset></p><p>Это было лирическое отступление про возможность прошивать проприетарные девайсы опенсурсными програмным обеспечением.</p><p>Далее перейдем собственно к тонкой настройке. Почему - не знаю, но у меня так и не вышло настроить проброс ssh из внутренней машины во внешний доступ используя вкладку NAT в web-интерфейсе роутера.</p><p>Есть локальная сеть за эти роутером, в которой есть сервера, предоставляющие услуги внешнему миру(ssh,smtp и тому подобное). Нужно пробросить эти службы во внешний инет. Как это можно реализовать на примере CNU680pro средствами iptables, <b>не используя заводские средства настройки и официальные описания</b>, поставляющиеся вместе с роутером. Скайлинк дает услугу "постоянный ip-адрес" роутеру на интерфейсе ppp0:</p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1"># ifconfig
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;eth0      Link encap:Ethernet  HWaddr 00:17:0D:00:6F:39
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          RX packets:5852 errors:0 dropped:0 overruns:2 frame:1
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          TX packets:4363 errors:0 dropped:0 overruns:0 carrier:0
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          collisions:0 txqueuelen:100
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          Interrupt:19 DMA chan:1
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;lo        Link encap:Local Loopback
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          inet addr:127.0.0.1  Mask:255.0.0.0
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          UP LOOPBACK RUNNING  MTU:16436  Metric:1
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          collisions:0 txqueuelen:0
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;ppp0      Link encap:Point-to-Point Protocol
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          inet addr:23.127.34.24  P-t-P:22.19.16.17 Mask:255.255.255.255
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          RX packets:4124 errors:1 dropped:0 overruns:0 frame:0
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          TX packets:5314 errors:0 dropped:0 overruns:0 carrier:0
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;          collisions:0 txqueuelen:3</ol></fieldset></p><p>в данном случае ppp0 - 23.127.34.24 - реальный адрес, выданный скайлинком, от имени которого юзер ходит в интернете и оставляет свои следы во всяческих логах и тому подобное. Предположим нужно запросить по адресу 23.127.34.24 веб-сервер, находящийсяв локальной сети на какойто из машин. Для этого надо провести следующие махинации с iptables:</p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1">
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;# iptables -t nat -A PREROUTING --dst 23.127.34.24 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.71
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;# iptables -t nat -A POSTROUTING --dst 192.168.0.71 -p tcp --dport 80 -j SNAT --to-source 192.168.0.1
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;# iptables -I FORWARD 1 -i ppp0 -o eth0 -d 192.168.0.71 -p tcp -m tcp --dport 80 -j ACCEPT</ol></fieldset></p><p>и после этого ваш локальный сервер &nbsp;<a href="http://192.168.0.71/">http://192.168.0.71/</a> досупен через веб по адресу &nbsp;<a href="http://23.127.34.24/">http://23.127.34.24/</a></p><p>profit!</p><p>Предположим нужно пробросить доступ по ssh напрямую из внешнего мира через роутер, чтобы пользователи могли логиниться по ssh на внутренние машины локальной сети. Для этого необходимо ввести следующие команды:</p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1">
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;# iptables -t nat -A PREROUTING -d 23.127.34.24 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 192.168.0.71:22
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;# iptables -t nat -A POSTROUTING -d 192.168.0.71 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.0.1
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;# iptables -I FORWARD 1 -i ppp0 -o eth0 -d 192.168.0.71 -p tcp -m tcp --dport 22 -j ACCEPT</ol></fieldset></p><p>и после этого на внутреннюю машину можно зайти по ssh вот так вот:</p><p><fieldset style="border: 1px dashed black; padding:0px;"><ol style="background-color:#3d3d3d;" start="1">
<li style="background-color:#000000; padding-left: 5px; color: gray">&nbsp;ssh -p 8022 root@23.127.34.24</ol></fieldset></p><p>profit!</p><p>Более подробно настройки маршрутизации именно для этого случая разъяснены в этой статье [2]</p><p>Итого, чтобы пробросить веб сервер или ssh доступ нужно ввести всего три команды, не изменяя никак ни прошивку, ни чего остального. Чтобы сбросить настройки -надо сказать iptables -F</p><p>Правда есть одно но, файловая система в роутере read-only и чуть позднее надо будет разобраться как писать напрямую во флеш память эти команды. Так как родной web интерфейс у меня отчего-то не заработал.</p><p>Все остальные возможности этого модема не рассматривались вида DMZ хост и прочее.</p><p> За сим всё,</p><p>vilfred from LOR The Next Generation</p><p></p><p>[1] &nbsp;<a href="http://89.208.116.11/ftp/pub/CNU550pro/index.html)">http://89.208.116.11/ftp/pub/CNU550pro/index.html)</a></p><p>[2] &nbsp;<a href="http://www.it-simple.ru/?p=2250">http://www.it-simple.ru/?p=2250</a></p>]]></description>
</item>
<item>
<title>Извлечение пикселей из картинки при помощи ImageMagick и показ картинки в виждете gtk2-perl</title>
<link>https://rulinux.net/message.php?newsid=34867&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34867&amp;page=1</guid>
<pubDate>Thu, 04 Mar 2010 16:43:00 +0300</pubDate>
<description><![CDATA[<p>
<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html">samolet</a> | <a href=xs.html>Предыдущая</a> | Извлечение пикселей |
<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/c1.html">подсчет объектов</a>
| | <a href="haar.html">wavelet</a>

<p>
Извлечение пикселей из картинки при помощи ImageMagick и показ картинки в
виждете gtk2-perl.<p align=justify>
Gtk2-perl позволяет получить доступ к пикселям при помощи функции
get_pixels, которая возвращает 16-ти битную строку пикселей длины w*h*3 для
RGB изображения.
Единственное неудобство в том, что функции для работы с изображениями Gtk2-perl понимают
несколько форматов картинок, а ImageMagick позволяет работать с более чем
90 форматами изображений. Функция Gtk2::Gdk::Pixbuf->new_from_data может из
строки в 16-тиричном формате выстраивать картинку. Значит для этого надо
открыть картинку, прочитать пикселы и затем сформировать и
передать в perl соответствующую строку при помощи библиотеки ImageMagick. 
<p align=justify>
Для начала необходимо написать программу на c, после чего уже писать
соответствующий XS-модуль. Программа выглядит как-то так:
<pre>
<font color="#0000ff"><strong>#include <font color="#008000">&lt;stdlib.h&gt;</font></strong></font>
<font color="#0000ff"><strong>#include <font color="#008000">&lt;stdio.h&gt;</font></strong></font>
<font color="#0000ff"><strong>#include <font color="#008000">&lt;string.h&gt;</font></strong></font>
// подключить API ImageMagick

<font color="#0000ff"><strong>#include <font color="#008000">&lt;magick/api.h&gt;</font></strong></font>

<strong>int</strong> <font color="#2040a0">main</font><font color="#4444ff">(</font><strong>int</strong> <font color="#2040a0">argc</font>,<strong>char</strong> <font color="#4444ff">*</font><font color="#4444ff">*</font><font color="#2040a0">argv</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

//Воспользоваться внутренними типами IM
  <font color="#2040a0">ExceptionInfo</font>
      <font color="#2040a0">exception</font><font color="#4444ff">;</font>
  <font color="#2040a0">Image</font>
      <font color="#4444ff">*</font><font color="#2040a0">image</font><font color="#4444ff">;</font>
  <font color="#2040a0">ImageInfo</font>

      <font color="#4444ff">*</font><font color="#2040a0">image_info</font><font color="#4444ff">;</font>
  <font color="#2040a0">PixelPacket</font> 
      <font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">;</font>
  <font color="#2040a0">ViewInfo</font> 
      <font color="#4444ff">*</font><font color="#2040a0">vinfo</font><font color="#4444ff">;</font>

  <strong>int</strong> <font color="#2040a0">i</font>,<font color="#2040a0">j</font>,<font color="#2040a0">w</font>,<font color="#2040a0">h</font><font color="#4444ff">;</font>
// Инициализировать структуру <font color="#2040a0">image</font> <font color="#2040a0">info</font> и прочитать изображение
  <font color="#2040a0">InitializeMagick</font><font color="#4444ff">(</font><font color="#4444ff">*</font><font color="#2040a0">argv</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

// установить обработку событий типа ReadError и т.п.
  <font color="#2040a0">GetExceptionInfo</font><font color="#4444ff">(</font><font color="#4444ff">&amp;</font><font color="#2040a0">exception</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
// сделлать копию структуры image info
  <font color="#2040a0">image_info</font><font color="#4444ff">=</font><font color="#2040a0">CloneImageInfo</font><font color="#4444ff">(</font><font color="#4444ff">(</font><font color="#2040a0">ImageInfo</font> <font color="#4444ff">*</font><font color="#4444ff">)</font> <font color="#2040a0">NULL</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

// скопировать в структуру имя файла
  <font color="#4444ff">(</font><strong>void</strong><font color="#4444ff">)</font><font color="#2040a0">strcpy</font><font color="#4444ff">(</font><font color="#2040a0">image_info</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">filename</font>,<font color="#008000">"image.gif"</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
// прочитать картинку, попутно отработав эксепшены &exception 
  <font color="#2040a0">image</font><font color="#4444ff">=</font><font color="#2040a0">ReadImage</font><font color="#4444ff">(</font><font color="#2040a0">image_info</font>,<font color="#4444ff">&amp;</font><font color="#2040a0">exception</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <strong>if</strong> <font color="#4444ff">(</font><font color="#2040a0">image</font> <font color="#4444ff">=</font><font color="#4444ff">=</font> <font color="#4444ff">(</font><font color="#2040a0">Image</font> <font color="#4444ff">*</font><font color="#4444ff">)</font> <font color="#2040a0">NULL</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

// в случае ошибки
    <font color="#2040a0">fprintf</font><font color="#4444ff">(</font><font color="#2040a0">stderr</font>, <font color="#008000">"readFileMagick: %s: %s<font color="#77dd77">\n</font>"</font>,
    <font color="#2040a0">exception</font>.<font color="#2040a0">reason</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">description</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

// <font color="#2040a0">MagickError</font><font color="#4444ff">(</font><font color="#2040a0">exception</font>.<font color="#2040a0">severity</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">reason</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">description</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

    <strong>return</strong> <font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">;</font>
  <font color="#4444ff"><strong>}</strong></font>
// открыть открыть просмотр кеша пикселей
  <font color="#2040a0">vinfo</font> <font color="#4444ff">=</font> <font color="#2040a0">OpenCacheView</font><font color="#4444ff">(</font><font color="#2040a0">image</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#2040a0">pixels</font> <font color="#4444ff">=</font> <font color="#2040a0">GetCacheView</font><font color="#4444ff">(</font><font color="#2040a0">vinfo</font>, <font color="#ff0000">0</font>,<font color="#ff0000">0</font>,<font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">columns</font>,<font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">rows</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <strong>if</strong><font color="#4444ff">(</font><font color="#4444ff">!</font><font color="#2040a0">pixels</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>
    <font color="#2040a0">fprintf</font><font color="#4444ff">(</font><font color="#2040a0">stderr</font>, <font color="#008000">"readFileMagick: ошибка чтения кеша пикселей.<font color="#77dd77">\n</font>"</font><font color="#4444ff">)</font><font color="#4444ff">;</font> 
    <strong>return</strong><font color="#4444ff">(</font><font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#4444ff"><strong>}</strong></font>
  <font color="#2040a0">h</font> <font color="#4444ff">=</font> <font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">columns</font><font color="#4444ff">;</font> //ширина по горизонтали <font color="#4444ff">(</font>число столбцов картинки<font color="#4444ff">)</font>

  <font color="#2040a0">w</font> <font color="#4444ff">=</font> <font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">rows</font><font color="#4444ff">;</font>    //высота по вертикали   <font color="#4444ff">(</font>число строк картинки<font color="#4444ff">)</font>
// вывести значения пикселов по трем каналам
  <strong>for</strong> <font color="#4444ff">(</font><font color="#2040a0">i</font> <font color="#4444ff">=</font> <font color="#ff0000">0</font><font color="#4444ff">;</font> <font color="#2040a0">i</font> <font color="#4444ff">&lt;</font><font color="#4444ff">=</font> <font color="#2040a0">w</font><font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">;</font> <font color="#2040a0">i</font><font color="#4444ff">+</font><font color="#4444ff">+</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

    <strong>for</strong> <font color="#4444ff">(</font><font color="#2040a0">j</font> <font color="#4444ff">=</font> <font color="#ff0000">0</font><font color="#4444ff">;</font> <font color="#2040a0">j</font> <font color="#4444ff">&lt;</font><font color="#4444ff">=</font> <font color="#2040a0">h</font><font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">;</font> <font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#4444ff">+</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

      <font color="#2040a0">printf</font><font color="#4444ff">(</font><font color="#008000">"%d "</font>,<font color="#4444ff">(</font><strong>int</strong><font color="#4444ff">)</font><font color="#ff0000">255</font><font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">[</font><font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#2040a0">h</font><font color="#4444ff">*</font><font color="#2040a0">i</font><font color="#4444ff">]</font>.<font color="#2040a0">blue</font>/<font color="#ff0000">65535</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

      <font color="#2040a0">printf</font><font color="#4444ff">(</font><font color="#008000">"%d "</font>,<font color="#4444ff">(</font><strong>int</strong><font color="#4444ff">)</font><font color="#ff0000">255</font><font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">[</font><font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#2040a0">h</font><font color="#4444ff">*</font><font color="#2040a0">i</font><font color="#4444ff">]</font>.<font color="#2040a0">green</font>/<font color="#ff0000">65535</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

      <font color="#2040a0">printf</font><font color="#4444ff">(</font><font color="#008000">"%d<font color="#77dd77">\n</font>"</font>,<font color="#4444ff">(</font><strong>int</strong><font color="#4444ff">)</font><font color="#ff0000">255</font><font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">[</font><font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#2040a0">h</font><font color="#4444ff">*</font><font color="#2040a0">i</font><font color="#4444ff">]</font>.<font color="#2040a0">red</font>/<font color="#ff0000">65535</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

    <font color="#4444ff"><strong>}</strong></font>
  <font color="#4444ff"><strong>}</strong></font>
// закрыть и уничтожить все
  <font color="#2040a0">CloseCacheView</font><font color="#4444ff">(</font><font color="#2040a0">vinfo</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
  <font color="#2040a0">DestroyImageInfo</font><font color="#4444ff">(</font><font color="#2040a0">image_info</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#2040a0">DestroyImage</font><font color="#4444ff">(</font><font color="#2040a0">image</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
  <strong>return</strong><font color="#4444ff">(</font><font color="#ff0000">0</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
<font color="#4444ff"><strong>}</strong></font>

</pre>
компилировать программу можно таким <a
href="http://www.magickwand.org/www/api.html">образом</a>:

<pre>
    setenv LD_LIBRARY_PATH /usr/local/lib
    gcc `Magick-config --cflags --cppflags` pixels.c `Magick-config --ldflags --libs`
</pre>
Требования к функции, возвращающей пикселы, следующие: имя файла должно
передаваться в качестве параметра и в нагрузку параметр для чегонибудь
сделания с извлекаемыми пикселами. Функция должна возвращать строку пикселей в
16-тиричном виде и высоту + ширину картинки, необходимые для new_from_data().
Чтобы получить имя картинки в XS, можно воспользоваться следующим
подходом:
<pre>
SV*
pixs (SV * fn, int k)
  INIT:
       unsigned char * lfn;
       STRLEN l;  /* STRLEN is a certain type of int */
       /* ... */
  CODE:
       lfn = SvPV (fn, l); 
</pre>
после этого имя картинки будет содержаться в переменной lfn.
<p>
В целом, на XS вышеприведенная программа выглядит таким образом: 
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>
// string.h нужен для функции strcpy
<font color="0000ff"><strong>#include <font color="#008000">&lt;string.h&gt;</font></strong></font>
// на всякий случай, для матобработкию. если таковая будет, чтобы не писать при компиляции -lm
<font color="0000ff"><strong>#include <font color="#008000">&lt;math.h&gt;</font></strong></font>
// для ImageMagick
<font color="0000ff"><strong>#include <font color="#008000">&lt;magick/api.h&gt;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>
// определить название модуля, необходимого далее для инициализации ImageMagick
<font color="0000ff"><strong>#define PackageName <font color="#008000">&quot;Pixels&quot;</font></strong></font>
// название модуля и пакетов
<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Pixels</font>		<font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Pixels</font>		

// отключить прототипы, о(see perldoc perlxs)
<font color="#2040a0">PROTOTYPES</font><font color="4444FF">:</font> <font color="#2040a0">DISABLE</font>
// Инициализировать ImageMagick (see perldoc perlxs)
<font color="#2040a0">BOOT</font><font color="4444FF">:</font>
  <font color="#2040a0">InitializeMagick</font><font color="4444FF">(</font><font color="#2040a0">PackageName</font><font color="4444FF">)</font><font color="4444FF">;</font>

// скаляр (see perldoc perlguts), функции передаются на вход два параметра,
// имя файла и что-то еще. Тип передаваемых параметров определяется только десь
<font color="#2040a0">SV</font><font color="4444FF">*</font>
<font color="#2040a0">pixs</font><font color="4444FF">(</font><font color="#2040a0">SV</font> <font color="4444FF">*</font><font color="#2040a0">fn</font>, <strong>int</strong> <font color="#2040a0">k</font><font color="4444FF">)</font>

  <font color="#2040a0">INIT</font><font color="4444FF">:</font>
//Воспользоваться внутренними типами IM
        <font color="#2040a0">ExceptionInfo</font>
          <font color="#2040a0">exception</font><font color="4444FF">;</font>
        <font color="#2040a0">Image</font>
          <font color="4444FF">*</font><font color="#2040a0">image</font><font color="4444FF">;</font>

        <font color="#2040a0">ImageInfo</font>
          <font color="4444FF">*</font><font color="#2040a0">info</font>,
          <font color="4444FF">*</font><font color="#2040a0">image_info</font><font color="4444FF">;</font>
        <font color="#2040a0">PixelPacket</font>
          <font color="4444FF">*</font><font color="#2040a0">pixels</font><font color="4444FF">;</font>

        <font color="#2040a0">ViewInfo</font>
          <font color="4444FF">*</font><font color="#2040a0">vinfo</font><font color="4444FF">;</font>
// определить двумерные массивы для хранения пикселов
        <strong>int</strong> <font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sm</font>,<font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sym</font>,<font color="#2040a0">i</font>,<font color="#2040a0">j</font><font color="4444FF">;</font>

// переменные для имени  файла и возвращаемого значения пикселов
        <strong>unsigned</strong> <strong>char</strong> <font color="4444FF">*</font> <font color="#2040a0">lfn</font>, <font color="4444FF">*</font> <font color="#2040a0">number</font><font color="4444FF">;</font>
// определение STRLEN находится в файле config.h (perldoc perlguts)
        <font color="#2040a0">STRLEN</font> <font color="#2040a0">t</font><font color="4444FF">;</font> 

// определение типа данных для хеша и для массива *только для XSUBs* (perldoc perlguts)
        <font color="#2040a0">HV</font><font color="4444FF">*</font> <font color="#2040a0">hash</font> <font color="4444FF">=</font> <font color="#2040a0">newHV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font> 
        <font color="#2040a0">AV</font><font color="4444FF">*</font> <font color="#2040a0">array</font> <font color="4444FF">=</font> <font color="#2040a0">newAV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>

  <font color="#2040a0">CODE</font><font color="4444FF">:</font>
// присваивание имени, впрочем, это описано в perldoc perlguts
        <font color="#2040a0">lfn</font> <font color="4444FF">=</font> <font color="#2040a0">SvPV</font> <font color="4444FF">(</font><font color="#2040a0">fn</font>,<font color="#2040a0">t</font><font color="4444FF">)</font><font color="4444FF">;</font>

// установить обработку событий типа ReadError и т.п.
        <font color="#2040a0">GetExceptionInfo</font><font color="4444FF">(</font><font color="4444FF">&amp;</font><font color="#2040a0">exception</font><font color="4444FF">)</font><font color="4444FF">;</font>
// сделлать копию структуры image info
        <font color="#2040a0">image_info</font><font color="4444FF">=</font><font color="#2040a0">CloneImageInfo</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">ImageInfo</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">NULL</font><font color="4444FF">)</font><font color="4444FF">;</font>

// скопировать в структуру имя файла
        <font color="#2040a0">strcpy</font><font color="4444FF">(</font><font color="#2040a0">image_info</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">filename</font>, <font color="#2040a0">lfn</font><font color="4444FF">)</font><font color="4444FF">;</font>
// прочитать картинку, попутно отработав эксепшены &exception 
        <font color="#2040a0">image</font><font color="4444FF">=</font><font color="#2040a0">ReadImage</font><font color="4444FF">(</font><font color="#2040a0">image_info</font>,<font color="4444FF">&amp;</font><font color="#2040a0">exception</font><font color="4444FF">)</font><font color="4444FF">;</font>

// в случае ошибки
        <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">image</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">Image</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">NULL</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>     
          <font color="#2040a0">fprintf</font><font color="4444FF">(</font><font color="#2040a0">stderr</font>, <font color="#008000">&quot;readFileMagick: %s: %s<font color="#77dd77">\n</font>&quot;</font>,
          <font color="#2040a0">exception</font>.<font color="#2040a0">reason</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">description</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
// открыть просмотр кеша пикселей
        <font color="#2040a0">vinfo</font> <font color="4444FF">=</font> <font color="#2040a0">OpenCacheView</font><font color="4444FF">(</font><font color="#2040a0">image</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">pixels</font> <font color="4444FF">=</font> <font color="#2040a0">GetCacheView</font><font color="4444FF">(</font><font color="#2040a0">vinfo</font>, <font color="#FF0000">0</font>,<font color="#FF0000">0</font>,<font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">columns</font>,<font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">rows</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>int</strong> <font color="#2040a0">h</font><font color="4444FF">=</font><font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">columns</font><font color="4444FF">;</font> //ширина по горизонтали <font color="4444FF">(</font>число столбцов<font color="4444FF">)</font>
        <strong>int</strong> <font color="#2040a0">w</font><font color="4444FF">=</font><font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">rows</font><font color="4444FF">;</font>    //высота по вертикали   <font color="4444FF">(</font>число строк<font color="4444FF">)</font>

// занести данные о высоте и ширине картинки в массив, который будет
// сопоставлен с ключом хеша arr
        <font color="#2040a0">av_push</font><font color="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#2040a0">h</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">av_push</font><font color="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#2040a0">w</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>int</strong> <font color="#2040a0">small</font><font color="4444FF">=</font><font color="#2040a0">w</font><font color="4444FF">*</font><font color="#2040a0">h</font><font color="4444FF">*</font><font color="#FF0000">3</font><font color="4444FF">;</font>
// выделение памяти для строки возвращаемых пикселов, длина строки должна
// быть равна определенной выше small.
        <font color="#2040a0">number</font><font color="4444FF">=</font><font color="#2040a0">malloc</font><font color="4444FF">(</font><font color="#2040a0">small</font><font color="4444FF">*</font><strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">number</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

// отработка ошибки, если возникнут проблемы с pixels
        <strong>if</strong><font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">pixels</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
          <font color="#2040a0">fprintf</font><font color="4444FF">(</font><font color="#2040a0">stderr</font>, <font color="#008000">&quot;readFileMagick: unable to get pixel cache.<font color="#77dd77">\n</font>&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
// выделение памяти для двумерных массивово
        <font color="#2040a0">sm</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font><font color="4444FF">(</font><font color="#2040a0">w</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">sm</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="#2040a0">w</font><font color="4444FF">;</font> <font color="4444FF">+</font><font color="4444FF">+</font><font color="#2040a0">i</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

          <font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font> <font color="4444FF">(</font> <font color="#2040a0">h</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sm</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
        <font color="#2040a0">sym</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font><font color="4444FF">(</font><font color="#2040a0">w</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">sym</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="#2040a0">w</font><font color="4444FF">;</font> <font color="4444FF">+</font><font color="4444FF">+</font><font color="#2040a0">i</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

          <font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font> <font color="4444FF">(</font> <font color="#2040a0">h</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sym</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
// заполнение массива пикселей для дальнейшей обработки
        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">w</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>

          <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">j</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">h</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>

            <font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>int</strong><font color="4444FF">)</font><font color="#FF0000">255</font><font color="4444FF">*</font><font color="#2040a0">pixels</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">+</font><font color="#2040a0">h</font><font color="4444FF">*</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">blue</font>/<font color="#FF0000">65535</font><font color="4444FF">;</font>

            <font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

          <font color="4444FF"><strong>}</strong></font>
        <font color="4444FF"><strong>}</strong></font>
// математическая обработка пикселей, алгоритм подробно описан <a href=http://genphys.phys.msu.ru/~dmitriyk/site/mv/Smai/smai.html>здесь</a> и  <a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html#smai">здесь немного</a>
        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">w</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

          <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">j</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">h</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

            <strong>int</strong> <font color="#2040a0">summ</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font>
            <strong>int</strong> <font color="#2040a0">ii</font>,<font color="#2040a0">jj</font><font color="4444FF">;</font>
            <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">ii</font><font color="4444FF">=</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">ii</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">ii</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

              <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">jj</font><font color="4444FF">=</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">jj</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">jj</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font> <font color="#2040a0">summ</font><font color="4444FF">+</font><font color="4444FF">=</font><font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">+</font><font color="#2040a0">ii</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">+</font><font color="#2040a0">jj</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="4444FF"><strong>}</strong></font>
            <font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>int</strong><font color="4444FF">)</font><font color="#2040a0">summ</font>/<font color="4444FF">(</font><font color="4444FF">(</font><font color="#FF0000">2</font><font color="4444FF">*</font><font color="#2040a0">k</font><font color="4444FF">+</font><font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF">*</font><font color="4444FF">(</font><font color="#FF0000">2</font><font color="4444FF">*</font><font color="#2040a0">k</font><font color="4444FF">+</font><font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

          <font color="4444FF"><strong>}</strong></font>
        <font color="4444FF"><strong>}</strong></font>
        <strong>int</strong> <font color="#2040a0">count</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font>
// заполнение массива пикселей, которые будут возвращаться в perl-программу по ключу хеша uns
        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">w</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

          <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">j</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">h</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

            <font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">count</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">)</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="#2040a0">count</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
            <font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">count</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">)</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="#2040a0">count</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
            <font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">count</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">)</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="#2040a0">count</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
          <font color="4444FF"><strong>}</strong></font>
//освободить память из под массивов 
          <font color="#2040a0">free</font> <font color="4444FF">(</font><font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">;</font>

          <font color="#2040a0">free</font> <font color="4444FF">(</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="4444FF"><strong>}</strong></font>
        <font color="#2040a0">free</font><font color="4444FF">(</font><font color="#2040a0">sm</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">free</font><font color="4444FF">(</font><font color="#2040a0">sym</font><font color="4444FF">)</font><font color="4444FF">;</font>
// закрыть и уничтожить все
        <font color="#2040a0">CloseCacheView</font><font color="4444FF">(</font><font color="#2040a0">vinfo</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">DestroyImageInfo</font><font color="4444FF">(</font><font color="#2040a0">image_info</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">DestroyImage</font><font color="4444FF">(</font><font color="#2040a0">image</font><font color="4444FF">)</font><font color="4444FF">;</font>
// добавить в значение хеша массив
        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;arr&quot;</font>,<font color="#FF0000">3</font>,<font color="4444FF">(</font><font color="#2040a0">SV</font><font color="4444FF">*</font><font color="4444FF">)</font><font color="#2040a0">array</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

// добавить в значение хеша строку unsigned char, которая ассоциируется с ключем uns
// четвертым параметром идет выделение памяти для переменной number
        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;uns&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSVpv</font> <font color="4444FF">(</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">number</font>, <font color="#2040a0">small</font><font color="4444FF">*</font><strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">number</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">)</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">free</font><font color="4444FF">(</font><font color="#2040a0">number</font><font color="4444FF">)</font><font color="4444FF">;</font>
      <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV_noinc</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">SV</font><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">hash</font><font color="4444FF">)</font><font color="4444FF">;</font>

// прагма (?) RETVAL возвращает ссылку на хеш (perldoc perlguts).
  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
      <font color="#2040a0">RETVAL</font>

</pre>
Чтобы сделать модуль, который будет вызываться в perl-программе, нужно
сделать следующее:
<pre>
[vilfred@mobile100 xxx]$ h2xs -A -n Pixels
Defaulting to backwards compatibility with perl 5.8.3
If you intend this module to be compatible with earlier perl versions,
please
specify a minimum perl version with the -b option.

Writing Pixels/ppport.h
Writing Pixels/lib/Pixels.pm
Writing Pixels/Pixels.xs
Writing Pixels/Makefile.PL
Writing Pixels/README
Writing Pixels/t/Pixels.t
Writing Pixels/Changes
Writing Pixels/MANIFEST
[vilfred@mobile100 xxx]$
</pre>
Эта команда создаст каталог со всеми необходимыми для компиляции и
дальнейшего использования файлами. Т.к. компилирование c-шного файла
требовало подключения библиотек ImageMagick, то нужно подправить
Makefile.PL:
<pre>
    LIBS              => ['-L/usr/lib -lMagick -L/usr/X11R6/lib -lfreetype -lz \
-L/usr/lib -ltiff -lfreetype -ljpeg -lXext -lSM -lICE -lX11 -lXt \
-lbz2 -lz -lpthread -lm -lpthread'], # e.g., '-lm'

</pre>
<p align=justify>
После этого вносятся соответствующие правки в текст Pixels.xs и далее идут
команды perl Makefile.PL, make и make test. Т.к. модуль Pixels.pm не установлен (не было
команды make install), то необходимо вновь написанный модуль каким-то
образом вызвать в perl-скрипте. Nick Ing-Simmons написал библиотеку blib
(perldoc blib), которая находит необходимый модуль.<p>
Соответствующий perl-код <a href=xgui.pl>такой</a>,(с подсвеченным
синтаксисом 
<a href="xgui.html">html</a>).

Вобщем, что то в этом роде...
<p>
<center>
screenshot<p>
<img src="http://genphys.phys.msu.ru/%7Edmitriyk/site/mv/proga.jpg">
</center>
<p>
<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html">samolet</a> | <a href=xs.html>Предыдущая</a> | Извлечение пикселей | to be continued...

<p>
]]></description>
</item>
<item>
<title>Вызов функции, написанной на языке С из программы на языке perl</title>
<link>https://rulinux.net/message.php?newsid=34857&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34857&amp;page=1</guid>
<pubDate>Thu, 04 Mar 2010 16:39:00 +0300</pubDate>
<description><![CDATA[<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html">samolet</a> |  xs | <a
href="pixels.html">pixels</a> | <a
href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/c1.html">подсчет
объектов</a>
<b>Вызов функции, написанной на языке С из программы на языке perl</b>
<p>
Допустим, нужно что-то быстро вычислить, а скорости perl не хватает. Для этого в 
perl существует специальный интерфейс, позволяющий проводить вычисления на языке 
C. Соответствующие описания находятся в мауналах например perldoc perlxstut или 
perldoc perlguts. Ниже по тексту несколько примеров как передавать в модули
числа и последовательности байтов и получать на выходе различные структуры
данных.
<p>
<b>Скаляр</b>
<p>
Задача: Нужно вычислить сумму чисел до числа передаваемомго функции, т.е. если
функции передать число 5, то она должна вернуть число 1+2+3+4+5=15.

<p>
Командой h2xs -A -n Perebor создается пакет Perebor с одноименной директорией, 
в которой находится файл Perebor.xs, в котороый пишется нижеследующий код
(этот пример взят с <a
href="http://www.cip.physik.uni-muenchen.de/~tf/perl/lektion8.html">немецкого</a> сайта):
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>                <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>

<strong>int</strong>
<font color="#2040a0">sum_numbers</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">x</font><font color="4444FF">)</font>

        <font color="#2040a0">CODE</font><font color="4444FF">:</font>
         <font color="4444FF"><strong>{</strong></font>
           <strong>int</strong> <font color="#2040a0">i</font>, <font color="#2040a0">sum</font><font color="4444FF">;</font>
           <strong>for</strong><font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#FF0000">1</font>,<font color="#2040a0">sum</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font><font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">x</font><font color="4444FF">;</font><font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>

             <font color="#2040a0">sum</font><font color="4444FF">+</font><font color="4444FF">=</font><font color="#2040a0">i</font><font color="4444FF">;</font>
           <font color="4444FF"><strong>}</strong></font>
        <font color="#2040a0">RETVAL</font><font color="4444FF">=</font><font color="#2040a0">sum</font><font color="4444FF">;</font>
         <font color="4444FF"><strong>}</strong></font>

        <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
        <font color="#2040a0">RETVAL</font>
</pre>
Далее нужно сказать perl Makefile.PL, потом make. Вызов модуля  
при помощи программы
<pre>
<font color="#444444">#/usr/bin/perl -w

</font><strong>BEGIN</strong>
  <font color="4444FF"><strong>{</strong></font>

    <font color="a52a2a"><strong>push</strong></font> <font color="#2040a0">@INC</font>, <font color="#008000">&quot;./blib/arch&quot;</font>, <font color="#008000">&quot;./blib/lib&quot;</font>;
  <font color="4444FF"><strong>}</strong></font>

<strong>use</strong> Perebor;

<font color="#2040a0">$x</font>=Perebor::sum_numbers<font color="4444FF"><strong>(</strong></font>5<font color="4444FF"><strong>)</strong></font>;


<font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$x</font><font color="#77dd77">\n</font>&quot;</font>;

</pre>
<p>
<b>Массив</b>
<p>
Для того, чтобы функция возыращала массив или ссылку на массив, надо сделать
так:
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>                <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>

<font color="#2040a0">SV</font><font color="4444FF">*</font>
<font color="#2040a0">getnum</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">l</font><font color="4444FF">)</font>
  <font color="#2040a0">INIT</font><font color="4444FF">:</font>
        <font color="#2040a0">AV</font><font color="4444FF">*</font> <font color="#2040a0">array</font><font color="4444FF">;</font>

  <font color="#2040a0">CODE</font><font color="4444FF">:</font>
        <strong>int</strong> <font color="#2040a0">n</font> <font color="4444FF">=</font> <font color="#FF0000">1</font><font color="4444FF">;</font>
        <font color="#2040a0">array</font> <font color="4444FF">=</font> <font color="#2040a0">newAV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>while</strong> <font color="4444FF">(</font><font color="#2040a0">n</font> <font color="4444FF">&lt;</font> <font color="#2040a0">l</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
          <font color="#2040a0">av_push</font><font color="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#2040a0">n</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

          <font color="#2040a0">n</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
        <font color="4444FF"><strong>}</strong></font>
      <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV_noinc</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">SV</font><font color="4444FF">*</font><font color="4444FF">)</font><font color="#2040a0">array</font><font color="4444FF">)</font><font color="4444FF">;</font>

  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
      <font color="#2040a0">RETVAL</font>
</pre>
Функция massiv вызывается как-то так: 
<pre>

<font color="#444444">#/usr/bin/perl -w

</font><strong>BEGIN</strong>
  <font color="4444FF"><strong>{</strong></font>

    <font color="a52a2a"><strong>push</strong></font> <font color="#2040a0">@INC</font>, <font color="#008000">&quot;./blib/arch&quot;</font>, <font color="#008000">&quot;./blib/lib&quot;</font>;
  <font color="4444FF"><strong>}</strong></font>
     
<strong>use</strong> Perebor;
     
<font color="#2040a0">$x</font>=Perebor::massiv<font color="4444FF"><strong>(</strong></font>11<font color="4444FF"><strong>)</strong></font>;
     

<font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; &quot;</font> =&gt; <font color="#2040a0">@{$x}</font>,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;
</pre>
В случае двух функций:

<pre>
<font color="#0000ff"><strong>#include <font color="#008000">"EXTERN.h"</font></strong></font>

<font color="#0000ff"><strong>#include <font color="#008000">"perl.h"</font></strong></font>
<font color="#0000ff"><strong>#include <font color="#008000">"XSUB.h"</font></strong></font>

<font color="#0000ff"><strong>#include <font color="#008000">"ppport.h"</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="#4444ff">=</font> <font color="#2040a0">Perebor</font>                <font color="#2040a0">PACKAGE</font> <font color="#4444ff">=</font> <font color="#2040a0">Perebor</font>


<font color="#2040a0">SV</font><font color="#4444ff">*</font>
<font color="#2040a0">massiv</font><font color="#4444ff">(</font><strong>int</strong> <font color="#2040a0">l</font><font color="#4444ff">)</font>
  <font color="#2040a0">INIT</font><font color="#4444ff">:</font>
        <font color="#2040a0">AV</font><font color="#4444ff">*</font> <font color="#2040a0">array</font><font color="#4444ff">;</font>

  <font color="#2040a0">CODE</font><font color="#4444ff">:</font>
        <strong>int</strong> <font color="#2040a0">n</font> <font color="#4444ff">=</font> <font color="#ff0000">1</font><font color="#4444ff">;</font>
        <font color="#2040a0">array</font> <font color="#4444ff">=</font> <font color="#2040a0">newAV</font><font color="#4444ff">(</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

        <strong>while</strong> <font color="#4444ff">(</font><font color="#2040a0">n</font> <font color="#4444ff">&lt;</font> <font color="#2040a0">l</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>
          <font color="#2040a0">av_push</font><font color="#4444ff">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="#4444ff">(</font><font color="#2040a0">n</font><font color="#4444ff">)</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

          <font color="#2040a0">n</font><font color="#4444ff">+</font><font color="#4444ff">+</font><font color="#4444ff">;</font>
        <font color="#4444ff"><strong>}</strong></font>
      <font color="#2040a0">RETVAL</font> <font color="#4444ff">=</font> <font color="#2040a0">newRV_noinc</font><font color="#4444ff">(</font><font color="#4444ff">(</font><font color="#2040a0">SV</font><font color="#4444ff">*</font><font color="#4444ff">)</font><font color="#2040a0">array</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#2040a0">OUTPUT</font><font color="#4444ff">:</font>
      <font color="#2040a0">RETVAL</font>

<font color="#2040a0">SV</font><font color="#4444ff">*</font>
<font color="#2040a0">massiv_square</font><font color="#4444ff">(</font><strong>int</strong> <font color="#2040a0">l</font><font color="#4444ff">)</font>

  <font color="#2040a0">INIT</font><font color="#4444ff">:</font>
        <font color="#2040a0">AV</font><font color="#4444ff">*</font> <font color="#2040a0">array</font><font color="#4444ff">;</font>
  <font color="#2040a0">CODE</font><font color="#4444ff">:</font>
        <strong>int</strong> <font color="#2040a0">n</font> <font color="#4444ff">=</font> <font color="#ff0000">1</font><font color="#4444ff">;</font>

        <font color="#2040a0">array</font> <font color="#4444ff">=</font> <font color="#2040a0">newAV</font><font color="#4444ff">(</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
        <strong>while</strong> <font color="#4444ff">(</font><font color="#2040a0">n</font> <font color="#4444ff">&lt;</font> <font color="#2040a0">l</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

          <font color="#2040a0">av_push</font><font color="#4444ff">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="#4444ff">(</font><font color="#2040a0">n</font><font color="#4444ff">*</font><font color="#2040a0">n</font><font color="#4444ff">)</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
          <font color="#2040a0">n</font><font color="#4444ff">+</font><font color="#4444ff">+</font><font color="#4444ff">;</font>

        <font color="#4444ff"><strong>}</strong></font>
      <font color="#2040a0">RETVAL</font> <font color="#4444ff">=</font> <font color="#2040a0">newRV_noinc</font><font color="#4444ff">(</font><font color="#4444ff">(</font><font color="#2040a0">SV</font><font color="#4444ff">*</font><font color="#4444ff">)</font><font color="#2040a0">array</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#2040a0">OUTPUT</font><font color="#4444ff">:</font>
      <font color="#2040a0">RETVAL</font>
</pre>
Perl код такой:
<pre>
<font color="#444444">#/usr/bin/perl -w
</font><strong>BEGIN</strong>
  <font color="4444FF"><strong>{</strong></font>

    <font color="a52a2a"><strong>push</strong></font> <font color="#2040a0">@INC</font>, <font color="#008000">&quot;./blib/arch&quot;</font>, <font color="#008000">&quot;./blib/lib&quot;</font>;
  <font color="4444FF"><strong>}</strong></font>

<strong>use</strong> Perebor;

<font color="#2040a0">$x</font>=Perebor::massiv<font color="4444FF"><strong>(</strong></font>11<font color="4444FF"><strong>)</strong></font>;


<font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; &quot;</font> =&gt; <font color="#2040a0">@{$x}</font>,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;

<font color="#2040a0">$x</font>=Perebor::massiv_square<font color="4444FF"><strong>(</strong></font>11<font color="4444FF"><strong>)</strong></font>;


<font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; &quot;</font> =&gt; <font color="#2040a0">@{$x}</font>,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;

</pre>

<p>

Если есть необходимость передать в программу строку чисел, упакованных
функцией pack C*, 123 (т.е. числа в 16-тиричном виде), то возникает
проблема следующего толка: при обработке
символа '\x00' (ноль в 16-тиричном виде), сишнная функция завершит работу,
т.к. ноль это конец записи. Для того, чтобы избежать этой проблемы,
нужно помимо строки unsigned char передать её длинну, вычисленную функцией
perl length:

<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>            <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>

<font color="#2040a0">SV</font><font color="4444FF">*</font>
<font color="#2040a0">getnum</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">number</font>, <strong>int</strong> <font color="#2040a0">l</font><font color="4444FF">)</font>

  <font color="#2040a0">INIT</font><font color="4444FF">:</font>
        <font color="#2040a0">AV</font><font color="4444FF">*</font> <font color="#2040a0">array</font><font color="4444FF">;</font>
        <strong>int</strong> <font color="#2040a0">sum</font><font color="4444FF">;</font>

        <strong>double</strong> <font color="#2040a0">y</font><font color="4444FF">;</font>
  <font color="#2040a0">CODE</font><font color="4444FF">:</font>
        <strong>int</strong> <font color="#2040a0">n</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>

        <font color="#2040a0">array</font> <font color="4444FF">=</font> <font color="#2040a0">newAV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <strong>while</strong> <font color="4444FF">(</font><font color="#2040a0">n</font> <font color="4444FF">&lt;</font> <font color="#2040a0">l</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>

          <font color="#2040a0">sum</font><font color="4444FF">=</font><font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">n</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">]</font><font color="4444FF">;</font>
          <font color="#2040a0">av_push</font><font color="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#2040a0">sum</font><font color="4444FF">*</font><font color="#2040a0">sum</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
      <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV_noinc</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">SV</font><font color="4444FF">*</font><font color="4444FF">)</font><font color="#2040a0">array</font><font color="4444FF">)</font><font color="4444FF">;</font>

  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
      <font color="#2040a0">RETVAL</font>
</pre>
В случае, если не написать unsigned char а просто char, то значения
передаваемой переменной будут изменяться в диапазоне от -128 до 128, что
испортит картину, написанную маслом. 

<p>
Perl код, вызывающий функцию getnum, выглядит так:
<pre>
<font color="#444444">#/usr/bin/perl -w
</font><strong>BEGIN</strong>
<font color="4444FF"><strong>{</strong></font>

<font color="a52a2a"><strong>push</strong></font> <font color="#2040a0">@INC</font>, <font color="#008000">&quot;./blib/arch&quot;</font>, <font color="#008000">&quot;./blib/lib&quot;</font>;

<font color="4444FF"><strong>}</strong></font>

<strong>use</strong> Perebor;

<font color="#2040a0">$txt</font>=<font color="#008000">&quot;<font color="#77dd77">\x</font>00<font color="#77dd77">\x</font>01<font color="#77dd77">\x</font>02<font color="#77dd77">\x</font>03<font color="#77dd77">\x</font>04<font color="#77dd77">\x</font>dd<font color="#77dd77">\x</font>cd<font color="#77dd77">\x</font>fe&quot;</font>;

<font color="#2040a0">$x</font>=Perebor::getnum<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$txt</font>,<font color="a52a2a"><strong>length</strong></font> <font color="#2040a0">$txt</font><font color="4444FF"><strong>)</strong></font>;
<font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; &quot;</font> =&gt; <font color="#2040a0">@{$x}</font>,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;


</pre>
<b>Хэши</b>
<p>
Предположим, теперь нужно построить и вернуть в си-программу хеш
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>            <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>

<font color="#2040a0">SV</font> <font color="4444FF">*</font>

<font color="#2040a0">getnum</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">k</font><font color="4444FF">)</font>

  <font color="#2040a0">INIT</font><font color="4444FF">:</font>
  <font color="#2040a0">CODE</font><font color="4444FF">:</font>

        <font color="#2040a0">HV</font><font color="4444FF">*</font> <font color="#2040a0">hash</font> <font color="4444FF">=</font> <font color="#2040a0">newHV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;aaa&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSViv</font><font color="4444FF">(</font><font color="#2040a0">k</font><font color="4444FF">)</font>, <font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;bbb&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSVpv</font><font color="4444FF">(</font><font color="#008000">&quot;xxx&quot;</font>,<font color="#FF0000">0</font><font color="4444FF">)</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

      <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV</font><font color="4444FF">(</font> <font color="4444FF">(</font><font color="#2040a0">SV</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">hash</font> <font color="4444FF">)</font><font color="4444FF">;</font> <font color="#444444">/* bepmsr| qq{kjs m u}x */</font>

  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
  <font color="#2040a0">RETVAL</font>
</pre>
возвращает ссылку на хеш, функцию Hval::getnum можно вызвать так:
<pre>

<font color="#444444">#!/usr/bin/perl -w

</font><strong>use</strong> strict;
<strong>use</strong> warnings;

<strong>use</strong> ExtUtils::testlib;
<strong>use</strong> Hval;
<strong>use</strong> Data::Dumper;

<strong>my</strong> <font color="#2040a0">$hash_ref</font> = Hval::getnum<font color="4444FF"><strong>(</strong></font>10<font color="4444FF"><strong>)</strong></font>;

<strong>foreach</strong> <strong>my</strong> <font color="#2040a0">$key</font> <font color="4444FF"><strong>(</strong></font><font color="a52a2a"><strong>keys</strong></font> <font color="#2040a0">%$hash_ref</font><font color="4444FF"><strong>)</strong></font> <fontcolor="4444FF"><strong>{</strong></font>
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; <font color="#2040a0">$hash_ref</font>-&gt;{<font color="#2040a0">$key</font>}<font color="#77dd77">\n</font>&quot;</font>;

<font color="4444FF"><strong>}</strong></font>

<font color="#2040a0">$hash_ref</font> = Hval::getnum<font color="4444FF"><strong>(</strong></font>2<font color="4444FF"><strong>)</strong></font>;
<strong>foreach</strong> <strong>my</strong> <font color="#2040a0">$key</font> <font color="4444FF"><strong>(</strong></font><font color="a52a2a"><strong>keys</strong></font> <font color="#2040a0">%$hash_ref</font><font color="4444FF"><strong>)</strong></font> <font color="4444FF"><strong>{</strong></font>

  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; <font color="#2040a0">$hash_ref</font>-&gt;{<font color="#2040a0">$key</font>}<font color="#77dd77">\n</font>&quot;</font>;
<font color="4444FF"><strong>}</strong></font>

<font color="#2040a0">$hash_ref</font> = Hval::getnum<font color="4444FF"><strong>(</strong></font>7<font color="4444FF"><strong>)</strong></font>;
<strong>foreach</strong> <strong>my</strong> <font color="#2040a0">$key</font> <font color="4444FF"><strong>(</strong></font><font color="a52a2a"><strong>keys</strong></font> <font color="#2040a0">%$hash_ref</font><font color="4444FF"><strong>)</strong></font> <font color="4444FF"><strong>{</strong></font>

  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; <font color="#2040a0">$hash_ref</font>-&gt;{<font color="#2040a0">$key</font>}<font color="#77dd77">\n</font>&quot;</font>;
<font color="4444FF"><strong>}</strong></font>

</pre>
вывод:
<pre>
File rr.pl not changed so no update needed.
[vilfred@mobile100 Hval]$ perl rr.pl
bbb => xxx
aaa => 10
bbb => xxx
aaa => 2
bbb => xxx
aaa => 7
[vilfred@mobile100 Hval]$ 
</pre>
Передача и возврат данных в виде "\x00\ff..." etc... через хэш:
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>            <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>

<font color="#2040a0">SV</font> <font color="4444FF">*</font>
<font color="#2040a0">getnum</font><font color="4444FF">(</font><strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">data</font>,<strong>int</strong> <font color="#2040a0">l</font>,<strong>int</strong> <font color="#2040a0">k</font><font color="4444FF">)</font>

   <font color="#2040a0">INIT</font><font color="4444FF">:</font>
   <font color="#2040a0">CODE</font><font color="4444FF">:</font>
      
     <font color="#2040a0">HV</font><font color="4444FF">*</font> <font color="#2040a0">hash</font> <font color="4444FF">=</font> <font color="#2040a0">newHV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>

     <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;unsigned_char&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSVpv</font> <font color="4444FF">(</font><font color="4444FF">(</font><strong>char</strong><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">data</font>, <font color="#2040a0">l</font><font color="4444FF">*</font><strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">)</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

                
   <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV</font><font color="4444FF">(</font> <font color="4444FF">(</font><font color="#2040a0">SV</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">hash</font> <font color="4444FF">)</font><font color="4444FF">;</font> 
                   
   <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>

   <font color="#2040a0">RETVAL</font>
</pre>
Перл-код соответственно такой:
<pre>
<font color="#444444">#!/usr/bin/perl -w

</font><strong>use</strong> strict;
<strong>use</strong> warnings;
<strong>use</strong> ExtUtils::testlib;

<strong>use</strong> Hval;

<strong>use</strong> Data::Dumper;

<strong>my</strong> <font color="#2040a0">$txt</font>=<font color="a52a2a"><strong>pack</strong></font> <font color="#008000">&quot;C&quot;</font>,255;

<strong>my</strong> <font color="#2040a0">$hash_ref</font> = Hval::getnum<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$txt</font>,<font color="a52a2a"><strong>length</strong></font> <font color="#2040a0">$txt</font>,10<font color="4444FF"><strong>)</strong></font>;


<strong>foreach</strong> <strong>my</strong> <font color="#2040a0">$key</font> <font color="4444FF"><strong>(</strong></font><font color="a52a2a"><strong>keys</strong></font> <font color="#2040a0">%$hash_ref</font><font color="4444FF"><strong>)</strong></font> <font color="4444FF"><strong>{</strong></font>
<font color="#444444">#  print &quot;$key =&gt; $hash_ref-&gt;{$key}\n\n&quot;;
  </font><font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; &quot;</font>.<font color="a52a2a"><strong>unpack</strong></font> <font color="#008000">&quot;C&quot;</font>,<font color="#2040a0">$hash_ref</font>-&gt;<font color="4444FF"><strong>{</strong></font><font color="#2040a0">$key</font><font color="4444FF"><strong>}</strong></font>;
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;

<font color="4444FF"><strong>}</strong></font>
</pre>
и работает вот так:
<pre>
[vilfred@mobile100 Hval]$ perl rr.pl
uns => 255
[vilfred@mobile100 Hval]$

</pre>
Создание хеша с именоваными ключами и значениями в виде массива и строки в
виде \x00\xff...
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>            <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>

<font color="#2040a0">SV</font> <font color="4444FF">*</font>
<font color="#2040a0">getnum</font><font color="4444FF">(</font><strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">data</font>,<strong>int</strong> <font color="#2040a0">l</font>,<strong>int</strong> <font color="#2040a0">k</font><font color="4444FF">)</font>

  <font color="#2040a0">INIT</font><font color="4444FF">:</font>

  <font color="#2040a0">CODE</font><font color="4444FF">:</font>
    
        <font color="#2040a0">HV</font><font color="4444FF">*</font> <font color="#2040a0">hash</font> <font color="4444FF">=</font> <font color="#2040a0">newHV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">AV</font><font color="4444FF">*</font> <font color="#2040a0">array</font> <font color="4444FF">=</font> <font color="#2040a0">newAV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">av_push</font><font color="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#FF0000">34</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font> 
        <font color="#2040a0">av_push</font><fontcolor="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#FF0000">77</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font> 
        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;unsigned_char&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSVpv</font> <font color="4444FF">(</font><font color="4444FF">(</font><strong>char</strong><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">data</font>, <font color="#2040a0">l</font><font color="4444FF">*</font><strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">)</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;array&quot;</font>,<font color="#FF0000">3</font>,<font color="4444FF">(</font><font color="#2040a0">SV</font><font color="4444FF">*</font><font color="4444FF">)</font><font color="#2040a0">array</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

      <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV</font><font color="4444FF">(</font> <font color="4444FF">(</font><font color="#2040a0">SV</font> <font color="4444FF">*</font><font color="4444FF">)</font> <fontcolor="#2040a0">hash</font> <font color="4444FF">)</font><font color="4444FF">;</font> 
    
  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>

      <font color="#2040a0">RETVAL</font>


</pre>
Возвращается хеш с двумя элементами: массивом и строкой unsigned char в виде
'\x00\xff...' 
<pre>
<font color="#444444">#!/usr/bin/perl -w

</font><strong>use</strong> strict;
<strong>use</strong> warnings;
<strong>use</strong> ExtUtils::testlib;


<strong>use</strong> Hval;
<strong>use</strong> Data::Dumper;

<strong>my</strong> <font color="#2040a0">$txt</font>=<font color="a52a2a"><strong>pack</strong></font> <font color="#008000">&quot;C&quot;</font>,255;
<strong>my</strong> <font color="#2040a0">$hash_ref</font> = Hval::getnum<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$txt</font>,<font color="a52a2a"><strong>length</strong></font> <font color="#2040a0">$txt</font>,10<font color="4444FF"><strong>)</strong></font>;


<strong>foreach</strong> <strong>my</strong> <font color="#2040a0">$key</font> <font color="4444FF"><strong>(</strong></font><font color="a52a2a"><strong>keys</strong></font> <font color="#2040a0">%$hash_ref</font><font color="4444FF"><strong>)</strong></font> <font color="4444FF"><strong>{</strong></font>
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; &quot;</font>;
  <font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; | &quot;</font>=&gt; <font color="#2040a0">@{$hash_ref-&gt;{$key}</font><font color="4444FF"><strong>}</strong></font> <strong>if</strong> <font color="#2040a0">$key</font> <strong>ne</strong> <font color="#008000">'uns'</font>;
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#77dd77">\n</font><font color="#77dd77">\n</font>&quot;</font>;
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; &quot;</font>.<font color="a52a2a"><strong>unpack</strong></font> <font color="#008000">&quot;C&quot;</font>,<font color="#2040a0">$hash_ref</font>-&gt;<font color="4444FF"><strong>{</strong></font><font color="#2040a0">$key</font><font color="4444FF"><strong>}</strong></font> <strong>if</strong> <font color="#2040a0">$key</font> <strong>eq</strong> <font color="#008000">'uns'</font>;
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;

<font color="4444FF"><strong>}</strong></font>
     
</pre>

Работа с <a href="http://genphys.phys.msu.ru/~dmitriyk/perl/lpt.html">параллельным
портом</a> при помощи xs
<p>
<b>Обработка изображений</b>
<p>
В <a
href="http://gtk2-perl.sourceforge.net/">gtk2-perl</a> есть функция,
позволяющая получать яркость пикселей в виде строки '\xff\x00...'. Т.к.
зачастую при обработке изображений важна скорость работы программы, то по
скорости get_pixels(), в принципе, может использоваться для обработки
одиночных рисунков:

<pre>
<font color="#444444">#!/usr/bin/perl

</font><strong>use</strong> strict;
<strong>use</strong> warnings;
<strong>use</strong> Glib <font
color="a52a2a"><strong>qw</strong></font><font color="4444FF"><strong>(</strong></font>FALSE TRUE<font color="4444FF"><strong>)</strong></font>;

<strong>use</strong> Gtk2 -init;

<strong>use</strong> ExtUtils::testlib;
<strong>use</strong> HalfWork;

<strong>my</strong><font color="4444FF"><strong>(</strong></font><font color="#2040a0">@criteria</font>,<font color="#2040a0">@a</font>,<font color="#2040a0">@res</font>,<font color="#2040a0">$pix</font>,<font color="#2040a0">$button</font>,<font color="#2040a0">@m</font>,<font color="#2040a0">$img</font>,<font color="#2040a0">$pixbuf</font>,<font color="#2040a0">$pixels</font>,<font color="#2040a0">$w</font>,<font color="#2040a0">$h</font>,<font color="#2040a0">$c</font><font color="4444FF"><strong>)</strong></font>;



<strong>sub<font color="ff0000"> render_image</font>{</strong>
  <strong>my</strong> <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$txt1</font>,<font color="#2040a0">$min</font>, <font color="#2040a0">$max</font><font color="4444FF"><strong>)</strong></font>; <font color="#2040a0">$min</font>=10; <font color="#2040a0">$max</font>=440;
  <font color="#2040a0">$img</font>=<font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font> <strong>if</strong> <font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>;
  <font color="#2040a0">$img</font>=<font color="#2040a0">$_</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font> <strong>if</strong> <font color="#2040a0">$_</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>;
  <font color="#2040a0">$pixbuf</font> = Gtk2::Gdk::Pixbuf-&gt;new_from_file <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$img</font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$pixels</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_pixels<font color="4444FF"><strong>(</strong></font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$h</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_height; <font color="#2040a0">$w</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_width;

<font color="4444FF"><strong>}</strong></font>
            
<strong>while</strong> <font color="4444FF"><strong>(</strong></font>&lt;<font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>/*.*&gt;<font color="4444FF"><strong>)</strong></font><font color="4444FF"><strong>{</strong></font>
  <font color="a52a2a"><strong>print</strong></font> <font color="#2040a0">$c</font>++,<font color="#008000">&quot; &quot;</font>;
  &amp;render_image<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$_</font><font color="4444FF"><strong>)</strong></font> <strong>if</strong><font color="b000d0"> m!\.jpg$!</font>;

<font color="4444FF"><strong>}</strong></font>
</pre>
Скорость работы соответственно: 
<pre>
[vilfred@mobile100 HalfWork]$ time perl fast.pl ../datchik/files/
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
79 80 81 82 83 84 85
real    0m2.230s
user    0m1.893s
sys     0m0.320s
[vilfred@mobile100 HalfWork]$ perl -e 'print 85/2.2,"\n"'
38.6363636363636
[vilfred@mobile100 HalfWork]$
</pre>
38 кадров 640x480 в секудну.
<p>

Чтобы работать не с пикселями а с картинкой, т.е. сразу видеть результаты
работы алгоритма, пишется, например, такой код:
<pre>
<font color="#444444">#!/usr/bin/perl

</font><strong>use</strong> strict;
<strong>use</strong> warnings;

<strong>use</strong> Glib <font color="a52a2a"><strong>qw</strong></font><font color="4444FF"><strong>(</strong></font>FALSE TRUE<font color="4444FF"><strong>)</strong></font>;

<strong>use</strong> Gtk2 -init;
<strong>use</strong> ExtUtils::testlib;
<strong>use</strong> HalfWork;


<strong>my</strong><font color="4444FF"><strong>(</strong></font><font color="#2040a0">@criteria</font>,<font color="#2040a0">@a</font>,<font color="#2040a0">@res</font>,<font color="#2040a0">$pix</font>,<font color="#2040a0">$button</font>,<font color="#2040a0">@m</font>,<font color="#2040a0">$img</font>,<font color="#2040a0">$pixbuf</font>,<font color="#2040a0">$pixels</font>,<font color="#2040a0">$w</font>,<font color="#2040a0">$h</font>,<font color="#2040a0">$c</font><font color="4444FF"><strong>)</strong></font>;


<strong>my</strong> <font color="#2040a0">$window</font>  = Gtk2::Window-&gt;<strong>new</strong> <font color="4444FF"><strong>(</strong></font> <font color="#008000">&quot;toplevel&quot;</font> <font color="4444FF"><strong>)</strong></font>;
<strong>my</strong> <font color="#2040a0">$hbox</font>    = Gtk2::HBox-&gt;<strong>new</strong> <font color="4444FF"><strong>(</strong></font>1,1<font color="4444FF"><strong>)</strong></font>;

<strong>my</strong> <font color="#2040a0">$vbox</font>    = Gtk2::VBox-&gt;<strong>new</strong> <font color="4444FF"><strong>(</strong></font>0,1<font color="4444FF"><strong>)</strong></font>;
<strong>my</strong> <font color="#2040a0">$image</font>   = Gtk2::Image-&gt;<strong>new</strong>;

<strong>my</strong> <font color="#2040a0">$e</font>;

&amp;images<font color="4444FF"><strong>(</strong></font><font color="4444FF"><strong>)</strong></font>;

<strong>sub<font color="ff0000"> render_image</font>{</strong>
  <strong>my</strong> <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$txt1</font>,<font color="#2040a0">$min</font>, <font color="#2040a0">$max</font><font color="4444FF"><strong>)</strong></font>; <font color="#2040a0">$min</font>=10; <font color="#2040a0">$max</font>=440;


<font color="#444444">#  die &quot;Usage: $0 imagefile\n&quot; unless @ARGV;
  </font><font color="#2040a0">$img</font>=<font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font> <strong>if</strong> <font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>;
  <font color="#2040a0">$img</font>=<font color="#2040a0">$_</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font> <strong>if</strong> <font color="#2040a0">$_</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>;
  <font color="#2040a0">$pixbuf</font> = Gtk2::Gdk::Pixbuf-&gt;new_from_file <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$img</font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$pixels</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_pixels<font color="4444FF"><strong>(</strong></font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$h</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_height; <font color="#2040a0">$w</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_width;
  <strong>my</strong> <font color="#2040a0">$criteria</font>;

  <font color="#2040a0">$pixbuf</font> = Gtk2::Gdk::Pixbuf-&gt;new_from_data
                        <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$pixels</font>,  <font color="#444444"># packed image data in a scalar
                           </font><font color="#008000">'rgb'</font>,  <font color="#444444"># only 24- or 32-bit RGB are supported
                               </font>0,  <font color="#444444"># no alpha, data is 24-bit
                               </font>8,  <font color="#444444"># only 8 bits per sample are supported
                              </font><font color="#2040a0">$w</font>,  <font color="#444444"># in pixels
                              </font><font color="#2040a0">$h</font>,  <font color="#444444"># in pixels
                            </font><font color="#2040a0">$w</font>*3<font color="4444FF"><strong>)</strong></font>; <font color="#444444"># number of *bytes* in each row
                            
  </font><font color="#2040a0">$image</font>-&gt;set_from_pixbuf <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$pixbuf</font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$window</font>-&gt;set_title<font color="4444FF"><strong>(</strong></font><font color="#008000">&quot;imaging <font color="#2040a0">$img</font>&quot;</font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$img</font>=<font color="#008000">''</font>; <font color="#2040a0">$#</font>res=-1;


<font color="4444FF"><strong>}</strong></font>

<font color="#2040a0">$window</font>-&gt;add<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$hbox</font><font color="4444FF"><strong>)</strong></font>;
<font color="#2040a0">$hbox</font>-&gt;add<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$vbox</font><font color="4444FF"><strong>)</strong></font>;

<font color="#2040a0">$vbox</font>-&gt;add<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$image</font><font color="4444FF"><strong>)</strong></font>;
<font color="#2040a0">$button</font> = Gtk2::Button-&gt;<strong>new</strong><font color="4444FF"><strong>(</strong></font><font color="#008000">&quot;Repaint...&quot;</font><font color="4444FF"><strong>)</strong></font>;
<font color="#2040a0">$button</font>-&gt;signal_connect<font color="4444FF"><strong>(</strong></font><font color="#008000">&quot;clicked&quot;</font>, \&amp;signal<font color="4444FF"><strong>)</strong></font>;

<font color="#2040a0">$vbox</font>-&gt;pack_start<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$button</font>, 1, 1, 5<font color="4444FF"><strong>)</strong></font>;
<font color="#2040a0">$window</font>-&gt;signal_connect<font color="4444FF"><strong>(</strong></font> <font color="#008000">&quot;destroy&quot;</font> , sub <font color="4444FF"><strong>{</strong></font> Gtk2-&gt;main_quit ; <font color="4444FF"><strong>}</strong></font> <font color="4444FF"><strong>)</strong></font> ;

<font color="#2040a0">$window</font>-&gt;signal_connect <font color="4444FF"><strong>(</strong></font>delete_event =&gt; sub <font color="4444FF"><strong>{</strong></font>Gtk2-&gt;main_quit;<font color="4444FF"><strong>}</strong></font><font color="4444FF"><strong>)</strong></font>;
<font color="#2040a0">$window</font>-&gt;show_all<font color="4444FF"><strong>(</strong></font><font color="4444FF"><strong>)</strong></font>;


<strong>eval</strong> <font color="4444FF"><strong>{</strong></font>
Gtk2-&gt;main; <font color="4444FF"><strong>}</strong></font>;

<strong>my</strong> <font color="#2040a0">$cry</font>;
<font color="a52a2a"><strong>open</strong></font> F,<font color="#008000">&quot;&gt;<font color="#2040a0">$ARGV</font>[0]/criteria.txt&quot;</font> <strong>or</strong> <strong>die</strong> <font color="#008000">&quot;cant open: <font color="#2040a0">$!</font>&quot;</font>;


<strong>foreach</strong> <font color="4444FF"><strong>(</strong></font><font color="#2040a0">@criteria</font><font color="4444FF"><strong>)</strong></font><font color="4444FF"><strong>{</strong></font> <font color="#2040a0">$cry</font>+=<font color="#2040a0">$_</font> <font color="4444FF"><strong>}</strong></font>
<font color="a52a2a"><strong>print</strong></font> F <font color="#2040a0">$cry</font>/<font color="#2040a0">$#</font>criteria,<font color="#008000">&quot; | &quot;</font>, <font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; &quot;</font> =&gt; <font color="#2040a0">@criteria</font>,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;


<font color="a52a2a"><strong>close</strong></font> F;
<font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#77dd77">\n</font>уТЕДОЕЕ ЪОБЮЕОЙЕ ЮЙУМБ НБЛУЙНХНПЧ: &quot;</font>,<font color="#2040a0">$cry</font>/<font color="#2040a0">$#</font>criteria,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;
<strong>exit</strong> 0;


<strong>sub<font color="ff0000"> signal</font> {</strong>
  &amp;render_image<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$m</font><font color="4444FF"><strong>[</strong></font><font color="#2040a0">$#</font><font color="#2040a0">m</font><strong><font color="4444FF">]</font></strong>) <font color="b000d0">if </font><font color="#2040a0">$m</font><font color="4444FF"><strong>[</strong></font><font color="#2040a0">$#</font><font color="b000d0">m</font><strong><font color="4444FF">]</font></strong><font color="b000d0"> and -f </font><font color="#2040a0">$m</font><font color="4444FF"><strong>[</strong></font><font color="#2040a0">$#</font><font color="b000d0">m</font><strong><font color="4444FF">]</font></strong></font>;
  <font color="a52a2a"><strong>pop</strong></font> <font color="#2040a0">@m</font>;
  Glib::Timeout-&gt;add <font color="4444FF"><strong>(</strong></font>100,
  sub <font color="4444FF"><strong>{</strong></font> <font color="#2040a0">$button</font>-&gt;clicked; 0<font color="4444FF"><strong>}</strong></font><font color="4444FF"><strong>)</strong></font>;

<font color="4444FF"><strong>}</strong></font>

<strong>sub<font color="ff0000"> images</font>{</strong>
  <strong>while</strong> <font color="4444FF"><strong>(</strong></font>&lt;<font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>/*.*&gt;<font color="4444FF"><strong>)</strong></font><font color="4444FF"><strong>{</strong></font>

    <font color="#2040a0">$m</font><font color="4444FF"><strong>[</strong></font><font color="#2040a0">$c</font>++<font color="4444FF"><strong>]</strong></font>=<font color="#2040a0">$_</font> <strong>if</strong><font color="b000d0"> m!\.jpg$!</font>;
  <font color="4444FF"><strong>}</strong></font>
  <font color="a52a2a"><strong>reverse</strong></font> <font color="#2040a0">@m</font>;


<font color="4444FF"><strong>}</strong></font>
</pre>
и результат его работы:
<pre>
[vilfred@mobile100 HalfWork]$ time perl wheather.pl ../datchik/files/

real    0m12.635s
user    0m2.565s
sys     0m0.453s
[vilfred@mobile100 HalfWork]$ perl -e 'print 85/11,"\n"'
7.72727272727273
[vilfred@mobile100 HalfWork]$
</pre>
т.е. около 8 кадров в секунду. Скриншот программы:
<p>
<img src="proga.jpg">
<p>
<!--
<b>Пример использования xs для обработки изображений</b>
<p>
Нужно усреднить картинку по скользящему среднему и посмотреть что из этого
выйдет, т.е. работать не с массивами чисел, а тут-же проглядывать результат.
<p>
Для этого пишется следующий xs,  
-->

<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html">samolet</a> | xs | <a href="pixels.html">next</a>]]></description>
</item>
<item>
<title>perl регулярные выражения</title>
<link>https://rulinux.net/message.php?newsid=34868&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34868&amp;page=1</guid>
<pubDate>Sat, 13 Feb 2010 21:20:00 +0300</pubDate>
<description><![CDATA[test]]></description>
</item>
<item>
<title>Экспорт анимированных моделей из Blender в Sauerbraten.</title>
<link>https://rulinux.net/message.php?newsid=34862&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34862&amp;page=1</guid>
<pubDate>Mon, 16 Nov 2009 08:23:00 +0300</pubDate>
<description><![CDATA[<p>Здравствуйте и добро пожаловать в туториал по экспорту анимированных md3/md5mesh из blender. <br>Мы что вы полагем  умеете работать в блендер, и имеете готовую анимированную модель для экспорта в  Sauerbraten. Если это не так, то вы можете взять модель сталкера по рекомендации LGT 2 и  научится делать скелетную анимацию по урокам Андрея Прахова и Александра Супрунова опубликованным в выпусках <a href="http://wiki.linuxformat.ru/index.php/LXF91:Blender">LinuxFormat 87-91</a></p><p>Итак приступим. Откроем blender и загрузим в него имеющуюся у вас модель.
<br><img src="/artimages/animated-md3/1.png"><br>
</p><p>Выберти арматуру и нажмите [Tab] для перехода в режим редактирования. Выберите край кости на конце tag_torso  и переместите курсор на выделенную часть. Выставите родителем тега кость являющуюся стыковой между ногами и туловищем[ctrl-p].  Повторите то-же самое для tag_head. Выставите родителем тега соответствующую кость. Переместите курсор в центр [shift-c]. Установите точку опоры в центр на место курсора [.]. Это позволит повернуть все вокруг центра 3d пространства. Теперь выделите все [a] и поверните по оси z на -90°([r] [z] [90] [-]). <br>Приступим к tag_weapon. Выравнивание данного тега довольно сложная задача. Но сейчас мы научимся трюку выравнивания. Перейдите к кадру анимации на котором персонаж стреляет и его рука с оружием  направлена по оси x. Перейдите в pose mode. Выставите курсор на кончик кости где вы хотите добавить тег. Перейдите к виду сбоку [Num 3] и добавьте пустой tag_weapon. Родитель кости должен быть пустым. Выберите последний кадр анимации. Выберите ноги и tag_torso. И с помощью элемента меню File → Export → Quake3 (.md3)... проэкспортируйте выделенное в md3 файл legs.md3(файл назовите на ваше усмотрение).. <br>Перейдем к туловищу. Перейдите в  object mode. Переместите курсор в центр [shift-c]. Выберите все [a] и выровните tag_torso по центру на место курсора. Убедитесь что точка опоры выровнена по центру[.]. Это позволит вращать арматуру вокруг курсора. Выберите все, кроме tag_torso. Поверните по оси z на 90°([r] [z] [90]), а затем по оси x на 90°([r] [x] [90]).  Выберите меш  тела и все теги и проэкспортируйте в  файл torso.md3(файл назовите на ваше усмотрение). Теперь проэкспортируем голову. Небольшое отличие экспорта меша головы от тела, заключается в том, что вам нужен лишь один кадр. Об анимации головы позаботится md3 тела. Нажмите F10 для перехода на панель Scene, затем откройте вкладку Anim и учбедитесь что Sta: выставлен в  1 и End: выставлен в 1.<br><img src="/artimages/animated-md3/2.png"></p><p>Выберите меш головы, tag_head, и экспортируйте в head.md3 или наподобие. Теперь создайте файл md3.cfg:<br> <i> md3load legs.md3 // модель ног <br>//Здесь указываем скин, масштаб, карты нормалей и пр. md3anim dying 0 30 20  <br>//Далее перечисляем все необходимые анимации <br>md3load torso.md3 // модель туловища <br>//Здесь указываем скин, маски, карты нормалей и пр. <br>md3anim dying 0 30 20 //Так-же как и после загрузки ног перечисляем все необходимые анимации <br>md3load head.md3 // модель головы <br>//Здесь указываем скин, маски, карты нормалей и пр. <br>//При загрузке головы анимации указывать не нужно <br>md3link 0 1 tag_torso //Моделям загруженным с помощью md3load присваивается уникальный ID  <br>md3link 1 2 tag_head //команда md3link обьединяет модели с указанным ID по тегу. <br>//Далее указываем масштаб, specular и прочие не обязательные параметры </i></p><p>Полностью параметры конфигурации формата md3 в Sauerbraten вы можете найти <a href="/view-article.php?aid=69">тут</a>. <br>Как вариант можно экспортировать модель в формат md5mesh. Для экспорта используйте <a href="http://cube.wikispaces.com/file/view/blendermd5_2_09.zip">данный</a> плагин для Blender.  
<br><img src="/artimages/animated-md3/3.jpg"><br>
В этом формате анимации хранятся отдельно от мешей. Название файла меша звучит как имя.md5mesh, а файла анимации как имя.md5anim. Так-же для каждой анимации используется отдельный файл, например idle.md5anim или run.md5anim. Параметры конфигурации md5 аналогичны таковым для формата md3.  Подробнее про параметры конфигурации вы можете прочесть тут.</p><p>Осталось лишь создать файлик preview.jpg разером 512х512 с изображением персонажа и все. <br>Запустим игру и после загрузки карты и выбора модели персонажа перейдем к виду от 3 лица [9]. И если вы все выполнили правильно, то ваша модель в игре будет выглядеть так: 
<br><img src="/artimages/animated-md3/4.jpg">
</p>]]></description>
</item>
<item>
<title>Параметры конфигурации формата obj в Sauerbraten</title>
<link>https://rulinux.net/message.php?newsid=34863&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34863&amp;page=1</guid>
<pubDate>Fri, 30 Oct 2009 08:22:00 +0300</pubDate>
<description><![CDATA[<p>Формат Wavefront OBJ реализован практически идентично MD3. Единственное отличие OBJ специфичных команд в префиксе &quot;obj&quot; вместо &quot;md3&quot; (т.е. &quot;objskin&quot; вместо &quot;md3skin&quot;). Конфигурационный файл называется &quot;obj.cfg&quot; вместо &quot;md3.cfg&quot;, а модель называется &quot;tris.obj&quot; вместо &quot;tris.md3&quot;. Так-же нет поддержки анимаци (&quot;objanim&quot;) и линковки (&quot;objlink&quot;). Группы имен используются для идентификаци мешей в модели. </p><p>Параметры конфигурации формата md3 вы можете найти <a href="/view-article.php?aid=69">тут</a>.</p>]]></description>
</item>
<item>
<title>Параметры конфигурации формата md3 в Sauerbraten</title>
<link>https://rulinux.net/message.php?newsid=34864&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34864&amp;page=1</guid>
<pubDate>Fri, 30 Oct 2009 08:15:00 +0300</pubDate>
<description><![CDATA[<p>MD3 файлы могут быть использованы одним из двух способов.</p><p><p align="center"><b><i>Без конфигурации</b></i></p id=\"end{center}\"></p><p>Используйте данный способ если ваша md3 не имеет анимаций (статическая) и имеет всего одну текстуру. MD3 файлы должны располагаться в каталоге packages/models/. В каталоге модели должен располагаться скин (UV текстура, обычно skin.jpg или skin.png) и сама md3(обычно tris.md3). Так-же там может располагаться masks.jpg содержащая specmap в R канале,  glowmap в G канале, и chrome map в B канале. Движок подхватит их автоматически. Если один из файлов не найден, движок будет искать их в родительской директории. Например, если для модели flags/red не найдена tris.md3 в каталоге packages/models/flags/red/, то движок станет искать tris.md3 в каталоге packages/models/flags/. Это позволяет менять скины и геометрию.</p><p><p align="center"><b><i>С конфигурацией</b></i></p id=\"end{center}\"></p><p>Используйте данный способ если ваша md3 анимированная и имеет несколько скинов, или если вы хотите использовать прочие возможности конфигурации. Добавьте md3.cfg в каталог packages/models/. Этот файл определяет загрузку моделей, связи и пр. Следующие команды могут быть использованы в md3.cfg: </p><p><b>md3load P</b></p><p>Эта команда загрузит первую часть вашей модели. Например это может быть head.md3 из модели персонажа. P это путь к модели md3 относительно файла md3.cfg. </p><p><b>md3pitch S O M N</b></p><p>Эта команда определяет как модель реагирует на шаг. Шаг (в градусах) масштабируется S, компенсируется O, а затем фиксируется в диапазоне M..N, т.е. шаг*S + O, M, N. По умолчанию, все части модели имеют S=1, O=0, M=-360, и N=360. </p><p><b>md3skin H S M [E [F]]</b></p><p>Эта команда загрузит текстуру и отнесет ее к последней модели загруженной с помощью md3load. H это название меша на который накладывается текстура. S это путь к текстуре  относительно md3.cfg. M это набор текстур для spec (красный канал)/glow (зеленый канал) карт. Если E не равно нулю, то синий канал маски интерпретируется как chrome  карта. E (максимальная интенсивность envmap) и F (минимальная интенсивность envmap, по умолчанию: 0) значение плавающей точки в диапазоне от 0 до 1, в котором envmapping интенсивность будет варьироваться в зависимости от угла обзора . Интенсивность масштабируется в данном диапазоне, а затем умнажается на chrome map.   <b>md3bumpmap H N [S]</b></p><p>Эта команда включит поддержку карт бампа для заданного меша последней модели загружнееой с помощью md3load. H это название меша на который накладывается  карты бампа. N это текстура карты нормалей. S это путь к текстуре которая (если указано) используется вместо скина наложенного с помощью команды md3skin. Используется только если видеокарта пользователя поддерживает карты бампа, в противном случае скин наложенный с помощью md3skin имеет приимущество. Эти два скина могут быть одинаковыми. Однако скин предназначенный для бампмэппинга практически не имеет теней, в то время как плоские текстуры (без бампа) в целом должны, эта команда позволяет разделить скин для бампмаппинга и плоский.  md3spec MESH S MESH это название меша к которому применяется эффект. S это итненсивность отражений  (если не указано или стоит 0 то принимается значение по умолчанию 100, это хорошо для метала/пластика или чего-то блестящего, низкие значения, например 50 хороши для дерева и пр. , если стоит -1 отражения отключены).</p><p><b>md3alphatest MESH T</b></p><p>MESH это название меша к которому применяется эффект. Команда определяет светотеневой порог T, при котором альфа канал скина будет отбрасывать пиксели с альфой меньше чем T. Т является плавающей точкой в диапазоне от 0 до 1 (по умолчанию: 0.9). </p><p><b>md3alphablend MESH B</b></p><p>MESH это название меша к которому применяется эффект. Controls whether a model with an alpha-channel skin will alpha blend (по умолчанию: 1). </p><p><b>md3shader MESH S</b></p><p>MESH это название меша к которому применяется эффект. S это название шейдера используемого для рендеринга модели (по умолчанию: &quot;stdmodel&quot;). </p><p><b>md3glow MESH G</b></p><p>MESH это название меша к которому применяется эффект. G это масштаб glowmap(карты свечения) ( если не указано или стоит 0 то принимается значение по умолчанию 300, -если стоит -1 свечение отключено), в процентах от цвета скина. </p><p><b>md3glare MESH S G</b></p><p>MESH это название меша к которому применяется эффект. S и G являются плавающими точками указывающими масштаб величины бликов сгенерированных отраженным светом и бликов, соответственно (по умолчанию: 1 1). </p><p><b>md3envmap MESH P</b></p><p>Установка карты окружающей среды для модели. MESH это название меша к которому применяется эффект. P это путь  к карте(синтаксис похож на синтаксис команды &quot;loadsky&quot;) если не указано, то на модель будет наложена карта ближайшего обьекта , или skybox, если карта не определена. </p><p><b>md3ambient MESH A</b></p><p>MESH это название меша к которому применяется эффект. A это процент от общей освещенности(используется для затенения). если не указано или стоит 0 то принимается значение по умолчанию 30%, -1 очначает отсутствие внешнего света. </p><p><b>md3fullbright MESH N</b></p><p>MESH это название меша к которому применяется эффект. N это постоянный принудительно указанный уровень освещения используемый вместо общего. N является плавающей точкой в диапазоне от 0 до 1</p><p><b>md3anim A F N [S [P]]</b></p><p>Эта команда определяет анимацию применяемую к последней загруженной модели (md3load). A  это название анимации. Любая из перечисленных ниже анимаций может быть использована:  <ul> <li>&nbsp;dying  <li>&nbsp;dead  <li>&nbsp;pain  <li>&nbsp;idle  <li>&nbsp;forward  <li>&nbsp;backward  <li>&nbsp;left  <li>&nbsp;right  <li>&nbsp;hold 1 ... hold 7  <li>&nbsp;attack 1 ... attack 7  <li>&nbsp;jump  <li>&nbsp;sink  <li>&nbsp;swim  <li>&nbsp;edit  <li>&nbsp;lag  <li>&nbsp;taunt  <li>&nbsp;win  <li>&nbsp;lose  <li>&nbsp;gun shoot  <li>&nbsp;gun idle  <li>&nbsp;vwep shoot  <li>&nbsp;vwep idle  <li>&nbsp;mapmodel  <li>&nbsp;trigger 
</ul> F это номер кадра с которого начинается анимация. N это количество кадров в анимации. S это количество кадров в секунду. Если не указано или S=0, то 10 FPS используется по умолчанию. P определяет приоритет анимации(по умолчанию P=0).  Модель персонажа может одновременно проигрывать до двух анимаций — первичную анимацию, и вторичную анимацию. Если модели персонажа определена первичная анимация, она будет использована, в противном случае будет использована вторичная, если доступно. Первичные анимации:  <ul> <li>&nbsp;dying  <li>&nbsp;dead  <li>&nbsp;pain  <li>&nbsp;hold 1 ... hold 7  <li>&nbsp;attack 1 ... attack 7  <li>&nbsp;edit  <li>&nbsp;lag  <li>&nbsp;taunt  <li>&nbsp;win  <li>&nbsp;lose 
</ul> Вторичные анимации:  <ul> <li>&nbsp;idle  <li>&nbsp;forward  <li>&nbsp;backward  <li>&nbsp;left  <li>&nbsp;right  <li>&nbsp;jump  <li>&nbsp;sink  <li>&nbsp;swim 
</ul> Это позволяет например, воспроизвести бег со стрельбой. Торс проигрывает &quot;shoot&quot; (первичную анимацию),  а ноги проигрывают &quot;forward&quot; (вторичную анимацию). В случае если вторичная анимация отлична от &quot;idle&quot; и нет первичной анимации, то вторичная анимация  будет вести себя как первичная, а вторичной анимацией будет выступать &quot;idle&quot;.  Однако, если вы хотите определить первичную анимацию для специфичной части, вы можете явно указать приоритет для анимации, и анимация с высшим приоритетом  проиграется раньше вне зависимости от того, является ли анимация первичной или вторичной. Например вы можете выставить анимации приоритет -1 и все анимации с 0 приоритетом будут проиграны раньше, или вы можете выставить приоритет 1 или выше, тогда анимация будет проиграна до анимаций с 0 приоритетом.  Например определение анимации &quot;punch&quot; начинающейся с 131 кадра  и состоящей из 6 кадров, проигрываемой со скоростью 15 кадров в секунду: md3anim &quot;punch&quot; 131 6 15 </p><p><b>md3link P C T</b></p><p>Эта команда отвечает за линковку двух моделей. Каждая модель загруженная с помощью md3load имеет свой ID. Первая загруженная модель имеет ID 0, вторая -  ID 1, и так далее. Эти идентификаторы используются для  определения моделей и обьединения(линковки) их вместе. P это ID родительской модели. C это ID Дочерней модели. T это название тега определяющего вершины модели, которые будут обьединены.  Примечание: Удостоверьтесь что вы поняли разницу между родительской и дочерней моделью. Рендеринг начинается с модели 0 (Первая загруженная модель) и продолжается   на дочерних моделях. Представьте себе дерево, так-вот модель 0 это корень. </p><p><p align="center"><b><i>Пример конфигурации</b></i></p id=\"end{center}\"></p><p><i>md3load lower.md3 // модель № 0</p><p>md3skin l_lower ./default_l.png</p><p>md3anim dying           0   30  20</p><p>md3anim dead            30  1   25</p><p>md3anim &quot;forward|backward|left|right|swim&quot; 114 10  18</p><p>md3anim idle            164 30  30</p><p>md3anim &quot;jump|lag|edit&quot; 147     8       15</p><p>md3load upper.md3 // модель № 1</p><p>md3skin u_torso ./default.png</p><p>md3anim dying           0   30  20</p><p>md3anim dead            30  1   25</p><p>md3anim &quot;lag|edit&quot;      91  40  18</p><p>md3anim &quot;attack *&quot;      131 6   15</p><p>md3anim idle            152 1   15</p><p>md3anim pain            152 1   15</p><p>md3load head.md3 // модель № 2</p><p>md3skin h_head ./default_h.png</p><p>md3link 0 1 tag_torso</p><p>md3link 1 2 tag_head</p><p>mdlspec 50</p><p>mdlscale 20         // 20 процентов от оригинального размера</p><p>mdltrans 0 0 -1.5   // lower the model a bit </i></p>]]></description>
</item>
<item>
<title>Параметры конфигурации формата md2 в Sauerbraten</title>
<link>https://rulinux.net/message.php?newsid=34865&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34865&amp;page=1</guid>
<pubDate>Tue, 13 Oct 2009 11:08:00 +0400</pubDate>
<description><![CDATA[<p>MD2 файлы должны располагаться в каталоге <i>packages/models/</i>. В каталоге модели должен располагаться скин (UV текстура, обычно skin.jpg или skin.png) и сама md2(обычно tris.md2). Так-же там может располагаться masks.jpg содержащая specmap в R канале,  glowmap в G канале, и chrome map в B канале. Движок подхватит их автоматически.</p><p>Если один из файлов не найден, движок будет искать их в родительской директории. Например, если для модели <i>flags/red</i> не найдена tris.md2 в каталоге <i>packages/models/flags/red/</i>, то движок станет искать tris.md2 в каталоге <i>packages/models/flags/</i>. Это позволяет менять скины и геометрию.</p><p>Ожидается что файлы формата md2  используют Quake-совместимый масштаб и анимацию.</p><p>Вы можете так-же добавить  конфигурационный файл (md2.cfg) в каталог с моделью, позволяющий настроить анимацию модели. Следующие команды могут быть использованы в  md2.cfg: </p><p><b>md2anim N F M [S [P]]</b></p><p>N это название анимации. Любая из перечисленных ниже анимаций может быть использована: </p><p><ul> <li>&nbsp;dying  <li>&nbsp;dead  <li>&nbsp;pain  <li>&nbsp;idle  <li>&nbsp;forward  <li>&nbsp;backward  <li>&nbsp;left  <li>&nbsp;right  <li>&nbsp;hold 1 ... hold 7  <li>&nbsp;attack 1 ... attack 7  <li>&nbsp;jump  <li>&nbsp;sink  <li>&nbsp;swim  <li>&nbsp;edit  <li>&nbsp;lag  <li>&nbsp;taunt  <li>&nbsp;win  <li>&nbsp;lose  <li>&nbsp;gun shoot  <li>&nbsp;gun idle  <li>&nbsp;vwep shoot  <li>&nbsp;vwep idle  <li>&nbsp;mapmodel  <li>&nbsp;trigger 
</ul></p><p>F это номер кадра с которого начинается анимация. M это количество кадров в анимации. S это количество кадров в секунду. Если не указано, то 10 FPS используется по умолчанию. P определяет приоритет анимации(по умолчанию P=0). </p><p>Например определение анимации &quot;pain&quot; начинающейся с 50 кадра и состоящей из 6 кадров и работающей со скоростью 30 кадров в секунду Будет выглядеть так: md2anim &quot;pain&quot; 50 6 30 </p>]]></description>
</item>
<item>
<title>Экспорт статических моделей из Blender в Sauerbraten.</title>
<link>https://rulinux.net/message.php?newsid=34866&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34866&amp;page=1</guid>
<pubDate>Thu, 24 Sep 2009 16:30:00 +0400</pubDate>
<description><![CDATA[<p>Данная статья является вольным переводом статьи &nbsp;<a href="http://cube.wikispaces.com/MD3+Export+From+Blender+Tutorial">http://cube.wikispaces.com/MD3+Export+From+Blender+Tutorial</a></p><p>В данной статье используется Blender и md3 exporter script. По умолчанию предполагается что вы умеете работать в Blender хотя-бы на базовом уровне. А так-же что у вас уже имеется готовая модель для экспорта( в нашем случае это будет бронежилет взятый из модели сталкера с сайта &nbsp;<a href="http://artblock.ru">http://artblock.ru</a> ). Итак начнем. Открываем Blender:</p>
<img src="/artimages/static-md3/1.jpg">
<p> Панели могут быть расположены по-другому, в зависимости от ваших предпочтений. Откройте файл с моделью нажав F1 или CTRL+O, а затем нажмите Num_1 для получения вида спереди.</p><p>Эта модель бронежилета должна располагаться над землей. Вы можете добиться этого редактированием md3.cfg после экспорта, или изменением высоты в Blender как показано на рисунке. Использование обоих методов сразу позволит вам добиться большей точности. Ниже показана модель в режиме редактирования с точкой отсчета в начале координат. Для правильного экспорта любой модели, анимированной или нет, точка отсчета должна быть 0,0,0. Проверьте uvmap для уверенности в том, что карта правильная. Нажмите TAB для выхода из Edit Mode, а затем F для входа в режим UV Face Select . В версии 2.46 и выше режим UV Face Select отсутствует, он объединен с Edit Mode.  Выберите UV/Image Editor (справа) нажав на кнопку Window Type(внизу слева).</p>
<img src="/artimages/static-md3/2.jpg"><p>Если вы еще не сконвертировали четырехугольники в треугольники, то выполните это  в  режиме редактирования выделив все(A) и нажав Ctrl+T или выбрав в меню Mesh → Faces → Convert Quads to Triangles.  Это правильный формат граней в игровых движках.</p><p>Осталось выполнить еще один шаг и можно будет экспортировать. Оси в Blender отличаются от большинства 3d приложений в том числе и от Sauerbraten. Если мы экспортируем модели сейчас, то направления моделей будут не верны . Выделите все вершины нажав A. Затем R для того чтобы повернуть модель А затем Z для врашения по оси z. Поворачиваем модель на -90.</p>
<img src="/artimages/static-md3/3.jpg">
<p> К вашему сведению скажу что модели по умолчанию в Blender типа Куба и Цилиндра слишком малы для экспорта в Sauerbraten. Это может быть исправлено в Blender и/или через  конфиг md3.cfg используемый в Sauerbraten. Для примера показана модель бронежилета в сравнении с камерой. Теперь все готово для экспорта. Нажмите TAB для перехода в  Object Mode и выбрав модель нажмите File → Export → Quake3(.Md3). Дайте имя модели, например tris.md3, выберите каталог для экспорта и нажмите Export Quake3 MD3.</p><p>Если вы читали Sauerbraten/docs/dev/md3_sauer_howto.txt (это ваша библия о sauerbraten md3) вы знаете что статичская модель не требует md3.cfg. Это нормально, но мы сделаем ее чтобы понять процесс. Откройте любой текстовый редактор(например Vi или Emacs) и сохраните файл как md3.cfg. Добавьте в него следующие строки:</p><p>md3load tris.md3</p><p>эта строка подгужает модель в sauerbraten. Далее мы должны указать существующие текстуры и маски. Так-же вам потребуется имя меша для наложения на него текстуры. Вы можете найти его в  Blender на панелях режима Editing(F9) посмотрев что указано в строке OB: панели Links and Materials. На модели монеты указано имя kevlar (второй скриншот справа). Следующая строка будет иметь вид:</p><p>md3skin kevlar ./skin.jpg</p><p>Где skin.jpg это имя текстуры наложенной на модель. Теперь давайте настроим размер и specularity:</p><p>mdlscale 200 mdlspec -1</p><p>Сохраните файл и можно начинать тест. Только для начала сделайте бекап файлов tris.md3 skin.jpg и md3.cfg из каталога с заменяемой моделью. Запустите Sauerbraten и если все прошло гладко ваша модель окажется в игре. В моем случае модель выглядит так:</p>
<img src="/artimages/static-md3/4.jpg">
<br>Примечание: Если вы хотите заменить модель хранящуюся в игре в формате md2, не ищите туториал по экспорту md2. Просто сохраните модель в формате md3 в каталог с заменяемой моделью предварительно удалив модель формате md2. И если ваша модель проэкспортирована в соответствии с данным уроком, то движок автоматически подхватит вашу модель.
<p>В следующей статье мы изучим  экспорт анимированных md3 файлов.</p>]]></description>
</item>
<item>
<title>Тот самый маунтманагер</title>
<link>https://rulinux.net/message.php?newsid=34861&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34861&amp;page=1</guid>
<pubDate>Fri, 18 Sep 2009 06:26:00 +0400</pubDate>
<description><![CDATA[<p><b>Цель:</b> при вставке устройства хранения данных вызывать цепочку баш скриптов, делающее с вставленным и отмонтированным носителем разные непотребства.</p><p><b>Реализация:</b> Раньше для этого я использовал ivman, но чего-то он слишком громоздкий был. За основу взят комментер событий на питоне от radiofun, из которого вырезана часть составляющая комментарии (теперь комментируем события из баш скриптов, по мере надобности. На моей станции комментирует самописная прога на сях lsay ( проприетарный цепстраловский синтез + зажигание светодиодов в lpt в зависимости от амплитуды речи ))</p><p>Собственно сырец маунт манагера и комменты к нему ниже</p><p><fieldset><legend>python</legend><code><br />
<span style="color: #808080; font-style: italic;">#!/usr/bin/python</span><br />
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br />
<span style="color: #808080; font-style: italic;">###########################################################################</span><br />
<span style="color: #808080; font-style: italic;"># &nbsp;Event Commenter + automount via hal &nbsp;+ bash handlers &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # </span><br />
<span style="color: #808080; font-style: italic;"># ------------------------------ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#</span><br />
<span style="color: #808080; font-style: italic;"># copyright : © 2008 radiofun; © 2009 Necromant &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #</span><br />
<span style="color: #808080; font-style: italic;"># jabber &nbsp; &nbsp;: radiofun@jabber.ru &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#</span><br />
<span style="color: #808080; font-style: italic;"># jabber &nbsp; &nbsp;: aifiltr0@invyl.ath.cx &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #</span><br />
<span style="color: #808080; font-style: italic;"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #</span><br />
<span style="color: #808080; font-style: italic;">###########################################################################</span><br />
<span style="color: #808080; font-style: italic;"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #</span><br />
<span style="color: #808080; font-style: italic;"># &nbsp; This program is free software; you can redistribute it and/or modify &nbsp;#</span><br />
<span style="color: #808080; font-style: italic;"># &nbsp; it under the terms of the GNU General Public License as published by &nbsp;#</span><br />
<span style="color: #808080; font-style: italic;"># &nbsp; the Free Software Foundation; either version 2 of the License, or &nbsp; &nbsp; #</span><br />
<span style="color: #808080; font-style: italic;"># &nbsp; (at your option) any later version. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #</span><br />
<span style="color: #808080; font-style: italic;"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #</span><br />
<span style="color: #808080; font-style: italic;">###########################################################################</span><br />
&nbsp;<br />
<span style="color: #ff7700;font-weight:bold;">import</span> gobject<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">math</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> dbus<br />
<span style="color: #ff7700;font-weight:bold;">import</span> dbus.<span style="color: black;">mainloop</span>.<span style="color: black;">glib</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span><br />
&nbsp;<br />
handler_script = <span style="color: #483d8b;">&quot;/home/aifiltr0/.config/NMountManager/storage_handler.sh&quot;</span><br />
&nbsp;<br />
<span style="color: #ff7700;font-weight:bold;">class</span> NMountMgr<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<span style="color: #808080; font-style: italic;">#threading.Thread):</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#threading.Thread.__init__(self)</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.__bus = dbus.<span style="color: black;">SystemBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.__hm = <span style="color: #008000;">self</span>.__bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.freedesktop.Hal'</span>,<span style="color: #483d8b;">'/org/freedesktop/Hal/Manager'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.__hm.<span style="color: black;">connect_to_signal</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'DeviceAdded'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">deviceAdded</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.__hm.<span style="color: black;">connect_to_signal</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'DeviceRemoved'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">deviceRemoved</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">handler_script</span> = handler_script<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.__connectedDevices = <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
&nbsp;<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> deviceAdded<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, devID<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; device = dbus.<span style="color: black;">Interface</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.__bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;org.freedesktop.Hal&quot;</span>, devID<span style="color: black;">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;org.freedesktop.Hal.Device&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; exec_line = <span style="color: #008000;">self</span>.__prepareAction<span style="color: black;">&#40;</span>device<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>exec_line<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> 0:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.__connectedDevices<span style="color: black;">&#91;</span>devID<span style="color: black;">&#93;</span>=exec_line<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: black;">system</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">handler_script</span> + <span style="color: #483d8b;">&quot; connect &quot;</span> + exec_line<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
&nbsp;<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> deviceRemoved<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, devID<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> devID <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.__connectedDevices:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec_line = <span style="color: #008000;">self</span>.__connectedDevices.<span style="color: black;">pop</span><span style="color: black;">&#40;</span>devID<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: black;">system</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">handler_script</span> + <span style="color: #483d8b;">&quot; disconnect &quot;</span> + exec_line<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#self.__say(message);</span><br />
&nbsp;<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#prepare device comment!</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> __prepareAction<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, device<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; exec_line = <span style="color: #483d8b;">&quot;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> device.<span style="color: black;">PropertyExists</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'info.capabilities'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isCD = device.<span style="color: black;">QueryCapability</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.disc'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#if &quot;volume&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> device.<span style="color: black;">QueryCapability</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume'</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> isCD:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size =<span style="color: #008000;">self</span>.__getHumanReadableSize<span style="color: black;">&#40;</span>device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.size'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label = device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.label'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>label<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label = device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.fsversion'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#message += &quot;Volume connected: label is &quot; + label + &quot;, Total size &quot;+ size</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#device.Mount(label,&quot;rw&quot;);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uuid = device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.uuid'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uuid = uuid.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-&quot;</span>,<span style="color: #483d8b;">&quot;_&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vol = <span style="color: #008000;">self</span>.__bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.freedesktop.Hal'</span>, <span style="color: #483d8b;">'/org/freedesktop/Hal/devices/volume_uuid_'</span> + uuid<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#Dirty hack for vfat unicode mount</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.fstype'</span><span style="color: black;">&#41;</span>==<span style="color: #483d8b;">'vfat'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mopts=<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf8&quot;</span>,<span style="color: #483d8b;">&quot;uid=1000&quot;</span>,<span style="color: #483d8b;">&quot;shortname=mixed&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mopts=<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;uid=1000&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vol.<span style="color: black;">Mount</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>, device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.fstype'</span><span style="color: black;">&#41;</span>, mopts , dbus_interface=<span style="color: #483d8b;">&quot;org.freedesktop.Hal.Device.Volume&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpoint = device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.mount_point'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec_line = <span style="color: #483d8b;">&quot; volume <span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + mpoint + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span> <span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + label + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span> &quot;</span> + uuid<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># if CD or dvd</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># I have no cd/dvd on my netbook, so the following is not well tested</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> isCD:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label = <span style="color: #483d8b;">&quot;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.disc.has_audio'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label += <span style="color: #483d8b;">&quot; audio &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.disc.is_blank'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label += <span style="color: #483d8b;">&quot; empty &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label += device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.disc.type'</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot; &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label += device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.label'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uuid = device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.uuid'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uuid = uuid.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-&quot;</span>,<span style="color: #483d8b;">&quot;_&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vol = <span style="color: #008000;">self</span>.__bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.freedesktop.Hal'</span>, <span style="color: #483d8b;">'/org/freedesktop/Hal/devices/volume_uuid_'</span> + uuid<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vol.<span style="color: black;">Mount</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>, device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.fstype'</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">&quot;&quot;</span>, dbus_interface=<span style="color: #483d8b;">&quot;org.freedesktop.Hal.Device.Volume&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpoint = device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'volume.mount_point'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec_line = <span style="color: #483d8b;">&quot; cd <span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + mpoint + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span> <span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + label + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span> &quot;</span> + uuid<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#if storage</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> device.<span style="color: black;">QueryCapability</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'storage'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#message += 'Device connection detected: '</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#message += self.__getDeviceName(device) + &quot; storage&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec_line = <span style="color: #483d8b;">&quot;stgdev <span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + <span style="color: #008000;">self</span>.__getDeviceName<span style="color: black;">&#40;</span>device<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#это должно быть саммы последним! &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: black;">&#40;</span>device.<span style="color: black;">PropertyExists</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'linux.subsystem'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: black;">&#40;</span>device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'linux.subsystem'</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">'usb'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> :<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; category = device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'info.category'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; devName = <span style="color: #008000;">self</span>.__getDeviceName<span style="color: black;">&#40;</span>device<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#message += devName + &quot; &quot; + category</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec_line = <span style="color: #483d8b;">&quot;usbdev <span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + <span style="color: #008000;">self</span>.__getDeviceName<span style="color: black;">&#40;</span>device<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> exec_line<br />
&nbsp;<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># in uint64!</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> __getHumanReadableSize<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, size<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; dim = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">math</span>.<span style="color: black;">log</span><span style="color: black;">&#40;</span>size, 1024<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; result = <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 : <span style="color: #ff7700;font-weight:bold;">lambda</span> x: <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">' bytes'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 : <span style="color: #ff7700;font-weight:bold;">lambda</span> x: <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>x/<span style="color: #ff4500;">1024</span>+<span style="color: #ff4500;">0.5</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">' kilobytes'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 : <span style="color: #ff7700;font-weight:bold;">lambda</span> x: <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>x/1.048576e6+<span style="color: #ff4500;">0.5</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">' megabytes'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 : <span style="color: #ff7700;font-weight:bold;">lambda</span> x: <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>x/1.073741824e9+<span style="color: #ff4500;">0.5</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">' gigabytes'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span><span style="color: black;">&#91;</span>dim<span style="color: black;">&#93;</span><span style="color: black;">&#40;</span>size<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> result<br />
&nbsp;<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> __getDeviceName<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, device<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; result = <span style="color: #483d8b;">&quot;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> device.<span style="color: black;">PropertyExists</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'info.vendor'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result = device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'info.vendor'</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot; &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> device.<span style="color: black;">PropertyExists</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'info.product'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result += device.<span style="color: black;">GetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'info.product'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result += <span style="color: #483d8b;">&quot;unknown&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> result<br />
&nbsp;<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> __say<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, text<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#pipe = os.popen('espeak -vmb/mb-fr4-en -s 150 -a 100','w')</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pipe = <span style="color: #dc143c;">os</span>.<span style="color: black;">popen</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'lsay <span style="color: #000099; font-weight: bold;">\'</span>'</span> + text+ <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\'</span>'</span>,<span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> text<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#pipe.write(text)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pipe.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp;<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__del__</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.__bus.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
dbus.<span style="color: black;">mainloop</span>.<span style="color: black;">glib</span>.<span style="color: black;">DBusGMainLoop</span><span style="color: black;">&#40;</span>set_as_default=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp;<br />
ec = NMountMgr<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
mainloop = gobject.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
mainloop.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp;</code></fieldset></p><p>В самом начале поправьте урл скрипта-хэндлера. у меня он на баше, но Вы можете его на чем угодно делать. Его задача минимальна, исходник привожу ниже. из папки handler_dir (не забудьте выставить свою!) Вызывает все скрипты предварительно установив полученные аргументы в переменные к которым легко обращаться и export’нув их.</p><p><fieldset><legend>bash</legend><code><br />
<span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<span style="color: #007800;">handler_dir</span>=<span style="color: #ff0000;">&quot;/home/aifiltr0/.config/NMountManager/stg_handlers.d/&quot;</span><br />
&nbsp;<br />
report<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
<span style="color: #c20cb9; font-weight: bold;">kdialog</span> <span style="color: #660033;">--passivepopup</span> <span style="color: #ff0000;">&quot;$1&quot;</span> <span style="color: #660033;">--title</span> <span style="color: #ff0000;">&quot;NMountManager&quot;</span><span style="color: #000000; font-weight: bold;">&amp;</span><br />
lsay <span style="color: #ff0000;">&quot;$1&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
&nbsp;<br />
<span style="color: #666666; font-style: italic;">#Comment this if you do not want reports about what is connected</span><br />
early_report<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
report $1<br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
&nbsp;<br />
<span style="color: #7a0874; font-weight: bold;">export</span> report<br />
&nbsp;<br />
<span style="color: #7a0874; font-weight: bold;">echo</span> $1 $2 $3 $4 $5<br />
&nbsp;<br />
<span style="color: #007800;">ACTION</span>=$1<br />
<span style="color: #7a0874; font-weight: bold;">export</span> ACTION<br />
&nbsp;<br />
<span style="color: #007800;">TYPE</span>=$2<br />
<span style="color: #7a0874; font-weight: bold;">export</span> TYPE<br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$TYPE</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span><br />
&nbsp; volume<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp;<br />
&nbsp; <span style="color: #007800;">MPOINT</span>=$3<br />
&nbsp; <span style="color: #007800;">LABEL</span>=$4<br />
&nbsp; <span style="color: #007800;">UUID</span>=$5<br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">export</span> MPOINT<br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">export</span> LABEL<br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">export</span> UUID<br />
&nbsp;<br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$ACTION</span> == <span style="color: #ff0000;">&quot;connect&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; report <span style="color: #ff0000;">&quot;A new storage volume has been connected. Label is <span style="color: #007800;">$LABEL</span>. I have attached it to <span style="color: #007800;">$MPOINT</span>&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; report <span style="color: #ff0000;">&quot;Storage volume <span style="color: #007800;">$LABEL</span> removed&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">;;</span><br />
&nbsp;<br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">cd</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; <span style="color: #007800;">MPOINT</span>=$3<br />
&nbsp; <span style="color: #007800;">LABEL</span>=$4<br />
&nbsp; <span style="color: #007800;">UUID</span>=$5<br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">export</span> MPOINT<br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">export</span> LABEL<br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">export</span> UUID<br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$ACTION</span> == <span style="color: #ff0000;">&quot;connect&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; report <span style="color: #ff0000;">&quot;A compact disk has been inserted. Label is <span style="color: #007800;">$LABEL</span>. I have attached it to <span style="color: #007800;">$MPOINT</span>&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; report <span style="color: #ff0000;">&quot;Compact disk ejected.&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">;;</span><br />
&nbsp;<br />
&nbsp; stgdev<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; <span style="color: #007800;">DEVICENAME</span>=$3<br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">export</span> DEVICENAME<br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$ACTION</span> == <span style="color: #ff0000;">&quot;connect&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; report <span style="color: #ff0000;">&quot;A storage device called <span style="color: #007800;">$DEVICENAME</span> has been connected. &quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">;;</span><br />
&nbsp;<br />
&nbsp; usbdev<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; <span style="color: #007800;">DEVICENAME</span>=$3<br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">export</span> DEVICENAME<br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$ACTION</span> == <span style="color: #ff0000;">&quot;connect&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; report <span style="color: #ff0000;">&quot;A USB device called <span style="color: #007800;">$DEVICENAME</span> has been connected. &quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; report <span style="color: #ff0000;">&quot;A USB device called <span style="color: #007800;">$DEVICENAME</span> has been disconnected. &quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">;;</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">esac</span><br />
&nbsp;<br />
&nbsp;<br />
<span style="color: #007800;">BROWSEABLE</span>=0<br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$ACTION</span> == <span style="color: #ff0000;">&quot;connect&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp;<br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$TYPE</span> == <span style="color: #ff0000;">&quot;cd&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;cd&quot;</span><br />
&nbsp; <span style="color: #007800;">BROWSEABLE</span>=1<br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp;<br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$TYPE</span> == <span style="color: #ff0000;">&quot;volume&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;vol&quot;</span><br />
&nbsp; <span style="color: #007800;">BROWSEABLE</span>=1<br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
<span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp;<br />
&nbsp;<br />
<span style="color: #7a0874; font-weight: bold;">export</span> BROWSEABLE<br />
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$ACTION</span> TYPE: <span style="color: #007800;">$TYPE</span> MPOINT=<span style="color: #007800;">$MPOINT</span> LABEL=<span style="color: #007800;">$LABEL</span> UUID=<span style="color: #007800;">$UUID</span> BROWSEABLE=<span style="color: #007800;">$BROWSEABLE</span>&quot;</span><br />
&nbsp;<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$handler_dir</span><br />
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #000000; font-weight: bold;">*</span>~<br />
<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">ls</span><span style="color: #000000; font-weight: bold;">`</span>; <span style="color: #000000; font-weight: bold;">do</span><br />
. <span style="color: #007800;">$file</span><br />
<span style="color: #000000; font-weight: bold;">done</span>;<br />
&nbsp;</code></fieldset></p><p>В папке с хэндлерами мы можем складывать свои баш скрипты на все случае жизни. Из каждого скрипта нам доступно: $ACTION – connect или disconnect $TYPE – тип устройства: usbdev, stgdev, cd, volume. Последние два монтируются автоматом, а куда именно – узнать можем через $MPOINT. Там путь к точке монтирования. $BROWSEABLE – это для ленивых, чтобы не проверять несколько разом и сэкономить на ифе: Если 1 – значит нечто отмонтировано и в $MPOINT можно минимум почитать данные. usbdev и stgdev выставляют $DEVICENAME, для cd и volume есть еще $LABEL и $UUID, так что свои флешки распознатиь легко.</p><p>Вот примеры простых скриптов-хэндлеров: Этот проверяет по ууиду (ам) моя ли эта флешка и экспортирует переменную STG_OWNER.</p><p><fieldset><legend>bash</legend><code><br />
<span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
&nbsp;<br />
<span style="color: #666666; font-style: italic;"># This script checks who does this storage belong to. </span><br />
<span style="color: #666666; font-style: italic;"># And exports a variable</span><br />
<span style="color: #666666; font-style: italic;"># This can be: 0 - ours 1 - foreign, quite simple, but nevertheless</span><br />
&nbsp;<br />
<span style="color: #007800;">stg_pdacard</span>=B4DC_999E<br />
&nbsp;<br />
verify_storage<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">for</span> dev <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #000000; font-weight: bold;">@</span>; <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$dev</span>&quot;</span> == <span style="color: #ff0000;">&quot;<span style="color: #007800;">$UUID</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$dev</span> matched owner list!&quot;</span><br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">0</span>;<br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
<span style="color: #000000; font-weight: bold;">done</span>;<br />
<span style="color: #7a0874; font-weight: bold;">return</span> 1<br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span> <br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> &nbsp;<span style="color: #007800;">$BROWSEABLE</span> <span style="color: #660033;">-eq</span> <span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
verify_storage <span style="color: #007800;">$stg_pdacard</span><br />
<span style="color: #007800;">STG_OWNER</span>=<span style="color: #007800;">$?</span><br />
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;OWNER IS: <span style="color: #007800;">$STG_OWNER</span>&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">export</span> STG_OWNER<br />
<span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp;</code></fieldset></p><p>Я задолбался сносить с флешки автораны с вирусней, когда попользую ее на вендовозных машинах в инсте. Надо бы написать парсер авторан.инфа чтобы еще и сообразить где лежит вирусня, но лень.</p><p><fieldset><legend>bash</legend><code><br />
<span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<span style="color: #666666; font-style: italic;">#ToDo: Properly parse ini file to locate the f*cking shit</span><br />
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;==&gt; <span style="color: #007800;">$ACTION</span> <span style="color: #007800;">$TYPE</span>&quot;</span><br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$ACTION</span> == <span style="color: #ff0000;">&quot;connect&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$TYPE</span> == <span style="color: #ff0000;">&quot;volume&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-e</span> <span style="color: #007800;">$MPOINT</span><span style="color: #000000; font-weight: bold;">/</span>autorun.inf <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; report <span style="color: #ff0000;">&quot;Security alert! The removable device has probably been infected and is dangerous for windows systems. Initiating disinfection sequence.&quot;</span><br />
&nbsp; <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #007800;">$MPOINT</span><span style="color: #000000; font-weight: bold;">/</span>autorun.inf<br />
&nbsp; report <span style="color: #ff0000;">&quot;Disinfection complete&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
<span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp;</code></fieldset></p><p>Коммуниздим потихоньку музочку с флешек друзей в фоновом режиме. Всю, какую находим и складываем в ~/msx4sort/UUID. Зависит от первого скрипта-хэндлера, который проверяет наша ли это флешка и если наша – то игнорирует. (свою-то музыку нафига копировать?)</p><p><fieldset><legend>bash</legend><code><br />
<span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
&nbsp;<br />
<span style="color: #666666; font-style: italic;">#This script make sure you get all the mp3 from a flash drive of your friend without him/her ever noticing it</span><br />
<span style="color: #666666; font-style: italic;">#Just make sure you fill in the data required</span><br />
<span style="color: #007800;">TARGET_DIR</span>=~<span style="color: #000000; font-weight: bold;">/</span>msx4sort<span style="color: #000000; font-weight: bold;">/</span><br />
&nbsp;<br />
sync_type<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #780078;">`pwd`</span> $1&quot;</span><br />
<span style="color: #c20cb9; font-weight: bold;">find</span> . <span style="color: #660033;">-iname</span> $<span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">|</span><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> FILE; <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$FILE</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$TARGET_DIR</span><span style="color: #007800;">$FILE</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">--parents</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$FILE</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$TARGET_DIR</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;==&gt;&quot;</span><span style="color: #007800;">$FILE</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">done</span><br />
&nbsp;<br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$BROWSEABLE</span> <span style="color: #660033;">-eq</span> <span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$STG_OWNER</span> <span style="color: #000000; font-weight: bold;">!</span>= <span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; report <span style="color: #ff0000;">&quot;Music leech in progress.&quot;</span><br />
&nbsp; <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #007800;">$TARGET_DIR</span><span style="color: #007800;">$UUID</span><br />
&nbsp; <span style="color: #007800;">TARGET_DIR</span>=<span style="color: #007800;">$TARGET_DIR</span><span style="color: #007800;">$UUID</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$MPOINT</span><br />
&nbsp; sync_type \<span style="color: #000000; font-weight: bold;">*</span>mp3<br />
&nbsp; sync_type \<span style="color: #000000; font-weight: bold;">*</span>ogg<br />
&nbsp; sync_type \<span style="color: #000000; font-weight: bold;">*</span>avi<br />
&nbsp; sync_type \<span style="color: #000000; font-weight: bold;">*</span>flv<br />
&nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;skipping owned devices&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
<span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp;</code></fieldset></p><p>Ну и на последок: автоматом скопировать фотографии с карточки фотика, которую определяем по ууид.</p><p><fieldset><legend>bash</legend><code><br />
<span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<span style="color: #007800;">target_dir</span>=<span style="color: #ff0000;">&quot;/home/aifiltr0/Фотографии&quot;</span><br />
<span style="color: #007800;">target_vid_dir</span>=<span style="color: #ff0000;">&quot;/home/aifiltr0/кЫно/видеозаписи/с коммуникатора&quot;</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$BROWSEABLE</span> <span style="color: #660033;">-eq</span> <span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$UUID</span> == <span style="color: #ff0000;">&quot;B4DC_999E&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp;<br />
&nbsp; report <span style="color: #ff0000;">&quot;This is your smartphone's card. Multimedia data transfer in progress.&quot;</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$MPOINT</span>/My Pictures&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">find</span> . <span style="color: #660033;">-iname</span> \<span style="color: #000000; font-weight: bold;">*</span>jpg<span style="color: #000000; font-weight: bold;">`</span>; <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$file</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$target_dir</span>/<span style="color: #007800;">$file</span>&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">done</span>;<br />
&nbsp;<br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$MPOINT</span>/My Videos&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">find</span> . <span style="color: #660033;">-iname</span> \<span style="color: #000000; font-weight: bold;">*</span>3gp<span style="color: #000000; font-weight: bold;">`</span>; <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$file</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$target_vid_dir</span>/<span style="color: #007800;">$file</span>&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">done</span>;<br />
&nbsp;<br />
&nbsp; report <span style="color: #ff0000;">&quot;Transfer complete&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
<span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp;</code></fieldset></p><p>Все скрипты пронумерованы, то есть в имени в лучших традиция 00, 01, 02 в самом начале. Так можно задать очередность выполнения. Все. спасибо radiofun за начальный скрипт.</p><p>З.Ы. Там в самом первом баш скрипте определен report() так как я кдешник, вывожу сообщения через kdialog и на синтез речи. гномерам и прочим просто поправить и все будет ку. Не забудьте на всех скриптах сделать chmod +x ну и запускать ./mount_manager.py при загрузке. Вот собственно и все, хотя по хорошему надо бы еще и код подчистить местами. </p><p>Автор статьи <b><a href="/profile.php?user=AiFiLTr0">AiFiLTr0</a></b></p><p>Репост статьи с &nbsp;<a href="http://invyl.ath.cx:8080/wp/?p=35">http://invyl.ath.cx:8080/wp/?p=35</a></p>]]></description>
</item>
</channel>
</rss>