Saturday, June 9, 2012

Занятия по Java

И вот я снова вернулся к преподаванию Java. В очередной раз в компании, где я работаю, возникла необходимость рассказать о языке программирования Java некоторым нашим сотрудникам. Чтобы не повторятся и снова не рассказывать то, что и так уже известно и доступно на youtube, мы решили в этом новом курсе сделать упор на практическое применение Java.

Так как предыдущий курс Java для тестировщиков был в основном теоретическим и ознакомительным, то в этот раз занятия будут проходить следующим образом. Слушатели сначала самостоятельно смотрят уроки на youtube (не все сразу, а по одной или две), потом на занятии я некоторое время резюмирую теоретический материал, на чем-то, возможно, останавливаюсь подробнее или что-то добавляю, отвечаю на вопросы. Далее, я разбираю какую-нибудь практическую задачку, решение которой основывается на полученных теоретических знаниях. Ну и в конце я задаю небольшое задание для самостоятельной работы.

Как и в прошлый раз, видео я буду записывать и выкладывать на youtube, объединяя их в отдельный плейлист. Надеюсь, что наличие практической составляющей поможет многим быстрее и лучше разобраться с Java, тем более, что многие просили о различных задачах в многочисленных комментариях.

Итак, первое занятие из курса Java практика можно посмотреть ниже. Перед просмотром этого видео, рекомендуется ознакомиться с уроком 1 и уроком 2 из курса Java для тестировщиков. Обратите также внимание на комментарии ко второму уроку, где многие поправляли ошибки, которые я допускал. Вообще, некоторые комментарии очень даже хорошие и полезные, особенно от пользователя hazartilirot .

Задания для самостоятельной работы после первого занятия:
  1. Написать программу, которая выдает заданное число из последовательности Фибоначчи. 
  2. Написать программу, которая сортирует массив чисел.
Естественно, при написании программ не желательно использовать встроенные механизмы Java для сортировки или поиска числа Фибоначчи :)

Read More...

Tuesday, November 15, 2011

CDMA модем Huawei и Ubuntu Linux

В связи с жизненной необходимостью подключил себе услугу мобильного высокоскоростного доступа в интернет от провайдера, которым уже давно пользуюсь. Данный провайдер использует технологию CDMA, и для пользования высокоскоростным интернетом пришлось приобрести новый модем. Имя ему Huawei EC 306. Интересно это устройство тем, что при подключении к компьютеру оно распознается как флеш-накопитель, на котором находятся Windows-драйвера. Однако внутри устройства также находится SIM-карта оператора, и оно может работать как модем. Драйверов для Linux, естественно, нету, да они и не нужны. Необходимо всего лишь переключить режим работы устройства...


На Windows-системе все оказывается очень просто. На флеш-карте находятся драйвера. Установка запускается автоматически, когда подключается устройство. После установки будет доступно приложение, запустив которое можно подключаться к интернету. Приложение называется Mobile Partner, написанное все той же компанией Huawei, и видимо, распространяется с ее модемами, а разные операторы уже изменяют текст интерфейса и картиночки на свои.

На Linux-системе драйвера для модема не нужны вообще. Это универсальное последовательное устройство, с которым Linux умеет работать — все, что нужно, это настроить модем. В операционной системе Ubuntu такие настройки хорошо автоматизированы, а менеджер сетевых подключений даже умеет подключаться к моему оператору через выбранное устройство. Выходит, что нужно только заставить систему распознавать устройство как модем, а не как флеш-накопитель.


Можно установить программу Mobile Partner на Ubuntu. Вот здесь я, даже, нашел ссылку на скрипт установки (я скрипт не проверял, так что запускайте его на свой страх и риск!). А потом вот тут на ubuntuforums.org и еще вот тут на habrahabr.ru в комментариях я нашел, что устанавливать программу нет смысла. Достаточно указать системе, чтобы она переключала режим работы устройства. Необходимо выполнить следующие шаги:


  1. Открываем терминал и выполняем команду lsusb
    В результате получим список USB устройств, подключенных к компьютеру.
    ~$ lsusb
    Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

    Bus 004 Device 002: ID 046d:c018 Logitech, Inc. Optical Wheel Mouse
    Bus 003 Device 001: ID 12d1:1505 Huawei Technologies Co., Ltd.
    Bus 003 Device 002: ID 1d6b:0001 Linux Foundation 1.1 root hub

  2. В полученном списке находим модем и обращаем вниманием на его ID. Первые четыре символа (в моем случае это 12d1) — это идентификатор производителя. Вторые четыре (в моем случае это 1505) — это идентификатор устройства.

  3. Теперь выполняем в терминале следующую команду (все одной строчкой), заменив идентификаторы производителя и устройства на свои:


    echo 'SUBSYSTEM=="usb", SYSFS{idProduct}=="1505", SYSFS{idVendor}=="12d1", RUN+="/lib/udev/modem-modeswitch --vendor 0x12d1 --product 0x1505 --type option-zerocd"' | sudo tee /etc/udev/rules.d/45-huawei1550.rules

    После выполнения этой команды в каталоге /etc/udev/rules.d/ появится файл 45-huawei1550.rules, команды из которого будут прочитаны, при подключении устройства к компьютеру.

  4. Вынимаем устройство, вставляем его снова — и у вас уже не флешка, а модем, подключенный к компьютеру. Дальше все просто — правой кнопкой на значке сети, Редактировать подключения, закладка Мобильные подключения, Кнопка Добавить — выбираем свою страну, провайдера и все! :)


P.S. Немного о скорости для тех, кому интересно. Заявленная оператором скорость передачи данных в сети EVDO Rev.B+: загрузка до 14,7 Мбит/с, передача до 5,4 Мбит/с. В реальности, конечно, все зависит от загруженности сети, удаленности от базовой станции, и количества осадков в амазонской равнине. Тестируя связь в центре Киева в полдень, загружая ролики с youtube, файлы с ex.ua и т.д. скорость у меня прыгала от 1 до 6 Мбит/с, что очень даже недурно, как для мобильного интернета.


Read More...

Monday, October 24, 2011

javax.net.ssl.SSLException: bad_record_mac

While writing a java net application I've encountered an interesting problem, which solution was not very trivial. The task was to connect to one website, parse the output, and write extracted information to a file. At first glance the task is "a piece of cake", but the problem appeared at the stage of connecting to the web site. The site uses the https protocol, and I had to use something more complex than basic java's HttpURLConnection. I've tried to use java's HttpsURLConnection, but while connecting to the site I received the following exception, which got me stuck me for a while: javax.net.ssl.SSLException: bad_record_mac. Eventually the problem was solved and the solution is described below.

Firstly, I will describe classes that were used to perform the connection. I've decided not to use internal java api directly and to look for some 3-rd party library, because besides connecting to the site, I had to execute some post and get queries to get required information and I wanted to do that with less pain. I chose to use the HttpClient library from Apache commons project. Here is the basic connection example that uses that library:

HttpClient httpclient = new DefaultHttpClient();
try {
    HttpGet httpget = new HttpGet("http://www.google.com/");
    ResponseHandler<String> responseHandler = new BasicResponseHandler();
    String responseBody = httpclient.execute(httpget, responseHandler);
} finally {
    httpclient.getConnectionManager().shutdown();
}

However, it won't work with some https websites. It does work with many of them, but some of them fail with different ssl exceptions. The site I was connecting to firstly failed with the following exception:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

That means that the certificates were not verified correctly. Therefore, I had to implement more complex solution to handle different SSL cases. Here you might look for some other 3-rd party library that will handle secure socket connections by itself, however you might not get the full control. You can use this advice from the HttpClient manual and implement everything on your own. Eventually, everything can work fine OR you might get the exception mentioned at the beginning. If you're lucky one - my congratulations. If not - keep reading :)

In order to get the better understanding I decided to implement everything based on HttpClient and then debug it to see where it fails. I didn't care about checking the certificates and trusting the connection and just wanted to get the page contents. I've used examples from this blog post that I found pretty interesting. Therefore, I've created MyConnectionFactory that extends SSLSocketFactory. It initialized the SSL context with my own TrustManager and then uses it to create secure sockets.

public static class MySSLSocketFactory extends SSLSocketFactory {
    private SSLContext sslContext = SSLContext.getInstance("SSLv3");
    public MySSLSocketFactory() throws Exception {
        super((TrustStrategy) null, new AllowAllHostnameVerifier());
        sslContext.init(null, new TrustManager[] { myTrustManager }, null);
    }
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) 
            throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}

I created the implementation of TrustManager that basically does nothing in its methods - so it skipped any security check. In other circumstances its probably not a wise thing to do, but for my task that was enough, so I didn't want to complicate things.

TrustManager myTrustManager = new X509TrustManager() {
    public void checkClientTrusted(X509Certificate[] chain, String authType) 
        throws CertificateException {    }
    public void checkServerTrusted(X509Certificate[] chain, String authType) 
        throws CertificateException {    }
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}

Then I put everything together by registering my socket factory for the port 443 connections and then creating the HttpClient with my connection manager. The code to setup HttpClient looks like this:

private static HttpClient setupHttpClient() throws Exception {
    SSLSocketFactory sf = new MySSLSocketFactory();
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
    registry.register(new Scheme("https", sf, 443));
    ClientConnectionManager ccm = new ThreadSafeClientConnManager(registry);
    return new DefaultHttpClient(ccm);
}

With this code I was able to connect to my https website, but I started to get the exception javax.net.ssl.SSLException: bad_record_mac. And that's where all the fun started - looking into Internet and debugging to get the solution.

First of all, I've downloaded source code for HttpClient and started to debug to see where exactly the problem occurs. It was interesting to find out that the problem occurs when the getSession() method is called on SSLSocket. Java performs the SSL handshake and it fails. So, I went to the Internet to find the solution, because very likely the problem was solved before.

Quite interesting looks the following stackoverflow answer to similar question, which says that the problem could be due to the load balancing, when the MAC address changes during negotiation. It could be the reason that the problem occurs sometimes. However, in my case the exception appeared every time, so I continued to search.

Eventually, I found two different sources that pointed out for the reason and how to overcome it: one is the knowledge base article for JIRA client connecting to server, and another is last coderanch answer. The problem appears because Java tries all kinds of secure socket protocols (TLS, SSLv2, SSLv3, etc.) even if only one is supported by the server. This results in the aborted connection. Trapping this error can be hard if you don't have access to the server. But if not the load balancing, then the reason could be either unsupported protocol, or unsupported cipher algorithm.

The solution is to configure Java in such a way that it will use only one secure socket protocol for communication. Therefore, in both createSocket methods of MySSLSocketFactory I've added the following code after creating sockets:

((SSLSocket) socket).setEnabledProtocols(new String[] { "SSLv3" });
((SSLSocket) socket).setUseClientMode(true);

And it worked! That solved my problem. The handshake went fine, the connection went fine, and I was able to do my task. In conclusion, I can say, that while writing this blog post, I could not reproduce the problem. :) So, maybe, it really has something to do with load balancing - I didn't dig into it. In any case, debugging of SSL problems can be tough, so enabling Java net log by calling System.setProperty("javax.net.debug", "all"); can be very helpful.

The testing program with working example with SSL connection can be downloaded here: http://goo.gl/JFdw5

Read More...

Wednesday, November 10, 2010

Лекции по Java

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

Курс рассчитан на N-ое количество занятий. Пока что, до Нового Года, а там видно будет. Занятия будут проходить 2 раза в неделю, поэтому как минимум 10 занятий будет точно. Основное на что надо дать упор - это особенности языка, основные классы, знакомство с библиотеками. Чтобы долго не мудрить, я подготовил программу курса, основываясь на Java Tutorial - убрал некоторые специфические вопросы и добавил некоторые вещи, согласно пожеланиям. Программу курса можно посмотреть здесь. Пока что будем следовать ей, и по ходу корректировать.

После про​ведения нескольких занятий хочется отметить некоторые приятные отличительные особенности от преподавания в ВУЗе:


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

  • Интерактивная электронная доска. Благодаря этому чуду техники "жить стало лучше, жить стало веселее". Занятия проходят в переговорной комнате, где у нас установлена такая доска - SMART Board. Доска подключена к компьютеру и ее можно использовать как большой экран. На ней можно рисовать специальными маркерами, двигать объекты руками, сохранять нарисованное и т.д. Если комната с такой доской занята, то занятия проходят в другой переговорке, где обычная доска и маркеры. Однако, даже это лучше, чем обычная доска и мел. Что ж, у образования нашей страны нету денег на такие "штучки", однако есть гранты и меценаты. Университет, в котором я раньше работал, участвовал в программе по гранту, которая направленна на внедрение командной разработки в процесс подготовки программистов. По этому гранту университет получил некоторое оборудование, среди которого и такая интерактивная доска. За два года работы там я никогда не видел, чтобы доска включалась, зато часто видел, как доску выставляли на показ, когда приезжали "дяди" и кафедра с университетом перед ними хвастались. Что ж, можно долго спорить о причинах такой политики, но факт есть факт: в университете доска была, но пользоваться ей было нельзя, а здесь доска есть и пользуются ей все. Красота!
Так как никакой конфиденциальной информации на курсах я не раскрываю, то я подумал, а почему бы не поснимать все это на видео и сделать доступным для общественности. Во-первых, ребята не всегда могут посещать все занятия без пропусков из-за разной загруженности по работе, и видео поможет им оставаться "в строю". Во-вторых, возможно, кому-то еще этот курс сможет помочь выучить Java. Так что в записях этого блога буду выкладывать видео занятий, объединенных по темам.

Итак, видео первого занятия​​​​​​​​​​​​​​​​​​​​​​​​​, где происходит знакомство с Java, языком программирования, JVM, с тем, что это такое и с чем его едят.

Read More...

Monday, December 21, 2009

Installing X.509 certificates on Nokia S60 3rd edition device

Sometimes you need to install your own X.509 certificate on the phone in order to authorize some web site, Exchange server, or installed software, or in general to use TLS (SSL) connection. According to the guide, provided on Nokia forums – it a piece of cake! However, sometimes problems may arise, and you start wondering about what can go wrong. The next thing you do is try to find the answer somewhere on the Internet. Well, you'll get a whole bunch of different posts about positive or negative experience, you'll find different solutions that are sometimes weird, sometimes don't work, and sometimes work but not on your phone. In general, most solutions are correct, you just need to pay attention to one nobody-ever-mentioned thing.

At first, a small amount of theory, so you'll know what I am talking about. X.509 certificate files have several extensions. Here is the description from Wikipedia for the most common:

  • .pem - Base64 encoded DER certificate, enclosed between "-----BEGIN CERTIFICATE-----" and "-----END CERTIFICATE-----"
  • .cer, .crt, .der - usually in binary DER form, but Base64-encoded certificates are common too
  • .p12 - PKCS#12, may contain certificate(s) (public) and private keys (password protected)
  • .pfx - PFX, predecessor of PKCS#12 (but most of the time the actual data is PKCS#12, only the extension is kept)

If you are not into technical very much, you just need to know that .pem files are text files. So you can open them in any text editor (like GEdit or Notepad) and see bunch of letters and numbers after the first line, which says “-----BEGIN CERTIFICATE-----”. Those letters and numbers is actually a specially encoded binary certificate. Now, the files with extensions .cer, .crt, .der are usually (but not always!) binary files. That means that you cannot view their contents with usual text editor. But pay attention to what is being said at the end for this kind of files: “... but Base64-encoded certificates are common too”! That means, that you can have a certificate file with, for example, .cer extension, but it will be a text file actually encoded as .pem file! And, what's the difference, you ask, why should I care?

Well, here we came to the most interesting part. Nokia phones on S60 3rd edition platform cannot import .pem certificates! They cannot import certificates that are represented as text files. You need a binary DER encoded file. And what's really exciting – you can have a .cer, .crt, or even .der file, but it will be a text file that was renamed from .pem! Well, your computer web browser will cope with it just fine. You computer mailing program will cope with it just fine, too. But not your Nokia phone!

If you are still wondering on “how do I know what kind of certificate file I have?”, then try to do a simple thing. Open the file with any text editor and see: if it opens correctly and has the first line as “-----BEGIN CERTIFICATE-----”, then this is a text .pem file. If it doesn't open correctly or has something really crazy inside – then it is probably a binary .der file.

If you have a binary certificate file, then just transfer it to the phone and open with phone's File Manager. It will ask you to import the certificate. Just like the mentioned tutorial says. What if you have a text certificate file? Then you should convert it to binary representation. There is an open source and free program that can do it for you, called OpenSSL. A compiled version of OpenSSL for Windows can be found here. Ubuntu users just type in terminal: sudo apt-get install openssl.

So, you've got the program! Next thing you do is type in terminal the following command:

openssl x509 -outform der -in certificate.pem -out certificate.der

In place of 'certificate.pem' you should put your text certificate file (it can have extensions .pem, .cer, .crt, .der but it should be text file) and in place of 'certificate.der' you just put any name you want. After executing this command (pressing Enter in terminal after typing it there) you should get in your directory a file named 'certificate.der' (or whatever you've put there), which will be a binary DER encoded certificate file. After that you do the same thing that I wrote before – transfer file to the phone and open it with File Manager. And you're done!

Now, lets mention the .p12 files. As I said before that are the binary files containing public certificate and password-protected private key. According to the already beloved Nokia guide this kind of files should be supported for installing on the phone. Well, not necessarily. In fact, unfortunately my Nokia N73 phone with the latest firmware does not import .p12 certificate files. I don't know why. Nokia support does not know either. I didn't dig it deeper into the problem, because I actually didn't need to install the certificate with private key – I probably will not decrypt any content with my phone that was signed or encrypted with public certificate (that is why you actually need a private key). But if you still need to import just the certificate from the .p12 file, you need to extract it first. The following command can be used:

openssl pkcs12 -in keyStore.p12 -out certificate.pem -nodes -nokeys

In place of 'keyStore.p12' you put the name of your .p12 file and in place of 'certificate.pem' you put any name. After executing this command you will get a text certificate file. Please, pay attention – it will be a text certificate file. You will need to convert it to binary format with the command mentioned before.

Well, that's about it! Now you should have no problems with installing your own X.509 certificate files on the Nokia phone. I didn't test the other versions of Symbian OS for the support of text certificate files, because I do not have many Nokia phones, except my own N73 :) But I think that S60 4th and 5th editions do not support then either.

Read More...

Tuesday, December 8, 2009

Видео лекция по AspectJ

Аспектно-ориентированное программирование (АОП) — парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули. Основная идея сводится к выделению сквозной функциональности, разбросанной между существующими модулями программы (классами, функциями), в отдельные аспекты, которые потом можно повторно использовать. Многие контейнеры, среди которых и Spring Framework, содержат в своем ядре АОП и используют его, а некоторые даже предоставляют свою реализацию (Spring AOP, JBoss AOP).

АОП мне понравилось своим нестандартным подходом. Всем известная единица модульности в ООП — это класс. Некий набор классов, где каждый выполняет совсем разные функции, может содержать определенную сквозную функциональность, не имеющую отношение к логике самих классов. Это может быть управление транзакциями, кеширование данных, ведение логов, уведомление пользователя и т. д. Как сделать так, чтобы функциональность не дублировалась? Можно воспользоваться самим ООП, применить наследование или агрегацию, но тогда классы все равно будут зависеть от других. Можно применить различные шаблоны проектирования — внедрение зависимостей, например, но тогда приложение становится зависимым от сторонней библиотеки, применение которой не всегда может быть оправдано. Шаблоны проектирования помогают решить большинство проблем, связанных с проектированием приложения, но что, если сам шаблон содержит, либо приводит к появлению, сквозной функциональности (например, шаблон Наблюдатель, где дублируется логика управления наблюдателями)?

Решением описанных проблем может быть, и на самом деле есть, применение АОП. Сквозная функциональность выносится в отдельный модуль, называемый аспектом (aspect). В нем также определяется с помощью точек соединения (joint-points), где, в каких местах, и при каких условиях будет применяться данная функциональность, называемая советом (advice). Советы могут привязываться к точкам соединения либо во время компилирования программы, либо во время загрузки программы, либо даже во время работы программы. Разные библиотеки реализации АОП предоставляют разные возможности.

АОП реализовано во многих языках программирования. Для Java одной из успешных реализаций является AspectJ. Для работы с ней в среде Eclipse отлично подойдет плагин AJDT. Документации по AspectJ и вообще по АОП можно найти много, но мне больше всего нравятся два источника. Первый — это AspectJ 5 Developer's Notebook. Он же содержится сразу в помощи (F1) к плагину AJDT. Второй источник — это цикл статей AOP@Work от IBM. После того, как познакомитесь с АОП, рекомендую прочитать статью AOP@Work: Мифы и реальности АОП, где развенчиваются некоторые мифы, связанные с использованием АОП, и где содержатся дополнительные ссылки для изучения АОП.

Идея рассказать студентам про АОП у меня возникла тогда, когда я решил к курсовому проекту по предмету «Технологии проектирования программных систем» добавить контейнер Spring Framework, чтобы он создавал все необходимые сервисы, связывал их между собой, а также управлял транзакциями и работой с базой данных. Управление транзакциями происходит декларативно с помощью Java аннотаций над методами или классами. А вот непосредственно код, связанный с транзакциями, находится в аспектах, которые подключаются к проекту. На лекции я старался объяснить, что нам дает использование АОП, а также показать основные способы применения AspectJ.




Update: Ниже выкладываю слайды лекции, чтобы Вы их смогли скачать и использовать в своей практике. Для этого нажмите меню в правом нижнем углу, потом нажмите на название презентации слева почти снизу. В новом окне откроется презентация, где ее можно будет скачать.


Read More...

Friday, December 4, 2009

Java Swing application to access Blogger

This small and very simple application allows you to connect to the Blogger server, see all you blogs, read posts, create new posts and edit them. The use of Java language was determined by the need of running this application on different operating systems. Swing was used for GUI programming because of its simplicity (and one more reason, described below). The name of the application is JDesktopBlogger.

After I started to use Blogger I searched for some desktop application to use with it. I've tried to use different open sources projects but none of them fit my needs. Then I thought: why not writing something on your own? Interesting enough, but some big changes came to my life at that time - I've switch my job and moved to another city. At the new job because of some reasons I couldn't start working at the project right away. I had couple of weeks to... do some self education :) I found out that the new project will be dealing with Swing. So I thought - why not create a blogging application? I've incited my friend to help me. We both were waiting for a project to start and while waiting we created this blogging application.

The application is very simple. The used technologies are limited to Swing for GUI, JAXB for saving account's file, Google's Gdata BloggerService for accessing Blogger.

At the time of writing this post the application is at pre-beta state. :) The features are not very rich, but include the following:
  • managing of several blogger accounts (includes creating, editing, deleting);
  • getting list of all blogs within account;
  • managing list of all posts within blog (includes creating, editing or deleting posts);
  • ability to create draft post. 
That's about it :) Not much, but we had to start with something. However, I do have some plans for this application and if time permits we'll add the following:
  • simple formatting options for post (right now only plain text is supported); 
  • caching of posts and blogs;
  • saving drafts on local machine; 
  • support of other blogging services by adding plug-in functionality. 

And now the main revelation: This post was written from the created application! :) It's like a proof of its work. Well, yes, the formatting of links and lists was later edited in the web, but that is the primary to-do for me :)

Read More...