REPL WebPart для SharePoint
Intro
Сегодня я расскажу о прототипе первого компонента под ярлычком Sapphire. Это REPL WebPart. Эта веб-часть предназначенная для производства оперативных изменений на серверной стороне SharePoint, так же для удаленного исполнения скриптов и тестирования некоторых кусков кода.
PreBody
Производство данной веб-части было инициированно в довольно таки частых потребностях исполнения серверного кода с достаточной оперативностью, в недоступности средств разработки под рукой.
Здесь есть небольшая презетнация, в которой я постарался отобразить принципы работы Repl WebPart:
В добавок к слайдам расскажу о том, что веб-часть представляет собой классический хостинг Dynamic Languages Runtime языков, пока из которых доступен только Python.
Body
Далее хотелось поговорить о том, как же всё это у меня получилось, итак проект включает в себе несколько основных модулей:
- Веб-часть и контролы представления
- Хостинг языков
Далее о них поподробнее
Language Hosting
В связи с тем, что языков, которые я захочу реализовать в данном проекте является неограниченное множество, то конечно же мне необходима абстрактная фабрика для их создания, которая будет скрывать иерархию всех доступных языков и инкапсулировать их под интерфейсом:
{
ILanguage Create(string name);
}
public interface ILanguage
{
string Name { get; }
object Execute(string input);
void SetVar(string name, object value);
object GetVar(string name);
}
Отлично, далее к нашему проекту присоединяются сборки, необходимые для имплементации скриптовых языков:
- IronPython.dll
- Microsoft.Dynamic.dll
- Microsoft.Scripting.Core.dll
- Microsoft.Scripting.ExtensionAttribute.dll
- Microsoft.Scripting.dll
Всё готово для того, чтобы реализовать Python, как среду для исполнения кода, отлично, приступим:
{
private readonly ScriptScope _scope;
public string Name
{
get { return «Python»; }
}
public PythonLanguage()
{
_scope = Python.CreateEngine().CreateScope();
}
public object Execute(string input)
{
ScriptSource source = _scope.Engine.CreateScriptSourceFromString(input);
return source.Execute(_scope);
}
}
Далее немного усложним задачу, в связи с тем, что нам будет необходимо реализовать контекст для работы с SharePoint, выглядеть это должно примерно так:
private void python_should_assume_sharepoint_variables()
{
SPWeb fakeWeb = Isolate.Fake.Instance<SPWeb>();
Isolate.WhenCalled(() => fakeWeb.Title).WillReturn(«I’m fake web»);
var python = _factory.Create(«Python»);
python.SetVar(«__x__», «123″);
python.SetVar(«__web__», fakeWeb);
python.Execute(«__x__ = __web__.Title»);
var x = (string)python.GetVar(«__x__»);
Assert.AreEqual(x, «I’m fake web»);
}
Для работы с объектами SharePoint в из IronPython, нам необходимо добавить несколько библиотек:
_scope.Engine.Runtime.LoadAssembly(typeof(Uri).Assembly);
_scope.Engine.Runtime.LoadAssembly(typeof(SPList).Assembly);
Это будет основой нашей работы с динамическими языками
WebPart + WebControls
Создадим проект с помощью SPVisualDev, добавим в него feature, внутри которой создадим веб-часть Repl WebPart, всё остальные действия стандартные, однако есть небольшой нюанс, нам нужен будет объект, с помощью которого можно будет выводить строковые значения после исполнения. Я решил создать для этих целей объект с классическим названием Console, его реализация предельна проста:
{
private readonly StringBuilder _messageBuilder = new StringBuilder();
public void Write(object message)
{
_messageBuilder.Append(message);
}
public void WriteLine(object message)
{
_messageBuilder.AppendLine(message.ToString());
}
public string Message
{
get
{
return _messageBuilder.ToString();
}
}
}
Мы будем передавать его в среду исполнения языков, а после исполнения кода опрашивать его свойство Message и выводить его содержимое в нашу веб-часть.
EndBody
Все исходники проекта доступны на github: http://github.com/butaji/Sapphire
Так же предварительную версию Sapphire.Environment (решение поставляется в WSP) можно слить на CodePlex: http://sapphire.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34895
DynamicObject, JSON и ближайшее будущее
Введение
В данной статье хочу ознакомить вас с небольшим приложением для работы с JSON данными, демонстрирующим возможности, доступные нам в .NET 4.0. Поверхностно будут рассмотрены вопросы JSON-формата, а так же работы с динамическими типами данных.
JSON
Есть такая классная шутка, известная широким массам:
JSON (JavaScript Object Notation) – простой формат обмена данными, удобный для чтения и написания как человеком, так и компьютером. Он основан на подмножестве языка программирования JavaScript, определенного в стандарте ECMA-262 3rd Edition – December 1999. JSON – текстовый формат, полностью независимый от языка реализации, но он использует соглашения, знакомые программистам C-подобных языков, таких как C, C++, C#, Java, JavaScript, Perl, Python и многих других. Эти свойства делают JSON идеальным языком обмена данными. далее…
JSON и ваше приложение
Ну так вот, обычно, получая объекты по JSON в наших приложениях мы должны подготовить инфраструктуру для их поддержки (к примеру с помощью DataContractJsonSerializer и решения на типа этого). Однако это занимает значительное время у разработчика. В связи с этим у меня появилось страстное желание поставить JSON механизмы на рельсы динамических возможностей .NET 4.0 и получать от работы с ним одно удовольствие
DynamicObject
DynamicObject – Предоставляет нам простой класс, наследуясь от которого мы можем получить динамическое поведение объекта на этапе исполнения. Наследуясь от этого класса и переопределяя некоторые его методы реализуется вся основная логика необходимая нам для этого.
Если хостинг DLR и прочие прелести вас заинтересовали и вы хотите ознакомиться немного поглубже с вопросом, то можно посмотреть наше выступление здесь, а так же слайды (здесь и здесь).
К разработке
Для того, чтобы не испытывать неудобств при работе с JSON, я предлагаю воспользоваться (слить и зареференсить) решением от James Newton под названием JSON.NET, данный проект свободен и удовлетворяет всем основным требованиям работы с JSON в рамках .NET-стека (в том числе и LINQ).
Да, к тому же нам понадобится IDE, умеющая работать с .NET 4.0b1, к примеру Visual Studio 2010 Beta 1 (кстати #develop не отстает).
Создаем наше приложение, которое будет выглядеть примерно следующим образом:
""500 gigabyte hard drive"" ]}»;
dynamic computer = new DynamicJSON(input);
И пробуем посмотреть, какие же свойства обнаружатся у нашего компьютера:
«Intel»
>> computer.Drives
[
"DVD read/writer",
"500 gigabyte hard drive"
]
>> computer.Drives[0]
«DVD read/writer»
Пока ничего необычного, учитывая, что мы не знаем, что же из себя представляет DynamicJSON, к реализации которого мы и обратимся за впечатлениями:
public class DynamicJSON : DynamicObject
{
private JObject _data;
public DynamicJSON(string data)
{
_data = JObject.Parse(data);
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = _data[binder.Name];
return true;
}
}
И это всё, что потребуется от нас для работы данного примера, меня подобные вещи радуют чрезмерно, в связи с чем рекомендую и вам использовать подобную практику в своих решениях.
Ruby|Python в браузере, сделай сам
Зачем?
Клиентскую часть в веб-приложениях принято создавать на JavaScript. Я считаю, что большинство разработчиков с огромным удовольствием бы отошли от этого правила и воспользовались своим любимым server-side языком. Ну что же, команда MIX Online предоставила любителям динамических языков такую возможность, подробнее об этом можно прочитать в “Проект Gestalt – пишите на Ruby, Python и XAML прямо в HTML на стороне клиента”. Ниже я предлагаю создать нечто подобное, но уже своими силами.
С помощью чего?
Посмотрев несколько примеров мне стало ясно, что реализован Gestalt на Silverlight + Dynamic Languages Runtime. Далее я прикинул, а на сколько сложно создать нечто своими руками? И сразу же решение: Silverlight умеет взаимодействовать с DOM – значит я смогу получить код и интерпритировать его – дело за малым – реализация.
Приступим
Нам понадобятся:
- Visual Studio >2008SP1 (при желании можно и другие IDE или средства редактирования текста)
- Silverlight >2.0 Tools
- Dynamic Languages SDK >0.5.0 (download)
- 10 мин времени
Lets code
Открываем Visual Studio, создаём Silverlight Application, я назову проект “mygestalt”. Теперь я осознаю, что писать та надо будет совсем не много, мне понадобится экспериментальный Client-Script и его интерпритатор. Открываем страничку, на которой будет хоститься наш Silverlight, в моём случаем это mygestaltTestPage.aspx и добавляем туда наш client-side python code. Выглядеть это должно примерно так:
- <script type="python">
- def func():
- HtmlPage.Window.Alert("Hello world!")
- func()
- </script>
* This source code was highlighted with Source Code Highlighter.
Далее отправляемся в MainPage.xaml.cs, где будем заниматься поисками нашего скрипта:
- using System.Linq;
- using System.Windows.Browser;
- namespace mygestalt
- {
- public partial class MainPage
- {
- public MainPage()
- {
- InitializeComponent();
- FindAndRunScript();
- }
- private void FindAndRunScript()
- {
- var scripts = HtmlPage.Document.GetElementsByTagName("script");
- var pythonScript = scripts.Where(x => x.GetProperty("type").ToString() == "python").First();
- PythonEngine.Run(pythonScript.GetProperty("innerHtml").ToString());
- }
- }
- }
* This source code was highlighted with Source Code Highlighter.
Ну и реализация PythonEngine:
- using Microsoft.Scripting;
- using Microsoft.Scripting.Hosting;
- using Microsoft.Scripting.Silverlight;
- namespace mygestalt
- {
- public static class PythonEngine
- {
- public static ScriptScope Run(string source)
- {
- var setup = Configuration.LoadFromAssemblies(Package.GetManifestAssemblies());
- setup.HostType = typeof(BrowserScriptHost);
- setup.DebugMode = true;
- var runtime = new ScriptRuntime(setup);
- var engine = runtime.GetEngine("IronPython");
- var scope = engine.CreateScope();
- const string init = @"
- import clr
- clr.AddReference('System.Windows.Browser')
- from System.Windows.Browser import *
- "
;
- ScriptSource initSource = engine.CreateScriptSourceFromString(init, SourceCodeKind.Statements);
- initSource.Execute(scope);
- var script = engine.CreateScriptSourceFromString(source, SourceCodeKind.Statements);
- script.Execute(scope);
- return scope;
- }
- }
- }
* This source code was highlighted with Source Code Highlighter.
Запускаем приложение и видим:
В заключение
Вот у нас и получился свой собственный Gestalt, самое интересное в том, что я посмотрел его исходники и нашёл там примерно такую же реализацию.
Мой проект можно найти на http://code.google.com/p/mygestalt/.
Всем спасибо!
Звучит заманчиво: Django на IronPython
def Introduce():
Дорогие мальчики и девочки, меня (как позже оказалось не только меня) интересует веб-индустрия и всё, что с ней связано, соответственно хочется вкусить разнообразных технологий, одной из них является известный фреймворк Django.
Им и хочется заняться. Думаю, не стоит говорить, о том, что я .NET-разработчик, в связи с чем Python в чистом виде использовать не очень хочется, но хочется попробовать IronPython в деле. Тогда вполне очевидно, что Django на .NET должен являться ASP.NET приложением.
def WSGI():
Здесь нам нужно знать, что такое WSGI:
WSGI (англ. Web Server Gateway Interface, произносится виски) — стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, обычно из каталога cgi-bin, и самим веб-сервером, например, Apache.
Дополнительная информация: PEP 333
И нам безусловно повезло, т.к. есть готовая имплементация WSGI для ASP.NET: NWSGI – выполнена как ASP.NET 2.0 HttpHandler на IronPython.
Что примечательно, мало того, что NWSGI интегрируется с IIS и позволяет работать с сессиями, кешем и управлением пользователями, он интегрируется даже с графической средой управления IIS 7!
Это ещё не всё, NWGSI умеет также работать с Cassini (веб-сервер Visual Studio).
Думаю Вам, ровно как и мне, не терпится поработать с этим.
def PrepareIIS():
Итак, что нам необходимо:
- IronPython 2.0
- NWSGI 1.0
- Огромное желание сделать что-нибудь особенное на этом.
Для установки из пакета NWSGI копируем пример HelloWorld в папку C:\inetpub\wwwroot\HelloWorld (либо другой путь для ваших IIS приложений). Из этого же пакета копируем NWSGI.dll в папочку HelloWorld\bin (если пользовались инсталлятором, то в этом нет необходимости, т.к. она уже в GAC’е).
Далее из пакета IronPython 2.0 копируем в каталог HelloWorld\bin следующие сборки:
- IronPython.dll
- IronPython.Modules.dll
- Microsoft.Scripting.Core.dll
- Microsoft.Scripting.dll
Наша папочка HelloWorld должна выглядеть следующим образом:
HelloWorld\
- bin\
- NWSGI.dll (optional)
- IronPython.dll
- IronPYthon.Modules.dll
- Microsoft.Scripting.Core.dll
- Microsoft.Scripting.dll
- hello.wsgi
- Web.Classic.config
- Web.Integrated.config
Далее, если у нас ISS 7.0, то тогда копируем Web.Integrated.config в Web.config, иначе Web.Classic.config в Web.config.
Далее добавляем приложение на IIS, это можно сделать, как через графическое меню, так и воспользоваться консолью:
%systemroot%\system32\inetsrv\appcmd add app /site.name:"Default Web Site" /path:/hello /physicalPath:C:\inetpub\wwwroot\HelloWorld
Если же у вас IIS 6, то путь один – через графическое меню, а так же необходимо будет ассоциировать *.wsgi с ASP.NET ISAPI фильтром (по аналогии с *.aspx)
Теперь идём по адресу http://localhost/hello/hello.wsgi. И видим грациозное: "Hello, World!", yeah!
def InstallDjango():
Установить Django можно с помощью команды:
ipy setup.py install
Далее можно добавить проект и сгенерировать приложения:
ipy manage.py startapp AppName
ipy manage.py startproject ProjName
К сожалению, мне не хватило навыков для того, чтобы запустить django-приложение под NWSGI.
def SqlServer():
Подключить Django к Microsft SQL Server 2005 и выше можно с помощью следующей библиотеки:
http://code.google.com/p/django-mssql/
Так же можно почитать о подключении здесь: http://blogs.msdn.com/dinoviehland/archive/2008/03/17/ironpython-ms-sql-and-pep-249.aspx
def GetGratitude():
Огромную благодарность за выполненную работу хочу выразить Jeff Hardy и советую ознакомиться с его работами:
Boo 0.9 уже здесь!
Введение
Вчера Bamboo в своем блоге сообщил о релизе Boo 0.9. Стоит обратить внимание на то, что данный релиз заметно преображает язык, делая его более удобным.
Ключевые обновления
Основными “фишками” новой версии являются:
- Генератор макросов [BOO-1077], который больше не ограничивает макросы возвращением единственного значения, либо блока, а позволяет возвращать неограниченное количество веток с помощью yield:
macro printLines:
for arg in printLines.Arguments:
yield [| System.Console.WriteLine($arg) |]
printLines "silly", "silly", "silly"
- Nestable-макросы [BOO-1120] – описания макросов теперь могут быть вложенными, и поддерживают зависимости от контекста:
macro given:
macro when:
yield [| print "given.when" |]
yield
macro alert:
macro when:
yield [| print "alert.when" |]
yield
given:
when // given.when
alert:
when // alert.when
- Макросы – как члены типа [BOO-415] – макрос может быть использован в описании тела типа:
macro ThreadStatic:
case [| ThreadStatic $name as $type |]:
yield [|
[System.ThreadStatic] static $name as $type
|]
class Environments:
private ThreadStatic _current as Environment
- Шаблон соответствия [BOO-1106] – простой, но мощный шаблон соответствия объекта с макросами match/case/otherwise:
import Boo.Lang.PatternMatching def Eval(e as Expression) as int: match e: case Const(Value): return Value case InfixExpression(Operator: "+", Left, Right): return Eval(Left) + Eval(Right) case InfixExpression(Operator: "-", Left, Right): return Eval(Left) - Eval(Right)
- Поддержка универсальный расширений методов (generic extension methods знакомых нам по C#) [BOO-937] – подобные LINQ расширения:
import System.Linq.Enumerable from System.Core
[Extension]
def MakeString[of T](source as T*):
return join(source, ", ")
evenDoubles = range(10).Where({ i as int | i % 2 == 0 }).Select({ i as int | i * 2 })
print evenDoubles.MakeString()
def Using[of T(System.IDisposable)](value as T, block as System.Action[of T]): try: block(value) ensure: value.Dispose() Using(System.IO.File.OpenText("TFM.TXT"), { reader | print reader.ReadLine() })
- Строгий режим [BOO-1115] – строгий режим меняет некоторые правила компилятора: по-умолчанию все типы становятся private, параметры метода и возвращаемые значения должны быть обязательно объявлены
- Ассиметричные свойства видимости доступа [BOO-1094]
class Song: Name as string: public get: return _name internal set: _name = value ...
- Форматирование со строковой интерполяцией (eg. "${val:x4}") [BOO-1006] – .net спецификация форматирования может использоваться на ряду с интерполяцией строк:
def ToHex(n as int): return "0x${n:x4}" print ToHex(42)
- Поддержка SilverLight [BOO-1117] – пример Владимира Лазунина с его Тетрисом, рабочий проект которого нуждается только в Boo.Lang.dll весит ~46 KB, а аналог, исполненный на IronPython подцепляет библиотеки DLR и весит в целом ~1.15 MB.
Материалы
Статья подготовленная по
Codeplex: Очередной Add-In для Reflector’а
Сегодня на Codeplex нашёл плагин, который позволяет рефлектору интерпритировать сборки в IronPython. Довольно таки интересно.
На рисунке интерпретирована сборка Boo в IronPython.
Ссылка на релиз http://www.codeplex.com/ipreflector.
Что такое ALT.NET?
Введение
По многочисленным WTF от коллег, хотел бы вкратце прояснить, а что же это такое. А дальше решайте сами, интересно Вам это или нет.
Содержание
ALT.NET – Альтернативные инструменты и подходы к разработке на .NET.
Инструменты и подходы перечислены ниже в табличке HOTorNOT.
| Hot | Not |
| Castle, ActiveRecord, NHibernate |
DataSets, Dataset Designer, Entity Framework, MS Application Blocks |
| MVC,NUnit,MonoRail | Web Forms, SCSF, VSTS, MSTest |
| XP, TDD, Scrum | MSF Agile, MSF For CMMI |
| Evolutionary Design and Development | Big Design Up Front |
| Ruby + IronRuby, Python + IronPyton, DLR, Silverlight(?) | ? |
| OR\M (NHibernate, LLBLGen etc..) | DLinq, Data Access Block, DataSets, Plain ADO. NET |
| Open Source (Mono, SourceForge) | Application Blocks, CodePlex |
| MVC and MVP (RoR, MonoRail..) | Web Forms, CAB, Smart Client Factory |
| CVS, SVN | VSS, VSTS Source Control |
| Build Automation and CI (CI Factory, NAnt, FinalBuilder, CruiseControl..) |
Team Build |
| TDD and Unit Testing NUnit, MbUnit, RhinoMocks, NMock, TypeMock |
MSTest for unit testing, VSTS |
| Subtext, DasBlog, WordPress, TypePad, Blogger, FeedBurner | Microsoft MSN Spaces, Community Server(?) |
| Simplicity in Design | P&P |
| Working at Google | Working at MS |
| Google Gears | Smart Client, MS Ajax |
| .NET 3.X (WF, WPF. Silverlight) | .NET 2.0 |
| DI, IoC, Spring for .NET | Object Builder |
| Conferences: OSCon, RubyCon, Code Camps, DevTeach.. |
VSLive, TechEd, DevConnections.. |
Считаю, что необходимо как минимум ознакомиться со всеми перечисленными понятиями как в правой, так и в левой колонках, следуя принципу анализ-синтез-best practices.
Материалы по теме
- Табличка любезно позаимствована здесь http://weblogs.asp.net/rosherove/archive/2007/06/04/alt-net-alternative-tools-and-approaches-to-mainstream-net.aspx
- Страница сообщества ALT.NET http://altdotnet.org/
- Статья в журнале MSDN “Что такое ALT .NET?” by Джереми Д. Миллер (Jeremy D. Miller) http://msdn.microsoft.com/ru-ru/magazine/cc337902.aspx
- Активно развивающаяся группа ALT.NET на Yahoo Groups http://tech.groups.yahoo.com/group/altdotnet/
Обзор языка Boo! – как средства организации DSL Вашего приложения
Одна из вещей, как известно, способная помочь вам стать лучше в качестве разработчика, заключается в изучении нового языка. Даже если Вы никогда не будете пользоваться этим языком в Вашей повседневной трудовой деятельности, он поможет Вам лучше понять языки, с которыми Вы работаете.
В последнее время меня так и тянет насесть на какой-нибудь новенький язык программирования, особенно что-нибудь на типа Ruby или Python, но в связи с моей привязанностью среде разработки (Visual Studio, неверно это не очень хорошо – зависеть от IDE
) и затруднительной ситуацией с разработкой на ней на динамических языках (надеюсь это временное затруднение) от них пока пришлось отказаться. В то же время меня интересуют такие области как метапрограммирование и реализация DSL (Domain-Specific Language == проблемно-ориентированный язык приложения), и в этой связи видится мне, что Boo является весьма интересным языком. К тому же Boo – язык CLR, что очень даже не плохо для изучения.
Поэтому я решил, что когда я узнаю Boo и когда почувствую уверенность в Boo, я попробую реализовать DSL и реализовать именно на Boo для своего ближайшего проекта.
Что такое Boo?
Boo представляет собой open-source объектно-ориентированный статически типизированный язык программирования для CLR с Python’о-подобным синтаксисом, язык увидел свет в 2004 году из-под рук Rodrigo B. de Oliveira. В настоящее время последняя версия 0.8.2, но даже если нет еще версии 1.0, это действительно очень стабильной и зрелый язык, который можно использовать на производстве.
Основные концепции в Boo:
- Дать компилятору сделать большую часть работы, для того чтобы помочь языку выглядеть более динамическим с автоматическим объявлением переменных, выводом и приведением типов.
- В то же время он предоставляет возможности для выполнения статической компиляции, проверку ошибок во время компиляции.
- Boo также предоставляет функциональную составляющую в том, что функции могут использоваться в качестве возвращаемого значения, как аргументы, хранимые в переменных, а так же как объекты.
- Boo имеет первоклассные генераторы, это конструкций, способные производить более одного значения при использовании итерации цикла (“return a for a in apples if a.IsRipe”).
- Boo также поддерживает утиную типизацию (Duck Typing), которая позволяет отказаться от обеспечения безопасности статических типов и принимать любой объект, который просто имеет соответствующие методы и свойства, определяемые во время выполнения.
- Boo также имеет расширения методов и свойств (extension methods and extension properties).
Одним из наиболее интересных функций Boo является расширяемость процесса компиляции, которая позволяет управлять компиляцией и изменять или добавлять функции. Можно добавить подпрограмм для проверки конвенции кода, генерирования отчётов или преобразовывания кода. То, что Вы сможете сделать в C# с помощью тулзы посткомпиляции такой, как PostSharp и только ограниченный набор действий. В Boo Вы могли бы например автоматически преобразовать класс в одноэкземплярный (pattern Singleton), просто добавив атрибут следующим образом:
[singleton]
class MySingleton: pass
PostSharp просто не смог бы сделать этого, свойство экземпляра было бы обработано поздно. Это действительно открывает множество возможностей и Вы ограничиваетесь только Вашим пониманием внутренней функциональности компилятора и набора его возможностей.
В Boo пробелы имеют важное значение как в python, но есть возможность включить режим “Whitespace Agnostic”, позволяющий оканчивать выражение с помощью “end”, который избавит Вас от возможных проблем с пробелами.
Что нужно для начала работы с Boo?
Главным образом если Вы хотите узнать Boo, достаточно иметь последнюю версию Boo . В папке bin, Вы найдете файл “Booish.exe”, являющийся интерпретатором командной строки Boo, которая позволяет проиграться с синтаксисом языка.![]()
Для разработки нам необходима IDE, и следовательно у нас два варианта.
Большинство Boo разработчиков работают с SharpDevelop , и если Вы скачаете последнюю версию, в ней будет Boo полностью готовый к использованию. Эта IDE имеет преимущество, с точки зрения создания DSL, так как в ней легче добавить функции автозавершения кода и подсветки синтаксиса, в Visual Studio же потребуются написать лексер и парсер; в SharpDevelop можно сделать это с помощью XML-файла.
Но с другой стороны Visual Studio является зрелой IDE, и с BooLangStudio вы получите Boo интегрированный в Visual Studio. Люди жалуются, что проект является нестабильным и это лишь альфа выпуск, так же я встретился в нём с проблемами уникода (UTF8), которые пока не смог разрешить, но у меня пока нет весомых замечаний.
В настоящее время я буду пользоваться Visual Studio в силу привычки, но я могу изменить свой взгляд при продолжении этой статьи.
При написании данного поста я руководствовался данной работой, можно даже сказать переводил, но перевод очень личный и свободный.
Продолжение следует…
Лоуренс Морони "Введение в Silverlight2"
Ребята из команды Microsoft Россия подготовили нам новогодний подарок, и перевели книжку Лоуренса Морони «Введение в Silverlight2″. Скачать её можно здесь.
Думаю стоит прочитать её, освежить свои знания по SL, тем более в следующем году предстоит с ним плотненько поработать.
Sharepoint OM against IronPython
Мною был найден продукт, выполняющий интеграцию средств разработки динамического языка в полюбившеюся мне IDE – Visual Studio 2008, что даёт значительный стимул для изучения динамических языков. В данном случае это IronPython (конечно хотелось бы заняться IronRuby, но вопрос интеграции средств разработки этого языка в VS для меня до сих пор открыт).
Если у Вас появилось желание посмотреть, а о чём же всё-таки сейчас идёт речь, идём по этому линку и сливаем последнюю версию пакета.
Итак, объектная модель Sharepoint с помощью языка IronPython:
- from Microsoft.SharePoint import *
- def siteOwner(sitename):
- site = SPSite(sitename)
- result = site.Owner
- site.Dispose()
- return result
- print siteOwner("http://server")
* This source code was highlighted with Source Code Highlighter.