More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  Gaidar MagdanurovPhotosProfileFriendsBlog Tools Explore the Spaces community

Blog

    • View next 20 entriesView last 20 entries
    July 16

    Широкой публике открыт "Форум обсуждения терминологии Майкрософт"

    К вопросам локализации можно относиться по-разному: она может быть не нужна профессионалу, привыкшему к английской терминологии, но полезна обычному пользователю программных продуктов. Но, согласитесь, приятно, когда есть выбор пользоваться продуктом на родном языке.
    Относительно локализации продуктов Microsoft высказывали много претензий (особенно показательно выразил свое отношение посмотреть профиль Антон Борисович на прошедшей в мае в Москве конференции ReMIX), поэтому Microsoft открывает широкой публике форум для обсуждения терминологии, используемой при локализации. Теперь каждый может внести свой вклад в то, что он прочитает на экране при пользовании локализованным продуктом.
    Подробнее узнать о терминологии и нелегкой работе локализаторов Microsoft можно узнать в блоге "Терминоведение и русскоязычная терминология".

    May 19

    PowerShell на Windows Server 2008 Server Core

    Дима Сотников опубликовал подробную инструкцию по установке .NET 2.0/Power Shell на Server Core. Разумеется, этот способ установки не поддерживается Microsoft и в службе тех. поддержке вам о нем не расскажут. Но этот способ работает - у меня все получилось без проблем на виртуальной машинке с Server Core.

    Ура!

    May 12

    Очередная встреча MDNA

    Наконец-то после очень долгого перерыва состоиться очередная встреча группы пользователей MDNA - 15 мая в офисе Microsoft. Приглашаем всех желающих!

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

    Информация о встрече и регистарция здесь - http://mdna.ineta.ru/Events/EventSimpleInfo.aspx?Id=121f3bfe-df0c-4531-9d88-2e111a3e1ab5

    Регистрируйтесь и приходите!

    May 04

    PHP на Windows. Установка и настройка PHP для использования с модулем FastCGI.

    Я начинаю писать серию сообщений об установке и использовании PHP на Windows с модулем FastCGI. В этом сообщении я опишу процесс установки PHP. Согласитесь, логично установить PHP если есть желание его использовать.

    Шаг 1. Скачать PHP

    На сайте PHP.net нужно скачать последную версию PHP для Windows. Для использования с FastCGI рекомендуется устанавливать версию PHP без контроля безопасности потоков, поскольку сам модуль FastCGI гарантирует, что выполнение происходит в одном потоке и поддержка контроля безопасности потоков в самом PHP привносит лишние проверки и блокировки, приводящие к значительному падению производительности. Поэтому выбираем Non-thread-safe Win32 binaries (версия 5.2.6 актуальна на момент написания этого сообщения).

    Стоит отметить, что веряим Non-thread-safe была разработана специально для работы с FastCGI на IIS (первый релиз был в версии 5.2.1) и использовать в других средах не рекомендуется. Кстати, начиная с версии 5.2.2 Zend серьезно работает над оптимизацией производительности PHP под Windows, что не может не радовать. Если сравнить версии 5.2.1 и 5.2.2, то разницу в скорости обработки запросов можно легко увидеть с помощью простого нагрузочного теста.

    Шаг 2. Установка PHP

    Установка осуществляется совсем просто: поскольку мы скачали архив с исполнимыми файлами, достаточно развернуть этот архив (это .zip, поэтому с ним справится встроенные в оболочку Explorer архиватор). Например, установим PHP в директорию C:\Web\PHP.

    В качестве базовой конфигурации воспользуемся рекомендованными установками: cделаем копию файла php.ini-recommended в php.ini в этой же директории и откроем его для редактирования, после чего пройдем файл сверху расскоментируя следующие строки, дабы обеспечить безопасность и совместимость с большинством PHP приложений:

    • open_basedir = директория, где размещены PHP приложения.
      Указание директории ограничит права доступа к файлам PHP приложений только этой директорией. Удобно переопределять эту настройку в файлах конфиграции непосредственно для каждого приложения, однако не помешает установить эту настройку и указать корневую директорию всех PHP приложений. Например, C:\inetpub\PhpSites.
    • cgi.force_redirect = 0
      По умолчанию установлено 1, но необходимо установить в 0, поскольку IIS контролирует безопасность выполнения PHP и в этой настройке нет необходимости. Более того, включение может привести к неожиданным результатам. При использовании с другими web-серверами на Windows эту настройку необходимо включить.
    • cgi.fix_pathinfo = 1
      PHP будет устанавливать имя файла в переменной SCRIPT_FILENAME, если установить значение 0, то имя файла будет в переменной PATH_TRANSLATED, что может нарушить совместимость с большинством приложений.
    • fastcgi.impersonate = 1;
      FastCGI позволяет процессу имперсонироваться используя контекст клиента, вызывающего процесс. Этот механизм работает только под FastCGI/IIS, например на Apache на Windows это работать не будет.
    • short_open_tag = On
      Большинство приложений используют короткие теги <? ?>, поэтому будет не лишним включить их поддержку.
    • display_errors = On
      На время проверки и отладки PHP приложений на FastCGI стоит включить вывод сообщений об ошибках.

    Шаг 3. Проверка работоспособности PHP

    Пока мы не сконфигурировали IIS, проверить работоспособность интерпретатора можно просто, например, выполнив команду c:\web\php\php.exe -info > c:\test.txt

    В файле test.txt будет выведена информация о параметрах, используемых PHP.

    May 01

    Удаление дубликатов и обновление таблиц с использованием JOIN

    Я давно хотел придумать "живой" пример для удаления дубликатов и обновления таблиц с использованием JOIN, и он пришел ко мне сам собой. Только что пришлось написать небольшой скрипт T-SQL, на примере которого и продемонстрирую несколько советов.

    Задачка: есть некоторая табличка Table1, содержащая записи колонки ID1 int, ID2 int, Date datetime. В этой таблице существуют повторяющиеся пары ID1 и ID2, а дубликатов по этим парам быть не должно. Необходимо сделать несколько действий: 1) Посчитать количество дубликатов 2) Оставить только записи с самой поздней датой 3) Посчитать записи сгрупированные по ID2 и обновить поле в таблице Table2. Сама по себе логика проста - в одной таблице собираются голоса от разных пользователей, привязанные к некоторым сущностям в Table2, в самой Table2 важны два поля ID2 int и Total int, первое - идентификатор сущности, второе число строк сгруппированых по ID2 в Table1.

    Для начала посчитаем сколько у нас дубликатов:

    SELECT ID1, ID2, count(*) FROM Table1 GROUP BY ID1, ID2 HAVING count(*) > 1

    Потом сделаем выборку во временную таблицу уникальных существующих ID1 и ID2, после чего привяжем к ним последнюю дату голосования и обновим основную таблицу:

    DECLARE @UniqueTable TABLE(id1 int, id2 int, date datetime)

    INSERT INTO @UniqueTable
        SELECT id1, id2, MAX(date) FROM table1 GROUP BY id1, id2

    TRUNCATE TABLE table1

    INSERT INTO table1 (id1, id2, date)
        SELECT id1, id2, date FROM @UniqueTable

    Теперь, когда у нас есть нужный набор данных, обновим поля таблицы Table2, используя выражения UPDATE и JOIN:

    DECLARE @TempTable TABLE(id2 int, total int)

    INSERT INTO @TempTable (id2, total) SELECT id2, Count(*) AS total FROM table1 GROUP BY id2

    UPDATE table2 SET table2.total = [@TempTable].total
        FROM table2
        INNER JOIN @TempTable ON [@TempTable].id2 = table2.id2

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

    Советы по оптимизации как всегда будут приняты с благодарностью!

    April 25

    Игры с производительностью if...else и switch в JavaScript

    Решил немножко поиграть с JavaScript и тем, насколько методики по улучшению производительности работают в нем. Пробовать очевидные вещи вроде вычисляния выражений в условии цикла, приводящим к постоянным вычислениям одного и того же значения, или уменьшения повторений одинаковых выражений не интересно, поэтому я решил попробовать поиграть со switch вместо комбинаций if...else в разных браузерах (IE 7 и FireFox 2).

    Для получения результатов тестов используем простой код (Test.html):

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Test Page</title>
        <script type="text/javascript">
        function TestCode()
        {
            // <code for testing goes here />
        }
        function Test()
        {
            var i = 0;
            var total = 0;
            for(i = 0; i < 10; i++)
            {
               var sTime = new Date();
               TestCode();
               var eTime = new Date(); 
               total += (eTime - sTime);
            }
            testResults.innerHTML = (total / 10) + " ms";
        }
        </script>
    </head>
    <body>
        <div>
            <p>
                <span id="testResults"></span>
            </p>
            <p>
                <input type="button" onclick="Test()" value="Test" />
            </p>
        </div>
    </body>
    </html>

    Начнем с такого фрагмента, где используется последовательность if...else:

    var test = 5;
    var res = 0;
    var i = 0;

    for (i=0; i < 100000; i++)
    {
    if (test == 0) {res = test}
    else if(test == 1) {res = test}
    else if(test == 2) {res = test}
    else if(test == 3) {res = test}
    else if(test == 4) {res = test}
    else if(test == 5) {res = test}
    else if(test == 6) {res = test}
    else if(test == 7) {res = test}
    else if(test == 8) {res = test}
    else if(test == 9) {res = test}
    else if(test == 10) {res = test}
    }

    И сравним его с вот таким со switch:

    var test = 5;
    var res = 0;
    var i = 0;

    for(i = 0; i < 100000; i++)
    {

    switch (test) {
    case 0 : res = test; break;
    case 1 : res = test; break;
    case 2 : res = test; break;
    case 3 : res = test; break;
    case 4 : res = test; break;
    case 5 : res = test; break;
    case 6 : res = test; break;
    case 7 : res = test; break;
    case 8 : res = test; break;
    case 9 : res = test; break;
    case 10 : res = test; break;
    }

    }

    И со switch с переставленными случайно значениями:

    var test = 5;
    var res = 0;
    var i = 0;

    for(i = 0; i < 100000; i++)
    {
    switch (test) {
    case 3 : res = test; break;
    case 8 : res = test; break;
    case 7 : res = test; break;
    case 4 : res = test; break;
    case 1 : res = test; break;
    case 5 : res = test; break;
    case 10 : res = test; break;
    case 7 : res = test; break;
    case 6 : res = test; break;
    case 2 : res = test; break;
    case 9 : res = test; break;
    }
    }

     

    Вариант IE7.0.60001.18000 FireFox 2.0.0.14
    if...else 46.7 ms 52.9 ms
    switch 45.6 ms 13.8 ms
    switch 2 45.6 ms 19.6 ms

    Как видно из результатов, IE показывает стабильную производительность и не реагирует на оптимизации (и их кривизну :)). В то же время FireFox очень чувствителен к использованию switch вместо if. Теперь вот надо будет раскопать почему так происходит. Кто-нибудь может быть уже интересовался? ;)

    Выборка случайных записей

    Достаточно распространенная задача с выборкой заданного количества случайных записей во всех СУБД делается примерно одинаково, но синтаксис немного отличается. Вот, собрал для заметки способы получения 10 случайных записей в самых популярных БД.

    SQL Server

    SELECT TOP 10 Title, Text FROM BlogPosts ORDER BY NEWID()

    Oracle

    SELECT Title, Text FROM  (SELECT Title, Text FROM BlogPosts ORDER BY dbms_random.value) WHERE rownum <= 10

    MySQL

    SELECT Title, Text FROM BlogPosts ORDER BY RAND() LIMIT 10

    DB2

    SELECT Title, Text, RAND() as IDX FROM BlogPosts ORDER BY IDX FETCH FIRST 10 ROWS ONLY

    April 21

    Итнересный баг в Team System

    При попытке создать новый Team Project в Team Foundation Server, развернутом на удаленной машине, начала выскакивать ошибка TF30170: The plugin Microsoft.ProjectCreationWizard.WorkItemTracking failed during task WITs from group WorkItemTracking. Очень долго пытался найти ее корни и в результате размышлений вспомнилось следующее - раньше я использовал другой TFS сервер и во временной директории были закешированы Work Items проектов с того сервера. В результате проблему удалось пофиксить удалив папку со временным кешем: C:\Documents and Settings\ИмяПользователя\Local Settings\Application Data\Microsoft\Team Foundation\2.0\Cache.

    Веб-трансляция для архитекторов

    Коллеги попросили рассказать о веб-трансляции для архитекторов, которая может быть интересна разработчикам. Новые возможности интеграции: BizTalk Adapter Pack. Докладчик: Станислав Кондратьев, Microsoft - один из уникальныз специалистов по BizTalk в нашей стране.

    April 17

    Конференция ReMIX

    К нам едет ревизор! То есть Стив Балмер, который хочет рассказать российским разработчикам о стратегии и планах Microsoft в Web и, в основном, в области interoperability и взаимодействию с другими платформами.

    ballmer-photo

    Даешь PHP на Windows, даешь Python и Ruby на .NET, лучший Linux - это Windows с PowerShell :). Все это мы расскажем и покажем в рамках конференции ReMIX, которая пройдет в Москве 23 мая.

    Мы с моим коллегой Петей Диденко даже сняли небольшой ролик о том, что же будет на этой мега-конференции. Кстати, это мой первый опыт съемки видео, первый раз я включил камеру и даже штатив для нее был куплен специально по этому случаю, поэтому, наверняка, даже он поставлен неправильно :)

     

    Кстати, как вам креативная идея с вставкой перелистываемых страниц, снятая в немного другом освещении? ;)

    April 16

    Работа в Microsoft в Москве

    Коллеги, если хотите работать бок о бок со мной (это я от скромности :)), то есть неплохой шанс - у нас есть две вполне интересные вакансии:

    1) Program Manager for Visual Studio Localization - человек, который будет полностью управлять всем циклом локализации Visual Studio
    2) MSDN Online Manager - человек, который будет полностью отвечать за портал MSDN на русском языке (качественный контент, подборка материалов, продвижение и т.п.)

    Если вам интересно и чувствуете в себе силы этим заниматься, то пишите мне gaidar . magdanurov @ microsoft . com. Лучше всего сразу резюме прилагать.

    April 11

    Dynamic Data Preview

    Очень рекомендую почитать блог Скотта на тему Dynamic Data. Сегодня была выпущена очередная Preview версия.

    Для тех, кто еще не знает о Dynamic Data - это набор компонентов позволяющих по схеме LINQ to SQL или LINQ to Entities автоматически строить интерфейс для управления данными. Проект уже встал на релизные рельсы и вполне пригоден для того, чтобы его посмотреть и подумать о применении в своих разработках.

    April 10

    Windows Management Instrumentation - веб-трансляция для разработчиков сегодня в 17.00 МСК

    В связи с тем, что запланированный на сегодня докладчик заболел, тема сегодняшней трансляции будет Технология Windows Management Instrumentation и прочитает доклад сотрудник Microsoft Марат Бакиров.

    March 22

    Исходный код ASP.NET MVC Framework доступен на CodePlex

    На CodePlex создан раздел, где размещают исходный код разработок, который войдут в следующие версии ASP.NET. Так, например, сейчас там доступен Preview 2 для MVC Framework.

    Всем, кому интересно создание приложений в рамках паттерна MVC - рекомендую посмотреть. Если же вы не знакомы с MVC, то рамках запуска продуктов 2008 года и семинаров "Дни Разработчика" мы об MVC рассказываем.

    March 11

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

    Если вас не пугают слова Silverlight, C#3.5, Ajax, Web 2.0, ASP.Net, REST, не страшитесь работать за границей нашей необъятной в одной из самых переводых компаний в области разработки программного обеспечения (aka Microsoft), то хочу сообщить интересную информацию.

    Европейскому центру разработки Microsoft Ireland требуются талантливые программисты, тестировщики, руководители команды разработчиков. Описание команды и подробности о проектах, которыми занимается команда GPD-E,  на сайте www.joinmicrosofteurope.com.

    Конечно, берут не всех :), требования тоже есть: свободное владение англйским языком, опыт работы от трех лет с C++ и С# (ну или Java на худой конец) или очень хороший опыт  С/С++, опыт дизайна и разработки сложных систем.

    Веб-трансляция для разработчиков: BizTalk Server: Обработка больших сообщений

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

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

    March 07

    Список блогов разработчиков Visual Studio Team System

    В преддверии выступления, посвященного Visual Studio Team System 2008, на запуске продуктов Visual Studio, SQL Server и Windows Server версий 2008, а также в связи со все большим интересом к теме инструментов коммандной разработки, публикую список блогов разработчиков из команды Visual Studio Team System. Их этих блогов можно почерпнуть огромное количество знаний.

    Блоггер Название блога
    Командный блог Visual Studio 2005 Team System
    Командный блог Team Foundation's WebLog
    Командный блог Code Analysis and Code Metrics
    Rob Caron Rob Caron
    Jeff Beehler Jeff Beehler's Blog
    Rick LaPlante Rick LaPlante's WebLog
    Sam Guckenheimer Software Engineering with Visual Studio Team System
    Alan Cameron Wills Alan Cameron Wills' WebLog
    Ali Pasha Ali Pasha's WebLog...
    Bill Gibson Bill Gibson's WebLog
    Erbil Yilmaz Erbil Yilmaz's WebLog
    Gareth Jones GarethJ's WebLog
    George Mathew George Mathew's Blog
    Jack Greenfield Jack Greenfield's Blog
    Jared Parsons jaredpar's WebLog
    Jeff Welton DB Dev QA's VSTEDP blog
    Jochen Seemann Jochen Seemann's Blog
    Keith Short Keith Short's WebLog
    Mark Groves Mark Groves' Blog
    Pedro Silva Pedro Silva's Blog
    Steve Cook Steve Cook's WebLog
    Stuart Kent stuart kent's blog
    Cameron Skinner Visual Studio Team Edition for DB Pros: The What, The Why, The How
    Gert Drapers Data Dude
    Matt Nunn Musing on Database Development
    Brian Keller Brian Keller: Technical Evangelist for Team System
    Mairead O' Donovan Visual Studio Team Editon for DB Pro - Mairead's version
    Sachin Rekhi Sachin Rekhi's Ramblings
    Richard Waymire Visual Studio for Database Professionals (aka Datadude)
    Team System Test VSTS Quality Tools
    Team System Test VSTS Load Test
    Bill Barnett Bill Barnett
    Dominic Hopton Dominic Hopton
    Ed Glas Ed Glas
    Sean Lumley Sean Lumley
    David R. Williamson David R. Williamson
    Aaron Hallberg Aaron Hallberg
    Abhinaba Basu I know the answer (it's 42)
    Adam Singer Adam Singer
    Anutthara Bharadwaj Anutthara's WebLog
    Brian Harry bharry's WebLog
    Buck Hodges Buck Hodges
    Chris Rathjen Chris Rathjen
    Ed Hintz Ed Hintz (MSFT)
    Robert Horvick Robert Horvick's Weblog
    Eric Lee Eric Lee - A Humble Blog
    Gautam Goenka Gautam Goenka (MSFT)
    Hemant Kumar Hemant's blog(s)
    James Manning James Manning's blog
    Jason Barile Jason Barile - Microsoft in Raleigh, NC
    Jason Pricket Jason Prickett's Blog
    Jim Lamb Jim Lamb
    John Lawrence John Lawrence (MSFT)
    Kevin Kelly kkelly's WebLog
    Khushboo Sharan Khushboo's blog
    Manish Agarwal Manish Agarwal
    Nagaraju Palla Nagaraju Palla's WebLog
    Richard Berg BUGBUG: poor title
    Sam Jarawan sjarawan's WebLog