After working with scrum for a while and watching this debate of time vs story points I came to a personal conclusion that helped me to make better estimations and use the story points at their best value.
In my opinion story points best measure risk. You estimate this risk taking into account your proficiency, overall experience and the expertise in the technology, the project and it's business, the dependencies involved that you need to rely on to move forward (could be external systems/teams, business analysts, other people availability) and your average capacity of solving problems in a given time.
So when it comes to estimating a user story you should ask yourself:
“what is the risk of this story?”
I would categorize the risk vs story points as follows:
1 point - Virtually no risk, insignificant work doable in a very short time
3 points - Extremely low risk, know all about it can do it quickly, probably a matter of 1-2 hours
5 points - Low risk, know most about what I need to do, probably can fit in few hours to one working day
8 points - Medium risk, know quite well about what I need to do, I might have some unexpected obstacles and maybe some dependencies on other (external) resources, but I am confident I can do it in 1-3 days.
13 points - High risk, there are aspects about I have no idea on how to tackle, have external dependencies about that I am worried, it might take half of a sprint to get it done.
21 points - Highest risk, I have right now no knowledge about the subject and no idea of how to do it, there are lots of dependencies on other (external) resources that I cannot manage, I am not sure I can solve it in a sprint so that story becomes demoable. Then you should ask yourself: is this really a good story or rather an epic? Shouldn't it better go into a research spike first so that we gather more knowledge about how to do it?
However, when you estimate always take into consideration collateral aspects such as unit/functional/integration test writing (that can take as much or more than time need to code functionality), team communication, code reviews and other things that should be part of your development process.
What do you think?
Cheers,
Dikran.
Friday, October 5, 2012
Scrum and Story Points, what's the story?
Labels: java, quartz
scrum
,
story points
Tuesday, September 25, 2012
Always Elevated Privileges in Windows 7
As a developer I usually need to execute lots of commands and programs that require administrative privileges. Although my Windows user is in the Administrators group I always needed to do "Run as administrator" on command prompt, text editors and other applications that required privilege elevation, even if they were created by me or by programs that I launched!
After digging a little through Windows permissions system system I found out that in order to improve security and minimize virus propagation risks, the windows team has decided that even if you are in the administrator group, and even if you are the Administrator, there is better to explicitly grant yourself the rights to do elevated privileges in an interactive way, so that underground malicious programs would not be able to go through without you knowing this.
That said, I am quite sure that an experienced user can do fine even without this kind of assistance, especially in corporate environments where almost everything is filtered and secured.
So, to grant yourself elevated privileges without prompt you need to:
1. open security policy configuration, by typing in the command prompt:
%windir%\system32\secpol.msc /s
A window titled "Local Security Policy" should open as below:
2. Navigate to the Security Options node:
3. On the right side click on the "Policy" table header at the top to order alphabetically the entries so that you shall have all entries starting with "User Account Control" easy to spot.
4. Select the entry called "User Account Control: Run all administrators in Admin Approval Mode":
5. Here it is all. When activated, this option instructs Windows to ask for your permission every time when elevated privileges are required, even if you already own them. Double click on the entry and set this option to Disabled. It will require you to restart Windows in order to get effective:
As a bottom line, be sure that you know what you are doing, as this will downgrade your system's overall security.
Good luck!
After digging a little through Windows permissions system system I found out that in order to improve security and minimize virus propagation risks, the windows team has decided that even if you are in the administrator group, and even if you are the Administrator, there is better to explicitly grant yourself the rights to do elevated privileges in an interactive way, so that underground malicious programs would not be able to go through without you knowing this.
That said, I am quite sure that an experienced user can do fine even without this kind of assistance, especially in corporate environments where almost everything is filtered and secured.
So, to grant yourself elevated privileges without prompt you need to:
1. open security policy configuration, by typing in the command prompt:
%windir%\system32\secpol.msc /s
A window titled "Local Security Policy" should open as below:
2. Navigate to the Security Options node:
3. On the right side click on the "Policy" table header at the top to order alphabetically the entries so that you shall have all entries starting with "User Account Control" easy to spot.
4. Select the entry called "User Account Control: Run all administrators in Admin Approval Mode":
5. Here it is all. When activated, this option instructs Windows to ask for your permission every time when elevated privileges are required, even if you already own them. Double click on the entry and set this option to Disabled. It will require you to restart Windows in order to get effective:
As a bottom line, be sure that you know what you are doing, as this will downgrade your system's overall security.
Good luck!
Wednesday, May 4, 2011
Tailing log files over SSH in Windows
My problem: I wanted to be able to track logs on Unix machines using BareTail or something similar.
Until now the only solution was to use putty and log console output into a local file, then open it with BareTail.
Disadvantages: for each log file had to open another putty.
Solution:
Dokan SSHFS (SSH File System)
It's a file system mapping application that allows a remote file system map to a Windows local drive.
After I installed the one I could open all 6 log files with baretail as if it was on a
local drive (N).
Installation Steps:
1. Install the NET 2.0 Runtime;
2. Install the Visual C++ 2005 Runtime;
3. Install the Dokan library 0.6
4. Install the Dokan sshfs 0.2;
5. Download the Dohan sshfs 0.6;
6. From 0.6 zip copy DokanSSHFS.exe and DokanNet.dll over the files installed by the 0.2 installer. This is because there is no yet an installer for the 0.6 version;
7. Run DokanSSHFS.exe then choose the remote path, username and password, and choose the letter for windows drive to be assigned;
8. In the options tab to check the cache disable;
9. Click on CONNECT
From this moment you have a new drive in Windows where you can work normally with explorer, BareTail, etc. plus an icon in the Windows taskbar that allows mount/unmount on-the-fly
I hope you will find this useful.
Update:
There is an excellent log viewer called LogExpert that can directly use tailing over sftp on *nix servers. In my opinion this is the most complete log viewer at least for Windows: highliting, regular expression filtering in a separate panel, columnizers and a lot of other useful stuff. Try it with confidence.
Good luck!
Dikran
Until now the only solution was to use putty and log console output into a local file, then open it with BareTail.
Disadvantages: for each log file had to open another putty.
Solution:
Dokan SSHFS (SSH File System)
It's a file system mapping application that allows a remote file system map to a Windows local drive.
After I installed the one I could open all 6 log files with baretail as if it was on a
local drive (N).
Installation Steps:
1. Install the NET 2.0 Runtime;
2. Install the Visual C++ 2005 Runtime;
3. Install the Dokan library 0.6
4. Install the Dokan sshfs 0.2;
5. Download the Dohan sshfs 0.6;
6. From 0.6 zip copy DokanSSHFS.exe and DokanNet.dll over the files installed by the 0.2 installer. This is because there is no yet an installer for the 0.6 version;
7. Run DokanSSHFS.exe then choose the remote path, username and password, and choose the letter for windows drive to be assigned;
8. In the options tab to check the cache disable;
9. Click on CONNECT
From this moment you have a new drive in Windows where you can work normally with explorer, BareTail, etc. plus an icon in the Windows taskbar that allows mount/unmount on-the-fly
I hope you will find this useful.
Update:
There is an excellent log viewer called LogExpert that can directly use tailing over sftp on *nix servers. In my opinion this is the most complete log viewer at least for Windows: highliting, regular expression filtering in a separate panel, columnizers and a lot of other useful stuff. Try it with confidence.
Good luck!
Dikran
Saturday, October 10, 2009
How to know when Java Virtual Machine is shutting down
The question is: why would someone need to know such thing?
You already have the jdk's
Well, I would have asked the same thing if I didn't experience an unusual situation.
(For the inpatient reader that wants to skip the story, you can jump directly to the answer)
I was working on a complex web aplication that was running in a jBoss/Tomcat container. We needed a clean server shutdown in order to release the resources (connection pools, sockets, temporary files, etc). At a certain moment the team members noticed that the undeploy operation worked well while the majority of the shutdowns (but not all) were hanging at a certain point. The displayed reason was a strange exception raised from the AWT thread:
We could not understand why the exception would come from the AWT as we were not using at all the AWT in our application... Or at least we didn't know it... However, who was calling the
After digging around the problem I discovered that, indeed, we were using AWT, although indirectly, by using a reporting engine. And that reporting engine was using classes of AWT to do it's job. The reporting library that we were using was packaged as a Struts plugin. The plugin's contract is simple: Struts calls the
So what? you may say. This is the normal way to do such things.
Yes, only that, in this particular case, unless you used the reporting feature while working with the application, the reporting engine was not initialized until shutdown. So, at server's shutdown, Struts was calling destroy on all it's plugins and at his turn the reporting plugin, inside it's
Ok, but why? It's just a class instance that does something within itself! What might drive it to crash all the system?
Well, the nice part is just coming. So, we have a system shutdown and a Struts plugin called that is instantiating some class that uses some AWT elements inside. It does not look like something to be scared of... Only that there is a catch: when a class AWT is instantiated, the AWT Toolkit itself adds a
Some people consider that this behavior inside AWT is a bug, because AWT should check itself if the JVM is shutting down before attempting to add its own
Ok. now, we found the reason why all happened. What next? I evaluated three possible solutions:
- to add a generic thread exception handler and simply "swallow" this exception.
- to add a myself a
- to detect (inside the destroy method in the plugin) if the virtual machine is shutting down and skip calling the reporting initializer.
The solution I chose was the last, because the generic thread exception handler couldn't prevent the exception to happen, and for the second option, the order in which JVM calls the
So I made some research to see if I may possibly know at any time if the Java Virtual Machine is shutting down. I discovered that when
I would not advise anyone to use this on a daily basis unless he is exceptionally needing such a solution, primarily because:
- the
- In public distributions there is a chance that the
I hope that you enjoyed reading this post and I am waiting for your comments.
Greetings,
Dikran
P.S. Thanks to Alex Gorbatchev for his excellent SyntaxHighlighter.
You already have the jdk's
Runtime.getRuntime().addShutdownHook()
method that adds your thread to be called when the jvm is shutting down. So why another way?Well, I would have asked the same thing if I didn't experience an unusual situation.
(For the inpatient reader that wants to skip the story, you can jump directly to the answer)
I was working on a complex web aplication that was running in a jBoss/Tomcat container. We needed a clean server shutdown in order to release the resources (connection pools, sockets, temporary files, etc). At a certain moment the team members noticed that the undeploy operation worked well while the majority of the shutdowns (but not all) were hanging at a certain point. The displayed reason was a strange exception raised from the AWT thread:
Exception in thread "AWT-Windows" java.lang.IllegalStateException: Shutdown in progress at java.lang.Shutdown.add(Shutdown.java:81) at java.lang.Runtime.addShutdownHook(Runtime.java:190)
We could not understand why the exception would come from the AWT as we were not using at all the AWT in our application... Or at least we didn't know it... However, who was calling the
Runtime.addShutdownHook()
and why was it driving to a jvm crash?After digging around the problem I discovered that, indeed, we were using AWT, although indirectly, by using a reporting engine. And that reporting engine was using classes of AWT to do it's job. The reporting library that we were using was packaged as a Struts plugin. The plugin's contract is simple: Struts calls the
init()
method at startup and the destroy()
method at shutdown, on all the registered plugins. The plugin's control class was a singleton that was simply redirecting the destroy()
calls to it's internal methods. Of course, after creating an instance of itself.So what? you may say. This is the normal way to do such things.
Yes, only that, in this particular case, unless you used the reporting feature while working with the application, the reporting engine was not initialized until shutdown. So, at server's shutdown, Struts was calling destroy on all it's plugins and at his turn the reporting plugin, inside it's
destroy()
method, was calling ReportsInitializer.getInstance().shutdown()
. And... Boom! JVM freeze.Ok, but why? It's just a class instance that does something within itself! What might drive it to crash all the system?
Well, the nice part is just coming. So, we have a system shutdown and a Struts plugin called that is instantiating some class that uses some AWT elements inside. It does not look like something to be scared of... Only that there is a catch: when a class AWT is instantiated, the AWT Toolkit itself adds a
ShutDownHook
to the Runtime
. I haven't yet dug inside to understand why. But, as java specs state, it is illegal to add a ShutdownHook
  if the JVM shutdown sequence has already started.Some people consider that this behavior inside AWT is a bug, because AWT should check itself if the JVM is shutting down before attempting to add its own
ShutdownHook
.
Ok. now, we found the reason why all happened. What next? I evaluated three possible solutions:
- to add a generic thread exception handler and simply "swallow" this exception.
- to add a myself a
ShutdownHook
and set some flag on the reporting reporting plugin not to instantiate anymore the reporting initializer.- to detect (inside the destroy method in the plugin) if the virtual machine is shutting down and skip calling the reporting initializer.
The solution I chose was the last, because the generic thread exception handler couldn't prevent the exception to happen, and for the second option, the order in which JVM calls the
ShutdownHooks
is not guaranteed, so you'll never know if it will be called before or after the Struts's own ShutdownHook
, making of the solution a non deterministic one.So I made some research to see if I may possibly know at any time if the Java Virtual Machine is shutting down. I discovered that when
java.lang.Runtime.exit(int status)
is called, it forwards the call to a class named java.lang.Shutdown.exit(int status)
, that calls all the ShutdownHooks
before calling the native halt()
method. Inside this class there are fields describing the state of the system. Unfortunately the class is private package and there is no public method that returns the System's state. But luckily, in Java we have the blessed reflection. So, here comes the answer:private boolean isSystemShuttingDown() { try { Field running = Class.forName("java.lang.Shutdown").getDeclaredField("RUNNING"); Field state = Class.forName("java.lang.Shutdown").getDeclaredField("state"); running.setAccessible(true); state.setAccessible(true); return state.getInt(null) > running.getInt(null); } catch (Exception ex) { ex.printStackTrace(); return false; } }
I would not advise anyone to use this on a daily basis unless he is exceptionally needing such a solution, primarily because:
- the
java.lang.Shutdown
class is a package private class in the JDK and it may be changed or removed in any upcoming release. Of course, for custom built projects, that usually run for a long time on a single jdk version this is not such a big issue.- In public distributions there is a chance that the
SecurityManager
is set to forbid the access to jdk internals. But again, inside custom projects you can configure your own SecurityManager
.I hope that you enjoyed reading this post and I am waiting for your comments.
Greetings,
Dikran
P.S. Thanks to Alex Gorbatchev for his excellent SyntaxHighlighter.
Subscribe to:
Posts
(
Atom
)