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

вторник, мая 10

Выбор symlink-файла в JetBrains IDE на MacOS

Меня тут в русскоязычном Slack по Golang навели на полезный хак под Mac. Точнее как - сперва я столкнулся с тем, что Mac в FileChooser вместо выбора symlink-файла, отдаёт файл, куда фактически ссылается. Боль. Настройка "native.mac.file.chooser.enabled" в properties файле не взлетела, да и при отключении нативного диалога получается уродство какое-то - надо IDE перезапускать В общем хак такой:
  1. Перед тем, как выбрать symlink-файл, идём в "Help | Find actions..."
  2. Там находим "Registry..."
  3. Снимаем галочку у "ide.mac.file.chooser.native" (только не забудьте сперва отсортировать по колонке key - ключи там непойми как отсортированы)
  4. Выбираем в IDE symlink-файл
  5. Снова идём в Registry и включаем параметр обратно
  6. Profit
и да, IDE перезапускать не надо - диалоги меняются "на лету"

суббота, июля 5

AspectJ и Java8

Блин, стоило добавить в код Stream-синтаксис из Java8 и чуточку Lambda-кода, как AspectJ свалился в SOE при компиляции :(


---- AspectJ Properties ---
AspectJ Compiler 1.8.0 built on Thursday Apr 17, 2014 at 20:04:16 GMT
---- Dump Properties ---
Dump file: ajcore.20140705.182145.679.txt
Dump reason: java.lang.StackOverflowError
Dump on exception: true
Dump at exit condition: abort
---- Exception Information ---
java.lang.StackOverflowError
at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding.substituteInferenceVariable(ParameterizedTypeBinding.java:851)
at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding.substituteInferenceVariable(ParameterizedTypeBinding.java:856)
... ещё несколько десятков строчек подобной выше

вторник, июля 1

"Лишние" зависимости SLF4J

При запуске тестов в лог выходит нечто подобное:

Configuring TestNG with: TestNG652Configurator
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/.../.m2/repository/org/slf4j/slf4j-log4j12/1.7.7/slf4j-log4j12-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/.../.m2/repository/org/slf4j/slf4j-jdk14/1.7.5/slf4j-jdk14-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/.../.m2/repository/ch/qos/logback/logback-classic/0.9.9/logback-classic-0.9.9.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See [url]http://www.slf4j.org/codes.html#multiple_bindings[/url] for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]


В этом случае, согласно документации, нужно просто найти и исключить "лишние" зависимости.

У меня ими оказались org.slf4j:slf4j-jdk14 и ch.qos.logback:logback-classic - у обеих библиотек была зависимость уровня runtime.
Удалил так: http://pastebin.com/uDeUnp7m

четверг, декабря 12

Пишем плагин для Maven

статья на хабре

Spring и обработка событий в Hibernate

Полная статья доступна на habrahabr.ru
Как-то обделена на хабре такая тема, как обработка событий при работе с сущностями с использованием Hibernate - я смог найти только один пост уже почти мохнатого года. Но то аудит, а нам нужна возможность автоматизировать работу с некоторыми атрибутами сущностей и при этом упростить процедуру работы с ними.

понедельник, июля 8

PowerMock(+Mockito) +TestNG и мокинг статических классов/методов

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

полная статья на хабре

четверг, декабря 27

maven dependency. include scope

в документации к maven-dependency-plugin для copy-dependencies описан параметр includeScope, позволяющий указать какие зависимости копировать. но параметр принимает только одно указание scope. А что делать, если требуется указать несколько?
Всё просто - указывает несколько раз параметр includeScope.

например так:
<plugin>
 <artifactId>maven-dependency-plugin</artifactId>
 <executions>
  <execution>
   <id>copy-dependencies</id>
   <goals><goal>copy-dependencies</goal></goals>
   <configuration>
    <includeScope>system</includeScope>
    <includeScope>compile</includeScope>
   </configuration>
  </execution>
 </executions>
</plugin>

Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

суббота, декабря 22

Lotus. Динамический импорт RT-поля в открытый UI-документ

Для вставки внешних файлов в UI есть @-формула "@Command( [EditInsertFileAttachment])". Но бывает потребность вставить в UI через LotusScript вложения из RT-поля другого документа без сохранения и переоткрытия документа.

Вот для этого нам и пригодится недокументированный метод includeItem у класса NotesUiDocument.
Синтаксис метода: NotesUiDocument.includeItem(doc as NotesDocument, FieldName As String) *
* Применяется к текущему полю

Два варианта применения:
1) импорт файлов в уже открытом документе из другого документа
2) импорт файлов в новый документ без его предварительного сохранения.

Во вложенном файле приведены оба примера.
Первый пример в виде кнопки "Insert other document" на форме
Второй пример в виде кнопки "Create & Import" в представлении

файл-пример БД: скачать

UPD:
метод доступен начиная с версии 8.5. Если нужна поддержка версии ниже, то пример тут

Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

среда, сентября 26

Безопасность Firefox для локальных JS-скриптов

Периодически приходится открывать локально демо-страницы с JS-фреймворками типа Ext.JS или Dojo. При этом, кажется, что код на странице почему-то не хочет работать:


Но всё дело в параметре security.fileuri.strict_origin_policy, который запрещает подгрузку сторонних файлов на HTML-странице.
выставим значение параметра в false на странице настроек и обновим закладку с открытым локально HTML-файлом:


четверг, апреля 19

Lotus Script. фичи

Обнаружился довольно интересный глюк в скрипте - метод Getdocumentbykey у NotesView "изменяет" значение передаваемого ключа, если ключ типа Variant (при строгой типизации такого не происходит).

пример:

Dim ses As New NotesSession
Dim view As NotesView
Dim doc As notesdocument
Dim num As Variant

Set view = ses.currentdatabase.Getview("XXX")
num = "50000001"
Print "1: " & num ' Выведет 50000001
num = clng(num)
Print "2: " & num ' Выведет 50000001
Set doc = view.Getdocumentbykey(num, True)
Print "3: " & num ' Выведет 134217728


Теперь немного видоизменим программный код, приведя к Long переменную:


Dim ses As New NotesSession
Dim view As NotesView
Dim doc As notesdocument
Dim num As Long

Set view = ses.currentdatabase.Getview("XXX")
num = 50000001
Print "1: " & num ' Выведет 50000001
num = clng(num)
Print "2: " & num ' Выведет 50000001
Set doc = view.Getdocumentbykey(num, True)
Print "3: " & num ' Выведет 50000001

А теперь изменим тип только в вызове метода getDocumentByKey:

Dim ses As New NotesSession
Dim view As NotesView
Dim doc As notesdocument
Dim num As Variant

Set view = ses.currentdatabase.Getview("XXX")
num = 50000001
Print "1: " & num ' Выведет 50000001
num = clng(num)
Print "2: " & num ' Выведет 50000001
Set doc = view.Getdocumentbykey(CLng(num), True)
Print "3: " & num ' Выведет 50000001

отсюда вывод: использовать тип Variant конечно удобно, но это как хождение по минному полю - путь короче, но не знаешь где рванёт ;)

ЗЫ: клиент Standard 8.5.3FP1



Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

понедельник, декабря 5

Lotus @-формулы. задачки

Имеем на входе представление с 3-мя колонками:
1) список А (например пользователей)
2) список Б (например ролей)
3) список В (отношение пользователь-роль)

Задача: Выбрать уникальные роли из колонки Б, которые есть у всех пользователей из колонки А. При этом, если роль не встречается хотя бы у одного пользователя, то её отбрасываем.

в итоге родилось вот такое вот решение на @-формулах (переменные list, roles и users как бы результат выборки из представления):

list := "User1~role1":"User2~role3":"User2~role1":"User3~role1":"User3~role3":"User4~role1":"User4~role2";
roles:="role1":"role2":"role3";
users := "User1":"User2":"User3":"User4";

t0:=users*+"~"*+roles;
t1:=@Replace(t0; list; "");
t2:=@Explode(t1; "~");
t3:=@Replace(t2; roles; "");
t4:=@Unique(@Replace(t2; t3; ""));
result := @Unique(@Replace(roles; t4; ""));
result

Результат вычисления: role1


А теперь по порядку распишу каждую строчку:

создаём все возможные пересечения пользователь~роль
t0:=users*+"~"*+roles;
User1~role1
User1~role2
User1~role3
User2~role1
User2~role2
User2~role3
User3~role1
User3~role2
User3~role3
User4~role1
User4~role2
User4~role3

удаляем все пересечения, которые уже есть в list:
t1:=@Replace(t0; list; "");
User1~role2
User1~role3
User2~role2
User3~role2
User4~role3

Преобразуем список t1 в список с пользователями и ролями отдельно в каждой "строке"
t2:=@Explode(t1; "~");
User1
role2
User1
role3
User2
role2
User3
role2
User4
role3

удаляем из списка t2 все роли, оставляя только пользователей
t3:=@Replace(t2; roles; "");
User1
User1
User2
User3
User4

А теперь из списка t2 удаляем всех пользователей, полученных в списке t3. Тем самым мы получаем роли, которые не упоминались у каждого из пользователя в списке users
t4:=@Unique(@Replace(t2; t3; ""));
role2
role3

ну и завершающий аккорд - "инвертирование" списка t4, оставляя только те роли из списка roles, которые не попали в t4
result := @Unique(@Replace(roles; t4; ""));
role1



UPD: Формулу можно сократить и привести к следующей:


t0:=users*+"~"*+roles;
t1:=@Replace(t0; list; "");
t2:=@Unique(@Right(t1;"~"));
result := @Trim(@Unique(@Replace(roles; t2; "")));
result

пятница, июля 22

суббота, марта 26

JSP и вывод таблиц с "отсутствующими" строками

написание поста навеяно следующим комментарием:
на практике часто возникает задача отображать данные в виде списка или таблицы, но случай, когда данных нет, требуется обрабатывать особо. Например, в случае с Java и JSTL код темплейта оказывается весьма тяжеловесным, и я, признаться, не встречал особенно выдающихся альтернатив

Приведу как минимум 2 примера, на вскидку, для решения вышеозвученной "проблемы".

Исходные данные:
<java>
Class Row{
private int id;
private String text;
... вырезанные getters & setters ...
}

List rows; // Количество элементов от 0 до n
</java>

Способ первый: "прямой" вывод данных с помощью смеси JSTL+HTML
<jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<table>
 <thead>
  <tr>
   <th>id</th>
   <th>text</th>
  <tr>
 </thead>
 <tbody>
  <c:choose>
   <c:when test="${fn:length(rows)>0}">
    <c:forEach var="row" items="${rows}">
     <tr>
      <td>${row.id}</td>
      <td>${row.text}</td>
     </tr>
    </c:forEach>
   </c:when>
   <c:otherwise>
    <tr>
     <td colspan="2">Нет данных для вывода</td>
    </tr>
   </c:otherwise>
  </c:choose>
 </tbody>
</table>
</jsp>

Способ второй: с помощью DisplayTag
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://displaytag.sf.net" prefix="display"%>
<display:setProperty name="basic.empty.showtable" value="true"/>
<display:setProperty name="basic.msg.empty_list" value="Нет данных для вывода"/>
<display:table name="rows">
 <display:column property="id" />
 <display:column property="text" />
</display:table>



Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

четверг, марта 17

Lotus Notes/Domino & XStream

Настройка Lotus Domino для работы с библиотекой XStream.

1) копируем файлы xstream-{version}.jar и xpp3_min-{version}.jar (это на тот случай, если вместо DomDriver вы хотите использовать XppDriver) в каталог {DOMINO_BIN}/jvm/lib/ext
2) в файле {DOMINO_BIN}/jvm/security/java.policy в блоке "grant" дописываем строку (не наступите на грабли) :
grant { ... permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; }
3) перезагружаете сервер Lotus Domino

Для возможности использования подсказок в Lotus Domino Designer на базе Eclipse, потребуется положить библиотеки и на рабочей станции разработчика в каталог {NOTES_BIN}/jvm/lib/ext и перезапустить клиента

ЗЫ: Если что-то настроено неправильно, то в логах буду сыпаться сообщения похожие на это:
... Agent error: java.lang.ExceptionInInitializerError: Cannot access defaults field of Properties Agent error: java.lang.NoClassDefFoundError: com.thoughtworks.xstream.converters.collections.PropertiesConverter (initialization failure) Agent error: at java.lang.J9VMInternals.initialize(J9VMInternals.java:140) Agent error: at com.thoughtworks.xstream.XStream.setupConverters(XStream.java:647) Agent error: at com.thoughtworks.xstream.XStream.(XStream.java:445) Agent error: at com.thoughtworks.xstream.XStream.(XStream.java:385) Agent error: at com.thoughtworks.xstream.XStream.(XStream.java:342) ...

ЗЫЫ: при разработке под Lotus Domino 8.x уже можно использоваться аннотации (в eclipse-based редакторе, при сохранении, будет предложено повысить версию java-проекта до 1.5 для компиляции)


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

понедельник, сентября 6

Zend Studio и поддержка Ant-скриптов. Продолжение

Как выясняется, мало включить поддержку Ant, так надо ещё и JVM поменять для выполнения Ant-скриптов, чтобы не получать UnsupportedClassVersionError.

По-умолчанию Zend Studio (проверял на 7.2.1) использует JRE 1.5.0_08 и при при запуске Ant-скриптов на задачах, связанных с SSH, получаем UnsupportedClassVersionError
Решается очень просто:

1) Включается поддержка Java
1.1) Открываем диалог создания нового проекта "File > New > Other..."
1.2) В диалоге ставим галочку на "Show All Wizards", если она не стоит (у меня так её и вовсе уже почему-то нет) и жмём Next
1.3) в диалоге "Confirm Enablement" нажимаем "OK", чтобы включить поддержку Java
1.4) Закрываем диалог создания проекта
2) В настройках в разделе "Java > Installed JREs" добавляем путь до нужной нам версии JRE и ставим возле неё галочку

ЗЫ: перезагружать Zend Studio не обязательно
ЗЫЫ: пробовал поменять VM для Zend Studio на 1.6, но IDE начала зависать на некоторых диалогах, да и для ant-скриптов всё равно использовала свою JRE, а не указанную через ZendStudio.ini





Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!