← All posts tagged Java

Сколько я времени потратил на неправильно написанные JNI названия функций на C стороне! Мама! Просто дофига. Программа на андроеде крешится в рантайме оттого что не находит ф-ю.

А петонисты и пхп-шники, а еще жабоскриптеры живут в этом и для них норм. Кошмар.



Я свичнулся с Жабы на Котлин в основной разработке.
Основная причина проста: просто приятна обновка.
Всякие фичи Котлина прекрасны. К Жабе претензий тоже нет — изумительный язык. Я не страдаю от ее многословия.
Можно назвать множество причин переключения — фич ради, конечно.
Но основная — это просто что-то новое, просто новизна, которая будит уснулую часть мозга, которая уже сделала свое дело, доведя до автоматизма свою часть работы — выражение себя на жабе — и спала уже давно.
Это могла быть и Скала, — Скала просто прекрасна, — но Скала более неудобная в работе: из-за ее гениальной разноликости она чересчур тормозит в инструментарии (компилятор, IDE), что начинает напрягать через некоторое время. Это чувствует и Одерский, который пишет другую, несовместимую версию Скалы, более шуструю.
Больше пока вариантов нет. Остальные либо тормозят в рантайме, либо без статической типизации, либо без tools.

Открыл для себя Vert.x, плюс Kotlin = полностью асинхронное всё: http сервер, https (!!) клиент, кафка, постгрес, вебсокеты уже то понятно. В котлине 1.1.1 все на корутинах.. прямо скала. Адопшн кажется будет побольше чем у скалы, поэтому ожидаем вскорости бум. С небольшим набором корутинных врапперов пишем буквально следующее:

    suspend fun graphAPI(request: String, access: String) : JsonObject {
        val resp = VX.getJson("https://graph.facebook.com/v2.3/$request&access_token=$access")
        when(resp.statusCode) {
            200 -> return JsonObject(resp.response)
            else -> throw IOException("Facebook invalid response: "+resp.toString());
        }
    }

        when (req.path()) {
            "/register_server" -> {
                exec("delete from other_servers where ip_address=${v(param("ip"))}")
                exec("insert into other_servers(ip_address, hostname) values(${v(param("ip"))},${v(param("host"))}) ")
                commit()
                output(JsonObject(Pair("result","OK")))
            }

(во втором куске кода sql bindings безопасные если шо)
(может можно кое что еще проще, пока не знаю как)
(обработка ошибок, выделение коннекшнов, транзакциы всякие итп - все снаружи)
(ексепшны в котлине отлично дружат в асинхронном коде)
(а и не скажешь, что асинхронный, верно?)

21 век настал.

Пишут, что Эклипс (www.eclipse.org) загнулся, в том смысле, что его пользуют уже меньше людей чем IDEA.

Для меня вообще удивительно, что оно так долго тянулось. Уже 10 лет назад как должно было рухнуть. Не было ни единого момента со времени выхода IDEA 1.0 до сегодняшнего дня, чтобы Эклипс был хоть в чем-то лучше ИДЕИ для программирования на жабке.

via proggit — reddit.com

Сегодня узнал, что нелюбители SQL дошли в Spring Boot / JPA до такого, что теперь вот есть метод

interface <SomeTableEntity> {
long countByTimeBetweenAndSomeLengthGreaterThan(Date date, Date date1, int i);
}

И оно во время стартапа автоматически парсит имя метода (!!!) и догадывается, какое where надо написать, и генерит код, который генерит SQL

select count(*) from SomeTable where time between :date and :date1 and some_length > :i

Наверное спека какая-то есть, хез. С ума сойти, еще ж можно сгенерировать имя метода прямо голосом через распознавание голоса, совсем офигели.

Cпонсор этого пста — производительность application серверов на стартапе (когда это все генерится) и в рантайме, когда вместо одного большого оттюненного селекта вызываются тысячи этих мелких методов, и когда "здравствуй рефакторинг" говорят рефакторщики и сразу по результатам "до свиданья, показатели производительности" говорят чуваки с БД.

UBER (таксисты), ихний CTO плачет и кается, плачет и кается.

Начали "как положено" хипстерам, на Node.js + Json, но говорят, что внезано "unexpected cost of untyped json interfaces" когда дофига сервисов, короче, очень тяжело им. Ни в село, ни в красную армию.

Карочи, таперича у них движняк в сторону go/java, typed interfaces (свой RPC протокол), короче sanity постепенно comes back.

(По материалам infoq.com )

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

Дао изреченное — не есть дао. Иллюстрация номер один.

v8project.blogspot.com

А вот когда в жабоскрипт введут опциональную типизацию и напишут (только благодаря этому! потому что смогут!) на нем наконец-то серверный Spring (springframework.org), он будет медленнее запускаться (startup) чем жабовый или быстрее? Вангую что к тому времени процессоры подтянутся и будут все те же 30-40 секунд.

Продолжение драмы про то как MS закопал RoboVM и в продолжение к моему посту #2828904

Да, как я и предсказывал, вся команда осталась работать на MS/.NET, источник — twitter.com

Да, как я и предсказывал, афтар строит из себя дерево и отмазывается тем, что их прикрыли "because they didn't sell enough licenses to make it profitable for Xamarin" — reddit.com

Да, пользователи на форуме жалуются: "чувак, мы писали 2 года нашу игру, завтра релиз, ты и твои приятели получили бабла от продажи лавки Xamarin-у, и нас кинули, как же так чувак? <8-o ". Чувак рекомендует переводить все на дотнет, не медля и дня.

pbs.twimg.com а это сам афтар, "OOPS!" говорит нам его фотография.

Таковы судьбы людские в жерновах капитализма.

Когда RoboVM (компилятор жабы для iOS) был куплен Xamarin-ом, все удивленно подняли брови и заподозрили неладное, потому что Xamarin это .NET, и жаба там ну вообще никуда. Ребята из RoboVM говорили, что это всё для общей пользы, для концентрации на дальнейшем развитии итп.

Когда MS некоторое время спустя купил Xamarin, все огорченно вздохнули и стали ждать неизбежного, а кто был с верой в доброту, тот спрашивал "как-то они там будут? надеемся на лучшее". Ребята из RoboVM говорили что-то там такое, но их никто не слушал.

Когда сегодня объявили о том, что MS убил RoboVM, как-то появилась определенность. Товарищи из LibGDX вон даже расписали план badlogicgames.com , а товарищам из Интела надо готовиться нести тяжкое бремя ответственности. Ребята из RoboVM не знаю, что там щас говорят.

Я с верой в доброту, и мне интересна судьба форка RoboVM, который полнофункциональный, но без некоторых важных фишек. Чо там коммьюнити? Что там главный афтор? Как-то он теперь людям в глаза смотреть будет? Может у них там какой рейдерский захват случился, афтор будет плакаться прилюдно что его кинули? А может МС ему бабла отсыпал для работы над iKVM или над Mono/iOS, и начальником поставил, и он теперь навостряет лыжи в новом направлении?

Интересны людские судьбы в жерновах капитализма. Ну и новые технологии, конечно.

Дооптимизился компилятором CN1 (микро-оптимизациями) до усрачки, но дальше уже нужно оптимизировать алгоритмы сверху, и поэтому перестал 8)

Заценил оптимизатор LLVM/CLANG (кстати уперся в его глюк и забил — он дожонглировался регистрами: пишет через один offset register, читает через другой через некоторое время, а смещение-то не сходится!).

На картинке сгенерированный код по симуляции стека и результат его компиляции для ARM. Так эта скотина все SP++ и SP-- вычисляет, и даже не изменяет сам регистр, а только индекс при регистре, когда выполняет последовательность операций. Получается тупа куча mov без inc/dec. Очень было приятно видеть такой уровень оптимизации, я доволен прогрессом в этой сфере. Микро-оптимизировать сишечку в таких условиях становится сложновато.



Шланг полтора часа уже компилит:

ID COMMAND %CPU TIME #TH #WQ #PORT MEM
10504 clang 97.4 95:07.42 1/1 0 12 137M

Я немного пригрузил егойный регистровый аллокатор. Там есть один метод....

BC_DUP(); / DUP /
PUSH_INT(73);
PUSH_INT(7);
CHECK_ARRAY_ACCESS(3, SP[-2].data.i); / IASTORE / ((JAVA_ARRAY_INT*) ((JAVA_ARRAY)SP[-3].data.o).data)[SP[-2].data.i] = SP[-1].data.i; SP -= 3; BC_DUP(); / DUP */
PUSH_INT(74);
PUSH_INT(17);
CHECK_ARRAY_ACCESS(3, SP[-2].data.i); / IASTORE / ((JAVA_ARRAY_INT*) (*(JAVA_ARRAY)SP[-3].data.o).data)[SP[-2].data.i] = SP[-1].data.i; SP -= 3;
BC_DUP(); / DUP /
PUSH_INT(75);
PUSH_INT(0); / ICONST_0 /
CHECK_ARRAY_ACCESS(3, SP[-2].data.i); / IASTORE /
((JAVA_ARRAY_INT*) (*(JAVA_ARRAY)SP[-3].data.o).data)[SP[-2].data.i] = SP[-1].data.i; SP -= 3;
BC_DUP(); / DUP /

Вот такого добра среднее количество, штук 800, и шланг собирается SP сделать регистровой переменной (я его убедил наконец-то).

Не, ну я, конечно, в таких методах не буду больше на этом настаивать, мне как-то долговато ждать билда.

Мавен (maven) не умеет в локальную директорию с jar файлами. Из всего что нашел, нужно каждый jar описывать отдельными 10 строчками.

А некоторые ДОБРЫЕ люди советуют сложные заклинания (команду с ДОСТАТОЧНО длинными аргументами) как проинсталлировать любой jar в project-local maven repo и потом, вуаля, просто сослаться на него из .pom файла. Предлагают затем этот maven repo коммитить в GIT. Нет, у меня всё еще не настолько плохи дела.. К тому же эти jars приходят из legacy project в соседней директории.

Ойблин, читаю sebastiansylvan.com там чувак говорит что C# вовсе не такой уже быстрый, даром что у него есть stack allocation и соответственно value types (структуры)

А я C# не знаю. Но слышал, что там есть stack allocation. Но вот то, что этот чувак пишет, заставило меня плакать, потому что в C# этот stack allocation недоделан, то есть нельзя передать ссылку на аллоцированный объект! И pass by value тоже недоделано, потому что нельзя один и тот же тип и в куче и на стеке! И коллекции value types тоже недоделаны, потому что опять таки нельзя взять указатель на элемент. Короче, C# это такой язык "нате жрите свои value types, но вы подАвитесь", и поэтому value types все без толку там.

А я C# раньше немного заочно завидовал как жабист. А теперь перестал 8)))) Потому что нафиг мне такой локоть, который не укусишь, и он токо бесит 8). Если в жабе сделают value types, то их там сделают более правильно, а не для галочки (чур женерики не вспоминать).

Читаю дальше...