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