<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>ExpressionLab - Home</title>
  <id>tag:www.expressionlab.com,2010:mephisto/</id>
  <generator version="0.8.0" uri="http://mephistoblog.com">Mephisto Drax</generator>
  <link href="http://www.expressionlab.com/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://www.expressionlab.com/" rel="alternate" type="text/html"/>
  <updated>2010-08-27T13:21:34Z</updated>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2010-08-27:218</id>
    <published>2010-08-27T08:46:00Z</published>
    <updated>2010-08-27T13:21:34Z</updated>
    <category term="Thoughts"/>
    <category term="forum"/>
    <category term="rails"/>
    <link href="http://www.expressionlab.com/2010/8/27/using-savage-beast-the-rails-forum-plugin" rel="alternate" type="text/html"/>
    <title>Using Savage Beast, the Rails Forum Plugin</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Rails&quot; src=&quot;/assets/2008/11/19/rails.gif&quot; alt=&quot;Rails&quot; /&gt;Probably &lt;a href=&quot;http://github.com/rubyonbr/beast&quot;&gt;Beast&lt;/a&gt; is the most famous forum Rails app. One issue most developers have is adding a forum to an existing application, rather than starting from scratch.  &lt;a href=&quot;http://www.williambharding.com/blog/rails/savage-beast-23-a-rails-22-23-message-forum-plugin/&quot;&gt;Savage Beast&lt;/a&gt; does exactly that. It is a Rails plugin based on the famous Beast. Here is how to add Savage Beast to your existing Rails app.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Rails&quot; src=&quot;/assets/2008/11/19/rails.gif&quot; alt=&quot;Rails&quot; /&gt;Probably &lt;a href=&quot;http://github.com/rubyonbr/beast&quot;&gt;Beast&lt;/a&gt; is the most famous forum Rails app. One issue most developers have is adding a forum to an existing application, rather than starting from scratch.  &lt;a href=&quot;http://www.williambharding.com/blog/rails/savage-beast-23-a-rails-22-23-message-forum-plugin/&quot;&gt;Savage Beast&lt;/a&gt; does exactly that. It is a Rails plugin based on the famous Beast. Here is how to add Savage Beast to your existing Rails app.
&lt;ol&gt;
  &lt;li&gt;
    The only prerequisite is that your Rails app should have a User model. You can start with my
    &lt;a href=&quot;http://github.com/hatem/janrain-engage-demo&quot;&gt;Janrain Engage Demo&lt;/a&gt;.
  &lt;/li&gt;
  &lt;li&gt;
    Install required plugins:
    &lt;ol&gt;
      &lt;li&gt;Install savage-beast plugin:
&lt;pre&gt;&lt;code&gt;script/plugin install http://github.com/valodzka/savage-beast.git&lt;/pre&gt;&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Move &quot;white_list&quot; and &quot;white_list_formatted_content&quot; plugins from &lt;strong&gt;\vendor\plugins\savage-beast\tested_plugins&lt;/strong&gt; to &lt;strong&gt;\vendor\plugins&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
  &lt;li&gt;
    Install required gems:
    &lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;# environment.rb
config.gem 'savage-beast', :lib =&gt; 'beast'
config.gem 'will_paginate', :version =&gt; '~&gt; 2.3.14'
config.gem 'acts_as_list'
config.gem 'RedCloth'
&lt;/code&gt;&lt;/pre&gt;
    &lt;pre&gt;&lt;code&gt;rake gems:install&lt;/code&gt;&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;
    Generate the beast:
    &lt;pre&gt;&lt;code&gt;script/generate beast&lt;/code&gt;&lt;/pre&gt;
    &lt;pre&gt;&lt;code&gt;rake db:migrate&lt;/code&gt;&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;
    Start the server:
    &lt;pre&gt;&lt;code&gt;script/server&lt;/code&gt;&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;Navigate to /forums and enjoy!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  &lt;strong&gt;NOTE:&lt;/strong&gt; If you get the following error: &quot;A copy of ApplicationController has been removed from the module tree but is still active!&quot;, add the following to /config/environment.rb:
  &lt;pre&gt;&lt;code&gt;config.reload_plugins = true if Rails.env.development?&lt;/pre&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;h3&gt;Customization&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Implement &lt;strong&gt;login_required&lt;/strong&gt; and &lt;strong&gt;current_user&lt;/strong&gt; in your application controller&lt;/li&gt;
  &lt;li&gt;Implement &lt;strong&gt;display_name&lt;/strong&gt; and &lt;strong&gt;admin?&lt;/strong&gt; in user model&lt;/li&gt;
  &lt;li&gt;To override, create files in your /controllers or /views directories with the same name&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Demo&lt;/h3&gt;
&lt;p&gt;I have create a demo app, &lt;a href=&quot;http://github.com/hatem/savage-beast-demo&quot;&gt;Savage Beast Demo&lt;/a&gt;, for demonstration.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2010-08-23:211</id>
    <published>2010-08-23T06:16:00Z</published>
    <updated>2010-08-23T07:17:09Z</updated>
    <category term="Thoughts"/>
    <category term="infographic"/>
    <category term="internet"/>
    <link href="http://www.expressionlab.com/2010/8/23/history-of-the-internet" rel="alternate" type="text/html"/>
    <title>History of the Internet</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Internet&quot; src=&quot;/assets/2010/8/23/internet.jpg&quot; alt=&quot;Internet&quot; /&gt;The internet is a fantastic invention that has changed the way we live. In honor of the internet, Jason Powers has designed the following infographic highlighting the major events in internet history.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Internet&quot; src=&quot;/assets/2010/8/23/internet.jpg&quot; alt=&quot;Internet&quot; /&gt;The internet is a fantastic invention that has changed the way we live. In honor of the internet, Jason Powers has designed the following infographic highlighting the major events in internet history.
&lt;p&gt;&lt;img class=&quot;photo&quot; title=&quot;Internet History&quot; src=&quot;/assets/2010/8/23/internet-history.jpg&quot; alt=&quot;Internet History&quot; width=&quot;470&quot; /&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2010-08-02:186</id>
    <published>2010-08-02T12:45:00Z</published>
    <updated>2010-08-23T07:17:42Z</updated>
    <category term="Thoughts"/>
    <category term="janrain engage"/>
    <category term="rails authentication"/>
    <link href="http://www.expressionlab.com/2010/8/2/janrain-engage-on-rails" rel="alternate" type="text/html"/>
    <title>Janrain Engage (formerly RPX) on Rails</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Janrain&quot; src=&quot;/assets/2010/8/2/janrain.png&quot; alt=&quot;Janrain&quot; /&gt;&lt;a href=&quot;http://www.janrain.com/products/engage&quot;&gt;Janrain Engage&lt;/a&gt; (formerly RPX) allows your visitors to login to your website with their existing accounts on Facebook, Google, Twitter, Yahoo!, LinkedIn, Windows Live, MySpace, AOL or other networks and then gather their profile data and publish their activities from your website to multiple social networks. I have just committed &lt;a href=&quot;http://github.com/hatem/janrain-engage-demo&quot;&gt;Janrain Engage Demo&lt;/a&gt;, a simple Rails app that demonstrates the usage of the &lt;a href=&quot;http://github.com/grosser/rpx_now&quot;&gt;rpx_now gem&lt;/a&gt; to add Janrain Engage to your Rails app.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Janrain&quot; src=&quot;/assets/2010/8/2/janrain.png&quot; alt=&quot;Janrain&quot; /&gt;&lt;a href=&quot;http://www.janrain.com/products/engage&quot;&gt;Janrain Engage&lt;/a&gt; (formerly RPX) allows your visitors to login to your website with their existing accounts on Facebook, Google, Twitter, Yahoo!, LinkedIn, Windows Live, MySpace, AOL or other networks and then gather their profile data and publish their activities from your website to multiple social networks. I have just committed &lt;a href=&quot;http://github.com/hatem/janrain-engage-demo&quot;&gt;Janrain Engage Demo&lt;/a&gt;, a simple Rails app that demonstrates the usage of the &lt;a href=&quot;http://github.com/grosser/rpx_now&quot;&gt;rpx_now gem&lt;/a&gt; to add Janrain Engage to your Rails app.
&lt;p&gt;&lt;img class=&quot;photo&quot; title=&quot;Janrain Engage Popup&quot; src=&quot;/assets/2010/8/2/janrain-engage-popup.png&quot; alt=&quot;Janrain Engage Popup&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Features include:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Supports Rails 2.3.8&lt;/li&gt;
  &lt;li&gt;A user can login using a popup or embedded widget&lt;/li&gt;
  &lt;li&gt;User data (identifier, username, email) is extracted and the user is auto-saved if valid&lt;/li&gt;
  &lt;li&gt;A user with invalid data is redirected to fix the auto-filled data&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;current_user&lt;/strong&gt; represents the currently logged in user&lt;/li&gt;
  &lt;li&gt;You can use &lt;strong&gt;before_filter :require_user&lt;/strong&gt; to protect restricted actions&lt;/li&gt;
  &lt;li&gt;A user requesting a restricted action is redirected to a login page with an embedded widget&lt;/li&gt;
  &lt;li&gt;Once logged in, a user is redirected to the requested action&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more info, check it on GitHub: &lt;a href=&quot;http://github.com/hatem/janrain-engage-demo&quot;&gt;http://github.com/hatem/janrain-engage-demo&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2010-07-27:178</id>
    <published>2010-07-27T03:32:00Z</published>
    <updated>2010-07-27T10:12:03Z</updated>
    <category term="Thoughts"/>
    <category term="espace"/>
    <category term="ipad app"/>
    <category term="task cards"/>
    <link href="http://www.expressionlab.com/2010/7/27/task-cards-the-first-ipad-app-from-espace-is-now-in-the-app-store" rel="alternate" type="text/html"/>
    <title>Task Cards: The First iPad App from eSpace is now in the App Store!</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Task Cards&quot; src=&quot;/assets/2010/7/27/task-cards.png&quot; alt=&quot;Task Cards&quot; /&gt;&lt;a href=&quot;http://www.espace.com.eg/&quot;&gt;eSpace&lt;/a&gt; just released version 1.0 of &lt;a href=&quot;http://bit.ly/du0qrC&quot;&gt;Task Cards&lt;/a&gt;, the easiest task management app for the iPad. It uses index cards to organize tasks on a desktop, and provides simple tools to manage them.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Task Cards&quot; src=&quot;/assets/2010/7/27/task-cards.png&quot; alt=&quot;Task Cards&quot; /&gt;&lt;a href=&quot;http://www.espace.com.eg/&quot;&gt;eSpace&lt;/a&gt; just released version 1.0 of &lt;a href=&quot;http://bit.ly/du0qrC&quot;&gt;Task Cards&lt;/a&gt;, the easiest task management app for the iPad. It uses index cards to organize tasks on a desktop, and provides simple tools to manage them.
&lt;p&gt;Features include:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Tasks can be shared across index cards&lt;/li&gt;
	&lt;li&gt;Due dates and recurring tasks&lt;/li&gt;
	&lt;li&gt;Priorities&lt;/li&gt;
	&lt;li&gt;Search&lt;/li&gt;
	&lt;li&gt;Notes&lt;/li&gt;
	&lt;li&gt;Sorting by due date, priority, or alphabetical&lt;/li&gt;
	&lt;li&gt;Quick access to overdue and today's tasks&lt;/li&gt;
	&lt;li&gt;Ability to see completed tasks on the back of a card&lt;/li&gt;
&lt;/ul&gt;
&lt;img class=&quot;photo&quot; title=&quot;Task Cards&quot; src=&quot;/assets/2010/7/27/task-cards-screenshot.png&quot; alt=&quot;Task Cards&quot; /&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2010-06-21:143</id>
    <published>2010-06-21T09:17:00Z</published>
    <updated>2010-06-21T09:27:59Z</updated>
    <category term="Thoughts"/>
    <category term="kerberos"/>
    <category term="network security"/>
    <category term="ssl"/>
    <category term="tls"/>
    <link href="http://www.expressionlab.com/2010/6/21/network-security-applications" rel="alternate" type="text/html"/>
    <title>Network Security Applications</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Security&quot; src=&quot;/assets/2010/6/21/sslWarning.png&quot; alt=&quot;Security&quot;&gt;Here are the slides I have presented yesterday on &lt;strong&gt;network security applications&lt;/strong&gt;. It was a quick presentation with an example of an authentication application, &lt;a href=&quot;http://en.wikipedia.org/wiki/Kerberos_%28protocol%29&quot;&gt;Kerberos&lt;/a&gt;, and a web security standard, &lt;a href=&quot;http://en.wikipedia.org/wiki/Transport_Layer_Security&quot;&gt;SSL/TLS&lt;/a&gt;.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Security&quot; src=&quot;/assets/2010/6/21/sslWarning.png&quot; alt=&quot;Security&quot;&gt;Here are the slides I have presented yesterday on &lt;strong&gt;network security applications&lt;/strong&gt;. It was a quick presentation with an example of an authentication application, &lt;a href=&quot;http://en.wikipedia.org/wiki/Kerberos_%28protocol%29&quot;&gt;Kerberos&lt;/a&gt;, and a web security standard, &lt;a href=&quot;http://en.wikipedia.org/wiki/Transport_Layer_Security&quot;&gt;SSL/TLS&lt;/a&gt;.
&lt;div&gt;
	&amp;lt;object height=&quot;388&quot; width=&quot;470&quot;&gt;
		&amp;lt;param /&gt;
		&amp;lt;param&gt;
		&amp;lt;param&gt;
		&amp;lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=network-security-applications-100621040709-phpapp02&amp;amp;rel=0&amp;amp;stripped_title=network-security-applications-4562405&quot; height=&quot;388&quot; width=&quot;470&quot;&gt;&amp;lt;/embed&gt;
	&amp;lt;/object&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2010-01-09:1</id>
    <published>2010-01-09T05:41:00Z</published>
    <updated>2010-05-27T04:41:04Z</updated>
    <category term="Thoughts"/>
    <category term="agile roles"/>
    <category term="project management"/>
    <link href="http://www.expressionlab.com/2010/1/9/agile-roles-and-responsibilities" rel="alternate" type="text/html"/>
    <title>Agile Roles and Responsibilities</title>
<summary type="html">Managing and leading software projects, I have always seen debates on the different roles required and the responsibilities of each manager and team member. 
    Traditional process models have a lot of isolated roles and agile models always argue about shared responsibilities and self organized teams.</summary><content type="html">
            Managing and leading software projects, I have always seen debates on the different roles required and the responsibilities of each manager and team member. 
    Traditional process models have a lot of isolated roles and agile models always argue about shared responsibilities and self organized teams.
&lt;p&gt;
    Regardless of the size of the project and the number of team members, I found that managing a successful project always require three main roles to manage
    three main parts. It requires a product owner, a project manager, and a team leader to manage the product, the project, and the team, respectively.
&lt;/p&gt;
&lt;p&gt;
    Similar roles can be found in many traditional and agile models but with different responsibilities.
    You may find them under different names like facilitators, coaches, trackers, mentors, masters, etc.
&lt;/p&gt;
&lt;h3&gt;Product Owner&lt;/h3&gt;
&lt;p&gt;
    The product owner works with the customer and ensures they get the highest business value possible.
    This can be the traditional business analyst and the agile customer.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
        Helps the customer to define the requirements and convert them to stories
    &lt;/li&gt;
    &lt;li&gt;
        Works with the customer to organize and prioritize stories in the product backlog
    &lt;/li&gt;
    &lt;li&gt;
        Provides initial estimates for stories and releases
    &lt;/li&gt;
    &lt;li&gt;
        Tracks customer requirements and changes (new features, bug reports, investigation requests, performance issues, etc.)
    &lt;/li&gt;
    &lt;li&gt;
        Sits with the Team Leader to discuss story details, business constraints, legal issues, etc.
    &lt;/li&gt;
    &lt;li&gt;
        Provides input on mockups and prototypes
    &lt;/li&gt;
    &lt;li&gt;
        Sits with the tester to set and track product quality
    &lt;/li&gt;
    &lt;li&gt;
        Sits with the Project Manager to review the previous release and plan the next
    &lt;/li&gt;
    &lt;li&gt;
        Manages customer relationship and ensures customer satisfaction
    &lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Project Manager&lt;/h3&gt;
&lt;p&gt;
    The project manager is responsible of the overall planning and tracking and ensures the work is delivered in scope, on time and within budget.
    This can be the traditional project manager and the agile tracker.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
        Sits with the Product Owner to gather all requirements/estimates and integrates everything into a workable plan
    &lt;/li&gt;
    &lt;li&gt;
        Works with the management and Product Owner to provide and secure resources (people, infrastructure, licenses, etc.)
    &lt;/li&gt;
    &lt;li&gt;
        Plans and tracks cost to ensure the work is within budget
    &lt;/li&gt;
    &lt;li&gt;
        Identifies risks and works with the management and Product Owner to resolve them
    &lt;/li&gt;
    &lt;li&gt;
        Manages and controls scope to ensure that only what was agreed to is being delivered
    &lt;/li&gt;
    &lt;li&gt;
        Continuous planning for changes in requirements, cost, schedule, etc.
    &lt;/li&gt;
    &lt;li&gt;
        Tracks and communicates project progress and plan changes to Product Owner and top management
    &lt;/li&gt;
    &lt;li&gt;
        Sits with the Product Owner to review the previous release and plan the next
    &lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Team Leader&lt;/h3&gt;
&lt;p&gt;
    The team leader manages the team and ensures they deliver the highest quality possible.
    This can be the traditional architect and the agile coach.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
        Communicates with the customer to discuss the details of the iteration and each story included
    &lt;/li&gt;
    &lt;li&gt;
        Communicates with the Product Owner to discuss requirement conflicts, business constraints, legal issues, etc.
    &lt;/li&gt;
    &lt;li&gt;
        Performs iteration planning, daily planning and assigns tasks to team members
    &lt;/li&gt;
    &lt;li&gt;
        Controls the development process (iteration meetings, deployments, testing, client communication, etc.)
    &lt;/li&gt;
    &lt;li&gt;
        Provides team leadership and coaching to set a good example to the team
    &lt;/li&gt;
    &lt;li&gt;
        Directs the day-to-day activities of the team members and ensures they follow the standard processes and procedures
    &lt;/li&gt;
    &lt;li&gt;
        Coaches and trains team members through planning games, pair programming and peer reviews
    &lt;/li&gt;
    &lt;li&gt;
        Ensures that tasks are being done with a high quality (design patterns, coding standards, test coverage, type of bugs, etc.)
    &lt;/li&gt;
    &lt;li&gt;
        Transfers knowledge and encourages knowledge sharing across the team
    &lt;/li&gt;
    &lt;li&gt;
        Ensures that the team spirit and morale is kept and improves members confidence
    &lt;/li&gt;
    &lt;li&gt;
        Tracks and communicates iteration progress and team performance
    &lt;/li&gt;
    &lt;li&gt;
        Communicates with the Project Manager to discuss the progress
    &lt;/li&gt;
    &lt;li&gt;
        Sits with the Product Owner to review the previous iteration and plan the next
    &lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Team Members&lt;/h3&gt;
&lt;p&gt;
    Team members focus on implementing user stories using the best techniques and practices.
    They investigate, analyze, estimate, design, code, document, deploy and test stories.
    Those can be senior/junior developers, interface designers, system administrators, testers, etc.
&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;
    A successful software project requires a product owner, a project manager, and a team leader to work together with the customer and the team. 
    Of course, some responsibilities can be moved from a role to another depending on the project type and individual skills, but this is not valid for everything.
&lt;/p&gt;
&lt;p&gt;
    For example, the project manager may act as the product owner with some extra efforts but
    if the project manager acts as the team leader, you may have problems with the project schedule or code quality. 
    Similarly, if the team leader acts as the project owner, you may have problems with the code quality or customer relationship. And so on. 
&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2009-12-12:2</id>
    <published>2009-12-12T05:41:00Z</published>
    <updated>2010-05-29T07:14:24Z</updated>
    <category term="Thoughts"/>
    <category term="software architecture"/>
    <category term="software engineering radio"/>
    <category term="software quality"/>
    <link href="http://www.expressionlab.com/2009/12/12/software-quality-se-radio" rel="alternate" type="text/html"/>
    <title>Software Architecture &#8211; Part 2: Software Quality (SE Radio)</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Software Engineering Radio&quot; src=&quot;/assets/2009/10/24/seradio_logo.jpg&quot; alt=&quot;Software Engineering Radio&quot;&gt;In  &lt;a href=&quot;http://www.se-radio.net/podcast/2006-08/episode-25-architecture-pt-2&quot;&gt;episode 25&lt;/a&gt; of  &lt;a href=&quot;http://www.se-radio.net/&quot;&gt;Software Engineering Radio&lt;/a&gt;, Michael and Markus continue on the fundamentals of software architecture by discussing quality attributes of software architecture and how they relate to each other. Here is the summary.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Software Engineering Radio&quot; src=&quot;/assets/2009/10/24/seradio_logo.jpg&quot; alt=&quot;Software Engineering Radio&quot;&gt;In  &lt;a href=&quot;http://www.se-radio.net/podcast/2006-08/episode-25-architecture-pt-2&quot;&gt;episode 25&lt;/a&gt; of  &lt;a href=&quot;http://www.se-radio.net/&quot;&gt;Software Engineering Radio&lt;/a&gt;, Michael and Markus continue on the fundamentals of software architecture by discussing quality attributes of software architecture and how they relate to each other. Here is the summary.
&lt;p&gt;
            Quality requirements
            of software architecture can be grouped in different categories:
        &lt;/p&gt;
        &lt;h3&gt;a)
            Operational requirements (run-time characteristics)&lt;/h3&gt;
        &lt;h4&gt;1. Performance&lt;/h4&gt;
        &lt;p&gt;
            Performance has 2
            measures:
        &lt;/p&gt;
        &lt;ol&gt;
&lt;li&gt;
                Latency: this
                describes the time the system needs to react on an external event.
                This is very important in real-time systems and is usually relevant
                to embedded systems.
            &lt;/li&gt;
            &lt;li&gt;
                Throughput:
                this describes how many events can be processed by the system per
                second. This is more relevant to transactions systems.
            &lt;/li&gt;
        &lt;/ol&gt;
&lt;p&gt;
            Performance depends
            on several factors like algorithms, memory, bandwidth and
            communication overhead. Also, performance is defined for specific use
            cases and well-defined system configuration.
        &lt;/p&gt;
        &lt;h4&gt;2.
            Scalability&lt;/h4&gt;
        &lt;p&gt;
            Scalability is the
            ability of a system to keep its performance, or degrade slightly,
            when the load increases. So when the load doubles on a scalable
            system, you should get the same performance by doubling the hardware
            resources. And when you keep the hardware the same, if the load
            doubles, you should only get half of performance. This is especially
            important for enterprise systems where the load is not always known
            and can't be expected.
        &lt;/p&gt;
        &lt;h4&gt;3.
            Availability&lt;/h4&gt;
        &lt;p&gt;
            Availability is the
            ability of a system to be up and running, with a specified level of
            quality, in a percentage of the time. This can be calculated by: uptime / (uptime + downtime). For example, a system that fails
            every hour and automatically reboots in a second has a high
            availability.
        &lt;/p&gt;
        &lt;h4&gt;4.
            Reliability&lt;/h4&gt;
        &lt;p&gt;
            Reliability
            describes how often failure occurs in the system. A failure can be
            missing a deadline in a real-time system, or having low throughput,
            etc.
        &lt;/p&gt;
        &lt;h4&gt;5.
            Usability&lt;/h4&gt;
        &lt;p&gt;
            Usability has 3
            measures:
        &lt;/p&gt;
        &lt;ol&gt;
&lt;li&gt;
                Learnabiliy:
                how long does it take for a user to learn how to use the system and
                how efficient can a user operate the system. For example, web
                interfaces are very easy to learn but not very efficient to use if
                you have to do a lot of work.
            &lt;/li&gt;
            &lt;li&gt;
                Memorability
                (re-learnabiliy): how much a user can remember to achieve a certain
                task.
            &lt;/li&gt;
            &lt;li&gt;
                Developmental
                time: how easy the API is to learn and how it protects the
                programmer from making mistakes.
            &lt;/li&gt;
        &lt;/ol&gt;
&lt;h4&gt;6.
            Security&lt;/h4&gt;
        &lt;ul&gt;
&lt;li&gt;
                Authentication
                is about who can use the system. Authorization is about what an
                authenticated user can do, which parts they can access.
            &lt;/li&gt;
            &lt;li&gt;
                A secure system
                needs to encrypt data sent over a network, avoid buffer overflow, be
                safe against denial-of-service attacks, etc.
            &lt;/li&gt;
            &lt;li&gt;
                Security should
                be planned and can't be implemented after the fact.
            &lt;/li&gt;
        &lt;/ul&gt;
&lt;h3&gt;b) 
            Developmental requirements (structural attributes) &lt;/h3&gt;
        &lt;h4&gt;1.
            Maintenability&lt;/h4&gt;
        &lt;p&gt;
            Maintenability is
            the ability to extend or change your system by refactoring, removing
            features, supporting new scenarios, different platforms, etc.
        &lt;/p&gt;
        &lt;h4&gt;2.
            Portability&lt;/h4&gt;
        &lt;p&gt;
            Portability is the
            ability to run the system on different platforms, operating systems,
            networks, etc. This is usually not trivial require code changes.
        &lt;/p&gt;
        &lt;h4&gt;3.
            Reusability&lt;/h4&gt;
        &lt;p&gt;
            Reusability is the
            ability to use parts or components of the system in different
            systems.
        &lt;/p&gt;
        &lt;h4&gt;4.
            Integratability (modularizability)&lt;/h4&gt;
        &lt;p&gt;
            Integratability is
            the ability to develop parts of the system separately to be
            integrated later on. This is important with big systems that can't be
            developed by one team or in one location.
        &lt;/p&gt;
        &lt;h4&gt;5.
            Testability&lt;/h4&gt;
        &lt;p&gt;
            Testability is the
            ability to demonstrate that your system does what it is supposed to
            do. This includes unit tests, module tests and integration tests.
            Testability is a property of the architecture and is usually used to
            measure the quality of it.
        &lt;/p&gt;
        &lt;h3&gt;c)
            Business  requirements&lt;/h3&gt;
        &lt;h4&gt;1.
            Time to market&lt;/h4&gt;
        &lt;p&gt;
            When it is expected
            to deliver the system to the first customer.
        &lt;/p&gt;
        &lt;h4&gt;2.
            Cost&lt;/h4&gt;
        &lt;p&gt;
            This includes how
            many resources, developers, managers can be afforded by the customer,
            how much effort should be spent in testing, etc.
        &lt;/p&gt;
        &lt;h4&gt;3.
            Rollout schedule&lt;/h4&gt;
        &lt;p&gt;
            Does the system have
            to be full up and running with no bugs, or some bugs can be accepted.
            Sometimes, you launch the system with some bugs because the time to
            market is more important. No system is free of bugs but you need to
            know how critical they are.
        &lt;/p&gt;
        &lt;p&gt;
            Sometimes, business
            aspects are in conflict with technical aspects. So it is always
            recommended that technical leaders get involved in these business
            aspects to get better idea of business constraints and customer
            priorities. It is important to keep the development team informed by
            the these business aspects but not stressed.
        &lt;/p&gt;
        &lt;h3&gt;Relationships
            between quality requirement&lt;/h3&gt;
        &lt;p&gt;
            There is no ideal
            system and you often have to compromise. For example, you may have to
            reduce the maintenability to get a better performance. But you should
            discuss these aspects with the customer to know their priorities and
            make such decisions explicit from the beginning.
        &lt;/p&gt;
        &lt;p&gt;
            Also, you can't
            maintain all quality attributes in parallel and you often have to
            balance the forces and make some trade offs to resolve conflicts.
            Some typical conflicts are:
        &lt;/p&gt;
        &lt;ul&gt;
&lt;li&gt;
                Performance vs
                Scalability: to achieve an optimal performance, you can fine tune
                the system to a very specific environment, but scalability would
                decrease.
            &lt;/li&gt;
            &lt;li&gt;
                Performance vs
                Maintainability: to achieve high maintainability, you can separate
                every functionality with its own interface, but performance would
                decrease.
            &lt;/li&gt;
            &lt;li&gt;
                Performance vs
                Portability:  to achieve high portability, which is a special case
                of maintainability, you can use several layers which separation of
                concerns, but performance would decrease.
            &lt;/li&gt;
            &lt;li&gt;
                Performance vs
                Availability: to achieve high availability, you can use several
                check points, and persist several states so it is easy to resume and
                minimize the down time but this usually is too expensive and adds
                performance overhead. For example, using redundant resources like
                duplicating all information between 2 databases.
            &lt;/li&gt;
            &lt;li&gt;
                Security vs
                Usability: to achieve high security, you may require users to fill a
                lot of forms and go through several steps, which conflicts with
                usability. For example, the firewall of Microsoft Windows was not
                turned on by default before XP SP2 because they didn't want to
                bother users with a lot of questions and messages.
            &lt;/li&gt;
        &lt;/ul&gt;
&lt;p&gt;
            On the other hand,
            some quality attributes can support each other. For example,
            maintainability can help availability as maintainable systems are
            usually faster to fix.
        &lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2009-11-23:3</id>
    <published>2009-11-23T05:41:00Z</published>
    <updated>2010-05-29T07:13:20Z</updated>
    <category term="Thoughts"/>
    <category term="software architecture"/>
    <category term="software engineering radio"/>
    <link href="http://www.expressionlab.com/2009/11/23/software-architecture-part-1-se-radio" rel="alternate" type="text/html"/>
    <title>Software Architecture &#8211; Part 1: Fundamentals (SE Radio)</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Software Engineering Radio&quot; src=&quot;/assets/2009/10/24/seradio_logo.jpg&quot; alt=&quot;Software Engineering Radio&quot;&gt;In  &lt;a href=&quot;http://www.se-radio.net/podcast/2006-07/episode-23-architecture-pt-1&quot;&gt;episode 23&lt;/a&gt; of the &lt;a href=&quot;http://www.se-radio.net/&quot;&gt;Software Engineering Radio&lt;/a&gt;, Alex, Michael and Markus talk about the fundamentals of software architecture. Here is the summary.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Software Engineering Radio&quot; src=&quot;/assets/2009/10/24/seradio_logo.jpg&quot; alt=&quot;Software Engineering Radio&quot;&gt;In  &lt;a href=&quot;http://www.se-radio.net/podcast/2006-07/episode-23-architecture-pt-1&quot;&gt;episode 23&lt;/a&gt; of the &lt;a href=&quot;http://www.se-radio.net/&quot;&gt;Software Engineering Radio&lt;/a&gt;, Alex, Michael and Markus talk about the fundamentals of software architecture. Here is the summary.
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Software architecture is the art and science of designing and building software. To create a system architecture, you need to know the requirements and functionalities that the system has to fulfill and the interaction and dependencies between those  functionalities. The hard part in system architecture is usually to address the non-functional requirements.&lt;/p&gt;
&lt;p&gt;Software architecture is different from software design. Architecture is at a top level that guides and shapes the overall system with design guidelines and principles that the design should adhere to. The design is one level below specifying individual classes, objects, variables, etc.&lt;/p&gt;
&lt;p&gt;The design is at a level that is not critical to non-functional requirements so different designs can fulfill the same architecture. So, if something is needed to be done in a specific way to address a certain requirement, then it is a part of architecture.&lt;/p&gt;
&lt;h3&gt;Agile Architecture&lt;/h3&gt;
&lt;p&gt;Some may think that Agile development doesn't need software architects but, actually, any software system has it own structure, architecture and important design decisions. Agile teams don't have an architect as a role because the architecture is not explicitly planned but created while developing the system.  Of course, they always have to follow some guidelines to be able to grow without refactoring the whole system.&lt;/p&gt;
&lt;h3&gt;The Role of a System Architect&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Communicates with all stakeholders to ensure consistency and resolve any conflicts. This includes communication with project management regarding requirements, with developers to share design guidelines, and sometimes with customers if some requirements affect the architecture. They should be concerned about technical goals without getting into politics.&lt;/li&gt;
    &lt;li&gt;Ensures the consistency of the overall architecture by regularly reviewing the design implemented by developers.&lt;/li&gt;
    &lt;li&gt;Guides and coaches developers to take good design decisions.&lt;/li&gt;
    &lt;li&gt;Defines the basic building blocks and the vocabulary that is used to discuss the system.&lt;/li&gt;
    &lt;li&gt;Contributes their knowledge and technical skills.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It is also important to notice that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The full software architecture has to be built incrementally but the number and severity of the changes should become less frequent, otherwise the initial architecture was wrong.&lt;/li&gt;
    &lt;li&gt;Big projects, distributed over several locations, typically have a group of architects with only one lead architect who takes final decisions. But there should be a continuous communication to ensure they are all aware of different parts of the system.&lt;/li&gt;
    &lt;li&gt;Not every good programmer can become a good architect, they need to have strong communication and social skills besides their technical skills.&lt;/li&gt;
&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2009-10-28:4</id>
    <published>2009-10-28T05:41:00Z</published>
    <updated>2010-05-27T04:41:35Z</updated>
    <category term="Thoughts"/>
    <category term="mission-critical software"/>
    <category term="software engineering radio"/>
    <link href="http://www.expressionlab.com/2009/10/28/software-in-space-se-radio" rel="alternate" type="text/html"/>
    <title>Software in Space (SE Radio)</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Software Engineering Radio&quot; src=&quot;/assets/2009/10/24/seradio_logo.jpg&quot; alt=&quot;Software Engineering Radio&quot;&gt;In  &lt;a href=&quot;http://www.se-radio.net/podcast/2008-06/episode-100-software-space&quot;&gt;episode 100&lt;/a&gt; of the &lt;a href=&quot;http://www.se-radio.net/&quot;&gt;Software Engineering Radio&lt;/a&gt;, Hans-Joachim Popp, CIO  at &lt;a href=&quot;http://www.dlr.de/&quot;&gt;DLR&lt;/a&gt;, talks about software in space. Here is the summary.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Software Engineering Radio&quot; src=&quot;/assets/2009/10/24/seradio_logo.jpg&quot; alt=&quot;Software Engineering Radio&quot;&gt;In  &lt;a href=&quot;http://www.se-radio.net/podcast/2008-06/episode-100-software-space&quot;&gt;episode 100&lt;/a&gt; of the &lt;a href=&quot;http://www.se-radio.net/&quot;&gt;Software Engineering Radio&lt;/a&gt;, Hans-Joachim Popp, CIO  at &lt;a href=&quot;http://www.dlr.de/&quot;&gt;DLR&lt;/a&gt;, talks about software in space. Here is the summary.
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;
    Today, software  plays a major role in the construction of spacecrafts. It started in  1964 but it took several years and several catastrophes to change  minds about developing mission-critical software for such high-risk  environment.
&lt;/p&gt;
&lt;p&gt;
    Reasons for space  disasters are not only programming faults but also severe faults in  the requirements engineering and the analysis of the whole system.  Here are some examples:
&lt;/p&gt;
&lt;h4&gt;1. Ariane 5&lt;/h4&gt;
&lt;p&gt;
    Ariane 5 crashed  just because some missing casting; it was just an arithmetic overflow  that had cost about 1 billion Euros. Only some lines of code could  have rescued that. That crash was the major point where the German  software developers in the spacecraft industry began to think  differently about quality assurance in software development.
&lt;/p&gt;
&lt;h4&gt;2. Mars Climate  Orbiter&lt;/h4&gt;
&lt;p&gt;
    The climate orbiter  had calculation errors and didn't go into a proper orbit but got  crashed on the surface of Mars. This was only because the calculation  units were mixed; one team calculated in yards and the others  calculated in metrics. This would be no surprise if the teams would  have been in different countries but there were both in US. It was  due to missing testing environments.
&lt;/p&gt;
&lt;p&gt;
    To avoid such  faults, we should check out hardware pieces and simulate them by  software one by one, so we have a better test environment with the  complete system in software and in hardware.
&lt;/p&gt;
&lt;h3&gt;How  to Avoid Problems&lt;/h3&gt;
&lt;p&gt;
    Popp talks about  space software development in DLR:
&lt;/p&gt;
&lt;h4&gt;1. Process&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
        Some projects  	have different teams from different European countries with  	different languages and cultures. So we have to apply really strict  	methods of cooperation.
    &lt;/li&gt;
    &lt;li&gt;
        We pay a great  	attention to requirements engineering as most of the problems we had  	came from missing requirements.
    &lt;/li&gt;
    &lt;li&gt;
        Our software  	development process is the standard V Model with some more steps in  	between. After the Architecture Design phase, we have a Detailed  	Design phase where we do a very low level unit testing against the  	detailed design.
    &lt;/li&gt;
    &lt;li&gt;
        Missions launch  	before we reach the end of the development because it might take  	years to finalize software. So we start the mission as soon as we  	have the basic software in place. After launch, we continue to learn  	on the way and update even core units of the software.
        &lt;br&gt;&lt;br&gt;
        Today,  	30 years after launch, one of our crafts are still speaking to us.  	This couldn't be without severe changes in the coding. The language  	was all assembly and the memory was only 4k. It takes images and  	uses a tape recorder to store them on tapes.
        &lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.  Tools&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
        We  	use specialized operating systems that have been used and tested for  	many years.
    &lt;/li&gt;
    &lt;li&gt;
        Most  	software is written in pure C but the system and the testing  	environment restrict the use of certain instructions. 
    &lt;/li&gt;
    &lt;li&gt;
        We don't use  	code generation but we invest  	about half an hour for each line of code.
    &lt;/li&gt;
    &lt;li&gt;
        The ratio  	between application code and test code is 1 to 12.
    &lt;/li&gt;
    &lt;li&gt;
        For code  	verification, we use PolySpace.
    &lt;/li&gt;
    &lt;li&gt;
        For  	configuration management, we use ClearCase.
    &lt;/li&gt;
    &lt;li&gt;
        We  	use automatic code reviews and automatic testing.
    &lt;/li&gt;
    &lt;li&gt;
        Automated  	tools can only find a small set of errors but most of errors are  	still in the requirements level (semantic level). You still have to  	review the whole system and to have a test environment where you  	play the whole mission through to see what happens.
    &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. Practices&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
        The most  	important thing is to establish the culture of being free to make  	faults, to find them and to talk about them. Many catastrophes  	occurred because this was missing; most of the errors were known,  	but the management just closed their eyes.
    &lt;/li&gt;
    &lt;li&gt;
        Such  	mission-critical systems need redundancy in software, like having  	software parts written in different languages that control each  	other.
    &lt;/li&gt;
    &lt;li&gt;
        We regularly  	review the code in teams where developers explain the code to others  	who are not involved, junior developers ask questions, etc. This is  	very expensive and time consuming but it leads to a very high  	quality.
    &lt;/li&gt;
    &lt;li&gt;
        We measure  	quality by tracking how many faults we made, errors we found, the  	reasons they occur.
    &lt;/li&gt;
    &lt;li&gt;
        Pure  	development is only 40% of our time, 25% are invested in management  	and system engineering and 35% are invested in the design and  	integration test.
    &lt;/li&gt;
    &lt;li&gt;
        We measured our  	productivity and found out that having this high level of quality we  	can produce only 0.6 lines of code per hour.
    &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
        In such  	high-risk missions, you have to go quite conservatively in slow  	steps.
    &lt;/li&gt;
    &lt;li&gt;
        Every member in  	the team should feel they are free to make, report and discuss  	faults.
    &lt;/li&gt;
    &lt;li&gt;
        Project  	managers have to be open for any remarks from developers.
    &lt;/li&gt;
    &lt;li&gt;
        We spend a  	hundred million Euros every year for software development. It sounds  	too much but this saves money at the end.
    &lt;/li&gt;
&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2009-10-24:5</id>
    <published>2009-10-24T05:41:00Z</published>
    <updated>2010-05-27T04:41:42Z</updated>
    <category term="Thoughts"/>
    <category term="requirements engineering"/>
    <category term="software engineering radio"/>
    <link href="http://www.expressionlab.com/2009/10/24/requirements-engineering-se-radio" rel="alternate" type="text/html"/>
    <title>Requirements Engineering (SE Radio)</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Software Engineering Radio&quot; src=&quot;/assets/2009/10/24/seradio_logo.jpg&quot; alt=&quot;Software Engineering Radio&quot;&gt;If you don't know, &lt;a href=&quot;http://www.se-radio.net/&quot;&gt;Software Engineering Radio&lt;/a&gt;
is a series of podcasts that covers all topics of software engineering. It is a very useful resource for professional software developers. 
In &lt;a href=&quot;http://www.se-radio.net/podcast/2008-10/episode-114-christof-ebert-requirements-engineering&quot;&gt;episode 114&lt;/a&gt;, &lt;a href=&quot;http://www.vector-consulting.de/vc_management_en.html#ebert&quot;&gt;Christof Ebert&lt;/a&gt;
talks about requirements engineering. Here is the summary.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Software Engineering Radio&quot; src=&quot;/assets/2009/10/24/seradio_logo.jpg&quot; alt=&quot;Software Engineering Radio&quot;&gt;If you don't know, &lt;a href=&quot;http://www.se-radio.net/&quot;&gt;Software Engineering Radio&lt;/a&gt;
is a series of podcasts that covers all topics of software engineering. It is a very useful resource for professional software developers. 
In &lt;a href=&quot;http://www.se-radio.net/podcast/2008-10/episode-114-christof-ebert-requirements-engineering&quot;&gt;episode 114&lt;/a&gt;, &lt;a href=&quot;http://www.vector-consulting.de/vc_management_en.html#ebert&quot;&gt;Christof Ebert&lt;/a&gt;
talks about requirements engineering. Here is the summary.
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;
    Christof has seen from a number of projects and also from surveys in the industry that software projects have many problems. The reasons are
    many faults but one thing which is seen repeatedly is that requirements engineering seems to be the number one technical topic where projects
    either succeed or fail.
&lt;/p&gt;
&lt;p&gt;
    Requirements always change and if this is not well addressed, projects run into time and budget constraints and may be with insufficient
    quality. Things can go wrong up to the level of customers finding that the product is not really what they needed. That is the key reason
    requirements engineering is a major challenge in today's software development.
&lt;/p&gt;
&lt;p&gt;
    So requirements engineering is about defining what the system should do, what the value of the product is. This product can be a release of a
    software, a tool, a big IT system, an embedded software system, etc.
&lt;/p&gt;
&lt;p&gt;
    However, there is a relation between the &quot;what&quot; and the &quot;how&quot;. In order to find out what should be done in a project, you need to address how
    it should be done because only by understanding how you will address certain issues, you are better positioned to ask questions to customers
    to know what are their needs. Also, it is useless to come up with requirements that are not implementable because they are too complicated or just not feasible.
&lt;/p&gt;
&lt;h3&gt;Typical Pitfalls&lt;/h3&gt;
&lt;p&gt;
    Requirements engineering is not so difficult if we addressed all the risks. These can be of three categories:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
        &lt;h4&gt;Wrong requirements&lt;/h4&gt;
        &lt;p&gt;
            Like when you produce a nice product in a market that doesn't need it, or when a competitor has a key functionality which you don't have.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h4&gt;Missing requirements&lt;/h4&gt;
        &lt;p&gt;
            This is usually a result of misunderstanding customers or ignoring different users of the system with
            different levels of skills. If you talk to the wrong people, you have missing requirements.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h4&gt;Changing requirements&lt;/h4&gt;
        &lt;p&gt;
            As a rule, requirements change. And if you are not capable of addressing changes by quality control, configuration
            management, etc, this will kill any project because you can't see where the changes impact is.
        &lt;/p&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Types of Requirements&lt;/h3&gt;
&lt;p&gt;
    There are three main types of requirements:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
        &lt;h4&gt;Market requirements&lt;/h4&gt;
        &lt;p&gt;
            These are the requirements from the user perspective. This is the problem space; what they think the system should do.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h4&gt;Product requirements&lt;/h4&gt;
        &lt;p&gt;
            Usually called the feature set, these are how the product is addressing those market requirements. This is the solution space; what the product can offer.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h4&gt;Component requirements&lt;/h4&gt;
        &lt;p&gt;
            This is how the product requirements can be translated into product functionality.
        &lt;/p&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
    Also, you should differentiate two types of requirements:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
        &lt;h4&gt;Functional requirements&lt;/h4&gt;
        &lt;p&gt;
            These are the basic functions of the system.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h4&gt;Non-functional requirements&lt;/h4&gt;
        &lt;p&gt;
            Examples include how fast the product should process a file, how secure is it, etc.
        &lt;/p&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Activities&lt;/h3&gt;
&lt;p&gt;
    The word &quot;engineering&quot; implies that there is a systematic approach to dealing with requirements. This includes a set of activities:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
        &lt;h4&gt;Elicitation&lt;/h4&gt;
        &lt;p&gt;
            This gives you the &quot;What&quot;. This is not just collecting requirements, it includes:
        &lt;/p&gt;
        &lt;ul&gt;
&lt;li&gt;
                Defining dependencies
            &lt;/li&gt;
            &lt;li&gt;
                Understanding the customer's real needs. Normally you don't fully understand the business model, context, usage models, market, etc. Make
                sure you understand customer needs. Put your self in the position of the standard user.
            &lt;/li&gt;
            &lt;li&gt;
                Knowing who to ask and considering different users. For example, managers usually care about time frame and economic requirements
                instead of functionality. Prepare a few questions that help you find out if they are you the right person to ask about a certain feature.
            &lt;/li&gt;
            &lt;li&gt;
                Don't spend too much effort trying to expect all possible potential requirements before the project starts. Remember, requirements change.
            &lt;/li&gt;
            &lt;li&gt;
                The outcome is:
                &lt;ol&gt;
&lt;li&gt;
                        A concise vision on what value is to deliver
                    &lt;/li&gt;
                    &lt;li&gt;
                        A list of needs
                    &lt;/li&gt;
                    &lt;li&gt;
                        A draft requirements specifications
                    &lt;/li&gt;
                &lt;/ol&gt;
&lt;/li&gt;
        &lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;
        &lt;h4&gt;Specifications&lt;/h4&gt;
        &lt;p&gt;
            This is about clearly describing requirements. The target is to get mutual understanding of what should be done and how it should be done.
        &lt;/p&gt;
        &lt;ul&gt;
&lt;li&gt;
                You need to get something on paper to reference functionality; like use cases
            &lt;/li&gt;
            &lt;li&gt;
                Outcome: a written baseline about the requirements
            &lt;/li&gt;
            &lt;li&gt;
                How to write specs that are not easy to misunderstand:
                &lt;ul&gt;
&lt;li&gt;
                        Specs are not a purpose in itself
                    &lt;/li&gt;
                    &lt;li&gt;
                        Writing a glossary or dictionary to make sure you and your client understand each other
                    &lt;/li&gt;
                    &lt;li&gt;
                        Using diagrams with description
                    &lt;/li&gt;
                    &lt;li&gt;
                        Be precise. Don't use words like: might, perhaps, at least, etc. This
                        makes it difficult to implement. Use numbers where possible.
                    &lt;/li&gt;
                    &lt;li&gt;
                        Use modeling to have better understanding. Use UML or even plain text.
                    &lt;/li&gt;
                &lt;/ul&gt;
&lt;/li&gt;
        &lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;
        &lt;h4&gt;Analysis&lt;/h4&gt;
        &lt;p&gt;
            This builds the bridge between the what and the how.
        &lt;/p&gt;
        &lt;ul&gt;
&lt;li&gt;
                Helps to address the write questions
            &lt;/li&gt;
            &lt;li&gt;
                Helps you decide what kind of components, language, architecture, etc to use. So helps reduce the solution space
            &lt;/li&gt;
            &lt;li&gt;
                Help you realize what constraints, priorities are there
            &lt;/li&gt;
            &lt;li&gt;
                Helps you identify what are most effective requirements in terms of functionality and cost
            &lt;/li&gt;
            &lt;li&gt;
                Prioritization analysis results in dependency graph. You would know if you remove a feature what market requirement will be missed
            &lt;/li&gt;
        &lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;
        &lt;h4&gt;Validation&lt;/h4&gt;
        &lt;p&gt;
            This about making sure you have addressed the right topics and understood what is needed to relate the product to customer/market needs.
        &lt;/p&gt;
        &lt;ul&gt;
&lt;li&gt;
                It builds a basis for test cases
            &lt;/li&gt;
            &lt;li&gt;
                Good requirements should be achievable (technical and budget), testable, and implementable
            &lt;/li&gt;
        &lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;
        &lt;h4&gt;Commitment&lt;/h4&gt;
        &lt;p&gt;
            Now, we know customer needs, we know the way we want to address these needs.
        &lt;/p&gt;
        &lt;ul&gt;
&lt;li&gt;
                You need to map them into releases with time constraints
            &lt;/li&gt;
            &lt;li&gt;
                Commit internally and externally: capacity and needs
            &lt;/li&gt;
            &lt;li&gt;
                Don't commit too early until you are certain about all requirements
            &lt;/li&gt;
            &lt;li&gt;
                Commit only to a subset of the requirements in initial iterations and once you learn more in the subsequent iterations, you can commit to more
            &lt;/li&gt;
            &lt;li&gt;
                Make sure the parts that are not clear yet have no architectural impact. You need to know the nonfunctional requirements very early.
                But don't keep the analysis phase too long
            &lt;/li&gt;
        &lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;
        &lt;h4&gt;Management&lt;/h4&gt;
        &lt;p&gt;
            Requirements change and you need to manage these changes. This is actually the bridge to the development process.
        &lt;/p&gt;
        &lt;ul&gt;
&lt;li&gt;
                Make sure you always have a clear baseline
            &lt;/li&gt;
            &lt;li&gt;
                When there is a change, trace it to the downstream and upstream requirements to know the side impacts 
            &lt;/li&gt;
            &lt;li&gt;
                Use modeling tools to build and maintain models
            &lt;/li&gt;
            &lt;li&gt;
                Make sure u always have one main baseline
            &lt;/li&gt;
            &lt;li&gt;
                This gives you Visibility:
                &lt;ul&gt;
&lt;li&gt;
                        Customer requirements and products requirements
                    &lt;/li&gt;
                    &lt;li&gt;
                        Tracking changes; amount, impact, capability to handle. This can be used later to review
                    &lt;/li&gt;
                    &lt;li&gt;
                        Status info about to which degree have you implemented a certain requirement, to which degree can you relate that to project progress.
                        This helps you detect problems early.
                    &lt;/li&gt;
                &lt;/ul&gt;
&lt;/li&gt;
        &lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt; Summary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
        Requirements engineering needs discipline
    &lt;/li&gt;
    &lt;li&gt;
        Requirements engineering is team work
    &lt;/li&gt;
    &lt;li&gt;
        Requirements engineering is about risk management
    &lt;/li&gt;
    &lt;li&gt;
        Requirements engineering is not linked to a certain development process
    &lt;/li&gt;
    &lt;li&gt;
        Requirements engineering is a part of the project that consumes resources but helps you handle changes, keep deadlines and deliver high quality products
    &lt;/li&gt;
    &lt;li&gt;
        Requirements engineering is not about formalism or unnecessary overheads
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
    I hope you find this useful.
&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2009-08-28:6</id>
    <published>2009-08-28T05:41:00Z</published>
    <updated>2010-05-27T04:41:53Z</updated>
    <category term="Thoughts"/>
    <category term="contest"/>
    <category term="presentation"/>
    <link href="http://www.expressionlab.com/2009/8/28/please-vote-for-my-presentation-on-slideshare" rel="alternate" type="text/html"/>
    <title>Please Vote for My Presentation on SlideShare</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;World’s Best Presentation Contest 2009&quot; src=&quot;/assets/2009/8/28/best-presentation-contest-2009.png&quot; alt=&quot;World’s Best Presentation Contest 2009&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/&quot;&gt;SlideShare&lt;/a&gt; is the best way to share your presentations with the world.  Currently, they are hosting their &lt;a href=&quot;http://www.slideshare.net/contest/worlds-best-presentation-contest-2009&quot;&gt;World’s Best Presentation Contest 2009&lt;/a&gt;. I have submitted my presentation, &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/HatemMahmoud/web30-1884321&quot;&gt;Web 3.0, The Semantic Web&lt;/a&gt;&lt;/strong&gt;, which I have presented before at &lt;a href=&quot;http://www.alexsb.org/itw/&quot;&gt;ITW 2009&lt;/a&gt;.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;World’s Best Presentation Contest 2009&quot; src=&quot;/assets/2009/8/28/best-presentation-contest-2009.png&quot; alt=&quot;World’s Best Presentation Contest 2009&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/&quot;&gt;SlideShare&lt;/a&gt; is the best way to share your presentations with the world.  Currently, they are hosting their &lt;a href=&quot;http://www.slideshare.net/contest/worlds-best-presentation-contest-2009&quot;&gt;World’s Best Presentation Contest 2009&lt;/a&gt;. I have submitted my presentation, &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/HatemMahmoud/web30-1884321&quot;&gt;Web 3.0, The Semantic Web&lt;/a&gt;&lt;/strong&gt;, which I have presented before at &lt;a href=&quot;http://www.alexsb.org/itw/&quot;&gt;ITW 2009&lt;/a&gt;.
&lt;p&gt;Please do me a favor. &lt;a href=&quot;http://www.slideshare.net/HatemMahmoud/web30-1884321&quot;&gt;Check out the presentation&lt;/a&gt; and, if you like it, vote for it. &lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2009-07-14:7</id>
    <published>2009-07-14T04:41:00Z</published>
    <updated>2010-05-27T04:41:59Z</updated>
    <category term="Thoughts"/>
    <category term="presentation"/>
    <category term="semantic web"/>
    <category term="web 3.0"/>
    <link href="http://www.expressionlab.com/2009/7/14/web-3-0-the-semantic-web" rel="alternate" type="text/html"/>
    <title>Web 3.0 The Semantic Web</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Semantic Web&quot; src=&quot;/assets/2009/7/14/semantic-web.png&quot; alt=&quot;Semantic Web&quot;&gt; Here are the slides I have presented at &lt;a href=&quot;http://www.alexsb.org/itw/&quot;&gt;ITW 2009&lt;/a&gt;, organized by &lt;a href=&quot;http://www.alexsb.org/&quot;&gt;IEEE AlexSB&lt;/a&gt; in &lt;a href=&quot;http://www.bibalex.org/&quot;&gt;Bibliotheca Alexandrina&lt;/a&gt;. The session was about &lt;strong&gt;Web 3.0, The Semantic Web&lt;/strong&gt;.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Semantic Web&quot; src=&quot;/assets/2009/7/14/semantic-web.png&quot; alt=&quot;Semantic Web&quot;&gt; Here are the slides I have presented at &lt;a href=&quot;http://www.alexsb.org/itw/&quot;&gt;ITW 2009&lt;/a&gt;, organized by &lt;a href=&quot;http://www.alexsb.org/&quot;&gt;IEEE AlexSB&lt;/a&gt; in &lt;a href=&quot;http://www.bibalex.org/&quot;&gt;Bibliotheca Alexandrina&lt;/a&gt;. The session was about &lt;strong&gt;Web 3.0, The Semantic Web&lt;/strong&gt;.
&lt;div&gt;
	&amp;lt;object height=&quot;388&quot; width=&quot;470&quot;&gt;
		&amp;lt;param&gt;
&amp;lt;param&gt;
&amp;lt;param&gt;
&amp;lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=web-3-0-the-semantic-web-090714041600-phpapp02&amp;amp;amp;rel=0&amp;amp;amp;stripped_title=web-30-the-semantic-web&quot; height=&quot;388&quot; width=&quot;470&quot;&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2009-05-27:15</id>
    <published>2009-05-27T04:42:00Z</published>
    <updated>2010-05-27T04:42:09Z</updated>
    <category term="Thoughts"/>
    <category term="kubuntu"/>
    <category term="linux"/>
    <link href="http://www.expressionlab.com/2009/5/27/trying-kubuntu-linux-for-windows-users" rel="alternate" type="text/html"/>
    <title>Trying Kubuntu/Linux for Windows Users</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Kubuntu&quot; src=&quot;/assets/2009/5/18/kubuntu.png&quot; alt=&quot;Kubuntu&quot; width=&quot;150&quot;&gt;If you are a &lt;a href=&quot;http://en.wikipedia.org/wiki/Microsoft_Windows&quot;&gt;Windows&lt;/a&gt; user and just want to give &lt;a href=&quot;http://en.wikipedia.org/wiki/Linux&quot;&gt;Linux&lt;/a&gt; a try, &lt;a href=&quot;http://en.wikipedia.org/wiki/Ubuntu&quot;&gt;Ubuntu&lt;/a&gt; is the right choice. Ubuntu is known to be &quot;Linux for human beings&quot; - the word &quot;ubuntu&quot; means &quot;humanity&quot; in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Bemba_language&quot;&gt;Bemba language&lt;/a&gt;. However, what usually keeps Windows users from trying Linux is the need for formatting a special partition and the complex installation steps that may damage Windows files.</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Kubuntu&quot; src=&quot;/assets/2009/5/18/kubuntu.png&quot; alt=&quot;Kubuntu&quot; width=&quot;150&quot;&gt;If you are a &lt;a href=&quot;http://en.wikipedia.org/wiki/Microsoft_Windows&quot;&gt;Windows&lt;/a&gt; user and just want to give &lt;a href=&quot;http://en.wikipedia.org/wiki/Linux&quot;&gt;Linux&lt;/a&gt; a try, &lt;a href=&quot;http://en.wikipedia.org/wiki/Ubuntu&quot;&gt;Ubuntu&lt;/a&gt; is the right choice. Ubuntu is known to be &quot;Linux for human beings&quot; - the word &quot;ubuntu&quot; means &quot;humanity&quot; in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Bemba_language&quot;&gt;Bemba language&lt;/a&gt;. However, what usually keeps Windows users from trying Linux is the need for formatting a special partition and the complex installation steps that may damage Windows files.
&lt;p&gt;A great solution to this is &lt;a href=&quot;http://wubi-installer.org/&quot;&gt;Wubi&lt;/a&gt;, a free Windows installer that allows you to install and uninstall Ubuntu as any other Windows application without the need for a dedicated partition.&lt;/p&gt;

&lt;p&gt;Before we start, I want to mention that there are several operating systems derived from Ubuntu, &lt;a href=&quot;http://www.ubuntu.com/products/whatisubuntu/derivatives&quot;&gt;Ubuntu derivatives&lt;/a&gt;. We will go with &lt;a href=&quot;http://www.kubuntu.org/&quot;&gt;Kubuntu&lt;/a&gt; that uses a more user-friendly desktop environment, &lt;a href=&quot;http://en.wikipedia.org/wiki/KDE&quot;&gt;KDE&lt;/a&gt;, than &lt;a href=&quot;http://en.wikipedia.org/wiki/GNOME&quot;&gt;GNOME&lt;/a&gt; that comes with Ubuntu.&lt;/p&gt;

&lt;p&gt;So how to start? First, go download the &lt;a href=&quot;http://wubi-installer.org/latest.php&quot;&gt;latest version of Wubi&lt;/a&gt;, 9.04. Then, download the &lt;a href=&quot;http://www.kubuntu.org/getkubuntu/download&quot;&gt;latest version of Kubuntu&lt;/a&gt;, 9.04, and place the .iso file in the same folder as wubi.exe. This way, Wubi will install Kubuntu from this .iso file. Otherwise, Wubi will try to download the latest version for you.&lt;/p&gt;

&lt;p&gt;Now, run wubi.exe and:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the installation drive. This should be an NTFS drive with a minimum free space of 5 GB. I recommend 10 GB or more&lt;/li&gt;
  &lt;li&gt;Specify installation size. This is the maximum size of the file that will hold your Kubuntu. Note that you won't be able to change this size later unless you decide to migrate the installation to a dedicated partition with a different size. I learned this the hard way&lt;/li&gt;
  &lt;li&gt;Select Kununtu as your desktop environment&lt;/li&gt;
  &lt;li&gt;Enter a username and a password for your account&lt;/li&gt;
  &lt;li&gt;Press &quot;Install&quot;&lt;/li&gt;
  &lt;li&gt;After the installation is complete, press &quot;Finish&quot; to reboot the system&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should now see a new screen with an option to boot with Kubuntu. Congratulations!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/2009/5/28/kubuntu.png&quot;&gt;&lt;img title=&quot;Kubuntu&quot; class=&quot;photo&quot; src=&quot;/assets/2009/5/28/kubuntu-small.png&quot; alt=&quot;Kubuntu&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you log in to Kubuntu, you will find two widgets, similar to Windows gadgets, on the desktop: Application Launcher and Home Folder. Using the icon on the top right corner of the desktop, you can add new widgets to the desktop or the bottom panel (similar to Windows task bar). To access the Terminal, use the &quot;Applications&quot; tab on the &quot;Application Launcher&quot;.&lt;/p&gt;

&lt;p&gt;The next thing you may want to do is to install Microsoft core fonts. Type the following in your terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install ttf-mscorefonts-installer&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Another thing to mention is that you may search for the &quot;Show Desktop&quot; icon on the bottom panel as you would do with Windows task bar. Unfortunately, you won't find it their. To add it, click the icon at the rightmost of the bottom panel, click &quot;Add Widgets...&quot;, select the &quot;Show Desktop&quot; widget, press &quot;Add Widget&quot;, and press &quot;Close&quot;.&lt;/p&gt;

&lt;p&gt;But what if you want to use the same shortcut you use to show Windows desktop? Right-click the &quot;Show Desktop&quot; icon on the bottom panel, select &quot;Show Desktop Settings&quot;, press the big button to enter a keyboard shortcut, press both &quot;Windows Key&quot; and &quot;D&quot;, and press &quot;OK&quot;.&lt;/p&gt;

&lt;p&gt;Finally, to uninstall Kubuntu at any time, use the Windows control panel as you would do with any Windows application.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2009-05-12:20</id>
    <published>2009-05-12T04:42:00Z</published>
    <updated>2010-05-27T04:42:16Z</updated>
    <category term="Thoughts"/>
    <category term="mobile"/>
    <category term="presentation"/>
    <category term="symbian"/>
    <link href="http://www.expressionlab.com/2009/5/12/introduction-to-symbian-os" rel="alternate" type="text/html"/>
    <title>Introduction to Symbian OS</title>
<summary type="html">&lt;img class=&quot;excerpt_image&quot; title=&quot;Symbian OS&quot; src=&quot;/assets/2009/5/12/symbian-os.png&quot; alt=&quot;Symbian OS&quot;&gt;Here is the slides I have presented on Symbian OS in a course of my Computer Science diploma at &lt;a href=&quot;http://www.aast.edu/&quot;&gt;AAST&lt;/a&gt;. The target was to present a session in 10 minutes!</summary><content type="html">
            &lt;img class=&quot;excerpt_image&quot; title=&quot;Symbian OS&quot; src=&quot;/assets/2009/5/12/symbian-os.png&quot; alt=&quot;Symbian OS&quot;&gt;Here is the slides I have presented on Symbian OS in a course of my Computer Science diploma at &lt;a href=&quot;http://www.aast.edu/&quot;&gt;AAST&lt;/a&gt;. The target was to present a session in 10 minutes!
&lt;div&gt;
    &amp;lt;object height=&quot;388&quot; width=&quot;470&quot;&gt;
        &amp;lt;param&gt;
&amp;lt;param&gt;
&amp;lt;param&gt;
&amp;lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=symbianos-090714040129-phpapp02&amp;amp;amp;rel=0&amp;amp;amp;stripped_title=introduction-to-symbian-os&quot; height=&quot;388&quot; width=&quot;470&quot;&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://www.expressionlab.com/">
    <author>
      <name>hatem</name>
    </author>
    <id>tag:www.expressionlab.com,2009-04-23:21</id>
    <published>2009-04-23T05:42:00Z</published>
    <updated>2010-05-27T04:42:24Z</updated>
    <category term="Thoughts"/>
    <category term="mephisto"/>
    <category term="rails"/>
    <category term="tutorial"/>
    <link href="http://www.expressionlab.com/2009/4/23/installing-mephisto-0-8-2-on-rails-2-2-2" rel="alternate" type="text/html"/>
    <title>Installing Mephisto 0.8.2 on Rails 2.2.2</title>
<summary type="html">&lt;img title=&quot;Mephisto&quot; class=&quot;excerpt_image&quot; src=&quot;/images/mephisto/logo.png&quot; alt=&quot;Mephisto&quot;&gt;After the &lt;a href=&quot;/2008/9/17/installing-mephisto-0-8-on-rails-2-1&quot;&gt;hard times with Mephisto&lt;/a&gt;, finally, &lt;a href=&quot;http://mephistoblog.com/2009/2/7/mephisto-0-8-2-released&quot;&gt;Mephisto 0.8.2 has been released&lt;/a&gt;. Although all of previous problems were gone, there might be couple of tricks.</summary><content type="html">
            &lt;img title=&quot;Mephisto&quot; class=&quot;excerpt_image&quot; src=&quot;/images/mephisto/logo.png&quot; alt=&quot;Mephisto&quot;&gt;After the &lt;a href=&quot;/2008/9/17/installing-mephisto-0-8-on-rails-2-1&quot;&gt;hard times with Mephisto&lt;/a&gt;, finally, &lt;a href=&quot;http://mephistoblog.com/2009/2/7/mephisto-0-8-2-released&quot;&gt;Mephisto 0.8.2 has been released&lt;/a&gt;. Although all of previous problems were gone, there might be couple of tricks.
&lt;p&gt;
    Again, following the link on the &lt;a href=&quot;http://mephistoblog.com/2009/2/7/mephisto-0-8-2-released&quot;&gt;announcement post&lt;/a&gt;
    leads to a version that produces some errors while installing. After a while, I decided to give the &lt;a href=&quot;http://github.com/emk/mephisto/tree/master&quot;&gt;master branch&lt;/a&gt;
    a try and, surprise, it worked just fine. Here are the steps that worked on Windows and Ubunto (the order is important):
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If you didn't already, &lt;a href=&quot;/2009/1/17/upgrading-instantrails-to-rails-2-2-on-windows&quot;&gt;install Rails 2.2.2&lt;/a&gt;:&lt;pre&gt;&lt;code&gt;gem install -v 2.2.2 rails&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
    &lt;li&gt;Download from github:&lt;pre&gt;&lt;code&gt;git clone git://github.com/emk/mephisto.git&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
    &lt;li&gt;&lt;pre&gt;&lt;code&gt;cd mephisto&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
    &lt;li&gt;Create a secret key for encrypting session cookies:&lt;pre&gt;&lt;code&gt;rake config/initializers/session_store.rb&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
    &lt;li&gt;Copy &lt;strong&gt;config/database.example.yml&lt;/strong&gt; to &lt;strong&gt;config/database.yml&lt;/strong&gt; and edit the database configuration&lt;/li&gt;
    &lt;li&gt;Install required gems: &lt;pre&gt;&lt;code&gt;rake gems:install&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
    &lt;li&gt;Create a database for the current environment: &lt;pre&gt;&lt;code&gt;rake db:create&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
    &lt;li&gt;Bootstrap the database with basic data and theme: &lt;pre&gt;&lt;code&gt;rake db:bootstrap&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
    &lt;li&gt;Start the server: &lt;pre&gt;&lt;code&gt;ruby script/server&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
    &lt;li&gt;Visit &lt;strong&gt;http://localhost:3000&lt;/strong&gt; and everything should be fine&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By the way, if want to run the tests&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rake db:create RAILS_ENV=test&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you may get this error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rake aborted!
Unknown database&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To solve this, you need to &lt;a href=&quot;http://egret-project.blogspot.com/2008/12/rake-aborted-unknown-database.html&quot;&gt;temporarily disable class caching&lt;/a&gt; during database creation:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;#config/environments/test.rb
config.cache_classes = false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, you should be able to run tests:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rake test&lt;/code&gt;&lt;/pre&gt;
          </content>  </entry>
</feed>
