Thursday, May 29, 2014

Buggish: Lost Permission to Page when I had Edit Rights (Confluence 5.1.5)

I used my 1-on-1 call with my boss to finally give him some time to give permission to the rest of our team access to restricted pages that I created for our team only. I had originally was able to view and edit the page just fine. After our meeting, I realized that I no longer had access to the page. I checked with my coworker, and he now had access.

This was bizarre. Of course, I let me boss know. He tried a couple things. None of them worked. When we finally gave up messaging back and forth, he shared his desktop. I then saw that I was in the list, as I was before. Then we realized that I lost the restrictions when we added the others.

I did not want to waste any more of my boss' time so, I speculate that we had access before because there were no other restricted users. Once the restricted users were added, we lost access to the view rights. I am assuming that I still had edit rights. In theory, I could test this by keeping a link to the edit page of the restricted page.

In conclusion, users with edit rights has view rights automatically if there are no restricted viewing rights. Users with edit rights lose the viewing rights once there are other users with viewing rights. Thus users with edit rights has to also be added to the viewing rights list.

Food for thought, are there any cases where I would ever need edit rights but not viewing rights? I would still see the content when editing the page.

Review: SharePoint 2010 for Dummies by Vanessa L. Williams

I have just started to really sit-down and learn SharePoint Designer for the past week. Prior to this, I have just been an end-user. Unfortunately, a project has been transitioned to me which requires me to configure SharePoint. I have bought the SharePoint 2010 for Dummies by Vanessa L. Williams. So far, the book does a great job in getting me started.

For the purposes of my project, I think there were a lot more advanced 'techniques' that are not covered in the book. Google has been sufficient in those areas. Most of the time, I learn that SharePoint cannot even do whatever I need. There is also a section for forms that require InfoPath which I do not have access to, so I do not have much to comment on that part. I also do not have enterprise, so the last sections are rather useless to me.

Overall, this is a good introduction book. I was able to grasp a lot of the SharePoint terms that made it much easier to search on Google. The way they designed the architecture of SharePoint is not very intuitive for a developer. It may actually be a bit more intuitive for a non-developer, because I spent a lot of time trying to figure how to join lists and figuring the limitations to web-parts.

I should also add that this book is more useful for those who only have access to the Designer. If you are looking for a SharePoint server reference, this is not the book. There is another For Dummies series that cover that, "SharePoint 2010 All-in-One For Dummies". At least this is what appeared to be more server-related when I skimmed through it at Barnes & Nobles. I think it had both coding and admin maintenance, but more on the latter. The all-in-one version does not help at all with the Designer.

Work Life: SharePoint 2010 - Creating Workflow Error

The list of workflow actions on the server references an assembly that does not exist. Some actions will not be available. The assembly strong name is Microsoft.Office.Workflow.Actions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c. Contact your server administrator for more information.
For me, I had to restart my SharePoint Designer which fixed the problem. My guess is because I opened it yesterday and left it open overnight. My VPN disconnected as usual when my machine goes to sleep-mode.

Here's another site that looked promising, but appears to require access to the server:
http://sharepoint.stackexchange.com/questions/68769/sharepoint-2010-sharepoint-designer-notification-the-list-of-workflow-actions



Monday, May 19, 2014

Review: Google AdSense (@4000 page views)

I will be reaching 4000 Google AdSense page views within the next couple days. I have so far accumulated 5 paid clicks. None of the data in the table seem to add up to the amount shown in payments. CPC and estimate seems to have some correlation but the totals do not add up. I also had a click in December but there are not transaction payment for that month.

Last month, I had switched the ad placement to be included below the articles. This seems like it created additional click for April but my volume is too low to really make any sort of analysis. Also, I do not have any clicks for this month so that goes against that analysis anyways.

Hopefully, I'll have more update at 8000 page views.

Note

Please do not click on the ads unless you are intentionally interested in the ad (per Google's terms of use/service). I am not blogging for income. I am just analyzing the service. TIA

Wednesday, May 14, 2014

Review: Google+ Events (You don't have access to this event)

Me trying Google+ Events for the first time

Setup

The set up is pretty easy although it took me a few scans to find the events option (since I rarely use Google+). Once there, I just click on Create Event then fill out the information.

Information can all be edited later and the same for the guest list.


Accepting Invitation

Quickly, a guest did accept the invitation. I had also sent an invitation to one of my test accounts. Here I faced a problem and received an error "You don't have access to this event" even though I can view the event.

I then noticed that my test account is not on Google+ yet, so I went ahead and registered that. I'm not sure if this is what caused the problem or not, or even part of the fix. This may or may not have played a role in this issue.

So, I attempted to delete the test account but this only seems to block the user. With the test account, I will get that I no longer have access to the event. So I returned back to the main account and re-invited the test account. The test account still has the same problem.

Oddly after attempting several more times through the event page or from the email, I noticed that I had something in my notifications. I clicked on that bell-looking icon, and the event was also published there. I clicked on that and there was another form for yes, maybe, or no. From this form I was able to submit a response.

Once I did that, I returned back to the event page to change but still received the same error. I tried the email form, and that now allows me to change the response. I closed the event page and reopened from the email and now appears to work even from the events page.


Rejecting Event

Rejecting an even will remove the event from "Your events". I am not sure if there is a way to view a list of events that you responded with a no. I reopened the event from the notifications bar. I assume you can also do the same from the email. I am not exactly sure how you would manage this easily if you want to change your response.

Messaging

Very standard forum-like message board. Messages are only shared within the event.

Messages can be edited by poster and moderator.

Compared to Evite

The only other invitation managing site that I've used before was Evite (but only as a invitee). Evite seems to have a few more other "fun" features like changing the yes, maybe, and no responses. It also appears to have more themes. I am not quite sure how Google+ Events is for non-Google users, but should be rather uniform for Evite which should be agnostic to your email provider.

Thursday, May 8, 2014

Life: Managing Expectations

For some reason, I do not seem to as stressed as many of my coworkers in managing other people. On the other end, very few people ever give me problems either. I attribute this to managing expectations. I also think this strategy is a great anti-political move because it is very difficult to manipulate the truth.

Recently, I have been thinking about happiness. For me, I like to separate happiness from joy. My current goal in life is to be joyful. To me this is something like contentment but in a good way, not in an apathetic way. Happiness is good but temporal.

I rarely have problems of being upset for long periods of time. For me, long period is at most an hour. Perhaps, I can attribute this to my ability to just forget things. I have been thinking that this may just be my natural way to managing my expectations.

I think stressed people dwell too long on trying to obtain happiness and avoiding unhappiness. I do fall into this, but at some point, I take a step back and reevaluate the situation. The feeling is very much similar to when I am highly competitive. The focus is not avoiding the obstacle but conquering it. By figuring how to conquer the obstacle, I accept that it exists and is a part of the game (i.e. in life).

So to continue my journey to a joyful state, I accept that there will be problems and I just need to be prepared to tackle them, as opposed to, preventing them from happening. Preventing something that is likely to be inevitable can be extremely stressful (unless you are seeing the act of "preventing happiness" to be the challenge). 

The journey is not simple but does not have to be stressful. I did make it sound much simpler than it really is because some coworkers still struggle with it and just needs a friendly reminder. As I try to work on my expectations, I find more and more things that I do unconsciously that has made the journey challenging.

I have always been terrible with pop-culture. I have not cared much about remember author names, restaurant names, or many other information that just seemed so irrelevant to living life. As long as I took in what I enjoyed from the books, movies, and food, I did not need to remember who produced it, who cooked it, or who sung it. But this mentality is one of my roadblocks.

Although the roadblock may be irrelevant to me, it is relevant to other people. If I care about being with other people, it should be relevant to me too. This does not mean this will always be the case for any generation or era. There could be a time where everyone is like me, then it can be irrelevant. But, we are in a very highly diverse world. So, I have to accept that I should know names to places I go so that I can communicate such things. 

(Side story - Friends do not seem to like directions to places as much for some reason. For some reason, I do remember where things are. For example, I once described that a restaurant was on a block that was 2 blocks east and 1 block north of a subway station, and 3 stores from the corner. And I ate there about 3 years ago... still cannot remember the name.)

I remember that story rather vividly because it was during this time that I need to change the way I look at pop-culture information. This conversation resonated with me because the person I was trying to explain this to was terrible with directions (in some ways remembers the exact opposite information as I do). 

I just do not know what it is with me and names. I have improved a lot about remembering people's names, especially the ones I meet for the first time. I used to remember most of them by the order that I meet people or where I met them. But I am still a long ways though. I was just at an interview, and I really struggled in trying to remember the company name. But in the last example, I was able to remember everyone's names so it may have just been that the company name was too unfamiliar and long for my brain.

(Side story - For some reason, I have a lot of trouble remember long numbers like a 10 digit phone number. I have actually try to experiment this a couple times and it is still very bizarre to me. For example, I start to struggle with 5+ digits. But I have learned that I really struggle with 5+ numbers. If there was a way for me to bundle numbers, then it becomes much easier for me to remember numbers. By bundle it can be as simple as just reading it as a 2-digit number like 10 instead of 1 and a 0, or 100 instead of 1, 0, and 0. So, I can remember numbers like 800-800-8888, or more complex like 887-886-8885 which I remember was all 8s except last digit which starts with 7 and decreases by 1. It is just crazy how my brain can remember that instead of just the plain numbers.)

Sunday, May 4, 2014

Review: Refrigerator, Washer, and Dryer (General and Maytag)

I purchased a refrigerator, washer, and dryer not too long ago. Overall, I am rather happy with my purchase.

Refrigerator

I purchased a bottom-freezer refrigerator (MBF2258XEB6). I like the idea of having the freezer on the bottom since I use it much less often. My freezer is the type that pulls out. I think this is much less efficient than have a regular door because all the code air will just be pulled out too (assuming that air is difficult to keep at a low temperature). Personally, I still this better than the traditional top freezer. I did not realize there was an automatic ice-maker. I would have personally went without it as it takes up space (which was the reason I did not go with the side-by-side refrigerators).

I like having extra width which allows me to put pizza boxes and pots directly into the refrigerator without having to repackage them into smaller containers. I do really like the French door fridges but they are just ridiculously more expensive.

CON

There is one problem that does not bother me, but my mother just complained that the freezer drawer is heavier to open than a regular door. There is not much in my freezer either, so it could potentially be heavier to open when it is full. 

Washer

I purchased a high efficient washer (MVWB880BW0). I did not know what high efficient was prior to purchasing this so I put in quite some time reading when I went through the instructions because it requires different detergent than a normal traditional washer. There were a couple articles that stated that the regular detergent can be used, but overall it seems people still recommended the high efficient detergents. Well, I did not want to ruin the new washer so I played it safe by going with HE detergents which is slightly more expensive. I use less detergent so the container (same size as normal detergent) will last longer. 

To me, my clothes do feel much cleaner than before. There are many factors to this though. This is a brand new washer. The washers I have used in the past were old traditional washers (enphasizing "old" as in more than 5 years, maybe 10).

This could be a little "complicated" for people who do not adapt to change easily (for example, my mom). Although it is as easy as putting the clothes in, put in detergent, then press start, my mom was watching the washer the other day. She panicked when she realized the washer does not fill in enough water (which is normal, as stated in the instructions). She powered off the washer.

CON

I am going to segue to the cons here because this is where I found the first problem (to me). If you power off (by pressing the power button), it turns off the washer (obviously). The problem is when I turned it back on, my only option seems to only redo the entire cycle. There did not seem to be a way to continue from where it continue where it last stopped. There is a pause button that does exactly this, but not everyone seem to enjoy reading the instructions prior to use. 

Dryer

I purchased a high efficient dryer (MEDB880BW0). To me this seems very standard to me. It is nicer with a more digital controls than the standard knobs. I have no problems with the dryer.


Friday, May 2, 2014

Life: Blogger April 2014 Stats

Google Analytics

Sessions = 321

Google Webmasters

Total Queries = 259
Approximate Impressions = 12400
Approximate Clicks = 455

Google AdSense

Page Views = 748
Clicks = 3

Blogger

Pageviews Last Month = 1275
All Time Comments = 38
All Time Posts = 201
All Time History Visits = 18144

* Approximations are rounded down

Thursday, May 1, 2014

Work Life: Enterprise Release Management for Hardware Dependent Solutions

I see a greater need for release management. Now with agile development becoming more of the norm for corporate/enterprise level solutions, there is even more need to validate what is going out into production.

To me, the main driving force is because software solutions have finally deviated (in my opinion) from the traditional workflow of hardware development, a very traditional waterfall model. Even with agile development, agile also follows a very cyclical version of the waterfall model.

In the past, software was deployed in its own instance at a client system. Thus each client can be on different versions thus maintaining an overlapping waterfall model if one was to build a model on an instance level. In other words if we tracked each individual client, we can create a waterfall for that client even though the SDLC will be shared among the clients with the same version.

But with introduction of cloud, now there is only a single solution or a single client install that everyone shares. Add this to a corporate/enterprise level, you have many development cycles that need to be deployed to a single instance.

With a single instance, a software company can no longer just push out changes whenever they want to. Planning and scheduling is also more complex. Basically, software releases now must follow a more traditional waterfall process while software development is moving towards a more agile process. There are two bottlenecks in an enterprise cloud solution: system testing and production deployment.

System testing has to continuously run regression testing, but as enterprise solutions grow larger, regression testing becomes longer and longer. When regression testing starts to get around 2+ weeks to complete, this becomes a major bottleneck for changes to be deployed within a normal agile schedule.

With more components, there are also more defects. More defects means more emergency change windows. With more change windows, there are more regression test needed. Not only do changes become longer, but they also become more frequent.

A simple solution for non-hardware dependent solutions, is to create more replications of the production environment. This allows multiple regression testing to overlay. Although this does not help with decreasing the cycle time, it allows a higher frequency of deployments into system test.

Putting all the changes into a single "patch" can alleviate a lot of stress on deployment but adds stress to production support. With more changes, it becomes more difficult for production support to know the source of the problems whether it already existed or coming from one of the other changes. By isolating changes to only a few select changes, then a queue will build up.

Priorities also require different expectations and management when multiple changes are bundled together. If one of the changes is a high priority, but then a low level change fails in production deployment, all changes should be rolled back. General management must then make the decision to go with the change with a regression test that did not test that specific scenario or to roll back a high priority change that may delay other factors by several days if not weeks.

System test environment will be under even more stress than production because production only has to maintain the latest completed and tested code. System test has to maintain three different environments. In an enterprise level, this causes a lot of complications.

First, it is difficult to financially maintain three instances of relatively the same thing. One is needed for the latest major release, one to test emergency changes (aka point releases, patch releases, etc.), and last to be on the same version as production to replicate errors and bugs.

Second because there are three different environments, not all vendors are capable of existing in multiple instances on the same network much less different versions, etc. Then if you want to have different versions of a vendors application, then more labs will be needed.

Third, changes are coming from many different groups. Agile causes even more iterations to be introduced into system test. Eventually, a quiet period (aka code freeze, soak period, etc) is required to do a comprehensive regression test. Rarely will there not be an issue, then scheduling becomes an issue because quiet period is no longer possible to fix changes.

This does not even include all the politics that occur in enterprise level solutions, nor the management of defects across different groups, nor the different policies of different groups. There are also many things out of the control of process like OS maintenance updates, vendors no longer support older versions, bugs from vendors (ie Heartbleed), and so many other variables that interrupt a process that is already very stressed.

Evident of current software development and trending agile development, having more formal processes are nearly impossible to implement much less enforce. I believe there will be a greater need for skilled engineers and technical managers, because they are required to maintain processes that require less common abilities. Formal processes has corrupted the workforce with personnel that cannot keep up with the pace.

In corporations, processes have been so dummiefied (ie idiot-proofed) that people who can follow instructions call themselves engineers. These people are unable to keep up the changes. Sadly, they are so tenured and senior in the company, that they are also the source of the inertia to any change to the culture.

The age of corporations to make human resources a commodity is in the recession. This is why the technical sector has a need for "skilled" engineers yet unemployment still remains relatively the same. This is why small companies can take over corporations.

Returning back to the topic on release management, release management is needed to make sure that changes that are introduced in the different environments are maintainable. For example if there is a backlog of changes into production, new changes should not be introduced into system test. If they must, then dependencies must be evaluated. If there is a dependency, then many other factors must be considered.

Coding: Creating a Counter (MS SQL, C#) Samples

I probably create one of these for every one of my larger projects. I always have a need to track a counter of some sort.

My Standard Counter Table

USE [dbName]
GO

/****** Object:  Table [dbo].[__Counters]    Script Date: 05/01/2014 23:45:23 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[__Counters](
[CounterName] [varchar](50) NOT NULL,
[NextId] [int] NOT NULL,
[Notes] [varchar](max) NULL,
 CONSTRAINT [PK___Counters] PRIMARY KEY CLUSTERED
(
[CounterName] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


My Standard Stored Procedure

USE [dbName]
GO

/****** Object:  StoredProcedure [dbo].[GetCounter]    Script Date: 05/01/2014 23:45:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author: Douglas Lee
-- Create date: 5/1/2014
-- Description: Get next id and update for next use
-- =============================================
CREATE PROCEDURE [dbo].[GetCounter]
-- Add the parameters for the stored procedure here
@CounterName varchar(50),
@NextId int OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

    -- Insert statements for procedure here
--DECLARE @NextId int;
SET @NextId = 1;
SELECT @NextId = NextId FROM __Counters WHERE CounterName = @CounterName;
Update __Counters SET NextId = NextId + 1 WHERE CounterName = @CounterName;
RETURN
END

GO

My Standard C# Code

        public static int GetCounter(string CounterName)
        {
            SqlConnection conn = null;
            //SqlDataReader rdr = null;

            conn = new SqlConnection(c);
            conn.Open();

            // 1.  create a command object identifying the stored procedure
            SqlCommand cmd = new SqlCommand("GetCounter", conn);

            // 2. set the command object so it knows to execute a stored procedure
            cmd.CommandType = CommandType.StoredProcedure;

            // 3. add parameter to command, which will be passed to the stored procedure
            SqlParameter output = new SqlParameter("@NextId", SqlDbType.Int);
            output.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(new SqlParameter("@CounterName", CounterName));
            cmd.Parameters.Add(output);

            cmd.ExecuteNonQuery();
            int retInt = (int)cmd.Parameters["@NextId"].Value;

            conn.Close();
            
            return retInt;
        }