Записки дебианщика
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.

[ << Previous 20 ]
Monday, July 28th, 2014
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:01 am
История создания алгоритма Быстрого Преобразования Фурье
Сразу после публикации статьи Кули и Тьюки [1], в которой описывался алгоритм вычисления быстрого преобразования Фурье (БПФ, FFT, Fast Fourier Transform), к авторам начали приходить письма с различными отзывами. Одни писали, что их новый революционный алгоритм распахнул невиданные горизонты для обработки сигналов и изображений, и теперь любая задача по плечу. Другие говорили [2], что алгоритм давным-давно известен и используется, так что их статья - лишь повтор того, что есть.
И те, и другие были по-своему правы.

Следует заметить, что время публикации статьи Кули и Тьюки [1] совпало с бурным развитием вычислительной техники, когда всё больше и больше задач решались на ЭВМ. В 1965 году, тем не менее, все высокоскоростные компьютеры были забиты заданиями под завязку. Более того, в те годы начали активно разрабатываться АЦП, которые позволяли вводить информацию в ЭВМ со скоростью нескольких тысяч отсчётов в секунду. Это означало, что теперь можно обрабатывать сигнал цифровым способом вместо использования аналоговых устройств. В свою очередь, потребовались эффективные алгоритмы обработки сигналов и изображений, многие из которых используют преобразование Фурье. Поэтому появление нового алгоритма, сулившего ускорить вычисление дискретного преобразования Фурье в $N/\log_2(N)$ , было очень кстати.

Создание алгоритма

По рассказам одного из авторов алгоритма, Джеймса Кули [3], всё началось в конце 1963 года. Джеймс Кули был нанят в IBM Thomas J. Watson Research Center в Yorktown Heights, что в Нью-Йорке. Кули работал над своим собственным проектом, когда к нему обратился Ричард Гарвин (Richard Garwin) и показал некоторые заметки Джона Тьюки (John Tukey) об алгоритме, который теоретически способен вычислять быстрое преобразование Фурье со скоростью, пропорциональной $N\log_2(N)$, а не $N^2$. Гарвин, в отличие от Кули, хорошо понимал всю важность этого алгоритма и его огромную практическую значимость, и поэтому настаивал на разработке этого алгоритма.

``- Позже, - вспоминает Кули [2]. - я выяснил, что Гарвин был значительно более заинтересован в улучшении дистанционного сейсмического мониторинга ядерных взрывов; русские едва ли согласились бы на проведение инспекций на их территории. Гарвин так же видел необходимость в разработке методов раннего акустического обнаружения подводных лодок. Как и многие другие, я не считал это важным, поэтому поставил задаче разработки алгоритма БПФ приоритет ниже, чем собственным исследованиям. Тем не менее, под напором авторитета Гарвина и его постоянных телефонных звонков, я написал алгоритм для вычисления трёхмерного БПФ.''

История БПФ

Перед публикацией нужно было проверить, является ли идея алгоритма новой, и Кули решил посоветоваться с Джоном Тьюки. Тьюки посоветовал просмотерть несколько статей, в одной из которых [4] описывался очень похожий метод, скорость которого была несколько меньше. Было понятно, что идея их алгоритма в целом не нова, и это заставило Кули глубже изучить историю БПФ. Его непосредственный начальник, Гарвин, обратился к своему коллеге, профессору Томасу (Professor L.H. Thomas), который был в своё время научным руководителем Кули в институте. Томас дал свою опубликованную статью [5], в которой описывалось вычисление рядов Фурье, которые он проделал в 1948 году в IBM на табуляторе с перфокартами. По словам Томаса, он просто пошёл в библиотеку и взял справочник [6]. Методы, опубликованные в этом справочнике, позволяли вычислять ряды Фурье и уменьшать объёмы вычислений используя свойство симметрии тригонометрических функций.

Вскоре после публикации [1] Кули получил письмо от Филипа Рудника из Института Океанографии в Санн-Диего, Калифорния. Рудник сказал, что сам реализовал подобный алгоритм, используя метод из [7]. Статья Рудника с улучшенным вариантом такого метода вышла [8] чуть позднее статьи Кули и Тьюки - он не решился публиковать её сразу.
Оказалось, что приёмы, лежащие в основе БПФ, были опубликовы ещё раньше. В том же справочнике Стампффа [6] нашлась ссылка на более ранние работы Рунге и Кёнига [9]. В той работе так же использовался метод ``бабочки'' (Метод ``бабочки'', butterfly, заключается в использовании сделанных вычислений для получения соседних значений сложением или вычитанием уже полученных) для ускорения вычислений и контроля ошибок.

Кули написал статью [10], в которой приводилась, как он полагал, полную историю предшествующих похожих алгоритмов вычисления БПФ вплоть до работ Рунге [9]. Однако пыль веков скрывала в себе много интересного, и вскоре Кули получил ссылку от коллеги [11] на ещё более ранюю работу по вычислению БПФ. Это была глава книги великого Карла Фридриха Гаусса [12]. В этой главе, написанной на неоклассической латыни, приводились основные соображения алгоритма БПФ. Гаусс применял разновидность интерполяции по Лагранжу, и это могло привести его к возможности сокращения количества операций при быстром преобразовании. Позже были опубликованы работы [13,11], в которых приведён краткий перевод работы Карла Гаусса, предвосхтившей БПФ, а так же упомянуты другие работы, посвящённые БПФ.

Выводы

Из всей этой истории читатель может извлечь ценные выводы:

1. Очевидно, что понимание важности и быстрая публикация значительных достижений очень и очень важны.
2. Аккуратное отношение к старой литературе может принести большую пользу. Награды за выдающиеся достижения должны предшествовать анализу старых публикаций и книг.
3. Общение между математиками, инженерами и специалистами прикладных областей является крайне плодотворным.
4. Не публикуйте статьи на нео-классической латыни.

Литература

1
Cooley J.W. and Tukey J.W. An algorithm for the machine calculation of the complex fourier series. Mathematics Computation, 19:297-301, 1965.
2
James W. Cooley. The re-discovery of the fast fourier transform algorithm. Mikrochimica Acta, III:33-45, 1987.
3
J.W. Cooley. How the FFT gained acceptance. Proceedings of the Association for Computing Machinery Conference on the History of Scientific and Numeric Computation, Princeton, NJ, pages 10-13, 1987.
4
J. Good I. J. Royal Statist. Soc.,, 20:361, 1958.
5
L. H. Thomas. Applications of Digital Computers, chapter Using a Computer to Solve Problems in Physics. Boston: Ginn and Company, 1963.
6
K. Stumpff. Grundlagen und Methoden der Periodenforschung, Tafeln und Aufgaben zur Harmonischen Analyse und Periodogrammrechnung. Springer, Berlin, 1939.
7
G. C. Danielson and C. Lanczos. Some improvements in practical fourier analysis and their application to x-ray scattering from liquids. J. Franklin Inst. 233, Pergamon Journals, Ltd., pages 365-80, 1942.
8
Philip Rudnick. Note on the calculation of fourier series. Math. Comp., Vol. 20, No.3:429-430, July 1966.
9
C. Runge and H. Konig. Vorlesungen uber Numerisches Rechnen (Die Grundlehren der Mathematischen Wissenschaften, Band XI). Springer, Berlin, 1924.
10
J.W. Cooley, P.A. Lewis, and P.D. Welch. An algorithm for the machine calculation of complex fourier series. IEEE Trans. Audio Electroacoustics, AU-15:76, 1967.
11
H.H. Goldstine. A History of Numerical Analysis from the 16th Through the 19th Century. Springer-Verlag, New York, Heidelberg, and Berlin, 1977.
12
C.F. Gauss. Nachla: Theoria interpolationis methodo nova tractata. (Carl Friedrich Gauss, Werke, Band 3), Konigliche Gesellschaft der Wissenschaften, Gottingen, pages 265-303, 1866.
13
M.T. Heideman, D.H. Johnson, and C.S. Burrus. Gauss and the history of the fast fourier transform. The ASSP Magazine, Vol. 1, No. 4:14-21, Oct. 1984.
Monday, June 9th, 2014
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.
12:45 pm
Свистульки, бубенчики и рюшечки в документах LaTeX
Как все уже хорошо знают, в ЛаТеХ добиться хорошего качества документов по умолчанию очень просто: используя десяток стандартных команд, вы получите неизменно превосходный результат (ТМ) без лишних усилий. То есть документ будет хорош, но ведь иногда хочется украшательств, мигалок, свистулек и бубенчиков. На эту тему автор уже собрал небольшую коллекцию, которой и рад поделиться. Кроме того, автор открыл для себя удивительные книги Edward Tufte, который знает толк в визуальной подаче информации.



Украшательства в ЛаТеХ документах

Как правило, в научных документах такое не сильно поощряется, но если есть желание повыделываться, то в приличных местах этому, как правило, не противятся. Среди терпимых украшательств можно выделить буквицы (drop caps), оформление цветом всего и вся, нумерацию строк по главам.

Буквица (Drop Capital) в ЛаТеХ

Если открыть старинные книги, то первая буква главы там обычно была большой и вычурной. Хотя в научных публикациях такое, в целом, встречается редко, сделать буквицу в ЛаТеХ можно запросто. Для этого подключаем пакеты:
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage{lettrine} %%% To make a Drop Cap
\usepackage{yfonts} %% to make a fancy Gothic drop caps.
Первый пакет содержит lettrine для LaTeX, второй - вычурные шрифты. Если у вас Debian, то достаточно установить дополнительные пакеты:
texlive-fonts-extra - TeX Live: Extra fonts
texlive-latex-extra - TeX Live: LaTeX supplementary packages
и теперь в документе можно использовать цветные буквицы:
\definecolor{currentfancycolout}{RGB}{164,179,3}
\lettrine[lines=3]{\color{currentfancycolout} 
\textbf{{\small\initfamily F}}}{ ormulation} of \lipsum[1-2]
Вот как это выглядит в жизни:
Мелочь, но тем не менее красивая. Кожаный переплёт опционален :-)

Эпиграфы к главам

Пакет с простым названием epigraph делает то, что и подразумевается: вставляет эпиграфы в начале глав. Для этого подключаем пакет:
\usepackage{epigraph} %%% to make inspirational quotes.
и начинаем цитировать умных дядь по поводу и без:
\epigraph{\textit{The greatest difficulties lie where we are not looking for them.}}
{-- Johann Wolfgang von Goethe}
Первый параметр - цитата, второй - автор цитаты. Вот как выглядит:

Взято из моей собственной Ph.D.


Номера страниц, включающие номер главы

В больших документах, типа книг или в пространных технических отчётах, имеет смысл нумеровать страницы как НОМЕРГЛАВЫ-Страница. То есть, скажем, номер страницы 7-11 означает Глава 7, страница 11. Так как всё уже украдено до нас сделано латехниками, нам осталось только воспользоваться пакетом

\usepackage[auto]{chappg} %%% this is to set the page numbers as Chapter-Page.

который автоматически пересчитает все страницы в формат Глава-Страница вот так:


Работа с колонтитулами в LaTeX

Колонтитулы это, говоря простым языком, тот текст, который появляется вверху и внизу страницы - например, вверху обычно пишут название книги или имя главы отчёта, а внизу - номер страницы.

Для переопределения содержимого колонтитулов следует подключить пакеты расширений
\usepackage{fancybox,fancyhdr} %this packages provides fancy up and bottom of page
в преамбуле документа. Там же, в преамбуле, будет задаваться содержимое колонтитутов. Как и прежде, чтобы лучше понять команды, откройте на другом виртуальном экране просмотрщик dvi-файлов.

После всех этих приготовлений вставляем в преамбуле следующий код:
\fancyhead[R]{Это простой пример верхнего колонтитула}
\fancyhead
[L]{}
\fancyhead
[C]{}

\fancyfoot
[R]{ \copyright Конник М.В., перевод}
\fancyfoot
[L]{Страница \thepage \; из \pageref{LastPage}}
\fancyfoot
[C]{}
Как легко догадается,  \fancyhead управляет верхним колонтитулом, а \fancyfoot управляет нижним.

Дальше в квадратных скобках следует уточнение, какая часть колонтитула имеется в виду - правая, левая или центральная. Если не указать часть колонтитула, \fancyhead{текст} будет одинаковым в левом, правом и центральном колонитуле.

Этот пример интересен ещё и тем, что здесь показан один полезный трюк: левый нижний колонтитул будет выглядеть как "Страница N из M". Для этого следует подключить расширение
\usepackage{lastpage}
Текст колонтитулов можно задать и более хитро, например менять их в зависимости чётности страницы. Это потребует применения пакета ifthen.

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

\usepackage
{ifthen}

и правим:

\fancyfoot[C]{\ifthenelse{\isodd{\thepage}}{нечётная}{чётная} }
Здесь правило такое: \ifthenelse{условие проверки}{если НЕ истина}{если истина}.

Колонтитулы в работе

Теперь нужно включить использование "кучерявых и причудливых" колонтитулов:
\begin{document}
\pagestyle
{fancy}
После этого скомпилируйте документ и посмотрите как он выглядит.

Если нужно на время отключить вообще все "навороты" на странице, это делается командой \pagestyle{empty}

Чтобы убрать полосу вверху страницы, отчёркивающую колонтитул от содержания страницы, можно использовать в преамбуле такое переопределение:

\renewcommand{\headrulewidth}{0pt}
Эти трюки часто требуются для отображения в документе дополнительной информации, например, номера ревизии в Subversion репозитории, как уже говорилось здесь.


Верхний и нижний колонтитул (Header and Footer) для чётных и нечётных страниц

Вариантов проделывания такого трюка по крайней мере два: используя пакет hancyhdr или пакет titlesec.

Вариант с пакетом titlesec

В преамбуле документа пишем:

\usepackage{titlesec}
  \newpagestyle{kmvmain}[\small]{
    \setheadrule{.2pt}%
    \sethead[\colorbox{currentfancycolout}{\color{white}{\textbf{\large \thepage}}}]%  even-left
            [\textsc{Chapter~\thechapter: \chaptertitle}]%                              even-center
            [\colorbox{lightgrey}{\textbf{\thesection}}]%     even-right
            {\colorbox{lightgrey}{\textbf{\thesection}}}%     odd-left
            {\sectiontitle}%                              odd-center
            {\colorbox{currentfancycolout}{\color{white}{\textbf{\large \thepage}}}}%  odd-right
  }

тем самым создав стиль kmvmain, который и будем потом использовать.
Далее в тексте используем:
\pagestyle{kmvmain}
и после этого стиль колонтитулов изменится на вычурный.

 

Вариант с пакетом hancyhdr

В преамбуле документа пишем:

\usepackage{fancyhdr}
\fancyhead[RO]{\colorbox{currentfancycolout}{\color{white}{\textbf{\large \thepage}}}}  %% odd-right 
\fancyhead[LE]{\colorbox{currentfancycolout}{\color{white}{\textbf{\large \thepage}}}}  %%% even-left
\fancyhead[LO]{\colorbox{lightgrey}{\textbf{\thesection}}}% odd-left
\fancyhead[RE]{\colorbox{lightgrey}{\textbf{\thesection}}}% even-right 
\fancyhead[CE]{\rightmark}% odd-center, with the name of the Section
\fancyhead[CO]{\textsc{Chapter~\thechapter: \leftmark}}% Even-center, with the name of the Chapter.
\fancyfoot[L,R,C]{}

Параметры у fancyhead и fancyfoot одинаковы и означают вот что:

E: Even page (чётная страница)
O: Odd page (нечётная страница)
L: Left field (левое поле)
C: Center field (цетральное поле)
R: Right field  (правое поле)
H: Header  (верхний колонтитул)
F: Footer   (нижний колонтитул)

Далее вставляем в требуемое место упоминание вычурного (fancy) стиля:
\pagestyle{fancy}
Автор черпал вдохновение в посте на stackexchange про fancyhdr полной ложкой.

Эдвард Тафтэ и искусство отображения информации

Отображение данных, представление данных в виде таблиц и построение наглядных графиков - целое искусство. В этой области Edward Tufte - это Леонардо да Винчи отображения данных. Пожалуй, одна из его лучших книг - Envisioning Information, в которой он устраивает Tour De Fource информационного дизайна. 

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

Например, в главе ESCAPING FLATLAND, Тафтэ рассказывает о принципе small multitude - одна и та же структура, повторяющаяся много раз, и как это использовать в графиках. Этот прицнип позволяет сильно сэкономить место, подавая данные в более концетрированном и удобном для чтения виде.

В главе MICRO/MACRO READINGS много говорится об использовании цвета, особенно для компактного отображения статистических данных на графиках. Его фраза
Clutter and confusion are failures of design, not attributes of information.
отлично проиллюстрирована в главе LAYERING AND SEPARATION, где показан чертёж сложного устройства, но выполненный настолько грамотно, что читается невероятно легко. Мимоходом критикует графики типа candlesticks (пример, такой, что уже обсуждалось в блоге). Вообще, о цвете Тафтэ говорит много и подробно, приводя многочисленные примеры и картографии и построения схем.

Прошёлся он и по таблицам: глава NARRATIVES OF SPACEAND TIME одна из самых лучших в книге. Там он подробно разбирает абсолютно кошмарные таблицы, сделанные для расписаний поездов, и приводит примеры того, как это надо делать правильно.

Желающим заценить визуальный катарсис можно посоветовать ЛаТеХ-класс tufte-book, который создан по всем канонам. Этот класс можно использовать и для ведения  личного дневника. Вот как выглядит образец книги, оформленной tufte-book:



Эпилог

Оформление документов - дело тонкое, и то, что иногда кажется бесполезным украшательством, может сильно упростить чтение данных. Хотя цветные буквицы в документах - почти всегда выпендрёж, использование цвета и грамотный подход к построению таблиц позволят читателю быстрее вникнуть в суть.
Sunday, February 9th, 2014
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:32 pm
Как написать статью в LaTeX
Результатом любого приличного исследования являются публикации. Вы делаете что-то новое, и это по идее должно немного (или значительно) двинуть научное знание вперёд. А так как научные тексты удобнее писать в LaTeX, специально для этого созданным не абы кем, а Дональдом Кнутом, то возникает непраздный вопрос: как же написать статью в LaTeX?!

Вернее, вопросов два: как написать научную статью и как это сделать в ЛаТеХе?


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

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

После прихода этого самого "Аха!" вместе с хорошей идеей автор начинает что-то быстро писать на бумаге, прикидывать, покрякивать и энергично потирать ручонки. Далее, в состоянии полного угара творчества что-то ваяется, вычисляется, математически выводится, разливается по колбам, экспериментируется, программируется и численно симулируется. Это самое счастливое время, когда забываешь обо всём на свете и делаешь что-то занятное - за это, собственно, научным сотрудникам и платят деньги.

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

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

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


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


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

Обычно заключение отвечает на три вопроса:
  1. Что за проблема решалась в статье?
  2. Какие результаты были получены в статье?
  3. Ну и что!?
Для ответа на эти вопросы, в особенности на последний, хорошо поиграть в игру "Ну и что?!". То есть представьте, что вы беседуете с редактором журнала, и он вас спрашивает: "ну и что в статье интересного-то?" или "почему я должен обратить на это внимание?".


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


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






Как написать научную статью в LaTeX
Эпиграф:
LaTeX is capable of most things 
but not always in the most obvious manner.

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

Но если вы думаете, что отправленную вами в журнал статью примут "с колёс" и без редакции, то вы либо крутой нобелевский лауреат, либо большой оптимист. И поэтому скорее всего вам предстоит общение с рецензентами и редактором журнала. Вот тут-то LaTeX нам и сослужит добрую службу....


Рецензии и правки научных статей в LaTeX
Ещё до того, как вы отправите статью, лучше всего использовать одноколоночный набор и включить нумерацию строк, чтобы рецензенты ссылались не просто на страницу, а сразу на конкретную строку.


Нумерация строк в LaTeX
Нумерация строк включается пакетом lineno, который можно скачать здесь. В преамбуле документа добавляем
\usepackage[mathlines]{lineno}% Enable numbering 
Отлично, теперь вставляем команду:
\linenumbers\par %%% <---- turn on the numeration of lines
там, где мы хотим начать нумерацию линий. Если нужно оборвать нумерацию в конце статьи перед, скажем, списком литературы, команда выглядит так:
\nolinenumbers %%% do not use line numbers any more.
Важно то, что пакет lineno позволяет не только автоматически проставлять номера строк, но ещё и ссылаться на них. Автор настоятельно рекомендует использовать эту возможность, чтобы не сойти с ума самому при правках и не злить рецензентов.

Для этого в том месте, которое вы обещаете рецензенту поправить (и делаете это), ставим ссылку:
\linelabel{review:1R1}
Как и везде в ЛаТеХе, ссылки стоит ставить разумные: например, здесь написано, что это ответ на замечание 1 от рецензента 1 (они обычно анонимные).

Далее в тексте ответа на замечания рецензентов пишем что-то типа:
We clarified this on page~\pageref{review:1R1} line~\ref{review:1R1}.

Наступает счастье: здесь мы приводим не только ссылку на строку (\ref{review:1R1}) но и сразу на страницу (\pageref{review:1R1}).

Вместо конструкции $$ ..... $$  следует использовать \[ ... \] или \begin{displaymath} ....\end{displaymath}, тогда пакет lineno правильно проставит номера строк в тексте с математическими формулами.

Больше о нумерации строк вам расскажет весьма толковая документация к пакету lineno.


Ссылка на сноски в LaTeX
Допустим, вы сказали, что угоняете часть тектса в сноску. Об этом лучше написать рецензенту прямо, чтобы он не искал кусок пропавшего текста по всему документу.

Для этого пишем в преамбуле документа:
\newcommand{\footnoteremember}[2]{\footnote{#2} \newcounter{#1} \setcounter{#1}{\value{footnote}}} \newcommand{\footnoterecall}[1]{\footnotemark[\value{#1}]}
Теперь в тексте можно написать:

The Finite Element Analysis was perfomed on a crappy computer\footnoteremember{footnotelatitude}{Simulations were run on the Dell Latitude E5400 notebook with Intel Celeron 2.2 GHz processor, 2GB DDR2 SDRAM, 120 GB SATA HDD 5400 rpm under Debian GNU/Linux v 5.0 with MATLAB v2007b for UNIX.}.

Так что у нас есть ссылка footnotelatitude которая ведёт на сноску. Теперь сослаться на неё можно так:
(see footnote\footnoterecall{footnotelatitude})
И вы теперь сможете видеть номер сноски, на которую вы ссылаетесь. Трюк позаимствован отсюда.


Перевод PDF в простой текст
Сгенерированные ЛаТеХом документы часто переводятся в PDF, но иногда требуется перевести всё в простой текст. Часто это следует делать с сохранением структуры, и тут нам поможет pdftotext:
pdftotext -layout  -nopgbrk   reviewnotes_12-0238_MS.pdf
где ключи означают:
 -layout           : maintain original physical layout
 -nopgbrk          : don't insert page breaks between pages
Если нужно перевести в текст только со страницы 5 по страницу 10, даём команду:
pdftotext  -f 5 -l 10 reviewnotes_12-0238_MS.pdf
После этого текст можно вставлять в веб-форму для ответа рецензентам.




Ссылка название раздела или главы в LaTeX
Тоже часто используется, особенно если вы при правках радикально меняете структуру статьи (скажем, рецензенты вам это настоятельно советуют). Делается ссылка на название раздела с помощью пакета nameref и который входит в пакет hyperref - он входит в стандартный набор TexLive и потому уже должен быть установлен.

Включаем пакет в преамбуле:
\usepackage{nameref}

Ставим метку для раздела (section):

\section{Introduction}\label{intro}
И ссылемся в тексте:
See more details in the \nameref{intro} section that has number \ref{intro}.
Вместо этого мы при компиляции увидим:
See more details in the Introduction section that has number 1.
Этот удобный и простой трюк подсмотрен тут.


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

Sunday, January 5th, 2014
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:32 pm
Вырываем список книг для чтения из zotero с мясом, Tcl-ем и SQlite-ом
В этом посте мы продолжим беспощадную борьбу с кошмарным интерфейсом недо-системы управления библиографией под названием zotero с целью получить список книг для чтения. Даже для такой простой вещи, как получения списка книг, находящихся в базе zotero, нужно брать в руки автоген, скальпель и кувалду. Линуксоидов этим, конечно, не напугать, но маководов от экранов просьба удалиться во избежание.

В этом посте мы безтрепетной рукой вырвем с мясом из зотеры список книг, засунутых туда через графический, скажем так, интерфейс. В этом нам поможет язык Tcl (Тикль), Debian и SQLite3.


Нам, тем не менее, НЕ ПОМОЖЕТ на редкость убогая документация (пародия на неё), которая в целом рекомендует нам читать исходники и проваливать к такой-то матери. Поэтому мы решим проблему с помощью Tcl и Sqlite3.

Установка SQLite

В нашем Debian Linux все очень просто:
# apt-get install sqlite3 libsqlite3-dev libsqlite3-tcl
именно так, поскольку установка только sqlite3 недостаточна. Теперь у нас есть все средства для работы с SQLite, на котором построена зотера.

Вкушая SQlite...

SQLite есть движок для баз данных - простой, не требующий перечитывания томика квантовой механики и использования синхрофазотрон-конструкций. Десять минут листания отличных туториалов по SQLite дадут нам всё, чтобы взять от жизни от zotero всё:
Сначала можно потренироваться на базе данных через консоль SQLite3, давая команды и изучая внутреннюю структуру зотеровских кишок.
Подключение к базе данных zotero.sqlite делается командой в консоли  Linux:

starscream@dot:~/READ$ sqlite3 ZoteroLibrary/zotero.sqlite
SQLite version 3.7.3
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

По умолчанию, вывод будет сжатым и не слишком дружественным к гуманоидам:

sqlite>  select * from itemTypes;
1|note||0
2|book||2
3|bookSection|2|2
4|journalArticle||2
 
Дабы сделать нашу жуткую, как интерфейс Гнома3, жизнь немного слаще, включим немного свистелок и мигалок:
sqlite> .mode column
и
sqlite> .headers on
что повернёт SQLite к нам лицом, а к лесу - задом, и заставит печатать заголовки таблиц:

sqlite>  select * from itemTypes;
itemTypeID  typeName    templateItemTypeID  display
----------  ----------  ------------------  ----------
1           note                            0
2           book                            2
3           bookSectio  2                   2
4           journalArt                      2

и это намного понятнее.

Ковыряемся в реляционно-базоданных кишках zotero

Наша цель - выдрать из базы данных зотеры список всех книг, которые нам бы хотелось прочитать, в виде простого текстового списка (точнее, в виде списка Markdown, который мы потом конвертируем в латех). Можно, конечно, экспортировать всё это в BiBTeX и потом вручную выковыривать оттуда книги с помощью JabRef, но мы выбираем Путь Самурая и делаем всё скриптами. Да, это ёпенсорс, детка...

Структура SQLite базы данных zotero

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

sqlite> .tables
annotations                itemNotes
baseFieldMappings          itemSeeAlso
baseFieldMappingsCombined  itemTags
charsets                   itemTypeCreatorTypes
collectionItems            itemTypeFields
collections                itemTypeFieldsCombined
creatorData                itemTypes
creatorTypes               itemTypesCombined
creators                   items
customBaseFieldMappings    libraries
customFields               proxies
customItemTypeFields       proxyHosts
customItemTypes            relations
deletedItems               savedSearchConditions
fieldFormats               savedSearches
fields                     settings
fieldsCombined             storageDeleteLog
fileTypeMimeTypes          syncDeleteLog
fileTypes                  syncObjectTypes
fulltextItemWords          syncedSettings
fulltextItems              tags
fulltextWords              transactionLog
groupItems                 transactionSets
groups                     transactions
highlights                 translatorCache
itemAttachments            users
itemCreators               version
itemData                   zoteroDummyTable
itemDataValues 
  
Да, всё именно настолько плохо. Но мы не унываем и попробуем поискать что-нибудь съедобное, перебирая таблицу за таблицей. Сначала выясним код, которым обозначаются в этом селе книжки:

 sqlite> select * from itemTypes;
 itemTypeID  typeName    templateItemTypeID  display
----------  ----------  ------------------  ----------
2           book                            2
15          report                          1
......

Так, мы ищем все элементы с itemTypeID=2. Посмотрим, есть ли в нашей базе книги - они должны быть:

sqlite> select * from items where itemTypeID=2;
itemID      itemTypeID  dateAdded            dateModified         clientDateModified   libraryID   key
----------  ----------  -------------------  -------------------  -------------------  ----------  ----------
1           2           2013-09-01 02:22:15  2013-09-01 02:22:43  2013-09-01 02:22:43              G8AH8ZTS
16          2           2013-09-16 04:56:38  2013-09-16 04:56:38  2013-09-16 04:56:38              APIRGRKB
18          2           2013-09-09 01:34:38  2013-09-10 10:42:17  2013-09-10 10:42:17              SEHQJ38X
42          2           2013-09-09 08:15:52  2013-09-15 07:30:03  2013-09-15 07:30:03              ZDFQ5W25
48          2           2013-09-09 08:19:28  2013-09-15 07:32:49  2013-09-15 07:32:49              DGIPD6QJ

Дизайн базы данных, конечно, феерический, но кое-что удалось выдрать: теперь у нас в руках itemID каждой книги. Неплохой старт, но нам хотелось бы заголовки книг (Titles), которые очевидно хранятся где-то ещё.

Немного поматюгавшись и перебрав ещё таблиц, мы натыкаемся на:
 
sqlite>  select * from fields;
fieldID     fieldName   fieldFormatID
----------  ----------  -------------
1           url
2           rights
3           series
......
110         title
......

Ага, теперь мы ищем  fieldID=110 в которых зарыты все названия (Title) книжек и статей. Чуть раньше мы нашли книжку  itemID=48 и теперь для примера мы хотим выудить её название (Title) зарытое в fieldID=110. Это можно сделать вот так:

sqlite> select * from itemData where itemID=48;
itemID      fieldID     valueID
----------  ----------  ----------
48          7           89
48          8           90
48          11          91
48          14          92
48          62          24
48          87          25
48          110         93

Это подводит нас совсем близко к нашей цели - ещё один окоп, ещё рывок и победа так близка! Заглавия элементов (в том числе книг) хранятся в  valueID, так что нам нужно смотреть в поле itemDataValues в котором всё свалено в одну большую кучу:

sqlite> select * from itemDataValues;
valueID     value
----------  -------------------------------
1           Numerical computing with Matlab
2           Atmospheric_Turbulence_SPIE.pdf
3           TR2011-056-parallelQP-onGPU.ann
4           A Parallel Quadratic Programmin

Ещё немного терпения, ещё один запрос к базе данных:

sqlite> select * from itemDataValues where valueID=93;
valueID     value
----------  -------------------
93          Matrix inequalities

Ага! Вот оно! Мы у цели! Можно ещё посмотреть, есть ли у книги прикреплённый нами честно купленный PDF файл:

sqlite> select * from itemAttachments where sourceitemID=48;    
itemID      sourceItemID  linkMode    mimeType         charsetID   path                                                   originalPath  syncState   storageModTime  storageHash
----------  ------------  ----------  ---------------  ----------  -----------------------------------------------------  ------------  ----------  --------------  -----------
252         48            0           application/pdf              storage:Zhan_X_Matrix_inequalities__Springer_2002.pdf                0

Есть, и это именно та книжка, которую мы собираемся читать. Отлично, закрываем базу данных:
sqlite> .quit
и идём писать на коленке скрипт на Tcl для генерации списка книг.

Подключаем TCL к базе данных SQLite

За что мы любим Tcl, так это за философию batteries included - все батарейки уже в комплекте, и ещё немного туториалов:
дают нам всё необходимое для общения с зотеровской базой данных, от которой мы теперь уж точно возьмём всё. Команды очень просты, и к примеру вот этот код на Tcl:
sqlite3 db1 ./testdb
db1 eval {CREATE TABLE t1(a int, b text)}
создаст нам таблицу с названием  t1 и двумя колонками  a и b. Но нам нужно просто вытаскивать данные из таблицы, так что задача ещё проще.

Tcl спешит на помощь!

Немного усилий, и мы имеет следующий скрипт:
#!/usr/bin/tclsh

### This script connects to the SQLite database and extracts all the necessary data from it.
package require sqlite3

### First, select the type of the document to output
### sqlite> select * from itemTypes;
# itemTypeID  typeName    templateItemTypeID  display
#----------  ----------  ------------------  ----------
#2           book                            2
#15          report                          1

set doc_type_select 2 ;#this is code for the zotero SQLite base

set field_of_interest 110 ;# 110 is a Title of the book

############## This is output files in LaTeX and Markdown
set mdown_prefix "- "
set reading_list_filename "./Projects/actionsProject-BooksToRead"

set tex_reading_list_filename ""
append tex_reading_list_filename $reading_list_filename ".tex"

set mdown_reading_list_filename ""
append mdown_reading_list_filename $reading_list_filename "_mdown.tex"

set write_fp [open $mdown_reading_list_filename w ]
############## This is output files in LaTeX and Markdown

set user_name [lindex [split [pwd] "/"] 2] ;# from the working directory, split the name and get only the second one.
sqlite3 db "/home/$user_name/READ/ZoteroLibrary/zotero.sqlite" ;# associate the SQLite database with the object __db__

### Now find all the items of the type selected in $doc_type_select
# sqlite> select * from items where itemTypeID=15;
#itemID      itemTypeID  dateAdded            dateModified         clientDateModified   libraryID   key
#----------  ----------  -------------------  -------------------  -------------------  ----------  ----------
#46          15          2013-09-09 08:19:06  2013-09-15 07:33:26  2013-09-15 07:33:26              ZJ4SKMQP
#68          15          2013-09-10 00:25:09  2013-09-10 00:26:30  2013-09-10 00:26:30              AQ2A3NWW

#set get_itemIDs_for_the_doc_type [db eval {select * from items where itemTypeID=15} ]
set cmd "set substituteMe_SQLiteCommand {select * from items where itemTypeID=$doc_type_select}" ;# here we glue the stings together to make a dynamically regenerable command
eval $cmd  ;# evaluating the string above as a command, and thus setting regexp

set get_itemIDs_for_the_doc_type [db eval $substituteMe_SQLiteCommand ]

set counter 1
# tmp_itemID tmp_itemTypeID  tmp_dateAdded tmp_dateModified tmp_clientDateModified tmp_libraryID  tmp_key
foreach {tmp_itemID tmp_itemTypeID  tmp_dateAdded tmp_dateModified tmp_clientDateModified tmp_libraryID  tmp_key} $get_itemIDs_for_the_doc_type {
#    puts $tmp_itemID
    set booksarray($counter) $tmp_itemID
    incr counter
}

############ The title is stored in the fieldID=110.
############ Now figure out the valueID for each of the items
foreach { num itemID } [array get booksarray] {

set cmd "set substituteMe_SQLiteCommand {select * from itemData where itemID=$itemID}"
eval $cmd
set get_valueIDs_for_the_doc_type [db eval $substituteMe_SQLiteCommand ]

    #itemID      fieldID     valueID
    #----------  ----------  ----------

    foreach { tmp_itemID tmp_fieldID tmp_valueID } $get_valueIDs_for_the_doc_type  {

        set is_rightField [string compare -nocase $tmp_fieldID $field_of_interest]

        if { $is_rightField == 0 } {

        set cmd "set substituteMe_SQLiteCommand {select * from itemDataValues where valueID=$tmp_valueID}"
        eval $cmd
        set get_Title [db eval $substituteMe_SQLiteCommand ]

####### Finally, we have the book titles!
foreach { numm book_title } $get_Title {

    regsub -all "_" $book_title " " book_title
    regsub -all {\x5B} $book_title "" book_title ;# replacing underbrace and square brackets
    regsub -all {\x5D} $book_title ", " book_title ;# replacing underbrace and square brackets

    puts $write_fp "$mdown_prefix $book_title"
} ;####### Finally, we have the book titles!

        } ;# if { $is_rightField == 0 }

    } ;# foreach { tmp_itemID tmp_fieldID tmp_valueID } $get_valueIDs_for_the_doc_type

}

close $write_fp
db close ;# close the SQLite database

exec pandoc -f markdown -t latex $mdown_reading_list_filename -o $tex_reading_list_filename

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

Немного о трюках в коде скрипта. Самый простой - сделать скрипт независимым от машины, на которой он исполняется. То есть мы берём имя пользователя скриптом и выдираем его командой  pwd :

set user_name [lindex [split [pwd] "/"] 2] ;# from the working directory, split the name and get only the second one.
sqlite3 db "/home/$user_name/READ/ZoteroLibrary/zotero.sqlite" ;# associate the SQLite database with the object __db__

Ещё трюк:

#set get_itemIDs_for_the_doc_type [db eval {select * from items where itemTypeID=15} ]
set cmd "set substituteMe_SQLiteCommand {select * from items where itemTypeID=$doc_type_select}" ;# here we glue the stings together to make a dynamically regenerable command
eval $cmd  ;# evaluating the string above as a command, and thus setting regexp

здесь иллюстрируются могучие способности Tcl в плане обработки строк: мы формируем команду как строку, а потом исполняем её, как команду. То есть  мы подставляем itemTypeID динамически, и потом выполняем с помощью  eval.

Немного регекспов для удаления скобок из названий книг:

regsub -all {\x5B} $book_title "" book_title ;

люлистрирует возможности регекспов в Tcl по замене через ASCII-коды (ибо \x5B есть символ ]  ).

Последний кусочек - конвертирование списка из Markdown в  LaTeX:
exec pandoc -f markdown -t latex $mdown_reading_list_filename -o $tex_reading_list_filename

полностью автоматизирует нашу задачу

Всё.

Пост иллюстрирует убедительную и беспощадную победу Tcl над Zotero и показывает немного трюков по работе с простой базой данных SQLite.
Код раскрашен с помощью hilite.me
Monday, December 16th, 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.
4:40 am
Как сделать календарь в LaTeX на год и месяц автоматически?
Это краткая заметка в стиле "как отстрелить себе ногу с помощью LaTeX". Автору этих строк потребовалось сделать себе календарик, в котором отображались бы оповещения о событиях, и чтобы это дело регенерировалось автоматически при смене месяца.

Предисловие

Автор этих строк - человек очень ленивый, но любопытный и обожающий ковырять свой Дебиан на предмет того, как бы сбросить побольше рутины на компьютер. Так появилась LaTeX-реализация организационной системы Getting Things Done, которая выполнена полностью на латехе, вместе с адресной книгой и календарём.

Календарь на LaTeX реализован с помощью пакета расширений calendar [скачать ZIP-файл]. Проблема в том, что месяцы в календаре нужно обновлять самому, а вот это как раз и забывается чаще всего. Поэтому хочется, чтобы дни, месяцы и годы в календарике LaTeX обновлялись автомагически латехом и без вмешательства ленивого и забывчивого автора этих строк.
Нужно сказать, что LaTeX является Turing complete language, то есть на нем можно писать любые программы. Например, можно написать интерпретатор Бейсика, симулятор машины Тьюринга, Mandelbrot with LaTeX и другие программы. То есть на латехе можно писать что угодно. Не всегда это просто (особенно в случае с календарём), но можно.
Пост поделён на две части: сначала немного о возможностях пакета Calendar, а потом про то, как обновление названий месяцев сделать автоматически из LaTeX.

Возможности пакета Calendar в LaTeX

О возможностях пакета Calendar уже говорилось, но тем не менее. Последнюю версию пакета расширений calendar, который можно загрузить отсюда. Файлы примеров этого поста доступны здесь, батарейки в комплекте (пакет calendar там уже есть).

После распаковки всех файлов в преамбуле документа подключаем пакеты:
%%% Turning on the Monthly calendar and Event list
\usepackage{monthly,evntlist,lscape} \parindent=0pt
для календаря на месяц и списка событий, и:
%%% Turning on the Yearly calendar
\usepackage{yearly}
для календаря на год соответсвенно.

Создание событий для календаря

Пакет calendar не просто создаёт календарь, но и позволяет отображать в нём события. Все события хранятся в одном текстовом файле myEvents.cld из которого они дёргаются календарём. Файл событий выглядит так:
%%%%%%% My Personal Calendar
range Essentials/Calendar/year2010 %% What year do we want?
%% ONE-TIME EVENTS
january 28 2010 {Описать GTD} [Описать GTD для блога]
%%%%% RECURRING EVENTS
every Sunday {Еженед. обзор} [Еженед. обзор]
Сначала указываем год в отдельном файле Essentials/Calenda/year2010.cld в котором пишем:
%% Span the whole year here
January 1 2010 to December 31 2010 {The year 2010}
Повторяющиеся события будут определены только в интервале из этого файла.

Список событий из календаря

Часто нужно просто видеть события, приуроченные к календарным датам (особенно если их не так много). Для этого мы пользуемся окружением eventlist, которое предоставляет пакет calendar. Настройки того, как выглядит список событий, хранятся в файле evntlist.sty который можно приукрасить разными значками и иконками.

Чтобы распечатать события между нужными датами, вы просто ставите две даты, между которыми хотите показывать события (хранятся в файле events.cld):
\begin{eventlist} {} {Essentials/Calendar/myEvents}
january 24 2010 to january 30 2010
\end{eventlist}
и собираете LaTeXом документ, получая список календарных событий на это время:



Иконки сделаны пакетами шрифтов marvosym и wasysym.

Календарь на месяц с отображением событий

Пакет calendar может больше - можно создать календарь на месяц и показывать там события. Код такой:
\begin{monthly}
{firstday=1} %% begins with Monday
{Essentials/Calendar/myEvents}
jan 2010
\end{monthly}
Все события в календаре на указанный месяц (январь 2010 в данном случае) берутся из того же файла events.cld, который мы использовали для генерации списка календарных дней на неделю.
Компилируем документ и вот он, календарь на месяц, обновлённый и со вставленными событиями:


Календарь работает с кириллицей, во всяком случае кодировка KOI8-R у него возражений не вызывает.

Календарь на год

Места для отображения событий в календаре на год особенно не много, но возможность сгенерировать годовой календарь, не отходя от кассы выходя из латеха весьма кстати. Код для этого:
\begin{yearly}
 {title= \begin{center} \textbf{\Large The Year 2013}\end{center} \normalsize,firstday=1}
{}
2013
\end{yearly}
После сборки документа годовой календарик будет выглядеть так:



Можно посылать в печать.

Вызов скриптов из LaTeX

С календарём всё сравнительно понятно, и теперь настало время его автоматизировать: хочется, чтобы названия месяцев и дней подставлялись автоматически. Это не такая простая задача, как может показаться. Дело в том, что стандартные команды типа \the\year с пакетом calendar работать не будут, как не получится и подставлять значения из файлов через команду \input.

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

Скрипт на Питоне для генерации файлов календаря

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

Весь латеховский файл представляет собой склеенные строки в переменной out. Вставка символа r в строках out +=r'\begin{landscape}'+'\n' указывает Питону не интерпретировать \b а печатать как есть. Вызов команды date делается через os.popen(cmd), хотя теперь так уже не модно (но тем не менее работает), а модно через subprocess.check_output (но у меня так не получилось).

От полученной строки из команды date отдельно откусывается символ новой строки через .rstrip('\n') и далее сшивается с другими стоками. Результат записывается в файл tmpCalendarMonth.tex, который в свою очередь вставляется в ЛаТеХ через \input{Calendar/tmpCalendarMonth} и обрабатывается при сборке. Скрипт на питоне ниже:
#! /usr/bin/python
import string, os
import commands

kmvStartDir = '.'
kmvDestDir = kmvStartDir+'/Calendar/' #destination directory for graphs

###### Getting dates and months as text using DATE command in Linux ####
cmd='date --date="today" +%Y'
stdout_handle = os.popen(cmd)
kmv_year = stdout_handle.read()
kmv_year = kmv_year.rstrip('\n')
stdout_handle.close()

cmd='date --date="today" +%B'
stdout_handle = os.popen(cmd)
kmv_month = stdout_handle.read()
kmv_month = kmv_month.rstrip('\n')
stdout_handle.close()

cmd='date --date="today" +%e'
stdout_handle = os.popen(cmd)
kmv_day = stdout_handle.read()
kmv_day = kmv_day.rstrip('\n')
stdout_handle.close()

####################################
#### Month Calendar regeneration ###
####################################
kmvCalName = kmvDestDir+'tmpCalendarMonth'

out = '' 
out +=r'\begin{landscape}'+'\n'
out +=r'\begin{monthly}'
out +='\n {firstday=1} \n'
out +='{Calendar/myEvents} \n'
out +=kmv_month+' '+kmv_year+'\n'
out +='\end{monthly}\n'
out +='\end{landscape}\n'

### Output to the Calendar's file ######
kmvCalName+='.tex'
fout=open(kmvCalName,'w')
fout.write(out)
fout.close()
####################################

Скрипт calendar_regenerate.py и все остальные файлы можно взять отсюда. Скрипт написан для того, чтобы быть максимально понятным, а не красивым или эффективным.

Вызов скрипта на Питоне из LaTeX

Вызывать скрипты из латеха можно несколькими способами:
Здесь я приведу второй вариант, как наиболее простой. Для этого мы помещаем питоний скрипт calendar_regenerate.py в тот же каталог, где лежит файл 4myGTD.tex, из которого скрипт будет вызываться. В преамбуле документа пишем:

%%% Python script for calendar regeneration
\immediate\write18{./calendar_regenerate.py}

Чтобы всё это заработало, нужно вызывать LaTeX с параметром -shell-escape который позволяет выполнение внешних скриптов.

Кто такой \write18 и почему так называется?!

Команда \write это низкоуровневая инструкция TeX, которая используется для того, чтобы производить запись в файловые "потоки". ТеХ ссылается на каждый открытый файл не по имени, а по номеру. Поток 18 является особым и зарезервирован для того, чтобы попросить операционную систему что-то выполнить - например, внешний скрипт.
Внимание! Как совершенно справедливо отмечается многими, подобный трюк в сочетании с параметром –shell-escape небезопасен и представляет собой потенциальную дыру в безопасности. Так можно написать вредоносный документ с командой типа \write18{rm -rf ~} в Unix. По этому поводу есть статья (PDF) об этой и других опасных командах в LaTeX.
Команда \immediate приказывает ЛаТеХ выполнить скрипт немедленно, не дожидаясь окончания генерации всего документа. В данном случае это оправдано, так как мы хотим, чтобы в документ вставился уже обновлённый календарь.

Заключение

Заметка имеет своей целью показать возможности автоматизации в латехе с использованием сторонних скриптов на примере автоматизированной генерации календарей. Пакет calendar довольно навороченный, потому его описание заняло добрую половину поста. Пример в посте доступен здесь.
Monday, November 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:06 am
Как объединить и разбить PDF в Linux подручными средствами
В этой безблагодатной и беспросветной жизни, когда тебе в линукс присылают документы в DocX и формы в последнем Adobe Acrobat, приходится несладко. Часто заполненные с воем и рыданиями PDF-файлы приходится склеивать или, наоборот, разрезать на несколько. К счастью,деятели опенсорса иногда отвлекаются от Wayland, Mir и прочих systemd и делают годные костыли для простых страждущих.

Объединение файлов pdf в один с помощью PDFSaM

Для тех, кто не хочет перечитывать томик квантовой физики от авторов pdftk, есть вариант с рюшечками и бубенчиками под названием PDF Split and Merge (pdfsam).
Как это всегда бывает, когда что-то кажется слишком прекрасным, чтобы быть правдой, обязательно найдётся заподлянка. И pdfsam не исключение - написан он на Java, а это значит кучи exceptions по поводу и без, лютые тормоза и интерфейс из фильма ужасов.

Установка и использование PDFsam в Linux

Скачать самую свежую версию можно здесь. Запуск этого поделия командой
$ java -jar pdfsam
даёт что-то вроде:


Собственно, дальше всё довольно просто: pdfsam умеет объединять (merge), разрезать (split), поворачивать (rotate) документы PDF. Кроме того, имеет место быть режим burst, при котором из одного PDF-файла будет сделана куча одностраничных.


Например, для объединения PDF-файлов в один, просто добавляем файлы в порядке следования, выбираем новое имя файла и жмём RUN.

Из преимуществ можно отметить разве что графический, скажем так, интерфейс. Всё остальное - это типичное джава приложение: глючное, медленное и корявое (например, при split нужно указывать номер страницы, на единицу меньший той, с которой разрезание начнётся, и т.д.).

Сжатие и компрессия PDF файлов

Побочным продуктом работы pdfsam может быть раздувание PDF-файла до непричиных размеров. Этому горю можно помочь с помощью утилиты gs вот так:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
Это может сжать PDF, по крайней мере в большинстве случаев.

Мастерам консоли: резка и склейка PDF файлов в pdftk

PDFtk расшифровывается как pdf tool kit, и, как и подобает настоящему набору инструментов, требует некоторого изучения. Зато работает быстро, умеет много и клацать мышью не надо.
Установка pdftk проста - он уже есть в Debian:
$ sudo apt-get install pdftk
Синтаксис pdftk можно описать примерно так:
pdftk исходный_файл.pdf ДЕЙСТВИЕ страницы output получаемый_файл.pdf
Итак, поехали....

Как разбить PDF файл на несколько

Для того, чтобы разрезать PDF-файл на несколько, нужно воспользоваться ДЕЙСТВИЕМ cat, например вот так:
$ pdftk document.pdf cat 140-142 output zz1.pdf
Эта команда выдаст файл zz1.pdf, в котором будут три страницы, а именно 140, 141 и 142. Если же нужно разбить файл с какой-то страницы до конца, делаем так:
$ pdftk foo.pdf cat 30-end output biography.pdf

Объединение нескольких файлов PDF в один с помощью PDFtk

Та же самая команда cat может склеивать PDF-файлы в один:
$ pdftk zz* cat output Issue26.pdf
служит для объединения всех файлов, содержащих zz в имени, в один Issue26.pdf
Если файлы называются по-разному, можно использовать следующую команду для объединения файлов в один:
$ pdftk 1.pdf 2.pdf ... cat output merged.pdf
будет объединён в один файл merged.pdf.

Изменение полей PDF-документа

Речь идёт о полях в PDF файле вроде автора, заголовка или времени создания:

Не раз и не два товарищи, работающие с документами повышенной важности, оставляли в этих полях значения, подставленные услужливым MS Word - и имели на этом немало проблем. Это можно поправить с помощью pdftk сравнительно легко.
Сначала достаём исходные данные (metadata):
pdftk book.pdf dump_data output report.txt
В этом файле мы увидим нечто вроде:
InfoKey: Title
InfoValue: Coders At Work
InfoKey: Author
InfoValue: Peter Seivel
InfoKey: Subject
InfoValue: Programming
Эти значения можно отредактировать в полученном текстовом файле (report.txt в этом примере) и загрузить обратно:
pdftk book.pdf update_info report.txt output bookcopy.pdf
У pdf-документов могут быть и другие поля, которые тоже можно поправить при желании.

И это ещё не всё!

Возможности pdftk весьма велики, и желающие могут припасть к официальной документации.


Склейка страниц PDF файла в буклет с помощью LaTeX pdfpage

Отличная иллюстрация мощи пакета pdfpages была найдена на tex.stackexchange.com. Идея сводится к тому, что сначала мы создаём исходный документ, а потом ещё один, в который вставляются PDF-страницы в нужном порядке.

Например, у нас есть документ под формат А6, созданный в ЛаТеХе (назовём его mya6doc.pdf:

\documentclass{book}
\usepackage[english]{babel}%
\usepackage[a6paper]{geometry}% http://ctan.org/pkg/geometry
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\begin{document}
\chapter{First chapter} \lipsum[1-10]
\chapter{Second chapter} \lipsum[11-20]
\chapter{Third chapter} \lipsum[21-30]
\chapter{Final chapter} \lipsum[31-40]
\end{document}

Теперь создаём ещё один документ (назовём его mya4doc):

\documentclass{article}
\usepackage[english]{babel}%
\usepackage[a4paper]{geometry}% http://ctan.org/pkg/geometry
\usepackage{pdfpages}% http://ctan.org/pkg/pdfpages
\begin{document}
\includepdf[pages=-,nup=2x2,frame,noautoscale]{mya6doc}%
\end{document}

Скомпилировать его нужно с помощью pdflatex. Это позволит получить все страницы (pages=-) в 2x2 страницы на одной (nup=2x2) с прорисованной границей вокруг каждой страницы (frame).

Это означает, что pdfpages воспринимает вставляемые страницы как изображения, так что можно дополнительно задать поля для обрезки:

\includepdf[pages=1,landscape,clip,trim=1cm 2cm 3cm 4cm,frame,noautoscale,fitpaper=false]{AllTheMyGTDinOneScheme}

то есть страница будет обрезана на 1, 2, 3, 4 сантиметра слева, снизу, справа и сверху. Опция clip=true обрежет страницу.

Путь джедая: склеивание PDF документов с помощью gs

Как многие джедаи уже в курсе, gs это GhostScript, свободный как Столлман интерпретатор postscript и, соответственно, PDF. Командой gs можно не только орехи колоть, но и соединять документы. Соединять документы с помощью Ghostscript можно вот так:
$ gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=finished.pdf file1.pdf file2.pdf
Теперь что это всё значит:

-dBATCH -- после окончания пакетной обработки, GS прекращает работу (без этой опции он будет продолжать имитировать бурную деятельность)
-dNOPAUSE -- обрабатывать каждую страницу без пауз между ними
-q -- тихий режим, без выдачи сообщений
-sDEVICE=pdfwrite -- использовать встроенный обработчик PDF
-sOutputFile=finished.pdf -- записать выхлоп в файл finished.pdf
 
Преимущество такого джедайства в том, что Ghostscript входит во все дистрибутивы Linux и часто уже установлен в системе. И не нужно тащить килотонны джавы.

Сохранение размеров EPS файлов при конвертировании в PDF

Не совсем в тему, но тем не менее про PDF. Дело в том, что при конвертировании файлов EPS в PDF разными поделками вроде ps2pdf вы получаете PDF в виде пустой страницы A4 с картинкой EPS где-то в углу. То есть поделка ps2pdf просто игнорирует выставленный BoundingBox при использовании по умолчанию:
 
$ ps2pdf letterhead.eps
Я не буду говорить о вменяемости авторов ps2pdf, но всякий разработчик с IQ выше комнатной температуры должен понимать, что подобные WTF-моменты в пользовательском опыте в конечном итоге приводят к тому, год линупсов на десктопе уезжает в голубую даль. И это происходит именно из-за таких вот казусов, коих в ёпенсорце год от года становится только больше из-за набегающих леннартов поттерингов и прочих ковбоев, склонных к тяжёлому велосипедостроению там, где этого абсолютно не требуется.
Так как ps2pdf принимает те же аргументы, что и Ghostscript, имеющий 900 газиллионов опций, среди которых должна быть возможность сохранять BoundingBox. И таки да, чудо случилось:

$ ps2pdf -dEPSCrop letterhead.eps

который даёт тот самый PDF, который от него, собственно, и ждёшь.

Заключение

Перечисленные возможности - не предел мечтаний, и всегда можно найти свежесобранный опенсорцовый велосипед со спойлером, антикрыльями и колёсами в форме листа Мёбиуса. Обнаружившим нечто интересное в деле работы с PDF документами просьба не стесняться в комментариях.
Monday, October 28th, 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.
3:33 am
Как экстрагировать подсвеченный (highlight) текст из PDF файлов в Linux: Zotero и ZotFile
Когда читаешь текст статей и книг в PDF-файлах, есть желание подсветить (highlight) интересные участки и вернуться к ним ещё разок - прямо как на бумаге. Более того, хочется текст из этих самых подсвеченных участков выдрать из PDF и экспортировать куда-нибудь ещё. И желательно это сделать в Linux и без необходимости загружать виртуальную машину с десктопным софтом для Windows. Казалось бы, в опенсорце так любят изобетать велосипеды, и должен же какой-нибудь велосипедостроитель до этого дотумкать.

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

Работа с PDF-файлами в человеческом декстопе

На всякий случай для тех, кто ест суп отвёрткой: люди читают PDF-файлы в Android и Windows и делают в них пометки\аннотации. Это удобно и помогает быстро набросать выжимку из читаемого.

Любителей линукса ждёт жестокое разочарование: никаких вменяемых средств для пометок в PDF и уж тем более выдирания текста оттуда в Linux нетЪ. Да, в 2013 году мы имеем только xournal, который может тупо рисовать поверх текста, и Okular, который не умеет сохранять выделения и аннотации внутри PDF-файла.

Даже в Андроиде софта для работы с PDF больше: тот же ezPDF отлично справляется с аннотациями и выделениями (можно настраивать даже цвет и прозрачность). Вот так:


Для Windows есть PDFXchange-viewer который отлично работает в WINE (и бесплатен для загрузки!). В работе он ещё проще  ezPDF, так как имеет специальный инструмент для подсвечивания, чтобы не пришлось подтверждать каждый раз:


Как мы с неудовольствием наблюдаем, что в Windows и Android таких программ - завались, в то время как разработнички ёпенсорца заняты куда более важными вещами вроде systemd, Mir и Wayland.  Но мы не об этом - обещанные кишки и море крови впереди.

Zotero + ZotFile = экстрагируем выделенный текст (Highlights) из PDF в Linux без наркоза!

Есть такой сорт программ, которые пытаются управлять коллекциями материалов для чтения. Одна из таких попыток называется Zotero и представляет собой урезанный Firefox (оно называется Standalone, то бишь отдельностоячая версия) или плагин к Firefox.

Так вот, сам по себе интерфейс Zotero ужасен настолько, насколько может быть убог интерфейс, созданный опенсорцными деятелями. Но у зотеры есть один волшебный плагин, который называется ZotFile - и вот он-то умеет вытаскивать подсвеченные куски текста из PDF-файлов.

Казалось бы, что ж автор-то злопыхает? Вот оно, решение-то. Ан нет: чтобы получить искомое, придётся взять автоген и безнозпилу.

Установка сопутствующих инструментов: zotero

По этой ссылке можно скачать либо Firefox extension либо зотеру Standalone в виде отдельного приложения. После установки zotero нам потребуется плагин ZotFile, который позволяет получить искомую возможность экспорта выделений из PDF-файлов.

Установка ZotFile

Идём на ZotFile official website или mozilla page и скачиваем расширение ZotFile. Далее в zotero идём в меню Tools -> Addons и устанавливаем ZotFile:


Всё, теперь начинается битва с зотерой - добавление PDF-файлов и работа с ними.

Да, массовый импорт PDF-файлов из меню Import невозможен и сочтён разработчиками zotero ненужной и мало полезной функцией. Если вы подумали, что импортировать файлы можно через File -> Import... то вас ждёт сюрприз: так сделать не получится.


Оказывается, что для добавления PDF-файлов пользователь должен на зелёный ПЛЮС "New Item" -> "Story copy of file" и, зажав шифт и подпрыгивая на левой ноге, выделить несолько файлов PDF сразу.


Эти файлы будут сохранены в виде приложения (attachments) в каталогах  ./Library/storage с затейливыми подкаталогами. Но так как мы не собираемся использовать эту поделку ни для чего серьёзного, это нам не важно.
Я уже хочу попросить местного Санта Клауса подарить мне вертолёт с миниганом для полётов над местами скопления девелоперсов зотеры. К ним я хочу прилететь даже больше, чем к поттерингу и девелоперсам Гнома3: в отличие от зотерщиков, эти отморозки ничего толкового не делают. Зотрещики же откровенно издеваются над пользователями, городя наименее вменяемые интерфейсы для в целом годной и хорошей программы.

Посылаем чтиво из Zotero

Для того, чтобы послать PDF файлы на планшет \ таблетку \ директорию для чтения (это может быть каталог Dropbox, который синхронизируется с декстопом и планештом), выбираем файлы, зажав Shift, кликаем правой кнопкой мыши по ним и выбираем "Manage Attachments" -> "Send to Subfolder on Tablet". Это функция ZotFile - зотера из коробки этого не умеет.


Расположение каталога можно настроить в опциях ZotFile. Для этого идём в  "Tools" -> Add-ons -> ZotFile -> "Tablet Settings" и меняем по вкусу.



Читаем и делаем пометки (highlights) в PDF

Так как на линуксовом "десктопе" ничего удобоваримого нет, идём на поклон к проприетарщине:
  • Tablet. Здесь есть много программ, способных делать нормальные пометки и аннотации, например ezPDF. Загружаем файлы через  AirDroid или синхронизацией через Dropbox и наслаждаемся.
  • Desktop. Здесь есть альтернатива в виде PDFXchange из-под Wine. Работает отлично и позволяет сохранять пометки внутри файлов.
Начитавшись разумного, доброго и светлого, тягаем помеченные файлы обратно. В зотере есть специальный каталог под названием Tablet Files. Там хранятся записи о том, какие файлы посланы на планшет \ каталог для чтения. Идём в Tablet Files, выбираем файлы, кликаем правой кнопкой мыши и выбираем "Get from Tablet".




Выдираем подсвеченный текст из PDF используя ZotFile

Выделяем прочитанный PDFник с подсвеченным текстом, жмём правую кнопку мыши и выбираем Manage Attachments -> Extract Highlights. И вот они, наши бесценные пометки, в красиво оформленном виде - ZotFile вставит даже номер страницы, откуда пометки взяты.


Пометки выдираются без проблем как в случае использования ezPDF, так и PDFExchange. Всё, пометки можно скопировать как в виде простого текста, так и в HTML:


У ZotFile есть много скрытых параметров (hidden options) и ручек, за которые можно подёргать для более тонкой настройки. Как и в Firefox, это делается через 'about:config' или, в случае с Zotero Standalone, в меню  'Actions -> Preferences -> Advanced -> Open about:config'.



Здесь мы видим обычное конфигурационное месиво от Мозиллы. Ищем строки вида 'extensions.zotfile' для скрытых опций zotfile. На примере выше я убрал кавычки для цитат, извлечённых из highlights в PDF изменив .pdfExtraction.ClosingQuotation. Теперь текст выделений не содержит кавычек.


Итоги забега: zotero - квадратно-колёсный велокактус

zotero, как система управления коллекцией статей и книг в PDF, хуже, чем просто бесполезна: она отнимает больше времени на борьбу с идиотизмом разработчиков, чем экономит. Примеры шедевральных решений:
  • нельзя импортировать кучу PDF-файлов со структурой в виде каталогов и подкаталогов.
  • импорт вообще сделан через  задницу: несколько PDF файлов можно экспортировать только если они лежат в одном каталоге. О том, насколько это медленно,  я просто не говорю.
  • нельзя экспортировать отсортированную библиотеку из зотеры 1:1 дублируя коллекции в виде каталогов (но можно выпендриться, экспортируя через ZotFile).
  • статьи и книги внутри зотеры нельзя перемещать, но можно копировать+удалять. Это может привести к плачевным последствиям: могут появиться дубликаты там, где их никогда не было.
  • система объединения дубликатов невменяема: не пользуйтесь ей НИКОГДА! При объединении элементов с вложениями PDF оно сваливает все PDF в одну кучу. Зачем тогда вообще эта функция?!
  • нет возможности получить список файлов в коллекции - только внешими скриптами через прямые запросы в базу SQLite (юзер-френдли, да).
  • экспорт в BiBTeX ущербен на всю голову: генерация cite keys сделана полными идиотами - оно генерирует ключи в виде @BOOK{clif????, title = {Clif Flynt Tcl Tk Second Edition A Developers}. Но они работают над этим.
И это только наиболее критичные проблемы. Медленную работу, ущербный ненастраиваемый интрефейс, малое количество опций - это мелочи.


Вебдвальноль спешит на помощь: SumNotes

Замечательный, простой и работящий вебсервис http://www.sumnotes.net позволяет даром извлекать выделенные слова и аннотации из PDF-файлов. Просто загружаем наш PDF файл:


который может быть до 300 Мб, и через некоторое время получаем наши бесценные выделенные фразы:


которые можно сохранить в формате TXT или DOC, и просто скопировать в буфер обмена:


Одно но: не вставляет номер страницы, на которой это выделение было сделано. Но тем не менее с задачей справляется на отлично.


Заключение

Из плюсов у zotero есть только ZotFile: это единственная причина, по которой зотеру вообще можно терпеть в этом мире - возможность получения выделенного текста из PDF файлов. И этот небольшой плагин  ZotFile - всё, что в линуксах способно вынимать текст из PDF Highlights на линуксовом десктопе, год которого, конечно же, обязательно и непременно наступит.

Альтернативы и аналоги:

  • Стоит так же пристально посмотреть на вебдванольный сервис http://www.sumnotes.net который прост, вебдванолен и не страдает детскими опенсорцными болезнями.
  • http://www.docear.org/ - и швец, и жнец, и на дуге игрец: и майндмаппинг, и организация данных, и выдирание пометок из документов. Недостаток: оно на Java.
  • http://www.sciplore.org/software/sciplore_mindmapping/ - тоже на джаве (что огорчает скоростью), но умеет вытаскивать закладки и пометки из PDF, плюс майндмаппинг.
  • Mendeley - аналог Zotero, поддерживает вытаскивание highlights и notes, экспортирует аннотированные pdf, но не умеет экспортировать отсортированные документы с сохранением структуры. 
  • Calibre с плагином Annotations - экстрагирует пометки из PDF с отправкой на почту.
В общем, не зотерой единой...
Sunday, October 13th, 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.
5:35 pm
Репозиторий deb-пакетов своими руками: сборка пакетов в Debian из исходников и бинарников на скорую руку
Часто бывает нужно по-быстрому собрать deb-пакет в Debian, особенно когда уже имеется бинарный файл. Так как мы не слакварщики и не хотим засорять систему make & make install, мы пойдём другим путём и сделаем собственный пакет. А чтобы они не валялись по всему диску, закатаем наши пакеты в собственный же репозиторий.

Распаковка существующих пакетов

Сначала посмотрим, что внутри пакета deb или rpm.

Распаковка deb-пакета

Распаковать пакет Debian нужно в два этапа - сначала извлекаем из него файлы, а потом добираемся до собственно бинарников. Вскрываем пакетик:
# ar vx mypackage.deb
Файл пакета mypackage.deb содержит три вложенных файла:
  • debian-binary - это текстовый файл, который содержит информацию о версии пакета (например: 2.0)
  • control.tar.gz - этот архив содержит всю мета-информацию: имя и версию пакета, зависимости и прочее.
  • data.tar.gz - собственно, бинарники программы, необходимые для работы. Именно эти файлы будут разархивированы в каталог /usr для дальнейшего использования.
Теперь, если нам охота поживиться бинарниками пакета (содержимое data.tar.gz), даём команду:
$ tar -xzvf data.tar.gz
В текущем каталоге появится ./usr текущего каталога. Желанный бинарник лежит в ./usr/bin подкаталоге.

Если же вам нужно просто извлечь файлы из пакета, можно всё сделать одной командой
$ ar p mypackage.deb data.tar.gz | tar zx
это распакует пакет deb в текущий каталог. Другой вариант - использовать dpkg-deb в виде:
$ dpkg-deb -x что.deb куда/


Распаковка rpm-пакета

На всякий случай о том, как распаковать пакеты вероятного противника RPM-based систем. Для этого нам потребуются программы rpm2cpio и cpio. Распаковка содержимого RPM пакета делается в один шаг:
$ rpm2cpio mypackage.rpm | cpio -vid
Если же нужно просмотреть содержимое пакета, не распаковывая его, даём команду:
$ rpm2cpio mypackage.rpm | cpio -vt
Для того, чтобы (попытаться) конвертировать RPM-пакет в Debian, можно воспользоваться командой:
# alien mypack.i386.rpm
Надо сказать, что пакеты RPM и DEB сильно отличаются друг и друга, и такое простое конвертирование не всегда проходит.

Deb-пакет из бинарного файла

Теперь, когда мы знаем, что ничего волшебного внутри deb-пакетов нет, можно попробовать сварганить свой собственный дебиановский пакетик.
Часто хочется сделать побыстрее, чтоб "завелось и поехало" - и вместо пакетов пользователи устанавливают программы в виде ./configure, make & make install (вместо make install можно использовать checkinstall). Как уже говорилось не раз, не стоит поддаваться искушению и ставить программы в Linux в обход менеджера пакетов - пакетный менеджер ничего о них знать не будет, и при обновлении системы вы рискуете получить больше проблем на свою голову, чем представляете.
Иногда бывает так, что исходников к пакету нет - скажем, поступила к нам проприетарщина, а упаковать её в пакет хочется. Или мы наваяли скрипт, и хочется, чтобы он был на многих машинах. Нет проблем: завернём это в deb-пакет и скормим apt-у.
Для этого нам понадобится утилита
# apt-get install dpkg-dev
Подопытным кроликом будет служить бинарный файл системы контроля версий fossil, о котором уже говорилось ранее.
Идея в том, чтобы в локальном каталоге (назовём его ~./tempprog) отдублировать структуру каталогов для программы так, как она лежала бы в системе в установленном виде. Большинство бинарников находится в системном каталоге /usr/bin, поэтому создаём такую же структуру в локальном:
$ mkdir -p ./tempprog/usr/bin/
Так мы создадим все подкаталоги за один проход. Зайдём внутрь:
$ cd tempprog/
и увидим созданные подкаталоги:
$ tree
Вот они:

.
└── usr
     └── bin
2 directories, 0 files

Отлично, теперь в локальном каталоге ./tempprog создаём подкаталог ./DEBIAN:
$ mkdir ./DEBIAN

Внутри подкаталога ./DEBIAN создаём текстовый файл control с таким содержимым:
Package: имя-пакета
Version: версия пакета, скажем 1.0 или 2.7.9.
Architecture: архитектура(i386, amd64, all...)
Maintainer: сопровождающий_пакета
Installed-Size: размер программы в килобайтах
Depends: зависимости (пакет (>= версия))
Recommends: рекомендации (пакет (>= версия))
Suggests: предложения (пакет)
Section: секция (multimedia, games, system, или другое)
Priority: приоритет (optional)
Homepage: http://www.домашняя_страница
Description: описание программы 

Таким образом, в нашем локальном каталоге ./tempprog будет лежать вот что:

.
├── DEBIAN
│.. └── control
└── usr
    └── bin
        └── fossil
3 directories, 2 files

Теперь из каталога ./tempprog даём команду на сборку этого простенького пакета:
$ dpkg-deb -b ./ ./
В результате появится пакет (в нашем примере с fossil) вида:
fossil_1.21_i386.deb
который можно сразу же установить в систему:

$ sudo dpkg -i fossil_1.21_i386.deb
[sudo] password for starscream:
Selecting previously deselected package fossil.
(Reading database ... 247627 files and directories currently installed.)
Unpacking fossil (from fossil_1.21_i386.deb) ...
Setting up fossil (1.21) ...

И всё, наступает счастье.

Небольшое примечание: если кто хочет установить программу в директорию
/opt/ нужно сделать следующее:

- В локальном каталоге ./tempprog создаём каталог /opt/ и размещаем там
программу так, как она и будет установлена в /opt
- Там же, в ./tempprog создаём подкаталоги /tempprog/usr/bin/
в котором размещаем небольшой скрипт, например zotero
- В нём пишем:

#! /bin/sh
PATH=$PATH:/opt/zotero/
/opt/zotero/zotero

Это говорит системе, что теперь можно запускать файлы и из /opt/zotero


Deb-пакет из исходников на скорую руку

Здесь приводится простой вариант упаковки исходников, если все зависимости уже на месте и нам ничего не нужно делать. В общем случае это не так, и сборка пакетов с прописыванием зависимостей представляет собой довольно нетривиальный процесс.

Если нам повезло и все зависимости уже в системе, можно скомпилировать исходные тексты программы и по-быстрому завернуть всё в пакет Debian.

Для этого скачанные исходные тексты программы (для примера foobar версии 1.2.3) распаковываем в каталог foobar-1.2.3, и от рута даём команду:
# dh_make --createorig
Далее пишем
# debuild
Опять, если нам повезло, всё должно собраться без вопросов. Полученный пакет устанавливаем
# dpkg -i foobar_1.2.3-1_i386.deb
Охочим до тонкостей дебиановской кулинарии и прочим правильно писающим мальчикам просьба пройти сюда и насладиться The Debian Administrator's Handbook. Эта Книга о вкусной и здоровой пище довольно занудная, водянистая и словоохотливая книжеца от двух дебианщиков расскажет вам о Debian Policy, как всё делать ортодоксально и, когда авторы вспоминают, что не мемуары пишут, про то, что же таки собственно делать.

Создание собственного локального репозитория Debian своими руками

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

Создаём каталог, в котором будут лежать все собранные непосильным трудом пакеты - пусть это будет ~/zips/virensdebianrepositor в который копируем deb-пакеты.

Для создания репозитория нам понадобится dpkg-scanpackages который является (во всяком случае на момент написания поста) частью пакета dpkg-dev, как это неожиданно выяснилось.

Создаём список пакетов:
$ dpkg-scanpackages . /dev/null | gzip -9c > ./Packages.gz
Может быть, нам будет выведено сообщение типа:

dpkg-scanpackages: warning: Packages in archive but missing from override file:
dpkg-scanpackages: warning:   fossil linux-headers-3.8.0-avl9-pae linux-image-3.8.0-avl9-pae pdfsam sublimetext virtualbox-4.2 xserver-xorg-input-wacom zotero
dpkg-scanpackages: info: Wrote 8 entries to output Packages file.

Теперь в нашем репозитории 8 пакетов. Отлично, добавляем наш репозиторий в файл:
# vim /etc/apt/sources.list
строчкой типа:

deb file:///home/имя_пользователя/zips/virensdebianrepository ./

Теперь нужно обновить список пакетов, чтобы они стали доступны для установки:
# apt-get update
Всё, теперь можно установить, к примеру, свежесобранный текстовый редактор Sublime Text 2 (отличная инструкция там) как всегда: Теперь, для того, чтобы установить SublimeText достаточно сделать:

# apt-get install sublimetext

Reading package lists... Done
 Building dependency tree
 Reading state information... Done
 The following NEW packages will be installed:
   sublimetext
 0 upgraded, 1 newly installed, 0 to remove and 245 not upgraded.
 Need to get 0 B/11.4 MB of archives.
 After this operation, 17.4 MB of additional disk space will be used.
 WARNING: The following packages cannot be authenticated!
   sublimetext
 Install these packages without verification [y/N]? Y
 Selecting previously deselected package sublimetext.
 (Reading database ... 247813 files and directories currently installed.)
 Unpacking sublimetext (from ..././sublimetext_2.0.2_i386.deb) ...
 Setting up sublimetext (2.0.2) ... 
Всё, пакет будет распакован и установлен, а то, что он из местного репозитория, видно вот тут: (from ..././sublimetext_2.0.2_i386.deb)

Заключение

Описанные в этом посте рецепты - блюда на скорую руку, а не фуагра с трюфелями. Для больших репозиториев или сложных пакетов придётся-таки ознакомиться с документацией и руководствами. Ещё можно воспользоваться программой APTonCD, которая умеет не только создавать репозитории, но и записывать их на CD/DVD диски.
Monday, September 23rd, 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.
11:37 am
Исчезновение старых картинок в Google Blogger, или Что бывает, когда всё бездумно затаскивается в Google Plus
Небольшой краткий пост - мало ли кому пригодится - с описанием технической проблемы Google Blogger, которой почему-то нигде нет. Затрагивает пользователей, которые не хотят заводить себе аккаунт Google+, но имеют старые блоги на Blogger.



Исчезновение старых картинок на Google Blogger

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

У многих людей (включая автора) начали пропадать изображения в блогах на Blogger. Это есть результат затаскивания гуглом всех и вся в этот проклятый Google+. Дело в том, что они начали менять права доступа изображений: хотя изображения в постах исчезли, они на самом деле никуда (скорее всего) не делись, а просто к ним нет доступа.

Это особенно касается старых постов, которым более 3-4 лет. Часто картинок просто не видно - отрисовывается пустая строка. Иногда вместо изображения видно "кирпич" - это значит, что нет доступа. Эта гуглопслюсовская чума постигла кучу народа.
 

Проблема 1: в Google Picasa картинка есть, но в Blogger её не видно

Здесь проблема в том, что Blogger не имеет доступа к картинкам в Picasa, даже если выставлены права "Limited, anyone with link". Раньше всё отлично работало, но сейчас перестало: для того, чтобы Blogger увидел изображения, нужно выставить права на альбом "Public on the web". Так удалось вернуть часть картинок в посты, где они и продолжают быть видимы.

Проблема 2: старые картинки c blogspot завернули на Google+, но в Picasa их нет и Blogger их не видит

Это куда серьёзнее: нет никакой возможности с ними работать, потому как они хостятся на старых серверах вида bp2.blogspot.com - они не были загружены в Picasa.

Опять, раньше всё отлично работало, но недавно кому-то завезли новой угарной травы пришла в голову отличная идея завернуть все картинки со старого блоггера на Google+, даже если у вас G+ аккаунта нет. То есть управление правами на картинки теперь можно делать из Google+, но у меня его нет (И МНЕ ЭТО НЕ НУЖНО!).

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

Изображения со старого Blogger никуда не пропали: если зайти в пост, найти ссылку на картинку и вставить её напрямую в адресную строку - она отлично видна. В адресной строке справа favicon показывает мерзкий G+. То есть оно типа перенаправлено:

Та же самая проблема в Google Blogger Editor: этих картинок не видно:


но если вставить в адресную строку - картинки есть. Это затрагивает только изображения в старых постах, 2007-2009 годов. Остальные изображения (пока) на месте.

От броузера не зависит (Opera/Firefox/Chrome).


Вести с полей

Хорошие новости: похоже, гугловцы в курсе происходящего факапа и пытаются это разрулить: некоторые посты, например этот, получили свои картинки назад отвалились снова картинки появились опять. Большинство старых постов (до 2010 года) всё ещё с отвалившимися картинками.

Небольшое расследование показало, что:

It's only a small group of user experiencing this issue, and it's not country related. There are users in the Netherlands which can see the (missing) images on my weblog just fine.
But there has to be something in common on users experiencing this issue, they can cofirm the issue on other blogs as well.
Выдаваемая ошибка в браузере выглядит так:

This web page has a redirect loop
The web page at http://4.bp.blogspot.com/_hM8AMxgJLzw/R4Wphi7GNoI/AAAAAAAAAZE/N6sMMNur3jU/s320/img7.png has resulted in too many redirects. Clearing your cookies for this site or allowing third-party cookies may fix the problem. If not, it is possibly a server configuration issue and not a problem with your computer.
Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects.

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

Пост на googleforums - отписываться можно и там. Участники обсуждения обещали написать в Спортлото довести это дело до инженеров Google - и видимо это сделали, потому как пока (22 Сентября) картинки к старым постам снова с нами.
Monday, September 16th, 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:30 am
Как втиснусть много данных в график gnuplot
Собственно, этот пост есть коллекция трюков, которая набралась в процессе подготовки двух последних конференций. Проблема в том, что нужно вместить много данных в небольшой график, и делается это порой весьма нетривиальным образом. Как известно, с помощью gnuplot можно сделать всё, что угодно, но мало кто знает как именно. Демонстрация чёрной магии в стиле Gnuplot с полным разоблачением ниже.


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

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



Использование обеих вертикальных осей, но с разными подписями
В переводе это значит, что мы будем строить два массива данных на одном графике, но подписи на оси Y с двух сторон будут разные. Вот как это выглядит:



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

Теперь серьёзно - вот код для графика:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#! /usr/bin/gnuplot -persist
 set terminal postscript "NimbusSanL-Regu" eps color enhanced fontfile "/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"
 set output "./plots/threshold_sparsity.ps"
  set key bottom right
 set xtics 10
 set mxtics 10
 set ytics 10 
 set mytics 10 
 
 set yrange [60:100]
  set y2range [60:100] 
 set xrange [10**-5:1]
 set style line 1 lt 1 pt 6 ps 1.2
 set style line 2 lt 1 pt 9 ps 1.4
 set logscale x 
 set format x "10^{%L}"  
 set grid xtics ytics mxtics  
 
 set y2tics 5
  set xlabel  "Threshold value for the matrix" font "NimbusSanL-Regu,18"
 set ylabel  "Matrix sparsity, \% percentage" font "NimbusSanL-Regu,18"
 set y2label "Output disturbance attenuation, \% percentage" font "NimbusSanL-Regu,18"
 plot ".data" using 6:8 title "Percentage of sparsity of the Hessian matrix" with points linestyle 1  lc rgb "blue" axis x1y1 ,
      ".data" using 6:((1- $4/$2)*100) title "Output disturbance attenuation performance, \% of rejection" with points linestyle 2  lc rgb "dark-red" axis x1y2 
 

Ключевые для понимания строки:
 set y2range [60:100] 
 set y2tics 5 
 set y2label "Output disturbance attenuation, \% percentage" font "NimbusSanL-Regu,18" 
Здесь используется довольно редкий финт: изменение поведения второй вертикальной оси y2range  в гнуплоте. Да-да, она не просто так отсвечивает в графике и её тоже можно использовать. В данном случае мы явно указываем диапазон значений для второй оси  set y2range [60:100]  проставляем на ней другие засечки с помощью set y2tics 5
и далее присваиваем оси другую (независимую) подпись set y2label

Обратите внимание на параметры команды на строчках 23-24: мы строим два ряда данных и указываем, какие оси использовать. Сначала это axis x1y1  а потом   axis x1y2  для того, чтобы два массива данных строились относительно двух разных осей.


Три графика один под другим
Чтобы показать один и тот же сигнал, обработанный двумя разными фильтрами, полезно разместить три графика на одном, график под графиком:



В строительстве подобных графиков нам поможет инструкция set multiplot
 в 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#! /usr/bin/gnuplot -persist
 set terminal postscript "NimbusSanL-Regu" eps color enhanced fontfile "/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"
 set output "./plots/plotOutputDisturbancePlant.ps"
 set lmargin 10 
 set rmargin 2 
 set grid
 set bmargin 4

 set style line 1 lt 1 pt 5 ps 0.3
 set style line 2 lt 2 pt 7 ps 0.5
 set style line 3 lt 3 pt 9 ps 0.3
 set style line 4 lt 4 pt 11 ps 0.3
 set style line 5 lt 5 pt 13 ps 0.3

 set xrange [300:600]

 set multiplot
 set nokey 
   set size 1,0.35 
  set xlabel "Sampling instant" 
 set ylabel "Control input" 
 set origin 0.0,0.0
 set bmargin 3
 set tmargin 0
 plot "./data.data" index 23 using 3 title " " with linespoints  linestyle 1  lc rgb "red",
      "./data.data" index 22 using 3 title " " with linespoints linestyle 2 lc rgb "dark-red",
      "./data.data" index 18 using 3 title " " with linespoints linestyle 3 lc rgb "dark-green",
      "./data.data" index 14 using 3 title " " with linespoints linestyle 4 lc rgb "blue",
      "./data.data" index 12 using 3 title " " with linespoints linestyle 5 lc rgb "green"
 set ylabel "Output disturbance" 

 set size 1,0.3 
 set origin 0.0,0.39  
  set xlabel " " 
  set bmargin 0 
 set tmargin 1
  set nokey 
   plot "./data.data" index 23 using 2 title " " with linespoints linestyle 1 lc rgb "red",
      "./data.data" index 22 using 2 title " " with linespoints linestyle 2 lc rgb "dark-red",
      "./data.data" index 18 using 2 title " " with linespoints linestyle 3 lc rgb "dark-green",
      "./data.data" index 14 using 2 title " " with linespoints linestyle 4 lc rgb "blue",
      "./data.data" index 12 using 2 title " " with linespoints linestyle 5 lc rgb "green"

 set size 1,0.3 
 set origin 0.0,0.7 
  set bmargin 0.1 
 set xlabel " " 
  set tmargin 1
  set ylabel "Residual disturbance" 
 plot "./data.data" index 23 using 1 title " " with linespoints linestyle 1 lc rgb "red",
      "./data.data" index 22 using 1 title " " with linespoints linestyle 2 lc rgb "dark-red",
      "./data.data" index 18 using 1 title " " with linespoints linestyle 3 lc rgb "dark-green",
      "./data.data" index 14 using 1 title " " with linespoints linestyle 4 lc rgb "blue",
      "./data.data" index 12 using 1 title " " with linespoints linestyle 5 lc rgb "green"
 set nomultiplot

До строки 17 всё в общем вполне очевидно - задаём стили для линий разных типов, диапазоны на осях и сетку. Кроме того, строка 2 явно указывает гнуплоту внедрять шрифты, о чём уже была заметка ранее.

Чёрная магия начинается дальше: с помощью инструкци set multiplot на строке 17 мы просим строить gnuplot несколько графиков на одном.

График начинаем строить с конца, то есть с нижнего графика. Для этого мы меняем размер и позицию графика:
set size 1,0.35 
 set origin 0.0,0.0
 set bmargin 3
 set tmargin 0
на строках 17-22. После этих танцев с бубном строим график:

plot "./data.data" index 23 using 3 title " " with linespoints  linestyle 1  lc rgb "red"

из файла данных ./data.data, используя блок с результатами номер 22 (ибо index 22 а нумерация идёт с блока 0), в котором строим 3-ю колонку (using 3) стилем линий linestyle 1 используя красный цвет линии  lc rgb "red"
Вообще полезно продумать структуру данных для строительства графиков заранее. Например, размещать данные для разных случаев блоками (ряды данных, отбитых двумя пустыми строками), чтобы использовать возможности gnuplot и особенно инструкции index.
График, расположенный в середине (строки 32-43 ), строится точно так же, только:
set size 1,0.3 
set origin 0.0,0.39
Ну и наконец верхний график в примере это строки 44-54, после чего выключаем multiplot и скармливаем всё gnuplot для графопостроительства. Всё легко и просто  :-)



Графики с осями, имеющими разрывы
Разрывные оси (broken axis) на графиках иногда нужны, чтобы показать данные только в тех значениях, где происходит что-то интересное. При этом масштаб нужен линейный, а применение логарифмических осей нежелательно или невозможно (например, когда показывается probability density function). И если вы думали, что предыдущий пример мозговыносящий - пристегните ремни, товарищи, сейчас начнётся...

Рецепт подсмотрен на блоге одной суровой японской девушки, и далее будет адаптирован для ещё более мозголомного случая. Но всё по порядку.

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


Код для построения графика, взятый с сайта Gnuplot Surprising, приводится далее:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
reset
set term png font "Times,15"
set output "broken_axes1.png"
f(x)=exp(-x)*sin(500*x)     #plotting function
set yrange [-1:1]    #The later two plot have same yrange
set sample 400
set tics nomirror
set tmargin at screen 0.9   #the later two plots will share this tmargin
set bmargin at screen 0.1   #------------------------------------b------

set multiplot    #begin multiplot mode

#axes broken line
set arrow 1  from screen 0.5,0.08 to screen 0.52,0.12 nohead
set arrow 2  from screen 0.52,0.08 to screen 0.54,0.12 nohead
set arrow 3  from screen 0.5,0.88 to screen 0.52,0.92 nohead
set arrow 4  from screen 0.52,0.88 to screen 0.54,0.92 nohead

#x,y axis label and title label
set label 1 "Time: t(s)" at screen 0.475,0.025
set label 2 "Signal:U(mV)" at screen 0.025,0.44 rotate by 90
set label 3 center "U=exp(-t)sin(500t)" at screen 0.5,0.95

#The left part
set border 1+2+4    #the right border is not plotted
set lmargin at screen 0.1   #the left-part's location
set rmargin at screen 0.51
set xtics 0,0.02,0.08
plot [0:0.1] f(x) w l lt 1 lw 2 notitle

#unset the labels and arrows, otherwise they will be plot 
#for the second time
unset label 1
unset label 2
unset label 3 

unset arrow 1
unset arrow 2
unset arrow 3
unset arrow 4

#the right part
set border 1+4+8    #the left border is not plotted
set lmargin at screen 0.53      #the right-part's location
set rmargin at screen 0.94
#ytics is not plotted, as the second plot will share it with the first one
unset ytics
set xtics 0.9,0.02,1.0
plot [0.9:1] f(x) w l lt 1 lw 2

unset multiplot


Выглядит, конечно, устрашающе. Тем не менее, это тот же самый set multiplot  только сбоку. В отличие от предыдущего примера, здесь мы строим левую и правую части графиков отдельно, с разными осями и диапазонами, а потом сшиваем вместе.

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

#axes broken line
set arrow 1  from screen 0.5,0.08 to screen 0.52,0.12 nohead
set arrow 2  from screen 0.52,0.08 to screen 0.54,0.12 nohead
set arrow 3  from screen 0.5,0.88 to screen 0.52,0.92 nohead
set arrow 4  from screen 0.52,0.88 to screen 0.54,0.92 nohead 
Занудность в том, что угадать координаты засечек (в формате [x,y]_начало_засечки, [x,y]_конец_засечки) довольно непросто.

Далее идёт построение левой части (строки 24-29):
#The left part
set border 1+2+4    #the right border is not plotted
set lmargin at screen 0.1   #the left-part's location
set rmargin at screen 0.51
set xtics 0,0.02,0.08
plot [0:0.1] f(x) w l lt 1 lw 2 notitle
Сложность здесь в том, чтобы угадать с полями ( set lmargin и  set rmargin ). У японской девушки всё легко и просто, но если нужно построить что-то посложнее, угадывание может отнять время.

После убираем засечки:
#unset the labels and arrows, otherwise they will be plot 
#for the second time
unset label 1
unset label 2
unset label 3 

unset arrow 1
unset arrow 2
unset arrow 3
unset arrow 4
и строим левую часть:
#the right part
set border 1+4+8    #the left border is not plotted
set lmargin at screen 0.53      #the right-part's location
set rmargin at screen 0.94
#ytics is not plotted, as the second plot will share it with the first one
unset ytics
set xtics 0.9,0.02,1.0
plot [0.9:1] f(x) w l lt 1 lw 2
Всё, выключаем мультиплот  unset multiplot  и вставляем эффектный график в статью.


А теперь всё вместе: три графика в одном с разрывными осями!
На всякий случай: это не просто дешёвый выпендрёж автора этих строк и желание эпатировать публику, а реальная нужда запрессовать данные в ограниченный объём страниц конференции. Вот как выглядит график:

Здесь показано время р?
Sunday, August 25th, 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:31 pm
Getting Things Done: вся идея GTD одним рисунком
Сегодня весь день у автора этих строк работа никак не клеилась, и он по этому поводу решил страдать ерундой написать пост в бложик. Повод тем более благодатный, ибо автору пришла в голову мысль сделать из всей системы Getting Things Done (басурм.: Приводим дела в порядок) один большой шарж забавы ради и пользы дела для. Собственно...

А что за GTD, собственно?

GTD это аббревиатура от Getting Things Done - название первой книги (ныне классической) от David Allen, где он предлагает систематизированный подход по управлению своими делами. GTD это не просто "ещё один тайм-менеджмент", а именно структурированный подход к упорядочиванию своих дел. Некоторое представление о том, как работает GTD, можно получить из поста по этой ссылке.


Книг на самом деле три:
  1. Getting Things Done (The Art of Stress-Free Productivity) вышла в 2001 году и сразу захватила умы страждущих. Содержит основные идеи по упорядочиванию дел на уровне действий (Actions) и проектов (Projects). Надо сказать, что первый блин вышел не то, чтобы комом, но не очень удачным: книга несколько водяниста и любит себя повторять.
  2. Ready for Anything (Ready for Anything: 52 Productivity Principles for Work and Life) опубликована в 2003 году в ответ на критику по поводу отсутствия в первой книге идей о том, откуда проекты взять и как ставить цели. На взгляд автора этих строк, книга вышла слишком философской и оторванной от реальности, хотя аудиокнига (сильно сокращённый вариант текста) содержит ряд полезных идей.
  3. Making It All Work (Winning at the Game of Work and Business of Life) увидела свет в 2008 году, и вот она-то удалась: хорошо структурированная и продуманная, книга содержит детального описания устройства GTD по достижению контроля и перспективы.
Читать стоит все три книги, но начинать следует всё-таки с первой, Getting Things Done - остальные книги подразумевают, что читатель уже в курсе, что такое GTD и почему держать все свои планы и проекты в голове это плохая идея.

Вторую книгу можно пропустить без ущерба для понимания, а вот Making It All Work как раз стоит внимательно прочитать. Здесь Дэвид Аллен как раз и раскрывает всю идею GTD в понятной схеме:



Эта схема как раз и взята из книги Making It All Work где она подробно и доступно объясняется.

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

Достигаем контроля (Control) над своими делами с помощью GTD


Достижение контроля означает освоение пяти шагов:
  • Capture (Запись всего) - ничего не держать в голове, а записывать на бумаге, печатать в текстовом редакторе и фиксировать другими способами. Главное - вытащить всё из головы и положить перед собой, чтобы было легче разбираться.
  • Clarify (Прояснение) - каждый клочок бумаги, обрывочный текст или нацарапанный на столе телефонный номер требует прояснения. Что это? Можно ли по этому поводу что-то предприять? Может, это проект? Справочные материалы? Событие в календарь? Или просто мусор?
  • Organise (Организация) - когда мы выяснили, что делать (и делать ли вообще) с кусочком информации, его надо соответственным образом организовать. Свои идеи стоит разбить на проекты, каждый из которых имеет цель, идеальный результат, нагенерированные идеи (Brainstorm) и список активных шагов по достижению желаемого результата.
  • Review (Обзор) - любая, даже самая навороченная GTD-система, мертва, если она не обновляется регулярно. Мир движется слишком быстро, и список дел к концу рабочей недели успеет устареть: часть шагов выполнена, часть следует запланировать, а некоторые проекты, возможно, уже стали не актуальны. Обзор следует делать раз в неделю - потому он и называется Weekly Review.
  • Engage (Выполнение) - теперь, когда у вас всё организовано, следует сделать список проектов и активных шагов: либо распечатать, либо загрузить в смартфон\планшет. При этом и себе, и другим, время от времени стоит задавать вопрос "Каков следующий шаг?" (What is the next action?). Это позволяет превратить мутные и манящие проекты в реально осуществимые шаги.
Схема, содержащая шаги Capture, Clarify и Organize, выглядит примерно так:


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

Actionable stuff

Если клочок бумаги в ваших руках требует каких-то действий, то это может быть:
  • Next action (активное действие) - купить молоко, оплатить счёт, добавить рисунок в пост;
  • Project (проект) - это цель, которая достижима менее чем за год и требующая больше одного физического действия. Пример: написать пост в блог, исследовать оптимизационный алгоритм, купить новый смартфон.
  • Waiting for (ожидание) - иногда действия требуются не от вас, а от других, и работу можно перепоручить. Это, безусловно, приятно, но всё равно требует контроля и учёта - что именно поручено и когда требуется.
  • Calendar (событие) - это действие, которое имеет смысл в определённый день. Для этого в нашей GTD-системе должен быть календарь, куда стоит заносить все события и регулярно их обновлять.
То, как вы всё это организуете - на бумаге, на смартфоне, в веб-сервисе, или даже в виде сложного LaTeX-файла - не имеет значения. Важно регулярно обновлять и улучшать систему, чтобы вы могли ей доверять.

На самом деле, создание GTD-системы "под себя" - не такая сложная задача, как кажется. Можно использовать LaTeX, как это сделал я, или Markdown, если web-просмотр вам ближе - важно, чтобы язык или программа позволяла легко создавать и менять списки. Список - ядро GTD, поскольку многое  в GTD это просто список:
  • список проектов
  • список активных шагов
  • календарь это по сути список событий
  • список зон ответственности (areas of focus)
 Использование готовых программ, хотя и полезно на первых порах, в дальнейшем может привести к трудностям - рано или поздно вы захотите подстроить GTD под себя, и это в сторонней программе может быть нетривиально.


Non-actionable stuff

По многим вопросам не нужно делать активных действий, но тем не менее они важны и нужно их хранить:
  • Someday\Maybe (Когда-нибудь\может быть) - это список разного рода безумных затей и оголтелых проектов, которые пока либо не дозрели, либо вообще не понятно, понадобятся ли. Тем не менее, такие затеи лучше хранить списком и время от времени навещать.
  • Reference materials (справочные материалы) - ссылки, руководства, гарантийные талоны, умные мысли и цитаты. Файловая система компьютера сама подсказывает способ упорядочивать подобные данные, а для справочных материалов в бумажном виде придётся купить папки, чтобы весь этот скарб хранить.
Или не хранить: многое имеет свойство устаревать и терять значение, поэтому бумажный шредер и кнопка DEL ваши самые лучшие друзья.


Зачем делать еженедельный обзор (Weekly Review)?

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

Схематично еженедельный обзор можно представить в виде:



В Интернете вы найдёте массу рекомендаций о том, как делать Еженедельный обзор за рулём, под водой и в коленно-локтевом положении, но горькая правда всегда одна: либо вы его делаете регулярно (и это входит в привычку), либо вся эта изящная GTD-система перестаёт на вас работать.


Ключ на старт!

Всё запланировано, разложено по полочкам, загружено и распечатано - время, собственно, делать дело! Вся эта GTD-система от товарища Аллена на то и создана, чтобы позволять делать дела быстрее и эффективнее. При этом решения принимаете вы, руководствуясь четырьмя критериями:
  1. Context (контекст) - есть дела, которые можно сделать только за компьютером (что-то посмотреть в Интернете), или только с помощью телефона (сделать несколько звонков), и такие дела лучше всего объединять в серии.
  2. Time (время) - вряд ли стоит затевать писать эпических размеров пост длинной в "Войну и Мир", если у вас есть 10 минут перед ответственной встречей. Стоит перегруппировать свои дела, чтобы выделить длинный кусок времени для масштабных дел.
  3. Energy (запас сил) - если вы не выспались или пребываете в состоянии insect mind-state, стоит пройтись по списку активных шагов и проектов в поиске чего-нибудь несложно-мухобойного, что всё равно придётся делать. Наоборот, если у вас из всех щелей брызжит креатив, вот как у автора этих строк сейчас, стоит отложить другую работу и дать креативу волю.
  4. Priority (приоритеты) - есть проекты, которые не горят, но очень важны, а есть рутинная мелочь, которая не сильно способствует продвижению вперёд. Важно не скатываться в простое выполнение проектов, а выполнять важные именно для вас задачи.
Выглядит в виде схемы это как-то так:




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

Ясность - одно из проявлений полного тумана. Чтобы видеть ясно, заберитесь повыше.


Достигаем перспективы (Perspective) с помощью GTD

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



  • 50.000 футов - Назначение и Принципы - вопрос "Зачем это делать?"
  • 40.000 футов - Видение и Стиль жизни - вопрос "Как выглядит успех и желаемый стиль жизни в далёкой перспективе?"
  • 30.000 футов - Цели и Средства - вопрос "Чего я хочу достичь в течение года или двух?"
  • 20.000 футов - Зоны ответственности - вопрос "Что я хочу поддерживать?"
  • 10.000 футов - Проекты - вопрос "Что я хочу завершить?"
  • 0 футов, Взлётная полоса - Следующие шаги - вопрос "Что мне нужно сделать?"
Каждый уровень содержит списки или проекты, которые должны отражать содержимое нижних уровней и согласоваться с более высокими. Чем выше горизонт, тем проще его структура, но сложнее формулировать содержимое. Чем ниже горизонт, тем сложнее им управлять.
Поэтому самая сложная часть GTD - взлётная полоса: создание структуры, которая содержит все ваши действия - сложное занятие. Наоборот, описание назначения ваших проектов (и жизни) и принципов - просто (это просто список), но формулировать их, по понятным причинам, нелегко.



Начнём с самого приземлённого уровня, как советует Дэвид Аллен - со взлётной полосы.

0 футов, Взлётная полоса: Следующие шаги

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

Вопрос, который здесь следует задать себе на этом уровне: "Что мне нужно сделать?"



Любой самый навороченный проект можно разбить на последовательность шагов. Иногда проще всего продвинуть проект, задав себе (и окружающим) вопрос: "Так каков следующий шаг?"


10.000 футов: Проекты

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

Вопрос, который здесь следует задать себе на этом уровне: "Что я хочу завершить?"


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


20.000 футов: Зоны ответственности

Горизонт Зон ответственности (фокуса) содержит список областей или категорий, которым вы отдаёте предпочтение или уделяете особое внимание.

Вопрос, который здесь следует задать себе на этом уровне: "Что я хочу поддерживать?"


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


30.000 футов: Цели и Средства

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

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

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

40.000 футов: Видение и Стиль жизни

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


Вопрос, который здесь следует задать себе на этом уровне: "Как выглядит долгосрочный успех?"


Если у вас хорошо развито воображение, то можно сделать небольшой коллаж из картинок и текста, который отражает ваши мечты на будущее. Хорошо сделать нечто вроде карты сокровищ


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


50.000 футов: Назначение и Принципы

Горизонт Назначения и Принципов - самый философский из всех. Это короткое, но энергичное (а главное правдивое) описание того, зачем вы всё это делаете. В конечном итоге это должен быть ответ на вопрос "в чём назначение вашей компании\жизни?"
  Вопросы, который здесь следует задать себе на этом уровне: "Зачем я всё это делаю?" и "Я в своей лучшей форме, когда...?"


Самый верхний горизонт часто представляет собой одно предложение с ответом на вопрос для себя "Зачем я это всё делаю?" и списком Принципов (это некие стандарты и ценности, ниже которых вы не позволите себе жить и работать).  К этому ещё можно прибавить список цитат, которые вам дороги.


Контроль и Перспектива = Капитан и Командир

Этот пост призван подвести итог более чем шестилетнему опыту использования мной системы GTD. За это время несколько раз сменился формат бумаги (А6 -> A5 -> A4 -> A5), формат электронной версии (текстовые файлы -> чистый LaTeX -> LaTeX + Kile + Markdown + Zim) и прибавилась техника тайм-менеджмента Pomodoro.

Сначала живётся в режиме выживания (Survivalist), имея мало контроля и мало перспективного видения.

С приобщением к GTD, появилось больше контроля над обстоятельствами. Но способность (и смелость) перспективного видения - не то, что приобретается за неделю, и автор постепенно скатился в микроменеджмент (много контроля, мало перспективы).

Обладая контролем над проектами, действиями и идеями, автор начал слишком много фантазировать и редко обновлять GTD-систему, на некоторое время превратившись в Мечтателя (Crazymaker).

Прочтение Making it all work имело тонизирующий и оздоравливающий эффект: набранный контроль и упорядоченное мечтательство позволило приблизиться к состоянию "Капитана и Командира", и уверенно выдерживать курс к своим целям, не смотря ни на что.



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

Как и было обещано, полная картина GTD в виде одного коллажа:

Вся схема Getting Things Done. Кликабельна, 700кб JPEG

Так или почти так выглядит вся идея Getting Things Done, сформулированная и практикуемая Дэвидом Алленом и миллионами людей по всему миру.

Вся схема доступна для загрузки:
Исходник для схемы принятия решений в SVG можно скачать по этой ссылке. Шрифт, использованный в схеме, называется Jikharev.

Благодарности

Автор в неоплатном долгу перед сервисом shutterstock и другими сайтами, откуда были надёрганы векторные картинки для GTD-схемы. Ну и перед David Allen, разумеется, который помог (и делает это по сей день) многим GTDшникам делать дела быстрее, мыслить ширее и поступать смелее.
Image
Monday, July 29th, 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.
3:04 am
Перенос таблиц из MS Excel или OpenOffice Calc в LaTeX через Calc2LaTeX
Это небольшая заметка может пригодится помимо автора этих строк тем, кому нужно переносить или создавать сравнительно простые таблицы из Excel или Calc в LaTeX, потому как создание таблиц в LaTeX это занятие, часто причиняющее адские боли ниже поясницы.


Дизайним таблицы в Calc и переносим их в LaTeX через Calc2LaTeX

Собственно, Calc2LaTeX это расширение, которое транслирует код из Calc в LaTeX. А что там автор тогда заливал в заголовке про Microsoft Excel? Дык Calc-то уже давно открывает любые* таблицы Excel. Создатели LibreOffice гарантируют это :-)

Не будемте отвлекаться на мелочи - лучше о том, как всё это установить.

---
любые*  - Your Mileage May Vary, как говорят за океаном, но многие таблицы в самом деле хорошо поддерживаются OpenOffice Calc.

Установка Calc2LaTeX

Для установки идём на сайт и скачиваем плагин (или вот тут моё зеркало).
После этого запускаем Calc и идём в меню Tools -> Extension Manager, где нажимаем кнопку Add (Добавить). Добавляем плагин:


На этом установка не заканчивается - нам хочется какую-нибдь кнопку для этого макроса или пунктик в меню. Как нам сообщает "отменная" документация,
Some day, I will try to add this button to the extension.
Разумеется, этот знаменательный день, пламенно обещанный автором jarom аж в 2009 году, наступит тогда же, когда мир во всём мире, линукс на десктопе и всеобщая экономическая стабильность. Поэтому нам придётся попотеть и ускорить наступление оного счастья собственными мозолистыми руками:
Tools -> Customize -> Toolbars (или Menu, если мы хотим добавить Calc2latex в пункт меню)
Нажимаем кнопку "Add... ". Далее прокручиваем список "Category" до  "OpenOffice.org Macros" слева, и открываем:
My Macros -> Calc2LaTeX -> Calc2LaTeX
Выбираем интуитивно понятный пукт (команду) в правой части под названием "Main", и нажимаем кнопку  "Add".

 
Теперь кнопку на панели можно переместить или присобачить ей другую иконку (кнопкой Modify):



Так что у вас в Open/LibreOffice Calc должна появиться кнопка для Calc2LateX:



и сейчас мы её начнём неистово тыркать.

Конвертирование таблицы Excel или Calc в LaTeX

Всё готово для старта, и сейчас мы приступим: открываем или создаём таблицу в Calc, выделяем нужные ячейки и жмём кнопку Calc2Latex, которую создали на предыдущем этапе.


При этом появится диалоговое окно, которое даст выбрать нам немного параметров.

Результат Calc2LaTeX

Лучше, чем ждёшь от ёпенсорца, но хуже, чем надеешься получить.

Плюсы:
  • сохраняет базовое форматирование содержимого ячеек (полужирный, курсив)
  • можно задать метку и заголовок
  • можно включить или выключить линовку строк таблицы
  • экранирование LaTeX-символов типа & # и &
Собственно, это всё. Теперь

Минусы:
  • медленный. ОЧЕНЬ медленный плагин - 5 строк, 10 столбцов на Core i5-560M 2.66Ghz заняло 20 секунд.
  • нет сохранения цветовой раскраски.

Как и многий другой опенсорц, плагин, конечно, работает, только очень медленно и несколько коряво. Никакого цветового оформления можно не ждать, но полужирное и курсивное начертание будут переданы. Для того, чтобы сконвертировать первые пять (5!) столбцов, на Core i5-560M 2.66Ghz ушло 20 секунд.

Теперь сравнение того, что было в оригинале:

c тем, что выдал плагин:


то есть таблица, конечно, есть, но страшная, как смерть водолаза и потому требует дальнейшей работы.
Для самых любознательных: эта таблица может представлять интерес для тех, кто решает Online Box-constrained Convex Quadratic Programming - ограниченные конвексные оптимизационные задачи, причём очень быстро (online). Здесь перечислены алгоритмы и их основные характеристики, протестированные автором этих строк. Если кто может эту таблицу расширить - пишите в комментарии.

Эта же таблица в Google Docs:


Image
Monday, June 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.
10:01 am
ЛаТеХ для продвинутых. Floatrow - картинки и таблицы в ряд.

Как уже обсуждалось в предыдущем посте из серии "ЛаТеХ для продвинутых", одним из самых универсальных средств для контроля над расположением картинок, таблиц и подписей к ним в пределах плавaющего объекта является пакет floatrow.

В предыдущей части мы рассмотрели всевозможные способы взаимного расположения картинки и подписи (снизу, сверху, сбоку), выравнивания их по горизонтали и т.п. Этот же пост будет посвящён расположению нескольких объектов (рисунков, таблиц) в ряд. Обратите внимание, что имеется в виду именно расположение нескольких объектов типа figure и/или table, а не нескольких картинок/таблиц (обычно помеченных как а, б, в, ...) в пределах одного объекта, как это делают пакеты subcaptionили subfig.

Все примеры из данного поста могут быть найдены здесь и здесь в виде tex-файлов готовых к компиляции. Документация к пакету floatrow доступна на русском и английском языках.

Краткий анонс

Сначала мы познакомимся с командами \ffigbox{}{} и \ttabbox{}{}, которые создают бокс для картинки/таблицы и соответствующей подписи.

Затем будут освещены средства, необходимые для контроля над горизонтальным выравниванием:

  • Окружение floatrow для расположения иллюстраций и таблиц в ряд.
  • Длины FBwidth (ширина картинки) и Xhsize (ширина остатка страницы).
  • Параметр floatrowsep, определяющий расстояние между картинками в ряду.

И, наконец, будут разобраны способы выравнивания объектов по вертикали, как то

  • Команды \TopFloatBoxes, \BottomFloatBoxes, \CenterFloatBoxes, выравнивающие весь float.
  • Параметры heightadjust и valign для выравнивания только картинки/таблицы.
  • Выравнивание подписей.

Команда \ffigbox

Основной рабочей лошадкой во всех примерах ниже является команда \ffigbox предоставляемая пакетом floatrow. Её синтаксис прост:


01: \ffigbox[ширина][высота][вертикальное положение]{подпись}{картинка}
Она определяет бокс, в который помещается картинка и подпись к ней, например

01: \usepackage{floatrow}
02: \usepackage{graphicx}
03: ...
04: \begin{figure}[!h]
05: \ffigbox{\caption{My Caption}\label{fig:ffb}}%
06: {\includegraphics{roman_a}}
07: \end{figure}
создаст обычный плавающий объект, как произошло бы и без использования \ffigbox, с той единственной разницей, что благодаря \ffigbox автоматически включается горизонтальное выравнивание по центру.

Для таблиц определена аналогичная команда \ttabbox: далее мы сосредоточимся на картинках, но всё без исключения применимо и к таблицам.

Расположить несколько рисунков в ряд нам поможет окружение floatrow:


01: \begin{figure}
02: \begin{floatrow}
03: \ffigbox{\caption{My Caption left}\label{...}}%
04: {\includegraphics{...}}
05: \ffigbox{\caption{My Caption right}\label{...}}%
06: {\includegraphics{...}}
07: \end{floatrow}
08: \end{figure}

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

Горизонтальное выравнивание

Волшебная длина \FBwidth

Предыдущий рисунок выглядит очень неуравновешенно, так как ширина отводящаяся на подпись не соответствует ширине картинки. Гораздо более симпатичного результата можно добиться вот так:


01: \usepackage{floatrow,graphicx,calc}
02: % Создаёем новый разделитель
03: \DeclareFloatSeparators{mysep}{\hspace{3cm}}
04: ...
05: % Настраиваем значение разделителя для объектов
06: \thisfloatsetup{floatrowsep=mysep}
07: % А вот и сам плавающий объект
08: \begin{figure}
09: \begin{floatrow}
10: \ffigbox[\FBwidth+1cm]{\caption{...}}%
11: {\includegraphics{...}}
12: \ffigbox[\FBwidth+1cm]{\caption{...}}%
13: {\includegraphics{...}}
14: \end{floatrow}
15: \end{figure}

По порядку

  1. В строках 10 и 12 использован необязательный аргумент в \ffigbox, который задаёт ширину плавающего объекта. В этом примере мы задаём ширину на 1см больше, чем ширина соответствующего изображения: т.е. подпись будет выдаваться на 0.5см с каждой стороны. Заметьте, что ширина самого изображения доступна через \FBwidth, a для того, чтобы можно было к ней прибавить 1см, надо загрузить пакет calc в строке 1.
  2. Расстояние между двумя объектами (Figure 3 и Figure 4) задано в строке 6 с помощью параметра floatrowsep. Обратите внимание, что нельзя просто написать floatrowsep=3cm, вместо этого надо определить новый разделитель (назовём его mysep) в строке 3, а затем использовать в floatrowsep=mysep. Пакет предопределяет следующие разделители: none, quad (=1em), qquad (=2em), columnsep (равен длине \columnsep, которую ЛаТеХ использует для разделения двух колонок текста).

Волшебная длина \Xhsize

Помимо очень полезной длины \FBwidth, пакет предопределяет длину (точнее, ширину) \Xhsize, равную оставшейся ширине страницы. Эта длина может быть использована точно так же, как и \FBwidth, в первом необязательном аргументе \ffigbox.

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


01: \begin{figure}
02: \begin{floatrow}
03: \ffigbox[\FBwidth+1cm]{\caption{My Caption left}}%
04: {\includegraphics{...}}
05: \ffigbox[\Xhsize]{\caption{My Caption right very .... very long}}%
06: {\includegraphics{...}}
07: \end{floatrow}
08: \end{figure}

Несколько картинок в ряд

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


01: \thisfloatsetup{floatrowsep=qquad}
02: \begin{figure}
03: \begin{floatrow}[3] % три рисунка в ряд!
04: \ffigbox[\FBwidth+0.5cm]{\caption{...}}{\includegraphics{...}}
05: \ffigbox[\Xhsize/3*2]{\caption{...}}{\includegraphics{...}}
06: \ffigbox[\Xhsize]{\caption{...}}{\includegraphics{...}}
07: \end{floatrow}
08: \end{figure}

Из этого же примера очевидна гибкость использования \FBwidthи \Xhsize: к ним можно прибавлять длины, их можно умножать на скаляры. Кроме того, обратите внимание, что параметр \Xhsize в строках 5 и 6 имеет разные значения: он каждый раз означает ширину, оставшуюся на странице на момент вызова \ffigbox!

Вертикальное выравнивание

Весь объект

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

Эта проблема решается с помощью одной из команд
\BottomFloatBoxes (выравнивание по низу),
\TopFloatBoxes (выравнивание по верху),
\CenterFloatBoxes (выравнивание по центру),
которая должна следовать сразу после \begin{figure}.

Например

01: \begin{figure}[!h]\TopFloatBoxes % or \BottomFloatBoxes or \CenterFloatBoxes
02: \begin{floatrow}
03: \ffigbox{...}{...}
04: \ffigbox{...}{...}
05: \end{floatrow}
06: \end{figure}
приводит к такому результату:

Только картинки

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


01: \begin{figure}[!h]
02: \floatsetup{heightadjust=object,valign=c}
03: \begin{floatrow}
04: \ffigbox{\caption{...}}%
05: {\includegraphics{...}}
06: \ffigbox{\caption{...}}%
07: {\includegraphics{...}}
08: \end{floatrow}
09: \end{figure}

Здесь использованы два параметра:

heightadjust: какие части float в ряду должны быть одинаковой высоты. Соответственно, его значения

  1. object: место, отводящееся под саму картинку, выполнить одинаковой высоты для всех картинок;
  2. caption: то же, но для места, отводящегося под подпись;
  3. all: первое и второе вместе;
  4. noobject, nocaption, none: отрицание, соответственно, первого, второго и третьего
В нашем примере, floatrow инструктирован выделить под обе картинке блоки одинаковой высоты.

valign: "тип" вертикального выравнивания. Может быть t (по верху), b (по низу), c (по центру).

Подписи

Для рисунков, когда подписи размещены под иллюстрацией, нет необходимости их дополнительно "выравнивать": подписи и так выровнены "по верху". Однако у таблиц, когда подписи размещены сверху, так как использована директива


01: \floatsetup[table]{style=plaintop}
или, что то же самое,

01: \floatsetup[table]{capposition=top}
то подписи автоматически оказываются вырoвненными "по низу", вот так:

Чтобы вырoвнять их "по верху" используем


01: \floatsetup[table]{style=Plaintop}
или же

01: \floatsetup[table]{capposition=TOP}

Полностью код примера выше: открыть


01: % используем стиль, в котором подписи таблиц
02: % сверху и выравнены "по верху"
03: \floatsetup[table]{style=Plaintop,floatrowsep=qquad}
04: %
05: % Теперь сами таблицы в ряд
06: \begin{table}[!h]
07: \begin{floatrow}
08: % первая таблица
09: \ttabbox[\FBwidth]{\caption{My Caption left}}%
10: {\begin{tabular}{c|cc}
11: Column 1 & Column 2 & Column 3 \\ \hline
12: a & b & c \\
13: a & b & c \\
14: a & b & c \\
15: a & b & c \\
16: a & b & c
17: \end{tabular}
18: }
19: % вторая таблица
20: \ttabbox[\FBwidth]{\caption{My Caption right, let us
21: make it somewhat longer}}%
22: {\begin{tabular}{c|cc}
23: Column 1 & Column 2 & Column 3 \\
24: \hline
25: a & b & c \\
26: a & b & c \\
27: a & b & c
28: \end{tabular}
29: }
30: \end{floatrow}
31: \end{table}

Картинка рядом с таблицей

Все трюки, приведённые выше, обсуждались на примере или картинок, или таблиц. Если картинка и таблица должны находиться рядом, нужно воспользоваться командой \killfloatstyle. Например

01: \begin{figure}[!h]\CenterFloatBoxes
02: \begin{floatrow}
03: \ffigbox[...]{\caption{...}}{...}
04: %
05: \killfloatstyle
06: %
07: \ttabbox[...]{\caption{...}}{...}
08: \end{floatrow}
09: \end{figure}
произведёт следующий результат

И всё-таки subfloats

Хотя во введении и было обещано не рассматривать вопросы, связанные с расположением "подрисунков" (subfigures, subtables), стоит отметить, что все вышеприведённые рецепты действуют и в их случае с той лишь разницей, что надо использовать окружение subfloatrow вместо floatrow.

Простой пример ниже демонстрирует это в деталях


01: \usepackage{subcaption,floatrow,graphicx,calc}
02: \floatsetup{floatrowsep=qquad}
03: ...
04: \begin{figure}[!h]
05: \ffigbox{
06: % объявляем, что будут 3 картинки в ряд
07: \begin{subfloatrow}[3]
08: \ffigbox[\FBwidth+1cm]{\caption{My Caption left}}{\includegraphics{...}}
09: \ffigbox[\FBwidth+1cm]{\caption{My Caption mid...}}{\includegraphics{...}}
10: \ffigbox[\FBwidth+1cm]{\caption{My Caption right...}}{\includegraphics{...}}
11: \end{subfloatrow}
12: }
13: { % подпись ко всему float
14: \caption{Overall caption.}
15: }
16: \end{figure}
Пара пунктов, на которые стоит обратить внимание:
  1. надо загрузить дополнительно пакет subcaption;
  2. вместо окружения floatrow используем subfloatrow;
  3. причём помещаем его внутрь первого аргумента \ffigbox (строка 5);
  4. а во втором аргументе \ffigbox помещаем подпись ко всему ряду рисунков (строка 14).

Абсолютно аналогично можно это применить и к таблицам, заменив \ffigbox на \ttabbox

Заключительный сложный пример для любознательных

Помимо рассмотренных выше трюков, floatrow позволяет создавать собственные типы float. Кроме того, пакет иеально функционирует в тандеме с другим пакетом caption, который позволяет должным образом оформить подпись.

В следующем примере использованны эти возможности:

  1. Определен новый тип float под названием Photo (с собственным счётчиком и другими атрибутами), подпись которого набирается справа от картинки.
  2. Для таблиц и др. объектов, подпись отфoрмaтирована специальным образом.

Подробные разъяснения приведены в коде: открыть

01: \usepackage{caption,floatrow}
02: %------------------------------------------------
03: % Форматируем подписи к таблицам, благодаря пакету caption
04: \DeclareCaptionLabelFormat{rightline}{\rightline{\bothIfFirst{#1}{ }#2}}
05: % метка Table справа, затем новая строка, метка наклонным, сама подпись жирным малым шрифтом
06: \captionsetup[table]{labelformat=rightline,labelsep=newline,%
07: labelfont={md,sl},textfont={bf,small}}
08: % Подпись размещаем вверху от таблицы
09: \floatsetup[table]{style=Plaintop}
10: %-------------------------------------------------
11: % Создаём новый тип float: photo
12: % Команда \DeclareNewFloatType{тип}{опции} из пакета floatrow
13: \DeclareNewFloatType{photo}{name={Photo},placement=tbp}
14: % Определяем аналог \ffigbox для photo
15: % с помощью \newfloatcommand{команда}{тип}[преамбула][ширина]
16: \newfloatcommand{photobox}{photo}%
17: [{\capbeside
18: \thisfloatsetup{capbesideposition={right,bottom},% подпись справа внизу
19: capbesidewidth=3cm}% ширина подписи 3см
20: }]%
21: [\FBwidth]
22: % форматируем подпись с помощью пакета caption
23: \captionsetup[photo]{labelformat=rightline,labelsep=newline,%
24: labelfont={md,sl},textfont={bf,small}}%
25: %--------------------------------------------------
26: % для обычного "Figure"
27: \floatsetup[figure]{capposition=bottom}
28: \captionsetup[figure]{labelfont={md,sl},textfont={bf,small}}%
29: %---------------------------------------------------
30: ...
31: \begin{table}[!h]\CenterFloatBoxes
32: \begin{floatrow}
33: \ttabbox[\FBwidth]{\caption{My Caption left}\label{tab:1}}%
34: {\begin{tabular}{c|c}
35: ...
36: \end{tabular}
37: }
38: %
39: \killfloatstyle
40: %
41: \photobox{\caption{Here goes a photo}\label{ph:1}}{\includegraphics{...}}
42: \end{floatrow}
43: \end{table}
44:
45: See Table~\ref{tab:1} and Photo~\ref{ph:1}. Also a ``normal'' Figure~\ref{fig:1}.
46:
47: \begin{figure}[!h]
48: \ffigbox{\caption{Graph of a function}\label{fig:1}}{\includegraphics{...}}
49: \end{figure}

Подведение итогов

Пакет floatrow позволяет не только автоматизировать процесс расположения подписи (сверху, снизу, сбоку от картинки), но и предоставляет мощные средства для контроля над расположением объектов в ряд. Предоставляемый им интерфейс облегчает форматирование визуального материала и позволяет добиться желаемого результата без больших затрат времени и сложных комбинаций с minipages.

Все примеры из данного поста могут быть найдены здесь и здесь в виде tex-файлов готовых к компиляции.
Документация к пакету floatrow доступна на русском и английском языках.

Image
Monday, June 10th, 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.
12:16 pm
ЛаТеХ для продвинутых. Floatrow - расположение иллюстрации и подписи

Одним из самых часто задаваемых вопросов о LaTeX является вопрос о вставке картинок. Рисунки чаще всего помещаются в так называемые плавающие объекты (floats). То, как ЛаТеХ размещает эти объекты, уже обсуждалось в одном из предыдущих постов из серии "ЛаТеХ для продвинутых". Теперь же стоит уделить внимание содержанию плавающего объекта: расположению картинок и подписей к ним внутри объекта float.

Одним из самых продвинутых средств в этой области является пакет floatrow. Он предоставляет удобный интерфейс для

  • изменения взаимного расположения подписи и рисунка или таблицы (подпись сверху, снизу, сбоку) без "ручного" перемещения команды \caption{};
  • выравнивания картинки/таблицы и подписи по горизонтали (влево, вправо, центрированно) и контроля полей;
  • расположения нескольких плавающих объектов в ряд и их взаимного выравнивания по вертикали;
  • дополнительных элементов оформления, таких как линий, рамок и теней, отделяющих объект от основного текста или картинку от подписи, и т.д., и т.п.

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

Все примеры из поста могут быть найдены здесь и здесь в виде tex-файлов готовых к компиляции. Документация к пакету floatrow доступна на русском и английском языках.

Для нетерпеливых

После загрузки пакета

01:  \usepackage{floatrow}
настройка параметров плавающих объектов осуществляется командой
01:  \floatsetup[тип флоат]{параметр=значение,параметр=значение,...}
где тип флоат может быть, например, figure или table.

Наиболее интересные параметры, значение которых рассмотренно подробнее далее в тексте, приведены в таблице ниже
Параметр Значения, примеры Пояснения
capposition top, bottom, beside, TOP. Напр., capposition=top Положение подписи сверху, снизу, либо сбоку от картинки/таблицы.
capbesideposition {right/left/inside/outside, top/bottom/center}. Напр., capbesideposition= {right,bottom} Если подпись сбоку, её положение относительно картинки/таблицы.
capbesidewidth 10cm, 0.3\textwidth, sidefil. Напр., capbesidewidth= 0.5\textwidth Если подпись сбоку, её ширина
floatwidth 10cm, 0.3\textwidth. Напр., floatwidth= 0.5\textwidth Ширина, отводящаяся на весь флоат. Если подпись сбоку, ширина картинки.
margins raggedright, raggedleft, centering. Напр., margins= raggedright Положение ("выключка") всего плав. объекта по горизонтали на странице (см. рис.).
justification raggedright, raggedleft, centering. Напр., justification= raggedright Положение картинки внутри плав. объекта по горизонтали (см. рис.).

Подпись сверху, подпись снизу

Подпись к рисунку, схеме или таблице можно располагать сверху, снизу или сбоку от самого объекта. Традиционно, подписи к таблицам располагают над ними, тогда как рисунки подписывают снизу. Конечно, этого можно добиться переставляя команду \caption{} соответствующим образом вручную. Однако в мире ЛаТеХа действия "руками" являются моветоном, и поэтому floatrow полностью автоматизирует процесс с помощью команды \floatsetup{}. Например, вот такой код в преамбуле

01:  % загружаем пакеты
02: \usepackage{floatrow}
03: \usepackage{graphicx,wrapfigure}
04: % настраиваем положение подписей
05: \floatsetup[table]{capposition=top}
06: \floatsetup[wrapfigure]{capposition=bottom}
07: \floatsetup[figure]{capposition=beside,%
08: capbesideposition={right,bottom},%
09: capbesidewidth=0.3\textwidth,%
10: capbesidesep=quad% разделитель между картинкой и подписью
11: }
позволит автоматически перенести подписи ко всем таблицам наверх, все wrapfigure останутся подписанными снизу, а обычные figure плавающие объекты будут подписаны сбоку.
Уделим немного внимания команде \floatsetup[]{}. Она принимает два аргумента. Первый, необязательный, задаёт тип плавающего объекта. Если он не указан, то опции, следующие во втором (обязательном) аргументе будут применены ко всем типам floats в документе.

В данном случае мы использовали опцию capposition, которая может принимать значения top, bottom, TOP и beside. Первые два варианта приводят к очевидному эффекту. Параметр TOP имеет смысл только когда несколько объектов расположены в ряд и поэтому мы сейчас не будем останавливатся на нём в подробностях. Параметру beside стоит уделить чуть болeе внимания.

В комбинации с capbesideposition он позволяет разместить подпись слева capbesideposition={left,..} или справа capbesideposition={right,..} от рисунка. В случае двусторонней печати, можно использовать inside и outside: тогда подпись будет расположена, соответственно, на стороне "корочки" переплёта или на внешней стороне страницы. Помимо этого, capbesideposition контролирует и вертикальное положение подписи относительно рисунка. Надо лишь указать top, bottom или center. Например,

01:  \floatsetup[figure]{capposition=beside,%
02: capbesideposition={right,bottom}%
03: }
поместит подпись сбоку справа внизу.

Параметры capbesidewidth и capbesidesep контролируют ширину и отступ от рисунка. Ширину можно указывать в абсолютных величинах (например, 5cm), в долях от какой-либо длины (например, 0.3\textwidth), либо с помощью специального параметра sidefil, который выделит под подпись всю оставшуюся часть ширины страницы. Например,

01:  \floatsetup[figure]{capposition=beside,%
02: floatwidth=0.6\textwidth,%
03: capbesidewidth=sidefil%
04: }
выделит на картинку 60% страницы, а всё остальное отдаст под подпись. Заметьте, что здесь был использован ещё один параметр floatwidth. Обычно этот параметр задаёт ширину отводящуюся под весь флоат. Однако, если подпись находится сбоку, то floatwidth задаёт ширину отведённую под непосредственно саму картинку, вставленную, например, посредством \includegraphics{}.

Опции необязательно задавать глобально. Если использовать \thisfloatsetup{} вместо \floatsetup{}, то параметры будут применены только к одному плавающему объекту, который первым следует за этой командой.

Пропуски, поля и выравнивание

Всемогущая команда \floatsetup{} позволяет настроить расстояние между картинкой и подписью и в случае, если подпись находится сверху или снизу. Делается это с помощью ключа captionskip=<длина>.

01:  \floatsetup[figure]{capposition=bottom,%
02: captionskip=5ex,%
03: floatwidth=0.5\textwidth,%
04: margins=raggedright% see page 43 of docs
05: }
Кроме того, в примере задана ширина floatwidthвсего float равной половине ширины текста и заказано разместить весь float слева: margins=raggedright (напомним, что по умолчанию и без floatrow, ЛаТеХ выравнивает плавающий объект по центру горизонтали).
Параметр margins принимает также значения centering (по умолчанию), raggedleft и др.

Если параметр margins регулирует, по сути, горизонтальное выравнивание всего float (картинка плюс подпись), то выравнивание по горизонтали картинки в пределах плавающего объекта контролируется с помощью justification. Обратите внимание, что если используется пакет floatrow, то не нужно явно задавать горизонтальное выравнивание картинки (\centering сразу после \begin{figure}) поскольку по умолчанию justification=centering. Другие значения, которые может принимать этот параметр, включают raggedright, raggedleft и justified. Первые два выравнивают картинку по левому и правому краю плавающего объекта, соответственно. justified для самой картинки просто означает, что она будет находиться слева. Однако, если внутри float есть текст (не относящийся к подписи!), то он будет набран, как параграф выравненный по всей ширине плавающего объекта. Например,

01:  \floatsetup[figure]{capposition=bottom,
02: floatwidth=0.6\textwidth,
03: margins=raggedright,
04: justification=raggedleft
05: }
приводит к такому результату

Все параметры схематически изображены на рисунке ниже.

Выравниваем подпись по ширине картинки

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

Сделать это можно с помощью команды \ffigbox{}{} для figure или \ttabbox{}{} для table. Здесь мы не будем обсуждать все возможности этой мощной команды, а приведём конкретный пример

01:  \begin{figure}
02: \ffigbox[\FBwidth]{\caption{...}\label{...}}%
03: { \includegraphics{...} }
04: \end{figure}
Трюк здесь состоит в том, что первый, необязательный, аргумент команды задаёт ширину плавающего объекта, а значит и подписи. Пакет floatrow определяет длину \FBwidth, которая равна ширине текущего объекта.

Для таблиц, просто заменяем \ffigbox на \ttabbox. Во всей своей мощи и красе \ffigbox и \FBwidthпредстают при расположении плавающих объектов в ряд. Но об этом в следующий раз.

Стили

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

01:  \floatsetup[тип флоат]{style=стиль}
Мы не будем здесь рассматривать создание собственных стилей , а лишь заметим, что floatrowпредоставляет набор стилей, некоторые из которых вполне могут буть использованы в реальных документах.

plain plaintop
boxed BOXED
ruled Полный список предопределённых стилей можно найти в документации на странице 31.

Стили можно комбинировать с другими командами, например

01:  \floatsetup[тип флоат]%
02: {style=ruled,floatwidth=0.6\textwidth,...}

Заключение

Итак, пакет floatrow позволяет легко и непринуждённо управлять расположением различных частей плавающего объекта: например, картинки (таблицы) и подписи.

Осуществляется это посредством команд \floatsetup (для глобальных установок или установок в пределах блока) и \thisfloatsetup (только для первого следующего объекта):

01:  \floatsetup[тип флоат]{параметр=значение,...}
где тип флоат может быть, например, figure, table, wrapfigure, и т.п. Список наиболее интересных параметров можно найти в таблице приведённой выше.

Основным достоинством floatrow по сравнению с "ручными" способами, вроде использования minipages, является гибкий интерфейс, позволяющий одной командой \floatsetup настроить параметры всех плавающих объектов в документе.

Во всей своей красе floatrow проявляет себя при расположении плавающих объектов в ряд. Но об этом в следующий раз.

Все примеры из данного поста могут быть найдены здесь и здесь в виде tex-файлов готовых к компиляции.

Документация к пакету floatrow доступна на русском и английском языках.

Image
Monday, May 27th, 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.
3:35 am
Sleep as Android - умный будильник для Android со статистикой и фазами сна

Некоторое время назад был пост про наручные часы с гуманным будильником по имени Sleeptracker. Принцип их работы основан на попытке увязать показания акселерометра и фаз сна. Всё отлично, кроме высокой цены (около 100$) и необходимости надевать их каждую ночь.

Современные смартфоны напичканы всеми вообразимыми датчиками, включая акселерометры, так что кому-то должна была постучаться в голову светлая мысль реализовать умный будильник для Android на смартфоне, благо смартфоны есть у многих и на этом можно срубить пиастров. Так и поступил товарищ Petr Nálevka, который вместе с Martin Šťava написали приложение Sleep as Android.



Приложение платное и стоит безумные (по меркам пользователей Android) деньжищи - почти целых 3 доллара. Автор этих строк, придушив жабу и выложив кровные, делится впечатлениями и сравнивает Sleep as Android со Sleeptracker.

Принцип работы умных будильников

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


То есть фаза глубокого сна (REM) в самом деле неплохо описывается акселерометром (изображение взято со страницы 11, Figure 2-7, Principles and practice of sleep medicine, 5th edition, Chapter 2 - Normal Human Sleep : An Overview).

Хотя Sleep as Android не может (да и не преследует такой цели) тягаться с клиническими исследованиями, разработчики Sleep as Android выкатили страницу с пояснениями того, как приложение работает. Чем больше пользователь дрыгается ночью, тем больше амплитуда, выдаваемая акселерометром смартфона. Авторы утверждают, что акселерометры смартфонов не сильно хуже таковых на медицинских приборах:
Moreover, during development of Sleep as Android the accuracy of the mobile phone sensors has been tested and compared with satisfactory results to special accelerometers used in medical applications (especially in psychiatry).
Вообще, в процессе написания поста автор набрёл на весьма занятную книгу:
Principles and Practice of Sleep Medicine: Expert Consult - Online and Print, 5e (PRINCIPLES & PRACTICE OF SLEEP MEDICINE. [Amazon]
Главы этой книги можно скачать бесплатно, что довольно удивительно для научного справочника. Можно полистать и найти немало интересного в Chapter 2 – Normal Human Sleep : An Overview и в главе Chapter 141 – Monitoring and Staging Human Sleep, откуда автор этих строк надёргал немного текста и картинок.

Засовываем и напяливаем

Так как мы не собираемся проводить научных исследований на себе, то достаточно включить режим отслеживания сна в приложении и положить смартфон рядом с собой, а ещё лучше - под подушку. На подушках обычно есть наволочки, и чтобы не скинуть на пол во сне свой драгоценный смартфон, засовываем его под подушку, напяливаем сверху наволочку и жмём "Ключ на старт" Sleep Tracking.


Умный будильник Sleep as Android в действии

Спят усталые игрушки,
Книжки спят,
Одеяла и подушки
Ждут ребят,
Даже сказка спать ложится,
Чтобы ночью нам присниться,
Глазки закрывай,
Баю - бай... (C) 

Интерфейс Sleep as Android написан гуманоидами, поэтому сравнительно прост в освоении. Для работы нужно выставить время для будильника и не  забываем его активировать:



Это всё - далее нажимаем на кнопку Sleep tracking, кладём смартфон под подушку и ложимся спать.
Здесь стоит отметить несколько важных моментов:
  1. работа акселерометра при выключенном экране поддерживается не всеми смартфонами, но стоит один раз попробовать - скорее всего, работать будет. Все три смартфона, которыми я когда-либо пользовался (HTC Desire HD, HTC Wildfire S, и THL W5) работают с выключенным экраном и Sleep as Android без проблем.
  2. Sleep as Android предложит включить Airplane Mode (выключение всех средств связи) - это очень и очень правильно, и это стоит поставить по умолчанию. Во-первых, вас никто не разбудит среди ночи телефоном, а во-вторых, это экономит батарею.
Последние версии Sleep as Android очень экономно расходуют батарейку: за всю ночь может потратить не более 10-15% от 2000 мАч. Так что даже если батарейка заряжена только наполовину - её должно хватить.

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



Что нам дают эти графики? Эти графики нам дают статистику сна, и вот она-то как раз очень важна.


Статистика сна в Sleep as Android

Statistics are like miniskirts - they give you good 
ideas but hide the important things.
— Ebbe Skovdahl



Что бы там не говорили, а статистика, выполненная с умом и без желания наврать, рассказывает много интересного тому, кто понимает, что делает. Так и в в "умном будильнике": вкладка Stats покажет выжимку данных о сне за последнее время. Самым важным параметром, конечно, является время (и процент) глубокого сна.

Все данные хранятся в каталоге /sdcard/sleep-data во внутренней памяти смартфона (файл sleep-export.csv). При желании можно выдрать статистические данные оттуда самостоятельно.


Внизу вкладки Stats находится Detailed statistics, которая поведает нам немало интересного (изображение слева, кликабельно). Можно увидеть процент глубокого сна (данные и среднее значение), рейтинг сна (который выставляете вы сами) и время, когда будильник прозвенел ещё до выставленного времени.

Можно изменить временной интервал - за неделю, две недели, месяц, полгода или год.

Но куда больше полезного можно выжать с помощью плагина SleepStats (платный, стоит 1.5 долларов).


Помимо Trend  и Sleep rating, можно посмотреть на статистику сна и Pattern (то есть на модель сна). Pattern (скриншот в центре) особенно интересен, так как содержит много полезных данных на одном рисунке. Время отхода ко сну и просыпания можно видеть одновременно с диаграммами глубокого и лёгкого сна (показа синим и зелёным цветом соответственно).



Так же плагин SleepStats содержит весьма навороченный статистический анализ данных, на основе которых предлагается оптимальная длительность сна и время отхода ко сну:

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

Вообще, плагин SleepStats определённо стоит своих денег, выдавая много ценной информации для улучшения сна. Что, кстати, видно на динамике увеличения продуктивности по данным Pomodoro.

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


Sleep Cloud Backup

Sometimes your cloud rains and there is 
nothing you can do about it (c) Anonymous

Конечно, cloud это не бекап, и тем не менее очень удобно (на время, по крайней мере) хранить свои не очень важные данные в Dropbox. И плагин SleepCloudBackup (платный - стоит 1.3 доллара) как раз сохраняет данные о вашей статистике сна в Dropbox. Всё, что для этого нужно - привязать свой Dropbox аккаунт к плагину SleepCloudBackup.

После этого на вкладке Graphs появится слева от настроек иконка типа "Recycle" - это и есть вызов плагина SleepCloudBackup для бекапов в Dropbox. Он же может загружать и восстанавливать данные о сне, если вдруг что-то случилось с памятью смартфона.


Конкуренты Sleep as Android

Такое место пусто не бывает: умный будильник Sleep as Android имеет множество конкурентов, хотя они менее навороченные. Перечислю наиболее выдающиеся из них:
  • SleepBot - Sleep Cycle Alarm [бесплатный] - пожалуй, самая близка по возможностям замена Sleep as Android для тех, что не хочет выкладывать свои кровные за свистульки, бубенчики и навороченную статистику. Выдаёт почти те же данные, что и Sleep as Android (по крайней мере на смартфоне автора этих строк), намекая на схожесть алгоритмов. 
  •  Sleepmeter [платный, 3.99] - приложение из серии "батарейки включены", то есть статистика сна входит в программу, а не является плагином. Интерфейс Sleepmeter несколько странен и не всегда логичен.
  • Sleep Time - Alarm Clock [бесплатный] - сравнительно богатая возможностями программа для отслеживания фаз сна, с гуманоидным интерфейсом и всеми необходимыми статистическими мигалками.
Есть и другие приложения для отслеживания фаз сна на смартфонах с Android, но они либо появились недавно, либо работают менее надёжно.


Sleep as Android vs Sleeptracker

Они используют один и тот же принцип, так выдают ожидаемо похожие данные. Временное окно для умного будильника Sleep as Android (30 минут) я взял из данных Sleeptracker. Сравнение длительности сна и Fall Asleep time похожи на обоих устройствах, так что теперь использую смартфон вместо Sleeptracker. Кроме того, ранним утром выползать из-под одеяла всё равно не хочется, а на смартфоне можно ещё проверить почту.

Заключение

При всей своей простоте, смартфоны с акселерометром и программами для отслеживания сна помогают лучше спать и просыпаться бодрее и свежее. Но самое главное - это возможность узнать намного больше о своём сне, не прибегая к медицинскому обследованию. Так что теперь ваш смартфон может заменить ещё и будильник!
Image
Sunday, May 5th, 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:02 pm
ЛаТеХ для продвинутых. Как подружить LaTeX и Inkscape.

(La)TeX является одной из наиболее продвинутых систем обработки текста. Тексты созданные в ЛаТеХе, обычно естественно-научной направленности, легко узнать не только по красивым формулам, но и по исключительно сбалансированному тексту.

В тоже время, графики и рисунки, обычно созданные в "посторонней" программе и импортированные в ЛаТеХ, зачастую изрядно портят внешний вид документа. Хотя их расположением занимается ЛаТеХ (см. пост о плавающих объектах), сам внешний вид рисунков полностью на совести пользователя.

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

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

Импорт рисунков Inkscape в LaTeX

Основная идея и простой пример

Inkscape создаёт рисунки в формате svg. Наша задача: "красиво" вставить их в ЛаТеХ-документ. Итак, по порядку:

  1. Рисуем рисунок :) Лучше всего задать размер страницы равным желаемому размеру иллюстрации в ЛаТеХе. Все надписи выполняем, как если бы мы это делали в ЛаТеХе. Т.е. пишем, например, $\vec{F}$, если хотим получить F с вектором-стрелочкой сверху. Размер и тип шрифта роли не играет: в результате получится шрифт как в документе (хотя можно указать размер посредством \large и т.п. команд). Цвет и "поворот" текста, напротив, будут приняты во внимание. Уделяем особое внимание горизонтальному выравниванию текста (влево, вправо, по центру), иначе он "переедет" в ЛаТеХе.
  2. Сохраняем в PDF формате: через пункт меню "Сохранить как..."/"Save as...". В появившемся окошке ставим галочку напротив "PDF+LaTeX: опустить текст в ПДФ и создать ЛаТеХ файл"/"PDF+LaTeX: Omit text in PDF, and create LaTeX file".
    Будут созданы два файла: "имя.pdf" с рисунком и "имя.pdf_tex" со всеми надписями (ниже полагаем имя=drawing).
  3. В ЛаТеХ-файл вставляем вот так:

    01: % преамбула
    02: \usepackage{graphicx,xcolor}
    03: ...
    04: % тело документа
    05: \begin{figure}\centering
    06: %\def\svgwidth{5cm} % если надо изменить размер
    07: \input{drawing.pdf_tex}
    08: \caption{...}\label{...}
    09: \end{figure}
    Если необходимо изменить размер, то нужно переопределить параметр \svgwidth. Здесь также предполагается, что все файлы были сохранены в текущей директории.
  4. Компилируем: pdflatex имя-tex-файла. ЛаТеХ сначала вставит pdf-картинку из drawing.pdf, а затем наложит на неё текст из drawing.pdf_tex.
Результат:

Оптимизация процесса

У описанного выше процесса есть два больших недостатка. Во-первых, каждый раз, когда что-то изменено в Inkscape, надо заново сохранять файл как PDF+LaTeX, тыкая мышкой в разные пункты меню. Кроме того, включение файла срабатывает только, если файлы картинок находятся в текущей директории. От обоих недостатков можно легко избавиться, используя следующий код в ЛаТеХ-файле:


01: ...
02: %----------------------------------
03: % Вставляем это в преамбулу документа
04: \graphicspath{{figs/}} % путь, где искать картинки
05: % следующий код взят из
06: % http://mirrors.ctan.org/info/svg-inkscape/InkscapePDFLaTeX.pdf
07: \newcommand{\executeiffilenewer}[3]{%
08: \ifnum\pdfstrcmp{\pdffilemoddate{#1}}%
09: {\pdffilemoddate{#2}} > 0 {\immediate\write18{#3}}\fi}
10: \newcommand{\includesvg}[1]{%
11: \executeiffilenewer{#1.svg}{#1.pdf}%
12: {inkscape -z -D --file=#1.svg %
13: --export-pdf=#1.pdf --export-latex}%
14: \input{#1.pdf_tex}%
15: }
16: %-----------------------------------
17: ...
18: \begin{document}
19: ...
20: % Inkscape figure
21: \begin{figure}\centering
22: %\def\svgwidth{5cm} % используем для изменения размера, если надо
23: \includesvg{figs/drawing}
24: \caption{Example Inkscape: include svg.}
25: \end{figure}
26: ...
27: \end{document}
Здесь для начала указано, что \includegraphics должен искать картинки в поддиректории figs. Затем определены две новые команды.

Первая \executeiffilenewer{файл1}{фаил2}{команда1} выполняет команду команда1, если файл1 новее, чем файл2.

Вторая \includesvg{} сначала, если нужно, конвертирует svg файл в пару PDF+LaTeX, а затем вставляет получившуюся картинку. Конвертирование происходит посредством вызова Inkscape "из командной строки". Параметр -z означает "without-gui", а -D говорит Инкскейпу, что нужно экспортировать всю картинку. Предполагается, что команда inkscape находится в "путях к исполняемым файлам" (переменная $PATH в Юниксах или %path% в нетрадиционных операционных системах). Проверить так ли это можно открыв терминал ("коммандную строку"), набрав там inkscape и нажав ENTER. Если ничего не запустилось, значит надо в 12-й строке прописать полный путь к исполняемому файлу, что-то вроде "c:/Programms/Inkscape/inskcape" или "/usr/bin/inkscape", в зависимости от операционной системы.

Для компиляции используем pdflatex -shell-escape имя-tex-файла. Ключик -shell-escape разрешает ЛаТеХу запускать сторонние программы: в нашем случае, Инкскейп для конвертации svg в pdf+tex.

Возможности и ограничения

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

Связка MATLAB - Inkscape - LaTeX

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

Однако, если график построен в MATLAB, то лучше его сохранить напрямую в svg-формате, вместо промежуточного (для наших целей) eps. Сделать это очень просто с помощью функции plot2svg, которую можно скачать с MATLAB Central. На всякий случай, файл plot2svg.m включён также в архив с примерами из этого поста.

Строим график, а затем сохраняем его как, например,
plot2svg('figs/example_matlab.svg')
После этого "график" можно открыть в Инкскейп и внести изменения.

Экспорт/импорт в ЛаТеХ осуществляется в точности как уже было описано выше. Результат:

ЛаТеХ в Инкскейпе

Итак, прямая задача — экспорт рисунков из Инкскейпа в ЛаТеХ — решена. Но иногда приходится решать и обратную задачу: вставлять формулы из ЛаТеХа в Инкскейп. Сделать это можно двумя способами.

Способ первый: Render LaTeX Formula

Стандартное расширение Инкскейпа (из базовой поставки) позволяет легко и просто вставить формулу. Идём в пункт меню Extensions, выбираем Render, а потом LaTeX Formula.

Если нужно, можно также подгрузить дополнительные пакеты, как, например, kpfonts в примере выше. В результате получаем суперкрасивую... нарисованную формулу. Да-да, не "написанную буквами", а "нарисованную линиями".

Если в вашем Инкскейпе отсутствует пункт меню "LaTeX Formula", то попытайтесь найти файл extension-errors.log и посмотреть, что именно произошло. Например, в Windows велики шансы, что Инкскейп не смог найти програмку pstoedit, необходимую для функционирования "LaTeX Formula": если дело действительно в этом, то установите pstoedit и добавьте его в путь %path%.

Способ второй: Tex Text

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

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

Итак, экспортировать рисунки из Инкскейпа совсем несложно. Процесс легко автоматизировать с помощью простого ЛаТеХ-скрипта, автоматически конвертирующего svg-рисунок в связку PDF (картинка) и ТеХ (текст), которые вставляются в ЛаТеХ-документ один поверх другого. Достоинством этого метода является весьма неплохо выглядящий результат (рисунок с ТеХ шрифтом, формулами, ссылками) при минимальных затратах времени.

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

Справедливости ради, стоит отметить, что весьма неплохих результатов можно также добиться с помощью inkscape2tikz. Но это уже совсем другая история...

Все примеры из данного поста доступны для скачивания по адресу tinyurl.com/amorua-inkscape.

Зеркала на случай сбоя: зеркало1зеркало2

Image
Sunday, April 21st, 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.
10:32 pm
Zim - настольная вики, структуризатор и каталогизатор в одном флаконе: zim wiki outliner
Согласно заветам Ильича, коммунизм есть советская власть плюс электрификация всей страны. Так и Zim, в духе духа духовных предков, представляет собой каталогизатор (outliner) плюс возможность пользовать вики-разметку. Простой и незатейливый, но полезный в хозяйстве, Zim поможет простым колхозникам быстро разгрести ворох заметок, файлов и набросков и превратить в организованную структуру, расфасованную по каталогам.


Кто такой Zim и что умеет?

Ни майнтейнеры Debian, ни сам автор Zim, похоже, не вполне могут описать, что же такое Zim. Нет, это не вики в чистом виде - вернее, не MediaWiki, которую ожидаешь увидеть при слове Wiki. И не текстовый редактор, как пишется в пакете Debian:
zim - graphical text editor based on wiki technologies
Это не редактор, а скорее outliner, то есть структуризатор и каталогизатор информации - что-то вроде Notecase. То есть каталогизатор с вики-разметкой и простеньким редактором текста.
Вопреки ожиданиям многих, поддержки Markdown в Zim как не было, так и нет - всё, что можно сделать, это экспортировать заметки в Markdown.

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

Установка Zim в Debian

проста и незатейлива - пакет есть в репозитории Debian, и всё легко:
apt-get install zim
отнимет всего пару мегабайт. Несмотря на то, что на сайте есть пакет только для убунты, в Debian он отлично ставится и работает. Можно скачать отсюда и установить (или обновить) через
# dpkg -i zim_0.59_all.deb
и если у вас установлены необходимые зависимости (указано для версий до 0.59):
  • gtk+ >= 2.6
  • python >= 2.5
  • python-gtk
  • python-gobject
  • python-simplejson (for python < 2.6)
  • python-xdg (optional, but recommended)
  • xdg-utils (optional, but recommended)
всё должно пройти легко и просто.

Первый запуск Zim

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

Правая кнопка мыши в Zim - наш друг и союзник, с её помощью можно создавать новые страницы и подстраницы.

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

Если начать строку со звёздочки "*", то она будет преобразована в список. Чтобы выйти из режима маркированного списка, просто нажмите Enter дважды.

Начните строку со "[]" (две квадратные скобки, затем пробел) и скобки будут преобразованы в пустые флажки для ToDo-списка.
Ну и естественно можно выделять текст полужирным, курсивом и цветом.

Имеет место быть отличный полнотекстовый поиск как по заметке, так и по всему блокноту, и на не слишком больших блокнотах работает замечательно:
Возможно, на больших блокнотах Zim будет искать медленнее, чем специализированная база данных, но для персональных заметок вполне сойдёт.

Структурирование информации в Zim: каталоги и подкаталоги из заметок

Каждая заметка (страница) хранится в своём отдельном plain-text файле с расширением .txt, а каталог с тем же именем - для вложений (рисунки, PDF-файлы и всё прочее). Если страница содержит подстраницу (Subpage), то в каталоге для вложений появятся ещё файлы .txt - это дочерние заметки. Это весьма удобно, так как позволяет синхронизировать данные с Dropbox и смартфонами.

Поэтому базу заметок Zim можно открыть обычным текстовым редактором и файл-менеджером. Собственно, вот как выглядит структура каталогов:
мой блокнот называется Reference, и можно видеть структуру каталогов и файлов, которую создал Zim (ну и автор этих строк, конечно).

Вставка иллюстраций и вложений

Картинки можно вставлять в текст заметок - картинки вставляются и отображаются прямо на странице, а сама картинка попадает во вложения (у каждой замети "Заметка.txt" есть каталог рядом "Заметка" - для вложений).
Самое замечательное в Zim это отображение рисунков и разметки вместе с вложениями (attachments), и всё это можно просматривать не только в Zim, но и в окне вашего любимого броузера.

Для этого заходим в меню Tools -> Start Web Server, далее запускается вебсервер на порту 8080 и можно запускать броузер для просмотра:
Замечательно, что (во всяком случае Chrome) есть возможность просматривать ещё и вложения, в частности - PDF-файлы. Я использую эту возможность для чтения статей:
В версии 0.57 удалять вложения можно только вместе со страницей (заметкой), но будем надеяться, что возможность убрать вложения в Zim появится(никто, впрочем, не мешает сделать это вручную из файлового менеджера).

Плагины в Zim

Вот где настоящий клондайк! Большое количество полезных плагинов поставляются вместе с Zim, так что можно порыться в списке плагинов и найти немало интересного, вызвав меню Edit -> Preferences -> Plugins:

Из наиболее полезных (для версий 0.5х) мы имеем:
  • Distraction Free Editing: - при включении этого плагина можно использовать клавишу F11 для полноэкранного редактирования заметок
  • Insert Screenshot: при редактировании заметки можно выбрать в
    меню Insert -> Screenshot и в заметку сразу же вставится снимок экрана (для этого требуется scrot, который есть в репозиториях Debian). 
  • Journal: добавляет календарь к блокноту и позволяет создавать страницы, просто нажав на дату в календаре.
  • Quick Note: выдаёт всплывающее окно "Quick Note", куда можно вставить текст или заметку, которую хочется сохранить.
  • Tags: позволяет использовать метки @tags, которые можно видеть на вкладке слева (там где Index).
  • Version Control: позволяет интегрировать Zim с Git, Mercurial и Bazaar системами управления версий. Вы можете откатить блокноты Zim на более раннюю версию, если нужно.

Поддержка систем управления версиями (Version Control Systems)

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

В моём случае используется Mercurial, и Zim при добавлении или перемещении справочной информации, хранимой в виде заметок Zim, добавляет или удаляет соответствующие файлы, которые потом коммитятся вместе с другими изменениями. Занятно, но похоже, что Zim (0.5x по крайней мере) не добавляет attachments в систему управления версиями, только страницы.
Тем не менее, полезно сохранять ревизии блокнотов прямо из Zim - для этого выбираем пункт Save version из меню File, и последние изменения будут сразу же добавлены в систему управления версиями.

Ссылки и информация к размышлению

Официальный сайт Zim с кучей скриншотов, годный туториал на английском в двух частях, и ещё один пост о десктопном применении Zim. Есть так же плагин-клиппер для Firefox.
Аналогом Zim можно считать Outwiker и Notecase.
Image
Sunday, April 7th, 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:45 pm
ЛаТеХ для продвинутых. Как подружить LaTeX и MATLAB: вставка рисунков из MATLAB в документы LaTeX

В документе всё должно быть прекрасно — и текст, и картинки

Благодаря ЛаТеХу научные работники (и не только) получили возможность создавать красивые, уравновешенные документы с чётко просматривающейся структурой. Однако "сфера влияния" ЛаТеХа распространяется только на текст и формулы, а внешний вид графиков и иллюстраций находится полностью на совести автора. И вот здесь-то и начинаются полные разброд и шатания: на некоторые рисунки трудно смотреть без слёз :)

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

Постановка задачи

Что отличает рисунок гармонично вписывающийся в основной текст от рисунка плохого? Безусловно, содержание, размер и расположение являются важными эстетическими параметрами. Однако наиболее бросающимся в глаза диссонансом, свойственным львиной доле естественно-научных рисунков, являются шрифты. Да-да, именно шрифты... Речь идёт о подписях к осям графиков, о легендах и т.п. Порой создается ощущение, что у автора серьёзные проблемы со зрением: скажем, рядом с текстом набранным Times 12pt вдруг оказывается график с подписями 16-ым шрифтом... Или, ещё лучше, нечитаемым 8-ым... А о соответствии типа шрифта (начертания) между рисунками и текстом и мечтать не приходится!

Итак, наша основная задача: графики, шрифт на которых совпадает по размеру и начертанию с основным шрифтом документа.

Все дороги, которые ведут в Рим

Достичь нашей цели можно разными путями. Наиболее общеизвестные из них, в порядке убывания ортодоксальности:

  1. Использовать LaTeX для построения графиков. На деле это означает либо использование pgfplots и tikz, либо pstricks.
  2. Использовать около-ЛаТеХные средства, хорошо взаимодействующие с ЛаТеХом. Например, MetaPost или Asymptote.
  3. Использование вашей любимой программы (например, Matlab, Mathematica, Gnuplot и т.д. в сочетании с тем или иным способом конвертации в "ЛаТеХ-код", скажем tikz. Более конкретно: например, matlab2tikz. Или tikz терминал для Gnuplot.
  4. И, наконец, использование вашей любимой программы, как и в предыдущем пункте, с сохранением картинки как eps или pdf и последующей "подменой текста", a la psfrag и т.п.

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

В этом посту мы рассмотрим алгоритм экспорта графиков из MATLAB в LaTeX.

Выбор Матлаба для построения графиков диктуется исключительно личными предпочтениями автора. Аналогичные методы применимы и к другим программам — об этом в самом конце.

Как ЛаТеХ с Матлабом подружить

Цель

Собственно: экспорт графиков из Матлаба в ЛаТеХ. При этом предполагается, что подписи и т.п. на графике должны сочетаться с основным текстом.

Желаемый результат изображен ниже. Специально выбран нестандартный фонт (Kepler-подобный из kpfonts вместо стандартного Computer Modern), чтобы подчернуть желаемый эффект.

Средства

Матлаб, версии новее 7.6 (release name 2008a). Кроме того, скрипт matlabfrag.m. Его можно скачать самостоятельно, но он (вернее его улучшенная версия) есть и в архиве с примерами из этого поста: tinyurl.com/amorua-matlabfrag. Поместите его в текущую директорию: туда где будут находиться ваши скрипты для построения графиков. Поместите туда же файлы myfigure.m и mylegend.m из того же архива с примерами.

ЛаТеХ. Нам понадобится пакет pstool, причём версия 2013/02/11 v1.5 или новее. В старых версиях пакета будет работать всё, кроме ссылок из картинок на основной документ, например, на уравнения или номера страниц. Файл pstool.sty нужной версии находится в архиве с примерами. Все примеры можно компилировать либо
pdflatex -shel-escape имя-файла
либо
latex -shell-escape имя-файла
dvips имя-файла
pstopdf имя-файла.ps

но предпочтение должно быть отдано первому варианту.

Если -schell-escape опция не работает, возможно в вашей версии ЛаТеХ она называется -enable-write18.

Строим график

Здесь всё почти как обычно:

01:  %% example 1
02:  close all ; clear all; clc;
03:  %% Интерпретатот текста, по умолчанию, latex
04:  set(0,'DefaultTextInterpreter', 'latex');
05:  %  Размер шрифта такой же как в ЛаТеХ-документе
06:  set(0,'DefaultAxesFontSize',12);
07:  set(0,'DefaultTextFontSize',12);
08:  
09:  %% Создаём картинку   
10:  fig=figure;
11:  %% Рисуем графики ...
12:  x=0:0.1:pi;
13:  y=sin(x); plot(x,y,'r'); hold on;
14:  z=cos(x); plot(x,z,'b');
15:  
16:  %% Подписи к осям
17:  xlabel('$t$, s'); ylabel('$l$, m');
18:  %% Легенда
19:  l=legend('$\sin x$','$\cos x$');
20:  
21:  %% Дополнительный текст на графике
22:  text(0.5,-0.5,'$\int\limits_0^{2\pi}\sin x\, dx = 0$');
23:  text(3,-0.5,'$\gamma = \frac{\alpha}{\zeta}$');
24:  
25:  %% Экспортируем график 
26:  matlabfrag('figs/example1','epspad',[10,10,10,10]);

Теперь по порядку:

  1. В строке 4, latex установлен как интерпретатор текста по умолчанию. Благодаря этому, в подписях к осям (строка 17), легенде (строка 19) и дополнительном тексте (строки 22, 23) мы можем спокойно использовать ЛаТеХ-комманды.
  2. Затем, надо проинформировать Матлаб о том, что весь текст мы хотим набирать 12-ым шрифтом (если используется используется "улучшенная" версия matlabfrag из архива с примерами, то устанавливать размер шрифта не надо — будет автоматически подхвачен текущий размер из ЛаТеХ-документа).
  3. После того как всё готово, в строке 26, использована функция matlabfrag() для сохранения графика. Она создаст два файла: figs/example1.eps и figs/example1.tex (предполагается, что в текущей директории вы создали поддиректорию figs/, куда мы будем складывать все картинки). Если посмотреть на их содержимое, то станет понятно, как это всё работает.
    Сама картинка находится в eps-файле, но вместо текста там "числа-заглушки", вроде 000, 001, 002 и т.д. В tex-файле же находится весь текст в виде, понятном ЛаТеХу.
    Теперь дело за ЛаТеХом.

Вставляем график в документ ЛаТеХ

Как видно из предыдущего рисунка, ЛаТеХ-текст будет вставлен с помощью команды \psfrag из одноимённого пакета. Однако, гораздо удобнее пользоваться им не напрямую, а через интерфейс, предоставляемый пакетом pstool. Делается это так: подключаем пакет pstool и вставляем картинку командой \psfragfig{}.

01:  \documentclass[12pt]{article}
02:  ...
03:  \usepackage{pstool} 
04:  ...
05:  \begin{document}
06:  ...
07:  \begin{figure}\centering
08:    % вставляем картинку: 
09:    % имя файла без расширения!!!
10:    \psfragfig{figs/example1}
11:    \caption{Example of a Matlab plot.}\label{fig:ex1}
12:  \end{figure}
13:  ...
14:  \end{document}

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

Кроме того, размер шрифта в самом первой строке установлен в 12pt, в соответствии с размером шрифта на рисунке в Матлабе.

Компилируем командой
pdflatex -shell-escape имя-тех-файла
Пакет pstool сделает за нас всю чёрную работу: он сам сконвертирует на лету связку файлов eps+tex в pdf картинку и вставит её: он прогонит автоматически каждую картинку через ЛаТеХ, dvips и pstopdf. Именно для этого и надо указать ключ -shell-escape при запуске pdflatex — он разрешает пакету запускать внешние программы.

Пакет pstool достаточно разумен: он смотрит на дату создания файлов картинок и "конвертирует" только изменившиеся со времени последнего запуска. Чтобы принудительно переконвертировать все картинки, надо указать опцию process=all, а именно

01:  ...
02:  \usepackage[process=all]{pstool} 
03:  ...
Результат наших усилий показан внизу. Как видите, на графике использованы Computer Modern шрифты ЛаТеХа, размер которых совпадает с размером, использованным в тексте (см. подпись к рисунку).

Тонкая настройка

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

Деталь нулевая

Деталь, к matlabfrag() прямого отношения не имеющая, но тем не менее... Наилучшего, с эстетической точки зрения, результата можно добиться, если вставлять в ЛаТеХ рисунки в том масштабе, в котором они были нарисованы. Т.е. рисовать их лучше сразу в нужном размере! Для этого создаём в Матлабе простенькую функцию

01:  function h=myfigure(width,height)
02:  % создаёт figure с заданной шириной и высотой в см
03:  
04:  if nargin<2 % если дана только ширина, использует золотое сечение для высоты
05:      height = width * 2/(1+sqrt(5)); % высота=ширина/золотое сечение
06:  end
07:  
08:  set(0,'units','centimeters')
09:  scrsz=get(0,'screensize'); % размер экрана в см
10:  % положение и размер картинки
11:  position=[scrsz(3)/2-width/2 scrsz(4)/2-height/2 width height];
12:  h=figure;
13:  set(h,'units','centimeters')
14:  % устанавливаем размер
15:  set(h,'position',position)
16:  % Set screen and figure units back to pixels
17:  set(0,'units','pixel')
18:  set(h,'units','pixel')
Если использовать myfigure(10,8), то размер картинки будет 10см на 8см. Если задать только первый аргумент myfigure(10), то функция сама посчитает высоту исходя из золотого сечения. Файл myfigure.m находится в архиве с примерами.

Деталь первая: UserData matlabfrag

В принципе, необязательно пользоваться интерпретатором latex в Матлабе. Функция matlabfrag() смотрит на свойство UserData и, если оно имеет вид matlabfrag:XXX, вставляет XXX в качестве ЛаТеХ-текста. Например, код ниже делает в точности то же самое, как и разобранный выше пример

01:  %% example 2
02:  close all ; clear all; clc;
03:  %% По умолчанию, интерпретатор текста tex, а не latex,
04:  %  т.е. set(0,'DefaultTextInterpreter', 'tex'); указывать не обязательно
05:  
06:  %% Создаём картинку   
07:  fig=myfigure(10);
08:  %% Рисуем графики ...
09:  x=0:0.1:pi;
10:  y=sin(x); plot(x,y,'r'); hold on;
11:  z=cos(x); plot(x,z,'b');
12:  
13:  %% Подписи к осям
14:  xlabel('t, s', 'UserData','matlabfrag:$t$, s'); 
15:  ylabel('l, m', 'UserData','matlabfrag:$l$, m');
16:  %% Легенда
17:  l=mylegend({'sin x';'cos x'},...
18:             {'$\sin x$';$\cos x$});
19:  
20:  %% Дополнительный текст на графике
21:  text(0.5,-0.5,'integral here',...
22:       'UserData','matlabfrag:$\displaystyle \int\limits_0^{2\pi}\sin x\,dx = 0$');
23:  
24:  text(3,-0.5,'\gamma = \alpha/\zeta',...
25:      'UserData','matlabfrag:$\displaystyle \gamma=\frac{\alpha}{\zeta}$'); 
Недостаток этого способа в том, что придётся набирать больше текста. Кроме того, картинка, как её покажет Матлаб, вообще говоря, будет отличаться от той, которую вы увидите в ЛаТеХе.

Зато такой способ гораздо более гибок. Он позволяет вставлять в текст подписей команды, определённые в ЛаТеХ документе, о которых Матлаб ничего не знает. Например:

01:  text(0.5,-0.5,'integral here',...
02:   'UserData','matlabfrag:\myint see eq.(\ref{eq:1})');
использует команду \myint, а кроме того, ссылается на уравнение из основного текста.

Обратите внимание на то, как добавляется UserData к легенде: здесь для облегчения процесса использована функция mylegend(легенда,латех_вариант). Она принимает два аргумента, оба cell array. Первый — легенды для Матлаба, второй — для ЛаТеХа.

01:  function l=mylegend(lgnds,usrdta_in)
02:  % функция для создания легенд с ЛаТеХ-вариантами
03:  % пример вызова: l=mylegend({'sin(x)';'cos(x)'},{'$\sin x$';'$\cos x$'})
04:  % возвращает указатель на легенду
05:    l=legend(lgnds);
06:  
07:    if nargin>1 % если переданы UserData
08:       usrdta=lgnds;
09:       for i=1:min(length(usrdta),length(usrdta_in))
10:      usrdta{i} = usrdta_in{i};
11:       end
12:      
13:       lchild=get(l,'children');
14:       i_max=length(usrdta);
15:    
16:       for i=1:i_max
17:           i_child=3*i_max-(i-1)*3 ;
18:           set(lchild(i_child),'Userdata',sprintf('matlabfrag:%s',usrdta{i}));
19:       end
20:    end
21:  end

Дело в том, как Матлаб хранит текстовое содержимое легенд: если легенды две, то их текст будет сохранен в 6-м и 3-м элементах "детей легенды". Если легенды три, то в 9-м, 6-м и 3-м. И так далее.

Файл mylegend.m может быть найдена в архиве с примерами.

Деталь вторая: текстовые эффекты

Функция matlabfrag() настолько сообразительна, что автоматически подхватит эффекты, такие как вращение текста, центрирование, цвет, размер и т.п. Например, такой код

01:  %% example 3
02:  %% Text effects
03:  text(2.5,-0.5,{'Rotated';'text'},'Rotation',90);
04:  
05:  text(0.5,-0.5,{'Colored';'centered';'italic';'text'},...
06:      'Color','r',...
07:      'HorizontalAlignment','center',...
08:      'FontAngle','italic');
09:  
10:  text(1,-0.5,{'Big Text:';'16pt'},'FontSize',16)
даст эффект, очевидный из картинки ниже.

Обратите внимание, что для набора текста в несколько строк использованны cell arrays, вроде {'строка один';'строка два'}. Этот трюк работает не только для функции text(), но и для, например, подписей на осях:

01:  xlabel({'$t$, s'; 'time to goal'}); 
02:  ylabel({'$l$, m'; 'distance to goal'});

Деталь третья: поддержка русского языка

С русским тоже никаких проблем: просто, набираем подписи и текст на русском. Только не забываем в ЛаТеХ-документ вставить в преамбулу

01:  \usepackage[utf8]{inputenc}
02:  \usepackage[T2A]{fontenc}
03:  \usepackage[russian]{babel}

Результат:

Деталь четвертая: подписи к меткам на осях

Иногда хочется заполучить у меток на осях не числа типа 3.14, а что-то посимпатичнее, вроде числа "пи". Делается это просто:

01:  %% example 4
02:  ...
03:  %% подписи у меток, aka tick marks
04:  set(gca,'XLim',[0 pi],'XTick',[0 pi/2 pi],...
05:       'XTickLabel',{'$0$','$\pi/2$','$\pi$'});

Всё остальное — как прежде. Результат:

Деталь пятая: необязательные аргументы matlabfrag()

Функция matlabfrag(), помимо обязательного имени файла, принимает ещё несколько опций: handle, epspad, renderer и dpi. Например,

01:  matlabfrag('figs/myfig','handle',h,'epspad',[10 10 10 10])
сохранит в файлы figs/myfig.tex и figs/myfig.eps не активную в данный момент картинку, а ту, на которую указывает h; кроме того, добавит по 10px со всех сторон. Про renderer и dpi можно почитать в документации.

Деталь шестая: необязательные аргументы \psfragfig{}

Прежде всего, поведением pstool можно управлять задав опции при загрузке пакета. Одну из них, которая принудительно перекодирует все картинки, мы уже обсуждали: process=all.

Иногда метки, выдающиеся далеко за пределы графика, оказываются "обрезанными". Предотвратить такое поведение можно задав опцию crop=pdfcrop.

Если возникают непонятные проблемы со вставкой картинок, можно задать опцию mode=errorstop, чтобы процесс комиляции останавливался при возникновении ошибки.

На этом список опций не исчерпывается: за подробностями всегда можно обратиться к документации.

Все эти опции можно задавать не только при загрузке пакета, но и после, а именно:

  1. с помощью команды \pstoolsetup{}; опция будет применена с момента её объявления
  2. в качестве необязательных аргументов к \psfragfig{}; при этом опция будет применена только к текущей картинке; например
    01:  \psfragfig[crop=pdfcrop]{figs/myfig}
    

Деталь седьмая: лезем в код matlabfrag()

Одним (пожалуй, единственным) из недостатков matlabfrag() является то, что всегда надо указывать явно размер шрифта (посмотрите на строки 6 и 7 самого первого примера, см. также ниже), чтобы он совпадал с размером шрифта в ЛаТеХе. Тогда как гораздо более удобным, по мнению автора этих строк, поведением было бы следующее: (1) если размер шрифта не указан, то просто используется установленный ЛаТеХом; (2) если же мы указываем в Матлабе размер шрифта явно, через FontSize, то и в ЛаТеХе надо этот размер насильно применить.

К сожалению, в "ванильной" версии matlabfrag() такая возможность отсутствует. Однако в версии, которую можно найти в файле с примерами к этому посту, я взял на себя смелость и изменил код этой функции соответствующим образом. Т.е., если вы используете эту "хакнутую" версию, то указывать

01:  %  Размер шрифта такой же как в ЛаТеХ-документе
02:  set(0,'DefaultAxesFontSize',12);
03:  set(0,'DefaultTextFontSize',12);
не нужно.

Деталь восьмая и последняя: хочу другой шрифт

До настоящего момента мы стремились использовать на графиках шрифт того же начертания, что и в основном тексте. Однако "в узких кругах существует мнение", что хотя в основном тексте лучше использовать шрифт с насечками (serif font), на рисунках надо отдать предпочтение шрифту без насечек (san serif font). Выражаясь языком понятным пользователям Ворда, "в тексте: Times New Roman, на рисунках: Arial". Якобы, такое разделение привлекает внимание к рисункам и выделяет их в массе текста.

Хотя эстетическая ценность такого решения весьма сомнительна, в "улучшенной" версии matlabfrag.m реализована такая возможность. В преамбулу ЛаТеХ-документа помещаем

01:  \usepackage{sansmath}
02:  \providecommand{\MATLABFont}{\sffamily\sansmath}
и наслаждаемся результатами. Заметьте, что сами рисунки для этого "перерисовывать" не надо. Результат с и без \MATLABFont приведён ниже. Обратите внимание, что греческие буквы недоступны в начертании "без насечек".


В принципе, выше были рассмотрены все основные шаги и опции для сохранения графиков и их импорта в ЛаТеХ. Интересующиеся более подробно деталями процесса могут ознакомиться с документацией к matlabfrag и pstool.

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

Итак, подведём итоги. Описанный метод позволяет при сравнительно малых затратах времени добиться более чем удовлетворительных результатов: векторных графиков с надписями, выполненными ЛаТеХом. Это позволяет не только добиться гармоничного соответствия между шрифтами на рисунке и в тексте, но и использовать на рисунке формулы и ссылки на уравнения, другие рисунки и т.д.

В случае Матлаба, необходимая функциональность доступна через matlabfrag(). Использование пакета pstool позволяет существенно упростить процесс импорта сгенерированных таким образом eps-файлов в pdfLaTeX.

Хотя мы рассмотрели данный рецепт на примере Матлаба, аналогичные методы могут быть использованы и с другими программами. Например, MathPSfrag является аналогом mathlabfrag() для мат-пакета Mathematica. Для Gnuplot использование set terminal latex и экспорт через pstool также позволяют добиться сходного результата.

Здесь мы рассмотрели экспорт графиков функций из MATLAB, однако схожий трюк применим и к рисункам и схемам созданным, например, в Inkscape. Об этом в одном из следующих постов.

Все примеры из данного поста доступны для скачивания по адресу tinyurl.com/amorua-matlabfrag.

Зеркала на случай сбоязеркало1, зеркало2

Image
Sunday, March 31st, 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.
11:15 pm
Отложенная отправка электропочты: scheduled email
Сегодня первое апреля, и автору хотелось немного отдохнуть.

Чего мне не хватает в интерфейсе Gmail, на фоне всех этих бесполезных свистулек и бубенчиков, так это отправки электропочты по расписанию. Например, у Васи Пупкина день рождения в субботу, а я в субботу колесю на своём Бентли велосипеде по всяким Флайшиттаунам. Хорошо бы запрячь Gmail отправить письмо в заданный день - сделали же они Scheduled Posts в Blogger.

После долгих блужданий нашёлся небольшой сайт LetterMeLater, который делает как раз это: отправляем на него письмо, в нём указываем срок, и всё. Оно приходит в точно назначенный день и час!



Настройка
Нужно зарегистрироваться на сайте LetterMeLater чтобы иметь возможность им пользоваться. При этом они будут принимать почту только с адреса email, с которым вы зарегистрировались. После этого заходить на сайт не обязательно - и это самая сладкая возможность, ибо можно отправлять отложенную электронную почту прямо из своего почтового клиента.

Что позволяет делать LetterMeLater:
  • отправлять отложенную электропочту прямо из вашего почтового клиента (GMail, Thundebird, и другие) просто на адрес me@lettermelater.com [см. в посте ниже подробности и срыв покрововъ]
  • использовать поля ‘cc’ и ‘bcc’ для отправки множеству адресатов.
  • устанавливать точную дату доставки, вплоть до минуты.
  • никакой рекламы в почтовых сообщениях не будет.
  • посылать вложения в письмах (attachments).
  • ваш обратный адрес будет такой, как обычно.
Здесь есть один подводный камень, впрочем...


Ахтунг! Прайваси!
Естественно, что сайт организован не просто так, а тайной массонской ложей мировой закулисы. А как может быть иначе, если даже в Gmail есть реклама, а тут её нет?

Так что ваши письма, скорее всего, станут доступны злобным агентам ЦРУ и Моссада, которые скопируют всю ценную информацию оттуда в секретные досье. В чём они открыто признаются в своих Terms and Conditions:

The user's email address (as well as any other personal information) will be kept strictly confidential ["Зуб даём и спамерам ваш адрес электропочты не засветим даже с утюгом на животе!"].
While attempts are made to secure personal information from public viewing, lettermelater is not responsible for the failure of any such attempts ["Конечно, мы постараемся не сильно светить содержанием вашей личной переписки направо и налево, но ничего не обещаем"].
All information you submit to lettermelater may be accessible to lettermelater owners, employees, partners, or other associates may be viewed or modified by them, ["Конечно, мы не устоим перед соблазном, чтобы не посмотреть в ваши письма при случае - мало ли, может вы там героин по три бакса за тонну продаёте, мы же тоже люди..."]
or others associated with the operation of lettermelater, for any reason at their sole discretion, including but not limited to ["И другим тоже дадим поглядеть, мы же не жадные..."]
(a) debugging or maintaining the services lettermelater provides ["Где подебажим, а где пошпионим..."]
and (b) ensuring compliance with the Terms and Conditions ["... и убедимся, что вы правила не нарушаете"].
В общем, для поздравлений с днём рождения и напоминаний о встречах (если вы обогащённым ураном не приторговываете налево, конечно) оно подойдёт. Но шибко приватную информацию я бы там слать не стал.

Но если это не пугает, можно пользоваться, о чём дальше.


Отложенная электропочта

Для отправки сообщений в поле адреса выставляем me@lettermelater.com
Теперь переходим в тело сообщения, и там пишем две строки:
to:
when:
Первое понятно - кому отправить, пишем адрес электронной почты:
to: nigerianletters@spam.gov
Если адресатов несколько, то пишем их отдельными строчками.

С полем when немного сложнее, так как нужно знать GNU format. Например:
  • next friday
  • next year
  • 2pm
  • tomorrow 4:02 am
  • 4 hours
  • 45 minutes
  • Sunday January 1, 2012 at 6:00 AM

Процесс

Например, хотим отправить спамерам утренний привет в восемь вечера с копейками.
to: nigerialetters@spam.gov
when: 8:12 pm
Dear Spamer,
I want to acknowledge your enlargement pills.
Bye
После отправки сообщений, придёт либо подтверждение об отправке:

ImageLetterMeLater.com to me
show details 8:12 PM (0 minutes ago)


Success! Your email has been scheduled:

From: virens woohoo@spam.gov
To: virens nigerialetters@spam.gov
Bcc: virens nigerialetters@spam.gov
Subject: Hi
Created: Tuesday June 7, 2011 at 8:12 PM EST
Will be sent: Tuesday June 7, 2011 at 8:15 PM EST


либо сообщение об ошибке:


LetterMeLater.com to me
show details 8:09 PM (0 minutes ago)


Failed! Your message was not scheduled:

1. This email address or group name is not correct: me

The format is:

to: recipient(s)
cc: recipient(s)
bcc: recipient(s)
when: date(s) to send - semicolon delimited for recurring emails
options: any of these options: reminder, hidden, html

*only to: and when: are required
For details see http://www.lettermelater.com/forum.php?id=2


Здесь нужно сказать, что кириллические письма сервис может обрабатывать как-то криво. Например, могут обрезаться строки, особенно если содержат форматирование (несколько писем было так искажено при отправке из Gmail). Письма на латиннице обрабатываются нормально.

Альтернативы:
  • В Icedove (Thunderbird) есть плагин Send Later
Знающие всё на белом свете Анонимусы могут предложить другой вариант отправки отложенных сообщений.
Image
Sunday, March 24th, 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.
10:34 pm
Китайский Android-смартфон THL W5: приятный сюрприз по вменяемой цене
Некоторое время назад я писал о том, как завёл себе Андроида - гигантскую электроовцу под названием HTC Desire HD. Время шло, смартфон был в активном использовании, несмотря на (частично) алюминиевый корпус, постоянные сжатия от тесного чехла HTC не понравились, и через некоторое время накрылся экран. По гарантии смартфон был отправлен обратно (+ почтовые расходы), но после ремонта через некоторое время экран стал отходить от корпуса. В общем, надо искать замену - пока смартфон жив. И тут автор этих строк заметил, что китайцы из компании THL для внутреннего узкоглазого рынка клепают вполне себе неплохие агрегаты...

HTC, THL и другие китайские балалайки

Компания THL расшифровывается как Technology, Happy Life, и представляет собой лавку дядюшки Ляо, разросшуюся до размеров нескольких десятков магазинов с фабрикой по поклёпу смартфонов. Как и вся продукция из Китая, она чем-то напоминает что-то, что уже кем-то сделано. В случае с THL их смартфоны, сделанные по сходному дизайну, чем-то напоминают продукцию HTC (а конкретно HTC One X) и Samsung, которая, в свою очередь, сильно напоминает продукцию Apple.
Работая в интернациональном коллективе, невольно замечаешь особенности конкретных наций в деле инженерии. Конкретно у китайцев всё очень здорово, когда нужно выдать большой объём работ при точно известной схеме. То есть, например, задача genome sequencing для них - идеальна: схема есть, оборудование есть, и просто нужна толпа квалифицированных исполнителей. Всё становится намного хуже, когда нужно придумать что-то новое, особенно если до этого народ приходил к выводу, что так сделать нельзя. Один китаец меня как-то спросил: какой метод для создания новых вещей? Как ты придумываешь новое? Он искренне думал, что я сейчас ему дам книжку, в которой это написано. Я же честно ему ответил: рву на жопе волосы :-) Он после этого меня больше ни о чём не спрашивал, хотя я ответил ему предельно честно.
Почти весь модельный ряд THL построен на базе одной и той же платформы (SoC, System on Chip) MTK6577, в которую они вставляют разные экраны и батарейки. Так как THL, что называется, "без роду и племени", то денег за свои балалайки смартфоны они просят немного (в отличие от оборзевшего самсунга), собирают пристойно, заливают туда стоковый Андроид и продают всем страждущим.

Душа горит огнём желаний

Собственно, автору этих строк хотелось получить за вменяемые (до 300 долларов) деньги смартфон вида:
  • большой и яркий экран с диагональю больше 3" но меньше 5" и плотностью точек не менее 250 PPI;
  • естественно Android (версия не важна, но ICS хотелось бы);
  • Много памяти (1 Гб);
  • SD-карта памяти - без неё смартфон вообще не рассматривается;
  • приличное качество сборки (пластиковые игрушки от самсунга со скрипами идут лесом);
  • Могучая батарейка.
Удивительно, что таким простым требованиям удовлетворяет не так уж много аппаратов. Более того, намечается тенденция по обезьянничанию Apple: убирание SD-карт, блокирование загрузчика и прочее.

THL W5 3G Smart Phone MTK6577 1GB RAM Dual Core Android 4.0 4.7" IPS Screen

Долго ли, коротко, но я набрёл на смартфон вот с таким длинным названием. По размерам он почти такой же, как мой старый HTC Desire HD, только длиннее за счёт большего экрана (всё-таки 4.7 дюйма). Вот он, наш герой:


Хотя он сделан весь из пластика, выглядит строго и достойно. Более того, за свои 200 долларов под капотом имеется весьма достойное железо, а именно:
  • CPU: Dual Core Cortex A9;
  • GPU: PowerVR Series5 SGX (MT6577);
  • Memory:
    • RAM: 1 GB
    • ROM : 4GB that is 1GB for system, 820MB APPS, 2GB storage space
  • SD-cards: up to 64GB Class 12 Micro SD Memory Card
  • Size:136 x 69.8 x 10.3mm
  • Weight: 157g with battery
  • Screen: 4.7" IPS, 1280x720 Capacitive Multi Touch Screen
  • Network: Dual Sim
    • 2G:GSM/GPRS/EDGE: 850/900/1800/1900 MHz
    • 3G:WCDMA/HSPA/HSPA+: 850/2100MHz
  • GPS: Built In GPS A.GPS
  • Wi-Fi : IEEE 802.11 b/g/n, supports Wi-Fi hotspot
  • Camera:
    • Back: 8.0 mega pixel,
    • Front: 2.0 mega pixel, supports Skype Video Calls
  • Sensor: Gravity Sensor, Proximity Sensor, Light Sensor
Всё это под управлением Android V4.0.4 Ice Cream Sandwich. Среди всего прочего, особо радует IPS-экран, камера и, конечно же фирменный знак китайцев - две сим-карты.


Покупалось это чудо на Ebay вот тут за 209 долларов вместе с доставкой.


В комплект добрые китайцы положили, помимо телефона, наушники, USB-кабель, зарядник, плёнку для экрана и аж целых две (2!) могучие 2000 mAh батарейки. Да, так же в комплекте замечена инструкция для простых китайских колхозников на таком простом и понятном китайском же языке:

Смартфон долетел из Гонк-Конга в Австралию за 8 дней в целости и сохранности:


и далее начал радовать автора этих строк неимоверно, о чём ниже.



Внешний вид, комплект и сборка THL W5

На фотографиях THL W5 выглядит очень прилично, но каков он в жизни? А в жизни он выглядит не менее достойно: несмотря на полностью пластиковый корпус, выглядит строго, собран хорошо и в широкой руке автора лежит отлично. Задняя крышка сделана из мягкого и "шелковистого" на ощупь пластика, скрывая под собой здоровенный танковый аккумулятор, доступ к microSD и SIM-картам.



Собственно, кнопок и штекеров минимум: вкл\выкл, стандартное гнездо наушников на 3.5", кнопка громкости, microUSB, камера сзади (с дистрофичной подсветкой) дырка для микрофона снизу.

Крышка

Крышка держится на десятке небольших защёлок, которые легко поддаются при применении небольшой, но грубой физической силы. Тут вылезает первый небольшой недостаток: microSD карта расположена так, что без изъятия аккумулятора её не достать. Не то, чтобы это часто требовалось, но тем не менее.

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

Кнопка включения - в верхней части, в центре. Если обхватить смартфон и положить указательный палец на верхнюю часть, он точно приземлится на кнопку включения. Чуть левее притаился Audio Jack 3.5" выход на наушники.

Наушники

Да, наушники идут в комплекте, но, признаться, лучше бы не шли. На china-review пишут, что эти затычки а-ля "наушники вакуумного типа с довольно хорошим качеством звука" - с чем автор этих строк категорически не согласен.

Такого кошмара я не слышал уже давно: звук как из бочки, басы отсутствуют как класс, высоких частот нет в принципе. Конечно, "Владимирский централ" в них слушать можно, но, скажем, Боккерини и Моцарта, к которым тяготеет автор, лучше даже не пробовать. Для сравнения, оставшиеся наушники от HTC по сравнению с THLевскими звучат как Hi-End студийная запись.

Но за 200 баксов это можно и простить, благо разъём стандартный и можно воткнуть всё, что угодно.

Железо: что под капотом у THL W5

Как отмечалось выше, под капотом у THL W5 весьма приличное железо, особенно учитывая его цену. Двухядерный процессор, много памяти, приличный WiFi чип и огромный яркий экран - обо всём этом чуть подробнее далее.

Батарейка

Целых два могучих 2000 mA*h кирпичика в комплекте, которые призваны поддерживать жизнь огромного 4.7" яркого экрана, двухядрёного процессора и что-то вечно энергично качающего WiFi чипа.


На тему энергопотребления и времени работы, как всегда, мнения несколько разнятся. Официальных данных на сайте THL нет, но есть восторженные комментарии пользователей под описанием смартфона (которые всегда выставляют 5 звёзд):
The battery life is great. It gets me all the way through the day without having to plug in and that's with very heavy usage - I've been an Android user for years and I've never had a phone that will do that...
или:
The battery exceeds my expectations, getting through a full day is no problem for me using web, email, text, google talk, streaming music via BT, checking weather, reading Kindle, you name it. Average 12 hours or so battery for me with 20% or so remaining at the time I plug it in at night.
То, что это опубликовано на официальном сайте, это, конечно, лучше чем ничего, но отсутствие цифр от производителя несколько смущает.
Охочим до цифр и замеров - их есть у нас:
  • выкрутив яркость до 1% с помощью Elixir2 и запустив pomodroido (экран всегда включён), можно проработать от одного заряда с 9.30 утра до 7 часов вечера, при двух SIM-картах, коротком использовании Wifi для забора почты и немного текстовых сообщений. При этом расход за первые 7 часов - 80%, с 7 до 9 часов заряд уходит с 20% до 4% (как раз успеть добежать до розетки) То есть в районе 10 часов.
  • использование утилит типа ScreenDim Full ощутимо продлевают жизнь батарейки.
Тем не менее, автор с комментаторами в целом согласен: батарейка достойная и её хватает на весь день. Хорошая новость в том, что в чехол можно положить вторую :-)

Две SIM-карты - Про и Контра

Смартфон, как и полагается по древней китайской традиции, имеет две SIM-карты (Dual SIM) и, естественно, не залочен на мерзких капиталистических операторов связи.

Как уже говорилось, у смартфона - две SIM-карты под стандартные SIM (полноразмерные). Здесь нужно ещё немного попенять узкоглазым: места для двух симок очень мало, и слоты очень тугие. Вставка SIM-карты, особенно нижней, это то ещё развлечение - автору этих строк, при всей его инженерной подготовке, потребовалось добрых полчаса, чтобы просунуть обе SIM-карты.
Лирическое отступление. Разного рода проприетарщики обожают изобретать новые несовместимые стандарты, на радость простым пользователям. Нынче появилась тенденция делать не нормальные SIM-карты, которые были ещё до изобретения огня, колеса и электричества, а micro-SIM.


Но Apple не была бы Apple, если бы не выпендрилась со своим форматом NanoSIM. В ихний iPhone 5, видите ли, microSIM не влезают, и давайте уже сделаем новый формат.
Вопреки расхожему мнению о том, что Dual SIM потребляет много энергии, автор не заметил ощутимой разницы между включением двух сим-карт (в комментариях сообщают, что в смартфоне один радиомодуль), одной или Airplane mode: главные потребители батарейки, как и всегда, это экран и WiFi.

Занятно, но вот тут говорят, что в таких Dual SIM смартфонах - два разных GSM-приёмника, которые работают одновременно, мониторя состояние сигнала двух сим-карт. Знающие всё на свете авторитетные Анонимусы приглашаются это прокомментировать.
Работают две SIM-карты параллельно, Оказывается, что нет, на чём можно убедиться на опыте: во время разговора "по одной симке", звоним на вторую и убеждаемся что абонент отсутствует в сети. Тем не менее, можно принимать и отправлять SMS на два номера:


В нашей австралийской глухомани это важно: покрытие сотовой связи неравномерно, и можно пользоваться услугами того оператора, который лучше представлен в данной местности и\или дешевле.

IPS Экран 4.7 дюйма

Он прекрасен - яркий и большой, хорошо смотрится даже в солнечную погоду и под большими углами обзора. При своей внушительной диагонали он вытянут чуть больше, чем HTC Desire HD - то есть он такой же широкий, только длиннее. Отлично смотрится на солнце и не слепнет.



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


Здесь следует отметить один момент: на экране видна сетка тачскрина, хотя видна она только на ярких участках изображения. На HTC Desire HD её заметно не было, а здесь её видно. Запишем в недостатки, а то кто-нибудь подумает, что THL заплатила мне мильён юаней за обзор :-)

Забавный момент с регулятором яркости: шагов яркости не так много, и даже на 1%, выведенный с помощью Elixir2, это не похоже. В темноте читать не очень удобно, хотя я нашёл ScreenDim Full, который решает эту проблему (утилита стоит целых 99 центов).

WiFi, GPS, Bluetooth...

и прочий беспроводный ливер вполне достойные: wifi цепляется к домашнему и университетскому роутеру, GPS выдаёт координаты, Bluethooth кидает файлы на планшет и десктоп. Дабы проверить WiFi, автор этих строк, естественно, пошёл на свой бложик:


WiFi чип очень охоч до батарейки, и расположен, судя по нагреву во время работы, недалеко от камеры - в верхней части смартфона. Батарею ест от души, хотя WiFi на моём старом HTC более чувстсвительный, и ловит сильно удалённые WiFi точки, которых THL не видит. В остальном WiFi работает без вопросов и проблем.

GPS работает без проблем, хотя холодный старт занимает ощутимо больше времени, чем на HTC Desire HD. Тем не менее, отлично работает в паре с GPStest и Osmand.

Камера и подсветка

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

Фронтальная камера на 2 мегапикселя для видеозвонков - выдаёт немного засвеченную картинку, хотя вполне приличную.

Задняя камера на 8 мегапикселей тоже радует приличными картинками:

Приличные для телефонной камеры снимки, неплохая цветопередача. Снимает на удивление быстро, и так же шустро работает автофокус.
Подсветка... имеет место быть, и это уже радует. Я не знаю, о чём думали в THL, когда ставили эту пародию на LED-подсветку. Картинка стоит тысячи слов: слева HTC Desire HD, справа THL 5W.


В общем, во мгле ада это лучше, чем вообще ничего, но, как бы это помягче, недостаточно для повседневных нужд. Пожалуй, это самый большой недостаток THL W5, но за 200 баксов чего только не простишь.

Выводы по железу

За 200 долларов железо в смартфоне очень достойное: быстрый двухядерный процессор, много (1 Гб) памяти, Dual SIM, могучая батарейка, яркий и качественный экран, достойная камера и долгое время работы (HTC Desire HD в этом плане тихо покуривает в сторонке). Из недостатков стоит отметить дистрофичную подсветку и нагревающийся при работе WiFi.

Софт: Андроид "Мороженый бутерброд" и как сделать его съедобным

На THL W5 залит Android 4.0.4 ICS с минимумом софта и который при первом включении выглядит вот так:

То есть часы, иконки внизу, аутентичные китайские обои и неубираемая строка поиска от Google. Если общую убогость тем и изкоробочный вид Андроида ещё можно терпеть, то надоедливую строку гуглопоиска, отнимающую целый ряд иконок, терпеть решительно невозможно.

Go Launcher EX

Поэтому было решено установить GO Launcher EX в качестве штатной оболочки. Небольшой напилинг, красноглазинг и подбор тем - и вот что из всего этого получилось в итоге:

Тема Stained Glass, виджет для часов пришлось искать отдельно. По сравнению со стоковым убожеством выглядит отлично и, что самое приятное, конфигурировать можно до посинения.Есть много красивых тем, в том числе платных. На скриншотах выбрана тема Stained Glass (бесплатная). Три скриншота отражают установленные приложения, конфигурацию виджетов Elixir2 и календарик от Go:


Из специфичного софта отмечу Andie Graph (эмулятор TI калькуляторов - мечта любого инженера), G Cloud для переноса настроек и AirDroid для связи со смартфоном по WiFi.

SIM Card management

Это ещё одно специфичное отличие от большинства смартфонов - управление двумя SIM-картами. Выше в разделе про железо уже говорилось, что с THL W5 можно посылать и принимать SMS на оба номера одновременно, при этом в сообщениях они будут отображаться все вместе.

Можно выключать и включать SIM-карты в настройках:

назначив каждой цвет для удобства:

Если же вы захотите отправить SMS-сообщение, то в стандартном виджете можно выбрать, с помощью какого оператора сообщение будет отправлено:

Так что теперь можно рассылать и принимать сообщения с обеих SIM-карт одновременно.

Выводы по софту

После HTC Sense и привычного Android 2.3, новый Android 4.0.3 Ice Cream Sandwich выглядит убого и минималистично, с неубираемой строкой поиска вверху, которая отнимает место, и урезанными настройками. К счастью, в отличие от Apple, на андроиде оставлено большое поле для настройки под себя, и сторонняя оболочка GO Launcher EX исправляет положение. В остальном всё как прежде: перенос настроек, уже купленные приложения из Play Store ставятся на новый аппарат, и вот он уже радует нас всеми возможными и невозможными приложениям.

Заключение

Смартфон THL W5, несмотря на своё безродно-китайское происхождение, более чем стоит своих денег, имея мощное железо, отличный экран и кастомизируемый современный Андроид на борту.

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

Плюсы-таки перевешивают: замечательный большой экран, мощный процессор, море памяти, две батареи, двуxядерный процессор, отличное качество сборки и андроид, не захламлённый предустановленным мусором. Так держать, THL!

Ссылки

Есть хороший обзор на украинском сайте china-review, откуда автор позаимствовал немного картинок. Краткий обзор на английском здесь.
Image
[ << Previous 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.