Showing posts with label java. Show all posts
Showing posts with label java. Show all posts

Friday, November 7, 2008

IntelliJ IDEA 8 Released.

idea8_header

Сегодня был выпущен релиз одной из самых лучших(возможно самой лучшей) IDE для разработки на java от компании JetBrains. Далее приводится информация с официального сайта:

Languages & Frameworks

Features & Improvements

От себя хочу добавить одну мысль, которая давно сформировалась в голове, в процессе долгой работы с продуктами от компании JetBrains: "Все сделано просто и работает максимально эффективно, т.е. специально для людей, а не для киборгов!". Спасибо. Побольше бы таких продуктов.

Monday, November 3, 2008

Путешествия из .NET в Java и обратно с IKVM.NET

И так, сегодня хочу упомянуть  проект IKVM.NET - реализация Java для .NET Framework и Mono с открытым исходным кодом. IKVM.NET состоит из: 

  • виртуальной машины(JVM) реализованной на .NET;
  • реализации на .NET библиотеки основных классов из OpenJDK;
  • набора средств обеспечивающих возможность взаимодействия .NET и Java.

Поскольку в описании для IKVM.AWT.WinForms.dll сказано:

Very limited and broken implementation of a few AWT peers. This is a low priority issue until the platform stabilizes and works sufficiently well.

решил осуществить путешествие с использования именно "слабой" стороны(предпочитаю именно такой подход). Сделал маленькое приложение на Java:

java -jar ikvm-test.jar

image

Запустил на ikvm(на машине не установлена java):

ikvm -jar ikvm-test.jar

image

Улыбнуло. Выполнил:

ikvmc ikvm-test.jar

на выходе ikvm-test.exe, запуск:

image 

Снова улыбнуло. Далее вызвал команду:

ikvmstub mscorlib.dll

на выходе получил mscorlib.jar ))), на который можно ссылаться при компиляции приложений на java, однако запуск таких приложений возможен только с использованием ikvm или в .net/mono после использования ikvmc.

Конечно, вряд ли стоит говорить о полном воссоединении технологий, но сам по себе проект очень занимательный, которому, несмотря на то, что он еще находится в разработке, уже нашлось применение в реальной жизни: Eclipse, JmDNS, JGroups, Jetty. Вообще, у автора IKVM.NET очень интересный блог, особенно для тех, кто глубоко интересуется  обоими технологиями.

Sunday, October 26, 2008

Миграция кода из Visual Source Safe в Subversion.

В компании, в которой я на данный момент работаю, для хранения исходного кода используется Subversion (и TFS), но есть старые проекты, которые живут в Microsoft Visual Source Safe 2005. Было p_svnimporterпринято решение перенести старые проекты (код и историю) в Subversion. Первым инструментом, который я нашел, оказался Importer for SVN, написан на java, по описанию умеет экспортировать из: CVS, PVCS, VSS, ClearCase, MKS, StarTeam.

К сожалению, экспорт поддерживается только из VSS 6.0, поэтому сразу успешно импортировать с его помощью мне не удалось. На форуме разработчиков был обнаружен патч, решающий мою проблему. Забрав с сервера последнюю ревизию кода приложения и применив патч, я собрал версию, которая позволила мне импортировать код и историю в Subversion из Microsoft Visual Source Safe 2005. Ура! 

Патч изменяет два класса из пакета org.polarion.svnimporter.vssprovider.internal(VssUtil.java и Vss.java). Для тех, кому понадобится производить подобную миграцию,  я выложил в сеть получившийся билд, убрав лишние провайдеры для других систем контроля версий.

Wednesday, April 16, 2008

Как java и .net пишут числа в поток.

Учавствуя в разработке клиентского приложения на Java и серверного на .Net, встретил интересную несовместимость платформ в записи/чтения чисел в/из бинарный поток . Все началось с того, что в первых четырех байтах(int) каждой порции данных посылаемых из приложения, работающего на устройствах типа CLDC, передавался размер этой порции. На серверной же стороне этот размер не рассчитывался правильным образом. Оказалось, что Java записывает(читает) в формате big-endian, а .Net в little-endian.

Для прояснения картины приведу следующие два примера:

1.C#

            MemoryStream stream= new MemoryStream(new byte[4]);
BinaryWriter writer = new BinaryWriter(stream);
int num = 218893066;
Console.WriteLine("Двоич. форма: " + Convert.ToString(num, 2));
Console.WriteLine("Шестн. форма: " + num.ToString("X"));
writer.Write(num);
byte[] arr=stream.ToArray();
Console.WriteLine("Первый байт: "+arr[0]);
Console.WriteLine("Второй байт: " + arr[1]);
Console.WriteLine("Третий байт: " + arr[2]);
Console.WriteLine("Четвертый байт: " + arr[3]);
Console.ReadLine();
2.Java
ByteArrayOutputStream baos = new ByteArrayOutputStream(4);
DataOutputStream dos = new DataOutputStream(baos);
int num= 218893066;
System.out.println("Двоич. форма: "+Integer.toBinaryString(num));
System.out.println("Шестн. форма: "+Integer.toHexString(num));
dos.writeInt(num);
byte[] arr=baos.toByteArray();
System.out.println(""Первый байт: "+arr[0]);
System.out.println("Второй байт: " + arr[1]);
System.out.println("Третий байт: " + arr[2]);
System.out.println("Четвертый байт: " + (arr[3]));
System.in.read();

Результат 1:


Двоич. форма:1101000011000000101100001010
Шестн. форма: D0C0B0A
Первый байт: 10
Второй байт: 11
Третий байт: 12
Четвертый байт: 13


Результат 2:

Двоич. форма:1101000011000000101100001010
Шестн. форма: d0c0b0a
Первый байт: 13
Второй байт: 12
Третий байт: 11
Четвертый байт: 10


Число 2188930066 специально выбрано для примера, что бы не осложнять картину тем, что в Java byte - знаковый байт(signed byte), а в C# byte - безнаковый байт(unsigned byte). В C# есть знаковый байт(sbyte), а вот в Java такого(таких) типа нет(но разговор сейчас не об этом).

Поскольку моей целью не являлось продолжение священной войны между Лилипутией и Блефуску , то проблема была решена очень просто. Т.к. в моем случае клиентская платформа(j2me) имеет очень много ограничений, было решено изменить формат порядка байт на сервере.

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using SystemBinaryReader = System.IO.BinaryReader;

namespace Mmg.Ssp.MobileGateway.Entropy.Protocol.Hybrid
{
class BinaryReader : SystemBinaryReader
{
public BinaryReader(Stream input, Encoding encoding) : base(input, encoding)
{
}

public BinaryReader(Stream input) : base(input)
{
}

public override int ReadInt32()
{
byte b1 = ReadByte();
byte b2 = ReadByte();
byte b3 = ReadByte();
byte b4 = ReadByte();
return (b1 << 24) + (b2 << 16) + (b3 << 8) + (b4 << 0);
}
}
}
using System.IO;
using System.Text;
using SystemBinaryWriter = System.IO.BinaryWriter;

namespace Mmg.Ssp.MobileGateway.Entropy.Protocol.Hybrid
{
public class BinaryWriter : SystemBinaryWriter
{
public BinaryWriter(Stream output, Encoding encoding) : base(output, encoding)
{
}

public BinaryWriter(Stream output) : base(output)
{
}

public BinaryWriter()
{
}

public override void Write(int value)
{
OutStream.WriteByte((byte)(value >> 24 & 0xff));
OutStream.WriteByte((byte)(value >> 16 & 0xff));
OutStream.WriteByte((byte)(value >> 8 & 0xff));
OutStream.WriteByte((byte)(value & 0xff));
}
}
}

Или воспользоваться готовыми решениями. Так же можно воспользоваться классами из J#(vjslib.dll) , которые используют формат big-endian (как и java), но здесь возникает проблема в том, что J# является "копией" java и использует знаковые байты, в отличие от C#(да и вообще, по моим ощущениям, Microsoft откажется от поддержки J#, так например, среды для него уже нет в Microsoft Visual Studio 2008), поэтому это наверное не лучшее решение.