Tuesday, October 21, 2008
HTTP Post behavior between a C++ CURL client and IIS running Coldfusion 7 not as good as PHP but still providing the functionality
To validate my test i also used wget command line tool to post form data using the follwoing command.
wget-1.11.4b>wget --header="Content-tye:multipart/form-data, boundary=--========00000003640" --post-file=postdata.txt http://www.fullyqualifydomainname.com/post.cfm
where the file postdata.txt is :
--========00000003640
Content-Disposition: form-data; name="SessionID"
Content-Type: text/plain
--========00000003640
Content-Disposition: form-data; name="UserName"
Content-Type: text/plain
test
--========00000003640
Content-Disposition: form-data; name="UserPassword"
Content-Type: text/plain
test
--========00000003640
Content-Disposition: form-data; name="EOF"
Content-Type: text/plain
EOF
--========00000003640—
The conclusion of my test was that it is not easy to retrieve all post data into an array in one single call in ColdFusion something which is working great and easy to achieve in PHP. Something the coldfusion team should concider for future APIs... !
ColdFusion Script post.cfm
==========================
first < has been replace by / and > by \ because google blog text editor is retarded..
/cfset x = GetHttpRequestData()\
/cfsavecontent variable="y"\
/cfoutput\
/table cellpadding = "2" cellspacing = "2"\
/tr\
/td\/b\HTTP Request item//b\//td\
/td>/b>Value//b//td\ //tr\
/cfloop collection = #x.headers# item = "http_item"\
/tr\
/td>#http_item#//td\
/td>#StructFind(x.headers, http_item)#//td\ //cfloop\
/tr\
/td\request_method//td\
/td\#x.method#//td\//tr\
/tr\
/td>server_protocol//td\
/td>#x.protocol#//td\//tr\
//table\
/b>http_content --- #x.content#//b\
//cfoutput\
//cfsavecontent\
working post.php script
=======================
#begin script
error_log("post.php Enter");
$debug = 1;
$ua = $_SERVER["HTTP_USER_AGENT"];
$server_request_uri = $_SERVER['REQUEST_URI'];
$server_name = $_SERVER['HTTP_HOST'];
$remote_addr = $_SERVER['REMOTE_ADDR'];
$server_addr = $_SERVER['SERVER_ADDR'];
$server_port = $_SERVER['SERVER_PORT'];
$server_request = $_SERVER['REQUEST_METHOD'];
$server_request_time = $_SERVER['REQUEST_TIME'];
$server_protocol = $_SERVER["SERVER_PROTOCOL"];
error_log("=============================");
error_log("");
error_log("POST $server_request_uri HTTP/1.0");
foreach ($headers as $header_entry=>$header_value)
{
error_log("$header_entry: $header_value");
}
error_log(print_r($_POST,true));
#end script
WORKING PHP LOG
===============
21-Oct-2008 09:15:39]
[21-Oct-2008 09:16:29] post.php Enter
[21-Oct-2008 09:16:29] =============================
[21-Oct-2008 09:16:29]
[21-Oct-2008 09:16:29] POST /post.php HTTP/1.0
[21-Oct-2008 09:16:29] Host: www.fullyqualifydomainname.com
[21-Oct-2008 09:16:29] Content-Length: 655
[21-Oct-2008 09:16:29] Content-Encoding: ISO-8859-1
[21-Oct-2008 09:16:29] Content-Type: multipart/form-data; boundary=========00000024328
[21-Oct-2008 09:16:29] Accept: text/html, *.*
[21-Oct-2008 09:16:29] Expect: 100-continue
[21-Oct-2008 09:16:29] Array
(
[SessionID] =>
[version] => 1.0
[UserName] => test
[UserPassword] => test
[EOF] => EOF
)
on the other hand
wget http://www.fullyqualifydomainname.com/download/update.cfm --post-data="UserName=test&UserPassword=test" works fine with ColdFusion 7 and the previous script assuming that you will have to parse UserName=test&UserPassword=test as a ByteArray
Thursday, September 25, 2008
Canon EOS 5D MKII - Reverie
http://blog.vincentlaforet.com/
The reverie HD video is available on the smugmug CDN
http://www.smugmug.com/photos/best-video-sharing/
http://vincentlaforet.smugmug.com/gallery/6961015_exAjb/1/450568576_iAAka/Large
Quoting Vincent :
The H.264 mov files that you will see are straight out of the prototype camera.
(You will be able to see that these are indeed raw clips for yourself in the embedded EXIF info) and will prove all of the skeptics wrong - not a single color, tonal, noise, exposure - or ANY adjustment was made to any of the footage at any time).
Wednesday, September 17, 2008
Green Energy
As a matter of fact some nuclear plants are used to provide enough electricity for all those old and ugly AC/Units just for the month of June,July,august and September.
Well we all know that you can't use solar energy to provide enough "juice" for AC/unit but a nice panel could provide enough electricity to run your computers the all year, provide lighting and provide electricity for some of your utilities...
So what cities like Phoenix, Texas, Las Vegas are waiting for......
When the government will provide really good tax return intensive plan for people willing to installed solar panel ?
http://www.sunpowercorp.com/For-Homes.aspx
Okay so for Phoenix here are the numbers if you get yet an other loan of 25 years...
Gross Cost: $38,000
Federal Tax Credit: $7,140
State/Utility Rebate: $13,950
Net Cost: $16,910
First Year Bill Savings: 36%
Assuming that you don't have any problems with the panel after 5 years which use to be the average medium time before failure for older generation of solar panel you will pay per month :
With SunPower Without SunPower
Monthly Loan Payment $112.73 $0.00
Tax Savings * -$31.35 $0.00
Monthly Electric Bill $66.99 $105.00
Monthly Net Cost $148.38 $105.00
Per year 456 USD of saving.
This system seams to be good for people who can afford to pay in full.
It seams that best is to pay cash and yet the system should be fare if the
customer would get Federal Tax Credit EVERY year not only at purchase time.
Let's say your electric bill cost 66 USD instead of 105 USD. Your
clean saving net worth is 33 USD per month. Government should give
you 1/3 of the 33 USD of money back every month at least equivalent to
1 month of free energy per year.
Well it's a start...
http://www.energystar.gov/index.cfm?c=products.pr_tax_credits
http://www.gapminder.org/
Monday, September 08, 2008
Wednesday, September 03, 2008
Interactive H264 Video for Flash Player 10
http://younsi.blogspot.com/2008/12/interactive-video-in-flash-using-f4v.html
Thursday, August 28, 2008
iPhone has the big head but apple misses a point....
though it doesn't support Flash or Java.
http://www.crn.com/retail/210201022
Wednesday, August 20, 2008
OGG VORBIS and MOD tracker in Action Script 3
in Flash
http://blog.joa-ebert.com/2008/07/24/as3-vorbis-encoder/
http://blog.andre-michelle.com/
Tuesday, August 19, 2008
Stop making scrollbars in SWF when displaying Text
http://hossgifford.com/resizer/
This is a plea to you, the Flash developer community,
to stop making your own fucking scrollbars. They are fiddly,
non-standard and unintuitive to the average web user.
The thing is, all browsers already have scrollbars. And they
work really well. And everyone knows how to use them. But the
biggest criticism that Flash sites get again and again is their
fixed ‘letterbox’ format with text scrolling within an area of
that letterbox using some proprietary means of interactivity.
This doesn’t have to be the case. This file is a demonstration
of a technique that resizes the flash movie within the html page
to fit the content within the movie. It’s free to use and abuse,
whether you copy and paste it verbatim into your work, or if you
hack and slash it into something that suits the specifics of your
project.
Props to Geoff Stearns for his wonderful swfObject which this latest
version uses to greatly simplify things. Please check
"http://blog.deconcept.com/" for the latest version of swfObject as I
offer no guarantee that the version here is the most recent.
"Hoss Gifford,"
Glasgow,
14/11/2005
http://www.hossgifford.com/downloads.htm
Saturday, August 16, 2008
Things i hate about Vista
1 When copying and pasting folder with large amount of files EG 100 000 from one USB drive to an other a pop up dialog appears saying that there is not enough memory to perform the operation after some times.
2 Explorer.exe process still crashing no improvement since Windows XP
3 Thumbnail view of images and video in explorer are not working so use Adobe Bridge :)
4 Dual screen mode is just wrong and it is not possible to consistently run vista on a laptop with a broken screen for instance using only the external connector. If you want to connect your laptop running vista to an LCD TV through the VGA external connector of your laptop and then later on if you unplug the VGA cable because you want either to use the TV with an other laptop or simply put the laptop to sleep then next time you turn the laptop on after plugging the VGA connector vista will forget that you want your TV as the primary screen. The log in window will show up all the time on the laptop screen. It should be expected to use the last settings which is also the most used settings. It will reset to default settings which is just wrong. On the other hand all windows from the operating OS will open on the wrong screen the secondary screen. Same for control panel settings, if you open control panel on one screen (external screen) and then open the display settings the dialog will open on the wrong screen the "primary" laptop screen.
5 .... coming soon
Monday, July 21, 2008
Installing IIS on Windows XP Pro / Reminder
Installing IIS on Windows XP Pro
If you are running Windows XP Professional on your computer you can install Microsoft's web server, Internet Information Server 5.1 (IIS) for free from the Windows XP Pro installation CD and configure it to run on your system by following the instructions below: -
1. Place the Windows XP Professional CD-Rom into your CD-Rom Drive.
2. Open 'Add/Remove Windows Components' found in 'Add/Remove Programs' in the 'Control Panel'.
3. Place a tick in the check box for 'Internet Information Services (IIS)' leaving all the default installation settings intact.
4. Once IIS is installed on your machine you can view your home page in a web browser by typing 'http://localhost' (you can substitute 'localhost' for the name of your computer) into the address bar of your web browser. If you have not placed your web site into the default directory you should now be looking at the IIS documentation.
5. If you are not sure of the name of your computer right-click on the 'My Computer' icon on your desktop, select 'Properties' from the shortcut menu, and click on the 'Computer Name' tab.
6. Your default web directory to place your web site in is 'C:\Inetpub\wwwroot', but if you don't want to over write the IIS documentation found in this directory you can set up your own virtual directory through the 'Internet Information Services' console.
7. The 'Internet Information Services' console can be found in the 'Administration Tools' in the 'Control Panel' under 'Performance and Maintenance', if you do not have the control panel in Classic View.
8. Double-click on the 'Internet Information Services' icon.
8. Once the 'Internet Information Services' console is open you will see any IIS web services you have running on your machine including the SMTP server and FTP server, if you chose to install them with IIS.
9. To add a new virtual directory right click on 'Default Web Site' and select 'New', followed by 'Virtual Directory', from the drop down list.
7. Next you will see the 'Virtual Directory Creation Wizard' from the first screen click the 'next' button.
9. You will then be asked to type in an 'Alias' by which you will access the virtual directory from your web browser (this is the name you will type into your web browser after 'localhost' to view any web pages you place in the directory).
10. Next you will see a 'Browse...' button, click on this to select the directory your web site pages are in on your computer, after which click on the 'next' button to continue.
11. On the final part of the wizard you will see a series of boxes, if you are not worried about security then select them all, if you are and want to run ASP scripts then check the first two, followed by the 'next' button.
12. Once the virtual directory is created you can view the web pages in the folder by typing 'http://localhost/aliasName' (where 'aliasName' is, place the alias you called the virtual directory) into the address bar of your web browser (you can substitute 'localhost' for the name of your computer if you wish).
Wednesday, July 16, 2008
How to detect the selected language on Mac OS 10 Tiger/Leopard
The following code tested on Tiger will work like a charm.
static Boolean s_curLangInited = FALSE;
static Boolean s_bJapanese = FALSE;
if (!s_curLangInited)
{
CFComparisonResult result;
CFStringEncoding encoding = kCFStringEncodingMacRoman; // = 0;
CFAllocatorRef alloc_default = kCFAllocatorDefault; // = NULL;
// a couple of c string literals.
const char cstr_ja[] = "ja_JP";
// convert from c string to CFString
CFStringRef cf_jaString = CFStringCreateWithCString(alloc_default,cstr_ja,encoding);
//CString curLangStr = AfxGetApp()->GetProfileString(_T("Settings"), _T("Language"), _T("nil"));
CFLocaleRef loc = ::CFLocaleCopyCurrent();
CFStringRef cf_lang = (CFStringRef)::CFLocaleGetValue (loc, kCFLocaleLanguageCode);
CFMutableArrayRef available_locales;
CFArrayRef intersected_locales;
char user_locale[50];
struct direct *file;
DIR *dir;
CFArrayRef prefered_languages;
CFLocaleRef user_locale_ref = CFLocaleCopyCurrent();
CFStringRef user_locale_string_ref = CFLocaleGetIdentifier( user_locale_ref );
/* the prefered language in System Preferences.app, because it can differ from CFLocaleCopyCurrent().
However this prefered language is stored using the general language denotation
that may not include the country code (en,fr,en-GB,...) which is not accepted
by setlocale (setlocale would expect en_US,fr_FR,en_GB,...).
So we retrieve possible locales from /usr/share/locale and intersect them
with the prefered languages using CFBundleCopyLocalizationsForPreferences.
*/
dir = opendir("/usr/share/locale");
available_locales = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
while ((file = readdir(dir)))
{
/* This filters the 'right' locales (xx_xx.UTF-8) */
if (strstr(file->d_name, ".UTF-8"))
CFArrayAppendValue(available_locales, (void*)CFStringCreateWithCString(kCFAllocatorDefault,
file->d_name, kCFStringEncodingUTF8));
}
closedir(dir);
CFPreferencesAppSynchronize(kCFPreferencesAnyApplication);
prefered_languages = (CFArrayRef)CFPreferencesCopyValue( CFSTR("AppleLanguages"), kCFPreferencesAnyApplication,
kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
if (prefered_languages)
{
CFArrayRef intersected_locales = (CFArrayRef)CFBundleCopyLocalizationsForPreferences(available_locales, prefered_languages);
CFStringRef user_language = NULL;
if(CFArrayGetCount(intersected_locales))
user_language = (CFStringRef)CFArrayGetValueAtIndex(intersected_locales, 0);
if(user_language)
{
CFStringGetCString( user_language, user_locale, sizeof(user_locale), kCFStringEncodingUTF8 );
result = CFStringCompareWithOptions(user_language, cf_jaString, CFRangeMake( 0 ,CFStringGetLength(cf_jaString)), kCFCompareCaseInsensitive);
if (result == kCFCompareEqualTo) {
s_bJapanese = true;
}
else
{
s_bJapanese = false;
}
Tuesday, July 15, 2008
why didn't Apple let AT&T sell/activate the new iPhone over launch weekend?
http://www.flickr.com/photos/lasean/2668369038/
Monday, July 14, 2008
Tuesday, July 01, 2008
Modal Dialog using Carbon
and here is a basic sequence to display a modal dialog on the mac similar to Win32 MessageBox
{
DialogRef alert;
DialogItemIndex outHit;
CFStringRef errMsg;
CFStringRef errorExplanation;
UInt32 textLength;
alertStringExplanation = SomeUTF String
alertStringTitle = SomeUTF String
l1 = alertStringExplanation.length();
l2 = alertStringTitle.length();
textLength = l2;
errMsg = ::CFStringCreateWithBytes(NULL, (UInt8 *) alertStringTitle.get(), textLength, CFStringGetSystemEncoding(), false);
textLength = l1;
errorExplanation = ::CFStringCreateWithBytes(NULL, (UInt8 *) alertStringExplanation.get(), textLength, CFStringGetSystemEncoding(), false);
UInt32 numUnicodeChars = ::CFStringGetMaximumSizeForEncoding(textLength, kCFStringEncodingUnicode);
CreateStandardAlert(kAlertCautionAlert, errMsg, errorExplanation, NULL, &alert);
RunStandardAlert(alert, NULL, &outHit);
}
Indexing SWF file
For most people on the Web, if Google or Yahoo cannot find something, it doesn’t exist. That has been one of the biggest drawbacks to creating a Website or application that displays itself as a Flash (SWF) file. Search engines could see the file, but they could not see what was in it. Until now.
Adobe has come up with a way for the search engines to read SWF files and index all of the information they contain. That means any text or links in a Flash application can now be indexed. This is a huge step forward for Adobe and anyone who develops in Flash/Flex. Michele Turner, Adobe’s VP of marketing for its platform business, explains:
We are releasing technology to Google and Yahoo that enables them to crawl and index SWF files. They are now searchable. This will open up millions of Flash files to search.
Adobe has created a special Flash player for the search engines that acts like a virtual user going through each application. It actually goes through the runtime of each Flash application and translates it into something the search engines can understand. So all of those fancy interactive Flash Websites and other rich Internet applications that have been invisible to search engines, can now be seen by them.
Turner acknowledges that this invisibility so far “has been a big problem for those developing rich applications.” After all, it doesn’t matter how pretty your Website is if nobody can find it. Flash applications and Websites (many ironically created by ad agencies) have not been able to take advantage of any of the search-engine juice that so many online ad campaigns depend upon. This should be seen as part of Adobe’s larger efforts to remove any remaining restrictions associated with Flash (in April, for instance, it opened up the Flash runtime as part of its the Open Screen Project).
Google is already rolling out the SWF-indexing technology, while Yahoo still “has some work to do,” says Turner. Even so, this won’t solve all the problems with Flash content showing up on search engines.
Google SWF
http://googlewebmastercentral.blogspot.com/2008/06/improved-flash-indexing.html
ADOBE SWF searchability
http://www.adobe.com/devnet/flashplayer/articles/swf_searchability.html
Thursday, June 26, 2008
Flash web sites sample that i like
http://www.ilm.com/theshow/
Foxit PDF Preview Handler for Windows Vista, Office 2007 and Windows XP.
The Foxit PDF Preview Handler is a piece of software written by Tim Heuer with sponsorship from Foxit Software (providing the license so that we all can enjoy). Special thanks to Ryan Gregg for help with the Windows XP version. These preview handlers are a part of Microsoft Windows Vista in the operating system as well as in Outlook 2007.
Tim Heuer wrote:
For example, in Outlook 2007, if you receive an attachment that is a PDF you can click it and get a preview of that document right within Outlook without having to open the document in another program. It is an extremely helpful feature of Outlook that I love and why I wrote this handler for PDFs. Microsoft did not provide a default one for PDFs as a part of Outlook or Vista. If you install Adobe Acrobat 8.1+ you will get one as well. However, I am not a fan of Acrobat Reader as I think it is a slow application for what I use PDFs for – reading only. For this I prefer Foxit Reader as it is super light-weight and fast.
http://timheuer.com/blog/archive/2008/05/09/foxit-pdf-preview-handler.aspx
About straight and premultiplied channels
Practical advice for developers
(from DVD-HQ.info)
This section is aimed mainly at software developers, but regular users should read it too, because it shows how simple it is to deal with these issues from a programming point of view.
It might sound a bit self-righteous to write an article telling Photoshop's or 3dsmax's programmers how to do their job but... well, someone has to, because it's pretty obvious they aren't going to get it right by themselves (both are up to version 9, and are still lacking basic alpha channel conversion abilities).
First, here are the formulas to convert between matted and non-matted alpha. They can deal with any matte colour and are easy to implement for any colour depth and in any language. The variables used in the formulas are:
Cm = Component (matted)
Cu = Component (unmatted)
Cb = Component (background / matte colour)
a = Alpha
amax = Maximum possible alpha value (ex., 1.0)
All values are assumed to vary between 0.0 and 1.0 (for 8-bit files this would be 0-255 and for 16-bit files it would be 0-65535; remember to divide by the scale if you use anything other than 0.0-1.0).
To convert from unmatted alpha to matted alpha:
Cm = ( Cu ∙ a ) + [ Cb ∙ ( amax - a ) ]
To convert from matted alpha to straight (unmatted) alpha:
If a = 0, then Cu = Cm
Else, Cu = [ Cm - Cb ∙ ( amax - a ) ] / a
The formulas should be applied once to each colour component (ex.: R, G and B) of each pixel.
Those formulas are enough to add support for alpha channel conversion (with any matte colour) to any application. The software can then either cache a "working format" version of the image (generally meaning a straight-alpha version) or it can perform the conversion whenever it needs to read a pixel's colour channel values. There is really no excuse for not including this basic ability in a professional-level application.
The second issue is how to determine the kind of alpha channel used by a file that the user has just imported. One solution is to simply ask the user, but that's a pretty poor solution; users have more important things to worry about. So let's look at how software can determine the type of alpha channel and, if it turns out to be a matted alpha channel, how it can determine the background colour.
First we look for a pixel that is 100% transparent (0% opaque). If one exists, store its RGB values. Look for another pixel that is 100% transparent. Compare its RGB values with the ones previously stored. Repeat until the end of the file. If all pixels with 0% opacity have the same RGB values, it's almost guaranteed that that colour is the one used for the matte (if indeed there is a matte). If the colour varies, there's a good chance that we're looking at a straight-alpha file, or that the file uses some sort of really weird encoding (like the background bitmap example given above).
Now, even if all 100% transparent pixels have exactly the same colour, the file might still use "straight" alpha, so it's time to take the "background" RGB values we found above, plug them into the matted / unmatted conversion formulas and see if they make sense.
No pixel can have less of the matte colour in its RGB values than its alpha value would allow. For example, a colour channel in a pixel that is only 10% opaque cannot deviate more than 10% from the same channel of the matte colour.
If this condition isn't met by every pixel in the file, then there is no matte. If it is met by every pixel in the file, there's a very good chance that there is a matte, using the background colour we determined earlier.
There are other ways to make these decisions, some of which are simpler, faster, and will also get it right most of the time (for example, the program might analyse only a few pixels, rather than every pixel in the image).
Software should perform these tests when a file is first imported, and use the results to pre-fill the source format (or "footage interpretation") settings. This means that, in 99% of cases, the user will only need to click "ok".
If the tests are inconclusive (ex., because there are no transparent pixels in the file), then the software should ask the user to make the choice.
In any case, the user should always be given the option to toggle the type of alpha channel (between straight and matted), to pick the matte colour (manually or from the image) or to have the software "guess" the alpha channel type and matte colour again. These options should be available at any moment; not just when the file is first imported. If the software uses working proxies, a change of source format settings would cause the file to be re-imported.
(end of quote from DVD-HQ.info © Rui del-Negro 2008)
Friday, June 20, 2008
AS3 Flash 3D Engine Aletrnativa Platforms Drops A Nuke - Isometric and FPS
http://blog.alternativaplatform.com/en/2008/04/18/alternativa3d-5-m1/
previously Alternativa Game, launched their Alternativa Platform milestone 1 and really one demo would have been enough but there are some great demos there that literally put them what appears a couple laps up on the 3d FPS style engine in Flash.
The engine is highly optimized and smooth, heavy on the processor, but using the ‘t’ key you can see some nice revealing triangle rendering. Also, playing with the field of view adds for some nice game effects. (try jumping on the fans in the half-life like room in the first demo)
iPhone and Flash
Adobe already has a version of Flash for the iPhone running on emulation software, and would, fingers crossed, be able to bring that over to the phone itself if Apple allowed it. That’s what Adobe said yesterday at its Q2 conference call. Or:
We have a version that’s working on the emulation. This is still on the computer and you know, we have to continue to move it from a test environment onto the device and continue to make it work. So we are pleased with the internal progress that we’ve made to date.
But will Apple allow Flash for the iPhone? Steve Jobs has claimed in the past that the mobile version of Flash—presumably what Adobe would be porting over to the iPhone—isn’t powerful enough for use on the nimble and elegant iPhone. Integration with Safari?
This leaves Adobe, if it wants a piece of that sweet, sweet iPhone market, with a few options. It could simply release a stand-alone Flash application on the upcoming App Store, but that would be cumbersome to say the least. One of the big reason why Flash is so popular is because it “just works” in a browser. No having to download Hulu videos to your hard drive in order to view them, for example.
Adobe could also, somehow, convince Apple to let it release a plugin for Safari. That’d be the most seamless for consumers.
Adobe has always take advantage of QuicktTime API and now QTKit so there is really no reason why Flash won't be fast on the iPhone
XMP Metadata, XFL and Flash = Complete End To End Solution
Since its inception, the Flash authoring tool has stored documents in a binary source-file called .fla. Historically, interchanging source with the Flash authoring tool has been virtually impossible for third-party software because the specification for .fla has never been public. But things are changing in the next version of Flash. Flash CS4 will be able to export *and* import a new source format called XFL. An XFL file is a .zip file that contains the source material for a Flash document. Within the .zip file resides an XML file describing the structure of the document and a folder with the document's assets (graphics, sounds, etc). The exact details of the XFL format are not yet available, but Richard assures me that Adobe intends to document them publicly, allowing third-party tools to import and export XFL.
So in theory, you might one day edit the images of an XFL file directly in Photoshop without disturbing the timeline information also contained in that file. Or you might be able to import a page from a word processing document into a Flash presentation.
But perhaps even more exciting is the potential for the smaller, grass-roots community. Being XML-based, the new XFL format should be fairly easy to understand and generate. That means any small tool company, web agency, or even independent developer will be able to create a purpose-built authoring tool that can output XFL. Of course, the XFL file would then need to be opened in the Flash authoring tool for final .swf export. But a .jsfl script should be able to ease the workflow between an XFL-generating tool and the Flash-authoring .swf-compilation process.
The natural next step in the evolution of XFL authoring would be to take the Flash authoring tool out of the equation altogether. If Adobe were to offer a command-line XFL-to-SWF compiler along with XFL, nearly any decent programmer would be able to create a .swf-authoring tool, even in ActionScript. The Flash developer community itself would finally be able to create its own custom Flash-authoring tools. I wonder who would be the first to nostalgically make Flash 4 for AIR in ActionScript?
XFL might not have the instant appeal of inverse kinematics, but it could eventually prove to be the feature in Flash CS4 that has the greatest impact on the Flash industry. After all, its name has an "X' in it.
http://www.moock.org/blog/archives/000269.html
XMP
http://www.adobe.com/products/xmp/indepth.html
FLASH AS3 AND VIDEO for WebAnalytics
http://blog.ickydime.com/2008/05/flash-analytics-deep-linking-and-seo.html
You may be interested to read more about interactive video in Flash CS4 as well
http://younsi.blogspot.com/2008/12/interactive-video-in-flash-using-f4v.html
Thursday, June 05, 2008
how to disable intellisense
If I try to debug flash while intellisense process is running in the background, it crashes Visual Studio 2005....which force me to wait for intellisense to be complete when i launch my project or anytime intellisense has decided to start processing things again...
Not sure what is the advantage of intellisense... but for those who want to disable it :
In VS 2005 it can be done by renaming or deleting the following file:
Or
You can also control IntelliSense through macros, allowing you to enable/disable IntelliSense without restarting VS or renaming files. See this blog article for the macro details: http://blogs.msdn.com/vcblog/archive/2007/11/19/controlling-intellisense-through-macros.aspx
Thursday, April 10, 2008
Pros and cons of automatic update
Lately Microsoft has decided to push Silverlight on Vista SP1 and will certainly do the same things with Microsoft XP SP3. Nothing wrong about that. I have no objection with Automatic update at all since it is a great way to increase user experience but... only if the user has the choice... By combining all there fix in a Service pack they just find a way to update there platform.... When you install a software you can always see the software through the Add Remove Program for instance this is a good practice for stand alone runtime such as Visual Studio Runtime, .Net, Flash Player Active X Control, Air Runtime. But why Microsoft don't give this Option when user install the Service Pack.... Why not offering some component selection to the end user instead of installing a bunch of file with no report of what was really installed. Apple on Mac OSX offer this feature right(give the user a choice ). What i recommend is not to use automatic update or service Pack but rather check for available update and pick the one you really need or want !
Finally what i like with semi automatic update is not to seat in the tray icon and use my CPU but just be invoked by the application who need the service of the updater one time, ask the user.
Rebooting an XP machine and have to wait for udpates is not OPT-IN at ALL !
Tuesday, April 08, 2008
According to University of Utah researchers, using a larger monitor could save you 2.5 hours per day.
According to University of Utah researchers, using a larger monitor could save you 2.5 hours per day.
Specifically, test subjects completed everyday tasks like editing documents and massaging spreadsheets 52% faster when using a 24-inch monitor than they did with an 18-incher.
http://www.fourhourworkweek.com/blog/2008/03/15/size-does-matter-bigger-monitors-save-25-hours-a-day/
How to add automatic updater to a null soft installer and the pros and cons of automatic updates
To build an installer you only need to write a UTF-8 script using your favorites editor. When it comes to automatic update i really like a software written by a smart guy in Netherland. The updater can be purchase from http://www.catenalogic.com/
Once you get the updater you need to hook the updater into your installer.
To do so you need to provide a way to check for update from the start menu
using a shortcut towards the updater.exe. Your application should also execute the updater as well once in a while (periodic perdiod) or during each startup.
Here is what you need to add to your null soft script to provide a complete end to end update solution to you application.
First you need to compress the updater files and custom graphics such as top banner and left bitmap. Be carefull, the size of the graphics element are very important. One pixel off and you will see the default graphics instead.
!define CLIENT_VERSION "1.0"
!define CLIENT_NAME "MyHelloWorld Sample Application"
!define PRODUCT_NAME "${CLIENT_NAME}"
!define PRODUCT_VERSION "1.0.0.0"
!define SETUP_FILE "setup_1_0.exe"
!define APP_FILE1 "..\files\HelloWorld.exe"
!define UPDATER_FILE1 "..\files\updater.exe"
!define UPDATER_FILE2 "..\files\updaterbanner.bmp"
!define UPDATER_FILE3 "..\files\updaterleft.bmp"
Inside the Installer section of your script
you need to add script code to uncompress and copy the updater files
inside the target program file folder for your application. The one choosen
by the user or set by default under Program Files.
;script start
SetOverwrite ifnewer
CreateDirectory "$PROGRAMFILES\MyApp"
SetOutPath "$PROGRAMFILES\MyApp"
;HelloWorld.exe application file
File "${APP_FILE1}"
;UPDATER FILES TO EXTRACT
File "${UPDATER_FILE1}"
File "${UPDATER_FILE2}"
File "${UPDATER_FILE3}"
;you need to generate and update the settings.ini file
;used by the updater.exe so that the updater will know where to download
;the XML file on the update server. The updater will compare your
;application version set in the ini with the one available on the remote
;server. Because this call is self contain in the installer once you will
;uninstall and install a new version it will automatically update the up to
;date settings.ini
;Update Updater INI file with installation application path and product version
FileOpen $1 "$INSTDIR\settings.ini" w
;FileSeek $1 0 END $INI_SIZE
FileWrite $1 "[UPDATER]$\r$\n"
FileWrite $1 "runmode=full$\r$\n"
FileWrite $1 "logolarge=updaterleft.bmp$\r$\n"
FileWrite $1 "logosmall=updaterbanner.bmp$\r$\n"
FileWrite $1 "customnotification=false$\r$\n"
FileWrite $1 "[UPDATEINFO]$\r$\n"
FileWrite $1 "URL=http://www.yourwebserverforupdate.com/download/HelloWorld/full/update.xml$\r$\n"
;as you see the update.xml will provide a way for updater to get http path
;for update along with command (action) to execute in a chronological order.
;I will post a sample XML file in an other article.
FileWrite $1 "servertimeout=2000$\r$\n"
FileWrite $1 "[APPLICATION]$\r$\n"
StrCpy $KEY "name="
FileWrite $1 $KEY
StrCpy $VALUE "${PRODUCT_NAME}"
FileWrite $1 $VALUE
FileWrite $1 "$\r$\n"
StrCpy $KEY "version="
FileWrite $1 $KEY
StrCpy $VALUE ${CLIENT_VERSION}
FileWrite $1 $VALUE
FileWrite $1 "$\r$\n"
StrCpy $KEY "location="
FileWrite $1 $KEY
StrCpy $VALUE $INSTDIR\HelloWorld.exe
FileWrite $1 $VALUE
FileWrite $1 "$\r$\n"
FileWrite $1 "[PROXY]$\r$\n"
FileWrite $1 "type=autodetect$\r$\n"
FileClose $1
;last things you need to do is to create a shortcut.
;Te cool things with nullsoft when you create a shortcut is that
;it will use the last SetOutPath call as the working directory for your
;shortcut. Alternatively you can specify the path of the settings.ini
StrCpy $STARTMENU_FOLDER "MyHelloWorldApplication"
SetOutPath "$PROGRAMFILES\HelloWorld"
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Check for update.lnk" "$INSTDIR\updater.exe"
In your application code you will launch updater.exe from your application folder.
You can also read a registry key to get a custom path. This registry key will be set by the installer itself.
Finally what i like with semi automatic update is not to seat in the tray icon and use my CPU but just be invoked by the application who need the service of the updater one time, ask the user.
Hope you will find this Null Soft Updater Script for catenalogic useful !
Monday, March 17, 2008
Microsoft has licensed Flash Lite
Redmond, Wash.-based Microsoft (NASDAQ:MSFT) will distribute San Jose-based Adobe's (NASDAQ:ADBE) Flash Lite and Reader programs through cell phones that use its Windows Mobile software.
Financial terms of the deal were not disclosed, but the programs will be free for users.
Adobe said that more than half a billion mobile devices have shipped with Flash preinstalled, indicating 150 percent growth year over year.
Friday, February 22, 2008
Adobe Media Player
particully when hooked to a Plasma or LCD TV screen.
Everyone can enjoy playback of H264 and of course HD.
http://labs.adobe.com/technologies/mediaplayer/install/
For a full experience i recommend a Wireless Keyboard such as Apple
http://www.apple.com/keyboard/ or microsoft Wireless Entertainment Desktop 8000
Finally for those who want to encode MPEG2 HD content i recommend the On Air Solution USB adapter
Friday, January 25, 2008
How to detect Mobile device hitting your Web Server in PHP
http://wurfl.sourceforge.net/index.php
PHP is a great platform for WAP development. Thousands of developers worldwide love PHP for its performance and for the semplicity of its model.
It should come as no surprise that some PHP developer quickly built the tools to tap the WURFL power from PHP.
One easy way to play with the WURFL, is to use what I call the "WURFL PHP Library". The package includes the library and some support files such as a readme (I STRONGLY SUGGEST EVERYONE TO READ IT), check_wurfl.php that will let you quickly read all the capabilities of a selected device and update_cache.php which will be better described later.
* wurfl_parser.php: parse the xml and put it in an Array and the other to work with the data collected. Before starting, make sure you have compiled PHP properly ( http://www.php.net/manual/en/ref.xml.php ), wurfl_parser.php uses the basic XML functions implemented compiling with expat.
* wurfl_class.php: this script lets you access the data in the wurfl array (see previous bullet) in an object-oriented fashion.
* wurfl_config.php: with the growing number of possible configurations in the PHP library, I am now introducing a single file for configuration. This should hopefully make it clearer where you need to configure the scripts and maybe also make it easier to integrate it with your central configuration files (if your application has any)
wurfl_parser.php
wurfl_parser.php: This is a VERY simple XML parser that reads WURFL and puts all the needed data into an array. Considering the time the parser was taking to parse the XML, I thought that using some kind of caching mechanism was probably a good idea. This will be discussed more later.
The generated Array is an associative array that looks like this:
$wurfl["devices"]["ericsson_generic"]["fall_back"]="generic";
The first key is "devices". Other possible values such as authors and contributors are probably not so interesting to you.
The second key is the UNIQUE ID assigned to each user agent. All other keys are related to the attributes or groups and capabilities of the device.
Of course, this may seem not so flexible in practice, since devices tell us their user-agent strings, not their WURFL IDs.
This is solved thanks to an additional array called $wurfl_agents, which is simply an associative array of user agents and the relative unique id. This array makes your life much simpler (and your search much faster). $wurfl_agents is cached too.
Let's look at a concrete example. Someone visits you site with, say, a Siemens S45 (user agent: "SIE-S45/24 UP.Browser/5.0"). In order to find the device ID, you would normally be required to cycle most of the $wurfl array and retrieve the ID, before you can look up the actual capabilities.
Thanks to $wurfl_agent, this is as simple as:
if ( in_array($id, $wurfl_agents) ) {
echo "The ID $id is known
\n";
}
Example to search an ID knowing the user agent:
$wurfl_user_agents = array_keys($wurfl_agents);
while ( $x = each($wurfl_user_agents) ) {
if ( $x[1] == $user_agent ) {
return $wurfl_agents($x[1]);
}
}
wurfl_class.php
wurfl_class.php was created to make our life simpler. Once we had the data ready in an array, we needed an easy way to access it and some methods to manipulate it. By looking closely at what had been done with the Java API, I reproduced many of those useful methods in PHP.
The class loads the parser automatically. To load the parser a defined must be set appropriately in the config file.
The class is initialized calling the constructor, wurfl_class and passing two variables that may be empty. The former is the full XML parsed (like the parser does) and the latter is the array of user agents and id's as generated by the parser. Pass two empty variables (or nothing) if you want them to be filled (when needed) or the real values if you already have them. The class will check the values and the cache files (if enabled) and decide what to do. Also check your configuration, because the behaviour will change.
Use the public method GetDeviceCapabilitiesFromAgent() passing the user agent to make the class search for the best fit and fill the object's properties. Once again, what the class does depends on your configuration, if you enabled cache files and so on.
Once you have instantiated the object and passed a user agent you may use all the class' methods.
Here is a list of properties:
$wurfl_class->_wurfl is the WURFL array (all of it)
$wurfl_class->_wurfl_agents is the associative array made of the user agents
and unique id's
$wurfl_class->user_agent the visitor's user agent
$wurfl_class->wurfl_agent the WURFL's best fitting user agent
$wurfl_class->id the corresponding id
$wurfl_class->GUI true if the device supports Openwave's GUI
extensions
$wurfl_class->browser_is_wap true if the device is WAP capable. It is here
only for legacy support, you should use the
is_wireless_device capability from WURFL.
browser_is_wap now has the same value as the
capability, when found. If you want to take full
advantage of this capability you should download
the web patch from the WURFL site or CVS!
$wurfl_class->capabilities the array of device's capabilities
Note: PHP (up to version 4.3) does not have any distinction between private and public methods. In the wurfl_class implementation, I named all private methods with a leading underscore to distinguish them from public methods without the underscore. If you are interested in knowing the details, just open the class, there are beautiful JAVADOC-like comments for each variable and method.
These libraries don't require register_globals anymore (from version 2 and up), but will not work with versions before 4.1.
wurfl_class($wurfl, $wurfl_agents) is the constructor. Built to work
best with the wurfl_parser.
GetDeviceCapabilitiesFromAgent($ua) given a user agent it will search WURFL
for the best fit
getDeviceCapability($capability) given a capability it will tell you the
value. Remember that capabilities might be string,
integer or boolean.
wurfl_config.php
The scope of this file is straight forward, modify it at your wish to configure the library to act as you like it best.
Please check the paragraph about caching for more info about cache files.
Here is a quick explanation of all the fields:
WURFL_CONFIG boolean, this is set to true by default, it's used as a simple
check to make sure the configuration was included. Add this to your
configuration files if you won't use wurfl_config.php, otherwise just
leave it as it is
DATADIR string, where all data is stored (wurfl.xml, cache file, logs, etc)
WURFL_FILE string, full path and filename of wurfl.xml
WURFL_PARSER_FILE string, full path and filename of wurfl_parser.php
WURFL_CLASS_FILE string, full path and filename of wurfl_class.php
WURFL_USE_CACHE boolean, true if you want to use a cache file (strongly
suggested). If only this parameter is set to true will be used
cache.php.
WURFL_USE_MULTICACHE boolean, true if you want to use Multicache files
instead of a single BIG cache file (cache.php)
MULTICACHE_DIR string, used only if you enabled Multicache, defines where
the cache files will be stored. WARNING: while cache.php will grow
in size but remain a single file, here the files will grow in
number. Expect more than 5000 tiny files.
MULTICACHE_SUFFIX string, suffix for the files generated using Multicache.
Useful if you use a caching system and don't want to load your
shared memory with a ton of tiny files.
CACHE_FILE string, with full path and filename of the cache file to use
(refreshed when a new WURFL is found, if WURFL_CACHE_AUTOUPDATE is
set to true)
WURFL_CACHE_AUTOUPDATE boolean, tells the class to automatically update the
cached files with a new XML is found. This is NOT suggested when
using MULICACHE because of the high number of files to be updated.
Race conditions are highly possible to happen. The use of
update_cache.php is strongly suggested for production
environments
WURFL_PATCH_FILE string, optional patch file for WURFL
WURFL_AGENT2ID_FILE string, used by wurfl_class.php. Used only when
WURFL_USE_CACHE is set to true
MAX_UA_CACHE integer, max number of user agents to store in
WURFL_AGENT2ID_FILE. Too high limits might give the opposite effect.
WURFL_LOG_FILE string, defines full path and filename for logging
LOG_LEVEL integer, desired logging level. Use the same constants as for PHP
logging
WURFL_AUTOLOAD boolean, true if you want the XML to be loaded at every
startup. If not, the XML will be loaded when needed.
Caching
Considering how slow PHP can be when parsing a big XML file, caching was a must.
Currently there are two caching systems. The older is activated when setting WURFL_USE_CACHE to true and uses DATADIR to store its files. The concept is quite simple, dump the array generated by the parsers in a big file, by default called cache.php (set by the define CACHE_FILE). In this file we also store the array called $wurfl_agents and a timestamp, useful to check if a new XML was deployed.
This system is very simple in its concept and worked well for quite some time. Considering the big size that cache.php was reaching it became a need (and in fact I always strongly suggested it) to use a caching system at PHP-level, such as Zend Accelerator, Turck cache, APC 2.0. Using such tools lets you store the cache file (cache.php) into shared memory and provides really good performances from the third hit on (first hit the XML is parsed: slow, second hit the cache is stored in shared memory: slow, third hit and on the cache is read from the shared memory: fast!).
The new caching system was dubbed "multicache" because instead of generating a single big cache file it generates 1 cache file for every device in WURFL. For this reason you will need to create a directory for this (or at least this is suggested) because the library will generate about 6000 tiny files when this feature is activated.
To activate the multicache system you will need to set WURFL_USE_CACHE to true.
CACHE_FILE will still be used, but the file will only contain the array $wurfl_agents and the timestamp.
Also set WURFL_USE_MULTICACHE to true, set the appropriate path for MULTICACHE_DIR, an absolute path is suggested. Don't forget the ending slash (for example '/tmp/cache/multicache/').
MULTICACHE_SUFFIX should be left unchanged in most cases. This will define the extension of the tiny files. You might want to set some strange extension if you want to avoid that those files are cached in shared memory by any PHP-cache, for example. Change it only if you know what you're doing!
The multicache system provides a MUCH faster data retrival, files are smaller and so it will take a way less time to read them. This will also mean a higher I/O on your system, consider returning to the older cache system if you have problems. Generating many tiny files also involves possible race conditions if a new XML is deployed and the library is configured to update automatically the cache. Read on for more info.
If WURFL_CACHE_AUTOUPDATE is set to true the library (specifically wurfl_class.php) will check the timestamp in cache.php against the file mtime of wurfl.xml. If the XML is newer than the cache it is reloaded. This is not suggested for production environments, if you have many concurrent hits you might have more than one process trying to refresh the same cache wasting a lot of resources. If you would like to avoid this you can set the automatic update to false and use the 'ad hoc' script called update_cache.php. This script was created to be called from command line (or a hidden URL if you'd like, but the command line is suggested when available) and force a cache update. This way the cache update will be prepared and the file will be changed at the very last second saving a lot of resources and having a single process do it. On sites with MANY hits you might also consider preparing the cache files on a separated system and moving them to the production server at once. There isn't a sccript to do this automatically at this time, but the new update_cache.php is already a step in that direction.
When setting WURFL_USE_CACHE to true you also enable another simple caching system (active both when using standard cache and multicache). When a user agent hits your site, this will most likely hit it again a few times. It would be stupid to search for all its capabilities at every second hit. For this reason we store the user agent and its capabilities in a file named after the value set in WURFL_AGENT2ID_FILE, this will make every second hit A LOT faster.
Storing all the user agents hitting your site will end up having a second full cache file and the benefit would reach zero. For this reason you can define a limit of user agents stored using MAX_UA_CACHE. The "perfect" value will change depending on your server's performances on the variety of user agents visiting your site and so on. A good number is between 30 and 50. I suggest you to start with 30 and maybe check the logs and see how often the cache is cleaned of the elder user agents and how often a user agent that is still visiting your site is cleaned and researched.
It's a direct consequence of the cache system that you will not need to read the entire XML and parse it every time you start the wurfl object. You may still want to force this for debug reasons for example. You can do this setting to true the define named WURFL_AUTOLOAD. If you are using any of the caching systems, I suggest you to disable this. If you're not using any cache, the XML will be loaded anyway, so just set this to true, if you'd like.
Logging
While logging is out of the scope of the WURFL PHP Libraries and I suggest you to integrate the libraries with your logging system (if you have any), a basic logging feature is included. This should work fine on Linux, Solaris and Windows.
Logging is done on a file as configured with WURFL_LOG_FILE. The log level is defined following the PHP contants and using the define named LOG_LEVEL. It used to be buggy in previous releases, check out how it has changed and it is now supposed to work properly. When set with the highest level the library might generate a log of logs.
Logs should anyway give you all the info you might need. This is a sample log when set at the highest detail level:
Wednesday, December 19, 2007
How to detect if Visual Studio 2005 SP1 is installed on Windows
HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\{PatchCode}
You can find the {PatchCode} in the .msp file. In Windows 2003 and earlier platforms, you'll see this as the Revision number property in the properties Summary tab in Windows Explorer. In all cases, you can query the Summary Information stream or open the .msp file in Orca, then click the View -> Summary Information menu item.
For the English Visual Studio 2005 Service Pack 1 for Standard, Professional, and Team editions (VS80sp1-KB926601-X86-ENU) an example of the registry key above follows.
HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\{D93F9C7C-AB57-44C8-BAD6-1494674BCAF7}
You can also determine the service pack level of a more general, larger scope by reading a REG_DWORD registry value named SP from under,
HKEY_LOCAL_MACHINE\Software\Microsoft\DevDiv\[ProductFamily]\Servicing\8.0
…and for a specific language SKU using a sub-key,
HKEY_LOCAL_MACHINE\Software\Microsoft\DevDiv\[ProductFamily]\Servicing\8.0\[ProductEdition]\[ProductLanguage]
Product families are pretty broad in scope, and include for "Whidbey":
URT (.NET Framework, once known as the Universal Runtime)
VB (Microsoft Visual Basic 2005 Express)
VC (Microsoft Visual C++ 2005 Express)
VCS (Microsoft Visual C# 2005 Express)
VJS (Microsoft Visual J# 2005 Express)
VNS (Microsoft Visual Web Developer 2005 Express)
VS (Visual Studio 2005 Standard, Professional, Team Suite, etc.)
VSTF (Visual Studio 2005 Team Foundation Services)
An example using the English Visual Studio 2005 Team Suite Service Pack 1 of the registry keys above follows. Under each key you would find a registry value named SP set to 1.
HKEY_LOCAL_MACHINE\Software\Microsoft\DevDiv\VS\Servicing\8.0
HKEY_LOCAL_MACHINE\Software\Microsoft\DevDiv\VS\Servicing\8.0\VSTS\1033
Visual Studio 2005 Express SKUs will always use the ProductEdition of EXP, so you can combine the ProductFamily values documented above with EXP to form registry keys like the following, for Visual C# 2005 Express.
HKEY_LOCAL_MACHINE\Software\Microsoft\DevDiv\VCS\Servicing\8.0
HKEY_LOCAL_MACHINE\Software\Microsoft\DevDiv\VCS\Servicing\8.0\EXP\1033
Sunday, December 16, 2007
Locking header control in MFC to prevent the column to be resized
// From commctrl.h
#ifdef UNICODE
#define HDN_BEGINTRACK HDN_BEGINTRACKW
#else
#define HDN_BEGINTRACK HDN_BEGINTRACKA
#endif
So when you implement a handler for HDN_BEGINTRACK, you're actually implementing it for HDN_BEGINTRACKA or HDN_BEGINTRACKW, depending on the value of UNICODE. But which message does the header control actually send? Remember, the header control is part of Windows, one of the common controls in comctl32.dll. Since the DLL is already compiled into executable code, changing the value of UNICODE in your project has absolutely no effect on its operation. How does the header control know which flavor of notification to send—A or W?
The answer lies in an oft-forgotten message, WM_NOTIFYFORMAT. When a control is first created, it sends a message to its parent, in effect asking, "do you want ANSI or Unicode notifications?" The parent responds with NFR_ANSI or NFR_UNICODE. If the parent doesn't handle WM_NOTIFYFORMAT, the Windows DefWindowProc responds based on the preference of the parent window or dialog itself. The default is Unicode. So I suspect the reason you had no luck trapping HDN_BEGINTRACK is that you compiled an ANSI program without handling WM_NOTIFYFORMAT. Your application is looking for HDN_BEGINTRACKA (ANSI) while the header control is sending HDN_BEGINTRACKW (Unicode).
One way to fix the problem is to implement a WM_NOTIFYFORMAT handler for your list control, one that returns NFR_ANSI. When I tried this, the header control did indeed send HDN_BEGINTRACKA and I was able to prevent sizing. But using NFR_ANSI broke other features. For example, the list control no longer repaints its columns while sizing.
A simpler, more reliable way to prevent sizing header columns is to implement handlers for both HDN_BEGINTRACKA and HDN_BEGINTRACKW. This not only obviates the need to process WM_NOTIFYFORMAT, it lets your code work in both ANSI and Unicode modes.
The header control sends HDN_XXX notifications to the parent (list control) window, but when using MFC you can use message reflection to handle the notifications in the header itself. Since the "lockable columns" feature is more a property of the header than the list control, this is the approach I chose. If you're not using MFC, you'll have to handle these notifications in the list control. To do message reflection, you can use ON_NOTIFY_REFLECT in your header control's message map or simply override the virtual function OnChildNotify, as shown here:
BOOL CLockableHeader::OnChildNotify(
UINT msg, WPARAM wp, LPARAM lp, LRESULT* pRes)
{
NMHDR& nmh = *(NMHDR*)lp;
if (nmh.code==HDN_BEGINTRACKW || nmg.code==HDN_BEGINTRACKA)
return *pRes=TRUE;
•••
}
Since OnChildNotify is virtual, there's no need for message map entries. All you have to do is implement it. In any given application, the header will send one or the other, not both. Either way, CLockableHeader eats the notification—that is, returns TRUE (handled) without passing on to the default header control. CLockableHeader controls locking through a flag m_bLocked which the app can set by calling CLockableHeader::Lock.
If you're going to prevent sizing, you should also disable the size cursor. Otherwise users may think your app is either broken or lame. Fortunately, it's trivial:
BOOL
CLockableHeader::OnSetCursor(
CWnd* pWnd, UINT nHit, UINT msg)
{
return m_bLocked ? TRUE :
CHeaderCtrl::OnSetCursor(pWnd, nHit, msg);
}
In other words: if the columns are locked, OnSetCursor returns TRUE without setting the cursor; otherwise, let the header control do its size cursor thing. Now when the columns are locked, Windows displays its standard arrow cursor instead of displaying the left-right sizing cursor.
Once you've implemented your custom header control by deriving from CHeaderCtrl, how do you get Windows to use it? The same way you would for any dialog control, by subclassing. The right place is in the parent window's OnCreate handler:
// CMyView is derived from CListView
int CMyView::OnCreate(LPCREATESTRUCT lpcs)
{
VERIFY(CListView::OnCreate(lpcs)==0);
return m_header.SubclassDlgItem(0,this) ? 0 : -1;
}
This works because the header control always has ID = 0. With all this in place, the only thing left to do is implement the command and UI update handlers for the View | Lock Columns command.
Sunday, December 02, 2007
How lucky you are if you read this text
Si on pouvait réduire la population du monde en un village de 100 personnes tout en maintenant les proportions de tous les peuples existants sur la Terre, ce village serait ainsi composé :
57 asiatiques,
21 européens,
14 américains (Nord, Centre et Sud)
8 africains.
Il y aurait :
52 femmes et 48 hommes
30 blancs et 70 non blancs
30 chrétiens et 70 non chrétiens
89 hétérosexuels et 11 homosexuels
6 personnes posséderaient 59% de la richesse totale et tous les 6 seraient américains
80 vivraient dans des maisons vétustes
70 seraient analphabètes
50 souffriraient de malnutrition
1 serait en train de mourir
1 serait en train de naître
1 posséderait un ordinateur
1 (oui, un seulement) aurait un diplôme universitaire
Si on considère le monde de cette manière, le besoin d'accepter et de comprendre devient évident.
Prenez en considération aussi ceci :
Si vous vous êtes levé ce matin avec plus de santé que de maladie, vous êtes plus chanceux que le million de personnes qui ne verra pas la semaine prochaine.
Si vous n'avez jamais été dans le danger d'une bataille, la solitude de l'emprisonnement, l'agonie de la torture, l'étau de la faim, vous êtes mieux que 500 millions de personnes.
Si vous pouvez aller à l'église ou dans un temple sans peur d'être menacé, torturé ou tué, vous avez plus de chance que 3 milliards de personnes.
Si vous avez de la nourriture dans votre réfrigérateur, des habits sur vous, un toit sur votre tête et un endroit pour dormir, vous êtes plus riche que 75% des habitants de la Planète.
Si vous avez de l'argent à la banque, dans votre portefeuille ou de la monnaie dans une petite boite, vous faite partie des 8% les plus privilégiés du monde.
Si vos parents sont encore vivants et toujours mariés, vous êtes des personnes réellement rares.
Si, enfin, vous lisez ce message, vous venez de recevoir un double cadeau parce que quelqu'un a pensé à vous et parce que vous ne faites pas partie des deux milliards de personnes qui ne savent pas lire...
Monday, November 26, 2007
How to create a def file for a dll
objdump -p mydll.dll > mydll.fil
Search for "[Ordinal/Name Pointer] Table" in mydll.fil and use the list of functions following it to create your def file.
Wednesday, November 21, 2007
Upload Video to Youtube
About youtube :
When you upload a video to YouTube, it automatically converts it to a flash video file (.flv) with specific settings (see below, standard column). The contrast of the video is increased and video noise is suppressed. YouTube appears to respect the framerate of the uploaded file; Framerates will varie between 15 (minimum framerate to tell it is a video...), 24 frames (pal) and 30 frames per second (ntsc with no drop frame). It is hard to tell how long you have to wait for the video to be available but it is pretty fast !!. Once the video has been uploaded you can log to your account and from there you can check the status of your video. Usually you will see Uploaded (processing, please wait).
Video Profile
standard recommended possible
file extension : .flv (flash video)
total bitrate : ~320 kbits/sec 804.7 kbits/sec 2147.2 kbits/sec
audio codec : MPEG layer 3 (MP3)
audio format : Mono, 22.050 kHz Stereo, 44.100 kHz Stereo, 44.100 kHz
audio bitrate : ~67 kpbs/sec 128 kpbs/sec 128 kpbs/sec
video codec : Sorenson Spark (H.263)
video format : 320 x 240 px, 15-30 fps 320 x 240 px, 29.97 fps 640 x 480 px, 29.97 fps
video bitrate : ~250 kbps/sec 677.7 kbps/sec 2019.2 kbps/sec
You can save your own .flv files and upload them to YouTube. You can encode video with higher bitrates and resolution than YouTube compresses with. The only limitations I can tell are that the file must be under 100 MB and you must use the Sorenson Spark video codec and MP3 audio codec.
Monday, November 19, 2007
How to take advantage of Silverlight Marker to create hypervideo
http://silverlight.net/blogs/jesseliberty/archive/2007/10/24/hypervideo-2.aspx
Wednesday, November 14, 2007
silent install of the VC 8.0 runtime (vcredist) packages
For x86: vcredist_x86.exe /q:a /c:"VCREDI~1.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
For x64: vcredist_x64.exe /q:a /c:"VCREDI~2.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
For ia64: vcredist_ia64.exe /q:a /c:"VCREDI~3.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
The following command lines can be used to install the Visual Studio 2005 SP1 release of the standalone VC 8.0 redistributable packages:
For x86: vcredist_x86.exe /q:a /c:"VCREDI~3.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
For x64: vcredist_x64.exe /q:a /c:"VCREDI~2.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
For ia64: vcredist_ia64.exe /q:a /c:"VCREDI~1.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
If you would like to install the VC runtime packages in unattended mode (which will show a small progress bar but not require any user interaction), you can change the /qn switch above to /qb. If you would like the progress bar to not show a cancel button, then you can change the /qn switch above to /qb!
Some folks ask me what vcredist.msi..
Iy means that you want to extract the embedded msi from the self exe package and be able to run msiexec which is used to install the package. msiexec is the Microsoft Installer runtime.
MSI is the prefered format for microsoft installer. Installshield and Visual Studio 2005 and higher can generate MSI. Using the msiexec command. You can even log all the installer session to a file and you can verify and explore the content of the MSI using ORCA in order to look at the installer sequence, string table and in some cases embedded Visual Basic Script. Yes Visual Basic is not dead. Still used and convnient enough for scripting installer code :)
If you want to install the runtime from a Null Soft Installer NSI script with minimal UI and progress bar, here is what you want to do
;extract selft exe to temp
SetOutPath "$TEMP"
; uncompress
File "${RUNTIME_VCREDIST}"
;-------------------------------
; Test if Visual Studio Redistributables 2005+ SP1 installed
; Returns -1 if there is no VC redistributables intstalled
Function CheckVCRedist
Push $R0
ClearErrors
ReadRegDword $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{7299052b-02a4-4627-81f2-1818da5d550d}" "Version"
; if VS 2005+ redist SP1 not installed, install it
IfErrors 0 VSRedistInstalled
StrCpy $R0 "-1"
VSRedistInstalled:
Exch $R0
FunctionEnd
Section "Installer Sections" SecDummy
SetOverwrite ifnewer
Call CheckVCRedist
;IntCmp $0 5 is5 lessthan5 morethan5
IntCmp $R0 -1 noVCRuntime noVCRuntime VCRuntime
;force install
; IntCmp $R0 -1 noVCRuntime noVCRuntime noVCRuntime
noVCRuntime:
;extract VCRuntime to Temp
SetOutPath "$TEMP"
File "${RUNTIME_VCREDIST}"
;/qn for complete silent install
;/qb small progress dialog but does not require any user interaction
;StrCpy $VC_RUNTIME "$\"$TEMP\vcredist_x86.exe$\" /q:a /c:$\"VCREDI~3.EXE /q:a /c:$\"$\"msiexec /i vcredist.msi /qb!$\""
StrCpy $VC_RUNTIME "$\"$TEMP\vcredist_x86.exe$\" /q:a"
;MessageBox MB_ICONINFORMATION 'Need to install VCRuntime {$R0} {$VC_RUNTIME}'
ExecWait '$VC_RUNTIME' $0
;MessageBox MB_ICONINFORMATION 'Return Code {$0}'
;IntCmp $0 0 done
;MessageBox MB_ICONINFORMATION 'install complete'
Delete "$TEMP\vcredist_x86.exe"
Goto VCRuntime
VCRuntime:
SectionEnd
http://blogs.msdn.com/astebner/archive/2007/02/07/update-regarding-silent-install-of-the-vc-8-0-runtime-vcredist-packages.aspx
Sunday, November 11, 2007
Friday, October 12, 2007
Parsing XML in PHP
In this example we have a XML file which consists of a document with a specific version. The document contains persons with the attributes firstname, lastname and description. The code snippet finds the document version and prints it. It's pretty straight forward you just check all the top nodes of the document and look for the one named document.
foreach ( $tree->children as $document )
{
// parse the document
if ( $document->name == "document" )
{
// get the document version attribute
foreach ( $document->attributes as $documentAttr )
{
if ( $documentAttr->name == "version" )
{
print( "Found document with version: " . $documentAttr->content . "
" );
}
}
// find persons here
}
}
When you've found the document node you can start looking for persons. This is done in the same manner, check the children nodes and look for person.
To make the process of getting the attribute values simpler we write a helper function to fetch the attribute value from a node.
function getAttrValue( $node, $attrName )
{
$ret = false;
foreach ( $node->attributes as $nodeAttr )
{
if ( $nodeAttr->name == $attrName )
{
$ret = $nodeAttr->content;
}
}
return $ret;
}
Now we're ready to parse the information describing the persons in this example. When we've found the person node we check all the subnodes and look for the nodes we want and fetch the information from these nodes.
// parse all persons
foreach ( $document->children as $person )
{
if ( $person->name == "person" )
{
print( "Found a new person
" );
$firstName = "";
$lastName = "";
$descriptionName = "";
// get the name and description
foreach ( $person->children as $personAttribute )
{
switch ( $personAttribute->name )
{
case "firstname" :
{
$firstName = getAttrValue( $personAttribute, "value" );
}break;
case "lastname" :
{
$lastName = getAttrValue( $personAttribute, "value" );
}break;
case "description" :
{
// get the description text
foreach ( $personAttribute->children as $description )
{
if ( $description->type == 3 )
{
$description = $description->content;
}
}
}break;
}
}
print( "The persons firstname is: $firstName
" );
print( "The persons lastname is: $lastName
" );
print( "The persons description is: $description
" );
}
}
include_once( "ezxml/classes/ezxml.php" );
$xmlDocument =
"
Coder.
Coder.
$tree =& eZXML::domTree( $xmlDocument, array( "TrimWhiteSpace" => true ) );
foreach ( $tree->children as $document )
{
// parse the document
if ( $document->name == "document" )
{
// get the document version attribute
foreach ( $document->attributes as $documentAttr )
{
if ( $documentAttr->name == "version" )
{
print( "Found document with version: " . $documentAttr->content . "
" );
}
}
// parse all persons
foreach ( $document->children as $person )
{
if ( $person->name == "person" )
{
print( "Found a new person
" );
$firstName = "";
$lastName = "";
$descriptionName = "";
// get the name and description
foreach ( $person->children as $personAttribute )
{
switch ( $personAttribute->name )
{
case "firstname" :
{
$firstName = getAttrValue( $personAttribute, "value" );
}break;
case "lastname" :
{
$lastName = getAttrValue( $personAttribute, "value" );
}break;
case "description" :
{
// get the description text
foreach ( $personAttribute->children as $description )
{
if ( $description->type == 3 )
{
$description = $description->content;
}
}
}break;
}
}
print( "The persons firstname is: $firstName
" );
print( "The persons lastname is: $lastName
" );
print( "The persons description is: $description
" );
}
}
}
}
/*!
Function to fetch an attribute value.
Will return the value of the attribute if found. False if not found.
*/
function getAttrValue( $node, $attrName )
{
$ret = false;
foreach ( $node->attributes as $nodeAttr )
{
if ( $nodeAttr->name == $attrName )
{
$ret = $nodeAttr->content;
}
}
return $ret;
}
This code will produce the following output:
Found document with version: 42
Found a new person
The persons firstname is: Bård
The persons lastname is: Farstad
The persons description is: Coder.
Found a new person
The persons firstname is: Christoffer A.
The persons lastname is: Elo
The persons description is: Coder2.
Using XML is simple and straightforward with the eZ xml class. You don't need any external libraries, the class produce the same document tree as you would get from the XML functions in PHP (which all need external libraries). It is also the only PHP XML parser class which returns the same object tree as the library functions, making it easy to use your programs both on sites where XML is compiled into PHP and sites where it isn't.
Wednesday, September 26, 2007
PuTTY: A Free Telnet/SSH Client
Friday, August 31, 2007
Scene Cut Detection
this famous French Laboratory. The purpose was to perform scene cut detection
thanks to a frame by frame video engine written for Windows and DirectShow.
The algorithm was very CPU intensive but pretty interesting.
http://www.irisa.fr/vista/Themes/Logiciel/MdShots/MdShots.english.html
Monday, August 13, 2007
HTTP performance testing with httperf, autobench
* httperf is a benchmarking tool that measures the HTTP request throughput of a web server. The way it achieves this is by sending requests to the server at a fixed rate and measuring the rate at which replies arrive. Running the test several times and with monotonically increasing request rates, one can see the reply rate level off when the server becomes saturated, i.e., when it is operating at its full capacity.
* autobench is a Perl wrapper around httperf. It runs httperf a number of times against a Web server, increasing the number of requested connections per second on each iteration, and extracts the significant data from the httperf output, delivering a CSV format file which can be imported directly into a spreadsheet for analysis/graphing.
I ran a series of autobench/httperf and openload tests against a Web site I'll call site2 in the following discussion (site2 is a beta version of a site I'll call site1). For comparison purposes, I also ran similar tests against site1 and against www.example.com. The machine I ran the tests from is a Red Hat 9 Linux server co-located in downtown Los Angeles.
Here is an example of running httperf against www.example.com:
# httperf --server=www.example.com --rate=10 --num-conns=500
httperf --client=0/1 --server=www.example.com --port=80 --uri=/ --rate=10 --send-buffer=4096 --recv-buffer=16384 --num-conns=500 --num-calls=1
Maximum connect burst length: 1
Total: connections 500 requests 500 replies 500 test-duration 50.354 s
Connection rate: 9.9 conn/s (100.7 ms/conn, <=8 concurrent connections)
Connection time [ms]: min 449.7 avg 465.1 max 2856.6 median 451.5 stddev 132.1
Connection time [ms]: connect 74.1
Connection length [replies/conn]: 1.000
Request rate: 9.9 req/s (100.7 ms/req)
Request size [B]: 65.0
Reply rate [replies/s]: min 9.2 avg 9.9 max 10.0 stddev 0.3 (10 samples)
Reply time [ms]: response 88.1 transfer 302.9
Reply size [B]: header 274.0 content 54744.0 footer 2.0 (total 55020.0)
Reply status: 1xx=0 2xx=500 3xx=0 4xx=0 5xx=0
CPU time [s]: user 15.65 system 34.65 (user 31.1% system 68.8% total 99.9%)
Net I/O: 534.1 KB/s (4.4*10^6 bps)
Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
The 3 arguments I specified on the command line are:
* server: the name or IP address of your Web site (you can also specify a particular URL via the --uri argument)
* rate: specifies the number of HTTP requests/second sent to the Web server -- indicates the number of concurrent clients accessing the server
* num-conns: specifies how many total HTTP connections will be made during the test run -- this is a cumulative number, so the higher the number of connections, the longer the test run
Here is a detailed interpretation of an httperf test run. In short, the main numbers to look for are the connection rate, the request rate and the reply rate. Ideally, you would like to see that all these numbers are very close to the request rate specified on the command line. If the actual request rate and the reply rate start to decline, that's a sign your server became saturated and can't handle any new connections. That could also be a sign that your client became saturated, so that's why it's better to test your client against a fast Web site in order to gauge how many outgoing HTTP requests can be sustained by your client.
Autobench is a simple Perl script that facilitates multiple runs of httperf and automatically increases the HTTP request rate. Configuration of autobench can be achieved for example by means of the ~/.autobench.conf file. Here is how my file looks like:
# Autobench Configuration File
# host1, host2
# The hostnames of the servers under test
# Eg. host1 = iis.test.com
# host2 = apache.test.com
host1 = testhost1
host2 = testhost2
# uri1, uri2
# The URI to test (relative to the document root). For a fair comparison
# the files should be identical (although the paths to them may differ on the
# different hosts)
uri1 = /
uri2 = /
# port1, port2
# The port number on which the servers are listening
port1 = 80
port2 = 80
# low_rate, high_rate, rate_step
# The 'rate' is the number of number of connections to open per second.
# A series of tests will be conducted, starting at low rate,
# increasing by rate step, and finishing at high_rate.
# The default settings test at rates of 20,30,40,50...180,190,200
low_rate = 10
high_rate = 50
rate_step = 10
# num_conn, num_call
# num_conn is the total number of connections to make during a test
# num_call is the number of requests per connection
# The product of num_call and rate is the the approximate number of
# requests per second that will be attempted.
num_conn = 200
#num_call = 10
num_call = 1
# timeout sets the maximimum time (in seconds) that httperf will wait
# for replies from the web server. If the timeout is exceeded, the
# reply concerned is counted as an error.
timeout = 60
# output_fmt
# sets the output type - may be either "csv", or "tsv";
output_fmt = csv
## Config for distributed autobench (autobench_admin)
# clients
# comma separated list of the hostnames and portnumbers for the
# autobench clients. No whitespace can appear before or after the commas.
# clients = bench1.foo.com:4600,bench2.foo.com:4600,bench3.foo.com:4600
clients = localhost:4600
The only variable I usually tweak from one test run to another is num_conn, which I set to the desired number of total HTTP connections to the server for that test run. In the example file above it is set to 200.
I changed the default num_call value from 10 to 1 (num_call specifies the number of HTTP requests per connection; I like to set it to 1 to keep things simple). I started my test runs with low_rate set to 10, high_rate set to 50 and rate_step set to 10. What this means is that autobench will run httperf 5 times, starting with 10 requests/sec and going up to 50 requests/sec in increments of 10.
When running the following command line...
# autobench --single_host --host1=www.example.com --file=example.com.csv
Wednesday, August 08, 2007
Source Code Beautifier for C, C++, C#, D, Java, and Pawn
http://uncrustify.sourceforge.net/
how to convert IIS log to apache log using perl
# 1. Go to Start -> Control Panel -> Administrative Tools
# 2. Run Internet Information Services (IIS).
# 3. Find your Web site under the tree on the left.
# 4. Right-click on it and choose Properties.
# 5. On the Web site tab, you will see an option near the bottom that says "Active #Log Format." Click on the Properties button.
# 6. At the bottom of the General Properties tab, you will see a box that contains #the log file directory and the log file name. The full log path is comprised of the #log file directory plus the first part of the log file name.
#
#For example, if the dialog box displayed the following values:
#
# * Log file directory: C:\Windows\System32\LogFiles
# * Log file name: W3SVC1\exyymmdd.log
#Then your full log path would be:
#C:\Windows\System32\LogFiles\W3SVC1
#!/usr/bin/perl
#
# make an IIS log look strikingly like an apache log
# we make a vague attempt to interpret the Fields: header
# in an IIS logfile and use that to make IIS fields match up
# with apache fields.
#
# jwa@jammed.com 12 Dec 2000
#
while ($arg = shift @ARGV) {
$tzoffset = shift @ARGV if ($arg eq "--faketz");
$vhost = shift @ARGV if ($arg eq "--vhost");
$debug = 1 if ($arg eq "--debug"); # show field interpretation
}
if ($tzoffset eq "") {
print STDERR "Will use -0000 as a fake tzoffset\n";
$tzoffset = "-0000";
}
# build month hash
@m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
while ($m = shift @m) {
$month{++$n} = $m;
}
# an IIS log adheres to what's defined by 'Fields;'
# attempt to parse this, tagging
LINE:
while ($line =
$line =~ s/\r|\n//g; # cooky DOS format
if ($line =~ /^#Fields: /) {
@line = split(" ", $line);
shift @line; # shifts of #Fields
# build a hash so we can look up a fieldname and
# have it return a position in the string
undef %fieldh;
$n = 0; # zero-based array for split
while ($l = shift @line) {
$fieldh{$l} = $n++;
print STDERR "$l is position $fieldh{$l}\n" if ($debug);
}
}
next LINE if ($line =~ /^#/);
#Fields: date time c-ip cs-username s-sitename s-computername s-ip cs-method cs-
#uri-stem cs-uri-query sc-status sc-win32-status sc-bytes cs-bytes time-taken
#s-port cs-version cs(User-Agent) cs(Cookie) cs(Referer)
# this is really slow.
$date = yankfield("date");
$time = yankfield("time");
$ip = yankfield("c-ip");
$username = yankfield("cs-username");
$method = yankfield("cs-method");
$stem = yankfield("cs-uri-stem");
$query = yankfield("cs-uri-query");
$status = yankfield("sc-status");
#$bytes = yankfield("cs-bytes");
# Which is it? sc-bytes or cs-bytes?
# cs-bytes only appears in some of the IIS logs I've seen.
# I'll assume that sc-bytes is "server->client bytes", which
# is what we want anyway.
$bytes = yankfield("sc-bytes"); # I'm gonna go with this.
$useragent = yankfield("cs(User-Agent)");
$referer = yankfield("cs(Referer)");
$useragent =~ s/\+/\ /g;
# our modified CLF sez:
# IP - - [DD/MMM/YYYY:HH:MM:SS TZOFFSET] "method stem[?query]" status bytes "referer" "user agent" "vhost"
# convert date
# 2000-07-19 00:00:01
($y, $m, $d) = split("-", $date);
$m =~ s/^0//g;
$mname = $month{$m};
# build url
$url = $stem;
if ($query ne "-") {
$url .= "?$query";
}
# all done, print it out
print "$ip - - [${d}/${mname}/${y}:${time} ${tzoffset}] \"$method $url\" $status $bytes \"$referer\" \"$useragent\" \"${vhost}\"\n";
}
# return the proper field, or "-" if it's not defined.
# (unfortunately ($date) = (split(" ", $line))[$fieldh{date}];
# will return element 0 if $fieldh{date} is undefined . . .)
sub yankfield {
my ($field) = shift @_;
print STDERR "Looking at $field; position [$fieldh{$field}]\n" if ($debug);
if ($fieldh{$field} ne "") {
return (split(" ", $line))[$fieldh{$field}];
} else {
print STDERR "$field undefined\n" if ($debug);
return "-";
}
}
Tuesday, July 17, 2007
Microsoft PhotoTours
http://www.collegehumor.com/video:1762315
More information is available on the Microsoft Research Website.
http://research.microsoft.com/IVM/PhotoTours/
There is also a live preview of this software available online. All you need to do is install a 5.5 MB Photosynth ActiveX. The address is :
http://labs.live.com/photosynth/
http://www.crazyleafdesign.com/blog/photosynth-prototype/
Friday, July 13, 2007
Peter Löthberg mother's Sigbritt, 75, has world's fastest broadband
Published: 12th July 2007 11:07 CET
Online: http://www.thelocal.se/7869/
A 75 year old woman from Karlstad in central Sweden has been thrust into the IT history books - with the world's fastest internet connection.
Sigbritt Löthberg's home has been supplied with a blistering 40 Gigabits per second connection, many thousands of times faster than the average residential link and the first time ever that a home user has experienced such a high speed.
But Sigbritt, who had never had a computer until now, is no ordinary 75 year old. She is the mother of Swedish internet legend Peter Löthberg who, along with Karlstad Stadsnät, the local council's network arm, has arranged the connection.
"This is more than just a demonstration," said network boss Hafsteinn Jonsson.
"As a network owner we're trying to persuade internet operators to invest in faster connections. And Peter Löthberg wanted to show how you can build a low price, high capacity line over long distances," he told The Local.
Sigbritt will now be able to enjoy 1,500 high definition HDTV channels simultaneously. Or, if there is nothing worth watching there, she will be able to download a full high definition DVD in just two seconds.
The secret behind Sigbritt's ultra-fast connection is a new modulation technique which allows data to be transferred directly between two routers up to 2,000 kilometres apart, with no intermediary transponders.
According to Karlstad Stadsnät the distance is, in theory, unlimited - there is no data loss as long as the fibre is in place.
"I want to show that there are other methods than the old fashioned ways such as copper wires and radio, which lack the possibilities that fibre has," said Peter Löthberg, who now works at Cisco.
Cisco contributed to the project but the point, said Hafsteinn Jonsson, is that fibre technology makes such high speed connections technically and commercially viable.
"The most difficult part of the whole project was installing Windows on Sigbritt's PC," said Jonsson.
The Local (news@thelocal.se/08 656 6518)
Monday, July 09, 2007
chown on linux using c++
NAME
lchown - change the owner and group of a symbolic link
#include
int lchown(const char *path, uid_t owner, gid_t group);
DESCRIPTION
The lchown() function shall be equivalent to chown(), except in the case where the named file is a symbolic link. In this case, lchown() shall change the ownership of the symbolic link file itself, while chown() changes the ownership of the file or directory to which the symbolic link refers.
RETURN VALUE
Upon successful completion, lchown() shall return 0. Otherwise, it shall return -1 and set errno to indicate an error.
ERRORS
The lchown() function shall fail if:
EACCES
Search permission is denied on a component of the path prefix of path.
EINVAL
The owner or group ID is not a value supported by the implementation.
ELOOP
A loop exists in symbolic links encountered during resolution of the path argument.
ENAMETOOLONG
The length of a pathname exceeds {PATH_MAX} or a pathname component is longer than {NAME_MAX}.
ENOENT
A component of path does not name an existing file or path is an empty string.
ENOTDIR
A component of the path prefix of path is not a directory.
EOPNOTSUPP
The path argument names a symbolic link and the implementation does not support setting the owner or group of a symbolic link.
EPERM
The effective user ID does not match the owner of the file and the process does not have appropriate privileges.
EROFS
The file resides on a read-only file system.
The lchown() function may fail if:
EIO
An I/O error occurred while reading or writing to the file system.
EINTR
A signal was caught during execution of the function.
ELOOP
More than {SYMLOOP_MAX} symbolic links were encountered during resolution of the path argument.
ENAMETOOLONG
Pathname resolution of a symbolic link produced an intermediate result whose length exceeds {PATH_MAX}.
The following sections are informative.
EXAMPLES
Changing the Current Owner of a File
The following example shows how to change the ownership of the symbolic link named /modules/pass1 to the user ID associated with "jones" and the group ID associated with "cnd".
The numeric value for the user ID is obtained by using the getpwnam() function. The numeric value for the group ID is obtained by using the getgrnam() function.
#include
#include
#include
#include
struct passwd *pwd;
struct group *grp;
char *path = "/modules/pass1";
...
pwd = getpwnam("Sri_Chinmoy");
grp = getgrnam("guru");
lchown(path, pwd->pw_uid, grp->gr_gid);
Advanced Unix Programming Source
UNIX tasks in c++
http://basepath.com/aup/ex/index.html