barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

вторник, 21 февраля 2012 г.

Orbeon: отличие xpath-функций instance() и xxforms:instance()

xxforms:instance() выбирает сущность по идентификатору также, как и стандартная функция instance() с той лишь разницей, что:
  1. Не учитывает область видимости, заданную текущей моделью (выбранной атрибутом "model")
  2. Осуществляет поиск в областях видимости вышестоящих XBL-компонентов
, в то время как instance() ищет только в текущей модели текущего компонента.

воскресенье, 19 февраля 2012 г.

cmd: массовое создание символических ссылок

Задача:
Есть папка, содержащая набор подпапок с jpg-файлами:
fldr1
     - subfldr1
          - 1.jpg
          - 2.jpg
     - subfldr2
          - 1.jpg
          - 2.jpg
...

     - subfldrN
          - 1.jpg
          - 2.jpg
Нужно в некоторой другой папке создать символические ссылки на все файлы всех подпапок папки fldr1 (имена символических ссылок непринципиальны).

Решение:
Следующий bat-ник принимает на вход 2 параметра: имя папки-источника и имя папки для создания символических ссылок (все имена без слешей в конце и с обратными слешами), и создает в последней символические ссылки с файлами 1.jpg .... m.jpg:

@echo off
SETLOCAL EnableDelayedExpansion
SET curdir=%CD%
SET cnt=0
FOR /F "tokens=*" %%i  IN ('dir %1 /b') DO (
FOR /F "tokens=*" %%f  IN ('dir "%1\%%i" /b') DO ( mklink %2\!cnt!.jpg  "%1\%%i\%%f"
SET /a cnt+=1 )
)
pause
Очень полезно с учетом того, что ротатор обоев в Windows 7 не умеет смотреть в подпапки выбранной папки, поэтому, чтобы в ротации участвовали обои из разных подпапок одной папки, нужно сгрузить символические ссылки на них в какую-нибудь одну папку.

bat-ники: изменение переменных в цикле FOR

Если просто попробовать изменять переменную в теле FOR и выводить её на экран, то получим обескураживающий результат: переменная не меняет свое значение внутри цикла, хотя по выходу из него принимает корректное значение, т.е. при выполнении кода:
SET cnt=1
FOR /F "tokens=*" %%f  IN ('dir "%1" /b') DO ( echo %cnt%
SET /a cnt+=1 )
echo Total: %cnt%
получим результат наподобие:
1
1
1
....
1
Total:  285
Для того, чтобы в теле цикла виделось актуальное значение переменной, необходимо использовать SETLOCAL EnableDelayedExpansion, а значение переменной получать, обрамляя её имя не в "%", а в "!":
SETLOCAL EnableDelayedExpansion
FOR /F "tokens=*" %%f  IN ('dir "%1" /b') DO ( echo !cnt!
SET /a cnt+=1 )
echo !cnt!
Теперь вывод будет корректен:
1
2
...
284
Total: 285

суббота, 18 февраля 2012 г.

Синхронизация папок в Windows

Для синхронизации есть утилитка от Microsoft под названием SyncToy. Раньше пользовался vuBrief, он в целом пофункциональнее, но дружелебность его интерфейса явно хромает, а для моих целей (просто синхронизации папок на HDD и флехе) хватило и мелокомягкого творения, благо оно бесплатно. Обзор этой программки есть на текнете: http://technet.microsoft.com/ru-ru/magazine/2007.03.utilityspotlight.aspx. По моим ощущения она работает помедленнее vuBrief, но все равно скорость работы вполне приемлемая: на поиск изменений в синхронизируемых папках объемом 4Гб с 12к файлов (одна - на винте, вторая - на шустрой флешке) уходит около 20 сек.

пятница, 17 февраля 2012 г.

Windows 7: Добавление ещё одной Windows 7 в меню загрузки

Из-под админа:

  1. bcdedit /export D:\bcd.bak -- делаем бэкап BCD
  2. bcdedit /copy {current} /d "My old win7"
  3. bcdedit /set {хххххххх-хххх-хххх-хххх-хххххххххххх} device partition=X:
  4. bcdedit /set {хххххххх-хххх-хххх-хххх-хххххххххххх} osdevice partition=X:
  5. bcdedit /displayorder {хххххххх-хххх-хххх-хххх-хххххххххххх} /addlast
, где X: - буква раздела, на котором установлена винда, запись для загрузки которой нужно добавить, а {хххххххх-хххх-хххх-хххх-хххххххххххх} - номер, выведенный в консоль после выполнения bcdedit /copy.
Подробнее про bcdedit написано тут: http://www.oszone.net/10998/Edit_Boot_Menu

Восстановление пароля root в OpenSUSE

При появлении загрузчика Grub дописываем опцию загрузки init=/bin/bash, после загрузки выполняем passwd и меняем пароль. Перезагружаемся как обычно.

вторник, 14 февраля 2012 г.

Аналог GROUP_CONCAT из MySQL для PostgreSQL

Агрегатная функция GROUP_CONCAT, которая в MySQL позволяет объединять строковые ячейки разных строк, не имеет прямого аналога в postgres, однако можно сделать тоже самое, используя ARRAY_TO_STRING:
SELECT ARRAY_TO_STRING(ARRAY(SELECT "colToAggregate" FROM "myTable"),',') 
Такой вызов объединит все значения колонки "colToAggregate" из таблицы "myTable" через запятую.