As I started to work with Mercurial, I added almost everything in single repository. Time passed and I wanted to move some data to separate one. And this became a problem. There is no obvious way to split repository. However, there is something almost as good - exporting it.
Since I am Windows user, I will give instructions for Windows here. All things should work on Linux also but configuring it to work properly might (and will) differ. I will also assume that you have Mercurial already installed. I tested this with TortoiseHg but other clients should work also.
First step is to enable ConvertExtension on our computer. Just editing “mercurial.ini” under home folder and adding two lines will do:
[extensions]
convert =
If there is “[extensions]” sections inside already, just add “convert =” under it instead of creating new one. Home folder on Windows Vista and 7 is probably located at “C:\Users\YourName”. XP users should look under “C:\Documents and settings\YourName”. If you moved it somewhere else, search for it yourself. :)
Another file that we need to prepare is one used for filtering out things we do not need. Lets store it at “C:\map.txt” and add following text to it:
include "Electronics/Elsidi"
rename "Electronics/Elsidi" "."
Text in quotes is location of directory in original repository. First line includes only files at directory we wish to extract and second one moves those files to root directory (.) of new repository. Do notice that we use paths relative to root of repository and that path IS case sensitive.
I will assume here that “hg.exe” is somewhere in path so you can execute it without problem. In other cases, just write full path to it every time I write “hg”. In my case this is “C:\Program Files (x86)\TortoiseHg\hg”.
Last thing to do is executing conversion itself and update of new repository afterward:
With this you should have your new repository ready. Only files under desired path will be there (moved to root) and all history will be preserved.
Revmap.txt is here just so you can continue interrupted process. If you want to start whole process from start just delete both it (revmap.txt) and new repository’s directory (C:\NewRepository).
Hope this works for you.
P.S. If you see “C:\NewRepository” with just “.hg” folder inside and nothing else, you probably forgot to execute “hg update” command.
P.P.S. This procedure will leave exported data in original repository. You might remove it yourself but do notice that you will not recover any disk space - nothing is really deleted with Mercurial.
When GUIDs got introduced, people started using them as primary keys (which is ok) and, because of default, most of those GUIDs ended up as clustered index.
Clustered index itself tries to keep values that are close to each other in binary form also close in physical order. This is fine for data that is usually just increasing (like integer identity column) but it is not as good when you have random data. Unfortunately GUIDs (as created with NewId function) are closer to random than to any other order.
NewSequentialId function was introduced to solve this exact problem. It will return values in increasing order but with small catch - it is guarantied only until you restart Windows. Once you reboot Windows starting value might be lower than last one inserted.
Shit really hits the fan if you need to combine date from more than one server. Each one will generate completely different set of increasing GUIDs. This will wreak havoc for your clustered index. Fragmentation, here we come.
And what is result of this “fight”? Should one use NewId or NewSequentialId function?
It simply does not matter. Once you remove clustered index issue from decision process, either function works fine. And I cannot say that I see any scenario where clustered index on GUID is appropriate.
Am I missing something?
P.S. Personally, I would go for NewId - it is shorter to write and it is more user-friendly.
I loved Windows Mobile 6.5 so at first I was looking forward to Windows Phone 7. Than rumors started that it will not support legacy applications. Fine I thought, I will just rewrite them as I need and at least I will get to do some refactoring.
Then multitasking was killed. Yes, platform does support it, Microsoft’s own applications can use it but mere third-party developers were not worthy of it. That also unfortunately meant that I would need to rethink some applications. I didn’t felt good about it but I still wanted to develop for it.
I thought that half of this things I hear around are just misunderstanding and everything will become clear once official development tools go out. This happened today. And it is clear…
Phone registration tool was last straw for me.
You see, once you buy phone, you cannot just do development on it - you MUST register it with Microsoft. They will than link your development phone to your MarketPlace account. That account costs $100 per year. This is little bit high but I was prepared to do it.
Only one small problem remains - I am from Croatia. That means that I CAN NOT register an account and I CAN NOT make any application for it. Even local debugging without any thoughts about selling is impossible for me.
I heard semi-official position on this: I should just find somebody that lives in “correct” country and he can apply instead of me. Never mind that I would break Windows Phone Marketplace Application Provider Agreement. This will just “result in possible revocation of your Marketplace Account, removal of your Applications from Marketplace, loss of Application ratings and reviews, and forfeiture of any associated Account Fee.”
I did my share of Windows Mobile development of both paid and freeware applications but love that started with Embedded Visual Basic and had it’s peek with C# and .NET Compact Framework is no longer there. And it is not because newest platform is bad. Technical aspects of Windows Phone 7 development allow for better things that any version before.
It is politics surrounding it that make me sad. Intentional crippling of platform, complicating development without any good reason and treating me as second class citizen are things I am not used to.
I cannot say anything for sure - life is too unpredictable for this - but I doubt that Windows Phone 7 will be visiting my pocket any time soon. So long, and thanks for all the fish.
P.S. No matter what tone of this post is, I will always value Microsoft’s programming tools. I can say, without any doubt, I’ve never had better working environment than Visual Studio and I will definitely continue to use .NET Framework. Microsoft did phenomenal job with them.
For one project of mine I needed to use GUID for column identification inside SQL Server 2008 R2. As usually, I expected everything to go fine. I just add new column (Id in my case) and set it’s data type to “uniqueidentifier”. After that just set that field’s default to whichever function generates new GUID. Since I am running SQL Server 2008 R2 I opted to use NEWSEQUENTIALID (I will explain why in some other post).
As I am programmer first and database administrator only when needed, my natural environment when dealing with database is right-clicking Design and doing changes in more visual way.
As soon as I changed “Default Value or Binding” property to “(NEWSEQUENTIALID())” I was greeted with “Error validating the default for column ‘id’. Do you want to cancel your changes?” After checking all documentation and rechecking it again, I just answered to this question “NO”.
After other fields were adjusted and I tried to save changes, I was greeted with another message: “Warnings were encountered during pre-save validation process, and might result in failure during save. Do you want to continue attempting to save?”. Correct answer here is “YES”.
Save went without hitch. After additional Internet searches I found that this is simple error in validation procedure. And it is in SQL Server since version 2005. Two versions after, it is still alive and kicking.
Until Microsoft fixes this in SQL Server 2020, just remember to hit first “NO” and second “YES”.
When Android developer wants to keep screen on while application is running, it often ends up with him managing wake locks. Quite often this is not needed.
If only thing you want to do is to keep screen on while your application is running (e.g. video player) and you do not need more advanced power management control, you should just add another flag to existing window.
System itself will now ensure that screen is kept turned on while your application is visible. As soon as your application is in background, everything returns back to normal. Added benefit of this approach is that no additional permissions are required.
As a programmer I do need a lot of icons. And since I am cheap bastard, I usually try to get free ones.
Company from which I got most freebie offers is definitely IconShock. Guys just can’t stop producing free icon sets. Latest is their Social icon set. It has image for any social site there is (both raster and vector). And best of all - these icons are FREE for COMMERCIAL use also.
Yes, they may not earn much money that way, but they will always have my eternal love for this. Who knows, maybe I will even stop being cheap and buy something from them finally.
In any case I do love these guys.
P.S. They do not sponsor me. This is spontaneous outburst of pure love.
I had application on market for quite a while and suddenly I started receiving “SQLiteException”. Quick look at stack trace showed little bit more details:
android.database.sqlite.SQLiteException: no such column:Calendars._id:,while compiling:SELECT _id, title, dtstart FROM view_events WHERE(1)AND(Calendars._id=1)
This clearly pointed toward code that fills calendar events. Generally it looked like this:
Uri calendarsUri;Uri eventsUri;if(android.os.Build.VERSION.SDK_INT<=7){//up-to Android 2.1
calendarsUri =Uri.parse("content://calendar/calendars");
eventsUri =Uri.parse("content://calendar/events");}else{//Android 2.2 (Froyo) and later
calendarsUri =Uri.parse("content://com.android.calendar/calendars");
eventsUri =Uri.parse("content://com.android.calendar/events");}...Cursor cursor = resolver.query(eventsUri,newString[]{"_id","title","dtstart"},"Calendars._id="+ calendarId,null,null);...
Exception pointed right to that last line with query. Froyo had no idea what it should do with Calendars._id.
To make long ranting short, correct code should be:
With this everything started working again and, since calendar code got first-class citizen treatment and it is finally documented in SDK, I doubt that there will be further breaking changes down the road.
One of little things that mean a lot in Windows 7 is (at least for me) ability to show progress in taskbar. There is no longer need to Alt-Tab every minute or so into long running task (most often file copy). Progress of any long-running operation can (and should) be visible in taskbar button itself.
It is surprisingly easy to use this feature in our programs. Everything that we need is contained withing two functions: SetProgressState and SetProgressValue. Setting percentage is as easy as
var res = _taskbarList.SetProgressValue(owner.Handle,(ulong)newProgressPercentage,100);
Although that minimal code will do it’s work, there is need for some additional preparation around it. We need to initialize feature itself, we need to check whether function is even available (XP is pretty much alive) and some error checking would be nice touch.
Because of this I made sample class in C# that should enable your program to have all those goodies. And, as always, sample is available for download.
If you are creating application that works with registry (e.g. your own registry editor) you are probably aware that 64-bit and 32-bit applications do not necessarily share registry keys. If you have 32-bit application your view of registry will not match one that 64-bit application gets.
.NET Framework 4.0 helps here a little. There is RegistryView enumeration available so code can specify which “bit-ness” of registry is desired. It works both ways: 32-bit application can specify 64-bit view and 64-bit application can specify 32-bit view.
As always, you cannot get what is not there. If you have 32-bit Windows, specifying 64-bit view will still give you 32-bit one.