Показаны сообщения с ярлыком windows. Показать все сообщения
Показаны сообщения с ярлыком windows. Показать все сообщения

Pandoc: швейцарский нож для преобразования текста

Не единожды при создании текстов (особенно технических документов) в Microsoft Word, да и в других WYSIWYG редакторах, ловил себя на том, что оформление документа отнимает внимание и не даёт полностью сосредоточиться. Постоянно хотелось разделить задачи написания содержания и оформления, но не было подходящего инструмента: хотелось чего-то очень простого и понятного, и чтобы не надо переключаться между клавиатурой и мышью, и чтобы ещё и не переучиваться, и чтобы всё работало быстро.



.Gadget again: Разные мелочи

Микрософт в своём стиле: при обновлении
не показывается версия установленного гаджета
Продолжаю ковыряться с гаджетами Windows Sidebar.

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

Разаботка и дебаг:
Микрософт рекомендовал разрабатывать и дебажить в Visual Studio. По опыту получается, что львиную долю разработки можно сделать в альтернативной системе (я использовал Mac OS X 10.7.5), если говорить о логике изменения UI и получения/обработки данных. Всё что касается работы с настройками,- дело плохо. Данные настроек для гаджетов Windows Sidebar записываются и читаются с помощью javascript-объекта System.Gadget.Settings. Нигде, кроме сайдбара, этого объекта попросту не существует в объектной модели javascript. Реализаций System.Gadget.Settings в виде бибилиотеки для отладки в произвольном браузере (да даже в IE),- попросту не существует и уже не будет существовать.

Кроссплатформенность
В Mac OS X тоже есть гаджеты (ака виджеты). Несмотря на похожесть этих двух представителей ПО,- готовить их нужно по разному. Кроме того, есть ещё расширения для Chrome, которые тоже все из себя HTML, но тоже другие. Готовых инструментов для адаптации одного к другому или изначально кроссплатформенной разработки,- не нашёл, хотя не исключаю, что они могут существовать или кем-то разрабатываются в настоящий момент.

.Gadget: Никаких логов в консоли

Пара стандартных гаджетов-виджетов
 на рабочем столе Windows
Довелось тут делать gadget для Windows Sidebar. Дело оказалось нехитрое, но шибко геморройное, как и всё связанное с Internet Explorer. Краткую инструкцию можно найти по известному адресу или погуглить, информации в сети достаточно.

Вкратце: Gadget для Windows Sidebar представляет из себя HTML-страничку с небольшой дополнительной обвязкой в виде ресурсов (javascript, CSS, графика) и нескольких дополнительных файлов, которые помогают винде понять "что со всем этим делать". Внутри странички может работать уже упомянутый javascript (в том числе всевозможные jQuery и прочие библиотеки с небольшими ограничениями), можно делать ajax-заросы к внешним ресурсам (с учётом Access-Control-Allow-Origin на сервере, конечно), можно прикрутить несколько дополнительных страниц (выезжающая плашка ака flyout и страница настроек). Все эти файлы собираются в одну папку с именем, оканчивающимся на ".gadget" и подкладываются операционной системе. Операционной системе это кажется гаджетом, который можно разместить на рабочем столе (в Vista и Windows7) и быть от этого счастливым.

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

Процесс ошибок был долог, но конечный результат таков:
Несмотря на то, что console.log работает в IE9 с открытым окном "Средства разработчика F12",- не надо использовать console.log в виджетах, ибо в виджете console.log приводит к ошибкам. А ошибки в гаджете,- не отображаются как таковые.

Разделение строки на части в Excel

Кнопка "Текст по столбцам" в Excel
Случайно обнаружил, что в MS Excel нет формулы для разделения строки на части с использованием символа или подстроки в качестве разделителя. Нет вообще, как таковой. В любом нормальном языке программирования есть, а в Excel нет. Для случаев, когда строка представляет из себя число с дробной частью,- там на помощь приходит деление, умножение и остаток, знакомые со школы, хотя для неопытного пользователя и эта задача может оказаться непосильной. А если разделить нужно именно текст? Формула для сращивания строк,- есть, а для разделения,- нет. Гуглинг по вопросу даёт совершенно дикие варианты, типа вот такого:


Формула (стиль A1):
=ЕСЛИ(ЕОШ(НАЙТИ(",";A1));A1;ПСТР(A1;1;НАЙТИ(",";A1)-1))

Формула (стиль R1C1):
=ЕСЛИ(ЕОШ(НАЙТИ(",";RC[-1]));RC[-1];ПСТР(RC[-1];1;НАЙТИ(",";RC[-1])-1))


К счастью, такая задача нечасто возникает, поскольку в большинстве случаев исходные данные можно сохранить как файл и прогнать через импорт, что вообщем-то решает задачу. К тому-же, если разделение строк нужно разово, а не в виде формулы для динамического пересчёта, то всё не так плохо:
в последних версия Excel есть волшебная кнопочка "Текст по столбцам" (у меня находится именно в виде кнопки в разделе "Данные"). Собственно делает практически тоже самое, что и импорт файлов в формате типа CSV,- предлагает выбрать разделитель, даёит возможность настроить формат получившихся столбцов и всё такое.

Но для решения этой простейшей задачи я потратил не меньше получаса. 

Ctrl-S и vi


У системных администраторов и программистов бывают плохие привычки. Одна из таких привычек,- работать попеременно в разных редакторах, например в редакторе mc и vi в консоли, да ещё и в Notepad++, к примеру. Сам по себе факт работы в разных редакторах ни плох, ни хорош, но вот следствия бывают не очень приятными. Например, привычные сочетания клавиш под разными системами могут приводить к разной реакции. Одно из таких комбинаций CTRL+S. Во множестве десктопных редакторов, в особенности в Windows, такое сочетание зарезервировано для сохранения текущего документа, в редакторе mc это же самое сочетание клавиш включает и выключает подсветку кода.

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

Оказалось, что на самом деле CTRL+S включает режим XOFF, в котором терминал принимает нажатия клавиш, но не выводит в ответ ничего. Визуально кажется, что сессия умерла, но это не так. А если есть режим XOFF, то есть режим XON. Режим XON включается обратно при помощи CTRL+Q.

Вот так-то.

Внешние скрипты для проекта Django

Несколько раз сталкивался с ситуацией, когда удобнее использовать скрипт вне методов проекта models-views. При этом хочется использовать объявленные в models классы. При написании такого скрипта "в лоб", пытливый программисткий ум обычно лицезреет ошибку:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

Простой и не всегда удобный вариант,- добавить DJANGO_SETTINGS_MODULE в переменные окружения командной строки (умолчания для cmd.exe,- если в Windows или export в Linux\Unix). Ещё более короткий и переносимый способ,- сделать всё необходимое непосредственно в скрипте:

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

Имя myapp.settings,- это если скрипт лежит в папке на уровень выше, чем myapp/settings. Если в той-же папке,- то будет просто settings

wxPython в Windows7

Поставил portablePython для тестирования и разработки в недружественных корпоративных условиях (да-да, на моём рабочем компьютере у меня нет администраторских прав). При тестах простейшего графического приложения с использованием wxPython выявилась неприятная особенность,- при MouseOver над окном приложения puthon.exe тупо умирает. Думал,- какое-то событие неправильно обрабатывается, пробовал перехватывать,- результата не дало. Гугление показало, что проблема в версии Python,- в 2.5.x всё работает, а в ветке 2.6 ошибка проявляется. Обещают починить в 2.8.10. Пока откатился на 2.5.4.

PyLDAP: Авторизация в AD

Наткнулся на вредную багу при авторизации в ActiveDirectory: после успешного ldap.bind() получал ошибку "In order to perform this operation a successful bind must be completed on the connection". Решение нашлось в официальном FAQ python-ldap:

When searching from the domain level MS AD returns referrals (search continuations) for some objects to indicate to the client where to look for these objects. Client-chasing of referrals is a broken concept since LDAPv3 does not specify which credentials to use when chasing the referral. Windows clients are supposed to simply use their Windows credentials but this does not work in general when chasing referrals received from and pointing to arbitrary LDAP servers.
Therefore per default libldap automatically chases the referrals internally with an anonymous access which fails with MS AD.


Если по русски,- иногда AD-сервер возвращает ссылки на дополнительные сервера, на которых могут быть дополнительные результаты поиска. По умолчанию libldap пытается получить результаты с помощью анонимного доступа, в случае с Active Directory этот номер не проходит.
Решается добавлением l.set_option(ldap.OPT_REFERRALS,0) после ldap.initialize().


l = ldap.initialize('ldap://foobar')
l.set_option(ldap.OPT_REFERRALS,0)

Отображение файлов, к которым нет доступа

Вот интересно, неужели никому не приходило в голову:
есть Microsoft Windows во многопользовательском окружении, например, несколько пользователей на одном домашнем компьютере или компьютер в домене Active Directory корпоративной сети. Есть папки и файлы, которые принадлежат различным пользователям, а, в пограничных случаях, права доступа запрещают текущему пользователю даже чтение. Есть настройки папки (Сервис -> Свойства папки -> Вид), которые позволяют "скрывать защищённые системные файлы". Почему бы не сделать ещё одну настройку "Скрывать файлы, к которым нет доступа"? Вот хочется мне, чтобы система была user friendly. Ведь если я не могу прочитать файл,- зачем мне его показывать? Для полного удовольствия можно было бы ещё файлы, у которых права доступа позволяют "только чтение" тоже отображать каким-то цветом или дополнительной иконкой.

DHCP сервер для Windows

Понадобилось протестировать некоторый функционал в DHCP. К сожалению, под руками есть только ноутбук с Windows XP и тестируемое устройство,- а встроенный в XP DHCP сервер (aka Общий доступ к интернет),- вообще никак не настраивается. Расхваливаемый по всему рунету DHCP Turbo от Weird Solutions оказался редкостным убожеством,- сразу после установки даже не может запустить сервер без всяких видимых причин. Попытка запустить сервис руками через консоль управления,- стабильно заканчивается ошибкой: Неправильный дескриптор. Пришлось искать альтернативы. Альтернативой оказался великолепный опенсорсный DualServer:


DHCP Server DNS Server Open Source Freeware. Works as DHCP or DNS Server or both. Using both services adds DHCP allotted hosts automatically to DNS Server. Support Relay Agent, PXEBOOT, BOOTP, Zone Trasfer, DHCP Range Filters


Инсталлятор весит 400 Кб, по умолчанию устанавливается как сервис, GUI отсутствует, настраивается путём редактирования конфигурационного файла, может запускаться как консольная программ для тестирования. Поддерживает практически любые опции DHCP и имеет веб-интерфейс для просмотра выданных(DHCP active leases) и свободных(free dynamic leases) адресов.

Однозначно must have на флешке типа "переносной набор сисадмина"

утилиты GNU для Windows

GnuWin32 Почему-то в русском интернете мало используется весьма полезный пакет для Windows под названием GnuWin32. Проект GnuWin32 предоставляет набор популярных unix утилит, портированных на платформу Win32. Все утилиты предоставляются с лицензией GNU (или с аналогичными лицензиями open source) . Эти программы собраны с использованием стандартных 32-битных библиотек MS-Windows, таким образом они не зависят от каких-либо сторонних библиотек совместимости, например CygWin или Msys.

Компилируемый LISP для Win32

newLISP-icon-92Попросили найти реализацию LISP, которая позволяет компилировать программу в исполняемый .exe для Windows. После некоторых изысканий обнаружился NewLISP .

SIP в ActiveDirectory

Микрософт не чужд набирающего обороты направления VoIP: Office Communication Server (OCS) использует SIP и некоторые дополнительные параметры в ActiveDirectory для хранения настроек.

Geany - IDE для Linux

geany_main В поисках нормальной среды разработки для PHP под Linux обнаружил в стандартной поставке Ubuntu программу Geany. Оказалось достаточно удобно и для PHP и для постоянно используемого Python'а. Причём, работает и в Linux и в Windows (правда, требует GTK). По функционалу,- ничего лишнего и всё есть. Есть вкладки для консоли, стандартный Output, подсветка кода для множества языков и т.д. Есть и мелкие неприятности, но, в целом,- очень качественная IDE, рекомендую.

PyScripter: Редактор для питоновода


Понадобился качественный редактор для питона,- с подсветкой кода, автоматическим дополнением и прочими удобствами. Вообщем, не редактор, а полноценная IDE. Причём, для изначально враждебного окружения, т.е. под винду. Гугл выдал несколько ссылок на полезные форумы, где и нашлась ссылка на PyScripter. Программа не "без чудес",- сразу натолкнулся на проблему с поиском python25.dll,- но после прописания всех необходимых путей программа запустилась (надо признать, что версия Python 2.6 пока не поддерживается). На вид,- нормальная среда разработки, с окнами Output, CallStack, Watches, Breackpoints и т.д. Подсветка кода настраивается, настройки переносятся в ini-файле вместе с программой, например, на USB-флешке. Посмотрим, каково оно будет в работе.

Неудачники

В одном SNMP MIB-файле наткнулся на такой перл:


ucdSnmpAgent OBJECT IDENTIFIER ::= { ucdavis 250 }
hpux9 OBJECT IDENTIFIER ::= { ucdSnmpAgent 1 }
sunos4 OBJECT IDENTIFIER ::= { ucdSnmpAgent 2 }
solaris OBJECT IDENTIFIER ::= { ucdSnmpAgent 3 }
osf OBJECT IDENTIFIER ::= { ucdSnmpAgent 4 }
ultrix OBJECT IDENTIFIER ::= { ucdSnmpAgent 5 }
hpux10 OBJECT IDENTIFIER ::= { ucdSnmpAgent 6 }
netbsd1 OBJECT IDENTIFIER ::= { ucdSnmpAgent 7 }
freebsd OBJECT IDENTIFIER ::= { ucdSnmpAgent 8 }
irix OBJECT IDENTIFIER ::= { ucdSnmpAgent 9 }
linux OBJECT IDENTIFIER ::= { ucdSnmpAgent 10 }
bsdi OBJECT IDENTIFIER ::= { ucdSnmpAgent 11 }
openbsd OBJECT IDENTIFIER ::= { ucdSnmpAgent 12 }
win32 OBJECT IDENTIFIER ::= { ucdSnmpAgent 13 } -- unlucky
hpux11 OBJECT IDENTIFIER ::= { ucdSnmpAgent 14 }
unknown OBJECT IDENTIFIER ::= { ucdSnmpAgent 255 }




Что такое "не везёт" и как с ним бороться? ;-)

Настройка SSH авторизации с помощью ключей в Windows (PuTTY)


  1. С помощью PuttyGen сгенерировать приватный и публичный ssh-ключи - кнопка “Generate”. В настройках можно указать тип ключа и его размер. Примечание - при генерации ключа необходимо в произвольном порядке перемещать мышку в окне утилиты.

  2. После этого не заполняя поля Passphrase сохранить приватный ключ в файл с помощью кнопки “Save private key”, например private.key. Публичный ключ отображается в верхнем поле “Key” и имеет вид: “ssh-rsa AAAAB3NzaC1yc*что-то*uJQ== rsa-key-20090806“.

  3. Cохранить публичный ключ, например в файл rsa_pub.key, или скопировать содержимое публичного ключа в буфер обмена;

  4. Запустить ssh-клиент Putty и произвести коннект к нужному серверу.

  5. Попав на сервер, создать папку ~/.ssh (если такой ещё нет);

  6. Создать файл ~/.ssh/authorized_keys (если не существует);

  7. скопировать содержимое public.key в файл ~/.ssh/authorized_keys. ВАЖНО! Ключ в файле должен быть записан в одной строке без переносов.

  8. Изменить права доступа к файлу командой chmod 600 ~/.ssh/authorized_keys;

  9. Закрыть PuTTY;

  10. Запустить PuTTY. В настройках соединения указать путь к приватному ключу;

  11. Сохранить настройки соединения и произвести коннект к серверу. SSH-сервер запросит имя пользователя - ввести логин. Далее авторизация пройдет с использованием приватного и публичного ssh-ключей.