LINUX.ORG.RU

Джеймс Гослинг об Apple, Apache, Google, Oracle и о будущем Java

 gosling, , , ,


0

2

Опубликована видеозапись недавнего выступления Джеймса Гослинга, автора языка Java, на встрече, организованной пользовательскими группами Web Java и JavaFX Кремниевой долины.

Среди прочего, Гослинг затрагивает следующие темы:

  • его уход из Oracle,
  • развитие Java под управлением Oracle,
  • использование Java в Android,
  • прекращение поддержки Java компанией Apple,
  • отношения между IBM и Oracle,
  • беспокойство Apache Software Foundation,
  • его занятия в последнее время,
  • другие языки программирования и технологии,
  • будущее Java.

>>> Видео (flash)

★★

Проверено: maxcom ()

>>> Видео (flash) спасибо за подсказку что флеш. даже смотреть не стал. Пожалуйста все так указывайте во флеше или нет.

peanut
()
Ответ на: Тезисы от Fice

Спасибо за тезисы.

iZEN ★★★★★
()
Ответ на: Тезисы от Fice

Спасибо. Надо это прямо к тексту новости добавить.

Teak ★★★★★
()
Ответ на: комментарий от oami

А альтернативы для веб-программирования на Java какие - чистые сервлеты?

XSL как вариант. Ну или Freemarker, но это сильно ближе к JSP

dizza ★★★★★
()
Ответ на: комментарий от anonymous

Необходимость преобразования типов в ООП - явный признак дурной архитектуры..

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

Пример абстрактный:

class A
{
  //...
  void setB(B* b);
  B* getB();
  //...
};

class B
{
  //... 
};

class C : public B
{
  //...
  void doSmth();
};

//...
C* c = new C();
a->setB(c);
//...
B* b = a->getB();
b->doSmth(); // Упс, так низя.

Как обойти? Особенно если нет доступа к реализации классов A и B, чтобы расширить интерфейс B. Проще всего:

C* c = dynamic_cast<C*>(a->getB());
if(c)
  c->doSmth();

Как это сделать без кастинга? Чтобы вот так же просто.

Этот пример можно отобразить на MVC, где A - view, а B - model.

qewerty
()
Ответ на: комментарий от Fice

> Все эти лишние сущности в CLR заставляют при разработке нового языка для платформы городить кучу лишнего синтаксиса и лишней семантики для доступа ко всему этому (для полноценного взаимодействия с библиотеками).

Да и никто не мешает использовать другие языки для JVM, например, Scala.

Взаимоисключающие параграфы детектед.

tailgunner ★★★★★
()

Да, кстати интересно, откуда ненависть к jsf? я еще понимаю про jsp и смесь кода и представления, но в jsf этого нет и в помине (особенно если использовать facelets как view).

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

В jsf это тоже можно делать. И расширения jsf писать уж слишком муторно, даже со всякими удобствами типа richfaces cdk.

svr69 ★★
()
Ответ на: комментарий от senia

Недостижимый ибо слишком прожорливый.

Да ну нафиг. В конце концов можно устроить клиентское наложение, но это черевато проблемами со всякими поисковыми ботами. А вообще юзаем xsl - полет нормальный. Правда наложение xsl вне java средствами libxml.

К примеру яндекс верстает на xsl. А они там любят производительность.

dizza ★★★★★
()
Ответ на: комментарий от tailgunner

>Взаимоисключающие параграфы детектед.

эк тебя нахлобучило...

yyk ★★★★★
()

Ничего, ещё 2-3 поколения видео карт и нейросети закопают и жабу и скрытый Нет!

anonymous
()
Ответ на: комментарий от Nagwal

JSF - это Statefull. За такое нужно по почкам бить. Да и вообще таких magic-технологий вообще поискать. Тут пишем аннотацию, тут то-то, и вуаля. Жесть какая. Вон майкрософтовцы наигрались с сокрытием request-response логики и уже переходят на asp .net mvc.

dizza ★★★★★
()
Ответ на: комментарий от dizza

JSF - это Statefull. За такое нужно по почкам бить

И как тогда работать со state? В рамки stateless таки далеко не все укладывается. Или предлагаете все в сериализованном виде через субд прокидывать? Для каждого request?

Да и вообще таких magic-технологий вообще поискать. Тут пишем аннотацию, тут то-то, и вуаля. Жесть какая.

Эммм. Ничего магического я там не заметил. Или надо все на голых сервлетах делать с явным разбором HttpServletRequest и явным писанием в HttpServletResponse?

Nagwal ★★★★
()
Ответ на: комментарий от oami

А альтернативы для веб-программирования на Java какие - чистые сервлеты?

Апплеты. Можно без браузера.

iZEN ★★★★★
()
Ответ на: комментарий от Nagwal

И как тогда работать со state?

Да не нужен state.

В рамки stateless таки далеко не все укладывается.

Укладывается.

Или надо все на голых сервлетах делать с явным разбором HttpServletRequest и явным писанием в HttpServletResponse?

Зачем на голых. Spring MVC есть же. А можно и Jersey. А можно и на голых сервлетах + небольшой велосипед.

dizza ★★★★★
()
Ответ на: комментарий от dizza

JSF - это Statefull.

JSF — это не только stateful (кстати, научись правильно писать это слово), но и stateless с AJAX там, где он нужен, с помощью отдельных фреймворков. А жесть действительно в том, что программирование на Java часто превращается в правку XML и сопутствующего «добра» в этом формате, не способствующему, собственно, программированию.

iZEN ★★★★★
()
Ответ на: комментарий от Nagwal

В видео не совсем ясно, имел он в виду JSP, JSF или обе технологии. Звучит явно «JSF», но может быть оговорка, т. к. речь была о вставках «<%...%>».

Fice ★★
() автор топика
Ответ на: комментарий от dizza

В рамках задачи по написанию бложика, может и укладывается в stateless. А вот в более сложных задачах - хрен с два.

Spring MVC есть же. А можно и Jersey. А можно и на голых сервлетах + небольшой велосипед.

Угу. И там нет совсем-совсем магии с аннотациями. Конечно-конечно ;)

Nagwal ★★★★
()
Ответ на: комментарий от Fice

Ок, ясно. Я просто с gprs сижу в инете, поэтому самому посмотреть видео проблематично.

Nagwal ★★★★
()
Ответ на: комментарий от iZEN

Stateless JSF это уже жесть жестянная и именно потому:

«что программирование на Java часто превращается в правку XML и сопутствующего „добра“ в этом формате,»

С этим согласен, да.

dizza ★★★★★
()
Ответ на: комментарий от Nagwal

А вот в более сложных задачах - хрен с два.

Весь мир кроме java (jsf) и .net (asp .net) пишет на stateless. Кроме того возня со стейтом приводит к говну вроде репликации http-сессии в кластере и тормозам.

Угу. И там нет совсем-совсем магии с аннотациями. Конечно-конечно ;)

Дело не в самих аннотациях. Если бы вместо них был xml, то было бы все тоже самое. «Магия» спринга не идет в разрез с семантикой.

dizza ★★★★★
()
Ответ на: комментарий от dizza

Весь мир кроме java (jsf) и .net (asp .net) пишет на stateless. Кроме того возня со стейтом приводит к говну вроде репликации http-сессии в кластере и тормозам.

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

Дело не в самих аннотациях. Если бы вместо них был xml, то было бы все тоже самое. «Магия» спринга не идет в разрез с семантикой.

А магия jsf идет? Где?

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

а это... я, впрочем, кроме оракловой базы последние три года ничего и не использовал... но разьве в ansi sql нет оператора case ?
вытащить отображаемое имя клиента по его id можно вроде бы в один запрос на бд и вызываться он будет из спинга коротко и красиво без вот этого вот месива...

marx
()
Ответ на: комментарий от dizza

> Да не нужен state.

Ты просто не умеешь его готовить :D
И да, state нужен *далеко не везде и в ограниченном количестве*.

Ничего личного, но я обычно сталкивался с людьми (коллеги) которые о jsf кроме того что там есть state ничего не знали и только и делали что открещивались от его использования городя один за другим еще более страшные велосипеды, зато свои :D
А jsf, между тем, очень мощная штука, даже на версии 1.1 можно было в те времена сделать модный нынче «conversational scope» за несколько дней (переопределив штук 5 классов).

p.s. Если уж упрекнут в фанатизме - мне пофигу, у меня есть успешные проекты и на jsf и на gwt и на голых сервлетах и на целом ряде таких (чужих) велосипедов, что любой open souce framework вам раем покажется :D

marx
()
Ответ на: комментарий от marx

Там в зависимости от результатов первого запроса должны выполняться совершенно разные запросы в совершенно разные таблицы (таблица юр. лиц вообще с помощью dblink подцеплена). Case это умеет?

Nagwal ★★★★
()
Ответ на: комментарий от qewerty

>>Необходимость преобразования типов в ООП - явный признак дурной архитектуры..

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

В некоторых запущенных случаях, видимо, собственный мозг это большее зло.. Попробуй положится на мнение Страуструпа и Гради Буча... Или тут из «окопа кричать ура» легче. И данный пример уровня с притянутыми предположениями: если-вдруг-отсутствуют-исходники - этот пример вообще не нужен.. А может завтра тебе кирпич упадет на голову.

anonymous
()
Ответ на: комментарий от LongLiveUbuntu

Oracle Database написана на Java и использует модифицированную JVM.

Вот database то у оракла как-раз и не на жабе. На ней там только обвес в виде инсталятора, центра администрирования и непонятно зачем встроенного oc4j.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

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

select 
  m_order_number,
  case 
    when m_order_number < 4 then (select m_full_name from cls_payment_type x where x.m_order_number = t.m_order_number)
    else (select m_full_name from cls_owner_type y where y.m_order_number = t.m_order_number)
  end as display_name
from cls_payment_tool t

dblink не использовал, т.к. я не ораклоид по роду занятий, просто на sql себе запросы иногда делаю. но глянул в доку - написано что можно select/insert/update гонять вообще как будто это одна и та же база.

marx
()
Ответ на: комментарий от Nagwal

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

jvm в базе еще используется т.к. хранимки можно на java написать :D

marx
()
Ответ на: Тезисы от Fice

огромное Спасибо!

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

Bladimir
()
Ответ на: комментарий от marx

Угу, я уже почитал про case. Действительно можно было одним запросом обойтись вместо трех и не городить такой тихий ужас. Но вообще я приводил этот кусок быдлокода скорее как пример того, что на замыканиях все это выглядело б гораздо читаемее.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

как выход пытаться именовать внутренние классы, но не всегда помогает =(
замыкания хочется конечно в джавку.

marx
()
Ответ на: комментарий от anonymous

Никто не хочет тратить время на обиженных отсутствием транскрипта.

anonymous
()
Ответ на: комментарий от marx

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

Nagwal ★★★★
()
Ответ на: Тезисы от Fice

Спасибо за «переклад»

pinachet ★★★★★
()
Ответ на: комментарий от Nagwal

* Явное приведение к String (неужели нет нормального API, что вернет String сходу?)

* всякие богомерзские '(SqlDao) getBean(«sqlDao»);' вместо параметра метода или поля класса

* «String result;», куча кода и потом одинокий «return result;» в конце (что, просто return сделать не судьба?)

* нет проверки на возвращаемое значение в «rs.next()»

Вашему коду делегаты ничем не помогут, даже не надейтесь.

rtvd ★★★★★
()
Ответ на: комментарий от rtvd

* Явное приведение к String (неужели нет нормального API, что вернет String сходу?)

Нету. В более поздних версиях spring jdbctemplate вроде появилось, но там был 1.2 и поменять его было нереально. Приходилось писать так.

* всякие богомерзские '(SqlDao) getBean(«sqlDao»);' вместо параметра метода или поля класса

Корректно инициализированный dao можно было получить только дергая этот getBean(String name). Там вообще все брутально было... интырпрайз однако.

* «String result;», куча кода и потом одинокий «return result;» в конце (что, просто return сделать не судьба?)

Внимательнее смотри, result инициализируется разными значениями в зависимости от условия.

* нет проверки на возвращаемое значение в «rs.next()»

Оно гарантированно не null. А если оно null, то база в неконсистентном состоянии и из кода мы хрен чего сделаем.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

А сейчас приходится извращаться. пример быдлокода на анонимных классах:


Классический быдлокод, и «специалистам» которое такое пишут никакие далегаты не помогут, поможет только принудительная кастрация.

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

Классический быдлокод, и «специалистам» которое такое пишут никакие далегаты не помогут, поможет только принудительная кастрация.

Доброта так и прет =))) На самом деле писать можно как угодно. Главное в момент написания говна - понимать что это говно. И исправлять его до внесения в систему контроля версий.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

И пишет свои велосипеды для протаскивания этого state между запросами, в основном сводящиеся либо к ручному пропихиванию данных в сессию,

Как же вы блин задолбали со своим квадратно-вилочным мышлением. Сложные вещи решаются ТОЛЬКО ВЕЛОСИПЕДАМИ. Я не знаю какими нужно быть ограниченными, что бы не знать, что в том же яндексе или mail.ru пришлось разрабатывать свои файловые системы. А ты тут про велосипеды для хранения стейта заливаешь. Мыслить нужно шире. То, что какая-то хрень за тебе решила сложную задачу, еще не повод радоваться. Завтра проект вырастет чуток и будешь всю эту быдляцкую интерпрайзную херь выковыривать.

Даже лень разжовывать. Но все же попробую вкратце

в основном сводящиеся либо к ручному пропихиванию данных в сессию,

Нет, от этого нужно как раз уходить.

либо в сохранению его в субд на каждом шаге и последующем доставании оттуда на шаге следующем

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

Где еще хранить полномочия пользователя?

Не поверишь - в thead local переменной. И совать его по кукам. Кука - это тоже стейт. Но это редкое исключение. И оно http-шное. REST херня по сути, но здравые мысли там есть.

А магия jsf идет? Где?

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

dizza ★★★★★
()
Ответ на: Тезисы от Fice

> Oracle не навредит Java, иначе им самим крышка.

Эх, если бы только эта логическая цепочка была бы верной для любых продуктов любых корпораций...

sv75 ★★★★★
()
Ответ на: комментарий от dizza

Как же вы блин задолбали со своим квадратно-вилочным мышлением. Сложные вещи решаются ТОЛЬКО ВЕЛОСИПЕДАМИ....

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

По крайней мере такое решение кластеризуется из каропки.

Кластеризируется оно ровно до того момента, как начинает затыкаться база. А поскольку обычно база затыкается раньше всего остального то разговоры про кластеризируемость такого решения - ложь, пизд...ж и провокация.

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

И чем кластеризация данных в мемкеше принципиально отличается от кластеризации http сессии? Хоть одно отличие найди.

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

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

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

В этом коде нарушено очень много всего. Я бы от своих орлов попросил бы переписать на нечто подобное с учётом того что я не знаю что это для фреймворк для sql и для какой java ( 1.4.2)

[code=java]
public String getServiceClient(final Service service) {
      final Integer result = (Integer) execute(SQL_GET_CLIENT, service, new OneRowResult() {
         protected Object getValue(ResultSet rs) throws SQLException, DataAccessException {
            return new Integer(rs.getInt(«IS_ORG»));
         }
         protected Object noDataResult() {
            throw new NoDataException();
         }
      };
      
      final String sql;
      final OneRowResult method;
      if ( result.intValue() == 1 ) {
         sql = SQL_GET_CLIENT;
         method = new OneRowResult() {
            protected Object getValue(ResultSet rs) throws SQLException, DataAccessException {
               return rsi.getString(«C_INN») + ", " + rsi.getString(«C_NAME»);
            }
            protected Object noDataResult() {
               log.debug(«====== No legal client found for service: » + service.getRegistrationNumber() + " (" + service.getId() + ")");
return null;
            }   
         };
      } else {
         sql = SQL_GET_PERSONINFO;
         method = new OneRowResult() {
            protected Object getValue(ResultSet rs) throws SQLException, DataAccessException {
               return rs.getString(«LASTNAME») + " " + rs.getString(«FIRSTNAME») + " " + rs.getString(«MIDDLENAME»);
            }
            protected Object noDataResult() {
               log.debug(«====== No phisical client found for service: » + service.getRegistrationNumber() + " (" + service.getId() + ")");
               return null;
            }
         }
      }
      return (String) execute(sql, service, method);
}

private Object execute(final String sql, final Service service, ResultSetExtractor e) {
   final SqlDao dao = (SqlDao) getBean(«sqlDao»);
   return dao.getTemplate().query(sql, new Long[]{service.getClient().getId()}, e);
}
[/code]

Что поправлено
Анонимные функция меленькие и прозрачные.
Из анонима вызывают анонима только для суицида.
Поправлено ООП - OneRowResult который будет заведовать вызовом rs.next проверкой значения и вызовом метода noDataResult, если ничего нет, использование final модификаторов для неизменяемых переменных.

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

Это сходу.
Так же надо быдет разделить на методы первый вызов и второй возможно упрятать new OneRowRsult() в методы, оберyть ResultSet в типизованную оболочку, чтоб исключить вызовы со строками getSome(«name») плохая практика ну и т.п.

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

Фреймворк для sql там используется spring jdbctemplate очень древней версии, 1.2 по-моему. Жаба 1.4, встроенная в Oracle десятый под AIX. Точнее сейчас не скажу, поскольку уже давно работаю в другом месте и доступа к исходникам и системе у меня нет.

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

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

А поскольку обычно база затыкается раньше всего остального то разговоры про кластеризируемость такого решения - ложь, пизд...ж и провокация.

Поэтому сразу нужно думать о шардировании. Кстати тут всяки гавно фреймворки тоже идут лесом.

И чем кластеризация данных в мемкеше принципиально отличается от кластеризации http сессии? Хоть одно отличие найди.

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

dizza ★★★★★
()
Ответ на: комментарий от dizza

>Я не знаю какими нужно быть ограниченными, что бы не знать, что в том же яндексе или mail.ru пришлось разрабатывать свои файловые системы.

Чочо?

anonymous
()
Ответ на: комментарий от anonymous

Вот такие дела. Серьезные дяди пишут кастомный файловые системы, супер быстрые субд, пишут кучу приблуд для репликации бд, патчат мускуль, патчат всякие питоны. А школоло вроде публики с лора быдлокодят на «стандартных решениях» и кричат про неприменимость лиспа (CL), так как там видите ли нету батареек.

dizza ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.