barbitoff programmer`s blog

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

вторник, 30 июля 2013 г.

Яндекс.Диск на Debian Squeeze

Яндекс.Диск цепляется к Debian с помощью davfs, поэтому для начала делаем:
apt-get install davfs2
Затем соотв. запись вносится в /etc/fstab (после создания папки /mnt/yandex):
https://webdav.yandex.ru   /mnt/yandex   davfs   rw,users,noauto   0   0
noauto ставится для того, чтобы файловая система не монтировалась автоматом, т.к. на момент монтирования файловых систем при загрузке сеть еще не досутпна.
После этого монтирование можно производить с помощью:
mount /mnt/yandex
Чтобы каждый раз не запрашивался логин и пароль, их можно занести в ~/.davfs2/secrets либо в /etc/davfs2/secrets:
/mnt/yandex username@ya.ru passW0rd
Спасибо http://dog-simpson.blogspot.ru/2012/05/google-drive-debian.html.
PS Собственно зачем мне понадобился Яндекс.Диск на Debian: я настроил Apache2 таким образом, чтобы он смотрел в одну из подпапок /mnt/yandex, и теперь я могу обновлять сайтик, крутящийся на Apache, откуда угодно, даже со сматрфона. Конечно не продакшн-решение, но в тестовых целях - вполне.

CSS 3: маркированный список с маркерами-"галочками"

Т.к. в значениях для css-свойства "list-style-type" маркера-"галочки" нет (http://htmlbook.ru/css/list-style-type), задача решается не совсем тривиально:
ul {
    list-style: none;
}
ul li {
    position: relative;
}
ul li:after {
    content: '\2714';
    position: absolute;
    top: -3px;
    left: -15px;
}

пятница, 19 июля 2013 г.

jaxws-maven-plugin 2.2.1 и сборка в папке с пробелами в абсолютном пути

Проблема

В maven-проекте используется jaxws-maven-plugin для генерации кода по wsdl. Проект собирается под Win. Если в папке, в которой выполняется сборка, есть пробелы в абсолютном пути, при выполнении плагина валится ошибка:
[INFO] jaxws:wsimport args: [-keep, -s, C:\some path with\spaces\target\generated-sources\jaxws-wsi
mport, -d, C:\some path with\spaces\target\classes, -verbose, -encoding, UTF-8, -extension, -Xnocom
pile, -catalog, C:\some path with\spaces\src\jax-ws-catalog.xml, file:/C:/some%20path%20with/spaces/src/wsdl/My.wsdl]
directory not found: C:\some
Usage: wsimport [options] <WSDL_URI>

Причина

Похоже на баг в версии 2.2.1, с версией 2.2 все проходит ок. Однако, в версии 2.2 есть проблема при сборке на java 6, о которой я писал раньше.

четверг, 18 июля 2013 г.

Oracle: "SELECT ... INTO ..." и ошибка "No data found"

В случае, если есть вероятность, что запрос, используемый в SELECT ... INTO ..., не вернет строк, можно либо указать обработчик исключения, либо воспользоваться следующей конструкцией, которая в случае, если запрос не вернет строк, запишет NULL в переменную my_var:
SELECT (SELECT some_field FROM some_table WHERE <some_condition>) INTO my_var FROM dual

validate-медиатор на WSO2ESB 4.5.1 и MTOM: NullPointerException

Проблема:

При валидации сообщения с помощью медиатора <validate>  в случае, когда сообщение содержит MTOM-оптимизированное вложение, валится исключение:
java.lang.NullPointerException
at org.apache.axiom.om.impl.llom.OMTextImpl.getTextCharacters(OMTextImpl.java:272)
at org.apache.axiom.om.impl.serialize.OMXMLReader.generateEvents(OMXMLReader.java:284)
at org.apache.axiom.om.impl.serialize.OMXMLReader.generateEvents(OMXMLReader.java:254)
at org.apache.axiom.om.impl.serialize.OMXMLReader.generateEvents(OMXMLReader.java:251)
at org.apache.axiom.om.impl.serialize.OMXMLReader.parse(OMXMLReader.java:171)
at org.apache.axiom.om.impl.serialize.OMXMLReader.parse(OMXMLReader.java:161)
at org.apache.xerces.jaxp.validation.ValidatorHandlerImpl.validate(Unknown Source)
at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
at javax.xml.validation.Validator.validate(Unknown Source)
at org.apache.synapse.mediators.builtin.ValidateMediator.mediate(ValidateMediator.java:180)
at ...
at java.lang.Thread.run(Thread.java:722)
Причина:

Это известная проблема библиотеки Axiom, есть соотв. баг на баг-трекере (https://issues.apache.org/jira/browse/AXIOM-442), который исправлен в версии 1.2.14, тогда как в WSO2 ESB 4.5.1 используется версия 1.2.11.

воскресенье, 14 июля 2013 г.

Как запретить изменять размер textarea в Firefox / Chrome

Firefox / Chrome позволяют изменять размер <textarea>, потянув за нижний правый угол. Это не всегда удобно и может ломать дизайн сайта, в таких случаях нужно отключить такое поведение с помощью css-свойства resize:
textarea {
    resize: none;
    }

вторник, 9 июля 2013 г.

MS Word: 2010 разная ориентация для разных страниц документа

Если просто менять ориентацию страницы через Page Layout --> Orientation, она меняется у всего документа сразу. Чтобы действие применялось только к текущей странице, нужно перед ней (и после неё) вставить "Next Page" с помощью Page Layout --> Breaks --> Next Page.

суббота, 6 июля 2013 г.

Weblogic 10.3.5: connection pooling в веб-приложении

Когда-то давно писал об организации connection pool'а в веб-приложении, разворачиваемом на Tomcat 6, на этот же раз возникла необходимость в аналогичном решении для Weblogic 10.3.5.
Ниже описан случай, когда WAR-ник деплоится в составе EAR-ника.
Во-первых, необходимо создать в EAR-нике xml-файл с конфигурацией пула. Поместить его в принципе можно где угодно, я разместил в META-INF/datasources/ и назвал mydb-jdbc.xml. Содержимое у него примерно следующее (на примере Oracle):
<jdbc-data-source xsi:schemaLocation="http://www.bea.com/ns/weblogic/90/domain.xsd"
 xmlns="http://xmlns.oracle.com/weblogic/jdbc-data-source"
 xmlns:sec="http://www.bea.com/ns/weblogic/90/security"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:wls="http://www.bea.com/ns/weblogic/90/security/wls">
  <name>mydb-datasource</name>
  <jdbc-driver-params>
    <url>jdbc:oracle:thin:@//db_host:db_port/db_servicename</url>
    <driver-name>oracle.jdbc.OracleDriver</driver-name>
    <properties>
      <property>
        <name>user</name>
        <value>*****</value>
      </property>
      <property>
        <name>password</name>
        <value>*****</value>
      </property>
    </properties>
  </jdbc-driver-params>
  <jdbc-connection-pool-params>
    <max-capacity>20</max-capacity>
    <connection-reserve-timeout-seconds>25</connection-reserve-timeout-seconds>
    <test-table-name>SQL SELECT 1 FROM DUAL</test-table-name>
  </jdbc-connection-pool-params>
</jdbc-data-source>
Тут в целом все достаточно очевидно. 
После создания данного файла нужно добавить ссылку на него в дескриптор приложения (META-INF/weblogic-application.xml в EAR-нике):
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://xmlns.oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_5.xsd http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.0/weblogic-application.xsd">
  <module>
    <name>mydb-datasource-module</name>
    <type>JDBC</type>
    <path>META-INF/datasources/mydb-jdbc.xml</path>
  </module>
</weblogic-application>
Теперь осталось лишь в web.xml WAR-ника, входящего в EAR, добавить ссылку на соотв. ресурс:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <!-... -->
  <resource-ref>
    <res-ref-name>mydb-datasource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>
Все, теперь в коде WAR-ника коннекты к БД получаются так:
    InitialContext ctx = new InitialContext();
    javax.sql.DataSource ds =
            (javax.sql.DataSource) ctx.lookup("java:comp/env/mydb-datasource");
    conn = ds.getConnection();


Деплой EAR на Weblogic 10.3.5: Filtering class loader configuration ignored for web module

Проблема

Есть enterprise-приложение, содержащее внутри WAR-ник. При деплое EAR-ника на Weblogic 10.3.5 в логах появляется warning:
<Warning> <HTTP> <BEA-101377> <Filtering class loader configuration ignored for web module ***.war of application ***>
Помимо этого, почему-то игнорируются <prefer-application-packages> из weblogic.xml, размещенного в /WEB-INF WAR-ника.

Причина

Конфигурация фильтрующего загрузчика классов должна размещаться в дескрипторе основного  развертываемого артефакта (weblogic-application.xml в EAR-нике), а не в weblogic.xml WAR-ника (http://docs.oracle.com/cd/E24329_01/doc.1211/e26117/chapter_bea_messages.htm).

Решение

Перенести настройку фильтрации классов в weblogic-application.xml EAR-ника.


Weblogic 10.3.5 + Netbeans 7.3: WSP_1018_POLICY_EXCEPTION_WHILE_FINISHING_PARSING_WSDL

Проблема:

В Netbeans 7.3 создано веб-приложение, содержащее веб-сервис (который создавался с помощью соотв. мастера) и собираемое maven-ом. При развертывании приложения на Wevlogic 10.3.5 валится исключение:
weblogic.application.ModuleException: ...
...
javax.xml.ws.WebServiceException: [failed to localize] WSP_1018_POLICY_EXCEPTION_WHILE_FINISHING_PARSING_WSDL()
...
Caused by: com.sun.xml.ws.policy.PolicyException:[failed to localize] WSP_1014_POLICY_REFERENCE_DOES_NOT_EXIST
...
Причина:

Netbeans включил в pom-ку приложения зависимость webservices-rt как compile, в то время как Weblogic имеет свою имплеменацию jax-ws. Именно наличие в CLASSPATH двух имплементаций приводит к данной ошибке (я правда не понял почему именно, но не суть).

Решение:

Изменить scope зависимости webservices-rt на provided:
    <dependency>
      <groupId>com.sun.xml.ws</groupId>
      <artifactId>webservices-rt</artifactId>
      <version>1.4</version>
      <scope>provided</scope>
    </dependency>
Спасибо http://relativelyprime.blogspot.ru/2010/05/netbeans-68-weblogic-1033-and-jax-ws.html