Friday, August 29, 2008

GWT 1.5 Released

Наконец-то произошел давно ожидаемый релиз GWT версии 1.5. Хотя релиз-кандидаты и так показывали довольно стабильную работу и обладали довольно большим списком нововведений, но официальный релиз позволяет использовать его в реальных проектах.

 

Итак, позволю себе сделать вольный перевод списка того, что изменилось с небольшими комментариями (оригинал):

Поддержка Java 1.5 и расширенная эмуляция JRE

  1. Теперь можно спокойно использовать “генерики”. И не только для более комфортной работы на клиентской стороне, но и для реализации более “тесного” RPC между клиентом и сервером (теперь можно возвращать клиенту List<MyClass> не беспокоясь о @gwt.typeArgs)
  2. Синтаксический сахарок: for-each loops, autoboxing, static import, enum
  3. Переработана архитектура подсистем (RPC, image bundles, benchmarking, интернационализация). Так же стало допустимо использование “левых” аннотаций, что позволяет повторное использование кода для других систем.
  4. Добавлена реализация разных вспомогательных классов, к которым так привыкли ява-девелоперы (StringBuilder, TreeMap, LinkedHashMap)
  5. Теперь Assertion-ы можно отключить (фактически появилась возможность делать более “релиз” версию).

 

Производительность и связь с JavaScript

  1. Компилятор более тщательно проводит “инлайнинг” функций – т.е. вместо вызова функции, код функции вставляется прямо в то место, откуда был бы вызов.
  2. Дерево переработано полностью. В результате на ИЕ прирост скорости работы от 5 до 10 раз.
  3. Добавлены типы JavaScript overlay. Это позволяет интегрировать уже написанные JavaScript библиотеки без дополнительных издержек. А так же более “прямую” конвертацию JSON данные в GWT объекты.
  4. Система “линкеров” позволяет генерировать различные варианты окончательных сборок для разных контейнеров, которые могут выполнять JavaScript (привет Google Gadgets, Filefox расширения, Greasemonkey скрипты, Gears но и … Flex и Android)

Красивые виджеты, лучшая поддержка DOM, доступность, и bi-di.

  1. Переделали демку
  2. Добавили дефолтные “темы” (раньше были только в примерах)
  3. Добавили функционал для обеспечения “доступности” (WAI-ARIA) и вывод “наоборот” (для арабских локалей например)
  4. Новый DOM package покрывает полностью спецификацию W3C – т.е. можно использовать “нативные” элементы вместо виджетов для простоты реализации.

 

…и многое другое :)

 

В общем, GWT продолжает довольно активно развивается, и этот релиз – ещё один сильный и уверенный шаг вперёд.

Tuesday, July 8, 2008

(Old) How to shoot yourself in the foot

Попалась старая ссылка о том, как стрелять себе в ногу на разных языках. Много забавного и поучительного: How to shoot yourself in the foot in any language

 

Для себя сделал выборку из самых забавных вариантов:

SQL

You spend 10 minutes figuring out how to join your hand to the gun, and then accidentally fire all bullets at all feet in the room.

PHP

You Google for "shoot self in foot" and come up with 397 howto guides. After copying and pasting the source code from each of the articles you've managed to: make a gun, shoot a gun at random passers-by, jam a gun, throw a gun, distribute guns to the poor, shoot yourself in the face, and finally: shoot yourself in the foot.

Outsourced Programming Language

You've heard of guns and bullets, but you end up just posting "kind sir, please email me the guns and bullets" to every developer forum and mailing list on the planet.

Any .NET Language: You try to use the built in ShootSelfInFootWithGun() function which looks like it does exactly what you need from the documentation but when you try to run it it complains that your foot is the wrong sort of foot.

Win32
LRESULT CALLBACK stGunProc(HGUN hGun, HGUN hGunParent, UINT uId, TPARAM tParam, UPARAM uParam, DWORD uTarg, DWORD aAmmTyp, BOOL bSaf, UNIT nCal, LPCTSTR mMfg, HANDLE hHand, LPCTSTR sErt, UINT nDist, UINT nBear, UINT nEle, UINT nMuzVel, HTARG hTarg, LPVOID lpParam);

Regular Expressions: ^((?&gt;[a-zA-Z\d!#$%&foot;'*+\-/=?^_`{|}~]+\x20*|&bullet;((?=[\x01-\x7f])[^&trigger;\\]|\\[\x01-\x7f])*&trigger;\x20*)*(?&lt;angle&gt;&lt;))?((?!\.)(?&gt;\.?[a-zA-Z\d!#$%&hole;'*+\-/=?^_`{|}~]+)+|&trigger;((?=[\x01-\x7f])[^&trigger;\\]|\\[\x01-\x7f])*&trigger;)@(((?!-)[a-zA-Z\d\-]+(?&lt;!-)\.)+[a-zA-Z]{2,}|\[(((?(?&lt;!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)&gt;)$

Friday, March 28, 2008

GWT @ UA Web 2008:

Вчера состоялся таки мой доклад на конференции UA Web 2008.

Так, как я выступал в зале "ABCD", то и все доклады я решил послушать там. Среди тех, что действительно запомнились - это про семантическую вёрстку Вадима Макеева, про веб верстание в целом Вадима Макишвили. Ну и в целом ребята из Яндекса довольно интересные доклады рассказывали.

Конечно без косяков на моём докладе не обошлось: это и пресловутая Виста, которая после того как проснулась не смогла определить проектор (хотя перед тем, как заснуть его видела), так что пришлось не на своем ноуте показывать (следственно, лишился возможность показать реальные демки), и слегка "налезщий" по времени предыдущий докладчик (следственно, пришлось немного сократить время доклада и рассказывать немного спеша).

В целом, как мне кажется, конференция вышла на довольно высоком уровне, можно было пообщаться с очень многими людьми. Что удивило, что были веб-разработчики не только из Украины и Росии, но так же из Беларуссии. Надеюсь завтра будет не менее интересно.


Ах да, вот ссыдка на
мой доклад по GWT




PDF-версия (по идее должно работать, если у кого не работает - пишите)

Wednesday, March 19, 2008

Safari 3.1: No history token support anymore

Судя по security-update письмам от Apple, в Safari 3.1 убрали поддержку "History Tokens". Эта технология используется ajax веб-сайтами для того, чтобы позволить пользователю:

а) Использовать кнопки "назад-вперёд" в привычном для него режиме

б) Позволить пользователю сохранить URL, и при навигации на него веб-приложение автоматически восстановит своё состояние (а в "true web 2.0" сайтах другого способа таки нет).

 

Цитата из письма:

WebCore
CVE-ID:  CVE-2008-1009
Available for:  Mac OS X v10.4.11, Mac OS X v10.5.2, Windows XP or Vista
Impact:  Visiting a maliciously crafted website may result in cross-site scripting
Description:  A JavaScript injection issue exists in the handling of the history object. This may allow frames to set history object properties in all other frames loaded from the same web page. An attacker may leverage this issue to inject JavaScript that will run in the context of other frames, resulting in cross-site scripting. This update addresses the issue by no longer allowing webpages to alter the history object.

 

Я проверил на своём Safari 3.1 (525.13) - действительно все сайты перестали иметь возможность менять history token. В целом, довольно плохая новость.




UPDATE: Не совсем верно - не ВСЕ сайты потеряли функционал "хистори-токена". К примеру, сайты с использованием старой версии GWT (GWT 1.3 к примеру) действительно потеряли этот функционал. Но, к примеру, официальная демка GWT с последним зарелизнутым GWT 1.4 уже полностью нормально работает: демо. Чуть позже протестирую сайты с использованием хистори-токена на ASP.NET Futures.

Sunday, March 16, 2008

GWT 1.5 milestone 1

Я как-то совершенно случайно пропустил отличную новость: Судя по сообщению Bruce Johnson в гугл-групс был обнародован первый "майлстон" GWT 1.5.

Среди самого "вкусного": The Java 1.5 syntax is fully supported, including generics, enums, nice "for" loops, autoboxing, static imports, annotations, and so on.

И ещё много чего.

Имхо для GWT это будет огромнейший шаг вперёд. Будем ждать релиза :)

Monday, March 3, 2008

Tools I'm using

Подхватывая эстафету обсуждения самых полезных тулзов, которые помогают в работе, приведу свой список:

 

  • Firefox, ну куда же без него. Основные плагины: Google Notebook - отличная интеграция (внутри окна), Firebug - для веб-девелопера лучше тяжелее найти, Web Developer - некоторые мелочи удобно и тут делать, NoScript - это не параноя, а просто удобно всегда держать под контролем.
  • Launchy - отличная тулзовина, позволяющая забыть о огромном меню "пуск" + всякие мелочи типа калькулятора, быстрого запуска shell'ок и т.д.
  • Thunderbird - тяжело было отвыкнуть от The Bat!, но после того, как я попробовал, никогда не вернусь. Просто удобно.
  • QIP - я перепробовал очень много (Миранда, Триллиан и ещё много всяких), но для чата хотелось что-то лёкое и удобное.
  • Google Talk - как дополнение очень удобно. За одно переводчик и нотификатор о новой мыле.
  • Google Docs - всё своё всегда (не)со мною. Удобно, всегда под рукой и быстро :)
  • GMail - после него оффлайн почтовик является просто бекап стореджем писем.
  • Google Reader - лучшей читалки для RSS просто ненайти. Особенно нравится share/star.

 

Вроде из основного всё. Если что будет ещё - дополню.

Monday, January 21, 2008

.NET becomes open source

Вот такая интересная новость. Для тех, кто следил за майкрософтскими блогами это, думаю, и не совсем и свежая новость, так как обещания были даны ещё в октябре прошлого года.

Итак, судя по посту Скотта Гатри (Scott Guthrie) в Visual Studio 2008 будет доступны исходный код (включая комментарии) таких компонент, как:

  • .NET Base Class Libraries (including System, System.CodeDom, System.Collections, System.ComponentModel, System.Diagnostics, System.Drawing, System.Globalization, System.IO, System.Net, System.Reflection, System.Runtime, System.Security, System.Text, System.Threading, etc).
  • ASP.NET (System.Web, System.Web.Extensions)
  • Windows Forms (System.Windows.Forms)
  • Windows Presentation Foundation (System.Windows)
  • ADO.NET and XML (System.Data and System.Xml)

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

В общем, что можно ещё сказать: новость хорошая, но из-за того, она появилась сейчас, а не годик назад, Microsoft скорее пытается догнать конкурентов, повторяя их телодвижения.

Thursday, January 17, 2008

C#: 'foreach' or 'for'?

Некоторое время назад у меня с одним моим знакомым разработчиком был разговор, в котором появился вопрос о том, насколько эффективно использовать 'foreach' для итерации по простым массивам данных. Знакомый утверждал, что 'for' эффективней из-за того, что при 'foreach' в любом случае создаётся IEnumerator и вызывается MoveNext.

Решил провести небольшой тест и рассмотреть что же получается при компиляции двух функций:

        private static void Test(string[] test)
{
foreach (string s in test)
{
Console.WriteLine(s);
}
}
private static void Test2(string[] test)
{
for (int c = 0; c < test.Length; c++)
{
Console.WriteLine(test[c]);
}
}

 


В результате мы получаем:

.method private hidebysig static void Test(string[] test) cil managed
{
.maxstack 2
.locals init (
[0] string s,
[1] string[] CS$6$0000,
[2] int32 CS$7$0001)
L_0000: ldarg.0
L_0001: stloc.1
L_0002: ldc.i4.0
L_0003: stloc.2
L_0004: br.s L_0014
L_0006: ldloc.1
L_0007: ldloc.2
L_0008: ldelem.ref
L_0009: stloc.0
L_000a: ldloc.0
L_000b: call void [mscorlib]System.Console::WriteLine(string)
L_0010: ldloc.2
L_0011: ldc.i4.1
L_0012: add
L_0013: stloc.2
L_0014: ldloc.2
L_0015: ldloc.1
L_0016: ldlen
L_0017: conv.i4
L_0018: blt.s L_0006
L_001a: ret
}

.method private hidebysig static void Test2(string[] test) cil managed
{
.maxstack 2
.locals init (
[0] int32 c)
L_0000: ldc.i4.0
L_0001: stloc.0
L_0002: br.s L_0010
L_0004: ldarg.0
L_0005: ldloc.0
L_0006: ldelem.ref
L_0007: call void [mscorlib]System.Console::WriteLine(string)
L_000c: ldloc.0
L_000d: ldc.i4.1
L_000e: add
L_000f: stloc.0
L_0010: ldloc.0
L_0011: ldarg.0
L_0012: ldlen
L_0013: conv.i4
L_0014: blt.s L_0004
L_0016: ret
}

Внимательно проанализировав этот код, можно сделать вывод, что foreach фактически не добавил ничего, кроме объявления двух ссылок - одну для переменной 's', вторую для массива (при этом вторая ссылка на самом деле инициализируется значением ссылки аргумента - т.е. на исходных массив).


Таким образом для массивов использование foreach не несёт никаких дополнительных расходов.


Подчеркну, что это справедливо только для массивов - так как если заменить параметр на IEnumerable<string> (а Resharper "подсказывает" что это имеет смысл сделать), то получаем уже намного более "тяжелый" код:


 

.method private hidebysig static void Test3(class [mscorlib]System.Collections.Generic.IEnumerable`1<string> test) cil managed
{
.maxstack 1
.locals init (
[0] string s,
[1] class [mscorlib]System.Collections.Generic.IEnumerator`1<string> CS$5$0000)
L_0000: ldarg.0
L_0001: callvirt instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> [mscorlib]System.Collections.Generic.IEnumerable`1<string>::GetEnumerator()
L_0006: stloc.1
L_0007: br.s L_0016
L_0009: ldloc.1
L_000a: callvirt instance !0 [mscorlib]System.Collections.Generic.IEnumerator`1<string>::get_Current()
L_000f: stloc.0
L_0010: ldloc.0
L_0011: call void [mscorlib]System.Console::WriteLine(string)
L_0016: ldloc.1
L_0017: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
L_001c: brtrue.s L_0009
L_001e: leave.s L_002a
L_0020: ldloc.1
L_0021: brfalse.s L_0029
L_0023: ldloc.1
L_0024: callvirt instance void [mscorlib]System.IDisposable::Dispose()
L_0029: endfinally
L_002a: ret
.try L_0007 to L_0020 finally handler L_0020 to L_002a
}


Вывод: foreach использовать можно, но надо это делать акуратно :)

Saturday, January 12, 2008

Brands: History

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

 

Названия компаний


- Adobe — названа в честь реки Adobe Creek, которая текла за дом омоснователя компании Джона Ворнока (John Warnock).
- Adidas — в честь одного из основателей Ади Даслера
- Apache — Изначально компания занималась поставкой патчей к программам. От этого произошло A PAtCHy, которое транформировалось в Apache. У индейцев есть своя версия =)
- Apple — любимый фрукт основателя компании Стива Джобса (Steve Jobs). После трех месяцев тщетных попыток найти название для нового бизнеса,
он поставил свой партнером ультиматум: Я назову компанию Apple, если к 5ти часам вы не предложите лучшего. Apples Macintosh — название сорта
яблок, продавашегося в США.
- Canon — в честь Kwanon, буддийского бога милосердия. Было изменено на Canon, чтобы избежать протестов религиозных организаций
- Casio — в честь основателя компнии Касио Тадао (Kashio Tadao).
- Cisco — сокращенно San Francisco.
- Compaq — от Comp и paq (маленькая интегрированная деталь)
- Corel — в честь основателя компании Майкла Коупленда (Dr. Michael Cowpland). Расшифровывается COwpland REsearch Laboratory (Исследовательская лабаратория Коупленда)
- Daewoo — основатель компании Ким Ву Чонг (Kim Woo Chong) назвал компанию скромно, Большая Вселенная, именно так переводится с
корейского.
- Fuji — в честь самой высокой горы Японии, Фудзи.
- Google — название произошло от слова Googol, означающее единицу со 100 нулями. А Google было написано на чеке, который основатели этого
проекта (среди которых, кстати, бывший россиянин — Сергей Брин) получили от первого инвестора. После этого они назвали поисковик именно так.
- HP (Hewlett-Packard) — основатели Билл Хьюлетт (Bill Hewlett) и Дэйв Паккард (Dave Packard) бросали монетку, чтобы решить, чье имя будет
первым в названии. Как вы понимаете, выиграл Билл.
- Hitachi — по-японски рассвет.
- Honda — имя основателя Soichiro Honda
- Honeywell — имя основателя Mark Honeywell
- Hotmail — основателю Джеку Смиту (Jack Smith) пришла идея доступа к электронной почте через web из любой точки мира. Когда Сабир Бхатиа
(Sabeer Bhatia) появился с бизнес-планом данного сервиса, он перебрал все слова, оканчивающиеся на mail и в конце концов остановился на
hotmail, так как в названии присутствовали буквы HTML (язык разметки веб-страниц).
- Hyundai — по-корейски настоящее (время)
- IBM — International Business Machines.
- Intel — Боб Нойс (Bob Noyce) и Гордон Мур (Gordon Moore) хотели назвать компанию Moore Noyce, но к тому времени уже сущестовала сеть
отелей с таким названием. Так что они решили остановиться на сокращении от INTegrated ELectronics.
- Kawasaki — в честь основателя Shozo Kawasaki
- Kodak — K — любимая буква Джорджа Истмена (George Eastman), основателя компании. Он искал слова, начинающиеся и заканчивающиеся
этой замечательной буквой. Тем более, что во всех алфавитах „K” пишется одинаково. В конце концов, было выбрано Кодак, якобы именно такой звук производит фотокамера при съемке.
- Konica — ранее известна, как Konishiroku Kogaku.
- LG — первые буквы двух корейских брэндов Lucky и Goldstar.
- Lotus — Митч Капор (Mitch Kapor), основатель компании, занимался медитацией. Отсюда и название (поза лотоса)
- Microsoft — MICROcomputer SOFTware. Изначально писалось, как Micro-Soft. Затем черточку убрали.
- Mitsubishi — придумал основатель компании Ятаро Ивасаки (Yataro Iwasaki) в 1870 году. По-японски означает Три бриллианта. Название отображено и в логотипе компании.
- Motorola — основатель Поль Гэлвин (Paul Galvin) придумал название, когда его компания начинала производство радио для машин. Многие производители аудио-компонентов в то время заканчивались на „ola”.
- Mozilla Foundation — преемник браузаера Netscape Navigator. Когда Марк Адерсен (Marc Andreesen), основатель Netscape, создал браузер на
замену Mosaic, внутри компании его называли Mozilla (Mosaic-Killer, Godzilla).
- Nabisco — изначально The NAtional BISCuit COmpany, в 1971 изменилось на Nabisco.
- Nikon — изначально Nippon Kogaku, означает „Японская оптика”.
- Nintendo — составное из 3ех японских иероглифов Nin-ten-do, которые можно перевести как „небеса благославляют тяжелую работу”
- Nissan — ранее известна, как Nichon Sangio, что означает „Японская индустрия”.
- Nokia — начиналась, как деревообрабатывающий завод, разрослась до производства резиновых изделий в финском городе Nokia.
- Novell — название придумала жена соучредителя Джоджа Канова (George Canova). Она ошибочно думала, что Novell по-французски означает новый.
- Oracle — основатели компании Ларри Эллинсон (Larry Ellison) и Боб Уотс (Bob Oats) работали над консалтинговым проектом для ЦРУ, кодовое
имя которого было Oracle. В последствии проект был закрыт, но имя осталось.
- Sanyo — по-китайски „Три океана”
- SAP — „Systems, Applications, Productss in Data Processing”, основана 4мя бывшими сотрудниками IBMа, которые работали в группе Systems/Applications/Projects.
- SCO — от Santa Cruz Operation.
- Siemens — основана в 1847 Вернером фон Сименсом (Werner von Siemens)
- Sony — от латинского Sonus (звук) и sonny (малолетка на сленге)
- Subaru — по имени созвездия. Оно же и отображено на логотипе компании.
- SUN — основана 4-мя университетскими друзьями, сокращение от Stanford University Network.
- Suzuki — по имени основателя Michio Suzuki
- Toshiba — была основана после слияния компании, специализирующейся на товарах народного потребления, Tokyo Denki (Tokyo Electric Co) и
электрокомапнии Shibaura Seisaku-sho (Shibaura Engineering Works).
- Toyota — по имени основателя Sakichi Toyoda. В последствии изменено на более благозвочное Toyota. По-японски состояло из 8 букв (счастливое
число в Японии).
- Xerox — Изобретатель Честор Карлсон (Chestor Carlson), хотел отразить в названии слово сухой (так как в то время существовало только влажно
копирование). Xer — сухой по-гречески.
- Yahoo — слово придумал Джонатан Свифт (Jonathan Swift) в книге Путешествия Гулливера. Так звали отталкивающего, омерзительного
человека. Основатели Yahoo! Джери Янг (Jerry Yang) и Дэвид Фило (David Filo) выбрали это имя, потому что сами себя называли yahooми. Однако,
сейчас название расшифровывается как Yet Another Hierarchical Officious Oracle.
- 3M — Minnesota Mining and Manufacturing Company. 

 

Список получил от bestia. Откуда взял он, не скажу сразу так :) Но список мне показался очень интересным, многое от туда не знал.