In one bright day, our integration tests in the build server started to fail randomly. Each test that failed showed this message:
ORA-02049: timeout: distributed transaction waiting for lock
These were integration tests on our database (Oracle database). Each of these tests had opened a distributed transaction and rolled it back to prevent changes in the database (Using the System.Transactions.TransactionScope). Each time we ran them, different tests had failed. The strangest thing was that newer tests we wrote, which used nHibernate transaction instead of a distributed transaction passed successfully.
A couple of days later, the same tests started to fail on our development computers. This was a red line for me. I dove into the tests. If you ran each test alone, it always passed. If you ran a couple of tests together, some of them had failed, without a specific order. When you debug a test, it always ALWAYS pass. This was very frustrating.
After a couple of fruitless debugs, I started to look for monitoring possibilities for the DTC transactions. I found that the performance monitor had some counters (under Distributed transaction coordinator title) which provide useful information. I used the Active Transactions counter, Aborted Transactions and Transactions/sec counters. I ran the tests and saw that before each test that failed, a previous transaction was hanging. I put a Thread.Sleep command in the Setup method (the method that runs before each tests) and surprisingly the tests had passed. This was very weird. I couldn’t understand why this is happening.
After a couple of days, I almost gave up. I asked for advice of another programmer from our infrastructure team - Doron, and he mentioned that another project on the same server, which also runs integration tests with DTC, never fails. He suggested to me to start moving tests from one project to another and see what is happening.
To do that I needed to create some tables in the DB schema of the tests. When I logged to the schema, it showed me that the password for the schema will expire in a couple of days… And then it hit me. I changed the connection string to another schema and surprise surprise – all the tests passed…
I looked at the schema’s definitions, and I saw that it’s state was ‘EXPIRED (GRACE)’ – which means that the password will expire soon, and Oracle gives us a grace period before the user will expire. This was very strange because this user was defined with a never expiring password. It turns out that while exporting and importing this schema, the Oracle system guys made a mistake, and defined the user with a password that expires in two months. Another look at the definitions, showed that the password expired exactly at the day the tests started to fails…
The one thing I don’t understand in all this is why the nHibernate tests had passed and the DTC tests had failed. I assume it happens because nHibernate is using a local transaction. So the question is why this is happening in this case with a distributed transaction and not with a local transaction.
Any ideas?
Recently, I’ve started to work on several projects in my free time. After a while, I realized that I couldn’t manage without source control (especially after you do some refactoring on a xaml code and suddenly nothing works…).
So I started to search, and found a web site called Assembla. It allows you to set up a free source control space in a server which is based on SVN. The setup is pretty easy, and in less then five minutes you have source control for your projects. In addition, there are additional tools, for example: a project management tool and a scrum tool. I didn’t had a chance to look at those tools, but it seems pretty nice.
The only disadvantage I found so far is that the projects that are set in Assembla are considered open source and everyone can look at them. If you want you can upgrade your space, but this costs money.
After setting up the account, I started to look for SVN client tools for Visual Studio. A couple of years ago when I used SVN as a home source control, I found two tools : VisualSVN and AnkhSVN. Back then I preferred to use VisualSVN because AnkhSVN was an add-in and not a source control plug-in for visual studio, and it was less user friendly. VisualSVN had only one disadvantage – It was not free…
I decided to try AnkhSVN again, and to my surprise, the developers (I forgot to mention this is an open source project) did some major changes in the tool, and it is now a full source control plug-in for VS. That means you can use all the commands like “Add to Source Control” and the “Pending Changes” window. I found that this tool is very comfortable to use, and it has some nice features, like annotate, which allows you to see who change each line of code (BTW, TFS has this feature if you install the TFS power tools).
Which source control you use at home?
Since windows 7 was released I couldn’t wait to install it on my computer. I have suffered with vista since it came out, and I wanted to get rid of it ASAP. So, I’ve installed it on my main computer (which is one year old) and I’m enjoying using it every day.
About two months ago I also bought a netbook – Asus Eee 1005HA. It is very portable and a joy to use. But it had XP installed. So I missed the good things, I had on my main computer with Vista – Especially the search in the start menu… Last week I stumbled upon a review which compared windows 7 vs. windows XP on my netbook. It look promising, so I thought I’d give it a shot.
In my installation I used Windows 7 Home Premium Edition. My netbook is Asus Eee 1005HA with 2 GB of memory.
How to install?
- Creating an installation on a DoK: My netbook has no DVD drive, so I needed to install from a Disk On Key. In order to do that, you need one with at least 4 GB. I used these instructions in order to format the DoK into a bootable drive, so I can install from it. IMPORTENT: Don’t do these instructions when an iPod is connected to you computer. For some reason, entering the diskpart utility screws up the iPod, and you’ll have to reformat it (I learned that the hard way…).
- Now, in order to boot from the DoK you need to do the following:
- Plug the DoK into the netbook.
- Turn the netbook on.
- Press F2 on the boot so you can enter the BIOS configuration.
- DON”T CHANGE ANYTHING!
- Press F10 to quit and save.
- Press ESC rapidly and you will get a boot screen.
- In this screen select the DoK and start the installation.
- Follow the wizard, and in less then an hour, Windows 7 will be installed and updated.
- Install the Asus Utilities from the asus support site (which has already windows 7 drivers):
- ATK –> Hotkey: Installs the keyboard shortcuts, like volume, brightness, etc..
- Touchpad: This one surprised me. One of the reasons I bought this netbook is because of it’s multi-touch mouse pad, which allowed scrolling using two fingers, right click using three fingers tap, etc… When I got it I was disappointed because they replaced the driver and in the new one these finger gestures didn’t work. To my surprise, the windows 7 touchpad driver allowed them! So I got an extra bonus.
- VGA: display driver.
- Utilities:
- Super Hybrid Engine (SHE): allows better utilization of the battery life.
- Eee Storage: For using the network storage that asus gives you.
- Install an AntiVirus. I am using Avast.
And that’s it! Your netbook is installed – and apparently works faster (Just my feeling).
In conclusion, I have another recommendation: DO NOT update the bios after installing the OS. Asus allows you to download a utility that updates the bios to newer versions. After I did that, the netbook crashed and was not able to restart the OS again. I tried to recover it, and restore it, but it was no use. I had to reinstall it again (Although in the second time, the installation took me an half an hour).
In my previous post I overviewed some important issues concerning st_geometry.
You saw all kind of cool things you can do in simple sql queries. In order to use these queries you need to do some additional configurations to your database after you install sde.
In here you can find instructions of how to do this.
Example of Net configuration of st_geometry in linux:
listener.ora:
LSNR_MYDB =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = myDbSeverUrl)(PORT = 1234))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC01))
)
)
)
SID_LIST_LSNR_MYDB =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc01)
(ORACLE_HOME = /software/oracle/app/oracle/10203)
(PROGRAM = extproc)
(ENV="EXTPROC_DLLS=/software/sde/sde_exe/lib/libst_shapelib.sp,LD_LIBRARY_PATH=/software/sde/sde_exe/lib")
)
(SID_DESC =
(GLOBAL_DBNAME=mydb)
(ORACLE_HOME = /software/oracle/app/oracle/10203)
(SID_NAME = MYDB)
)
)
tnsnames.ora:
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(Key = EXTPROC01))
)
(CONNECT_DATA =
(SID = PLSExtProc01)
(PRESENTATION= = RO)
)
)
A couple of things you need to remember:
- After you configure the listener, you need to restart it.
- You MUST recompile the st_shapelib package in the SDE user (you also need to change the url to the appropriate url in your server, and according to your OS – see the table in the next section). Do that after you’ve restarted the listener.
- In the listener definition under SID_LIST=>SID_DESC=>ENV of PLSExtProc01 SID in unix/linux OS you need to add the library path definition to the file location definition. For each OS it’s library path (unix/linux – LD_LIBRARY_PATH,hp-ux – SHLIB_PATH, AIX(IBM 64) – LIBPATH).
- Notice the KEY value in ADDRESS of the IPC protocol, in the listener and the tnsnames, must be the same in both definitions.
- The SID_NAME in the listener and the SID in CONNECT_DATA in tnsnames, must also be the same name.
Using st_geometry when your sde and db are on different server:
As I showed previously st_geometry works with external libraries which contains the operators and methods of the object. These libraries are installed with sde on the sde machine.
When sde resides on a different server then your database, you need to copy these files to the database machine in order to do the configuration of the listener and the st_shapelib library.
The files are found in $SDEHOME/lib directory (Unix) or %SDEHOME%\bin in windows:
| Library Name |
Windows |
Unix/Linux |
HP-UX |
AIX (IBM 64) |
| st_shapelib |
st_shapelib.dll |
libst_shapelib.so |
libst_shapelib.sl |
libst_shapelib_64.so |
Projection Engine
|
pe.dll |
libpe.so |
libpe.sl |
libpe_64.so |
| Geometry |
sg.dll |
libsg.so |
libsg.sl |
libsg_64.so |
You need to copy these files to your db machine under your db lib folder, and then aim the listener to these files.
Important to notice:
- The files must match the OS on your database server! If your db machine has different OS then your sde server you need to create a dummy installation of a sde on the same OS and then copy the files from there to your db.
- When installing service packs you need to recopy the files. If your sde server and db server has different OS you need to do the same thing as you did in the previous section, install the service packs and then recopy the files.
Troubleshooting:
There are a couple of errors we encountered while configuring sde:
ORA-20003 – Unable to retrieve message
Has you can see, this is a very generic error (the kind of error Esri is used to give with ArcObjects – the notorious COM exception).
These errors where published in the first version of st_geometry in sde 9.2. This was done in order to wrap the exceptions that rose from the database. In service pack 4 Esri changed this and the exception that were thrown had a specific meaning.
Here, you can find a full list of detailed exceptions.
ORA-28579 – network error during callback from external procedure agent
This is a nice one. We spent about a week and a half in order to solve this.
In my case, the problem arose from an inaccurate definition of the listener.
When we first installed st_geometry we did it on HP-UX.
The second installation was on AIX (IBM 64). So, at the advice of our unix and dba teams we simply copied the definition. But as I described in the first section of this post, you need to change the library path according to the operating system, which we didn’t :(.
This can cause very weird exceptions and errors, because some of the st_geometry functions are implemented in pl/sql (like st_srid) and some are in the external library (like st_geomfromtext). This means that some of the function works and some don’t. The properties of the type will also work because they are defined in the UDT. Also, editing the layer in ArcMap will also work because ArcMap is using ArcObjects and not the sql api.
In short, all you have to do when encountering this exception is check the listener definition:
- Are the library files in their place?
- Are the files match the database OS?
- Is the path in the listener leads to the files?
- Is the definition of the listener match the database OS? (SHLIB_PATH for HP_UX,LIBPATH for AIX(IBM 64) and LD_LIBRARY_PATH for all other linux/unix OS).
In conclusion:
Configuring your database to work with st_geometry could be very tricky. You need to be precise. From my experience most errors are the result of wrong configuration.
In my next post I will show how we work with st_geometry in our .Net application.
So, how does st_geometry works?
St_geometry is a user defined type of the Oracle database. A user defined type in Oracle is like a class definition in .Net. It allows you to create a type with properties and methods. It also supports inheritance, which in st_geometry is used to define an object hierarchy:
As you can see from the diagram, st_geometry is infect an abstract class. Which means that in order to create an “instance” of the class you need to use one of the inheritors.
St_geometry’s user defined type is defined inside the SDE schema in your database. Once you’ve installed sde on your database you can connect to your sde schema and view st_geometry and all of his inheritors.
This is an example of a table which contains a st_geometry column:
create table
(
code number(10),
name varchar2(200)
shape st_geometry
);
In practice UDT are saved as BLOB. This means that when you define a column with a st_geometry type, and try to query this column, you will see a blob.
You can create an “instance” of st_geometry be using a constructor (yes, a constructor!):
insert into buildings(code,name,shape)
values(buildings_s.nextval,"Doron Plaza",st_point(10,10,1);
This query will create a new row for the building “Doron Plaza” which is positioned in (10,10) (The 1 in the ctor represents a spatial reference index, but we will discuss this later).
Properties are defined in the type definition. That means that you can access the properties like you use properties in C#:
select b.name,b.shape.numpts from buildings;
This query will retrieve the number of points in the building’s shape.
Operators are more complicated.
in my previous post, I showed this example:
select * from buildings b
where sde.st_intersects(b.shape,st_point('POINT (35.122 32.999)',1)) = 1;
In here we use an operator which returns 1, if the given shapes intersects (It actually returns a st_geometry instance of the intersection).
If you look in the type definition, you will find a reference of the operator to a package called ST_GEOMETRY_SHAPELIB_PKG. This package defines an external procedure call. This means that the actual processing of the data is done out of the oracle process with an external library – ST_SHAPELIB.
Simply, this means that before you can start using St_geometry in SQL, you need to configure oracle to “know” were this external library is. I will discuss this in my next post.
This also means, that st_geometry functions and operators, are slower then internal oracle procedure because there is a context switch inside the db server.
You can find a full list of all the operators available for st_geometry here.
Now, lets talk about spatial reference.
As you well know, each layer is defined with a spatial reference. St_geometry columns contains a property which contains a number that represents a spatial reference. Notice, that number is NOT the Well-Known Id of the spatial reference.
So, what is this number? this number is an index of a row in a table called sde.st_spatial_references. If you never used st_geometry in your database and you query this table, you will see that the table is actually empty. Why? I have no idea, but in order to insert data in an st_geometry column, you need to fill this table. The quickest way we found to do it is to create a dummy table using ArcCatalog with an st_geometry column (you do that by creating a feature layer and selecting the st_geometry configuration keyword) and the spatial reference you want to use. After you do that, you can query the st_spatial_references table and you can see a new row with your spatial reference. You can also notice there is a column in this table – CSID which contains the well-known id of the spatial reference. You can now use the index of this row to insert data to the table, like I presented in the example above.
Another thing you need to notice is that the spatial reference definition is done when creating a new feature, not when creating the table. That means the the same table can have feature in different spatial references.
Well that was a quick overview of the important subject concerning st_geometry. In my next post I will show you how to configure st_geometry, so you can use it in simple sql queries.
In the last couple of months we have been using the new st_geometry type of the ArcSDE geodatabase. St_geometry allows us to use simple queries in order to retrieve and manipulate geographic layers.
For example:
1: select * from buildings b
2: where sde.st_intersects(b.shape,st_point('POINT (35.122 32.999)',1) = 1;
This query will return all the buildings that intersects the point (35.122,32.999).
St_geometry is available from version 9.2 of ArcSDE (ESRI recommends to use st_geometry from service pack 4).
More information on st_geometry is found here and here.
In my next posts I will describe this feature, how to use it, how we use it today with .Net, tips and problems we encountered while starting to use st_geometry in our systems.
Two weeks ago (9/7/2008) we organized a dot net day in our company. In this day me, Shani and Doron lectured about basic usage of dot net.
The lectures were :
- Conventions and Db guidelines - which I presented
- Cool Tools for productive programming - by Shani
- Introduction to Enterprise Library - by Shani
- TDD - by Doron
As you can see I lectured about conventions and db guidelines.
So as promised, attached to this post, are the presentation and the code samples.
In order to run the code you must install Odp.Net 11g.
Have a great day!
A long time ago I presented a problem : How can you migrate from Oracle 9i with SDE 9.1 to Oracle 10g with SDE 9.2. After a long time I have found a solution. This solution was suggested to me by Tom Brown from ESRI. In his visit in Israel Shani and I had a rare chance to meet him and ask him a couple of questions. This was one of them. And now, I will present the solution :
In order to perform the migration you need to follow these steps :
Definitions :
- Source : Oracle 9i + SDE 9.1
- Destination : Oracle 10g + SDE 9.2
Process :
- Install on a different server Oracle 10g and SDE 9.2. DO NOT install the SDE schema in the database and DO NOT perform the Post installation of SDE. This will be our destination server.
- Export your ENTIRE source database - all the schemas, including the SDE schema. We used the weekly backup of our database for this.
- Import the export you created in the previous step, as is, to the destination database - again all the schemas.
- Run the Post installation of SDE 9.2, but follow the instructions about the Upgrade and not the fresh installation instructions. Remeber to give the SDE schema the permissions described in the installation instructions.
- Install the SDE service packs. Service pack 5 is the most recent.
That's it. So simple that it is aggravating :)
So what is the magic here ?
The export/import is understandable , data wise - you have to import all of your data. But why migrate the SDE schema ? Why run the post installation with the upgrade instructions ?
The SDE schema contains metadata about the layers in all the schemas in the database. Every version of SDE contains changes and additions to the schema. When we migrated the SDE schema we infect migrated all of the metadata only the layers in our database, so all the layers are now registered as they were in the source db. This saves us the need to deal with exporting the layers, one by one, and then import them again. We have to remember that when we migrated all the regular schemas, They contain the S/F table with the same numbers as in the source database, so by migrating the SDE schema we don't have to worry about that.
Now, we have an SDE schema in the new database, but it's a schema in the structure of the 9.1-9i version. So now we have to upgrade it to the 9.2-10g version schema. In order to do this we need to run the Post installation of SDE 9.2 with the instructions of an upgrade. They contain the following command :
sdesetup -o upgrade -d ORACLE10g -u <sde user name> -p <sde password>
This command does that exact trick - it upgrades the SDE version to 9.2 - 10g.
That's it. Works like a charm.
I have to note a drawback to this solution : It completely erases the destination database. Currently there is no option to merge the two SDE databases that contains also non-geographic data and other database objects - packages, sequences, etc... . All the exporting tools I found in ESRI's toolkits, and other toolkits, can not perform this successfully. I hope that a solution will be devised by the geodatabase team at ESRI.
An old/new extension to VS2008 has been released on Friday, in the Visual Studio Gallery : PowerCommands. It is the replacement of CoolCommands, and contains most of it's features and new features like :
- Copy/Past class.
- Transform templates
- Remove and sort Using's
- etc...
There are a couple of missing, but important features like : Demo Font and Wheel font zooming. For the full feature list and download go to PowerCommands at Visual Studio Gallery.
PowerCommands was created using the Visual Studio Extensibility framework (VSX), which is part of the VS 2008 SDK. This framework is used to create extensions to visual studio 2008.
BTW, if you installed CoolCommands 4.0 in your VS2008, I suggest you uninstall it (If you don't there will be duplicates of some menu entries - like "Open Project Folder"...) :
- Open Visual Studio Command Prompt (On Vista run as administrator).
- Navigate to the CoolCommands folder in your computer.
- Run the following commands :
regasm /unregister CoolCommands.dll /Codebase
regpkg /unregister CoolCommands.dll /root:Software\Microsoft\VisualStudio\9.0 /Codebase
devenv /setup
In my last post I described how to create extensions to ArcGis products.
After we've finished developing to tools and commands we want to deploy them to our clients.In the development computer, the tools are registered to ArcMap when we compile the project. Now we want our clients to have access to the tools. So how do you do this ?
There's a simple checklist of things you need to do in this ESRI article. Follow it and you will create a msi which you can deploy to your clients.
Have fun
ESRI's desktop products can be extended by adding tools and command buttons integrally into the environment. This can be done by using VBA inside the products, or creating controls in .Net using the .Net ADF that's supplied with the product installation.
In order to create a custom command/tool you need to install the desktop products, and the .Net SDK for them. After the installation, new templates are added to visual studio.
To start creating the tool follow these steps :
- Open visual studio.
- File -> New -> project -> Visual C# -> ArcGis -> Desktop -> Class Library (product - ArcMap,ArcCatalog,etc...)
- Select Assemblies to reference (If you don't know you can return to this selection by right click on the references icon under the project -> Add ArcGis reference).
Now you have a project that can contain the new controls for the desktop, and it's time to create a new control. There are several types of controls you can create : command,tool, dockable window, etc...
The difference between command and tool is :
- A tool receives input from the environment, like mouse events. For example : Zoom-in is a tool. A tool stays selected until you chose another tool.
- A command is like a button. You click on it and something happens. For example : Full-extent is a command. Command does not effect the selected tool, and after you click a command, if a tool was selected before it will stay selected after the command preformed.
Ok. Lets create a simple tool for ArcMap that will display coordinate on which we clicked with the mouse. In order to do this, create a project of type Class Library (ArcMap) as describe earlier and add the assemblies : Display,Geometry,ArcMap. Then right click on the project -> New class -> ArcGis -> Base tool. Now selected ArcMap as the target product. As you can see a new class was generated :
- It derives from BaseTool which is the base class for tools. There is also BaseCommand for command.
- It contains methods for COM registrations. Because the all of ESRI's products are COM based, you need to register the control for COM usage. For this you need the GUID attribute on the class. These methods are triggered when you build your projects. You can also trigger them with an installer (when you deploy the tool as an MSI).
- The constructor contains several initializations. You can set the caption on the tool,tooltip, bitmap - for icon on the button, and more important : In which category the tool will be placed (We will go back to that later).
- Overrides for the events the tool can handle. You can see there are, among else, mouse events.
Set the variables in the constructor to the following values :
base.m_catagory = "YsA tools";
base.m_caption = "Show position";
...
base.m_name = "YsATools_ShowPosition";
In the OnMouseDown event, write this code :
IPoint point = m_application.Display.DisplayTransformation.ToMapPoint(X,Y);
MessageBox.Show("X : " + point.X + ", Y : " +point.Y);
In order to use the tool do the following :
- Build the solution.
- Open ArcMap.
- Tools->Customize
- In the category list chose the category you set in the constructor - "YsA Tools".
- Search for the tool "Show position" in the commands list, and drag it onto one of the toolbars.
- Close the dialog box.
- Click on the tool button. As you can see it stays active.
- Click on the map. A message box will popup and display the coordinates on which you clicked (in decimal format).
This is a very simple example. You can do a lot of things in these controls - open forms and receive user input, use ArcObjects to perform geographic operations, etc... The sky is the limit.
One of my tasks in our last block was to create a search box for a large value tree. For the implementation we (my team leader Doron and I) decided to use the AutoComplete extender from the Ajax Control Toolkit. While implementing, we ran into a couple of problems :
Problem :
I want the completion list to be right-to-left (for Hebrew input).
Solution :
- Set the CompletionListItemCssClass and CompletionListHighlightedItemCssClass.
- In both CSS classes insert the following attribute :
- DO NOT set this attribute in the CompletionListCssClass - it will cause the completion list to indent unexpectedly.
Problem :
When an error occurs in the completion list web service, there is no indication for it.
Solution :
Our solution was pretty simple : Warp the web service method content with try-catch and log the error. You can use other solutions (like AOP - with attribute on the method), but this is only a partial solution. In all solutions, the client has no idea that an error occurred. The only indication for it is that the completion list does not appear. I hope this will be fixed in the upcoming versions.
Problem :
I want each item to have a key assign to each value.
Solution :
This was not possible in the earlier versions of the toolkit. Today this is possible, be using the the OnClientItemSelected event. For the complete solution, check this out : http://blogs.msdn.com/phaniraj/archive/2007/06/19/how-to-use-a-key-value-pair-in-your-autocompleteextender.aspx
That's about it.
P.S.
Shani and his team made the usage of the web service for the AutoComplete more generic. I will be very grateful if he will add a couple of word about it (That means that you, Shani, are tagged - have fun)
In our project, we have two users in the database : applicative user and strong user. The strong user is the owner of all the objects (tables,layers,sequences, etc...) and the applicative user has only limited privileges for the object in the strong user.
When creating a new database table, you only have to run the grant SQL command on the table to give the access privileges to the app user. When creating a new layer, you just can't only give privileges to the table which represents the layer, because when creating a layer, the features are held in several tables (s,f,a,d tables). It's a bit difficult to use the grant command for each of these tables.
So, in order to grant privileges to a layer you can :
- Use ArcCatalog built in command : Right click on the layer in ArcCatalog -> Privileges -> Select the privileges and enter the user to which you want to grant the privileges -> OK.
- Use the 'Change Privileges' tool in the ArcCatalog toolbox.
- Use the sdelayer command : From the command line in your SDE server use the following command :
sdelayer -o {grant | revoke}
-l <table,spatial column name>
-U <user>
-A <SELECT,UPDATE,INSERT,DELETE>
[-i <service]
[-s <server_name]
[-D <database]
-u <DB_User_name>
[-p <DB_User_password>]
For example : suppose we have a layer names streets_g. In order to grant select privileges to our app user we will use this command :
sdelayer -o grant -l streets_g,shape -U appUser -A SELECT -u strongUser -p password.
All the above options are good. For installations I recommend to create a script which contains the sdelayer command for each of the layers in your database, or creating a model using the ArcCatalog toolbox does the same thing , but uses the toolbox 'Change Privileges' tool.
Last Sunday, my team organized a lecture day for the .Net development teams in our company. It was great. We presented 3 topics :
- Monitoring memory in .Net applications - By Roy Dallal (I hope I got the name right :) )
- Introduction to WPF - By Doron Yaacoby
- Introduction to Guidance Automation - by your truly
In my lecture I presented the GAX/GAT framework (by Microsoft Patterns and Practices).
So as promised, I attached the presentation and the demo I did in the lecture : adding WCF contract attributes to an entity class and creating a singleton from template.
In order to run the demo you need :
- Install GAX
- Install GAT
- Install the Software Factories Toolkit
- I recommend to install the t4 editor - so you can see the templates more clearly.
Also, the demo contains a document which explains how to run the examples.
Have fun
Last week I posted the CSS Challenge. I got some great responses, but unfortunately they were a little problematic. I'll explain :
- The first solution by Ohad, was this page. The problem with this solution was the "bottom" div. It created the bottom margin for the red panel. But suppose the red panel is a container which contains a grid and a scrolling div. The grid needs to be contained inside the panel. But because the size of the red panel contains the size of the margin, the bottom of the div with the grid will be hidden by the "bottom" panel.
- The second solution by Alex, was this page. It worked like a charm. But it doesn't apply to IE6 browsers - it simply doesn't work on them.
So, I'm refining the definitions of the challenge :
- You need to create this design using CSS classes only.
- Each panel can be a div or asp.net panel control.
- The panel should adjust automatically when the window resizes - the white panel should always cover the browser content.
- You can not use CSS expressions or JavaScript.
- No scroll bars are shown.
- The margins between the panels will always be 10 pixels.
- Each div is suppose to be a container for items. That means that if I add a div inside one of the panels and set it to 100% height and width, it will occupy the entire panel, with nothing to hide parts of it.
- The solution must work on IE6,IE7,firefox.
I dare you to try...
More Posts
Next page »