пятница, 27 марта 2009 г.

Волшебная ссылочка

Не могу не сохранить у себя эту волшебную ссылочку

http://www.scottklarr.com/topic/115/linux-unix-cheat-sheets---the-ultimate-collection/

Печатаю себе в массовом порядке :) 

четверг, 26 марта 2009 г.

Либа, либушка ...

Как у начинающего unix-программиста, у меня возникают постоянные проблемы с подхватом динамических библиотек, во время компиляции\запуска программы.

тут мне помогают 3 волшебные команды:

1. ldd

Получает в качестве аргумента имя выполнимого файла или либы, показывает все зависимости. Особо интересны те напротив которох стоит not found (man)

2.  В случае если либу желаемую мы находим а подключить не можем:

nm -C имя_либы >> куда сохранить вывод 

(man)

Показывает все, что в этой либе есть.

Тут оно же --demangle обязательно, что бы увидеть пространства имен. 

В том, что вывела библиотека  ищем, то что не находится при линковки.  

3. Очень пригодилось  при сборке проекта для 32-х и 64-х  битных осей

file имя_либы_или_исполняемого_файла

отображает информацию о типе файла и в частности  для какой системы предназначен.

4. Еще бывает очень интересная ситуация, когда имя библиотеки является линком на другой файл, например: libstlport.so -> libstlport.so.5 а мы указываем это имя с полным путем (same_path/libstlport.so). Тогда, сам линк (libstlport.so) находится, а вот то на что он ссылается(libstlport.so.5)  нет.  В этой ситуации я нашла только один выход прописать его в $LD_LIBRARY_PATH. Вообще думаю стоит все туда прописывать. При этом не забывать, что при запуске могут открываться новые шелы и учитывать облость видемости $LD_LIBRARY_PATH в этом случае, и стоит ли ему делать export.

5.  И последнее: для нормальной работы  gdb он тоже должен уметь подгружать либы. Иногда бывает ситуация когда есть исполняемый файл с другой машины, корка от него. и набор либ. Но сами либы лежат не там где они были на момент создания корки. Тут всех спасет команда gdb 

set solib-search-path path

Вообще для работы  с либами у gdb есть ряд комманд http://mitya.pp.ru/gdb/gdb_13.html#SEC104

Кажется: это все :)

понедельник, 23 марта 2009 г.

Perl && xsl && gnuplot - на коленке

Итак задача: быстренько написать на перле скрипт, который разбирает большие логи, выгребает из них кое-какую информацию и представляет это все в удобном для анализа виде. Желательно красиво и с рюшиками.
Было решено, данные сохрянать в xml, ибо так легче рюшики прикручивать. Потом к рюшикам захотелось добавить графики.

Инструментарий:

perl – почти никогда с ним не работала
xsl – работала очень давно и нечего не помню
gnuplot – Услышала это слово уже в процессе работы.

Свои изыскания складываю тут. А вдруг прийдется повторить сей трюк, а я опять все забуду :) 

*Все что начинается с my_ - это подстава на месте реальных данных.

I .Создаем на Perl файл с данными в формате xml

Для этого есть такая удобная штука как XML::Simple. С помощью ее очень легко построить xml на основе уже имеющихся древовидных данных, представленных в виде хеша.

Сразу подводный камушек: XML:Simple может быть не уставнолен как модуль perl.
Загружала я его от сюда: http://search.cpan.org/~grantm/XML-Simple-2.18/lib/XML/Simple.pm
О том как поставить читала тут: http://www.mclean.net.nz/cpan/

Вся выгрузка данных в xml-файл занимает три строки:

use XML::Simple;

sub writeXML
{
my $outFileName = shift;
my $simple = XML::Simple->new (ForceArray => 1, KeepRoot => 1);
my $data =\%outHash;
$simple->XMLout($data,
KeepRoot => 1,
OutputFile => $outFileName,
XMLDecl => "<?xml version='1.0'?>",
);
}


для отлаживания процесса создания структуры данных удобно использовать 

use Data::Dumper; 
print Dumper(\%outHash);


Очень хорошо об этом всем написано вот в этой статье: http://www.ibm.com/developerworks/xml/library/x-xmlperl1.html?ca=dgr-lnxw01XML-Simple

II . Натягиваем xsl - получаем html – пока без графика

На просторах инета несметное количество инфы по этому вопросу, вот то что использовала я:
http://www.citforum.ru/internet/xmlxslt/xmlxslt.shtml
http://www.citforum.ru/internet/xpath/index.shtml

Из того что может пригодится в дальнейшем, это небольшой код для вывода всех аттриботов узлов. Так как этому предшествовала таблица с обобщенной информацией про узлы, каждая такая табличка аттриботов у меня снабжена html-ым якорьком.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html"/> 
 <xsl:template match="/">
 <! -- тут табличка и другие удобности-->
  <xsl:for-each select="some_path">
  <h3>
  <a target="_blank">
  <xsl:attribute name="name">
  <xsl:value-of select="@name"/>
  </xsl:attribute>
  Attributes of <xsl:value-of select="@name"/>
  </a>
  </h3>
  <table border="1">
  <tr bgcolor="#CCCCCC">
  <td align="center"><strong>name</strong> </td>
  <td align="center" ><strong>Data</strong></td>
  </tr>
  <xsl:for-each select="@*">
  <tr bgcolor="#F5F5F5">
  <td> <b> <xsl:value-of select="name(.)"/></b></td>
  <td> <xsl:value-of select="."/> </td>
  </tr>
  </xsl:for-each>
  </table>
  </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>


В табличке для вставки ссылок на якорьки использовала:

  <a target="_blank">
  <xsl:attribute name="href">
#<xsl:value-of select="@name"/></xsl:attribute>
  <xsl:attribute name="title"><xsl:value-of select="@name"/></xsl:attribute>
  <xsl:value-of select="@name"/>
  </a>


Для скрещениявания xml + xsl в Unix есть:

xsltproc -o my_out.html plot_data.xsl my_.xml

III . При момощи xsl готовим данные для gnuplot. 

Они должны быть в виде текстового файла, столбцы в файле разделены табуляцией, а строки переводами строки. Кроме того, я не использовала, те данные у которых не установлен соотвествующий аттрибут. Сам xsl вышел вот таким:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" indent="yes"/> 
 <xsl:template match="/">
  <xsl:for-each select="my_path">
  <xsl:if test="@my_attr_name">
  <xsl:value-of select="position()"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="@my_attr_name"/>
  <xsl:text> </xsl:text>
  </xsl:if>
  </xsl:for-each>  
</xsl:template>
</xsl:stylesheet>

При скрещивании его с исходным xml получаем обычный текстовый файл, я ему дала имя out.dat.

IV . gnuplot

Тут я сделала первую стратегическую ошибку. Я спутала gnuplot и gplot. 
gplot – это перловый скрипт, который на освновании переданых ему параметров формирует коммандный файл для gnuplot. Причем я скаxала его версии не совместимой с версией моего gnuplot, от чего огребла кучку проблем. В конечном итоге я его не использовала. 

Про gnuplot можно почитать :
http://gnuplot.sourceforge.net/ - официальная страничка
http://mydebianblog.blogspot.com/2008/02/gnuplot_18.html — хорошая статья и на русском 
http://www.gnuplot.info/faq/faq.html — FAQ
http://www.astri.uni.torun.pl/Manuals/gnuplot/node1.html – manual


Работать с ним можно:
набрать gnuplot и вбивать ему все комманды в ручную (мне этот вариант не подходит)
передав коммандный файл на вход.
В коммандном файле как минимev надо указать:

  1. терминал на который выводим. В моем варианте это png
  2. файл куда будет «нарисован» результат
  3. вызвать функцию plot передав ей входные данные. В моем случае это свормированный нами файлик out.dat

При этом : выходной файл должен быть передан только после указания терминала и перед переходом в режим multiplot (set multiplot). Для коммандного файла я создала шаблон с настройками куда потом отдельно дорисываю строки, содержащие описания входных\выходных данных.

Вот он:

set xlabel "X" 
set ylabel "Y" 
set multiplot
set autoscale
set data style lines
set border 3
set xtics border nomirror
set ytics border nomirror
set origin 0.0,0.0
set title "Results" 
set style line 10 lt 1lw 1 pt 5 ps 0.65


Если все удалось, теперь в xsl формуирующий наш html надо добавить стоки для отображения полученного графического файла:

<img src="out.png"></img><br/>

V . окончательный шелловый скрипт

На вход скрипту передается имя дирректории куда будут сложенные: полученные перлом данные, html файл, данные для построения графика, график в виде png.
Сразу хочу оговорится, тут не стоило бы создавть отдельно файл с данными а сразу выход от xslport подавать на вход к gnuplot, с этим я пока не спела разобраться :( разберусь скажу как.
Пока мой итоговоый скрипт выглядит примерно так:

mkdir $1
echo on;
echo "start script"
./my_script.pl -folder $2 -out $1/out.xml

echo "create data for plot"
xsltproc -o $1/out.data plot_data.xsl $1/out.xml

echo "create plot"
echo "set terminal png" > $1/png.gnuplot
echo "set output \"$1/out.png\"" >> $1/png.gnuplot
cat png.gnuplot >> $1/png.gnuplot
echo "plot \"$1/out.data\"" >>$1/png.gnuplot
echo "" >> $1/png.gnuplot
gnuplot $1/png.gnuplot

echo "create html"
xsltproc -o $1/out.html table.xsl $1/out.xml

rm $1/png.gnuplot

VI . И -то-го 
Все просто\быстро\удобно — на коленке получилось. Главное коленки правильные подобрать :) 


пятница, 20 марта 2009 г.

Boost + STLport

Было дело долго мучалась со сборкой буста с STlport. Что бы не забыть, выкладыаю сюда, а может еще кому пригодится.

1. Это нельзя (по крайней мере я не нашла как) сделать со стандартным configure + make нужно использовать bjam

2. Ручками правим user-config.jam добавляем туда строки 

using gcc : версия :...;

using stlport : версия: путь к инклудам;

3. ./tools/jam/src/bin.linuxx86/bjam --toolset=gcc stdlib=stlport --runtime-link=dynamic --without-python --user-config=тот файл который правили --prefix=куда ствим  install

еще использовала так, уж не помню в чем разница, может это избыточно

./tools/jam/src/bin.linuxx86_64/bjam --user-config=user-config.jam --without-python stdlib=stlport -sSTLPORT_PATH=some_dir/STLport/5.1.2/ -sTOOLS=gcc-stlport -sSTLPORT_VERSION=5.1.2 --prefix=some_dir/boost/1.36.0/ install

4. В названии файлов библиотек должна появится буква -p :)

http://www.boost.org/doc/tools/build/doc/html/jam/usage.html - тут ключики от bjam

Полезным оказался -d 0 и еще что-то :) 

Моя фотография
http://aal.flamber.ru - мой фотоальбом