<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4252337628624509450</id><updated>2012-01-04T19:56:04.662+02:00</updated><category term='linux'/><category term='javafx'/><category term='rules'/><category term='visualization'/><category term='scala'/><category term='cv'/><category term='mysql'/><category term='java'/><category term='swing'/><category term='development'/><category term='integration test'/><category term='maven'/><category term='UML'/><category term='skype'/><category term='info'/><category term='brainbench'/><category term='web services'/><category term='NetBeans'/><category term='Oracle'/><category term='gui'/><category term='LnF'/><category term='interview'/><category term='tests'/><category term='android'/><category term='SUN'/><category term='RI'/><category term='Rebol'/><category term='sql'/><category term='soft'/><category term='metawidget'/><category term='bsaf'/><category term='ubuntu'/><title type='text'>ETF_DevLab</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>68</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-7037494202927505559</id><published>2011-06-08T14:26:00.002+03:00</published><updated>2011-06-08T14:27:40.401+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX SplitPane usage</title><content type='html'>Так получилось, что API этого полезнейшего компонента был изменен в последний момент перед релизом JavaFX 2.0 Beta. В результате мы получили следующий пример в официальной документации:&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
 SplitPane sp = new SplitPane();
 sp.setLeft(new Button("LEFT BUTTON"));
 sp.setRight(new Button("RIGHT BUTTON"));
 sp.setDividerLocation(0.4f);&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Если вы попробуете использовать этот пример в своей программе, то столкнетесь с неприятной проблемой. Класс SplitPane не имеет методов setLeft или setRight. Кто виноват и что делать? Прежде всего не следует нервничать. Создатели компонента посчитали, использование методов setLeft, setRight, setTop, setBottom не очень удобным и хорошим с точки зрения использования. Более того, этот вариант API плохо масштабируется. Представим, что нам нужно разделить панель не на 2 участка, а на 3 или более? Решение такой задачи может оказаться очень некрасивым с таким API. Именно поэтому в релизе было решено использовать другой, более гибкий подход. &lt;br /&gt;
В SplitPane были добавлены методы для управления внутренним списком компонентов. Таким образом пользователь просто добавляет необходимое количество компонентов в список и указывает какая ориентация у SplitPane. Далее можно посмотреть вариант кода, который будет работать на текущей версии JavaFX:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
        SplitPane p1 = new SplitPane();
        SplitPane p2 = new SplitPane();
        SplitPane p3 = new SplitPane();

        p1.getItems().addAll(p2, p3);
        p2.setOrientation(Orientation.VERTICAL);
        p3.setOrientation(Orientation.VERTICAL);
        p2.getItems().addAll(new Label("1"), new Label("2"));
        p3.getItems().addAll(new Label("3"), new Label("4"), new Label("5"));
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Если выполнить этот код, то мы увидим примерно следующую картинку:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VPVbFwQsRWA/Te9bxvBAhMI/AAAAAAAAKNk/o4DAcKi4aR0/s1600/SplitPane.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://4.bp.blogspot.com/-VPVbFwQsRWA/Te9bxvBAhMI/AAAAAAAAKNk/o4DAcKi4aR0/s400/SplitPane.png" width="316" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-7037494202927505559?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/7037494202927505559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=7037494202927505559' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/7037494202927505559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/7037494202927505559'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2011/06/javafx-splitpane-usage.html' title='JavaFX SplitPane usage'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-VPVbFwQsRWA/Te9bxvBAhMI/AAAAAAAAKNk/o4DAcKi4aR0/s72-c/SplitPane.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-3218214244447087622</id><published>2011-06-02T15:25:00.000+03:00</published><updated>2011-06-02T15:25:08.383+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX vs Java Swing vs AWT</title><content type='html'>A long awaiting JavaFX 2.0 Beta is finally here. I couldn't help trying it one more time and implemented some very basic application.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
I used SWING, AWT and javaFX to implement the same naive calculator application. The overall impression is quite good. Some issues I have to mentioned:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I couldn't find a way to set the alignment of a component (node) inside the grid layout.&lt;/li&gt;
&lt;li&gt;ChoiceBox behaves in a very strange way. The user experience is very odd with keyboard.&lt;/li&gt;
&lt;li&gt;ChoiceBox changes its size during selection.&lt;/li&gt;
&lt;li&gt;I don't any means to support Action like approach.&lt;/li&gt;
&lt;li&gt;JavaFX components doesn't support localization out of the box.&lt;/li&gt;
&lt;li&gt;Documentation is incomplete&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
It is also interesting to compare appearance of different java GUI toolkits: &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2yiXbuui-Js/Ted5WKUqP0I/AAAAAAAAKM0/3LaZm6QNQNE/s1600/FX.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="http://4.bp.blogspot.com/-2yiXbuui-Js/Ted5WKUqP0I/AAAAAAAAKM0/3LaZm6QNQNE/s320/FX.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
You can easily recognize ancient AWT, Swing trying to mimic native look and feel and absolutely modern JavaFX.&lt;br /&gt;
&lt;br /&gt;
Another figure shows memory consumption of thous applications: &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-VCOARfITkRA/Ted7jEv4l3I/AAAAAAAAKNE/k3rxzf4nIcE/s1600/FX2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="42" src="http://2.bp.blogspot.com/-VCOARfITkRA/Ted7jEv4l3I/AAAAAAAAKNE/k3rxzf4nIcE/s320/FX2.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
As you can see, JavaFX are doing quite well.&lt;br /&gt;
&lt;br /&gt;
What was quite surprising for me that JavaFX application employes less threads than others. There are the numbers:&lt;br /&gt;
&lt;br /&gt;
&lt;table border="1"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;JavaFX&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Swing&lt;/td&gt;&lt;td&gt;31&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AWT&lt;/td&gt;&lt;td&gt;33&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Source code of those applications is available for everyone:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://svn.kenai.com/svn/mce%7Emce/AwtNaiveCalculator"&gt;https://svn.kenai.com/svn/mce~mce/AwtNaiveCalculator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://svn.kenai.com/svn/mce%7Emce/SwingNaiveCalculator"&gt;https://svn.kenai.com/svn/mce~mce/SwingNaiveCalculator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://svn.kenai.com/svn/mce%7Emce/FxNaiveCalculator"&gt;https://svn.kenai.com/svn/mce~mce/FxNaiveCalculator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-3218214244447087622?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/3218214244447087622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=3218214244447087622' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3218214244447087622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3218214244447087622'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2011/06/javafx-vs-java-swing-vs-awt.html' title='JavaFX vs Java Swing vs AWT'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-2yiXbuui-Js/Ted5WKUqP0I/AAAAAAAAKM0/3LaZm6QNQNE/s72-c/FX.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2215683944739598571</id><published>2011-05-12T15:35:00.000+03:00</published><updated>2011-05-13T23:40:25.683+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>The long awaited "soft wrap" feature is finally enabled in NetBeans 7.0</title><content type='html'>"Soft wrap" was initially introduces in NetBeans 9 beta, but was removed in release. The last stable release of the IDE brought this long awaited feature to the happy users.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NRtQkbhuznY/TcvU5WLz6-I/AAAAAAAAKMc/TpT2lweowTA/s1600/nb.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="340" width="400" src="http://2.bp.blogspot.com/-NRtQkbhuznY/TcvU5WLz6-I/AAAAAAAAKMc/TpT2lweowTA/s400/nb.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2215683944739598571?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2215683944739598571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2215683944739598571' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2215683944739598571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2215683944739598571'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2011/05/long-awaited-soft-wrap-feature-is.html' title='The long awaited &quot;soft wrap&quot; feature is finally enabled in NetBeans 7.0'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-NRtQkbhuznY/TcvU5WLz6-I/AAAAAAAAKMc/TpT2lweowTA/s72-c/nb.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-5177312836127721222</id><published>2011-04-14T14:52:00.000+03:00</published><updated>2011-04-14T14:52:08.432+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rules'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='integration test'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Simple Integration test with JUnit Rules</title><content type='html'>Rules were introduced in JUnit 4.7 release. The short description is following:&lt;br /&gt;
&lt;blockquote&gt;The @Rule annotation allows you to annotate a public field in your test  class, which is of type MethodRule. This binding will intercept test  method calls like an AOP framework would do and redefine the execution,  skip it, or do anything else. &lt;/blockquote&gt;Basically Rules is a way to avoid implementing of a custom test runner. In addition this approach gives more flexibility. You can implement your custom behaviour as a number of different rules and apply them to your test classes in different combinations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
My task was to create simple integration testing framework. Here are the most prominent requirements:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; Generate and dynamically update configuration of the server (httpd)&lt;/li&gt;
&lt;li&gt;Restart server when it is necessary&lt;/li&gt;
&lt;li&gt;Provide exhaustive information in case of test failure (environment, server and modules configurations, request details, response details&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;I tried JUnit with custom rules to fulfill this assignment.It exceeded my expectations. Unfortunately it is no much information about JUnit rules applications. Thus I decided to share my experience. I hope it will be helpful.&lt;br /&gt;
&lt;b&gt;Step 1&lt;/b&gt;&lt;br /&gt;
Create annotations for declarative server configuration.&lt;br /&gt;
&lt;u&gt;ServerConfig.java&lt;/u&gt;&lt;br /&gt;
&lt;pre class="brush:java"&gt;@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ServerConfig {
    ConfigDirective[] value();
}
&lt;/pre&gt;&lt;br /&gt;
&lt;u&gt;ConfigDirective.java&lt;/u&gt;&lt;br /&gt;
&lt;pre class="brush:java"&gt;public @interface ConfigDirective {
    Directive name();
    String value() default "";
    String[] values() default {};
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Step 2&lt;/b&gt;&lt;br /&gt;
Create Rules Handler.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;IntegrationRule.java&lt;/u&gt;&lt;br /&gt;
&lt;pre class="brush:java"&gt;public class IntegrationRule implements MethodRule{
    private String vhost;
    private String requestUrl;
    private Map&amp;lt;String,String&gt; requestCookies = new HashMap&amp;lt;String, String&gt;();
    private TestResponse response;

    @Override
    public Statement apply(final Statement base, final FrameworkMethod method, final Object target) {
        final AbstractTest test = (AbstractTest)target;
        return new Statement() {

            @Override
            public void evaluate() throws Throwable {

                initContext();

                test.initConfig();

                // add type specific configuration
                ServerConfig tCfg = test.getClass().getAnnotation(ServerConfig.class);
                processAnnotation(tCfg, test);

                // add method specific configuration
                ServerConfig mCfg = method.getAnnotation(ServerConfig.class);
                processAnnotation(mCfg, test);

                test.updateConfig();

                try {
                    base.evaluate();
                } catch (Throwable e) {
                    dumpContext();
                    throw e;
                }
            }

            private void dumpContext() {
                String title = "--- " + target.getClass().getSimpleName() + "." + method.getName() + " ---";
                String delimiter = StringUtils.repeat("-", title.length());

                System.out.println(title);
                System.out.println(vhost);
                System.out.println(delimiter);
                System.out.println("Request URL: "+requestUrl);
                System.out.println(delimiter);
                if (!requestCookies.isEmpty()) {
                    System.out.println("Request cookies: "+requestCookies);
                    System.out.println(delimiter);
                }

                if (response != null) {
                    System.out.println(response);
                    System.out.println(delimiter);
                }
            }

        };
    }

    private void processAnnotation(ServerConfig cfg, AbstractTest test) {
        if (cfg != null) {
            ConfigDirective[] item = cfg.value();
            if (item != null) {
                for (ConfigDirective directive : item) {
                    Directive d = directive.name();
                    String v = directive.value();
                    List&amp;lt;String&gt; vs = new ArrayList&amp;lt;String&gt;(Arrays.asList(directive.values()));
                    if (StringUtils.isNotBlank(v)) {
                        vs.add(v);
                    }
                    for (String string : vs) {
                        test.getConfig().put(d, string);
                    }
                }
            }
        }
    }

    private void initContext() {
        requestCookies.clear();
        requestUrl = "";
        response = null;
        vhost = null;
    }

    public void putRequestCookies(String name, String value) {
        this.requestCookies.put(name, value);
    }

    public void setRequestUrl(String requestUrl) {
        this.requestUrl = requestUrl;
    }

    public void setResponse(TestResponse response) {
        this.response = response;
    }

    public void setVhost(String vhost) {
        this.vhost = vhost;
    }

}

&lt;/pre&gt;&lt;br /&gt;
Method "test.updateConfig()" generates new configuration, uploads it to the server and restarts &lt;b&gt;httpd&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 3&lt;/b&gt;&lt;br /&gt;
Use rules in tests.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java"&gt;@ServerConfig({
    @ConfigDirective(
        name=Directive.ProtectedResource,
        value=SessionCookieExpirationTest.PATH+" "+SessionCookieExpirationTest.PRODUCT
    )
})
public class SessionCookieExpirationTest extends AbstractTest {
    protected static final String PATH = "/request-dump";
    protected static final String RESOURCE = "/resource.do";
    protected static final String PRODUCT = "TEST";
    protected static final String RESOURCE_URL = PATH + RESOURCE;

    @Test
    public void testExpiredSessionCookieDefaultNoChecking() {
        generateCookie(getString(Directive.SessionCookieName), true, TEST_USER_ID, PRODUCT);

        TestResponse response = doRequest(RESOURCE_URL);

        assertEquals(TestResponse.HTTP_CODE_OK, response.getStatusCode());
    }

    @Test
    @ServerConfig({
        @ConfigDirective(name=Directive.CookieExpires, value="1000")
    })
    public void testExpiredSessionCookieLogin() {

        generateCookie(getString(Directive.CookieName), true, TEST_USER_ID, PRODUCT);

        TestResponse response = doRequest(RESOURCE_URL);

        assertEquals(TestResponse.HTTP_CODE_REDIRECT, response.getStatusCode());

        String expectedRedirectUrl = getString(Directive.RedirectBaseUrl) +
            getString(Directive.LoginUri);

        String actualRedirectUrl = response.getRedirectUrl();
        assertEquals(expectedRedirectUrl, actualRedirectUrl);
    }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-5177312836127721222?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/5177312836127721222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=5177312836127721222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5177312836127721222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5177312836127721222'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2011/04/simple-integration-test-with-junit.html' title='Simple Integration test with JUnit Rules'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-3889756684093865814</id><published>2011-04-06T22:35:00.000+03:00</published><updated>2011-04-06T22:35:12.501+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><title type='text'>Visualization</title><content type='html'>Some applications I have worked on provide visualization capabilities. Here are several examples of them.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
1. Global gas-heating monitoring and alarm system.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uxuTnFigvOs/TZy0oHHvPgI/AAAAAAAAKK8/2SfKbnuUyfM/s1600/Dispatcher2a.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-uxuTnFigvOs/TZy0oHHvPgI/AAAAAAAAKK8/2SfKbnuUyfM/s400/Dispatcher2a.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-rp4ntLoyLXg/TZy196_lXWI/AAAAAAAAKLU/3o1Vo4xC79A/s1600/%25D0%259A%25D0%25B0%25D1%2580%25D1%2582%25D0%25B8%25D0%25BD%25D0%25BA%25D0%25B0%252814%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-rp4ntLoyLXg/TZy196_lXWI/AAAAAAAAKLU/3o1Vo4xC79A/s320/%25D0%259A%25D0%25B0%25D1%2580%25D1%2582%25D0%25B8%25D0%25BD%25D0%25BA%25D0%25B0%252814%2529.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zjeY9RMDGc0/TZy0oTGBa2I/AAAAAAAAKLE/mCzPfw8nIZw/s1600/u2400%2B110.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zjeY9RMDGc0/TZy0oTGBa2I/AAAAAAAAKLE/mCzPfw8nIZw/s1600/u2400%2B110.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
2. Visualization of the alumina solution density. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-HLbYFewOw7I/TZy0o0IEQxI/AAAAAAAAKLM/uR8SJwtaD7o/s1600/foto%2B016.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-HLbYFewOw7I/TZy0o0IEQxI/AAAAAAAAKLM/uR8SJwtaD7o/s400/foto%2B016.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
3. Visualization of the ships traffic.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-j0wTSJkqr44/TZy2GbS-bVI/AAAAAAAAKLY/Jk4uc0uxUrc/s1600/1_d.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://1.bp.blogspot.com/-j0wTSJkqr44/TZy2GbS-bVI/AAAAAAAAKLY/Jk4uc0uxUrc/s320/1_d.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
4. Visualization of the data model (my open source project: &lt;a href="http://sourceforge.net/projects/dasgen/"&gt;http://sourceforge.net/projects/dasgen/&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-T9Yu9H0zA1M/TZy8CLNllNI/AAAAAAAAKLc/vFukoyhV_rU/s1600/dasgen.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="177" src="http://4.bp.blogspot.com/-T9Yu9H0zA1M/TZy8CLNllNI/AAAAAAAAKLc/vFukoyhV_rU/s320/dasgen.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
5. Visualization of firewall rules (open source project I was involved in: &lt;a href="http://www.fwbuilder.org/"&gt;http://www.fwbuilder.org&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-AEak202C578/TZy8cFJYB4I/AAAAAAAAKLg/R_Myh-K4EE8/s1600/fwb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://4.bp.blogspot.com/-AEak202C578/TZy8cFJYB4I/AAAAAAAAKLg/R_Myh-K4EE8/s320/fwb.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-3889756684093865814?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/3889756684093865814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=3889756684093865814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3889756684093865814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3889756684093865814'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2011/04/visualization.html' title='Visualization'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-uxuTnFigvOs/TZy0oHHvPgI/AAAAAAAAKK8/2SfKbnuUyfM/s72-c/Dispatcher2a.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-1356607041067976170</id><published>2011-02-18T05:48:00.000+02:00</published><updated>2011-02-18T05:48:29.641+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><title type='text'>Dynamic SOAP Web Services with Jax-WS</title><content type='html'>В документации не очень хорошо описано как создать динамический клиент с помощью Jax-WS. Для этого используется Dispatcher API.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Прежде всего надо добавить необходимую зависимость в проект.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;...
  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;com.sun.xml.ws&lt;/groupId&gt;
      &lt;artifactId&gt;jaxws-rt&lt;/artifactId&gt;
      &lt;version&gt;2.2.3&lt;/version&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
...
  &lt;repositories&gt;
      &lt;repository&gt;
          &lt;id&gt;java.net&lt;/id&gt;
          &lt;url&gt;http://download.java.net/maven/2/&lt;/url&gt;
      &lt;/repository&gt;
  &lt;/repositories&gt;
...
&lt;/pre&gt;&lt;br /&gt;
Исходный код клиента - DynamicClient.java&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java"&gt;package org.etf.soap;

import java.util.Map;
import javax.xml.soap.SOAPException;
import javax.xml.ws.soap.SOAPBinding;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;

/**
 *
 * @author Illya.Yalovyy
 */
public final class DynamicClient {
    private final String namespace;
    private final Service service;
    private final Dispatch&lt;SOAPMessage&gt; dispatch;
    private final MessageFactory messageFactory;

    public DynamicClient(String namespace, String serviceLocation, 
            String serviceName, String servicePort) throws SOAPException {

        messageFactory = MessageFactory.newInstance();

        this.namespace = namespace;

        final QName serviceQName = new QName(namespace, serviceName);
        final QName servicePortQName = new QName(namespace, servicePort);

        service = Service.create(serviceQName);
        service.addPort(servicePortQName, SOAPBinding.SOAP11HTTP_BINDING,
                serviceLocation);
        dispatch = service.createDispatch(servicePortQName, SOAPMessage.class,
                Service.Mode.MESSAGE);
    }

    public SOAPMessage invoke(WebOperation operation, Object... args) throws SOAPException {

        Validate.isTrue(args.length &lt;= operation.getArgumentNames().length, "Too many arguments.");

        if (operation.getSoapActionUri() == null) {
            dispatch.getRequestContext().put(Dispatch.SOAPACTION_USE_PROPERTY, Boolean.FALSE);
            dispatch.getRequestContext().put(Dispatch.SOAPACTION_URI_PROPERTY, "");
        } else {
            dispatch.getRequestContext().put(Dispatch.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
            dispatch.getRequestContext().put(Dispatch.SOAPACTION_URI_PROPERTY, operation.getSoapActionUri());
        }

        SOAPMessage message = messageFactory.createMessage();

        SOAPPart soapPart = message.getSOAPPart();
        SOAPEnvelope envelope = soapPart.getEnvelope();
        SOAPBody body = envelope.getBody();
        SOAPBodyElement operationElement = body.addBodyElement(new QName(namespace, 
                operation.getOperation(), StringUtils.defaultIfBlank(operation.getPrefix(), "")));

        for (int i = 0; i &lt; args.length; i++) {
            SOAPElement argElement = operationElement.addChildElement(
                    new QName(operation.getArgumentNames()[i]));
            argElement.setValue(String.valueOf(args[i]));
        }
        
        return dispatch.invoke(message);
    }

    public static final class Builder {

        private String namespace, serviceLocation, serviceName, servicePort;

        public Builder setNamespace(String namespace) {
            this.namespace = namespace;
            return this;
        }

        public Builder setServiceLocation(String serviceLocation) {
            this.serviceLocation = serviceLocation;
            return this;
        }

        public Builder setServiceName(String serviceName) {
            this.serviceName = serviceName;
            return this;
        }

        public Builder setServicePort(String servicePort) {
            this.servicePort = servicePort;
            return this;
        }

        public DynamicClient build() throws SOAPException {
            Validate.notNull(namespace, "Namespace is required.");
            Validate.notNull(serviceLocation, "Service location is required.");
            Validate.notNull(serviceName, "Service name is required.");
            Validate.notNull(servicePort, "Service port is required.");
            
            return new DynamicClient(namespace, serviceLocation, serviceName, servicePort);
        }
    }
}
&lt;/pre&gt;

Вспомогательный класс для описания вызываемого метода - WebOperation.java

&lt;pre class="brush:java"&gt;package org.etf.soap;

import java.util.ArrayList;
import java.util.Arrays;
import org.apache.commons.lang.Validate;

/**
 *
 * @author Illya.Yalovyy
 */
public class WebOperation {
    private final String soapActionUri, operation, prefix;
    private final String[] argumentNames;

    public WebOperation(String soapActionUri, String operation, String prefix, String[] argumentNames) {
        this.soapActionUri = soapActionUri;
        this.operation = operation;
        this.prefix = prefix;
        this.argumentNames = argumentNames;
    }

    public String[] getArgumentNames() {
        return argumentNames;
    }

    public String getOperation() {
        return operation;
    }

    public String getPrefix() {
        return prefix;
    }

    public String getSoapActionUri() {
        return soapActionUri;
    }

    public static final class Builder {
        private String soapActionUri, operation, prefix;
        private ArrayList&lt;String&gt; argumentNames = new ArrayList&lt;String&gt;();

        public Builder setArgumentNames(String... argumentNames) {
            this.argumentNames.clear();
            this.argumentNames.addAll(Arrays.asList(argumentNames));
            return this;
        }

        public Builder setOperation(String operation) {
            this.operation = operation;
            return this;
        }

        public Builder setPrefix(String prefix) {
            this.prefix = prefix;
            return this;
        }

        public Builder setSoapActionUri(String soapActionUri) {
            this.soapActionUri = soapActionUri;
            return this;
        }

        public Builder addArgumentName(String name) {
            this.argumentNames.add(name);
            return this;
        }

        public WebOperation build() {
            Validate.notNull(operation, "Operation name is required");
            return new WebOperation(soapActionUri, operation, prefix, 
                    argumentNames.toArray(new String[argumentNames.size()]));
        }
    }
}
&lt;/pre&gt;
Вспомогательный класс для печати результата на экран - XmlHelper.java

&lt;pre class="brush:java"&gt;package org.etf.util;

import java.io.StringWriter;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Node;

/**
 *
 * @author Illya.Yalovyy
 */
public final class XmlHelper {
    public static final String INDENTAMOUNT = "{http://xml.apache.org/xslt}indent-amount";

    private XmlHelper() {}

    public static void dumpNode(Node node) {
        try {
            final StringWriter writer = new StringWriter();
            final Source source = new DOMSource(node);
            final Result result = new StreamResult(writer);
            Transformer t = TransformerFactory.newInstance().newTransformer();
            t.setOutputProperty(OutputKeys.METHOD, "xml");
            t.setOutputProperty(OutputKeys.INDENT, "yes");
            t.setOutputProperty(OutputKeys.STANDALONE, "yes");
            t.setOutputProperty(INDENTAMOUNT,"2");
            t.transform(source, result);
            System.out.println(writer.toString());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }
}
&lt;/pre&gt;
Пример использовани динамического клиента:

&lt;pre class="brush:java"&gt;        final DynamicClient mathertelClient = new DynamicClient.Builder()
                .setNamespace("http://www.mathertel.de/CalcFactors/")
                .setServiceLocation("http://www.mathertel.de/AJAXEngine/S02_AJAXCoreSamples/CalcService.asmx")
                .setServiceName("CalcService")
                .setServicePort("CalcServiceSoap")
                .build();

        final WebOperation addIntegerWebOperation = new WebOperation.Builder()
                .setSoapActionUri("http://www.mathertel.de/CalcFactors/AddInteger")
                .setOperation("AddInteger")
                .addArgumentName("number1")
                .addArgumentName("number2")
                .build();

        SOAPMessage response;
        response = mathertelClient.invoke(addIntegerWebOperation, 3, 4);
        XmlHelper.dumpNode(response.getSOAPBody());

        response = mathertelClient.invoke(addIntegerWebOperation, 21, 43);
        XmlHelper.dumpNode(response.getSOAPBody());
&lt;/pre&gt;
Полные исходные коды проекта:
&lt;a href="https://svn.kenai.com/svn/mce~mce"&gt;https://svn.kenai.com/svn/mce~mce&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-1356607041067976170?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/1356607041067976170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=1356607041067976170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1356607041067976170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1356607041067976170'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2011/02/dynamic-soap-web-services-with-jax-ws.html' title='Dynamic SOAP Web Services with Jax-WS'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-5738581020751818018</id><published>2010-10-10T13:26:00.004+03:00</published><updated>2010-10-10T13:52:20.494+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Assemble executable JAR with dependencies using Maven</title><content type='html'>&lt;b&gt;Problem description&lt;/b&gt;: As a result of the build process I need following artifacts to be generated and packed into single ZIP archive:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;JAR with all compiled classes and resources&lt;/li&gt;
&lt;li&gt;Manifest file with properly configured main class and generated class path&lt;/li&gt;
&lt;li&gt;all dependencies&lt;/li&gt;
&lt;/ul&gt;This archive could be unpacked and executed with double click on the application jar file or with simple &lt;tt&gt;java -jar&lt;/tt&gt; command.&lt;br /&gt;
This problem could be easily solved with &lt;a href="http://maven.apache.org/"&gt;Apache Maven&lt;/a&gt; build manager.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
We need to use and configure following plugins:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;org.apache.maven.plugins/&lt;a href="http://maven.apache.org/plugins/maven-jar-plugin/"&gt;maven-jar-plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;org.apache.maven.plugins/&lt;a href="http://maven.apache.org/plugins/maven-dependency-plugin/"&gt;maven-dependency-plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;org.apache.maven.plugins/&lt;a href="http://maven.apache.org/plugins/maven-assembly-plugin/"&gt;maven-assembly-plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Configuration of the &lt;b&gt;maven-jar-plugin&lt;/b&gt;:&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&lt;plugin&gt;
                &lt;groupid&gt;org.apache.maven.plugins&lt;/groupId&gt;
                &lt;artifactid&gt;maven-jar-plugin&lt;/artifactId&gt;
                &lt;configuration&gt;
                    &lt;archive&gt;
                        &lt;addmavendescriptor&gt;false&lt;/addMavenDescriptor&gt;
                        &lt;compress&gt;true&lt;/compress&gt;
                        &lt;manifest&gt;
                            &lt;addclasspath&gt;true&lt;/addClasspath&gt;
                            &lt;classpathprefix&gt;libs/&lt;/classpathPrefix&gt;
                            &lt;mainclass &gt;com.mightypocket.ashoter.Main&lt;/mainClass&gt;
                        &lt;/manifest&gt;
                    &lt;/archive&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
&lt;/pre&gt;&lt;br /&gt;
This plugin creates a jar file for your application. This jar file contains all compiled classes and resources. One very important part of this file is a manifest. To make it possible to be executed without additional configurations it has to have &lt;b&gt;classpath&lt;/b&gt; and &lt;b&gt;mainclass&lt;/b&gt; entries. There are several options with class path. In the preceding example all libraries are prefixed with "libs/". It gives us an ability to put all required libraries into separated folder "libs".&lt;br /&gt;
&lt;br /&gt;
Configuration for the &lt;b&gt;maven-dependency-plugin&lt;/b&gt;.&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&lt;plugin&gt;
                &lt;groupid&gt;org.apache.maven.plugins&lt;/groupId&gt;
                &lt;artifactid&gt;maven-dependency-plugin&lt;/artifactId&gt;
                &lt;executions&gt;
                    &lt;execution&gt;
                        &lt;id&gt;copy-dependencies&lt;/id&gt;
                        &lt;phase&gt;package&lt;/phase&gt;
                        &lt;goals&gt;
                            &lt;goal&gt;copy-dependencies&lt;/goal&gt;
                        &lt;/goals&gt;
                        &lt;configuration&gt;
                            &lt;outputdirectory&gt;${project.build.directory}/libs&lt;/outputDirectory&gt;
                        &lt;/configuration&gt;
                    &lt;/execution&gt;
                &lt;/executions&gt;
            &lt;/plugin&gt;
&lt;/pre&gt;&lt;br /&gt;
This plugin does all dirty work finding and coying all direct and transitive dependencies of the application. Those libraries will be copied into specified folder, "libs" in our case.&lt;br /&gt;
&lt;br /&gt;
Configuration for the &lt;b&gt;maven-assembly-plugin&lt;/b&gt;.&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&lt;plugin&gt;
                &lt;groupid&gt;org.apache.maven.plugins&lt;/groupId&gt;
                &lt;artifactid&gt;maven-assembly-plugin&lt;/artifactId&gt;
                &lt;configuration&gt;
                    &lt;descriptors&gt;
                        &lt;descriptor&gt;assembly/bin.xml&lt;/descriptor&gt;
                    &lt;/descriptors&gt;
                    &lt;finalname&gt;AndroidScreenCapture_${project.version}&lt;/finalName&gt;
                    &lt;outputdirectory&gt;${project.build.directory}/dist&lt;/outputDirectory&gt;
                    &lt;workdirectory&gt;${project.build.directory}/assembly/work&lt;/workDirectory&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
&lt;/pre&gt;The last but not least plugin - Assembly. It put all parts together and puck them into archive. It needs an assembly descriptor to do its job. In this case the descriptor is very simple one:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&lt;assembly&gt;
    &lt;id&gt;bin&lt;/id&gt;
    &lt;formats&gt;
        &lt;format&gt;zip&lt;/format&gt;
    &lt;/formats&gt;
    &lt;filesets&gt;
        &lt;fileset&gt;
            &lt;includes&gt;
                &lt;include&gt;README*&lt;/include&gt;
                &lt;include&gt;LICENSE*&lt;/include&gt;
                &lt;include&gt;NOTICE*&lt;/include&gt;
            &lt;/includes&gt;
        &lt;/fileSet&gt;
        &lt;fileset&gt;
            &lt;directory&gt;target&lt;/directory&gt;
            &lt;outputdirectory&gt;&lt;/outputDirectory&gt;
            &lt;includes&gt;
                &lt;include&gt;*.jar&lt;/include&gt;
            &lt;/includes&gt;
        &lt;/fileSet&gt;
        &lt;fileset&gt;
            &lt;directory&gt;target/libs&lt;/directory&gt;
            &lt;outputdirectory&gt;libs&lt;/outputDirectory&gt;
            &lt;includes&gt;
                &lt;include&gt;*.jar&lt;/include&gt;
            &lt;/includes&gt;
        &lt;/fileSet&gt;
    &lt;/fileSets&gt;
&lt;/assembly&gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-5738581020751818018?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/5738581020751818018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=5738581020751818018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5738581020751818018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5738581020751818018'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/10/assembly-executable-jar-with.html' title='Assemble executable JAR with dependencies using Maven'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-6259914637122422845</id><published>2010-09-15T15:54:00.000+03:00</published><updated>2010-09-15T15:54:39.701+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='RI'/><title type='text'>MySQL InnoDB RI management</title><content type='html'>MySQL InnoDB engine supports Reference Integrity checks (RI). Sometimes we need to do some "big" changes in a schema or data (reconstruct table, repopulate data, etc). RI can prevent us from those actions. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;To turn RI on and off we can use following&amp;nbsp;directive: &lt;br /&gt;
&lt;pre&gt;-- turn RI off
foreign_key_constraints=0
-- ...
-- do some stuff
-- ...
-- turn RI on
foreign_key_constraints=0&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-6259914637122422845?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/6259914637122422845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=6259914637122422845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6259914637122422845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6259914637122422845'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/09/mysql-innodb-ri-management.html' title='MySQL InnoDB RI management'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-8546278917066796531</id><published>2010-08-23T22:07:00.000+03:00</published><updated>2010-08-23T22:07:54.390+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='bsaf'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><title type='text'>Migration to (Better) Swing Application Framework</title><content type='html'>This article was inspired by &lt;a href="http://platform.netbeans.org/tutorials/nbm-porting-basic.html" linkindex="290"&gt;NetBeans Platform Porting Tutorial&lt;/a&gt;. I really respect the NetBeans Application Platform, I use the NetBeans IDE on a daily basis, but this tutorial confused me very much. To port a simple application to this platform I have to do a lot of work. What annoys me the most is a significant amount of textual and XML files with configurations. All configurations are just a plain text without any support of refactoring and any kind of the compile time check. It is only a personal preferences, but I always try to stay away from such error-prone solution.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
It must be mentioned, the NetBeans platform accompanied by NetBeans IDE gives a lot of additional services and benefits. An executable binary file, as well as an installer, for a target platform can be easily created for your application by the IDE. As an additional bonus you obtain a well established modular infrastructure. Thus if you are planing to develop a big, scalable, modular, enterprise level application, you definitely should give it a try. But in this article we will talk about small or middle size applications. Anagram Game is a good example for such kind of applications. Lets try to follow the tutorial, but use BSAF instead of the NetBeans Platform. First of all you need to create an application from the samples folder. I will use NetBeans IDE for this example:&lt;br /&gt;
&lt;br /&gt;
1. Ctrl+Shift+N - to open a New Project Dialog &lt;br /&gt;
2. Select &lt;i&gt;Samples/Java/Anagram Game&lt;/i&gt; project and press "next" button&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_cWkmyfg16CU/THGpVRdFMII/AAAAAAAAKC8/m9whKNfXR90/s1600/bsaf_anagram_1.png" imageanchor="1" linkindex="291" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="435" src="http://2.bp.blogspot.com/_cWkmyfg16CU/THGpVRdFMII/AAAAAAAAKC8/m9whKNfXR90/s640/bsaf_anagram_1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
3. Specify name and location for a new project and press button "finish"&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_cWkmyfg16CU/THGpfgnSvdI/AAAAAAAAKDE/Z2dxec7bi-U/s1600/bsaf_anagram_2.png" imageanchor="1" linkindex="292" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="436" src="http://4.bp.blogspot.com/_cWkmyfg16CU/THGpfgnSvdI/AAAAAAAAKDE/Z2dxec7bi-U/s640/bsaf_anagram_2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Now you are ready to migrate this sample application to BSAF.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Porting level 0: Launchable&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;At this stage, we simply want to be able to launch our application... &lt;/blockquote&gt;BSAF is extremely simple and straightforward library that is why we don't need to do any strange things like a redundant menu entry to show a window of our application. All we need is 4 easy steps:&lt;br /&gt;
1. Add BSAF library to the project (the process is discussed in more details in the article &lt;a href="http://kenai.com/projects/bsaf/pages/GettingStartedNetBeans" linkindex="293"&gt;Getting Started using BSAF with NetBeans&lt;/a&gt;)&lt;br /&gt;
2. Create an application class &lt;i&gt;AnagramsApplication&lt;/i&gt; derived from the &lt;i&gt;SingleFrameApplication&lt;/i&gt;.&lt;br /&gt;
3. Implement &lt;i&gt;startup()&lt;/i&gt; and &lt;i&gt;main()&lt;/i&gt; methods as following:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package com.toy.anagrams.ui;
import org.jdesktop.application.SingleFrameApplication;
public class AnagramsApplication extends SingleFrameApplication {
  public static void main (String[] args) {
    Application.launch(AnagramsApplication.class, args);
  }
  protected void startup() {
    show(new Anagrams());
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
4. Run the application.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Porting level 1: Integration&lt;/b&gt;&lt;br /&gt;
Is spite of the simplicity, BSAF provides many convenient features for developers. Lets use them in our application. First of all we don't need to create any windows (JFrame) by ourself, the framework can do it for us. Thus we need to slightly refactor our application:&lt;br /&gt;
1. Override &lt;i&gt;initialize()&lt;/i&gt; method of the &lt;i&gt;AnagramsApplication&lt;/i&gt;. Move there all initialization code from the &lt;i&gt;Anagrams&lt;/i&gt; class.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;  protected void initialize(String[] args) {
    super.initialize(args);
    wordLibrary = WordLibrary.getDefault();
  }
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
2. Implement method &lt;i&gt;createMenuBar()&lt;/i&gt; for the &lt;i&gt;AnagramsApplication&lt;/i&gt;. Use menu bar creation code from the &lt;i&gt;Anagrams&lt;/i&gt; class.&lt;br /&gt;
3. Implement method &lt;i&gt;createComponent()&lt;/i&gt; for the &lt;i&gt;AnagramsApplication&lt;/i&gt;. Use panel creation code from the &lt;i&gt;Anagrams&lt;/i&gt; class.&lt;br /&gt;
4. Move event handlers from the &lt;i&gt;Anagrams&lt;/i&gt; class to the &lt;i&gt;AnagramsApplication&lt;/i&gt;.&lt;br /&gt;
5. Rewrite method &lt;i&gt;startup()&lt;/i&gt; as following:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;  protected void startup() {
    FrameView mainView = getMainView();
    mainView.setMenuBar(createMenuBar());
    mainView.setComponent(createComponent());    
    mainView.getRootPane().setDefaultButton(guessButton);
    
    scrambledWord.setText(wordLibrary.getScrambledWord(wordIdx));

    show(mainView);
  }
&lt;/code&gt;&lt;/pre&gt;6. Remove the &lt;i&gt;Anagrams&lt;/i&gt; class because we don't need it any more. &lt;br /&gt;
7. Run the application&lt;br /&gt;
&lt;br /&gt;
Now it looks as before, but the code is reduced. Now all window's initialization/positioning stuff is covered by the framework. The window state will be stored and restored automatically.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Porting Level 2: Use Case Support&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Our current implementation of the event handlers looks ugly. With BSAF we don't have to write a lot of code for such a common task. With simple annotations we can create actions for our application's use cases. Please pay attention that the framework provides a set of useful actions. "Quit" is one of such actions. Another useful facility of the framework is resource management. We can provide all actions related information in declarative way through properties file. Also properties of all visual component could be injected, all we need is supply components with names.&lt;br /&gt;
&lt;br /&gt;
1. Transform event handlers into actions:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;  @Action
  public void aboutMenuItemActionPerformed() {
    new About(getMainFrame()).setVisible(true);
  }

  @Action
  public void nextTrialActionPerformed() {
    wordIdx = (wordIdx + 1) % wordLibrary.getSize();

    feedbackLabel.setText(" ");
    scrambledWord.setText(wordLibrary.getScrambledWord(wordIdx));
    guessedWord.setText("");
    getMainView().getRootPane().setDefaultButton(guessButton);

    guessedWord.requestFocusInWindow();
  }

  @Action
  public void guessedWordActionPerformed() {
    if (wordLibrary.isCorrect(wordIdx, guessedWord.getText())) {
      feedbackLabel.setText("Correct! Try a new word!");
      getMainView().getRootPane().setDefaultButton(nextTrial);
    } else {
      feedbackLabel.setText("Incorrect! Try again!");
      guessedWord.setText("");
    }

    guessedWord.requestFocusInWindow();
  }
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
2. Use action for menu items and buttons creation:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;  private JMenuBar createMenuBar() {
    ApplicationActionMap actionMap = getContext().getActionMap();

    JMenuBar menuBar = new JMenuBar();
    JMenu fileMenu = new JMenu();
    fileMenu.setName("fileMenu");
    fileMenu.add(new JMenuItem(actionMap.get("aboutMenuItemActionPerformed")));
    fileMenu.add(new JMenuItem(actionMap.get("quit")));

    menuBar.add(fileMenu);

    return menuBar;
  }

private JComponent createComponent() {
  ApplicationActionMap actionMap = getContext().getActionMap();
  ...
  guessButton = new JButton(actionMap.get("guessedWordActionPerformed"));
  ...
  nextTrial = new JButton(actionMap.get("nextTrialActionPerformed"));
}
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
3. Create &lt;i&gt;resource &lt;/i&gt;folder and properties file (&lt;i&gt;/com/toy/anagrams/ui/resources/AnagramsApplication.properties&lt;/i&gt;):&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;# Application's properties
Application.name = Anagram Game
Application.title = Anagrams
Application.version = 1.0
Application.vendor = Illya Yalovyy
Application.homepage = http://kenai.com/projects/bsaf/
Application.vendorId = etf
Application.id = Anagrams
Application.lookAndFeel = com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
Application.icon = icon.png

# Actions
aboutMenuItemActionPerformed.Action.text = &amp;amp;About
aboutMenuItemActionPerformed.Action.shortDescription = Show the application's information dialog

nextTrialActionPerformed.Action.text = &amp;amp;New Word
nextTrialActionPerformed.Action.shortDescription = Fetch a new word.

guessedWordActionPerformed.Action.text = &amp;amp;Guess
guessedWordActionPerformed.Action.shortDescription = Guess the scrambled word.

# Components
scrambledLabel.text = Scrambled Word:

scrambledWord.columns = 20
scrambledWord.editable = false

guessLabel.text = &amp;amp;Your Guess:

# Menu
fileMenu.text = &amp;amp;File
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
4. Done. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_cWkmyfg16CU/THGpo_mIsSI/AAAAAAAAKDM/Ig-urs5XDvM/s1600/bsaf_anagram_3.png" imageanchor="1" linkindex="294" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="192" src="http://3.bp.blogspot.com/_cWkmyfg16CU/THGpo_mIsSI/AAAAAAAAKDM/Ig-urs5XDvM/s400/bsaf_anagram_3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
It is obvious that porting to BSAF is easy like a piece of cake. What is more important, the framework provides a handful of useful features while maintaining a great deal of simplicity. Let's consider some figures.&lt;br /&gt;
&lt;br /&gt;
1. Resulting binary size:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" border="1"&gt;&lt;tbody&gt;
&lt;tr&gt;    &lt;td align="LEFT" height="18" width="148"&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" width="86"&gt;Size, bytes&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td align="LEFT" height="18"&gt;Original Application&lt;/td&gt;    &lt;td align="RIGHT" sdnum="1029;" sdval="23095"&gt;23095&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td align="LEFT" height="18"&gt;BSAF Application&lt;/td&gt;    &lt;td align="RIGHT" sdnum="1029;" sdval="206168"&gt;206168&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td align="LEFT" height="18"&gt;NetBeans Application&lt;/td&gt;    &lt;td align="RIGHT" sdnum="1029;" sdval="18596885"&gt;18596885&lt;/td&gt;   &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_cWkmyfg16CU/THJRj7cEC1I/AAAAAAAAKDU/CIlqCMJqw1c/s1600/bsaf_anagram_4.PNG" imageanchor="1" linkindex="295" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://4.bp.blogspot.com/_cWkmyfg16CU/THJRj7cEC1I/AAAAAAAAKDU/CIlqCMJqw1c/s400/bsaf_anagram_4.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
2. Source size:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_cWkmyfg16CU/THJR3qYlNxI/AAAAAAAAKDc/OfX3uLzV-jo/s1600/bsaf_anagram_5.PNG" imageanchor="1" linkindex="296" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://4.bp.blogspot.com/_cWkmyfg16CU/THJR3qYlNxI/AAAAAAAAKDc/OfX3uLzV-jo/s400/bsaf_anagram_5.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
3. Application start time:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_cWkmyfg16CU/THJR-itnVoI/AAAAAAAAKDk/m1X4ZmnTAAg/s1600/bsaf_anagram_6.PNG" imageanchor="1" linkindex="297" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://2.bp.blogspot.com/_cWkmyfg16CU/THJR-itnVoI/AAAAAAAAKDk/m1X4ZmnTAAg/s400/bsaf_anagram_6.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;References&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://netbeans.org/features/platform/index.html" linkindex="298"&gt;NetBeans Platform &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kenai.com/projects/bsaf" linkindex="299"&gt;Better Swing Application Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-8546278917066796531?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/8546278917066796531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=8546278917066796531' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8546278917066796531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8546278917066796531'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/08/migration-to-better-swing-application.html' title='Migration to (Better) Swing Application Framework'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_cWkmyfg16CU/THGpVRdFMII/AAAAAAAAKC8/m9whKNfXR90/s72-c/bsaf_anagram_1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-4486758596026547293</id><published>2010-08-17T09:02:00.001+03:00</published><updated>2010-08-17T09:03:17.410+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Как приручить ScrollView? [Android]</title><content type='html'>Наткнулся на очень полезную и познавательную статью про любимую платформу. В ней очень доходчиво (на пальцах) рассказано об основных трюках работы с одним из основных визуальных компонентов системы - ScrollView. В статье упоминаются недокументированные атрибуты XML, которые сильно облегчают жизнь простого разработчика.&lt;br /&gt;
&lt;br /&gt;
Статья: &lt;a href="http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/"&gt;http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/ &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-4486758596026547293?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/4486758596026547293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=4486758596026547293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4486758596026547293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4486758596026547293'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/08/scrollview-android.html' title='Как приручить ScrollView? [Android]'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-9098769140647257518</id><published>2010-08-01T19:32:00.000+03:00</published><updated>2010-08-01T19:32:20.788+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='bsaf'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Screen Capture v0.3</title><content type='html'>It's a desktop application for bloggers and advanced users of Android devices. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;Main features are:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Easy screen shots (Android SDK is still required)&lt;/li&gt;
&lt;li&gt;Recording of screencasts&lt;/li&gt;
&lt;li&gt;Full screen presentation with flexible scale factor&lt;/li&gt;
&lt;/ul&gt;This application is written in java using &lt;a href="http://kenai.com/projects/bsaf" linkindex="80"&gt;Swing Application Framework&lt;/a&gt;. You can find more details at a project site: &lt;a href="http://ashot.sourceforge.net/" linkindex="81"&gt;http://ashot.sourceforge.net.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-9098769140647257518?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/9098769140647257518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=9098769140647257518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/9098769140647257518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/9098769140647257518'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/08/android-screen-capture-v03.html' title='Android Screen Capture v0.3'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-5975278288013631073</id><published>2010-07-30T21:33:00.000+03:00</published><updated>2010-07-30T21:33:12.481+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soft'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Screen Capture</title><content type='html'>По необходимости начал разбираться с Android и обнаружил, что там не  все хорошо со снятием скриншотов экрана. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;Проблема решается, но только  через нетривиальные средства. Самое обидное, что даже и в этом случае  все работает не очень удобно и функционально. В результате разозлился и  вчера написал небольшое приложение. Основной функционал:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Снятие скриншота с автоматической записью.&lt;/li&gt;
&lt;li&gt;Запись скринкаста — автоматически сохраняются снимки экранов с заданной задержкой.&lt;/li&gt;
&lt;li&gt;Режим презентации — изображение с устройства транслируется на полный экран с минимальной задержкой.&lt;/li&gt;
&lt;/ul&gt;В планах — повышение удобства пользования и новые возможности, например  запись видео. Лицензия планируется GPL-3.0, исходники будут скоро  опубликованы.&lt;br /&gt;
Собственно, все что нужно, программа уже делает.  Если есть необходимость, то ее можно развивать дальше, но в этом случае  хотелось бы услышать отзывы и пожелания. Для успешной работы программе  нужен установленный Android SDK.&lt;br /&gt;
&lt;br /&gt;
Ссылка на сайт проекта:&lt;br /&gt;
&amp;nbsp;&lt;a href="https://sourceforge.net/projects/ashot/"&gt;https://sourceforge.net/projects/ashot/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-5975278288013631073?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/5975278288013631073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=5975278288013631073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5975278288013631073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5975278288013631073'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/07/android-screen-capture.html' title='Android Screen Capture'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-8506931046037932362</id><published>2010-07-29T00:23:00.001+03:00</published><updated>2010-07-29T00:29:50.762+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rebol'/><title type='text'>REBOL вернулся?!</title><content type='html'>&amp;nbsp;В бытность мою аспирантом, я заинтересовался новым на тот момент времени языком от канадских производителей - &lt;a href="http://www.rebol.com/" linkindex="27"&gt;Rebol&lt;/a&gt;, Перевел на русский язык кое-какую документацию, использовал свободную версию языка для решения повседневных задач. Чем же интересен этот язык, или правильнее сказать - платформа?&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;Первое чем он привлек меня - &lt;a href="http://www.rebol.com/platforms-core.html" linkindex="28"&gt;распространенность&lt;/a&gt;. В то время он был реализован под просто несметное количество операционных систем и аппаратных платформ. Собственно начал я его использовать под AmigaOS, на одноименной платформе. Реализован он был на языке низкого уровня и очень хорошо оптимизирован. В результате весь пакет был размером в несколько сотен килобайт. Не смотря на свой скромный размер возможности языка были просто поразительны.&lt;br /&gt;
Но существенной популярности язык не получил. Возможно потому что был закрытым, а в это время росла популярность программного обеспечения с открытым кодом или на то были другие причины - я не знаю. Во всяком случае очень скоро активность сайта и сообщества постепенно сошла на нет. Долгие годы я вообще ничего нового не слышал из их лагеря.&lt;br /&gt;
И вот последнее время я поймал себя на том, что новости про Rebol посыпались как из рога изобилия. Я не вдавался в подробности и не старался найти причины такой активности, могу только сказать, что технология заслуживает внимания. Сам я уже давно ушел в сторону Java и JVM ориентированных языков, так что вероятность того, что я буду каким то образом использовать Rebol - мала. Тем более, самая вкусная и полная версия языка платная. И это в наше время, когда практически все можно получить бесплатно и абсолютно легально, а чащу всего еще и с исходными кодами... Чтобы победить в этой конкурентной борьбе надо быть не просто лучше, а лучше на несколько порядков. (Пример - IntelliJ IDEA) Возможно грядущий релиз Rebol и будет чем то таким... Пока трудно сказать. Но в любом случаю хочу поделиться несколькими интересными ссылками по этой теме:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://dobeash.com/development.html" linkindex="29"&gt;http://dobeash.com/development.html&lt;/a&gt; - альтернативная библиотека для построения интерфейса пользователя, драйвера для работы с SQLite, ...&lt;/li&gt;
&lt;li&gt;&lt;a href="http://softinnov.org/" linkindex="30"&gt;http://softinnov.org/&lt;/a&gt; - драйвера для доступа к MySQL, PostgresQL, LDAP, и много других полезных вещей&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rebol.it/power-mezz/" linkindex="31"&gt;http://www.rebol.it/power-mezz/&lt;/a&gt; - просто набор полезных функций&lt;/li&gt;
&lt;li&gt;&lt;a href="http://musiclessonz.com/rebol_video_links.html" linkindex="32"&gt;http://musiclessonz.com/rebol_video_links.html &lt;/a&gt;- огромный список ссылок на видео уроки по Rebol&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=-RVhBImcEAE" linkindex="33"&gt;http://www.youtube.com/watch?v=-RVhBImcEAE&lt;/a&gt; - видео, которое показывает демонстрационные приложения, написанные на Rebol&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-8506931046037932362?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/8506931046037932362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=8506931046037932362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8506931046037932362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8506931046037932362'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/07/rebol.html' title='REBOL вернулся?!'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2360810230398651310</id><published>2010-07-06T22:48:00.004+03:00</published><updated>2010-07-06T23:07:02.647+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Элементы на одном уровне с ScrollView</title><content type='html'>Неожиданная проблема с полем прокрутки. Оно перекрывает все элементы на экране. В сети есть несколько решений этой проблемы. Но все оказалось очень просто.
&lt;span class=fullpost&gt;Для того чтобы ScrollView поделилось местом на экране с другими элементами нужно установить ему android:layout_weight="1". Далее привожу пример кода:
&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Paste your text here.&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;LinearLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
  android:layout_height=&amp;quot;fill_parent&amp;quot; android:layout_width=&amp;quot;fill_parent&amp;quot;
  android:orientation=&amp;quot;vertical&amp;quot;
&amp;gt;
  
&amp;lt;ScrollView android:id=&amp;quot;@+id/ScrollView01&amp;quot; android:layout_weight=&amp;quot;1&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot;&amp;gt;
  &amp;lt;TableLayout android:id=&amp;quot;@+id/TableLayout01&amp;quot; android:layout_width=&amp;quot;fill_parent&amp;quot; android:layout_weight=&amp;quot;1&amp;quot; android:layout_height=&amp;quot;fill_parent&amp;quot; android:stretchColumns=&amp;quot;0,1&amp;quot;&amp;gt;
    &amp;lt;TableRow android:id=&amp;quot;@+id/TableRow01&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:fitsSystemWindows=&amp;quot;true&amp;quot; android:layout_width=&amp;quot;fill_parent&amp;quot;&amp;gt;
      &amp;lt;CheckBox android:id=&amp;quot;@+id/CheckBox01&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:background=&amp;quot;@drawable/flyer_01&amp;quot; android:gravity=&amp;quot;bottom&amp;quot;&amp;gt;&amp;lt;/CheckBox&amp;gt;
      &amp;lt;CheckBox android:id=&amp;quot;@+id/CheckBox02&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:background=&amp;quot;@drawable/flyer_02&amp;quot; android:gravity=&amp;quot;bottom&amp;quot;&amp;gt;&amp;lt;/CheckBox&amp;gt;
    &amp;lt;/TableRow&amp;gt;
    &amp;lt;TableRow android:id=&amp;quot;@+id/TableRow02&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:fitsSystemWindows=&amp;quot;true&amp;quot; android:layout_width=&amp;quot;fill_parent&amp;quot;&amp;gt;
      &amp;lt;CheckBox android:id=&amp;quot;@+id/CheckBox03&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:background=&amp;quot;@drawable/flyer_03&amp;quot; android:gravity=&amp;quot;bottom&amp;quot;&amp;gt;&amp;lt;/CheckBox&amp;gt;
      &amp;lt;CheckBox android:id=&amp;quot;@+id/CheckBox04&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:background=&amp;quot;@drawable/flyer_04&amp;quot; android:gravity=&amp;quot;bottom&amp;quot;&amp;gt;&amp;lt;/CheckBox&amp;gt;
    &amp;lt;/TableRow&amp;gt;
        &amp;lt;TableRow android:id=&amp;quot;@+id/TableRow02&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:fitsSystemWindows=&amp;quot;true&amp;quot; android:layout_width=&amp;quot;fill_parent&amp;quot;&amp;gt;
      &amp;lt;CheckBox android:id=&amp;quot;@+id/CheckBox05&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:background=&amp;quot;@drawable/flyer_05&amp;quot; android:gravity=&amp;quot;bottom&amp;quot;&amp;gt;&amp;lt;/CheckBox&amp;gt;
      &amp;lt;CheckBox android:id=&amp;quot;@+id/CheckBox06&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:background=&amp;quot;@drawable/flyer_06&amp;quot; android:gravity=&amp;quot;bottom&amp;quot;&amp;gt;&amp;lt;/CheckBox&amp;gt;
    &amp;lt;/TableRow&amp;gt;
  &amp;lt;/TableLayout&amp;gt;&amp;lt;/ScrollView&amp;gt;&amp;lt;LinearLayout android:id=&amp;quot;@+id/LinearLayout01&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:layout_width=&amp;quot;fill_parent&amp;quot;&amp;gt;&amp;lt;TextView android:id=&amp;quot;@+id/TextView01&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:text=&amp;quot;Add to:&amp;quot;&amp;gt;&amp;lt;/TextView&amp;gt;
&amp;lt;Spinner android:id=&amp;quot;@+id/Spinner01&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:layout_weight=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/Spinner&amp;gt;
&amp;lt;ImageButton android:id=&amp;quot;@+id/ImageButton01&amp;quot; android:layout_width=&amp;quot;wrap_content&amp;quot; android:layout_height=&amp;quot;wrap_content&amp;quot; android:src=&amp;quot;@drawable/add_to_list&amp;quot; android:onClick=&amp;quot;onAddToList&amp;quot;&amp;gt;&amp;lt;/ImageButton&amp;gt;
&amp;lt;/LinearLayout&amp;gt;



&amp;lt;/LinearLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2360810230398651310?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2360810230398651310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2360810230398651310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2360810230398651310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2360810230398651310'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/07/scrollview.html' title='Элементы на одном уровне с ScrollView'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-9194225564285646390</id><published>2010-06-05T15:36:00.004+03:00</published><updated>2010-06-05T16:15:53.397+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Список с кнопками в Android 2.1</title><content type='html'>&lt;span style="font-size:130%;"&gt;Постановка задачи&lt;/span&gt;
Задача предельно простая. Нужен список элементов, каждая строка должна содержать название элемента и кнопку (кнопки) для управления этим элементом. В разных местах можно найти отрывочные данные по решению проблем, связанных с этой задачей. Собственно список проблем таков:
&lt;ol&gt;&lt;li&gt;При добавлении кнопки в строку перестает работать выделение стоки&lt;/li&gt;&lt;li&gt;Кнопка содержит фон, которые может не вписываться в дизайн списка&lt;/li&gt;&lt;li&gt;Обработка событий от кнопок&lt;/li&gt;&lt;/ol&gt;Есть разные подходы к решению этих проблем, от простых до очень сложных, некоторые подходы вообще не работают на последних SDK. Далее я приведу те решения, которые я нахожу достаточно простыми в реализации и которые работают на Android SDK 2.1.
&lt;span class="fullpost"&gt;
&lt;span style="font-size:130%;"&gt;Проблема с фокусом&lt;/span&gt;
Сама проблема связана с тем, что кнопка перехватывает на себя фокус. В результате чего не вызывается метод &lt;span style="font-weight: bold;font-family:courier new;" &gt;onListItemClick&lt;/span&gt;. Решение заключается в изменении атрибута &lt;span style="font-weight: bold;font-family:courier new;" &gt;android:descendantFocusability&lt;/span&gt; у родительского контейнера (группы, которая содержит кнопку и остальные визуальные компоненты, с помощью которых отображается строка списка). Значение этого атрибута должно быть установлено в &lt;span style="font-weight: bold;font-family:courier new;" &gt;blocksDescendants&lt;/span&gt;.

&lt;span style="font-size:130%;"&gt;Фон кнопки&lt;/span&gt;
Если в качестве кнопки вы используете изображение (&lt;span style="font-weight: bold;font-family:courier new;" &gt;ImageButton&lt;/span&gt;), то предопределенный фон может сильно портить дизайн списка. Решение тривиально - необходимо установить значение атрибута &lt;span style="font-weight: bold;font-family:courier new;" &gt;android:background&lt;/span&gt; в &lt;span style="font-weight: bold;font-family:courier new;" &gt;@android:color/transparent&lt;/span&gt;. Однако это порождает другую проблему. Теперь кнопка визуально не подтверждает нажатие и фокус. Возможно такое поведение может быть приемлемым, но если нет, то необходимо использовать различные рисунки для каждого состояния кнопки:
&lt;ol&gt;&lt;li&gt;Создать в папке &lt;span style="font-weight: bold;font-family:courier new;" &gt;drawable &lt;/span&gt;картинки для каждого состояния кнопки: button_pressed.png, button_focused.png, button_normal.png&lt;/li&gt;&lt;li&gt;Создать в папке &lt;span style="font-weight: bold;font-family:courier new;" &gt;drawable &lt;/span&gt;специальны XML файл, который будет выбирать изображение для каждого состояния (селектор), возможное содержимое этого файла привожу ниже&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;button_selector.xml&lt;/span&gt;:
&lt;pre class="prettyprint"&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;&lt;span class="pln"&gt;xml version&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="str"&gt;"1.0"&lt;/span&gt;&lt;span class="pln"&gt; encoding&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="str"&gt;"utf-8"&lt;/span&gt;&lt;span class="pun"&gt;?&gt;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="tag"&gt;&lt;selector&gt;&lt;/selector&gt;&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;xmlns:android&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"http://schemas.android.com/apk/res/android"&lt;/span&gt;&lt;span class="tag"&gt;&gt;&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="tag"&gt;&lt;item&gt;&lt;/item&gt;&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;android:state_pressed&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"true"&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="atn"&gt;android:drawable&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"@drawable/button_pressed"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="tag"&gt;/&gt;&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="com"&gt;&lt;!-- pressed --&gt;&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="tag"&gt;&lt;item&gt;&lt;/item&gt;&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;android:state_focused&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"true"&lt;/span&gt;&lt;span class="pln"&gt;
        &lt;/span&gt;&lt;span class="atn"&gt;android:drawable&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"@drawable/button_focused"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="tag"&gt;/&gt;&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="com"&gt;&lt;!-- focused --&gt;&lt;/span&gt;&lt;span class="pln"&gt;
  &lt;/span&gt;&lt;span class="tag"&gt;&lt;item&gt;&lt;/item&gt;&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="atn"&gt;android:drawable&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"@drawable/button_normal"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="tag"&gt;/&gt;&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="com"&gt;&lt;!-- default --&gt;&lt;/span&gt;&lt;span class="pln"&gt;
&lt;/span&gt;&lt;span class="tag"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
Более подробно можно почитать в документации по &lt;a href="http://developer.android.com/reference/android/widget/ImageButton.html"&gt;ImageButton&lt;/a&gt;.

&lt;span style="font-size:130%;"&gt;Обработка событий
&lt;/span&gt;Здесь я использовал следующий подход. Каждый компонент типа &lt;span style="font-weight: bold;font-family:courier new;" &gt;View &lt;/span&gt;содержит атрибут &lt;span style="font-weight: bold;font-family:courier new;" &gt;android:onClick&lt;/span&gt;. Его значение - это строка, которая определяет метод в данном контексте (обычно текущая активность), который будет вызван при нажатии на этот компонент. Для кнопок этот подход тоже работает. Чтобы им воспользоваться необходимо:
&lt;ol&gt;&lt;li&gt;В текущей &lt;span style="font-weight: bold;font-family:courier new;" &gt;Activity&lt;/span&gt; создать публичный метод с одним параметром типа &lt;span style="font-weight: bold;font-family:courier new;" &gt;View&lt;/span&gt;, например &lt;span style="font-weight: bold;font-family:courier new;" &gt;public void onMyButtonClick(View view) {...}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Установить значение атрибута кнопки &lt;span style="font-weight: bold;font-family:courier new;" &gt;android:onClick&lt;/span&gt; в "&lt;span style="font-weight: bold;font-family:courier new;" &gt;onMyButtonClick&lt;/span&gt;"
&lt;/li&gt;&lt;/ol&gt;Открытым остался вопрос, а как же определить, какая именно кнопка была нажата?
Тут тоже можно идти разными путями, но я выбрал использование собственной реализации интерфейса &lt;span style="font-weight: bold;font-family:courier new;" &gt;SimpleCursorAdapter.ViewBinder&lt;/span&gt;. С его помощью я помещаю ID текущего элемента списка в &lt;span style="font-weight: bold;font-family:courier new;" &gt;Tag&lt;/span&gt; кнопки. Выглядит это примерно следующим образом:&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;    private final class ItemRowBinder implements SimpleCursorAdapter.ViewBinder {
      private static final String TAG = "ItemRowBinder";

      @Override
      public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

          switch (view.getId()) {
          case R.id.ImageButtonDelete: {
              view.setTag(Long.valueOf(cursor.getLong(columnIndex)));
              return true;
          }
          }

          return false;
      }

  }&lt;/code&gt;&lt;/pre&gt;Конечно надо не забыть указать привязку поля с ID и компонента кнопки в конструкторе &lt;span style="font-weight: bold;font-family:courier new;" &gt;SimpleCursorAdapter&lt;/span&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-9194225564285646390?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/9194225564285646390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=9194225564285646390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/9194225564285646390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/9194225564285646390'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/06/android-21.html' title='Список с кнопками в Android 2.1'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2705666266893398824</id><published>2010-05-23T23:40:00.003+03:00</published><updated>2010-05-23T23:44:47.171+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Skype 2.1 Beta 2 for Linux</title><content type='html'>Тихо и незаметно вышла новая версия Skype для Linux. Ничего революционного я в нем не нашел. Но очень радует, что оно живо и развивается.

Ссылки для скачивания:
&lt;a href="http://www.skype.com/intl/en-us/get-skype/on-your-computer/linux/"&gt;http://www.skype.com/intl/en-us/get-skype/on-your-computer/linux/&lt;/a&gt;
&lt;small&gt;&lt;strong&gt;
Technical details&lt;/strong&gt;       
Version 2.1.0.81

&lt;/small&gt;&lt;h2&gt;What's new&lt;/h2&gt;     &lt;ul&gt;&lt;li&gt;Screen sharing&lt;/li&gt;&lt;li&gt;Quote a message in chat&lt;/li&gt;&lt;li&gt;Localized time formats&lt;/li&gt;&lt;li&gt;Support for UI styles&lt;/li&gt;&lt;li&gt;Report abuse&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2705666266893398824?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2705666266893398824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2705666266893398824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2705666266893398824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2705666266893398824'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/05/skype-21-beta-2-for-linux.html' title='Skype 2.1 Beta 2 for Linux'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-1879631295867278167</id><published>2010-05-21T15:53:00.004+03:00</published><updated>2010-05-21T16:03:26.430+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='interview'/><title type='text'>Isolation levels</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { margin: 0.79in }   TD P { margin-bottom: 0in }   P { margin-bottom: 0.08in }   H3 { margin-bottom: 0.08in }   H3.western { font-family: "Arial", sans-serif }   H3.ctl { font-family: "Mangal" }  --&gt;  &lt;/style&gt; &lt;p style="margin-bottom: 0in;"&gt;Isolation levels provide a degree of control of the effects one transaction can have on another concurrent transaction. Since concurrent effects are determined by the precise ways in which, a particular database handle locks and its drivers may handle these locks differently.&lt;/p&gt;&lt;span class="fullpost"&gt; &lt;p style="margin-bottom: 0in;"&gt;
&lt;/p&gt; &lt;table style="color: rgb(0, 0, 0);" rules="ROWS" border="1" cellpadding="4" cellspacing="0" width="100%"&gt;  &lt;col width="51*"&gt;  &lt;col width="51*"&gt;  &lt;col width="51*"&gt;  &lt;col width="51*"&gt;  &lt;col width="51*"&gt;  &lt;tbody&gt;&lt;tr valign="TOP"&gt;   &lt;td sdnum="1033;1033;@" width="20%"&gt;    &lt;p style="text-decoration: none;" align="LEFT"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;b&gt;&lt;span style="text-decoration: none;"&gt;Isolation   
level&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td sdnum="1033;1033;@" width="20%"&gt;    &lt;p style="text-decoration: none;" align="LEFT"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;b&gt;&lt;span style="text-decoration: none;"&gt;Phantom   
records&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td sdnum="1033;1033;@" width="20%"&gt;    &lt;p style="text-decoration: none;" align="LEFT"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;b&gt;&lt;span style="text-decoration: none;"&gt;Non-repeatable   
reads&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td sdnum="1033;1033;@" width="20%"&gt;    &lt;p style="text-decoration: none;" align="LEFT"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;b&gt;&lt;span style="text-decoration: none;"&gt;Dirty   
reads&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td sdnum="1033;1033;@" width="20%"&gt;    &lt;p style="text-decoration: none;" align="LEFT"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;b&gt;&lt;span style="text-decoration: none;"&gt;Deadlocks&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="TOP"&gt;   &lt;td sdnum="1033;1033;@" bg="" style="color: rgb(255, 255, 255);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;Serializable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(0, 255, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(0, 255, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(0, 255, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(255, 0, 0);" width="20%"&gt;    &lt;p style="background: none repeat scroll 0% 0% transparent; font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="TOP"&gt;   &lt;td sdnum="1033;1033;@" bg="" style="color: rgb(255, 255, 255);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;Repeatable    read&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(255, 0, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(0, 255, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(0, 255, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(0, 255, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="TOP"&gt;   &lt;td sdnum="1033;1033;@" bg="" style="color: rgb(255, 255, 255);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;Read    committed&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(255, 0, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(255, 0, 0);" width="20%"&gt;    &lt;p style="background: none repeat scroll 0% 0% transparent; font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(0, 255, 0);" width="20%"&gt;    &lt;p style="background: none repeat scroll 0% 0% transparent; font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(0, 255, 0);" width="20%"&gt;    &lt;p style="background: none repeat scroll 0% 0% transparent; font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="TOP"&gt;   &lt;td sdnum="1033;1033;@" bg="" style="color: rgb(255, 255, 255);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;Read    uncommitted&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(255, 0, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(255, 0, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(255, 0, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td bg="" style="color: rgb(0, 255, 0);" width="20%"&gt;    &lt;p style="font-style: normal; font-weight: normal; text-decoration: none;" align="LEFT"&gt;    &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Thorndale,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p style="margin-bottom: 0in;"&gt;
&lt;/p&gt; &lt;h3 class="western"&gt;Serializable&lt;/h3&gt; &lt;p style="margin-bottom: 0in;"&gt;Strongest level of isolation. Places a range locks on the data set, preventing other users from updating or inserting rows into the data set until the transaction is complete. Can produce deadlocks.&lt;/p&gt; &lt;h3 class="western"&gt;Repeatable read&lt;/h3&gt; &lt;p style="margin-bottom: 0in;"&gt;Locks are placed on all data that is used in a query, preventing other users from updating the data, but new phantom records can be inserted into the data set by another user and are included in later reads in the current transaction.&lt;/p&gt; &lt;h3 class="western"&gt;Read committed&lt;/h3&gt; &lt;p style="margin-bottom: 0in;"&gt;Can't read uncommitted data by another transactions. Shared locks are held while the data is being read  to avoid dirty reads, but the data can be changed before the end of the transaction resulting in non-repeatable reads and phantom records.&lt;/p&gt; &lt;h3 class="western"&gt;Read uncommitted&lt;/h3&gt; &lt;p&gt;Can read uncommitted data (dirty reads) by another transaction, and non-repeatable read and phantom records are possible. Least restrictive of all isolation levels. No shared locks are issued and no exclusive locks are honoured.&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;
&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;As the transaction isolation level increases, likely performance degradation follows, as additional locks are required to protect data integrity. If the underlying data doesn't require such a high degree of integrity, the isolation level can be lowered to improve performance.&lt;/p&gt; &lt;p style="margin-bottom: 0in; border-width: medium medium 1px; border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(0, 0, 0); padding: 0in 0in 0.03in;"&gt;
&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:78%;"&gt;&lt;i&gt;This post is created with OpenOffice.org.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-1879631295867278167?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/1879631295867278167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=1879631295867278167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1879631295867278167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1879631295867278167'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/05/isolation-levels.html' title='Isolation levels'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-8305706432208400437</id><published>2010-04-23T07:52:00.002+03:00</published><updated>2010-04-23T07:57:29.520+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX 1.3 Released</title><content type='html'>&lt;blockquote&gt;We're very excited to announce the immediate availability of the JavaFX 1.3 platform.  This release represents an important upgrade to the product and delivers a range of performance and functional improvements, including:

    * New and enhanced support for UI controls, CSS skinning, and programmatic layout
    * Performance improvements in the JavaFX Runtime
    * New NetBeans IDE 6.9 Beta with improved editing and an updated JavaFX Composer plug-in
    * New features and enhanced performance in JavaFX Production Suite
    * A native JavaFX font family called Amble
    * Support for the development of TV applications, including a new TV emulator
    * Availability of the mobile emulator on the Mac platform&lt;/blockquote&gt;

I'm going to give it a very last try. If this technology is still unusable for the real-life applications, then I will never look at it again!

More details at &lt;a href="http://blogs.sun.com/javafx/entry/javafx_1_3_released_delivers"&gt;the official site&lt;/a&gt;.

&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-8305706432208400437?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/8305706432208400437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=8305706432208400437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8305706432208400437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8305706432208400437'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/04/javafx-13-released.html' title='JavaFX 1.3 Released'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-6422712054209414954</id><published>2010-04-15T13:30:00.002+03:00</published><updated>2010-04-15T13:33:27.067+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><category scheme='http://www.blogger.com/atom/ns#' term='LnF'/><title type='text'>Substance 6.0 official release</title><content type='html'>&lt;blockquote&gt;It is a great pleasure to announce the availability of the final release or version 6.0 of Substance look-and-feel (code-named Sonoma). The release notes for version 6.0 contain the detailed information on the contents of this release which include the following:

    * Multi-state animated transitions
    * New look for text based components (text fields, combo boxes, spinners, date pickers)
    * Custom component states
    * Support for drop location&lt;/blockquote&gt;

For more detail see &lt;a href="http://www.pushing-pixels.org/?p=1746"&gt;official site&lt;/a&gt;...

&lt;span class=fullpost&gt;Animations in Substance 6.0 are powered by the Trident animation library. You will need to add the matching Trident jar to your classpath. Substance 6.0 is using version 1.2 of Trident which can be downloaded from the main Trident download area or from the Substance 6.0 download area.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-6422712054209414954?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/6422712054209414954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=6422712054209414954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6422712054209414954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6422712054209414954'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/04/substance-60-official-release.html' title='Substance 6.0 official release'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-6554288770601554675</id><published>2010-04-11T19:09:00.004+03:00</published><updated>2010-04-11T19:56:16.166+03:00</updated><title type='text'>HTTP basic authentication. Credential caching</title><content type='html'>By default, when using authentication for connections, each host/port (or proxy host/port) is associated with a single set of credentials. A key for the credentials is a string specified as follows: A:[B:]C:D:E[:F] Between 4 and 6 fields separated by ":" where the fields have the following meaning: A is "s" or "p" for server or proxy authentication respectively B is optional and is "D", "B", or "N" for digest, basic or ntlm auth. C is either "http" or "https" D is the hostname E is the port number F is optional and if present is the realm.

 After being initially requested (and assuming the credentials are valid), any subsequent HttpURLConnections on that host/port (or proxy host/port) will use the same credentials. 

There are some situations where you may wish to have different sets of authentication credentials for connections going to the same host/port.  
&lt;span class=fullpost&gt;Unfortunately this caching behaviour is hardcoded in JDK and could not be changed via any configuration. The only solution I have found was using of custom implementation for this cache. This method implies dealing with Sun proprietary classes.

&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;    
import sun.net.www.protocol.http.AuthCache;
import sun.net.www.protocol.http.AuthCacheValue;

.....

AuthCacheValue.setAuthCache(new AuthCache() {
      
      public void remove(String arg0, AuthCacheValue arg1) {
      }
      
      public void put(String arg0, AuthCacheValue arg1) {
      }
      
      public AuthCacheValue get(String arg0, String arg1) {
        return null;
      }
    });
    
    Authenticator.setDefault(new Authenticator() {
      @Override
      protected PasswordAuthentication getPasswordAuthentication() {
        return new MyPasswordAuthentication(...);
      }
    });
&lt;/code&gt;&lt;/pre&gt;

In this case no credential are cached at all. It works for me. If you know another way to disable caching of credentials, please share it with me.

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-6554288770601554675?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/6554288770601554675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=6554288770601554675' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6554288770601554675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6554288770601554675'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/04/http-basic-authentication-credential.html' title='HTTP basic authentication. Credential caching'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-5377867721173624065</id><published>2010-01-03T11:18:00.003+02:00</published><updated>2010-01-03T11:22:47.348+02:00</updated><title type='text'>How to update Google Chrome to Beta version?</title><content type='html'>Google Chrome updates via "channels". There are three channels:
&lt;ul&gt;&lt;li&gt;Stable channel&lt;/li&gt;&lt;li&gt;Beta channel&lt;/li&gt;&lt;li&gt;Dev channel&lt;/li&gt;&lt;/ul&gt;
&lt;span class=fullpost&gt;For more information see following link: &lt;a href="http://dev.chromium.org/getting-involved/dev-channel"&gt;Early Access Release Channels&lt;/a&gt;. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-5377867721173624065?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/5377867721173624065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=5377867721173624065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5377867721173624065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5377867721173624065'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2010/01/how-to-update-google-chrome-to-beta.html' title='How to update Google Chrome to Beta version?'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2099328296995012703</id><published>2009-12-15T01:12:00.003+02:00</published><updated>2009-12-15T01:17:13.197+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>CZJUG Prosinec - Vaadin a Vánoční hrátky s JAXB</title><content type='html'>Prosincové setkání Czech Java User Group probehne 14.12. od 19 hodin v posluchárně S5 na Matematicko-fyzikální fakultě Karlovy Univerzity na Malostranském náměstí 25, Praha 1.&lt;ul&gt;&lt;li&gt;Vaadin - Rich web applications in plain Java without plugins or JavaScript&lt;/li&gt;&lt;li&gt;Vánoční hrátky s JAXB&lt;/li&gt;&lt;/ul&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_cWkmyfg16CU/SybHIeY6MZI/AAAAAAAAJMY/vQUil_qcPSM/s1600-h/DSC00270.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_cWkmyfg16CU/SybHIeY6MZI/AAAAAAAAJMY/vQUil_qcPSM/s400/DSC00270.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5415234550370021778" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cWkmyfg16CU/SybHIjzQ0sI/AAAAAAAAJMg/MaIKyfe2sXc/s1600-h/DSC00271.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_cWkmyfg16CU/SybHIjzQ0sI/AAAAAAAAJMg/MaIKyfe2sXc/s400/DSC00271.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5415234551822734018" /&gt;&lt;/a&gt;
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2099328296995012703?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2099328296995012703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2099328296995012703' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2099328296995012703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2099328296995012703'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/12/czjug-prosinec-vaadin-vanocni-hratky-s.html' title='CZJUG Prosinec - Vaadin a Vánoční hrátky s JAXB'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_cWkmyfg16CU/SybHIeY6MZI/AAAAAAAAJMY/vQUil_qcPSM/s72-c/DSC00270.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-1664307220780233679</id><published>2009-12-13T15:32:00.003+02:00</published><updated>2009-12-13T15:34:57.465+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soft'/><title type='text'>Xmarks for Chrome!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.xmarks.com/about/images/chrome-promo-2.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 148px; height: 105px;" src="http://www.xmarks.com/about/images/chrome-promo-2.png" border="0" alt="" /&gt;&lt;/a&gt;
&lt;blockquote&gt;Xmarks is the #1 bookmarking add-on. Xmarks synchronizes across multiple computers, and across web browsers: Chrome, Firefox, Safari and Internet Explorer. After you install the add-on, click on the notification to set up Xmarks and start backing up and synchronizing your bookmarks. Xmarks sync profiles give you full control over which bookmarks are synced to which computers, allowing you to keep private bookmarks at home while syncing everything else to your work computer. Xmarks automatically keeps a backup of each bookmark change, making it easy to backup and restore your bookmark sets.&lt;/blockquote&gt;

&lt;a href="https://chrome.google.com/extensions/detail/ajpgkpeckebdhofmmjfgcjjiiejpodla"&gt;Download...&lt;/a&gt;

&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-1664307220780233679?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/1664307220780233679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=1664307220780233679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1664307220780233679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1664307220780233679'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/12/xmarks-for-chrome.html' title='Xmarks for Chrome!'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-8365977643949877253</id><published>2009-12-07T11:31:00.012+02:00</published><updated>2009-12-19T21:08:49.987+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><title type='text'>HTTP basic authentication with JAX-WS (Client)</title><content type='html'>JAX-WS does not do very well with HTTP basic authentication.
In general, to create and use a web-service client you have to perform the following steps:
1. Use &lt;span style="font-weight: bold;"&gt;wsimport&lt;/span&gt; to generate the stub files
2. Create a service class in the client
3. Retrieve a proxy to the service, also known as a port

All three steps could require HTTP basic authentication. And for each step it have to be handled in a different way.
&lt;span class="fullpost"&gt;&lt;h4&gt;1. The stub files generation&lt;/h4&gt;If access to a &lt;span style="font-style: italic;"&gt;wsdl&lt;/span&gt; file is restricted with basic authentication, &lt;span style="font-weight: bold;"&gt;wsimport&lt;/span&gt; fails to get it. Unfortunately it does not support the common approach to write access credentials right into the &lt;/span&gt;&lt;span class="fullpost"&gt;
&lt;/span&gt;&lt;span class="fullpost"&gt;URL (&lt;a href="http://www.ietf.org/rfc/rfc1738.txt"&gt;RFC 1738&lt;/a&gt;). It is not a big deal to resolve this issue. You just need to create a server authentication file: &lt;span style="font-style: italic;"&gt;$HOME/.metro/auth&lt;/span&gt;. This file should have the WSDL URL with username and password in the &lt;a href="http://www.ietf.org/rfc/rfc1738.txt"&gt;RFC 1738&lt;/a&gt; format:
&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;http[s]://user:password@host:port//&lt;url-path&gt;&lt;/code&gt;&lt;/pre&gt;You can have line delimited multiple entries in this file and they can be used
for various sites that need basic authentication.
&lt;h4&gt;2. The service class creation&lt;/h4&gt;A constructor of the service object requires access to the WSDL. And again it does not support basic authentication out of the box. You have an option to download the wsdl file and use it locally. Another option is to use the default authenticator:
&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;Authenticator.setDefault(new Authenticator() {
 @Override
 protected PasswordAuthentication getPasswordAuthentication() {
   return new PasswordAuthentication(
     USER_NAME,
     PASSWORD.toCharArray());
 }
});&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. The service class configuration&lt;/h4&gt;And the last but not least part of our adventure is configuration of the service port:
&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;OurWebService service = new OurWebService ();
OurWebServicePortType port = service.getOurWebServicePortType();

BindingProvider bindingProvider = (BindingProvider)port;
Map&lt;string, object=""&gt; requestContext = bindingProvider.getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, USER_NAME);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, PASSWORD);&lt;/string,&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style="font-weight: bold;"&gt;Done!&lt;/span&gt;

Now you are able to use methods of the port object to communicate with a web service.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-8365977643949877253?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/8365977643949877253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=8365977643949877253' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8365977643949877253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8365977643949877253'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/12/http-basic-authentication-with-jax-ws.html' title='HTTP basic authentication with JAX-WS (Client)'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2103143528796694715</id><published>2009-12-02T17:47:00.003+02:00</published><updated>2009-12-06T16:49:52.937+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><title type='text'>java6 splash screen and maven project</title><content type='html'>Splash screens are a standard part of any modern graphical user interface (GUI) application. Their primary purpose is to let the user know that the application is starting up. An application that displays a polished and professional-looking splash screen can occupy the user's attention and gain the user's confidence that the application is starting. 
Fortunately, Java™ SE 6 provides a solution that allows the application to display the splash screen even before the virtual machine starts. A Java application launcher is able to decode an image and display it in a simple non-decorated window.  
How to configure splash screen for the application in a maven project?
&lt;span class="fullpost"&gt;
1. Put you splash screen image somewhere in a class path. Let it be something like "YourProjectName/src/main/resources/images/splash.png"
2. Add &lt;b&gt;maven-jar-plugin&lt;/b&gt; to the POM file
3. Configure a manifest generation
The final fragment of the POM file looks like one below:
&lt;iframe src="http://etf.by.ru/blogger_etf_lab/java6splash/pom.xml.html" width="95%" height="400"&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2103143528796694715?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2103143528796694715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2103143528796694715' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2103143528796694715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2103143528796694715'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/12/java6-splash-screen-and-maven-project.html' title='java6 splash screen and maven project'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2197895939087859506</id><published>2009-11-21T12:25:00.001+02:00</published><updated>2009-12-13T15:37:14.297+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soft'/><title type='text'>Reiser4 May Go For Mainline Inclusion In 2010</title><content type='html'>&lt;a href="http://www.phoronix.com/scan.php?page=news_item&amp;px=NzY4OQ"&gt;source...&lt;/a&gt;
The Reiser4 file-system has been around since 2004 but has not reached a point of being close to be included in the mainline Linux kernel, especially after the lead developer, Hans Reiser, was convicted of murdering his wife. Development of Reiser4 has continued on, albeit with a very limited number of developers, and not nearly at the brisk pace of Btrfs or with great interest by corporate parties. The last TODO list update on the Reiser4 file-system was posted back in April with just five items un-addressed. In late July it was then shared by Edward Shishkin, a former employee of Hans Reiser's Namesys who has since effectively taken over work on Reiser4, that in the Autumn they would begin exploring the opportunity of getting this file-system in the mainline Linux kernel.
&lt;span class=fullpost&gt;
In the United States, the end of Autumn is nearing and Winter is approaching, but there hasn't yet been any push to get Reiser4 into the mainline Linux kernel. What has happened? Well, we asked Shishkin. Before asking Linus to pull Reiser4 into the mainline Linux kernel, he first wants to publish a plug-in design document in a scholarly magazine in order to facilitate some independent expert review. After missing the deadline for FAST 2010, Shishkin is now hoping to publish this Reiser4 document for USENIX Annual 2010. This would be due in January, but their annual conference does not take place until June. After that, they can focus on finally getting this advanced Linux file-system into the mainline code-base.

It's possible we could possibly see Reiser4 in the mainline Linux kernel in H2'2010. Assuming this all works out and Shishkin and the other developers go for inclusion shortly thereafter, it would put Reiser4 on the block around the Linux 2.6.36 time-frame.
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2197895939087859506?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2197895939087859506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2197895939087859506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2197895939087859506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2197895939087859506'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/11/reiser4-may-go-for-mainline-inclusion.html' title='Reiser4 May Go For Mainline Inclusion In 2010'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-6689273359613467560</id><published>2009-11-16T14:41:00.003+02:00</published><updated>2009-12-13T15:35:57.329+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soft'/><title type='text'>Google Chrome OS To Launch Within A Week</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_cWkmyfg16CU/SwFIvJtEH6I/AAAAAAAAJFE/AlSa7IVzzZc/s1600/52214v13-max-150x150.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 143px;" src="http://4.bp.blogspot.com/_cWkmyfg16CU/SwFIvJtEH6I/AAAAAAAAJFE/AlSa7IVzzZc/s320/52214v13-max-150x150.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5404681002717290402" /&gt;&lt;/a&gt;

&lt;a href="http://www.techcrunch.com/2009/11/13/google-chrome-os-to-launch-within-a-week"&gt;source...&lt;/a&gt;

Google’s Chrome OS project, first announced in July, will become available for download within a week, we’ve heard from a reliable source. Google previously said to expect an early version of the OS in the fall.

What can we expect? Driver support will likely be a weak point. We’ve heard at various times that Google has a legion of engineers working on the not so glamorous task of building hardware drivers. And we’ve also heard conflicting rumors that Google is mostly relying on hardware manufacturers to create those drivers. Whatever the truth, and it’s likely in between, having a robust set of functioning drivers is extremely important to Chrome OS’s success. People will want to download this to whatever computer they use and have it just work.
&lt;span class=fullpost&gt;
We expect Google will be careful with messaging around the launch, and endorse a small set of devices for installation. EEE PC netbooks, for example, may be one set of devices that Google will say are ready to use Chrome OS. There will likely be others as well, but don’t expect to be able to install it on whatever laptop or desktop machine you have from day one. Google has previously said they are working with Acer, Adobe, ASUS, Freescale, Hewlett-Packard, Lenovo, Qualcomm, Texas Instruments, and Toshiba on the project.

We’ve seen convincing and not so convincing screenshots of Chrome OS over the last several months. The good news is the speculation is about to end, and you can try it out yourself. If you have one of the supported devices, that is. 

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-6689273359613467560?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/6689273359613467560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=6689273359613467560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6689273359613467560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6689273359613467560'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/11/google-chrome-os-to-launch-within-week.html' title='Google Chrome OS To Launch Within A Week'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_cWkmyfg16CU/SwFIvJtEH6I/AAAAAAAAJFE/AlSa7IVzzZc/s72-c/52214v13-max-150x150.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-4645958054596591170</id><published>2009-11-03T10:38:00.002+02:00</published><updated>2009-12-13T15:35:39.810+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><title type='text'>SwingX 1.6 released</title><content type='html'>&lt;blockquote&gt;Just 5 months after the 1.0 release, SwingX team is pleased to announce yet another release. This release signifies the big step in the project. This releave version number signifies abandoning the compatibility with Java 5 and aligning the base line with the Java 6. The release contains bug fixes, introduces full Nimbus Look and Feel support and removes all dependencies on Java 5 related libraries and code changes.&lt;/blockquote&gt;
Release notes:
&lt;a href="http://swinglabs.org/releases/1.6/ReleaseNotes.html"&gt;http://swinglabs.org/releases/1.6/ReleaseNotes.html&lt;/a&gt;
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-4645958054596591170?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/4645958054596591170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=4645958054596591170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4645958054596591170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4645958054596591170'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/11/swingx-16-released.html' title='SwingX 1.6 released'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-4537033585687871415</id><published>2009-11-01T22:19:00.005+02:00</published><updated>2009-12-13T15:35:20.044+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metawidget'/><title type='text'>Metawidget 0.8 - 0.85 migration - trying ordeal you have to deal with</title><content type='html'>Metawidget 0.85 is released. A great work was done to improve architecture of this framework. Now API looks mature and straightforward. But backward compatibility is broken.
&lt;span class="fullpost"&gt; Here is a list of main changes:     &lt;ul&gt;&lt;li&gt;  WidgetProcessors and refactored internal pipeline &lt;/li&gt;&lt;li&gt; Upgraded RichFaces support (SuggestionBox, TabPanel and RichPanel)&lt;/li&gt;&lt;li&gt; Upgraded ExtGWT support to 2.0.1 (includes new Slider widget)&lt;/li&gt;&lt;li&gt; Much more documentation &lt;/li&gt;&lt;li&gt; XML Schemas for all components &lt;/li&gt;&lt;li&gt; Bug fixes; and &lt;/li&gt;&lt;li&gt; More unit tests &lt;/li&gt;&lt;/ul&gt;
The official migration guide: &lt;a href="http://kennardconsulting.blogspot.com/2009/09/metawidget-08-to-085-migration-guide.html"&gt;http://kennardconsulting.blogspot.com/2009/09/metawidget-08-to-085-migration-guide.html&lt;/a&gt;
My migration experience: &lt;a href="http://docs.google.com/View?id=dmsrn2h_210gsfkf2dm"&gt;http://docs.google.com/View?id=dmsrn2h_210gsfkf2dm&lt;/a&gt;

PS. &lt;span style="font-style:italic;"&gt;Actually it was impossible to migrate my project to 0.85 version, I had to use patched one.&lt;/span&gt;
PPS. &lt;span style="font-style:italic;"&gt;Finally I have migrated my project to 0.85 release. Many thanks to Richard Kennard for support.&lt;/span&gt; 
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-4537033585687871415?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/4537033585687871415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=4537033585687871415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4537033585687871415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4537033585687871415'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/11/metawidget-08-08-migration-trying.html' title='Metawidget 0.8 - 0.85 migration - trying ordeal you have to deal with'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2775810870054721125</id><published>2009-10-31T13:56:00.001+02:00</published><updated>2009-11-01T11:54:43.411+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SUN'/><title type='text'>What are Oracle’s plans for NetBeans?</title><content type='html'>&lt;blockquote&gt;Oracle has a strong track record of demonstrating commitment to choice for Java developers. As such, NetBeans is expected to provide an additional open source option and complement to the two free tools Oracle already offers for enterprise Java development: Oracle JDeveloper and Oracle Enterprise Pack for Eclipse. While Oracle JDeveloper remains Oracle’s strategic development tool for the broad portfolio of Oracle Fusion Middleware products and for Oracle’s next generation of enterprise applications, developers will be able to use whichever free tool they are most comfortable with for pure Java and Java EE development: JDeveloper, Enterprise Pack for Eclipse, or NetBeans.
&lt;span class=fullpost&gt;Original document &lt;a href="http://www.oracle.com/ocom/groups/public/documents/webcontent/038563.pdf"&gt;link&lt;/a&gt;.&lt;/blockquote&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2775810870054721125?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2775810870054721125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2775810870054721125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2775810870054721125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2775810870054721125'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/10/what-are-oracles-plans-for-netbeans.html' title='What are Oracle’s plans for NetBeans?'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2900175809203775683</id><published>2009-10-31T12:38:00.006+02:00</published><updated>2009-11-01T11:54:10.743+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><title type='text'>SwingX 1.6?</title><content type='html'>Two days ago the a new TAG was created in the subversion repository of the project. It is &lt;span style="font-weight:bold;"&gt;SwingX-1-6&lt;/span&gt; with comment: "Release of SwingX 1.6.".
&lt;span class=fullpost&gt;
There is an forum topic I have found: 
&lt;a href="http://forums.java.net/jive/thread.jspa?threadID=66444&amp;tstart=0"&gt;http://forums.java.net/jive/thread.jspa?threadID=66444&amp;tstart=0&lt;/a&gt;

&lt;blockquote&gt;Covered a lot of distance since final SwingX 1.0. The most important was target jdk1.6. This implied to remove 1.5 specifics, hacks and - most prominently - re-doing sorting/filtering core-style. That and lots of internal cleanup resulted in fixing 80+ issues so far. Another about 20 issues are targeted at 1.x, that is the next release, but could easily be moved to the second next.

Obviously, those changes will break existing code. And are bound to have added new bugs ;-) But on the whole, I think it's a rather stable state right now and as such a good opportunity for a release. Would call it 1.5 because so much has changed. And would love to push it out of the door as soon as possible, as long as it is half-way stable. Next major changes will be

- new/replaced components, like JXTreeTable going JXXTreeTable and JXComboBox which uses a sortable, highlightable JXList
- enhanced Nimbus (and general Synth) support

Comments highly welcome!
Jeanette &lt;/blockquote&gt;

Other related links:
&lt;a href="http://wiki.java.net/bin/view/Javadesktop/SwingXChanges"&gt;SwingXChanges&lt;/a&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2900175809203775683?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2900175809203775683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2900175809203775683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2900175809203775683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2900175809203775683'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/10/swingx-16.html' title='SwingX 1.6?'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-4594657010501163926</id><published>2009-10-28T23:10:00.003+02:00</published><updated>2009-11-01T11:53:41.572+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Apache Velocity is my choice.</title><content type='html'>If you need to generate some text (HTML, SQL, e.t.c.) you have a significant number of options. Even for java we have a lot of engines and tools. How to choose a right solution? I have performed several tests to make a picture a bit more clear. Tested approaches are enumerated below:&lt;span class="fullpost"&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html"&gt;String&lt;/a&gt;;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html"&gt;StringBuilder&lt;/a&gt;;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuffer.html"&gt;StringBuffer&lt;/a&gt;;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html"&gt;StringBuilder&lt;/a&gt; + String.format();  &lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html"&gt;StringBuilder&lt;/a&gt; + &lt;a href="http://java.sun.com/javase/6/docs/api/java/text/MessageFormat.html"&gt;MessageFormat&lt;/a&gt;.format()
&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.stringtemplate.org/"&gt;Stringtemlate&lt;/a&gt;;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://ahmadsoft.org/ropes/"&gt;Ropes&lt;/a&gt; for java;&lt;/li&gt;&lt;li&gt;&lt;a title="FreeMarker" href="http://freemarker.sourceforge.net/" id="uvg-"&gt;FreeMarker&lt;/a&gt;;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://velocity.apache.org/"&gt;Velocity&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;span class="fullpost"&gt;
Full tests report you could find &lt;a href="http://spreadsheets.google.com/pub?key=pcewUa1vxxU8JW0BM9eDRXQ"&gt;here&lt;/a&gt;.
Source code could be found &lt;a href="http://www.4shared.com/file/125286988/4283102a/Java_template_testinf_source_code.html"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-4594657010501163926?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/4594657010501163926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=4594657010501163926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4594657010501163926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4594657010501163926'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/10/apache-velocity-is-my-choice.html' title='Apache Velocity is my choice.'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-6263390544277599712</id><published>2009-10-28T15:09:00.010+02:00</published><updated>2009-11-01T14:08:31.123+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LnF'/><title type='text'>New Substance - old problems!</title><content type='html'>A new release (&lt;a href="http://weblogs.java.net/blog/kirillcool/archive/2009/09/28/substance-53-official-release"&gt;5.3&lt;/a&gt;) still useless for me. The unresolved issues with SwingX components prevent from using this well looking and features rich LnF in my projects. Some screen-shots are below. 
&lt;span class=fullpost&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_cWkmyfg16CU/SuhDPirb9aI/AAAAAAAAJCc/GltGBPniokk/s1600-h/form_sub.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 234px;" src="http://4.bp.blogspot.com/_cWkmyfg16CU/SuhDPirb9aI/AAAAAAAAJCc/GltGBPniokk/s320/form_sub.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397638087689631138" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cWkmyfg16CU/SuhDXxlwSII/AAAAAAAAJCs/Fl1CzEhDjD8/s1600-h/form_nim.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 234px;" src="http://2.bp.blogspot.com/_cWkmyfg16CU/SuhDXxlwSII/AAAAAAAAJCs/Fl1CzEhDjD8/s320/form_nim.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397638229131282562" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cWkmyfg16CU/SuhDTJeyZiI/AAAAAAAAJCk/G3OjEiCfrdk/s1600-h/form_met.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 276px;" src="http://1.bp.blogspot.com/_cWkmyfg16CU/SuhDTJeyZiI/AAAAAAAAJCk/G3OjEiCfrdk/s320/form_met.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397638149645166114" /&gt;&lt;/a&gt;

I have created a simple application to  demonstrate issues with SwibgX (1.0) components under Substance (5.3) LnF. 

First of all JXErrorPane while resizing run out of screen. It looks really ugly.

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cWkmyfg16CU/Su1dATZN8iI/AAAAAAAAJDc/y0_YIvAp8eA/s1600-h/JXErrorPane.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 79px;" src="http://2.bp.blogspot.com/_cWkmyfg16CU/Su1dATZN8iI/AAAAAAAAJDc/y0_YIvAp8eA/s320/JXErrorPane.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5399073788074521122" /&gt;&lt;/a&gt;

Secondly JXTable looks absolutely different of JTable.

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cWkmyfg16CU/Su1dGYJaXjI/AAAAAAAAJDk/C0w32uJ7_J4/s1600-h/jxtable.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 180px;" src="http://3.bp.blogspot.com/_cWkmyfg16CU/Su1dGYJaXjI/AAAAAAAAJDk/C0w32uJ7_J4/s320/jxtable.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5399073892429618738" /&gt;&lt;/a&gt;

Here is the source code to reproduce the behavior depicted above. 

&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;package javatabletest;

import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import org.jdesktop.swingx.JXErrorPane;
import org.jdesktop.swingx.JXTable;
import org.jvnet.substance.skin.SubstanceBusinessLookAndFeel;

public class Main {

    static class MyTableModel extends DefaultTableModel {

        public MyTableModel(Object[][] data, Object[] columnNames) {
            super(data, columnNames);
        }

        @Override
        public Class&amp;lt;?&amp;gt; getColumnClass(int columnIndex) {
            return (columnIndex == 4)?Boolean.class:Object.class;
        }

    }

    static Vector createDataVector(int id, String n, boolean a){
        Vector v = new Vector();
        v.add(id);
        v.add(n);
        v.add(a);
        return v;
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                try {
                    UIManager.setLookAndFeel(new SubstanceBusinessLookAndFeel());
                } catch (UnsupportedLookAndFeelException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
                JFrame.setDefaultLookAndFeelDecorated(true);
                JDialog.setDefaultLookAndFeelDecorated(true);
                JXErrorPane.showDialog(new Exception());
                createUI();
            }
        });
    }

    private static void createUI() throws HeadlessException {
        JFrame frame = new JFrame(&amp;quot;Table test&amp;quot;);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String[] columnNames = {&amp;quot;First Name&amp;quot;,
                                &amp;quot;Last Name&amp;quot;,
                                &amp;quot;Sport&amp;quot;,
                                &amp;quot;# of Years&amp;quot;,
                                &amp;quot;Vegetarian&amp;quot;};

        Object[][] data = {
            {&amp;quot;Mary&amp;quot;, &amp;quot;Campione&amp;quot;,
             &amp;quot;Snowboarding&amp;quot;, new Integer(5), new Boolean(false)},
            {&amp;quot;Alison&amp;quot;, &amp;quot;Huml&amp;quot;,
             &amp;quot;Rowing&amp;quot;, new Integer(3), new Boolean(true)},
            {&amp;quot;Kathy&amp;quot;, &amp;quot;Walrath&amp;quot;,
             &amp;quot;Knitting&amp;quot;, new Integer(2), new Boolean(false)},
            {&amp;quot;Sharon&amp;quot;, &amp;quot;Zakhour&amp;quot;,
             &amp;quot;Speed reading&amp;quot;, new Integer(20), new Boolean(true)},
            {&amp;quot;Philip&amp;quot;, &amp;quot;Milne&amp;quot;,
             &amp;quot;Pool&amp;quot;, new Integer(10), new Boolean(false)}
        };


        MyTableModel model = new MyTableModel(data, columnNames);
        JTable table1 = new JTable(model);

        JTable table2 = new JXTable(model);

        JPanel panel = new JPanel(new GridLayout(2, 1));

        JScrollPane pane1 = new JScrollPane(table1);
        JScrollPane pane2 = new JScrollPane(table2);

        panel.add(pane1);
        panel.add(pane2);
        panel.setOpaque(true);

        frame.setContentPane(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-6263390544277599712?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/6263390544277599712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=6263390544277599712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6263390544277599712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6263390544277599712'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/10/new-substance-old-problems.html' title='New Substance - old problems!'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_cWkmyfg16CU/SuhDPirb9aI/AAAAAAAAJCc/GltGBPniokk/s72-c/form_sub.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-653898482721280284</id><published>2009-10-19T18:04:00.002+03:00</published><updated>2009-11-01T11:52:40.321+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bsaf'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><title type='text'>Better Swing Application Framework 1.9 Milestone 1</title><content type='html'>It is a first real release of this project.

Changes since bsaf-1.9EA2:
   1. SessionStorage class is refactored
   2. Custom property support could be plugged in to the session storage
   3. Bug fixes
   4. Unit tests fixes 

Download
&lt;a href="http://kenai.com/projects/bsaf/downloads/directory/Releases/1.9/M1"&gt;http://kenai.com/projects/bsaf/downloads/directory/Releases/1.9/M1&lt;/a&gt;

&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-653898482721280284?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/653898482721280284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=653898482721280284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/653898482721280284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/653898482721280284'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/10/better-swing-application-framework-19.html' title='Better Swing Application Framework 1.9 Milestone 1'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-5927459205277945774</id><published>2009-10-13T22:16:00.001+03:00</published><updated>2009-10-13T22:17:58.294+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><title type='text'>Trident 1.1 official release</title><content type='html'>A new stable release is finally available.
More details on the official site: &lt;a href="http://www.pushing-pixels.org/?p=1465"&gt;http://www.pushing-pixels.org/?p=1465&lt;/a&gt;
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-5927459205277945774?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/5927459205277945774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=5927459205277945774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5927459205277945774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5927459205277945774'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/10/trident-11-official-release.html' title='Trident 1.1 official release'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-7854711400224092909</id><published>2009-09-28T13:47:00.004+03:00</published><updated>2009-09-28T13:59:58.371+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='brainbench'/><title type='text'>New certificate - SQL</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cWkmyfg16CU/SsCUeaUeajI/AAAAAAAAJBk/YvI7UafANz4/s1600-h/sqlansi.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer; width: 170px; height: 50px;" src="http://2.bp.blogspot.com/_cWkmyfg16CU/SsCUeaUeajI/AAAAAAAAJBk/YvI7UafANz4/s320/sqlansi.gif" alt="" id="BLOGGER_PHOTO_ID_5386468404517300786" border="0" /&gt;&lt;/a&gt;Demonstrates a clear understanding of many advanced concepts within this topic. Appears capable of mentoring others on most projects in this area.&lt;span class="fullpost"&gt;
&lt;span style="font-weight: bold;"&gt;Strengths&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Subqueries&lt;/li&gt;&lt;li&gt;Multi-Table Queries&lt;/li&gt;&lt;li&gt;Data Definition Language&lt;/li&gt;&lt;li&gt;Queries&lt;/li&gt;&lt;li&gt;Aggregate Queries&lt;/li&gt;&lt;li&gt;Data Modification&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Weak Areas
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;None Noted&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-7854711400224092909?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/7854711400224092909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=7854711400224092909' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/7854711400224092909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/7854711400224092909'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/09/new-certificate-sql.html' title='New certificate - SQL'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_cWkmyfg16CU/SsCUeaUeajI/AAAAAAAAJBk/YvI7UafANz4/s72-c/sqlansi.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-1147048143684151952</id><published>2009-09-27T20:08:00.004+03:00</published><updated>2009-09-27T20:11:57.805+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bsaf'/><title type='text'>Better Swing Application Framework 1.9 Early Access 2 release</title><content type='html'>Link to download: 
&lt;a href="http://kenai.com/projects/bsaf/downloads/directory/Releases/1.9/EA%202"&gt;http://kenai.com/projects/bsaf/downloads/directory/Releases/1.9/EA%202&lt;/a&gt;
Release notes: 
&lt;a href="http://kenai.com/projects/bsaf/pages/190EA2"&gt;http://kenai.com/projects/bsaf/pages/190EA2&lt;/a&gt;
&lt;span class=fullpost&gt;
This release is a new starting point for the project. It is based on SAF 1.03 sources with minimal changes:&lt;ul&gt;&lt;li&gt; Maven as a build tool &lt;li&gt; Removed dependency on the org.jdesktop.swingworker.SwingWorker. &lt;/ul&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-1147048143684151952?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/1147048143684151952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=1147048143684151952' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1147048143684151952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1147048143684151952'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/09/better-swing-application-framework-19.html' title='Better Swing Application Framework 1.9 Early Access 2 release'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-3009181335393744603</id><published>2009-09-12T17:13:00.005+03:00</published><updated>2009-09-13T14:26:45.780+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='metawidget'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><title type='text'>Metawidget is an easy way to do a complex UI.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cWkmyfg16CU/Squul6f1fII/AAAAAAAAJBE/9zEDDgxQqfs/s1600-h/logo.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 128px; height: 127px;" src="http://2.bp.blogspot.com/_cWkmyfg16CU/Squul6f1fII/AAAAAAAAJBE/9zEDDgxQqfs/s320/logo.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5380586146205367426" /&gt;&lt;/a&gt;
&lt;span style="font-weight:bold;"&gt;Introduction&lt;/span&gt;



Official site of the project: &lt;a href="http://www.metawidget.org"&gt;http://www.metawidget.org&lt;/a&gt;
&lt;blockquote&gt;Metawidget is a 'smart User Interface widget' that populates itself, at runtime, with UI components to match the properties of your business objects.&lt;/blockquote&gt;
In this article you can find some useful information for quick start. Additional documentation, forum and wiki are available on the official site.
&lt;a href="http://docs.google.com/View?id=dmsrn2h_203d3hthvhm"&gt;Full article link...&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-3009181335393744603?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/3009181335393744603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=3009181335393744603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3009181335393744603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3009181335393744603'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/09/metawidget-is-easy-way-to-do-complex-ui.html' title='Metawidget is an easy way to do a complex UI.'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_cWkmyfg16CU/Squul6f1fII/AAAAAAAAJBE/9zEDDgxQqfs/s72-c/logo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-4984697069958305485</id><published>2009-09-05T17:56:00.006+03:00</published><updated>2009-09-27T20:07:53.440+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='bsaf'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><title type='text'>Better Swing Application Framework</title><content type='html'>I have stared a new project &lt;a href="http://kenai.com/projects/bsaf"&gt;BSAF&lt;/a&gt; as a fork of the &lt;a href="https://appframework.dev.java.net/"&gt;Swing Application Framework&lt;/a&gt;.
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-4984697069958305485?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/4984697069958305485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=4984697069958305485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4984697069958305485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4984697069958305485'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/09/better-swing-application-framework.html' title='Better Swing Application Framework'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-722713932032213043</id><published>2009-09-04T10:04:00.005+03:00</published><updated>2009-09-04T10:33:21.990+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='skype'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Skype for Linux</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cWkmyfg16CU/SqC-7d3GENI/AAAAAAAAJA0/gR4TLK7Y23Q/s1600-h/download_linux.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 192px; height: 267px;" src="http://2.bp.blogspot.com/_cWkmyfg16CU/SqC-7d3GENI/AAAAAAAAJA0/gR4TLK7Y23Q/s400/download_linux.png" alt="" id="BLOGGER_PHOTO_ID_5377507883917643986" border="0" /&gt;&lt;/a&gt;
Отличные новости для тех, кто вынужден использовать &lt;a href="http://www.skype.com/"&gt;Skype&lt;/a&gt; под Linux. Доступна новая версия. Не релиз, но вполне пригодная для использования. Лично для меня в ней решено множество проблем. Пользуюсь уже 2 недели с огромным удовольствием.
&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;Основные изменения:&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Нормальная поддержка PulseAudio&lt;/li&gt;&lt;li&gt;Значок в трее показывает количество уведомлений&lt;/li&gt;&lt;li&gt;Вернули поддержку групп контактов&lt;/li&gt;&lt;li&gt;Реализованы ярлыки для контактов&lt;/li&gt;&lt;li&gt;Можно войти в публичные чаты из меню&lt;/li&gt;&lt;li&gt;deb-пакет для Ubuntu x86_64, с правильными зависимостями&lt;/li&gt;&lt;/ul&gt;
&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.skype.com/intl/en/download/skype/linux/choose/"&gt;Страница для скачивания.&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-722713932032213043?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/722713932032213043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=722713932032213043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/722713932032213043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/722713932032213043'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/09/skype-for-linux.html' title='Skype for Linux'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_cWkmyfg16CU/SqC-7d3GENI/AAAAAAAAJA0/gR4TLK7Y23Q/s72-c/download_linux.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2178827336769256539</id><published>2009-07-06T11:17:00.001+03:00</published><updated>2009-12-13T15:38:19.526+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SUN'/><title type='text'></title><content type='html'>&lt;a href="http://cnews.ru/"&gt;&lt;img src="http://pics.rbc.ru/img/cnews/2007/06/09/CNews_for_blog.gif" alt="http://cnews.ru/" style="margin-bottom:10px;border:none;" /&gt;&lt;/a&gt;
&lt;h2 style="margin:0 0 7px;padding:0;font:bold 18px Tahoma, Verdana;"&gt;Чиновники не дают Oracle купить Sun&lt;/h2&gt;&lt;p style="margin:0 0 7px;padding:0;font:normal 11px Tahoma, Verdana;"&gt;Поздно вечером 26 июня Министерство юстиции США выпустило короткое заявление, где сообщило о том, что антимонопольное расследование в отношении слияния Oracle и Sun будет продолжено, сообщает The Wall Street Journal.  Впрочем, в Oracle не сомневаются, что это лишь небольшая задержка, и в конце концов регулятор примет положительное решение.

 «У нас состоялся очень хороший диалог с Министерством юстиции, и мы почти что сумели уладить все до истечения срока перед подачей повторного прошения, - отм… &lt;a href="http://cnews.ru/news/top/index.shtml?2009/06/29/352181" style="color:#1e4a6d;text-decoration:underline;"&gt;полный текст&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-bottom:7px;font:normal 11px Tahoma, Verdana;"&gt;Источник: &lt;a href="http://cnews.ru/" style="color:#1e4a6d;text-decoration:underline;"&gt;CNews&lt;/a&gt;&lt;/p&gt;
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2178827336769256539?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2178827336769256539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2178827336769256539' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2178827336769256539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2178827336769256539'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/07/oracle-sun-26-oracle-sun-wall-street.html' title=''/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-1071152240816738000</id><published>2009-06-07T11:54:00.004+03:00</published><updated>2009-06-14T23:10:26.216+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='brainbench'/><title type='text'>New certificate - XSL</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.brainbench.com/images/certlogo/color/cert/xsl.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 170px; height: 50px;" src="http://www.brainbench.com/images/certlogo/color/cert/xsl.gif" alt="" border="0" /&gt;&lt;/a&gt;
Scored higher than 92% of all previous test takers.

Demonstrates a clear understanding of many advanced concepts within this topic. Appears capable of mentoring others on most projects in this area.
&lt;span style="font-weight: bold;"&gt;Strengths&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;   XSL Formatting   &lt;/li&gt;&lt;li&gt;   XSL Transformation   &lt;/li&gt;&lt;li&gt;   General Knowledge   &lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Weak Areas&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;      None Noted&lt;/li&gt;&lt;/ul&gt;But the master level is the next target for me.
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.brainbench.com/images/certlogo/color/mastercert/xsl.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 170px; height: 50px;" src="http://www.brainbench.com/images/certlogo/color/mastercert/xsl.gif" alt="" border="0" /&gt;&lt;/a&gt;
Done!
&lt;span name="modify_info"&gt;&lt;span name="bottom_table"&gt;&lt;span&gt;&lt;span name="modify_testsonrecord"&gt;&lt;span name="completed_tests_section"&gt;4.30
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span name="modify_info"&gt;&lt;span name="bottom_table"&gt;&lt;span&gt;&lt;span name="modify_testsonrecord"&gt;&lt;span name="completed_tests_section"&gt;Scored higher than &lt;span name="completed_test_percentile"&gt;99&lt;/span&gt;% of all previous test takers.

&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-1071152240816738000?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/1071152240816738000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=1071152240816738000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1071152240816738000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1071152240816738000'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/06/new-certificate-xsl.html' title='New certificate - XSL'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-6987307675879548882</id><published>2009-05-28T22:39:00.001+03:00</published><updated>2009-05-28T22:43:25.162+03:00</updated><title type='text'>If Programming Languages ran the Airlines</title><content type='html'>We all know the hilarious page titled "If Operating Systems ran the airlines". If you don't know it, you can find it &lt;a href="http://www.zyra.org.uk/os-air.htm"&gt;here&lt;/a&gt;.

I thought it was time for another version, with Programming Languages instead of Operating Systems. Enjoy! 
&lt;span class=fullpost&gt;
&lt;span style="font-weight:bold;"&gt;PL/1 Mainframe Air:&lt;/span&gt;
You arrive at the airport. It's not really an airport, but actually an old wooden building next to the river. You ask why there isn't a real airport. A very old man answers you that they have been building with wood ever since the beginning of construction, so it must be good. You ask where you can check in and when your plane leaves, but you are answered that they really don't have any planes, because they think planes are too modern. Instead, you must place your luggage and yourself into a rowing boat in the river. This is because people have been using rowing boats for centuries, so rowing boats have proven that they work very good. You argue that a rowing boat can't possibly take you to your destination 2000 miles away, but the old man insists that you try. After all, the rowing boat has never let HIM down. The fact that he only ever went as far as 2 miles up the river can't convince him. In the end, with no choice left, you decide to give it a try. At first, all goes quite well. The old man can steer the rowing boat very fast down the river, but when you finally arrive at sea, the old man has a heart-attack and dies. You are now in the middle of the ocean, with nothing but a pair of paddles. Good luck.

&lt;span style="font-weight:bold;"&gt;C++ Air:&lt;/span&gt;
When you enter the airport, there are 5 entrances. You walk towards one, but then someone warns you that, if you choose one, you can never switch back and everything, including the destination of your journey, will depend on it. After thourough consideration, you find the entrance that is best for you. You go to a checkin terminal to check in, and you receive a ticket with everything from you name and address to the name of your dog (which you left home) and the contents of your wardrobe. You ask why there is so much information that isn't necessary for the flight and you are answered that this is good, because then, you are in complete control of what you are doing. When you sit down at a table at a restaurant, the waiter won't bring you anything, because you have the wrong flight-ticket. If you ask what this has to do with getting food, you are told that you should have thought of this before you chose a ticket. A bit confused, you enter the airplane. You are given a meal with a couple of slices of bread and a samurai-sword to cut them. Around you, you see everyone try to slice the bread, while accidentally cutting of their own limbs and fingers. You ask the man next to you why they don't just give you a normal knife to slice your bread and you tell him that swords are very dangerous, but the man says that only a samurai sword is sharp enough to slice bread and that you are stupid and a noob if you can't do it. At least, the airplane is very very fast and you get to your destination in a very short time, but when you approach the destination airport, the pilot receives a message that the landing airstrip has changed. Because the airplane is unable to change the destination landing strip after take-off, the pilot returns to the airport where it left from and will have to start the flight all over again.

&lt;span style="font-weight:bold;"&gt;PHP Air:&lt;/span&gt;
When you arrive at the airport, you see a lot of people dragging parts of airplanes around. When you ask why this is, a man says that you need airplanes in order to fly, so that's why they are building them. You ask if there aren't any pre-made planes that have passed security tests, but the man has already dissappeared with a big wing under his arm. Once you board your airplane (the left wing is still not finished, but the stewardess promises that it will be before take-off), you meet a little kid. You ask him if this is his first flight, but it appears that he is actually the pilot of the plane. The kid tells you all about the fact that he has played with toy-airplanes when he was a baby and that he has a real pilot's uniform, so he is more than qualified to fly the plane. When the plane takes off, there is a lot of turbulence, but after a while, it gets better and the plane is on it's way. When you fly above the ocean, the plane is suddenly hit by a thunderstorm. The little kid gets a little frightened, but he tries his best to save the situation. When more and more people start to panic, the little kid begins to cry and gives up. You try to steer the plane yourself, but there is no usermanual anywhere to be found. When the plane heads towards crashing in the ocean, you look outside the window and you see a man screaming in a rowing boat. At least, you will not go down alone...

&lt;span style="font-weight:bold;"&gt;.NET Airlines:&lt;/span&gt;
You arrive at a very modern terminal. There is only one counter where you can check in, but you don't have to wait and you are helped by a very friendly woman. After checking in, you decide to get something to eat. There is only one restaurant, and it's pretty expensive, but the food is very good, so you don't mind. You are guided to your plane by another very friendly stewardess. There is only one corridor through which you can walk, so you don't really need the help, but on the other hand, it's quite comfortable. Your plane is the only plane at the airport, but it's a very nice one, with very nice chairs and a wonderful in-flight dinner. After about 20 minutes in the air, you land at exactly the same airport as where you left from, because it's the only airport where .NET airplanes can land.

&lt;span style="font-weight:bold;"&gt;Java Air:&lt;/span&gt;
You arrive at the airport with all your luggage. It's kinda heavy, so you sigh: "I wish I had someone to carry it for me..." Immediatly, out of all corners of the terminal, people start running towards you, offering you their services. Some ask a little money, but most of them do it for free, because they like hauling with luggage. At first, you are totally overwhelmed by this many people offering you stuff, but after a while, you get to know some of them and they are quite nice. When arriving at your airplane, there is not one, but five, all totally different, but they are all airplanes and they all bring you where you want to go. Some of them are even free. You see some people, especially people with suits and ties, who don't trust all the free airplanes and are anxious to choose from so many options. They all walk into a big blue building. You hear that you can let the people inside the blue building do everything for you and make the choices for you, if you pay them enough, but since you're a little short on cash and also because you never actually see anyone come OUT of the blue building again, you decide to fly with one of the free airplanes. After a pleasant flight, you arrive at your destination. You try to convince your friends to travel with Java Air too, but all they can say is: "Was it FREE??? Then it cannot be good..."

&lt;span style="font-weight:bold;"&gt;Ruby Air (courtesy of Ryan Daum):&lt;/span&gt;
You arrive at the airport, which is actually a nightclub. There is a band playing at the check-in desk. They are playing music which sounds like New Wave from the early 80s, but the band is made up of people born after 1975. You swear that the woman at the ticket counter looks like Adele Goldberg, but she just looks at you funnily, and won't let you past until you exchange your Dell laptop for a MacBook Pro. You are told the only place the plane will land is Portland. The interior of the plane is retro-chic, and the pilot has piercings and spikey hair. After take-off, the landing gear of the plane won't retract, and is missing oxygen masks, but the pilot says that's O.K., because when he build the plane he used unit tests. Halfway through the flight, the plane runs out of fuel, and you are all forced to transfer onto a new plane after a brief landing on a pacific island. You see Jack Sheppard on the island.

&lt;span style="font-weight:bold;"&gt;JavaFX Air (courtesy of Sven Hafner):&lt;/span&gt;
This one is an offspring of a very traditional airline which is around for some ten years, with a good safety record, but aircrafts available in grey color and flying to all business destinations. The new sibling starting up is very colorful and supposed to fly to hip and colorful holiday destinations using whatever aircraft you like, including hot air balloons, surfboards and submarines, though it doesn't offer flights on freely available aircrafts (not yet). You buy a ticket with fancy 3D holograms printed on it and the flight attendants are not walking along the aisle but sliding in from the side. Before you board you can easily choose the color scheme of the plane, but then you need to paint it by yourself because there is no one doing that for your with fancy tools. It is fun flying with them. They are competing with the other budget airlines, Silverlight Air and Flex Air.

&lt;span style="font-weight:bold;"&gt;Erlang Air (courtesy of Zubin Wadia):&lt;/span&gt;
You arrive at a fairly rudimentary airport on your way to Tokyo. Only Herring is available in the food court, along with bottled water. No explanation is given in regards to the dearth of options. Stranger still, all the staff appear to have very restricted linguistic skills coupled with awkward inflections in their speech. Regardless, you figure out how to check in and get on the plane. Predictably, more Herring is served. Unfortunately, the plane hits an air pocket, resulting in a massive drop in altitude, in turn leading to the engines burning out. Strangely, all the staff are calm, they move to the exit doors and open them mid-flight... Absolute chaos reigns momentarily as we get sucked out of the aircraft and into thin air. Just as suddenly, we’re back in an aircraft, it appears to be the same one, we all have the same seats and we’re still heading to Tokyo.



&lt;span style="font-style:italic;"&gt;Author: Gert-Jan Schouten &lt;/span&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-6987307675879548882?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/6987307675879548882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=6987307675879548882' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6987307675879548882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6987307675879548882'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/05/if-programming-languages-ran-airlines.html' title='If Programming Languages ran the Airlines'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-3041535519978135087</id><published>2009-04-25T13:51:00.002+03:00</published><updated>2009-12-13T15:38:03.400+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scala 2.7.4 final</title><content type='html'>It's ready! The new stable release of the Scala distribution, &lt;a linkindex="92" href="http://www.scala-lang.org/downloads"&gt;Scala 2.7.4 final&lt;/a&gt;, is now available from our &lt;a linkindex="93" href="http://www.scala-lang.org/downloads"&gt;Download Page&lt;/a&gt;.

This version will be the last release of the 2.7.x branch, and will also be the last one to support the old version 1.4 of the Java Virtual Machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-3041535519978135087?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/3041535519978135087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=3041535519978135087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3041535519978135087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3041535519978135087'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/04/scala-274-final.html' title='Scala 2.7.4 final'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-8562308773144576954</id><published>2009-04-24T08:25:00.000+03:00</published><updated>2009-04-24T08:28:24.715+03:00</updated><title type='text'>Microsoft предоставит российским специалистам широкие возможности по анализу программного кода</title><content type='html'>Microsoft планирует обеспечить в России более широкие возможности по анализу кода основных продуктов компании. Об этом заявил президент «Microsoft Россия» Николай Прянишников.

По его словам, у Microsoft существует соглашение о том, что компания открывает доступ к своим продуктам соответствующим органам в России. Кстати, Россия была первой страной, в которой Microsoft заключил такое соглашение в 2002 году.
&lt;span class=fullpost&gt;«Мы намерены пойти в этом направлении еще дальше. Microsoft планирует создать в России своего рода «чистую комнату», где будут представлены более широкие возможности по анализу кода основных продуктов компании, которые поставляются в Россию. К ним будет иметь доступ строго ограниченный круг лиц, представляющих российские компетентные органы, отвечающие за безопасность использования компьютерного программного обеспечения в стране. Таким образом будет обеспечен, с одной стороны, полный государственный контроль за безопасностью применения ПО Microsoft в России, а с другой – надлежащая защита интеллектуальной собственности, лежащей в основе наших программных продуктов. Я думаю, что Россия в этом смысле может подавать пример и другим странам», – отметил он.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-8562308773144576954?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/8562308773144576954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=8562308773144576954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8562308773144576954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8562308773144576954'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/04/microsoft.html' title='Microsoft предоставит российским специалистам широкие возможности по анализу программного кода'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-3461877485783597796</id><published>2009-04-23T11:00:00.004+03:00</published><updated>2009-12-13T15:38:44.541+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu 9.04 - Coming Soon!</title><content type='html'>&lt;iframe src="http://www.ubuntu.com/files/countdown/904/countdown-9.04-1/countdown.html" width="180" height="150" frameborder="0" scrolling="no" name="ubuntucountdown"&gt;&lt;a href="http://www.ubuntu.com/"&gt;&lt;img src="http://www.ubuntu.com/files/countdown/904/countdown-9.04-1/00.png" alt="Ubuntu 9.04 - on desktops, netbooks, servers and in the cloud" width="180" height="150" border="0" /&gt;&lt;/a&gt;&lt;/iframe&gt;
&lt;blockquote&gt;Ubuntu 9.04 Desktop Edition delivers a range of feature enhancements to improve the user experience. Shorter boot speeds, some as short as 25 seconds, ensure faster access to a full computing environment on most desktop, laptop and netbook models. Enhanced suspend-and-resume features also give users more time between charges along with immediate access after hibernation. Intelligent switching between Wi-Fi and 3G environments has been broadened to support more wireless devices and 3G cards, resulting in a smoother experience for most users.
&lt;/blockquote&gt;
&lt;a href="http://releases.ubuntu.com/releases/9.04/"&gt;Download&lt;/a&gt;&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-3461877485783597796?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/3461877485783597796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=3461877485783597796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3461877485783597796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3461877485783597796'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/04/ubuntu-904-coming-soon.html' title='Ubuntu 9.04 - Coming Soon!'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-4532567509648987616</id><published>2009-04-20T22:06:00.001+03:00</published><updated>2009-04-20T22:08:29.927+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SUN'/><title type='text'>Sun and Oracle</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.sun.com/featured-articles/2009-0403/feature/images/zot_sun_s_oracle_b.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 195px; height: 98px;" src="http://www.sun.com/featured-articles/2009-0403/feature/images/zot_sun_s_oracle_b.gif" border="0" alt="" /&gt;&lt;/a&gt;
&lt;blockquote&gt;SANTA CLARA, Calif., April 20, 2009 -- Sun Microsystems (NASDAQ: JAVA) and Oracle Corporation (NASDAQ: ORCL) announced today they have entered into a definitive agreement under which Oracle will acquire Sun common stock for $9.50 per share in cash. The transaction is valued at approximately $7.4 billion, or $5.6 billion net of Sun's cash and debt. &lt;/blockquote&gt;
&lt;a href="http://www.sun.com/third-party/global/oracle/index.jsp"&gt;link&lt;/a&gt;
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-4532567509648987616?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/4532567509648987616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=4532567509648987616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4532567509648987616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4532567509648987616'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/04/sun-and-oracle.html' title='Sun and Oracle'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-6398961851473798922</id><published>2009-04-16T14:42:00.001+03:00</published><updated>2009-12-13T15:39:01.556+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><title type='text'>Выпущена первая бета PostgreSQL 8.4</title><content type='html'>&lt;blockquote&gt;Первая бета версии 8.4 наиболее развитой системы управления базами данных с открытыми исходными кодами PostgreSQL только что выпущена Всемирной командой разработчиков PostgreSQL (PostgreSQL Global Development Group). После 14-ти месяцев разработки версия 8.4 представлена для тестирования широкому кругу пользователей во всём мире для того, чтобы сделать релиз этой версии наиболее качественным за всю историю развития проекта.&lt;/blockquote&gt;
&lt;a href="http://postgresqlrussia.org/news/view/149"&gt;подробности...&lt;/a&gt;
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-6398961851473798922?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/6398961851473798922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=6398961851473798922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6398961851473798922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6398961851473798922'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/04/postgresql-84.html' title='Выпущена первая бета PostgreSQL 8.4'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-1066984790917537153</id><published>2009-04-04T11:58:00.002+03:00</published><updated>2009-04-20T22:06:28.361+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SUN'/><title type='text'>I.B.M. Reportedly Will Buy Rival Sun for $7 Billion</title><content type='html'>&lt;blockquote&gt;I.B.M. appears on the verge of acquiring Sun Microsystems, a longtime rival in the computer server and software markets, for nearly $7 billion. &lt;/blockquote&gt;

&lt;a href="http://www.nytimes.com/2009/04/03/technology/business-computing/03blue.html"&gt;link&lt;/a&gt;
&lt;b&gt;April 5, 2009 &lt;/b&gt;
&lt;blockquote&gt;I.B.M. withdrew its $7 billion bid for Sun Microsystems on Sunday, one day after Sun’s board balked at a reduced offer, according to three people close to the talks.&lt;/blockquote&gt;

&lt;a href="http://www.nytimes.com/2009/04/06/technology/business-computing/06blue.html?_r=2"&gt;link
&lt;/a&gt;
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-1066984790917537153?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/1066984790917537153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=1066984790917537153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1066984790917537153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/1066984790917537153'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/04/ibm-reportedly-will-buy-rival-sun-for-7.html' title='I.B.M. Reportedly Will Buy Rival Sun for $7 Billion'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-4208949190951061573</id><published>2009-03-29T21:15:00.004+03:00</published><updated>2009-12-13T15:40:38.236+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Sony Ericsson will support JavaFX™ Mobile</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cWkmyfg16CU/Sc-7CCM_J9I/AAAAAAAAGdc/nrK2Fn-tojA/s1600-h/javafx_logo_web.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 54px;" src="http://1.bp.blogspot.com/_cWkmyfg16CU/Sc-7CCM_J9I/AAAAAAAAGdc/nrK2Fn-tojA/s200/javafx_logo_web.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5318675328573319122" /&gt;&lt;/a&gt;&lt;a href="http://developer.sonyericsson.com/site/global/newsandevents/latestnews/newsfeb09/p_javafxmobile_sonyericsson_announcement.jsp"&gt;developer.sonyericsson.com&lt;/a&gt;



&lt;blockquote&gt;Sony Ericsson is committed to delivering innovative and energized user experiences to our consumers, working closely with partners who share the creativeness and vision." says Rikko Sakaguchi, Corporate Vice President and Head of Creation and Development at Sony Ericsson.&lt;/blockquote&gt;
&lt;blockquote&gt;We see JavaFX as a natural fit to our mobile software platform strategy to enable developers, both in-house and in our ecosystem, to create superior, innovative, expressive mobile applications and services. Sony Ericsson expects that JavaFX will have a great impact on the mobile content ecosystem and plan to bring JavaFX to a significant part of our product portfolio.&lt;/blockquote&gt;
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-4208949190951061573?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/4208949190951061573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=4208949190951061573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4208949190951061573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4208949190951061573'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/03/sony-ericsson-will-support-javafx.html' title='Sony Ericsson will support JavaFX™ Mobile'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_cWkmyfg16CU/Sc-7CCM_J9I/AAAAAAAAGdc/nrK2Fn-tojA/s72-c/javafx_logo_web.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-8960115584917265800</id><published>2009-03-29T20:50:00.003+03:00</published><updated>2009-12-13T15:42:11.720+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SUN'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>The rise of the Blue Sun: IBM and Sun</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cWkmyfg16CU/Sc-1jhJ6bwI/AAAAAAAAGdU/bz4P3FDt1h4/s1600-h/images.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 150px;" src="http://2.bp.blogspot.com/_cWkmyfg16CU/Sc-1jhJ6bwI/AAAAAAAAGdU/bz4P3FDt1h4/s200/images.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5318669306747842306" /&gt;&lt;/a&gt;The news broke this morning, March 18th, that IBM is talking to Sun about buying the company. Sources from both companies tell me that such a deal is in the works and it may be completed as early as this week. 
&lt;a href="http://blogs.computerworld.com/the_rise_of_the_blue_sun_ibm_and_sun"&gt;Full story...&lt;/a&gt;
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-8960115584917265800?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/8960115584917265800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=8960115584917265800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8960115584917265800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8960115584917265800'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/03/rise-of-blue-sun-ibm-and-sun.html' title='The rise of the Blue Sun: IBM and Sun'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_cWkmyfg16CU/Sc-1jhJ6bwI/AAAAAAAAGdU/bz4P3FDt1h4/s72-c/images.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-7453515037294077674</id><published>2009-03-28T11:07:00.003+02:00</published><updated>2009-12-13T15:43:05.089+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Toward NetBeans application platform!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.netbeans.org/images/v5/nb-logo2.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 159px; height: 60px;" src="http://www.netbeans.org/images/v5/nb-logo2.gif" border="0" alt="" /&gt;&lt;/a&gt;
Всем известно, что в мире Desktop Java есть уже 2 платформы для построения тяжелых пользовательских приложений с богатым графическим интерфейсом. Прежде всего это &lt;a href="http://www.eclipse.org/platform/"&gt;eclipse platform&lt;/a&gt; и, набирающий последнее время популярность, &lt;a href="http://www.netbeans.org/features/platform/index.html"&gt;NetBeans Rich-Client Platform&lt;/a&gt;. Недавно я наткнулся на несколько примеров миграции приложений на платформу NetBeans.

&lt;span class=fullpost&gt; Прежде всего это &lt;a href="http://www.squirrelsql.org/index.php?page=screenshots"&gt;SQuirreL SQL Client&lt;/a&gt; - очень удобный универсальный  SQL клиент ко всем популярным серверам баз данных. Он особенно полезен, когда необходимо работать одновременно с несколькими базами. Последние 2 версии (начиная с 3.0.0) этот замечательный клиент получил новый GUI. Теперь он может похвастаться очень удобными и функциональными "табами", которые позаимствованы у NetBeans. Похоже оттуда же взят механизм обновления модулей. Это тоже очень удобная функция. Процесс обновления (проверенно на версии 3.0.1) стал быстрым и приятным. Для фанатов чистого MDI доступен старый вариант интерфейса. 

Другой пример - &lt;a href="http://jasperforge.org/plugins/project/project_home.php?group_id=83"&gt;iReport&lt;/a&gt;. Это официальный дизайнер и редактор для популярной системы генерации отчетов &lt;a href="http://jasperforge.org/plugins/project/project_home.php?group_id=102"&gt;JasperReports&lt;/a&gt;. Начиная с версии 3.1.2 программа полностью переписана на платформу NetBeans. Это глобальное изменение не прошло даром. С одной стороны мы имеем современный и функциональный интерфейс снаружи и модульную архитектуру внутри. Возможность интеграции редактора отчетов непосредственно в NetBeans IDE. С другой стороны очень сырой и нестабильный продукт (3.1.2 - 3.1.3). Редактор отчетов полностью изменен по виду и идеологии. В результате не стоит ожидать хорошо отточенного инструмента. Пока все очень не доделано и не додумано. Но использовать уже вполне можно. Много ошибок было исправлено в 3.1.4 версии. Собственно эта версия уже пригодна к применению в реальных проектах. Ваш покорный слуга уже успел создать в нем более 10 отчетов различной сложности, и все они успешно пошли в "продакшн". Буквально недавно (2009-03-25) вышла версия &lt;a href="http://jasperforge.org/website/ireportwebsite/IR%20Website/nb-3.5.0.html?group_id=243&amp;header=project&amp;leftnav=yes&amp;target=ireport"&gt;3.5.0&lt;/a&gt;. Я ее еще не пробовал, но надеюсь, что там все будет работать еще лучше и стабильней.
Особо хочется предупредить пользователей NetBeans IDE. Идея интеграции редактора отчетов в среду разработки очень заманчива, но я не советую прямо сейчас этого делать. Все мои попытки закончились плачевно. Установка модуля редактора отчетов, может привести к краху всего IDE или отдельных модулей. В последних версиях перестает работать Web Services Client. Поэтому пока безопаснее использовать iReport и NetBeans IDE отдельно. 

Постепенно я прихожу к заключению, что настало время внимательно взглянуть на платформу NetBeans и, возможно, начать ее использовать для клиентских приложений. Эта тема особенно актуальна в свете очень непонятного положения более легкого &lt;a href="https://appframework.dev.java.net/"&gt;Swing Application Framework&lt;/a&gt; (&lt;a href="http://jcp.org/en/jsr/detail?id=296"&gt;JSR 296&lt;/a&gt;).
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-7453515037294077674?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/7453515037294077674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=7453515037294077674' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/7453515037294077674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/7453515037294077674'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/03/toward-netbeans-application-platform.html' title='Toward NetBeans application platform!'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-8718346851258537173</id><published>2009-03-23T22:05:00.003+02:00</published><updated>2009-12-13T15:43:16.919+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>PDF printing under SUSE linux</title><content type='html'>Возникла необходимость "печати в файл" для отладки различного рода отчетов и экономии бумаги (кризис как ни как!). Есть много различного рода "псевдо" принтеров, которые это делают под Windows, но на рабочем компьютере стоит SUSE Linux. 
&lt;span class=fullpost&gt;
Интуиция подсказывает, что это должно быть просто, так как печать в линукс построена вокруг формата PostScript. А от него и до PDF недалеко. Но вот на какую конкретно кнопку надо нажать, чтобы все заработало?
По теме была найдена неплохая &lt;a href="http://en.opensuse.org/Printing_to_PDF_HOWTO"&gt;статья&lt;/a&gt;. Но в реальности все оказалось даже проще. Задача решается за несколько простых шагов:
&lt;ol&gt;&lt;li&gt;Скачиваем пакет &lt;a href="http://www.physik.uni-wuerzburg.de/~vrbehr/cups-pdf/"&gt;cups-pdf&lt;/a&gt;, воспользовавшись поисковой системой &lt;a href="http://software.opensuse.org/search"&gt;openSUSE Build Service&lt;/a&gt;&lt;li&gt;Устанавливаем пакет &lt;a href="http://www.physik.uni-wuerzburg.de/~vrbehr/cups-pdf/"&gt;cups-pdf&lt;/a&gt;&lt;li&gt;Запускаем &lt;a href="http://ru.wikipedia.org/wiki/YaST"&gt;yast2&lt;/a&gt; и переходим на вкладку hardware/printers&lt;li&gt;Делаем виртуальный принтер "Virtual PDF Printer (CUPS-PDF)" принтером по умолчанию.&lt;li&gt;Редактируем конфигурацию /etc/cups/cups-pdf.conf, например устанавливаем путь, куда будут складироваться распечатанные pdf файлы, по умолчанию они сохраняются в папку /var/spool/cups-pdf/$USERNAME/
&lt;li&gt;Выполняем тестовую печать&lt;/ol&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-8718346851258537173?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/8718346851258537173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=8718346851258537173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8718346851258537173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8718346851258537173'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/03/pdf-printing-under-suse-linux.html' title='PDF printing under SUSE linux'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-6322612854420204959</id><published>2009-02-15T10:32:00.001+02:00</published><updated>2009-02-15T10:34:04.747+02:00</updated><title type='text'>Happy Valentine's day!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cWkmyfg16CU/SZfTV2nOSII/AAAAAAAAGTo/zQASrpsJP58/s1600-h/sierpinski_valentine.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 334px;" src="http://3.bp.blogspot.com/_cWkmyfg16CU/SZfTV2nOSII/AAAAAAAAGTo/zQASrpsJP58/s400/sierpinski_valentine.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5302939458642790530" /&gt;&lt;/a&gt;
&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-6322612854420204959?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/6322612854420204959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=6322612854420204959' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6322612854420204959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6322612854420204959'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/02/happy-valentines-day.html' title='Happy Valentine&apos;s day!'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_cWkmyfg16CU/SZfTV2nOSII/AAAAAAAAGTo/zQASrpsJP58/s72-c/sierpinski_valentine.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-396799019999114312</id><published>2009-01-15T10:31:00.001+02:00</published><updated>2009-01-15T10:32:50.771+02:00</updated><title type='text'>MS Windows 7 rulezz</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/windows_7.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 740px; height: 269px;" src="http://imgs.xkcd.com/comics/windows_7.png" border="0" alt="" /&gt;&lt;/a&gt;

&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-396799019999114312?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/396799019999114312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=396799019999114312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/396799019999114312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/396799019999114312'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2009/01/ms-windows-7-rulezz.html' title='MS Windows 7 rulezz'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-6453518184316025489</id><published>2008-12-27T17:38:00.002+02:00</published><updated>2009-12-13T15:43:29.457+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cv'/><title type='text'>New CV</title><content type='html'>Получил новый сертификат и обновил свое CV.
&lt;a href="http://docs.google.com/View?docID=dmsrn2h_65c5qj8jwm&amp;revision=_latest"&gt;http://docs.google.com/View?docID=dmsrn2h_65c5qj8jwm&amp;revision=_latest&lt;/a&gt;

&lt;span class=fullpost&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-6453518184316025489?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/6453518184316025489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=6453518184316025489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6453518184316025489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/6453518184316025489'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2008/12/new-cv.html' title='New CV'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-8852360404260962899</id><published>2008-12-17T14:42:00.002+02:00</published><updated>2008-12-17T22:29:51.575+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><title type='text'>Understanding Flow Charts</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/flow_charts.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 740px; height: 534px;" src="http://imgs.xkcd.com/comics/flow_charts.png" alt="" border="0" /&gt;&lt;/a&gt;

&lt;a href="http://xkcd.com/518/"&gt;http://xkcd.com/518/&lt;/a&gt;
&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-8852360404260962899?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/8852360404260962899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=8852360404260962899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8852360404260962899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8852360404260962899'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2008/12/understanding-flow-charts.html' title='Understanding Flow Charts'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-4223005812312286497</id><published>2008-06-25T08:48:00.011+03:00</published><updated>2008-06-30T11:11:52.171+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java Puzzlers</title><content type='html'>После прочтения сего замечательного труда Джошуа Блоха (Joshua Bloch), захотелось сделать некоторые заметки себе на память. Захотелось - сделал!
&lt;span class="fullpost"&gt;
&lt;span style="font-weight: bold;"&gt;Лексические проблемы&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Не употреблять английскую маленькую букву л в качестве имени переменной, так как она практически неотличима от числа один;&lt;li&gt;Избегать восьмеричных констант;&lt;li&gt;Аккуратно работать со вставками юникода;&lt;li&gt;отрицательные шестнадцатеричные константы становятся положительными;&lt;li&gt;Блочные комментарии не могут быть вложенными&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Целочисленная арифметика&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Ненулевой результат операции "остаток от деления" возвращает знак левого операнда;&lt;li&gt;Переполнение при целочисленных операциях происходит незаметно;&lt;li&gt;Знак разницы двух целочисленных значений (int) не всегда определяет их порядок (изза возможного переполнения)&lt;li&gt;Составной оператор может производить преобразование типа с потерей точности;&lt;li&gt;Интегральные типы - несимметричны, так как &lt;b&gt;Integer.MIN_VALUE&lt;/b&gt; и &lt;b&gt;Long.MIN_VALUE&lt;/b&gt; равны собственным отрицаниям;&lt;li&gt;Операции сдвига используют только младшие биты своих правых операндов;&lt;li&gt;При приведении интегральных типов происходит расширение знака, если исходное значение имеет знак&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Арифметика с плавающей точкой&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Никогда не используйте числа с плавающей точкой в вычислениях, которые требуют получение точного результата. В этом случае лучше использовать интегральные типы или BigDecimal &lt;li&gt;Избегайте использовать числа с плавающей точкой в качестве индексов циклов &lt;li&gt;Избегайте использовать унарные операторы типа ++ или -- на переменных, содержищих числа с плавающей точкой. В большинстве случаев они вообще не возымеют эффекта. &lt;li&gt;Избегайте сравнений чисел с плавающей точкой на точное равенство. &lt;li&gt;Предпочтительнее использовать double вместо float&lt;li&gt;&lt;b&gt;NaN&lt;/b&gt; не равно ни одному из чисел с плавающей точкой &lt;b&gt;в том числе и самому себе&lt;/b&gt;  &lt;li&gt;Конвертирование из int -&gt; float, long -&gt; float, long -&gt; double приводит к потере точности &lt;li&gt;Всегда используйте new BigDecimal(String) вместо new BigDecimal(double) &lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Вычисление выражений&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Операторы &amp; и | вычисляют оба операнда, даже если используются с булевыми значениями &lt;li&gt;При проектировании внешнего API библиотеки в виде констант следует оформлять только те значения, которые &lt;b&gt;действительно не будут меняться&lt;/b&gt;. &lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Управление выполнением программы&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Достаточно трудно остановить выполнение цикла с целочисленным индексом (int) на значении Integer.MAX_VALUE &lt;li&gt;Необходимо следить, чтобы выполнение &lt;b&gt;funally&lt;/b&gt;-блока завершалось нормально. Следует избегать возникновения исключительной ситуации внутри &lt;b&gt;funally&lt;/b&gt;-блока. Никогда не использовать return внутри &lt;b&gt;funally&lt;/b&gt;-блока. &lt;li&gt;Не следует использовать исключительные ситуации для управления нормальным выполнением программы. Используйте их только для индикации настоящих исключительных ситуаций.&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Инициализация классов&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Инициализация класса происходит сверху вниз &lt;li&gt;NoClassDefFoundError очень не надежно в использовании. Вообще надо избегать использования исключений типа Error. Если есть необходимость работы с классами на низком уровне, то лучше использовать reflection &lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Создание и удаление экземпляров классов&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Инициализаторы экземпляра выполняются до конструктора. Тут следует избегать рекурсии &lt;li&gt;Избегайте вызовов методов, которые могут быть переопределены, внутри конструктора. Так как в момент их вызова экземпляр объекта еще не инициализирован. Тут лучше использовать ленивую инициализацию.  &lt;li&gt;Не забывайте обнулять (null) ссылки на ненужные объекты внутри долгоживущих объектов. Иначе могут возникать утечки памяти. "unintended object retention" &lt;li&gt;Избегайте использования &lt;b&gt;finalizer&lt;/b&gt;. Это опасно, медленно и непредсказуемо! &lt;li&gt; Избегайте использования интерфейса &lt;b&gt;Cloneable&lt;/b&gt;. Если вы все таки его используете, копируйте все внутренние объекты, чтобы их состояние не было одновременно доступно оригинальному объекту и клону &lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Объекты и их экземпляры&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Статические методы не поддерживают динамическое связывание. Никогда не используете их с экземплярами - только с классами. &lt;li&gt;Никогда не возвращайте null из метода, который должен возвращать массив или коллекцию &lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Повторное использование имен&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Очень легко ошибиться и перегрузить метод вместо его переопределения. Используйте возможности IDE, чтобы избежать ошибки. Еще лучше - использовать аннотацию &lt;b&gt;Override&lt;/b&gt; &lt;li&gt;Определение необходимого перегруженного метода не всегда происходит очевидно. Предпочтительно использовать статические фабрики вместо перегруженных конструкторов. Всегда проверяйте, что происходит вызов именно нужного перегруженного метода на реальных аргументах &lt;li&gt;Старайтесь на затенять и не скрывать переменные. &lt;li&gt;Не используйте в своей программе имена, которые используются в базовых библиотеках JDK/JRE &lt;li&gt;Метод с именем как у его класса выглядит как конструктор, но им не является &lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Стоки&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;В массивах не переопределен метод toString(). Поэтому для массивов символов (char) используйте String.valueOf(), а для массивов других типов - Arrays.toString() &lt;li&gt;&lt;b&gt;String.replaceAll&lt;/b&gt; - принимает регулярное выражение в качестве своего первого аргумента &lt;li&gt;Последовательная конкатенация строк в цикле может привести к плохой производительности &lt;li&gt;Значения типа char неявно конвертируются в int, а не в String &lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;I/O&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;PrintStream.write(int) не сбрасывает поток. (Не происходит неявного вызова flash()) &lt;li&gt;Явно обрабатывайте выходные потоки созданных внешних процессов, иначе они могут подвисать. &lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Нити (Threads)&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Никогда не вызывайте Thread.run() напрямую  &lt;li&gt;Объект сторонней библиотеки может блокировать или оповещать свои экземпляры или классы. Не следует использовать блокировку библиотечных классов или их экземпляров. используйте для блокировки свои объекты &lt;li&gt;Thread.interrupted очищает interrupted статус &lt;li&gt;Для избежания тупиковых блокировок никогда не ожидайте фонового процесса внутри инициализатора класса &lt;li&gt; Вызывайте метод &lt;b&gt;wait()&lt;/b&gt; только внутри цикла &lt;b&gt;while&lt;/b&gt; &lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Reflection&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;При создании экземпляра внутреннего класса требуется дополнительный аргумент. &lt;li&gt; Используйте java.lang.reflect.Constructor.newInstance в случае если конструктор может бросать проверяемые исключения.&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Serialization&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Объявление класса Serializable добавляет псевдоконструктор. &lt;li&gt;Стандартный формат сериализации делает закрытые поля доступными. &lt;li&gt;Чтобы обеспечить инвариантность сущностей необходимо использовать метод readResolve() для Singleton - объектов &lt;li&gt;Если методы readObject() или readResolve() вызывают переопределяемые методы - это может случить причиной поврежденного графа объектов&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Прочие библиотеки&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;Переопределение &lt;b&gt;equals()&lt;/b&gt; без переопределения &lt;b&gt;hashCode()&lt;/b&gt; может привести к неправильной работе программы &lt;li&gt;Некоторые устаревшие методы очень опасны. Избегайте использовать: &lt;ul&gt;&lt;li&gt;Thread.stop()&lt;li&gt;Thread.suspend()&lt;li&gt;Runtime.runFinalizersOnExit()&lt;li&gt;System.runFinalizersOnExit() &lt;/ul&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-4223005812312286497?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/4223005812312286497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=4223005812312286497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4223005812312286497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4223005812312286497'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2008/06/java-puzzlers.html' title='Java Puzzlers'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-3821043948611139834</id><published>2007-11-29T01:08:00.003+02:00</published><updated>2009-09-13T14:27:23.639+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Глупое сравнение производительности Ruby и Java</title><content type='html'>Нечего было делать среди ночи... вот чего учудил в ответ на:
&lt;a href="http://myskitch.com/yaroslavlazor/main.rb-20071127-210826.jpg"&gt;http://myskitch.com/yaroslavlazor/main.rb-20071127-210826.jpg&lt;/a&gt;
&lt;span class=fullpost&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_cWkmyfg16CU/R033Zep8lVI/AAAAAAAAAdE/pkNAUzo7zOU/s1600-h/Screenshot-main.rb+(~-prog-RubyApplication2-lib)+-+GVIM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_cWkmyfg16CU/R033Zep8lVI/AAAAAAAAAdE/pkNAUzo7zOU/s320/Screenshot-main.rb+(~-prog-RubyApplication2-lib)+-+GVIM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5138034766997394770" /&gt;&lt;/a&gt;

Еще отличная ссылка по теме:
&lt;a href="http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&amp;lang=java&amp;lang2=ruby"&gt;http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&amp;lang=java&amp;lang2=ruby&lt;/a&gt;


Не удержался и решил провести еще несколько экспериментов. Прежде всего, правильнее всего будет вычислять время непосредственно в программе, для чего был добавлен соответствующий инструментальный код. Далее, мне стало интересно, как поведет себя в этой ситуации популярная библиотека "&lt;a href="http://commons.apache.org/lang/"&gt;Commons Lang&lt;/a&gt;". 

Вот что получилось в результате:
&lt;span style="font-weight:bold;"&gt;Пример кода 1:&lt;/span&gt;
&lt;pre&gt; 
    public static void main(String[] args) {
        final long t1 = System.currentTimeMillis();
        final int n = Integer.parseInt(args[0]);
        final StringBuilder b = new StringBuilder( n * TEXT.length());
        for (int i=0;i&amp;lt;n;i++) {
            b.append(TEXT);
        }
        System.out.println("Result:"+b.reverse().length());
        System.out.println("Time:"+(System.currentTimeMillis()-t1)/1000.0);
        
    }
&lt;/pre&gt;
&lt;span style="font-weight:bold;"&gt;Результат:&lt;/span&gt;
&lt;pre&gt;
etf@etf-desktop:~/prog/JavaApplication1/dist$ time java -jar -Xmx512M -Xms512M JavaApplication1.jar 10000000
Result:50000000
Time:0.936

real    0m1.184s
user    0m0.844s
sys     0m0.208s
&lt;/pre&gt;
&lt;span style="font-weight:bold;"&gt;Пример кода 2:&lt;/span&gt;
&lt;pre&gt;
    public static void main(String[] args) {
        final long t1 = System.currentTimeMillis();
        System.out.println("Result:"+StringUtils.reverse(StringUtils.repeat(TEXT, Integer.parseInt(args[0]))).length());
        System.out.println("Time:"+(System.currentTimeMillis()-t1)/1000.0);
        
    } 
&lt;/pre&gt;
&lt;span style="font-weight:bold;"&gt;Результат:&lt;/span&gt;
&lt;pre&gt;
etf@etf-desktop:~/prog/JavaApplication1/dist$ time java -jar -Xmx512M -Xms512M JavaApplication1.jar 10000000
Result:50000000
Time:2.233

real    0m2.414s
user    0m1.888s
sys     0m0.400s
&lt;/pre&gt;
&lt;span style="font-weight:bold;"&gt;Пример кода 3 (Ruby):&lt;/span&gt;
&lt;pre&gt;
  t1 = Time.now;
  puts "Result:" + ("test " * ARGV[0].to_i).reverse.length.to_s;  
  puts "Time:" + (Time.now - t1).to_s;
&lt;/pre&gt;
&lt;span style="font-weight:bold;"&gt;Результат:&lt;/span&gt;
&lt;pre&gt;
etf@etf-desktop:~/prog/RubyApplication2/lib$ time ruby main.rb 10000000
Result:50000000
Time:0.734442

real    0m0.760s
user    0m0.560s
sys     0m0.196s
&lt;/pre&gt;

Итак, подведем неутешительные итоги нашего исследования:

&lt;table&gt;&lt;tr&gt;&lt;th&gt;Implementation&lt;/th&gt;&lt;th&gt;Time&lt;/th&gt;&lt;th&gt;Ratio&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ruby&lt;/td&gt;&lt;td&gt;0.734442&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Java (StringBuffer)&lt;/td&gt;&lt;td&gt;0.936&lt;/td&gt;&lt;td&gt;1.27&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Java (StringUtils)&lt;/td&gt;&lt;td&gt;2.233&lt;/td&gt;&lt;td&gt;3.04&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_cWkmyfg16CU/R1LLuUGhuNI/AAAAAAAAAdk/B66AkpXh5TU/s1600-R/Chart1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_cWkmyfg16CU/R1LLuUGhuNI/AAAAAAAAAdk/qYhYKJLUDOk/s400/Chart1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5139394121313663186" /&gt;&lt;/a&gt;

----------------
Now playing: &lt;a href="http://www.foxytunes.com/artist/pink/track/conversations+with+my+13+year+old+self"&gt;Pink - Conversations With My 13 Year Old Self&lt;/a&gt;
via &lt;a href="http://www.foxytunes.com/signatunes/"&gt;FoxyTunes&lt;/a&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-3821043948611139834?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/3821043948611139834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=3821043948611139834' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3821043948611139834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3821043948611139834'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2007/11/ruby-java.html' title='Глупое сравнение производительности Ruby и Java'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_cWkmyfg16CU/R033Zep8lVI/AAAAAAAAAdE/pkNAUzo7zOU/s72-c/Screenshot-main.rb+(~-prog-RubyApplication2-lib)+-+GVIM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-4653228824387995991</id><published>2007-11-17T17:12:00.000+02:00</published><updated>2007-11-29T15:33:43.726+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX: Связываем аттрибуты разных классов.</title><content type='html'>Одной из интересных возможностей JavaFX является связывание атрибутов. Для этого используется ключевое слово inverse.
&lt;span class=fullpost&gt;Если интерпретатор JavaFX встречает ключевое слово inverse  в описании атрибута класса, он автоматически обновляет (вставка, удаление замена) соотвествующий (связанный атрибут). Рассмотрим несколько примеров. Первый взят из официального описания языка (&lt;a href="https://openjfx.dev.java.net/JavaFX_Programming_Language.html"&gt;The JavaFX Script Programming Language&lt;/a&gt;): 
&lt;code&gt;class Person {
           attribute name: String;
           attribute parent: Person inverse Person.children;
           attribute children: Person* inverse Person.parent;
           function getFamilyIncome(): Number;
           function getNumberOfChildren(): Number;
           operation marry(spouse: Person);
        }&lt;/code&gt; 
В данном случае изменение атрибута &lt;b&gt;children&lt;/b&gt; повлечет изменение атрибута &lt;b&gt;parent&lt;/b&gt; соответствующего объекта. Вот как это будет выглядеть:
&lt;code&gt;
var pp:Person = Person {name: "Parent"};
var pc1:Person = Person {name: "Child1"};
var pc2:Person = Person {name: "Child2"};

insert pc1 into pp.children;
pc2.parent = pp;

p("pc1 = {pc1}");
p("pc2 = {pc2}");
p("pp = {pp}");
&lt;/code&gt;
В консоле мы получим следующее:
&lt;code&gt;
pc1 = Person {name: 'Child1' parent: Person {name: 'Parent' parent: null children: [Person ... Person {name: 'Child2' parent: Person ... children: []}]} children: []}
pc2 = Person {name: 'Child2' parent: Person {name: 'Parent' parent: null children: [Person {name: 'Child1' parent: Person ... children: []} Person ...]} children: []}
pp = Person {name: 'Parent' parent: null children: [Person {name: 'Child1' parent: Person ... children: []} Person {name: 'Child2' parent: Person ... children: []}]}
&lt;/code&gt;
Как видно, добавление нового объекта &lt;span style="font-weight:bold;"&gt;pc1&lt;/span&gt; в коллекцию объекта &lt;span style="font-weight:bold;"&gt;pp&lt;/span&gt; автоматически обновляет атрибут &lt;span style="font-weight:bold;"&gt;pc1.parent&lt;/span&gt;. И, соотвественно, когда мы указывает значение атрибута &lt;span style="font-weight:bold;"&gt;parent&lt;/span&gt; у объекта &lt;span style="font-weight:bold;"&gt;pc2&lt;/span&gt; - от он автоматически добавляется в коллекцию &lt;span style="font-weight:bold;"&gt;pp.children&lt;/span&gt;.
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-4653228824387995991?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/4653228824387995991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=4653228824387995991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4653228824387995991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4653228824387995991'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2007/11/javafx.html' title='JavaFX: Связываем аттрибуты разных классов.'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-7371330859113761338</id><published>2007-10-21T20:56:00.001+03:00</published><updated>2009-02-03T01:00:15.492+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Planshet</title><content type='html'>В качестве безвозмездной помощи своему текущему проекту, сделал небольшую презентационную программку. Основная ее задача - отображать различную полезную информацию на "большом" мониторе так, чтобы вся команда могла это видеть. В качестве языка для данной разработки был выбран скрипт JavaFX. Так как сделать хотелось быстро, а особых требований к надежности или ресурсоемкости не было.
&lt;span class="fullpost"&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_cWkmyfg16CU/RxuZFLxBlrI/AAAAAAAAAYo/xujuPYb07jI/s1600-h/IMG_1423_small.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_cWkmyfg16CU/RxuZFLxBlrI/AAAAAAAAAYo/xujuPYb07jI/s400/IMG_1423_small.jpg" alt="" id="BLOGGER_PHOTO_ID_5123857315400881842" border="0" /&gt;&lt;/a&gt;

В проекте присутствуют следующие классы:
&lt;ul&gt;&lt;li&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;ChangeImageSlide &lt;/span&gt;–  слайд, который показывает все картинки из папки&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;ImageSlide &lt;/span&gt;– слайд, который показывает одну фиксированную картинку&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;Planshet &lt;/span&gt;– основная логика программы&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;Release &lt;/span&gt;– показывает заголовок и дату доставки&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;Scenario &lt;/span&gt;– класс, содержит сценарий презентации&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;StatusSlide &lt;/span&gt;– слайд, отображает статус автоматической сборки (CruiseControl), через rss.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="fullpost"&gt;
Скачать исходный код можно на сайте: &lt;a href="http://code.google.com/p/planshet/"&gt;http://code.google.com/p/planshet/&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-7371330859113761338?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/7371330859113761338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=7371330859113761338' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/7371330859113761338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/7371330859113761338'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2007/10/planshet.html' title='Planshet'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_cWkmyfg16CU/RxuZFLxBlrI/AAAAAAAAAYo/xujuPYb07jI/s72-c/IMG_1423_small.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-8901479080056576293</id><published>2007-10-13T00:11:00.000+03:00</published><updated>2007-10-13T00:29:17.287+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Элементы функционального программирования на JavaFX</title><content type='html'>Похоже в JavaFX проявляется много новых (для Java платформы) особенностей. Например элементы функционального программирования. 
&lt;span class=fullpost&gt;JavaFX поддерживает описание «чистых» функций с помощью ключевого слова &lt;b&gt;function&lt;/b&gt;. Такая функция может содержать только последовательность определений переменных и возврат значения. Предполагается, что такая функция только вычисляет некий результат и не имеет никакого побочного действия (в отличие от процедур). &lt;br&gt; Кроме этого на JavaFX легко и красиво реализуются так называемые &lt;a href="http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)"&gt;замыкания&lt;/a&gt;. 
Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. В записи это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции. Вот простой пример такой функции: 
&lt;pre&gt;
function getF(b:Boolean) {
    return function (n:Integer) = if b then n-1 else n+1;
}

var fInc = getF(true);
var fDec = getF(false);

var a = 10;
var b = 10;

p(fInc(a));
p(fDec(b)); 
&lt;/pre&gt;
Результатом работы такого скрипта будет:
&lt;pre&gt;
compile thread: Thread[AWT-EventQueue-0,6,main]
compile 0.031
9
11
&lt;/pre&gt;
  &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-8901479080056576293?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/8901479080056576293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=8901479080056576293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8901479080056576293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/8901479080056576293'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2007/10/javafx.html' title='Элементы функционального программирования на JavaFX'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-5679106795280158286</id><published>2007-09-12T22:32:00.000+03:00</published><updated>2007-10-07T18:15:42.140+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX Basics (Part 2)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Прежде всего, JavaFX поддерживает как процедурную так и декларативную нотацию. Очевидно, что декларативный подход очень удобен при описании графического интерфейса.
Попробую сделать краткий обзор основных возможностей и особенностей языка. Но тем не менее, рекомендую посетить сайты с оригинальной документацией, ссылки на которые я приводил в предыдущей &lt;a href="http://etfdevlab.blogspot.com/2007/08/javafx-introduction-part-1.html"&gt;статье&lt;/a&gt;.
&lt;/div&gt;&lt;span class="fullpost"&gt;
&lt;span style="font-weight: bold;"&gt;Основные типы данных.&lt;/span&gt;
JavaFX поддерживиет всего несколько основных типов данных:
&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;String&lt;/span&gt; - &lt;code&gt;java.lang.String&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Boolean&lt;/span&gt; - &lt;code&gt;java.lang.Boolean&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Number&lt;/span&gt; - &lt;code&gt;java.lang.Number&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Integer&lt;/span&gt; - &lt;code&gt;byte&lt;/code&gt;, &lt;code&gt;short&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;long&lt;/code&gt;, &lt;code&gt;java.math.BigInteger&lt;/code&gt;&lt;div class="datacell"&gt; &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;Для описания массивов можно использовать оператор мощности. Он записывается следующим образом:
&lt;span style="font-weight: bold;"&gt;
?&lt;/span&gt; - значение опционально (иожет быть &lt;span style="font-weight: bold;"&gt;null&lt;/span&gt;)
&lt;span style="font-weight: bold;"&gt;+&lt;/span&gt; - одно или более значений
&lt;span style="font-weight: bold;"&gt;*&lt;/span&gt; - любое количество значений

Несколько примеров описания переменных:

&lt;blockquote&gt;var str:String = "Hi!";
var strs:String* = ["String1","String2","String3"];
&lt;/blockquote&gt;Что касается массивов, то все они одномерные. То есть мы можем записать что то вроде:

&lt;blockquote&gt;var arr = ["Str 1 ","Str 2 ",["Str 31 ","Str 32 ","Str 33 "],"Str 4 "];
&lt;/blockquote&gt;Но если мы попытается просмотреть содержимое переменной &lt;span style="font-weight: bold;"&gt;arr&lt;/span&gt;, то увидим, что это обычный плоский массив, совершенно идентичный следующей записи:

&lt;blockquote&gt;var arr = ["Str 1 ","Str 2 ","Str 31 ","Str 32 ","Str 33 ","Str 4 "];&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Декларативная нотация.&lt;/span&gt;
Другим интересным свойством языка является возможность использования декларативного подхода. Особенно впечатляет использования этого подхода при описании пользовательского интерфейса. Допустим у нас есть некий класс &lt;span style="font-weight: bold;"&gt;Customer&lt;/span&gt;, который содержит строковое свойство &lt;span style="font-weight: bold;"&gt;Name&lt;/span&gt; и числовое свойство &lt;span style="font-weight: bold;"&gt;Identity&lt;/span&gt;, тогда создать новый экземпляр класса мы можем следующим образом:

&lt;blockquote&gt;class Customer {
   attribute Name:String;
   attribute Identity:Integer;
}

var currentCustomer = Customer {Name: "Google" Identity: 1};
&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-5679106795280158286?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/5679106795280158286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=5679106795280158286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5679106795280158286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/5679106795280158286'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2007/09/javafx-basics-part-2.html' title='JavaFX Basics (Part 2)'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2284155250830588048</id><published>2007-09-12T17:11:00.000+03:00</published><updated>2007-09-20T08:47:12.405+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX Magic Numbers</title><content type='html'>Думаю любой программист испытывает дискомфорт, когда встречает в коде различного рода "магические цифры". JavaFX, похоже, содержит ряд "плохо документированных" констант. Я решил немного исследовать эту тему.
&lt;span class=fullpost&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;__DIR__&lt;/b&gt; -- возвращает url каталога, в котором находится текущий исполняемый файл (скрипт). Это может быть url внутри jar, если скрипт находится внутри.&lt;/li&gt;&lt;li&gt;&lt;b&gt;__FILE__&lt;/b&gt; -- возвращает url текущего исполняемого файла.&lt;/li&gt;&lt;li&gt;&lt;b&gt;__LINE__&lt;/b&gt; -- Возвращает номер строчки, которая выполняется в данный момент.&lt;/li&gt;&lt;li&gt;&lt;b&gt;__ARCHIVE__&lt;/b&gt; -- возвращает url архива (jar), из которого выполняется данный файл (если такой вообще есть).&lt;/li&gt;&lt;/ul&gt; Просмотреть конкретные значения этих констант можно с помощью нехитрой программы:
&lt;code&gt;&lt;pre&gt;
import javafx.ui.*;
  
Frame {
    title &amp;nbsp;: 'Magic Constants'
    width &amp;nbsp;: 700
    height&amp;nbsp;: 400
    content: Label {text: &amp;quot;&amp;lt;html&amp;gt;&amp;lt;dl&amp;gt;
                           &amp;lt;dt&amp;gt;__DOCBASE__&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;{__DOCBASE__}&amp;lt;/dd&amp;gt;
                           &amp;lt;dt&amp;gt;__DIR__&amp;lt;/dt&amp;gt;    &amp;lt;dd&amp;gt;{__DIR__}&amp;lt;/dd&amp;gt;
                           &amp;lt;dt&amp;gt;__FILE__&amp;lt;/dt&amp;gt;   &amp;lt;dd&amp;gt;{__FILE__}&amp;lt;/dd&amp;gt;
                           &amp;lt;dt&amp;gt;__LINE__&amp;lt;/dt&amp;gt;   &amp;lt;dd&amp;gt;{__LINE__}&amp;lt;/dd&amp;gt;
                           &amp;lt;dt&amp;gt;__ARCHIVE__&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;{__ARCHIVE__}&amp;lt;/dd&amp;gt;
                           &amp;lt;/dl&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;}
       
    visible: true
}// Frame
&lt;/pre&gt;&lt;/code&gt;Источник информаци : "&lt;a href="http://jfx.wikia.com/wiki/Magic_Constants"&gt;Magic Constants&lt;/a&gt;" From Planet JFX&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2284155250830588048?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2284155250830588048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2284155250830588048' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2284155250830588048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2284155250830588048'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2007/09/javafx-magic-numbers.html' title='JavaFX Magic Numbers'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2612597215685742219</id><published>2007-09-08T15:53:00.000+03:00</published><updated>2007-09-20T08:05:10.888+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Firewall on Ububtu</title><content type='html'>Совсем недавно решил переустановить систему на своем основном компьютере (домашнем). До этого там стояла MS Windows XP. Но работала она очень плохо. Были очень неприятные проблемы. Самой ужасной - перезагрузка системы во время работы. В самые неожиданные моменты. Это очень похоже на проблемы с железом. Программы диагностики особо ничего не выявили. Одним радостным днем системе стало совсем плохо. При попытке войти в систему под любым пользователем она перегружалась. Я решил, что не буду пытаться ее восстанавливать (тем более что файлы были доступны удаленно и всю информацию можно было спасти), а просто переустановлю. Причем в качестве новой системы я выбрал линукс. Он не так сильно напрягает меня, а дома у меня нет особой нужды в программах под альтернативную платформу. Как Java Developer мне вообще не слишком важна целевая платформа. &lt;span class="fullpost"&gt;

Наиболее актуальный для меня дистрибутив в данный момент SUSE. Я считаю его наиболее стабильным и отполированным. Более того, в этом дистрибутиве идет, не побоюсь этого слова, самый совершенный редактор настроек. Ну если не считать, конечно, прямого редактирования конфигурационных файлов. Однако, последнее время я слышу много восторженных криков по поводу Ubuntu. У этого дистрибутива хорошие, крепкие корни, большое число поклонников, но уж очень много PR. Я всегда с большой опаской отношусь, к продуктам, которые особенно активно рекламируют. Тем не менее, я решил попробовать.

Не буду глубоко вдаваться в подробности, кратко выскажу свое мнение. Прежде всего этот дистрибутив абсолютно не тянет на почетное звание лучший desktop. У него огромное количество проблем. Встроенные средства конфигурации не покрывают и 10% системы. А то что покрыто, покрыто очень плохо. Доработка напильником требуется на каждом углу. Я был удивлен, когда мне говорили, что убунта не годится для новичков. Теперь мне стало понятно. Но я не могу не сказать, что общее впечатление от дистрибутива очень положительное. Это не Fedora, которую вообще противно использовать в качестве рабочей станции. (О серверах речи нет). Поэтому я довел начатое до логического конца и привел систему к состоянию, в котором ее реально использовать. 

Я хочу подчеркнуть, что проблем было довольно много, но все они решались легко. Решение было либо очевидными, либо легко находилось в документации, доступной в сети.

Основные проблемы, на сколько я помню, можно выразить следующим списком: 
&lt;ul&gt;&lt;li&gt;Установка необходимого ПО и библиотек для проигрывания музыки и видео.&lt;/li&gt;&lt;li&gt;Установка проприетарных драйверов (видео).&lt;/li&gt;&lt;li&gt;Установка 3D рабочего стола.&lt;/li&gt;&lt;li&gt;Подключение к сети (странная проблема, сеть подключалась через раз).&lt;/li&gt;&lt;li&gt;Шрифты/ кодировки.&lt;/li&gt;&lt;/ul&gt;Как вы видите - проблемы тривиальные, и особых трудностей не вызвали. Хочу сосредоточиться на специфике моего случая. Основной компьютер подключен к внешней и внутренней сетям. Он выполняет функции брандмауэра. Поэтому встал вопрос доступа к Интернету из внутренней сети. Конечно, самый прямой способ это настройка конфигурации iptables. То есть включение masquerading/NAT. Кроме того, мне нужен DHCP сервер для внутренней сети, чтобы я не напрягался со статическими адресам и не менял настройки рабочего ноутбука. Итак имеем две проблемы:&lt;ul&gt;&lt;li&gt;DHCPd&lt;/li&gt;&lt;li&gt;Firewall + NAT&lt;/li&gt;&lt;/ul&gt;По прямому пути я не пошел, ведь у меня в руках &lt;b&gt;самая дружественная&lt;/b&gt; система в мире. Прежде всего многих новичков очень пугает отсутствие возможности зайти под root. Точнее, пугает тот факт, что пароль супер пользователя неизвестен. При этом попытка произвести любое административное действие приводит к запросу пароля. Дело в том, что в Ubuntu используется немного другой подход, основанный на &lt;b&gt;sudo&lt;/b&gt;. В чем его суть? Если не вдаваться в подробности, на все вопросы надо отвечать своим пользовательским паролем. Если есть необходимость запуска некой программы из консоли, но с правами root, надо выполнить следующий финт: &lt;i&gt;sudo &amp;lt;название программы&amp;gt;&lt;/i&gt; Вас опять попросят ввести пароль - ВАШ ПАРОЛЬ! Одним словом все просто и прекрасно. Теперь вернемся к нашим проблемам. Установка dhcpd не вызывает особых проблем. Можно воспользоваться &lt;b&gt;Synaptic&lt;/b&gt; - встроенным менеджером пакетов (не супер, но достаточно удобно и надежно). Либо прямо в консоль ввести &lt;i&gt;sudo apt-get install dhcpd&lt;/i&gt;. Для особого удобства можно установить какую-нибудь программу для конфигурации этого демона.

Самое интересное (для меня) второй пункт. На сколько это удобно можно сделать в Ubuntu. Решений много, я остановился на &lt;a href="http://www.fs-security.com/" id="qdlj" title="Firestarter"&gt;Firestarter&lt;/a&gt;. Это ПРЕДЕЛЬНО ПРОСТОЙ конфигуратор брандмауэра. Все сводится к простейшему визарду. Более того! Ferestarter берется настроить даже DHCP для внутренней сети. Однако в моем случае, возник небольшой конфликт. Так как установленный в системе демон и тот который хотел использовать Firestarter отличались версиями. Я не слишком расстроился, так как эта функция у меня уже и так работала, поэтому я просто пропустил настройку dhcp в Firestarter.

Еще более приятным сюрпризом, для меня была возможность Firestarter показывать активные подключения и на лету модифицировать правила фильтрации.    

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_cWkmyfg16CU/RuKcHiaCd2I/AAAAAAAAALo/uIRz1D9Py4E/s1600-h/Screenshot.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_cWkmyfg16CU/RuKcHiaCd2I/AAAAAAAAALo/uIRz1D9Py4E/s320/Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5107816580700600162" /&gt;&lt;/a&gt; 

Но меня ждал один подвох. Как оказалось, я не могу войти из внутренней сети в корпоративный VPN. Это меня сильно огорчило. Тем более, что разработчики обещают исправить эту проблему только в следующем релизе Firestarter. Однако (как всегда!!!) решение есть. Причем достаточно прямое. Необходимо внести небольшую правку в один из конфигурационных файлов Firestarter. Открываем терминал и выполняем следующую магическую последовательность:

&lt;i&gt;# sudo -i&lt;/i&gt; &amp;lt;
вводим СВОЙ пароль&amp;gt; 
&lt;i&gt;# chmod +w /etc/firestarter/user-pre&lt;/i&gt; 
&lt;i&gt;# gedit /etc/firestarter/user-pre&lt;/i&gt; 

В открывшемся редакторе вводим следующий текст: 

# Forward PPTP VPN client traffic
$IPT -A FORWARD -i $IF -o $INIF -p tcp --dport 1723 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF -o $INIF -p 47 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $INIF -o $IF -p 47 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT  

Затем выполняем: 
&lt;i&gt;# chmod -w /etc/firestarter/user-pre&lt;/i&gt;
&lt;i&gt;# /etc/init.d/firestarter restart&lt;/i&gt; 

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

PS. Вот уже прошел месяц использования дистрибутива Ubuntu. Какие выводы можно сделать. Прежде всего дистрибутив работает. И в нем можно работать. Ошибок в программах довольно много, но проблемы решаемые и особо не раздражают пользователя (меня) у которого нет времени долго и глубоко копать. Из оставшихся проблем - поддержка микрафона и skype. Удалось заставить работать и то и другое, но ... работают они не очень красиво. Добиться желаемого поведения на 100% мне не удалось.
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2612597215685742219?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2612597215685742219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2612597215685742219' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2612597215685742219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2612597215685742219'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2007/09/blog-post.html' title='Firewall on Ububtu'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_cWkmyfg16CU/RuKcHiaCd2I/AAAAAAAAALo/uIRz1D9Py4E/s72-c/Screenshot.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-3651664980620831432</id><published>2007-08-24T13:21:00.000+03:00</published><updated>2007-08-25T12:29:02.354+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX Introduction (Part 1)</title><content type='html'>В одной из презентаций наткнулся на восторженные крики про JavaFX. По началу вообще не обратил особого внимания. Но когда эти крики повторились несколько раз, пришлось задуматься. Решил разобраться, что это за зверь и с чем его едят. Вышел на официальную страницу &lt;a href="http://www.sun.com/software/javafx/script/index.jsp"&gt;JavaFX Overview&lt;/a&gt;.

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_cWkmyfg16CU/Rs_eBSaCd1I/AAAAAAAAALg/poadMd_fEMY/s1600-h/ig_javafx_architecture.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_cWkmyfg16CU/Rs_eBSaCd1I/AAAAAAAAALg/poadMd_fEMY/s400/ig_javafx_architecture.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5102541016536348498" /&gt;&lt;/a&gt;

Честно признаюсь - ничего не понял. Нет, конечно, понял, что это очень круто, глобально и должно совершить очередную революцию. Но больше ничего. Это меня очень огорчило и я решил копать дальше (так быстро сдаваться я не привык)...
&lt;span class=fullpost&gt;
Ну достаточно лирики. Перейдем непосредственно к делу. Постараюсь максимально кратко и ясно рассказать о том, что я выяснил, и сделать некоторые выводы. Сразу оговорюсь, информации (дельной информации!!!) очень мало. Поэтому сразу приведу короткий список полезных ссылок по теме, которые я сумел найти:
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.onjava.com/pub/a/onjava/2007/07/27/introduction-to-javafx-script.html?page=1"&gt;Introduction to JavaFX Script&lt;/a&gt; - достаточно хорошее введение в основы javaFX (немного устарело и не все примеры работают)&lt;/li&gt;&lt;li&gt;&lt;a href="https://openjfx.dev.java.net/"&gt;Project OpenJFX&lt;/a&gt; - официальная страничка проекта openjfx&lt;/li&gt;&lt;li&gt;&lt;a href="http://jfx.wikia.com/wiki/Main_Page"&gt;Planet JFX&lt;/a&gt; - сборник ссылок по теме&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.sun.com/chrisoliver/"&gt;Chris Oliver's Weblog&lt;/a&gt; - блог одного из разработчиков javaFX. Тут можно узнать последние новости, возможности javaFX, которые только были залиты в cvs. Здесь есть информация по F3 - прямому предку javaFX. Очень советую внимательно изучить этот ресурс.&lt;/li&gt;&lt;li&gt;&lt;a href="http://evc-cit.info/jfx/makeapi/api/index.html"&gt;JavaFX API&lt;/a&gt; - справочник по javaFX API (описание многих объектов неполное)&lt;/li&gt;&lt;/ul&gt;

Скажу так, особо глубокой документации я не нашел. Все отрывочно и поверхностно. Это и не удивительно. Платформа находится в стадии альфа версии. Структура классов, сигнатуры методов еще не заморожены и меняются. Естественно, документация не успевает обновляться, многие области вообще не покрыты.

Итак, javaFX - это новый скриптовой язык от SUN. Нужно, конечно, иметь в виду, что он не очень похож на большинство скриптовых языков. То есть, он выполняется интерпретатором, но вот тех возможностей, которые дает нам интерпретатор, там практически и нет. Зато в еще более зачаточном состоянии находится компилятор для javaFX, который, по предварительным оценкам может дать прирост производительности в районе 50 раз. Поэтому фактически javaFX - скриптовой язык, но я бы не думал о нем в таком ракурсе.

Сам собой напрашивается вопрос: зачем нам &lt;span style="font-weight:bold;"&gt;ЕЩЕ&lt;/span&gt; один скриптовой язык? Вопрос хорошо. Он возникает при известии о каждом новом скриптовом языке. Но похоже в данном случае, у SUN на его счет огромные планы. Основное назначение этого языка - динамические графические интерфейсы. Сейчас есть много примеров воссоздания &lt;span style="font-weight:bold;"&gt;сложных динамических&lt;/span&gt; сайтов с помощью javaFX. Лично я особого смысла в этом не вижу, я вообще сторонник строгого интерфейса, но ... иногда бывает надо.

Ну и в завершении этой обзорной части небольшой неутешительный вывод. Надо ли нам начинать новые проекты с использованием javaFX. Я думаю - еще нет. Еще нет нормальной поддержки этой технологии со стороны IDE. Существуют плагины для eclipse и netBeans, но их уровень оставляет желать лучшего. Для меня наиболее удобным инструментом для работы с javaFX оказался, написанный на нем же, &lt;a href="http://download.java.net/general/openjfx/demos/javafxpad.jnlp"&gt;JavaFXPad&lt;/a&gt;.
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-3651664980620831432?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/3651664980620831432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=3651664980620831432' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3651664980620831432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/3651664980620831432'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2007/08/javafx-introduction-part-1.html' title='JavaFX Introduction (Part 1)'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_cWkmyfg16CU/Rs_eBSaCd1I/AAAAAAAAALg/poadMd_fEMY/s72-c/ig_javafx_architecture.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-4189522654622255527</id><published>2007-08-09T12:50:00.000+03:00</published><updated>2007-08-09T12:57:32.103+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='info'/><title type='text'>Сбылась очередная мечта идиота!</title><content type='html'>Давно хотел сделать так, чтобы не главной страниче публиковалась только вступительная часть статьи.
&lt;span class=fullpost&gt; А полный текст открывался по специальной ссылке. Это красиво и удобно. Знаю как это сделать на старом движке. Но сам то использую новый. А главное - надо перелапачивать все посты... Вот в этом новом блоге - сразу сделал эту фичу и доволен как слон :). Для тех кто "еще кипятит" есть чудесная ссылка с описанием:
&lt;a href="http://vonderer.blogspot.com/2007/02/blogger-beta.html"&gt;vonderer@darkstar:~$: Blogger beta и пара советов.&lt;/a&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-4189522654622255527?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/4189522654622255527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=4189522654622255527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4189522654622255527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/4189522654622255527'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2007/08/blog-post_09.html' title='Сбылась очередная мечта идиота!'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252337628624509450.post-2550278623033553183</id><published>2007-08-09T11:16:00.000+03:00</published><updated>2007-08-09T12:45:12.724+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='info'/><title type='text'>Пробный пост...</title><content type='html'>Решил выделить отдельный блог для "умных" статей. Ясное дело, что особо времени на бумагомарательство нет, так что новостей и прочих copy-paste ерунды тут практически не будет.
&lt;span class=fullpost&gt;Думаю делать здесь некоторые заметки по своим исследованиям и экспериментам... Посмотрим, что из этого получится.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252337628624509450-2550278623033553183?l=etfdevlab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://etfdevlab.blogspot.com/feeds/2550278623033553183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4252337628624509450&amp;postID=2550278623033553183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2550278623033553183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252337628624509450/posts/default/2550278623033553183'/><link rel='alternate' type='text/html' href='http://etfdevlab.blogspot.com/2007/08/blog-post.html' title='Пробный пост...'/><author><name>Illya Yalovyy</name><uri>http://www.blogger.com/profile/13312879121282598277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_cWkmyfg16CU/THK8spQi2zI/AAAAAAAAKDs/ZOOzOr8yy2o/S220/illya_dr.jpg'/></author><thr:total>0</thr:total></entry></feed>
