книги хакеры / журнал хакер / 145_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Длинный, часто обновляющийся список опубликованных уязвимостей на сайте Zero Day Initiative
атак, даже если система залатана и атака обломалась. То есть, если ты делаешь попытку атаки, а админ врубил сниффер, то он просечет фишку. Ну а если админ получит 100 000 алертов в логе? И пусть все эти 100 000 — это старые и неактуальные дыры, зато попробуй разбери, как все-таки атаковали. Так что пентестерам нужен хороший эксплойт-пак, и даже если дыра уже год как залатана, она им все равно полезна. Обслуживают такой контингент компании вроде Immunity, Core Security и Rapid7, в
иструментарий которых, в числе прочего, входят и эксплойты с дырками. Кстати, не гнушаются пентестеры и покупкой багов с рук, у частных лиц. Заплатят они меньше, чем крупные скупщики, но зато не особенно привередливы в выборе.
Скомпаниями, стоящиминапередовойлиниикомпьютернойбезопасности, ситуация обратная. Представьсебе: клиенткупил IPS некойфирмы, аэтотIPS невидитине отражаетновыхатак. Самособой, здесь пахнетвыброшенныминаветерденьгами, судамиидругимималоприятнымиштуками. Такчтоsecure-компаниямжизненноважно узнаватьобуязвимостяхкакможнобыстрее. Такиекомпаниинетолькопокупаютдырки заденьги, ноинанимаютсобственных
специалистов-ломастеров. Ктомужеесть связи. Всеболее-менеекрупныеигроки рынкатесноработаютспроизводителями иихпроблемами. Онивидятсорцы. Игроки поменьше, неимеющиеширокойпаутины связейиденегнаштатныхреверсеров, вынужденыпокупатьинформациюодырках, какидругие«простыесмертные». Производителямсофта, всвоюочередь, вообщеторопитьсянекуда. Подумайсам, чтообычноотвечаеттотжеMicrosoft, когда ихспрашиваютодырах? Верно, MS говорит что-товроде«ладно, мытутподумалии решиливыпуститьвнеплановыйпатч, ибо, да-да, планетавогне, всегорит, полыхнуло так, чтодажемызаметили». Болеетого, производители(дажете, которыесерьезно относятсякэтимвопросам) инфуодырках получаютвосновномнахаляву, ненапрягаясь. Схемапроста: кто-тонашелдыру, обрадовалсяипо-тихомупродалеенекому кул-хацкеру, который, всвоюочередь, с помощьюэтойдырыатаковал«большую рыбу». Админ«большойрыбы» оказался недурак— унегостоиткучаснифферови логгеров. Зафиксироваватаку, онотослал вседанныеаверскойкомпании. Аверская компанияпосвоимвнутреннимвзаимным договоренностямтутжесообщилапроиз-
XÀÊÅÐ 02 (145) 2011
водителюсофта, чтовегопродуктенашли уязвимость. Такимобразом— всеголишь перваяреальнаяэксплуатациябага, а информацияонемужедошладопроизводителя. Да, конечно, еслипроизводитель будетсуетитьсясам— онвыиграетвремя. Нозачем? Насозданиепатчавсеравно потребуетсянекоторыйсрок, даиреальных убытковотдырокпроизводительпочти никогданенесет. Такчто, получается, чтооб уязвимостивсеравноузнают. Ивсеравно еепридетсяфиксить. Нопроизводителю нетсмыслаплатитьзато, чтобыузнатьо нейпервым. Именнопоэтомупредложения
Mozilla иGoogle — этообычныйPR, особен-
носучетомтого, что«крутость» дырыони определяютсами.
Напоследокзамечу, чтовсенетакстрашно, какможетпоказаться. Соднойстороны, дыроквсовременномсофтебессчетное количество, онистоятнеплохихденег, продаютсяиперепродаютсяизруквруки, а такжевесьмамедленнопатчатся. Сдругой стороны, нестоитзабыватьотом, чтореальнодлямассовыхисерьезныхатакиспользуетсяничтожныйпроцентэтихсамыхуязвимостей. Статистика, видишьли, утверждает, чтохакерывбольшинствесвоемленивыдо ужаса:). z
079
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
|
||||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
r |
|
|
||||
P |
|
|
|
|
|
NOW! |
|
o |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|||
w Click |
to |
|
|
|
|
|
|
|
|
UNIXOID |
|
||||
|
|
|
|
|
|
|
m |
|
Евгений Зобнин zobnin@gmail.com |
||||||
|
|
|
|
|
|
|
|
|
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
|
||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Âпоисках слабогозвена
Какнайтиузкиеместавприложениях
Существует такая статистика: 20% кода выполняется 80% времени. Точность ее вряд ли полностью соответствует реальному положению вещей, а вот общий смысл довольно интересен: получается, что оптимизация всего приложения — занятие неблагодарное и глупое, а реальные результаты может дать только оптимизация тех 20% приложения, которые выполняются дольше всего. Причем найти эти 20% не так уж и сложно.
Вэтойстатьемыбудемговоритьопрофилировании. ЕсливеритьВикипедии, тоэто
— «сборхарактеристикработыпрограммы, такихкаквремявыполненияотдельных фрагментов, числовернопредсказанных условныхпереходов, числокэш-прома- ховитакдалее». Впереводеэтоозначает «выявлениеузкихместпрограммы» (или, какговорятанглофилы, «бутылочных горлышек»), аименно— всехтехучастковкода, накоторыхпрограмманачинает «пробуксовывать», заставляяпользователя
ждать. Простейшеепрофилированиеможно произвестиголымируками(инижеяпокажу, какэтосделать), нолучшеположитьсяна сообщество, представителикоторогоуже создаливсенеобходимыеинструменты. Первыйипопулярныйинструментноситимя
GNU Profiler (илиgprof). Ониспоконвеков используетсядляпрофилированиякода, генерируемогокомпиляторомGCC. Второй
— GNU Coverage testing tool (gcov), утилита дляболеедетальногоанализапроизводительности. Третий— наборинструментов
отладкиипрофилированияподобщим именемGoogle Performance Tools (сокра-
щенноGPT). Нуачетвертый— этоValgrind, которыйхотьипредназначендляпоиска ошибокработыспамятью, носодержитв своемарсеналерядутилитдляанализа производительностипрограмм. Начнем, как иполагается, склассики.
GNUProfiler
GNU Profiler (gprof) — одинизстарейших
профайлеров, доступныхдляоперационных
080 |
XÀÊÅÐ 02 (145) 2011 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Рис.1 Таблицы, генерируемые gprof, интуитивно понятны
Рис.2 На первый взгляд граф gprof выглядит несколько путаным, но со временем все встает на свои места
системтипаUNIX. Онвходитвсоставпакетаgcc, иможетбытьиспользовандляпрофилированияпрограмм, написанныхналюбомподдерживаемомимязыке(а
этонетолькоC/C++, ноиObjective-C, Ada, Java). Сампо себеgprof неявляетсяинструментомпрофилирования, алишьпозволяетотобразитьпрофильнуюстатистику, котораянакапливаетсяприложениемвовремяработы (самособойразумеется, поумолчаниюникакоеприложениеэтогонеделает, номожетначать, еслисобрать программусаргументом'-pg').
Рассмотрим, какэтоработаетвреальныхусловиях. Чтобыощутитьвседостоинстваgprof, мыприменимеенек какому-нибудьабстрактному, искусственносозданному приложению, аксамомунастоящемуповседневноиспользуемому. Пустьэтобудетgzip. Получаемираспаковываемисходникиархиватора:
$ wget www.gzip.org/gzip-1.3.3.tar.gz
$ tar -xzf gzip-1.3.3.tar.gz $ cd gzip-1.3.3
Устанавливаеминструменты, необходимыедлясборки (вUbuntu этоделаетсячерезинсталляциюмета-пакета build-essential):
$ sudo apt-get install build-essential
Запускаемконфигураторсборки, передаввпеременной окруженияCFLAGS аргумент'-pg':
$ CFLAGS='-pg' ./configure
Компилируемпрограмму: make. Унасестьбинарник gzip, способныйвестистатистикусвоегоисполнения. Каждыйегозапускбудетсопровождатьсягенерацией файлаgmon.out:
$ ./gzip ~/ubuntu-10.10-desktop-i386.iso $ ls -l gmon.out
-rw-r--r-- 1 j1m j1m 24406 2010-11-19 14:47 gmon.out
Этотфайлнепредназначендлячтениячеловеком, но можетбытьиспользовандлясозданияподробногоотчетаобисполнении:
$ gprof ./gzip gmon.out > gzip-profile.txt
Важнаячастьполученногофайлапоказананаскриншоте1. Каждаястрока— этостатистикаисполненияодной функции, столбцы— различныепоказатели. Насинтересуютпервый, третий, четвертыйиседьмойстолбцы.
Ониотображаютинформациюобобщемколичестве времени, затраченномнаисполнениефункции(первый столбец— впроцентах, третий— всекундах), количествееевызововиимени. Попробуемпроанализировать отчет. Первойвспискеидетфункцияdeflate, которая былавызванавсегоодинраз, но«сожрала» 29% всего времениисполненияпрограммы.
Этореализацияалгоритмакомпрессии, и, еслибы переднамистоялазадачаоптимизироватьgzip, мы должныбылибыначатьименноснее. 22% времени ушлонаисполнениефункцииlongest_match, но, в отличиеотdeflate, онабылавызванааж450 613 081 раз,
INFO |
info
•По умолчанию gprof не выводит профильной информации для функций библиотеки libc, но ситуацию можно исправить, установив пакет libc6-prof и собрав тестируемое с библиотекой libc_p: «export LD_FLAGS= '-lc_p'».
•Активировать профайлер GPT можно не только с помощью переменной
окружения CPUPROFILE, но и обрамив тестируемый участок кода функциями
ProfilerStart() и ProfilerStop(), которые объявлены в google/ profiler.h.
WARNING |
warning
Из-за требований к безопасности GPT не сработает в отношении приложений с установленным битом SUID.
XÀÊÅÐ 02 (145) 2011 |
081 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
UNIXOID
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Рис.3 Утилита gcov позволяет выявить проблемные места на уровне строк исходного кода
поэтомукаждыйотдельныйвызовфункциизанималничтожное количествовремени. Этовторойкандидатнаоптимизацию. Функцияfill_window отняла13% всеговремениибылавызвана«всего» 22 180 раз. Возможно, ивэтомслучаеоптимизациямоглабыдать результаты.
Промотавфайлотчетадосередины(кстати, сразузатаблицейидет подробнаясправкаобовсехеестолбцах, чтооченьудобно), мы доберемсядотакназываемого«графавызовов» (Call graph). Он представляетсобойтаблицу, разбитуюназаписи, отделенныедруг отдругапунктиром(повторяющимисязнакамиминуса). Каждаязаписьсостоитизнесколькихстрок, приэтомвтораястрокавопреки здравомусмыслуназывается«первичной» иописываетфункцию, которойпосвященазапись. Строкойвышерасполагаетсяописание вызывающейеефункции, аниже— вызываемыхей.
Столбцысодержатследующее(слеванаправо): индекс(index, он естьтольковпервичнойстрокеиничегонезначит); процентвремени, уходящийнавыполнениефункции(% time); количествовремени, затрачиваемоенаеевыполнениевсекундах(self); количество времени, затрачиваемоенавыполнениефункцииивсехвызываемыхеюфункций(children); количествовызововфункции(called) иееимя(name). Графвызововоказываетсяоченьполезен, для оптимизациичужогокода: cтановятсявиднынетолькоузкиеместа программы, ноилогикаееработы, котораяможетбытьнеочевидна приизученииисходников.
GNUCoveragetestingtool
Кромеgprof, компиляторGCC имеетвсвоемсоставеещеодин инструментпрофилирования, которыйпозволяетполучитьболее детальныйотчетовыполненииприложения. Утилитаназывается gcov ипредназначенадлягенерациитакназываемогоаннотированногоисходногокода, которыйнапротивкаждойстрокисодержит количествоееисполнений.
Этоможетпонадобитьсядляболееглубокогоизученияпроблем приложения, когдафункции, виновныев«тормозах», найдены, асутьпроблемытакиостаетсянеясна(например, непонятно, какаястрокавмногократновложенномциклевнутридлиннющей функциинесетответственностьзааномальноепадениепроизводительности). Gcov неможетполагатьсянастатистику, генерируе-
муюприложениемприсборкесфлагом'-pg', итребуетпересборкис флагами'-fprofile-arcs' и'-ftest-coverage':
$ CFLAGS='-fprofile-arcs -ftest-coverage'
./configure && make
Далееприложениенеобходимозапустить:
$ ./gzip ~/ubuntu-10.10-desktop-i386.iso
Длякаждогофайлаисходногокодабудетсгенерированграфвызовов, наосновекоторогоможносоздатьподготовленныйдлячтения человекоманнотированныйисходник:
$ gcov deflate.c
File 'deflate.c'
Lines executed:76.98% of 139 deflate.c:creating 'deflate.c.gcov'
Полученныйврезультатефайлсостоитизтрехколонок: количествоисполненийстроки, номерстрокиисамастрока. Приэтомдля строк, несодержащихкода, впервойколонкебудетстоятьзнак минуса, адлястрок, ниразуневыполненных— последовательность шарпов: #####.
GooglePerformanceTools
Google Performance Tools (сокращенноGPT) — эторазработка сотрудниковGoogle, предназначеннаядляпоискаутечекпамятии узкихместприложений. Какиgprof, GPT неявляетсявнешнейпо
Чтобыпроизвестипрофилированиевручную, достаточнопоместить вызовыстандартнойPOSIX-функцииgettimeofday() вокругвсехнуждающихсявпрофилированиифункций, азатемвычестьзначение, полученноепослевызовафункции, иззначения, полученногодоее вызова. Результатомбудетдлительностьисполненияфункции.
082 |
XÀÊÅÐ 02 (145) 2011 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Рис.4 Таблица, генерируемая GPT, очень похожа на таблицы gprof
отношениюктестируемомуприложениюпрограммойизаставляет егосамостоятельновестистатистикусвоегоисполнения. Однакоиспользуетсядляэтогоневнедренныйнаэтапесборки
приложениякод, абиблиотеки, которыемогутбытьприлинкованык приложениювовремясборкиилиподключеныпризапуске. Всего разработчикамдоступнодвеподключаемыхбиблиотеки: tcmalloc (которая, поуверениюавторовGPT, представляетсобойсамую быструюнасветереализациюфункцииmalloc, атакжепозволяет производитьанализтого, какпамятьрасходуется, выделяетсяи течет) иprofiler, генерирующаяотчетовыполнениипрограммы, наподобиеgprof. Такжевкомплектвходитутилитаpprof, предназначеннаядляанализаивизуализациинакопленныхданных. Исходныйкод, атакжеrpm- иdeb-пакетывсегоэтогонабора доступнынаофициальнойстраничке(code.google.com/p/googleperftools), однакоябынесоветовалзаморачиватьсясручнойустановкой, таккакнабордоступенвстандартныхрепозиторияхFedora иUbuntu, иегоможноустановитьоднойпростойкомандой:
$ sudo apt-get install google-perftools \ libgoogle-perftools0 libgoogle-perftools-dev
Далееприступаемкпрофилированию. Легчевсегоэтосделать, простоподсунувнужнуюбиблиотекупрямововремязапускапрограммыспомощьюLD_PRELOAD:
$ LD_PRELOAD=/usr/lib/libprofiler.so.0.0.0 \ CPUPROFILE=gzip-profile.log ./gzip \ /home/j1m/ubuntu-10.10-desktop-i386.iso
Однакосамигугловцынесоветуютприменятьэтотметод(очевидно из-запроблемспрограммами, написанныминаC++), рекомендуя линковатьбиблиотекувовремясборки. Чтож, небудемспорить.
Дляэкспериментоввозьмемвсетотжеgzip иповторнопересоберемего, слинковавбинарникснужнойбиблиотекой:
$ cd ~/gzip-1.3.3 $ make clean
$ ./configure
$ LDFLAGS='-lprofiler' ./configure && make
Теперьgzip вновьготоввестилогсвоегоисполнения, нонебудет делатьэтогопоумолчанию. Чтобыактивироватьпрофайлер, необходимообъявитьпеременнуюокруженияCPUPFOFILE иприсвоить ейпутьдофайлапрофиля:
$ CPUPROFILE=gzip-cpu-profile.log ./gzip \ ~/ubuntu-10.10-desktop-i386.iso
PROFILE: interrupts/evictions/bytes = 4696/946/91976
Какивслучаесgprof, получившийсяотчетимеетбинарнуюформу иможетбытьпрочитантолькосиспользованиемспециальной утилиты. ВGPT еерольвыполняетperl-скриптpprof (вUbuntu во избежаниепутаницысдругойодноименнойутилитойонпереиме- нованвgoogle-pprof), которыйгенерируетнетолькотаблицыи аннотированныеисходникинаманерgcov, ноивизуальныеграфы вызовов. Существует11 типоввыводаэтойутилиты, закаждым закрепленсоответствующийаргументкоманднойстроки:
1.Текстовый(--text) — таблица, подобнаявыводуgprof;
2.Callgrind (--callgrind) — выводвформате, совместимомсутили-
тойkcachegrind (изпакетаvalgrind);
3.Графический(--gv) — графвызовов, немедленноотображаемый наэкране;
4.Листинг(--list=<regexp>) — аннотированныйлистингуказанной функции;
5.Дизассемблированныйлистинг(--disasm=<regexp>) — аннотированныйдизассемблированныйлистингуказаннойфункции;
6.Символьный(--symbols) — листингдекодированныхсимвольных имен;
7.Графическийфайл(--dot, --ps, --pdf, --gif) — графвызовов, сохраняемыйвфайл;
8.Сырой(--raw) — подготовкабинарногофайлапрофилякпередачепосети(перекодируетсяспомощьюпечатаемыхсимволов). Наибольшийинтересдлянаспредставляюттекстовый('--text') и графический('--gv') типывызовов. Толькоонимогутдатьполную
XÀÊÅÐ 02 (145) 2011 |
083 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
|
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|||
w Click |
to |
BUY |
|
|
|
|
|
UNIXOID |
|||
|
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Рис.5 Граф, генерируемый GPT, очень прост и нагляден
информациюовыполненииприложенияивсехегопроблемных местах. Текстовыйвыводгенерируетсяследующимобразом:
$ google-pprof --text ./gzip gzip-cpu-profile.log
Каквиднонаскриншоте4, выводпредставляетсобойтаблицус перечислениемвсехфункцийизатратнаихисполнение. Напервый взглядонакажетсяоченьпохожейнатаблицу, генерируемуюутилитойgprof, ноэтонетак. Будучивсеголишьбиблиотекой, GPT не можетвестистатистикуисполненияпрограммытакжедетальнои точно, какэтоделаеткод, внедренныйпрямовприложение. Поэтомувместозаписивсехфактоввызоваивыходаизфункций (поведениепрограммы, собраннойсфлагом'-pg'), GPT применяет метод, называемыйсэмплированием. Сторазвсекундубиблиотека активируетспециальнуюфункцию, взадачикоторойвходитсбор данныхотом, вкакойточкевтекущиймоментпроисходитвыполнениепрограммы, изаписьэтихданныхвбуфер. Позавершению работыпрограммыизэтихданныхформируетсяизаписываетсяна дискпрофильныйфайл. Именнопоэтомуввыводеpprof нетинформацииотом, сколькоразфункциябылавызваназавремяработы программы, илисколькопроцентоввремениушлонаееисполнение. Вместоэтогодлякаждойфункцииуказываетсяколичество проверок, вовремякоторыхбыловыяснено, чтовданныймомент программазанималасьисполнениемэтойфункции. Поэтомуколичествопроверок, приведенноедлякаждойфункции, можносмело считатьзаобщеевремяееисполнения.
Вовсемостальномтаблицасильнонапоминаетвыводgprof: пофункциинастроку, попоказателюнастолбец. Всегостолбцовшесть:
1.Количествопроверокдляданнойфункции;
2.Тожечисловпроцентахотобщегоколичествапроверок;
3.Процентпроверокнавсеостальныефункциипрограммы;
4.Количествопроверокдляданнойфункцииивсехеепотомков;
5.Тожечисловпроцентахотобщегоколичествапроверок;
6.Имяфункции.
Поначалутакойподходкизмерениювремениисполнениякажется слишкомнеточным, ноеслисравнитьтаблицы, полученныеспомощьюgprof, стаблицамиpprof, становитсяясно, чтоонипоказывают
одинаковуюкартину. Болеетого, GPT позволяетизменитьколичествопроверокнасекундувремениспомощьюпеременнойокружения CPUPROFILE_FREQUENCY, такчтоточностьможноувеличитьв десять, стоилитысячураз, еслитоготребуетситуация(например, еслинеобходимопрофилироватьисполнениеоченьнебольшой программы).
НесомненнымдостоинствомGPT передgprof являетсяумение представлятьинформациювграфическомвиде. Дляактивации этойфункцииpprof следуетзапускатьсфлагом'--gv' (кстати, для показаграфабудетиспользованаодноименнаяутилита):
$ google-pprof --gv ./gzip gzip-cpu-profile.log
Генерируемыйврезультатевыполненияэтойфункцииграфвызовов функцийоченьнаглядныйигораздоболеепростойдлявосприятияиизучения, чеманалогичныйтекстовыйграф, генерируемый командойgprof. Имяистатистикаисполнениякаждойфункции размещенывпрямоугольниках, размеркоторыхпрямопропорционаленколичествувремени, затраченномунаисполнениефункции. Внутрипрямоугольникаразмещеныданныеотом, скольковремени ушлонаисполнениесамойфункциииеепотомков(времяизмеряетсявпроверках). Связимеждупрямоугольникамиуказывают наочередностьвызовафункций, ачисловыезначения, указанные рядомсосвязями— навремяисполнениявызываемойфункциии всехеепотомков. ЕщеоднодостоинствоGPT заключаетсявспособностииспользоватьразныеуровнидетализациидлявыводаданных, позволяяпользователюсамомувыбиратьединицыдробления. Поумолчаниювкачестветакойединицыиспользуетсяфункция, поэтомулюбойвыводpprof логическиразделеннафункции. Однакоприжеланиивкачествеединицыдробленияможноисполь- зоватьстрокиисходногокода(аргумент'--lines'), файлы('--files') илидажефизическиеадресапамяти('--addresses'). БлагодарятакойфункциональностиGPT оченьудобноиспользоватьдляпоиска узкихмествбольшихприложениях, когдасначалатыанализируешь производительностьнауровнеотдельныхфайлов, затемпереходишькфункциями, наконец, находишьпроблемноеместонауровне исходногокодаилиадресовпамяти.
084 |
XÀÊÅÐ 02 (145) 2011 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
||||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
||
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
-x cha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис.6 Valgrind с плагином callgrind
Ипоследнее. Какяговорилвыше, GPT — этонетолькохороший профайлер, ноиинструментдляпоискаутечекпамяти, поэтомуу негоестьодинприятныйпобочныйэффектввидеспособностик анализупотребленияпамятиприложением. Дляэтогоприложение должнобытьсобраноилизапущеносподдержкойбиблиотеки tcmalloc, авпеременнуюHEAPPROFILE записанадресдляразмещенияпрофильногофайла. Например:
$ LD_PRELOAD=/usr/lib/libtcmalloc.so.0.0.0 \ HEAPPROFILE=gzip-heap-profile.log \
./gzip ~/ubuntu-10.10-desktop-i386.iso Starting tracking the heap
Dumping heap profile to gzip-heap-profile.log.0001. heap (Exiting)
Кполученномуфайлубудетдобавленоокончание0000.heap. Еслинатравитьнаэтотфайлутилитуpprof иуказатьфлаг'--text', онавыведетнаэкрантаблицуфункцийиуровеньпотребления памятикаждойизних. Столбцызначатвсетожесамое, чтоив случаеобычногопрофилирования, стемисключением, чтовместо количествапроверокиихпроцентныхотношенийтаблицатеперь содержитколичествопотребляемойпамятиипроцентотобщего потребленияпамяти.
Принеобходимостиэтуинформациюможнополучитьвграфическомвиде, атакжеизменитьединицыдробления. Библиотекаможет бытьнастроенаспомощьюразличныхпеременныхокружения, наиболееполезнаяизкоторыхноситимяHEAP_PROFILE_MMAP. Онавключаетпрофилированиедлясистемноговызоваmmap (по умолчаниюGPT собираетстатистикутолькодлявызововmalloc, calloc, realloc иnew).
Онимеетмодульнуюархитектуру, котораястечениемвремени позволилаемуобрастинесколькимиплагинами, неотносящимися напрямуюкотладке. Всеготакихплагинатри:
1.Cachegrind — позволяетсобиратьстатистикупопопаданию данныхиинструкцийпрограммывкэшпервогоивторогоуровней процессора(мощныйисложныйинструмент, которыйполезенпри выполнениипрофилированиянизкоуровневогокода).
2.Massif — профайлеркучи, схожийпофункциональностисаналогомизпакетаGPT.
3.Callgrind — профайлер, вомногомпохожийнатаковойвgprof иGPT. ПоумолчаниювкачествеосновногоплагинаValgrind использует memcheck (отладчикпамяти), поэтомудляегозапускаврежиме профилированиянеобходимоуказатьнужныйплагинвручную. Например:
$ valgrind --tool=callgrind ./program
Послеэтоговтекущемкаталогебудетсозданфайлсименемcallgrind. out.PID-программы, которыйможнопроанализироватьспомощью утилитыcallgrind_annotate илиграфическойпрограммыkcachegrind (устанавливаетсяотдельно). Янебудурасписыватьформатгенерируемыхэтимипрограммамиданных(онхорошопредставленв одноименныхman-страницах), скажулишь, чтоcallgrind_annotate лучшезапускатьсфлагом'--auto', чтобыонсмогсамостоятельно найтифайлыисходныхтекстовпрограммы. Дляанализарасхода памятиValgrind следуетзапускатьсаргументом'--tool=massif'. После чеговтекущемкаталогепоявитсяфайлmassif.out.PID-программы, которыйможетбытьпроанализированспомощьюутилитыms_print. Вотличиеотpprof, онаумеетвыводитьданныенетольковвидестандартнойтаблицы, ноигенерироватькрасивыеascii-art графики.
ПарасловоValgrind
ВпоследнейчастистатьимыкраткорассмотримспособыиспользованияинструментаValgrind дляпрофилированияприложений. Valgrind — этооченьмощныйотладчикпамяти, которыйспособен найтитакиеошибкиработыспамятью, окоторыхдругиеутилиты даженеподозревают.
XÀÊÅÐ 02 (145) 2011
Выводы
Такиеинструменты, какgprof, gcov иGPT, позволяютпровести анализработыприложенияивыявитьвсеегоузкиеместавплоть доотдельнойпроцессорнойинструкции, аподключивкпроцессу профилированияещеиValgrind, можнодобитьсяудивительных результатов. z
085
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
||||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
r |
|
|
|
||||
P |
|
|
|
|
|
NOW! |
|
o |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
w Click |
to |
BUY |
|
|
|
|
|
|
|
|
UNIXOID |
|
||||
|
|
|
|
|
|
|
m |
|
Евгений Зобнин zobnin@gmail.com |
|||||||
|
|
|
|
|
|
|
|
|
||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
|
|
||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Максимальный
минимум
Создаемгиковыйдесктопизподручныхматериалов
Современные дистрибутивы Linux чрезмерно дружелюбны к новичкам и совершенно неэффективны в повседневном использовании. Следуя же нашим инструкциям, ты получишь минималистическое, быстрое и удобное окружение рабочего стола, как у многих гиков.
Устанавливаем дисплейныйменеджер
Первыйшагнапутикновомудесктопу— установкадисплейного менеджера(DM), взадачикотороговходитформированиеграфическогоокнасполямидлявводаимениипароля, атакжезапусквсех остальныхкомпонентовDE.
НаиболеепродвинутыеиудобныеDM распространяютсявкомплекте спопулярнымидесктопнымисредами, такимикакKDE иGnome, нов силусвоейраздутостииадскогоколичествазависимостейдлянашего минималистичногодесктопаониподходятплохо. Поэтомуявыбрал легкийиудобныйдисплейныйменеджерSLiM (Simple LogIn Manager). SLiM доступенвосновномрепозиторииUbuntu, поэтомуеголегко установитьспомощьюлюбогоapt-клиента. Входеустановкинеоб-
ходимосогласитьсяспредложениемсделатьSLiM менеджеромпо умолчанию. Какой-либодополнительнойнастройкинетребуется, но дляудобствалучшеизменитьнесколькострокконфигурационного файла. Открываем/etc/slim.conf, находимвсамомначалеопцию default_path идобавляемвконецеезначенияследующуюзапись (опцииизначенияразделеныпробелом):
:/sbin:/usr/sbin:/usr/local/sbin
Этастрокапозволитиспользоватьадминистративныекоманды внутриDE. Далеенаходимопциюsessions иуказываемвкачестве еезначениястроку"default,awesome,xterm". Такунасбудетвсего тритипасессии: прошлая, менеджероконawesome иголыйxterm (вместокучиразличныхWM).
086 |
XÀÊÅÐ 02 (145) 2011 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Выбираем менеджерокон
Менеджерокон— ключевойкомпонентлюбогорабочегостола. Отеговыборазависитнетолькото, какбудет выглядетьтвойдесктоп, ноимножестводругиххарактеристик: способрасположенияоконнаэкране, наличие илиотсутствиепанелей, системыменю, возможностизаскриптоватьдействия, поддержкастандартов freedesktop, наличиетреяимногоедругое. Большинствосовременныхменеджеровоконпохожи
другнадругаипредлагаютпользователюсходныйфунк-
ционал. Fluxbox, windowmaker, kwm, compiz иогромное количестводругихWM реализуютоднуитужемодель перекрывающихсяокон, болеетридцатилетназад предложеннуюкомпаниейXerox. Междутеммногие пользователиужедавнозаметили, чтомодельнеперекрывающихсяокон(каждоеизкоторыхрастягиваетсяна вседоступноепространствоэкрана) гораздоболееудобна длявосприятияинформациииуправленияокнами. Менеджерыокон, реализующиетакуюмодель, называются тайловыми(отанглийскогословаtail — плитка, черепица). Онинестольпопулярны, какостальные, нопо-настоящему ценятсявсредегиков. Всегосуществуетоколодесятка тайловыхWM, средикоторыхестькаксовершенноминималистичные(например, ratpoison иdwm), такиочень функциональные(ion3, awesome). Болеетого, бытьтайловымумеетдажеменеджероконkwm (начинаясKDE 4.5). Длягиковскогорабочегостолаявыбралменеджерокон awesome. Онфункционаленинастраиваем, имеетвсенеобходимоедляжизни, включаяпанельуправления, меню итрей, носамоеглавное— awesome способенработатьв разныхрежимах, начинаяотклассического(стандартные перекрывающиесяокна) изаканчиваядесяткомрежимов снеперекрывающимисяокнами. Какивсеостальное, awesome доступенврепозиторииUbuntu, поэтомуего можноустановитьспомощьюapt-get:
$ sudo apt-get install awesome awesome-extra
Пакетawesome-extra содержитдополнительныемодули awesome, онинампонадобятсяпринастройке, которую мыпроизведемводномизследующихразделов.
Настраиваемэмулятор терминала
ТруднопредставитьсебеUNIX-десктопбезэмулятора терминала, агиковыйдесктоп— темболее. Ниодинпро-
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Так выглядит slim, простой и быстрый дисплейный менеджер
двинутыйпользовательиднянепроживетбезтерминала, наборасамопальныхскриптовиmc, поэтомуквыбору заменыxterm нужноподходитьсовсейсерьезностью.
Существуетмассаразличныхэмуляторовтерминалов, однаконаиболееудобнымвиспользованииинепритязательнымксистемнымресурсамясчитаютерминал rxvt-unicode. Онумеетвсе, чтотолькоможетпотребоватьсяоттерминала, ипочтинеимеетзависимостей. Кроме того, нампонадобитсявнятныймоноширинныйшрифт, удобочитаемыйинережущийглаз. Наэтурольлучшевсего подходитклассическийконсольныйшрифтterminus, уже многиегодывосхваляемыйUNIX-старожилами. Устанавливаемнеобходимыекомпоненты, плюс(во избежаниепутаницы) удаляемвсеостальныеэмуляторы терминалаизсистемы:
$ sudo apt-get install rxvt-unicode \ xfonts-terminus
$ sudo apt-get remove xterm gnome-terminal
Создаемфайл~/.Xdefaults ипишемвнегонастройки:
$ vi ~/.Xdefaults
!Для совместимости прикидываемся xterm URxvt*termName: xterm
!Желтый ненавязчивый фон URxvt*background: #e0e0ac
!Черные буквы
URxvt*foreground: Black
!Отключаем скроллбар URxvt*scrollBar: false
!Небольшой отступ от краев окна для лучшего восприятия
URxvt*internalBorder: 5
!Наш шрифт
URxvt.font: xft:Terminus:size=14
Все. Осталосьтолькоустановитьменеджерсетевых подключений, иможносчитать, чтокаркасбудущего десктопаготов.
Менеджерсетевых подключений
Безинтернетажитьнельзя, поэтомумыдолжныразобратьсястем, каксобираемсякнемуподключаться. По умолчаниювUbuntu установленменеджерсоединений NetworkManager, нопослепереездавсобственныйDE
INFO |
info
• Предложенный в статье интерфейс как нельзя лучше подходит для нетбуков, на экранах которых многооконный (да еще и управляемый
мизерным тачпадом) интерфейс выглядит несколько странно.
•Особенно удобным браузер uzbl становится после активации механизма подписи ссылок, который доступен по команде fl (fl* — отключить). После его включения напротив каждой ссылки появляется число, введя которое, ты попадешь на адресуемую ссылкой страницу.
•Браузер uzbl можно безгранично расширять с помощью скриптов,
большое количество которых можно найти на страничке www. uzbl.org/wiki/scripts.
•В любой момент тему GTK-приложений можно поменять с помощью программы gtk- theme-switch (дополнительные темы находятся
в пакетах gtk2-en- gines-*).
HTTP://WWW
links
•awesome.naquadah. org/wiki/User_Contributed_Widgets
— виджеты для awesome;
•awesome.naquadah. org/wiki/Beautiful_themes — темы для awesome.
XÀÊÅÐ 02 (145) 2011 |
087 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
|
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|||
w Click |
to |
BUY |
|
|
|
|
|
UNIXOID |
|||
|
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
Три эмулятора терминала в режиме тайлинга
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Три окна и классический режим их расположения
переднамивстанетвыбор, продолжатьлииспользоватьего, поменятьнадругойилинастраиватьвсевручную.
Япредлагаюостановитьсянаменеджереподключенийwicd, который мнекажетсяболееудобнымистабильным, актомужеимеетконсольныйинтерфейс. Установимего, заодноудаливNetworkManager:
$ sudo apt-get remove network-manager
$ sudo apt-get install wicd wicd-curses wicd-cli
Установщикавтоматическипропишетwicd вавтозапуск, поэтому послеперезагрузкинамостанетсятолькозапуститьклиент.
Собираемвсевместе
Теперьунасестьчетыреосновныхкомпонентарабочегостола, поэтомумыужеможемначатьегоиспользовать. Прощевсего этосделать, простоперезагрузивмашину. Послеэтогонаэкране
должнопоявитьсяокноslim. Нажимаем<F1> (чтобывыбратьсессию awesome), вводимимяипароль. Наэкранепоявитсяawesome в своемдефолтовомвиде(смотрискриншот).
Начинаеммедитировать. Строкасверху— этостатус-бар, егозадача— показыватьтекущеесостояниеменеджераокониуправлятьим(несмотрянаориентированностьнаклавиатурноеуправление, awesome можно контролироватьспомощьюмыши). Квадратныйзначоксеголевойстороны— стандартнаякнопкаменю, спомощьюкоторойможнозапускать приложенияиуправлятьWM. Менюможновызватьбезиспользования мыши, простонажавкомбинацию<Win+W>. Последовательностьцифр от1 до9, расположеннаясразузакнопкойменю— этотакназываемые теги, аналогивиртуальныхрабочихстоловвдругихWM. Междуними можнопереключатьсямышкойиликомбинацией<Win+номер>. С правойсторонырасположениндикатортекущейраскладкиокон(онем
мыпоговоримчутьпозже), передним— часы, апередчасами— трей(он невиден, покавнегонебудетсвернутоприложение). Междусписком теговитреемрасполагаетсястандартныйтаск-лист, показывающийоткрытыевданныймоментокна(приложения). Самиприложенияможно запускатьтремяразнымиспособами:
1.Черезменю;
2.Спомощьюгорячихклавиш(например, комбинация<Win+Enter> запускаеттерминал);
3.Черезстрокузапуска, доступнуюпонажатию<Win+R> (аналогокна запускапо<Alt+F2> вдругихWM, появляетсяпрямовстатус-баре, рядомсоспискомтегов, поддерживаетисториюиавтодополнение). Переключениемеждуприложениямисоднимтегом(тоестьрасположенныминаодномвиртуальномрабочемстоле) осуществляетсяспомощьюкомбинаций<Win+J> (вперед), <Win+K> (назад) и <Win+Tab> (междудвумяпоследними).
Поумолчаниюawesome работаетвклассическомрежиме, позволяя таскатьокнапоэкрануинакладыватьихдругнадруга. Однаковсеизменитсяпосленажатиякомбинации<Win+пробел>, котораяпереведет менеджероконвтайловыйрежим: всеокнаокажутсянаэкране, деля егомеждусобой.
Еслиокноодно— онозайметвесьэкран, дваокнаподелятэкраннадве частиповертикали, три— натричастиитакдалее. Awesome умеетрасполагатьокнаболеечемдесяткомразличныхспособов, переключаться междукоторымиможноспомощьюкликапоиндикаторураскладкив правойсторонестатус-бара(левыйклик— вперед, правый— назад), либоспомощьювсетойжеклавиатурнойкомбинации<Win+пробел> (вперед) или<Win+Shift+пробел> (назад). Оченьтруднообъяснить различиямеждувсемираскладками, поэтомурекомендуюхорошенько поэкспериментировать. Добавлюлишь, чтонаиболеепрактичнымия считаютриизних:
1.Плавающиеокна. Перваяидефолтоваяраскладка. Реализуетмодель обычныхперекрывающихсяокон, которыеможноспокойнотаскатьпо экрануспомощьюкомбинации<Win+леваякнопкамыши>, изменять размерспомощью<Alt+праваякнопкамыши> инакладыватьдругна друга. Идеальноподходитдлямногооконныхприложений(такихкак gimp) идлялюдей, которыенемогутпривыкнутьктайлингу.
2.Первыйслева, всеостальныесправа. Втораяпосчетураскладка, онаоченьудобнадляоткрытиямножестватерминалов(водномtop, в другомbash, втретьем— irc-клиентитакдалее).
3.Всеокнанамаксимум. Третьясконцараскладка, котораяраспахиваетвсеоткрытыеокнанаполныйэкран(оникакбыналоженыдругна друга). Оченьудобнадлязапускабольшихграфическихприложений, требующихмногопространства: браузеры, mail-клиенты, редакторы, таблицыипрочие.
088 |
XÀÊÅÐ 02 (145) 2011 |