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. Откуда взял он, не скажу сразу так :) Но список мне показался очень интересным, многое от туда не знал.

Monday, December 10, 2007

Microsoft Volta - Microsoft's answer to GWT?

Сегодня наткнулся на довольно таки интересный проект от Microsoft - Volta. В описании много слов, но основное "The compiler creates cross-browser JavaScript for the client tier, web services for the server tier, and communication, serialization, synchronization, security, and other boilerplate code to tie the tiers together". Ничего не напоминает? Ах да, это же концепция старого доброго GWT.

После более детального ознакомления с документацией я всё больше и больше находил схожие концепции GWT и Volta.

Итак, Microsoft таки решилась дать ответ Google. Я пока не сильно вникал в подробности реализации и кодинга, но не смотря на схожесть концепции, различия таки есть. И довольно существенные - Volta имеет более сильную привязку к серверной составляющей, в то время, как код, генерируемый GWT может быть запущен с любым бэк-ендом (Java/PHP/ASP.NET/...) или вообще без сервера.

Что-ж. Ответ есть. Значит будем смотреть-пробовать. Время, как всегда, рассудит.



UPDATE: Посмтрел на самое типа простое демо-приложение Quickstart (ВНИМАНИЕ: Читайте UPDATE2 до открытия ссылки). С помощью HTTP Explorer'а отследил то, какие запросы идут на сервер и какие ответы и ужаснулся. Нет, это совсем не смешно. Вот что получислоь: трейс запроса. Если для загрузки такого маленького приложения пришлось сделать 133 запроса и получить около 2.2мб данных, то такой фреймворк требует ещё очень большой доработки. Бета-версия моего посиковика на GWT (lab.look.org.ua) занимает около 140кб в сумме (с картинками и стилями) и к серверу отсылается аж 6 запросов (или 16 с картинками и стилями). И это на GWT 1.3 (в GWT 1.4, как говорят, уменьшился генерируемый код на 15-20%). Итак, если Volta не будет оптимизирована, то чтоб использовать её надо будет очень хорошие сервера, хорошие каналы и хорошие клиентские машины. В то время, как GWT проводит довольно активную работу над оптимизацией размера кода, уменьшению количества запросов и т.д. Посмотрим, сможет ли Microsoft догнать GWT по этим параметрам, или будет как всегда выигрывать рекламой и маркетингом, а не эффективностью и производительностью?

UPDATE2: Многие знакомые жалуются, что у примеры прилоежний Volta вешают и крашат броузера (FF2, IE6, IE7). У меня FireFox хоть и на пару минут задумался, но потом отвис, хотя IE крашанулся полностью (проц АМД Х2 4600, 2гиг памяти). Так что предупреждение всем: если много открытых закладок и боитесь потерять, лучше или не открывайте их или открывайте в другом инстансе броузера или другим броузером.

UPDATE3: Вот ещё некоторые ссылки по теме:

Monday, December 3, 2007

Google's Andriod: Threat to Java?

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

Что же за зверь такой, этот Андроид? Конечно первая OpenSource ОС для мобильных телефонов - звучит гордо, но настолько ли это хорошо для софтверного бизнеса в целом? Время покажет.

Thursday, November 1, 2007

FAR 1.80: Unicode and OpenSource

Я как-то пропустил, что 26ого октября мой любимый файловый менеджер перешел на модифицированную лицензию BSD и стал OpenSource'овым. Кроме того, в новых версиях (1.80+) обещают поддержку unicode и некоторых новых фичей Windows Vista (к сожалению, поддержка UAC, кроме как через манифест не будет добавленна).

Так что сбрасывать со счетов старый добрый FAR пока не стоит!

Более детальная информация о новом FAR-е.