Aparently I have written something on that note before for CMS 4 and it looks like someone still needs it as I got a request for an updated version for it a couple of days ago. So here we go:

for the most part the syntax for the call is equivalent to what is was before so go to my previous article regarding that (check out the old article for details). What I?ve added this time around is:

  • the @PropertyName can be declared as ?%? if you want to look in all property names
  • @PropertyType can be ?1 if you want to look in all property types otherwise you need to specify type id (this has changed from type name before due to database schema changes)
  • additionally this version of the stored proc will only look in the Master language Branch, so it will work for the single language pages and for multi-language but for language agnostic properties. (should you require the language to be variable the change is pretty simple ? I can send you the updated version by email.
/****** Object:  StoredProcedure [dbo].[PagedSearch]    Script Date: 07/07/2009 12:18:10 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[PagedSearch]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[PagedSearch]
GO

CREATE Procedure PagedSearch
    @Condition varchar(1024),
    @PropertyName varchar(1024),
    @PropertyType int,
    @PageSize int,
    @PageNumber int,
    @Offset int
AS
BEGIN

    DECLARE @RowStart int
    DECLARE @RowEnd int

    SET @RowStart = @PageSize * @PageNumber + @Offset;
    SET @RowEnd = @RowStart + @PageSize + @Offset;

    WITH PageRefs AS
        (SELECT page.pkID as PageId,
            ROW_NUMBER() OVER (ORDER BY pageLang.StartPublish DESC) as RowNumber
            FROM tblPage page, tblProperty propValue, tblPageDefinition propDef, tblPageLanguage pageLang
            WHERE page.pkID = propValue.fkPageID
                AND page.fkMasterLanguageBranchID = pageLang.fkLanguageBranchID
                AND page.pkID = pageLang.fkPageID
                AND propValue.fkPageDefinitionID = propDef.pkID
                AND (@propertyType = -1 or propDef.fkPageDefinitionTypeID = @propertyType) -- is proper type
                AND propDef.Searchable = 1 -- the property is searchable
                AND propValue.String like @Condition -- contains facets
                AND propDef.[Name] like @PropertyName) -- property of proper name
    SELECT PageId
        FROM PageRefs
        WHERE (RowNumber Between @RowStart and @RowEnd) or (@PageSize = 0);
END
GO

However… looking how the schema has changed over time, I am not convinced this approach is really the best one for someone who is not prepared to deal with the changes (e.g. you better be able to change the stored procedure based on the schema changes – or bribe me with pizza and beers for updates :) ).

Additionally this procedure only searches for properties that store their value in Short string field. To make it look into long string you need to Change the highlighted line to.

AND (propValue.LongString like @Condition)

or alternatively to look in both change it to:

AND ((propValue.String like @Condition) or (propValue.LongString like @Condition))

Enjoy!

Eric Evans on Domain Driven Design

Eric Evans of Domain Driven Design will be giving a talk at PUT just before Eclipse DemoCamp, June 24th @ 18:00.  Cognifide are sponsoring the event and it would be a great chance for you guys to dust of those design skills.  Domain Driven Design is going to be course that we hope to run out of the Cognifide Office late this year with the a little help from our friends at Skills Matter.

Register for the Domain Driven Design that is platform-neutral and in fact, Eric gives .NET and Java versions of the courses.

More on Eric & DDD:
http://skillsmatter.com/course/design-architecture/domain-driven-design
http://skillsmatter.com/podcast/design-architecture/domain-driven-design
http://www.infoq.com/interviews/domain-driven-design-eric-evans

SoakIE ? a Web Server Stress Tool with a twist

Last week or so ago a couple of friends in another project in Cognifide has run into a wall while trying to load test their website. the problem was as follows: The website is highly AJAX based ? the page merely loads a stub in the initial request but then loads the rest of its data in a dynamic matter therefore a traditional web testing tools are fairly useless. What they tried was to setup a number of Selenium clients to pound the server, but that turned out to be fairly challenging to the machine doing the testing. It was not possible to set up more than 10 clients on a fairly strong machine.

Also there are other limitations like time to wait for the server to timeout and time between clicks, which I am not sure the tool allowed them to adjust. Talking to them I recalled a tool for grabbing website thumbnails long time ago. one way for them would be to to make a batch file with it. The tool would grab the sites? thumbnail and stress it, but they would still have to setup a number of clients. Also it creates and tears down an instance of IE every time, making it?s not optimal for that task.

So a couple of evenings later (and a few back-s and forth-s during the testing sessions) out comes SoakIE:

SoakIETest

Read the rest of this article »

SoakIE ? a Web Server Stress Tool with a twist

Last week or so ago a couple of friends in another project in Cognifide has run into a wall while trying to load test their website. the problem was as follows: The website is highly AJAX based ? the page merely loads a stub in the initial request but then loads the rest of its data in a dynamic matter therefore a traditional web testing tools are fairly useless. What they tried was to setup a number of Selenium clients to pound the server, but that turned out to be fairly challenging to the machine doing the testing. It was not possible to set up more than 10 clients on a fairly strong machine.

Also there are other limitations like time to wait for the server to timeout and time between clicks, which I am not sure the tool allowed them to adjust. Talking to them I recalled a tool for grabbing website thumbnails long time ago. one way for them would be to to make a batch file with it. The tool would grab the sites? thumbnail and stress it, but they would still have to setup a number of clients. Also it creates and tears down an instance of IE every time, making it?s not optimal for that task.

So a couple of evenings later (and a few back-s and forth-s during the testing sessions) out comes SoakIE:

SoakIETest

Read the rest of this article »

SoakIE – a Web Server Stress Tool with a twist

Last week or so ago a couple of friends in another project in Cognifide has run into a wall while trying to load test their website. the problem was as follows: The website is highly AJAX based – the page merely loads a stub in the initial request but then loads the rest of its data in a dynamic matter therefore a traditional web testing tools are fairly useless. What they tried was to setup a number of Selenium clients to pound the server, but that turned out to be fairly challenging to the machine doing the testing. It was not possible to set up more than 10 clients on a fairly strong machine.

Also there are other limitations like time to wait for the server to timeout and time between clicks, which I am not sure the tool allowed them to adjust. Talking to them I recalled a tool for grabbing website thumbnails long time ago. one way for them would be to to make a batch file with it. The tool would grab the sites’ thumbnail and stress it, but they would still have to setup a number of clients. Also it creates and tears down an instance of IE every time, making it’s not optimal for that task.

So a couple of evenings later (and a few back-s and forth-s during the testing sessions) out comes SoakIE:

SoakIETest

Read the rest of this article »

Advanced Language Manipulation Tool for EPiServer

Have you ever (or have your customers) created and edited a page in one language only to realize that their selected locale was wrong? Have you ever wished you could delete a master language branch of a page  after creating its localized counterpart but you could only delete the newly created slave language instead? Have a customer ever requested that they could copy a whole branch and you convert it to another language so that they could then translate in-place?

Well I have? and I?m sure I will. And so did Fredrikj on the our #epicode IRC channel ;).

Basically I had the tool that would convert from one language to another, but Fredrikj requested something that would switch master language of a page from one to another. Since I?ve already had some of the work done, I?ve updated the stored procedure I?ve written some time ago and slapped a nice GUI up on it. Here?s the result:

 

AndvancedLanguageTool

What the tool allows you to do is perform either language conversion or master branch switching on a selected page and all of its children (if you choose so).

The stored procedure have been updated to work on CMS5 R2 (will no longer work on R1 ? but if you need that functionality, comment here or give me a shout and I?ll create a compatible version for you).

A word of caution though ? I take no guarantee whatsoever about its operation. Especially, if you wreck your client?s database with it. I did what I could to prevent some of the obvious problems (like switching to a non existing master or converting to an existing one) but I will not be responsible if it won?t work for you. make a database backup and experiment there before you do any changes on the real data. That said ? it works for me, so I think it should also work for you.

You can download the archive containing the tool here. unzip it to your EPiServer web application folder keeping the folder structure or the plugin reference will be wrong. Include the *.aspx and the *.cs files in your project and apply the SQL file to your database (The manipulation is performed by a stored procedure located in the file).

Also if you?re performing the change in a load balanced environment, you may need to restart the other servers once you do the changes. I reset the DataFactory cache, but I am not sure it propagates through to other servers.

My private little G1/Android wish and hit list

First of all, I have to say that I like the phone a lot. While you may get an impression from the rest of the post that I have a lot of beef with the phone, that’s really not the case. The very fact that I can compile a short, coherent list of things that I think could be improved upon, made me realize how little there is to be wishing for. And none of the problems is a deal breaker. It’s not like the phone is missing Copy&Paste or MMS ;). It does almost all I expected it to do (even in version 1.0), but since a few of my colleagues is looking forward to get one I thought I’d throw in a list of the little annoyances that I have faced using it, so they might verify how important the drawbacks might be to them. I am not sure how many of those can be addressed with third party applications but, for sure not all of them can, and I would definitely love Google to step in and provide a system-fix for them at some point.

The Wish List

Look for wireless networks more aggressively

Basically I find that very often I am still talking to the cell network when I could perfectly well be connected through a Wi-Fi. Turning Wi-Fi off and then back on again corrects the problem. This is annoying on a couple of levels. I have 3G turned off to conserve battery, It not noticing the Wi-Fi actually slows me down quite a bit, not to mention using up the precious data from the data plan (it’s only 500MB on the G1 plan in Poland)

Fix the battery problem

I mean really… 1 day is the best it can do when I do pretty much anything during the day with it. I could live with it being a little bit bigger if I didn’t have to fear it will die on me before the evening. I realize that this is because we have background apps, but perhaps you can introduce a CPU throttle technique that will slow down the operation when the horse power is not really needed. Perhaps something the next gen hardware will have to address.

Allow me to have multiple identities

The first thing you do when you start the phone is linking it to a Google account. That provides you with a really nice integration of Google calendar, mail & contacts. And it?s not just setting up apps for it. The whole system is aware of your identity and any app that wants to (and that you allow it to), might use them as a service. For example, a to-do list is able to schedule events in your Google calendar and setup mail notifications and send over mail invites your contacts to a meeting. It can reserve a time in your calendar for shopping that your wife has asked you to do. that?s great but? why is my phone fixed to a single Google identity? And yes, I realize that I can send email to and from multiple mail accounts and access other calendars through the browser. That’s not the point. I want BE adam.najmanowicz AT cognifide.com when I’m at work and BE adam AT najmanowicz.com when I’m leaving the office. I have a perfectly fine 8GB card sitting idle in it that could easily store a number of identities and swap between them. I want to be able to manage multiple calendars conveniently and have applications like to-do lists tied to them. Come on Google, even Windows 95 could do it! Introduce multiple profiles with easy switch!

Application uninstallation directly from the App drawer

Android Marketplace is a great repository that you can get plethora of apps quickly. It’s a blessing… and a curse. It’s a major pain in the rare to hunt the apps that you want to remove on the mile long list of apps that additionally re-populates after every uninstall without keeping track of where you left off while removing the previous app.
In the perfect word I could long-tap an icon and additionally to dragging it to the desktop I could drag it to some uninstaller corner.

The ?Must haves?

That’s as much for anyone else as it is for my reference should I need to reset the phone to factory settings.

DroidWiki

A wiki like notepad. Supporting some basic wiki mark-up and links between notes. Brilliant idea, great implementation, perfect placement for a wiki!

Useful switches

This is what you will use to turn your Wi-Fi off and on again when it will fail to connect to the Wi-Fi again.

Astrid

Versatile and powerful, yet simple and elegant to-do list

Skype (Beta)

Naturally if you are using the Skype network. This is a native and group chat supporting Skype client.

Twidroid

So far my client of choice for Twitter. This is indispensible if you’re a part of the twitter craze.

The weather channel

Weather channel gizmo that allows you to check the weather for any area in the world at any time.

ConvertAll

Convert any unit to another.

Tricorder

For the geek cred.

Conclusion

Again, I need to reiterate, this is the best phone I’ve ever had. Having a full physical QWERTY keyboard and a browser with me all the time has definitely changed my life. I’m much more organized. I can track stuff much better and I have my priority list and my schedule always with me accessible from web as well as from the phone. The integration with Google apps is a tremendous selling point and none of the issues is a real deal breaker for me. Yet, this is the stuff that I will look up to in the following system releases.

Posted in Android, G1, Gmail, Google, GSM, Mobile, Rants
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...
| 82 Comments »

Immediately after you implement the VirtualPathProvider proxy from my previous post you will notice a one fairly serious lack in it. Namely all the files within that provider will be hiding behind the registration form. That is not cool for a couple of reasons?

  • You may want to keep all of the files in one store ? being forced to put them into a designated folder is not desired.
  • You may want to make some file freely available for some time and lock it after a while, or the other way around (e.g. to allow the robots to crawl it initially). having to move them is just silly and defeats the purpose.

So how do you discriminate the files that you want locked from those that you want to be publically available, and potentially from those that you want only the logged in users to be able to get?

Specifying the EPiServer File Metadata sweetness

One of the potential solutions would be to define a special rights group and check for that group for the people that have your ?registered? magic-cookie. That however introduces a bogus group, and I would rather like to avoid that. However if you look into the FileSummary.config file that?s located in your web application folder you will find a slightly mysterious content. A bit of hacking reveals that you can actually add your own metadata to the file. For example adding the access rights based on what I?ve established above would look as follows (the content you can already find in the file that comes with the public templates that-we-all-oh-so-love is skipped):

Read the rest of this article »

Simple registration for files served by EPiServer

With the culture of knowledge sharing and open source spreading, everyone races to show they have something valuable that you may want. And while you may not ask for money for your content you may still want to get something in return, say a contact, an email address that?s verified (or not), to keep in touch with the consumer of your content.

Yet a full fledged registration doesn?t seem like a proper thing to do ? cluttering your EPiServer user repository with (let?s face it ? for a large part fake or temporary email addresses that user create only to get your content).

While there may be a lot of ways to handle that (streaming it through a page Response.WriteFile might seem as one of the more obvious ones), I would like to show you a cleaner, simpler and more elegant way that I?ve come up with.

We really don?t want people to deep link to our files without them knowing the files are from our site, that?s just rude ? so hiding them behind an obscure URL wouldn?t work (thus we cannot use the regular file providers). We?ve already establish that we don?t want to log them in, so setting file rights are useless. But I want all the benefits including client-side caching.

Basically the solution boils down to creating a thin layer over the File provider of our choice, in my case the versioning file provider. The only method we need to override in it is GetFile. I want to allow downloading for logged in users and I want to allow downloading for all users that have a ?magic-cookie? set. If either of the conditions are met, the file just downloads using the underlying provider?s routines including all the logic EPiServer has put for caching and rights. But if neither of the requirements are met, the user is directed to a page of our choice.

Read the rest of this article »

Merged contacts in gmail rendered uneditable – the fix

Long story short. Bought G1 lately so I’ve decided to bring peace to my tormented contact list once and for all. Editing in Gmail is… adequate. I’ve been able to import most of my contacts – naturally countless of those were duplicates as I integrated my mail contact list and my phone contact list. Where gmail contacts list editing excels is at allowing you to merge those.

It?s incredibly convenient:

gmail_merge_contacts

And fairly deadly to the merged contact. Once those contacts are merged and you save them but later try to come back to them to re-edit, I?ve noticed that whenever I select them for editing after that, they don?t pop up for the task, but instead the previously selected contact is being opened for editing. I can see the details of such contact, it synchronizes with the phone perfectly, just the editing won?t work.

Browsing through gmail support groups I?ve found out that a lot of people have this problem but somewhat it eludes Google. People suggest that clearing up cookies or history worked for them. No luck here.

What did the trick though was exporting all of them to the Google CSV:

gmail_merge_contacts2

 

Deleting all the contacts and then importing them back. Unfortunately once you do that all the associations they?ve had with the groups that youv?e defined are gone, but at least you can edit them again!

Posted in Android, Gmail, Google, GSM, Mobile, Solution
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5.00 out of 5)
Loading...
| 9 Comments »