воскресенье, 30 мая 2010 г.

SharePoint 2010 news on techdays.ru

Сегодня выдался свободный день и я смотрел презентации с www.techdays.ru посвященные SharePoint 2010

Вот некоторые вещи которые мне запомнились:

  • SharePoint 2010 встает на Windows 7 и это очень удобно в целях разработки, т.к. клиентская ОС менее требовательна к ресурсам. Гораздо проще поднять виртуальную машинку c Win7 чем с Win2k8.
  • SharePoint Designer 2010 стал гораздо более наворочен и, по словам докладчиков, теперь в нем можно сделать гораздо больше всего того, для чего раньше необходимо было использовать Visual Studio.
  • Visual Studio 2010 имеет множество возможностей для работы с SP 2010 и позволяет автоматически все деплоить и отлаживать. К сожалению VS2010 должна стоять непосредственно на SharePoint 2010 сервере.
  • PowerShell 2.0 теперь является одним из основных средств администрирования SharePoint 2010. При этом STSADM считается устаревшим. В составе PowerShell 2.0 идет достаточно приятный редактор с возможностью отладки.
  • Архитектура SP 2010 изменена и из нее выкинут Shared Services Provider (SSP). Так же теперь Index Server может быть не один что позволяет его лучше масштабировать.
  • InfoPath теперь является частью SP2010.
  • Отменено ограничение на 3 формы Edit,Dispaly,New теперь может быть любое количество кастомизированных форм таких типов.
  • Projected Field - расширенный вид для LookUp полей который позволяет выбирать одно поле , но отображать несколько (например лукап по пользователям и дополнительно отображается email выбранного пользователя)
  • Каждый документ теперь имеет уникальный ID (Guid), который не изменяется после создания даже при перемещении документа, и это ,вроде как, позволяет открыть документ зная его ID даже не зная его место расположения
  • Изменена работа с WepPart Pages вместо них теперь, по умолчанию, предлагается создавать более гибкие Wiki Pages которые гораздо проще и гибче в использовании. При этом страницы можно создавать где угодно и легко менять существующие.
  • В SP2010 появился Dev View который позволяет просматривать множество внутренней информации прямо на странице, включить его можно только через объектную модель.
  • BCS - очень интересная штука , например можно подключить в RW режиме стороннюю SQL базу данных используя лишь SPD. При использовании же объектной модели можно интегрировать любые данные из любых источников.
  • Помимо List Workflow появились еще и Site Workflow
  • Добавились Event'ы на создание Web и List
  • .. и еще много всего о чем я уже забыл. :)

Очень жаль, что не удалось поприсутствовать даже на русских конференциях посвященных выходу SharePoint 2010.

суббота, 29 мая 2010 г.

Save all images from RSS feed

Набросал скрипт, который сохраняет все картинки из RSS feed'а, может кому пригодится.
Использует модули Universal Feed Parser,Beautiful Soup и soupselect
import feedparser
from BeautifulSoup import BeautifulSoup
from  soupselect import select
import urllib2
from os import path

def SaveAllImagesFromRSS(rssurl, topath):
 opener = urllib2.build_opener()

 blog = feedparser.parse(rssurl)

 nimgs=0
 for post in blog.entries:
  doc = BeautifulSoup(post.summary_detail.value)
  for img in select(doc, 'img[src]'):   
   nimgs+=1
   url = img['src']
   filename = url.split('/')[-1]
   if '.' not in filename: 
    filename+='.jpg'

   filename = path.join(topath,filename)
   
   print url, " ", filename

   pg = opener.open(url)
   pic =  pg.read()
  
   fout = open(filename, 'wb')
   fout.write(pic)
   fout.close()
 

 return nimgs

print SaveAllImagesFromRSS('http://drugoi.livejournal.com/data/rss', 'drugoi')

SharePoint 2010 & PowerShell: remote managment

Возможность работать с SharePoint 2010 через PowerShell очень интересна, особенно учитывая то что PowerShell 2.0 умеет работать удаленно. Командлеты для работы с PowerShell можно посмотреть, например, тут.
Для начала я попробовал просто подключиться к удаленной машине (там Win2k8 R2):

Enter-PSSession -ComputerName SERVER

И получил ошибку:
Enter-PSSession : Connecting to remote server failed with the following error message : The client cannot connect to th
e destination specified in the request. Verify that the service on the destination is running and is accepting requests
. Consult the logs and documentation for the WS-Management service running on the destination, most commonly IIS or Win
RM. If the destination is the WinRM service, run the following command on the destination to analyze and configure the
WinRM service: "winrm quickconfig". For more information, see the about_Remote_Troubleshooting Help topic

Т.е. перед тем как работать удаленно, надо на сервере вызвать команду:
winrm quickconfig
,но лучше вместо нее использовать PowerShell-команду:
Enable-PSRemoting

После подключения нам нужно будет загрузить командлеты для работы с Sharepoint.
Add-PSSnapin Microsoft.SharePoint.Powershell

И можно будет работать.

Вот такая команда создаст сайт.
New-SPWeb -url "http://SERVER/newSite"

Но с большой вероятностью вы увидите ошибку :
New-SPWeb : Server Out Of Memory.
There is no memory on the server to run your program. Please contact your administrator with this problem.0x8
007000e
    + CategoryInfo          : InvalidData: (Microsoft.Share....SPCmdletNewWeb:SPCmdletNewWeb) [New-SPWeb], OutOfMemory
   Exception
    + FullyQualifiedErrorId : Microsoft.SharePoint.PowerShell.SPCmdletNewWeb

Я долго не мог понять в чем дело т.к. локально на сервере эта команда замечательно работает, а потом нашел вот эту статью.

Короче, надо на сервере дать вот такую команду:
Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1000
Это увеличит объем памяти со 150М до 1G и этого уже должно будет хватить. :)

Используя эту технику можно делать удаленно многое из того что не доступно в Clien Object Model и Web Services.

четверг, 27 мая 2010 г.

SharePoint 2010 CSOM: File not found or File already exists

Столкнулся с забавной ситуацией.
Предположим что мы хотим залить файл в определенный фолдер на сервере и используем ф-ю SaveBinaryDirect.
Но фолдера такого на сервере еще нет. Как думаете какая будет ошибка? Правильно - "{"The file already exists."}" :)

Вот примерчик:
using (var clientContext = new ClientContext(@"http://server"))
{
 var FileSrvRelUrl = "/notexsist/notexsist/blabla.txt";
 using (var fileStream = new MemoryStream(new byte[100]))
 {
  Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, FileSrvRelUrl, fileStream, false);
 }
}

Глупо, не логично, но это так...

При этом ф-я GetFileByServerRelativeUrl с тем же url честно выдает {"File Not Found."}.
using (var clientContext = new ClientContext(@"http://server"))
{
    var FileSrvRelUrl = "/notexsist/notexsist/blabla.txt";
    var f = clientContext.Web.GetFileByServerRelativeUrl(FileSrvRelUrl);
    clientContext.Load(f);
    clientContext.ExecuteQuery();
}

Кстати, если в примере выше вместо clientContext.Load(f); написать clientContext.Load(f, fi=>fi.Exists); то исключение возникать не будет ,а поле Exists будет содержать false.

пятница, 21 мая 2010 г.

SharePoint 2010 CSOM: Create field with well known Internal Name

Известно что SharePoint при работе через объектную модель (будь то серверная или клиентская) не позволяет указывать InternalName для создаваемых полей и не дает его менять для уже созданных.

Но можно "подсказать" ему, какое имя должно быть выбрано. Для этого при создании поля в качестве Title\DisplayName устанавливается то имя, которое мы хотим увидеть в InternalName ,а после создания Title изменяется.

Например вот так:
public static Field CreateFieldBySPField(FieldCollection fldColl, SPField fld, bool addToDefaultView)
{
 var xml = fld.SchemaXml;

 var doc = new XmlDocument();
 doc.LoadXml(xml);
 var attr = doc.DocumentElement.Attributes["DisplayName"];
 if (attr != null) attr.Value = fld.InternalName;
 var outxml = doc.OuterXml;

 Field newFld = fldColl.AddFieldAsXml(outxml, addToDefaultView, AddFieldOptions.AddToNoContentType);
 newFld.Title = fld.Title;
 newFld.Update();
 fldColl.Context.Load(newFld, f => f.InternalName, f => f.TypeAsString, f => f.Title);
 fldColl.Context.ExecuteQuery();
 return newFld;
}

среда, 19 мая 2010 г.

SharePoint 2010 CSOM: How to add site columns to content type

Экспериментировал с созданием контентных типов, и наткнулся на необычное, на мой взгляд, поведение Sharepoint Client Object Model.
Вот такой вот код выдает мне ошибку "The collection cannot be modified." (ServerErrorCode=-2146232832) при попытки добавить существующую саитовую колонку к существующему контетному типу.
//WRONG CODE
using (var clientContext = new ClientContext(@"http://SERVER2k10"))
{
 var fld = clientContext.Web.AvailableFields.GetByInternalNameOrTitle("A2");
 var ct = clientContext.Web.AvailableContentTypes.GetById("0x010065CDC89C6F96C040B3B6F0C51E5C7F48");

 var flci = new FieldLinkCreationInformation();
 flci.Field = fld;

 ct.FieldLinks.Add(flci);
 ct.Update(false);
 clientContext.ExecuteQuery();
}

Я уж было забеспокоился, но оказалось что такой код работает:
//TRUE CODE
using (var clientContext = new ClientContext(@"http://SERVER2k10"))
{
 var fld = clientContext.Web.AvailableFields.GetByInternalNameOrTitle("A2");
        var ct = сlientContext.Web.ContentTypes.GetById("0x010065CDC89C6F96C040B3B6F0C51E5C7F48");

 var flci = new FieldLinkCreationInformation();
 flci.Field = fld;

 ct.FieldLinks.Add(flci);
 ct.Update(false);
 clientContext.ExecuteQuery();
}

Т.е. получается что типы полученные через AvailableContentTypes модифицировать нельзя, а полученные через ContentTypes можно. Не очень удобно и логично.

Labor legislation : test period

Заинтересовала меня формулировка "испытательный период", которую часто используют при приеме на работу. Почитал ТК РФ и нашел там "Статья 70. Испытание при приеме на работу" и "Статья 71. Результат испытания при приеме на работу".

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

Что я не понял из прочитанного так это по какой статье осуществляется расторжение ТД в случае если работник не прошел испытание, т.е. какая запись делается в трудовой книжке?

to be continue...

вторник, 18 мая 2010 г.

Google AJAX Feed API

Google AJAX Feed API - Очень простое API от Google, которое позволяет, на своем сайте, в реальном времени, показывать RSS каналы.
Чем мне нравятся подобные продукты от Google, так это легкостью старта - вставил кусок кода\линк и все мгновенно заработало.

понедельник, 17 мая 2010 г.

Brainbench tests

Дело было вечером делать было нечего, решил сдать пару бесплатных экзаменов на brainbench.
Ну по C# оказалось что плоховато я знаком с эвентами\делегатами, extension методами, linq, generic. В сущности и правда пользуюсь ими редко. Надо обновить знания, тем более что я сейчас снова много пишу на C#.
Прикола для сдал экзамен на пользование Win XP, с этим как не странно все хорошо. :)








Помню лет 7 назад там было больше бесплатных тестов и они на халяву присылали сертификаты, так народ ими стенки оклеивал. :)

пятница, 14 мая 2010 г.

SharePoint 2010 CSOM: Using one client context object into another

Целый день провозился с ошибкой:
'System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at System.ThrowHelper.ThrowKeyNotFoundException()
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at Microsoft.SharePoint.Client.ClientRequest.BuildQuery()
   at Microsoft.SharePoint.Client.ClientRequest.ExecuteQuery()
   at Microsoft.SharePoint.Client.ClientRuntimeContext.ExecuteQuery()
   at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()

Оказалось дело в том что я объекты полученные в рамках одного контекста использовал в другом.

В коде ниже я в одном контексте получаю пользователя, и засовываю его в другой.
Как раз при вызове последнего ExecuteQuery и вываливается "KeyNotFoundException", причем делается это даже без обращения к серверу.

static User GetUser(string name)
{
    using (var clientContext = new ClientContext(@"http://Server1/subsite"))
    {
        var usr = clientContext.Web.EnsureUser(name);
        clientContext.Load(usr);
        clientContext.ExecuteQuery();
        return usr;
    }
}

var lci = new ListItemCreationInformation();
lci.FolderUrl = @"/subsite/MyMeeting";
lci.UnderlyingObjectType = FileSystemObjectType.File;

using (var clientContext = new ClientContext(@"http://Server1/subsite"))
{
   var list = clientContext.Web.Lists.GetByTitle("MyMeeting");

   var item = list.AddItem(lci);
   item["Title"] = "Meet every week";
   item["Author"] = GetUser(@"DOMAIN\Max");
   item["Editor"] = GetUser(@"DOMAIN\Kate");
   item.Update();
   clientContext.Load(item);
   clientContext.ExecuteQuery();
}

четверг, 13 мая 2010 г.

About code review

Набрел на статью на хабре, рассказывающую о том как в Google организовано владение кодом. Заинтересовала методика в которой доступ на чтение имеют все, а для того чтобы внести изменения в "чужой" код необходимо получить одобрение кода у одного из его собственников,а так же у специалиста по языку на котором он написан.
Идея со специалистом, как и вообще идея code review, последнее время, кажется мне очень здравой. Причем предпочтительно проводить это review в максимально демократичной манере и опираться на некий документ описывающий его принципы. Например в Python это PEP 8:Style Guide for Python Code, в C# - About the C# Coding Style Guide etc.
Пользы от code review больше чем может показаться, это и взаимное обучение приемам программирования, нахождение более оптимальных алгоритмов решений задач, устранение багов и увеличения числа людей "шарящих" в проекте.
Я считаю что code review это более мягкая форма парного программирования, которое при всех своих достоинствах гораздо более трудоемко и спорно в применении.

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

SharePoint 2010 CSOM: Get or create user

Единственный способ, который я нашел, для добавления пользователй в Client SharePoint Object Model это метод Web.EnsureUser.

В MSDN пока отсутствует его описание, но можно смело пользоваться описанием родного брата этого метода из SOM.

Метод получает уже имеющегося юзера из SharePoint, либо создает нового.
Если такого нет в AD выбрасывает Microsoft.SharePoint.Client.ServerException с текстом "The specified user DOMAIN\\UnknownUser could not be found." и кодом "-2146232832"

var clientContext = new ClientContext("http://server");
User us = clientContext.Web.EnsureUser(@"DOMAIN\ekiM");
clientContext.Load(us);
clientContext.ExecuteQuery();

четверг, 6 мая 2010 г.

SQL: Process rows from time to time

Потребовалось обрабатывать данные из SQL таблички не чаще чем раз в 5 минут.
Оказалось очень удобно вынести логику по проверке времени на SQL.

Выбираю я данные вот таким запросом:
SELECT ID,Data FROM MyTasks
WHERE LastProcessed < DATEADD(minute, -5, GETUTCDATE())
ORDER BY LastProcessed
После обработки для нужных строк:
UPDATE MyTasks SET LastProcessed=GETUTCDATE() WHERE ID=@ID"
MSDN: DATEADD, GETUTCDATE

среда, 5 мая 2010 г.

Russian Recruitment companies

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

Присылают описание вакансии в стиле:
Компания является международной компанией в области разработки высокотехнологичного оборудования и имеет более 127 дочерних и совместных предприятий...

Я сам когда то ходил к ним ,пока не понял что все собеседования заканчиваются фразой "Мы передадим Ваше резюме работодателю и будем ждать". То есть это пустая трата времени на поездку черт знает куда.

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

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

вторник, 4 мая 2010 г.

Redis: First look on key-value storage

Решил посмотреть новую для себя вещь - Redis. Redis - это очень шустрая система для хранения данных в стиле key-value. Ставится она очень просто, на любую Linux систему (возможно есть и Win реализации). Я ставил на виртуальную Ubuntu Server. В комплекте с сервером есть тестовая утилита которая показывает скорость работы , у меня например она выдает 64 тысчи get запросов в секнуду и 56 set, что, по моему, очень не мало.

Клиенты есть под все возможные языки, меня заинтересовал пока только клиент под python. Единственно с чем пришлось повозится так это с тем что последняя версия клиента (1.36) у меня работать отказывалась, но я пока взял 1.34 и она у меня работает (нет нескольких команд - append,substr)

Радует большое число атомарных команд , заточенных специально под конкурентное выполнение. Например, можно одной командой GETSET установить и одновременно вернуть прошлое значение, одной командой SETNX можно установить значение только если его еще нет. Есть поддержка времени жизни ключей, т.е. при добавлении можно указать что ключ живет лишь 100 секунд и через 100 секунд его уже не будет в хранилище.
Есть встроенная поддержка листов и можно легко организовывать стеки, LIFO и FIFO очереди. Есть множества, с возможностью быстрого получения пересечении.
Так же есть возможность построения социальных графов.

В общем очень интересная штука. Осваиваю и думаю куда бы прикрутить. :)