Miriam Ruiz
random thoughts on technology and life











{July 15, 2010}   The 12 steps of the burnout syndrome

Jono Bacon made some really great slides about burnout last year, and I think it’s such an important topic that I want to bring it up again here. Scientific American MIND for June/July 2006 had a cover story on The Science of Burnout. Even though the article isn’t online, I was able to find a list of the 12 stages of the burnout cycle online. It has to be noted, however, that, according to Herbert Freudenberger and Gail North, the cycles don’t necessarily follow in order and some people skip steps or have more than one at a time.

  1. A compulsion to prove oneself: The beginning is often excessive ambition: their desire to prove themselves at work turns into grim determination and compulsion. They must show their colleagues – and above all themselves – that they are doing an excellent job in every way.
  2. Working harder: To meet their high personal expectations, they take on more work and buckle down. They become obsessed with handling everything themselves, which in turn demonstrates their notions of “irreplaceability.”
  3. Neglecting their needs: Their schedules leave no time except for work, and they dismiss as unimportant other necessities such as sleeping, eating, and seeing friends and family. They tell themselves that these sacrifices are proof of heroic performance.
  4. Displacement of conflicts: They are aware that something is not right but cannot see the sources of their problems. To deal with the root causes of their distress might set off a crisis and is thus seen as threatening. Often the first physical symptoms emerge at this stage.
  5. Revision of values: Isolation, conflict avoidance and denial of basic physical needs change their perceptions. They revise their value systems, and once important things such as friends or hobbies are completely dismissed. Their only standard for evaluation of their self-worth is their jobs. They become increasingly emotionally blunted.
  6. Denial of emerging problems: They develop intolerance, perceiving colleagues as stupid, lazy , demanding or undisciplined. Social contacts feel almost unbearable. Cynicism and aggression become more apparent. They view their increasing problems as caused by time pressure and the amount of work they have – not by the ways they have changed.
  7. Withdrawal: They reduce social contact to a minimum, becoming isolated and walled off. They feel increasingly that they are without hope or direction. They work obsessively “by the book” on the job. May seek release through alcohol or drugs.
  8. Obvious behavioral changes: Others in their immediate social circles can no longer overlook their behavioral changes. The once lively and engaged victims of overwork have become fearful, shy and apathetic. Inwardly, they feel increasingly worthless.
  9. Depersonalization: They lose contact with themselves. They see neither themselves nor others as valuable and no longer perceive their own needs. Their perspective of time narrows to the present. Life becomes a series of mechanical functions.
  10. Inner emptiness: Their inner emptiness expands relentlessly. To overcome this feeling, they desperately seek activity. Overreactions such as exaggerated sexuality, overeating, and drug or alcohol use emerge. Leisure time is dead time.
  11. Depression: In this phase, burnout syndrome corresponds to depression. The overwhelmed people become indifferent, hopeless, exhausted and believe the future holds nothing for them. Any of the symptoms of depression may be manifest, from agitation to apathy. Life loses meaning.
  12. Burnout syndrome: Almost all burnout victims now have suicidal thoughts to escape their situation. A few actually carry them out. Ultimately, they suffer total mental and physical collapse. Patients in this phase need immediate medical attention.


{March 24, 2010}   Ada Lovelace Day 2010

Today is March 24th, that means Ada Lovelace Day, and it is being pushed as an international day of blogging to celebrate the achievements of women in technology and science. The aim of Ada Lovelace Day is to focus on building female role models not just for girls and young women but also for those of us in tech who would like to feel that we are not alone in our endeavours.

There are some very good examples of women that have been important in the development of science and technology, starting with Ada Lovelace herself (the first developer of an algorithm intended to be processed by a machine), Rear Admiral Grace Murray Hopper (developer of the first compiler for a computer programming language), Adele Goldstine (who wrote the complete technical description for the first digital computer, ENIAC), as well as the six women who did most of the programming of if (Kay McNulty, Betty Jennings, Betty Snyder, Marlyn Wescoff, Fran Bilas and Ruth Lichterman), or women scientists, or women inventors, etc.

Well, I’m not going to write about any of those, even when any of them would surely deserve that and more for sure. I’m going to write about a woman who has definitely been very inspiring and supportive for me when I was starting to get in touch with Free Software and Debian, and who is probably the most important single reason I decided to go for it. It is definitely hard to write about someone you admire when she happens to be one of your best friends, and in fact I’m pretty sure that most of the people reading this article already know her, so there’s no great mistery. I’m talking about Amaya Rodrigo, the first european female Debian Developer (AFAIK) and co-founder of the Debian Women project, and also member of Hispalinux Board in the golden days.

The first time I met her she was giving a talk in Madrid about a project that was starting then, Debian Women, and it was very inspiring for me. Inspiring enough for me to join the project. Afterwards I’ve learnt more about her, how she overcame many dificulties, like starting to work with computers quite late, among others. The real merit of a pioneer is not really to be the best techie out there, but to overcome the difficulties and doing it the best you can, when no one else has done it before. I’m not going to write her biography here, it’s not really the purpose of this blog entry, and you probably can ask herself directly. This blog entry is, as I said at the beginning, to highlight women in technology that I consider inspiring and relevant. You know, I admire you, Amaya :)



{January 16, 2010}   Packaging openFrameworks for Ubuntu and Debian

It seems that I’m not blogging as often as I was some months ago. The main reason is microblogging, which is somehow quicker, even though briefer. It is also less informative, I guess, because 140 characters is a very limited length. Probably because of that, a friend of mine asked me to write a proper blog entry about this, and I think that he’s probably right.

openFrameworks is an open source toolkit, released under the MIT license, written in C++ and designed to assist the creative process by providing a simple and intuitive framework for experimentation. According to its authors, it was developed for folks using computers for creative, artistic expression, and who would like low level access to the data inside of media in order manipulate, analyze or explore. I attended a short course in openFrameworks some months ago, and decided that if I wanted to experiment with it, I should somehow structure the building process of the library a bit, remove the dependency on FMOD, which is not DFSG-free, even though that might require remove the whole audio subsystem, make it buildable without Code::Blocks, and hopefully build some more-or-less proper packages. I’ve also added some pkg-config files, so that it becomes easier to build projects based in openFrameworks (as easy as ‘g++ source.cpp -o test $(pkg-config openframeworks openframeworks-addons –cflags –libs)‘).

Even though the packages are still not as good as they should, they’re absolutely usable right now. I’ve uploaded them, as well as their dependencies, to my Ubuntu PPA (although I’m using those packages in my Debian), in case that someone is interested. I’ve also uploaded a couple of tiny examples (the second one downloaded from here) of openFrameworks.



{September 03, 2009}   New cutie in Debian: Zaz

Zaz (“Zaz ain’t Z***”) is nice action puzzle game, similar to Zuma, in which you have to get rid of all the balls that roll around the screen through some given paths by rearranging their order in the chain. The balls explode and dissapear when three or more of the same color get in contact. The whole game is controlled through the mouse device.


 

Through the game  some special balls appear, with a tiny symbol over them, that makes your life easier by doing thinks like make all the balls step back a bit, making them move more slowly, stopping them for a while or giving you a ray to help you point your device and get and drop the balls where you want. You lose a life when the balls reach their destination hole, so be quick!

The game currently has 10 different levels, but will probably have more in the future, and needs a 3D accelerator for decent gameplay. Zaz has just entered Debian repositories. If you like arcade puzzles, you should definitely give it a try. If you use Ubuntu Jaunty, you can also find it in my PPA.

The original game included CC-by-sa-nc 3.0 music from Nine Inch Nails, which had to be removed for the game to go into Debian Main.

The game has already been translated to Polish and Spanish, probably other translations will follow in the future, but it is not really text-based at all, so that shouldn’t really be a problem for anyone.



{September 01, 2009}   Adding a new HTML tag to Mozilla: mark

Starting from the patch included in bug report #485377 (” Implement HTML5’s <mark> tag”), it is easy to see the steps for adding a new tag to Mozilla. In this case the new HTML 5 tag mark, used for indicating text as marked or highlighted for reference purposes, due to its relevance in another context.

Lets start by adding the tag to the tag dictionary:

--- src.orig/content/base/src/nsGkAtomList.h
+++ src/content/base/src/nsGkAtomList.h
@@ -518,6 +518,7 @@
 GK_ATOM(manifest, "manifest")
 GK_ATOM(marginheight, "marginheight")
 GK_ATOM(marginwidth, "marginwidth")
+GK_ATOM(mark, "mark")
 GK_ATOM(marquee, "marquee")
 GK_ATOM(match, "match")
 GK_ATOM(max, "max")
--- src.orig/parser/htmlparser/public/nsHTMLTagList.h
+++ src/parser/htmlparser/public/nsHTMLTagList.h
@@ -128,6 +128,7 @@
 HTML_TAG(link, Link)
 HTML_TAG(listing, Span)
 HTML_TAG(map, Map)
+HTML_TAG(mark, Span)
 HTML_TAG(marquee, Div)
 HTML_TAG(menu, Shared)
 HTML_TAG(meta, Meta)
--- src.orig/parser/htmlparser/src/nsElementTable.cpp
+++ src/parser/htmlparser/src/nsElementTable.cpp
@@ -767,6 +767,15 @@
 /*special parents,kids*/            0,&gMapKids,
 },
 {
+    /*tag*/                             eHTMLTag_mark,
+    /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
+    /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
+    /*autoclose starttags and endtags*/ 0,0,0,0,
+    /*parent,incl,exclgroups*/          kSpecial, (kInlineEntity|kSelf|kFlowEntity), kNone,
+    /*special props, prop-range*/       0,kDefaultPropRange,
+    /*special parents,kids*/            0,0,
+  },
+  {
 /*tag*/                             eHTMLTag_marquee,
 /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
 /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
--- src.orig/parser/htmlparser/src/nsHTMLTags.cpp
+++ src/parser/htmlparser/src/nsHTMLTags.cpp
@@ -175,6 +175,8 @@
 {'l', 'i', 's', 't', 'i', 'n', 'g', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_map[] =
 {'m', 'a', 'p', '\0'};
+static const PRUnichar sHTMLTagUnicodeName_mark[] =
+  {'m', 'a', 'r', 'k', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_marquee[] =
 {'m', 'a', 'r', 'q', 'u', 'e', 'e', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_menu[] =

Now for the second part, adding the style that the tag will have by default:

--- src.orig/dist/firefox/res/html.css
+++ src/dist/firefox/res/html.css
@@ -61,7 +61,7 @@
 * inherited value) to the transformed element." */

 address, blockquote, body, caption, center, col, colgroup, dd, dir, div, dl, dt,
-fieldset, form, h1, h2, h3, h4, h5, h6, hr, html, isindex, li, listing, map, 
+fieldset, form, h1, h2, h3, h4, h5, h6, hr, html, isindex, li, listing, map, mark,
 marquee, menu, noframes, ol, p, plaintext, pre, table, tbody, td, tfoot, th,
 thead, tr, ul, xmp {
 unicode-bidi: embed;
@@ -335,6 +335,11 @@
 white-space: nowrap;
 }

+mark {
+  background-color: #ff9;
+  font-weight: bolder;
+}
+
 /* titles */
 abbr[title], acronym[title] {
 border-bottom: dotted 1px;
@@ -488,8 +493,8 @@
 center:focus, cite:focus, code:focus, col:focus, colgroup:focus, dd:focus,
 del:focus, dfn:focus, dir:focus, div:focus, dl:focus, dt:focus, em:focus,
 fieldset:focus, font:focus, form:focus, h1:focus, h2:focus, h3:focus, h4:focus,
-h5:focus, h6:focus, hr:focus, i:focus, img:focus, ins:focus,
-kbd:focus, label:focus, legend:focus, li:focus, link:focus, menu:focus,
+h5:focus, h6:focus, hr:focus, i:focus, img:focus, ins:focus, kbd:focus,
+label:focus, legend:focus, li:focus, link:focus, mark:focus, menu:focus,
 object:focus, ol:focus, p:focus, pre:focus, q:focus, s:focus, samp:focus,
 small:focus, span:focus, strike:focus, strong:focus, sub:focus, sup:focus,
 table:focus, tbody:focus, td:focus, tfoot:focus, th:focus, thead:focus,
--- src.orig/layout/style/html.css
+++ src/layout/style/html.css
@@ -61,7 +61,7 @@
 * inherited value) to the transformed element." */

 address, blockquote, body, caption, center, col, colgroup, dd, dir, div, dl, dt,
-fieldset, form, h1, h2, h3, h4, h5, h6, hr, html, isindex, li, listing, map,
+fieldset, form, h1, h2, h3, h4, h5, h6, hr, html, isindex, li, listing, map, mark,
 marquee, menu, noframes, ol, p, plaintext, pre, table, tbody, td, tfoot, th,
 thead, tr, ul, xmp {
 unicode-bidi: embed;
@@ -335,6 +335,11 @@
 white-space: nowrap;
 }

+mark {
+  background-color: #ff9;
+  font-weight: bolder;
+}
+
 /* titles */
 abbr[title], acronym[title] {
 border-bottom: dotted 1px;
@@ -488,8 +493,8 @@
 center:focus, cite:focus, code:focus, col:focus, colgroup:focus, dd:focus,
 del:focus, dfn:focus, dir:focus, div:focus, dl:focus, dt:focus, em:focus,
 fieldset:focus, font:focus, form:focus, h1:focus, h2:focus, h3:focus, h4:focus,
-h5:focus, h6:focus, hr:focus, i:focus, img:focus, ins:focus,
-kbd:focus, label:focus, legend:focus, li:focus, link:focus, menu:focus,
+h5:focus, h6:focus, hr:focus, i:focus, img:focus, ins:focus, kbd:focus,
+label:focus, legend:focus, li:focus, link:focus, mark:focus, menu:focus,
 object:focus, ol:focus, p:focus, pre:focus, q:focus, s:focus, samp:focus,
 small:focus, span:focus, strike:focus, strong:focus, sub:focus, sup:focus,
 table:focus, tbody:focus, td:focus, tfoot:focus, th:focus, thead:focus,

There it is. The next part should be to find out how to take that tag into account, probably modifying toolkit/content/widgets/findbar.xml, so that when you search for a text, you can get the information from it, but that’s something that should be carefully thought.



{September 01, 2009}   Compiling Firefox from scratch (in Debian)

After Madrid Mozilla Technologies Course (MMTC) in July, which was great, and apart from finding out that the people involved in the development of Mozilla are really lovely, I also found out that the technologies they support are very powerful and solid. As I learn more about Mozilla code, I plan to keep posting stuff here. Please, don’t be too hard with me if I say any stupid or obvious thing, keep in mind that I’m just learning for the moment. Of course, comments and feedback is totally welcome, especially if I can learn from it. You can also go to the Mozilla/URJC Planet to find more about the people involved in the course.

Lets start by downloading the latest source code. We shall use Mercurial for that. We can get the latest source code by doing

hg clone http://hg.mozilla.org/mozilla-central/ src

but, as it is explained here, you might want to check the status of the code regarding the automatic tests beforehand. To avoid poisoning my system with the tests I’ll do, I’m gonna use “/opt/mozilla” as my working directory. I might have used something under “/usr/local/” instead, it doesn’t really matter.

$ sudo mkdir /opt/mozilla
$ sudo chown miriam:miriam /opt/mozilla
$ cd /opt/mozilla
$ sudo aptitude install mercurial
$ hg clone http://hg.mozilla.org/mozilla-central/ src

OK, it will take a while to fetch the whole code tree, so take it easy.

Now, lets install the dependencies. According to the build-dependencies of xulrunner-1.9.1, these should be:

$ sudo aptitude install build-essential automake autoconf2.13 libtool \
libx11-dev libxt-dev libidl-dev libgtk2.0-dev libstartup-notification0-dev \
libgnomevfs2-dev libgnome2-dev libgnomeui-dev libcairo2-dev libpng12-dev \
libjpeg62-dev zlib1g-dev libbz2-dev libreadline5-dev libkrb5-dev python-dev \
libnspr4-dev libnss3-dev libhunspell-dev libdbus-glib-1-dev libsqlite3-dev \
liblcms1-dev libasound2-dev zip xvfb xfonts-base xauth java-gcj-compat-dev

Not bad, isn’t it? :)

The next step will be to set some sane build configuration options from which we can start working. We can store them in a file called .mozconfig inside the src directory. You can have a look at mine if you want.

Last, but not least, you might have a problem if the libpng in your system does not support the APNG format. You can choose between using the libpng that comes with Mozilla instead of the system one, or you can apply a patch to be able to compile it even without APNG support. Your choice.

Now, we’re really close now. Lets build the program:

$ export JAVA_HOME=/usr/lib/jvm/java-gcj
$ autoreconf --force
$ ./configure
$ make
$ make install

According to the parameter “–prefix=/opt/mozilla” in .mozconfig, the program will be installed in that directory. As we already have assigned it to our current user, there’s no need to be root or use sudo for that.

You can run it with “/opt/mozilla/bin/firefox”

OK, we now have our building system ready for modifying it and see what happens :P



{August 20, 2009}   How to break a big patch in its individual chunks
#!/bin/sh

if [ "$1" == "" ]; then
    FILE="/dev/stdin"
else
    FILE="$1"
    # make sure file exists and is readable
    if [ ! -f $FILE ]; then
        echo "$FILE : does not exists"
        exit 1
    elif [ ! -r $FILE ]; then
        echo "$FILE: is not readable"
        exit 2
    fi
fi

num=0;
mkdir -p chunks

# Set loop separator to end of line
BAKIFS=$IFS
IFS=$(echo -en "\n\b")

cat "$FILE" | while read -r l; do

    processed=0

    if echo "$l" | grep -e "^--- " 2>&1 >/dev/null ; then
        minus="$l"
        minus_file=`echo "$l" | sed -r -e 's|---\ [^/]*/||g'`
        echo "MINUS: $minus_file"
        processed=1
    fi

    if echo "$l" | grep -e "^+++ " 2>&1 >/dev/null ; then
        plus="$l"
        plus_file=`echo "$l" | sed -r -e 's|\+\+\+\ [^/]*/||g'`
        echo "PLUS: $plus_file"
        processed=1
    fi

    if echo "$l" | grep -e "^@@ " 2>&1 >/dev/null ; then
        test "$minus_file" != "$plus_file" && { echo "ERROR!"; IFS=$BAKIFS; exit 1; }
        num=$(($num+1))
        fname=`printf "chunk_%03d.patch" $num`
        echo "PATCH: $fname"
        echo "$minus" > chunks/$fname
        echo "$plus" >> chunks/$fname
        echo "$l" >> chunks/$fname
        processed=1
    fi

    if [ $processed -ne 1 ]; then
        test "$minus_file" != "$plus_file" && { echo "ERROR!"; IFS=$BAKIFS; exit 1; }
        echo "$l" >> chunks/$fname
    fi

done

# restore $IFS which was used to determine what the field separators are
IFS=$BAKIFS
exit 0


{August 17, 2009}   Some useful (or not) CLI tools for Debian administration

Top-like tools:

Statistics reports:

List stuff:

Hardware identification:

System management:

Data recovery / Forensics:

get/set program io scheduling class and priority


{August 17, 2009}   Making PHP stuff properly work in Apache2 with apache2-mpm-worker

I’ve been lately playing with 389 Directory Server (previously Fedora Directory Server, previously Netscape Directory Server). Along with the LDAP server itself comes an admin tool and a console GUI for managing the system. The admin tool is built on Apache2, and it needs it to use the worker MPM (high speed threaded model), provided by the package apache2-mpm-worker. The problem is that libapache2-mod-php5 seems to depend on apache2-mpm-prefork, so I have to use php5-cgi to provide the PHP scripting functionality instead. That seems to work properly out-of-the-box ™ for stuff like phpldapadmin, but not so properly for phpmyadmin and phppgadmin. In those cases the browser seems to try to download the PHP script instead of executing it.

The quickest solution for that is to add some configuration stuff to Apache2, telling it to do things properly:

# cd /etc/apache2/mods-available/
# cat >> php5-cgi.conf
<IfModule !mod_php5.c>
  <IfModule mod_actions.c>
    <IfModule mod_cgi.c>
      AddType application/x-httpd-php .php .phtml .php3
      Action application/x-httpd-php /cgi-bin/php5
    </IfModule>
    <IfModule mod_cgid.c>
      AddType application/x-httpd-php .php .phtml .php3
      Action application/x-httpd-php /cgi-bin/php5
     </IfModule>
  </IfModule>
</IfModule>
# cd ../mods-enabled/
# ln -s ../mods-available/php5-cgi.conf
# /etc/init.d/apache2 stop
# /etc/init.d/apache2 start

That should do the trick. Don’t forget to restart Iceweasel/Firefox, or some kind of caches inside it will keep trying to download the PHP scripts anyway.



{August 07, 2009}   Connecting to WiFi from console instead of using Network Manager

I was terribly happy with Network Manager, it used to do all the work for me. Unfortunately there are some Wi-Fi networks where the connection doesn’t seem to be established properly. At least for me. At least, for some unknown reason, for the last weeks. For example, at home.

So, I often have to manually start the Wi-Fi connection from the command line. That seems to be working for me always.

Here are the (few) steps:




about

This is a personal webpage that belongs to Miriam Ruiz.
If you want to contact her, you can do at:
webmistress(at)miriamruiz(dot)es.

pages
categories
archive
twitter
calendar
September 2010
M T W T F S S
 12345
6789101112
13141516171819
20212223242526
27282930EC
upcoming events
credits
La Lista de Sinde
en isoHunt