вторник, мая 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, но в ней не хватает такого описания, как мокирование статических методов как самостоятельных "единиц" в классе, так и в гибридном использовании, когда часть статических методов у класса мокируются, а часть вызываются реально. Попробую исправить эту нишу.

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

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

"местная" альтернатива killnotes.exe

С давним пор привык для "прибития" Lotus Notes использовать утилитку killnotes.exe

Но как-то наткнулся на прекрасную альтернативу внутри самого клиента - утилита NSD, которая служит для диагностики сбоев клиента.

просто запускаем её как "nsd.exe -kill" и готово - клиент прибит, библиотеки выгружены, в общем всё согласно документации:
"Runs NSD in a special mode that kills all Notes/Domino processes in the current "partition" (i.e. all processes that are accessing Notes shared memory and that are running from the same location as NSD). Output is limited to process lists (OS Process Table, and Notes Process Summary) and to status messages about the processes NSD forcefully terminated. The output log file follows the naming convention of kill_os_hostname_yyyy_mm_dd@hh_mm_ss.log and is saved to the data\IBM_TECHNICAL_SUPPORT directory."

ЗЫ: Если на рабочей станции запущен не только клиент Lotus Notes, но и сервер Lotus Domino, то сервер остаётся нетронутым.
ЗЫЫ: документация по NSD получается через "nsd.exe -help" :)

пятница, февраля 15

переход от Oracle к DB2. таблица DUAL

При переносе запросов все обращения к таблице "dual" требуется заменить на обращения к таблице "SYSIBM.SYSDUMMY1".

Например, у нас есть запрос:
SELECT mySchema.myFunction id FROM dual;

его требуется написать как
SELECT mySchema.myFunction id FROM SYSIBM.SYSDUMMY1;

Есть небольшое отступление. Если у вас логин пользователя совпадает с названием схемы, то подобное преобразование делать не обязательно. но это "грабли" в будущем :)

четверг, декабря 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-файлом:


четверг, сентября 6

быстрая вставка угловых кавычек в Firefox

Тут у друга возник вопрос, как в Firefox можно делать быструю вставку угловых кавычек в текст.

«В лоб» решения не подходят - слишком много клавиш нажимать надо, потому пойдём обходным путём - через «сторонние» плагины. В частности, через плагин BBCodeExtra, который я уже достаточно давно использую для быстрого форматирования текста на различных сайтах.

В данном плагине есть возможность добавления собственных команд, чем мы и воспользуемся.

  1. Заходим в настройки BBCodeExtra через контекстное меню
  2. Нажимаем кнопку «Добавить» и заполняем диалоговую форму так, как показано скриншоте ниже (Название пункта на ваше усмотрение ;) )
  3. сохраняем пользовательский тег
  4. Как воспользоваться. Выбираем слово, которое требуется обрамить в кавычки, и в контекстном меню кликаем нашу кнопку.
  5. В результате, выделенный текст обрамляется угловыми кавычками
  6. PROFIT


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

вторник, августа 21

[UPDATE] Debian. установка mysql server

Решил чуток обновить пост

1) устанавливаем сервер MySQL
#apt-get install mysql-client mysql-server

2) Выполняем bash-скрипт (исходник) с правами root. При выполнении запросится пароль от root-пользователя MySQL.
Скрипт избавляет нас от ошибки "Access denied for user ‘debian-sys-maint’@'localhost" и устанавливает кодировку UTF-8 по умолчанию


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

понедельник, мая 21

Linux tips. консолька и mkdir

Вот за что я люблю линуха, так это за то, что тут можно вытворять вот такие вот штуки:

# mkdir -p domain/{tmp,vhosts/{www,fish}/{public,php}}


результатом данной команды будут созданы директории:
domain/tmp
domain/vhosts/www/public
domain/vhosts/www/php
domain/vhosts/fish/public
domain/vhosts/fish/php


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

четверг, апреля 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 рублей автору. Спасибо!