- Mało mówiący błąd: Invalid Page URL - AKTUALIZACJA
-
Pamiętacie bug: Invalid page URL? Poniżej odpowiedź z MS po kilku ich wewnętrznych spotkaniach:
Feedback Title - WSS/MOSS: "Invalid page URL" error message
The following fields or values changed:
Field Status changed from [Active] to [Resolved]
Field Resolution changed from [Not Set] to [Won't Fix]
Field Status changed from [Resolved] to [Closed]
I jak tu ich nie kochać? :)
- Wszystkiego Najlepszego!
-

Korzystając z okazji i takiej możliwości chciałbym Wam wszystkim życzyć szczęśliwych, ciepłych, wesołych oraz rodzinnych Świąt Bożego Narodzenia!
A tutaj możecie znaleźć malutki prezent :)
- Linki do prezentacji o zarządzaniu obiektami w WSS/MOSS
-
Linki, które posłużyły mi przy tworzeniu prezentacji, z których czerpałem wiedzę, nakładałem ją na to co już wiem i wyciągałem to co uważałem za naprawdę istotne. Mam nadzieję, że komuś się przydadzą, naprawdę warto poświęcić te 5h i je przeczytać! :) Oczywiście do tego wszystkiego dochodzą pierwsze rozdziały książki Inside Windows SharePoint Servicec 3.0 :)
Dla przypomnienia, takie moje małe info na temat prezentacji, materiały z prezentacji na stronach PGS oraz strona domowa PGS :)
· Stefan Goßner : Dealing with Memory Pressure problems in MOSS/WSS
· Stefan Goßner : Troubleshooting SPSite/SPWeb leaks in WSS v3 and MOSS 2007
· Stefan Goßner : Disposing SPWeb and SPSite objects - to tutaj dowiedziałem się o portach TCP i o tym, że Lamb nie zawsze ma rację;
· MaxUserPort: Core Services - co i gdzie ustawić by nie było problemu z portami TCP;
· If broken it is, fix it you should : Who is this OutOfMemory guy and why does he make my process crash when I have plenty of memory left? – opisanie jak działa pamięć i dlaczego dostajemy out of memory, następny link jest tak jakby kontynuacją :)
· If broken it is, fix it you should : .NET Memory usage - A restaurant analogy – to właśnie z stąd miałem anologię działania pamięci .NET do stołu w restauracji;
· Steve Sheppard's Blog : Overlapped Recycling And SharePoint: Why SharePoint Requires It - informacje o tym jak w WSS/MOSS rozpoznać iż mamy kłopot z pamięcią :)
· Sowmyan's SharePoint Developer Blog : Best Practices: SharePoint Object Model for Performance Tuning – kilka ciekawych porad jak wydajnie się dostawać do obiektów w API SharePoint – ale pamiętajcie, rozsądek wygrywa!!!!!!!!!
· Roger Lamb's SharePoint Developer Blog - jak i kiedy używać Dispose by examples;
· SharePoint Guidance – coś o czym już pisałem na blogu :)
· White Paper: Working with large lists in Office SharePoint® Server 2007 – o tym chyba też już pisałem, jeżeli nie znacie tego dokumentu, to się z nim zapoznajcie :)
· Joel Oleson's Blog - SharePoint Land : SharePoint Capacity Planning Key Info - masa linków do zasobów związanych z wydajnością WSS/MOSS;
· Disposing list’s SPSite/SPWeb without ParentWeb « Solutionizing .NET
· SPSite/SPWeb Leaks Revisited « Solutionizing .NET
· The New Definitive SPSite/SPWeb Disposal Article « Solutionizing .NET
· Chris O'Brien's blog: Disposing SharePoint objects - what they don't tell you
· Software/Technology Discussion : Helper Class for Avoiding Memory Leaks with SPSite and SPWeb Objects – ciekawy pomysł wsparcia developerów z kłopotami z Dispose, warto się zapoznać, ale czy od razu korzystać? Sami na to sobie odpowiedzcie :)
Życzę miłej lektury! :)
- Tips & Tricks 09: Redirect URL
-
Ile razy podczas pisania stron dla SharePoint musieliście pisać kod do Redirect? Tak by działał on zgodnie z zasadami SharePoint – parametry query string - ? Osobiście nie jestem wstanie tego zliczyć, pamiętam jeszcze jak w IT Core, pisałem to dla Publishing Pages (tam dochodzi parametr CancelSource czy coś w tym stylu jak dobrze pamiętam – choć mogę źle pamiętać ;)).
Dziś miałem dość, i napisałem taki o to kodzik:
#region Hack na Internal Method
public static string GetRedirectUrl(HttpRequest request, SPList list)
{
Type type = typeof(SPUtility);
MethodInfo method = type.GetMethod("GetRedirectUrl",
BindingFlags.Static | BindingFlags.NonPublic,
null,
new Type[] { typeof(HttpRequest), typeof(SPList) },
null
);
object obj = method.Invoke(null, new object[] { request, list });
if(obj == null)
return string.Empty;
else
return obj.ToString();
}
#endregion Hack na Internal Method
Przez co jest on wykorzystywany w MOSS/WSS? Np.: przez przyciski Save/Cancel na formularzach. Pamiętajcie, że nie łapie tutaj żadnych wyjątków!! Oraz zwracam string.Empty jak nie uda mi się pobranie URLa.
Teraz pytanie, które mi się nasuwa od razu, czy tego jest więcej? Jak najbardziej. Obejrzyjcie sobie klasy w .NET Reflector SPUtility, SPHttpUtility, SPUrlUtility, SPUtilityInternal, czy SPStringUtility. Tego tak naprawdę jest więcej :)
- Tips & Tricks 08: The security validation for this page is invalid. Click Back in your Web
-
Problem jest znany i dość powszechnie udokumentowany. Jednak ten Tip jest bardziej dla mnie ;) Jak to zapiszę to będę o tym pamiętał. Chodzi o to, że jak długo nie widzę tego błędu to potem jak wyskakuje to nie wiem co zrobić ;)
Dla przypomnienia, błąd wygląda mniej więcej tak:
The security validation for this page is invalid. Click Back in your Webbrowser, refresh the page, and try your operation again.
A rozwiązania są dwa i dwa są proste:
1) Rozwiązanie pierwsze to po prostu opakować kod w:
try
{
web.AllowUnsafeUpdates = true;
}
catch(Exception ex)
{
}
finally
{
web.AllowUnsafeUpdates = false;
}
2) Drugie rozwiązanie to na stronie Central Administration, wybrać następującą opcję: Central Administration ---> Application Management ----> Web Application Settings --> "turn security validation off" – Rowzwiązanie nie zalecane!!
- Benjamin Zander: How Fascinating!
-
Znacie stronę PrezentationZen? Ja od 3 lat notorycznie na nią wchodzę, można by powiedzieć iż jest to jedyny RSS który subskrybuje i czytam. Gorąco polecam!
Ale wracając do tematu. Właśnie na stronie PrezentationZen Garry opublikował post z prezentacją Benjamina Zandera (dyrektora Bostońskiej Filharmonii), w której Benjamin pokazuje dwa sposoby spostrzegania świata przez ludzi w którym jedni są ponurzy, smętni i markotni, w drugim ludzie są otwarci na świat oraz na otaczające ich możliwości. Benjamin w ciekawy sposób pokazuje jak zmiana sposobu myślenia pozytywnie wpływa na to co robimy.
Gorąco polecam poświęcić swoje 30 minut by zobaczyć jak i co przekazuje muzyk.
Uwaga: Player ma kłopot z audio w przeglądarkach FF i Chrome :( Jakby film się nie chciał pokazać to zapraszam na stronę PopTech.
- Prezentacja o Zarządzaniu obiektami w WSS/MOSS
-
Skopiuje prawie post %, z jednego podstawowego powodu :) Podobnie jak % tak jak i ja, miałem swoje „pierwsze koty za płoty”. Mówiąc dosłownie, była to pierwsza prezentacja, którą dawałem publiczności, która:
1) Nie była moja klasą/grupą ;) (nie licząc jednego przypadku;))
2) Nie była moimi znajomymi z pracy (no nie licząc jednego przypadku;))
Więc ten post jest moją szczerą prośbą o szczerą opinie na temat prezentacji. Co było dobre, a co nie? Co należałoby waszym zdaniem zmienić a co poprawnić?
Rzeczy o których wiem, że powinny ulec poprawie oraz moim zdaniem poprawnie nie poszły:
1) Bezpośrednie zgłaszanie się do publiczności na TY – choć to nie zawsze jest chyba złe, ale warto to kontrolować
2) Zaznaczanie tekstu nie powoduje, że jest on bardziej widoczny :)
3) Zbyt dużo materiału do pokazania (moja prezentacja chyba by nie przeszła testu windy)
4) Elementy które miały być wprowadzeniem stały się głównym członem prezentacji (mowa o wytłumaczeniu jak działa pamięć)
5) Tutaj mam punkt przeciwny do tego co Procent ;) chyba, zbytnio żywiołowo reagowałem na to, że coś wolno działało, to znaczy nie kontrolowałem niektórych słów wypływających z moich nieokrzesanych ust
Jeżeli byliście na spotkaniu, to proszę wyraźcie swoją opinię, dzięki temu następne prezentację będą jeszcze lepsze! Z góry dzięki za pomoc!
Niebawem jak tylko do końca wyzdrowienie materiały z prezentacji pojawią się na stronie PGS – zaktualizuje wtedy ten artykuł o linki.
- Ach ten SPPropertyBag…
-
Ostatnio potrzebowałem napisać mechanizm do zarządzania własnościami SPWeb (SPWeb.Properties), na tyle prosty i przejrzysty by każdy mógł z niego skorzystać.
Jak to zwykle w projektach SharePoint, moim pierwszym miejscem gdzie szukałem rozwiązania był Google ;) pamiętam do tej pory, że widziałem już takie rozwiązanie gdzieś dostępne… było to dawno temu jednak wiem, że ktoś już wykonał tą mozolną i prostą pracę napisania tego – jeżeli macie gdzieś linka, to podajcie, z chęcią je zobaczę :)
Niestety, nie udało mi się w założonym czasie znaleźć tego co szukałem, więc stwierdziłem, że mam jeden wolny wieczór więc to napiszę. – hop siup i po sprawie. Dla tych, którzy nie wiedzą, SPWeb.Properties umożliwiają przechowywanie DicionaryEntry: klucz – wartość. Wartości przechowywane dostępne są na poziome Web (nie site collection) przez co można niektóre sprawy konfiguracyjne tam przechowywać. Przykładem aplikacji intensywnie wykorzystującej SPPropertyBag jest darmowe rozwiązanie do zarządzania elementami na listach, które mają być wyświetlane i kiedy podczas tworzenia, edycji i wyświetlania elementu (rozwiązanie dostępne na CodePlex).
Ogólnie zabawa samym SPPropertyBag jest bardzo, ale to bardzo prosta:
SPPropertyBag bag = web.Properties;
// Dodanie elementu
bag.Add("klucz", "wartosc");
bag.Update();
// Edycja elementu
bag["klucz"] = "wartosc";
bag.Update();
// Usuniecie (o tym wiecej na blogu)
bag.Remove("klucz");
bag.Update();
// Sprawdzenie czy klucz istnieje
if(bag.ContainsKey("klucz"))
Console.WriteLine(bag["klucz"]);
// Sprawdzenie czy wartosc istnieje
if(bag.ContainsValue("wartosc"))
{
// kod dzieki uprzejmosci %
var keys = bag.Cast<DictionaryEntry>()
.Where(de => de.Value == "wartosc")
.Select(de => de.Key).ToList();
foreach(var key in keys)
{
Console.WriteLine("klucz: {0} posiada wartosc: {1}", key, "wartosc");
}
}
Jak sami widzicie nie ma w tym nic skomplikowanego. Jedynie o czym trzeba pamiętać o aktualizacja SPPropertyBag po każdej akcji dodania, aktualizacji lub usunięcia (uwaga o tym zaraz).
Więc co… zabieram się do pracy, tworzę stronę z SPGridView wyświetlającą wszystkie klucze i wszystkie wartości, dodaje możliwość sortowania, filtrowania, dodaje przyciski do edycji, usuwania oraz przycisk Toolbar do dodania nowej wartości. Stronka wyświetlająca już śmiga, więc zaczynam podpinać stronę do dodania (super, bez problemu), stronę do edycji (lekka modyfikacja strony dodającej) no i pozostała mi ostatnia funkcja… usunięcie wartości z SPPropertyBag.
Odpalam stronę, kasuje wartość a ona znika… super! No więc dla testu usunę jeszcze jeden element… i on znika! Ekstra… ale… co jest… element który został pierwszy usunięty znów się pojawił… Wchodzą znowu na stronę i znów wszystkie wartości są dostępne. No więc patrzę na swój kod:
// Usuniecie
bag.Remove("klucz");
bag.Update();
Wygląda poprawnie. Patrzę na kod od SPGridView, też wygląda poprawnie, więc olewam go. Tworzę Console Application i tam zaczynam testować. Wywołuje funkcję sprawdzającą czy klucz testowy istnieje i jeżeli istnieje to go usuwam:
if(bag.ContainsKey("klucz"))
{
Console.WriteLine("Usuwam klucz-wartosc: {0}-{1}", "klucz", bag["klucz"]);
bag.Remove("klucz");
bag.Update();
if(bag.ContainsKey("klucz"))
{
Console.WriteLine("ERROR: Cos poszlo nie tak...");
}
}
Poszczególne wywołania aplikacji (kolejno 5) zwróciły mi:
Usuwam klucz-wartosc: klucz-wartosc
Usuwam klucz-wartosc: klucz-wartosc
Usuwam klucz-wartosc: klucz-wartosc
Usuwam klucz-wartosc: klucz-wartosc
Usuwam klucz-wartosc: klucz-wartosc
Coś chyba nie tak? Patrzę więc na debug, po usunięciu klucza, wartość znika z SPWeb.Properties, ale jak ponownie wykonuje program, to ta wartość tam istnieje. Myślę sobie, dobra, pewnie coś tam jest aktualizowane w meta danych SPWeb więc należy dodać:
web.Update();
i kłopot z głowy. Więc robie kolejne testy… i dalej nic. Dobra to przed usunięciem elementu, zeruje wartość (może automatem go usunie?):
if(bag.ContainsKey("klucz"))
{
Console.WriteLine("Usuwam klucz-wartosc: {0}-{1}", "klucz", bag["klucz"]);
bag["klucz"] = string.Empty;
bag.Update();
bag.Remove("klucz");
bag.Update();
web.Update();
// na wszelki wypadek
bag = web.Properties;
if(bag.ContainsKey("klucz"))
{
Console.WriteLine("ERROR: Cos poszlo nie tak...");
}
}
Wynik jakoś mnie nie zdziwił. Wartość znowu nie została usunięta. Więc po raz kolejny zaglądam w Google i czytam te wszystkie posty jak to prosto jest usunąć wartość z SPPropertyBag. Mówiąc szczerze banał nie? Prawie jak ustawienia „Now Playing” w Windows Communicatorze.
W końcu po wielu przejrzanych stronach natrafiłem na ten sam problem… Chrissy Blanco, na swoim blogu opisuje dokładnie ten sam problem.
Morał z dzisiejszego postu jest taki: nie zależnie co mówi dokumentacja, my programiści wiemy lepiej!
Tak na wszelki wypadek:
SPPropertyBag.Remove nie działa
SPPropertyBag.Romove does not work
SPPropertyBag.Remove no funciona
PS.: jak znacie rozwiązanie na ten problem… to z chęcią o nim usłyszę
PS2.: funkcjonalność weryfikowałem pod WSS 3.0 SP1 ENG
- Pola Lookup field… na przykładach
-
Numero UNO: Mamy listę klientów, którzy pochodzą z różnych krajów i miast. Chcielibyśmy by miasto było ograniczone do kraju do którego należy. Czyli potrzebujemy Connected Lookup Field. Mamy teraz dwa wybory, albo zasiadamy, piszemy wymagania i następnie dłubiemy w kodzie, pot z czoła cieknie, dziewczyna krzyczy, że pranie niezrobione i zaczynamy wyglądać jak Penny z The Big Bang Theory, albo klikamy na poniższe dwa linki i nasza praca ogranicza się do decyzji… które pole wybrać ;)
· Connected Lookup Fields z MSDN Blogs
· Inne Connected Lookup Fields
Numero DOS: Pole lookup przeszukuje listę Przyjaciół, i teraz kiedy tworzymy nasz nowy element to chcemy by byli przyjaciele nie byli wyświetlani. I znów przed oczami mamy Penny… brrrr a taka fajna z niej dziewczyna była ;)
No to zaglądamy tutaj i kłopot z głowy.
Oczywiście możemy trochę się pobawić w programowanie i taki filtered lookup i łatwo do Cross-Site Lookup Field with PickerDialog można dodać czy to poprzez dodanie nowego parametru konfiguracyjnego i wykorzystaniu go przy ograniczeniu wyników wyszukiwania, czy też napisanie komentarza ;) i postaram się was skontaktować z osobą, która coś takiego zrobiła już rozszerzając tamto pole.
Numero TRES: Jak znajdziecie to dajcie znać ;) uaktualnię post.
Jaki jest ogólny morał tego postu?
Nie musi być Chuckiem Norissem by rządzić ;)
- Sticky Notes dla VS 2008 – to jest to!
-

Długo nie mogłem się zdecydować czy instalować czy też nie - ba… prawie rok już minął ;) Jednak kiedy to zrobiłem nie mogę przestać z nich korzystać! W końcu w jednym miejscu mogę sobie napisać co mam do zrobienia, co przekładam na później, jakie widzę issue i gdzie je widzę. Koniec beznadziejnych komentarzy w tekście o których człowiek potem zapomina… wysyła taki projekt/plik CS do klienta a klient na to „która *** to ta *** idąca po tej dupie” – prawie jak ukochana piosenka krasnoludów ;)
Dużą zaletą programu jest to iż, umożliwia on dodawanie komentarzy do plików źródłowych jak i do projektów, a dla chcącego można go łatwo rozszerzyć o inne jak BAT czy XML.
A więc gorąco polecam!!
Program można pobrać z:
· Code Samples na MSDN
· Visual Studio Code Gallery
- Kurtyny w górę!
-

Po 7 miesiącach od pomysłu w końcu jak to ujął Hellix zaczyna się kręcić :) Polska Grupa SharePoint (PGS) jest dla tych wszystkich, którzy chcą dowiedzieć się co to jest SharePoint i jak się go je w Visual Studio, dla tych którzy już wiedzą jak się je ale chcą wiedzieć jak zrobić Tort oraz dla tych którzy po prostu lubią lub chcą się dowiedzieć więcej na jego temat.
Mimo iż same prace nad grupą trwały niebagatelne 7 miesięcy, to strona powstała w niecałe 3 tygodnie a to dzięki:
· Chłopakom z CodeVibe w składzie Sławomir Kluczewski i Bartłomiej Stefanek, który stworzył layout grupy oraz logo;
· Konradowi Załogowskiemu z Contium, tajemniczej osobie - znana większości grupy z imienia – której majstersztyk wyszedł podczas tworzenia styli i dopasowywania grafiki na stronę, ogólnie rzecz mówiąc to taki ktoś do kogo dzwonicie i mówicie: pociąć trza byle by śladu nie było, metody mnie nie interesują byle by było załatwione i ten Fox się więcej nikogo nie czepiał ;)
· Michałowi Nikołajukowi z Contium – osobie, której się tak nudziło, że wraz z kolegą (Konradem) stworzył stronę :) a następnie założył odział Wrocławski Grupy ;)
Resztą spraw (zanim doszło do strony) zajęli się:
· Jakubowi Gutkowskiemu z IMPAQ – który jak zwykle przypadkiem znalazł się w nieodpowiednim miejscu o nieodpowiedniej godzinie ;)
· Kazikowi Kutcie z Software Mind– który miał tego samego pecha co Gutek ;)
Aktualnie grupa będzie odbywać spotkania w trzech miastach polski:
· Wrocław – Michał;
· Warszawa – Gutek;
· Kraków – Kazik;
Zapraszamy do odwiedzi strony, rejestracji w grupie oraz do uczestniczenia w pierwszym spotkaniu, które odbędzie się w Warszawie, 9 Grudnia o godzinie 18:00 w siedzibie Microsoft.
PS.: Podjęliśmy wszelkie starania by strona dobrze wyglądała pod IE jak i pod FF, jeżeli jednak zobaczycie jakieś niedociągnięcia proszę dajcie znać, dzięki 100 krotne!
- Coś się zbliża, coś fajnego
-
Jak to moja babcia mawiała: ptaszki ćwierkają że niebawem coś się stanie.
Ale jak powszednie wiadomo… ptaszki lubią być anonimowe i to co mogę teraz powiedzieć to:

I już więcej nic...

Zdjęcie z Flickr copyright by *Le seb*
I will speak no more przynajmniej do momentu jak już coś więcej będzie wiadomo :)
- WALL.E
-

Kto nie oglądał niech obejrzy, to oglądał wie o czym mówię :)
- Głupota boli! A VS 2008 na to nie pomaga ;)
-
No tak… dzisiaj spędziłem 20 minut… na szczęście tylko 20 minut nad rozwiązaniem błahego problemu, przynajmniej z pozoru.
Stworzyłem sobie projekt typu ClassLibrary do którego podpiąłem Microsoft.SharePoint.dll następnie stworzyłem klasę która dziedziczy po jednej z klas WSS (nie powiem jakiej, bo to temat na inny wpis… ;)). Ogólnie klasa SharePoint udostępniała zmienną publiczną MenuTemplateControl:

Zaś MenuTemplate dziedziczy po klasie Control:

Teraz, by dodać kontrolkę do MenuTemplateControl, należy do kolekcji Controls dodać np.: MenuItemTemplate:

Proste prawda? Wywołujemy sobie z naszej klasy base.MenuTemplateControl.Controls.Add i po kłopocie :) czyżby?
Po tym jak napisałem base.MenuTemplateControl coś takiego ukazało się moim oczom:

No tak, aby tego było mało, to stwierdziłem iż VS coś się pomylił chyba… więc wpisałem to co chciałem:

Więc już w ogóle zdziwiony, zacząłem grzebać, szukać co jest nie tak. Wywołałem dwie dyskusje i dalej nic.
Dopiero jak gadałem z % bo już nie wiedziałem do kogo się zgłosić wpadłem na genialny pomysł! Do projektu dodałem referencje do System.Web.dll i co? Blah!

Oczywiście tutaj się wywiązała dyskusja na temat ReSharpera ;) gdybym go miał to bym nie miał problemu :) no ale takie życie ;)
Takie dwie małe uwagi :) oraz podpowiedzi:
1) Jeżeli wykorzystujecie bibliotekę która używa jakiś wbudowanych bibliotek .NET Framework – załączcie je – jeżeli wiecie jakie to
2) Jeżeli nie wiecie jakie to… to olejcie błąd! Zróbcie build i otrzymacie taką informację (czemu na to nie wpadłem! Blah!);

I wszystko jasne :)
- Microsoft Certified Master/Architect MOSS 2007
-
Zastanówmy się nad tym… wydajemy około 1200zł by zdać 4 egzaminy z dziedziny SharePoint, mamy łącznie aż 4 tytuły MCTS – ładnie to wygląda na ścianie w garażu, można tym przykryć jakieś niedociągnięcia, czy to dziura czy też nie. Niektórzy wykorzystują w tym celu plakat prehistorycznej laski.
Nie zależnie od tego do czego wykorzystamy nasze piękne certyfikaty, MS chce nas wspomóc jeszcze jednym, najważniejszym, największym, najpiękniejszym. Certyfikatem oświadczającym, że jesteśmy masta, jedynymi i najlepszymi specjalistami od MOSS.
To co daje nam ten certyfikat, to informacja dla naszych pracodawców/klientów itp. że potrafimy pałeczkami złapać muchę. Po prostu nie ma rzeczy niemożliwych dla nas, jak ktoś mówi SharePoint, a firmy mówią Fiu Fiu, my zakładamy nasz kostium 4 kolorowego herosa i jednym ruchem ręki jak Chuck Norris zamieniamy słowa w cud.
Brzmi świetnie?
To zapraszam do przeczytania oficjalnej informacji o programie na SharePoint Team Blog, następnie na sam opis programu.
PS.: Chyba zapomniałem wspomnieć o tym… cena uczestnictwa w programie to zaledwie 18 625$, mhhh :)