понедельник, 29 ноября 2010 г.

Лекции по Системам реального времени

Отсканированные лекции по Системам реального времени, готовимся к зачету =)
P.S.: Спасибо Игорю Мартемьянову

Леции

четверг, 25 ноября 2010 г.

Методичка и Задачник по Организации и Планированию производства

Отсканированный вариант Методички и Задачника по предмету "Организация и планирование производства"
Задачник
Методичка

пятница, 15 октября 2010 г.

Получение пользователей из AD на C#

using System;
using System.DirectoryServices;
using System.Collections;
using System.Linq;
using System.IO;

class Program
{

static void Main(string[] args)
{
DirectoryEntry de = new DirectoryEntry("LDAP://"+serverName, userName, password);
DirectorySearcher deSearch = new DirectorySearcher();

deSearch.SearchRoot = de;
deSearch.Filter = "(&(objectClass=user))";
deSearch.SearchScope = SearchScope.Subtree;

SearchResultCollection results = deSearch.FindAll();

foreach (SearchResult result in results)
{
DirectoryEntry entity = result.GetDirectoryEntry();

if ((entity.SchemaEntry.Name == "user") && (entity.Name.IndexOf("CN=") != -1))
{
Console.Write(entity.Name.Substring(3) + "\n");
}
}
}
}

четверг, 19 августа 2010 г.

Переводим Hex в обычный текст на C#

Задача: Данные шифрованные в HEX. Необходимо прочитать их.
Пример: Из 4d79206e616d652044656e6973 получаем My name Denis

Пример кода на C# реализующий эту задачу.

string hexString = richTextBox1.Text;
byte[] tmp;
int j = 0;
tmp = new byte[(hexString.Length) / 2];
for (int i = 0; i <= hexString.Length - 2; i += 2)
{
    tmp[j] = (byte)Convert.ToUInt32(Int32.Parse(hexString.Substring(i, 2),         System.Globalization.NumberStyles.HexNumber));
    j++;
}
richTextBox1.Text = Encoding.GetEncoding(1252).GetString(tmp);

Для этого не обходимо WinForm, на нее выкинуть richTextBox1 и Button1 =)

P.S.: Проверить можно тут
Спасибо за советы Tricks_Ter

Link

Инфа по J2EE
JPA, JDO
Свое представление (view) в Spring MVC
Database Connection Pool
Struts, Hibernate, Spring
JSF 2 – evaluation and test

воскресенье, 8 августа 2010 г.

Как получить ключик на MicroSoft пробукты....

:) Ответ всем кто мне пишет в скайп и icq с вопросами о ссылках и как это сделать...
Как же это делается....

1. Бежим бегом поступать в университет который учавствует в программе. Узнать это можно так Link
2. Берем зачетку и списыаем от туда номерок ваш, или берем его на кафедре.
3. заходим на сайтец, для УГТУ-УПИ он же УФУ идем на link. P.S.:с кафедрой не промахнитесь :)

нуи фоуля.... вам дают логи пас, заходим берем все ключи и удаляемся в не известном направлении :)

Для истиных патриотов MS вот линк де валяется crc суммы образов link
Наслаждаемся лицензионным ПО...

понедельник, 2 августа 2010 г.

HttpServletRequest > Данные из Servler

За частую нам необходимо получить данные о сервере, об авторизированном пользователе или еще какие данные о работающей системе
допустим это можно сделать в (View).xhtml файлах используя
request.getRemoteUser() - получение данных о пользователе, если он авторизован в системе.

Но для того чтобы получить эти данные в контроллере ил в фасаде надо обратится к интерфейсам системы таким образом:
String remoteUser = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser()


аналогично можно получить остальные данные из сервлета

среда, 28 июля 2010 г.

Доступ к AD(LDAP) для Application приложений

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

public class LDAPTest
{
static class LDAP
{
static String ATTRIBUTE_FOR_USER = "sAMAccountName";
public Attributes authenticateUser(String username, String password, String _domain, String host, String dn)
{

String returnedAtts[] ={ "sn", "givenName", "mail" };
String searchFilter = "(&(objectClass=user)(" + ATTRIBUTE_FOR_USER + "=" + username + "))";
//Create the search controls

SearchControls searchCtls = new SearchControls();
searchCtls.setReturningAttributes(returnedAtts);
//Specify the search scope

searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String searchBase = dn;
Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
//Using starndard Port, check your instalation

environment.put(Context.PROVIDER_URL, "ldap://" + host + ":389");
environment.put(Context.SECURITY_AUTHENTICATION, "simple");

environment.put(Context.SECURITY_PRINCIPAL, username + "@" + _domain);
environment.put(Context.SECURITY_CREDENTIALS, password);
LdapContext ctxGC = null;
try
{
ctxGC = new InitialLdapContext(environment, null);
// Search for objects in the GC using the filter

NamingEnumeration answer = ctxGC.search(searchBase, searchFilter, searchCtls);
while (answer.hasMoreElements())
{
SearchResult sr = (SearchResult)answer.next();
Attributes attrs = sr.getAttributes();
if (attrs != null)
{
return attrs;
}
}

}
catch (NamingException e)
{
System.out.println("Just reporting error");
e.printStackTrace();
}
return null;
}
}

public static void main(String[] args) throws Exception
{
InputStreamReader converter = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(converter);
System.out.println("Please type username:");
String username = in.readLine();
System.out.println("Please type password:");
String password = in.readLine();
LDAP ldap = new LDAP();

//Yo specify in the authenticate user the attributes that you want returned

//Some companies use standard attributes like 'description' to hold an employee ID

//The ActiveDirectory data can be enhanced to add custom attributes like

//printer

// Some instalations usually have several ACtiveDirectoryServers, lets say

// 192.150.0.8, 192.150.0.7 y 192.150.0.9 and they use a

// DNS round robin to balance the load

Attributes att = ldap.authenticateUser(username, password, "mydomain.com", "myactivedirectoryhost.com", "DC=mydomain,DC=com");
if (att == null)
{
System.out.println("Sorry your use is invalid or password incorrect");
}
else
{
String s = att.get("givenName").toString();
System.out.println("GIVEN NAME=" + s);
}
}
}

Авторизация в JSF2 через Active Derectory, GlassFish v 3.0.1 (LDAP)

Задача: Оргонизовать авторизацию пользователей через MS Active Derectory
Инструменты: GlassFish v3.0.1 OpenSource, NetBeans 9, CentOS 5.5

Настрйока GlassFish
Через web админку, заходим в rootTree > configuretion > Security > Realms
Создаем новый Realm нажатием кнопки New
заполняем поля:

Realm Name:svel <Имя которое будет использоватся в дальнейшем контесте>
Class Name:com.sun.enterprise.security.auth.realm.ldap.LDAPRealm
JAAS Context:ldapRealm <Имя метода который мы используем fileRealm, ldapRealm и т.д.>
ldapRealm:ldap://192.168.0.1:389 <Адрес машины с AD или LDAP>
Base DN:DC=svel,DC=ru <указываем данные домена у меня он выглядит как svel.ru>

Далее добавляем 4 свойства
search-filter:(&(objectClass=user)(sAMAccountName=%s)) <Поиск пользователей в домене в обекте user в поле sAMAccountName>
search-bind-password:MyPassword <Пароль учетной записи имеющей доступ в AD или LDAP>
group-search-filter:(&(objectClass=group)(member=%d)) <Поиск групп пользователей в обекте group в поле member>
search-bind-dn:MyUser <Учетная запись имеющая права доступа в AD или LDAP>

P.S: некоторые параметры могут менятся в зависимости от использования AD(LDAP)
Список свойств :
search-bind-password = (optional) Specifies the LDAP password for the DN given in search-bind-dn .
search-bind-dn = (optional) Specifies an optional DN used to authenticate to the directory for performing the search-filter lookup. Only required for directories that do not allow anonymous search.
group-target = (optional) Specifies the LDAP attribute name that contains group name entries. The default is CN.
group-search-filter = (optional) Specifies the search filter to find group memberships for the user. The default is uniquemember=%d (%d expands to the user element DN).
group-base-dn = (optional) Specifies the base DN for the location of groups data. By default, it is same as the base-dn, but it can be tuned, if necessary.
search-filter = (optional) Specifies the search filter to use to find the user. The default is uid=%s (%s expands to the subject name).
base-dn =
Specifies the LDAP base DN for the location of user data. This base DN can be at any level above the user data, since a tree scope search is performed. The smaller the search tree, the better the performance.
directory = Specifies the LDAP URL to your server.
assign-groups = (optional) If this property is set, its value is taken to be a comma-separated list of group names. All clients who present valid certificates are assigned membership to these groups for the purposes of authorization decisions in the web and EJB containers.
jaas-context = Specifies the JAAS (Java Authentication and Authorization Service) context.

Также необходимо в JVM Options добавить свойство
-Djava.naming.referral=follow

Выборка из конфига domain.xml

< auth-realm classname="com.sun.enterprise.security.auth.realm.certificate.CertificateRealm" name="certificate" />
< auth-realm name="svel" classname="com.sun.enterprise.security.auth.realm.ldap.LDAPRealm">
< property name="jaas-context" value="ldapRealm" />
< property name="base-dn" value="DC=svel,DC=ru" />
< property name="directory" value="ldap://192.168.0.2:389" />
< property name="search-bind-password" value="MyPassword" />
< property name="search-bind-dn" value="MyUser" />
< property name="search-filter" value="(&(objectClass=user)(sAMAccountName=%s))" />
< property name="group-search-filter" value="(&(objectClass=group)(member=%d))" />


Конфигурирование WebApp
в web.xml

на вкладке Security выбрать тип Basic в поле RealName: svel

В пункте Security Roles добавляем роли которые используются ввашем домене в качестве CN (CN=(350) Automation department)
я указываю (350) Automation department

В пункте Security Constraints
заполняем поля и в аоле Role Name(s) указываем те роли из указанных выше, которые имеют доступ к данному разделу безопасности.

пример кода их web.xml

< security-constraint>
< display-name>Constraint1< /display-name>
< web-resource-collection>
< web-resource-name>a< /web-resource-name>
< description/>
< url-pattern>/*< /url-pattern>
< /web-resource-collection>
< auth-constraint>
< description/>
< role-name>(350) Automation department< /role-name>
< /auth-constraint >
< user-data-constraint >
< description/ >
< transport-guarantee>NONE< /transport-guarantee>
< /user-data-constraint >
< /security-constraint >
< login-config >
< auth-method>BASIC< /auth-method>
< realm-name>svel< /realm-name>
< /login-config>
< security-role>
< description/>
< role-name>(350) Automation department< /role-name>
< /security-role>


Деплойтим и пользуемся :)

P.S:Для полноценной работы с Realm советую прочитать раздел Users, Role, Realms из JavaEETutorial

и еще проверить работает ли, можно прописав в index.xhtml данные строки

Для бейсик авторизации
< h:outputText value="#{request.isUserInRole('OU=(350) Отдел автоматизации')} " /> /-
< h:outputText value="#{request.isUserInRole('(350) Automation department')} " /> /-
< h:outputText value="#{request.getPathInfo()} " />/-
< h:outputText value="#{request.getRemoteUser()} " />

для авторизации через фонму добавте
< form action="j_security_check" method="POST">
< h:panelGrid columns="2" bgcolor="#eff5fa" cellspacing="5" frame="box">
< h:outputLabel value="User ID:"/>
< h:inputText id="j_username" tabindex="1" />
< h:outputLabel value="Password:"/>
< h:inputSecret id="j_password"/>
< h:outputLabel value=""/>
< h:commandButton id="login" value="Login"/>
< /h:panelGrid>
< /form>

полезные линки
не которы команды AD(LDAP)
еще
еще

суббота, 5 июня 2010 г.

Выполнение хронимых процедур MS SQL в JavaEE 6 (JSF2)

Возникла задача, выполнения хранимых процедур из базы MS SQL 2005 в коде моего проекта.
Долгое время бился над этим, но все-таки нащел решение.

Использовал:
NetBeans 9.2 RC2
JDBC MSQSQL version 3


Пример:

1. Класс сушности
package model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.eclipse.persistence.annotations.Direction;
import org.eclipse.persistence.annotations.NamedStoredProcedureQuery;
import org.eclipse.persistence.annotations.StoredProcedureParameter;

@Entity
@NamedStoredProcedureQuery(name = "rpt_ret_test",
resultClass = MyEntity.class,
returnsResultSet = true,
procedureName = "rpt_ret_test",
parameters = {
@StoredProcedureParameter(name = "item",
queryParameter = "item", direction = Direction.IN, type = String.class)
})
public class MyEntity implements Serializable {

@Id
@Column(name = "item")
private String item;

public String getItem() {
return item;
}

public void setItem(String item) {
this.item = item;
}
}


2. Класс фасада
package controller;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import model.MyEntity;

@Stateless
public class MyEntityFacade {

@PersistenceContext(unitName = "ewqPU")
private EntityManager em;

public List customize()
throws Exception {
try {
Query query = em.createNamedQuery("rpt_ret_test");
query.setParameter("item", "sdsds Мой тестовый параметр :)");
return query.getResultList();
} catch (Exception ex) {
throw ex;
}
}
}


3. Класс предоставления данных (ViewEntity)
package controller;

import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import model.MyEntity;

@ManagedBean(name = "MyEntityView")
@RequestScoped
public class MyEntityView {

@EJB
private MyEntityFacade myEntityFacade;

public List getMyEntityFacade() throws Exception {
return myEntityFacade.customize();
}


}


4. Вывод данных на экран

в xhtml через баловый вывод JSF Entity Data table


P.S: Заработало толька на GlassFishe который щел в комплекте с NetBeans 6.9 RC2
в остальных случиях шли непонятные ошибки.
не забывайте в процедурах писать SET NOCOUNT ON ;)



Тест выполняемой процедуры
Create Procedure dbo.RPT_RET_test (@Item NVARCHAR(50))
AS
BEGIN
SELECT @item
END


PS: так как вывод быдет произведен 1 раз можно не писать SET NOCOUNT ON

вторник, 25 мая 2010 г.

Начало работы с JSF 2

Вот небольшой список ссылок где можно найти полезную инфу о JSF 2 по мимо туториала :)


Поддержка JSF 2.0 в среде IDE NetBeans версии 6.8
Начало работы с приложениями Java EE 6
DevelopJavaEE6App
DevelopAjaxJSF2App
Java EE 6 Pet Catalog with GlassFish v3 preview and MySQL
JSF 2 fu, Part 2: Templating and composite components
http://www.ibm.com/developerworks/ru/library/0707_barcia/
This document had no style information.
ejb-local-ref
Document Information
Сушночти в JSF и Хронимые процедуры баз данных
Пример работы с Хронимыми процедурами от NetBeans
Презенташка от Sun по анатациям

Java и Хронимые процедуры MS SQL Server

По необходимости пришлось связать свою судьбу с Java =)
Если чесно пока об этом не желею. При решении задачь исмользую сервер баз данных на MS SQL 2005. Драйвера доступа (JDBC) скачал с офф. сайта www.microsoft.com

В данном посте расматривается задача об использовании в Java хронимых процедур из SQL Server.
При написании данного класса у меня возникла проблема. Хронимая процедура выполняет разузловку изделия и выводит таблицу вхождения материалов в изделие (Он приводился в более ранних постах). Процедура иполнена в стиле CURSORO-в в связи с этим возникли затруднения при решении задачи.


import java.sql.*;
import com.microsoft.sqlserver.jdbc.*;

public class connectDS {

public static void main(String[] args) {

// Declare the JDBC objects.
Connection con = null;
CallableStatement cstmt = null;
ResultSet rs = null;

try {
// Establish the connection.
SQLServerDataSource ds = new SQLServerDataSource();
ds.setUser("sa");
ds.setPassword("MyPass");
ds.setServerName("127.0.0.1");
ds.setPortNumber(1433);
ds.setDatabaseName("pubs");
con = ds.getConnection();

// Execute a stored procedure that returns some data.
cstmt = con.prepareCall("{call dbo.RET_ShowStructItem1(?)}");
cstmt.setString(1, "3.020.324.007-001");
cstmt.execute();

while (!cstmt.getMoreResults() && (cstmt.getUpdateCount() != -1)) {
}

rs = cstmt.getResultSet();


while (rs.next()) {
System.out.println(rs.getString("item"));
System.out.println(rs.getString("description"));
System.out.println();
}
} // Handle any errors that may have occurred.
catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
}
}
if (cstmt != null) {
try {
cstmt.close();
} catch (Exception e) {
}
}
if (con != null) {
try {
con.close();
} catch (Exception e) {
}
}
System.exit(1);
}
}
}


Данный код приведенный выше работает и уже модефицированн.
Проблема заключается в том что процедура в момент обработки при каждом выполнении (INSERT, UPDATE, SELECT) возвращает результат выполнения это можно отключить в процедуре командой SET NOCOUNT ON либо при написании класса использовать цикл

while (!cstmt.getMoreResults() && (cstmt.getUpdateCount() != -1)) {}


Для коректности лудше вставить туда обработчики исключений.

P.S.:Пример от Microsoft

Старые CURSOR или новые WITH

Долгое время приходилось работать на SQL Server 2000 SP4. Также была необходимость сопровождать тот код что был написан до меня. После продолжительного времени работы мы перешли на SQL Server 2005 что открыло новые возможности и новый функционал. При его освоении начали переписывать старые наработки.

Задача:
Написать процедуру которая принемает параметр (Изделие item) и производит его разузловку (строит дерево вхождений)

Вопросы:
1. Как это делается ?
2. Есть ли смысл в переходе на нововведения ?

Парктика.
[SQL Server 2000] Что было в начале....

CREATE PROCEDURE [dbo].[MyProcSp] (@item NVARCHAR(255) = NULL)
AS
DECLARE @Col DECIMAL(10,5)
DECLARE @NowStartDate DATETIME
DECLARE @Item1 NVARCHAR(50)
DECLARE @pos SMALLINT

SET @NowStartDate = GETDATE()

IF OBJECT_ID('tempdb..#ItmTableTmp') IS NULL
BEGIN
CREATE TABLE #ItmTableTmp (item nvarchar(50)
, itemSub nvarchar(50)
, u_m nvarchar(3)
, Qty decimal(10,5)
, Level int
, P_M_T_Code nvarchar (1))
END

INSERT INTO #RET_STItem
SELECT @item, jm.item, i1.u_m, jm.matl_qty, @pos, i1.p_m_t_code
FROM item i
INNER JOIN job j ON (i.item=j.item) AND (i.job = j.job) AND (i.suffix = j.suffix) AND (j.type = 'S')
INNER JOIN jobmatl jm ON (jm.job = j.job) AND (jm.suffix = j.suffix)
INNER JOIN item i1 ON i1.item = jm.item
WHERE i.item = @item
AND jm.alt_group_rank = 0
ORDER BY jm.sequence

DECLARE @itemSub NVARCHAR(255)
DECLARE @posNext SMALLINT
DECLARE @p_m_t_code NVARCHAR(2)
SET @posNext=@pos+1


DECLARE c_cur CURSOR LOCAL STATIC FOR SELECT itemsub, qtyBase, p_m_t_code FROM #RET_STItem WHERE Level=@Pos and item=@item
OPEN c_cur
FETCH NEXT FROM c_cur INTO @itemSub,@Col,@p_m_t_code
WHILE @@Fetch_status=0
BEGIN
IF (DATEDIFF(mi, @NowStartDate, GETDATE()) < 31)
BEGIN
IF @p_m_t_code='M' EXEC [DBO].[RET_ShowStructItem1] @itemSub, @posNext,@Col
END
FETCH NEXT FROM c_cur INTO @itemSub,@Col,@p_m_t_code
END
CLOSE c_cur
DEALLOCATE c_cur

SELECT r.item
, i1.description
, r.QtyConst
, level

FROM #RET_STItem r
INNER JOIN item i ON i.item=r.itemsub
INNER JOIN item i1 ON i1.item=r.item
ORDER BY r.level, r.item, r.seq


Альтернативный вариант, написан на SQL Server 2005

CREATE PROCEDURE [dbo].[MyProcSp] (@item NVARCHAR(255) = NULL)
AS
DECLARE @pos SMALLINT

WITH RptOut (item, itemSub, u_m, Qty, Level, P_M_T_Code)
AS
(
-- Оригинал
SELECT i.item
, jm.item
, i1.u_m
, jm.qty
, rp.Level + 1
, i1.p_m_t_code

FROM item i
INNER JOIN job j ON (i.item=j.item) and (i.job=j.job) and (i.suffix=j.suffix) and (j.type='S')
INNER JOIN jobmatl jm ON (jm.job=j.job) and (jm.suffix=j.suffix)
INNER JOIN item i1 ON i1.item=jm.item

WHERE i.item=@item
AND jm.alt_group_rank = 0

UNION ALL

-- Рекурсия
SELECT i.item
, jm.item
, i1.u_m
, jm.qty
, rp.Level + 1
, i1.p_m_t_code

FROM item i
INNER JOIN job j ON (i.item=j.item) and (i.job=j.job) and (i.suffix=j.suffix) and (j.type='S')
INNER JOIN jobmatl jm ON (jm.job=j.job) and (jm.suffix=j.suffix)
INNER JOIN item i1 ON i1.item=jm.item
INNER JOIN RptOut rp ON rp.itemSub = i.item

WHERE jm.alt_group_rank = 0
)

SELECT * FROM RptOut


Как это делается показано выше, а вот есть ли смысл.....

Проводил тест на статичной базе (в базе работал только 1 пользователь) по изделию в который входит более 1500 вхождений.

Старые наработки [CURSOR] => выполнилось за 326 мс
Новый вариант [WITH] => выполнилось за 216 мс

В среднем прирост получается 33%

Статичной базе сильно незаметна выгода, а в активно рабочей базе прирост будет ощутим.

P.S.: Первый код (CURSOR) взят с рабочей базы и был изсправлен, в связи с этим
некоторые данные не совподают ;)
Со временем поправлю


Практика показала что если использовать WITH то Таблица которую он создает, может использоватся толька 1 раз. Либо ее необходимо поместить во временную таблюцу.

Что это и зачем....

Данный блог, является записной книжкой. По работе приходится узнавать новые технологии, проводить тесты и сравнения, для хранения результатов решил создать данный блог дабы здесь выкладывать все свои находки и раскопки :)