понедельник, декабря 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

суббота, ноября 5

Sony Ericsson Xperia Active и удаление McAfee Security

По умолчанию, в комплекте предоставляется trial-версия антивируса, который или нужно оплатить (30 баксов) или же удалить.
Удалить сию "гадость" с ходу не получилось - пришлось порыться в тырнете.

нарыл решение проблемы:
1) зайти в "Настройки > Местоположение и безопасность > Выбор администраторов"
2) снять галку у "McAfee Security"
3) Удалить приложение обычным путём через "Настройки > Приложения > Управление приложениями"


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

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

JetBrains PhpStorm и имя пользователя

При создании новых файлов, можно использовать автоподстановку имени пользователя по переменной ${USER}. И всё бы хорошо, если бы она не равнялась логину пользователя, что не всегда удобно. При работе в Eclipse я уже привык к добавлению следующих строчек кода в eclipse.ini:
-Duser.name="Victor Alenkov (http://borzdeg.blogspot.com)"
А вот в продуктах от JetBrains данный подход с правкой PhpStorm.vmoptions не сработал - стабильно ругался на пробел в строке. :( В итоге, родилось следующее решение: находим в файле PhpStorm.sh находим и дописываем что нам нужно (выделено жирным):
$WEBIDE_JDK/bin/java $JVM_ARGS -Djb.restart.code=88 -Duser.name="Victor Alenkov (http://borzdeg.blogspot.com)" $WEBIDE_MAIN_CLASS_NAME $*
Сохраняемся и перезапускаем IDE. наслаждаемся)
Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

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

ручная установка JRE/JDK на Linux сервере

Бывает так, что на сервере с Linux нет требуемой версии Java и её приходится устанавливать самому.
Со временем пришёл к следующей схеме (подсмотрел "в этих ваших интырнетах") да сам что-то допилил.

1) качаем нужную нам версию с оффсайта. Лично я качаю всегда или tar или bin архив
2) распаковываем куда-нить на сервере. например в /usr/lib/jvm/
3) делаем симлинк default на ту JRE/JDK, что будет использоваться по умолчанию
4) делаем симлинк latest на ту JRE/JDK, что является последней версией (может быть на ту же версию Java, что и для default)
5) добавляем через update-alternatives наш каталог default
6) указываем через update-alternatives по умолчанию добавленный default.

Пример (для Java SE Development Kit 7):

$ wget http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-x64.tar.gz
$ tar xvf jdk-7-linux-x64.tar.gz
$ sudo mv jdk1.7.0 /usr/lib/jvm/
$ sudo ln -s /usr/lib/jvm/jdk1.7.0 /usr/lib/jvm/default
$ sudo ln -s /usr/lib/jvm/jdk1.7.0 /usr/lib/jvm/latest
$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/default/bin/java" 4
$ sudo update-alternatives --install "/usr/bin/java" "javac" "/usr/lib/jvm/default/bin/java" 4
$ sudo update-alternatives --install "/usr/bin/java" "javaws" "/usr/lib/jvm/default/bin/java" 4

И теперь через команду "sudo update-alternatives --config java" (вместо java можно подставить javac или javaws) настраиваем, что по умолчанию будет отзываться на команду java (javac и javaws соответственно).

Проверяем:

$ java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)

ЗЫ: симлинк latest нужен, чтобы всегда можно было обратиться к последней версии Java :)

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

Google Translate

в гугл-транслите внизу под полем ввода есть "Прослушать".
но, если включить перевод с немецкого на русский и... в поле ввода написать по-русски, то кнопка переименуется в beatbox. правда она не пашет :( по крайней мере, я пока не понял ЧТО туда написать, чтобы услышать битбокс

ЗЫ: а фразу "ыыы пфф бздынь" он воспринимает как белорусский язык)

кросспост

четверг, июля 7

Eclipse и большие XML файлы

При попытке открыть очередной XML файл в несколько сотен килобайт внутри Eclipse, последний тупо "завис". Различные попытки "поиграть" с параметрами запуска не приводили к успеху.

В итоге, действенным способом оказалось предварительно отформатировать XML, а потом уже "скармливать" его Eclipse.

самый простой и быстрый способ, это в консоли выполнить:
xml_pp -l -i.bak file

В итоге, получим отформатированный XML-файл file и его резервную копию (оригинал) в виде file.bak

Правда нужно это больше только для удобоваримого визуального чтения файла) а в обиходе лучше использовать таки однострочный xml-файл для уменьшения размера оного.


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

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

gnome & глюки

Иногда полезно полностью "сносить" настройки какой-либо проги. Это заметил уже давно - ещё со времён "проживания" на винде.

Вот и сейчас, долго думал, отчего у меня глюки:
1) Rhythmbox не желает понимать ленты подкастов
2) Pidgin ругается на подключение к протоколу аськи (при этом, если зайти в кеды, то прекрасно подключается)
3) ещё по мелочи всякого "хлама"

В итоге, снёс полностью каталоги .gconf(d) и все глюки "как рукой сняло" :)

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

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

понедельник, марта 14

Lotus Domino & java.policy

мелкие баги бывают такие разные и противные...

вот например, стабильно в консоли получал на любой "чих" ошибку "error: java.security.AccessControlException: Access denied (java.lang.RuntimePermission setContextClassLoader)"
Перековырял всё, а ошибка всё не уходит...

В какой-то момент осенило - проблема может быть не в нехватке прав, а в самом проблемном файле java.policy. Беру "эталонный" файлик с другого сервера, подставляю и вуаля - всё работает!

беглый анализ произошедшего нашел и виновника возникшей оказии: сервер расположен на Windows, файлик правился из Linux, в итоге в файле образовались иные "переносы строк" - вот на этом IBM JDK и запнулась и перестала и вовсе читать конфигурацию. А внешне файл выглядел нормально что в Windows (блокнот), что в Linux


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

понедельник, февраля 14

Все дни программиста/интернета в одном флаконе

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

14 февраля. День запуска компьютера ENIAC (1946)

4 апреля. День Сети. 4.04 можно прочитать как 404 - номер самой популярной в Интернет ошибки протокола HTTP ("Страница не найдена"). В католической церкви, кроме того, 4 апреля - день святого Исидора, неофициально считающегося покровителем компьютеров и Интернета. Исидор был, возможно, первым энциклопедистом в мире (20-томная Etymologiae).

7 апреля. Иногда празднуется, как День рождения Рунета. В этот день в 1994 г. был зарегистрирован российский домен ru.

22 апреля. Прежний советский код специальности "программист" был именно 2204 ("Программное обеспечение вычислительной техники и автоматизированных систем").

17 мая. Этот день Генеральная Ассамблея ООН утвердила как день информационного сообщества (2006). В настоящее время официально называется всемирным днём электросвязи и информационного общества.

19 июля. Неофициальная дата написания первой программы (1843). Написала её Ада Лавлейс (см. 10 декабря).

Последняя пятница июля. День системного администратора - придуманный американскими сисадминами неофициальный праздник.

Первая пятница сентября. Неофициальный "День компьютерщика", придуманный издательским домом "Компьютерра" (1996). С праздником связан ритуал "чистой пятницы" - то есть, удаления ненужных файлов.

256-й день года (13 сентября в обычные годы, 12 сентября в високосные). Официально объявлен днём программиста указом президента Д. Медведева (2009)

30 сентября. День интернета, известный только в России. Приурочен к 1-й "переписи" населения Рунета (1998, придумано IT Infoart Stars).

4 декабря. День регистрации изобретения цифровой электронной вычислительной машины в СССР (1948). Неофициальная дата рождения советской информатики.

10 декабря. День рождения Ады Лавлейс, первого программиста (точней, программистки) в мире (1810). Кстати, графиня Лавлейс была единственной дочерью "того самого" Байрона.

Таким образом, имеем минимум 0b1100 поводов выпить.)

©тыбрено тут

воскресенье, января 30

SSH и шифрованный known_hosts

Какое-то время "ругался" на то, что в Ubuntu файл known_hosts по-умолчанию шифрует имена доменов - любил совмещать строчки, когда несколько доменов на одном IP, ибо было удобно (хотя и крайне редко требовалось) обновлять ключ.
А тут наткнулся на такую же "проблему" и на её решение через команду и мои "проблемы" сняло как рукой :)

В общем, что мы вокруг да около.
Для того, чтобы удалить из known_hosts устаревший ключ, выполняем команду "ssh-keygen -R host_name|IP", после чего повторно пробуем зайти на удалённый сервер.

там же, есть ссылка на интересную статью Максима Коновалова с писанием поддержки отпечатков SSH в DNS (RFC-4255).

среда, января 19

VirtualBox 4.0 и поддержка плагинов

Начиная с версии 4.0 многоуважаемая компания Oracle добавила поддержку плагинов в VirtualBox и вынесла поддержку USB 2.0 в отдельный плагин. Плагин "Oracle VM VirtualBox Extension Pack" добавляет поддержку "USB 2.0 Host Controller, VirtualBox RDP, PXE ROM with E1000 support"

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

понедельник, января 10

Ubuntu Desktop + LVM. Умный в гору не пойдёт...

Можно пойти так, как "нашпиговано" в ентом вашем ынтырнете и через всякие Ubuntu LiveCD и прочую хрень из консоли хреначить сперва ручками весь LVM, потом на него "натягивать" Desktop.
А можно пойти ПРОЩЕ:
1) качаем Ubuntu Server
2) устанавливаем дистрибутив через его стандартный GUI с разметкой LVM
3) Сразу после загрузки (предполагаем, что у нас тырнет ужо настроен) выполняем команду "apt-get install ubuntu-desktop"
4) перезагружаемся и... вах, шайтан - да перед нами обычный Ubuntu Desktop!

ЗЫ: я, правда, после этого ещё ядро переставил с серверного на десктопный) но это кому какие фломастеры нужны. Да ещё парочку PPA добавил, чтоб некоторый софт посвежее был)


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