пятница, 25 мая 2012 г.

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

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

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

вторник, 22 мая 2012 г.

Books: Паттерны, сэр!

Кто-то издаёт толстенные тома, в которых переводит стандартные паттерны из известной книжки на C#, Java, Python...

А кто-то новые печёт!

понедельник, 21 мая 2012 г.

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

Известный поисковый запрос, вынесенный в заголовок - одна из самых навязчивых проблем Visual Studio.

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

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

Например:

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

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

пятница, 18 мая 2012 г.

Philosophy: Паттерны - 2

Wolfgang Pree из Зальцбурга тоже исследовал паттерны и написал про них книжку. В отличии от писаний "банды четырёх", в Рунете про неё почти никто не слышал.

Даже перевода нет.

Зато есть конспект на английском.

ASP.Net: Текущая страница из ASCX

Как узнать текущую страницу из ASCX? Например, для какой-нибудь компоненты из недр sitecore layout?

Вот так:

String.Format("{0}://{1}{2}",
                Request.ServerVariables["HTTPS"] == "on" ?
                    "https" :
                    "http",
                Request.ServerVariables["SERVER_NAME"],
                Request.RawUrl.ToString());

четверг, 17 мая 2012 г.

Script: Popup по центру экрана

Как поставить кнопки Facebook/Twitter/Google со своими иконками? Берём и ставим a с соответствующими href:

Twitter:
https://twitter.com/intent/tweet?url={PageUrl}&text={PageUrl}

Показываеть Twitter как blank - не надо. Если вставить сакральную мантру:

!function(d, s, id)
< script type="text/javascript" >
{ 
  var js, fjs = d.getElementsByTagName(s)[0];
  if (!d.getElementById(id))
  {
    js = d.createElement(s);
    js.id = id;
    js.src = "//platform.twitter.com/widgets.js";
    fjs.parentNode.insertBefore(js, fjs); 
 } 
} (document, "script", "twitter-wjs");
< /script >
< script type="text/javascript" src="//platform.twitter.com/widgets.js" >< /script >

 то он сам всё найдёт и откроет. Попытаешься повесить скрипт - начнёт показывать 2 окна.

Facebook:
http://www.facebook.com/sharer.php?t={PageTitle}&u={PageUrl}

По необъяснимой причине он не видит PageTitle, если запускать с локального сервера.

Google Share (не путать с Google +1!):
https://plus.google.com/share?url={PageUrl}

Pinterest:
http://pinterest.com/pin/create/button/?url={PageUrl}&media={PageImage}&description={PageTitle}

А открывать это надо через _blank и по центру экрана:

function PopupCenter(pageURL, title, w, h) {
   var left = (screen.width / 2) - (w / 2);
   var top = (screen.height / 2) - (h / 2);
   var targetWin = window.open(pageURL, title, 'menubar=no, toolbar=no, resizable=yes, scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
} 

Функцию для открывания окна взял у Нимы.

И ещё - если во втором параметре window.open будет пробел, Internet Explorer его не откроет. Такие дела.

Design: Иконки

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

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

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

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

Очень достойно и захватывающе. Радует la baboulinka и впечатляет раздолбайство главного героя, который может выиграть деньги, но тратит их на парижское житьё пресловутой mademoiselle Blanche. Нету безысходного мрака и сырости, которым шибает нас из школьной программы, где "Белые ночи" и "Преступление и наказание". Просто срыв резьбы и падение, падение, падение.

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

суббота, 12 мая 2012 г.

Script: Привет из эры Web 1.0

Собрания всевозможных CMD, Perl и прочих скриптов на радость админам.

Включая совершенно немыслимый CMD-шник, который по датскому названию птицы выдаёт её латинское видовое название. Из Википедии, разумеется. Причём парсит Википедию... через JScript!

"Это невероятно".

четверг, 10 мая 2012 г.

среда, 9 мая 2012 г.

Book: Программист-прагматик - 2, гл. 3-8

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

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

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

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

Поэтому любите командную строку, а в ней - cygwin или даже UWin.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Генерация текстов - Perl
    Системные дела - Cmd, Cygwin (теперь и PowerShell)
    Тестирование интерфейса - есть и для этого средства (в наше время - iMacro, AutoIt)

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

вторник, 8 мая 2012 г.

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

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

@echo off
set MSBUILD=%WinDir%\Microsoft.NET\Framework\v3.5\msbuild
set PROJECT=d:\Projects\CSharp\MinesweeperProj\
TortoiseProc /command:switch /path:"%PROJECT%"
cd %PROJECT%
for %%f in (*.sln) do "%MSBUILD%" %%f
cd %~dp0.

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

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

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

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

ActivePerl под Windows - иногда не принимает переданных параметров
Cygwin - нету
PowerShell - просто так даже Hello World не запустишь. Система будет ругаться, что он... не подписан (маразм? маразм!)

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

copydll.cmd:

@echo off
set FROM=d:\proj1\bin
set TO=W:\stable\proj1\bin
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 Commander и просто перетаскивать туда нужный файл:

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

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

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

понедельник, 7 мая 2012 г.

Blog: Баг в ЖЖ

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

Дело в том, что если попытаться послать пост по e-mail (как это сделать - ищите в настройках. Там оно есть), то LJ то ли не будет проверять его размер, то ли будет проверять его по старому стандарту.

И пост благополучно уйдёт по назначению.

Писал на Хабр - НЛО статью отвергло. И правильно - неча умные вещи писать.

И, для изучение - Perl-скрипт для синхронизации Wordpress и Livejournal. Написано на Perl, запускать в cron.

Book: Программист-прагматик - 1. гл. 1-2

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

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

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

Полезное:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

11. Из 10 - подобные функции могут быть объеденены в Strategy, а глобальные данные - в Singletone

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

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

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

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

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

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

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

- Интерфейса

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

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

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

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

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

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

1-15 дней - дни

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

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

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

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

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

суббота, 5 мая 2012 г.

Blog: Постим в два блога одновременно

Не люблю ЖЖ, но эккаунт там всё-таки есть. И хочется, чтобы блоги были синхронизированы. Чтобы написал здесь - а там оно само появилось.
Для этого есть разные способы.
  • Поставить Firefox + Scribefire. Добавляем в него оба наших блога и, когда делаем пост, ставим флажок на том блоге, в который нужно отправить копию. По-моему, лучшее.

    Особенности
    • Когда добавляем блог, надо указать имя, тип (для livejournal - "Livejournal (old)") и нажать "Следующий". Тогда он правильно определит URL.
    • Если в вашем логине есть дефисы, надо вводить их нижним подчёркиванием, e.g.: rikki_mongoose.
    • Крайне желательно, чтобы блог был оформлен как чёрный текст на белом фоне. Editor, который встроен в Scribefire, любит вставлять стилистический мусор и явно задаёт цвет для каждого абзаца. В моём случае получался текст "углём по чёрной бумаге". Замучившись, я просто отказался от идеи использовать 2 блога.
    
    
  • Настроить перепост через почту. Это дыра в безопасности - четырёхзначный PIN скорее всего будет годом рождения где-то между 1900-2000. Да и забить ящик Livejournal'а письмами с PIN-кодом от 1000 и 9999 - дело одного дня.
  • Воспользоваться сторонним сервисом перепоста, вроде Пистона. Работоспособность никто не гарантирует. И название у них дурацкое.

пятница, 4 мая 2012 г.

Life: Музыка паттернов проектирования

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

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

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

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

Кто знает - может, ремесло программиста станет тогда более возвышенным. А их код - более гармоничным.

Ведь программирование - это тоже искусство. Это выражается, например, в том, что программисты обычно сами не могут объяснить, как они делают то, что делают. Как у композиторов или у исполнителей - у величайших есть своя манера. Для кого-то и Perl недостаточно гибок, а для кого-то - например, для Линуса Торвальдса - и C++ есть излишество, эксплуатирующее достоинства чистого C.