<?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>JUG.ua &#187; наука</title>
	<atom:link href="http://jug.ua/category/science/feed/" rel="self" type="application/rss+xml" />
	<link>http://jug.ua</link>
	<description>weblog сообщества Java-разработчиков КПИ</description>
	<lastBuildDate>Sat, 19 May 2012 17:10:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Oracle vs Google</title>
		<link>http://jug.ua/2012/04/oracle-vs-google/</link>
		<comments>http://jug.ua/2012/04/oracle-vs-google/#comments</comments>
		<pubDate>Sun, 22 Apr 2012 19:49:12 +0000</pubDate>
		<dc:creator>randrey</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[наука]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://jug.ua/?p=968</guid>
		<description><![CDATA[Судебное заседание Oracle vs Google касательно Java. Задают вопрос Джошуа Блоху (Joshua Bloch): Q: Dr. Bloch: How did you learn the Java language? A: I read &#8220;Java in a Nutshell&#8221; on the plane on the way to my interview with Sun P.S. А люди говорят, что Java это сложный язык &#8230; Полная версия выступлений Так [...]]]></description>
			<content:encoded><![CDATA[<p>Судебное заседание Oracle vs Google касательно Java.<br />
Задают вопрос Джошуа Блоху (Joshua Bloch):<br />
<strong>Q: Dr. Bloch: How did you learn the Java language?</strong><br />
<strong> A: I read &#8220;Java in a Nutshell&#8221; on the plane on the way to my interview with Sun</strong></p>
<p>P.S. А люди говорят, что Java это сложный язык &#8230;</p>
<p><a href="http://www.groklaw.net/article.php?story=20120419221941261">Полная версия выступлений</a></p>
<p>Так же можно посмотреть слайды от <a href="http://www.oracle.com/us/corporate/features/opening-slides-1592541.pdf">Oracle</a> и <a href="http://www.slideshare.net/uzzal_me/google-opening-statementslidesoracletrial">Google</a>, которые компании представили на открытие судебного заседания и в которых они делают ретроспективу (правда каждый в свою пользу) Java и Android. Особенно красиво выглядит слайд 56-58, от Oracle $)</p>
]]></content:encoded>
			<wfw:commentRss>http://jug.ua/2012/04/oracle-vs-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Java: The Good, the Bad and the Ugly Parts&#8221; by Joshua Bloch</title>
		<link>http://jug.ua/2012/03/java-the-good-the-bad-and-the-ugly-parts-by-joshua-bloch/</link>
		<comments>http://jug.ua/2012/03/java-the-good-the-bad-and-the-ugly-parts-by-joshua-bloch/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 16:16:47 +0000</pubDate>
		<dc:creator>randrey</dc:creator>
				<category><![CDATA[наука]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Joshua Bloch]]></category>

		<guid isPermaLink="false">http://jug.ua/?p=954</guid>
		<description><![CDATA[Открыт свободный доступ к записи выступления Джошуа Блоха, где он оценивает хорошие и не очень аспекты Java. Во время этого доклада зал был заполнен полностью, включая ступеньки и свободные проходы.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">Открыт свободный доступ к записи выступления Джошуа Блоха, где он оценивает хорошие и не очень аспекты Java.</p>
<p style="text-align: center;"><object width="480" height="780" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="wmode" value="direct" /><param name="flashVars" value="sv=true&amp;pageId=2804" /><param name="src" value="http://www.parleys.com/dist/share/parleysshare.swf" /><param name="flashvars" value="sv=true&amp;pageId=2804" /><param name="allowfullscreen" value="true" /><embed width="480" height="780" type="application/x-shockwave-flash" src="http://www.parleys.com/dist/share/parleysshare.swf" allowFullScreen="true" wmode="direct" flashVars="sv=true&amp;pageId=2804" flashvars="sv=true&amp;pageId=2804" allowfullscreen="true" /></object></p>
<p style="text-align: center;">Во время этого доклада зал был заполнен полностью, включая ступеньки и свободные проходы.</p>
]]></content:encoded>
			<wfw:commentRss>http://jug.ua/2012/03/java-the-good-the-bad-and-the-ugly-parts-by-joshua-bloch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>В продолжении знакомства с JRebel</title>
		<link>http://jug.ua/2012/03/jrebel-continue/</link>
		<comments>http://jug.ua/2012/03/jrebel-continue/#comments</comments>
		<pubDate>Sun, 11 Mar 2012 12:11:42 +0000</pubDate>
		<dc:creator>randrey</dc:creator>
				<category><![CDATA[наука]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[Class Loader]]></category>
		<category><![CDATA[JRebel]]></category>

		<guid isPermaLink="false">http://jug.ua/?p=947</guid>
		<description><![CDATA[В дополнение к статье &#8220;Знакомимся с JRebel&#8221;. На встрече JUG.RU Антон Архипов (сотрудник компании ZeroTurnaround) выступил с двумя докладами посвященными внутренним принципам работы JRebel. Запись доклада и презентации доступны по ссылке. После просмотра узнаете, как можно в &#8220;домашних условиях&#8221; модифицировать байт-код в runtime $). И познакомитесь с библиотекой для манипуляций байт-кодом Javassist и JRebel SDK. А [...]]]></description>
			<content:encoded><![CDATA[<p>В дополнение к статье <a href="http://jug.ua/2012/01/jrebel/">&#8220;Знакомимся с JRebel&#8221;</a>.</p>
<p>На встрече <a href="http://www.jug.ru/archive/-/blogs/%D0%B0%D0%BD%D1%82%D0%BE%D0%BD-%D0%B0%D1%80%D1%85%D0%B8%D0%BF%D0%BE%D0%B2-%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-java-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8" target="_blank">JUG.RU</a> Антон Архипов (сотрудник компании <a href="http://zeroturnaround.com/">ZeroTurnaround</a>) выступил с двумя докладами посвященными внутренним принципам работы JRebel. Запись доклада и презентации доступны по <strong><a title="#JRebel @ JUG.ru" href="http://anton-arhipov.livejournal.com/219099.html" target="_blank">ссылке</a></strong>.</p>
<p>После просмотра узнаете, как можно в &#8220;домашних условиях&#8221; модифицировать байт-код в runtime $). И познакомитесь с библиотекой для манипуляций байт-кодом <strong><a title="Javassist" href="http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/" target="_blank"><span style="color: blue;">Javassist</span></a> </strong>и<strong> <a title="JRebel SDK" href="http://zeroturnaround.com/resources/jrebel-plugins/" target="_blank">JRebel SDK</a>.</strong></p>
<p>А для пониманию сути всего происходящего, помогут несколько глав книги <a title="Inside the Java Virtual Machine" href="http://www.artima.com/insidejvm/ed2/index.html" target="_blank"><em>Inside the Java Virtual Machine</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://jug.ua/2012/03/jrebel-continue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java и базы данных</title>
		<link>http://jug.ua/2012/03/java-for-beginners/</link>
		<comments>http://jug.ua/2012/03/java-for-beginners/#comments</comments>
		<pubDate>Mon, 05 Mar 2012 22:37:28 +0000</pubDate>
		<dc:creator>randrey</dc:creator>
				<category><![CDATA[анонс]]></category>
		<category><![CDATA[наука]]></category>

		<guid isPermaLink="false">http://jug.ua/?p=936</guid>
		<description><![CDATA[О Java простыми словам &#8211; серия бесплатных уроков для начинающих программистов на сайте javabegin.ru, а так же &#8220;Основы программирования на Java для начинающих&#8220;]]></description>
			<content:encoded><![CDATA[<p><a href="http://jug.ua/2012/03/java-for-beginners/"><em>Click here to view the embedded video.</em></a></p>
<p>О Java простыми словам &#8211; серия бесплатных уроков для начинающих программистов на сайте <a title="javabegin.ru" href="http://javabegin.ru" target="_blank">javabegin.ru</a>, а так же &#8220;<a href="http://javabegin.ru/subscribe/" target="_blank">Основы программирования на Java для начинающих</a>&#8220;</p>
]]></content:encoded>
			<wfw:commentRss>http://jug.ua/2012/03/java-for-beginners/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Матрица компетентности программиста</title>
		<link>http://jug.ua/2012/02/matrica-kompetentnosti-programmista/</link>
		<comments>http://jug.ua/2012/02/matrica-kompetentnosti-programmista/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 13:11:52 +0000</pubDate>
		<dc:creator>randrey</dc:creator>
				<category><![CDATA[наука]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://jug.ua/?p=918</guid>
		<description><![CDATA[Хорошая структура компетентности программиста, можно прямо в описание учебных программ вставлять: Матрица компетентности программиста Как это не удивительно, но довольно много из кандидатов имеют пробелы именно с первой и второй колонкой раздела Теория!!! Если хотите освежить свои знания по алгоритмам и структурам данных, советую онлайн-курс MIT Introduction to Algorithms А так же всем, кто в [...]]]></description>
			<content:encoded><![CDATA[<p>Хорошая структура компетентности программиста, можно прямо в описание учебных программ вставлять: <strong><a title="Матрица компетентности программиста / Programmer Competency Matrix" href="http://dev.by/page/programming_matrix">Матрица компетентности программиста</a></strong></p>
<p>Как это не удивительно, но довольно много из кандидатов имеют пробелы именно с первой и второй колонкой раздела Теория!!!</p>
<p>Если хотите освежить свои знания по алгоритмам и структурам данных, советую онлайн-курс MIT <a title="Introduction to Algorithms" href="http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/" target="_blank"><strong>Introduction to Algorithms</strong></a></p>
<p>А так же всем, кто в ближайшее время собирается идти на собеседование, советую посмотреть вообщем <strong><a title="Чтобы пройти собеседование на Java-программиста... " href="http://jug-lviv.blogspot.com/2010/09/java.html" target="_blank">стандартный список вопросов по Java</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://jug.ua/2012/02/matrica-kompetentnosti-programmista/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Знакомимся с JRebel</title>
		<link>http://jug.ua/2012/01/jrebel/</link>
		<comments>http://jug.ua/2012/01/jrebel/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 22:32:58 +0000</pubDate>
		<dc:creator>randrey</dc:creator>
				<category><![CDATA[наука]]></category>
		<category><![CDATA[Class Loader]]></category>
		<category><![CDATA[JRebel]]></category>

		<guid isPermaLink="false">http://jug.ua/?p=790</guid>
		<description><![CDATA[Осенью прошлого года на конференции JavaOne в Сан-Франциско, традиционно были присуждены награды лучшим проектам года &#8220;2011 Duke&#8217;s Choice Awards&#8221;. И хотелось бы подготовить цикл небольших статей, коротко описывающих каждый из проектов-победителей. Начнем данный цикл с номинации &#8220;Innovative Compiler for Java Code&#8221;, награду в которой получил проект JRebel, эстонской компании ZeroTurnaround, созданный Евгением Кабановым (Jevgeni Kabanov) и Томасом Румером (Toomas Römer). [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="JRebel" src="http://upload.wikimedia.org/wikipedia/en/thumb/f/f6/JRebel_logo.png/250px-JRebel_logo.png" alt="" width="192" height="88" />Осенью прошлого года на конференции <strong><a href="http://www.oracle.com/javaone/index.html" target="_blank">JavaOne</a></strong> в Сан-Франциско, традиционно были присуждены награды лучшим проектам года <strong><a title="2011 Duke's Choice Awards" href="http://java.com/en/dukeschoice/" target="_blank">&#8220;2011 Duke&#8217;s Choice Awards&#8221;</a>. </strong>И хотелось бы подготовить цикл небольших статей, коротко описывающих каждый из проектов-победителей.</p>
<p>Начнем данный цикл с номинации <strong>&#8220;Innovative Compiler for Java Code&#8221;,</strong> награду в которой получил проект <strong><a title="JRebel" href="http://www.zeroturnaround.com/jrebel/" target="_blank">JRebel</a></strong>, эстонской компании <a href="http://zeroturnaround.com">ZeroTurnaround</a>, созданный Евгением Кабановым (Jevgeni Kabanov) и Томасом Румером (Toomas Römer).</p>
<p><span id="more-790"></span>Стоит отметить, что это не единственная их награда за прошедший год, этот проект был признан <strong>&#8220;Самой инновационной технологией Java&#8221;</strong> на <a href="http://jax-awards.com/">JAX Innovation Awards</a>. А в числе пользователей JRebel значатся IBM, HP, AT&amp;T, Bank of America, Disney, LinkedIn, &#8230;</p>
<p><strong>Для того, чтобы понять предназначение JRebel начнем чуть-чуть издалека</strong></p>
<p>Рассмотрим два простых класса. Первый класс имеет лишь переопределенный метод toString():</p>
<pre class="brush: java; title: ; notranslate">
public class TestModule {
    @Override
    public String toString() {
        return &quot;TestModule, version 1!&quot;;
    }
}
</pre>
<p>Второй класс в бесконечном цикле создает экземпляр объекта первого класса и выводит его на экран:</p>
<pre class="brush: java; title: ; notranslate">
public class Test {
  public static void main(String[] argv) {
    for (;;) {
            TestModule t = new TestModule();
            System.out.println(t);
            System.console().readLine();
    }
  }
}
</pre>
<p>Если же во время выполнения программы мы изменим строку <em>&#8220;TestModule, version 1!&#8221;</em> на <em>&#8220;TestModule, version 2!&#8221;</em>, и применяя раздельную компиляцию заново скомпилируем класс <em>TestModule</em>, то от этого значение выводимой строки не измениться.</p>
<p>Это происходит потому, что стандартный (системный) ClassLoader при первом же обращении к классу, а точнее при вызове его конструктора (либо при обращении к статическому методу или полю), динамически загружает и кеширует байт-код класса в недра JVM, и в дальнейшем уже не обращается к файловой системе. Можете даже удалить файл <em>TestModule.class</em>, это никак не отразиться на работе программы.</p>
<p>Перечень загружаемых во время работы программы классов, и директории откуда они загружаются, можно узнать подставив при запуске программы ключик <em>java -verbose:class &#8230;.</em> Узнаете много чего интересного ;)</p>
<p>Из приведенного выше примера следует, то, что после изменения исходного кода (и, соответственно, байт-кода) необходимо перезапускать все приложение. А в случае промышленного (Java Web, Java EE) приложения заново разворачивать его на сервере. Вообщем-то логично.</p>
<p>Все бы ничего, но <a title="Java EE Productivity Report 2011" href="http://zeroturnaround.com/java-ee-productivity-report-2011/">проведенные исследования</a> показали, что разработчики тратят в среднем <strong>от 10 до 13 минут на час программирования</strong>, на периодическое развертывания приложений.</p>
<p>Чтобы сократить потери времени, необходимо &#8220;научить&#8221; JVM обновлять байт-код классов в случаи их изменений, без необходимости перезапуска приложения.</p>
<p>В простом случае для этого достаточно написать свой загрузчик классов, который наследуется от абстрактного класса ClassLoader, и переопределить в нем ряд методов таким образом, чтобы при каждом создании экземпляра класса его байт-код считывался с файловой системы. Это на самом деле делается не так страшно, как может показаться и подробно, вместе с примерами, описывается в статье <strong><a href="http://samag.ru/archive/article/68">&#8220;ClassLoader – скрытые возможности&#8221;</a></strong>.</p>
<p>Экземпляр собственного ClassLoader-а предается в качестве параметра статического метода <em>Class.forName(String name, boolean initialize, ClassLoader loader)</em>, после чего с помощью рефлексии создается экземпляр требуемого класса:</p>
<pre class="brush: java; title: ; notranslate">
public class Test {
  public static void main(String[] argv) throws Exception {
    for (;;) {
      ClassLoader loader = new DynamicClassOverloader(new String[] {&quot;.&quot;});
      // текущий каталог &quot;.&quot; будет единственным каталогом поиска для
      // класса &quot;TestModule&quot;
      Class clazz = Class.forName(&quot;TestModule&quot;,true,loader);
      Object object = clazz.newInstance();
      System.out.println(object);

      //TestModule test = (TestModule) object;

      System.console().readLine();
    }
  }
}
</pre>
<p>В данном примере <em><a href="http://jug.ua/wp-content/uploads/2012/01/DynamicClassOverloader.txt">DynamicClassOverloader</a></em> (код по ссылке) как раз и является нашим загрузчиком классов (подробности в указанной статье <a href="http://samag.ru/archive/article/68">&#8220;ClassLoader – скрытые возможности&#8221;</a>).</p>
<p>Можно проверить, что теперь во время работы программы при изменении строки <em>&#8220;TestModule, version 1!&#8221;</em> на <em>&#8220;TestModule, version 2!&#8221;</em> будет меняться и выводимое в консоль сообщение.</p>
<p>Все было бы замечательно, если бы не ряд особенностей. Первая из которых начнется если откомментировать 10 строчку. В результате получим замечательное RuntimeException:<br />
<code><br />
Exception in thread "main" java.lang.ClassCastException: TestModule cannot be cast to TestModule<br />
</code><br />
Почему оно происходит? Запустим нашу программу с ключиком <em>java -verbose:class Test</em>, и обратим внимание на следующий фрагмент:<br />
<code><br />
...<br />
[Loaded TestModule from __JVM_DefineClass__]<br />
TestModule, version 1!<br />
[Loaded TestModule from file:/C:/Projects/DynamicClassLoader/build/classes/]<br />
...<br />
</code><br />
В первой строке происходит загрузка класса <em>TestModule</em> с помощью нашего собственного загрузчика классов, во второй &#8211; вывод сообщения, в третей &#8211; стандартный (системный) загрузчик классов снова загружает класс <em>TestModule</em>, именно в тот момент когда пытаемся осуществить приведение типов:</p>
<pre class="brush: java; title: ; notranslate">
TestModule test = (TestModule) object;
</pre>
<p>Получается, что класс к которому мы хотим привести (преобразовать) объект загружен с помощью системного загрузчика, а класс на основании которого этот объект <em>object</em> был создан загружен с помощью нашего собственного загрузчика. Хоть классы одинаковы (и их байт-код идентичен), но загружены разными загрузчиками, и, как следствием, JVM считает их абсолютно разными.</p>
<p>Такую вот особенность, и далеко не единственную, которую нужно учитывать при написании собственного загрузчика классов.</p>
<p><strong>Теперь, что же такое JRebel</strong></p>
<p><strong></strong>JRebel &#8211; это плагин к JVM, который позволяет на лету перезагружать классы и другие ресурсы, которые были изменены с момента развёртывания приложения. При этом он не имеет тех проблем и особенностей, которые возникают при написании собственного загрузчика классов.</p>
<p>При загрузке класса в JVM, JRebel отслеживает соответствующий ему .class-файл и в случае его изменения подгружает изменившийся класс через расширенный загрузчик классов. При этом старые экземпляры классов и сам класс сохраняется, что позволяет приложению продолжать работу без потери данных. Новые же экземпляры класса будут создаются уже на основании обновленного байт-кода класса.</p>
<p>На данный момент JRebel поддерживает практически все изменения, которые могут осуществляться в исходном коде (<a title="JRebel Features Comparison Matrix" href="http://zeroturnaround.com/jrebel/features/" target="_blank">JRebel Features</a>):</p>
<ul>
<li>Changes to method bodies</li>
<li>Adding/removing Methods</li>
<li>Adding/removing constructors</li>
<li>Adding/removing fields</li>
<li>Adding/removing classes</li>
<li>Adding/removing annotations</li>
<li>Changing static field value</li>
<li>Adding/removing enum values</li>
<li>Changing interfaces</li>
</ul>
<p>за исключением изменений связанных с иерархией классов:</p>
<ul>
<li>Replacing superclass</li>
<li>Adding/removing implemented interfaces</li>
</ul>
<p>Есть ли аналоги? Да есть, но им далеко до возможностей JRebel. Сравнительную табличку аналогичных технологий и более подробное описание JRebel можно посмотреть в статье <a href="http://www.oracle.com/technetwork/middleware/weblogic/oraclewls-jrebel.pdf"><strong>Get to Production Sooner</strong></a>.</p>
<p><strong>Что еще посмотреть/почитать по теме</strong></p>
<ul>
<li>Отчет - <a title="Java EE Productivity Report 2011" href="http://zeroturnaround.com/java-ee-productivity-report-2011/">&#8220;Java EE Productivity Report 2011&#8243;</a></li>
<li>Видео с конференции и набор статей от автора JRebel, Евгения Кабанова - <a href="http://zeroturnaround.com/blog/reloading-objects-classes-classloaders/"> Reloading Java Classes: Technical Series</a></li>
<li>Статья - <a href="http://java.dzone.com/articles/5-jrebel-features-you-couldn%E2%80%99t">&#8220;5 JRebel Features You Couldn’t Do In The JVM&#8221;</a></li>
</ul>
<p>Также, компания  <a href="http://zeroturnaround.com">ZeroTurnaround</a> недавно выпустила свой новый продукт <strong><a href="http://zeroturnaround.com/liverebel/">LiveRebel</a></strong>. И если основной целью JRebel было сократить потери времени разработчиков на т.н. &#8220;Turnaround&#8221;, то LiveRebel в первую очередь рассчитан на обновление приложений на лету в &#8220;продакшане&#8221; без необходимости остановки их работы и с гарантией сохранения сессии.</p>
<p>Будем ждать таких же успехом LiveRebel!</p>
<p><strong>P.S.</strong> Если кто-то захочет написать небольшую статью о других проектах получивших награды  <a title="2011 Duke's Choice Awards" href="http://java.com/en/dukeschoice/" target="_blank">&#8220;2011 Duke&#8217;s Choice Awards&#8221;</a>, не стесняйтесь ;)</p>
<p><em>За помощь в подготовке данного материа спасибо Полянскому Дмитрию</em></p>
]]></content:encoded>
			<wfw:commentRss>http://jug.ua/2012/01/jrebel/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Будущее Java &#8211; грядущие новшества Java 8</title>
		<link>http://jug.ua/2011/12/java-8/</link>
		<comments>http://jug.ua/2011/12/java-8/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 22:02:13 +0000</pubDate>
		<dc:creator>randrey</dc:creator>
				<category><![CDATA[наука]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java 8]]></category>

		<guid isPermaLink="false">http://jug.ua/?p=689</guid>
		<description><![CDATA[По результатам выступлений на конференции &#8220;Сиклум Java Субботник&#8221; и Встречи JUG KPI (посвященных лямбда выражениям (функциям) в Java), несколько небольших примеров и пояснений к презентации &#8220;Будущее Java, грядущие новшества Java 8&#8243; (видео доклада), а также исходный код приводимых примеров. Для начала стоит предупредить, что все излагаемое в презентации может измениться; не думаю, правда, что радикально, [...]]]></description>
			<content:encoded><![CDATA[<p>По результатам выступлений на конференции <a href="http://habrahabr.ru/company/Ciklum/blog/133628/">&#8220;Сиклум Java Субботник&#8221;</a> и <a href="http://jug.ua/2011/11/vstrecha-jug-kpi-1-dekabrya/">Встречи JUG KPI</a> (посвященных лямбда выражениям (функциям) в Java), несколько небольших примеров и пояснений к презентации <a href="http://jug.ua/wp-content/uploads/2011/12/Java8_Ciklum.pdf"><strong>&#8220;Будущее Java, грядущие новшества Java 8&#8243;</strong></a> (<a href="http://www.youtube.com/watch?v=TFH8ZTcxnL0&amp;list=UUlYsF7DXWqjF38dVEIvaEaQ&amp;index=1&amp;feature=plcp">видео доклада</a>), а также <a href="http://jug.ua/wp-content/uploads/2011/12/Java8_examp.zip">исходный код</a> приводимых примеров.</p>
<p>Для начала стоит предупредить, что все излагаемое в презентации может измениться; не думаю, правда, что радикально, но все же. Так, к примеру, за время, прошедшее между двумя докладами, <em>defender methods</em> успели окончательно сменить название на <em>virtual extension methods</em>.</p>
<p>И второе, те примеры кода, которые приводились во время презентации, работают! Точнее, почти работают&#8230; Вы можете скачать предварительную версию <a href="http://jdk8.java.net/lambda/">JDK 8 с поддержкой лямбда-выражений</a> и начать экспериментировать.</p>
<p><span id="more-689"></span></p>
<ul>
<li><strong><em>Virtual extension methods</em></strong></li>
</ul>
<p>Итак, предположим, мы имеем интерфейс <strong><em>NewInterface</em></strong> и хотим в него добавить новый метод <strong><em>void test()</em></strong> без необходимости его реализации в классах, которые реализуют данный интерфейс. Для этого в третьей строке, после описания метода, добавляем ключевое слово <strong><em>default</em></strong> и указываем имя класса, а также статического метода в данном классе, который будет вызываться в случае обращения к методу <strong><em>void test()</em></strong>.</p>
<pre class="brush: java; title: ; notranslate">
interface NewInterface{
void test2();
void test() default DefaultClass.test;
          //default { DefaultClass.test(this);};
}</pre>
<p>Код в третьей строке и будет тем самым <em>virtual extension method</em>.</p>
<p>В одном из описаний упоминается, что к методу вызываемому по умолчанию, после слова default можно обращаться так, как сделано в 4 строке, но в данный момент такой код не компилируется.</p>
<p>Класс <strong><em>DefaultClass</em></strong> выглядит следующим образом:</p>
<pre class="brush: java; title: ; notranslate">
class DefaultClass {
    public static void test(NewInterface ni){
        System.out.println(&quot;Default Hello&quot;);
    }
}
</pre>
<p>Теперь можно написать класс <strong><em>NewClass</em></strong> реализующий наш интерфейс <strong><em>NewInterface</em></strong>:</p>
<pre class="brush: java; title: ; notranslate">
class NewClass implements NewInterface{
	public void test2(){
		System.out.println(&quot;My Hello&quot;);
	}
}
</pre>
<p>Метод test2() &#8220;нормальный&#8221;, поэтому его мы обязаны реализовать. Если мы реализуем и метод <strong><em>void test()</em></strong>, то при обращении к нему будет вызываться данная реализации, иначе &#8211; дефолтная реализация из класса <strong><em>DefaultClass</em></strong>.</p>
<p>Протестируем то, что получилось, выполнив следующий код:</p>
<pre class="brush: java; title: ; notranslate">
public class Java8DefenderTest {
    public static void main(String[] args) {
        NewInterface ni = new NewClass();
		ni.test2();
		ni.test();
	}
}
</pre>
<p>Компиляция проходит без ошибок, а вот при запуске получаем следующее:<br />
<code><br />
My Hello<br />
Exception in thread "main" java.lang.AbstractMethodError: java8defender.NewClass.test()V<br />
at java8defender.Java8DefenderTest.main(Java8DefenderTest.java:26)<br />
</code><br />
И с этим, к сожалению, я пока не знаю что делать :( Можно было бы предположить, что поддержка <em>virtual extension methods</em> еще не реализована, но новые методы по работе с коллекциями их уже успешно используют.</p>
<p>С тем, как с помощью <em>virtual extension methods</em> реализовать множественное наследование поведения, вы можете ознакомиться на слайде 11 презентации.</p>
<p>Дополнительную информацию о <em>virtual extension methods</em> можно почерпнуть из документа <a href="http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf">&#8220;Interface evolution via virtual extension methods&#8221;</a>, а для любителей дискретной математики и формальных грамматик из <a href="http://cr.openjdk.java.net/~briangoetz/lambda/featherweight-defenders.pdf">&#8220;Featherweight Defenders: A formal model for virtual extension methods in Java&#8221;</a>.</p>
<ul>
<li><strong><em>Лямбда-выражения</em></strong></li>
</ul>
<p>Говоря короток, лямбда-выражение &#8211; это удобный способ реализации анонимного класса на основе интерфейса, содержащего единственный метод. Интерфейс содержащий единственный метод называется <em>функциональным интерфейсом</em> (<em>functional interface</em>). К примеру, такие интерфейсы как <em>Runnable, Callable, EventHandler и Comparator</em> являются функциональными.</p>
<p>Рассмотрим пример. Пусть у нас есть следующий интерфейс:</p>
<pre class="brush: java; title: ; notranslate">
interface F1{
	int add(int x, int y);
 }
</pre>
<p>Его реализация с помощью анонимного класса и вызов метода add(int x, int y) будут следующими:</p>
<pre class="brush: java; title: ; notranslate">
F1 fun = new F1(){
	public int add(int x, int y){
		return x+y;
	}
};
fun.add(3,5);
</pre>
<p>С помощью лямбда-выражения данный анонимный класс переписывается следующим образом:</p>
<pre class="brush: java; title: ; notranslate">
F1 func1 = (a,b) -&gt; a+b;
int i = 5, j = 13;
func1.add(i,j);
</pre>
<p>В круглых скобках указываются входные параметры (в соответствии с параметрами метода), а после стрелки &#8211; тело (реализация) того самого единственного метода, который был объявлен в интерфейсе. При желании его (тело) можно заключить в фигурные скобки и написать <em>return</em>:</p>
<pre class="brush: java; title: ; notranslate">
F1 func1 = (a,b) -&gt; {
        System.out.println(&quot;a=&quot; + a);
        System.out.println(&quot;b=&quot; + b);
        return a+b;
}
int i = 5, j = 13;
func1.add(i,j);
</pre>
<p>В блоке кода может быть реализована и любая другая функциональность, а также могут выполняться обращения к переменным за пределами лямбда-выражения. Ограничение: внешние переменные должны быть т.н. <em>effectively final</em>, то есть вести себя как переменная перед которой стоял бы модификатор <em>final</em>.</p>
<p>Основное значение и преимущество лямбда-выражений состоит в том, что их можно передавать в качестве параметров в методы в удобном компактном виде (пример на слайде 26). Так же планируется, что в будущем можно будет в качестве параметров передавать ссылки на методы и конструкторы, без их непосредственного вызова. К примеру:</p>
<pre class="brush: java; title: ; notranslate">
String::isEmpty
&quot;abc&quot;::length
Person::getLastName
ArrayList&lt;String&gt;::new
</pre>
<p>Но на данный момент эта функциональность еще не работает.</p>
<p>Детальнее про <em>лямбда-выражения</em> можно почитать в проекте <a href="http://jcp.org/aboutJava/communityprocess/edr/jsr335/index.html">Lambda Specification</a> либо в более короткой статье <a href="http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html">State of the Lambda</a> (кстати обнаружил ее новую версию лишь сейчас).</p>
<ul>
<li><strong><em>Functional Collection Patterns</em></strong></li>
</ul>
<p>Судя по тому, что написано в <a href="http://openjdk.java.net/jeps/">JDK Enhancement Proposals</a> (JEP), <em>virtual extension methods</em> и <em>лямбда-выражения</em> добавляются в Java с целью введение функциональных методов (функций высшего порядка) по работе с коллекциями &#8211; Functional Collection Patterns. Эти методы: filter, map, reduce (свертка), а так же целый ряд других, уже добавлены в интерфейс <a href="http://hg.openjdk.java.net/lambda/lambda/jdk/file/a08e29fbdb3b/src/share/classes/java/lang/Iterable.java"><em>Iterable.java</em></a> с использованием <em>virtual extension methods</em>. Данные методы будут работать с коллекциями и в качестве параметров будут принимать <em>лямбда-выражения</em>, которые и будут определять, чего именно мы хотим добиться от нашей коллекции:</p>
<pre class="brush: java; title: ; notranslate">
List&lt;Student&gt; students = ...
double highestScore =
    students.filter(s -&gt; s.getGradYear() == 2010 || s.getGradYear() == 2011)
        .map(s -&gt; s.getScore())
	  //.map(Student::getScore) //либо указатель на функцию, пока не работает
	    .reduce(0.0, (left, right) -&gt; (left &gt; right) ? left : right );
</pre>
<p>Но основной целью является даже не добавление методов по работе с коллекциями, а добавление параллельных версий этих методов, оптимизированных для оптимальной работы с большими объемами данных на многоядерных (многопроцессорных) системах. Параллелизм будет основываться на подходе «divide-and-conquer» с использование <em>Fork-Join framework</em> из Java 7. Загляните в исходный код <a href="http://hg.openjdk.java.net/lambda/lambda/jdk/file/a08e29fbdb3b/src/share/classes/java/util/ParallelIterables.java"><em>ParallelIterables.java</em></a> и увидите там универсальный алгоритм для параллельной работы с коллекциями.</p>
<p>К сожалению, статей и материалов по данной тематике я не нашел. Разве только презентация Brian Goetz <a href="http://blogs.oracle.com/briangoetz/resource/devoxx-lang-lib-vm-co-evol.pdf"><strong>&#8220;Language / Library / VM co-evolution in Java SE 8&#8243;</strong></a> с конференции <a href="http://www.devoxx.com/display/DV11/Home">Devoxx 2011</a>. Ну а так же исходный код будущей Java SE 8 ;)</p>
<p>Так что пока ждемс &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://jug.ua/2011/12/java-8/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Шлях PHP-програміста</title>
		<link>http://jug.ua/2011/10/way-of-php-programmer/</link>
		<comments>http://jug.ua/2011/10/way-of-php-programmer/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 22:35:56 +0000</pubDate>
		<dc:creator>randrey</dc:creator>
				<category><![CDATA[наука]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://jug.ua/?p=627</guid>
		<description><![CDATA[Що треба щоб грати на барабані? – Ну, що там, взяв та барабаниш! Що треба щоб грати на скрипці? – Довго та нудно вчитись поки вийдуть якісь приємні для слуху звуки. В чомусь схожа ситуація і з програмуванням на PHP. Як виявилось, моя ремарка у попередній статті  стосовно «PHP-програмістів» багато кого зачепила. На справді, саме [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: right;"><em>Що треба щоб грати на барабані? – Ну, що там, взяв та барабаниш!</em><br />
<em>Що треба щоб грати на скрипці? – Довго та нудно вчитись поки вийдуть якісь приємні для слуху звуки.</em></p>
<p style="text-align: justify;">В чомусь схожа ситуація і з програмуванням на PHP. Як виявилось, моя ремарка <a href="http://jug.ua/2011/09/shlyax-programista/">у попередній статті</a>  стосовно «PHP-програмістів» багато кого зачепила. На справді, саме з таким ставленням Ви і можете зіштовхнутись потрапивши у професійне середовище, і Вам доведеться доводити рівень своєї компетенції, як PHP-програміста (тут вже без лапок і цілком серйозно).</p>
<p style="text-align: justify;"><span id="more-627"></span>У цій статті хотів би, по-перше, вибачитись перед тими людьми, кого мимоволі образив, і пояснити чому склалась саме така ситуація.</p>
<p style="text-align: justify;">Одразу ж скажу, що не маю ніякого упередженого ставлення до PHP чи будь якої іншої мови (звісно крім Java $). І дійсно, як можна ставитись до мови на якій розроблені найбільші соціальні мережі <em>Facebook</em> та <em>ВКонтакте</em>, а також найбільш популярна система для Інтернет-крамниць <em>Magento</em>. Крім цього, світ IT все більше вимагає те що зветься <a href="http://blogs.computerworld.com/15032/polyglot_programming_development_in_multiple_languages">&#8220;polyglot programming&#8221;</a>. Тобто програми, і навіть їх окремі частини, можуть розроблятись з використанням тієї мови, яка буде найбільш зручна та ефективна для вирішення певної задачі.</p>
<p style="text-align: justify;"><a href="http://openjdk.java.net/projects/mlvm/"><img class="alignright" style="border: 3px solid white;" title="Da Vinci" src="http://openjdk.java.net/projects/mlvm/images/helicopter.png" alt="" width="214" height="152" /></a></p>
<p style="text-align: justify;">До речі, у віртуальній машині Java є проект під назвою <a href="http://openjdk.java.net/projects/mlvm/index.html"><strong><em>Da Vinci Machine</em></strong></a>, в рамках якого в Java Virtual Machine вже реалізована підтримка таких мов як <em>Ruby (JRuby), Python (Jython), JavaScript</em> та ін. А також, є проект <strong><em><a href="http://www.caucho.com/">Resin</a></em></strong> – <em>“100% Java implementation of PHP 5”</em>.</p>
<p style="text-align: justify;">Що ці всі мови дозволяють робити? Користуватись всіма компоненти та сервісами з яких складається Java-платформа, і при цьому програмувати на тій мові, яка найбільш зручна та ефективна для вирішення вашої задачі. Теоретично, гадаю, без особливих проблем (крім авторських прав) можна було б включити до вище наведеного переліку і C# з Visual Basic .NET ;)</p>
<p style="text-align: justify;">Тепер переходимо до «але» та PHP.</p>
<p style="text-align: justify;">Так от, що стосується  PHP, то тут склалась така ситуація, що ця мова здається настільки легкою, що на ній без особливих зусиль щось пишуть школярі, вже навіть не старших, а середніх класів. Кажу це як людина, яка приймала участь у оцінці фінальних робіт на конкурсах школярів, які проводили компанії Intel (<a href="http://www.isef.kpi.ua">Intel Techno</a>) та Oracle (<a href="http://www.thinkquest.org/en/">ThinkQuest</a>). PHP там був на другому місці за популярністю (на першому був Flash). І от, деякі з цих школярів починають вважати себе досвідченими «PHP-програмістів» (тут знову в лапках), і прямо про це заявляють мотивуючи тим, що вже на комерційній основі розробляють сайти.</p>
<p style="text-align: justify;">Така сама ситуація була колись і з програмістами на Delphi (до речі, мова на який написаниі <em>Skype</em> та <em>The Bat!</em>). Від тих програм на Delphi, які були у великій кількості незрозуміло як написані переважно для наших державних структур просто хочеться тікати, як від якогось жаху!</p>
<p style="text-align: justify;">Так от, свою попередню статтю я закінчив не закликом «Не ставайте «PHP-програмістами!», а скоріше проханням «Не поспішайте ставати «PHP-програмістами». Це значить, що не треба поспішати барабанити по барабану, а необхідно, щоб навчитись гарно грати на ньому, так само багато вчитись, як і грі на скрипці. Від того, що PHP задається легкою не слідує те, що часу для його вивчення треба витратити менш ніж для Java.</p>
<p style="text-align: justify;">Як м<a href="http://i.imgur.com/1gF1j.jpg"><img class="alignleft" title="as seen by ..." src="http://i.imgur.com/1gF1j.jpg" alt="" width="261" height="169" /></a>ені розповідали в одній із компаній для підготовки PHP-програмістів застосовують наступну методику. Спочатку людей вчать Java Enterprise Edition, особливу увагу приділяючи саме архітектурі та шаблонам проектування, які там реалізовані. Після цього від них вимагають реалізовувати той самий архітектурний підхід при розробці програм на PHP.</p>
<p style="text-align: justify;">І на останок,<strong> <a title="as seen by ..." href="http://i.imgur.com/1gF1j.jpg">картинка</a></strong>, яка має всіх примирити.</p>
]]></content:encoded>
			<wfw:commentRss>http://jug.ua/2011/10/way-of-php-programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Шлях програміста</title>
		<link>http://jug.ua/2011/09/shlyax-programista/</link>
		<comments>http://jug.ua/2011/09/shlyax-programista/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 23:27:11 +0000</pubDate>
		<dc:creator>randrey</dc:creator>
				<category><![CDATA[наука]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://jug.ua/?p=533</guid>
		<description><![CDATA[Ця замітка адресована початківцям – студентам першокурсникам (але сподіваюсь що вона буде корисною й іншим людям). Знаю, що багато з Вас задавались питанням: «А чи стану я програмістом?». Відповідь на нього, поки що, навряд чи Вам хтось зможе дати, але вона з’явиться згодом, коли Ви почнете рухатись по обраному Вами професійному шляху. Щоб допомогти зорієнтуватись, [...]]]></description>
			<content:encoded><![CDATA[<p>Ця замітка адресована початківцям – студентам першокурсникам (але сподіваюсь що вона буде корисною й іншим людям). Знаю, що багато з Вас задавались питанням: «А чи стану я програмістом?». Відповідь на нього, поки що, навряд чи Вам хтось зможе дати, але вона з’явиться згодом, коли Ви почнете рухатись по обраному Вами професійному шляху. Щоб допомогти зорієнтуватись, наведу «дорожню карту», на якій представлені основні блоки дисциплін, що є необхідними до вивчення.</p>
<p><span id="more-533"></span></p>
<p><a href="http://jug.ua/wp-content/uploads/2011/09/DevEdu.png"><img class="size-medium wp-image-534 alignleft" style="border: 0pt none; margin: 4px;" title="DevEdu" src="http://jug.ua/wp-content/uploads/2011/09/DevEdu-241x300.png" alt="" width="193" height="240" /></a></p>
<p>У складанні цієї «дорожньої карти» приймав участь цілий колектив людей, з декількох компаній, які професійно займаються як системним так і промисловим програмуванням.<br />
Хотів би відмітити, що багато початківців намагаються пропустити перший блок &#8211; «Основи програмування», до речі він є одними з найскладніших, і перейти одразу ж до так званого промислового програмування, переважно на мові PHP. Результатом цього є   вихідний код на який без сліз важко дивитись, де людині якось вдається реалізувати відомі лінійні алгоритми з експоненційною складністю, а яким чином даний код працює не розуміє навіть його автор. У професійному середовищі для таких «програмістів» є свій діагноз – «PHP-програміст». Отож, не поспішайте ставати «PHP-програмістами» ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://jug.ua/2011/09/shlyax-programista/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[ann] экспертная система Nigma.ru</title>
		<link>http://jug.ua/2009/06/expert-system-nigmaru/</link>
		<comments>http://jug.ua/2009/06/expert-system-nigmaru/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 08:59:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[наука]]></category>
		<category><![CDATA[ru]]></category>
		<category><![CDATA[spotlight]]></category>

		<guid isPermaLink="false">http://jug.ua/?p=190</guid>
		<description><![CDATA[nigma.ru &#8211; онлайн-система, позволяющую как производить простейшие арифметические преобразования, так и решать математические задачи различной степени сложности. Также Нигма распознает более тысячи физических, математических констант и единиц измерения, что позволяет производить операции со множеством величин (в том числе решать с ними уравнения) и получать ответ в требуемых единицах измерения. Помимо уравнений система решает все задачи, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nigma.ru">nigma.ru</a> &#8211; онлайн-система, позволяющую как производить простейшие арифметические преобразования, так и решать математические задачи различной степени сложности. Также Нигма распознает более тысячи физических, математических констант и единиц измерения, что позволяет производить операции со множеством величин (в том числе решать с ними уравнения) и получать ответ в требуемых единицах измерения.</p>
<p>Помимо уравнений система решает все задачи, характерные для калькуляторов поисковых систем и конверторов валют. Однако Нигма умеет считать в дробях и знает общеупотребимые синонимы валют.</p>
<p>Пример &#8211; <a title="биквадратное уравнение" href="http://nigma.ru/index.php?s=x2+-+3x+%2B+2+%3D+0&amp;t=web&amp;yn=1&amp;gl=1&amp;rm=1&amp;ms=1&amp;av=1&amp;yh=1&amp;ap=1&amp;nm=1&amp;lang=all&amp;rg=&amp;fs=autocomplete">биквадратное уравнение</a> c развёрнутым ходом решения:</p>
<p><a href="http://jug.ua/wp-content/uploads/2009/06/nigma-biquadratic-equation.jpg"><img class="alignnone size-medium wp-image-191" title="nigma-biquadratic-equation" src="http://jug.ua/wp-content/uploads/2009/06/nigma-biquadratic-equation-187x300.jpg" alt="nigma-biquadratic-equation" width="187" height="300" /></a></p>
<p>Подробнее о математических и лингвистических способностях нигмы можно почитать на сайте nigma.ru.</p>
<p>Что умеет nigma &#8211; <a href="http://nigma.ru/index_menu.php?action=click_menu&amp;menu_element=math_task_list">http://nigma.ru/index_menu.php?action=click_menu&amp;menu_element=math_task_list</a>:</p>
<ul>
<li>решать уравнения, в т.ч. с единицами измерения и математическими и физическими константами, а также системы уравнений</li>
<li>Конвертировать валюты</li>
<li>Раскладывать на множители числа и буквенные выражения</li>
<li>Находить наименьшее общее кратное и наибольший общий делитель чисел; определять взаимно простые числа</li>
<li>Вычислять модуль числа</li>
<li>Сравнивать числа (с пониманием математических констант вроде &#8220;пи&#8221;), сортировать числа по возрастанию и убыванию</li>
<li>Вычислять численные выражения, раскрывать скобки, сокращать дроби, упрощать буквенные выражения, упрощать тригонометрические выражения</li>
<li>Определять знак буквенного выражения (если возможно)</li>
<li>Представлять многочлен в виде квадрата</li>
<li>Приводить подобные слагаемые</li>
<li>Приводить дроби к общему знаменателю</li>
</ul>
<p>Что понимает: <a href="http://nigma.ru/index_menu.php?action=click_menu&amp;menu_element=math_phrase_list">http://nigma.ru/index_menu.php?action=click_menu&amp;menu_element=math_phrase_list</a> &#8211; фразы &#8220;Вычислить&#8221;, &#8220;Решить&#8221;, НОК, НОД, Сортировка (Упорядочить), Общий знаменатель, Делители, Модуль, Сравнить, Раскрыть скобки, Представить в виде квадрата, Привести подобные, Сократить, Упростить, Взаимно простые, Знак.</p>
<p>См. также заметку <a href="http://jug.ua/2009/06/wolframalpha-vs-google-squared/">Wolfram|Alpha vs Google Squared</a></p>
<p>happy computing!</p>
]]></content:encoded>
			<wfw:commentRss>http://jug.ua/2009/06/expert-system-nigmaru/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

