Friday, October 09, 2009

(Simplified) Block/Closure Extension to C/Objective C/C++


My previous post from yesterday showed the new block/closure feature of the C language. I think I may have made the block syntax more complex looking than it needed to be by including the full interface/object code along with it. So today I'll strip off some of that unneeded code and do a comparison of just the basic syntax of C/ObjC's new block with that of C#'s anonymous method.



(block 1)
- ObjC
typedef void(^Block)(char*);

- C#
delegate void Block(string msg);

(block 2)
- ObjC
- (void) test: (Block)block {
    block("msg");
}

- C#
protected void Test(Block block) {
    block("msg");
}

(block 3)
- ObjC
int main( int argc, const char *argc[] ) {
    MyClass *mc = [[MyClass alloc] init];

    [mc test: ^(char *msg) { printf("%s"), msg } ];
}

- C#
static void main( string[] args ) {
    MyClass mc = new MyClass();

    mc.Test((string msg) => { Console.WriteLine(msg); } );
}

Blocks 1 and 2 only have minor differences between the languages.
Block 3 has the most difference between the languages due to the SmallTalk like message passing syntax of ObjC
    [obj msg] vs that of c#'s obj.msg
Like blocks 1 and 2, block 3 shows only minor differences between the block syntax in either language.

^() { }
vs
() => { }

Chrome and the Mac

I've been waiting for Chrome for quite some time now to be released on the Mac. I've been fairly curios to see how it would stack up there compared to it's sibling Safari, as they share the same WebKit core. It's been available as a dev preview since back in June but there where many things that where not complete and crashes where reported aplenty.

Many have been reporting, as of recent, about the increased stability and additional support for things such as Flash etc. I decided to give it a try today from within Snow Leopard. The download link can be found here.
(hehe I'm blogging this post from Chrome and inserting the previous link does not work from Bloggers editor).

Installing went without issues, and it loaded up no problem. I tried out a few sites and it seems to be working great thus far. I even went to ChromExperiments.com to push it a bit. I used the experiment called Voxel Spacing as that one was really slow in Safari a few months back. Chrome ran it much faster than I remember Safari being able to cope from before. I decided to try it again to see if Safari had improved at all. Coincidentally it had and both Chrome and Safari where running it at almost identical FPS, Chrome having an . Firefox couldn't be let off the hook here so it had to be tested as well. It was actually the slowest of the three.

Chrome 18 fps/average while moving
Safari 17-18 fps/average while moving
Firefox 11-12 fps/average while moving (another issue was that Firefox wouldn't allow me to hold down the arrow key, it had to be spammed to keep it moving)

Some other things I've noticed is that almost all of the AJAX for Blogger doesn't work, or has issues (the auto-save fails, and quite a few of the buttons for font, links, etc don't function correctly)
It seems to use a pretty consistent 100% cpu process at idle.
I had to copy/publish this post from another browser because Chrome didn't like the 'PUBLISH POST' button

I do like it so far though and I'm sure they'll get some of these issues resolved, it isn't even beta yet so it's working better than expected already. :)

Block/Closure Extension to C/Objective C/C++


I've been trying to force myself to get back into some Objective C/Cocoa development. I got a bit of an itch again after looking into the new OpenCL. If you don't want to read all about it it's basically a standard that Apple started and was able to get Intel, Nvidia and AMD on board and eventually submitted it to the Krhonos group for standardization. It basically allows you to write programs to take advantage of all the cores of cpus/gpus, similiar in what Nvidia was doing with Cuda. To ease development when working with OpenCL blocks/closures where also added as an addition to C.

I really wanted to play around with some of these but was hard pressed to find any good examples for both C and ObjC.

So here's a quick one in plain ol' C

void test1( void(^block)(char*) ) {


    block("Message from 'block'");


}



int main( int argc, const char *argv[] ) {


    test1(^(char *msg) { printf("Block Message: %s\n", msg); });


    return 0;

}



And in ObjC
- interface

#import <objc/Object.h>


typedef void(^Block)(char*);


@interface HelloWorld : Object {


}


- (void) displayBlockMessage: (Block)block;


@end




- implementation

#import "HelloWorld.h"


@implementation HelloWorld


- (void) displayBlockMessage: (Block)block {


block("<HelloWorld> block message");


}


@end



- main

#import "HelloWorld.h"


int main( int argc, const char *argv[] ) {


HelloWorld *helloWorld = [[HelloWorld alloc] init];


// inline block


[helloWorld displayBlockMessage: ^(char *msg) {


printf("%s\n", msg);


}];


// declared block


Block block = ^(char *msg) {


printf("-=%s=-", msg);


};


[helloWorld displayBlockMessage: block];


return 0;


}



One thing you'll notice is that the interface declares 'block (typedef void(^Block)(char *);' This is because you need a type for the 'displayBlockMessage' functions signature (unless there's some trick :) ). Another thing is that I'm inheriting from the base objc object type and not the Cocoa NSObject, it will work either way I was just playing around with also compiling it on Windows.

I'm still surprised that C is getting block/closures before Java. C++0x is also suppose to have their own implementation as well.

TextMate Snow Leopard and

During my previous post I needed to copy RTF from a text-editor for code snippets for this blog. XCode does this by default and so does Eclipse. But TextMate does not. Google told me that this should do the trick. It's a bundle for TextMate called 'Copy as RTF' by Dr Nic Williams. I found numerous people praising this little plugin so I decided to downloaded it.

If you don't install it by using GIT, as the instructions say, you can simply download it from the above site and once un-tar'd change the name of the folder (something like 'drnic-copy-as-rtf-tmbundle-e490dbf') to 'Copy as RTF.tmbundle'. Then copy this to ~/Library/Application\ Support/TextMate/Bundles. If the bundles directory is not there then simply create it and then copy.

If TextMate is already running then click 'Bundles -> Bundle Editor -> Reload Bundles' to reload the bundles. It should work from here. I had an issue where it wasn't doing anything. I was able to track down the issue by altering the output of the bundle to get the exception. I'm by no means a TextMate expert I just happened to stumble across this. I went to 'Bundles -> Bundle Editor -> Show Bundle Editor' expanded the 'Copy as RTF' and selected the node. Then on the right pane changed the 'Output' drop-down from 'Discard' to 'Show as HTML'.





I was getting a Ruby deprecation warning and an exception about a corrupt theme. I didn't have any themes installed though. I looked through the Ruby code for the plugin where that error message was and found that it was looping through my non-existent 'Themes' folder. I downloaded a random theme and installed it and after that the exception went away and I can now get RTF output for any language in TextMate.

Thursday, October 08, 2009

Syntax Highlighting in Your Blog

A few years ago I used to use Apple's Pages program to do my blogs. Pages would allow me to save a document as HTML, much the same way that Word would. So I would set off constructing my blog in Pages much like I would a normal document. I was able to copy code from Eclipse into Pages and it would preserve the formatting and colors. Now the HTML wasn't perfect and needed a tiny bit of work for a seamless transfer into Blogger. I created a small Ruby script to strip out the un-needed things and add in the other bits. In the end I was able to save my document as HTML, run my Ruby script against it and paste the resulting text straight into blogger and it would look just as it had in Pages.

Well... Apple removed that feature from Pages and I was stuck looking for other options. I was searching tonight and noticed a few people using the demo of GeSHi and editing the resulting page source etc. That was a bit more work than I was willing to do.

I remembered a while back that Google Docs would also preserve RTF when pasting. So I embarked on a test. I copied some source code from XCode and pasted it into Google Docs. Then I did a quick look at the DOM and found exactly the piece I wanted. I then added this bit in the URL(as one line)

javascript:alert(document.getElementById('wys_frame')
    .contentDocument.getElementsByTagName('body')[0].innerHTML)



And copied the result from the pop-up and pasted it into my blog. The only caveat is the editor you're copying from needs to copy your snippet as RTF

(I used this to generate the above javascript)

Friday, October 02, 2009

Snow Leopard Python 32-bit Script

With the release of Snow Leopard Apple has made good by making a big switch in the core applications to 64-bit. You can read all about it. How they shrunk the size of them, made them quicker, etc. iTunes however is still 32 :( Not that it really matters.

One that has mattered for me however is Python. Snow Leopard comes with Python 2.6 instead of 2.5 which it's predecessor included. The 2.6 that's included in SL also defaults to 64 bit. Although this is 'geeky' cool it has caused quite a few problems with other python applications/libraries. I'm sure this will change in the future but for now it's not so much fun.

A quick fix that quite a few people have done is doing either from the terminal
  defaults write com.apple.versioner.python Prefer-32-Bit -bool yes
or
  export VERSIONER_PYTHON_PREFER_32_BIT=yes

With the first it's a permanent change, unless you re-execute it with 'no' in place of 'yes'.
The second is per session.

I didn't like the idea of making it permanent, and switching it all the time so I created a quick script.

#! bin/sh

PY_ARG="$1"
export VERSIONER_PYTHON_PREFER_32_BIT=yes
python $PY_ARG

I also created the directory /usr/local/bin, as this isn't created in the default SL install but it is included in the default .bash_profile path variable so you don't have to update your path.

(I saved mine as python32.sh)
Then do a quick chmod to add the executable bits (sudo chmod 755 python32.sh or sudo chmod u+x python32.sh)

Now I can simply type in 'python32.sh' and I've got Python 2.6 in 32-bits. Or if I wanted to run a python app/script in 32-bit I could type in 'python32.sh myscript.py'

Happy scripting!!

Taskbar At The Top Is Naughty

I used to like my Windows taskbar on the side but after using Ubuntu a bit, and using a Mac for quite some time I'm now a bit biased to having it at the top. I noticed something cool today that my new Windows 7 box does for me. An application that I was using opens up a new instance of IE8 for me and sets it to full screen. After it loads I hit 'ALT' and then '[T]ools' and select 'Developer Tools'. It loads up the much improved IE Developer Tools with one small little glitch. The top of the application is underneath my taskbar.

Awright, I right click on the app in the taskbar expecting the 'move' option that's in XP. Ummm.. it's gone.. Awright lets move my taskbar back to the bottom of the screen and then move the window and then move the taskbar back to the top. I got inconsistent results with this step. Sometimes when I moved the taskbar back to the top it would be a pal and move the application back under the taskbar and sometimes it would leave it where it was after I moved it.

It would consistently open the dev tools under the task bar if IE was loaded to a full screen.

I love features! They give me something to do when I'm bored

Windows 7, .NET and IPv6

I'm still recovering from my recent Windows VM death at work and still learning the ropes with Windows 7. I stumbled across another one of those 'uggghh' moments today.

We have an application that does some impersonation if you are within our firewall and part of the same non-routable subnet blah blah... I noticed that from within my Windows 7 VM I could not hit a portion of our application. A nice little exception was occurring. From outside my VM I didn't have any issues.

After a quick look it was due to local connections to IIS defaulting to an IPv6 address, no 'localhost'. So I navigated through the windows to get to the network card settings and disabled the IPv6 protocol for the card. 'That should do it' I thought. Nope! It still used the IPv6 for loopback.

Awright Google, lead me towards the light. This post started out the same way. Disabling the IPv6 for the card, but towards the bottom there's a lovely registry, cringe, modification. Basically it's in 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters. Add a 32-bit DWORD item with the name of 'DisabledComponents' and a value of '1'. You also have to reboot :(

'Awright, now I'm good'.... WRONG! Now it was using '::1' for the loopback. Awright, lets see what's in the 'hosts' file. Go to 'C:\Windows\System32\drivers\etc' and open the 'hosts' file. And we find out that we can't simply edit it. Just like my previous .sln post you have to first load notepad, or whatever, as admin and then open the file. You'll have to re-navigate to the file since you also can't simply drag and drop the file onto your open session of notepad. Extra steps build character :)
Comment out the entry
  127.0.0.1       .host
with a '#'

Yay! now it finally works like it used to....

Monday, September 21, 2009

Snow Leopard 64 bit kernel on a MacBook5,1


I was playing around with Snow Leopard today and for no better reason than "It's neat" I decided to try and boot into the 64 bit kernel. Apple has left the default kernel, on non server editions, to default to 32 bit. Many people have complained about this stating it's slower and can't access > 4GB of memory and can't run 64 bit apps correctly etc etc. Well it's all a little bit of FUD. Apple also included the 64 bit kernel ability but defaulted it to 32 mainly to avoid 3rd party software/drivers/kexts that rely on the 32 bit kernel. Windows Vista 64 had similar issues with drivers etc. And while in 32 bit kernel mode applications can still run in 64 bit mode just fine, without any type of 64 to 32 virtualization. So right now there really is no reason, for most, to run in 64 kernel mode other than "It's neat".

If you'd like to try, and have a 64 bit cpu with 64 bit EFI (Core 2 duo / Xeon), simply reboot/turn-on and hold down the '6' and '4' keys. If it works your computer will boot a little bit slower as it makes the switch (if you set it to always boot in 64 bit mode you wont see this delay). You can check wether it worked or not by either checking the kernel process in the Activity Monitor or type
  uname -a
in the terminal. The result will end in 'x86_64' if it worked. Or you can also click the 'Apple' and go to 'About This Mac' and click the 'More Info...' button. From there click the 'Software' group towards the bottom. The line that says '64-bit Kernel and Extensions' should say 'Yes'.







If it didn't work then you may be lucky like me and have a MacBook or Air etc. Apple has black-listed these and deemed it an option only available for the elite Pros (MacBook Pros, MacPros...and XServes). But you can still try it thanks to this guy, Amit Singh. It's been a while since I've had to use a hex-editor for something like this but it was fun :)

0xED, and Hex Fiend are both good...

Basically I followed his post pretty close. Simply made a copy of /usr/standalone/i386/boot.efi (I called it boot64.egi) as   /System/Library/CoreServices/boot64.efi
Then opened it with a hex editor and adjusted the 'black-flag' bit value for my corresponding machine.
(I didn't have to chown the file or chflags as my copy was already set)
Then blessed it with
  sudo bless --folder /System/Library/CoreServices --file /System/Library/CoreServices/boot64.efi
This sets the newly modified .efi to be used during boot.

After that you can now use the '6' + '4' and the '3' + '2' options while booting/restarting.

I also set mine to always load using the 64 bit kernel, again for no better reason than "it's neat-o". This can be done by editing the file
  /Library/Preferences/SystemConfiguration/com.apple.Boot.plist
And change this
  <key>Kernel Flags</key>
  <string></string>

to this
  <key>Kernel Flags</key>
  <string>arch=x86_64</string>


Now Snow Leopard will boot by default with the 64 bit kernel, you can still hold down the '3' + '2' to boot using the 32 bit kernel.


Problems:
I'm running on a pretty fresh install of Snow Leopard and haven't done a whole lot of testing yet. But so far most things run great. 32 bit applications still function fine in their 32 bit modes as well. The only application that hasn't worked so far is VMWare Fusion, but this may change with the next version or so. VirtualBox does indeed work with the 64 bit kernel though so I will be trying that out with Windows 7 in the next few days.

Friday, September 18, 2009

Windows 7 and Visual Studio SLN files.... uggh

My 2003 server VM went out the other day at work so I figured I try out the new Windows 7 that I've been hearing so much goodness about.

I downloaded the ISO and began the install (installing within Fusion). I left to go get a drink thinking it would take no less than an hour. I came back to my desk and was very nicely surprised to see that the install had finished. I think this was the fastest Windows install I've ever done.

Another nice thing I've noticed so far is how much easier it is on my system. Before 2003 was always using some of my cpu doing whatever it is that it does. 7 on the other hand lets my system idle at around 3.5% (running in Fusion). It also seems snappier as well. So far I was really quite impressed, well first impressions anyway.

Then some ugliness started shining through. The "Yes I really really really do want to run this application" UAC stuff isn't as bad as it is in Vista, but it's still pretty annoying at best. I began loading my work projects over and tried to double click a web solution. Well, it threw up about 4 dialogs that I had to click whatever on to make them go away. These where all UAC related dialogs. I then set VS to always run as administrator, so much for the UAC protection eh. Then all seemed to be good in the world, until I tried to double click the solution again. I watched as the little loading spinner briefly popped up and then went away. Then I waited... and waited... Nothing, no error message, no UAC.... NOTHING. So I took the option to always run as admin off and I was back to where I started.

I found this 'feature' according to MS
That is quite frankly, stupid.
I guess you can set .sln files to always load with VS2008, or whatever, and that fixes it. But it's just kinda ugly. The sad thing is that the bug was reported back in 2007 so I don't think it will be resolved any time soon.

I guess I'll hope that I love everything else about it and that nothing else is wrong..

Tuesday, September 08, 2009

I guess after six years I can't complain

I was a little late paying my internet bill this month to Comcast, as they kinda screwed it up the month before.... It went out today and I thought it may have been just because the bill was late.

For the last six years I've had two cable modems on a single account. Comcast hadn't ever quite figured it out. It's been nice having Vonage on one modem with a wireless router and everything else on the other modem.

Well when I finally called in today to see if it had just been disabled because of my bill the support person informed me that they had removed a 'rogue' modem that had been on my account.

It's been there for six years so I can't complain I guess. But I sure will miss the thing

Monday, September 07, 2009

IE8 document.compatMode

With all the proliferate hacks out there for IE browsers, IE8 stacks some more on top.

During our last release cycle our QA department started sending back issues revolving around the new IE8 browser. Many of these where related to javascript. One simple fix to get this out the door was to just force IE8 into compatibility mode until we had more time to deduce all the little issues. Unfortunately this fixed some issues while creating others, ugh.

Basically it boiled down to this. Our ASP application says that the browser is IE8, and in javascript it will also say that it is version eight, while in normal mode. The issue, when in compatibility mode, is that it still registers in ASP as IE version eight, but in javascript it now says it is version seven, or whatever compatibility mode is used. So additional IE specific code was added on top of already IE specific code to now check document.documentMode as well.

I do like working with IE8 much more than it's predecessors, but it is still not quite up to par which just adds more development time to now make things work in all the different, very different, flavors of IE.

Here's a good summary of things IE8 finally got right and others that are still not.

And VML also took a hit with the new browser.

Another issue with VML that I noticed the other day was that IE8 now supports element.hasAttribute/getAttribute. But I guess the support is not that great, at-least for VML.
I had a simple script that works with both SVG, the standard, and VML, the non-standard.
There was a method that did something like

if(elem.hasAttribute) { do standard SVG stuff here }
else { do non-standard VML here }

With IE8 the first condition will now be hit, which is good but also bad since IE doesn't support SVG. So yet more IE code was added to resolve this issue. I figured I'd take advantage of the newly getAttribute functionality in IE8 to get the 'fillColor' attribute of a VML element.

Well, this didn't quite exactly work. The attribute was never found. IE8 seems to only report a single attribute for every VML element regardless of how many are actually in the XML. So I could get the first attribute using the new 'getAttribute' in IE8, but unfortunately 'fillColor' was not the first attribute within my VML, so it was back to changing the code yet again for IE to ignore the newly added 'getAttribute' and go back to elem['attrib'] instead, since this would actually give me ALL of the attributes per element.

I guess this is what we have to look forward to until ver. 9 :)

The Way It Should Be

Upgrading/Moving from one computer to another is always painful and usually the only thing that makes it worthwhile is if you're moving to a newer, much nicer, machine. I recently got a MacBook 13.3" (3 weeks before the pro was released, sad) and have been living partially on that. My tower, Mac Pro, has been feeling somewhat neglected. My wife has been doing more video editing lately and needed something a bit faster. I decided to give her my tower, gulp, since I haven't been using it much anyhow.

I was already partially up on my laptop so it was just a matter of copying over any remaining items. After this was done I did a fresh install on the tower. I've seen the 'MIgration Assistant' application before but had never really given it much thought. I had made the basic assumption that it wouldn't do exactly what I wanted and there would be a bunch of manual intervention as well. I had installed the new Snow Leopard on the tower while her old laptop was running the previous Leopard. I decided to give the Migration Assistant a try, expecting a lot of additional work afterwards. I hooked up the computers via Firewire and started the Migration....

The assistant started up and located the old mac right away. Then it searched through it and gave me a check box list of items I could move/leave. I left everything default and let it run. My wife has our whole family album all digitized in iPhoto, about 130 Gigs not including videos, so you can imagine that it did take some time.

Once this was all finished I was very surprised by the results. It actually migrated over her user from the old computer. It kept her login items, login image etc. It even set her wallpaper to what it was before with all the same settings. Screen saver was the same, along with settings. "That's pretty neat" I thought as I opened up iTunes. Wow, iTunes kept everything just as it was on the old machine, ratings etc. Next I opened up her email. All her emails where setup and it even moved over her existing inbox emails! Her calendar kept all her events and so did Address Book. Then I looked down in her application bar. It was setup just as it was on her previous computer. It even moved over applications that hadn't been installed yet!

When everything was said and done the only thing she noticed after the move was that her computer was faster. There was nothing else that she noticed different from the day before.

Thursday, April 23, 2009

IE still sucks...

I was given a small internal web project to work on last week. The best part about it was that I was given free reign on it's design and technologies used. I was pretty excited since I could finally use all of the new HTML/CSS/ECMAScript standards (existing and proposed). This was mainly nice since I didn't have to do stupid hacks and things for all of the different flavors of IE.

I didn't 'have' to support IE for this project but decided that I'd finish the project and then see how the new IE8 faired.

Well... I was, not surprisingly, let down again by IE. Here are a few things I noticed right off the bat.

1) No canvas support :( STILL!!! Firefox, Safari, Chrome and Opera support this. I guess MS is not being pro-active about supporting new standards as the canvas tag is part of the HTML5 spec. There is however this project ExplorerCanvas which does some nice javascript conversions to VML for IE so that you can use most of the features of the canvas tag.

2) Proposed ECMAScript Harmony features have been left out. This is funny since MS was one of the big proponents of limiting the proposed features of ES4 and yet they still can't get the limited functionality implemented (of which Firefox and Safari already support). For instance the new getters/setters and 'foreach' function of arrays makes IE8 confused (these are just a couple I noticed).

I wasn't too surprised by this lack of new features. But I was surprised to see some CSS3 selectors working, and that the site rendered very close to how Firefox and Safari/Chrome did (but not exactly, as there where still some things that where off). So I guess I'm happy that IE has made a huge jump since IE7, but it's still not there which sucks since IE6 is still one of the most dominant browsers used so I guess we can all look forward to missing things in IE8 for the foreseeable future. Ugghh..

Wednesday, May 14, 2008

missing ( before formal parameters


I ran across this little error the other day when I ran some javascript that was working fine in IE but Firefox just didn't like.
It was pretty easy, but vague, to track down what Firefox was complaining about and it was just another difference between JScript and Javascript ugh.
Here's a little example of what was causing this issue.

<script type="text/javascript">
// just create some dummy variables for namespaces
var some = {};
some.namespace = {};

(function($) {
function $.testFunc() { /*some code here*/ }
})(some.namespace);
</script>

The problem is when creating the testFunc function. JScript allows the '.' in the declaration and Javascript does not. Here is a quick and simple fix for this that will work in both IE and Firefox (and Safari).

<script type="text/javascript">
// just create some dummy variables for namespaces
var some = {};
some.namespace = {};

(function($) {
$.testFunc = function() { /*some code here*/ }
})(some.namespace);
</script>

Thursday, February 28, 2008

Some Fun Generating 'the power of' With F#

So for my first bit of fun with F# I figured it'd be fun to play with the BigNum (used for crazy big numbers) I figured I write up some quick functions that simple generate the power of some number, resulting in some crazy big numbers :)

(*all of my examples include '#light')

My first function doesn't use the BigNum but it's very simplistic.

let rec pwrof x y =
     if y = 1 then
         x
     else
         x * pwrof x (y - 1)

So for everyone new to F# 'pwrof' is a recursive function that takes 2 ints. 'rec' lets the compiler know that the function is recursive and the 2 parameters get resolved down to being ints at compile time. This came pretty naturally for me coming from a C# world, so lets try to mix it up a bit.

let rec pwrof x y =
     match y with
     | 1 -> x
     | _ -> x * pwrof x (y - 1)

This function does the exact same thing, but instead of using a familiar if/else statement we're using pattern matching (these are widely used in F#). It's like a switch statement. If y matches 1 then we return x, otherwise if y matches anything else, '_', then we recurse.

These were kinda fun, but I wanted to calculate crazy big power of calculations like 5000^5000. So here's an example that resembles my first function

let bpwrof x y =
    let x = Microsoft.FSharp.Math.BigNum.of_int x
    let pwr = x
    let rec pwrof x y =
        if y = 1 then
            x
        else
            pwrof (x * pwr) (y - 1)
    pwrof x y

And here's an example that resembles my second function

let bpwrof x y =
    let x = Microsoft.FSharp.Math.BigNum.of_int x
    let pwr = x
    let rec pwrof x y =
        match y with
        | 1 -> x
        | _ -> pwrof (x * pwr) (y - 1)
    pwrof x y

These are tail recursive so you can create some really, REALLY big numbers. If you call one of the last 2 functions you can calculate say 5000 to the 9000th power. It ends up taking a lot more time to print the result to the screen than it does to do the calculation(its pages and pages of number madness). I even tried 5000 to the 90,000th pwr, that's a big number.

 

Oh well, that's all for now...

Sunday, February 17, 2008

F# again

I had blogged about F# a while back and though I had tinkered around with it a bit, I got a little busy, and a little lazy. I've decided I'm gonna stick with it this time and learn it :) which means more upcoming blogs about F# (I haven't blogged in a while either so this will get me motivated)

I'm not one that enjoys scouring the web for information on things so I usually just go buy a book on whatever it is that I'm interested in. I decided the other day to head down to the local Borders and there was one copy left of Robert Pickering's F# book, titled 'Foundations of F#'. I'm currently only a few chapters in but it seems like a pretty good book thus far. It hasn't required a background in functional programming which is good and also seems to be a good read for the novice to expert programmers.

Well that's all for now, maybe next time I'll have some F# knowledge to share :)

Monday, November 19, 2007

14% done VS-2008

Eber told me today that the VS2008 was on MSDN.. I was pretty excited so we both logged into MSDN (which was amazingly slow today :)..
But we couldn't find it listed in the DevTools section..

We ended up finding it on the main page of MSDN(before you log in).

It's under the 'Top Downloads' section..

Sunday, October 28, 2007

Leopard

Leopard came out the other day and I started to loose anticipation for the release when it seemed more and more features were being dropped, or were just not being added as features. I was expecting that with the new Boot Camp there would better NTFS support, but the sales pitch from Apple on this is “Leopard understands the Windows FAT32 disk format”. I guess I could use NTFS-3G’s driver for this, but I guess I’ve been spoiled for too long and wanted it built right in :).

A feature that was actually on Apple’s web-site but then mysteriously disappeared was “Fast Switching” for Boot Camp. This would basically put one OS into hibernation and load up the other OS (Awesome if you don’t want to close all your programs down before switching).

BUT! There are a lot of things that I really like about the new OS. Probably one of my favorite things is the path bar in Finder (bread crumb like trail of where you are in the file system). This is one thing that always drove me nuts, when you had a file up and you had to do info or something on it to know where it was in the FS.

Spaces is probably one of my other favorite things. If you have a laptop and need a lot of stuff on the screen it’s nice to be able to place things in different spaces. I wasn’t too excited about this until after I loaded up Parallels and I could go full screen on one space and easily go back to a screen with all my Mac stuff. Parallels has Coherence but with all the Windows stuff I sometimes have loaded it’s easy for my screen to get cluttered.

I’ve never used iChat, simply because most of my contacts are using MSN. Well iChat still doesn’t support MSN BUT it does support Jabber now (as well as Google Talk, since it’s a Jabber too). So all I had to do was find a Jabber server that had MSN/AOL/Yahoo etc transports. The only bad thing was that I had to use Psi to create an account on the Jabber server I found to create my Jabber account. Once my Jabber account was created I could point iChat to it and I can now talk to all my MSN/Yahoo..... contacts. The other downside is that if you have Google Talk and a Jabber account (or more than one account of anything iChat supports) then each account gets loaded in it’s own window, instead of consolidating all your contacts into just one window. I’m still up in the air about iChat, I may still go back to using Adium since it pretty much supports anything you’d ever use, and they have announced that they are going to support video chats in the near future.

So far for the most part I like Time Machine. I don’t like the dock if it’s on the bottom (don’t like the reflective thing the icons sit on) good thing I always place it on the left (no reflectiveness if the dock is on the sides of the screen) I guess you can turn it off, I found a quick little shell command to do it but didn’t bookmark the site where I found it :). I don’t care for the little cross-walk in the dock (used for changing the dock size). Oh I forgot, I love the new Quick View feature too, much quicker to quickly grab something from a dock instead of loading up whatever to view it. Other than that I’m happy with it, they didn’t make major changes to where everything is so I didn’t feel lost like I did with Vista.

Whoa whoa! just as I finished writing this I think I just found my biggest complaint! I use Pages to do my blogging, I export it as HTML and use a Ruby script to make it Blogspot happy and get rid of the extra CSS it generates. Well just as I finished I went to export it as HTML and well.... that feature is GONE! (Right after I installed Leopard there was a Pages update so I figure that removed it). I’m not quite sure why they removed that :(.

Saturday, September 01, 2007

I love c#.. but lately.. whoa!

So lately I’ve been wanting to get into some programming on my Mac (yes I own a mac and develop .NET at work). Well I don’t really have a lot of time to devote to some new language like Objective-C. Yes I could use Java.... but I’ve really started to like c# a lot better than Java lately (maybe because it’s just what I’m used to, and I want to avoid people bashing me for taking sides :) ).
 
Anyways I’ve kept tabs on the Mono project every now and again and recently decided I’d give it a go. So I downloaded the latest (right now it’s 1.2.5) and started to tinker. I did the cheesy ‘Hello World’ console stuff just to start out. Well I’d really like to develop ‘real’ things, ‘useful’ things, but I was a little concerned about the GUI aspect (WinForms). I’d read a few places saying you need to install GTK and blah blah to get it working and that kinda turned me off of the whole thing.
 
Well I think I had been reading some slightly out-dated material. I wrote a little program to just pop-up a MessageBox and what do you know.. it worked!... and it worked on my Mac! (well you do have to run X11 first, but hey it’s a small price to pay)..
 
Then I wanted to see what new stuff was added to Mono. So I implemented a quick Lambda just for fun. Well it didn’t work right off the bat but after a couple Google searches I found the answer.
 
To use Lambdas, and some of the other c# 3.0 features, you need to use the ‘gmcs’ not the ‘mcs’ mono compiler command. (I remember reading that gmcs was newer and they plan on getting rid of mcs I think with v 2.0... don’t quote me though that’s from my wonderfully not so good memory). AND you need to provide this argument to compiler ‘-langversion:linq’. And that’s it!
 
So here’s my little program I did..
 
using System;
using System.Windows.Forms;
 
namespace Test {
   delegate string GetMessageDelegate(string name);
      public class Test {
         public static void Main(string[] args) {
            Console.WriteLine(“Hello from the console”);
            GetMessageDelegate getMsg = name => string.Format(“Hello {0}”, name);
            MessageBox.Show(getMsg(“Frank”));
      }
   }
}
 
And here’s what I did to compile and run.
 
gmcs -langversion:linq -r:System.Windows.Forms Test.cs
 
 
So basically you’ll get the message on the console and a message box that displays “Hello Frank”;
 
So I’m pretty sure I’m gonna stick with Mono/c# as my choice for development on my Mac :)