Life: Как сконвертировать djvu?

Как сконвертировать DJVU в PDF? Например, если нужно загрузить в читалку.

По старинке обычно рекомендуют мелкие утилитки. Хотя уже давно есть куча сайтов, которые конвертируют прямо в онлайне. Doc­spal, например.

Tools: Remove whitespaces at the end of lines in Visual Studio

Известный поисковый запрос, вынесенный в заголовок — одна из самых навязчивых проблем Visu­al Stu­dio.

Опытные пользователи знают, что в поиске-замене есть свой Reg­Exp. Но работает он не так, как у людей.

Что делать? Искать готовые решения.

Например:

:Zs#$ - все пробелы на конце строк
^:d+ — все цифры в начале строк (например, из какого-нибудь блога код скопировал)

Список будет пополняться.

Book: Достоевский — Игрок

Та самая книга, которую Достоевский надиктовал за 25 дней. Короче, чем “Село Степанчиково”, “Неточка Незванова” и “Двойник”, но длиннее, чем “Бедные люди”. Чтобы усилить жанровую чересполосицу — это считается романом (а иногда и “Белые ночи” считают романом), в то время как “Вечный муж” (такого же размера) — рассказ.

Сложно сказать, насколько каторжной была работа: Достоевский диктовал с 12 до 4, т.е. 4 часа в день.

fb2-версия оказалась на купленном в воскресенье букридере. Вот и прочитал.

Очень достойно и захватывающе. Радует la baboulin­ka и впечатляет раздолбайство главного героя, который может выиграть деньги, но тратит их на парижское житьё пресловутой made­moi­selle Blanche. Нету безысходного мрака и сырости, которым шибает нас из школьной программы, где “Белые ночи” и “Преступление и наказание”. Просто срыв резьбы и падение, падение, падение.

Словом, Достоевский, конечно, велик. Несмотря на школьную программу.

Script: скомпилировать все *.sln файлы

Ещё один CMD-скрипт. Делает Switch для tor­toise, после чего перекомпилирует все *.sln в проекте.

@echo off
set MSBUILD=%WinDir%Microsoft.NETFrameworkv3.5msbuild
set PROJECT=d:ProjectsCSharpMinesweeperProj
TortoiseProc /command:switch /path:"%PROJECT%"
cd %PROJECT%
for %%f in (*.sln) do "%MSBUILD%" %%f
cd %~dp0.

К сожалению, switch с заменой ветки в текущей стабильной версии делать нельзя. В night­ly версии у switch добавился параметр url, но бета-версии Tor­toise на работе обычно не ставят.

Script: Скриптовая эволюция

Дано — написать скрипт, который кидает определённые файлы из локальной папки в папку на подключенном сетевом диске. Например, веб-проект, в котором мы изменили 2–3 dll. OS Win­dows.

На каком языке писать скрипт?

ActivePerl под Win­dows — иногда не принимает переданных параметров
Cyg­win — нету
Pow­er­Shell — просто так даже Hel­lo World не запустишь. Система будет ругаться, что он… не подписан (маразм? маразм!)

Похоже, технологии ушли слишком далеко. Нам остаётся только старый формат CMD файлов.

copydll.cmd:

@echo off
set FROM=d:proj1bin
set TO=W:stableproj1bin
FOR %%A IN (%*) DO IF EXIST "%FROM%%%A.dll" COPY /Y "%FROM%%%A.dll" "%TO%%%A.dll"

Добавляем папку в Path и вызываем

copydll Proj.Module1 Proj.Module2

А этот cmd можно кинуть на панель в Total Com­man­der и просто перетаскивать туда нужный файл:

@echo off
set TO=W:stableproj1bin
FOR %%A IN (%*) DO IF EXIST %%A COPY /Y %%A "%TO%%%~nxA"

Конечно, можно просто перетащить на панель Total Commander’а саму папку, но тогда придётся дважды щёлкать мышкой (ОК в диалоге копирования и потом Replace All)

Да, ещё. Если написать в CMD-шке PAUSE, она в этом месте попросит Press any key to con­tin­ue.…

Book: Программист-прагматик

Книга довольно старая (эпохи, кажется, Win­dows 2000) и очень плохо переведена (есть глава “Мой исходный текст съел кот Мурзик”).

Набор инструментов типичен для того времени — C++, CORBA, Perl и т.п.

Внимательно читать не стоит, а вот просмотреть — надо. В книге есть мысли, которые просто в голову не приходили.

Полезное:

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

2. “Закон разбитых окон” выполняется и для программ. Если есть ошибки и нестабильности — очень скоро их станет намного больше.

3. Качество должно быть одним из требований.

4. Читайте по одной технической книге ежеквартально. И другие книги — не относящиеся к технической литературе.

5. Экспериментируйте с различными операционными системами.

6. Оставайтесь в курсе событий — интернет и т.п.
(Советует журналы и news-группы — в духе времени. Сейчас закрылись и основной журнал по C++, и The Perl Jour­nal. Статьи из последнего можно найти в Интернете по метке TPJ).
и критически осмысляйте всё, что нашли и услышали.

7. “Лучше быть проигнорированным, чем недооценённым”. Беседуйте с гуру и с потребителями.

8. Принцип для выступлений WISDOM:

- Чему вы хотите научить?

- Какова их заинтересованность?

- Насколько искушена аудитория?

- Насколько детальным должно быть выступление?

- Кто должен обладать информацией?
 
- Как мотивировать слушателей?

9. DRY — Don’t repeat your­self. Важно писать код так, чтобы его было легко использовать повторно. Тогда отпадает большинство эпизодов с дублированием.

10. Ортогональность — следует исключать взаимодействие между объектами, не относящимися друг к другу. Искать баги становится легче, код — более удобным для повторного использования, и немного возрастает производительность.

11. Из 10 — подобные функции могут быть объеденены в Strat­e­gy, а глобальные данные — в Sin­gle­tone

12. Обратимость. Вытекает из предыдущего. Помним, что не существует окончательных решений. Если чтобы заменить MS SQL на Ora­cle надо переписывать всё — это не порядок.

13. Чтобы стрелять ночью прицельно, используют трассирующие пули, которые светятся в темноте. Куда попадёт трассирующая — попадёт и обычная. Используйте “трассирующие” предложения, чтобы понять, что от вас хотят.

14. Прототипы (не работает, но показать можно):
- Архитектуры (классы-заглушки)

— Новых функциональных возможностей для системы (интерфейс, который не работает)

— Структуры или содержания внешних данных

— Компонентов

— Рабочих характеристик

— Интерфейса

15. “Границы моего языка есть границы моего мира”.

(Неспроста Хайдеггер искал истину в языке, иногда получая слова в духе Хлебникова)

Программируйте как можно ближе к предметной области вашей задаче. Если команды можно упаковать в классы-“пакеты” — пакуйте! Т. ж. хорошо писать мини-языки, там, где они могут пригодиться.

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

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

16. Проводите оценки по следующим градациям:

1–15 дней — дни

1 — 8 недель — недели

8 — 30 недель — месяцы

> 30 недель — надо хорошенько подумать

Если вы уверены, что проект займёт 125 рабочих дней (= 25 недель) — говорите “примерно 6 месяцев).

Если просят оценить сразу — говорите “надо подумать”. Ведите журнал оценок, чтобы знать свою точность. И по возможности сдвигайте график в ходе проекта — по мере работы он не растягивается, а уточняется.

17. Сохраняйте данные в виде простого текста. Так проще править руками

18. Графические интерфейсы:

преимущество — WYSIWYG — получаешь то, что видишь

недостаток — WYSIAWYG — получаешь только то, что видишь

Поэтому любите командную строку, а в ней — cyg­win или даже UWin.

19. Используйте 1 редактор, но по максимуму. Требования: настраиваемость, расширяемость, программируемость

20. Отлаживать без паники. Не обвинять, а исправлять. Не предполагайте — доказывайте.

21. Добиться воспроизводимости, и только потом чинить. Метод “резинового утёнка”

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

23. Совершенных программ не бывает. Бывают программы, которые легко поддерживать.

24. Пользуйтесь исключениями только в исключительных случаях.

25. Если запутались — применяйте закон Деметера. Но без фанатизма.

26. Настройка лучше интеграции. Текст программы — абстракция, метаданные — подробности.

27. Проектируйте, не забывая о службах — некоторые процессы так и просятся, чтобы их распараллелили. Для распределённых приложений — концепция доски объявлений.

28. Реорганизуйте чаще, раньше, регулярней.

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

30. Работайте с пользователем, чтобы говорить на его языке.

31. Абстракции живут дольше потребностей. Поэтому, например, проекту нужен иногда глоссарий — что как называется.

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

33. Вопросы, если упёрлись:

Можно ли сделать проще?
Мы решаем проблему, или увязли в деталях?
Почему это проблема?
Что делает её сложной?
Нужно ли это?

34. Начинайте, когда знаете, что будете делать. Иначе дров наломаете.

35. Автоматизируйте всё.

Генерация текстов — Perl
Системные дела — Cmd, Cyg­win (теперь и Pow­er­Shell)
Тестирование интерфейса — есть и для этого средства (в наше время — iMacro, AutoIt)

36. Тестируйте беспощадно. Тестируйте в т.ч. сами тесты — специально поставьте неправильный вывод и т.п. и проверьте, найдёт ли его текст.