2010-12-03

Java NG

В продолжение "хотелок" в Java.

Я считаю, что язык надо упрощать, а не усложнять (как это делает Scala).
Список пожеланий, что хотелось бы улучшить, добавить:
(в тексте [] используются для простого html == меньше больше)

1. добавить всё что есть в Project Coin: small language changes
много мелких синтаксических сахарков, делающих код более простым и наглядным.
В частности 'array getter/setter': v = myList[i]; mymap["key1"] = value == компилятор подставляет вызов get и put соответственно.
Если методов get/put/set не находится, то можно использовать любые другие проаннотированные @ArrayProperty


2. всё что есть в проекте Google Guava http://code.google.com/p/guava-libraries/
плюс статические и fallback методы у интерфейсов т.е. "перенос" максимум кода из статических методов в instance методы (mySet.filter(..), map1.transform, etc).
Пояснение про fallback: это статические методы в интерфейсе вида T filter (Set this, Filter _) - если у instance метода filter(Filter) нет,
то используется fallback метод из интерфейса.
myset.filter(myfilter).transform(myfunc) выглядит нагляднее и лучше работает с автокомплитом в отличии от transform(filter(myset, myfilter), myfunc)


3. возможность не писать ";" там где IDE и компилятор справятся без ; т.е. сделать точку с запятой более опциональной
Например: после и перед } , после )


4. простые замыкания (а не предлагаемый ужас), например: #{тело метода } или #(аргумент1, арг2, ){ тело } + именование параметров по умолчанию _ / _0, _1, _2, etc.
Последнее выражение в теле замыкания == return это выражение.
Также простое указание метода реализующего тело замыкания #this.имяМетода или #имяМетода или #другойОбъект.имяМетода (примеры ниже).

Примеры использования:

new Thread(#{log.info("hello!")}).start() == new Thread(new Runnable(){@Override public void run () { log.info("hello!"); }}).start()

mySet.filter(#{_ != null}) ==  mySet.filter(new Predicate[SomeType](){ @Override public void boolean apply (@Nullable SomeType _) { return _ != null; }});

vs текущее Iterables.filter(mySet, ....многобукв);

list.sort(#(a,b){a-b})  задание читателю ;-)

"ссылка на метод"
new Button("Нажми меня",    #myThisButtonClickListener) где в том же объекте объявлен реализующий тело интерфейса listener-а метод

public void myThisButtonClickListener (Button.ClickEvent event) {
    final Window subw = new Window("суб-окошечко");
    getMainWindow().addWindow(subw);
    ...
}

== new Button("Нажми меня",    #{myThisButtonClickListener(_)})

Многие уже сейчас реализуют это через reflection т.е. можно указать объект (this в данном случае) и имя метода в виде строки "myThisButtonClickListener"


5. конструкцию let[def/val/var], для тел методов, которая бы сама выводила тип переменной _в левую сторону_ vs текущая тенденция
выводить в правую (diamond operator и все эти Джошуа Блоковские static list, newMap и тд).
Пример использования.
let myvar = new ConcurrentHashMap[ТУТ БОЛЬШОЙ СПИСОК С Generics]()
final let s = "hello"
далее по коду работать с этими переменными как с обычными типизированными

for (let i : mybiggenericmap.entrySet()) {
  let k = i.key;
  for (let j = k; j<MAX; j++) {


6. авто свойства: если у класса есть getter getFoo(), то можно обращаться a = obj.foo, а если есть setter setFoo(T value), то obj.foo = v1. Внутри самого класса обращение к foo должно работать с переменной T foo, а this.foo - с getters/setter.
Автобилдеры?  myedit.width = 80, hight = 16, styleName = "sexy, main", value = 42;


7. массивы implements Iterable (можно будет применять filter, transform) и for работающий по Iterable/Iterator/Enumeration т.е. всеядный for, а не только массив и Iterable как сейчас.
Кроме того станут возможными унифицированные API: public double sum(Iterable collectionOrArray) .


8. полезные идеи из JavaFX (полный отказ от чистого JavaFX - это хорошо)
У JavaFX 2.0 очень трезвый и разумный roadmap http://javafx.com/roadmap/
Очень рекомендую на него поглядеть, много вкусного.

9. JRebel встроенный в JVM. JRebel хорошо, а out-of-box он бы imho дал такой синергетический эффект, что здорово бы улучшил индустрию.
Самый сильный козырь скриптовых языков быстрый цикл редактирование-тестирование в web, с JRebel этот козырь получили бы все языки JVM.



10. /regexp Pattern/ прямая поддержка в Java коде т.е. данная конструкция должна выглядеть как скомпилированный Pattern.



11. === безопасный вызов equals т.е.: a = b  - присваивание, a == b - сравнение ссылок и простых типов, left === b - сравнение объектов (и простых типов):  if (left == b) {  return true;  } if (left == null || b == null) { return false;  }  return left.equals(b);


Это сделало бы язык проще и уменьшило бы количество действительно ненужного кода, не превращая язык в Perl.

2010-10-26

Редкоиспользуемые, но полезные ссылки

Генератор "брендов".
"наш сервис поможет вам придумать уникальное название для вашей фирмы. Ваш новый бренд сразу заявит о вас, как о современной, инновационной и интеллектуальной компании"
http://www.brendogenerator.ru/


S как доллар
"многие люди ломают голову, как правильно диктовать адреса сайтов и электронной почты. Мы сделали сайт, который раз и навсегда ставит точку в этом вопросе.

Сайт «Эс как доллар» — верный помощник секретаря, менеджера и бухгалтера"

http://www.skakdollar.ru/


Давай я поищу в Google за тебя

http://lmgtfy.com/


2010-07-25

Java NG

Сейчас много говорят о новых языках работающих в JVM: Groovy, Scala, Clojure, JavaScript (Rhino), etc.

Мне нравятся Clojure и Rhino, остальные попахивают over-engineering'ом или "только для гиков/держать подальше от production".
Т.е. я не против "пусть цветут все цветы", но реальной замены Java пока нет и не наблюдается (очень серьезный конкурент это C# - активно развивается, но развивается IMHO по принципу "запихнем в язык всё что увидим").

Развивать Java надо (Sun развивал Java медленно, медленнее его разве что Borland с Delphi), но не пихая туда всё подряд, не усложняя язык, а наоборот упрощая.

Мой список пожеланий выглядит так:

1. всё что есть в проекте Coin
2. всё что есть в проекте Guava
3. простые замыкания (а не предлагаемый ужас), например: #{тело метода } или #(аргумент1, арг2, ){ тело }. Пример использования: new Thread(#{log.info("hello!"); }).start();
4. конструкцию let, для тел методов, которая бы сама выводила тип переменной. Пример: let myvar = new ConcurrentHashMap<Integer, Set<MyType>>(10); или final let s = "hello"; далее по коду работать с этими переменными как с обычными типизированными
5. авто свойства: если у класса есть getter getFoo(), то можно обращаться a = obj.foo, а если есть setter setFoo(T value), то obj.foo = v1. Внутри самого класса обращение к foo должно работать с переменной T foo, а this.foo - с getters/setter.
6. (мелочи) массивы implements Iterable и for each работающий по Iterable/Iterator/Enumeration

Это сделало бы язык проще и уменьшило бы количество действительно ненужного кода, не превращая язык в Perl.

2009-10-22

Sysinternals Junction

Открыл для себя утилиту Junction от Sysinternals.

http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx
http://download.sysinternals.com/Files/Junction.zip

Замечательная штука!
Для пользователя это полный аналог linux hardlinks.

Lifehack: Минздрав has you Neo

Вчера мне потребовалось купить обычной марганцовки.

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

Я подумал и взломал систему:

В аптеках продаются наборы походных аптечек для «Мамы и ребенка» и «Авто».

В нескольких из них была обнаружена марганцовка.

Я купил самую дешевую аптечку (это оказалась «Мама и ребёнок» - её остальное содержимое в хозяйстве пригодится).


Стоимость аптечки ~ 200 руб., т.е. в несколько раз дороже пакетика марганцовки, но за удовольствие обмануть систему приходится платить.

2009-03-13

Karaoke SelfMade

Как сделать из почти любого mp3 - караоке т.е. только звук без вокалиста:

  1. качаем утилиты http://sox.sf.net и http://www.mpg123.de
  2. достаем их из архива в PATH
  3. sox.exe копируем в play.exe
  4. mpg123 -w имя_файла.wav имя_файла.mp3 - перекодировать имя_файла.mp3 в имя_файла.wav
  5. play имя_файла.wav oops
Где oops:
Out Of Phase Stereo effect. Mixes stereo to twin-mono where each mono channel contains the
difference between the left and right stereo channels. This is sometimes known as the ‘karaoke’
effect as it often has the effect of removing most or all of the vocals from a recording.

2009-01-21

Java идеальна для системного программирования

Копия моего поста http://community.livejournal.com/ru_java/750688.html

Смотрите на мир незашоренными глазами:
Java идеальна для написания системных утилит.
Java действительно прекрасный выбор для системного программирования.

Главное понять, что некоторые различия ОС не обработаны заботливым изготовителем JRE и не поданы на блюдечке, а их потребуется обрабатывать вручную, точно также как это делают в Delphi/C++.

Т.е. отсуствующие в JRE методы реализуете вызовами к ОС (проверяя что за ОС).
  • Стандартный способ JNI: слишком много писать - это как писать в машинном коде.
Как надо:
  • Если надо работать с процедурным API (ex: WinAPI) то есть:
  1. https://jna.dev.java.net/
  2. http://www.jinvoke.com/
  3. http://fivedots.coe.psu.ac.th/~ad/winJava/ (несколько глав книги Windows Programming Using Java - они используют JInvoke, но думаю будет полезно и для JNA и для Linux ;-)
  • Если надо работать с ООП API (ex: COM) то есть:
  1. https://com4j.dev.java.net/
  2. http://jacob-project.sf.net

https://jna.dev.java.net/
JNA provides Java programs easy access to native shared libraries (DLLs on Windows) without writing anything but Java code—no JNI or native code is required. This functionality is comparable to Windows' Platform/Invoke and Python's ctypes. Access is dynamic at runtime without code generation.

JNA allows you to call directly into native functions using natural Java method invocation. The Java call looks just like it does in native code. Most calls require no special handling or configuration; no boilerplate or generated code is required.

The JNA library uses a small native library stub to dynamically invoke native code. The developer uses a Java interface to describe functions and structures in the target native library. This makes it quite easy to take advantage of native platform features without incurring the high overhead of configuring and building JNI code for multiple platforms.

While some attention is paid to performance, correctness and ease of use take priority.


http://www.jinvoke.com/
J/Invoke - easy Java native interoperability

J/Invoke enables Java developers to easily invoke native methods (such as the Win32 API or C-based Windows DLLs and Unix dynamic libraries) with pure Java code.

Unlike error-prone JNI programming that is hard to use and deploy, J/Invoke lets you access native libraries by simply declaring native methods, and calling them from pure Java.

Java programmers can save time, avoid errors and increase productivity by using J/Invoke to

* Call native libraries from pure Java, without using JNI
* Use OS features and APIs (like the Win32 API), not available through Java
* Integrate Java applications with native libraries (Windows DLLs, Mac OS X, Linux and Solaris dynamic libraries)
* Provide Java API for native DLLs or other non-Java libraries

Do all this and more with pure, simple Java - no need to mess with C/C++ programming with error-prone and hard to use JNI, deploying intermediate DLLs, and dealing with parameter conversions between Java and native types.


Q: Хм.. Для меня системное программирование — это программирование систем, возможно операционных!

A:
1) http://www.jnode.org/
Java New Operating System Design Effort.
JNode is a simple to use & install Java operating system for personal use.
It runs on modern devices.
Any java application will run on it, fast & secure!
(open source, LGPL)

2. http://en.wikipedia.org/wiki/JavaOS

3. http://www-jpc.physics.ox.ac.uk/
JPC is an x86 PC emulator written entirely in Java. Open Source!
АААААААААААА111111111111!!!!!!!!!!!!

Researchers at Oxford have built an x86 emulator that runs purely on Java, making it ideal for security researchers who want to analyze and archive viruses, host honeypots and defend themselves against buggy or malicious software without hosing their machines. The JPC also emulates a host of other environments, giving technophiles the ability to play Asteroids and other software that's sat on shelves for years collecting dust.

What's more, JPC will run on any device with a Java virtual machine, so cell phones, set-top boxes and RISC systems are all fair game, according to researchers in the university's physics department, where the project was developed.

"Some might see JPC as part of a nefarious plot by mad scientists who want to harness every last CPU in the world for their research - but we prefer to see JPC as Java-hardened protection against their buggy programs," they say. JPC's Java-based architecture gives it cross-platform capability, the security of running code in the Java sandbox and the flexibility of configuring virtualization platforms and software libraries.

The researchers boast its x86 emulation, at 10 per cent native speed, puts it among the fastest x86 emulators. (Note: an earlier version of this story incorrectly reported JPC emulated other environments.)

Весь креатив в Москве...

Дорога на Абаву


Вероятно с Белорусского вокзала...

2007-11-17

Дешевый межгород с sipnet.ru

Все необходимое для подключения, настройки и контроля находится на страничке http://www.sipnet.ru/

Прежде всего нужно зарегистрироваться:
https://customer.sipnet.ru/cabinet/register
тонкости:
  • нужно заполнять все поля (можно совершенно левой информацией, главное заполнить и запомнить Имя/Логин, Пароль, Электронная почта т.к. туда придет активация и Контрольное число)
  • даты вводятся в формате дд/мм/гггг. Пр: 23/02/2007
После регистрация на указанный email придет письмо с ссылкой для активации (проверка что вы не робот).

После этого вы можете заходить в свой "личный кабинет": справа-внизу на главной странице http://www.sipnet.ru/ есть поля для ввода имени и пароля.

В личном кабинете наверху указан ваш SIP ID - по сути ваш "номер телефона". Например мой: 2983927
На него можно позвонить из других SIP сетей в Internet набрав:
2983927@sipnet.ru
Внимательно запишите его на бумажку т.к. именно его надо указывать для зачисления денег на счет в Евросети.

В личном кабинете идете в раздел: Скачать файлы.
Выбираете SIPpoint (Программный агент для SIPNET). Скачиваете, запускаете для установки.

Запускаете SIPPoint. Заходите в Файл|Параметры.
Вводите ваш SIP-адрес: sipid@sipnet.ru, в моем случае: 2983927@sipnet.ru
Учетное имя: sipid, в моем случае 2983927
Пароль: пароль указанный при регистрации
OK. После чего телефон должен зарегистрироваться на сайте - иконка станет зеленой и в строке статуса будет "В сети".
Переходите на закладку "Телефоны", вводите номер в формате код_страны код_города номер, например: 74951234567 или 79173411111 и звоните, звоните, звоните!

У них идет акция и звонки на стационарные телефоны
Россия, Москва $0.000
Россия, Санкт-Петербург $0.000
На счету сразу есть 1$, но я рекомендую положить туда рублей 100. Иначе иногда в разговор будет вставляться реклама ;-)
Чтобы позвонить другому пользователю SIPNET, например мне, надо набрать его sipid.

Для качественной связи нужна гарнитура (наушники и микрофон) или USB-телефон (продаются в той же Евросети), например такой: http://skypemate.ru/catalogue/?wid=4 .

Если SIPPoint Вас утомит, то есть другие варианты программных телефонов:
http://www.sipnet.ru/orderandpay/software.html

Инструкция по их настройке есть в Internet, но по сути главные параметры там: sipnet.ru, sipid@sipnet.ru и пароль.

PS: не забывайте о том, что голос генерирует довольно большой трафик. Многое зависит от того, куда и с какого телефона Вы звоните. Поэтому рекомендую провести несколько тестовых звонков, чтобы оценить качество и посмотреть какой счет выставит Вам Ваш Internet-провайдер.
Скорее всего, на текущий момент развития Internet в России, качество будет приемлимым, а совокупная стоимость звонка (плата sipnet + плата за трафик) заметно ниже стоимости такого же звонка с городского или мобильного телефона.