Установка Thinstation на жесткий диск (hdd)

Так можно установить сборку linux, предварительно собранную при помощи конструктора на жесткий диск компьютера.

Предистория

Имеется терминал-сервер и куча устаревших машин — клиентов. Сетевки на машинах не поддерживают загрузку по сети (pxe), поэтому остается вариант установки на hdd. Вроде все просто, но на эксперименты ушло 2 дня…

Действия

В конструкторе thinstation настраиваем все параметры как нам нужно. Затем делаем следующее:

            В констукторе thinstation

  1. В файле build.conf включаем модуль ts-classic и выключаем модули networkmanager и udisks-glue
  2. В файле build.conf включаем формирование образа syslinux (param bootimages «iso syslinux pxe»)
  3. В файле thinstation.conf.buildtime добавляем строки: NET_FILE_METHOD=tftp и NET_FILE_ENABLED=on. Это позволит клиентам подгружать конфигурацию с tftp сервера
  4. Собираем ядро (./build)
  5. Копируем все из папки boot-images/syslinux

На клиентском компьютере

  1. Форматируем диск в fat32 (mkfs.vfat /dev/sda1)
  2. добавляем mbr, выполнив команду dd conv=notrunc count=1 bs=440 if=mbr.bin of=/dev/sda. Указываем идентификатор устройства, а не раздела т.е /dev/sda, но не /dev/sda1, иначе получим поврежеднный раздел и начнем все сначала.
  3. делаем диск загрузочным, выполняя parted /dev/sda1 set 1 boot on
  4. копируем на диск все содержимое папки boot-images/syslinux из конструктора. В корне диска должна быть папка boot.
  5. выполняем команду syslinux —directory /boot/syslinux /dev/sda1

Чтобы каждый клиент автоматически логинился под своим логином, необходимо настроить tftp, затем на tftp сервер в корень ложить файлы для каждого клиента: thinstation.conf-IP или thinstation.conf-MAC, например thinstation.conf-192.168.1.34, thinstation.conf-ea00bd12bd

Posted in Без рубрики | Leave a comment

Liferay, ошибка Table ‘lportal.Release_’ doesn’t exist

Настраивал liferay портал в windows, затем сделал dump базы и скопировал на сервер под debiano’m.Портал запустился, только пропал весь контент, роли и пользователи. В логах примерно такие записи

…….
00:42:18,382 WARN [ReleaseLocalServiceImpl] Table ‘lportal.Release_’ doesn’t exist
00:42:18,385 INFO [ReleaseLocalServiceImpl] Create tables and populate with default data
…….

Загвоздка в том,что ищет он таблицу Release_ а в базе имеется release_, в windows это одно и то-же, а в linux — совершенно разные таблицы. Можно конечно переименовать все таблицы, но это скучно… Оказалось можно сделать проще: в настройках mysql ( my.cnf ) добавить строчку: lower_case_table_names = 1

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

 

Posted in Liferay | Leave a comment

Liferay ошибка «java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/ImageFormatException»

Такая ошибка возникала у меня при публикации фотографий в библиотеке документов  Liferay. При этом не был доступен предпросмотр (генерация thumbail) фотографий. Погуглив,выяснил, что такая проблема возникает только в OpenJDK-7, в версии jdk от oracle все нормально.

Отличное описание как установить jdk от oracle можно посмотреть здесь

С новой jdk все работает отлично.

Posted in Liferay | Leave a comment

Сниппеты и примеры кода для Liferay

1. Получение списка ролей пользователя в шаблоне velocity:

<script type=»text/javascript»>
is_signed_in=»no»;
user_roles=[];
</script>
#if ($is_signed_in)
<script type=»text/javascript»>
is_signed_in=’yes’;
<!—get list of user roles—>
#set ( $counter=0 )
#set ( $roleService = $serviceLocator.findService(«com.liferay.portal.service.UserGroupRoleLocalService»))
#foreach( $usrRole in $user.getRoles() )
user_roles[$counter]=»$usrRole.getName()»
#set ($counter=$counter+1)
#end
#foreach ( $role in $user.getUserGroups() )
user_roles[$counter]=»$role.getName()»
#set ($counter=$counter+1)
#end
</script>
#end

2. Вставка портлета выбора Языка в любое место шаблона

страницы

$theme.runtime(«82″)

82 — ID портлета. Так можно вставлять любой портлет, список портлетов и их ID можно посмотреть в панели управления.

 

3. Получение списка ролей и текущего языка из PHP портлета

<?PHP
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.util.PortletKeys;
import com.liferay.portlet.PortalURLFactoryUtil;
import com.liferay.portal.service.RoleServiceUtil;

import javax.portlet.PortletMode;
import javax.portlet.PortletRequest;
import javax.portlet.WindowState;

$request = quercus_servlet_request();

$themeDisplay = $request->getAttribute(WebKeys::THEME_DISPLAY);
$user = $themeDisplay->getRealUser();

$screenName = $user->getScreenName();
$roles = RoleServiceUtil::getUserRoles($user->getUserId());
$language = $themeDisplay->getLocale();
echo «current language: «.$language.»\n»;
echo «current user screenname «.$screenName.»\n»;
echo «current user roles:»;
print_r($roles);
echo «first role: «.$roles[0]->getName();

?>

Posted in Без рубрики | Leave a comment

Переопределение аутентификации + импорт пользователей на лету в liferay

Доброго времени суток, читатели!

Уже несколько дней пытаюсь решить следующую задачу:

Имеется установленный Liferay CE 6.2. Необходимо написать hook, который будет переопределять функцию аутентификации, по следующей схеме:

1. Ищем пользователя с введенными логином и паролем во внешней базе данных+

2. Если нашли — проверяем, есть ли такой пользователь в БД Liferay. Если нет — импортируем его из внешней базы, если есть — проверям, есть ли изменения, при необходимости обновляем

3. Возвращаем управление системе аутентификации Liferay.

Таким образом будет «на лету» осуществляться синхронизация базы пользователей в Liferay с внешней базой.

Собственно сам hook создать несложно, если использовать Liferay IDE +eclipse. Переопределить класс Authenticator, реализовать 3 функции «authenticateByEmailAddress»,»authenticateByScreenName», «authenticateByUserId» и все дела. Сложность возникла при подключении ко внешней базе данных. Пробовал использовать service Builder и прямое подключение через jbdc, в разных вариантах — ничего не работает для внешней базы. Возможно сложно оказалось еще и потому, что мир java я только начинаю изучать, до этого кодил в php. В результате долгих мучений нашел очень простое решение:

1. В папке с ${CATALINA_HOME}/conf открываем файл context.xml и добавляем ресурс:

<Resource 
name=»jdbc/myDB» 
auth=»Container» 
type=»javax.sql.DataSource» 
maxActive=»100″
maxIdle=»30″
maxWait=»10000″ 
username=»root» 
password=»root» 
driverClassName=»com.mysql.jdbc.Driver» 
url=»jdbc:mysql://localhost:3306/myDB»/> 

2. В папке нашего плагина/hook’a находим файл web.xml и добавляем туда ссылку на описанный ранее ресурс

<resource-ref>
  <description>DB Connection</description> 
  <res-ref-name>jdbc/myDB</res-ref-name> 
  <res-type>javax.sql.DataSource</res-type> 
  <res-auth>Container</res-auth>
</resource-ref>

3. Теперь в коде плагина мы можем делать запросы к внешней базе:

Context ctx = new InitialContext();  
DataSource ds = (DataSource)ctx.lookup(«java:comp/env/jdbc/myDB»);  
Connection conn = ds.getConnection(); 
Statement stmt = conn.createStatement();
ResultSet set = stmt.executeQuery(«select somefield from sometable»);  

if(set.next()) {  
   System.out.println(«info from ext DB :»+set.getString(1); 
}  
conn.close(); 

Позже я вероятно напишу пошаговое описание процесса разработки этого плагина.

 

Posted in Liferay | Leave a comment

Программы, проекты, информационные системы…

Иногда, особенно когда нужно сделать быстро, бывает трудно подобрать информационную систему для конкретной цели. Зато когда они не нужны, вдруг объявляются сразу несколько отличтных систем, которые так и не удалось найти месяц назад.

В этом блоге, я буду пополнять списки информационных систем, библиотек, проектов и.т.д, которые облегчают мою работу.

Задача разработки/внедрения социальной сети

1. Exo PLatform

  • JAVA

2. Instant CMS

  • PHP

3. LivStreet

  • PHP

Задача разработки/внедрения системы управления проектами

1. Redmine

  • JAVA

2. Collabtive

  • PHP

3. TeamLab — Лучший выбор!

  • Asp.Net
  • Есть варинаты SAAS — платный ессно, и opensource на sourceforge
  • Есть русский перевод

4. Todoyou

  • PHP
  • Есть русский перевод

Задача разработки/внедрения системы управления документами и совместной работы

1. Alfresco

  • JAVA
  • Есть русский перевод

Задача разработки/внедрения системы электронного документооборота(СЭД)

1. OpenKM

  • JAVA
  • Управление документами
  • Управление правами на уровне групп/пользователей
  • Создание и управление рабочими процессами(workflow) с использованием JBPM для визуального проектирования процессов
  • Есть русский перевод

2. RunaWfe(http://www.runawfe.org/About)

  • JAVA
  • Визуальная разработка процессов
  • Есть русский перевод
  • Ориентирована только под workflow не docflow
Posted in Без рубрики | Leave a comment

Создание корпоративного портала в Liferay 6.1.2-ce-ga3

Доброго времени суток!

В следствии многих накопившихся причин возникла крайняя необходимость замены информационного портала организации. Предыдущий самописный (PHP5+Kohana framework) портал в общем неплохо справлялся, но оказался неприспособленным к изменившимся требованиям. Встал вопрос: создавать еще один велосипед, или использовать существующие портальные решения? От велосипеда отказался сразу — потом не будет времени его поддерживать, а любой, даже самый лучший сайт к сожалению устаревает…

Рассматривал существующие решения (все мнения исключительно субъективны!!):

1. Несколько сборок на основе Drupal (openatrium и др.).

Да имеют хорошую функциональность, но работает все крайне медленно и ресурсов жрет немеренно!

2. Joomla

Вроде куча плагинов и модулей — а начнешь выбирать: то не работает, то криво, то функционала не хватает. А писать все плагины самому — так проще сайт с нуля сделать.

3. Jboss portal

Штука мощная, но как-то не осилил..

4. Sharepoint Foundation Services 2013

Наворочено конечно много… Сайт можно построить быстро и легко, но когда начинаешь вникать в детали — оказывается куча ораничений. Чтобы поменять оформление(тему) сайта — нужно быть microsofto’м, переключение языков не предусмотрено ( нужно на каждый язык создавать отдельный сайт — а это геморрой ), авторизация через Active Directory, а через OpenLdap уже не получится и.т.д. Хотя возможно я просто не вник…

4. Liferay portal

Вот! Вот это то, что надо! Все, что нужно есть «из коробки», а остальное можно доработать. Остановился на нем. Использую последнюю на данный момент версию: Liferay 6.1.2 CE-GA3.

Далее собственно задачи, которые буду решать по мере возникновения.

ЗАДАЧА 1. Установка с postgresql в качестве БД.

По умолчанию liferay ставит встроенную базу данных Hypersonic, но для реального использования она не годится. Чтобы использовать postgresql нужно:

.. А собственно ничего и не нужно! Запускаем startup.sh и на странице первоначальной настройки указываем настройки базы данных (драйвер, путь, логин, пароль). Крысота!!

ЗАДАЧА 2. Аутентификация через LDAP (Active Directory)

Поддержка ldap есть «из коробки». Немного остановлюсь на настройке:

1. На вкладке «общие» — в поле «как пользователи будут аутентифицироваться?» выбираем «По экранному имени». Внимание! Вследствии чьего-то (или моего) недопонимания экранное имя соответствует в ldap аттрибуту sAMAccountName, а вовсе не cn как можно подумать (я долго ломал голову, почему не работает).

2.Добавляем сервер LDAP.

Соединение

  • Base Provider URL =«ldap://имя сервера:389″
  • Base DN = «dc=vkgu,dc=kz»
  • Доверитель=имя пользователя в ldap с правами подключения
  • Верительные данные= пароль соответственно

Пользователи

  • Фильтр поиска при аутентификации=(&objectCategory=Person)(sAMAccountName=@screen_name@)
  • Фильтр поиска импорта=(objectClass=inetOrgPerson)
  • UUID=sAMAccountName
  • Экранное имя=sAMAccountName (Вот! это я искал долго…)
  • Адрес email =mail
  • Пароль=userPassword (тут нужно учесть, что Active Directory по умолчанию не использует это поле, поэтому пользователи будут импортироваться в liferay, но не смогут войти, так как пароль не импортируется. Можно заполнить это поле самописным скриптом )
  • Имя=givenName
  • Отчество=middleName
  • Фамилия=sn
  • Полное имя=cn
  • Должность=title
  • Группа=memberOf

Группы

  • =(objectClass=groupOfNames)
  • Имя группы=cn
  • Описание=description
  • Пользователь=member

Поставьте флажок «импорт включен» — пользователи будут импортироваться при первом входе в портал. Если поставить флажок «Включен импорт при запуске » — ВСЕ пользователи будут испортироваться разом при старте сервера tomcat. Я не стал — это может занять много времени.

В такой конфигурации все работает отлично. Пока с этим все.

ЗАДАЧА 3. Добавить портлет переключения языка в DOCKBAR (верхняя панель)

Достаточно просто:

1. Открываем текущую тему (по умолчанию webapps/welcome-theme/templates)

2. В файле portal_normal.vm в нужном месте (например после строк: #if ($is_signed_in) #dockbar #end) вставляем строчку: $theme.runtime(«82″);

82 — это идентификатор портлета, который нужно вставить, в нашем случае как раз портлет выбора языка. Полный список портлетов можно посмотреть в файле (WEB-INF/liferay-portlet.xml)

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

ЗАДАЧА 4. Добавить казахский язык и перевод

Собственно перевод сделать несложно: достаточно взять файл Language_ru.properties, перевести все строки и сохранить под именем Language_kz.properties. А вот добавить язык в список доступных языков — это оказалось неожидано сложно, следующий алгоритм я искал долго, хотя, как оказалось большиство ошибок было следствием моей-же невнимательности… Итак алгоритм:

1. В файле Liferay web.xml (webapps/ROOT/WEB-INF/web.xml) нужно вставить строки

<servlet-mapping>
<servlet-name>I18n Servlet</servlet-name>
<url-pattern>/kz/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>I18n Servlet</servlet-name>
<url-pattern>/kz_KZ/*</url-pattern>
</servlet-mapping>

2. там-же добавляем следующие строки (в соответствующий раздел) :

<url-pattern>/kz/c/portal/protected</url-pattern>
<url-pattern>/kz_KZ/c/portal/protected</url-pattern>

3. Переведенный файл  (Language_kz.properties) закидываем ВНУТРЬ JAR архива webapps/ROOT/WEB-INF/lib/portal-impl.jar, в папку content

4. В том же архиве, находим файл portal.properties, в нем находим строку locales=as_SA… и добавляем в конец ,kz_KZ

ЗАДАЧА 5. Установка расширений

Большинство необходимых расширений возможно установить прямо через веб интерфейс (marketplace). При этом иногда возникает странная трабла: щелкаешь кнопку «download» на странице marketplace purshase, появляется надпись «wait» и зависает навечно.. Искал долго, оказалось просто: в настройках сервера, увеличить максимальный размер загружаемого файла (по умолчанию около 3Мб). После этого начало работать.

Первое, что мы установим — это social office.

Social office — это расширение, которое добавляет к стандартным возможностям более привлекательную тему оформления,чат, отслеживание социальной активности и прочие плюшки, по сути превращая liferay из платформы в готовый социальный (или корпоративный) портал.


Posted in Без рубрики | Leave a comment

PHP5 to UML или реверс-инжиниринг

Возникла необходимость визуально отобразить диаграмму классов существующего проекта. Вроде задача не новая и инструментов хватает, но… Но либо коммерческие, либо не работают как надо. Пробовал разные варианты, пока не остановился на следующем:

1. Используя утилиту php2xmi конвертируем php исходники в xml файл с расширением .xmi

php2xmi —output=/tmp/1.xmi /var/www/1.php

а можно и рекурсивно

php2xmi —output=/tmp/1.xmi —recursive /var/www

2. Используя ArgoUML — импотируем полученный xmi и имеем готовую диаграмму

 

 

Posted in Без рубрики | Leave a comment

Создание и динамическое заполнение xdp форм

Долго мучился с разными библиотеками и програмками, пытаясь заполнить существующую pdf форму динамически, на сервере посредством PHP. Пробовал pdftk, он работает, но не поддерживает UTF8, соответственно проблеммы с кириллицей… Пробовал несколько java утилит, не получилось. Пробовал адобовский pdftoolbox — не понравилось, что он в виде библиотек, значит сначала надо писать утилиту на С++, используя эти библиотеки, а затем вызвать утилиту из PHP.

И наконец, нашел простое, быстрое решение, которое правда не совсем кошерное,поскольку требует наличия коммерческих продуктов… Но работает! Итак, по порядку:

  1. Создаем форму, используя Adobe LiveCycle Designer. Именно его, поскольку формы созданные в Adobe Acrobat уже не поддерживают xdp…
  2. Сохраняем форму как Adobe Dynamic Xml Form (.pdf)
  3. Открываем полученный pdf в Adobe Acrobat Pro, затем из меню (инструменты->формы) сохраняем xdp файл. Xdp файл представляет собой xml документ.
  4. Xdp файл содержит ссылку на pdf документ и форму, содержащую все поля документа. Если изменить значения полей в xdp документе, а затем открыть его в adobe reader, то форма автоматически рендерится с новыми значениями.
  5. Теперь, избавимся от ссылки на pdf, поскольку это весьма неудобно в web. Все очень просто:
    • исходный pdf документ, полученный в пункте 2, кодируем в виде base64 строки, следующим кодом: base_64_encode(pdf_file_path);
    • Копируем полученную строку
    • Открываем xdp документ, находим там строчки: <pdf href=»….. Это ссылка на pdf документ.
    •  Заменяем на следующее: <pdf xmlns=»http://ns.adobe.com/xdp/pdf/><document><chunk></chunk></document></pdf>
    • Между тегами <chunk></chunk> вставляем полученную ранее base64 строку

Вот мы и получили xdp форму! Теперь достаточно открыть ее посредством php, заменить значения в выбранных полях и отправляем пользователю. Пользователь открывает ее в Adobe Reader и вуаля! Кириллица отображается нормально, только ее необходимо кодировать при помощи функции

$value =  mb_convert_encoding( $value, ‘HTML-ENTITIES’, mb_detect_encoding($value));

Posted in Без рубрики | Leave a comment

О TCPDF, программах для просмотра pdf и не только

Итак, возникла предо мной задача: разработать программку, которая генерирует частично заполненные pdf формы, которые пользователи будут дополнять и затем печатать. Программку довольно быстро набросал на php, используя TCPDF. Формы на русском и английском языке отображаются без проблем, но вот с казахским языком возникли сложности.

1. Foxit-Reader сначала меня порадовал. Все хорошо отображает, формы сохраняет… До тех пор, пока не пришлось делать формы на казахском языке. Он просто отказывается отображать/редактировать казахские специфические символы. Думая, что это проблемы шрифтов/tcpdf я пробовал создать форму с нуля в adobe-acrobat pro, но, таки не помогло.  Причем,если шрифт регулярный, все «ок», но стоит сделать его жирным или курсивным, начинаются странные пляски. Правда, возможно это проблема не самого ридера, а шрифтов,настроек документа,и.т.д…

2. Adobe Reader. Всем хорош, но не позволяет сохранять заполненные формы. Спрашивается, нафига мне такая программа, чтобы по 10 раз одну форму заполнять? Стратегия Adobe понятна, но меня не устраивает. Кроме того, странный глюк: шрифты с курсивным/жирным начертанием при открытии документа почему-то отображаются знаком «?», но если щелкнуть на поле — все показывает нормально.
Поправка: Не сохраняются формы на linux версии, которая как известно более не поддерживается. На последней windows версии все нормально.

3. X-changePdf Reader.
Отображает/редактирует  все на ура. Любые языки, любые символы. Но тут другая проблема: не работает javascript. Дело в том, что я в документ внедряю javascript функцию, которая оторбражает диалог выбора размера шрифта по нажатию shift+щелчку на поле. Иногда это необходимо, но ВСЕ pdf ридеры не позволяют менять шрифт в форме. В двух предыдущих ридерах — работало…
Дополнение: в ходе расследования, оказалось, что js-api реализованы частично, в частности, событие по щелчку на поле присутствует, но модификаторы (нажатые клавиши shift или ctrl) в обработчик не передаются. Такие методы как app.addMenuItem не реализованы совсем

Проблема все-же не то в шрифтах, не то в недрах TCPDF. Эксперементально выяснил, что если шрифт сконвертирован из .ttf с опциями:

$pdf->addTTFfont( $fontfile,’TrueType’,’ansi’,32 );

т.е. используется кодировка ansi

то все символы в pdf заменяются знаком «?». При этом стоит щелкнуть по полю, как строки прекрасно отображаются и редактируются.

Если же шрифт сконвертирован с опциями:

$pdf->addTTFfont( $fontfile,’TrueTypeUnicode’,’utf-8′,32 );

то все строки отображаются нормально (включая специфические символы), но при редактировании невозможно вставить специфические символы казахского алфавита.

Эксперименты с импортом шрифтов

1. Шрифт импортированный с опциями;
$pdf->addTTFfont( $fontfile,’TrueTypeUnicode’,’UTF-8′,32 );
распознается adobe-acrobat-pro как AAAAD-TimesNewRoman. При открытии документа, все строки отображаются нормально. Специфические символы не печатаются (заменяются кракозяброй).

2. Шрифт импортированный с опциями;
$pdf->addTTFfont( $fontfile,’TrueType’,’UTF-8′,32 );
распознается adobe-acrobat-pro как TimesNewRomanPSMT. При открытии документа, все символы заменяются на знак вопроса. По щелчку на поле, вид восстанавливается, любые символы печатаются нормально.

…..
Не буду утруждать читателя экспериментами (они заняли 2 дня). Но в результате пришел вот к чему:
1. шрифт импортируется командой:
$pdf->addTTFfont( ‘…/timesbi.ttf’,’TrueTypeUnicode’,»,32);
2. создаем экземпляр tcpdf :
$pdf = new TCPDF(‘P’, ‘mm’, ‘A4′, true, ‘UTF-8′);
3. командуем не включать шрифты в документ полностью, только информацию о символах(файл будет весить меньше): Даже и не знаю, что это значит, но надо!
$pdf->setFontSubsetting(false);
4.Указываем шрифт
$pdf->setFont(‘timesBI’,10);
5. выводим поле
$text =’Текстовое поле №1әіңғ,.үұқөһ’;
$pdf->TextField ( ‘field1′, 70, 10,array(‘multiline’=>true, ‘lineWidth’=>4, ‘borderStyle’=>’solid’),array(‘v’=>$text,’dv’=>$text));

СОВЕТ: После импорта шрифта, откройте файл .php (например times.php) и закоментируйте строчку $file=‘…..’
В результате шрифт не будет включаться в документ и pdf документ будет весить примерно в 2 раза меньше…

Вот. В Acrobat Reader 11 все отображается и печатается нормально

Posted in Без рубрики | 2 Comments