<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог Джина Грина &#187; java</title>
	<atom:link href="http://blog.genegreen.ru/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.genegreen.ru</link>
	<description></description>
	<lastBuildDate>Sat, 24 Dec 2011 19:37:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Java at a terrible price</title>
		<link>http://blog.genegreen.ru/2010/06/26/java-at-a-terrible-price/</link>
		<comments>http://blog.genegreen.ru/2010/06/26/java-at-a-terrible-price/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 07:33:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Интересности]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[маразм]]></category>
		<category><![CDATA[отдых]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[социум]]></category>
		<category><![CDATA[юмор]]></category>

		<guid isPermaLink="false">http://blog.genegreen.ru/?p=1612</guid>
		<description><![CDATA[Оригинал: вот.]]></description>
			<content:encoded><![CDATA[<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/KrfpnbGXL70&#038;hl=en_US&#038;fs=1&#038;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/KrfpnbGXL70&#038;hl=en_US&#038;fs=1&#038;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<p>Оригинал: <a href="http://jz10.java.no/mediaplayer/JavaZoneTrailer.flv">вот</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.genegreen.ru/2010/06/26/java-at-a-terrible-price/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://jz10.java.no/mediaplayer/JavaZoneTrailer.flv" length="24412390" type="video/x-flv" />
		</item>
		<item>
		<title>Сериализация</title>
		<link>http://blog.genegreen.ru/2009/02/27/serialization/</link>
		<comments>http://blog.genegreen.ru/2009/02/27/serialization/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 16:04:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Интересности]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[ПО]]></category>
		<category><![CDATA[разработка]]></category>

		<guid isPermaLink="false">http://www.genegreen.ru/?p=169</guid>
		<description><![CDATA[В целях возможности разработки приложений парами (desktop-приложение и web-приложение, функционально не отличающиеся) решил использовать дополнительный слой в модели: веб-сервисы. Начал с технологии SOAP, которая по спецификации не предусматривает возможность пересылки объектов каких-то своих хитрых классов (custom classes). На помощь пришли &#8230; <a href="http://blog.genegreen.ru/2009/02/27/serialization/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>В целях возможности разработки приложений парами (desktop-приложение и web-приложение, функционально не отличающиеся) решил использовать дополнительный слой в модели: веб-сервисы. Начал с технологии SOAP, которая по спецификации не предусматривает возможность пересылки объектов каких-то своих хитрых классов (custom classes).</p>
<p>На помощь пришли два класса <code>XMLEncoder</code> и <code>XMLDecoder</code>, которые позволяют записывать в и читать из XML экземпляры классов, которые имеют доступный конструктор без аргументов и геттеры/сеттеры для всех полей, значения которых необходимы для восстановления объекта.</p>
<p>Ниже приведу свой вспомогательный класс со статическими шаблонными методами, позволяющими перегонять объект в байт-массив, который разрешено по спецификации SOAP пересылать, и обратно.</p>
<p><code>import java.beans.XMLDecoder;<br />
import java.beans.XMLEncoder;<br />
import java.io.BufferedOutputStream;<br />
import java.io.ByteArrayInputStream;<br />
import java.io.ByteArrayOutputStream;<br />
public class Serializer {<br />
&nbsp;&nbsp;&nbsp; public static &lt;T&gt; byte[] toByte(T t) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteArrayOutputStream baos = new ByteArrayOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLEncoder e = new XMLEncoder(new BufferedOutputStream(baos));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.writeObject(t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return baos.toByteArray();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static &lt;T&gt; T fromByte(byte[] bytes){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteArrayInputStream bais = new ByteArrayInputStream(bytes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (T) new XMLDecoder(bais).readObject();<br />
&nbsp;&nbsp;&nbsp; }<br />
}</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.genegreen.ru/2009/02/27/serialization/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Debian 5 &amp;Tomcat 6</title>
		<link>http://blog.genegreen.ru/2009/02/25/debian-5-tomcat-6/</link>
		<comments>http://blog.genegreen.ru/2009/02/25/debian-5-tomcat-6/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 06:54:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Работа]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[ПО]]></category>
		<category><![CDATA[разработка]]></category>

		<guid isPermaLink="false">http://www.genegreen.ru/?p=149</guid>
		<description><![CDATA[Как поставить шестой Tomcat на пятый Debian 1. Сначала ставим всю джаву: # aptitude install java6-runtime # aptitude install sun-java6-jdk Модуль sun-java6-jdk находится не в main, а в non-free, так что /etc/apt/sources.list должен быть примерно таким: deb http://mirror.yandex.ru/debian/ lenny main &#8230; <a href="http://blog.genegreen.ru/2009/02/25/debian-5-tomcat-6/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Как поставить шестой Tomcat на пятый Debian</strong></p>
<p>1. Сначала ставим всю джаву:<br />
<code># aptitude install java6-runtime<br />
# aptitude install sun-java6-jdk</code></p>
<p>Модуль <code>sun-java6-jdk</code> находится не в main, а в non-free, так что <code>/etc/apt/sources.list</code> должен быть примерно таким:<br />
<code>deb http://mirror.yandex.ru/debian/ lenny main non-free<br />
deb-src http://mirror.yandex.ru/debian/ lenny main non-free</code><br />
После изменения <code>sources.list</code>:<br />
<code># aptitude update</code></p>
<p>2. Качаем и ставим Tomcat<br />
<code># wget http://apache.rinet.ru/dist/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.tar.gz</code><br />
Распаковываем:<br />
<code># tar -xzvf apache-tomcat-6.0.18.tar.gz</code><br />
Переносим в /opt (тут нужны права su):<br />
<code># mv apache-tomcat-6.0.18 /opt/tomcat</code></p>
<p>Создаём скрипт <code>/etc/init.d/tomcat</code> для запуска, остановки и перезапуска Tomcat&#8217;а с текстом:<br />
<code>#!/bin/sh<br />
# Tomcat Init-Script<br />
case $1 in<br />
start)<br />
sh /opt/tomcat/bin/startup.sh<br />
;;<br />
stop)<br />
sh /opt/tomcat/bin/shutdown.sh<br />
;;<br />
restart)<br />
sh /opt/tomcat/bin/shutdown.sh<br />
sh /opt/tomcat/bin/startup.sh<br />
;;<br />
esac<br />
exit 0</code></p>
<p>3. Добавляем Tomcat в автозагрузку:<br />
<code># update-rc.d tomcat defaults</code></p>
<p>4. Прописываем пользователей для работы с админкой Tomcat&#8217;а в файлике <code>/opt/tomcat/conf/tomcat-users.xml</code>, например:<br />
<code>&lt; ?xml version='1.0' encoding='utf-8'?&gt;<br />
&lt;tomcat-users&gt;<br />
&lt;role rolename="manager"/&gt;<br />
&lt;role rolename="admin"/&gt;<br />
&lt;user username="tomcatusername" password="tomcatpassword" roles="admin,manager"/&gt;<br />
&lt;/tomcat-users&gt;</code></p>
<p>5. Стартуем Tomcat:<br />
<code># /etc/init.d/tomcat start</code></p>
<p>Теперь можно проверить работоспособность админки Tomcat&#8217;а по адресу: <code>http://server_ip:8080/manager/html/</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.genegreen.ru/2009/02/25/debian-5-tomcat-6/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Краткий курс RMI. Чать I</title>
		<link>http://blog.genegreen.ru/2008/10/21/rmi-part1/</link>
		<comments>http://blog.genegreen.ru/2008/10/21/rmi-part1/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 06:28:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Лекции]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rmi]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[учёба]]></category>

		<guid isPermaLink="false">http://www.genegreen.ru/?p=80</guid>
		<description><![CDATA[В этой лекции даётся краткий курс по использованию технологии RMI для написания распределённых приложений. Оригинал лекции доступен по адресу: http://java.sun.com/docs/books/tutorial/rmi/overview.html. Часть I Обзор приложений RMI Как правило, приложения RMI состоят из двух различных программ: сервера и клиента. Программа-сервер при этом &#8230; <a href="http://blog.genegreen.ru/2008/10/21/rmi-part1/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>В этой лекции даётся краткий курс по использованию технологии RMI для написания распределённых приложений. Оригинал лекции доступен по адресу: <a href="http://java.sun.com/docs/books/tutorial/rmi/overview.html">http://java.sun.com/docs/books/tutorial/rmi/overview.html</a>.</p>
<h2>Часть I</h2>
<h3>Обзор приложений RMI</h3>
<p>Как правило, приложения RMI состоят из двух различных программ: сервера и клиента. Программа-сервер при этом создаёт удалённые объекты (remote objects), делает ссылки на эти объекты доступными и ожидает, пока клиенты не начнут вызывать методы этих объектов, а программа-клиент получает ссылки на один или несколько удалённых объектов на сервере и вызывает их методы. Технология RMI предоставляет механизм, с помощью которого сервер и клиент общаются и передают друг другу информацию. Иногда такие приложения называют распределёнными объектными приложениями (distributed object application).</p>
<p>Распределённые объектные приложения должны осуществлять следующее:</p>
<ul>
<li><strong>Нахождение удалённых объектов.</strong> Приложения могут использовать различные механизмы получения ссылок на удалённые объекты. Например, приложение может зарегистрировать свои удалённые обхекты с помощью аппарата простых имён — ресстра RMI (RMI registry). В качестве альтернативы, приложение может передавать и вовзращать ссылки на удалённые объекты внтури других удалённых вызовов.</li>
<li><strong>Общение с удалёнными объектами.</strong> Детали взаимосвязи между удалёнными объектами управляется RMI. Для программиста удалённое общение выглядить почти так же, как и вызов обычных методов в Java.</li>
<li><strong>Загрузка определений классов, объекты которых передаются.</strong> Так как RMI позволяет передавать объекты, он также предоствляет механизмы загрузки определений классов и передачи информации объектов.</li>
</ul>
<p>Следующая иллюстрация отражает распределённое приложение RMI, использующее реестр RMI для получения ссылки на удалённый объект. Сервер вызывает реестр для того, чтобы связать имя с удалённым объектом. Клиент ищет удалённый объект по его имени в реестре сервера и затем вызывает его метод. Иллюстрация также показывает, как система RMI использует существующий веб-сервер для загрузки определений классов (с сервера на клиент и с клиента на сервер) для объектов по мере необходимости.</p>
<p style="text-align: center;"><a title="rmi-001" rel="lightbox[pics80]" href="http://blog.genegreen.ru/wp-content/uploads/2008/10/rmi-001.png"><img class="attachment wp-att-82 centered" src="http://blog.genegreen.ru/wp-content/uploads/2008/10/rmi-001.png" alt="rmi-001" width="439" height="197" /></a></p>
<h3>Преимущества динамической загрузки кода</h3>
<p>Одной из центральных и уникальных особенностей RMI является возможность загрузки определения класса объекта в случае, если класс не определён в виртуальной машине Java получателя. Все типы и поведения объекта, ранее доступные только на одной виртуальной машине Java, могут быть переданы в другую, возможно удалённую. RMI передаёт объекты по их действительным классам, следовательно не меняется их поведение при пересылке. Это позвляет вводить новые типы и поведения в удалённую виртуальную машину Java, а значит динамически расширять поведение приложения.</p>
<p>Приведённый в этой лекции пример «Вычислительный движок» использует эту возможность для внедрения нового поведения в распределённую программу.</p>
<h3>Удалённые интерфейсы, объекты и методы</h3>
<p>Как и любое приложение на Java, распределённое приложение, построенное с помощью RMI, состоит из интерфейсов и классов. Интерфейсы объявляют методы. Классы реализуют методы, объявленные в интерфейсах и, быть может, также объявляют дополнительные методы. В распределённом приложении некоторые реализации могут быть в одних виртуальных машинах Java и отсутствовать при этом в других. Объекты, методы которых могут вызываться из других виртуальных машин Java, называются удалёнными объектами (remote objects).</p>
<p>Объект становится удалённым при реализации удалённого интерфейса (remote interface), который обладает следующими свойствами:</p>
<ul>
<li>удалённый интерфейс наследуется от интерфейса <code>java.rmi.Remote</code>;</li>
<li>каждый метод интерфейса, помимо своих собственных исключений,  должен объявлять исключение <code>java.rmi.RemoteException</code> (служебное слово <code>throws</code>).</li>
</ul>
<p>RMI по-разному работает с удалёнными и обычными объектами при передачи от одной виртуальной машины Java к другой. Вместо копирования реализации объекта в получающую виртуальную машину, RMI передаёт стаб (stub) удалённого объекта. Стаб похож на локального представителя (посредника) удалённого объекта и для клиента, вообще говоря, является удалённой ссылкой. Клиент вызывает метод локального стаба, который отвечает за исполнение метода на удалённом объекте.</p>
<p>Стаб удалённого объекта реализует то же множество удалённых интерфейсов, что и удалённый объект. Это свойство позволяет приводить стаб к любому из интерфейсов, реализованных удалённым объектом. Тем не менее, лишь методы, определённые в удалённом интерфейсе, доступны для вызова из получающей виртуальной машины.</p>
<h3>Создание распределённого приложения с помощью RMI</h3>
<p>Разработка распределённого приложения с помощью RMI включает следующие общие шаги:</p>
<ol>
<li>Проектирование и реализация компонентов распределённой системы;</li>
<li>Компиляция исходников;</li>
<li>Предоставление сетевого доступа к классам;</li>
<li>Запуск приложения.</li>
</ol>
<h3>Проектирование и реализация компонентов приложения</h3>
<p>Во-первых, необходимо определить архитектуру приложения, включая локальные объекты и объекты, доступные удалённые. Это включает следующие шаги:</p>
<ul>
<li><strong>Определение удалённых интерфейсов.</strong> Удалённый интерфейс определяет методы, которые могут быть удалённо вызваны клиентом. Клиент программируется под удалённый интерфейс, а не под классы-реализации этих интерфейсов. Проектрирование таких интерфейсов включает определение типов объектов, которые будут использоваться в качестве параметров и возвращаемых значений для этих методов. Если какие-либо из этих интерфейсов ещё не существуют, то их тоже нужно определить.</li>
<li><strong>Реализация удалённых объектов.</strong> Удалённые объекты должны реализовать один или несколько удалённых интерфейсов. Класс удалённого объекта может включать реализации других интерфейсов и методов, которые будут доступны только локально. Если какой-либо локальный класс используется в качестве параметра или возвращаемого значения хотя бы одного из этих методов, то они должны быть тоже реализованы.</li>
<li><strong>Реализация клиентов.</strong> Клиенты, использующие удалённые объекты, могут быть реализованы в любой момент после того, как определены удалённые интерфейсы, и даже после того, как удалённые объекты были «задеплоены» (deployed).</li>
</ul>
<h3>Компиляция исходников</h3>
<p>Как и для любой другой программы на Java, используется компилятор <code>javac</code>. Исходные файлы содержат объявления удалённых интерфейсов, их реализаций, любых серверных и клиентских классов.</p>
<h3>Предоставление сетевого доступа к классам</h3>
<p>На этом шаге предоставляется доступ к определениям классов (таких, как удалённые интерфейсы, связанные с ними типы и определения классов, которые необходимо скачивать с клиентов или серверов). Обычно доступ к определениям классов осуществляется с помощью веб-сервера.</p>
<h3>Запуск приложения</h3>
<p>Запуск приложения включает запуск удалённого реестра объектов RMI, запуск севера и запуск клиента.</p>
<p><em>В следующей части будет описано создание приложения «Вычислительный движок».</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.genegreen.ru/2008/10/21/rmi-part1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

