Записки дебианщика
The following are the titles of recent articles syndicated from Записки дебианщика
Add this feed to your friends list for news aggregation, or view this feed's syndication information.

LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.

[ Next 20 >> ]
Monday, March 18th, 2013
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
1:01 am
Закрытие Google Reader: альтернативы и что теперь делать
Не так давно Google объявил о том, что сервис Google Reader будет закрыт 1 июля 2013 года, а всем до того счастливым пользователям предлагается забрать свои данные из Google Takeout и идти к чёртовой матери. На сохранение своих данных отведено время до Июля и оставлена возможность вытащить свои данные через Google Takeout.


Альтернативы Google Reader

Закрытие Google Reader это, конечно, очень грустно, но свято место пусто не бывает, и свои RSS-фиды можно экспортировать в OPML и загрузить куда-нибудь ещё. Автор потратил это утро на пляски с бубном вокруг вебдваноля и решил выложить итоги.

Надо сказать, что небо от решения Google прикрыть Reader не упало на землю, хотя точно добавило геморроя пользователям. Хорошие новости: Google Reader может экспортировать все ваши RSS-подписки через OPML (генерирует XML-файл), который может быть загружен на аналогичные [netvibes.com] сервисы [newsblur.com] чтения RSS [feedly.com].

Мы имеем следующие альтернативные бесплатные веб-сервисы:
  • Netvibes:: богат настройками, можно импортировать\экспортировать RSS-фиды через OPML, поддержка организации фидов в категории, есть возможность просмотра на смартфонах через специальный веб-сайт.
  • Feedly:: расширение для Firefox и приложение для iOS и Android. Пытается сделать их ваших RSS-фидов журнал, что в целом удаётся на броузере, но выглядит дико на смартфонах.
  • Flipboard:: ещё одна попытка сделать журнал из RSS-фидом, есть приложения для iOS и Android hinges.
  • Pulse:: веб-сервис, который пытается организовать ваши RSS-фиды в виде плиток. Есть приложения для Android и iOS.
  • NewsBlur:: сервис, который упирает на обновление RSS-фидов в реальном времени, есть приложения для iOS и Android. Бесплатный сервис имеет ограниченный (если не сказать хуже) функционал. 
  • ... и другие сервисы, перечисленные на ресурсе ReplaceReader.
Для тех, кто успел привыкнуть к Google Reader, Feedly покажется знакомым, хотя его судьба после закрытия Google Reader выглядит несколько туманно. Netvibes требует некоторых усилий, чтобы выкинуть оттуда весь социальный хлам и привести всю интерфейсную кашу в порядок. Функции NewsBlur в бесплатном варианте ограничены, и больше напоминают Demo-версию.

Для настоящих мужиков, которые всё любят делать сами, есть:
  • GNUS for RSS feeds: расширение для EMACS, со всеми вытекающими от сюда радостями и прелестаями. Можно настроить на любой вкус.
  • Tiny Tiny RSS: веб-приложение в стиле "сделай сам", которое требуется устанавливать самостоятельно на хостинг. Есть попытка сделать приложение для Android. Инструкция для джигитов о том, как всё это сконпелять и запалить на OpenShift своими руками.
Ниже приведён итог небольшого путешествия по вебдванолю в виде Netvibes и Feedly, но сначала...

Забираем RSS-подписку из Google Reader

Сначала мы забираем свои фиды из Google Reader. Это можно сделать с помощью Google Takeout:
  1. заходим на сайт Google Takout
  2. Нажимаем ``Создать Архив'' для экспорта RSS-подписок в ZIP-файл.
  3. Распаковываем zip-файл и находим там subscriptions.xml, в котором хранятся наши подписки.
Того же эффекта можно добиться и из самого Google Reader:
  1. Заходим в Google reader http://www.google.com/reader
  2. В настройках (серая шестерёнка справа) выбираем вкладку Import/Export
  3. Загружаем архив с подписками, распаковываем zip-файл и находим там subscriptions.xml.
Всё, наши RSS-подписки теперь с нами, и теперь идём тестировать другие сервисы.

Переход из Google Reader на Netvibes

Теперь, когда XML-файл с RSS-подписками в наших руках, мы можем загнать его в другие сервисы. Netvibes предлагает сходный интерфейс:


Теперь для импорта своих RSS-фидов делаем следующее::
  • регистрируемся на Netvibes, если это ещё не сделано.
  • Заходим на Netvibes и нажимаем "Add content" вверху экрана (см. скриншот выше)
  • далее жмём на "Add a feed". Но нам не нужен новый фид, так как мы хотим импортировать всё сразу. Не беда - чуть ниже строки с адресом фида есть ссылка "OPML: Import" - жмём её.
  • Выбираем файл с нашими RSS-фидами, которые мы скачали из Google Reader, то есть subscriptions.xml.
  • Немного ждём, пока веб-сервис прожуёт наши фиды.
Теперь, у Netvibes есть два режима работы: Reader и Widget, которые можно переключать. В режиме Widget каталоги с фидами будут вверху, а отдельные фиды будут чуть ниже в виде прямоугольников с непрочитанными постами:


Другой режим, Reader, больше похож на Google Reader, где каталоги с фидами слева, а сами посты - справа в виде строчек:


Просто, функционально и со вкусом.

Мобильный интерфейс

Немного дёгтя в бочку с мёдом: нативного приложения для iOS или Android у Netvibes просто нет. Зато есть специализированные веб-сайты, заточенный под мобильные устройства:
Заходим на эти сайты, в зависимости от вашего смартфона, через броузер в смартфоне\планшете, и читаем. Выглядит неплохо:


Соответственно, количество непрочитанных постов показывается слева в виде чисел. Интерфейс выглядит несколько спартански, но тем не менее весьма функционально.

 

Переход из Google Reader на Feedly

Feedly это расширение для броузеров (для Chrome, Chromium и Firefox) и  приложение для Android и iOS, которые тягают Google Reader. В будущем, когда Google Reader закроют, они обещают простой переход на их собственные мощности:
When Google Reader shuts down, feedly will seamlessly transition to the Normandy back end. So if you are a Google Reader user and using feedly, you are covered: the transition will be seamless.
Так как Feedly представляет собой плагин для Firefox (и не только), то установка сравнительно проста:
После этого в браузере появится зелёная кнопка рядом со строкой адреса, нажав на которую мы перейдём на страницу с фидами.

У Feedly есть много настроек, и по умолчанию Feedlу попробует сделать из ваших фидов некое подобие журнала:


У автора этих строк при взгляде на этот праздник жизни начался приступ морской болезни от передозировки вебдваноля :-) Особенно учитывая Featured заголовок (это, кстати, реальная газета - Northen Territory News).

Хорошо, что режимов просмотра у Feedly несколько: режим Latest более походит на Google Reader:


В настройках можно сделать этот режим по умолчанию.

Мобильный интерфейс

Приложения для iOS и Android у Feedly есть, хотя... В общем, то приложение для Android, которое я тестировал на своём смартфоне, работает, скажем мягко, не слишком впечатляюще. Вот как выглядит режим Latest на смартфоне:



При том, что диагональ экрана 4.7", умещается всего шесть постов. Интерфейс Greader для смартфонов намного более продуман, хотя о вкусах не спорят.

Настройки Feedly в смартфонной версии открываются при прокрутке вправо:


Хотя Android-приложение ещё очень сырое и медленное, пользоваться им можно, после некоторого привыкания к интерфейсу.


Чтение RSS-фидов на смартфоне

Здесь стоит отметить очень простую и бесплатную, но тем не менее пригодную для пользования программу Sparse RSS. Спартанский интерфейс, минимализм, граничащий с мазохизмом, и поддержка загрузки через OPML с карты памяти - вот, собственно, и всё:


То есть загружаем XML-файл со своими RSS-фидами на карту памяти и импортируем это в Sparse RSS. Просмотр только в текстовом виде - собственно, опенсорц как он есть.

Альтернатива - Android-приложение gReader, которое выглядит куда более фукнциаонально:


Здесь есть полноценный просмотр и синхронизация фидов, и RSS-фиды можно читать в том числе offline:



Разработчики намекают, что Android-приложение gReader будет работать и после закрытия google reader:
gReader will work after the closure. We are working on a solution.
А пока можно пользоваться и искать другие альтернативы.


Чтение RSS-фидов на Linux-десктопе

Для десктопа есть отдельные приложения, которые позволяют читать RSS-ленты, импортируя подписки через OPML. Выглядит достойно:


Занимая немногим больше 5 Мегабайт и присутствуя в репозиториях любого уважающего себя дистрибутива, Liferea умеет работать как самостоятельно, так и в связке с Google Reader и Tiny Tine RSS. Можно скачать отсюда и собрать самому.

Вместо заключения

Эта краткая заметка ни в коем случае не есть исчерпывающий обзор, а просто делёж опытом по поиску сколько-нибудь вменяемых альтернатив Google Reader. Желающие поделиться своими находками, всячески приветствуются в комментариях.

Ещё можно подписать петицию в суд высшей справедливости на сайте Change.org в защиту Google Reader. Автор присоединился к 126000 подписавшимся.
Image
Sunday, March 3rd, 2013
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
9:02 pm
ЛаТеХ для продвинутых: Как контролировать положение плавающих объектов "floats"?
О плавающих объектах (например, картинках) в ЛаТеХе написано много книжек, статей, блогов, заметок, и т.д. Тем не менее вопросы вроде: "Почему я поставил там [!h], а ЛаТеХ всё равно засунул картинку на последнюю страницу?", — наверняка войдут в горячую десятку любого ЛаТеХ-форума. Причина этого проста: механизм размещения плавающих объектов (floats) довольно сложен и отнюдь неинтуитивен. Его описания же в основном рассчитаны на докторов физ-мат наук, решивших посвятить остаток своей жизни разборкам с ЛаТеХом. В этом посте я попытаюсь коротко осветить вопрос о том, как можно контролировать расположение плавающих объектов (в качестве примера будут использованны рисунки "figure", но все написанное применимо и к другим floats, например, table). Большая часть поста состоит из рецептов и примеров, исходники которых лежат здесь. Тем не менее, начать придется с небольшого кусочка теории. Итак, ...

Немного теории или "почему ЛаТеХ не делает то, что я хочу?"

Никто не сможет объяснить, как ЛаТеХ помещает флоатс (floats), точнее и лучше, чем сам Франк Миттельбах. Однако поскольку сделал он это на вражеском языке, мы позволим себе здесь повторить коротко его разъяснения.
Когда ЛаТеХ натыкается на плавающий объект в tex-файле, он пытается его немедленно разместить на странице. Страница для ЛаТеХа состоит из двух частей: верхней и нижней. Кроме того, флоат можно поместить "прямо здесь". Да-да, вы уже поняли, что речь пойдёт об этих загадочных буковках "h", "t" и "b" в \begin{figure}[htb]. ЛаТеХ делает следующее:
  1. Если в аргументе в квадратных скобках встречается "h", то ЛаТеХ попытается немедленно поместить плавающий объект.
  2. Если это невозможно, по причинам которые будут объяснены ниже, то ЛаТеХ посмотрит есть ли в аргументе "t". Если да, то он попытается поместить картинку в верхнюю область страницы.
  3. Если уж и тут не вышло, то ЛаТеХ поинтересуется, встречается ли буковка "b". Да? Тогда картинка идет вниз, если это возможно.
  4. В случае, если ничего не получилось, картинка будет помещена в очередь. ЛаТеХ будет пытаться разгрузить эту очередь, как только начнется новая страница. И здесь плевать он хотел на [hbt].
  5. Отдельная песня — это аргумент "p". На него ЛаТеХ обращает внимание только, когда он разгружает очередь после начала новой страницы. Если "есть такая буква в этом слове", то этот плавающий объект может быть размещен на странице без текста с одними только флоатс.
Как вы уже поняли, порядок аргументов ЛаТеХу абсолютно параллелен, то есть [hbt] и [tbh] возымеют абсолютно одинаковый эффект! Если аргументы не указаны, то по умолчанию предполагается [tbp]. Можно или нельзя поместить плавающий объект на текущей странице вверху (или внизу,...) определяется исходя из двух критериев:
  1. максимальное количество флоатс: totalnumber, topnumber, bottomnumber. Параметры эти означают... Ну, вы и сами догадались: максимальное количество флоатс на всей странице, в верхней и в нижней части, по умолчанию, 3, 2 и 1.
  2. размер "верха" и "низа" страницы не должен превышать \topfraction и \bottomfraction доли страницы, соответственно (по-умолчанию, 0.7 и 0.3). Кроме того, доля текста должна быть не менее \textfraction (по-умолчанию, 0.2).
К чему это всё? А к тому, что восклицательный знак ! означает, что эти два правила будут проигнорированны.
Если не предполагается полностью игнорировать все эти правила, то можно изменить значения параметров. Например,
01:  \setcounter{totalnumber}{10}
02:  \setcounter{topnumber}{10}
может пригодиться, если в документе много невысоких картинок. А
01:  \renewcommand{\topfraction}{1}
02:  \renewcommand{\textfraction}{0}
разрешит ЛаТеХу поместить высокую картинку на странице со всего парой строк текста.
Помимо вышеупомянутых параметров, при размещении плавающих объектов используются длины
  1. \textfloatsep — расстояние между флоатс (в верхней или нижней части страницы) и текстом (по умолчанию, около 20pt);
  2. \floatsep — вертикальное расстояние между двумя флоатс (около 12pt);
  3. \intextsep — расстояние между флоатс вставленным "прямо здесь" (параметр h) и текстом (около 12pt);
  4. \abovecaptionskip и \belowcaptionskip — расстояние над и под подписью к флоат.
Их можно изменить, например, так
01:  \setlength{\textfloatsep}{10pt plus 1.0pt minus 2.0pt}
02:  \setlength{\floatsep}{5pt plus 1.0pt minus 1.0pt}
03:  \setlength{\intextsep}{5pt plus 1.0pt minus 1.0pt}
чтобы всунуть больше плавающих объектов на одну страницу.

Каковы последствия алгоритма? Прежде всего, [!h] означает вовсе не "здесь и только здесь", а "здесь, если оно поместится". Точно также, как [!htpb] и [pb!th] означают абсолютно одно и то же. То есть порядок символов, в том числе и вослицательного знака, никакой роли не играет.
Всё, выдыхаем... Дальше пойдут рецепты.

Здесь, здесь, здесь и только здесь.

Об этом уже писал в блоге virens, но повторюсь: параметр [H] всунет плавающий объект именно там, где он встречается в tex-файле. Если флоат не помещается, то будет начата новая страница, оставив, как результат, пустое место на предыдыщей. Не стоит использовать этот параметер без особой надобности. Ну, и не забудьте сначала сказать \usepackage{float}.

A вам нужны эти флоатс?

Вообще говоря, если вы хотите поместить картинку и её подпись "прямо здесь", то вовсе необязательно использовать плавающий объект. Команда \captionof{}{} из замечательного пакета caption позволяет снабдить подписью что угодно. Например, вот такой код
01:  {
02:  \centering
03:  \includegraphics{mypicture}
04:  \captionof{figure}{Подпись к картинке}\label{fig:mypic}
05:  }
вставит картинку и снабдит её подписью. Первый аргумент — тип плавающего объекта, в данном случае, figure, но с таким же успехом могло бы быть table, wrapfigure и т.п.

Пример использования \captionof

"А для чего оно нужно?", — спросишь ты, привередливый читатель. А, например, для вот такого:
01:  ...
02:  \usepackage{array,graphicx,caption}
03:  ...
04:  \begin{tabular}{m{0.45\linewidth}m{0.45\linewidth}}
05:       Here just some text text text text text text text 
06:       text text text text text text text text text
07:       text text text text text text text text text 
08:       text text text text text text text text text 
09:       text text text text text text text text text  
10:      &
11:       \centering
12:       \includegraphics{roman.jpg}
13:       \captionof{figure}{Usage of captionof}\label{fig:intab}
14:  \end{tabular}

Конечно, не стоит злоупотреблять \captionof: в вышеупомянутом примере гораздо лучшей альтернативой является wrapfigure. Более адекватным примером использования \captionof является случай, когда картинку и таблицу надо разместить так, чтобы они гарантированно были друг под другом, т.е. в пределах одного плавающего объекта:
01:  \begin{figure}\centering % В одном флоат...
02:    % сначала картинка...
03:    \includegraphics[width=7cm]{fig/roman_b}
04:    \captionof{figure}{Figure part of the float}\label{fig:fig}
05:  \vspace*{3em}
06:    % потом таблица
07:    \begin{tabular}{ccc}
08:      ...
09:    \end{tabular}
10:    \captionof{table}{Table part of the float}\label{fig:table}
11:  \end{figure}

Сложный пример с \captionof

Примечание: Нетерпеливый читатель может пропустить этот пример без ущерба для понимания последующего текста.
Во своей своей красе \captionof предстаёт в случаях, когда надо разместить несколько картинок в пределах одного плавающего объекта, как, например, на рисунке внизу.
Стоит обратить внимание на выравнивание картинок: (b) и (c) занимают по высоте ровно столько места сколько более высокая картинка (а) слева. Код из этого примера приведен ниже:
01:  ...
02:  \usepackage[labelformat=simple]{subcaption}
03:  % метка subfigure: "(а)" вместо дефолтного "а"
04:  \renewcommand\thesubfigure{(\alph{subfigure})} 
05:  \usepackage{graphicx}
06:  ...
07:  
08:  \newsavebox{\leftpic}
09:  
10:  \begin{figure}[t]\centering
11:  % Левая картинка (а) помещена в бокс, чтобы измерить её высоту
12:  \sbox{\leftpic}%
13:  {% Левая картинка (a):
14:   \begin{subfigure}[b]{0.45\linewidth}\centering
15:     \includegraphics[height=7cm]{fig/roman_a1}
16:     \caption{Subfigure A}\label{fig:2a}
17:   \end{subfigure}%
18:  }
19:   %------------------------
20:   % Вывeсти картинку, сохраненную в боксе
21:   \usebox{\leftpic}
22:   \quad % немного пустого места между левой и правой картинками
23:   % Две правые картинки в минипейдж, 
24:   %   - высота которого равна высоте левой картинки: \ht\leftpic
25:   %   - материал будет растянут вертикально: [s] + \vfill 
26:   \begin{minipage}[b][\ht\leftpic][s]{0.45\linewidth}
27:    \begin{center}
28:     \includegraphics[height=2.5cm]{fig/roman_b}
29:     \captionof{subfigure}{Subfigure B}\label{fig:2b}
30:    \end{center}
31:  
32:    \vfill
33:  
34:    \begin{center}
35:     \includegraphics[height=2.5cm]{fig/roman_c}
36:     \captionof{subfigure}{Subfigure C}\label{fig:2c}
37:    \end{center}
38:   \end{minipage}
39:  \caption{Fancy placement of subfigures}
40:  \label{fig:2}
41:  \end{figure}
Здесь используется пакет subcaption, в котором определено окружение subfigure: оно, по-сути, идентично окружению minipage. Усложняющим фактором является то, что высота левой картинки заранее неизвестна. Поэтому картинка (а) сначала помещена в savebox под именем \leftpic при помощи команды \sbox{\leftpic}. Затем, после того как она выведена на печать с помощью \usebox{}, справа создаётся minipage:
01:  \begin{minipage}[b][\ht\leftpic][s]{0.45\linewidth}
высота которой равна высоте левой картинки (а): \ht\leftpic. Обратите внимание на необязательный аргумент [s] (s=stretch) и \vfill между (b) и (c). Благодаря им между (b) и (c) помещается "растягивающийся вертикальный интервал" таким образом, что картинки (b) и (c) полностью занимают всю высоту minipage.
В приведенном примере \captionof незаменим, так как он снабжает рисунки (b) и (c) подписью, причем делает это не абы как, а именно так как подписаны все другие subfigure и к тому же инкрементирует все необходимые счётчики, т.е. нумерация (b) и (c) получается автоматически.
В качестве домашнего задания, попробуйте соорудить вот такие две картинки.

Код для левой картинки:открыть
01:  ...
02:  \usepackage[labelformat=simple]{subcaption}
03:  \renewcommand\thesubfigure{(\alph{subfigure})} % I want (a), not just a
04:  
05:  \usepackage[demo]{graphicx} % опция demo вставляет черные прамоугольники вместо картинок
06:  ...
07:  \begin{figure}[!t]\centering
08:  \setcounter{subfigure}{0}
09:  \addtocounter{figure}{1}
10:  \def\hgt{15cm}
11:  \def\wdt{5cm}
12:   \begin{minipage}[b][\hgt][s]{0.45\linewidth}
13:    \begin{center}
14:     \includegraphics[width=\wdt]{fig/roman_b}
15:     \captionof{subfigure}{Subfigure A}\label{fig:3a}
16:    \end{center}
17:  
18:    \vfill
19:  
20:    \begin{center}
21:     \includegraphics[width=\wdt]{fig/roman_c}
22:     \captionof{subfigure}{Subfigure B}\label{fig:3bb}
23:    \end{center}
24:  
25:     \vfill
26:  
27:    \begin{center}
28:     \includegraphics[width=\wdt]{fig/roman_aa}
29:     \captionof{subfigure}{Subfigure C}\label{fig:3c}
30:    \end{center}
31:   \end{minipage}
32:  %
33:   \quad
34:  %
35:   \begin{minipage}[b][\hgt][s]{0.45\linewidth}
36:    \begin{center}
37:     \includegraphics[angle=90,width=\wdt]{fig/roman_b}
38:     \captionof{subfigure}{Subfigure D}\label{fig:3d}
39:    \end{center}
40:  
41:    \vfill
42:  
43:    \begin{center}
44:     \includegraphics[width=7cm,height=5cm]{fig/roman_c}
45:     \captionof{subfigure}{Subfigure E}\label{fig:3e}
46:    \end{center}
47:   \end{minipage}
48:   \addtocounter{figure}{-1}
49:   \caption{Fancy placement of subfigures}\label{fig:3}
50:  \end{figure}

Код для правой картинки:открыть
01:  ...
02:  \usepackage{caption}
03:  \usepackage[demo]{graphicx} % опция demo вставляет черные прямоугольники вместо картинок
04:  ...
05:  \begin{figure}[!t]\centering
06:  \def\hgt{15cm}
07:  \def\wdt{5cm}
08:   \begin{minipage}[b][\hgt][s]{0.45\linewidth}
09:    \begin{center}
10:     \includegraphics[width=\wdt]{fig/roman_b}
11:     \captionof{figure}{caption x1}\label{fig:x1}
12:    \end{center}
13:  
14:    \vfill
15:  
16:    \begin{center}
17:     \includegraphics[width=\wdt]{fig/roman_c}
18:     \captionof{figure}{caption x2}\label{fig:x2}
19:    \end{center}
20:  
21:     \vfill
22:  
23:    \begin{center}
24:     \includegraphics[width=\wdt]{fig/roman_aa}
25:     \captionof{figure}{caption x3}\label{fig:x3}
26:    \end{center}
27:   \end{minipage}
28:  %
29:   \quad
30:  %
31:   \begin{minipage}[b][\hgt][s]{0.45\linewidth}
32:    \begin{center}
33:     \includegraphics[angle=90,width=\wdt]{fig/roman_b}
34:     \captionof{figure}{caption x4}\label{fig:x4}
35:    \end{center}
36:  
37:    \vfill
38:  
39:    \begin{center}
40:     \includegraphics[width=7cm,height=5cm]{fig/roman_c}
41:     \captionof{figure}{caption x5}\label{fig:x5}
42:    \end{center}
43:   \end{minipage}
44:  %
45:  \end{figure}

Код из этих и всех остальных примеров (в виде полностью готовых к компиляции tex-файлов) можно также найти по этой ссылке: http://tinyurl.com/amorua-floats.

До сюда и ни миллиметром дальше: placeins

Вернёмся, однако, к основной теме: к дополнительным средствам контроля над расположением плавающих объектов. В некоторых ситуациях, нежелательно, чтобы плавающие объекты переносились слишком далеко. Например, нелогично, когда картинка из предыдущего раздела возникает лишь в следующем.
Штатным решением этой проблемы является \clearpage, который принудительно разгружает очередь плавающих объектов и начинает новую страницу. Последнее — новая страница — не всегда приводит к красивому результаты. Зачастую хотелось бы вывести все плавающие объекты без начала новой страницы, если это возможно.
Пакет placeins определяет команду \FloarBarrier, которая решает именно вышеупомянутую проблему. Как только LaТeX встретит \FloatBarrier, он выведет все накопившиеся в очереди флоатс, но при этом не будет без надобности начинать новую страницу.
Зачастую, начало нового раздела \section{} и является той логической границей, которую плавающие объекты не должны пересекать. Можно, конечно, вручную указывать \FloatBarrier перед каждым \section. Однако пакет placeins предоставляет опцию section, которая сделает это автоматически:
01:  \usepackage[section,above,below]{placeins}
Здесь использованы ещё две опции above и below. Они разрешают вывод картинки на той же странице, где начинается новый раздел (над или под названием раздела), хотя картинка относится к предыдущему. В некоторых случаях, \FloatBarrier всё-таки приведет к неприятным разрывам страниц. Типичная ситуация такого рода: флоат не влезает на остаток страницы, а после него сразу идёт \FloatBarrier. Здесь у ЛаТеХа не остаётся выбора и будет начата новая страница. Предотвратить такое поведение можно с помощью команды \afterpage из одноименного пакета
01:  ...
02:  \usepackage{afterpage,placeins}
03:  ...
04:  \begin{figure} % здесь сам флоат
05:    ...
06:  \end{figure}  
07:  
08:  \afterpage{\FloatBarrier} % вставить барьер сразу после
09:                            % начала новой страницы
10:  ...
Эта команда вставляет свой аргумент в TeX-код сразу после начала новой страницы.

Утром деньги — вечером стулья: flafter

Одним из последствий алгоритма, описанного в самом начале этого поста, может быть то, что даже если в tex-файле плавающий объект идет после первой ссылки на него, "на бумаге" он окажется раньше, чем на него первый раз ссылаются. Если этого желательно избежать, то самым простым решением является пакет flafter.
01:  \usepackage{flafter}% помещает флоат ПОСЛЕ первой ссылки на него 
Вот, собственно, и всё!

Да ну их всех взад: endfloat

Многие естественнонаучные журналы требуют, чтобы в манускриптах, посланных им на рецензию, все рисунки были вынесены в самый конец. Пакет endfloat сделает это автоматически: он перенесёт все рисунки в конец документа.
По умолчанию, пакет вставит на место рисунков и таблиц (в основном тексте) заглушки типа "[Figure 5 about here]". Затем, после основного текста, сначала Список рисунков и Список таблиц, а затем и сами рисунки/таблицы, центрированными по одной на странице.
Контролировать поведение пакета можно с помощью параметров, наиболее интересными из которых являются nomarkers, nofiglist и notablist. Например,
01:  \usepackage[nomarkers,nofiglist,notablist]{endfloat}
не будет вставлять заглушки и списки рисунков и таблиц.
Если списки флоатс все-таки нужны, то порядок их вывода контролируется параметром tablesfirst или figuresfirst (включен по умолчанию), которые, выводят первым список таблиц или рисунков, соответственно.

Картинки с продолжением: \ContinuedFloat

Иногда возникает необходимость разместить большое количество логически связанных "подрисунков" (subfigures) в пределах одного рисунка. Однако, ЛаТеХ не поддерживает плавающие объекты размером более одной страницы. Проблема решается командой \ContinuedFloat из уже упомянутого пакета caption. Использование этой команды очевидно из примера ниже:
01:  ...
02:  \usepackage{caption}
03:  \usepackage[labelformat=simple]{subcaption}
04:  \renewcommand\thesubfigure{(\alph{subfigure})} % I want (a), not just a
05:  ...
06:  \begin{figure} % Начало "длинного" рисунка
07:    \begin{subfigure}{0.5\linewidth}  % Первый "подрисунок"
08:       \includegraphics{...}
09:       \caption{...}\label{...}
10:    \end{subfigure}
11:    ... % здесь ещё подрисунки
12:    \begin{subfigure}{0.5\linewidth}  % n-й "подрисунок
13:       \includegraphics{...}
14:       \caption{...}\label{...}
15:    \end{subfigure}
16:    \caption{Мой любимый рисунок}\label{...}
17:  \end{figure} % конец первой части
18:  
19:  \begin{figure} \ContinuedFloat % продолжение рисунка
20:    \begin{subfigure}{0.5\linewidth}  % (n+1)-й "подрисунок"
21:       \includegraphics{...}
22:       \caption{...}\label{...}
23:    \end{subfigure}
24:    ... % здесь ещё подрисунки
25:    \begin{subfigure}{0.5\linewidth}  % последний "подрисунок
26:       \includegraphics{...} 
27:       \caption{...}\label{...}
28:    \end{subfigure}
29:    \caption{Мой любимый рисунок (продолжение)} % \label здесь не нужна!!! 
30:  \end{figure} % конец второй (и последней) части рисунка
Принцип очень прост: делим "длинный рисунок" на несколько частей. Каждую часть помещаем в отдельный плавающий объект (окружение figure). Во всех частях, кроме первой добавляем \ContinuedFloat сразу после \begin{figure}. Эта команда "переставит" все счётчики (для figure и для subfigure) соответствующим образом: figure не изменяется (все части имеют один "номер"), а subfigure продолжится начиная с последней буквы предыдущей части.
Обратите внимание, что к каждой части надо вручную добавить \caption{...}.
Абсолютно то же самое можно проделать для любого типа плавающего объекта, например, для table.

Картинки на развороте: dpfloat

Если два больших флоат-рисунка связаны логически, как, например, в примере из предыдущего раздела, то их желательно разместить так, чтобы читатель мог лицезреть обе части одновременно, то есть на развороте. Это особенно удобно, если текст манускрипта будет напечатан в виде книжки: например, в случае диссертации.
На практике это означает, что первая часть рисунка должна попасть на чётную страницу, а вторая — на нечётную (предполагается, что книжка начинается со страницы 1, у которой нет "разворотной пары"). Сделать это можно с помощью пакета dpfloat. Ограничением является то, что каждая из частей будет занимать полную страницу, на которой не будет текста. А делается это так: надо создать два плавающих объекта, идущих в tex-файле друг за другом. Рисунок внутри первого флоат, который должен оказаться слева, помещается внутрь окружения leftfullpage, а рисунок внутри второго, который предполагается быть на правом развороте, внутрь fullpage. Пример ниже демонстрирует это в подробностях.
01:  ...
02:  \usepackage{dpfloat}
03:  ...
04:  \begin{figure} % первая часть
05:    \begin{leftfullpage} % Эта картинка гарантированно окажется
06:                         % на ЛЕВОМ развороте
07:       % здесь все, что обычно...
08:       % например, \includegraphics{...}
09:    \end{leftfullpage}
10:  \end{figure}
11:  
12:  \begin{figure} % вторая часть
13:    \begin{fullpage} % Эта картинка гарантированно окажется
14:                     % на ПРАВОМ развороте
15:       % здесь все, что обычно...
16:       % например, \includegraphics{...}
17:    \end{fullpage}
18:  \end{figure}

Последний рецепт: одинокие картинки

Несмотря на все продвинутые способы контроля положения плавающих объектов, время от времени возникают ситуации, когда посленяя (или пара последних) картинка остаётся напоследок и оказывается одиноко на самой последней странице. При этом, независимо от параметров вроде [hbt], она будет размещена (вертикально) по центру страницы. Но зачастую желательно разместить картинку вверху страницы, в основном, из эстических соображений. Достичь этого очень просто, поместив следующий код в tex-файл:
01:  \makeatletter
02:  \setlength{\@fptop}{0pt}
03:  \setlength{\@fpbot}{0pt plus 1fil}
04:  \makeatother
Любознательные могут ознакомиться с подробностями вот здесь.

Заключение и выводы

Итак, штатные средства ЛаТеХ позволяют контролировать местоположение плавающих объектов с помощью необязательных аргументов [htbp!] и параметров определяющих максимальное количество таких объектов на странице и её частях. Для более продвинутого контроля можно использовать расширения, содержащиеся в пакетах float, caption, placeins, afterpage, flafter, endfloat и dpfloat. В этом посту мы обсудили наиболее общеупотребительные их аспекты, однако для более подробного описания лучше ознакомиться с оригинальной документацией.
Прибегнув к "тонкой настройке" плавающих объектов, в большинстве случаев можно добиться вполне приемлемых результатов даже при "автоматическом" размещении их ЛаТеХом. Разумеется, при диспропорционально большом количестве рисунков и/или таблиц, скорее всего понадобится ручное вмешательство.
При возникновении конкретных проблем, зачастую быстрее всего получить ответ можно задав вопрос на http://tex.stackexchange.com/.
Исходники (tex-файлы) для всех примеров из данного поста можно найти здесь. Зеркала на случай сбоя: зеркало1, зеркало2
Image
Sunday, February 17th, 2013
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
6:01 pm
Вглубь синтетических джунглей файловой системы sysfs в Linux
Файловая система /sys в Linux отличается от /proc тем, что предоставляет детализированную информацию о работе ядра пользователю (например, параметры устройств и загруженных модулей). Информация строго организована и обычно форматируются простом ASCII тексте, что делает её очень доступной для пользователей и приложений. Так что можно занять шаловливые ручонки чем-нибудь полезным, вроде дёргания разных крутилок в /sys и подсматриванием в системные переменные. Далее - немного подробностей о синтетических джунглях файловой системы /sys.


Зачем нужна /sys, когда есть /proc? 

Основной лейтмотив создания /sys было навести некоторый порядок в том бардаке, который являет из себя /proc и выделить информацию о структурах ядра в отдельную директорию.

Sysfs это
файловая система, находящаяся в памяти (in-memory), основана первоначально на Ramfs, которая в свою очередь была написана во время перехода на ядро 2.4.0. Как говорит один из авторов [1], ``это было упражнение в элегантности, имевшее целью показать, насколько легко написать простую файловую систему, если использовать новый на тот момент слой VFS''. Из-за простоты и использования VFS, это дало здоровую основу для создания других in-memory файловых систем.

При этом sysfs может быть смонтирована, как и любая другая файловая система из пространства пользователя. Большинство дистрибутивов делают это автоматически при старте системы, добавляя соотвутствующую строчку в /etc/fstab.


Что внутри /sys?
Sysfs является каналом распространения информации между ядром и пространством пользователя. Например, есть возможность смены планировщика ввода/вывода или изменения параметров Udev программы. В каталоге /sys находится несколько подкаталогов, представляющих ряд основных подсистем, которые зарегистрированы в Sysfs:
/sys/
|-- block
|-- bus
|-- class
|-- devices
|-- firmware
|-- module
‘-- power


Внутри
/sys/block
Каталог /sys/block содержит подкаталоги для каждого блочного устройства, которое было обнаружено в системе. Там хранятся параметры, которые описывают такие свойства блочных устройств, как размер устройства, его партиции, планировщик ввода-вывода и другие.

Зайдя туда, мы обнаруживаем кучу блочных устройств, среди которых можно найти рабочий винчестер, подключённые флешки и внешние жёсткие диски. Вот что автор этих строк нашёл про свой жёсткий диск, на котором установлен евонный Дебиан:

notebeast:/sys/block/hda# ls -l
итого 0
-r--r--r-- 1 root root 4096 2012-03-03 22:05 capability
-r--r--r-- 1 root root 4096 2012-03-03 22:05 dev
lrwxrwxrwx 1 root root 0 2012-03-03 22:05 device -> ../../devices/pci0000:00/0000:00:1f.1/ide0/0.0
drwxr-xr-x 3 root root 0 2012-03-03 22:05 hda1
drwxr-xr-x 3 root root 0 2012-03-03 22:05 hda2
drwxr-xr-x 2 root root 0 2012-03-03 18:40 holders
drwxr-xr-x 3 root root 0 2012-03-03 22:05 queue
-r--r--r-- 1 root root 4096 2012-03-03 22:05 range
-r--r--r-- 1 root root 4096 2012-03-03 22:05 removable
-r--r--r-- 1 root root 4096 2012-03-03 22:05 size
drwxr-xr-x 2 root root 0 2012-03-03 18:40 slaves
-r--r--r-- 1 root root 4096 2012-03-03 22:05 stat
lrwxrwxrwx 1 root root 0 2012-03-03 22:05 subsystem -> ../../block
--w------- 1 root root 4096 2012-03-03 22:05 uevent
Отсюда мы узнаём, например, что диск /dev/hda разбит на две партиции, hda1 и hda2, размеры которых хранятся в size, что можно достучаться до планировщика I/O в queue   и собрать немножко статистики по работе жёсткого диска в stat. Заглянем туда в поисках приключений и чего-нибудь неизведанного.


Статистика ввода-вывода

Интерфейс /sys/block/sdX/stat даёт некоторые статистические данные о производительности ввода-вывода ядра. Эти данные пользователь или администратор может использовать для оптимизации производительности, если знает, что они значат.

Например, если дать команду:

# cat /sys/block/sda/stat
Мы увидим что-то типа:

186908 41568 6033917 2408504 91198 509600 4882200 9406764 0 1161304 11848624

Эти сакрально-литургические знаки означают следующее:

Поле 1 -- полное число запросов на чтение, выполненных успешно.


Поле 2 -- число объединённых запросов на чтение. Запросы на чтение и запись, примыкающие друг к другу, могут быть объединены для повышения эффективности. Таким образом, два 4K считывания может стать одним 8K считыванием перед тем, как в конечном итоге быть переданы диску. Поэтому запрос будет считаться одним, и это поле позволяет вам узнать, как часто это было сделано.

Поле 3 -- число считанных секторов, чтение которых прошло успешно. 

Поле 4 -- миллисекунд, потраченных на чтение. 

Поле 5 -- число запросов на запись, выполенных успешно.

Поле 6 -- число объединённых запросов на запись. Запросы на чтение и запись, примыкающие друг к другу, могут быть объединены для повышения эффективности. Таким образом, два 4K считывания может стать одним 8K считыванием перед тем, как в конечном итоге быть переданы диску. Поэтому запрос будет считаться одним, и это поле позволяет вам узнать, как часто это было сделано.

Поле 7 -- число секторов, записанных успешно.

Поле 8 -- миллисекунды, потраченные на запись.

Поле 9 -- число запросов ввода-вывода, активных в данный момент. Единственное поле, которое должно стремиться к нулю.

 Поле 10 -- миллисекунд, потраченных на выполнение запросов ввода-вывода. 

Поле 11 -- взвешенное количество миллисекунд, потраченных на ввод-вывод. Может использоваться как простая мера производительности ввода-вывода.




Смена планировщика ввода-вывода на лету

Как нам намекает документация, планировщик ввода-вывода может быть изменён в любое время на лету, хотя может быть небольшая задержка из-за того, что все запросы предыдущего планировщика должны быть обработаны прежде, чем запустится новый. Чтобы узнать, какой планировщик стоит сейчас, даём команду:
cat /sys/block/sdX/queue/scheduler
Заменяя sdX на интересующее нас устройство. Текущий планировщик отмечен в квадратных скобках:
noop anticipatory deadline [cfq]
То есть сейчас стоит cfq - Completely Fair Queuing, полностью честный планировщик. Планировщики для разных дисков могут быть:
  • noop часто наилучший выбор для файловых систем в памяти (например ramdisk) и других устройств без механических частей (флешек), где попытки оптимизировать ввод-вывод приводят лишь к напрасной трате ресурсов.
  • as (anticipatory) по воплощённым в нём идеях схож с deadline, но более навороченный и пытается оптимизировать ввод-вывод с упреждением. Удалён из ядер начиная с 2.6.33.
  • deadline лёгкий планировщик, который пытается установить жёсткий предел на задержки ввода-вывода.
  • cfq поддерживает честное распределение ввода-вывода между процессами, используя концепцию очередей (queue) для каждого процесса. CFQ разедляет синхронные и асинхронные операции ввода-вывода, отдавая предпочтение синхронным операциям. Грубо говоря, CFQ не допускает ситуации, когда один процесс начнёт создавать много операций ввода-вывода, другие процессы могут ``голодать''. Имеет несколько параметров настройки.
Выбор планировщика зависит от задач и оборудования (любопытные бенчмарки для SSD). Более того, у каждого планировщика, как правило, есть настраиваемые параметры. Некоторые соображения можно почерпнуть из поста по ссылке.

Сменить планировщик можно на лету:
# echo "deadline" > /sys/block/sda/queue/scheduler
После этого планировщик для данного диска будет изменён. 
 


И другие каталоги...
 Содержимое других каталогов будет интереснее разработчикам, а не пользователям, и может сильно меняться от версии ядра Linux.

/sys/bus
Это структура шин данных в системе, которая показывает, какая шина куда подключена (например, контроллер USB может быть подключен к шине PCI), и какие устройства в каждой шине потенциально может поддерживать (наряду с соответствующими драйверами), и какие устройства существуют. Здесь есть символической ссылки, которые указывают на директории устройства в глобальном дереве устройств. Каждый тип шины данных представлен двумя подкаталогами: устройств и драйверов.
   
/sys/class
Хранит все классы устройств, зарегистрированные ядром. Используется для описания функционального типа устройств. Большинство подкаталогов содержат символические ссылки на каталоги device и driver. Например, физическое устройство типа мышь может ссылаться на объект ядра "мышь", на устройство input event и input debug. Классы могут включать в себя диски, разделы, последовательные порты, и т.д.  

/sys/devices
Содержит глобальную иерархию устройств: каждое физическое устройство, которые было обнаружено и зарегистрировано ядром.

Например, автор этих строк нашёл:
/sys/devices/virtual/thermal/thermal_zone0/temp  
показания температуры на процессоре в ноутбуке. Исключений два - platform devices и system devices.

Platform devices это периферия (подключаемые устройства), присущие конкретной платформе (порты ввода-вывода, legacy-устройства типа последовательного контроллера или контроллера дискет [floppy controller]).

System devices это устройства, интергрированные в платформу, например аппаратные регистры для доступа к конфигурированию, которые не имеют возможностей обмениваться данными. Обычно для них нет драйверов (процессор, таймеры и другое).
   
/sys/firmware
Cодержит интерфейсы для просмотра и манипулирования firmware-специфичными объектами и их параметрами. Как правило, это платформо-зависимый код, который выполняется в системе при включении, например BIOS.  

/sys/module
Cодержит подкаталоги для каждого загруженного модуля ядра. Имя каталога отражает имя модуля. Ядро имеет глобальное пространство имён для всех модулей. Подкаталоги содержат параметры, специфичные для каждого загруженного модуля. Эта информация используется для отладки и простым смертным не будет интересна.  

/sys/power
Это скорее заделка на будущее. Может содержать название состояния, которое позволит процессу переходить в режим пониженного энергопотребления.
В зависимости от версии ядра, в /sys могут появляться и другие каталоги.


Ссылки
Есть любопытный документец [1] The sysfs Filesystem, OLS'05 на 14 страниц, написанная тем водянистым и пустозвонным стилем, коий так не переваривает автор этих строк. Документация к ядру тоже не особенно жаждет подробно рассказать о том, что означают все эти переменные и отгораживается вот этим:

TODO: Finish this section.
Понятно, что это самое туду не входит в приоритетный список дел. Но кое-что выудить всё-таки можно. Надеюсь, что этот пост несколько приподымет завесу тайны с файловой системы /sys.
Image
Sunday, February 3rd, 2013
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
6:00 pm
Обзор редакторов для работы в ЛаТеХ: LaTeX Editors and Integrated LaTeX Environments

Частый вопрос начинающих латехников: ну вот установили мы LaTeX, а как теперь со всем этим работать? Вопрос задают сравнительно часто, и подумалось мне, что неплохо бы всё это оформить в виде одного поста со скриншотами и сравнениями. Описание сред для работы с LaTeX идёт в порядке убывания возможностей программ.


Так как пост сравнительно длинный, ниже приводится список редакторов LaTeX по операционным системам.

Только для Linux

Только для Windows

Только для MacOS

Только для настоящих мужЫков

Если вы презираете графические интерфейсы, любите исследовать и программировать свой текстовый редактор, заваривать в нём кофе, и вообще следуете Unix-Way по поводу и без, вам скорее всего уже давно известно, что LaTeX документы можно редактировать в Vim (через vim-latex) и Emacs (через AUCTeX) без проблем, так что дальше можно не читать. То есть основных опций для настоящих мучачос две:
Ну и остальные орудия настоящих мачо вроде Ed, nano, elvis и прочие joe.


Мультиплатформенные (Windows/Linux/Mac)


Kile

Kile это одна из лучших сред разработки для LaTeX в Linux от проекта KDE. Kile богат возможностями и прост в установке, может быть легко настроен под привычки пользователя. Хотя Kile используется большей частью в Linux, имеет место быть экспериментальный порт Kile под Windows.

Основные возможности Kile

  • автоматическая подсветка и дополнение команд и слов
  • шаблоны документов ЛаТеХ, в том числе и создаваемые пользователем на основе существующих
  • просмотр и навигация по структуре документа
  • возможность править несколько документов сразу
  • вставка математических символов из боковой панели
  • возможность задавать Master Document (полезно, если вы правите вложенные документы через \input{}
В сочетании с продуманными горячими клавишами по умолчанию (и возможностью настроить их, в том числе для математического режима) и отличным интерфейсом, Kile представляет собой мощное интегрированное решение для набора и редактирования LaTeX-документов.

Как выглядит Kile




 

TeXstudio

  • операционная система: Linux, Windows, MacOS
  • платность: открытый код (бесплатно)
TeXstudio, который когда-то назывался TexMakerX, представляет собой ответвление от Texmaker с богатыми возможностями и развитым интерфейсом.

Основные возможности TeXstudio

  • многие математические символы могут быть вставлены одним щелчком мыши
  • есть просмотр и навигация по структуре документов
  • различные диалоги (мастера) помогут сгенерировать код (таблицы, массивы, табуляции и прочее)
  • LaTeX-ошибки автоматически записываются в лог-файл и можно перейти на соответствующую строку одним щелчком мыши
  • сворачивание блоков кода (code folding) и автодополнение команд (auto-completion)
  • подсветка синтаксиса и проверка орфографии
  • поддержка многих утилит, в том числе tikz, pstricks и других
Среди прочего стоит отметить то, что TeXstudio может использовать системную тему оформления, позволяет парой кликов выбирать язык документа, всё это весьма быстро работает.

Как выглядит TeXstudio





 

 TeXworks

  • операционная система: Linux, Windows, MacOS
  • платность: открытый код (бесплатно)
TeXworks это простенький редактор с подсветкой синтаксиса LaTeX и просмотрщик в одном флаконе. Представляет собой продукт деятельности TeX Users Groups.

Основные возможности TeXworks

  • простой редактор плюс просмотрщик в PDF.
  • интегрированный PDF просмотрщик с возможностью перемещаться по коду при просмотре результата в PDF.
















Годится для пользователей, предпочитающих простоту обилию возможностей. TeXworks не поддерживает настройку раскраски синтаксиса и вообще беден возможностями на фоне конкурентов.

Как выглядит TeXworks

 

Texmaker

  • операционная система: Linux, Windows, MacOS
  • платность: открытый код (бесплатно)
Богатый возможностями и мощный Texmaker позволяет просматривать структуру, код документа и результат в одном окне, используя ваш широкоформатный монитор на всю катушку.

Основные возможности Texmaker

  • проверка правописания
  • сокрытие блоков кода (Code folding)
  • автодополнение команд LaTeX
  • быстрая навигация по структуре
  • интегрированный просмотр PDF
  • указание на строку с ошибкой для быстрой отладки
Можно отметить поставляемую документацию по латеху, поддержку Asymptote и интеграцию с tex4ht для конвертирования документов в HTML и ODT. TeXMaker прост в установке и скорее всего найдётся в вашем дистрибутиве.

Как выглядит Texmaker





TexShop

  • операционная система: только MacOS
  • платность: открытый код (бесплатно)
Пользователей MacOS может заинтересовать TexShop, представляющий собой мощную (и бесплатную!) среду редактирования LaTeX документов с лёгкой интеграцией с MacTeX.

Основные возможности TexShop

  • подсветка синтаксиса
  • синхронизация между исходным кодом ЛаТеХ-документа и PDF-версией для просмотра
  • автодополнение команд и окружений
  • панель для часто используемые символов
  • панель для ввода массивов и матриц
  • импорт данных из ячеек табличных редакторов (spreadsheet) с LaTeX-формативраонием
  • поддержка TeX, LaTeX, Xe(La)TeX, Lua(La)TeX, ConTeXt, BibTeX, biber
  • поддержка таких утилит как Sketch, Asymptote, Sage, LilyPond, LatexMk, MetaPost

Как выглядит TexShop






TeXnicCenter

  • операционная система: только Windows
  • платность: открытый код (бесплатно)
Пожалуй, TeXnicCenter одна из лучших графических сред LaTeX для Windows. Огромные возможности программы сочетаются с простотой настройки.

Основные возможности TeXnicCenter

  • подсветка синтаксиса
  • автодополнение команд и окружений
  • просмотр и навигация по структуре документа
  • возможность сразу переместиться на строку, вызвавшую ошибку компиляции документа
  • и многие другие...

Как выглядит TeXnicCenter





WinEdt

  • операционная система: только Windows
  • платность: платный
WinEdt хорошая, хотя и платная, среда разработки латех-документов для Windows.

Основные возможности

  • подсветка синтаксиса
  • автодополнение команд и окружений
  • просмотр и навигация по структуре документа, в том числе указание в боковой панели на часть документа, в которой сейчас находится курсор
  • настраиваемое отображение структуры документа
  • простая интеграция с MikTeX
  • начиная с версии 7, простая интеграция с bibMacros.
Эти и другие возможности делают WinEdt привлекательной альтернативой TeXnicCenter.

Как выглядит WinEdt




LyX

  • операционная система: Linux, Windows, MacOS
  • платность: открытый код (бесплатно)
Строго говоря LyX не является средой для LaTeX-документов, а скорее самостоятельной системой документов с несколько отличающимся от LaTeX синтаксисом (любой LyX документ может быть экспортирован в LaTeX, но не каждый документ LaTeX может быть импортирован в LyX), хотя и использует LaTeX в качестве backend.

Основные возможности LyX

  • позволяет сочетать мощь и гибкость TeX/LaTeX с простотой использования графического интерфейса (за что в основном и любим пользователями)
  • широкий выбор встроенных шаблонов документов
  • дружелюбен к пользователям, особенно начинающим и не слишком желающим вникать в LaTeX.

Как выглядит LyX

 

 

TeXlipse

  • операционная система: Linux, Windows, MacOS
  • платность: открытый код (бесплатно)
Вообще-то TeXlipse не совсем отдельная среда для разработки LaTeX документов, а надстройка над Eclipse. Тем не менее, может пригодится заядлым программистам, особенно предпочитающим Java, на котором TeXlipse и написан.

Основные возможности TeXlipse

  • автодополнение кода, включая BibTeX команды
  • настраиваемые шаблоны
  • предпросмотр через Pdf4Eclipse
  • горячие клавиши, к которым вы привыкли в Eclipse
  • поддержка систем управления версиями (version control)

Как выглядит TeXlipse

 

TextMate

  • операционная система: только MacOS
  • платность: платный
Не совсем среда для LaTeX-документов, а скорее продвинутый текстовый редактор, TextMate отлично интегрируется с MacTeX.

Основные возможности TextMate

  • легко настраивается
  • расширяем с помощью макросов (есть поддержка python и ruby).
  • раскраска кода
  • навигация по структуре документов

Как выглядит TextMate

 

Gummi

  • операционная система: только Linux
  • платность: открытый код (бесплатно)
Простой, если не сказать примитивный, Gummi это редактор и просмотрщик для LaTeX для пользователей GNOME.

Основные возможности Gummi

  • раскраска кода
  • просмотр документа в интегрированном PDF-просмотрщике на лету (обновляется в процессе набора документа)
Проект молодой и в общем пока это все его основные возможности. Может быть полезен при обучении LaTeX.

Как выглядит Gummi

 

 

Emacs вместе с AUCTeX

  • операционная система: Linux, Windows, MacOS
  • платность: открытый код (бесплатно)
Поклонникам текстового редактора Emacs понравится AUCTeX, который позволяет удобно редактировать LaTeX код, не выходя из любимого текстового редактора.

Основные возможности Emacs

Как выглядит Emacs






 

Vim вместе с LaTeX-suite

  • операционная система: Linux, Windows, MacOS
  • платность: открытый код (бесплатно)
Поклонникам текстового редактора Vim придётся по душе набор расширений vim-latex.

Основные возможности Vim

  • сокрытие блоков кода (ode folding) с помощью расширения vim-latex
  • использование регулярных выражений
  • автодополнение слов и команд
Ещё есть Vim с графическими менюшками - gVim.

Как выглядит Vim






 

Вебдваноль наступает: sharelatex.com

  • операционная система: любой современный Web-browser
  • платность: бесплатно, но синхронизация с Dropbox - за деньги.
Любителям вебдваноля, облаков и прочих браузерных излишеств изрядно пригодится sharelatex.com - вебсервис, позволяющий загружать и совместно работать над документами LaTeX:

Основные возможности sharelatex.com

  • правка и сборка (latex\pdflatex\xelatex) документов LaTeX в окне браузера
  • подсветка кода, разные темы для посветки, комбинации клавиш.
  • возможность совместной работы с документами и синхронизация с Dropbox (за деньги).
Сервис по состоянию на февраль 2013 сыроват, не может делать просмотр в окне броузера (только через PDF, который придётся загружать каждый раз). Пока может переваривать только простые документы - проект статьи в один из журналов Elsevier скомпилирован не был.

Как выглядит sharelatex.com




Ссылки по теме

Собственно, большинство ссылок находятся в документе. В обзоре использована информация из stackexchange и этого блога. Также можно отметить хорошую сравнительную таблицу возможностей LaTeX редакторов в википедии. Поклонников вышеописанных сред, а так же настоящих мужиков(ТМ), просьба не распаляться в комментариях, а тактично и вежливо дополнить возможностями, которые им знакомы лучше автору (он использует Kile).
Image
Sunday, January 20th, 2013
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
6:03 pm
Xournal - рукописные заметки и пометки в PDF файлах

Наличие у вас графического планшета или ноутбука с экраном, чувствительным к нажатию, открывает широкие возможности для творчества: можно рисовать картины (почти как на бумаге), создавать чертежи в CAD-программах (планшет сильно облегчит работу) или делать рукописные заметки.


Заметки от руки в Linux

Я рисую на окне,
Я смотрю в пустые стены,
Оставляя на песке
Совершенные поэмы.
(С) Чайф
В вашем любимом дистрибутиве Linux есть все возможные, несколько невозможных, и две невероятные программы, но для рукописных заметок есть только одна - Xournal. К счастью, она умеет многое.

Установка и настройка xournal

Установка проста и незатейлива - xournal входит в дистрибутивы и требует минимальных телодвижений:
aptitude install xournal
После этого запускаем xournal и приступаем к записи своих бесценных идей.


Основные возможности xournal

Xournal довольно-таки богат возможностями и при этом имеет очень простой интерфейс:



Верхний ряд кнопок стандартен: открыть файл заметок, сохранить, отмена и навигация по страницам. Удобно, что на верхней панели есть кнопки для страниц - нажатие на "Следующую страницу" автоматически создаст пустую страницу.

Собственно, инструменты Pen и Eraser - всё, что нам нужно для рукописных заметок:


Среди возможностей стоит отметить поддержку чувствительности нажатия (линии будут толще или тоньше на рисунках) и задание толщины (Tools - Pen Options).

Если нужно нарисовать какой-нибудь график, можно изменить линовку страницы в меню Journal - Paper Style.


Если при этом включить Shape Recognizer, то xournal будет пытаться из ваших загогулины выправить в круг или квадрат. Надо сказать, что у xournal весьма своеобразные представления о квадратуре круга и прямых линиях :-)




Своё нетленное творчество можно сохранить как в родном для xournal формате xoj (разновидность XML), так и в экспортировать в PDF.


Пометки в PDF-файлах с помощью xournal

При чтении PDF-файлов часто хочется делать пометки на полях и в тексте, или выделять отдельные предложения с тем, чтобы при повторном просмотре к ним вернуться. Возможность делать пометки в PDF документах, разной степени кривоногости, имеет место быть в некоторых программах под Linux:
  • okular: КДЕшный монстр - и умеет уже всё, кроме, собственно, быстрого просмотра PDF-файлов. Анонимусы утверждают, что в последних версиях Okular умеет уже решительно всё, в том числе и сохранять пометки в PDF внутри файла.
  • Evince: наш (GNOME) ответ Чемберлену (okular), умеет делать пометки в PDF-файлах, хотя эта возможность скрыта от пользователя.
  • PDFEdit: страшный, как смертный грех, и с безумным интерфейсом, тем не менее умеет помечать PDF-документы и сохранять пометки внутри PDF.
  • Xournal: может выделять слова и предложения цветом, есть возможность делать рукописные заметки (freehand), сохранение заметок как в отдельном файле, так и внедрение в PDF-файл.
В этом посте речь идёт про Xournal, хотя по возможностям аннотации PDF линуксовый xournal, конечно, далеко позади ezPDF для Android. Так, например, главный недостаток Xournal - нет возможности выделять текст в PDF непрерывно, несколькими строками подряд. В ezPDF для Andoird, конечно, это сделано через голову:



В xournal так сделать не получится, потому как выделение делается с помощью простого прямоугольника (при этом стоит включить Shape Recognizer, иначе линии будут ещё и неровные):


Цвет и прозрачность выделения можно изменить: xournal, увы и ах, делает слой пометок поверх текста, так что если вы сделаете цвет полностью непрозрачным, прочитать его потом будет невозможно.

Ссылки

Пометки и аннотации PDF-файлов по крайней мере имеют место быть в Linux в лице xournal, и это делает разного рода ноутбуки с тачскринами полезными и под Linux.
Image
Sunday, January 6th, 2013
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
6:00 pm
Продвинутые таблицы в ЛаТеХе: advanced tables in LaTeX

Набор таблиц в LaTeX, как уже говорилось, дело не простое, а набор сколько-нибудь продвинутых таблиц - скажем так, удовольствие ниже среднего. Тем не менее, ЛаТеХ позволяет тонко настраивать вид таблицы и добиваться, хотя и ценой некоторых умственных усилий, весьма навороченных результатов. Немного накопленных трюков и кульбитов описаны в этом посте.

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

Объединение строк и столбцов в таблицах LaTeX

Создание навороченных таблиц часто требует объединять столбцы и строки, особенно при группировке сходных данных. Для этого можно использовать команды \multicolumn и \multirow, а так же некоторые другие трюки, о которых ниже.

Напомню, что \multicolumn{2}{|c|}{Результаты измерений} означает, что мы объединяем 2 (два) столбца в таблице, получившаяся ячейка будет центрирована и нарисованы вертикальные линии.

Таблицы с объединением столбцов в LaTeX

Для того, чтобы несколько столбцов объединить в одну, можно воспользоваться командами \cline, \raisebox и \multicolumn одновременно. Здесь \multicolumn служит для объединения двух колонок в одну, \cline прочерчивает линию в строках, а \raisebox поднимает текст к середине объединённой строки.
Вот код таблицы:

\begin{table}[H]
\caption{\label{tab:bolts} Нестандартные болты для левой резьбы.}
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
& \multicolumn{2}{c|}{Диаметр} \\
\cline{2-3}
\raisebox{1.5ex}[0cm][0cm]{Нестандартные болты}
& Норма & Разброс \\
\hline
Размеры & 10 мм & 1 мм \\
\hline
\end{tabular}
\end{center}
\end{table}

В документе это будет выглядеть так (обратите внимание на первую колонку):


Для этой таблицы использован трюк с \multicolumn для объединения двух ячеек в одну, \cline{2-3} для прочерчивания горизонтальной линии в таблице от второй колонки до третьей, и \raisebox для вставки надписи Нестандартные болты.


Таблицы с объединением строк в LaTeX

Если нужна таблица, в которой несколько строк объединены, можно использовать пакет multirow, добавив \usepackage{multirow} в преамбулу документа. Это позволит создать строки, простирающиеся на несколько колонок командой:
\multirow{объединить Х строк}{ширина}{содержимое}
Предыдущий пример можно переиначить вот так:

\begin{table}[H]
\caption{\label{tab:bolts} Нестандартные болты для левой резьбы.}
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
\multirow{3}{*}{Размеры нестандартных болтов} & \multicolumn{2}{c|}{Диаметр} \\
\cline{2-3}
            & Норма & Разброс \\
\cline{2-3}
            & 10 мм & 1 мм \\
\hline
\end{tabular}
\end{center}
\end{table}

В документе такая таблица будет выглядеть так:



Объединение строк и столбцов вместе плюс использование hhline

Пример с texexchange, который мне нравится, иллюстрирует применение описанных выше команд:

\begin{table}[ph]
  \centering
  \begin{tabular}{c|c|c|c|c}
    \hline
    \multirow{2}{*}{Raaa (k)} & \multicolumn{4}{c}{C ()} \\
    \hhline{~----}
    & 3.3 & 2.5 & 1 & 0.5 \\
    \hline
    \multirow{2}{*}{Raaa (k)} & \multicolumn{2}{c|}{\multirow{2}{*}{this}} & 0.5 & 0.6\\
    \hhline{~~~--}            & \multicolumn{2}{c|}{}                      & 0.7 & 1.2 \\
    \hline
  \end{tabular}
  \caption{R, C ripple size}
  \label{T:peak}
\end{table}

В документе выглядит так:


Здесь нужно отметить применение команды \hhline из одноимённого пакета hhline, которая рисует линии в таблицах, подобно обычной \hline. Особенность \hhline в том, что можно прочерчивать невидимые линии (~) и обычные (-) вот так:
\hhline{~----}
В данном случае будет нарисовано пять линий в таблице, первая будет пустая. В общем это аналог \cline{2-5}, только более удобный.

Надеюсь, что с такими таблицами вы будете встречаться так же редко, как и с такими экзотическими болтами.


Раскраска ячеек таблиц в LaTeX

Кто сказал, что таблицы в LaTeX унылы и безжизненны? Хотя часто раскраска таблицы не одобряется, иногда, особенно в презентациях, выделение ячеек таблицы цветом помогает быстрее понять материал.
Для раскраски ячеек нам понадобятся пакеты
\usepackage{color,colortbl}
и в преамбуле определяем цвета, которые нам нужны:
\definecolor{darkishgreen}{RGB}{39,203,22}
\definecolor{LightCyan}{rgb}{0.88,1,1}
\definecolor{Gray}{gray}{0.9}
\definecolor{lightRed}{RGB}{230,170,150}
\definecolor{modRed}{RGB}{230,82,90}
\definecolor{strongRed}{RGB}{230,6,6}
Теперь нужно сделать отдельный тип цветных колонок для таблицы. Для этого в документе, уже после \begin{document}, создаём новые команды в виде:
\newcolumntype{g}{>{\columncolor{Gray}}c}
и
\newcolumntype{d}{>{\columncolor{darkishgreen}}c}
Это позволит нам раскрашивать колонки. Для раскраски строк воспользуемся командой \rowcolor{цвет} из пакета colortbl. Можно раскрасить отдельно ячейку с помощью команды \cellcolor{Gray} которую помещаем в раскрашиваемую ячейку.

А теперь всё вместе:

\newcolumntype{g}{>{\columncolor{Gray}}c}
\newcolumntype{d}{>{\columncolor{darkishgreen}}c}

\begin{tabular}{|c||c||g||d|d|d|}
    \hline
 Signal & \cellcolor{Gray} Device    & \multicolumn{4}{|c|}{Computation time, s}\\
\cline{3-6}
Strength    & \cellcolor{Gray}  size     &Dantzig-   &Branch and & Active    &Projected\\ 
        &       &Wolfe      &Bound      &Set        &Gradients\\ 
\rowcolor{lightRed}
\hline
Weak        & 7x7   &400        &230        &200        &58\\ \cline{3-6}
\rowcolor{lightRed}
(0\% constr.)    & 10x10 &1000       &840        &500        &135 \\ \cline{3-6}

\hline
\rowcolor{modRed}
Moderate    & 7x7   &640        &380        &270        &54\\ \cline{3-6}
\rowcolor{modRed}
(5\% constr.)    & 10x10 &3120       &1200       &700        &110 \\ \cline{3-6}

\hline
\rowcolor{strongRed}
Strong      & 7x7   &1400       &290        &350        &55\\  \cline{3-6}
\rowcolor{strongRed}
(20\% constr.)   & 10x10 &15320      &810        &960        &120 \\  \cline{3-6}
\hline \hline
    \end{tabular}

В документе такая таблица выглядит вот так:


Здесь ещё можно отметить использование || в качестве двойного разделителя колонок.




Изменение размеров строк и столбцов в ЛаТеХ таблице

Переменная \arraystretch отвечает за расстояние между строками а переменная \tabcolsep соответственно за расстояние между столбцами. В примере ниже мы сделаем столбцы и строки пошире:

\renewcommand{\arraystretch}{1.8} %% increase table row spacing
\renewcommand{\tabcolsep}{1cm}   %% increase table column spacing
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
Расширение краёв: & \textbf{1,0-1,4} & размер ФРТ \\
\hline
Аподизация: & \textbf{0,25-0,30} & размер ФРТ \\ 
\hline
Сглаживания краёв: & \textbf{0,25-0,50}& размер ФРТ \\
\hline
\end{tabular}
\end{center}

В документе это будет выглядеть так:



Изменение высоты одной строки в таблице

Иногда требуется сделать одну из строк в таблице побольше, не задевая все остальные. Здесь поможет трюк с командой rule: команда вставит невидимую горизонтальную линию заданной ширины и толщины:
\rule[высота подъёма линейки]{ширина}{толщина}
Это не единственный манёвр, который позволяет увеличить расстояние между строками: можно в конце строки, после \\ вставить [1cm], увеличив размер строки соответственно.

В данном примере мы расширим первую строку в таблице с помощью \rule{0cm}{2cm} и вторую с помощью [1cm] следующим образом:

\begin{center}
\begin{tabular}{|c|c|c|}
\hline
\rule{0cm}{2cm}
Расширение краёв: & \textbf{1,0-1,4} & размер ФРТ \\
\hline
Аподизация: & \textbf{0,25-0,30} & размер ФРТ \\  [1cm]
\hline
Сглаживания краёв: & \textbf{0,25-0,50}& размер ФРТ \\
\hline
\end{tabular}
\end{center}
 
Так выглядит таблица в документе:


Ещё немного о трюках с таблицами можно почерпнуть там.




Книжные таблицы в LaTeX: booktabs

По умолчанию таблицы, набранные в латехе, смотрятся неплохо, хотя им недостаёт "книжного" вида. Например, первая и последняя линия в таблице обычно жирнее, чтобы показать начало и конец таблицы.

Если вам хочется набирать таблицы "как у больших дядь в книжках", можно воспользоваться пакетом booktabs. Подключив в преамбуле документа \usepackage{booktabs} мы сразу же имеем возможность набирать красивые таблицы.
"Большие дяди" стараются сделать таблицы проще, с комфортным для глаз расстояниями между строками, и почти никогда не используют вертикальные разделители.
Вот код для такой таблицы:

\begin{tabular}{llr}
\toprule     %%% верхняя линейка
\multicolumn{2}{c}{Постобработка} \
\cmidrule(r){1-2}
Вид & Описание & Время выполнения, сек. \
\midrule %%% тонкий разделитель 
Расширение краёв        & холодный старт & 12 \
                    & горячий старт &    8 \
Аподизация          & симметричная  & 90 \
Сглаживания краёв   & по Гауссу  & 33 \
\bottomrule %%% верхняя линейка
\end{tabular}
 
Вот как выглядит такая таблица:




Когда столбцов в таблице слишком много...

Чтобы проще было задавать число колонок таблицы, особенно если их много, можно использовать конструкцию вида \begin{tabular}{l*{X}{l}}, где X это число колонок.

Вот пример такой таблицы с 10 колонками:

\begin{tabular}{l*{10}{l}}
\hline
Расширение краёв:   &  1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\
\hline
Аподизация:             & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\
\hline
Сглаживания краёв:  & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9  \\
\hline
\end{tabular}

А вот как она выглядит в готовом документе:


Стоит отметить пакет siunitx, который предоставляет возможность  выравнивания по десятичной точке или запятой. Также можно посмотреть на пакет array, предоставляющий расширенные версии окружений tabular и array (например, вертикально центрированные колонки и возможность определять новые типы колонок).


Ссылки

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

Конечно, есть ещё много пакетов по работе с таблицами, например ltxtable - это longtable и tabularx, который стоит использовать для создания больших и сложных таблиц с разделением по страницам, с кучей текста в ячейках. Многостраничные таблицы так же может создавать пакет supertab.

Cтоит упомянуть пакет slashbox, который позволяет создавать ячейки, разделенные по диагонали.

Стоит ещё отметить хороший туториал по таблицам, который включает \multirow и \multicol. Поборники русского стиля оформления таблиц могут заинтересоваться постом по ссылке.
Image
Sunday, December 30th, 2012
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
9:00 pm
Новый 2013 год и подведение итогов 2012
Очередной понедельничный пост, на сей раз новогодний. Решил подвести немного итогов года, оглянуться назад и почить на лаврах :-)

Как оно было?

Год выдался весьма плодотворным: было много конференций, узнал много нового, обновил парк ноутбуков и реализовал хрустальную мечту юности (Lenovo X201 Tablet).

В смысле постов - их было столько же, сколько и в предыдущем году. Стало больше гостевых постов, и это радостно: гостевые посты вносят свежую струю в блог, и так я узнаю много нового и интересного (и надеюсь, не только я).

Запущен в тестовом режиме Лунодром "Дебианити". Это совсем мелкие заметки на манжетах, ссылки и прочие наброски, не подходящие под формат записок. Итог моих экспериментов со scriptogr.am и markdown, а так же временное решение проблемы хранения мелких набросков под рукой (ещё один блог заводить не хочется, здесь публиковать рано или ни к чему, а пригодиться могут).

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

Топ5 постов, которые нравятся мне

Есть посты, которые пишутся в формате "чтобы не забылось" - и это почти всё про LaTeX и Gnuplot, которыми я пользуюсь постоянно. Но есть и нечто особенное, что стоит много часов и дней усилий по сбору материала и выпиливанию подробностей. Итак, мой Топ-5 постов за этот год, которые мне нравятся.

Странное рождение и долгая жизнь UNIX

Пост года, во всяком случае для меня, и самый большой перевод с английского на русский. На перевод и утрясание копирайтов с IEEE ушло почти четыре дня, но результат того стоил. Хотя переводчик с меня не очень хороший, смысл, думаю, передать удалось. Пост важен с исторической точки зрения, дабы помнить, с чего всё начиналось.
Статистика: +31 Plus one, 27 Comments, 5977 Views.

Markdown - гаечный ключ для забивания треугольных болтов

После того, как я нашёл применение Markdown в качестве простого и быстрого генератора вложенных списков для LaTeX, он стал частью моего workflow. Но этому предшествовала переписка с iv_vl, которая, надо сказать, направила меня по ложному следу. Пост был написан после того, как я перепробовал массу опенсорсных сноповязалок и прочих велосипедов с квадратными колёсами :-)
Статистика: +24 Plus one, 33 Comments, 2699 Views.

Краткий обзор современных окружений рабочего стола

Несколько неожиданный для меня экспромт Vlsu, ставший отличным постом. Прекрасные иллюстрации, структура и описания, хотя самый первый вариант был вызывающе неполиткорректным :-) Тем не менее, пост более чем стоил усилий, на него потраченных - один из лучших постов этого года, и абсолютный лидер по количеству просмотров. Браво, Vlsu, снимаю шляпу.
Статистика: +25 Plus one, 72 Comments, 13020 Views.

Pomodoro: тайм-менеджмент, который работает

Pomodoro я использую уже больше года, и для меня это было большим прорывом в плане учёта и анализа собственной продуктивности. Позволяет делать больше без стахановских рывков и прочего ненужного героизма. Пост, один из самых подробных за этот год, писался долго и был сильно улучшен усилиями комментаторов.
Статистика: +28 Plus one, 26 Comments, 3991 Views.

Настольный Змей Горыныч

Один из наиболее информативных постов для меня лично - узнал много нового про multihead, хотя это стоило некоторых денег (купленные переходники, хотя и используются время от времени, но tripple-head на ноутбуке не вышел). Пост нравится своей структурированностью, которая стоила немалых усилий. Кроме того, один из немногих постов, почти полностью написанный в Markdown.
Статистика: +22 Plus one, 18 Comments, 2169 Views.



Топ5 постов, которые понравились читателям

Здесь я ориентировался по числу PlusOne и просмотрам. В комментариях можно отвести душу и привести свои списки, но здесь балом правит бездушная статистика.

Вскрытие 9В батарейки: в поисках батареек АААА

Написанный за час и почти не стоивший усилий, пост неожиданно понравился народу на Хабре и собрал больше всех ПлюсАдынов за этот год (почти полсотни). Все деньги, потраченные на его написание, с лихвой отбились кассовыми сборами с рекламы :-)
Статистика: +46 Plus one, 18 Comments, 5041 Views.

Странное рождение и долгая жизнь UNIX

Здесь наши симпатии совпадают - второй пост по плюсадинам. Кривизну перевода сильно выправил тов. Minoru, за что ему большое спасибо.
Статистика: +31 Plus one, 27 Comments, 5977 Views.

Краткий обзор современных окружений рабочего стола

Самый комментируемый и самый посещаемый пост года от Vlsu. Уже растащен на скриншоты, понаставлена куча ссылок и есть по крайней мере два репоста. Как говорится, признание к художнику приходит не тогда, когда его работы в первый раз выставят, а тогда, когда их в первый раз украдут :-)
Статистика: +25 Plus one, 72 Comments, 13020 Views.

Возможности настройки GRUB2 в Linux

Второй пост по числу просмотров в этом году, и не мой, а написанный Yamamaya. Очень подробный и насыщенный деталями, хотя это и было главным объектом критики ведущего. Тем не менее, пост информативный и второй по количеству просмотров за год.
Статистика: +24 Plus one, 29 Comments, 10591 Views.

Как редактировать в Vim без порчи и бибиканья

Снова гостевой пост, на этот раз от Pento, о текстовом редакторе, который пищит и всё портит. Несмотря на краткость и лаконичность, набрал почти 9000 просмотров и часто появляется в поисковых запросах о Vim.
Статистика: +6 Plus one, 38 Comments, 8480 Views.

И ещё немного статистики

Отбирать что-то лучшее всегда непросто, поэтому я приведу Топ5 самых посещаемых, самых комментируемых и собравших больше всех +1 постов, опубликованных в этом году. Ваше слово, товарищ Статистика!

Самые плюсадинистые


Название постаPlus oneCommentsViews
Вскрытие 9В батарейки: в поисках батареек АААА46185041
Странное рождение и долгая жизнь UNIX31275977
Pomodoro: тайм-менеджмент, который работает28263991
Краткий обзор современных окружений рабочего стола257213020
Возможности настройки GRUB2 в Linux242910591
Markdown - гаечный ключ для забивания24332699

 

Самые комментируемые

Название постаPlus oneCommentsViews
Краткий обзор современных окружений рабочего стола257213020
Вычислительный танк заряженный свободой: ThinkPad  15675854
Как редактировать в Vim без порчи и бибиканья6388480
Назад в мезозой к программным динозаврам 19372001
Markdown - гаечный ключ для забивания24332699
Консольный Mplayer: мощь без границ21333371

Самые просматриваемые


Название постаPlus oneCommentsViews
Краткий обзор современных окружений рабочего стола257213020
Возможности настройки GRUB2 в Linux242910591
Как редактировать в Vim без порчи и бибиканья6388480
Навигационные программы для Android6318227
Странное рождение и долгая жизнь UNIX31275977



Глядя в даль...

В следующем году будет... а, впрочем, кто его знает, что там будет. Много черновиков и идей, мало времени, много интересного. Приоткрывая пухлую папку черновиков, можно видеть наброски про латех, гнуплот, программирование на C и Матлаб, не очень много про железо, немного про ядро, пара забойных обзоров и ещё кое-что про Андроид. Ну и что там гостевые авторы понапишут. Кстати, ваши посты тоже тут могут засветиться - гостевые посты принимаются в любое время.


Открывая шампанское...

С новым годом Линукса на Десктопе! Чтоб никогда ничего не падало, чтоб фич было много, а багов - мало. Чтоб была свобода, Столлман, равенство и братство :-)

Ну и уж этот-то год точно станет Годом Линукса на Десктопе :-)
Image
Sunday, December 16th, 2012
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
6:04 pm
Декомпиляторы, или Что делать, если нужно восстановить исходники из бинарников?
Проблема восстановления исходного кода из скомпилированных бинарников возникает сравнительно часто и протекает остро, с воем и рыданиями. Здесь нам, до некоторой степени, помогут замечательные программы-декомпиляторы, и в этом посте автор собрал свои скромные попытки выдрать исходники (или хотя бы намёки на них) из скомпилированных из С-шного кода бинарников.


Задача для декомпилятора бинарников, собранных из С кода:
Классический случай: один деятель на факультете написал на правильном ANSI C (и используя библиотеки BLAS и LAPACK) нужные и хорошие алгоритмы, и скомпилировал их в виде MEX-файлов для использования (это С-шный код, который можно вызывать из МАТЛАБ).

Но потом он повздорил с народом, разозлился и свалил в частную контору, унеся все исходники с собой. Документации нет. Копий исходников нет. Есть обрывки личной переписки и намёки в сопровождающих файлах на тип алгоритма. Вариант физического воздействия на автора тупыми тяжёлыми предметами не рассматривается.

Нужно восстановить исходники если и не до компилируемого состояния, то во всяком случае выудить оттуда алгоритмы и ключевые методы, использованные при реализации.


Кратко: суть и сложность проблемы
Декомпилятор (Decompiler) пытается перевести скомпилированный бинарный файл обратно в некое подобие исходного кода. Качество выхлопа зависит от особенностей языка исходника:
  • Для C# или Java есть много декомпиляторов - байткод на java содержит  много информации. Это помогает восстанавливать декомпилятору исходник до состояния, пригодного к повторной компиляции.
  • Совершенно другая история с двоичными файлами, в которых, как правило, отладочной информации нет. Тем не менее, динамически связанные библиотеки функций, как правило, вызываются по имени. Часто, типы параметров библиотечных функций известны, и это может помочь до известных пределов. 
Декомпиляторы пытаются восстановить информацию, которая частично утрачена при компиляции в бинарный файл - в этом и заключается основная сложность.

Если вы думаете, что с помощью декомпилятора вы получите обратно красивый код на С - вы будете сильно разочарованы.  В лучшем случае на выходе будет общая (и довольно грубая) структура программы, в худшем - только имена функций и немного мусора.

Так что ответ на вопрос заголовка поста: "Обхватить голову руками и закричать #$@@@@@!" :-)


Программы для декомпилирования (decompilers) для C/C++
Декомпиляторов для C/C++ немного, и ниже список из наиболее работоспособных. Здесь нет разделения на опенсорс или Linux-only - для такого дела, как вскрытие исходников, можно (и нужно) поступиться своими светлыми идеалами и наступить на горло собственной песне.

Сразу замечу: скорее всего, ни один декомпилятор не выдаст вам сразу компилируемый код. Придётся потратить порядком времени и сил, чтобы это месиво превратить в код, который можно читать (желательно, не только компилятору).


Boomerang
Boomerang это C decompiler с открытыми исходами:
  • поддерживаемые бинарные форматы:  ELF  PE-COFF Mac-OS
  • платформы: Windows/Linux
  • поддерживаемые архитектуры: IA32 MIPS PPC
  • метод работы: поточный, есть жалкий графический интерфейс, лучше использовать CLI.
Весьма продвинутый набор алгоритмов анализа кода, что не удивительно - один из соавтором защитил на этом докторскую диссертацию [Michael James Van Emmerik, Static Single Assignment for Decompilation, Ph.D. thesis, the University of Queensland, Australia. PDF, mirror PDF].

Качество кода, выдаваемого декомпилятором:
  • Структурирование: очень хорошее
  • Переменные: хорошее
  • Типы данных: очень хорошее
Выдаваемое качество кода сильно варьируется: некоторые функции почти идеально восстановлены, хорошо видна структура кода и есть указание типа переменных. В других случаях функции сильно запутаны и их почти невозможно прочитать.

Программа всё ещё в состоянии бета-версии и для больших проектов не подходит. Скачать можно здесь.


RecStudio
Интерактивный декомпилятор RecStudio для С и (отчасти) С++, закрытая разработка:
  • поддерживаемые бинарные форматыELF  PE-COFF AOUT RAW PS-X
  • платформы: Windows/Linux/MacOS
  • поддерживаемые архитектуры: x86 (ia32) x86_64 Mips PowerPC mc68k
  • метод работы: поточный и интерактивный, есть графический интерфейс.
Использует продвинутый набор алгоритмов анализа (partial Single Static Assignment, SSA), хотя до сих пор (и это после 20 лет!) в стадии разработки. Качество кода, выдаваемого декомпилятором:
  • Структурирование: хорошее
  • Переменные: частично
  • Типы данных: частично или никак
Выдаваемое качетсво кода, как правило, хуже, чем у Boomerang, хотя обновлённый RecStudio более подробен.

Программа работает вполне стабильно, есть сборки под Linux. Скачать можно здесь.



dcc - DOS to C decompiler
Поточный декомпилятор Dcc, только ANSI C  и для exe-файлов, с открытым исходным кодом под GPL:
  • поддерживаемые бинарные форматыEXE/COM
  • платформы: Windows
  • поддерживаемые архитектуры: x86
  • метод работы: поточный.
Один из первых декомпиляторов вообще, и только под DOS. Сильная сторона - структурирование кода. Качество кода, выдаваемого декомпилятором:
  • Структурирование: хорошее
  • Переменные: частично
  • Типы данных: частично или никак
Разработка Cristina Cifuentes, которая защитила PhD в Queensland University of Technology  на этом деле [можно полистать, если что - C. Cifuentes, Reverse Compilation Techniques].

Скачать можно отсюда (на сайте университета).



Hex Rays - plugin для IDA Pro
На самом деле Hex Rays не является отдельной программой - это плагин-декомпилятор для IDA Pro. Комбинация продвинутых возможностей IDA Pro (это дизассемблер) и Hex Rays в качестве декомпилятора очень впечатляет, как и аэрокосмическая цена.
По причине закрытости продукта (нет даже демо-версии) и нереальной цены в этом разделе про Hex Rays больше ничего написано не будет.




Ходовые испытания в реальных условиях
Для начала попробуем декомпилировать что-нибудь совсем простенькое и написанное на ANSI C и с использованем библиотеки BLAS для векторых и матричных операций. Бинарный файл можно скачать здесь.



1. Простенький C-шный бинарник + BLAS
Собственно, код на C для перемножения матрицы и вектора (используется CBLAS). Исходник:


#include <stdio.h>
#include <cblas.h>

double m[] = {
  3, 1, 3,
  1, 5, 9,
  2, 6, 5
};

double x[] = {
  -1, -1, 1
};

double y[] = {
  0, 0, 0
};

int main(void)
{
  int i, j;

  for (i=0; i<3; ++i) {
    for (j=0; j<3; ++j) printf("%5.1f", m[i*3+j]);
    putchar('\n');
  }

  cblas_dgemv(CblasRowMajor, CblasNoTrans, 3, 3, 1.0, m, 3, x, 1, 0.0, y, 1);


  for (i=0; i<3; ++i)  printf("%5.1f\n", y[i]);

  return 0;
}

После перемножения выдаст результат на консоль.

Выхлоп Boomerang
У него много ключей и параметров, часть которых не знает даже официальная, скажем так, документация. Тем не менее, для ключа -Td (Use data-flow-based type analysis) мы имеем выхлоп в стиле дзен:

double y;
double m = 3.;

// address: 0x80484e4
int main(int argc, char **argv, char **envp) {
    void *local23;   // r28

    for(;;) {
        proc1();
    }
}

Скажем так, не слишком ободряюще. Ключ  -Tc (Use old constraint-based type analysis) выдаёт больше информации к размышлению:

char y[24];
long long m[9] = { 0x4008000000000000LL, 0x3ff0000000000000LL, 0x4008000000000000LL, 0x3ff0000000000000LL, 0x4014000000000000LL, 0x4022000000000000LL, 0x4000000000000000LL, 0x4018000000000000LL, 0x4014000000000000LL };

// address: 0x80484e4
int main(int argc, char **argv, char **envp) {
    int local10;   // r24
    int local13;   // r28
    int local14;   // r29
    int local15;   // r32
    int local2;   // m[r28 + 72]{60}
    int local3;   // r28{181}
    int local6;   // m[r28 + 72]{119}
    int local7;   // m[r28 + 72]{149}
    int local8;   // m[r28 + 76]{9}
    int local9;   // m[r28 + 76]{49}

    *(int*)(local13 - 4) = local14;
    *(int*)(local13 - 12) = 0;
    local3 = local13 - 84;
    if (*(int*)(local3 + 72) > 2) {
        *(int*)(local3 + 52) = 1;
        *(int*)(local3 + 48) = 0x8049868;
        *(long long*)(local3 + 40) = 0.;
        *(int*)(local3 + 36) = 1;
        *(int*)(local3 + 32) = 0x8049848;
        *(int*)(local3 + 28) = 3;
        *(int*)(local3 + 24) = 0x8049800;
        *(long long*)(local3 + 16) = 1.;
        *(int*)(local3 + 12) = 3;
        *(int*)(local3 + 8) = 3;
        *(int*)(local3 + 4) = 111;
        *(int*)local3 = 101;
        cblas_dgemv();
        local6 = 0;
        for(;;) {
            *(long long*)(local3 + 4) = y[0];
            *(int*)local3 = 0x80486b6;
            proc1();
            local7 = *(int*)(local3 + 72) + 1;
        }
    }
    local8 = 0;
    for(;;) {
        local10 = *(int*)(local3 + 72) + *(int*)(local3 + 72) + *(int*)(local3 + 72);
        local15 = m[local10];
        *(long long*)(local3 + 4) = local15;
        *(int*)local3 = 0x80486b0;
        proc1();
        local9 = *(int*)(local3 + 76) + 1;
    }
} 
 

Подробностей тут больше, и тут выловлен самый главный ключик - cblas_dgemv();    


Выхлоп RecStudio
Намного более обилен и представляет собой следующий поток сознания:


// Generated by Rec Studio 4 - build Oct 20 2012

_init()
{// addr = 0x08048398
    _unknown_ __ebx;                       // r1
    _unknown_ __ebp;                       // r6
    _unknown_ _t2;                         // _t2

    __esp = __esp - 4;
    L1();
    _pop(__ebx);
    if( *((intOrPtr*)(_t2 + 0x1414)) != 0) {
        __gmon_start__();
    }
    frame_dummy();
    __do_global_ctors_aux();
    _pop(__eax);
    return;
}

L080483A4()
{
    _unknown_ _t2;                         // _t2

    _pop(__ebx);
    if( *((intOrPtr*)(_t2 + 0x1414)) != 0) {
        __gmon_start__();
    }
    frame_dummy();
    __do_global_ctors_aux();
    _pop(__eax);
    _pop(__ebx);
    __esp = __ebp;
    _pop(__ebp);
    return;
}

__gmon_start__()
{// addr = 0x080483D8
    goto __imp____gmon_start__;
}

putchar()
{// addr = 0x080483E8
    goto __imp__putchar;
}

__libc_start_main()
{// addr = 0x080483F8
    goto __imp____libc_start_main;
}

cblas_dgemv()
{// addr = 0x08048408
    goto __imp__cblas_dgemv;
}

printf()
{// addr = 0x08048418
    goto __imp__printf;
}

_start(
    signed int __eax,                      // r0
    _unknown_ __edx                        // r3
)
{// addr = 0x08048430
    _unknown_ __ebx;                       // r1
    signed int _t5;                        // _t5
    _unknown_ _t6;                         // _t6
    _unknown_ _t10;                        // _t10

    __edx = __edx;
    _t4 = __eax;
    _pop(__esi);
    __ecx = __esp;
    __esp = __esp & 240;
    _push(__eax);
    _push(__esp);
    _push(__edx);
    _push(__libc_csu_fini);
    _push(__libc_csu_init);
    _push(__ecx);
    _push(_t10);
    _push(main);
    __libc_start_main();
    asm("hlt ");
    0;
    0;
    _push(0);
    _push(_t6);
    __esp = __esp - 4;
    if(completed.5982 != 0) {
    } else {
        _t4 = dtor_idx.5984;
        _t6 = ( &__DTOR_END__ -  &__DTOR_LIST__ >> 2) - 1;
        if(_t4 >= _t6) {
        } else {
            do {
                _t5 = _t4 + 1;
                dtor_idx.5984 = _t5;
                 *((intOrPtr*)(_t5 * 4 +  &__DTOR_LIST__))();
                _t4 = dtor_idx.5984;
            } while(_t4 < _t6);
        }
        completed.5982 = 1;
    }
    __esp = __esp + 4;
    _pop(__ebx);
    _pop(__ebp);
    return;
}

__do_global_dtors_aux(
    _unknown_ __esi                        // r5
)
{// addr = 0x08048460
    _unknown_ __ebx;                       // r1
    _unknown_ __ebp;                       // r6
    _unknown_ _t4;                         // _t4
    signed int _t5;                        // _t5
    signed int _t6;                        // _t6
    _unknown_ _t10;                        // _t10

    if(completed.5982 == 0) {
        _t5 = dtor_idx.5984;
        _t10 = ( &__DTOR_END__ -  &__DTOR_LIST__ >> 2) - 1;
        if(_t5 >= _t10) {
L4:
            completed.5982 = 1;
            return;
        }
        do {
            _t6 = _t5 + 1;
            dtor_idx.5984 = _t6;
             *((intOrPtr*)(_t6 * 4 +  &__DTOR_LIST__))();
            _t5 = dtor_idx.5984;
        } while(_t5 < _t10);
        goto L4;
    }
    return;
}

frame_dummy()
{// addr = 0x080484C0
    _unknown_ __ebp;                       // r6

    __eax = __JCR_LIST__;
    if(__JCR_LIST__ == 0) {
    } else {
        __eax = 0;
        if(__eax != 0) {
             *__esp =  &__JCR_LIST__;
             *__eax();
            return;
        }
    }
    return;
}

main(
    _unknown_ __fp0                        // r28
)
{// addr = 0x080484E4
    signed int _v8;                        // _cfa_fffffff8
    signed int _v12;                       // _cfa_fffffff4
    intOrPtr _v32;                         // _cfa_ffffffe0
    char* _v36;                            // _cfa_ffffffdc
    intOrPtr _v48;                         // _cfa_ffffffd0
    char* _v52;                            // _cfa_ffffffcc
    intOrPtr _v56;                         // _cfa_ffffffc8
    char* _v60;                            // _cfa_ffffffc4
    intOrPtr _v72;                         // _cfa_ffffffb8
    intOrPtr _v76;                         // _cfa_ffffffb4
    intOrPtr _v80;                         // _cfa_ffffffb0
    _unknown_ __ebp;                       // r6

    __fp0 = __fp0;
    __esp = __esp & 240;
    __esp = __esp - 80;
    _v12 = 0;
    while(_v12 <= 2) {
        _v8 = 0;
        while(_v8 <= 2) {
            __fp0 ?_?  *((long long*)((_v12 + __edx + __edx + _v8) * 8 +  &m));
            asm("fstp qword [esp+0x4]");
             *__esp = 134514352;
            printf();
            _v8 = _v8 + 1;
        }
         *__esp = 10;
        putchar();
        _v12 = _v12 + 1;
    }
    _v32 = 1;
    _v36 =  &y;
    asm("fldz ");
    asm("fstp qword [esp+0x28]");
    _v48 = 1;
    _v52 =  &x;
    _v56 = 3;
    _v60 =  &m;
    asm("fld1 ");
    asm("fstp qword [esp+0x10]");
    _v72 = 3;
    _v76 = 3;
    _v80 = 111;
     *__esp = 101;
    cblas_dgemv();
    _v12 = 0;
    while(_v12 <= 2) {
        __fp0 ?_?  *((long long*)(_v12 * 8 +  &y));
        asm("fstp qword [esp+0x4]");
         *__esp = "%5.1f\n";
        printf();
        _v12 = _v12 + 1;
    }
    return 0;
}

__libc_csu_fini()
{// addr = 0x080485F0
    _unknown_ __ebp;                       // r6

    return;
}

__libc_csu_init(
    intOrPtr _a4,                          // _cfa_4
    intOrPtr _a8,                          // _cfa_8
    intOrPtr _a12                          // _cfa_c
)
{// addr = 0x08048600
    intOrPtr _v36;                         // _cfa_ffffffdc
    intOrPtr _v40;                         // _cfa_ffffffd8
    _unknown_ __ebx;                       // r1
    _unknown_ __edi;                       // r4
    signed int __esi;                      // r5
    _unknown_ __ebp;                       // r6
    _unknown_ _t14;                        // _t14
    _unknown_ _t15;                        // _t15
    signed int _t18;                       // _t18

    __i686.get_pc_thunk.bx();
    _t15 = _t14 + 4529;
    __esp = __esp - 28;
    _init();
    _t18 = _t15 + -248 - _t15 + -248 >> 2;
    if(_t18 == 0) {
    } else {
        __esi = 0;
        do {
            _v36 = _a12;
            _v40 = _a8;
             *__esp = _a4;
             *((intOrPtr*)(_t15 + -248 + __esi * 4))();
            __esi = __esi + 1;
        } while(__esi < _t18);
    }
    __esp = __esp + 28;
    return;
}

__i686.get_pc_thunk.bx()
{// addr = 0x0804865A
    return;
}

__do_global_ctors_aux()
{// addr = 0x08048660
    intOrPtr* __ebx;                       // r1
    _unknown_ __ebp;                       // r6

    __eax = __CTOR_LIST__;
    if(__eax == 255) {
    } else {
        __ebx =  &__CTOR_LIST__;
        asm("o16 nop ");
        do {
            __ebx = __ebx - 4;
             *__eax();
            __eax =  *__ebx;
        } while(__eax != 255);
    }
    return;
}

_fini()
{// addr = 0x0804868C
    _unknown_ __ebx;                       // r1
    _unknown_ __ebp;                       // r6
    _unknown_ _t1;                         // _t1

    __esp = __esp - 4;
    L1();
    _pop(__ebx);
    __do_global_dtors_aux(__esi);
    _pop(__ecx);
    return;
}

L08048698()
{
    _unknown_ _t1;                         // _t1

    _pop(__ebx);
    __do_global_dtors_aux(__esi);
    _pop(__ecx);
    _pop(__ebx);
    __esp = __ebp;
    _pop(__ebp);
    return;
}

L08048698()
{
    _unknown_ _t1;                         // _t1

    _pop(__ebx);
    @rec __do_global_dtors_aux@__do_global_dtors_aux@(__esi);
    _pop(__ecx);
    _pop(__ebx);
    __esp = __ebp;
    _pop(__ebp);
    return;
}

// Statistics:
//      74 Register nodes
//      35 Temporaries nodes
//       5 Casts
//     207 Statements
//       2 Labels
//       1 Gotos
//      17 Blocks
//     469 Nodes
//      10 Assembly nodes
//      27 Unknown Types


Total time: 0 seconds.


Структура программы (вначале) в общем несколько лучше, чем у Boomerang, и куда больше подробностей.



2. Бен, ай нид хелп: MEX-файл,
Sunday, December 9th, 2012
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
7:30 pm
Как оформить исходный код программ в LaTeX без адских страданий
Иногда в документ LaTeX нужно вставить кусок программного кода или псевдокод, поясняющий алгоритм. В зависимости от языка программирования и целей, подсветка кода в LaTeX достигается подключаемыми пакетами расширений разной степени кривизны и безумия документации.


Пост подвергался чистке и правке после публикации:
Автор заходил править этот пост 5 января 2013 года.


Как просто вставить программный код в LaTeX без боли и страданий?
Именно такой вопрос однажды получил автор этих строк в свой ящик электропочты. Ответ: если хочется quick-and-dirty решения, можно воспользоваться пакетом verbatim, который запрещает LaTeX обрабатывать вставленный код и просто отображает код как есть.  Дёшево и сердито:
\begin{verbatim}
int main(void)
{
int i, j;

for (i=0; i<3; ++i) {
for (j=0; j<3; ++j) printf("%5.1f", m[i*3+j]);
putchar('\n');
}

cblas_dgemv(CblasRowMajor, CblasNoTrans, 3, 3, 1.0, m, 3, x, 1, 0.0, y, 1);


for (i=0; i<3; ++i) printf("%5.1f\n", y[i]);

return 0;
}
\end{verbatim}

Перед вставкой можно сделать так:
cat -n code.c | fold -w 60
Такая комбинация берёт исходный код в файле code.c и расставляет номера строк (ключ -n), перенося длинные строки (ключ -w 60 для ширины в 60 символов). Вот как это будет выглядеть в итоге:


Просто, дёшево, сердито и безболезненно.


Verbatim с оформлением - alltt
Ещё есть пакет под звучным названием alltt, который добавляет окружение alltt - это тот же verbatim, только в нём доступно оформление  цветом, полужирным и т.д. Вот пример:

 А вот для него код:

\documentclass[a4paper,10pt]{article}

\usepackage[T2A]{fontenc}
\usepackage[koi8-r]{inputenc}

\usepackage[usenames,dvipsnames]{color}

\usepackage{alltt}

\begin{document}

\section{C code via alltt}
\begin{alltt}
     \textit{1   int main(void)}
     2  {
     3    int i, j;
     4
     5    for (i=0; i<3; ++i) {
     6      for (j=0; j<3; ++j) printf("%5.1f", m[i*3+j]);
     7      putchar('\\n');
     8    }
     9
    10    cblas_dgemv(CblasRowMajor, CblasNoTrans, 3, 3, 1.0
, m, 3, x, 1, 0.0, y, 1);
    11
    12
    14
    15    return 0;
    16  }
\end{alltt}


\end{document} 
 
Нюанс: в alltt eсть проблема c экранированием специальных символов типа \ и { поскольку alltt начинает воспринимать их как элементы оформления. Документация состоит из двух страниц.



Как оформить псевдокод в LaTeX?
Часто приводить дословно  исходный код программы не требуется, но нужно пояснить общий ход алгоритма псевдокодом. Для оформления псевдокодов и алгоритмов наиболее вменяемый пакет называется algorithm2e доступный отсюда.

Скачиваем стилевой файл algorithm2e.sty и прописываем его в преамбуле документа:
\usepackage[linesnumbered,boxed]{algorithm2e}

Здесь я включил следующие полезные параметры:
  • linesnumbered - включает нумерацию строк в алгоритме.
  • boxed - рисует рамку вокруг алгоритма.
Про остальные параметры можно узнать из отличной документации algorithm2e.pdf в разделе 6 The options of the package.

Вот как выглядит алгоритм, оформленный пакетом algorithm2e::

А вот для него код с комментариями (здесь комментарии, показанные серым цветом - для латеха и они не будут видны в алгоритме,  а комментарии с двойной косой чертой - для показа в алгоритме):

\begin{algorithm}[H]
\SetAlgoLined %% Это соединяет линиями логические части
%% алгоритма типа if-then-else

\KwData{ experiment.data} %% здесь можно указать исходные параметры

\KwResult{ output, xoptimal } %% результат работы программы

x=0;

\While{ $\tau_{norm} > \varepsilon_{tol}$ }{

$s_{k-1} \leftarrow x_k - x_{k-1}$;

// Step lenght computation: %% это комментарий, который будет виден.

\eIf{$k$ is even}{
$ \alpha_k^{ABB} = \frac{ s_{k-1}^T y_{k-1}}{y_{k-1}^T y_{k-1}}$
}{ %% ELSE
$\alpha_k^{ABB} = \frac{ s_{k-1}^T s_{k-1}}{s_{k-1}^T y_{k-1}}$
} %% END \eIf{$k$ is even}{

$k \leftarrow k + 1$;

\For{ i = 1}{
$x_{i+1} = P_\Omega(x_i - \alpha_k^{ABB}*g_k)$;

} %% END \For{ i = 1}{

// Compute the termination constant %% это комментарий, который будет виден.

$\tau_{norm} = abs ( \,\,\, ||x_{k}||_2 - ||x_{k-1}||_2 \,)$

} %% END \While{ $\tau_{norm} > \varepsilon_{tol}$ }{

\caption{Pseudo-code for basic algorithm.}
\label{alg:generalGP}
\end{algorithm}

На алгоритм можно ссылаться, как и на другие объекты в ЛаТеХе -  пакет algorithm2e поддерживает ссылки обычной командой \label{alg:generalGP} и соответственно ссылкой \ref{alg:generalGP}.

Стоит отметить на удивление хорошую документацию: в справочном файле algorithm2e.pdf есть всё, что нужно настоящему джигиту ЛаТеХнику для оформления псевдокодов. Так, нужные параметры приведены в разделе 6, а в разделе 3.2 приведён беспощадный пример, в котором показаны чуть ли не все элементы, которые умеет воспроизводить algorithm2e.


Как вставить код MATLAB в документ LaTeX
Для подсветки синтаксиса и вставки программного кода MATLAB в LaTeX есть специальный пакет расширений под незамысловатым названием mcode. Для использования этого пакета добавляем строчку в преамбулу:
\usepackage[usenames,dvipsnames]{color}
\usepackage[numbered,framed]{mcode}
Обращаю внимание на то, что mcode должно идти после упоминания пакета color. Теперь, у mcode есть несколько параметров, а именно:
  • bw - по умолчанию код будет раскрашен так, как он видится в редакторе MATLAB, с зелёными комментариями. Параметр bw сделает весь код в оттенках серого.
  • numbered - включает нумерацию строк в коде (удобно, если вы обсуждаете в статье детали алгоритма).
  • framed -  рисует вокруг кода рамку.
Дальше всё просто - вставляем  кусок программного кода на MATLAB:
\begin{lstlisting}
% Example Matlab code for calculating hypotenuse
% $c = \sqrt{a^2+b^2}$ §
a = 3;
b = 4;
c = sqrt(a^2+b^2);
\end{lstlisting}
И вот что мы увидим в документе:


На самом деле, всё, что делает mcode, это конфигурирует пакет расширений listings - просто вся черновая работа делается за вас. Вот сейчас начнётся настоящий хардкор, ибо мы переходим к пакету listings...


Оформление исходного кода программ в LaTeX с помощью listings
Самый мощный и кошмарный пакет LaTeX - listings, который может почти всё (кроме заваривания кофе), но самая большая проблема - выяснить, как и что со всем этим делать.  В этом посте я просто приведу пример применения пакета listings и описание его настроек, чтобы самому не пришлось перечитывать кошмарную документацию listings.pdf

Для примера вставим исходный код программы на С в документ LaTeX с помощью listings.
Сразу скажу: всё нижеперечисленное приведено для английского языка, чтобы не огрести проблем ещё и с кириллицей. С языком осин и берёз listings дружит плохо, и кроме того, не переваривается latex2rtf - это важно, когда документ будет конвертироваться в ворд.

Сначала правим преамбулу документа:

\documentclass[a4paper,10pt]{article}

\usepackage{color} %% это для отображения цвета в коде
\usepackage{listings} %% собственно, это и есть пакет listings

\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}} %% это сделает текст заголовка белым
%% код ниже нарисует серую рамочку вокруг заголовка кода.
\DeclareCaptionFormat{listing}{\colorbox{gray}{\parbox{\textwidth}{#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white}
\begin{document}

Теперь уже внутри документа настраиваем вид оформление исходника   программы на С. Здесь я привёл основные параметры с пояснениями, что они делают:

\lstset{ %
language=C,                 % выбор языка для подсветки (здесь это С)
basicstyle=\small\sffamily, % размер и начертание шрифта для подсветки кода
numbers=left,               % где поставить нумерацию строк (слева\справа)
numberstyle=\tiny,           % размер шрифта для номеров строк
stepnumber=1,                   % размер шага между двумя номерами строк
numbersep=5pt,                % как далеко отстоят номера строк от подсвечиваемого кода
backgroundcolor=\color{white}, % цвет фона подсветки - используем \usepackage{color}
showspaces=false,            % показывать или нет пробелы специальными отступами
showstringspaces=false,      % показывать или нет пробелы в строках
showtabs=false,             % показывать или нет табуляцию в строках
frame=single,              % рисовать рамку вокруг кода
tabsize=2,                 % размер табуляции по умолчанию равен 2 пробелам
captionpos=t,              % позиция заголовка вверху [t] или внизу [b] 
breaklines=true,           % автоматически переносить строки (да\нет)
breakatwhitespace=false, % переносить строки только если есть пробел
escapeinside={\%*}{*)}   % если нужно добавить комментарии в коде
}

Вставляем приведённые выше заклинания в тело документа и после этого куска кода вставляем, собственно, оформление исходника:

\begin{lstlisting}[label=some-code,caption=Some Code]
int main(void) // main routine
{
int i, j; // Initialisation of counters

// The code below prints the 3x3 matrix
for (i=0; i<3; ++i) {
for (j=0; j<3; ++j) printf("%5.1f", m[i*3+j]);
putchar('\n');
}

cblas_dgemv(CblasRowMajor, CblasNoTrans,
3, 3, 1.0, m, 3, x, 1, 0.0, y, 1);

// The code below prints the 3x3 matrix - result of multiplication
for (i=0; i<3; ++i) printf("%5.1f\n", y[i]);

return 0;
}
\end{lstlisting}

Это всё должно скомпилироваться и выдать следующий результат:


Сравнительно красиво, в цвете и с кучей настроек. Остальные 1350 тумблеров, настроек и параметров вы найдёте в документации listings.pdf
Замечание: Оказывается, algortithm2e очень не любит, когда вставляют разрыв строк - ругается, что пропущен параграф:
[LaTeX] digest-optimizationActiveSet.tex => digest-optimizationActiveSet.dvi (latex)
[LaTeX] finished with exit status 1
digest-optimizationActiveSet.tex:0:File ended while scanning use of \algocf@For.
[LaTeX] 1 error, 0 warnings, 0 badboxes


Listings и Хохруссиш... 
не созданы друг для друга. Можно попробовать рецепт в виде:
\lstset{language=Java,inputencoding=utf8x, extendedchars=\true ...
предложенный здесь (в комментариях), но listings не работает нормально с русским текстом, состоящим более, чем из одного слова

Зато listings работает с олдскульной и ортодоксальной koi8-r. Для это вставляем в преамбулу:

\usepackage[T2A]{fontenc}
\usepackage[koi8-r]{inputenc}%включаем свою кодировку: koi8-r или utf8 в UNIX, cp1251 в Windows
\renewcommand{\lstlistingname}{Листинг}

и далее меняем оформление исходника на это:

\begin{lstlisting}[label=some-code,caption={Это крутой исходный код}]
int main(void) // главная программа
{
int i, j; // инициализация счётчиков

// Сей код множит матрицу величиною 3x3
for (i=0; i<3; ++i) {
for (j=0; j<3; ++j) printf("%5.1f", m[i*3+j]);
putchar('\n');
}

// Вызов басурманской библиотеки BLAS
cblas_dgemv(CblasRowMajor, CblasNoTrans,
3, 3, 1.0, m, 3, x, 1, 0.0, y, 1);

// Подаём челобитную на экран
for (i=0; i<3; ++i) printf("%5.1f\n", y[i]);

return 0;
}
\end{lstlisting}

В итоге мы получим кириллизованный фрагмент кода:



Нашедшие рабочий рецепт с listings и комментариями на русском в utf8 приглашаются им поделиться в комментариях.
Итоги дискуссии по оформлению программного кода с русскими комментариями в listings: решение в использовании команд escapechar=  или конвертацией документа в koi8/cp1251. Больше подробностей по этим ссылкам. Спасибо Роману Химову и Alexanius за ценные замечения в комментариях.
Тем не менее, listings, хотя и не идеален, но представляет собой наиболее гибкое решение.


Альтернативы
Есть и другие способы добиться от LaTeX большой и чистой любви раскраски и подсветки исходного кода.

highlight
Среди альтернатив выделяется во всех смыслах программа highlight, которая может быть использована для генерации LaTeX-разметки из исходника. Хорошая новость - у highlight проблем с UTF8 нет. Плохая новость в том, что highlight преобразует код таким образом, что его сложно корректировать вручную.

source-highlight
Другой вариант - использовать программу source-highlight, которая имеется в частности в репозиториях Debian. Установка не отнимет много сил и времени:
apt-get install source-highligh
и далее в командной строке пишем:
source-highlight --input code.c --out-format latexcolor --src-lang=C  --line-number > code.tex
То есть раскрасить исходный код из файла и выдать в теховский файл code.tex для вставки в документ. Выхлоп source-highlight выглядит вот так:

\noindent
\mbox{}\texttt{\textcolor{Black}{01:}} \ \textcolor{ForestGreen}{int}\ \textbf{\textcolor{Black}{main}}\textcolor{BrickRed}{(}\textcolor{ForestGreen}{void}\textcolor{BrickRed}{)} \\
\mbox{}\texttt{\textcolor{Black}{02:}} \textcolor{Red}{\{} \\
\mbox{}\texttt{\textcolor{Black}{03:}} \ \ \textcolor{ForestGreen}{int}\ i\textcolor{BrickRed}{,}\ j\textcolor{BrickRed}{;} \\
\mbox{}\texttt{\textcolor{Black}{04:}} \\
\mbox{}\texttt{\textcolor{Black}{05:}} \ \ \textbf{\textcolor{Blue}{for}}\ \textcolor{BrickRed}{(}i\textcolor{BrickRed}{=}\textcolor{Purple}{0}\textcolor{BrickRed}{;}\ i\textcolor{BrickRed}{\textless{}}\textcolor{Purple}{3}\textcolor{BrickRed}{;}\ \textcolor{BrickRed}{++}i\textcolor{BrickRed}{)}\ \textcolor{Red}{\{} \\
\mbox{}\texttt{\textcolor{Black}{06:}} \ \ \ \ \textbf{\textcolor{Blue}{for}}\ \textcolor{BrickRed}{(}j\textcolor{BrickRed}{=}\textcolor{Purple}{0}\textcolor{BrickRed}{;}\ j\textcolor{BrickRed}{\textless{}}\textcolor{Purple}{3}\textcolor{BrickRed}{;}\ \textcolor{BrickRed}{++}j\textcolor{BrickRed}{)}\ \textbf{\textcolor{Black}{printf}}\textcolor{BrickRed}{(}\texttt{\textcolor{Red}{"{}\%5.1f"{}}}\textcolor{BrickRed}{,}\ m\textcolor{BrickRed}{[}i\textcolor{BrickRed}{*}\textcolor{Purple}{3}\textcolor{BrickRed}{+}j\textcolor{BrickRed}{]);} \\
\mbox{}\texttt{\textcolor{Black}{07:}} \ \ \ \ \textbf{\textcolor{Black}{putchar}}\textcolor{BrickRed}{(}\texttt{\textcolor{Red}{'}}\texttt{\textcolor{CarnationPink}{\textbackslash{}n}}\texttt{\textcolor{Red}{'}}\textcolor{BrickRed}{);} \\
\mbox{}\texttt{\textcolor{Black}{08:}} \ \ \textcolor{Red}{\}} \\
\mbox{}\texttt{\textcolor{Black}{09:}} \\
\mbox{}\texttt{\textcolor{Black}{10:}} \ \ \textbf{\textcolor{Black}{cblas$\_$dgemv}}\textcolor{BrickRed}{(}CblasRowMajor\textcolor{BrickRed}{,}\ CblasNoTrans\textcolor{BrickRed}{,}\ \textcolor{Purple}{3}\textcolor{BrickRed}{,}\ \textcolor{Purple}{3}\textcolor{BrickRed}{,}\ \textcolor{Purple}{1.0}\textcolor{BrickRed}{,}\ m\textcolor{BrickRed}{,}\ \textcolor{Purple}{3}\textcolor{BrickRed}{,}\ x\textcolor{BrickRed}{,}\ \textcolor{Purple}{1}\textcolor{BrickRed}{,}\ \textcolor{Purple}{0.0}\textcolor{BrickRed}{,}\ y\textcolor{BrickRed}{,}\ \textcolor{Purple}{1}\textcolor{BrickRed}{);} \\
\mbox{}\texttt{\textcolor{Black}{11:}} \\
\mbox{}\texttt{\textcolor{Black}{12:}} \\
\mbox{}\texttt{\textcolor{Black}{13:}} \ \ \textbf{\textcolor{Blue}{for}}\ \textcolor{BrickRed}{(}i\textcolor{BrickRed}{=}\textcolor{Purple}{0}\textcolor{BrickRed}{;}\ i\textcolor{BrickRed}{\textless{}}\textcolor{Purple}{3}\textcolor{BrickRed}{;}\ \textcolor{BrickRed}{++}i\textcolor{BrickRed}{)}\ \ \textbf{\textcolor{Black}{printf}}\textcolor{BrickRed}{(}\texttt{\textcolor{Red}{"{}\%5.1f}}\texttt{\textcolor{CarnationPink}{\textbackslash{}n}}\texttt{\textcolor{Red}{"{}}}\textcolor{BrickRed}{,}\ y\textcolor{BrickRed}{[}i\textcolor{BrickRed}{]);} \\
\mbox{}\texttt{\textcolor{Black}{14:}} \\
\mbox{}\texttt{\textcolor{Black}{15:}} \ \ \textbf{\textcolor{Blue}{return}}\ \textcolor{Purple}{0}\textcolor{BrickRed}{;} \\
\mbox{}\texttt{\textcolor{Black}{16:}} \textcolor{Red}{\}}

В общем, запасайтесь дьяволы гробами. Выглядит результат вот так:


Автор source-highlight явно покуривает что-то очень весёлое и бодрящее, на что легко может возбудиться ФСКН :-) Для работы всей этой светомузыки в преамбуле документа должна быть команда:
\usepackage[usenames,dvipsnames]{color}
В целом, это костыль, конечно, но он, скажем так, работает.


Ссылки...
... приведены в посте выше, хотя это не предел человеческой фантазии, и имеют место быть альтернативы:
  • пакет fancyvrb для создания более продвинутого окружения verbatim;
  • пакет minted, основанный на Pygments, тоже может раскрашивать код.
Если уважаемые комментаторы накопают другие методы оформления кода в латех - просьба делиться в комментариях.
<a href="http://feeds.feedburner.com/~ff/debianletters?
Monday, November 26th, 2012
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
2:17 am
Как содрать DVD в AVI и записать обратно: AVI to DVD write and rip in Linux
Копирование DVD в AVI и тем более запись фильмов обратно на DVD не то, что автор этих строк делает часто. А когда надо, начинается чесание затылка и судорожные попытки вспомнить, как оно делалось однажды при синей луне. Далее небольшая заметка по созданию и сдиранию (rip) фильмов из видеофайлов на DVD и обратно.



Копирование DVD-диска в AVI видеофайл
Задача: имеется DVD-диск, и нужно его скопировать в AVI-видеофайл для резервного копирования или более удобного просмотра. При этом не очень хочется перечитывать томик квантовой физики мануал по MEncoder. К счастью, есть довольно много удобных программ по копированию DVD-видеодисков.

Как и чем содрать AVI файл из DVD
Для копирования DVD-дисков в Linux есть несколько программ, среди которых стоит отметить HandBrake и AcidRip.

AcidRip это графическая обёртка на GTK2 для MEncoder, и у неё есть трудности с копированием зашифрованных дисков. HandBrake в этом смысле лучше, так как HandBrake копирует и зашифрованные диски.

Установка HandBrake проста: нужно подключить репозитории Debian Multimedia. Для этого прописываем:
deb http://www.debian-multimedia.org squeeze main non-free
в файле  /etc/apt/sources.list и даём команду apt-get update и сразу же устанавливаем, собственно, HandBrake:

apt-get install handbrake-gtk
После установки можно сразу приступать к копированию DVD-видеодисков - интерфейс  HandBrake прост  и настройки по умолчанию дают приемлемый результат.


 Можно выставить желаемое качество видеосжатия или размер конечного файла (тогда установки видеосжатия будут изменены соответствующим образом).







Создание DVD-диска из AVI видеофайла
Допустим, у вас есть законно созданный видеофайл, и вам хочется создать DVD-диск, который сможет прочитать даже тупой китайский DVD-проигрыватель. Можно попробовать найти какие-нибудь графические поделки, но мы всё сделаем консольно и олдскульно (ибо оно чаще всего работает, а не просто кажет красивые кнопки). Тем более, что оно несложно.

Сестра, зажим!
Вот список того, что нам потребуется для заливания AVI файла на DVD:
  1. mencoder
  2. ffmpeg
  3. dvdauthor
  4. dvd+rw-tools
Всё это есть в Debian репозиториях, откуда мы их и ставим:
# aptitude install mencoder ffmpeg dvdauthor  dvd+rw-tools
Теперь всё готово к операции.


Как сконвертировать AVI в DVD
Если у нас есть несколько avi-файлов, например file1.avi и fille2.avi, сначала их надо слить в один:
$ cat file1.avi file2.avi > ccmovie.avi
Теперь нужно полученный файл прогнать через mencoder (опции -ovc и -oac просто копируют содержимое, без сжатия)
$ mencoder -o out.avi -noidx -oac copy -ovc copy ccmovie.avi

Выхлоп будет в файл out.avi. Теперь перегоняем видеофайл out.avi в другой, out.mpg, с соотношением сторон 16:9, чтобы было приятно смотреть на широком экране:

$ ffmpeg -i  out.avi -y -target ntsc-dvd -sameq -aspect 16:9 out.mpg
Счастливым владельцам многоядерных процессоров можно присоветовать опцию -threads <count> , где <count>  подставить число ядер (или по вкусу). Пережатие видео пойдёт значительно веселее:
 $ ffmpeg -i  out.avi -threads 2 -y -target ntsc-dvd -sameq -aspect 16:9 out.mpg
Здесь мы используем видеостандарт NTSC, популярный на диком и загнивающем Западе :-)

Надо сказать, что DVD диск, помимо собственно фильма и звуковой дорожки, имеет всякие бубенчики и свистульки в виде меню и разного рода кнопок. Мы не Warner Brothers, чтобы заморачиваться с этим:
$ dvdauthor --title -o dvd -f out.mpg
Можно ещё сделать оглавление:
$ dvdauthor -o dvd -T
Почти всё готово, и в текущем каталоге должен появиться подкаталог dvd/
со следующим содержимым:
AUDIO_TS 
VIDEO_TS
Отлично, теперь нужно проверить правильность конвертации. Самое простое - натравить ваш любимый видеоплеер на этот каталог, например
xine dvd:/full/path/to/DVD/VIDEO_TS/
Должно начать играть видео, и если это случилось - пора залить всё на DVD-диск:

growisofs -dvd-compat -dvd-video -speed=4 -Z /dev/dvd dvd/
Всё, теперь диск готов радовать нас фильмом на большом экране.


Вместо заключения
Заметка не претендует на исчерпывающий обзор, а является тем, чем она является - запиской с рабочим рецептом. В комментариях можно привести другие рецепты и полезные замечания.
Image
Monday, November 12th, 2012
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
5:07 am
График в Gnuplot с условиями: conditional data plotting in Gnuplot
Как известно, одна картинка стоит тысячи слов. Вместо длинного и занудного изложения лучше привести график и его прокомментировать. Сложность в том, что иногда в график нужно запихнуть много данных, и дизайн графика превращается в самостоятельную задачу. Одна из таких задач - построение точек на графике в зависимости от условий (conditional data plotting).


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


Условное построение графиков и зачем это надо
Один из примеров приведён на сайте Гнуплота: в данном случае график иллюстрирует населённость городов на карте мира.



То есть точка на графике становится больше или меньше в зависимости от данных в файле. Достигается это так:
plot 'dataFile.dat' u 1:2:3 w points lt 1 pt 10 ps variable

Весь трюк в том, чтобы размер точки (ps) сделать изменяемым (variable), причём размер теперь будет задаваться (в этом примере) колонкой номер 3 в файле данных.

Это одно из проявлений гибкости gnuplot, которую можно использовать в своих корыстных целях.

Условия при построении графиков
Gnuplot куда более гибкий, чем кажется на первый взгляд. Помимо возможности задать переменные размеры точек, можно заставить Gnuplot строить графики с условием. Вот пример:
($1 <=3 ? $2 : 1/0)
Это означает:
если текущее число в первом столбце ($ 1) меньше 3, следует строить данные из второй колонки ($ 2), в противном случае ничего не строить вообще".  
Так можно строить сложные графики, особенно когда данных много и график нужно строить с разной подробностью.

Например, вот такая конструкция:

plot "./data.txt" using  4:($7>0.7  ? ($5*10**3) : 1/0):(1.2*$7) title "actuators DM" with points pt 6 ps variable lc rgb "cyan" 
означает, что если данные из седьмой колонки ($7) больше, чем 0.7, то строить данные из пятой колонки ($5) умноженные на 1000 (собственно, $5*10**3). Дальше идёт трюк с переменным размером точки: размер точки на графике будет меняться (ps variable) в зависимости от данных в седьмой колонке, помноженные на коэффициент 1.2, то есть   (1.2*$7)


Реальный график с переменным размером точки
Всё это выглядит, конечно, очень круто, но пока не понятно, зачем всё это нужно. Тем не менее, это было продиктовано необходимостью выразить на одном графике многое. А именно:
Есть оптимизационный алгоритм, и он решает ограниченную задачу квадратичной оптимизации (Constrained Convex Quadratic Programming). Хочется посмотреть, как растёт время вычисления в зависимости от того, сколько ограничений нарушено. Если ограничений не нарушено, всё решается быстро, но когда ограничения активны, время растёт - и самое неприятное то, что у этого времени вычисления появляется некий разброс. Распределение вероятности наперёд неизвестно.
Кроме того, хочется на одном графике сравнить несколько наборов, для каждого набора - зависимость времени вычисления от нарушенных ограничений. При этом у времени есть некий разброс, и его хочется показать.

Есть вариант построить распределение вероятности для каждого случая, и это будет выглядеть вот так:

но тогда графиков получится очень много и их задолбаешься описывать в статье.

Долгие муки творчества породили следующий инфернальный график:

Теперь о том, что всё это значит и зачем это выдавать на один график.

Как говорилось выше, здесь показан разброс времени, которое занимает расчёт некой оптимизационной задачи с ограничениями для нескольких наборов сразу (каждый набор показан своим цветом с разной формой точек).
Грубо говоря, если вы посмотрите на распределение вероятности (probability density) сверху - вы как раз что-то подобное и увидите. Чем более вероятнее событие, тем крупнее для него точка. И так на одном графике можно увидеть, как растёт не только время вычисления, но и его разброс.

Так что если помедитировать над графиком после всех этих объяснений, то становится в общем понятно, что автор хотел сказать и до некоторой степени эпатировать публику. По крайней мере это стало понятно аудитории, на которой это было бесчеловечно испытано.

Вот gnuplot код для того ``инфернального'' графика:

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
#! /usr/bin/gnuplot -persist
 set terminal postscript "NimbusSanL-Regu" eps color enhanced fontfile "/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"
 set key top left
 set ytics 0.5 
 set xtics 5 
 set mxtics 5
 set mytics 5

 set output "./plot.ps"

 set yrange [0:7]
 set xrange [-0.5:40]

 set grid xtics ytics  
 set bmargin 4
 set key top right 

 set xlabel "Active constraints, percent \% of all constraints" font "NimbusSanL-Regu,18"
 set ylabel "Distribution of the computation time, milliseconds" font "NimbusSanL-Regu,18"

 statthresh=0.6

 plot "./stat_forplant25.data" using  4:($7>statthresh  ? ($5*10**3) : 1/0):(1.0*$7) title "5x5 actuators DM" with points pt 6 ps variable lc rgb "cyan",
"./stat_forplant36.data" using  4:($7>statthresh  ? ($5*10**3) : 1/0):(1.3*$7) title "6x6 actuators DM" with points  pt 9 ps variable lc rgb "magenta",
"./stat_forplant49.data" using  4:($7>statthresh  ? ($5*10**3) : 1/0):(1.3*$7) title "7x7 actuators DM" with points  pt 11 ps variable lc rgb "green",
"./stat_forplant64.data" using  4:($7>statthresh  ? ($5*10**3) : 1/0):(1.3*$7) title "8x8 actuators DM" with points  pt 7 ps variable lc rgb "red",
"./stat_forplant81.data" using  4:($7>statthresh  ? ($5*10**3) : 1/0):(1.3*$7) title "9x9 actuators DM" with points  pt 15 ps variable lc rgb "blue",
"./stat_forplant100.data" using  4:($7>statthresh  ? ($5*10**3) : 1/0):(1.3*$7) title "10x10 actuators DM" with points  pt 13 ps variable lc rgb "orange"

Собственно, ничего в нём особо страшного нет, просто дизайн графика и организация для него данных, мягко скажем, нетривиальны.

Самый смак в том, что при построении графика можно задать параметр:
statthresh=0.6
который управляет подробностью выдачи распределения точек:
using  4:($7>statthresh  ? ($5*10**3) : 1/0):(1.0*$7) 
На самом деле, в столбце $7 содержатся данные о вероятности (точнее, о частоте появления) того или иного временного интервала в данных. Чем больше порог, тем подробнее распределение точек на графике можно увидеть.


Альтернативные решения
Если захотеть приключений, то можно вспомнить про такой тип графиков, как candlesticks (ай донт ноу хау ит из ин рашн сорри):


Код для него отсюда:


1
2
3
4
5
6
7
# set terminal pngcairo  transparent enhanced font "arial,10" fontscale 1.0 size 500, 350 
# set output 'candlesticks.5.png'
set boxwidth 0.2 absolute
set title "box-and-whisker plot adding median value as bar" 
set xrange [ 0.00000 : 11.0000 ] noreverse nowriteback
set yrange [ 0.00000 : 10.0000 ] noreverse nowriteback
plot 'candlesticks.dat' using 1:3:2:6:5 with candlesticks lt 3 lw 2 title 'Quartiles',      ''                 using 1:4:4:4:4 with candlesticks lt -1 lw 2 notitle

Насколько мне известно, такие графики используются для биржевых котировок и на торгах ценными бумагами. Вышеозначенную проблему отображения данных можно решить и так, но:
  1. мне не хотелось тащить график из финансового мира в инженерию;
  2. candlesticks скрывают истинное распределение в данных, а этого бы как раз и не хотелось;
  3. проблему загромождения (cluttered?) графика это всё равно не решает.
В общем, этот адский график был рождён муками творчества длительностью в пару дней. Мне он нравится и я его использую - пока альтернативы ему не найдено.

Пища для размышлений
Собственно в том, что с помощью Gnuplot можно отстрелить себе ногу, яйца и голову одним выстрелом, я думаю, сомнений ни у кого уже не осталось :-)

Если серьёзнее, то данные по жизни имеют сложную структуру, и хотелось бы это отобразить наглядно и компактно. Иначе придётся вместо такого графика приводить 7 страниц таблиц, что ясности изложения не способствует.

Рецептура для графика была почерпнута из разных источников и с миру по нитке.
Image
Sunday, October 28th, 2012
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
9:04 pm
Настольный Змей Горыныч, или Как подключить много мониторов - Multihead in Linux
В своё время автор этих строк купил себе новый ноутбук, водрузил на него Debian и воткнул внешний монитор. Казалось бы, ну и всё - что ещё надо джигиту для счастья? Одна голова — хорошо, а две — лучше, подумал автор, глядя на ещё одну электродырку в ноутбуке под названием DisplayPort. И подумалось мне: это ж можно задаром ещё и третий монитор прицепить, и будет неземное счастье. Но счастье обломилось (о чём ниже), а обзорчик от поисков решения остался ...




Зачем нужно несколько мониторов?

Наличие по крайней мере одного внешнего монитора гарантированно повысит продуктивность работы. Не знаю, как насчёт трёх мониторов, но два точно меняют жизнь к лучшему, и вот почему:
  • очень удобно работать с LaTeX: на одном мониторе пишем сам код, на второй выводим что-то типа Kdvi и видим непосредственно результат;
  • хорошо вывести на внешний монитор справочную информацию или документацию (например, MATLAB Help висит на внешнем мониторе, а на основном мы пишем код);
Вместо переключений между виртуальными рабочими столами можно просто посмотреть на внешний монитор. И это в самом деле удобно.

Программные решения: Что есть в Linux для Multihead?

Программные решения это когда либо не хочется тратиться на нормальное железо, либо есть желание использовать уже имеющееся. Особенно актуально на ноутбуках: если есть выход на VGA/HDMI/DisplayPort, почему бы его не использовать?

XrandR

На данный момент - самое простое и рабочее решение. XRandR позволяет изменять конфигурацию мониторов "на лету" (без перезагрузки X-server) и поддерживает аппаратное ускорение через OpenGL. Конфигурирование xrandr возможно через консольные команды, или через удобную графическую оболочку типа arandr.


 Собственно, история автора этих строк и началась с того, что был куплен адаптер DisplayPort2VGA для подключения третьего монитора к ноутбуку Lenovo T420. Всё шло очень хорошо и xrandr даже написал то, что третий монитор виден:


 xrandr

Screen 0: minimum 320 x 200, current 2646 x 1024, maximum 8192 x 8192

LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 310mm x 174mm

   1366x768       60.0*+
   1360x768       59.8     60.0
   1024x768       60.0
   800x600        60.3     56.2
   640x480        59.9

VGA1 connected (normal left inverted right x axis y axis)

   1680x1050      60.0 +
   1600x1200      60.0
   1280x1024      75.0     60.0
   1440x900       59.9
   1280x960       60.0
   1152x864       75.0
   1024x768       75.1     70.1     60.0
   832x624        74.6
   800x600        72.2     75.0     60.3     56.2
   640x480        72.8     75.0     66.7     60.0
   720x400        70.1

HDMI1 disconnected (normal left inverted right x axis y axis)

DP1 connected 1280x1024+1366+0 (normal left inverted right x axis y axis) 376mm x 301mm

   1280x1024      60.0*+   76.0     75.0     72.0
   1152x864       75.0
   1024x768       75.1     70.1     60.0
   832x624        74.6
   800x600        72.2     75.0     60.3
   640x480        72.8     75.0     66.7     60.0
   720x400        70.1
   640x350        70.1


То есть мониторы видятся оба, но при попытке задействовать все три приводит к ошибке:
xrandr: cannot find crtc for output VGA1
Что бы это всё значило? - спросил я себя, усиленно почёсывая затылок. А значит это вот что:
CRTC это Cathode Ray Tube Controller, который аппаратно считывает кадры из framebuffer из видеопамяти и выводит изображение на экран. В понимании Xrandr, для каждого внешнего монитора должен быть свой аппаратный CRTC. На ноутбуках их обычно два: 0 и 1, то есть для встроенного монитора и внешнего. Это позволяет сделать полноценный dualhead, то есть два монитора соединить в один. Если же прицепить монитор третий монитор к уже существующему CRTC, то мы получим тоже изображение (clone mode).
Но не всё так грустно: есть попытки надурить видеоадаптер и сделать Virtual CRTC.
Virtual CRTC (VCRTC) is a new (and experimental) mechanism for redirecting pixels from a GPU's frame buffer to some other device. This code allows virtual CRTCs to be created in the kernel drivers so that they can be used for a variety of tasks. A virtual CRTC with this code is treated just like a real hardware CRTC. This experimental code allows these virtual CRTCs to be attached to "CTD devices" (Compression Transmission and Display). Then finishing off the equation is a new kernel module, the VCRTCM (Virtual CRTC Manager), that bridges the traffic between GPUs and CTDs.
И хотя нынешние иксы (Xorg) поддерживают максимум 16 дисплеев, ограничения чаще всего упираются в видеокарту и наличие аппаратных CRTC не более 2. Остаётся надеяться на Virtual CRTC или отдавать кровные килодоллары за аппаратные многоголовые решения (о чём ниже).

Плюсы Xrandr:
  • использование возможностей видеокарты и аппаратное ускорение графики на внешнем мониторе
  • гибкое изменение параметров на лету, особенно при использовании arandr.
Минусы Xrandr:
  • количество прицепляемых независимых мониторов ограничено числом CRTC.


Xinerama

Xinerama представляет собой расширение X Window System, которое позволяет приложениям и оконным менеджерам использовать два и более физических монитора как один большой. Это исторически был первый способ вообще получать объединённый монитор в иксах, и в Сети огромное количество рецептов на эту тему.

Плюсы Xinerama:
  • рабочее решение, поддерживает большинство графических карт
Минусы Xinerama:
  • требует, чтобы на всех мониторах была одна глубина цвета;
  • вы теряете аппаратное ускорение на всех экранах, кроме одного.
  • на дополнительных мониторах окна с 3D графикой могут выглядеть чёрными; 
В общем, старуха-ксинерама это последнее, что стоит пробовать, когда ничто другое не работает или слишком дорого, чтобы покупать.

 

Xdmx - Distributed Multihead X

DMX расшифровывается как Distributed Multihead X. Обычно Xinerama или Xrandr позволяют делать multi-head, сшивая несколько мониторов в один, подключённых к одной и той же машине.

С другой стороны,  Xdmx это такой прокси сервер для X-ов, который позволяет объединять мониторы на разных машинах. Каждый компьютер, который вы хотите объединить с помощью Xdmx, запускает обычный X-сервер, а Xdmx сшивает эти иксы через прокси по сети Ethernet, и мы получим объединённый монитор из рядом стоящих ноутбуков через Ethernet.


Пример посложнее - объединение четырёх соединённых по сети ноутбуков в один монитор. Настройка Xdmx несколько нетривиальна, но есть отличное руководство от IBM.


Но основное применение Xdmx это создание огромных систем отображения данных для университетов и исследовательских центров. В основном это Diplay Walls с общим разрешением типа 16000x4800:


Такое есть, например, в Университете Северной Каролины и в Университете Иллинойса в Чикаго.

Прочая экзотика

Есть и другие методы получения нескольких мониторов в Linux.

TwinView

Позволяет "сшивать" два монитора в один с аппаратным ускорением, при этом иксы думают, что это просто один монитор. Предназначен для карт Nvidia, и реализован только бинарными драйверами - фактически, только Nvidia карты и поддерживаются.

Merged Framebuffer

Позволяет получать аппаратное ускорение графики на двух мониторах в режиме dualheaded для карт Radeon. Очень похоже на TwinView, но работает только с открытыми драйверами (mga, ati), в которых поддержка direct rendering часто не реализована. Кроме того, MergedFB ограничивает размер максимального экрана до 2048x2048.


Аппаратные решения

Как правило, это проще в настройке и добавляет меньше головной боли. Самый правильный и лёгкий способ - Matrox TrippleHead2Go, но он стоит денег. Если начать жадничать, то можно остановиться на решении USB2VGA, но оно грузит процессор и требует драйвер.


USB2VGA

Да, бывает и такое. Плюс - сравнительно простой (если драйвер в ядре есть) способ получить дополнительный монитор (в зависимости от чипсета - и не один). Но всё это ложится тяжким грузом на CPU, ибо именно процессор сжимает видео и передаёт его через USB2VGA адаптер на другой монитор. Цена вопроса в районе $70:
Здесь всё зависит от того, кто сделал адаптер и на каком чипе он работает. Простые и дешёвые адаптеры могут и не иметь поддержки в Linux, или работать через драйвер udlfb. Последнее предпочтительно, так как имеется в ядре Linux начиная с 2.6.35. Простые видеоадаптеры USB2VGA, например от StarTech, позволят подключить один дополнительный монитор с разрешением до 1920x1200. Таких адаптеров можно воткнуть до пяти (5) штук.

Другой пример - адаптеры от Displaylink типа DL-125, DL-165 и DL-195 которые поддерживают до шести мониторов и разрешение 1440х1050, 1920х1080 и 2048х1152 соответственно. Компания выкладывает исходники драйверов к ядру.

Matrox TrippleHead2Go

Вот именно так и делается нормальная, честная аппаратная многоголовость (multihead). Matrox TrippleHead2Go представляет собой навороченную внешнюю видеокарту в компактном корпусе, в которую втыкается несколько мониторов (два или три).

Разрешение воткнутых в TrippleHead2Go мониторов суммируется, а при работе - аппаратно разделяется на разные физические мониторы (сжатие видео не используется). При этом видеокарта вашего ноутбука или десктопа думает, что это один огромный монитор (и не подозревает, что её надурили). В результате вы получаете вожделенное Dual/Tripple Head с аппаратным ускорением и всеми плюшками без геморроя с настройкой:


Один минус - стоит это удовольствие около $400.

И кроме того, не стоит подключать его через дополнительные адаптеры - в сети огромное количество полных горя отзывов персонажей, пытавшихся использовать этот TrippleHead2Go через дешёвые адаптеры.

 

Заключение

Этот пост был навеян тем, что автор внезапно обнаружил новую электрическую дырку под названием DisplayPort на борту своего ноутбука. Справедливо решив, что Ленова просто так порты не втыкает, возжелал извлечь из этого профит в виде третьего монитора. Но не получилось, и Xrandr мне выдал всю горькую правду: нет дополнительного контроллера CRTC у видеокарты - нет третьего монитора.

Поиск облегчений не принёс, но в процессе гуглежа автор открыл для себя много нового, и чтоб оно не забылось, решил выложить в бложик.
Всё имеет свои плюсы и минусы:
  • Аппаратное решение от Matrox хорошо и просто, но стоит денег и не мобильно (питание от сети).
  • Игрушки типа USB2VGA это multihead, конечно, но вы получите нагрузку на процессор - чем больше мониторов, тем хуже. Плюс игрища с драйверами в Linux.
  • Программные решения чреваты осложнениями: xrandr это самый лёгкий способ, но честный: нет crtc - нет внешнего монитора. Хотя есть попытки его надурить и сделать Virtual CRTC.
Image
Sunday, October 14th, 2012
LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.
6:45 pm
Thinkpad X201 - рабочее пони с сенсорным поворотным экраном

Мой старый-добрый ноутбук Asus M5200AE, который я купил ещё студентом в 2006, долгое время был моей основной рабочей машиной. И матлабовские скрипты на нём писал, и посты, и даже собрал в свою красноглазую молодость для него RT-ядро. Кстати, на нём до сих пор стоит Debian Etch - несколько консервативно, зато стабильно, олдскульно и ортодоксально, чего хватает этого для написания постов, электропочты, обзоров в LaTeX GTD и прочей мелочи. Но годы берут своё, и вот уже 512Mb памяти уже маловато, и жёсткий диск начал сдавать, и батарея померла, и кнопки понемногу отказывают. А тут на Ebay один мелкий австралийский магазин выложил old stock - собственно, Thinkpad X201 Tablet с поворотным экраном и за 800 долларов. Такой случай предоставляется не часто, и автор им воспользовался.

Как выглядит Thinkpad X201 Tablet

Ноутбук очень маленький и компактный, с отличной клавиатурой и ярким поворотным экраном, чувствительным к нажатию. Замечательно, что наличие сенсорной прослойки на экране не сказывается на качестве изображения.


Экран можно повернуть, чтобы было удобнее читать длинный текст в книге.  Но самое замечательное в X201 даже не экран, а неимоверное разнообразие способов взаимодействия:
  1. Сенсорный экран - экран воспринимает нажатие и перемещает указатель мыши вместе с вашим пальцем. Навигация по табам в броузере становится довольно забавным опытом.
  2. Стилус - ручка-стилус от Wacom, которая может использоваться для рисования и для заметок в специальных программах. Стилус обнаруживается  при поднесении на расстояние 1-2 сантиметров к экрану. Убирается внутрь ноутбука.
  3. Трекпоинт - красный сексапильный шпынёк, который удобно использовать вместо мыши и тачпада.
  4. Тачпад - небольшой, удобный и чувствительный.
  5. Клавиатура - очень мягкая легендарная IBMовская клавиатура с тихим кликом, которая достойна занять место в палате Мер и Весов.
Всё это изобилие методов ввода можно использовать для рукописных заметок, аннотирования PDF-документов и коллективного обсуждения текстов.
Немного критики. Автор этих строк всегда очень не любит, когда какой-нибудь балбес приходит и начинает ломать то, что всех устраивало. Так случилось с КДЕ4 и Гном3. Но хуже всего то, что в Lenovo пришли похожие ковбои и начали ломать наследие IBM. И вот эти узкоглазые выкинули легендарную, лучшую в мире ноутбучную клавиатуру с новых моделей. И хотя красный сексапильный трекпоинт всё ещё с нами, ему видимо уже недолго осталось жить. Новые клавиатуры, говорят, не так уж плохи. Но позвольте, если в обзорах каждый раз чествуют клавиатуру IBM, зачем же её выносить вперёд ногами?!
Это она - лучшая в мире клавиатура, из палаты Мер и Весов.

Наличие нормальной клавиатуры и было мотивацией покупки именно X201. Кроме того:
  • старая и любимая клавиатура: 97.5% моей работы - набор текстов (кода или статей), а островными клавиатурами пусть давятся макинтошники и любители дешёвых корейских поделок.
  • цена: для задач второго ноутбука 2000$ за новый Х230t это слишком дорого, а тут сбили цену почти втрое.
  • мощность: Core i7 на этой машине (запасной) не обязателен, i5 вполне сойдёт. Тем более, что гонять на нём симуляции не планируется, максимум - вечернее ковыряние кода.
  • периферия: проводной Ethernet обязателен, модем - тоже неплохо, жаль нет встроенного оптического привода. Никаких SSD, тем более распаянных на плате.
  • плюшки: планшет это хорошо, но полезнее использовать палец вместо мыши для управления окнами - в поездках мышами особо не поразмахиваешь. На поворотном экране удобно что-то обсуждать вдвоём/втроём (особенно текст статьи), повернув экран к собеседнику. Mobile broadband не особо нужен, но раз идёт в комплекте - пусть будет.
    В общем, теперь Asus M5200 отправился в коробку, а его место на столе занял Thinkpad X201. На ноутбук была предустановлена Windows 7, которую автор обновил до Debian GNU/Linux v6.0 Squeeze.


    Технические характеристики
    С точки зрения железа X201 представляет собой компромисс между компактностью и мощностью:

    Processor: Intel Core i5-560M 2.66Ghz (3.2 Ghz in turbo mode)
    Operating system: Debian GNU/Linux i386 Virens remix ``Old School Warm Tube'' 
    Display type: 12.1" WXGA (1280 X 800) LED Backlit with Enhanced MultiTouch Wide Viewing Angle Display
    System graphics: Intel HD graphics
    Total memory:4GB RAM DDR3
    Keyboard: Soft IBM Keyboard - US English
    Pointing device:TrackPoint
    Camera: 720p HD Camera with Microphone
    Hard drive:320 GB SATA HDD 7200RPM
    Optical device: NONE
    System expansion slots:Express Card Slot, 4-in-1 Card Reader
    Audio device: Intel Corporation Cougar Point High Definition Audio
    Bluetooth:Broadcom Bluetooth 3.0 with antenna
    Integrated WiFi wireless LAN adapters: Intel WiFi 6200N 802.11 a/g/n
    Ethernet:1Gb Ethernet Networking Port



    Оптического привода в ноутбуке нет в силу его скромных габаритов.
    Стоит отметить, что экран очень яркий и наличие сенсорной сетки не делает картинку слегка размытой. В комплекте с ноутбуком шёл стилус и 8-cell battery, что обеспечивает до 7 часов автономной работы (kpowersave рисует страшные цифры в 10 часов, но мне в них верится с большим трудом).


    Сразу после включения...

    Сразу после включения ноутбука засветилась Windows 7 и начала меня принуждать к миру к принятию пользовательского соглашения с Микрософтом. После этого Windows написала, что “Конфигурация будет продолжена после перезагрузки” - и Windows даже не подозревала, насколько это будет правдой…

    Конфигурация в самом разгаре: идёт заливка Debian GNU/Linux Squeeze + Lenny + Backports.

    После перезагрузки в X201 была воткнута флешка с уже настроенной системой Debian GNU/Linux, обкатанной на вычислительном танке Thinkpad T420.  Иксы сразу распознали видеокарту:
    $ glxinfo
    name of display: :0.0
    display: :0  screen: 0
    direct rendering: Yes
    server glx vendor string: SGI
    server glx version string: 1.4
    server glx extensions:
     Нашёлся звук:
    [    6.883970] input: HDA Intel HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1b.0/sound/card0/input11
    [    6.884295] input: HDA Intel Mic as /devices/pci0000:00/0000:00:1b.0/sound/card0/input12
    [    6.884600] input: HDA Intel Dock Mic as /devices/pci0000:00/0000:00:1b.0/sound/card0/input13
    [    6.884850] input: HDA Intel Dock Headphone as /devices/pci0000:00/0000:00:1b.0/sound/card0/input14
    [    6.885102] input: HDA Intel Headphone as /devices/pci0000:00/0000:00:1b.0/sound/card0/input15
    а также тачпад, трекпоинт, и проводная сеть. Отдельно пришлось настраивать только сенсорный экран и WiFi.


    Беспроводная сеть

    Собственно, как и в случае с Thinkpad T420, за беспроводную сеть отвечает драйвер iwlwifi.
    [    6.394602] iwlwifi 0000:02:00.0: loaded firmware version 9.221.4.1 build 25532
    [    6.394946] iwlwifi 0000:02:00.0: CONFIG_IWLWIFI_DEBUG disabled
    [    6.394948] iwlwifi 0000:02:00.0: CONFIG_IWLWIFI_DEBUGFS disabled
    [    6.394949] iwlwifi 0000:02:00.0: CONFIG_IWLWIFI_DEVICE_TRACING disabled
    [    6.394951] iwlwifi 0000:02:00.0: CONFIG_IWLWIFI_DEVICE_TESTMODE disabled
    [    6.394953] iwlwifi 0000:02:00.0: CONFIG_IWLWIFI_P2P disabled
    [    6.394955] iwlwifi 0000:02:00.0: Detected Intel(R) Centrino(R) Advanced-N 6200 AGN, REV=0x74
    [    6.395012] iwlwifi 0000:02:00.0: L1 Enabled; Disabling L0S
    [    6.411167] iwlwifi 0000:02:00.0: device EEPROM VER=0x436, CALIB=0x6
    [    6.411170] iwlwifi 0000:02:00.0: Device SKU: 0x1F0
    [    6.411172] iwlwifi 0000:02:00.0: Valid Tx ant: 0x6, Valid Rx ant: 0x6
    [    6.411189] iwlwifi 0000:02:00.0: Tunable channels: 13 802.11bg, 24 802.11a channels
    [    6.411323] Registered led device: phy0-led
    Физически установлен следующий чип:
    Network controller: Intel Corporation Centrino Advanced-N 6200 (rev 35)
    Поэтому мы отправляемся за фирмварью 6000 Images for Intel Centrino Ultimate-N 6300 and Advanced-N 6200 вот сюда. Скачанный архив iwlwifi-6000-ucode-9.221.4.1.tgz распаковывается в директорию:
    /lib/firmware
    и после перезагрузки (или включения wicd) загорится лампочка WiFi.


    Сенсорный экран

    Для поддержки стилуса и сенсорного экрана нужно установить пакет:
    xserver-xorg-input-wacom - X.Org X server – Wacom input driver
    В моём случае в системе есть пакеты из Squeeze и Lenny, и немного Backports, установка выглядела несколько более эротично: пакет не хотел ставиться вообще, независимо от репозитория, пока я не скачал его отдельно и не воткнул с помощью dpkg.




    Немного о стилусе
    Стилус при поднесении к экрану перемещает курсор мыши, причём экран его чувствует с 1-2 сантиметров. Кнопка на стилусе одна, но xournal её почему-то не признаёт. На другом конце есть ластик (красный), которым можно стирать изображение в GIMP и myPaint.

    В моём случае стилус просто работает (после установки драйверов) и сила нажатия там адекватна. Но некоторые пользователи жаловались на то, что по умолчанию нажимать на экран стилусом приходится слишком сильно. Это можно исправить традиционно опенсорсным способом, а именно вскрыв стилус и поправив чувствительность.

    На самом деле, всё не так сложно: для вскрытия нам потребуется тонкая плоская отвёртка или ножик. Нужно поддеть кнопку на ручке:

    Под кнопкой находится небольшой винтик (по всей видимости, это потенциометр). Если повернуть его чуть-чуть по часовой стрелке, то чувствительность ручки увеличится. Если же повернуть винт против часовой стрелки, то чувствительность уменьшится


    Забавно, но если вывернуть винт слишком далеко против часовой стрелки, то стилус станет регистрировать нажатие даже просто от наклона.


    Зачем нужен сенсорный экран, когда есть планшеты?

    Сенсорный экран добавляет много удобств при работе с ноутбуком:
    • Можно не использовать мышь для работы с окнами, что удобно в поездках. 
    • Особенно удобно обсуждать текст, повернув экран к собеседнику, и сразу вносить изменения по ходу. 
    • При чтении длинных текстов можно сложить экран на клавиатуру и использовать, как планшет.
    • Можно делать рукописные заметки на экране.
    Собственно, рукописные заметки и работа со стилусом сильно роднит X201 с планшетом. Здесь всё несколько неоднозначно: софт для Android куда более полированный, чем линуксовые десктопные огрызки, но X201 это полноценный ноутбук, в котором можно использовать весь десктопный софт.

    Помимо управления окнами с помощью пальца и стилуса, можно использовать дополнительные возможности в виде чувствительности к нажатию в программах:
    • myPaint - есть возможность использования кистей, чьи параметры зависят от нажатия.
    • gimp - поддержка pressure sensitiviy имеет место быть, но с X201 она почему-то не работает.
    • xournal - отличное (и единственно работающее) приложение для рукописных заметок с поддержкой pressure sensitivity.
    Так что сенсорный экран доставляет много радости и пользы. Ну и конечно, Thinkpad X201 - отличный "второй" ноутбук для работы дома и в поездках, чтобы с собой главный вычислительный танк не таскать.
    Image
    [ Next 20 >> ]

    LJ.Rossia.org makes no claim to the content supplied through this journal account. Articles are retrieved via a public feed supplied by the site for this purpose.