Raba - Defend your code RSS 2.0
# Monday, December 31, 2012

Back to writing,
Following my last year experience interviewing over hundreds of candidates I was looking for the ingredients for making you better than your colleagues.
I know that the internet is full of such tutorials, especially one minute before the new year’s eve, but I will try to add my own twist, give you some tips and share my own goals for each bullet.
The goals were designed to the LCD (lowest common denominator) – feel free to increase the goals as you go.

Rule #1 – Read blogs
I found out that the world is trying to tell you something which most of the time is that it has a lot of new things that you need to try and learn
So I have a huge list of blogs that I am reading on a daily basis (
http://www.google.com/reader) trying to maintain a long list and zero based unread posts on a weekly basis. Well I’ve crafted some tricks to overcome the huge amount of posts and the tradeoff between subscribing to everything and having the amount of posts that a human-working-being can read, but this is for a different post.

Goal: 30 minutes a day is a good place to start with and 2 hours during the weekend, so all in all 4.5 – 5 hours a week is the time for yourself to learn from others
Tip: 2 tools that will make your reading experience better during this the day -
http://www.hanselman.com/blog/TwoMustHaveToolsForAMoreReadableWeb.aspx

Rule #2 – View technical sessions\videos
I must admit, I am not a big fan of podcasts, don’t know why, maybe because of all the sponsors and chit chats (and the geeky jokes) during those sessions, but I really like watching live sessions\video.

Goal: 1 video per week.
Tip: Keep in mind that sometimes you will need to start 2-3 videos and turn them off. try to find at least one that you can watch till the end. I like to summarize it as well and save a reference

Rule #3 – after school curriculum
The logic here is actually the same reason that your parents sent you to learn physics, chess, judo, or whatever outdoor activity right after school - Here you are responsible for yourself. We have many options but as I see it you should at least choose 1 to push at every single minute.

  • Participate in open source – choose an open source project you feel connected to or you think you want to learn from. Being an active part in Open Source Community can help you learn a lot from others – e.g: how they work, standards, tools, collaboration and code-reviews by people that you will probably never work with.
  • Deep Dive into the details in writing your own solution for existing framework – trying to write on your own a replacement for nihberante (or at least part of it) or write your own linq-implementation or implement your own map-reduce instead of just using it can help you a lot ot understand the underlying implementation.
  • Learn a new framework\language – you can start with huge projects like: starting to use linux, perl, F# or smaller projects like use hadoop or lucene.

Each one of the three has its own benefits and you should try to play with all of them, but all of them are about practicing your coding-skills. Most of the people that read a lot, don't find enough time to practice their coding skills, which IMO, might be a mistake.

 

Goal: have at least two projects for the next year

Tip: as a developer we tend to jump from idea to idea, project to project, committing one file in nhibernate, then learning mvc, reading about lucene, installing mongo, but not playing with them for more than few hours\days,

try to set yourself a goal for 3-6 months to play with it, I guess that all your time is during the weekend and nights, so you will need enough time to learn and play with it to learn whether it is good or not.

Bonus: If you are working in a company with more than 5-10 developers I suggest you track others commits on a daily basis. It isn't going to be easy, but tracking commits and sending your notes (online) to others might help you improve your skills a lot (reading more code than you ever thought you can and letting others know what you think and sometimes argue about it)

 

Rule #4: Teach others:
Try to explain what you learn to others. The major problem in learning for yourself or reading alone is that you might not be able to get real world feedback about what you’ve learned,
Same idea as
rubber ducking or pair-programming – sharing with more will force you to improve the knowledge that you already have. Presenting to others will make you ask more questions and dig a bit more.
Setting a day for a presentation will also help you to make your goals public so others will anticipate it, and that won’t let you run away in the middle of something.

Goal: Set Two lectures for the next year
Tip: combine the two rules #3 + #4 to lecture on the subjects that you choose to deep dive. So if you decided to learn a bit more about F# - set yourself a meeting till the end of the period, this is some kind of a milestone for your knowledge.
Bonus: Write a blog, or share your weekly\monthly learning with a group of people – again for the same purpose. It will give you smaller milestones on your way to becoming an expert

Rule #5: read books
Don’t take shortcuts, IMO, reading only blogs might take you into the final point\decisions of someone else’s journey. While it can be good, I prefer reading the raw data.

Goal: 4 books a year
Tip:
Clean Code, Pragmatic Programmer, Applying Domain Driven Design, Framework Design Guidelines in .net 
You can Track my reading list
here and here.

Would love to hear from you – what do you think about those Goals\Tips?

Monday, December 31, 2012 2:23:00 AM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
Leadership | Software Development | Agile | Lean

# Wednesday, February 16, 2011

Nir just finished coding his new module, simple read-only entrance page that renders grid of products with its name underneath, each name links to the relevant product page.
This feature was deployed a week later. After deploying to production we find out a new bug that wasn’t discover during QA phase.
Our team has 5 developers which each of them committed at least one feature for this release. After cursing and blaming I scanned the latest release notes to find the possible features we just deployed I’ve found out that the bug should be part of Nir’s implementation. of course that Nir already started his next feature and need to have an expensive context-switch to resolve this issue. Additional overhead which can’t be avoided in order to understand whether we need to deploy the hotfix right away or we can wait for the next version, not talking about synching between other bug-fixes.

Sounds familiar? Do you release versions too? Try thinking of releasing features.
Think about it, release the feature when it is DONE. don’t wait for others.

 

                         
   Releasing all features in one planned ahead release, check feature #5 – that will need to be queued till the next release\train

 

     Releasing a feature when it is done. feature #5 will be released when it is ready – no need to wait for the next train

 

So, Putting the technical details aside and the context switch we already explained, try to think about your product managers – they’re going to love you.


                 Read more about ideas-code-data 

In Delver we started our journey to continuously deploy to production. Read more here.

Meet Nir Altmark, a good friend of mine and a teammate at Delver he is a gifted developer who knows how to get things Done.
Nir just published two new posts about releasing faster and Building confidence between QA and Dev – well written. Read them to have a better understanding about this process.

Wednesday, February 16, 2011 6:33:27 AM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
continuous deployment | Software Development | Lean

# Saturday, January 22, 2011

Lately my “find usages” (shift+F12) stopped working.

I tried to restore ReSharper again and again but it fails (ReSharper –> find usages –> General –> restore ReSharper)

I’ve found out that some other shortcuts still working (for example: find usages advanced, CTRL+SHIFT+ALT+F12)

 

Then I checked the visual studio binding (Tools->Options->Keyboard) and find out that ReSharper.Find binding is missing.
I thought about fixing this manually – but god knows what also is not working.

 

And then I found out the magical button called RESET -> clicking on this and running the restore ReSharper again solve this issue!

 

Cheers…

Saturday, January 22, 2011 10:41:55 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
.Net 3.5 | Microsoft Products | Software Development

# Saturday, July 24, 2010

After we understand what video stream is all about and we wrote our first piece of SWFObject in Javascript. let’s try to have this working on our servers, of course that such things tend to fail. But let’s understand why…

First thing we need to understand is whether such failures occur due to my code, file format or server configuration.
let’s have a simple check trying to access the file directly using our browser.

IIS7:

configure your IIS to serve the following files: swf and mp4 using Static Content

<add name="FlashFiles" path="*.swf" verb="*" modules="StaticFileModule" scriptProcessor="" resourceType="File" requireAccess="Script" />
<add name="VideoFiles" path="*.mp4" verb="*" modules="StaticFileModule" scriptProcessor="" resourceType="File" requireAccess="Script" />


Setting handler(s) won’t be good enough, requesting the server again will return “404.3 – mime type missing”.
Don’t worry Adding new  mime type to IIS 7 - is easy:

<configuration>
    <system.webServer>
        <staticContent>
            <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
        </staticContent>
    </system.webServer>
</configuration> 

Apache:

While installing the static content on our static servers (apache) – we’ve found out that requesting the files from firefox return with “no content length” and “incorrect mime type”
adding the correct mime type to the /etc/mime.type

video/mp4     mp4

Check the Request\Response we’ve found out that our servers are still returning compressed response , googling it find out that Firefox cann’t handle gzipped video stream,
compression was selectively disabled by adding the following line to /etc/httpd/conf.d/static.d/static.conf:

SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|mp4)$ no-gzip dont-vary

Apache solution provided by Tomer G.

Saturday, July 24, 2010 11:01:30 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
IIS7 | Software Development | Web

So our mission is to have our website play a short intro movie.

 

Wiki Definition

Progressive download is a term used to describe the transfer of digital media files from a server to a client, typically using the HTTP protocol when initiated from a computer. The consumer may begin playback of the media before the download is complete. The key difference between streaming media and progressive download is in how the digital media data is received and stored by the end user device that is accessing the digital media.”

 

Actually the “progressive download” feature implemented in most media players allows them to begin playing the file as soon as enough data received.

 

File formats: SWF VS. FLV

  • Both are Adobe formats.
  • FLV is a video container, intended to contain only audio\video
  • SWF can contain animations, games, applications and videos
  • SWF uses a lossless compression and is limited to a certain number of frames. Due to it is not compressed some files can be too big for use in the internet.
  • Large websites like Google, Amazon are using the FLV file formats

After this short explanation, we are ready to start:

  1. Create a video file in a common streaming media format (in our case: Camtasia -> SWF, mp4)
  2. Upload the files to your Web Server
  3. Check whether this link is working from common browsers
  4. Link from you Web Pages (HTML tags or JS)

In the next posts we will talk about steps 3 and 4.

For now you can keep reading about step 1 - here

Saturday, July 24, 2010 10:25:34 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Software Development | Web

# Tuesday, July 28, 2009

Yoav sent me this web site.

I like the idea of sharing knowledge,
I also like to read and learn from open sources.
This is even better: daily -public- code review...


Tuesday, July 28, 2009 7:05:03 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Life | My Site | Software Development

# Sunday, June 07, 2009

Background:

We are writing a new task for the ArcGis Explorer, this task needs to place images on the globe using its X,Y coordinates.
While for each instance on the globe we need to render its details as html.

Mission:

Rendering the objects to html, we are still didn't find the right place (on the server or on the client), but let assume that they both need to do the same job.

Ideas:

  1. Render in code:
    This is the naive way of thinking. while you are first thinking about this  problem you might think to add the object an ToHtml() method.
    Always think about the: Single Responsibility Principle (SRP).
    You can still think about Writing an HtmlWriter or HtmlRenderer class that gets object and render the object using reflection or something else, but than you will find yourself indenting you JavaScript\html\CSS in C#, for example you can watch this code:

       1: var items = new List<string> {"Shani", "Doron", "Nati", "Yossi"};
       2: var sb = new StringBuilder();
       3: items.ForEach(currentItem => 
       4:         sb.AppendFormat("<li>{0}</li>", currentItem)
       5:         );
       6: string data = sb.ToString();
    Let's think about the time we will need to change the UI from <li> to one with style or maybe even change the list to be styled as table...
     
  2. XSL - is pretty more dynamic than code, isn't it?
    So we are now looking for something more dynamic, something that we can read from a file so we can give it to our designer to play with the UI.
    This lead us to the second option: at my past all our reports were rendered using XSL files, personally I don't like this option.
    But the main reason is that we will need to serialize our objects to XML, while in most cases all you need is to render only few fields.
  3. Let's found another Template Engine:
    The first one I can think of is the MVC Engine or Brail. after some searching reading and Testing I found StringTemplate.
    Here is a simple code for using the API:

       1: var templateFolder = new StringTemplateGroup("SimpleLoopTemplate", @"\TemplateEngineTestCase\WinApp");
       2: var template = templateFolder.GetInstanceOf("3_simpleLoop");
       3: //here we are binding our list to the template
       4: template.SetAttribute("items", new List<string> {"Shani", "Doron", "Nati", "Yossi"});
       5: var data = template.ToString();

    and here is the template (file name: 3_simpleLoop.st):
       1: $items: {num1| 
       2:   <li>$num1$</li>
       3:   }$
       4: $end$
     

Conclusion:

The StringTemplate give us an API to solve our problem - and using such code and template we can render our Models to different Views.
But is this API is easy or even stable?

In later posts we will see more samples using the StringTemplate.
Hopefully samples for using Brail too.
Sunday, June 07, 2009 3:48:07 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
.Net 3.5 | Software Development | Design Patterns

# Saturday, April 11, 2009

I've been looking around for samples and some good advices for writing resumes and found this site: VisualCV

Mostly, I like this Engineer profile: http://www.visualcv.com/alex1
The really good part is the "code sample" section on the top-right corner...

Have fun...

Saturday, April 11, 2009 5:56:02 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Life | Software Development

# Sunday, December 21, 2008

While coding and refactoring my current project we found ourselves mocking such type of code:

   1: public class MapPrints
   2: {
   3:     protected string ImagesToReadPath = @"C:\ShaniData\Projects2008\TddSamples\data\";
   4:     protected string ImagesToWritePath = @"C:\ShaniData\Projects2008\TddSamples\output\";
   5:     protected Font DefaultFont = new Font("Arial", 100.0f);
   6:  
   7:     public void Print()
   8:     {
   9:         Bitmap bitmapImage = new Bitmap(3000,3000, PixelFormat.Format32bppArgb);
  10:  
  11:         using (Graphics g = Graphics.FromImage(bitmapImage))
  12:         {
  13:             g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height));
  14:             g.DrawString("Gello Graphics World", DefaultFont,  Brushes.White, 100, 100);
  15:             SaveToFile(bitmapImage);            
  16:         }
  17:     }
  18:  
  19:     private void SaveToFile(Bitmap bitmapImage)
  20:     {
  21:         string outputImage = Path.Combine(ImagesToWritePath, "RhinoDiagram.png");
  22:         //Bitmap b = new Bitmap(3000,3000, g);
  23:         bitmapImage.Save(outputImage);
  24:     }
  25: }

The MapPrints class is a sample I just wrote at home to demonstrate the one of the usages for Graphics class in the Print method in our applications.
In this sample we save the image to an output file, but there are places that we just render this to the screen or printer etc.

I might add at this point that I prefer Asserting than mocking as a general idea.
I think that mocking such code is useless. Moreover, we are using a geographic-API which produce use and produce images everywhere, so I decided to extend the images testing capabilities.

I thought how would I like to test this and spike a little bit last weekend and got this bunch of tests:

   1: [TestMethod]
   2: public void CompareImagesSize()
   3: {
   4:     Image expected = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\ExpectedImage.png");
   5:     Image actual = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\RhinoDiagram.png");
   6:  
   7:     Bitmap expectedBitmap = new Bitmap(expected);
   8:     Bitmap actualBitmap = new Bitmap(actual);
   9:  
  10:     ImageAssert.HasTheSameSize(expectedBitmap, actualBitmap);
  11: }
  12:  
  13: [TestMethod]
  14: public void CompareTwoSameImagesButWithDifferenExtension()
  15: {
  16:     Image expected = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\Image2.png");
  17:     Image actual = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\Image1.jpg");
  18:  
  19:     Bitmap expectedBitmap = new Bitmap(expected);
  20:     Bitmap actualBitmap = new Bitmap(actual);
  21:  
  22:     ImageAssert.AreEqual(expectedBitmap, actualBitmap);
  23: }

Lines 10, 22: are using the new API: ImageAssert with its new methods: HasTheSameSize and AreEqual.
In such way I can take any two images (from some print code I just wrote in my application) and test it against the expected one.
You can also think about methods returning Images or bitmaps. For me it is just what I've needed

After finish spiking I start implementing my dreams, and it is also pretty simple:

   1: public class ImageAssert
   2: {
   3:     //public static void MoreMethods(Bitmap expected, Bitmap actual)
   4:     //{
   5:     //    //Compare image extensions
   6:     //    //Compare Thumbnail...
   7:     //}
   8:  
   9:     public static void HasTheSameSize(Bitmap expected, Bitmap actual)
  10:     {
  11:         if ((expected.Height != actual.Height)
  12:             || (expected.Width != actual.Width))
  13:             HandleFail("ImageAssert.HasTheSameSize", String.Empty);
  14:     }
  15:  
  16:     public static void AreEqual(Bitmap expected, Bitmap actual)
  17:     {
  18:         for (int i = 0; i < expected.Width; i++)
  19:         {
  20:             for (int j = 0; j < expected.Height; j++)
  21:             {
  22:                 Color expectedBit = expected.GetPixel(i, j);
  23:                 Color actualBit = actual.GetPixel(i, j);
  24:                 if (!expectedBit.Equals(actualBit))
  25:                 {
  26:                     HandleFail("ImageAssert.AreEqual", String.Empty, i, j);
  27:                     return;
  28:                 }
  29:             }
  30:         }
  31:     }
  32:  
  33:     internal static void HandleFail(string assertionName, string message, params object[] parameters)
  34:     {
  35:         throw new AssertFailedException(String.Format(assertionName));
  36:     }
  37: }

Lines 9-14: HasTheSameSize method: is only comparing between two images and checking that they are the same size
Lines 16-31: AreEqual method: is running over all pixels of both bitmaps and comparing between them.
Lines 33-37: HandleFail method: we must understand the pattern of Assert - while valid asserts do nothing, on the other side, failures should throw new AssertFailedException()
such exception will be published to the relevant framework. as a red bar.

What next?

  • I would be glad to get some feedback about the new ImageAssert class
  • Let me know what ways do you think we can extend this class
  • Any other thoughts will be appreciated too...
Sunday, December 21, 2008 10:57:27 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
C#3.0 | Software Development | TDD

# Friday, December 19, 2008

For the last 3 months we suffer from many problems on our ArcGis-Servers.
The main problem is our architecture which planned on 4-cores (dual) + 12 GB RAM, but the main problem is that our server holds Win2003-32bit, which can handle only 4GB RAM.

This lack of 8GB causes us many page-faults. our SOC.exe causes our server to hold the server on 4 GB RAM permanently. (which means 100%)

 

Of course That we first need to extend our architecture to have more Spatial-Servers to deal the pressure but it will take time till buying and installing new servers, in the meanwhile we are trying to figure out creative ways to decrease the RAM Usages.


Yesterday Mody (from Systematics, ESRI's representative in Israel) sent me this link:

http://webhelp.esri.com/arcgisserver/9.3/dotNet/index.htm#tuning_services.htm (read the recycle section)

The article is talking about the 9.3 version (while we are using the 9.2 sp1) but it still help me understand something about how the people at Redland think.

 

Quote from the Recycle section: "Recycling destroys and re-creates all running instances of a service, whether or not those instances are above the minimum specified. To periodically return the number of running instances to the minimum specified, the service must be stopped and restarted."

It says that the recycle:

1) Will re-create all instances - which means that the "in use" number will be set to 0 - on every recycle.

2) It won't Change the number of "available instances" to the minimum (for example if we set minimum=4 and maximum=8, and before recycle the available=5, after recycle it will still be on 5)

 

Pros

  • ESRI's idea says that If your machine sometime had 5 users instead of the 4 you planned - so the machine needed to create the new instance. Such scenario can happen again, so They won't kill the instance at your recycle. and the next time you will need the 5th instance all the machine will have to do - is take it (without paying the creation time)

Cons

  • Machines that holds many types of Server-Objects and each of them will grow up above its minimum, it will cause the machine to work very slow, cause each instance take more memory, While the idea that the 5th user will return it more obvious that not all server-objects instances will be back to their high level usages.
    More instance -> Needed more CPU, even if they are not in use -> machine will work slower even with no less users.

 

My New Feature request:

I would like to have  recycle-preferences\options, For example: I would like to choose between two types of recycle:
The first type -  recycle and re-init the available instance to minimum.
The second type - recycle only. (like the one exist today)
Moreover, I would like to set more than one recycle item per server-object.
For Example:
I can set two recycle items: the first recycle will be twice a day and won't change the available instances(the second type), while the second type will be once a week, and will set the available instances to the minimum.

 

Enjoy.

Friday, December 19, 2008 12:08:42 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
GIS | ArcGis Server | Software Development

# Friday, May 30, 2008

You can find me here. Not so sure what I can do with this, but I must try this before saying something bad about it...

Friday, May 30, 2008 3:29:58 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Life | Software Development

# Saturday, May 17, 2008

This Where 2.0 video is a must, for all of you GIS users, managers and GIS-evangelists.
(you can also read and view it in those links:  at Chris Spagnuolo's post or at James Fee's post)

I've also recommend reading Dave's post (this post inspired by him) and I agreed with him about the GIS-buzz that will give benefits for everyone.

From now on, you can take your blog\home\web-site\news-reader geographic information and put it on a maps, I am not sure what is the benefit, but you can do this. Who is going to use it or watch it?!
Instead, try thinking about an already-exists-application that handle deliveries between warehouses and try to locate its trucks and warehouses on a map, such idea will probably have more users. It will be more complicated cause this objects don't have a GIS metadata and it is also not so easy to give them those details, for example: the DB is already created without X and Y parameters, there is no country\place indicator in the warehouse field. moreover, we want to have a geo-processing utility which retrieve the shortest-path between those warehouses (in Israel roads, which have their own Business Logic - such as: different spatial reference, new roads, traffic-jams etc.)
For such operation we will probably need a GIS expert to create all those services for the end-user mash-up. after everything will be ready, we could simply mash-it-up together.

The main problem that the experts (those who will create the services) are looking for something more accurate, while the mash-up users are looking for a simple Geo-Knowledgeless API.

For example, The Google API looks like this:

new GLatLng(34.019968,-118.289988);

It actually looks enough for most users and application, but for the GIS-experts it looks ridiculous.
For those who still didn't understand what I mean, it is the same like saying "I am just 10 xxx from you house" - so 10 what? is it meters, is it kilometers or maybe you are talking about minutes ...

Here is a better approach for a point(*).

    public class Point : Geometry, IPoint, IGeometry, ICloneable, IComparable, IComparable<IGeometry>, IEquatable<IGeometry>
    {
        public Point(ICoordinate coordinate);
        public Point(double x, double y);
        public Point(ICoordinateSequence coordinates, IGeometryFactory factory);
        public Point(double x, double y, double z);

        public override IGeometry Boundary { get; }
        public override Dimensions BoundaryDimension { get; }
        public override ICoordinate Coordinate { get; }
        public override ICoordinate[] Coordinates { get; }
        public ICoordinateSequence CoordinateSequence { get; }
        public override Dimensions Dimension { get; }
        public override string GeometryType { get; }
        public override bool IsEmpty { get; }
        public override bool IsSimple { get; }
        public override bool IsValid { get; }
        public override int NumPoints { get; }
        public double X { get; set; }
        public double Y { get; set; }
        public double Z { get; set; }
    }

The default Lat,Long lack the coordinate system. We can see (in the second sample for point) the ICoordinate. you can also have Z parameter.
Pay attention to the Point Constructor with only (double x, double y) as parameter, this is pretty much the same as the GLatLng object. which probably use the WGS84 as its default.

I am not sure what Google are trying to achieve, if we are looking for the home (Internet) users - it will probably be enough, but still not sure how they are going to convert Ed50  data (such as: Israeli\Europe roads data) to WGS84 usage. for such operations I think they must add more options to their Geographic objects.

Simplicity note:
The thing I like the most is the simplicity in configuring a new point, which probably is a must for an humble-users. you should try this in your application\services. In such object (GLatLng)  the user should know nothing but the service must be more sophisticated.

(*) The Point class was taken from the SharpMap Api.

Saturday, May 17, 2008 5:11:43 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
GIS | Software Development

# Monday, March 03, 2008

There is a new (google) group for the ArcDeveloper.Net (or may we call it Alt-ESRI)
Help us to give you a better API.

Monday, March 03, 2008 9:39:07 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
.Net 3.5 | GIS | ArcGis Server | Software Development | WCF

# Monday, February 11, 2008

We are using the ArcGis Explorer as our 3d-Browser, and we would like to create a task.config file for each task. You can read more at my last post about Load config file dynamically (here).

Why this Architecture good for us?
Every one can install its explorer on his computer without any problem, we would like to add our own Task-Specific configurations for example: server-names to connect to, task-screen-size, links to web sites etc.
first, such details you cannot be save to the AGX-installation directory because it already installed. second, we would like to send them again and again every time the task will be updated and downloaded.

Any way, after reading this we still have two questions to answer:

1) how to get to the tasks directory
2) how to find our specific task

The answers for those questions are pretty simple:
1) To get to the task directory you should use this parameters:

   1:  Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\ESRI\ArcGIS Explorer\Tasks";

This answer will solve you the "how to found the tasks directory programmatically" but you'll still have to find the specific task directory that is interesting you.
Anyway, this is good but not good enough. I would like the E2 API to give me its Environment parameters and not to force me to code it by myself. It smell like something that can be change... and I'll be glad if the people at the ArcGis Explorer will create something like: public static class E2Environemnt which will implement such property. For now: we implement our own Environment extensions.

2) To Find the specific task you should dig the black box of E2 and you will find this cool factory:

   1:  ESRI.ArcGIS.E2API.E2TaskFactory factory = new ESRI.ArcGIS.E2API.E2TaskFactory();
   2:  string taskDirectoryName  = factory.GetTaskSubfolderNameFromAssemblyName(currentTask); 

So What's the catch I've asked? This is an internal implementation, ESRI don't like you if you'll use it... (you can read more about my question in the AGX forum). And I will ask just one simple question, why?! why not to make it internal or even private class. why we should read it at the XML comments?!

And here is my preferred solution (as Rob answered in the ArcGis Explorer forum), it make the job for me right now and it is the simple way to do it:

   1:  System.Reflection.Assembly.GetExecutingAssembly().Location;

Enjoy.

Monday, February 11, 2008 6:10:38 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
.Net 2.0 | GIS | AGX | Software Development

# Saturday, December 08, 2007

Try this out, I might admit I waste half an hour before Google-it-up: http://www.supuzzle.com/supuzzle.html

I hope you will succeed it.

Saturday, December 08, 2007 12:42:23 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
Life | Software Development

# Friday, July 13, 2007

This Survey sums up everything.

  • ESRI == Microsoft, which is a big success and I am pretty sure that this is a good direction.
  • Blogs ain't the main issue at the ESRI products,

I think that ESRI are still thinking in a GIS manner so there are more blogs for GIS users, than blogs for GIS developers.
I think that blogs\forums\web casts\GIS casts are better way to sell you API and of course better way to help you fix it.

Enjoy.

Friday, July 13, 2007 9:27:05 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
GIS | Life | Software Development

I think that ESRI made a huge jump in the last 3 years from the ArcIms Server (and the weird AXLs files) toward using almost the same API above the MXD files and Arc-Objects architecture.
Don't get me wrong they still have a lot to do, but hey they are doing it in the right direction.

I wanna show something that never happened before:
Next version (9.3) in brief
Microsoft API & ESRI GIS
More on the next version
and here is the real article about the next releases.

Some Highlight for the 9.3:

  • Windows vista capabilities
  • Working with Microsoft about adding virtual earth controls to the API.
  • When? a the first quarter of 2008! (good to know)

Something still missing:

  • Readability and Usability testing the Arc-Objects API.
  • WPF support, I've read about OpenGL API... in the next releases.
       

ESRI letting us know about the next releases, they still don't let us know everything but it is a something we should use.
Moreover, they even made a good direction while working with Microsoft.

 

Friday, July 13, 2007 9:19:30 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
.Net 2.0 | GIS | Software Development

# Saturday, June 30, 2007

Last friday I made a presentation about non-metric methods, non-metric methods is a small subject in another bigger subject named: pattern recognition.

you can download the presentation here (zip file, 566KB).

Saturday, June 30, 2007 5:52:48 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Life | Software Development

# Thursday, June 28, 2007

I've found this three articles:
Someone I don't know but I think that he starts with this
Scott Hansleman
Ken Egozi
So I couldn't resist the challenge.

Things I Learned about Software in College

1) Math.
2) Your code should only give the results the lecturer want, this ain't need pattern or not even need to run tomorrow morning.
3) Assembler\Unix\Perl\shell\bash and more other things in computer science that you will never use, but good to know they are there, like the sun, moon and ...

Three things I learned about software while not in College:

1) This is a world of Ego - try to be calm and listen to your friends you don't know everything, in such way you will earn more friends and learn more from people. moreover not every person who make noises of genius (or maybe make noises he knows something) he truly knows it {after all we all need to say something that every one else would know that we out there}.
so first, listen to him\them. Afterwards,  try to dig more to found out if you can use this details.
2) Only time (and experience) make you better, so don't stop reading, coding and talking about architecture.
3) The coder who is sitting near you is your friend love him & hug him after all you see him more than you see your wife\girl(boy)friend\son.

Keep learning

Thursday, June 28, 2007 11:37:25 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Life | Software Development

# Saturday, March 31, 2007

As you already know my team works on ESRI products, which are off-the-shelf products, we have daily battles of understanding and solving performance issues. the main challenge is to understand where in our branched architecture the problem.
I already wrote about this ESRI processes and the "Process Explorer" I also called this Debugging the unknown.

I always said that we all good programmers, we all know to write (more or less) readable code, but most of us lack the understanding of how things are working at the background. The difference between a good programmer to an expert is that the experts truly know what is going on behind the scenes.

Last week Liran, talented boy from our Unix team, shows me this magic: Cacti.
Cacti is an RRDTool which can help us gather important details about the OS functionality and its background operations.
I am still not sure what we wrote their in his scripts, but I saw that it was short&easy to write new scripts.
The real cool thing is that creates an intranet site, which makes this easier to connect, it runs in front of our UNIX\Linux servers. I know how to run some cool scripts in UNIX, I also wrote some scripts using shell\bash\kshell, but this is better, you can get everything using graphs, and do not need to remember even you DB server name.
We are using Cacti to monitor our SDE server (Linux) and our DB Server(Oracle 10.2 on AIX5.3).

Two days later, we return our investment, when we had two crashes because of Virtual memory, you can easily see that in those graphs, which saves the history in MySQL DB.

Again, It won't solve all your problems, but you must understand that without such tools you will spend hours on hours when your DB fall again and again.
With such tool you can also predict errors when you are doing you exams at the development phase.

I would like to hear about more tools you know and use.

Saturday, March 31, 2007 10:59:11 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
DataBase | SDE | Software Development

# Saturday, March 10, 2007

I usually write my posts in a notepad and then paste it to the DasBlog editor, afterwards I fix and rewrite it.
Today I spent almost an hour in a keyboard battle.

my_keyborad.JPG

Those two make my nightmares come through, when I pressed them they do a kind of "go to the prev page" in the explorer (IE7) which delete all the changes I made.

I'll win this battle.

Saturday, March 10, 2007 12:25:28 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
Life | Software Development

At my team we start using the scrum methodology, we are now learning this stuff on the fly, for further understanding I recommend reading Avi Wortzel blog. Avi is the other team leader and a good friend and I admire his way of thinking, pay attention to him.
As Avi said, on daily meeting post, we are two team leaders and we make together the daily meetings (6 people), we both scrum masters each one gets his turn.

I would like to share my thoughts with you:

  1. Fix the "daily meeting" method (or, one more question to the casual three questions)
    • The problem
      I have a problem with the way people are letting you know what they are going to do today, for example: I am working on this module or I am doing that aspx page. The real problem is that the day after it will probably be the same task.
    • Resolving the problem
      • my first rule: talk about the things you really do, the problems you are trying to solve today.
      • I also added one more question, "what did you had to do yesterday and didn't make it".
        This question is the connection between the first and the second. so a co-worker should say: "Yesterday I did this and that, and didn't make this," and then continue with: "today I would continue in that and this"  or maybe: "I won't make it today also it will be postponed to the next week".
      • Don't ask: "why didn't you do this!", you are a scrum master, not a mother, this will annoy your programmers! (read the "Talk to your co-workers not to me: " section for better understanding) .
  2. Keep the order for better understanding.
    • The problem
      • programmers told me that they are confused and do not understand a word from the other programmers, there are many way to solve this issue.
    • Resolving the problem
      • try to keep the order of the sentences, about yesterday, today and impediments while the fourth question is like a hidden question between the yesterday and today.  the fourth is a connective question, you should still distinct between the three parts.
      • don't mess the sentences order, it will cause a confusion in some of your co-workers.
      • there are people who like to talk, that is not a problem, but do it in your turn, and in the right order.
  3. Talk to your co-workers not to me:
    • The problem
      • I always feel that people are talking to me and not to the other co-workers at the room, I don't have a good solution for this issue, but as far as I know it will take them time to understand it.
        You are probably asking time? so when? I think that on the day that they will really feel that the last meeting was helpful to you he or she will do it right.
    • Resolving the problem
      • I don't have a good solution for this issue, but as far as I know it will take them time to understand it.
        You are probably asking time? so when? I think that on the day that they will really feel that the last meeting was helpful to you he or she will do it right.
      • Scrum master questions: don't!, if you are the team leader & also the scrum muster, you should try to be less dominant, your workers\programmers always feel that you are testing them, yes this is true the team leader is always watching you, but try to do this without irritate them, let them feel you trust them, let them make their mistakes, this will also help them feel that they are talking to their friends not to you. (it sounds stupid, but there is a lot of ego in the room after all, and some one should give up).
  4. Implement the whole class do not left stubs out there. (or, daily meeting as a part of the whole scrum methodology)
    • The problem
      • People are implementing only part of the system.
    • Resolving the problem
      • I don't think that this is a real big problem, but you must understand the strengths and weaknesses of each feature in the methodology so you could choose whether to implement or not.
      • I think you can't do daily meetings without the scrum review.
      • I do think that you need to implement the whole methodology together, but if you need to start, it is better to start with
           part of the methods and learn the other on the fly.

What do you think?

Saturday, March 10, 2007 11:01:03 AM (GMT Standard Time, UTC+00:00)  #    Comments [2] - Trackback
Software Development | Agile | Scrum

# Saturday, March 03, 2007

Last Thursday a good friend of mine, Shimon Krokhmal, made a great presentation about session hijacking.
People asked me: What did he do that make this lecture so special?
So I tell you:

  • It was well organized from the global idea to prevention.
  • I liked the samples - which where recorded prior to the lecture, which let him the ability to show us the best scenarios.
  • I learnt few tricks which I didn't know before, this is what I am looking for in a lectures.

Pay him a  visit.

Saturday, March 03, 2007 6:04:18 PM (GMT Standard Time, UTC+00:00)  #    Comments [2] - Trackback
.Net | .Net 2.0 | Life | Software Development

# Saturday, February 24, 2007
We are developing a new application over the AGX API. ESRI give us a small and powerless API, which you must use this default window with this default images and menus. But we would like to change those capabilities...
Saturday, February 24, 2007 11:26:29 AM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
.Net 2.0 | AGX | Software Development

# Tuesday, February 13, 2007

I am gonna present tomorrow to the managers about the geographical approach in my department.
I just finished creating scenarios to those products:

  • ESRI ArcGIS Explorer
  • MS Virtual Earth 3d
  • Google Earth

After more than 3 years developing GIS applications, I must admit that we have today good/solid SDKs, for a simple and further usage.

 

I would like to give some scenarios to the non-trivial GIS applications:

supermarket products:

  • can be mapped to a Geo-DB, and easily find in space.
  • think about customer who searches a product using Geo-DB application pressing the product name, and the screen will show him the best way to get there.

Library mapping:

  • Think about mapping your library using a geographic engine, each book can easily find in space.

Hospitals:

  • we can find behaviors of diseases in different places in the world/country/city.
  • such task wouldn't so trivial before, but today it is in a daily basic.

 

My Tip:

  • Think about your applications today, you can easily move them one step further and give them a better UI.
  • Tomorrow you could easily earn the added value, from (Data)mining the geographic behaviors.


Wish me luck...

Tuesday, February 13, 2007 11:25:05 PM (GMT Standard Time, UTC+00:00)  #    Comments [3] - Trackback
GIS | Software Development

# Saturday, November 11, 2006

At work I have two computers, one with VS2003 (the older one), and on the other one I've installed VS2005, they both share the same user-profile (network profile, I guess).

When building my solution I got this warning:
   CS1668: Invalid search path 'C:\Program Files\Microsoft Visual Studio\VC98\mfc\lib'
   specified in 'LIB Environment Variable' -- 'the system cannot find the file specified.'

This warning has occurred on each project build.

My first step was to try finding the path, which of course wasn't there.
My next step was to search the Environment variables and there it was the LIB variable was pointing on the given path.

As a conclusion, the VS2005 try to load the LIB variables at each build operation, and cannot find it.
Just delete the unrecognized paths from the LIB and your VS2005 will stop showing annoying warnings.

Moreover, this is a 1-0 to the VS2005, this is a good example for descriptive error.

* I've heard that this problem happen for others when installing the VS2005 on a computer with VS2003 that has been deleted.

Saturday, November 11, 2006 5:07:56 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
.Net | .Net 2.0 | Software Development

After a long period of testing and customizing the Team foundation Server to our needs, We can finally say that we have a great results.

First, I would like to invite all of you: use the TFS it is a great tool and it will help you being more productive.
Second, Matan1 and I thought about useful feature for the next release:

Inheritance in process templates (VSTS)
Background:
   We have two different systems: StandardWorld, AmazingWorld.
   We want to customize the bug work-item, for example, so each programmer\tester will not forget 
   writing important details.
   (for example: the user's profile which caused the error.
   Why? because in our system we would like to know the user's profile which produced the bug).
   But Hey, it is system-based, in StandardWorld, for example, we don't have profiles at all.

How do we gonna implement this today:
   Today we just create two different process templates (AmazingWorld-ProcessTemplate and 
   StandardWorld-ProcessTemplate) which are the same, but with different additions for each 
   system. For example: in AmazingWorld-ProcessTemplate we would add the special field to the 
   bug work-item.

The Problem:
   All the  known copy&paste errors, from the Software development, each minor change will reflect
   on two different places, and so on. 
   Think about your code, we always try to prevent the copy&paste operation.

Our Solution:
   Lets define inheritance between process templates.
   For example: StandardWorld will use the default template (the base template), and the 
                     AmazingWorld will use the extended template (the one with added features).
   The logic should be like this:
      For each new template we could choose if we want to inherit from other class/template or not.

Updated:
  I opened a lady bug at microsoft:
  http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=241462
  Vote for it.

Conclusion:
   We think that it will help us create more generic templates!
   Let me know what do you think about this?
   Is this a good feature for the next version?


1A few words about Matan: he took this mission with his two hands (strong and big I might say) and lead the team to a better process. If you would like to ask more questions about the TFS do not hesitate.

Saturday, November 11, 2006 4:09:12 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
Software Development | Team Foundation Server

# Sunday, August 13, 2006

While reading my emails, I found out an email from Martin Woodward, who let me know some great new things about my first article about the TFS (Team Foundation Server - where to start?)

  1. The company that ships the Eclipse plug-in is called "Teamprise".
  2. The "TeamPlain" product is currently a web interface to Team Foundation Server from DevBiz.
  3. You can see a great demo, for further information about the usage of this product.
  4. You can download fully functional copy of the plug-in here.

Thank you Martin.

Sunday, August 13, 2006 10:26:26 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Software Development | Team Foundation Server

# Saturday, June 24, 2006

Yesterday I complete my weekly-blogs-time reading, I saw Oren's post: So when is it a good time to develop infrastructures ?! and I wanted to pay a special post for that kind of question.

First, if you didn't read his post, it is about time, I think that everyone who likes coding ask himself this question, and some other questions such: Why should I code at home, When should I see my wife and kids (for those of you who married), or What should I do to get home earlier. of course that we all enjoy our work and most of us could code till they sleep, and even then they still thinking about better architectures, algorithms etc.

There are many good answers to that issue (read the comment), but I would like to give here my way of thinking and hopefully hear your comments, of course that there some of you who would say that they couldn't afford it but as I will explain later it is like gold mining, where the gold is promised.

IMHO, if you and your company could afford it you should start thinking about a new (small) team for infrastructure/API. such team should get requirements from all other projects/teams and "help" the others to see their project from high-level, outer-perspective, neutral-domain.

I know that such team may look unprofitable but when you build such team you can gain many advantages:
1) This team will test new frameworks & tools.
2) Your DBA-s will be in that team, for better DB-infrastructures.
3) Your best designers/architects (for those infrastructure will be there).
4) Your other teams would reduce their time-schedule.
5) You won't have to implement your ideas all by yourself. those Ideas/API/Infrastructures will get better maintenance.

GAT&DSL Notes:
Microsoft new tools (GAT&DSL) are kind of tools that shouting architecture, I see those tools as efficient ways to guide projects faster to the main issue, but a mediocre team would not pay much attention for such tools because they "time-consumers", in other teams (perfection seekers) this kind of tools most likely learn at home (spare time).

I also know that such "unprofitable" idea would be harder to convince the managers, especially when you are doing perfect job right now, everyone will say: "hey, but everything works why to pay for more persons?".
But like every other idea you should create solid demands, and explain your reasons (you can call this the "Why" excuse) and I am quite sure that they will understand it.

Oren:
If you want we can sit, talk and improve the demands for such team.

Readers:
What do you think? What other requirements\fields of interest should be in such team?
How would they integrate between projects?

Saturday, June 24, 2006 12:23:59 PM (GMT Daylight Time, UTC+01:00)  #    Comments [4] - Trackback
Life | Software Development

# Friday, May 12, 2006

In one of my code reviews I saw this piece of code (those two methods are in the same class), IMO, and I believe that most of you will agree with me, this usage of exception is unnecessary.

private void CheckPrivileges()
{
   // check user privileges
   // for authorized user won't do anything.

   // if not authorized:
   throw new UserNotPrivException("user name", "action not allowed");
}

public void DoSomething()
{
   try
   {
      CheckPrivileges();
      // Continue your logic for authorized users.

   }
   catch (UserNotPrivException)
   {
      // showing message box which
      // says that user has no permissions
      ShowMessageBox ("User X has no privileges for this place.");
   }
}

Why ? 

  1. The Exception mechanism is slow
  2. A lot try&catch makes the code harder to read
  3. Why throw exception if you won't use it? and also throwing it between two methods in the same class?

I would have done it like this:

private bool IsUserPrivileged()
{
   // check user privileges
   // for authorized user - return true
   // if not authorized - return false
}

public void DoSomething()
{
   if (!IsUserPrivileged())
   {
      // showing message box which
      // says that user has no permissions
      ShowMessageBox("User X has no privileges for this place.");
      return;
   }

   // Continue your logic for authorized users
}

If you want to check between those two (privileged or not) you can use the bool.
Moreover, when you are not really need the exception data.

Honestly,
I wrote this post before Tech-Ed, but didn't have enough time to publish it, in Tech-Ed, I talked with some other programmers that agreed with my opinion, but I still would like to hear your opinion,
what do you think about it?

Friday, May 12, 2006 11:10:06 AM (GMT Daylight Time, UTC+01:00)  #    Comments [5] - Trackback
.Net | Software Development

# Saturday, April 29, 2006

A few days ago I start thinking about a new way to control our web site window size.
In our site there is a main window which hold the most important data. For editing the data or view more data: you can choose your subject in the menu and it will open a new page with the full details.

The common sense says that the window should set its own width/height for best fit, with minimum scrolling, but the reality isn't that simple because this page can open either as a regular window or as a modal window and the parameters are different. There is another problem, changing the window size in run-time (in the body) is very ugly (you can see the window re-sizing itself).

The other way is working with JavaScript file which holds the windows parameters and the opener will use this parameters for opening the wanted page. The good thing in this idea is that the menu will know all the sizes and open the windows in the wanted size (the one defined at the JS file). But here we have another problem that Server files (.cs) that writing JavaScript (from server) should know this JS file and the names of the parameters, can cause broken links. also, links to my site that sent via email won't open in the wanted size.

another idea is to use XML for server and at the first time (application) create dynamically the JS file with the parameters, still can cause broken links from (html or other JS) and this can cause a strange problem because we are connecting our files to JS file that is not created yet, I know it will work because it is happening on run-time, but it is still strange. In here we still have the problem for links to my site that sent via mail.

For the mail issue, lets say that every link should go first to my main page, and only their the main window will open the wanted page for you, so we can set the window size via the main window.

I am searching for other implementations to the JavaScript file that holds the sizes for all windows.
Is there a better way for doing this?

Saturday, April 29, 2006 2:50:31 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
.Net | Scripting Technology | Software Development

# Saturday, January 28, 2006

Lately I found my self playing a lot with the Google search API, I would like to give my criticism about this one:

Cons:

  • Old API as we used to in C (WinAPI) with 8 and even 10 parameters, no overloading.
  • Only 10 results for each query, and they rudely ask for the maximum results wanted?!
    why isn't there any Const with maximum results so people could be aware of this 
    shortcoming.
  • There is no ability to get the page rank.
  • In their snippet result (where you can see intro of the text that found for this page) you
    will find it in HTML format, which I recognize as poor programming, there are thousands of 
    people who would like to see the results in WinForms, save into file or just read the text, why 
    should I make the formatting job (Isn't it all presentation stuff?)
  • Least but not last, documentation for the methods (can be found online only.)

Pros:

  • This is a productive tool for all the programmers out there, which can be easily download, install and use this fairly easy.
  • Written as WebService which help for compatibility.

conclusion:

  • As a programmer who need to search the web, I recommend this tool.
  • As a programmer who wrote this tool I would run fast as I could and fix those Cons, and there is even more from the place they came from.

The Cons talk on their own, Does Google made this API poorly to prevent us from using it, or maybe they not as good as they seem to be.

remarks:
I hope they won't throw me out from their Ranking Servers :).
you can found more data in this article:
http://www.mattcutts.com/blog/feedback-products/

Saturday, January 28, 2006 9:12:03 AM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
.Net | Software Development

# Saturday, January 21, 2006

There are many people who asking me again and again about this question,
I've finally found some time to write about this and show you simple example for all of you out there so you can't forget this.

As we know (read somewhere but nor really remember) one is runtime and the other compile time...
so here is the code:
public const int IntConstField = 1;
public const string StringConstField = "shani";
public static readonly int IntROField = 1;
public static readonly string StringROField = "shani";

and this the usage:
Console.WriteLine(Class1.IntROField);
Console.WriteLine(Class1.StringROField);
Console.WriteLine(Class1.IntConstField);
Console.WriteLine(Class1.StringConstField);

Isn't It look the same?
so I disassemble this one for you...

IL_000a: ldsfld int32 [TestLib]TestLib.Class1::IntROField
IL_000f: call void [mscorlib]System.Console::WriteLine(int32)
IL_0014: ldsfld string [TestLib]TestLib.Class1::StringROField
IL_0019: call void [mscorlib]System.Console::WriteLine(string)

IL_000a: ldc.i4.1
IL_000b: call void [mscorlib]System.Console::WriteLine(int32)
IL_0010: ldstr "shani"
IL_0015: call void [mscorlib]System.Console::WriteLine(string)

The first four rows show the Readonly, where you can see the ldsfld which is MSIL instruction for pushing the value of a static field into the stack!
The other four rows show the Const, Where you can see ldc,ldstr instead of ldsfld which means that Const doesn't behave like Readonly, Const is very similar to to #define in c, don't have its own location as global, Const is just written as number/string (hard coded) at the compile time.

After we know this simple transformation at the compile time,
we will see an example including two DLLs:

A: hold the const vars.
B: uses A's const vars.
When we made a change at A (changing one of the consts) we can't only compile it and replace the DLL at the bin directory, we should also compile this with the DLL who use it (B in our case).
So it will change also the hard coded numbers!

PI, is a good const, but Unit Number or Dept Number (=180) isn't good enough.

Saturday, January 21, 2006 7:52:17 AM (GMT Standard Time, UTC+00:00)  #    Comments [4] - Trackback
Software Development | .Net

# Friday, November 18, 2005

Try this CIA place,
There are many rumors about the sources for this site data, probably not really CIA data, but this is a great place to learn a little bit more about places in the world.

The Great think I found out that you can compare between countries/locations attributes/data.

I also appreciate this site as a developer for its simplicity, while you can find a lot of data in many variation.

keep it simple!

Friday, November 18, 2005 11:30:47 PM (GMT Standard Time, UTC+00:00)  #    Comments [3] - Trackback
Life | Software Development

# Wednesday, November 16, 2005

Last week I was hit by the customer-programmer strange relationship.

Two days before ending the coding session we eventually find out that one of our modules is far-away from the customer expectations.

 

That's of-course not the first time, but again? I was quite sure that this time we did every thing by the book, probably wrong.

 

After I took a day or two for thinking I want to share my thoughts:

 

1) Customer: completely not what I meant, I said that…, we need…

The worst case, nightmare of every Developer/Manger and even Customer, when the customer for the first time(last session of coding or even at the acceptance tests) understand that what he said and the things that were understood (written by the team and signed by him) are completely different.

 

2) Customer: That's good…, yes…, OK… I just want to change the screen instead of all Textboxes to AutoCompleteBox.

That was not written as one of the requirements – of course, why we didn't think about this…

 

I am not gonna answer those questions (I'll provide my point of view in the future)

Also there are a lot of books and other stuff for this.

We can minimize the appearance of the Second and we can almost prevent the First, but shit happens.

 

I'll tell you what really annoying me:

- Finally, we got to the prioritize stage for those new add-ins, and right now the customer start showing you his skills/knowledge in development, what's the problem? I saw that in Hattrick also at Google map so why you wrote 1-week? And that's go on for each feature.

 

From my point of view I've got some advices:

- Don’t spend your time on argue (who was wrong and why), book another meeting for special investigation/conclusion.

- Extending the first sentence, don't miss your main goal! which is to find out what should be done for the next time!

- Understand the Huge Gap between you and your customer. (different terms, expressions)

This will help you both to prevent such incidents.

- Work together but don’t afraid to say what you think, in those special meetings talk about the problems from your point of view but always think about new solutions(for those Gaps).

 

My last advice:

Enjoy your work, this will help you overcome such b(/s)ad days.

Wednesday, November 16, 2005 8:15:56 AM (GMT Standard Time, UTC+00:00)  #    Comments [0] - Trackback
Software Development

Archive
<April 2014>
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2014
Shani Raba
Sign In
Statistics
Total Posts: 146
This Year: 0
This Month: 0
This Week: 0
Comments: 97
Cool Stuff
Add to Technorati Favorites
Themes
Pick a theme:
All Content © 2014, Shani Raba
DasBlog theme 'Business' created by Christoph De Baene (delarou)