Zgjidhja për problemin: “FileNotFoundException” Me Marresit mia Feature.

I was working on a feature last week that would add some event receivers to a specific list instance. (Unë blogged një grimë në lidhje me atë receiver lista këtu).

Duke përdorur command line, Unë mund të instaloj funksion me asnjë gabim (por shih më poshtë për gabimin e fshehur). When I tried to deploy the feature on the site, MOSS complained of a "FileNotFoundException" gabim. This blog entry describes how I solved it.

Ky është gabim që MOSS tregoi mua në shfletuesin e internetit:

Feature ‘b2cb42e3-4f0a-4380-aaba-1ef9cd526f20’ could not be installed because the loading of event receiver assembly "xyzzyFeatureReceiver_0" dështuar: System.IO.FileNotFoundException: Could not load file or assembly ‘xyzzyFeatureReceiver_0’ ose njëri prej varësi të saj. Sistemi nuk mund të gjeni skedarin e specifikuar.
File name: ‘xyzzyFeatureReceiver_0’
at System.Reflection.Assembly.nLoad(AssemblyName filename, Codi batë String, AssemblySecurity Dëshmi, Kuvendi locationHint, StackCrawlMark& rafte tokës, Boolean throwOnFileNotFound, ForIntrospection Boolean)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, AssemblySecurity Dëshmi, StackCrawlMark& rafte tokës, ForIntrospection Boolean)
at System.Reflection.Assembly.InternalLoad(String assemblyString, AssemblySecurity Dëshmi, StackCrawlMark& rafte tokës, ForIntrospection Boolean)
at System.Reflection.Assembly.Load(String assemblyString)
at Microsoft.SharePoint.Administration.SPFeatureDefinition.get_ReceiverObject()
WRN: Kuvendi logging detyrues është fikur.
Për të mundësuar dështim kuvendit prerjeve lidhin, përcaktuar vlerën e regjistrit [HKLM Software Microsoft Fusion!EnableLog] (DWORD) në 1.
Shënim: Ka disa performanca dënimi shoqëruar me dështim prerjet e lidhnin kuvendit.
Për të aktivizuar këtë funksion off, hiqni vlerën e regjistrit [HKLM Software Microsoft Fusion!EnableLog].

Troubleshoot çështje me Windows SharePoint Services.

Unë e di se si për të qëllimisht shkaktojnë atë gabim: don’t install the assembly in the GAC. Por, it was in the GAC. I normally install assemblies into the GAC by dragging them into the c:\windows\assembly folder using windows explorer. I’ve never felt 100% rehat duke bërë që për shkak gjithmonë kam menduar se gacutil ekzistuar për një arsye … so I tried that. It made no difference.

Unë kontrolloi dhe gjeti Internets këtë post: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2243677&SiteID=1

Poster ka ndodhur të jetë duke përdorur pak njëjtën rrënjë të kodit (nga libri Inside UK nga kjo listë) so that was a hopeful sign. Megjithatë, Sugjerimi i kuvendit ujdisje me një [asamble: ] directive didn’t make sense to me. I tried it anyway and I was right. It made no difference.

Then I noticed that my class definition was not public. I made it public and that made no difference.

Tjetër, I went to the trouble of enabling the "assembly bind failure log" (ndjekur udhëzimet dobishme dhe të sakta të parashikuara) and this is where things started to get interesting. That log shows me that the runtime is searching everywhere on that server for my assembly. It even appears to be searching for it in my medicine cabinet. Por … ajo nuk do të kërkoni për atë në GAC.

I put on my winter jacket and go searching the Internets again and find that someone has had this problem too. The lengthy discussion in that posting peters off into nothing and I can’t find a solution.

I move my assembly into one of the places the log claims it’s searching and I make a little more progress. I’m rewarded with a new error in the browser when I try to activate the feature:

Failed to create feature receiver object from assembly "xyzzyFeatureReceiver_0", type "Conchango.xyzzyFeatureReceiver" për funksion b2cb42e3-4f0a-4380-aaba-1ef9cd526f20: System.ArgumentNullException: Vlera nuk mund të jetë null.
Emri Parametri: lloj
at System.Activator.CreateInstance(Lloji Lloji, Boolean jopublike)
at System.Activator.CreateInstance(Lloji Lloji)
at Microsoft.SharePoint.Administration.SPFeatureDefinition.get_ReceiverObject()

Troubleshoot çështje me Windows SharePoint Services.

Koha për një udhëtim të fundit në Internets!

Këtë herë kam gjetur, parashikueshme të mjaftueshme, that MOSS issues this error because the assembly is not in GAC.

Unë dua të dal nga diçka pozitive për këtë dhe të përpiqen për të ndjehen pak krenare që kam krijuar I arratisur nga kuvendet MSIL, but it’s not working. I’m just plain annoyed. I find myself muttering "chicken or the egg" nën frymën time.

I finally decide to punt. I create an entirely new project and copy/paste the code from the incredible-cloaked-from-the-GAC-assembly non-working project over to this new project. (I look for a build flag called something like "hide from assembly binding if installed in the GAC" por nuk mund të gjeni një).

Kam instaluar dhe aktivizuar atë funksion dhe … ajo punon! Kështu, pas të gjitha që, I had to basically ‘reboot’ my project. Kjo është një tjetër arsye pse unë e urrej kompjutera.

I did learn something useful from this. I had been installing features using the stsadm command line all day long and been using the "-force" option out of habit. Për disa arsye, I did not use the -force option when I installed the new project. Këtë herë, Unë e bëri në fakt, truly forget to copy this new project’s assembly into the GAC. Si rezultat, I received that "FielNotFoundException" gabim. Këtë herë, Kam marrë atë nga stsadm, not when I tried to activate the feature via the web browser. Kështu, -force actually plays two roles. It allows you to re-install an existing feature. It also allows you to install a buggy feature that cannot work at runtime by suppressing the error. It probably says as much in the help somewhere but I never noticed it.

</fund>

Technorati Tags: ,

E diel Funny: Më i lartë 10 Mënyrat për të fyejnë Gruaja juaj

  1. Blej brokoli, kur ju e dini se nuk është tashmë më shumë se e mjaftueshme në frigorifer.
  2. Go for a run. Cool off. Take off clean pillow case and replace with T-shirt. Cover with clean pillow case.
  3. Kur makinës, pyesin nëse ne duhet të shkojnë në rrugën e gabuar poshtë një rrugë me një kalim.
  4. Për 15 vjet, every Sunday that you wife suggests going to a museum, express surprise that museums are open on Sunday’s.
  5. Për 15 vjet, occasionally suggest going to the local book store on Sunday. Express surprise that they are not open on Sunday’s (thanks a lot Blue Laws!).
  6. Përdorim 20 points to do a 3 point turn.
  7. On a cool early Fall afternoon, walk into the room and turn on the A/C. Complain that it’s cold. When wife says, "then why did you turn that on, silly" and gets up to turn it off, grab the warm spot she had on the couch. Bonus points if she does not realize you did it until much later.
  8. Open up a can of delicious white albacore tuna and eat it straight from the can, in bed, at night.
  9. Go into the kitchen while wife is eating dinner, open up the cutlery drawer and push utensils around until wife screams, "what are you looking for!"
  10. On receipt of new business cards, secretly place them all around the house: Under the bed, in pillow cases, inside coffee cups, in her purse, in coat pockets, car glove compartments, the pantry — anywhere you can think of.
  11. Write blog entries about your wife.
  12. Wake up.
  13. When walking the streets of New York City, be on the alert for "crusty" objects on the ground. Keeping in mind your wife’s special fears, reach down as if to pick one up up and ask, "hmm, I wonder what that is?" (Be prepared for wife to body slam you as if she’s a secret service agent protecting the President from a sniper or you’ll find yourself laying on your back on the sidewalk).
  14. Drive twice around a parking lot looking for space. You know you’ve really hit pay dirt when your son in the back seat yells, "Oh no! He’s doing it përsëri!"
  15. Write "top 10" lists that don’t have 10 artikuj.

===

Bonus wife joke:

Two male co-workers go out to lunch. One of them tells the other, "I let loose an embarrassing Freudian slip the other night."

"A Freudian slip? What’s that?"

"Well, when we finished eating, the waitress came by and asked how we liked our meals. I meant say, ‘I loved the chicken breast’ but instead I said ‘I loved your breasts’. I was so embarrassed."

"Ah," his co-worker replied. "I had the same thing happen to me this weekend with my wife. We were eating breakfast I meant to ask her to pass the butter, but instead I screamed at her, ‘You ruined my life!'"

</fund>

Technorati Tags:

ID Event 1023: “Windows-i nuk mund të ngarkesës MSSCNTRS Extensible counter DLL”

UPDATE (04/08/08): I seem to have solved this problem. From the command line, I ran "c:\windows\system32\lodctr /R" as per an entry talking about InstallShield problems and that appears to have solved it for me.

I have noticed that lately, my desktop/server fan never turns off. I know it used to turn off. I took a moment to check it out noticed that the a VMware process was running a consistent 20% utilization on one of the CPU’s. I checked the event log and saw these errors in the application log happening dozens of times per minute:

Windows cannot load extensible counter DLL UGatherer, the first DWORD in data section is the Windows error code.

Windows cannot load extensible counter DLL UGTHRSVC, the first DWORD in data section is the Windows error code.

Windows-i nuk mund të ngarkesës MSSCNTRS Extensible counter DLL, the first DWORD in data section is the Windows error code.

If I drill into the details of one of those messages, Unë marrë këtë:

Burim: Perflib

Lloj: Gabim

Kategori: Asnjë

ID Event 1023

I did some research and there was some indication it could be a permission problem in terms of access to the DLLs in question. I played around with that stuff but could not affect things in a positive way so I gave up on that.

VMware kishte qenë bezdisur mua në lidhje me kryerjen e një update për mjaft kohë, kështu që unë jotted poshtë versionin e kisha instaluar (apparently "1.0.1 build 29996") and did the update. This upgraded me to v1.04. Mjerisht, ajo nuk e ka rregulluar këtë çështje.

I can stop the insane number of messages going to my application log if I shut down a service named "VMware Authorization Service". This prevents me from using the VMware software, kështu … not such a great option.

Sistemi operativ host është Windows XP 64 bit.

I don’t think this has always happened, but I don’t recall any particular event that might have led to it.

This is why I hate computers.

</fund>

Technorati Tags:

I shpejtë & I lehtë: Rename Skedari i ngarkuar duke përdorur modelin SharePoint Object Via një marrës Event

UPDATE: This works but there are significant limitations which are described in the comments. This may still be useful in some cirumstances.

UPDATE 2: Në projektin tim aktual, users always upload documents. Si rezultat, I don’t run into a problem where MS Word is running and thinks that the file was renamed on it. I did run into a problem, "the file was modified by someone else" and solved this via a simple semaphore type flag. Users need to change a meta data field from its default value to something else. The itemupdated() marrës duket për një vlerë të vlefshme atje para se të vërtetë kryerjen e riemërtoj dhe që atëherë, I have not had any problems. Your mileage may vary.

I have a client requirement to change the name of files uploaded to a specific document library to conform with a particular naming convention. The API does not provide a "rename()" metodë. Në vend të kësaj, ne përdorim "MoveTo(…)". Here is a minimal bit of code to accomplish this:

 publik shkel pavlefshme ItemAdded(SPItemEventProperties Prona të paluajtshme)
        {
            SPFile f = properties.ListItem.File;

            f.MoveTo(properties.ListItem.ParentList.RootFolder.Url + "/xyzzy.doc");
            f.Update();

        }

The only tricky bit is the "properties.ListItem.ParentList.RootFolder.Url". The MoveTo() method requires a URL. That mashed up string points me to the root folder of my current document library. This allows me to avoid any hard coding in my event receiver.

Ky është një version më i dobishëm që e bën të njëjtën gjë, but assigns the name of the file to "Title":

 publik shkel pavlefshme ItemAdded(SPItemEventProperties Prona të paluajtshme)
        {
            DisableEventFiring();

            // Cakto titullin e këtij zëri në emër të vetë dosjes.
 // SHËNIM: Kjo detyrë duhet të bëhet para se të modifikojë file vetë.
 // Thirrja përditësim() në SPFile duket të zhvlerësojë pronat në
 // disa ndjenja.  Updates to "Title" arriti deri në atë ndryshim (dhe perditesimi() thirrje)
 // u zhvendos në frontin e ndryshimit të emrit të file.
            properties.ListItem["Title"] = Properties.ListItem.File.Name;

            properties.ListItem.Update();

            SPFile f = properties.ListItem.File;

            // Get zgjatjen e dosjes.  Ne kemi nevojë që më vonë.
 varg spfileExt = i ri FileInfo(f.Name).Zgjatje;

            // Rename file me ID e list item-së dhe të përdorni të file extension për të mbajtur
 // se një pjesë e saj e paprekur.
            f.MoveTo(properties.ListItem.ParentList.RootFolder.Url +
                "/" + properties.ListItem["ID"] + spfileExt);

            // Commit lëvizje.
            f.Update();

            EnableEventFiring();
        }

Forum: Zbatimi i praktikave më të mira Pajtueshmëria në Non-Trivial Mjedisit MOSS

A fellow, "Mark", has started up a potentially interesting newsgroup discussion focusing on "establishing excellent SharePoint Governance from the start" for a 35,000 user environment.

The discussion is here: http://groups.google.com/group/microsoft.public.sharepoint.portalserver/browse_thread/thread/6d9a738d981af772/1c390b15c5407db6?#1c390b15c5407db6

Pop on over and contribute!

</fund>

Custom URL Veprimi nuk do të shfaq për tipar i ri

I’m still in the habit of crafting my feature XML files by hand since it’s all quite new to me. I don’t want to rely on a front-end tool that does stuff I don’t understand (ai tha se si ai u shkroi një blog entry duke përdorur një mjet që ai nuk e kupton).

Sot, I was trying to add a custom action to the site settings but it just wouldn’t show up. I could install the feature and see it in the site features, por kur kam aktivizuar atë (pa gabim) ai thjesht nuk do të tregojë deri në drop-down menu.

I finally realized that I misspelled "SharePoint" në atributin Vendndodhja së <CustomAction> node. This is the bad elements.xml file:

<?xml version="1.0" encoding="utf-8" ?>
<Elemente xmlns="http://schemas.microsoft.com / SharePoint /">
  <CustomAction
 Id="SiteActionsToolbar"
 GroupId="SiteActions"
 Vend="Microsoft.Sharepoint.StandardMenu"
 Rend="100"
 Titull="Përshëndetje!"
 Përshkrim="Veprim Custom menu shtuar nëpërmjet një tipar."
 ImageUrl="_layouts / images / menuprofile.gif">

    <UrlAction Url="http://www.xyzzy.com"/>

  </CustomAction>
</Elemente>

Mirë:

<?xml version="1.0" encoding="utf-8" ?>
<Elemente xmlns="http://schemas.microsoft.com / SharePoint /">
  <CustomAction
 Id="SiteActionsToolBar"
 GroupId="SiteActions"
 Vend="Microsoft.SharePoint.StandardMenu"
 Rend="100"
 Titull="Përshëndetje!"
 Përshkrim="Veprim Custom menu shtuar nëpërmjet një tipar."
    >
    <UrlAction Url="http://www.xyzzy.com"/>
  </CustomAction>
</Elemente>

That one took me a good two hours to figure out 🙂

Kam marrë ngushëllim në faktin se disa ditë në të ardhmen, Unë do të jetë në gjendje të themi me bindje, "back in the day, Unë kisha për të ecin tre kilometra deri kodër në dëborë (zbathur!) in order to deploy a custom feature to MOSS. You kids, ju nuk e dini se sa e lehtë që ju të keni atë! Get off my lawn!"

Nuk mund të presim.

</fund>

Technorati Tags: ,

Blog Stats

I thought some people might be interested in my blog’s statistics. You can use mine as a benchmark to compare your own.

I’m running my blog on windows live spaces. They collect stats for me and I don’t know any way to control that. It’s good as far as it goes, but it’s fairly limited in that I can’t do much actual analysis with it. I’d love, për shembull, to be able to generate a listing of my most frequently hit posts but I can’t do that without a prohibitive manual process. If someone knows better, please tell me.

Live spaces status tell me: total hits for the day, total hits for the week and total hits since day zero. It also tells me what people did to get to my blog (e.g. google, MSDN forum link, etj).

In some ways, a "hit" është e qartë. If you’re reading this sentence right now, you’ve almost certainly registered as a single hit.

RSS is a little confusing. On one hand, I see individual RSS hits all day long. Por, I also see RSS "sweeps". A sweep is when I see 20 ose 30 RSS hits all within a one or two second window. I assume these are automated things like google checking in on my site, maybe other people’s browsers … jo i sigurt. They are definitely some kind of automated process. I cannot tell, megjithatë, how many of my total hits are automated and how many have an actual human on the other side. I would guess at least 100 hits per day are automated.

On to the numbers!

I wrote my first blog entry on July 27th, 2007.

I have written approximately 60 blog entries since then, more than 50 of which directly relate to SharePoint.

I started to keep track of of my hits in a spreadsheet on a daily basis at the end of September.

Monthly Starts:

First week of: Total Hits
Tetor 1,234
Nëntor 2,162
Dhjetor 3,071
Janar 2008 4,253

Total by Month

Month Total Hits
Tetor 6,620
Nëntor 11,110
Dhjetor 13,138

High Water Marks

Lloj Total Hits
Best Day 958
Best Week 4,253
Total Hits Since Day Zero 42,438

I’m interested in others’ stats. If you care to share yours in the comments, please do!

</fund>

Technorati Tags:

E diela Morning Funny: “Vërtet, vërtet, vërtet. Llafe, llafe, blah.”

Rreth gjashtë vjet më parë, Djali katër-vjeçar ime dhe unë u shikuar një lart Discovery Channel "shark attacks" i veçantë (ndoshta kjo). He was very young at the point and I was always worried what he might see on a show like this and how he might take it. I didn’t want him to develop, për shembull, ndonjë Frika speciale i ujit ose llomotis diçka e papërshtatshme për miqtë e tij dhe mundësisht të shkaktojë rrjetin shoku i tij fëmijë që do të vijnë crashing down.

Discovery handles these kinds of subjects very well. It’s not about creating a frika e diçka, but rather to show how unusual it is for sharks to attack humans.

Kështu, we’re watching it and there is this one particularly scary attack involving a small girl. As Discovery is building the drama of the attack, biri im (i cili ka qenë gjithmonë shumë i nevrikosur gjithsesi), is getting very excited. I make some noises about how unusual it is for sharks to attack people, and how bad the poor girl must feel. I’m trying to explain that people recover from these events and become stronger for it. Megjithatë, I had misinterpreted his excitement. He was not worried about the girl at all. Në vend të kësaj, ndërsa duartrokitje duart e tij, ai tregon mua, "The sharks love it! It’s terrific. It’s wonderful. Its a DREAM COME TRUE!"

Mendova se kjo ishte hilarious, but also very disturbing. Nga njëra anë, Unë kam qenë i kënaqur — madje edhe një pak krenar — se ai mund të ketë ndjenja të forta empatik, cross-species though they may be. As humans, we need to develop our "empathic muscles" kështu që të flasin, ose ju do të përfundojë si ky djalë 🙂 On the other hand, he was feeling cross-species empathy toward a species who was exhibiting behavior inimical to his own. I was really struggling with this when the narrator used the word "paradigm". My son picked up on that and asked me what that meant.

Kjo nuk është e tillë një fjalë e lehtë për të përshkruar në një vit katër vjetër, but I gave it a try. When I think of the word "paradigm", Thomas Kuhn is never far from my thoughts. Kam lexuar Struktura e revolucioneve shkencore mbrapa në Lafayette dhe për mirë apo për keq, the word "paradigm" is pregnant with extra meaning for me. (Sort of like the word "contact" pasi dëgjoi një zë Telefon Movie thoni ku unë mund të shoh se filmi [Mendova se libri ishte më e mirë]; Unë gjithmonë them vetes, "CONTACT!" whenever I see or hear someone say "contact").

Dosido, Unë jam duke u përpjekur për të shpjeguar atij një përkufizim Kuhnian, that it’s "a historical movement of thought" and that it’s a "way of thinking with a number of built-in assumptions that are hard to escape for people living at that time." Sigurisht, ju nuk mund të flasim si për një mandat katër-vjeçar, so I’m trying to successively define it to smaller pieces and feeling rather proud of myself as I do so. (Unë vetëm e dinte se dikush jashtë kolegj do të kujdeset që kisha lexuar Kuhn!).

I’m just warming to the task when he interrupts me. Waving his hand në drejtimin tim përgjithshme dhe kurrë duke marrë sytë e tij jashtë një tjetër sulm peshkaqeni brutal, ai vetëm i thotë:, "Yeah, vërtet, vërtet. Llafe, llafe, blah.".

So much for that 🙂

Në atë moment, Unë vendosa të largohem, retorike folur, rri duarkryq, dhe gëzojnë të shikuar peshkaqenë njerëzit sulmojnë me djalin tim.

</fund>

Technorati Tags:

Switch Shiko Based on User ID në një formë InfoPath

Ne kishim një zhvilluar një formë InfoPath me pamje të shumta për të mbështetur një qira të ri / on-boarding process. When the company hires a new person, departamenti IT dhe grupe të tjera kanë nevojë për të marrë veprim (ngritur pagave, mundësojë qasje në aplikimet përkatëse, gjetur një tavolinë, etj). We use on form but a different view of the form for each of those functions.

Në këtë kompani, shumica e njerëzve të përfshirë në procesin e biznesit janë të IT-tru, kështu që kur ata të hyni në formularin, their default view is a "menu" view with buttons that direct them to their specific function. Megjithatë, we needed to simplify things for the new hire’s direct manager. This person should not see any of the IT related stuff. Në të vërtetë, ajo duhet të shikoni vetëm një pamje e formës dhe të mos ketë edhe një mundësi për të parë pikëpamjet e tjera.

Në rastin tonë, që përbëjnë menaxherit direkt është i lidhur direkt me mirësjellje formen e nje kontaktoni selektorin (which I am always wanting to call a "people picker" për disa arsye).

Hapat janë si më poshtë:

1. Në regjimin e dizajnit, shkoni tek Tools -> Options Forma -> Hapur dhe Save.

2. Select "rules".

3. Create a new rule whose action is "switch to view" dhe gjendja e të cilit thekson emër përdorues() funksion.

userName() returns the "simple" user name without the domain. If I log into SharePoint with credentials "domain\pagalvin", userName() returns "pagalvin".

The contact selector provides three bits of information for a contact. The "AccountID" portion is most useful for this scenario. The only thing that makes this even a little bit of challenge is that the contact selector (në mjedisin tim gjithsesi) kthen domain dhe përdorues ID, as in "domain\pagalvin". This prevents us from doing a straight-forward equality condition since AccountID ("domain\pagalvin") kurrë nuk do të jetë e barabartë emër përdorues() ("pagalvin").

We can get around this using the "contains" operator: AccountID përmban Username().

Ne mund të marrë atë më tej dhe para-pend një hard-coded domain në frontin e USERNAME() funksionojë për të marrë barazinë tonë të kontrolluar dhe eliminuar rrezikun e një rreme pozitive mbi përmban operatorin.

We would have REALLY like to automatically switch view for other users based on their AD security group membership. Për shembull, when a member of the "IT Analytics" Grupi accesses formularin, automatically switch to the IT Analytics view. We didn’t have time to implement it, but my first thought is to create a web service that would have a method like "IsMemberOfActiveDirectorySecurityGroup", kalojë ajo userName() and return back true or false. Does anyone have any other, më shumë ide e zgjuar? Is there any SharePoint function we can leverage from InfoPath to make that determination?

</fund>

Technorati Tags:

Aksidentalisht Shtimi Kodin në një formë InfoPath; Qëllimisht hequr atë

Kur punon me butonat në një formë, we often add rules. You access the rules editor from the properties of the button.

Kur klikuar rreth shpejt, it’s easy to accidentally click on "Edit Form Code" instead of "Rules …".

Hera e parë që unë e bëri këtë, I canceled out of the code editor. Megjithatë, kur unë u përpoq të publikojë një formë, ndërsa pak më vonë, it required that I publish as an "Administrator-approved form template (i përparuar)". I didn’t actually do any programming and I absolutely didn’t want to go through an unnecessary approval process. I was in a bit of panic at the time due to time constraints. To get past it, I simply restored a previous backup and continued. I had recently seen some blog posts about people going into the form’s XML to tweak things and I was afraid I would have to do something similar.

Sot, I did it again. Këtë herë, Unë kisha një kohë pak më shumë në duart e mia dhe gjeti se ju lehtë mund të prish këtë.

Shko tek:

Tools -> Options Forma -> Programim: "Remove Code"

Ajo nuk ka marrë shumë më e lehtë se sa që.

</fund>

Technorati Tags: ,