Friday, July 29, 2016

Resilience... Are you up for a small challenge?

Recently, inspiration has struck me with a word that my mind cannot escape: RESILIENCY


What does it mean to be Resilient?

I didn’t know the word until 10 years ago. Never heard it before.

According to the Merriam-Webster Dictionary it is: "the ability to become strong, healthy, or successful again after something bad happens"

For many of us Resilience might come in different, shapes, sizes and intensity, depending on our capacity to withstand obstacles in life and our philosophical bend.

And why am I thinking of this?

Well, The world is and always has been a very convoluted place.

In 40 long something years in it, I’ve contemplated my Grandmother tell me that yesteryears were better, and then my Mother who's now is the age that my Grandmother had when she told me that phrase, says the same thing… Nothing like the good old days.

But wait a minute, I was there… and things are clearly different now from my Mother and Grandmother's times, this means I am living the better times of the future RIGHT NOW. Nothing new here.

Let me give you a glimpse into it...

Where I live, the Economy is in turmoil, where I come from (different country) the standard of living is very, very, very bad…worse in comparison to where I live now.

Where I live, many have emigrated to other cities, states or countries… and I get it. Sometimes I am tempted to do the same. SERIOUSLY… With all the bad news that the “so called” media spreads everyday to sell more… I would run to the hills.

But here is the thing:

You have to believe in yourself and your ability to overcome obstacles.

No, no… I am not telling anyone not to do what they consider best for their future.

And that may be, moving to another place, staying, or something in between (when you have 2 places and you travel back and forth).

The choice is only yours (it always has been).

But after you make the decision wherever you are, REMEMBER: you depend on your faith in yourself to become strong, healthy, or successful again after something bad happens.

And it will depend on your personal situation:

You might not want to face the challenges of economical turmoil, so you move to new challenges, those that you feel that you can handle better… and that is fine.

Or you might live in a place where food and medication are scarce, and if you have the choice, you move to new challenges, that will require a HUGE adaptation, all for the sake of a better living.

Make no mistake... you will face challenges wherever you go.

You might choose or be forced by circumstances to stay where you are… that is ALSO fine.

In any of those cases you will face challenges and obstacles…

NOW, … Your attitude towards them will determine your resilience…

My Advice?

Don’t try to tackle all at once... for instance...
Example 1:
Money from your paycheck is not lasting as it did before, and you start to worry about the mortgage, the car payment, the utilities… and them credit cards…


And I say this with the following disclaimer:
1) I am not a financial advisor nor fitness expert, I am just using common sense (I think).
2) You might say it’s not fair but, remember you have to work with the situation at hand, you are trying to fix your finances, not the country’s... that is a different battle.

Suggestion:
Review your expenses, see where you can make cuts, things that you’re paying for, that you don’t really need or you can do without.
Make a new budget, that would allow you and your significant other (teamwork), fulfill your financial obligations.

Example 2:
You have this health condition and your health provider advised that you have to exercise more and yes, loose some weight…UGH!!!
Suggestion:
Remember what I said? Don’t try to tackle all at once? Start small… Don’t go running (or walking) to the gym and get a membership, that ultimately is going to turn into a donation (to the gym). Don’t set yourself for failure… Baby steps. Walk around your nearest park, for free, 15 minutes every day for 21 days… Just to make it a habit and see if you can commit. Once that is completed you might enjoy it and move to something a little bit more challenging.

Small and achievable goals, give you the confidence to move to something deeper, bigger and before you know it, you are getting better at being resilient.

Suggestion 3:
And this is the important part after making your adaptation to the situation at hand… Check your progress and state the course.
For example 1: Review your budget frequently, weekly or daily, to see if you stuck to it... you might be able to start saving after all... who knows, right?
For example 2: Mark your 21 days in the calendar for every day you went walking… try to make them consecutive days, though

One last thing: If by any chance you are facing both challenges depicted in Example 1 and 2 at the same time... again: Don’t tackle all at once… pick one and work with it. You don’t have to do what I suggested in each example, you can add your own spin but start small…

Those who are able to adapt, can later tell the story of how they faced economical turmoil, weight loss, or whatever personal challenge you are in right now.

I believe that is a way to Resiliency…

I'd like you to watch this video from 2012 about everyday Happiness and Resilience..


--- Do you have an example of resilience that you want to share? Share it in the comments section, you might be providing good and better advise :-)

Wednesday, July 23, 2014

I'm Speaking at the Alfresco Summit 2014, San Francisco

I'm very exited to participate in this year's Alfresco Summit to take place in San Francisco. 

We were selected to do a Lightning Talk in Alfresco Summit 2014, to be held in San Francisco, September 23 to 26. We will talk about how we are embedding Alfresco Content Repository in a system that we are currently developing following the Software-as-a-Service model. We will cover, how we leverage Alfresco Webscripts Framework to model and expose fully RESTfull services, and develop a web client using Backbone to provide a highly responsive web experience.

Our session is titled:

Embedding Alfresco in a SaaS Application

More details of the session can be found in Alfresco Summit webpage, at Lightning Talks 2. For the complete listing of sessions, follow this link.


Currently this system that we are developing is "under wraps", but by the end of the month of September we will unveil it, using this talk as an important event in doing so. 

We will keep in touch, providing details in the advances of this development.


Monday, July 14, 2014

KPIs Backed by Content





You’ve managed to put in place a very effective Business Intelligence platform, that with diligence can tell you, through KPIs, how well your organization is performing; what process, product, or service is approaching the desired goal and which of those is not quite there yet.
But those are just indicators, numbers that give you part of the picture.
What if you or your team want to dig deeper and learn how to get those points closer to the desired goal, or better yet, how can we improve and repeat what is actually working? So, the underlying question would be; can your organization’s content provide the information to assess this?
Let's say that among the KPI information related to your customers you get a clear indication that Customer Retention Rate is at a 76%, which determines how good your company is retaining customers. At first glance, it seems your organization is doing ok, but you want to improve that rate.
Well the first step, is to know what is it your organization is doing right, what are the areas with room for improvement, and the answer sure enough is within the body of your organization… (the content in your organization, that is).
Your organization have interaction with your customer base in multiple ways,
  • Letters
  • Press Releases
  • Social Interaction (Facebook, Twitter, etc)
  • Product and Service Offers
  • Customer Representatives interaction with your customers
  • Customer’s feedback
… but
  • are these interactions easy to find?
  • is it all in one place? is it trapped in paper, email, jump drives, network drives, the cloud, your ERPs?
  • could the right personnel find that X factor that you are looking for in an opportune time fashion?
  • how much does it really cost to find what you’re looking for? do you even know if you can afford this search cost?
  • can you identify what content is tied to what indicator?
While you think about the answer to any of these questions and struggle to find that X factor that will help you analyze and come up with the answer as to how to increase your customer retention, your competitors are struggling as well too.
You have the opportunity to step ahead and make good use of Enterprise Content Management.
Once in place, a well-implemented and well-managed ECM strategy can help you:

  1. Establish faster a close knowledge of your customers’ wants and needs and model your offering to what they are asking from you or the market
  2. Know better your products, what is working, and what is not and most importantly… WHY?
  3. Streamline your business processes, making them more agile and enabling you to change and adapt quicker to changes in the market.
  4. Go paperless, or have the infrastructure in place to do so when appropriate or in a timely manner
  5. Reduce time in processing documents; being proposals, orders, and contracts, among others
  6. Keep your information and processes in compliance with law regulations, internal policies, and security standards
  7. Maintain automated communication with customers or prospects while engaging with them through multiple channels

I am sure you can see the money savers in each of these points, and better yet, how these can get you closer to increase customer retention and hence, increase revenue.
There are plenty offerings in the market for ECM, some proven to be the biggest players and others are ad-hoc solutions in the cloud that have come across as ECM, just because of the need of employees to collaborate and exchange information among them or with third parties.


And while ECM can help you get to your bottom line, it does not have to be “overly expensive” or “prohibitively costly” and, it can still be as extraordinary.

If you are interested in knowing a little bit more about an affordable ECM solution for your organization, even if you have an ECM solution in place, lets talk a little bit more… You will learn valuable information.

Thursday, October 10, 2013

Personalizaciones útiles de Alfresco Share Parte I - Introducción


Alfresco Share es una excelente interfaz de usuario para el repositorio de contenido de Alfresco.  Fomenta un ambiente de colaboración alrededor de un contenido debidamente organizado.

Sin embargo, cuando queremos extender ese poder de colaboración que nos ofrece, tenemos a nuestra disposición una serie de herramientas que nos permitirán llevar las funcionalidades del producto a un nivel superior.

Esta serie de 4 publicaciones en nuestro Blog, te mostrarán paso a paso, cómo modificar el panel de acciones que trae la interfaz de Alfresco Share y cómo modificar los componentes de una de sus páginas, para añadir por ejemplo un carrusel de imágenes.

A continuación menciono la serie de 4 publicaciones y su contenido.

- Parte I - Introducción
- Parte III - ¿Cómo añadir entradas al Panel de Acciones?
- Parte IV - ¿Cómo añadir componentes modificando una página de detalle?

La publicación está orientada a desarrolladores comenzando a trabajar en la personalización de Alfresco Share, sin embargo, para aquellos con un conocimiento más avanzado, hemos publicado el código de referencia aquí.

Esperamos que estas publicaciones te sean de utilidad en tus personalizaciones de Alfresco Share.

Monday, June 17, 2013

The very simple principles of Excellence in Service and You


Don´t you love vacations?

What is it about a good hotel where everybody is attentive to your every little desire and or need that makes you feel special?

If you are a connoisseur or an experienced world traveler, you already know that this is because it is in their job description to be happy to serve you.  Personnel at these places serve with a smile on their faces, they make you feel welcome and their goal is to leave you longing for the time you will comeback.  Especially if you go to a 4 or 5 stars place, where this kind of service is expected.

It is not only the service but the quality of it.

Now what would happen if you bring that experience to businesses other than the hospitality industry?

No… I don’t mean turning your business into a hotel or a tourist attraction… That would be preposterous!!!

But I definitively believe that every single employee in your organization or mine, should know, believe, breathe and act according to the simple principle that: Good manners will get you far...

Another principle would be that: Our work serves others because after all, unless we are castaways in an island, most times we are doing something for someone else, you may want to consider delivering something of good quality while at it.. it may be the report you were ask to do or the spreadsheet with all sorts of calculations.

And when I say every employee in your organization I mean every single one, independent contractor, subcontractor, CEO, manager, building maintenance employee, administrative assistants, project managers, programmers, clerks … EVERYBODY.

If your business is in the line of interfacing with general public, this is then mandatory, because a bad review or many of them can cost you your business.  A good one or many of them can be translated into more customers and more money.

Businesses that understand these principles strive when this is accompanied with a good quality product, business that fail to understand this, well… are missing out a lot.

If you are still unconvinced about the benefits of good customer service or customer care (internal or external), try it next time you can, you may even start with a smiley: “Hello, how can I help you?”



After all, everybody likes to be treated nicely.



Have a nice day

:-D

Monday, May 27, 2013

[Alfresco/Share] Configure Inline Editable on your custom content

I did not find anything online that explained in one post how I could setup a custom content as Inline Editable. I gathered bits and pieces from several places, but...

First, you have to specify in your content model that the custom content type in question should be handled as inline editable. You do this by defining the aspect app:inlineeditable as a mandatory aspect of the content type. Don't forget to import the application content model so that you can use the app namespace. Here's a snippet for reference.

<?xml version="1.0" encoding="UTF-8"?>

<model name="losi:SampleModel"
       xmlns="http://www.alfresco.org/model/dictionary/1.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.alfresco.org/model/dictionary/1.0">

    <description>Sample Model</description>
    <author>Juan Jimenez</author>
    <version>1.0</version>

    <imports>
        <import uri="http://www.alfresco.org/model/application/1.0" prefix="app"/>
        <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
        <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
        ...snip...
    </imports>

    <namespaces>
        <namespace uri="http://losi.co/model/sample/1.0" prefix="losi"/>
    </namespaces>

    ...snip...
    <types>

        ...snip...
        <type name="losi:CustomContent">
            <title>CustomContent</title>
            <parent>cm:content</parent>
            ...snip...
            <mandatory-aspects>
                <aspect>app:inlineeditable</aspect>
            </mandatory-aspects>
        </type>
        ...snip...

    </types>
    ...snip...

</model>

What this configuration does, is tell Share (or Alfresco Explorer for that matter) that whenever an element of type losi:CustomContent is managed in the document library details page, it will enable the Inline Edit action button. But this alone will not do the complete job. You still need to specify Share that you want to display the control to edit the content of the target element, i.e. cm:content. There are to configurations for defining the element's metadata forms, one for creating it and another for editing it.

<!-- for creating -->
<config evaluator="model-type" condition="losi:CustomContent">
    <forms>
        <form>
           <field-visibility>
                <show id="cm:name"/>
                <show id="cm:title"/>
                <show id="cm:description"/>
            </field-visibility>
        </form>
    </forms>
</config>

<!-- for editing -->
<config evaluator="node-type" condition="losi:CustomContent">
    <forms>
        <form>
            <field-visibility>
                <show id="cm:name"/>
                <show id="cm:title"/>
                <show id="cm:description"/>
                <show id="cm:content"/>
            </field-visibility>
        </form>
    </forms>
</config>

I was having trouble with the create one; because I did not wanted to add content at create, but rather enable the user only to add content when editing. For some reason, the inline edit form and the edit properties where not displaying the control to edit the content. The reason is, that since in the create form the content was not being initialized, Share did not know how to render the control to edit content. For instance, if I created a behavior that added default content to any losi:CustomContent and bind it to node create policy for this type, the inline edit for the newly created custom content would behave as expected, i.e. the correct control is rendered.

I though that there should be a simpler way to fix that, so browse through Share config files, and noticed that the cm:content form is defined so that the mimetype is provided as a parameter (within the GET request) and sets it as a hidden field in the form. I figured that I could probably do the same for my CustomContent... and it worked. This is how it ended up:

<!-- for creating -->
<config evaluator="model-type" condition="losi:CustomContent">
    <forms>
        <form>
           <field-visibility>
                <show id="cm:name"/>
                <show id="cm:title"/>
                <show id="cm:description"/>
                <show id="mimetype"/>
                <show id="cm:content"/>
            </field-visibility>
            <appearance>
                <field id="mimetype">
                    <control template="/org/alfresco/components/form/controls/hidden.ftl">
                        <control-param name="contextProperty">mimeType</control-param>
                    </control>
                </field>
                <field id="cm:content">
                    <control template="/org/alfresco/components/form/controls/hidden.ftl"/>
                </field>
            </appearance>
        </form>
    </forms>
</config>

In addition, by default Share will use the form definition for editing, defined at node-type evaluator. But, if you want to define a separate form for inline edit, you can do so by adding another form to the list of forms under the node-type evaluator, with the id doclib-inline-edit.

<!-- for editing -->
<config evaluator="node-type" condition="losi:CustomContent">
    <forms>
        ...snip...

        <!-- Document Library Inline Edit form -->
        <form id="doclib-inline-edit">
            <field-visibility>
                <show id="cm:name" />
                <show id="cm:content" force="true" />
            </field-visibility>
        </form>
    </forms>
</config>

Once again, I hope this is helpful for others looking to implement similar scenarios.

Sunday, August 26, 2012

Dependency Injection on Stateless Beans

I recently came across a situation where I needed to inject a dependency into a class that, when used, was expected to be stateless. I'm using Spring as the dependency injection container, and this class is instantiated directly from the class, and not through Spring context; thus, I could not use Spring context with basic dependency injection. Did my Google search, but did not find an answer, so I'm posting this because the solution was fairly simple and needed to be shared.

The scenario (assuming you're familiarized with JPA, Spring, and overall dependency injection) 
I have a utility class that is responsible for indexing entities using Lucene. I wanted to add this utility to a JPA listener so that it can create or update the index on the entity in a @PrePersist method. Why this way, and not through a service? Good question. The entity could be persisted directly through a service, directly using Entity Manager, or as a cascade effect when persisting an entity that contains this entity as a property. So, in order to ensure that the index is created/updated, I wanted to provide a listener that would do that prior to saving the entity.

The service class that creates/updates indexes needs to be instantiated by Spring context so that it can have all the indexing dependencies, such as the location of the indexes, so if I wanted a Listener to do this task, I needed to inject this instantiated bean by Spring context into the listener. But, JPA listeners are supposed to be stateless, Entity Manager does not call Spring context to get a reference of an instantiated listener, rather it uses the class specified in the @EntityListeners annotation and instantiates it directly. So, what to do?

Solution
If the search service, the service that does the indexing as well, can be declared as static in the Listener, surely it will be accessible when JPA executes a persist of the entity by any method.


@Component
public class EntityIndexListener
{
    static private SearchService searchService;
    ...




Declaring static is part of the solution, we still need to inject the instantiated class by Spring context to it. For this we create a set method, the same as we would as for any other dependency.


@Autowired(required = true)
@Qualifier("searchService")
public void setSearchService(SearchService searchService)
{
    this.searchService = searchService;
}

This will setup the dependency, assuming autowire is configured. If autowire is not configured, you can define the dependency explicitly. 

One last thing; to ensure that Spring does the injection at startup, declare an init method solely for the purpose of "telling" Spring that this method needs to be instantiated at startup, so that this method can be executed. The init method does not need to do anything.

@PostConstruct
public void init()
{
    logger.info("Initializing Search Service for Listener ["+ searchService +"]");
}

Hope this helps.