- Перед тем, как выбрать symlink-файл, идём в "Help | Find actions..."
- Там находим "Registry..."
- Снимаем галочку у "ide.mac.file.chooser.native" (только не забудьте сперва отсортировать по колонке key - ключи там непойми как отсортированы)
- Выбираем в IDE symlink-файл
- Снова идём в Registry и включаем параметр обратно
- Profit
Показаны сообщения с ярлыком Development (Разработка). Показать все сообщения
Показаны сообщения с ярлыком Development (Разработка). Показать все сообщения
вторник, мая 10
Выбор symlink-файла в JetBrains IDE на MacOS
Меня тут в русскоязычном Slack по Golang навели на полезный хак под Mac. Точнее как - сперва я столкнулся с тем, что Mac в FileChooser вместо выбора symlink-файла, отдаёт файл, куда фактически ссылается. Боль.
Настройка "native.mac.file.chooser.enabled" в properties файле не взлетела, да и при отключении нативного диалога получается уродство какое-то - надо IDE перезапускать
В общем хак такой:
пятница, августа 29
среда, июля 16
суббота, июля 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
При запуске тестов в лог выходит нечто подобное:
В этом случае, согласно документации, нужно просто найти и исключить "лишние" зависимости.
У меня ими оказались org.slf4j:slf4j-jdk14 и ch.qos.logback:logback-classic - у обеих библиотек была зависимость уровня runtime.
Удалил так: http://pastebin.com/uDeUnp7m
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
понедельник, мая 26
четверг, апреля 3
четверг, декабря 12
Spring и обработка событий в Hibernate
Полная статья доступна на habrahabr.ru
Как-то обделена на хабре такая тема, как обработка событий при работе с сущностями с использованием Hibernate - я смог найти только один пост уже почти мохнатого года. Но то аудит, а нам нужна возможность автоматизировать работу с некоторыми атрибутами сущностей и при этом упростить процедуру работы с ними.
понедельник, июля 8
PowerMock(+Mockito) +TestNG и мокинг статических классов/методов
На хабре уже была статья с примерами использования PowerMock, но в ней не хватает такого описания, как мокирование статических методов как самостоятельных "единиц" в классе, так и в гибридном использовании, когда часть статических методов у класса мокируются, а часть вызываются реально. Попробую исправить эту нишу.
полная статья на хабре
полная статья на хабре
воскресенье, января 6
четверг, декабря 27
maven dependency. include scope
в документации к maven-dependency-plugin для copy-dependencies описан параметр includeScope, позволяющий указать какие зависимости копировать. но параметр принимает только одно указание scope. А что делать, если требуется указать несколько?
Всё просто - указывает несколько раз параметр includeScope.
например так:
Всё просто - указывает несколько раз параметр 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. Если нужна поддержка версии ниже, то пример тут
Вот для этого нам и пригодится недокументированный метод 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-файлом:


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

четверг, апреля 19
Lotus Script. фичи
Обнаружился довольно интересный глюк в скрипте - метод Getdocumentbykey у NotesView "изменяет" значение передаваемого ключа, если ключ типа Variant (при строгой типизации такого не происходит).
пример:
Теперь немного видоизменим программный код, приведя к Long переменную:
А теперь изменим тип только в вызове метода getDocumentByKey:
отсюда вывод: использовать тип Variant конечно удобно, но это как хождение по минному полю - путь короче, но не знаешь где рванёт ;)
ЗЫ: клиент Standard 8.5.3FP1
пример:
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 как бы результат выборки из представления):
Результат вычисления: role1
А теперь по порядку распишу каждую строчку:
создаём все возможные пересечения пользователь~роль
удаляем все пересечения, которые уже есть в list:
Преобразуем список t1 в список с пользователями и ролями отдельно в каждой "строке"
удаляем из списка t2 все роли, оставляя только пользователей
А теперь из списка t2 удаляем всех пользователей, полученных в списке t3. Тем самым мы получаем роли, которые не упоминались у каждого из пользователя в списке users
ну и завершающий аккорд - "инвертирование" списка t4, оставляя только те роли из списка roles, которые не попали в t4
UPD: Формулу можно сократить и привести к следующей:
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
вышел Notes/Domino 8.5.2 Fix Packs 3
а 18-го числа сего месяца IBM выпустила фикспак, почитать про который можно тут, а скачать тут.
Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!
суббота, марта 26
JSP и вывод таблиц с "отсутствующими" строками
написание поста навеяно следующим комментарием:
Приведу как минимум 2 примера, на вскидку, для решения вышеозвученной "проблемы".
Исходные данные:
Способ первый: "прямой" вывод данных с помощью смеси JSTL+HTML
Способ второй: с помощью DisplayTag
на практике часто возникает задача отображать данные в виде списка или таблицы, но случай, когда данных нет, требуется обрабатывать особо. Например, в случае с 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" дописываем строку (не наступите на грабли) :
Для возможности использования подсказок в Lotus Domino Designer на базе Eclipse, потребуется положить библиотеки и на рабочей станции разработчика в каталог {NOTES_BIN}/jvm/lib/ext и перезапустить клиента
ЗЫ: Если что-то настроено неправильно, то в логах буду сыпаться сообщения похожие на это:
ЗЫЫ: при разработке под Lotus Domino 8.x уже можно использоваться аннотации (в eclipse-based редакторе, при сохранении, будет предложено повысить версию java-проекта до 1.5 для компиляции)
1) копируем файлы xstream-{version}.jar и xpp3_min-{version}.jar (это на тот случай, если вместо DomDriver вы хотите использовать XppDriver) в каталог {DOMINO_BIN}/jvm/lib/ext
2) в файле {DOMINO_BIN}/jvm/security/java.policy в блоке "grant" дописываем строку (не наступите на грабли) :
3) перезагружаете сервер Lotus Dominogrant { ... permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; }
Для возможности использования подсказок в 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


По-умолчанию 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 рублей автору. Спасибо!
Подписаться на:
Сообщения (Atom)


