This is a mirror of official site: http://jasper-net.blogspot.com/

Plants vs Zombies - iPad Games

| Tuesday, April 13, 2010
plants-vs-zombies-ipad.jpg

I am not really into games, but the Plants vs. Zombies game on the Apple iPad is a blast!

The HD graphics are awesome and the variety of plants, zombies, and situations can keep the game interesting each day. You are battling zombies in the front yard, back yard, day, night, in the fog, on land, in the pool, etc. Plants vs. Zombies is not only fun, but it requires strategy. And best of all, each stage lasts the perfect amount of time such that you can play it on the train, waiting for a haircut, etc.

Read more: David Hayden

Posted via email from jasper22's posterous

Microsoft Sync Framework 1.0 SP1

|
Microsoft Sync Framework is a comprehensive synchronization platform that enables collaboration and offline scenarios for applications, services, and devices. Developers can build synchronization ecosystems that integrate any application and any type of data, using any protocol over any network. This service pack is intended to fix a handful of bugs as well as to transition to a public-facing change tracking API that is new in SQL Compact 3.5 SP2. In SQL Compact, the change tracking feature is used to track information about all changes that occur in a given database and is used to retrieve metadata related to these changes. In previous versions of SQL Compact, this change tracking feature was automatically enabled the first time a synchronization operation was initiated in a SQL Compact database, and developers did not have the ability to interact directly with this API themselves. SQL Compact 3.5 SP2 makes this API public and Sync Framework 1.0 SP1 is updated to leverage this new public API surface. SQL Compact 3.5 SP2 makes this API public and Sync Framework 1.0 SP1 is updated to leverage the new public API surface. Making this API surface public provides developers with a finer grain of control and insight into the tracking of changes within SQL Compact. In some cases, making this change tracking feature public has resulted in performance degradation because there are more layers to interact with when accessing change tracking information. Because of this, before you upgrade to Sync Framework 1.0 SP1 you must carefully consider whether your need for this public change tracking feature outweighs the performance impact of leveraging this new API.

As mentioned above, a handful of bugs are fixed in this release:
# An access violation error occurred when you synchronized a deleted folder that contained a Desktop.ini file or a Thumbs.db file by using the file sync provider in Microsoft Sync Framework 1.0; KB961221.
# Uninstall or repair of Sync Framework on the Windows Vista operating system failed with the following message: "This setup requires .NET Framework 2.0" even though .NET Framework 2.0 was installed.
# Prerequisite check for .NET framework failed when .NET Framework 4.0 was the only version installed; KB962229.
# Sync Framework assemblies were disabled in the Visual Studio 2010 Add References dialog box; KB970102.

Read more: MS Download

Posted via email from jasper22's posterous

Visual Studio 2010 Tools for Office Runtime

|
This download installs the Visual Studio 2010 Tools for Office Runtime, which is required to run Microsoft Office based solutions built using Microsoft Visual Studio 2010.

Read more: MS download

Posted via email from jasper22's posterous

!Host HTML in XAML

|
כן כן! אתם רואים נכון, הגולם קם על יוצרו… ניתן לארח דפי ווב בXAML!! יותר מדויק בסילברלייט.

הרבה אנשים צריכים להציג דפי HTML, דפי ASPX, ואין בנמצא קונטרול שמבצע את העבודה כמו שצריך (נפתחו בעבר מספר פרויקטים כמו זה וזה, האחרון מדבר על אירוח GE בSL, אך הם קשים לתפעול, חסרי תיעוד עד אי הבנה כיצד להשתמש). אחרי יום חיפושים מפרך אחר פקד שכזה (צריך לדבר עם גוגל, לא לענין…), מצאתי אותו! מבית Divelements.

אז איך? ככה:

1. הורידו מכאן את הספרייה Divelements.SilverlightTools.dll.

2. לפרויקט המדובר הוסיפו רפרנס לספריה הנ"ל.

3. בדף הXAML תנו כינוי לספריה


<Page ...
xmlns:divtools="clr-namespace:Divelements.SilverlightTools;assembly=Divelements.SilverlightTools">

4. מקמו את הפקד HTMLHost בדף הXAML:

<Grid x:Name="LayoutRoot" Background="White">

<Border Margin="30">

     <!-- Embed HTML within the page -->

            <divtools:HtmlHost Name="htmlHost" SourceUri="http://blogs.microsoft.co.il" />

    </Border>

</Grid>

5. קבעו את פרויקט הSL שיוצג  כwindowless. בדף אירוח קובץ הxap כתבו כך:

 

 ...

וקיבלתם אירוח מושלם.

Read more: Miri's Blog

Posted via email from jasper22's posterous

BugTracker.NET 3.4.1

|
Release Notes

   * For the tasks/time tracking feature, added a way of viewing all the tasks at once, not just the tasks for one bug. Also added a way of exporting all the tasks into Excel. These features are weak, but they are better than nothing.

   * Fixed merge bugs feature. It wasn't merging tasks, flags, and svn/hg/git data.

   * Added checkbox to send_email.aspx page that controls whether the "comments visible to internal users only" are included in the email body.

   * Corrected Web.config comments for "NotificationSubjectFormat". Added $ASSIGNED_TO$ as one of the variables.

Read more: Codeplex

Posted via email from jasper22's posterous

Microsoft Visual Studio Team Explorer Everywhere 2010

|
Microsoft Visual Studio Team Explorer Everywhere 2010 is the Eclipse plug-in and cross-platform command-line client for Visual Studio 2010 Team Foundation Server.

Read more: MS Download

Posted via email from jasper22's posterous

SQL Optimization Tips

|
This article lists some of the optimization tips for SQL Server development.

  1. Use views and stored procedures instead of heavy-duty queries. This can reduce network traffic, because your client will send to server only stored procedure or view name (perhaps with some
     parameters) instead of large heavy-duty queries text. This can be used to facilitate permission management also, because you can restrict user access to table columns they should not see.
  2. Try to use constraints instead of triggers, whenever possible. Constraints are much more efficient than triggers and can boost performance. So, you should use constraints instead of triggers, whenever possible.
  3. Use table variables instead of temporary tables. Table variables require less locking and logging resources than temporary tables, so table variables should be used whenever possible.
     The table variables are available in SQL Server 2000 only.
  4.  Try to use UNION ALL statement instead of UNION, whenever possible. The UNION ALL statement is much faster than UNION, because UNION ALL statement does not look for duplicate rows, and UNION statement does look for duplicate rows, whether or not they exist.
  5. Try to avoid using the DISTINCT clause, whenever possible. Because using the DISTINCT clause will result in some performance degradation, you should use this clause only when it is necessary.
  6. Try to avoid using SQL Server cursors, whenever possible. SQL Server cursors can result in some performance degradation in comparison with select statements. Try to use correlated sub-query or derived tables, if you need to perform row-by-row operations.
  7. Try to avoid the HAVING clause, whenever possible. The HAVING clause is used to restrict the result set returned by the GROUP BY clause. When you use GROUP BY with the HAVING clause, the GROUP BY clause divides the rows into sets of grouped rows and aggregates their values, and then the HAVING clause eliminates undesired aggregated groups. In many cases, you can write your select statement so, that it will contain only WHERE and GROUP BY clauses without HAVING clause. This can improve the performance of your query.

Read more: C# Corner

Posted via email from jasper22's posterous

Closing Just the Selected Files You Want

|
image_thumb.png

What do you do when you have a lot of files open and only want to close a few of them?  You do it old school!  Just go to Window -> Windows. on the Menu Bar

Read more: Visual Studio Tips and Tricks

Posted via email from jasper22's posterous

New debugger extension for .NET (PSSCOR2)

|
Tom just blogged about a new debugger extension called PSSCor2, which is a superset to the SOS.dll extension that ships with the .net framework.

PSSCor2.dll has been around for quite some time at Microsoft, and pretty much everyone debugging .net code with windbg within Microsoft is using this since it contains all the goodness of sos.dll plus a lot of special methods for asp.net and other technologies running on top of the .net framework.  The news now is that after a lot of hard work by Tom and Jon Langdon in the CLR team, it is finally released publicly, YAY!!!

You can download it here and Tom promised to write some posts about the new commands so you might want to follow that… I will likely do the same later on as well…

Just to name two of the commands in there that I use a lot:

   !dae  (Dumps out all the exceptions on the .net heaps with callstacks)

   !aspxpages  (Dumps out all the asp.net pages that are currently executing or have been executing recently, along with the thread they are running on, what the timeout is and how long they have been running… excellent stuff)

Have a good one,
Tess

Read more: If broken it is, fix it you should

Posted via email from jasper22's posterous

Google Maps API for .NET

|
Fast and lightweight client libraries for Google Maps API.
Overview
This project intends to provide all the features available in the Google Maps API. It is being developed in C# for .NET Framework 3.5.

Please note that this project is still in design and development phase; the libraries may suffer major changes even at the interface level, so don't rely (yet) in this software for production uses.
Libraries
Designed with simplicity and extensibility in mind, there are different libraries according to what you need.

   * Google.Api.Maps.Core Google.Api.Maps.Service is a low-level API client library, providing just the basic support for communicating with the API services through strong types.
   * Google.Api.Maps (to be released in next version), works on top of the core library to provide a business-level interface as well as enhanced functionality such as distance calculations, HTML helpers, caching support and more.

API Support
Currently the service library supports full coverage of the following Google Maps APIs:

   * Geocoding
   * Elevation
   * Static Maps

Read more: Codeplex

Posted via email from jasper22's posterous

Cloud Mail

|
 Want to send email from Azure? Cloud Mail is designed to provide a small, effective and reliable solution for sending email from the Azure platform directly addressing several problems that application developers face.

Microsoft does not provide an SMTP Gateway (yet) so the application is forced to connect directly to one hosted somewhere else, on another network. Gmail might be fine for testing but do you really want to rely on a free service in production? To compound the problem what happens to your email if your chosen SMTP gateway is down or there are connection problems? Finally, what if you want to send email via a company’s mail server, from inside their firewall?

Cloud Mail solves these problems by providing a small client library that you can use in your solution to send emails from you application and a Windows Service that you run inside your companies network that acts as a relay. Because the send and relay are disconnected there are no lost emails and you can send from your own SMTP Gateway.


Read more: Codeplex

Posted via email from jasper22's posterous

Microsoft InteropForms Toolkit 2.1

|
This toolkit helps you bring the power of .NET to your existing VB6 applications, by allowing them to display .NET Forms and Controls from within the same application. Instead of upgrading the entire code base, these applications can now be extended one form at a time. The goal is a phased upgrade, with production releases at the end of each iteration containing both VB6 and VB.NET forms running in the same VB6 .exe process.

Read more: MS Download

Posted via email from jasper22's posterous

Checking Database Integrity

|
In theory, you should never need to manually check the integrity of your database, because nothing should ever go wrong with the database, the memory, or the I/O subsystems. However, in practice, checking the integrity of your database will give you confidence and ensure that your database files are in good shape, as well as detect any problems early enough to resolve them with minimal pain.
PAGE_VERIFY Options

Each database has an option that you can configure to determine how much integrity checking is happening in real time with your database pages. You can set the option to OFF, TORN_PAGE_DETECTION, or CHECKSUM. In general, you should set the option to CHECKSUM. Each time that the SQL Server database page is written to or read from the disk, a checksum is computed from the page. If that checksum does not match what's been previously recorded on the page, SQL Server knows that the page should no longer be trusted. Enabling the CHECKSUM option does cause some additional CPU workload so that the checksum can be computed. If your SQL Server workload became such that you needed to reduce your CPU workload, you could consider turning this feature off, but at the risk of failing to detect database page corruption.
DBCC CHECKDB

DBCC CHECKDB is the primary tool you will use to check the integrity of your database outside of the page verification options. You run this Transact-SQL command just like you run any other Transact-SQL statement. To run a DBCC CHECKDB command, you must be either a system administrator (a member of the sysadmin role) or a member of the DB_Owner fixed database role (or be the dbo user).

DBCC CHECKDB does the following:

   * It checks the integrity of your database physically, verifying that the pages of your database are allocated correctly. This check can be run separately as a DBCC CHECKALLOC command if you want only a physical integrity check, rather than a full CHECKDB.
   * It runs a DBCC CHECKTABLE command on all the tables and views in your database, verifying that the pages that belong to that table or view are actually allocated to the table. Additionally, it verifies the other internal structures of the objects.
   * It runs a DBCC CHECKCATALOG command, verifying the integrity of the system tables.
   * It validates indexes, varbinary(max) links with FILESTREAM objects, and service broker data.

You do not need to run each of these separate commands. DBCC CHECKDB will take care of them all for you.

If DBCC CHECKDB finds any problems, you can repair the database by using one of the REPAIR options, or you can restore the database from a backup. Unless you are very confident in what you are doing and in exactly what the REPAIR option is going to accomplish, you should not use the command without Microsoft or your Dassault Systèmes support team on the telephone with you.

Read more: Dassault Systèmes ENOVIA V6 on SQL Server

Posted via email from jasper22's posterous

Visual Studio 2010 and C# 4 Launch!

|
As I’m sure you’ve heard, we’re done! And you can download everything at your pleasure. Visual C# Express 2010 is available for free at the following link. For free!

http://www.microsoft.com/express/downloads/

You can also download trial versions of the full Visual Studio SKUs from here:

http://www.microsoft.com/visualstudio/en-us/download

MSDN’s main page is covered in purple and full of more links than you have time to click on, so you can check out everything there too.

The C# compiler and the support for dynamic, including the DLR, come in the box on every distribution of the .NET Framework 4.0. And also, of course, with every edition of Visual Studio. In addition to that, you’re going to want to use C# dynamic with some good dynamic languages. Happily, IronPython has released a final version (2.6.1) built for use with .NET 4.0. Check it out!

http://ironpython.codeplex.com/

Thanks!

UPDATE: It wasn’t up when I posted this, but now IronRuby has also pushed a final build (1.0) that runs on top of the released .NET 4.0!

Read more: Chris Burrows' Blog

Posted via email from jasper22's posterous

Using Marshal.GetDelegateForFunctionPointer() to Execute Assembler with Managed Code

| Monday, April 12, 2010
I never noticed the Marshal.GetDelegateForFunctionPointer()  function in the .NET Framework 2.0 until Devin Jenson posted about using it to run native assembly code from C#.  This was a wonderfully timed post for me as I was just putting together the finishing touches on the code for my how to detect virtual machine execution.  What Marshal.GetDelegateForFunctionPointer()  enables is certainly impressive.

One thing that Devin pointed out in his post was the need for VirtualAllocEx() and VirtualProtectEx() calls to ensure the code executed was not in a Data Execution Protection block.  Since I needed to make those calls anyway to port my C/C++ code, I decided to post how to do it here:

   class MemoryManager
   {
       const uint MEM_COMMIT = 0x1000;
       const uint MEM_RESERVE = 0x2000;
       const uint MEM_DECOMMIT = 0x4000;
       const uint PAGE_EXECUTE_READWRITE = 0x40;

       [DllImport("kernel32.dll")]
       public static extern IntPtr GetCurrentProcess();

       [DllImport("kernel32.dll")]
       static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress,
           UIntPtr dwSize, uint dwFreeType);

       public static bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress,
           UIntPtr dwSize)
       {
           return VirtualFreeEx(hProcess, lpAddress, dwSize, MEM_DECOMMIT);
       }

       public static bool VirtualFreeEx(IntPtr lpAddress, UIntPtr dwSize)
       {
           return VirtualFreeEx(GetCurrentProcess(), lpAddress, dwSize, MEM_DECOMMIT);
       }

       [DllImport("kernel32", SetLastError = true)]
       static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress,
           UIntPtr dwSize, uint flAllocationType, uint flProtect);

       [DllImport("kernel32.dll", SetLastError = true)]
       static extern bool VirtualProtectEx(IntPtr hProcess, IntPtr lpAddress,
           UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);

       public static IntPtr AllocExecutionBlock(int size)
       {
           return AllocExecutionBlock(size, GetCurrentProcess());
       }

       public static IntPtr AllocExecutionBlock(int size, IntPtr hProcess)
       {
           IntPtr codeBytesPtr;
           codeBytesPtr = VirtualAllocEx(
               hProcess, IntPtr.Zero,
               (UIntPtr)size,
               MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

           if (codeBytesPtr == IntPtr.Zero)
           {
               throw new System.ComponentModel.Win32Exception();
           }

           uint lpflOldProtect;
           if (!VirtualProtectEx(
               hProcess, codeBytesPtr,
               (UIntPtr)size,
               PAGE_EXECUTE_READWRITE, out lpflOldProtect))
           {
               throw new System.ComponentModel.Win32Exception();
           }

           return codeBytesPtr;
       }
   }

Read more: Mark Michaelis' Weblog

Posted via email from jasper22's posterous

Dynamically Writing and Executing Native Assembly in C#

|
Generally, executing native assembly in C# is bad because you lose all the benefits of the managed world. In the cases where it is impossible to perform something in C#, it is better to make a C++ DLL. That said, the new method Marshal.GetDelegateForFunctionPointer() in the .NET Framework v2.0 opens up the possibility for dynamically writing and executing assembly code. Consider the following basic C function:


   int __declspec(noinline) __stdcall MyAdd(int x, int y)
   {
       return x + y;
   }

The C compiler will compile the code into assembly. Though the code which gets compiled may vary from compiler to platform, for x86 it will usually have this basic form:


   Instruction                 Code Bytes   Comment
   ------------------------------------------------------------------------------
   mov eax,dword ptr [esp+8] ' 8B 44 24 08  Load the x into eax
   mov ecx,dword ptr [esp+4] ' 8B 4C 24 04  Load the y into ecx
   add eax,ecx               ' 03 C1        Add eax and ecx, result goes into eax
   ret 8                     ' C2 08 00     Pop x and y off the stack, return eax

The instructions listed are disassembly copied from the VC++ debugger. The code bytes are what actually executes. The idea is to take those code bytes, write them into a native buffer, acquire a delegate for that buffer, and finally execute the delegate. Here is sample code to run these code bytes from C#:


   using System;
   using System.Runtime.InteropServices;


   class Program
   {
       private delegate Int32 MyAdd(Int32 x, Int32 y);

       private static void Main()
       {
           // A simple Add function
           Byte[] myAddNativeCodeBytes = new Byte[]
           {
               0x8B, 0x44, 0x24, 0x08, // mov eax,dword ptr [esp+8]
               0x8B, 0x4C, 0x24, 0x04, // mov ecx,dword ptr [esp+4]
               0x03, 0xC1,             // add eax,ecx
               0xC2, 0x08, 0x00        // ret 8
           };

           // We need to push the code bytes into a native buffer
           IntPtr myAddNativeCodeBytesPtr = IntPtr.Zero;

           try
           {
               // Allocate the native buffer
               myAddNativeCodeBytesPtr =
                   Marshal.AllocCoTaskMem(myAddNativeCodeBytes.Length);

               // Push the code bytes over
               Marshal.Copy(myAddNativeCodeBytes, 0,
                   myAddNativeCodeBytesPtr, myAddNativeCodeBytes.Length);

               // Get a function pointer for the native code bytes
               MyAdd myAdd = (MyAdd)Marshal.GetDelegateForFunctionPointer(
                   myAddNativeCodeBytesPtr, typeof(MyAdd));

               // Call the native code bytes
               Int32 result = myAdd(4, 5);

               // Did it work?
               Console.WriteLine("Result: {0}", result);
           }

           finally
           {
               // Free the native buffer
               if (myAddNativeCodeBytesPtr != IntPtr.Zero)
               {
                   Marshal.FreeCoTaskMem(myAddNativeCodeBytesPtr);
                   myAddNativeCodeBytesPtr = IntPtr.Zero;
               }
           }
       }
   }

In this sample I just used Marshal.AllocCoTaskMem(), but one should actually P/Invoke VirtualAllocEx and VirtualProtectEx to ensure the page where the code exists has PAGE_EXECUTE access. Additionally the above sample is targetted to my personal x86 machine, and will not run on x64 or any other platform for that matter.

Read more: Devin Jenson's WebLog

Posted via email from jasper22's posterous

Программирование сопроцессора на C#? Да!

|
Наверное все знают о существовании сопроцессора FPU. Как писать код для него читаем дальше  Если не все, то я напомню: FPU – floating point unit – часть центрального процессора, специально предназначенная для работы с типами данных, представляющими числа с плавающей точкой, или по-другому с типами float и double. Данный модуль в составе процессоров появился после появления на свет Pentium III, да вот так давно. И с тех пор именно он выполняет работу по вычислениям различных математических выражений, а точнее их в виде кода на языке ассемблера. Другими словами, компилятор не весь код программы преобразует в стандартный набор инструкций типа mov, sub и прочие, но и еще в fld, fstp, fsub, fadd…, если речь идет о вычислениях с участием типов double. Как видите, инструкции для FPU имеют приставку “f”, по которым собственно можно сразу отличить код, предназначенный для него. Всю информацию по FPU вы можете найти на просторах инета, погуглив его по имени, также рекомендую сайт wasm.ru – раздел «Процессоры». Сопроцессор очень интересная штука и программирование его очень интересное занятие, я бы даже сказал захватывающее – не знаю, что почувствуете Вы, но я был в восторге, когда у меня получилось «заклинать» код, давая команды непосредственно процессору без посредников-компиляторов, CLR-среды и др. Почему «заклинать»? Об этом чуть позже.
Термин «заклинать» я позаимствовал у автора замечательных статей на сайте. Это серия статей про «Заклинание кода», которые я Вам рекомендую почитать после прочтения моей статьи.
Сейчас я покажу Вам как же написать простой пример заклинания кода применительно для FPU. Сразу должен предупредить, что хоть в конце и будет участвовать C#, для самого заклинания нужен С++.
Допустим нам надо вычислить такое выражение: result = arg1 – arg2 + arg3.
Есть несколько вариантов составления кода. Чтобы не усложнить понимание происходящего, я покажу сначала один, чуть позже покажу другой.
Итак, первый вариант выглядит так:

fld [arg1]
fld [arg2]
fsubp
fld [arg3]
faddp
fstp [result]
ret

Read more: habrahabr.ru

Posted via email from jasper22's posterous

Simplified MVVM: Silverlight Video Player

|
This project demonstrates an implementation of the MVVM (Model-View-ViewModel) pattern to create a fully "Designable" Silverlight Video Player. This is not to be confused with a "Skinable" Video Player. A Skinable Video Player allows you to change the look and feel of the buttons that control the player. A Designable player allows a Designer to use ANY set of controls to implement the Video Player.

The MVVM pattern allows a programmer to create an application that has absolutely no UI. The programmer only creates a ViewModel and a Model. A designer with no programming ability at all, is then able to start with a blank page and completely create the View (UI) in Microsoft Expression Blend 4 (or higher).

Read more: Codeproject

Posted via email from jasper22's posterous

Upload file (ftp) using C#

|
דוגמת קוד שכתב אחי יוסי גולדברג  להעלאת קבצים ל - ftp

string url = "ftpUrl/FileName";

FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(url);

request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential("user name", "password");
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = false;

byte[] buffer = File.ReadAllBytes("path");

using (Stream reqStream = request.GetRequestStream())
{
   reqStream.Write(buffer, 0, buffer.Length);
}

אם לא רוצים לקרוא את כל הקובץ בבת אחת אפשר כמובן לכתוב ככה

using (Stream reqStream = request.GetRequestStream())
{
   int count = 0;
   byte[] buffer = new byte[100];
   using (FileStream file = new FileStream("FileName", FileMode.Open))
   {
       while ((count = file.Read(buffer, 0, 100)) > 0)
       {
           reqStream.Write(buffer, 0, count);
       }
   }
}

Read more: שלמה גולדברג

Posted via email from jasper22's posterous

Cassandra: Fact vs fiction

|
Cassandra has seen some impressive adoption success over the past months, leading some to conclude that Cassandra is the frontrunner in the highly scalable databases space (a subset of the hot NoSQL category). Among all the attention, some misunderstandings have been propagated, which I'd like to clear up.

Fiction: "Cassandra relies on high-speed fiber between datacenters" and can't reliably replicate between datacenters with more than a few ms of latency between them.

Fact: Cassandra's multi-datacenter replication is one of its earliest features and is by far the most battle-tested in the NoSQL space. Facebook had Cassandra deployed on east and west coast datacenters since before open sourcing it. SimpleGeo's Cassandra cluster spans 3 EC2 availability zones, and Digg is also deployed on both coasts. Claims that this can't possibly work are an excellent sign that you're reading an article by someone who doesn't know what he's talking about.

Fiction: "It’s impossible to tell when [Cassandra] replicas will be up-to-date."

Fact: Cassandra provides consistency when R + W > N (read replica count + write replica count > replication factor), to use the Dynamo vocabulary. If you do writes and reads both with QUORUM, for one example, you can expect data consistency as soon as there are enough reachable nodes for a quorum. Cassandra also provides read repair and anti-entropy, so that even reads at ConsistencyLevel.ONE will be consistent after either of these events.

Fiction: Cassandra has a small community

Fact: Although popularity has never been a good metric for determining correctness, it's true that when using bleeding edge technology, it's good to have company. As I write this late at night (in the USA), there are 175 people in the Cassandra irc channel, 60 in the HBase one, 32 in Riak's, and 15 in Voldemort's. (Six months ago, the numbers were 90, 45, and 12 for Cassandra, HBase, and Voldemort. I did not hang out in #riak yet then.) Mailing list participation tells a similar story.

It's also interesting that the creators of Thrudb and dynomite are both using Cassandra now, indicating that the predicted NoSQL consolidation is beginning.

Read more: Spyced

Posted via email from jasper22's posterous