PSRenamer is a compact file renaming utility that provides a graphical interface allowing you to specify a folder and criteria for renaming a group of files. This download is zip form, it can be used on either a Windows machine or on Mac OS X (or any other Unix platform). Once downloaded and…
Posts Tagged ‘download’
Life in Motion: Estimation Library (Part I, Served with a Clockwork Fish)
Can you admit that you like watching various TV series, Hollywood blockbusters and DVD or Blu-ray bestsellers? All those gruff doctors lost in sunny southern California among desperate housewives? To a certain degree, perhaps we are all addicted to television and the motion pictures! We should then thank ourselves for the blessings of civilization: multimegabit channels, multi-terabyte drives, multi-inch monitors, and multi-core processors. Today, a recording of a TV series might fit into 500MB of space; what a trifle! Although just 10 years ago a system administrator might have blown a whole office to bits for the space to fit a single file like that in. Life is getting better but progress is unable to keep up with consumption, as usual: Terabytes and Megabits still cost a lot. Let’s go back to our TV show season: 0.5GB per series, 40 minutes, 30 frames per second: and a DVDRip creates a cost of about 36GB of pure video (btw, could you validate or argue my calculations?) . That’s a lot of used storage space! You’ll hardly find free disk space for the video of even a couple of seasons – go ahead and check it right now. And that’s not considering the download time. Fortunately, video encoding comes to the rescue. Encoders can turn 36GB of video into 0.5GB. That is, they can compress the information about 72 times. How is it possible to do this? Let’s try to figure it out. The principles of video data compression are based on the human perception of video sequence (Human Visual Sense, or HVS). It’s not that hard to explain these principles in words: 1) Delete all “redundant” information, that is, the details of the image which aren’t ever going to be noticed anyway; and, 2) Find recurrent information in the video stream and minimize duplication. The second item involves the so-called “statistical redundancy.” The HVS standard is normally divided into both space and time redundancies. Space redundancy includes considerable areas of the image with virtually the same pixels, such as the sky. Such areas are compressed using the principles close to JPEG compression for photos. The situation with time redundancy is somewhat more complicated. Let us recall that the human eye can see about 25-30 frames every second. How close are these frames to each other? Unless the frames feature a complete change of scene, they are usually fairly close. Therefore, there’s no point in coding each frame separately. To minimize the volume of data stored (transmitted, processed, and so on) some block video encoding standards, MPEG4 in particular, code only the residual differences between a block and the next block in the keyframe. From the encoder internals point of view, there are two main functional units. The first is the Discrete Cosine Transformation (DCT), which allows the removal of the space redundancy of a static image. The second one is Motion Estimation (ME) which, as described above, reduces the time redundancy of subsequent video frames. When the encoder gets a video input, its motion estimation and motion compensation reduce the volume of information that is identical for two adjacent frames. Then the DCT and the quantization minimize identical information within the frame. The quantization ratios, the transformed data together with the motion vectors are all fed into the entropy encoder for final compression. The better the motion estimation is, the less work for the DCT. That is to say, better motion estimation facilitates better video compression. It looks simple, doesn’t it? However, there are some hidden barriers and reefs, which we will now try to deal with. Before the deep dive, can you guess how much redundant information is in this video (a cool movie, incidentally)? Let’s continue our theoretical digression. You can use various methods to do motion estimation. The so-called pixel-recursive methods allow calculation of motion vectors for each separate pixel. It’s also worth mentioning the Phase Plane Correlation technique, which generates motion vectors based on correlation of the current frame with the reference one. Yet the most popular algorithm is the Block Matching Algorithm (BMA). The BMA calculates the motion vector not for separate pixels, but for pixel blocks. Objects in a video are in fact pixel groups; therefore pixels within the block ultimately have the same motion vector. This helps to considerably reduce the amount of calculation and to get more accurate results. An illustration of the BMA algorithm is provided in picture above. The current frame is split into pixel blocks, and we’re going to estimate the motion of each block individually. The idea is to find the most similar block to a given block in the reference frame. Then we need to calculate a motion vector, a shift of the block with respect to its “original” location. Thus, motion vectors represent horizontal and vertical shift of the current pixel block by x and y: In this equation I is the intensity of the pixel in position x on frame n, and d is the shift (motion vector) with respect to the initial position on frame n+1. Various pixel block matching criteria (Displaced Frame Difference, or DFD) can minimize the function: The two most popular are: Sum of Square Error (SSE): Sum of Absolute Difference (SAD): The SSE function is known for accurate matching, but is more computationally intensive. The SAD function is not particularly good at matching, but requires less computation, so it is often used in BMA algorithms. The functions also deal with criteria such as cross correlation and maximum number of matching pixels. The functions select the reference pixel block from the so-called search area. The search area determines the boundaries for the motion vectors and limits the number of candidate reference blocks to review. The height and width of the search area depend on many factors, such as motion speed and computational complexity. A wider search area requires more computation due to greater number of candidate blocks. The general practice is to select a wider area since horizontal motion in video happens more frequently. Search area may be also adapted to the motion type. The Full Search (FS) algorithm is a BMA-type algorithm that processes every possible pixel block within the search area and finds the best possible motion vector. The method provides the best possible residual difference for video compression by the cost of extra computational workload. It is the best possible algorithm for matching blocks identification, and luckily, it fits very well with multithreaded GPU architecture. Now it is time to get down to practice! We’re going to develop a library for motion estimation that would be convenient to use and, would take into account the specifics of various video encoding standards. We’ve got to create an interface that would assume the existence of various algorithm implementations based on various technologies, such as software-based and GPU-based implementations. Well, that was complicated! Before we jump into the code, let me ask: when you look at the video above, can you see the handle knob? What do you think about its behavior from the motion estimation perspective? Will the motion vectors trace the handle knob movement trajectory, or do you think it is still too complicated for modern algorithms? The library interface should consider various aspects of the algorithm and the data. We know that modern video encoding standards are block-based, so that each frame is divided into macroblocks (that are also split into various powers of two). We also know that there are several types of motion estimation algorithms, and their implementations differ considerably. Standards determine the method for estimation of frames interpolated by a noninteger number of pixels. The input consists of a pure frame for motion estimate and reference frames to be used for estimating the source frame. The expected output consists of motion vectors with linked SAD values. We are going to create an interface considering all these details. Please note that we’re going to use the Intel® Integrated Performance Primitives library because it contains lots of useful and very fast functions, including, in particular, the interpolation function and SAD calculation function. #if !defined(__HARDWARE_ME_H) #define __HARDWARE_ME_H /* this implementation uses IPP defined types and structs */ #include #if defined(__cplusplus) extern “C” { #endif /* defined(__cplusplus) */ /* Declare the types used in the accelerated ME object */ typedef struct _HW_ME_HANDLE *hw_me_handle_t; enum { HW_ME_MAX_SAD = 0×7FFFFFFF, HW_ME_MAX_LENGTH = 0×7FFFFFFF, HW_ME_SLEEP_TIME = 5 }; typedef enum eHWMECodecStandard { HW_ME_MPEG2 = 0, HW_ME_MPEG4 = 1, HW_ME_VC1 = 2, HW_ME_H264 = 3 } eHWMECodecStandard; typedef enum eHWMEAlgorithm { HW_ME_RESIDUAL = 0, HW_ME_TRUE_MOTION = 1, } eHWMEAlgorithm; typedef enum eHWMEType { HW_ME_WHOLE_PIXEL = 0, HW_ME_HALF_PIXEL = 1, HW_ME_QUARTER_PIXEL = 2 } eHWMEType; typedef enum eHWMEImageStructure { HW_ME_FRAME = 0, HW_ME_TOP_FIELD = 1, HW_ME_BOTTOM_FIELD = 2, HW_ME_MIXED = 3 } eHWMEImageStructure; typedef enum eHWMEDivType { HW_ME_DIV_16X16 = 0, HW_ME_DIV_16X8 = 1, HW_ME_DIV_8X16 = 2, HW_ME_DIV_8X8 = 3, HW_ME_DIV_8X4 = 4, HW_ME_DIV_4X8 = 5, HW_ME_DIV_4X4 = 6 } eHWMEDivType; typedef enum eHWMEPredictionType { HW_ME_BACKWARD = 0, HW_ME_FORWARD = 1, HW_ME_INTRA = 2, HW_ME_BIDIRECT = 3 } eHWMEPredictionType; typedef struct HW_ME_RANGE { Ipp32s left; Ipp32s right; Ipp32s top; Ipp32s bottom; } eHWMERange; typedef struct HW_ME_PARAMETERS { Ipp32u structSize; /* (Ipp32u) size of the current struct */ IppiSize imageSize; /* (IppiSize) size of processed images */ Ipp32u maxNumRef; /* (Ipp32u) maximum number of available references */ IppiPoint maxVector; /* (IppiPoint) maximum allowed vector */ eHWMEDivType minSubblockSize; /* (eHWMEDivType) minimal subblock size */ IppiPoint maxSubBlockVectorDif; /* (IppiPoint) maximum vector difference between subblocks of macroblock */ eHWMECodecStandard codecStandard; /* (eHWMECodecStandard) interpixel interpolation standard */ eHWMEType meType; /* (eHWMEType) type of interpolation */ eHWMEAlgorithm algType; /* (eHWMEAlgorithm) algorithm type */ IppBool strictWithinFrame; /* (IppBool) is it allow to be outside frame or not */ } HW_ME_PARAMETERS; typedef struct HW_ME_IMAGE { eHWMEImageStructure imageStructure; /* (eHWMEImageStructure) current image structure */ Ipp8u *pPlanes[3]; /* (Ipp8u *([])) array of pointers to image’s planes */ Ipp32s imageStep; /* (Ipp32s) image step */ } HW_ME_IMAGE; typedef struct HW_ME_MB_INFO { eHWMEDivType mbDiv; /* (eHWEDivType) macro block fragmentation */ eHWMEDivType subblockDiv[4]; /* (eHWEDivType) sub macro block fragmentation */ eHWMEPredictionType predType[4]; /* (eHWMEPredictionType) macro block prediction types */ Ipp32s minSAD; /* (Ipp32s) minimal found SAD for the macroblock */ Ipp32u ref[2][4]; /* (Ipp32u [][]) reference list for macro block */ IppiPoint mv[2][16]; /* (IppiPoint [][]) motion vector list */ } HW_ME_MB_INFO; typedef struct HW_ME_INFO { HW_ME_MB_INFO *pMbInfo; /* (HW_ME_MB_INFO *) pointer to macroblock info store */ Ipp32u numFrameRefs[2]; /* (Ipp32u) number of references in reference array */ Ipp32u refFrameList[2][16]; /* (Ipp32u [][]) reference list for each direction */ Ipp32u numTopFieldRefs[2]; /* (Ipp32u) number of references in reference array */ Ipp32u refTopFieldList[2][32]; /* (Ipp32u [][]) reference list for each direction */ Ipp32u numBottomFieldRefs[2]; /* (Ipp32u) number of references in reference array */ Ipp32u refBottomFieldList[2][32]; /* (Ipp32u [][]) reference list for each direction */ } HW_ME_INFO; /* Initialize the accelerated ME object */ IppStatus InitializeHWME(const HW_ME_PARAMETERS *pHWMEParams, hw_me_handle_t *pHandle); /* Stop all ME operation and release the accelerated ME object */ IppStatus ReleaseHWME(hw_me_handle_t handle); /* Add a reference to the accelerated ME object */ IppStatus CopyHWMEReference(hw_me_handle_t handle, const Ipp32u refIdx, const HW_ME_IMAGE *pImage); /* Do a accelerated ME */ IppStatus DoHWME(hw_me_handle_t handle, HW_ME_INFO *pInfo, const HW_ME_IMAGE *pImage, void **ppEvent); IppStatus WaitHWMEDone(void *pEvent); #if defined(__cplusplus) } // extern “C” #endif /* defined(__cplusplus) */ #endif /* __HARDWARE_ME_H */
Meshcentral.com – More bug fixes
After a few weeks of vacation and being sick, I started getting back into gear and working on getting the basics of Meshcentral.com working better and better. Today, I fixed a few bugs that caused the server message bus to stop working (a critical bug) and made a few improvements to the mesh search feature (picture below). The mesh search feature allows a user to search for a filename in all the computers of a mesh at once. Not only that, but the results comeback with working download links for all the results found. Until today, the download links did not work well, the search page would cause problems under some browsers, etc. Just not the quality I generally except, but it’s been greatly improved today. Another worked on getting fixed in the Java VNC viewer not working thru HTTP proxies. When you click on a device’s “VNC” link at the bottom of the page, we load a Java VNC viewer and the viewer connects back to meshcentral.com to start the session. Sadly, if you have an HTTP proxy in the middle, this connection will fail and the VNC session will not work. After getting a normal Java VNC application to go thru the firewall, I realized that because of security reasons, there is no way a Java Applet would be able to do that same… so I added a note saying the Java VNC viewer does not work thru proxies and left it at that… sadly… Not sure if I can ever fix it. I also worked on an Java/Android library to interface with Meshcentral.com. I will try to get it released soon. Ylian meshcentral.com
PVS-Studio: analyzing ReactOS’s code
Having checked ReactOS’s code I managed to fulfill three of my wishes at once. Firstly, I had wanted for a long time to write an article on a common project. It’s not interesting to check the source code of projects like Chromium: its quality is too high and a lot of resources are spent to maintain it, which are unavailable to common projects. Secondly, it’s a good example to demonstrate the necessity of static analysis is in a large project, especially when it is developed by a diverse and distributed team. Thirdly, I’ve got a confirmation that PVS-Studio is becoming even better and more useful. PVS-Studio is becoming better and better I will start with the last point regarding the advantages of PVS-Studio tool. ReactOS indirectly confirms that PVS-Studio is developing in a right direction. Here is the news about checking ReactOS with such heavyweight as Coverity – “Coverity Redux” [ 1 ]. Of course, I understand that our tool’s capabilities are far more modest than those of Coverity. However, PVS-Studio finds a whole lot of errors where Coverity has found “a few new errors”. Besides, you are not forced to send the code anywhere; you can just pick up and check any project. It means we’re on the right track. What is ReactOS? ReactOS is a contemporary, free and open-source operating system based on Windows XP/2003 architecture. The system was written from scratch and has the purpose of replicating the Windows-NT architecture created by Microsoft on all the layers from hardware to application layer. The size of the source code in C, C++ and Assembler is about 220 Mbytes. References: ReactOS Site . Start Developing ReactOS . Wikipedia. ReactOS . ReactOS – Open-Source Windows Clone Software To Seriously Look Forward To . Errors in ReactOS Now let’s speak about the whole lot of errors I have found in ReactOS’s code. Of course, I won’t describe them all in the article. Here I have laid out a text file with descriptions of errors found during analysis. The file contains diagnostic messages with file names and line numbers. I have also arranged the errors in a form of short code inserts and commented upon them. That’s why those of you who would like to edit ReactOS should rely upon that file and not this article. Or rather download PVS-Studio and check the project yourselves. You see, I’m not familiar with the project, so I copied out only those errors that I’ve understood. And regarding many fragments, I don’t know if they contain errors or not. So my analysis is rather superficial. We will provide you a registration key if you want to check the project. Errors you may come across in ReactOS are very diverse. It’s a zoo of errors, really. There are misprints of one character. BOOL WINAPI GetMenuItemInfoA(…) { … mii-> cch = mii-> cch; … } This is how it should be actually written: “mii-> cch = miiW-> cch;”. The letter ‘W’ was lost. As a result, applications can’t trust the GetMenuItemInfoA function. Here you are another misprint of one character. This time it’s incorrect comparison of two names. static void _Stl_loc_combine_names(_Locale_impl* L, const char* name1, const char* name2, locale::category c) { if ((c & locale::all) == 0 || strcmp(name1, name1) == 0) … } Operators && and & are mixed up. It’s a very common error. I come across it virtually in every project where bits or file attributes are being handled. static LRESULT APIENTRY ACEditSubclassProc() { … if ((This-> options && ACO_AUTOSUGGEST) && ((HWND)wParam != This-> hwndListBox)) … } This is how the correct code must look: “(This-> options & ACO_AUTOSUGGEST)”. The sample below contains a similar error which causes the whole condition to be false all the time. void adns__querysend_tcp(adns_query qu, struct timeval now) { … if (!(errno == EAGAIN || EWOULDBLOCK || errno == EINTR || errno == ENOSPC || errno == ENOBUFS || errno == ENOMEM)) { … } If you look closely, you may notice an insidious fragment: “|| EWOULDBLOCK ||”. By the way, in ReactOS I have found a lot of conditions which are always true or false. Some of them are not dangerous because, for instance, they are located in the assert() macro. But, in my opinion, there are some conditions which are crucial as well. INT WSAAPI connect(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen) { … /* Check if error code was due to the host not being found */ if ((Status == SOCKET_ERROR) && (ErrorCode == WSAEHOSTUNREACH) && (ErrorCode == WSAENETUNREACH)) { … } You agree that the implementation of functions like “connect” should be tested as thoroughly as possible, don’t you? But here we have a condition which is always false. It’s not easy to notice the defect quickly, so let me explain the error: (ErrorCode == 10065) && (ErrorCode == 10051) By the way, the part relating to sockets looks very raw. Perhaps it is explained by the fact that it’s an accepted practice to define SOCKET as a signed type in the Linux world, while in Windows it’s unsigned: typedef UINT_PTR SOCKET; As a result, we have various errors in comparison operations: void adns_finish(adns_state ads) { … if (ads-> tcpsocket > = 0) adns_socket_close(ads-> tcpsocket); … } The “ads-> tcpsocket > = 0″ expression is meaningless since it’s always true. There are simply odd fragments. Most likely, these are incomplete or forgotten code fragments. if (ERROR_SUCCESS == hres) { Names[count] = HeapAlloc(GetProcessHeap(), 0, strlenW(szValue) + 1); if (Names[count]) strcmpW(Names[count], szValue); } Why would you call the “strcmpW”, if you will not use the result in any way? There are errors in operations’ priorities. VOID NTAPI AtapiDmaInit(…) { … ULONG treg = 0×54 + (dev < 3) ? (dev Queued = TRUE; Event-> Context = Context; ExQueueWorkItem(&Event-> WorkItem, CriticalWorkQueue); } … } I am also fond of errors related to the initialization of array items. I don’t know why. They are touching. Maybe it’s just memories of my first experiments with arrays in Basic. HPALETTE CardWindow::CreateCardPalette() { … //include button text colours cols[0] = RGB(0, 0, 0); cols[1] = RGB(255, 255, 255); //include the base background colour cols[1] = crBackgnd; //include the standard button colours… cols[3] = CardButton::GetHighlight(crBackgnd); cols[4] = CardButton::GetShadow(crBackgnd); … } I may continue citing various interesting code fragments. Unfortunately, the article will become too long then so I have to stop. Let me remind you that you can read about the errors found in ReactOS in this file . I will only cite the following piece of code for dessert: #define SWAP(a,b,c) c = a; a = b; a = c An example of how it was used: BOOL FASTCALL IntEngGradientFillTriangle(…) { … SWAP(v2,v3,t); … } This is a masterpiece. Static code analysis I find ReactOS a very good example of a project where regular static analysis is a mandatory necessity. The reason is not the developers’ skill. It’s because the project is very large and contains various subsystems. It means that there are always a lot of people working on such a project. And in a large team there are always people whose programming skill is relatively worse or better; some programmers use one style and others use another style. But nobody is safe from errors. Look at the following code. This is just what one person had written in ReactOS: if ((res = setsockopt(….) == -1)) The code doesn’t work as it was intended. The correct code is the following: if ((res = setsockopt(….)) == -1). If you adhere to practice of always writing a constant in the beginning, you will never make a wrong assignment inside the “if” operator. We have a different sort of error here. But if you follow the rule above when writing the code, then you won’t make a mistake in the expression at hand as well: “if (-1 == res = setsockopt(….))”. But even if you follow that practice, you can easily make a mistake in an alternative way. static DWORD CALLBACK RegistrationProc(LPVOID Parameter) { … if (0 == LoadStringW(hDllInstance, IDS_UNKNOWN_ERROR, UnknownError, sizeof(UnknownError) / sizeof(UnknownError[0] – 20))) … } The 0 constant is written nicely here. But the closing parenthesis is in a wrong place. It’s a simple misprint. What for do I cite all these examples? To show you that no one of us programmers is ideal. Neither coding standards, nor programming technologies, nor self-discipline guarantee that you won’t make mistakes in source code. In large projects you just cannot do without auxiliary technologies like dynamic and static analysis. I want to emphasize the following idea: I believe that static code analysis should be a mandatory component of the development cycle in the case of ReactOS and other large projects. Let me explain my statement. In such systems, you cannot get close to 100% code coverage when testing the code with unit-tests or regression tests. Well, to be more precise, you can, of course, but costs of creating and maintaining such tests will become unacceptably high. The reason is that the number of system’s possible states and execution paths of code branches is too large. Some branches get control rarely but they do not get less important because of that. It is here that you can notice the advantage of static analysis. It checks the whole source code regardless of how often it gets control during the program’s execution. Here is an example of checking a code that rarely gets control: static HRESULT STDMETHODCALLTYPE CBindStatusCallback_OnProgress(…) { … if (This-> szMimeType[0] != _T(”)) _tprintf(_T(“Length: %I64u [%s]n”), This-> Size, This-> szMimeType); else _tprintf(_T(“Length: %ulln”), This-> Size); … } It’s most likely that the code was written incorrectly in the beginning. Then somebody noticed that the message was generated in a wrong way and fixed it by writing “%I64u”. But he paid no attention to the code nearby, while it still has an incorrect format “%ull”. This brunch seems to be called very rare. Static analysis won’t miss that. It hadn’t actually, since I can show you this example. Another good example is a large number of memory cleanup errors that I’ve found in ReactOS. I understand why there are so many of them. Nobody checks whether the memory is filled or not. Firstly, it’s difficult to realize that you might make a mistake in such simple places. Secondly, it’s not so easy to verify if some temporary buffer in a function has been cleared or not. Static analysis again comes to your aid here. Let me give you only a couple of examples. Virtually I have counted at least 13 errors of filling arrays with a constant value. #define MEMSET_BZERO(p,l) memset((p), 0, (l)) char *SHA384_End(SHA384_CTX* context, char buffer[]) { … MEMSET_BZERO(context, sizeof(context)); … } Only the first bytes of the array are cleared, since sizeof(context) returns the pointer’s size instead of the structure’s size. #define RtlFillMemory(Destination, Length, Fill) memset(Destination, Fill, Length) #define IOPM_FULL_SIZE 8196 HalpRestoreIopm(VOID) { … RtlFillMemory(HalpSavedIoMap, 0xFF, IOPM_FULL_SIZE); … } Arguments are mixed up when using the RtlFillMemory macro. This is how the call should look: RtlFillMemory(HalpSavedIoMap, IOPM_FULL_SIZE, 0xFF); To tabs and spaces again I want to ask you beforehand not to start a flame on the topic in comments. I will simply tell you my opinion. You may agree with it or not, but let’s not discuss it. There are two irreconcilable camps. One of them stands for using tabs in code because it allows you to adjust code presentation according to your preferences. The others say that it doesn’t work anyway and there are no good reasons for using tabs. Tabs cause only harm and spoiled formatting. I refer to the latter camp. We may eternally repeat that everything will be okay if tabs are used in a right way. Unfortunately, people who say that work on one project in isolation, without interacting with the outer world. In any open-source or simply large project you cannot obtain a good code formatting if it is permitted to use tabulation of any kind. I won’t get involved into abstract discussions. This time I will simply cite an obvious example from ReactOS’s code to my opponents. ReactOS’s coding standard has a good rule from the theoretical viewpoint [ 2 ]: Generic note about TABs usage: Don’t use TABs for formatting; use TABs for indenting only and use only spaces for formatting. Example: NTSTATUS SomeApi(IN Type Param1, [spaces]IN Type Param2) { [TAB]ULONG MyVar; [TAB]MyVar = 0; [TAB]if ((MyVar == 3) && [TAB][sp](Param1 == TRUE)) [TAB]{ [TAB][TAB]CallSomeFunc(); … TAB fans are satisfied. But I open up ReactOS’s sources and observe spoiled formatting in many places. Why is that? The answer is obvious. Because it’s hard to remember where you should press TAB and where you should press several spaces when the project is not the only one you are dealing with. That’s why people constantly make mistakes. Since it comes to that, let’s be practitioners, not theorists. Why not forbid usage of tabs at all? Then we all will write code with the same formatting and if a violator appears who starts using tabs, it will be easy to find and reprimand him. It’s not a step backward in code formatting! It’s just a step forward! It’s the next level of awareness. Theoretical beauty of indenting does not match practice. First of all, it’s important to provide unequivocal code representation and easy development process in a large team. The Google company understands that. Their formatting standard uses only spaces [ 3 ]. Those who stand for using tabs, please think it over why it is spaces that a distributed team of highly skilled professionals working on Chromium has chosen for formatting. And once again, the theoretical beauty of configurable indenting does not match practice. However nice the theory sounds, it’s of no use if it doesn’t work. And this is how things are in ReactOS. So my recommendation to the ReactOS development team is to modify their standard and to refuse usage of tabulation. Any tab should be considered a mistake and eliminated from the code. By the way, this practice will allow you to detect awful things like the following one in ReactOS’s code: BOOLEAN KdInitSystem(IN ULONG BootPhase, IN PLOADER_PARAMETER_BLOCK LoaderBlock) { … /* Check if this is a comma, a space or a tab */ if ((*DebugOptionEnd == ‘,’) || (*DebugOptionEnd == ‘ ‘) || (*DebugOptionEnd == ‘ ‘)) … } The last comparison is comparison to a tab, not a space, as it may seem. The right code must be the following: “(*DebugOptionEnd == ‘t’)”. Note for TAB fans. Please, don’t tell me again how to use tabs in a right way. And this is not my code. Look, there is a concrete project like ReactOS. It has a badly formatted code. Now think how to save a new programmer opening the project’s code from making guesses about what TAB size should be set in the editor’s settings. Ideas like “they should have written it right from the beginning ” are of no practical value. References Newsletter 79. Coverity Redux. http://www.viva64.com/go.php?url=727 ReactOS. Coding Style. http://www.viva64.com/go.php?url=724 Google C++ Style Guide. http://www.viva64.com/go.php?url=679 P.S. Follow Me in Twitter .
Meshcentral.com – Mesh wide file search improved
Last week I released the first early version of the mesh-wide file search feature. Well, last night I released a much improved version along with mesh agent 1.45. This feature allows a user to search for a file on all his computers at once. Once a file is found, you can click the link to download it. Imagine forgetting a file at home, just log into the web site, hit search and a few seconds later you can download the file. I think it’s a pretty cool feature. I would also see this as very useful in small-businesses. In this new release, I fixed the search corruption problem, got the correct computer names and icons to slow up and made the download links work. I will continue to fix more problems, this morning I noticed that the download feature does not seem to work on my Apple iPad2, so, still a bit of debugging. The search feature within the web file manager has also been improved. Version 1.45 of the mesh agent fixes the download links, so, not everyone may have gotten the update yet, mesh agents will update thru out the day today. Enjoy! Ylian https://meshcentral.com
Microsoft Outlook Hotmail Connector (64-Bit) 14.2
With Microsoft Outlook Hotmail Connector 32-bit, you can use Microsoft Office Outlook 2003, Microsoft Office Outlook 2007 or Microsoft Office Outlook 2010 to access and manage your Microsoft Windows Live Hotmail or Microsoft Office Live Mail accounts, including e-mail messages, contacts and calendars for free! Outlook Connector enables you to use your Live Hotmail accounts within Outlook: Read and send your Office Live Mail/Windows Live Hotmail e-mail messages. Manage your contacts in Windows Live Hotmail. Use advanced options for blocking junk e-mail messages. Manage multiple e-mail accounts in one place. Manage, and synchronize multiple calendars, including shared calendars to Windows Live Calendar from Outlook. If you use the Outlook Hotmail Connector with Outlook 2010 you gain these additional benefits: Your Safe Sender List/Blocked sender list/Safe Recipient lists are synchronized between Outlook and Hotmail. Send/receive works like your other Outlook accounts. Your Hotmail account status appears in the Outlook status bar. Rules work with the Hotmail account in Outlook even if it’s not your primary account. System Requirements: Supported Operating Systems: Windows 7, Windows Server 2003, Windows Vista, Windows XP This download works with the following Office programs: 2007 Microsoft Office system Microsoft Office 2003 Microsoft Office Outlook 2007 Microsoft Office Outlook 2003 Microsoft Office Outlook 2010 (64-bit) Homepage : http://www.microsoft.com/ Download : microsoft.OutlookConnector.exe File Size : 3.55MB Incoming search terms for the article: how to use microsoft connector 2007 Outlook Hotmail Connector 64 outlook hotmail connector 62 bit outlook 2007 hotmail connector 64 bit outlook 2003 connector 64 bit microsoft office connector office 2003 64 bits hotmail status Hotmail Connector 14 64 freeware move outlook to windows live mail update outlook 2010 hotmail connector
Free Download Manager 3.8 Beta 2
Using power of this free download manager and accelerator you can retrieve files and complete websites up to 600% faster than before. It utilizes the entire bandwidth of your Internet connection even if you download from slow web sites. Features of the download manager include: integration with Internet Explorer, Opera, Mozilla and FireFox, powerful scheduler, downloading from mirrors, adjusting traffic usage, ZIP file and audio/video preview. Features: Free Download Manager (FDM) offers you a vast variety of options to control and schedule your downloads. This is a light-weight but powerful download manager. FDM can resume your broken download so that you needn’t start it from the beginning after casual interruption. You can resume unfinished download from the moment when it was interrupted. Also this program warns you if resuming isn’t supported by the servers. It allows you to make a decision about the downloading. So with FDM you save your time and money. FDM allows you to limit the downloading speed. There are 3 modes of network usage: Light, Medium and Heavy. Capability to split download into several sections allows you to increase download speed up to 600%. FDM can connect to the Internet at a set time, download the files you want, launch any program, disconnect or shut down your computer when it’s done. This download manager allows you to specify the settings of network usage, such as login and password, maximum number of connections, default group, etc. So you can avoid adjusting these settings every time you need to create new download from the server. Also you can download the whole web sites from the remote server. You can adjust FDM to download files with the extensions you have specified. Free Download Manager 3.0 features numerous tweaks and innovations, such as prioritized and partial torrent downloads, support for Chrome and Safari web browsers, avast! Antivirus, multifile metalinks, FDM plugins, and many more. The new structure of FDM settings and a number of other optimizations will surely contribute to its handiness, shaping a neat and fresh impression of the familiar program. Homepage : http://www.freedownloadmanager.org/ Download : freedownloadmanager.fdm38inst.exe File Size : 7.50MB
A Step by Step Guide: Build A Virtual Meego Tablet on Oracle Virtualbox for Meego Apps Development and Testing
Background Last year, I built a virtual Meego Netbook using Open Sourced Oracle Virtualbox, and feel it is convenient and responsive compared with the Meego Netbook running from Emulator under Qemu. So, when first Meego Tablet Alpha version OS was released earlier this year, I have tried several time on building a virtual Meego Tablet on Virtualbox as a testing and validation platform. My effort was not successful. Startting from Meego Tablet img/iso, I have tried many different installation methods( USB Stick, DVD etc), it always ended on a black screen after reboot. I could not figure which cross-road that I made a wrong turn, and google search on the internet neither landed any sourceful clue since Meego Tablet Alpha was very new. A lot of people asking the same questions as I did , but none of solution was documented or published. However, the progress in this area is so critical as Meego Tablet OS’s birth unavoidedablely will experience certain degree of growing pain until it reachs its maturity. For Developers, getting a foot in the new emerging market is not easy, and your response time need to be very short, and actions be in leading edge. For Academic community. Educating student with latest technology when econemy is still in recovery needs some innovative solution. Without need of any investement of Tablet hardware, by using Virtual Meego tablet platform, you will be able to develop, test and validiate Apps for Meego device, and get Apps being accepted by Intel Appup. No doubt it will be a very good way to test how deep the Meego river is. Not sure if Android or IOS offer similiar opportunity. After …….., finally Iwas able to find a fast and simple way to build a responsive virtual Meego Tablet, and create this step by step guide to share with you. Hardware My laptop is a Lenovo T61 that I have been using for many years, even thoug it was joked by friends as an “outdated laptop” at Intel Beijing IDF. I succesfully built a Virtual Meego Tablet for Meego App test and validation. It took about 4G of your harddisk, and is responsive, and about 3-5 times faster than the same virtual Meego netbook in Emulator under Qemu provided by Meego SDK. It is good enough for develop and test Meego Apps you developed using QT or Qt Quick. So here is the HW requirment based on my experience: 2G RAM Windows 7 or Windows XP (Inel Meego SDK for Appup is ready) 4G Harddisk Medium price laptop in the market for around three years (Like my Lenovo T61) Installation process at the same level as that of an MS Office 2007 Download and Install Oracle Virtualbox First thing you need to do is to go to Oracle website to download the Open Sourced Virtualbox: Download VirtualBox . ( http://www.virtualbox.org/wiki/Downloads ). You certainly need to read and accept the agreements of using Oracle Open Source Virtualbox. I am using VirtualBox 4.0.6 for Windows hosts. You will also find out that Oracle Virtualbox is also cross platforms, and you can find Windows, Apple IOS, Linux and Solaris which is great as it also mean that you can run Virtual Meego Tablet on those Platform once you are done with this step by step. Follow the default instruction to install Virtualbox in your system, and get ready for next step. Create Meego Image that is Compatibile with Oracle Virtual Box If Oracle Virtualbox is not new to you, certainly you can try the typical way of installation ( download iso to USB/CD and boot etc). You can try and good luck. Just warm up ( if you are not easily sweating like me). Here what I will introduce to you is a very simple and conscise way of doing it differently . We first go directly to the backyard repository of Meego.com to grab the latest Meego Tablet image : http://repo.meego.com/MeeGo/builds/trunk/latest/images/meego-tablet-ia32-qemu/ After download the ~700M image, you can use Winzip or Winrar to unpack the package, you will get four files as below: Here are the tricks that several of my Intel expert peers have uncovered, and I got it work after several tries. This time we will use the Virtualbox Management Tool (VBoxManage.exe) that is provided by Oracle to directly convert the Meego Tablet’s raw image to Oracle’s vdi image VirtualBox Disk Image (VDI), and by-pass the installation based on iso/img. When you install Oracle VirtualBox, the VBoxManage.exe is placed at default installatio folder at C:Program FilesOracleVirtualBox ). I tried copyVBoxManage.exe out of this folder to do the conversion , but always got .dll missing error after several tries, and could not figure out the solution. So I get out of trouble shooting mood, and do the following: Copy the entire folder that you unziped Meego image from your download above, and contains the .raw image Meego to C:Program FilesOracleVirtualBox . For convenience, rename the folder name to meego. Start your DOS Window by Run as Administrator and cd to C:Program FilesOracleVirtualBox As the version of Meego image has being updated frequently, the version # is alway changing. However, the format is same: meego-tablet-ia32-qemu-${version}-sda-raw。The version I used is 1.1.99.4.20110426.4 as below, You will need to use your version # of your downoad, and execute command below : C:Program FilesOracleVirtualBox> VBoxManage convertfromraw meegomeego-tablet-ia32-qemu-1.1.99.4.20110426.4-sda.raw meegomeego-tablet-ia32-qemu-1.1.99.4.20110426.4-sda.vdi The terminal output will be: Converting from raw image file=”meegomeego-tablet-ia32-qemu-1.1.99.4.20110426.4-sda.raw” to file=”meegomeego-tablet-ia32-qemu-1.1.99.4.20110426.4-sda.vdi”… Creating dynamic image with size 3145728001 bytes (3001MB)… After conversion is complete,prompt will return to C:Program FilesOracleVirtualBox> Congratulation! you have just made a Oracle Meego VDI image based on the latest Meego Tablet image just published at Meego Repository. After this step, you can copy and move the vdi image ( around 1.7G) to the location of your choice, and get ready for the next step(A sweet reminder, same vdi can also be used in the virtulbox on Linux, IOS and Solaris etc ). Create Virtual Meego Tablet in Oracle Virtual Box Start Virtualbox and click NEW to create the new Meego Tablet Release: If you have use Oracle Virtubox before for Meego Netbook before, you know you will choose Fedora as the OS. This time is different, we will choose Operating System as Linux and Version as Linux 2.6 as above. The RAM of my old laptop Lenovo T61 is only 2GB, so I picked 360M of memory for Virtual Meego Tablet, it works pretty well For Virtual Hard Disk, make sure Boot Hard Disk is selected. Select Use Existing Hard Disk , and then open and select the Oracle .vdi image just created above by clicking and open the folder icon. To fully utilize the CPU virtual technology, you will need to select Extended Features Enable PAE/NX . And also under Acceleration menu, you will need to select both Enable VT-x/AMD-V and Enable Nested Paging. If VT on your laptopVT is not turned on yet, you can enable it in BIOS when you power on your laptop. Most laptops have VT support long time ago. Then, have a quick check of your configuration at the Summary page Now, let’s start your Virtual Meego Tablet: Running Virtual Meego Tablet Oracle Virtualbox is loading about 3G of Software, so just wait a little bit, and take your coffee: Now, with a Virtual Meego Tablet operating system on your screen, Touch screen, which is the major way of input and interaction for mobile device and tablet, seems not an option anymore. If you are like me, which is not gifted and talented as my daughter as school, certainly you will get lost and fall into some kind of limbo. In fact, it is actually quite simple than your thought. From now on, you will need to use Mouse to simulate your finger tip. Just move your mouse to the Lock–like Icon on the middle right of the screen, and press the left mouse button, you will see a blue moon-like shape coming out. Continue to press the left mouse button and pull to the left, Magiclly, you put out the Meego Menu: If you are using the real Meego Tablet ( like an ExoPC, a Lenovo S10, or Webtab tablet etc), what you actually do is use your finger to press the white lock-like icon to pull out the menu ( if you have not setup the user password, or you will need to enter the password). In comparision with the real device and the Virtual Meego tablet, I can see Oracle Virtualbox did a great job, and create a Virtual environment that is much better than the Meego emulator running under Qemu. Once you get to the menu, here is another shock that you will have if you hanvn’t yet owned an iPad, iphone or Android device. If you get so used to the Windows, you will find out that every time you start a application in Virtual Meego Tablet ( Web browser, Photo Album, Movie, email etc), you will feel that you seems is driving into a highway that has not exit ramp, and there is no way out, and you unconscienously started looking for the familiar “X” on the top right corner of Windows: Sure you will find that it is no longer avaialble anymore as we are in totally different User Interface for Meego Tablet, and you need to say Hello to Meego and Bye-Bye to Windows. If you owns a iPhone, iPad or any touch screen device, you will likely know that closing a application is done by pressing the Home Key. So, actually what you is the key that emulate ” HOME ” key. For Virtual Meego Tablet, this key is Window Home key: It is right, the “Window” key is the Home key for Virtual Meego Tablet, By pressing the “Window” key, you will be able to exit any app that you are currently running and enter the following interface: On top left is the regular menu that display the frequently used items, and on the right are the complete menu of the system (see below). the top left displays the currently running Terminal window. Congratulation!! you have just built a fast and convenient Virtual Meego Tablet, and start your journey, without any Tablet Hardware, to test out Meego. Once you have start adding apps, the menu will extend to the top side and a page menu will appear. By default, Virtual Meego Tablet interface will automaticlly catch the Keyboard and Mouse input, if you want to go back to your Windows host interface, just uses the right Ctrl key: Networking Virtual Meego Tablet with your Windows Host System As Intel Appup Store alredy launched Intel Appup Meego SDK for Windows ( Appup Meego SDK for Linux is coming soon), so currently the best Meego Apps Development solution is using Meego SDK 1.2 for Windows to develop apps and use real Meego tablet or Virtual Meego tablet for testing, validiatation and packaging for Intel Appup Store. By networking Virtual Meego Tablet with your Windows Host system ( two OS on same system), you will be able to directly test any Meego Apps you are developing directly on the same laptop, just like testing on a real Meego tablet device on your local IP network. To set up the Network connection, do below: Start Oracle VirtualBox and then Setting –> Network Change Network Adapter Attached to to: Host-only Adapter , and then change Name :to VirtualBox Host-only Ethernet Adapter . Then start the Meego Tablet, Open a terminal Window, use ifconfig command to find the IP address of your Meego Tablet Virtual OS: Start WinSCP ( If you haven’t yet install WinSCP, you can download from HERE )。 Make sure you set the port # as 22, and the password for default User Meego account is meego (latter we will also learn how to setup and push apps directly from QT to irtualbox): Once the connection is established, you can upload the Development environment, update, Meego SDK and your apps into your Virtual Meego Tablet, and directly test and validate your apps. Push and Test Apps on Virtual Meebo Tablet platform I will continusly blog on develop, test and validate Meego app using Oracle Virtualbox as well as the packaging of Meego apps for Intel Appup. We are also releasing a Meego Curriculum Course that I am developing together with my Intel peers to Intel Academic Community. Feel free to provide any feedback or experience on this Virtual Meego Tablet step by Step Guide. Tweet
Radio Downloader 0.20
Radio Downloader is a utility to allow people to easily download radio station content. It brings Podcast-like abilities to stream downloading, as well as handling Podcasts. This gives you the convenience of being able to subscribe to regular downloads of your favourite programmes, which you can then listen to on your pc or MP3 player. Radio Downloader supports different types of content via plugins – the following plugins are currently included: BBC Radio – Allows you to download radio programmes made available via the BBC iPlayer. Podcast – Allows you to download files made available as attachments to RSS feeds. Radio Downloader is supported on Windows XP, Vista and 7. What’s New in version 0.20: BBC Radio Provider: The current date is now used if the date is missing or invalid for a BBC Radio programme. Missing server attribute on connection node in mediaselector no longer causes BBC Radio downloads to fail. Core Application: Fixed crashes caused by episodes without a value for duration. ‘Last Download’ date is now stored in the database instead of calculated. If root of download path does not exist, a prompt is displayed when cleaning up. Converted application and providers from VB.net to C#. The user is now given the ID of their reported error if available. Enabled receiving GZip compressed content over HTTP. Podcast Provider: Fixed a crash when selecting Find Programme -> Podcast Homepage : http://www.nerdoftheherd.com/ Download : Radio%20Downloader.msi File Size : 4.68MB
Avira Antivir Virus Definition File Update
Update AVIRA Desktop for Windows with latest virus definitions and scan engine. Manual Update of AntiVir * Please go through the following steps to update your AntiVir Personal Edition Classic / Premium on a PC without internet access. * Download the latest virus definition file (IVDF) on a PC… [ Antivirus Update ]



Posted in
Tags: