Показаны сообщения с ярлыком IT. Показать все сообщения
Показаны сообщения с ярлыком IT. Показать все сообщения

вторник, 22 мая 2012 г.

FLV и YouTube

Недавно исследовал сабж, выношу результаты в своего рода FAQ:

Где быстро и просто узнать о FLV?
На сайте Xuggler есть 4 коротких обучающих видео по 5 минут. Покрывают все основы, единственный вопрос который там остается без внимания, это кодеки в видеопотоке FLV.

Какие кодеки можно использовать в FLV видеостриме?
Написано в этой статье:
Flash Player versionReleasedFile formatVideo compression formatsAudio compression formats
62002SWFSorenson Spark, Screen videoMP3, ADPCM, Nellymoser
72003SWF, FLVSorenson Spark, Screen videoMP3, ADPCM, Nellymoser
82005SWF, FLVOn2 VP6, Sorenson Spark, Screen video, Screen video 2MP3, ADPCM, Nellymoser
92007SWF, FLVOn2 VP6, Sorenson Spark, Screen video, Screen video 2, H.264MP3, ADPCM, Nellymoser, AAC
SWF, F4V, ISO base media file formatH.264AAC, MP3
102008SWF, FLVOn2 VP6, Sorenson Spark, Screen video, Screen video 2, H.264MP3, ADPCM, Nellymoser, Speex, AAC
SWF, F4V, ISO base media file formatH.264AAC, MP3
Можно ли скачивать видео с YouTube с помощью YouTube Java API?
Нельзя. TOS хоть прямо и не говорит, но намекает что ютубу нет смысла публично заявлять о возможности это делать.

Можно ли скачивать видео с YouTube?
Можно, для этого надо использовать REST апи ютуба (вот они, двойные стандарты!). Это API нещадно меняют время от времени, но суть остается:
1) Первым запросом получаем мета-инфу о видео
2) Вторым запросом (где используем инфу из ответа на первый) запрашиваем файл.

В данный момент это делается с использованием таких методов REST api:
get_video_info, в ответе которого хранится интересующее нас поле url_encoded_fmt_stream_map.
В этом поле содержится несколько ссылок на различные качества видео, а чтобы ссылка была дееспособна, надо отсекать от неё все что идет после "fallback_host" включительно.

Ну и немаловажный момент: первый запрос и второй должны иметь общий http контекст, так как в первом запросе в контексте создается кука, без которой второй запрос получит 403 от сервера.

Вот proof-of-concept код, достаточно корявый но рабочий:


import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLDecoder;


import java.util.*;


import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;


public class D {


    private static final String scheme = "http";
    private static final String host = "www.youtube.com";


    public static void main(String[] args) {
        try {
            String videoId = null;
            String outdir = ".";
            if (args.length == 1) {
                videoId = args[0];
            } else if (args.length == 2) {
                videoId = args[0];
                outdir = args[1];
            }


            int format = 18; // http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs
            String encoding = "UTF-8";
            String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
            File outputDir = new File(outdir);
            play(videoId, format, encoding, userAgent, outputDir);


        } catch (Throwable t) {
            t.printStackTrace();
        }
    }


    static HttpContext localContext = new BasicHttpContext();
    private static void play(String videoId, int format, String encoding, String userAgent, File outputdir) throws Throwable {
        System.out.println("Retrieving " + videoId);
        List qparams = new ArrayList();
        qparams.add(new BasicNameValuePair("video_id", videoId));
        qparams.add(new BasicNameValuePair("fmt", "" + format));
        URI uri = getUri("get_video_info", qparams);


        CookieStore cookieStore = new BasicCookieStore();
        localContext = new BasicHttpContext();
        localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);


        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(uri);
        httpget.setHeader("User-Agent", userAgent);


        System.out.println("Executing " + uri);
        HttpResponse response = httpclient.execute(httpget, localContext);
        HttpEntity entity = response.getEntity();
        if (entity != null && response.getStatusLine().getStatusCode() == 200) {
            InputStream instream = entity.getContent();
            String videoInfo = getStringFromInputStream(encoding, instream);
            if (videoInfo != null && videoInfo.length() > 0) {
                List infoMap = new ArrayList();
                URLEncodedUtils.parse(infoMap, new Scanner(videoInfo), encoding);
                String downloadUrl = null;
                String filename = videoId;
                String urlMap = null;


                for (NameValuePair pair : infoMap) {
                    String key = pair.getName();
                    String val = pair.getValue();
                    System.out.println(key + "=" + val);
                    if (key.equals("title")) {
                        filename = val;
                    } else if (key.equals("url_encoded_fmt_stream_map")) {
                        urlMap = val;
                        String[] urls = urlMap.split("url=");
                        String[] decodedUrls = new String[urls.length];
                        for (int i = 0; i < urls.length; i++) {
                            decodedUrls[i] = URLDecoder.decode(URLDecoder.decode(urls[i], "UTF-8"), "UTF-8").replaceAll(",$", "");
                        }
                        //we use first available quality
                        downloadUrl = decodedUrls[1].replaceAll("&fallback_host.*", "");
                    }
                }
                File outputfile = new File(outputdir, "out.flv");
                if (downloadUrl != null) {
                    downloadWithHttpClient(userAgent, downloadUrl, outputfile);
                }
            }
        }


    }


    private static void downloadWithHttpClient(String userAgent, String downloadUrl, File outputfile) throws Throwable {
        HttpGet httpget2 = new HttpGet(downloadUrl);
        httpget2.setHeader("User-Agent", userAgent);
        System.out.println("Executing " + httpget2.getURI());
        HttpClient httpclient2 = new DefaultHttpClient();
        HttpResponse response2 = httpclient2.execute(httpget2, localContext);
        HttpEntity entity2 = response2.getEntity();
        if (entity2 != null && response2.getStatusLine().getStatusCode() == 200) {
            long length = entity2.getContentLength();
            InputStream instream2 = entity2.getContent();
            System.out.println("Writing " + length + " bytes to " + outputfile);
            if (outputfile.exists()) {
                outputfile.delete();
            }
            FileOutputStream outstream = new FileOutputStream(outputfile);
            try {
                byte[] buffer = new byte[2048];
                int count = -1;
                while ((count = instream2.read(buffer)) != -1) {
                    outstream.write(buffer, 0, count);
                }
                outstream.flush();
            } finally {
                outstream.close();
            }
        }
    }


    private static URI getUri(String path, List qparams) throws URISyntaxException {
        URI uri = URIUtils.createURI(scheme, host, -1, "/" + path, URLEncodedUtils.format(qparams, "UTF-8"), null);
        return uri;
    }


    private static String getStringFromInputStream(String encoding, InputStream instream) throws UnsupportedEncodingException, IOException {
        Writer writer = new StringWriter();


        char[] buffer = new char[1024];
        try {
            Reader reader = new BufferedReader(new InputStreamReader(instream, encoding));
            int n;
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }
        } finally {
            instream.close();
        }
        String result = writer.toString();
        return result;
    }
}




четверг, 17 мая 2012 г.

Паттерны проектирования: Object Pool

В данном выпуске рассмотрим паттерн Object Pool, который является частным случаем фабрики. Данный паттерн позволяет увеличить производительность при необходимости частого использования дорогостоящих в создании объектов.


понедельник, 14 мая 2012 г.

Паттерны проектирования: Lazy Initialization

Рассмотрим паттерн Lazy Initialization. Инициализация - процесс подготовки ресурсов приложения, однако не всегда нужно сразу готовить все ресурсы. Данный паттерн позволяет отложить подготовку ненужных сразу ресурсов на тот момент, когда они понадобятся.

суббота, 12 мая 2012 г.

Паттерны проектирования: Builder

Второй выпуск из серии инфографики по паттернам проектирования.


пятница, 11 мая 2012 г.

Паттерны проектирования: Abstract Factory и Factory Method

Серия инфографики по паттернам проектирования. В основе инфа с википедии о паттернах, от которой отсекается все лишнее.


































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

Определение:
Абстрактная фабрика и её методы предоставляет интерфейс для создания групп взаимосвязанных/взаимозависимых объектов без указания их конкретных классов.

среда, 25 апреля 2012 г.

Сертификация по Spring Framework

Обязательным этапом является прохождение соответствующего для сертификата 4-х дневного курса. Суммарно надо будет оплатить сам курс, экзамен(-ы), транспортные расходы. Иногда курсы могут быть и в Минске. Время и место курсов тут: Курсы SpringSource

Для гарантированной сдачи сертификата требуется подготовка кроме курса.
Экзамен можно проходить несколько раз, а курс требуется пройти только 1 раз. В Беларуси проводить экзамен могут:
IBA (тренинг-центр)
BelSoft (тренинг-центр)
Центр Знаний (http://knowledgeforit.com/index.php?lang=by)
Высший Колледж Связи

В первую очередь сертификация нужна тем, кто планирует поиск серьезной работы за рубежом. В Беларуси данный сертификат не критичен для поиска хорошей работы. Возможно, более подходящим вариантом будет онлайн-тестирование, например:
http://knowledgeblackbelt.com
http://www.brainbench.com

Всего есть три сертификата от SpringSource:
-Certified Spring Professional
-Certified Spring Web Application Developer
-Certified Spring Enterprise Application Specialist

Certified Spring Professional

Показывает наличие всех знаний по Core Spring. В следующей табличке сведены все необходимые пункты для прохождения экзамена.

1 Introduction to Spring


  • The Spring application context
  • XML configuration
  • Working with existing singletons and factories
  • Working with multiple configuration files
  • 8 Integrating Spring with Hibernate


  • Quick introduction to ORM with Hibernate
  • Benefits of using Spring with Hibernate
  • Hibernate configuration in Spring
  • Exception handling
  • 2 Understanding the Bean Life Cycle


  • XML namespaces
  • Initialization, use, and destruction phases
  • Working with Spring interceptors
  • Externalizing constant values into properties files
  • Bean scopes
  • 9 Database Transactions with Spring


  • Declaring a Spring Transaction Manager
  • @Transactional annotation
  • Configuring isolation levels
  • Configuring transaction propagation
  • Transactions and integration testing
  • 3 Simplifying Application Configuration


  • Bean definition inheritance
  • Inner beans
  • p and util namespaces
  • Dependency injection of collections
  • Spring Expression Language (SpEL)
  • 10 Spring in a Web Application


  • Configuring Spring in a Web application (using Spring MVC, Struts, JSF)
  • Introduction to Spring MVC
  • Defining Spring MVC controllers using annotations
  • Spring MVC in the view layer
  • MVC namespace (new in Spring 3.0)
  • 4 Annotation-Based Dependency Injection


  • Autowiring and component scanning
  • Stereotype annotations
  • Java-based configuration
  • Mixing configuration styles
  • When to use XML, annotations, and Java configuration
  • 11 Spring Security


  • What problems does Spring Security solve?
  • Configuring authentication
  • Intercepting URLs
  • The Spring Security tag library for JSPs
  • Security at the method level
  • Customizing the Spring Security filter chain
  • 5 Testing a Spring-Based Application


  • Annotations for integration testing with Spring (using JUnit)
  • Advanced concepts: application context caching and the @DirtiesContext annotation
  • 12 Remoting


  • Problems with traditional RMI
  • Using Spring remoting over RMI
  • Using the Spring HttpInvoker for remote access over HTTP
  • 6 Aspect-Oriented Programming


  • What problems does AOP solve?
  • Differences between Spring AOP and AspectJ
  • Defining pointcut expressions
  • How to use the types of advice: around, before, after
  • 13 JMS


  • Introduction to JMS
  • Configuring JMS resources with Spring
  • Sending and receiving messages using the Spring JmsTemplate and message listener containers
  • 7 Data Access and JDBC with Spring


  • How Spring integrates with existing data access technologies
  • DataAccessException hierarchy
  • jdbc namespace
  • Simplifying jdbc access using the Spring JdbcTemplate
  • 14 JMX


  • Introduction to JMX
  • Configuring Spring to export MBeans automatically
  • Exporting a Spring bean as an MBean

  • Другой вариант списка тут.

    Подготовка к экзамену осуществляется по следующему плану:

    1. Внимательное изучение книги "Spring in Action, 3rd edition" - учебник по Spring 3.0. При изучении обязательно самостоятельное исследование изученного на практике. Иначе все прочитанное не усвоится.

    2. Прочтение "Pro Spring 2.5" - продвинутый учебник по Spring 2.5 (по 3.0 нет, но все равно следует прочитать, т.к. дает углубленное понимание концепций).

    3. Практическое изучение. Делается так:
    Открывает документ http://www.springsource.com/files/core-spring-3.0-certification-study-guide_0.pdf
    Читаем, как только появляется вопрос, который вызывает хоть малейшие сомнения, то:
    -Изучаем вопрос по мануалу Spring Framework Reference 3.0.x
    -Практикуемся по вопросу, пока остаются белые пятна в понимании
    Когда данный документ прочитан, можно повторить тоже самое с любым онлайн-тестом либо с вышеуказанной таблицой.

    4. Непосредственно перед экзаменом тестируем свои знания на
    http://knowledgeblackbelt.com
    http://www.brainbench.com

    Certified Spring Web Application Developer

    Подтверждает умение использовать Spring технологии в разработке Web-приложений.

    Включает в себя следующие вопросы:


    Spring Web MVC:
      Spring MVC annotation-based programming model
      Page composition with layout technologies such as Tiles
      Rendering multiple content types
      Handling exceptions
      Processing form pages
      Internationalization and personalization
    
    Spring Web Flow:
      Introduction to Spring Web Flow
      Authoring flow definitions
      View states, events and transitions
      Adding flow behavior
      Working with scoped data
      Using the Web Flow integration with JSF
    
    Spring Security:
      Securing a web application with Spring Security
    
    Integration With Client Technologies:
      Modern Web UI
      Progressive enhancement, accessibility, web design
      Working with HTML, CSS and JavaScript
      Using a JavaScript framework (Dojo) for DOM scripting and UI widgets
      Integrating Flex clients with Spring applications
    
    Rapid Application Development:
      Using Grails and Spring Roo
    


    Подготовка к экзамену осуществляется по следующему плану:

    1. Внимательное изучение книги "Spring in Action, 3rd edition" - учебник по Spring 3.0. При изучении обязательно самостоятельное исследование изученного на практике. Иначе все прочитанное не усвоится.

    2. Практическое изучение такое же как и на 4-х дневном курсе:

    Develop web applications using the Spring Framework
    Use Spring Web Flow to implement stateful interactions
    Secure web applications with Spring Security
    Test web applications for correctness and performance
    Create rich web user interfaces with HTML, CSS, and JavaScript
    Connect a Flex client to a Spring back-end with Spring BlazeDS
    Put it all together with rapid productivity tools like Grails and Spring Roo
    Use the SpringSource Tool Suite and Spring Insight

    Т.е. надо разработать веб-приложение c такими фишками:
    -Web Flow для работы с состоянием приложения и перехода между страницами
    -Авторизация и аутентификация с помощью Spring Security
    -Тесты функционала и производительности средствами Spring
    -UI используя Spring MVC (формы, тайлы) и HTML/CSS/JavaScript, добавить 
     на UI Flex объект и связать его с приложением через BlazeDS
    -Связать все вместе с помощью средств автоматизации разработки Grails и Roo
    -При всем этом поюзать тулы SpringSource Tool Suite и Spring Insight
    
    Цель практики это опытное запоминание технологии. При практике важно тщательно контролировать степень понимания той или иной вещи и не допускать неполного понимания.

    4. Непосредственно перед экзаменом тестируем свои знания на
    http://knowledgeblackbelt.com http://www.brainbench.com

    Certified Spring Enterprise Application Specialist

    Сертификат показывает:
    1) Понимание концепций, специфичных для распределённых данных и вычислений, которые являются неизменным атрибутом приложений промышленного масштаба
    2) Понимание как и зачем использовать Spring для обеспечения данных концепций
    3) Понимание архитектуры Spring Integration, умение её применять
    4) Умение использовать Spring Batch для автоматизации и обслуживания приложений.

    Экзамен покрывает следующие области:

    1 Introduction
     •Styles of enterprise integration
     •File transfer, remoting, and Web services
    2 Tasks and Scheduling
     •Introduction to concurrency
     •Java Concurrency APIs
     •Spring task scheduling support namespace
     •@Scheduled and @Async annotations
    3 Remoting
     •Limitations of “plain” RMI
     •Benefits of using Spring remoting
     •Spring remoting over RMI
     •Spring HttpInvoker 
     •Hessian and Burlap support
    4 SOAP Web Services with Spring WS
     •Web services best practices
     •Introduction to Spring Web services
     •Object-XML mapping with the Spring OXM abstraction layer
     •Client access with WebServiceTemplate
     •Error handling
     •Out-of-container testing
    5 RESTful Web Services
     •Core REST concepts
     •REST support in Spring 3.x
     •REST specific annotations in Spring
     •Client access with RestTemplate
    6 Working with JMS
     •Introduction to JMS
     •Configuring JMS resources with Spring
     •Sending and receiving messages using Spring JmsTemplate 
             and message listener containers
    7 Transactional JMS
     •Why use JMS transactions
     •Transactional JMS resources with Spring
     •Duplicate message handling
    8 Global Transaction Management (XA and JTA)
     •Two-phase commit and XA
     •JTA and Spring
     •Configuring JtaTransactionManager
     •Transaction demarcation
    9 Introduction to Spring Integration
     •Goals of Spring Integration
     •Core components of Spring Integration
     •Defining channels, message endpoints, and gateways
     •Spring Integration namespaces
     •Eclipse-based Visual Editor for Spring Integration
    10 Configuring Spring Integration
     •Channel types and polling
     •Synchronous and asynchronous handoff
     •Synchronous and asynchronous error handling
     •Advanced endpoint types: bridge and router
     •Working with MessagingTemplate
    11 Spring Integration Advanced Features
     •Splitting and aggregating messages
     •Dispatcher configuration
     •XML support: XPath, XSLT, Object-XML mapping
    12 Introduction to Spring Batch
     •Spring Batch high-level overview
     •Working with jobs, steps, readers, and writers
     •Job parameters and job identity
     •Batch state persistence in the database
     •Spring Batch quick-start example
    13 Restart and Recovery with Spring Batch
     •Stateful ItemReaders/Writers
     •Reading flat files
     •Introduction to skip, retry, repeat, and restart
     •Spring Batch listeners
    14 Spring Batch Admin and Scaling Batch Jobs
     •The Spring Batch Admin Web console
     •Scaling and parallel processing
     •Multithreaded and parallel steps
     •Partitioning
    


    Подготовка включает в себя изучение теории (Spring Integration in Action или Pro Spring Integration) и практические тренировки. Для идей практических тренировок можно взять элементы курса.

    Вот элементы курса в оригинале:

    •Use Spring to create concurrent applications and schedule tasks
    •Use remoting to implement client-server applications
    •Use Spring Web services to create loosely coupled SOAP-based Web services and clients
    •Use Spring-MVC to create RESTful Web services and clients
    •Use JMS for asynchronous messaging-based communication
    •Understand and use local and distributed transactions
    •Use Spring Integration to create event-driven pipes-and-filters architectures 
     and integrate with external applications
    •Use Spring Batch for managed, scalable batch processing that is based on both 
     custom and built-in processing components
    


    Как видим, эта практика покрывает практически все пункты экзамена, но последние 3 пункта курса (транзакции, архитектура Spring Integration, работа с Spring Batch) более сложны и обширны чем первые 5.

    среда, 4 апреля 2012 г.

    Сертификация Java-разработчика в Беларуси

    Сертификация интересна следующим:

    С точки зрения сертифицируемого:
    1) Увеличивается конкурентоспособность на рынке труда, т.е. повышается планка возможных позиций и зарплат.
    2) В процессе подготовки объективно увеличивается уровень знаний по технологиям

    С точки зрения компании:
    1) Увеличивается конкурентоспособность на рынке услуг, т.к. наличие в штате сертифицированных разработчиков, является козырем в привлечении заказов.
    2) Увеличивается престижность компании, и соответственно, привлекательность как места работы для опытных разработчиков (как в штате, так и потенциальных)

    Необходимо понимать коммерческую сторону сертификации - сертификация это один из источников зарабатывания денег в OpenSource проектах. Поэтому стоимость сертификации иногда бывает весьма высокой. С одной стороны это минус, но с другой и плюс, т.к. тот факт что человек тратит деньги на свою сертификацию, показывает его серьезное отношение к работе.

    В качестве первой альтернативы сертификации можно предложить тестирование. В данный момент в интернете существует ряд сервисов, осуществляющих неплохое тестирование практически по любой тематике. Стоимость таких тестов как правило на порядок меньше (1-20$), есть и бесплатные, похуже качеством. Некоторые из сервисов предоставляют сертификат о прохождении теста, однако в отличие от вышеописанных сертификатов, эти сертификаты не гарантируют что вы сдавали тест честно. Так что судите сами, стоят ли эти сертификаты своих денег. Однако в случае если разработчик технологии не занимается профессиональным сертифицированием, то тесты являются единственным вариантом.

    В качестве второй альтернативы сертификации можно назвать портфолио. Однако этот вид профессиональной гарантии обычно встречается только у фрилансеров и компаний, т.к. в портфолио вносятся завершенные, цельные объекты, и отдельному разработчику можно вносить в свое портфолио только проекты полностью разработанные им; как правило это некоммерческие, open-source проекты-модули. Также в личное портфолио можно вносить другие заслуги на профессиональной ниве, главное чтобы они были четко ограниченны рамками личности. К примеру, известно что в google ценится наличие высокого рейтинга в любом из QA коммьюнити, например в stackoverflow.com.

    Рассмотрим основные сертификаты, интересные для Java-разработчиков.

    Это сертификаты:

    Oracle

    Группа сертификатов от Sun, теперь захваченного Oracle. Де-факто самые значительные сертификаты для Java-разработчика. Содержат несколько уровней:

    Наиболее интересными являются:
    Oracle Certified Professional Java SE Programmer ( OCPJP / SCJP )
    Oracle Certified Master Java SE Developer ( OCMJD / SCJD )
    Oracle Certified Professional Java EE Web Component Developer ( OCPJWCD/SCWCD )
    Oracle Certified Professional Java EE Business Component Developer ( OCPJBCD/SCBCD )
    Oracle Certified Expert Java Platform, EE Web Services Developer ( OCEJWSD/SCDJWS )
    Oracle Certified Master Java EE Enterprise Architect ( OCMJEA / SCEA )

    Периодически появляются сертификаты как по новым темам, так и продвинутые версии (Expert) имеющихся стандартных сертификатов (Developer).

    SpringSource

    По данной теме заведена отдельная статья: Сертификация по Spring Framework


    Рассмотрим более подробно каждый сертификат.

    Все сертификаты можно сдать в


    IBA (education.iba.by, курсы: bsu.iba.by/cgi-bin/courses.pl)
    BelSoft (тренинг-центр)
    Центр Знаний
    Высший Колледж Связи



    В IBA за экзамен берут (сверх стоимости сертификата) 40$, есть скидка на сертификат если пройти их курсы.


    Oracle Certified Professional Java SE Programmer ( OCPJP / SCJP )
    Что за сертификат
    Базовый сертификат для Java-разработчиков это OCPJP (раньше был SCJP) - Oracle Certified Professional Java SE Programmer. Наличие данного сертификата показывает стандартные знания по всем областям Java SE. Стоимость сертификата без скидок 300$ для европы.

    Как готовится и сложность подготовки к сдаче
    Сложность подготовки: 60-90 часов.

    Русскоязычные советы по подготовке:
    habrahabr.ru/tag/SCJP/ - много личных опытов
    http://www.rsdn.ru/article/java/scjp_article.xml - слегка устарело

    Русскоязычные книги:
    по SCJP ничего нормального нет, зато есть просто по Java. Например, "Java. Эффективное программирование" Блоха. Но, что вы делаете в Java без знания английского? :)

    Англоязычные советы (по Java SE 6.0):
    http://blog.sanaulla.info/2010/08/23/preparation-tips-for-scjp-sun-certified-java-programmer-exam/
    http://www.prasannatech.net/2008/12/scjp-sun-certified-java-programmer-tips.html

    Изучаем ошибки тех кто не здал:
    http://eriwen.com/java/how-not-to-pass-the-scjp-exam/
    http://www.coderanch.com/t/423070/java-programmer-SCJP/certification/fail-SCJP

    Основные ошибки - недооценка сложности экзамена и переоценка своих сил. Поэтому надо мучать симулятор до последнего. Кстати, где взять симулятор? Их несколько. Оффлайновый симулятор Whizlabs SCJP, правда он платный (при желании можно найти "бесплатные" книги и симулятор). Онлайн симуляторы: certpal.com, certexams.com, knowledgeblackbelt.com.

    Oracle Certified Prof. Java EE Web Component Developer (SCWCD) Требует наличия SCJP
    Что за сертификат
    Показывает стандартный уровень владения знаниями о разработке веб-приложений. Включает в себя следующие темы: сервлеты, структура, контейнер, сессия, авторизация и аутентификация, JSP, язык выражений EL, JSP директивы и базовые тэги, тэглиб JSTL, кастом тэги, базовые java ee паттерны. Стоимость сертификата без скидок 300$ для европы.

    Как готовится и сложность подготовки к сдаче
    Сложность подготовки: 30-120 часов в зависимости от опыта

    Материалы для подготовки:
    список тем
    простенький тест
    Manning SCWCD Exam Study Kit
    SCWCD exam simulator (Enthuware или Whizlabs)

    Советы:
    важно запоминать названия классов и сигнатуры методов
    очень важно досконально понимать EL-выражения
    важно знать HTML тэги
    основное время подготовки - практика
    желательно составить "шпаргалку" для повторения сигнатур и прочей справочной инфы

    Oracle Certified Prof. Java EE Business Component Dev. (SCBCD) Требует наличия SCJP
    Что за сертификат
    Подтверждает стандартный навык в создании EJB(3) компонент и знание JPA спеки. Показывает что вы умеете проектировать, кодить, тестировать EJB бины, и понимаете процесс их деплоймента, а также понимаете как они интегрируются с другими частями системы. Стоимость сертификата без скидок 300$ для европы.

    Как готовится и сложность подготовки к сдаче

    Список тем для оценки масштаба:

    1) Основы EJB 3.0
    2) Контракт и жизненный цикл сессионного бина
    3) Контракт message-driven бина
    4) JPA сущности
    5) JPA операции
    6) Persistence Unit и Persistence Context
    7) JPA Query Language
    8) Транзакции
    9) Исключения
    10) Контроль прав доступа

    Материалы для подготовки:
    http://www.coderanch.com/how-to/java/ScbcdLinks - список материалов по теме
    http://www.coderanch.com/forums/f-70/java-EJB-SCBCD - вопросы-ответы
    http://habrahabr.ru/post/84405/ - русскоязычная тема
    http://www.slideshare.net/krizsan/ocp-jbcd-6-study-notes - учебник для подготовки
    Для тестирования: Whizlabs exam симулятор


    Как сдавать и стоимость
    Сдавать так же как и предыдущий сертификат. Стоимость самого сертификата: 300$.

    Oracle Cert. Expert Java Plat., EE Web Serv. Dev. (SCDJWS) Требует наличия SCJP
    Что за сертификат
    Показывает понимание SOA архитектуры. Охватывает следующие темы:

    1) XML Web Service Standards
    2) SOAP 1.1 Web Service Standards
    3) Describing and Publishing (WSDL and UDDI)
    4) JAX-RPC
    5) SOAP and XML Processing APIs (JAXP, JAXB, and SAAJ)
    6) JAXR
    7) J2EE Web Services
    8) Security
    9) Developing Web Services, General Design and Architecture, Endpoint Design and Architecture

    Как готовится
    Желательно иметь подготовку по Oracle Certified Prof. Java EE Web Component Developer. Остальное стандартно: книги, спеки, тесты и много практики.
    Форум на джаваранчо



    Oracle Certified Master Java SE Developer ( OCMJD / SCJD ) Требует наличия SCJP
    Что за сертификат
    Сложный и дорогой (575$) экзамен из двух частей - практической и теоретической. Практическая часть - написать приложение по заданию с такими фишками: custom file formats, distributed computing (JRMP), advanced Swing. К приложению должен прилагаться мануал и код должен быть полностью документирован джавадоками. После чего идет теоретическая часть, которая выглядит как SCJP, но покрывает все что SCJP не затронул (Java SE). Также для сдачи сертификата необходимо поучаствовать в одном из тренингов. Ссылка.


    Более подробно рассматривать не буду, т.к. человек способный сдать этот сертификат, сможет и сам найти все детали.

    Oracle Certified Master Java EE Enterprise Architect (SCEA)
    Что за сертификат
    Показывает наличие опыта и серьёзных теоретических знаний по всем областям Java SE + EE. Практически покрывает все сертификаты, требующие наличие SCJP. Кроме этого, показывает глубокое системное понимание принципов дизайна java-приложений, знание общих архитектур, технологий фронтенда и бэкенда, технологий интегрирования частей приложения в системе,   знание паттернов, принципы и способы реализации управления безопасностью, понимание применимости JEE технологий в конкретных случаях.

    Как сдавать
    Не требует наличия других сертификатов для сдачи. Требует прохождения нескольких курсов. Стоимость ~3000$. Состоит из трех шагов:
    Теория
    Практика
    Эссе

    Материалы

    Эффективные условия работы девелопера

    В предыдущей статье я писал о важности тишины и комфорта в работе девелопера. Здесь чуть глубже раскрою тему.

    Тишина - значит постоянная тишина. Обьясните вашим коллегам, которые громко обсуждают свои вопросы каждый час, что они вам мешают. Или сделайте так, чтобы они оказались в другой комнате. Каждый блок лишней информации сбивает нашу концентрацию, и приводит к дефектам в работе. Я не буду приводить здесь результаты исследований работы мозга в условиях шума, можете нагуглить сами.

    Комфорт- значит обеспечение организма кислородом и удобством. Кондиционеры не обеспечивают кислородом - они обеспечивают охлаждение многократно переработанного воздуха комнаты. Кислород же обеспечивается вентиляцией, а не кондиционером. В правильно спланированном офисе систему вентиляции ставят *вместе* с кондиционером. Мозг работает на кислороде. Без кислорода вы становитесь сонными и не можете концентрироваться на задаче. Кстати, всякие фишки типа кислородной мембраны в кондиционерах это не более чем маркетинговый ход, рассчитанный на ящериц и домохозяек.

    Кроме кислорода, важно удобство. Я определяю удобство как отсутсвие преград в интерфейсе человек-компьютер. А именно:

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

    * Эффективный компьютер (а именно - мощный процессор, избыток памяти, быстрый HDD). Удивительно как часто работника садят за допотопное корыто и потом удивляются почему билд собирается 3 часа. Также важна оптимизация рабочего ПО. Например, перенос кэша IDE на ramdisc и проекта на скоростной raid-массив из двух HDD (кстати удивительный момент - часто встречал крутейшую видеокарту, но оочень медленный HDD, хотя надо как раз наоборот).

    * Привычная раскладка клавиатуры и удобная мышь. Приносите своё, если надо.

    * Большой, правильный монитор - без дефектов изображения. Уставшие глаза - потеря концентрации - ошибки в коде.

    * Правильное освещение. В идеале - отсутствие люминесцентных мерцающих ламп и лампы накаливания + естественный свет. Особенно это важно для людей с высокой скоростью зрения (те, кто видит больше "кадров" в секунду, чем обычные люди). Не в идеале - яркость монитора должна быть равна яркости освещенности стены за монитором.

    * Отсутствие усталости. В самом деле, о каком эффективном взаимодействии man-machine может идти речь, если "голова не варит"? По российскому КЗоТу девелоперы могут отдыхать 15 минут в час. По белорускому тоже имеют право, но по "внутреннему распорядку" (вот такая у нас деревня). В целом все просто - если устали, надо выйти, походить, подышать, разогнать кровь, выгнать молочную кислоту и продукты распада из клеток. Если в компании есть место для зарядки - сделать.

    * Ну и конечно, в здоровом теле - здоровый дух. С геморроем или гиподинамией много не наработаешь. Поэтому важно заниматься хотя бы минимальной физической активностью типа бега/фитнесса и не забывать о закалке и правильном питании.

    Как формируется цена труда разработчика

    У каждого java-разработчика, есть определенная цена его работы, т.е. средняя прибыль, получаемая заказчиком от часа работы разработчика. Прибыль заказчика определяет сколько он готов платить разработчику (если заказчик честный). В целом прибыль заказчика от данного разработчика определяется рядом фактором:

    Факторы, которые зависят от заказчика:

    -Эффективность бизнеса заказчика.
    Что это значит? Даже если вы мега-девелопер, но работаете на заказчика с неэффективным бизнесом, он просто не сможет заплатить вам среднерыночную стоимость вашего труда.

    -Эффективность текущей команды заказчика.
    Если на проекте есть хотя бы ещё один человек, то результат вашей работы будет скоррелирован результатами работы этого человека.

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

    -Адекватность заказчика.
    Это способность заказчика адекватно оценивать его задачи, либо принимать такую оценку от разработчика. Кроме того, это способность заказчика отсеивать тех, кто не способен работать в соответствии с его требованиями к личным качествам. Данный фактор не то что бы влияет на оплату, а скорее является фактором, влияющем на предыдущие.

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

    Факторы, которые зависят от вас:

    *** Самое важное: умение выбирать куда вкладывать свое время ***
    Да, какой бы вы не были крутой девелопер, ваша оплата будет ограничена заказчиком - для фрилансеров, а если вы оффшорный девелопер, то и его проксей. В случе когда вы работаете на свой продукт (а лучше являетесь его владельцем), вы являетесь и заказчиком и разработчиком, и это идеальный вариант, т.к. потолок зависит только от вас.

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

    *** Ваша способность понимать код ***
    Что это значит? Даже если вы знаете все технологии, но не понимаете технологию, по которой сделана некая вещь на проекте, вы не сможете правильно с ней работать. Данная ситуация усугубляется в случае когда вы попали на проект, написанный неквалифицированными и/или спешащими разработчиками. В таком случае понять логику работы того или иного участка кода весьма сложно, особенно если нет возможности связаться с теми кто это делал. Или они уже забыли.

    Как можно развить эту способность:
    -Взять за правило не работать с кодом, который не понял на 100%
    -Использовать все источники доступные информации - документацию, знания заказчика, других разработчиков. Заказчик должен знать о качестве своего проекта.
    -Использовать инструменты анализа кода, I/O данных, UI. Развивать свой опыт в этих инструментах.

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

    Как обеспечить:
    Помещение для работы должно быть ТИХИМ и КОМФОРТНЫМ (смотри следующую статью о условиях работы). Если этого нет, меняйте помещение. Также весьма важны ваше здоровье и энергетика организма.

    *** Ваши знания и опыт в технологиях ***
    Есть два типа людей: которые досконально читают доки, и те которые "играют" с технологией, пробуя её на практике, и попутно изучают доки. Оба подхода по своему хороши, в идеале побыть в шкуре обоих типов по очереди.

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

    Известен закон о развитии опыта: чем больше опыт, тем более он специализирован. Именно поэтому гуру на одном проекте неуверенно чувствует себя на другом, где нет его "конька". Чтобы не попасть в такую ловушку, существует ряд тестов, и сопутствующих им сертификатов. Тесты помогают вам выявить ваши "дыры" в опыте, и ища ответ них вы повышаете свой опыт. Сертификаты же имеют пользу в смысле маркетинга цены своего труда (намного проще показать сертификат OCPJP, чем отвечать на 100 занудных вопросов на собеседовании). Для фрилансеров ещё важно и портфолио, но это отдельный разговор.

    Почему GWT не лучший выбор для UI

    Проработав на двух проектах, использующих GWT для UI, сформировал о нем не самое хорошее мнение:
    1. GWT нужен тем, кто не хочет учить javascript.
    2. Пока собирается maven билд с GWT модулями, можно успеть сходить на обед. Оптимизация среды слегка помогает.
    3. Если хочешь добиться правильного поведения UI, то почти всегда надо писать свой компонент. И даже изредка с native javascript кодом.
    4. Отладка GWT проста... до определённого уровня. После этого уровня она резко становится намного сложнее чем отладка просто javascript.

    Но сегодня я понял, что не одинок в этом мнении. Вот статья "Почему GWT не будущее веб-разработки": http://www.cforcoding.com/2009/10/lost-in-translation-or-why-gwt-isnt.html

    Автор сей статьи выдает такие контр-тезисы к основаниям GWT:
    1. GWT приносит четкую типизированность Java, чего нету в javascript
    Жесткая типизация происходила из утверждения что жестко типизированный код лучше читается и быстрее компилируется/выполняется. Однако как показывает практика, нетипизированный код читается тоже неплохо, что доказывается десятками популярных javascript-фреймворков. А прирост скорости на современных PC абсолютно не играет роли.

    2. Javascript девелоперов мало, а Java девелоперов много
    Звучит практично, но если нам надо написать книгу на русском, есть ли смысл писать её на английском, а потом переводить? Как показывает практика, в итоге им все равно приходится учить javascript.
    Кроме того, кросс-компиляция имеет множество недостатков:
    -Слабости java и javascript объединяются, и их получается ещё больше.
    -Сильные стороны java и javascript пересекаются, и в сумме их становится меньше.
    -Архитектурные идиомы языков отличаются
    -Дополнительное абстрагирование от javascript вносит свою путаницу

    3. GWT предоставляет библиотеку компонент, достаточную для любых целей
    Однако любой кто писал на GWT сталкивался с недостатком функционала виджетов. Даже Ext/SmartGWT не решает этой проблемы, и приходится клепать свои компоненты. Для javascript такой проблемы обычно не возникает - даже самый экзотический виджет обычно уже кем-то реализован.

    4. Скорость разработки на GWT выше скорости разработки на javascript
    Достаточно один раз собрать достаточно большой GWT модуль чтобы расстаться с этой иллюзией. А на javascript все делается мгновенно. В принципе, это главный косяк GWT. Если с остальным можно мирится, то этот неприемлем (впрочем, медленные итерации кодинг-проверка это проблема не только GWT). Частично это решается разгуливанием всего в модули, и помодульной пересборкой и деплойментом. Также можно настроить перекомпиляцию только измененных классов. Но оба этих приема применимы далеко не всегда.

    5. GWT вносит свои коррективы в дизайн приложения. Однако не каждому приложению подходит дизайн a-la Gmail.

    6. Javascript позволяет писать намного меньше кода, чем это надо в GWT. Это в первую очередь вызвано тем, что в Javascript есть естественная работа с хэшмэпами, а в Java для этого требуется множество строк кода. Поэтому послойное абстрагирование из Java плохо прокатывает в GWT.

    7. Программист изучает не язык программирования, а идиомы программирования. Именно поэтому C# и Java так похожи. И также, поэтому, трансляция с Java на Javascript такая сложная и неестественная.