barbitoff programmer`s blog

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

среда, 30 апреля 2014 г.

Excel: заголовки столбцов цифрами

Проблема: в книге Excel столбцы именуются цифрами вместо букв.
Решение (Excel 2010, англ.): File -> Options -> Formulas -> снять галочку "R1C1 reference style".

понедельник, 21 апреля 2014 г.

ActiveMQ 5.7.0 и JMX

Самый простой способ: идем в bin/activemq.bat, комментим:
if "%SUNJMX%" == "" set SUNJMX=-Dcom.sun.management.jmxremote
и раскомменчиваем:
set SUNJMX=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
Получаем JMX на порту 1099 без аутентификации.
Если нужна аутентификация, то настройка следующая:
if "%SUNJMX%" == "" set SUNJMX=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.access.file=%ACTIVEMQ_HOME%\conf\jmx.access -Dcom.sun.management.jmxremote.password.file=%ACTIVEMQ_HOME%\conf\jmx.password -Dcom.sun.management.jmxremote.ssl=false
Для файла %ACTIVEMQ_HOME%\conf\jmx.password нужно зайти в настройки безопасности и сделать так, чтобы единственным пользователем, имеющим доступ к этому файлу, был тот, из-под кого стартует ActiveMQ, иначе будет валится ошибка:
Password file read access must be restricted
(см. http://docs.oracle.com/javase/6/docs/technotes/guides/management/security-windows.html). 

пятница, 18 апреля 2014 г.

Spring Beans: свой bean вместо String

Проблема

В xml-конфиге спринговых бинов есть некий бин, принимающий аргументом конструктора строку:
<constructor-arg index="0">
<value>xxx</value>
</constructor-arg>
 Хочется эту строку формировать своим бином вместо хардкода ее в xml.

Решение

Первая идея - унаследоваться от String и заменить <value> на <bean class="my.super.Bean">. Но нет - java.lang.String объявлен как final. Следующая мысль - использовать конструктор класса String, принимающий StringBuilder, и опять таки переопределить SpringBuilder своим классом. Но снова неудача - java.lang.StringBuilder также является final. Но StringBuilder уже лучше String'а тем, что имеет конструктор, принимающий CharSequence. А это - уже интерфейс, и его можно свободно имплементировать, реализовав ту логику, которую нужно. В итоге получаем нечто подобное:
<constructor-arg index="0">
<bean class="java.lang.String">
<constructor-arg>
<bean class="java.lang.StringBuilder">
<constructor-arg>
<bean class="my.super.CharSequenceImpl">
<!-- ... -->
</bean>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
</constructor-arg>

Raphael: Paper.print() и шрифты

В Paper.print() используется шрифт, получаемый с помощью Paper.getFon():
var txt = r.print(10, 50, "print", r.getFont("Tahoma"), 30).attr({fill: "#fff"});
Проблема в том, что по-умолчанию доступных шрифтов нет вообще. Чтобы  тот же самый Tahoma стал доступен, его нужно сначала зарегистрировать вызовом Raphael.registerFont(). Возникает вопрос: откуда взять сам шрифт для регистрации? Ответ - его нужно куфонизировать из обычного ttf-шрифта (или otf и пр.), т.е. выполнить преобразование глифов шрифта в svg-шные path-ы. Сделать это можно с помощью онлайн-приложения http://cufon.shoqolate.com/generate/. Получаемый на выходе js-файл нужно немного подправить, заменив в нем объект Cufon, в котором регистрируется шрифт, на Raphael. После подключения данной js-ки шрифт можно использовать в getFont().

среда, 9 апреля 2014 г.

Wavemaker 6.5.3: аутентификация по Active Directory с использованием sAMAccountName

Проблема

Реализовать аутентификацию по Active Directory в приложении, построенном на Wavemaker 6.5.3, c использованием в качестве логина sAMAccountName.

Решение 

Через UI настройек безопасности поиск по sAMAccountName не организовать, т.к. там единственный вариант поиска пользователя - это userDnPattern:


Нам же нужно задать не шаблон для DN, а поиск по атрибуту sAMAccountName. Выход - идем Source -> Resources, в Folder Shortcuts выбираем "Project", там открываем файл WEB-INF/project-security.xml. В нем добавляем бин:
<bean id="userSearch"
       class="org.acegisecurity.ldap.search.FilterBasedLdapUserSearch">
   <constructor-arg index="0">
     <value>OU=Users</value>
   </constructor-arg>
   <constructor-arg index="1">
     <value>(sAMAccountName={0})</value>
   </constructor-arg>
   <constructor-arg index="2">
     <ref local="initialDirContextFactory"/>
   </constructor-arg>
   <property name="searchSubtree">
     <value>true</value>
   </property>
 </bean>
Первый аргумент конструктора нужно поправить в соответствие с базовым узлом для поиска по sAMAccountName. Базовый узел указывается относительно указанного в URL-е LDAP (в моем случае - относительно DC=my,DC=domain).
Далее необходимо исправить первый аргумент конструктора бина ldapAuthProvider с:
<constructor-arg>
<bean class="org.acegisecurity.providers.ldap.authenticator.BindAuthenticator">
<constructor-arg>
<ref local="initialDirContextFactory"/>
</constructor-arg>
<property name="userDnPatterns">
<list>
<value>cn={0},ou=Users</value>
</list>
</property>
</bean>
</constructor-arg>
на 
<constructor-arg>
<bean class="org.acegisecurity.providers.ldap.authenticator.BindAuthenticator">
<constructor-arg>
<ref local="initialDirContextFactory"/>
</constructor-arg>
<property name="userSearch">
<ref bean="userSearch"/>
</property>
</bean>
</constructor-arg>
Все, можно заходить в приложение по  sAMAccountName и паролю из AD.

PS Спасибо http://dev.wavemaker.com/forums/?q=node/7096

воскресенье, 6 апреля 2014 г.

Microsoft Word: не сохраняются горячие клавиши

Проблема

В Win Word 2010 перестали работать Ctrl-комбинации (Ctrl+C, Ctrl+V и пр.). Если зайти в Options --> Customize Ribbon --> Keyboard Shortcuts: Customize, и настроить их заново (для Ctrl+C и Ctrl+V, например, соотв. комманды называются EditCopy и EditPaste), то комбинации клавиш начинают работать, но до следующего перезапуска Word.

Причина

Куда-то пропал Normal.dotm из C:\Users\<XXX>\AppData\Roaming\Microsoft\Templates. А ведь все комбинации клавиш сохраняются именно туда (это видно в окне настройки комбинаций, где помимо Normal.dotm можно также выбрать в качестве места для сохранения текущий документ):


Решение

Создать новый файл, в нем выполнить настройку горячих клавиш, сохраняя изменения не в Normal.dotm, а в текущем документе. Сохранить документ как Normal.dotm в папке C:\Users\<XXX>\AppData\Roaming\Microsoft\Templates.