Webcenter Interaction Blogs (aka Aqualogic Interaction)

January 02, 2009

Bill Benac

Resolutions and Discoveries After a 10 Week Fast from Facebook

Yesterday I returned to Facebook after doing a 10 week experiment in self-imposed exile. I wrote the following note for my friends there, and I post it here in hopes that those outside my Facebook network may find it interesting/rewarding.

---

Hello Friends:

I struggle today to find the proper words to reintroduce and explain myself after a 10 week hiatus from this world where words are usually thrown about so carelessly. It's a new year, and I've been thinking about my Facebook-centric new year's resolutions really since October 22 which was the first day of my experiment. Let me first share my resolutions, then explain the experiment that brought me toward them, then finally describe the discoveries from my experience.

RESOLUTIONS

In the year 2009 I plan to:

* Visit Facebook less compulsively. Instead of logging in many times within an hour, I'll limit myself to twice daily.
* Focus on my objectives within Facebook and consume only the benefits that I actually want. It's important for me to stay in touch with friends. It is not important to entertain myself with comic videos, and I'll abstain from most of your status updates.
* Try to raise the quality of content in your minifeed by posting primarily stimulating information.
* Never be snarky.
* Block most third-party applications than send me invites.

I recommend that each of you also consider some Facebook-centric resolutions for yourself. How much have you thought about maximizing this network's benefits to you while avoiding its distractions and pitfalls? Let me tell you how about my own journey.

MY EXPERIMENT

This past quarter I took a great class at Stanford from a now-favorite professor, Howard Rheingold (http://rheingold.com). Howard famously coined the term "virtual community" and published a book (http://bit.ly/virc) about the concept in 1993. That was the same year the first graphical web browser, Mosaic, was released. The class I took with Howard was called "Virtual Communities and Social Media." After reading several assigned articles about multitasking, I was stumbled into "Is Google Making Us Stupid," published by Nicholas Carr in The Atlantic. Carr explored whether our minds are less able to achieve concerted focus because Google and our hyperlinked world are training our minds to optimize themselves to lightly visit brief snippets content. His article is at http://bit.ly/think.

I've been struggling lately to think clearly, and I've joked that if I had to retake the GRE, there's no way I would earn a score sufficient for Stanford to accept me again. I used to pride myself on my verbal skills, but of late I find my abilities have deteriorated. I've considered several theories. Is my problem that I read less than I used to? Is it that my writing within the workplace needs to be 100% clear and therefore I've stripped out all flourishes? It is that I'm chronically sleep deprived? Or to paraphrase Carr, has my proclivity for multitasking rewired my brain and "made me stupid?" Facebook seems made for the short attention span, offering bite-sized visits that can be accomplished in under one minute. Maybe I should swear off Facebook for a while, I thought.

What good was Facebook to me anyway? It was impairing my ability to accomplish tasks that required focus, because at any mental pause in the day, I would instinctively click in to see what my friends were up to. This made working from my home office feel more like working from a dorm commons area with friends continually passing by. Further, I wasn't proud of my own contributions to Facebook. In the week leading up to my decision point, I had posted an unflattering picture of John McCain, posted a video of a chimp learning to ride a Segway, and teased a friend about a childhood photo.

So off the grid I went, to see what I could learn.

DISCOVERIES

* I can still read books! Within hours of dropping Facebook, I was enticed into reading a 300+ page book in just a few days. This was exactly the type of activity that Carr's article suggested we have a harder time doing in our over-multitasked digital world. I was delighted to find that yes, I still have it in me to read something more substantial than status updates. Before bed I took from the shelf "Six Degrees" by D.J. Watts, but instead of just scanning its structure as I expected, I ravenously read some eighty pages. Watts brilliantly explores the science of network theory, and he shows it applies to much more than just web-based networks or social networks. Check it out at http://bit.ly/networks.
* I really care about maintaining friendships (strong ties) and connections (loose ties) with you all on Facebook. I was concerned that some of you might send me messages and be put off that I seemed to ignore you. Especially after spending a week studying social capital and taking a few hours in class discussing this topic with the guru Tara Hunt (http://horsepigcow.com), I figured my experiment was costing me somewhat. Ironically, two people who I hadn't been in touch with messaged me on Oct 22, the first day of the experiment.
* Most everything in Facebook is good for at least some people, but that didn't mean that it was going to be good for me. I needed to filter out the content, activities, and habits that didn't lead toward my goals--and as with anything, I needed to know my goals.
* Facebook is an unparalleled way for me to promote a message. My sister Annie Poon created a beautiful animated entry for a Coldplay video competition. I greatly wanted to share it with my friends, and my best distribution channel would have been Facebook. But alas, I was locked out. I'll have it available in the future though.
* Twitter rules! While away from Facebook, Howard asked our Virtual Communities class to use Twitter for a while between ourselves to make sure we understood that medium. I thus set up an account intended for class use only. The problem was that by using Twitter even a little, I began to create some social capital and connections through Twitter with people I care about, and I got hooked. I'll post another note in the future about why I think the interest-based network of Twitter may be a more compelling place for me to spend time than the social-based network of Facebook. You'll be seeing many more of my Facebook status updates originating from Twitter.
* Ten weeks is too long to forgo Facebook. Once I returned, I found a backlog of 30 new friend requests, 18 new inbox messages, and seven other sundry requests. I need to spend some time playing catch up. Most of us can probably handle less frequent visits to Facebook, but ten weeks isn't a maintainable interval.

WRAP-UP

As I said earlier, I recommend that every Facebook user take some time to reflect on whether you are using the technology or the technology is using you to paraphrase hero Michael Wesch's most famous video about Web 2.0 (http://bit.ly/w20). Are you benefiting in excess of the gain Facebook gets from having you view its ads? Do you like the way you use Facebook? I'm certain as I follow my resolutions that I'll be much happier here than I used to be, although I'll be here less frequently.

I'd love to hear your thoughts on this note. Do any of these ideas strike a chord for you? Do you need some encouragement to go cold-turkey from Facebook for a while? Am I late to the realizations that most people already had?

Thanks!

Bill

by bill at January 02, 2009 09:45 PM

December 26, 2008

Terry Wang

Ubuntu Kills your Laptop HD, Stop it!

It has been a known problem for Ubuntu since 6.06. I have no idea why it hasn't been fixed yet. It does affect 8.10 Intrepid Ibex. Maybe that's the price we pay for open source and freeware:)

I don't want to discuss the technical details about this issue again. For more info on this issue:
http://ubuntuforums.org/showthread.php?p=5031046

Normally, our laptop HD can handle 60000 Load_Cycle. I did see someone's Load_Cycle_Count hits 1 Million+ but his bloody HD is still working. So you'd better check your model specification to make sure.

Check if your HD is affected:

install smartmontools
sudo apt-get install smartmontools

smartctl -a /dev/sda | grep Load_Cycle_Count
193 Load_Cycle_Count 0x0032 092 092 000 Old_age Always - 87385

Check how fast the LCC is growing. In my case, the LCC grew 30-50 per hour before applying the fix...

If you feel the LCC grows too fast, try the command below and monitor if the LCC stops growing.
$sudo hdparm -B 254 /dev/sda

If it does help, we'll try to make this change permanent.

There are several workaround/fixes for this problem. I recommend using the ugly fix which is a script file hook up with acpi profile. It is easier to manage and roll back.

make a file named "99-hdd-ugly-fix.sh". The important thing is starting with "99".
Code:

$sudo gedit 99-hdd-ugly-fix.sh

make sure the file contains the following lines (fix it if you have PATA HDD):

#!/bin/bash
if on_ac_power; then
# on AC so don't do any head parking
hdparm -B 254 /dev/sda # you might need 255 or a different value
else
# either on battery or power status could not be determined
# so quickly park the head to protect the disk
hdparm -B 128 /dev/sda
fi

copy this file to 4 locations:

$sudo install 99-hdd-ugly-fix.sh /etc/acpi/resume.d/
$sudo install 99-hdd-ugly-fix.sh /etc/acpi/start.d/
$sudo install 99-hdd-ugly-fix.sh /etc/acpi/ac.d/
$sudo install 99-hdd-ugly-fix.sh /etc/acpi/battery.d/

By using install the file 99-hdd-ugly-fix.sh should have the x-bit set. Reboot and all these scripts will start taking effect.

Now it's done, LCC stops growing, peace of mind...

Again, I recommend reading this post before you start, it's very important that you understand what you are going to do. It's all on your own risk:)
http://ubuntuforums.org/showthread.php?p=5031046

In addition, I'll introduce how to check Load_Cycle_Count in Mac OS X and Windows.

Mac OS X
Install smartctl tool for OS X


Windows
Try Everest

by Terry Wang (noreply@blogger.com) at December 26, 2008 07:12 AM

December 15, 2008

Terry Wang

Oracle BPM (ALBPM) Enterprise for Weblogic on Ubuntu Linux

Recently I am working on VM images for test a test environment based on the new Oracle BPM 10gR3 release and the OS has to be Linux for some reason.

Environment
OS: Ubuntu 8.10 Intrepid Ibex 32-bit
Kernel: 2.6.27-7-generic
JDK: Sun JDK 1.6.0_10
Weblogic Server 10gR3 on JRockit 1.6.0_05 (R27.6.0-50 linux ia32)
(I use the Oracle Service Bus 10gR3 install media which includes WLS)
Oracle 10g XE


We can do it thought in the official interoperability matrix this is not a supported combination.
Interoperability Matrix:
http://www.oracle.com/technology/products/bpm/obpm_config_matrix.html

Note: It's better to use root user to install OBPM and WLS, or we may have permission problems.

  1. Launch admin center using root, just use su -s to avoid typing sudo all the time. If not we may encounter permission problems.
    /opt/OracleBPMwlHome/bin/./obpmadmcenter

  2. Click configuration, in Directory tab, click add to create directory. I don't want to talk all the details, please refer to the official installation guide for more details:http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/config_guide/index.html

    Normally this will probably a painless process (actually it was on Windows as I did it a few days ago)

    In this case, the Configuration wizard hang at around 70%, like in the screenshot.

So I checked the WLS logs as well as the Adim Center logs. It seems that errors were encountered when executing WLST. Errors in Admin Center log:

java.io.FileNotFoundException: /opt/bea/user_projects/domains/bpm/config/config.xml (Too many open files)

This is simply caused by the default max open files (File Handlers) setting on Linux OS.

Normally the default max open files is 1024. This small limit (which appears to be the default value in most linux environments) might be a problem for WebLogic Server deployment and so we recommend increasing it.

Session Wide Solution:
Increase the limit of open files using the command ulimit -n 2048 in the session you start the obpmadmcenter or WLS domain (if you choose to modify an existing domain)

Use ulimit -a to check the new limit. This is just a temporary fix, only for the current terminal session.
Then run the config wizard again and I think you can get there.

Make the change permanent:
Change the file /etc/security/limits.conf (root)
The following line must be appended to the file:
$user hard nofile 2048

$user is the user that starts the WLS
2048 is the recommended limit but we may need to increase again if the issue recurs.

Start Admin Center, start BPM Web applications, then Weblogic Server. Now you can login to Process Administrator (webconsole) and Workspace and see the sample process if you selected the option.

Alternative workaround(from Official Debian Documentation and Oracle Technology Network):

make the change without rebooting the server box

sysctl -w fs.file-max 65536
sysctl -a
(echo "65536" > /proc/sys/fs/file-max)

To make this change permanent by inserting the kernel parameter in the /etc/sysctl.conf startup file:
# echo "fs.file-max=65536" >> /etc/sysctl.conf

To query the current usage of file handles by using the following:
# cat /proc/sys/fs/file-nr
825 0 65536

I am not clear about the difference between changing the open file max using sysctl and ulimit. If by chance you guys know, please do not hesitate to leave your comments.

Tips: Install OpenSSH for easy management as a VM. If you prefer Web UI, try webmin it is also a good tool for overall management. I install webmin on each of my Ubuntu Server VM or box.

References:

by Terry Wang (noreply@blogger.com) at December 15, 2008 01:32 PM

Oracle BPM 10gR3 (ALBPM 6.5) GA

Oracle BPM 10gR3 which was BEA AquaLogic BPM, Fuego BPM is GA now.

From the new versioning, we can clearly see that it is 10.3. However, in fact it is 6.5.

After the acquisition, ALBPM has been renamed to Oracle BPM and put into the Oracle Fusion Middleware stack, along with Oracle BPEL Process Manager and Oracle BPA Suite.

Differences between BPM Suite offerings
Oracle
BPM
Human and System Centric BPM with SOA. Easy integration with WebCenter Interaction (AquaLogic Interaction, Plumtree Portal).
Business user friendly
Collaborative
Agile
BPMN & BPEL
SOA architecture
Apps integration, AIA


Oracle BPEL Process Manager
System Centric
SOA architecture
Apps integration, AIA
BPEL
High performance STP
Round-tripping with BPA

Oracle BPA Suite
Methodology Driven Process Modeling and Analysis.
Process Experts
Six Sigma, Lean
Methodology
Hierarchical Modeling
Documentation


Download: http://edelivery.oracle.com
or
http://www.oracle.com/technology/software/products/bpm/index.html

Fill in some necessary info and go to Oracle Fusion Middleware, choose your platform, you will finally find them in Oracle Application Server 10g Release 3 (10.1.3) Media Pack.

Studio
Enterprise Standalone
Enterprise for Weblogic Server
Enterprise For Websphere Application Server

I have no idea why the links on the page below haven't been upgraded yet. Maybe Oracle is going to decommission the BEA page.
http://www.oracle.com/technology/software/products/ias/bea_main.html

Oracle BPM 10gR3 docs
http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/index.html
The docs are still not helpful enough, I hope that Oracle improves its newly acquired products. At least make them as good as Oracle Database docs.

Interoperability matrix:
http://www.oracle.com/technology/products/bpm/obpm_config_matrix.html

All BEA docs, including new versions of WebCenter Interaction suite (AquaLogic User Interaction).
http://www.oracle.com/technology/documentation/bea.html

Enjoy the new release. I believe that the next GA will be named 11g, if there is such thing.

Articles you may be interested in: Ten reasons why you should look at Oracle BPM Suite 10gR3

by Terry Wang (noreply@blogger.com) at December 15, 2008 01:04 AM

December 14, 2008

Terry Wang

Always Remember to Lock your Computer Windows/Linux/Mac OS X

It's always important to lock your computer when you are away from it, even for a short while. I do see a lot of my friends, colleagues they just don't do this. They are not aware of the impact of a malicious attempt. You never know what happened until you find something weird happened to you data/bank account or things like that.

I formed this good habit when I was working for company M. At that time, if you don't lock you computer and was noticed by anyone an invitation email to all team members for lunch or dinner will be sent out. Well, it's no good to you wallet:(


Windows Family
Hotkey/Shortcut
Win+L or Ctrl+Alt+Del and press L

GNU/Linux
Ctrl+Alt+L
Note: at least this works on Debian/Ubuntu and Fedora Core series, GNOME Desktop Environment. Not sure if it applies to all distributions as they may use different desktop environment like KDE, XFCE, WM...

If you use GNOME, you can also add Lock screen applet and to do the same by clicking it.

Mac OS X
Use the Free locker widget in Dashboard, the fastest way would be F12 - > Double click on Lock widget.

Download: http://www.apple.com/downloads/dashboard/networking_security/locker.html

Alternative:
1. In QuickSilver, Create a trigger for /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app, in my case, I use command+L which is easier to remember.

Note: It's a bit weird to create trigger, especially the process to search. For peace of mind, just copy and paste the full path of the ScreenSaverEngine.app:)




Special Thanks to Brian who shared the tips with us in comment:)

2. execute this command in Terminal
/System/Library/CoreServices/"Menu Extras"/User.menu/Contents/Resources/CGSession -suspend


I don't like to use the hot corner to trigger a screen saver anyway. So to normal users use the Locker widget is probably the best approach I have found so far to lock a Mac.

It's weird to me that Apple don't assign a key combination to lock OS X.

Hope this helps.

by Terry Wang (noreply@blogger.com) at December 14, 2008 07:07 AM

December 11, 2008

Terry Wang

Install Ubuntu from USB Stick, Stop odering free Ubuntu CDs

Ubuntu 8.10, Intrepid Ibex is around the corner. I saw the news among my RSS subscriptions that we can now pre-order free Ubuntu 8.10 CDs now.

In the past few years, I have applied for 6.0.6 LTS CDs for x86, x86-64, powerpc, sparc(actually it's not possible for me to have a sparc powered machine at home, why I need this?), 7.04 CDs x86, x86-64 when I was working and living in Shanghai, China. In addition to the CDs, some stickers were in the package. They were posted from Europe and the postage was around several euros. The total cost would not be cheap.

To be open, I applied for Solaris 10(sparc + x86) free DVDs from Sun and got 2. I didn't feel guilty because after all Sun Microsystem is a commercial company. They have enough budget for things like this.

Later on, I found these CDs were useless to me, I hardly use them. Finally I gave all them away to my colleagues who were interested in trying Linux. I think it was a good result. It seemed that I used them to show that I am a GNU/Linux, Open Source supporter rather than install and spead. In fact I use the downloaded ISO image as well as bootable USB stick created via UNetbootin much more often.

I think it was something stupid. I requested for something useless to me, whilst it's a waste of Canonical's money as well as their limited resources.

Here I suggest that Ubuntu as well as other distros users try using USB installtion. It's much faster, cost effective, reusable and environmental friendly. I assume that now most machines support boot from USB devices.

Basically, we can create a bootable Linux distro USB stick by using UNetbootin (Universal NetBook Installer)/Ubuntu Live USB Creator/Live USB System Creator to create a bootable USB stick. I personally prefer to use UNetbootin. It's with a GUI and available on Linux and Windows. So easy to use.

In brief what UNetbootin can do for us:
1. Download the distro image automatically and install the distro to a USB stick, it's bootable. If we install distros like Ubuntu which supports LiveCD installation, of course you can now boot and install from the stick.
2. Already have the image? Just do it on the fly by choosing image and specify the path.
3. Advanced options, custom...

UNetBootin: http://unetbootin.sourceforge.net

More info: Install from USB Stick

Stop requesting useless CDs and save money for Canonical, leave the free CDs for people in real need, those who can't afford a USB stick and CD/DVD burner, those who don't have easy+fast internet access, those who...

That's what we can to do to spread Ubuntu - Linux for Human Beings. Also, stop burning useless CD/DVDs to protect our environment, our earth.

by Terry Wang (noreply@blogger.com) at December 11, 2008 11:32 PM

December 09, 2008

Terry Wang

Free Dictionary solution for iPhone - use Stardict dictionaries for weDict

As a non native English speaker, I need good English-English dictionaries not only on my Laptop/desktop but also in my pocket.

On Treo 650, there is Zdic (free and opensouce app written by Chinese folks) with all kinds of free .pdb format dictionaries, works perfectly on Palm OS. I really miss the good part of Treo and Palm OS. While Palm is dying and hopeless, I have to choose my new platform. Early November I bought my new iPhone 3g 8G, simply because I am a *nix lover, its overall specifications meet my needs. In addtion, I don't take Windows (Mobile/CE) into account anyway.

As a result, I have to find a new bunch of apps and research the OS X mobile a bit. Fortunately it is a trimmed version of OS X, not hard for me at all.

Works for:
iPhone firmware 2.1 2.2
weDict 1.1 /weDict Pro 1.2 (works for 1.3 as well)

Note: if you upgrade weDictPro, custom added dictionaries will be kept.

Prerequisites:
  1. Jailbreak it
    use PWNageTool on Mac or QuickPWN on Windows, recommend using Cydia as package management tool, for more info, google please.
  2. OpenSSH installed and service started
    Use Cydia to install, search openssh package. ATP will take care of the installation and dependencies. In addition, I strongly recommend that we install Terminal/Finder/BossPrefs/SBSettings.
  3. Download the dictionaries you want in any language
    http://stardict.sourceforge.net/Dictionaries.php
  4. iPhone connected to the same wireless network as you Desktop/Laptop
    Get the LAN IP address, we need to use SSH.
  5. Any SSH tool
    Cyberduck or FileZilla for OS X
    Filezilla for Linux
    WinSCP/Filezilla for Windows
Hereby I use LDOCE as an example, it works for all other Stardict re-packed dictionaries.
1. Extrac stardict-longman-2.4.2.tar.bz2
2. Rename longman.dict.dz to longman.dict.gz or zip
3. Extrace and get longman.dict
4. Copy longman.idx and longman.ifo to /private/var/mobile/Applications/BFEA9FDA-0903-4321-9A7D-1A0DA030FF21/Documents folder (red+bold string varies on different devices, it may take some time to dig the right folder)
5. Change their attributes to 755 (-rwxr-x-r-x)
6. Launch weDict/weDict Pro, tap config button on bottom right, newly added dictionaries should be listed. Check the screen shot below:


If you don't like the dict name, you can double tap on the name and change it to whatever you like. If for some reason they are not listed, check the prefix for the dictionary file, make sure they are the same. Hold Home for 6 seconds to force exit the app, check again, it should work.


Difference between weDict Pro and weDict:
The Pro version has a built-in FTP service based on DiddyFTPServer, used to upload dictionaries . It's actually pointing to the same folder as I mentioned in the steps. And it is also capable to download dictionaries from a URL.

Also some one said performance of the free version is poorer than Pro, I don't know if it's true. Anyway, it's only 6 bucks.

Fore more info:
http://app.weiphone.com/wedict/index.html

Hope this helps. iPhone is excellent:)

by Terry Wang (noreply@blogger.com) at December 09, 2008 05:18 AM

December 08, 2008

Ross Brodbeck

Adventures in Search - Part 4 - Search Node Operation

You know, it's funny how some things can seem extremely complicated and then when you crack them open they turn out to be fairly easy to understand. Remember the mystery behind how a G.I. Joe stayed together, but then you broke one and found it was simply a rubber band holding his guts together? Turns out search server is much like that. A terribly complicated-seeming C program that, fundamentally, is held together by a rubber band.

What is a Search Node?

From my previous posts, you've probably inferred that search nodes are the fundamental building blocks of ALUI's search capability. In fact, search nodes are actually the *only* building blocks of the search capability. Everything you need to set up a clustered or non-clustered search environment is contained in one simple install, a few directories and an executable.

All this seemingly complicated system amounts to is the following breakdown:

  1. An executable running somewhere listening for requests
  2. An open TCP port that receives text based search queries
  3. Two directories that contain everything search needs to operate: a cluster directory and a node directory.

Here's a more complicated picture of what I just listed:

search_node_architecture 

Figure 1 - Search Node Architecture

Search Requests

Let's start with the executable. When you start it up using the command line (from the bin directory in a *nix environment, or via a service on Windows), it uses environment variables to find its various configuration files, starts up a process, opens a TCP socket on whatever port you tell it to, and sits around waiting for stuff to happen.

The "stuff that happens" turns out to also be fairly simple. Search server doesn't actually know anything about portals, documents or anything else for that matter. It sits around and waits for one of two things:

  • An index request (put some information into the search index so it can be searched for later)
  • A search request (search for something in the current index)

These two things are specified in a text-based custom language over a TCP port. What I mean is that you, Joe Six-pack, could open up a telnet session to your search server port and type a search query (index or request) freehand, were you so inclined. You would type something like the following:

( FIELDALIAS ptsearch,[2]PT1,[2]PT1_en,[0.1]PT2,[0.1]PT2_en,[0.1]PT50 ) (((ptsearch:a) TAG phraseQ OR (ptsearch:a*) TAG nearQ) AND ((subtype:"PTCARD")[0])) AND ((((@type:"PTPORTAL")[0]) OR ((@type:"PTCONTENTTEMPLATE")[0])) AND (((ptacl:"u2") OR (ptacl:"51"))[0]) AND (((ptfacl:"u2") OR (ptfacl:"51"))[0])) 
METRIC logtf [1] RESULTS 10 PRINT FIELDS parentids,ptacl,ptfacl,PT51,PT56,@type,subtype,ancestors,PT58,PT7,PT53,abstracttype,
PT1,PT1_en,PT2,PT2_en,PT3,PT4,PT5,PT6,PT8,collab_properties,collab_project_url,collab_project_name,collab_icon_alttext_index,collab_acl,publisheduser,portletid TERMS 10000 results[1-10] KWIC 15

 

Obviously, this kind of a query isn't very pretty or intuitive, but the point is you could type it via telnet and search server would spit out an XML formatted response to your query. You can see these types of queries in your search node logs if you set your logging levels high enough. Lucky for you, the search API takes care of all of this heavy lifting and converts those XML results into the pretty HTML you see when you perform a search in the portal.

Building a Search Index

"Okay Ross," you're probably thinking, "I can run search queries over telnet to see what's in my search index. That's all well and good, but how does all that junk get in the index in the first place?"

How indeed. As I mentioned above, that junk gets in there via an index request, which is much like a search request (runs over a TCP port, follows a specific querying language), but allows whoever or whatever to put information into search instead of extract it.

If you look closely at your Publisher content.properties file, Collaboration config.xml file or even at the portal database (PTSERVERCONFIG table), you will see an "Indexing Search Port" and "Indexing Search Host" specified. What these values really do is tell each product (Portal, Publisher, Collaboration) where to submit their new document data (i.e. when someone publishes something, uploads something to a project, or a crawler runs). That data is submitted over the same TCP port to the same type of node that handles queries.

How an Indexing Request Works

Here's a brief explanation followed by a couple of pictures:

  1. An index request is submitted to a search node. Since that search node may be part of a multi-node cluster, the request goes straight to the cluster file system (remember, all nodes share this directory).
  2. The request is assigned a transaction ID and added to a queue on the cluster (you can see this in the form of the requests folder in the cluster folder of your search node).
  3. Every search node in the cluster independently maintains its own transaction ID, which corresponds to the last index request it processed. These nodes continually poll the shared requests folder. If they find a transaction that has a higher ID than the one they maintain, they pull the information for that transaction and add it to their local search index. They then update their local transaction ID to match the transaction they just processed.

You can actually see this process in real time by amping up your search logs and watching the transaction ID's increment when you upload a collab document, create and admin object, etc.. Here's a few Powerpoint diagrams I created of this process:

index_request1

Figure 2 - Adding an index request to the cluster's transaction queue.

index_request2

Figure 3 - Updating a local search index from the transaction queue.

Conclusion

As far as node operation goes, that should clear up most of the mystery. At this point, you should understand most of the how's and why's of search operation. The last piece to this puzzle is the "checkpoint" feature, which I'll review in the final exciting chapter of this blog series.

by hross at December 08, 2008 12:48 PM

December 04, 2008

Function1

The Function1 Holiday Enterprise Software Shopping Guide

Howdy all.  With the holiday season upon us and everyone getting inundated with offers of bargain flat screen TVs at your favorite big box store and 10 spatulas for the price of 9 down at Spatula City, your friends at Function1 hope you'll save some of your hard-earned budget with this cost-saving tip:  Make your software purchases at the end of a vendor's fiscal quarter.

Here's a not-so-well-kept secret about the software business: software and maintenance is a high-margin business for vendors.  This means that there is no list price on that shiny new piece of software X that you're thinking of buying..."list price" is just a starting point for negotiating, alot like the tag in the window of a used car.  What's more, most software sales folks have a sales target each and every quarter.  The difference to a salesman between beating and missing their quarterly number is pretty significant.  Beat their number and they:

  • Likely get a trip on the company to some exotic resort where they sip on delicious fruity drinks.
  • Buy that new convertible weekend car that they've been eying.

Miss their number and they can expect:

  • Lot's of yelling from angry VPs
  • Lot's of meetings and "planning sessions" with aforementioned VPs on how they're going to make their number next quarter
  • Perhaps start looking for a new job

The upshot here is that, come end of the quarter, if a vendor isn't meeting their financial targets, it's firesale time.  In short, you have leverage to negotiate a much better price for your software.  Say, for instance, you've received a quote to buy a site license for some software at $500K + 20% annual maintenance.  Let's also say that, come end of the quarter, your favorite salesman is $300K short of meeting his sales target.  Let's also say that the economy is currently in the toilet, and the vendor you're working with is in danger of missing the financial target they've given to Wall Street.  All these factors add up to a perfect storm of you saving a bunch of cash.  If you're not afraid to say, "No" to a price, there's a good chance you get the $500K software for $300K...if you buy before the end of the quarter.  So, not only have you saved $200K from your budget immediately, but you're also realizing an annual maintenance savings of $40K...that's real money.  Money you can use to:

  • Take your team on a trip to some exotic resort where you sip on delicious fruity drinks.
  • Throw a kick-ass holiday party
  • Hire your favorite consultants at Function1 to give you a hand in getting the most out of your new software purchase

That's about all for now.  Hope you find this tip helpful, and that it saves your some $$$.  If you're really in the holiday spirit, feel free to send us a check for 10% of any money you save :)

 

December 04, 2008 09:03 PM

November 27, 2008

Function1

Welcome Sandeep Khaneja and Hani Atalla!

Function1 is a growing company, but not too big that we can't take a minute out of our regular blog routine to welcome our two newest team members, Sandeep Khaneja and Hani Atalla.

Hani and Sandeep have actually been with us for several months, so my apologies for the late public welcome, but we're thrilled to welcome them to the team and have them work with our clients delivering elite AquaLogic consulting and product expertise!

Sandeep is a Plumtree/BEA Alumni with years of experience helping clients like yourselves realize their vision of a best-of-class end-user focused portal, with a special focus on strategic business planning, health checks, and technical optimization of the rest of the AquaLogic product stack.

Hani is a multi-year ALUI consulting veteran with a solid Java and .NET application development background for ALUI clients, and has been instumental in developing Watcher, our newest product - an ALUI monitoring an alerting application.

Welcome guys!

November 27, 2008 04:18 AM

November 22, 2008

Function1

The Exciting Conclusion of Stack Wars

OK, now that you had your dinner and ate your meat, it's time for the pudding.  This conclusion to Stack Wars just ties up a few loose ends and walks through a "real-world" example of analyzing stack traces.  Have fun...

Making Thread dumps easier to view

Seeing as how most people's idea of a good time isn't sifting through pages upon pages of JVM stack traces, several good people have developed tools that make it easier to view and analyze complex thread dumps. Personally, I like and use the IBM Alphaworks Thread and Monitor Dump Analyzer. Pretty straight forward to use. Just save your thread dump off to a file and open it up in the Analyzer for a pretty view of all your threads that looks like this:

thread_analyzer.png 

I've found this tool useful when I'm trying to look for patterns across many threads in a thread dump. Give it a try, you might like it.

A real world example of how all the rambling I've just gone through came in handy

Long ago, in a galaxy far, far away, I was working on a Plumtree consulting project with a large company. These folks had been having problems with their portal deployment. Periodically, the portal would start eating up 100% of the server CPU, and would never release it until the portal application server was bounced. During the time that the server CPU was pegged, users couldn't access the portal...the customer was not happy. It was one of those big deals where VP-level people at the customer were yelling at VP/Executive level people at Plumtree on a daily basis. So here I am in this high stress situation. I arrive onsite with the customer and, for three days, nothing happens. The application doesn't freak out, and all is fine. At this point, I'm starting to get cautiously optimistic that maybe we won't see any problems during my remaining two days onsite, and somebody else will have to deal with the problem later :) But, alas, it wasn't to be. About halfway through my second to last day with the customer everything went to hell. All of a sudden nobody could access the portal, so we start debugging. Sure enough, first thing we see is that the portal process is eating up 100% of the server CPU. These folks were running on a Unix platform, so I ask them to try:

kill -QUIT <portal pid>

After explaining for 20 minutes that, no, this command won't kill the process, the server ops folks generated a thread dump and sent it over to review. After about 5 minutes of looking at the portal thread dump, it was pretty obvious that something was amiss with the portal code. The stack trace for EVERY SINGLE THREAD (All 100 or so of them) was exactly the same. They were all stuck running the same native method. Just to be sure this wasn't some freak anomaly, we generated another thread dump 15 minutes later, and, yep, all the stack traces looked the same. So this tells us that there's a problem with some native C code being used by the application...a good start. Unfortunately, since the problem was in native code, we couldn't get a full stack trace from the JVM...it only goes so far as to let you know that it's making a native call. So we dig one level deeper and trace the portal process. Running a trace/truss on a Unix process spits out all the system level calls that are being made. Wouldn't you know it, when we looked at the trace output, 99% of the calls being made were:

poll(0)

Now, I wasn't an expert at interpreting this level of data, but I knew enough that "poll" had something to do with sockets, and that there definitely shouldn't be so many of those calls. Long story a little bit shorter, after a bunch of conference calls with Plumtree support and engineering, where we shared the data we'd gathered from the thread dumps and process traces, the engineering team found a very low level bug in the software and shipped a fix out to the customer...tragedy narrowly averted.

Conclusion

Did you really make it this far? If so, thanks for sticking with me, and I hope you found something of use in this long, winding post.  If you're ever stuck trying to make sense of a thread dump, feel free to drop us a line or post a comment here...we'll do our best to help.

Take care, and remember, when dealing with production troubleshooting, "Do...or do not, there is no try". (This doesn't have really have much to do with the post, but I'm kind of tired and pulling at straws for good ways to tie the Star Wars metaphor back in). Anyhow, as always, thanks for reading...see you next time.

November 22, 2008 11:14 PM

November 19, 2008

Function1

Stack Wars III (Or VII, depending on how you count): Return of the Stack

READER BEWARE: This got long and geeky, so make sure you're really trying to avoid doing "real work" before you sit down to read.

Welcome back all, and thanks for joining me for the final installment of a three part series on decompiling Java code and analyzing stack traces. If you're interested in the back story, you can read about decompiling Java here, and analyzing basic stack traces here.

When we last left off, our hero was frozen in a block of Carbonite and left to his doom. Err...sorry, wrong story, let me start again.

When we last left off, we walked through analyzing a simple stack trace to run down a bug in a standalone Java program. This is all fine and good, but what happens when you're running a Java application server (like Tomcat or Weblogic) that has hundreds of concurrent threads running tens of different web apps? And you're just trying to figure out why your particular web application is hung?

Well, if you're lucky, the developer of your web application was a good boy/girl, and they're logging stack traces for you in a log file somewhere. If this is the case, then you can open up the log and analyze the trace like we did the last go round.

Often times though, you're not so lucky, and you have to dig a little deeper to figure out what's going on. Say, for instance, your web application just starts responding very slowly. You see from access logs that responses are being served back to users, but they're about 5 times slower than normal...WTF? Or, what if your application server starts pegging the box at 100% CPU...what to do? Or, out of nowhere, your app server starts throwing Java.lang.OutOfMemory exceptions...Gah!!! Sadly, these nebulous problems seem to happen in a production environment more often than most of us would like to admit. And when they do occur, it's usually a high stress situation because there's probably a production outage and nobody really knows why. So, how do we find a better fix to the problem than the traditional, "Let's just bounce it and see what happens" response? Why, we use "The Force", of course. Except in this case, "The Force", is just a set of debugging tips that I'm getting ready to share with you as follows:

  1. Take a deep breath and don't freak out when a bunch of people start yelling.
  2. Understand the severity of the situation. Figure out how much downtime you can tolerate for debugging before things really hit the fan.
  3. Set expectations. Let people know when they can expect the issue to be fixed. If you know a bounce will temporarily fix the problem, then set a drop-dead time for debugging and schedule a bounce. Let folks know that if you don't find a root-cause of the problem, that they should expect to see the issue again.
  4. Gather as much information about the problem as you can. What, specifically, are users experiencing? Can you reproduce? What are the symptoms? What log messages do you have? What does the server environment look like? etc.
  5. Try to relate this issue to something you've seen in the past. Does this look like a problem you saw last week or last month? What did you do to fix it then? Why is it popping up again now?
  6. Eliminate possible external causes. Is this actually a network problem in disguise? Is the database acting up? Is some other process on the server eating up CPU? Is the server constantly swapping because it doesn't have enough RAM to handle all its business?
  7. Eliminate environment changes as possible causes. Has the server environment changed recently? Could this be causing your problem?
  8. Look in earnest at your application server process. Are we bumping up against the Java max. heap size? Are we seeing lots of garbage collection? Is our thread pool exhausted? Is our JDBC pool maxed out?
  9. Take a look inside of the application server JVM. Generate a thread dump to get a snapshot of how your application server is behaving. Analyze the stack traces in the thread dump, and look for points of interest, like...race conditions, stuck threads, deadlock, etc.
  10. Open a ticket with the software vendor (If applicable)
  11. Pray the issue fixes itself and doesn't come back
  12. Find a new job so you don't have to deal with these problems anymore

Read on for more fascinating details about The Stack Trace...

November 19, 2008 12:11 AM

November 16, 2008

Fabien Sanglier

ALUI / WebCenter Interaction: Introduction to Native API development (Part 1)

Most of the time, creating a remote portlet application using the standard IDK is enough. Indeed, commonly, you just need to access user profile information, portlet ID, page ID etc... or perform simple operations exposed by the IDK PRC API.

But if you hit the limits of the IDK, it is not the end of the road. In the ALUI/Webcenter development documentation, they explain how to perform various UI customizations such as view replacement, PEI development, Activity Spaces creation or extensions, etc... All these are created within the portal application itself...Another option is to create what I call a "Native API Portlet Application". As its name indicates, this portlet application accesses directly the portal API and can perform virtually any operation that the portal can do...very powerful (but non supported :) so make sure your application is well written so that you can change the portal API access layer easily if you upgrade the portal version for example)

First, the 2 main requirements in order to create a Native API application are:

  • The application needs to be on the same server as Portal, or Automation, or API service
  • The application needs to reference various portal DLLs (located in /ptportal/6.1/bin/assemblies for dotnet, or /ptportal/6.1/lib/java for java). You don’t need them all. Here is the minimum list:



    ptportal\6.1MP1\bin\assemblies\opencache.dll

    ptportal\6.1MP1\bin\assemblies\openconfig.dll

    ptportal\6.1MP1\bin\assemblies\opencounters.dll

    ptportal\6.1MP1\bin\assemblies\openfoundation.dll

    ptportal\6.1MP1\bin\assemblies\openhttp.dll

    ptportal\6.1MP1\bin\assemblies\openkernel.dll

    ptportal\6.1MP1\bin\assemblies\openkernelsearch.dll

    ptportal\6.1MP1\bin\assemblies\openkernelsearchimpl.dll

    ptportal\6.1MP1\bin\assemblies\openlog-framework.dll

    ptportal\6.1MP1\bin\assemblies\openprocman.dll

    ptportal\6.1MP1\bin\assemblies\opensharedcache.dll

    ptportal\6.1MP1\bin\assemblies\opentempfile.dll

    ptportal\6.1MP1\bin\assemblies\openusage.dll

    ptportal\6.1MP1\bin\assemblies\openusage-api.dll

    ptportal\6.1MP1\bin\assemblies\openusage-impl.dll

    ptportal\6.1MP1\bin\assemblies\plumtreeserver.dll

    ptportal\6.1MP1\bin\assemblies\portal.dll

    ptportal\6.1MP1\bin\assemblies\pthome.dll

    ptportal\6.1MP1\bin\assemblies\ptportalobjects.dll

Important note: It is perfectly allowed to also include the IDK Dlls here too... and I find it particularly recommended if you are writing a native API portlet (for instance getting the current login token for example is fairly easy using the IDK API)

Second, you need to create the native session (everything starts from here, really):

1: String strServerConfigDir = ConfigPathResolver.GetOpenConfigPath(); 
2: IOKContext configContext = OKConfigFactory.createInstance(strServerConfigDir,"portal");
3: PortalObjectsFactory.Init(configContext);
4: IPTSession ptsession = PortalObjectsFactory.CreateSession();

From there you actually need to connect this session with a particular user identity. That way, the session object will be aware of your identity and especially the security and permission associated with your identity. In other words, even if you are using the native API, you cannot do more than you are allowed to.

To connect, 2 main options:

  • Use the login token that you can simply get from the IDK API (that is prefered option if you can)
1: String loginToken = m_portletRequest.GetLoginToken(); //IDK call
2: ptsession.Reconnect(loginToken);
  • Use explicit Username (or user ID) / Password to connect.

1: String username = "myusername";
2: String pwd = "mypassword";
3: ptsession.Connect(username, pwd, null);

Third (and Final), you access the right ObjectManager Class depending on which type of portal object you want to interact with.

When the session is created (that was pretty easy, right?), that is when you can actually start interacting with the portal internals...and a majority of actions goes through the PTObjectManager objects (IPTObjectManager interface). For instance:

1: IPTCommunityManager ptCommManager = ptSession.GetCommunities(); //for community objects
2: IPTPageManager ptPageManager = ptSession.GetPages(); //for community page objects
3: IPTObjectManager ptGadgetManager = ptSession.GetGadgets(); //for portlet objects
4: //etc...

You noticed that for portlets, there is not a IPTGadgetManager insterface....that’s ok as all the "Manager" interfaces are children of the base IPTObjectManager interface.

Although the vast majority of manager objects are accessible through a direct ptsession.Get() call, you can also get the right manager using the generic call below (using the classID of the object type you want)

1: IPTObjectManager ptCrawlerManager = ptSession.GetObjectManagers(PT_CLASSIDS.PT_CRAWLER_ID); 
2: //using     the class id of the object type you want

From there, the freedom is yours... and various operations will be available depending on the manager you called. One call for instance that all managers have is the open object:
1: ptObjectManager.Open(objectid, lockObject);

With this call, you get directly access a particular object in the portal, and interact with it as if you were in the UI

In the next article, I will show you how I package these API call in a standalone library to minimize as much as possible any API call within the presentation layer code...

by Fabien Sanglier (noreply@blogger.com) at November 16, 2008 08:51 PM

November 15, 2008

Bill Benac

WCI 10gR3 Installer Available... But Watch your Virtual Memory!

Today Oracle released  WebCenter Interaction 10gR3, the first Oracle-branded incarnation of the BEA's Aqualogic User Interaction product. I was eager to get started on upgrading a customer's ALUI 6.5 MP1 system to 10gR3. I encountered an "unexpected consideration" in the installer that you might call a bug. In my experience, on Windows the installer fails unless you explicitly allocate virtual memory.

I installed on five lab servers that had been running ALUI 6.5 MP1. The first succeeded, but on the second two servers, the installers failed.

10gr3-setup-fails.jpg



















Hmm. I dug into the logs (and you have to wait a bit after this message before they are all fully written), and I found the following in \installlogs\versionpolicy_deployment.log:

 [trycatch] Caught exception: The config file I:\apps\plumtree\uninstall\ptportal\10.3.0\register\ERROR: Registry key does not exist\ContentsXML\inventory.xml must exist.

And later:

BUILD FAILED
I:\apps\plumtree\uninstall\ptportal\10.3.0\register\register.xml:4979: The following error occurred while executing this line:
I:\apps\plumtree\uninstall\ptportal\10.3.0\register\macrodefs\versionpolicy.xml:690: The following error occurred while executing this line:
I:\apps\plumtree\uninstall\ptportal\10.3.0\register\macrodefs\orainventory.xml:172: Oracle Universal Installer failed to properly register your ORACLE_HOME,
I:\apps\plumtree, under name OraWCIntgHome1.  Make sure (1) that you have proper permissions (on unix you would have needed to run orainstRoot.sh as root user, on windows you need write access to registry and ability to install to %ProgramFiles% directory), (2) that, on unix, you did not run installer as root user.  You can attempt to run OUI yourself with command line "I:\apps\plumtree\uninstall\ptportal\10.3.0\register/../../../oui/cd/Disk1/install/setup.exe" -ignoreSysprereqs -attachHome "ORACLE_HOME=I:\apps\plumtree" ORACLE_HOME_NAME=OraWCIntgHome1.   If that succeeds, then you can run the installer again.


Okay, so I ran the command it suggested in the command line, and it again failed, but this time it left open the Oracle Universal Installer console with this message in it:

Starting Oracle Univeral Installer...
Checking swap space: 0MB available, 500 MB required.


Ahh, so I dug into the virtual memory settings, and I found on one machine that the C:\ drive had no virtual memory assigned, and then a secondary drive had virtual memory set to "system managed size." On the other machine, the C:\ drive had vritual memory assigned, but it used "system managed size."

On my fourth server, I tried setting specific memory settings on the C:\ drive, and that worked. On my fifth server, I tried leaving "system managed size" on the C:\ drive but specific virtual memory size on a secondary drive.  Both of those worked fine.

So the trick seems to be simply, set virtual memory specifically. To do so:

  • WindowsKey-Break to open the System Properties Window
  • Go to the Advanced tab
  • Open the Performance settings
  • Go to the Advanced tab
  • In the Virtual Memory area, select Change
  • Specify "Custom Size" and enter intitial of 2046 and max of 4092
  • Click Set, then OK, then acknowledge you need to restart, then close apps, restart, and run the installer.
Properly set memory could look something like this:

10gr3-virtual-memory.jpg






























Good luck with your 10gR3 installs!

----

Added Nov 14: Joel asked where to find the installer. Follow these steps:

  1. Log in through http://edelivery.oracle.com/
  2. Search "Oracle Fusion Middleware" and "Win32"
  3. Click into Oracle® Application Server 10g Release 3 (10.1.3) Media, Pack for Microsoft Windows (32-bit)
  4. Search the results page for "Interaction" to find the WCI and related products



by bill at November 15, 2008 08:09 AM

Function1

AJAX Refresher

It's been a while since we touched on AJAX, but a question came up recently about it an I thought it might be good to review. AJAX, or "Asynchronous JavaScript and XML", is a way for portlet developers to create rich Web Applications that don't require the entire browser page to refresh to update content.  This is done by making asynchronous calls to the server and updating content within the page itself.  With the AquaLogic portal, this means that portlets can dynamically update content in <div> tags by requesting new content without having to refresh the entire page (and other portlets on the page).  It's a pretty simple concept; in many cases you can accomplish this without having to even change any code - you can just specify "inline refresh" on the Web Service and the portal will automatically rewrite the HTML links on the page to make AJAX calls:

inline_refresh.jpg

The HTML rewrites cause the browser to make the HTTP request "behind the scenes", and when a response comes back, the portal refreshes the content inside the portlet <div> tag.

But there are some things to know about this AJAX stuff, so here are a couple of refresher points about AJAX:

1) The response to an AJAX request is basically just a text string to a browser, and it's up to your JavaScript to interpret it.  Often you do something like:

document.getElementById("responseDivTag").innerHTML = response.getResponse();

... to refresh content.  But note that this doesn't tell the browser to "process" the response - specifically, JavaScript that comes back in the response won't run, because all we're doing is setting the HTML to a string that comes back from the server.  In order to run JavaScript in the response, you should look into the JavaScript "eval()" method, which will take a string returned from the server and run it as JavaScript.  Just make sure you don't include the <script> tags in your response if you really are returning JavaScript and are parsing it as such.

2) The response does not have to actually be HTML!  It's just a string to the browser, and you can do anything with it.  The most common use (which all of our products use) is to return JSON, or "JavaScript Object Notation", which can then be treated as objects that your script can handle however you want.  Let's say you just want to know if there was a success or failure: you could literally just return a "0" or "1" in your response and write something like:

if (response.getResponseText.equals("1"))

   alert("success!");

else

   alert("fail");

Obviously, this just barely scratches the surface on AJAX, and you can rest assured that you haven't heard the last of it.  AJAX is the cornerstone of pretty much all future Oracle portal technologies, and if you're a web developer who's not all that familiar with it, trust me:  you will be soon.

November 15, 2008 04:23 AM

November 14, 2008

Terry Wang

Switch Oracle BPM (ALBPM) Studio Language

AquaLogic (Fuego) BPM is now part of Oracle BPM Suite and renamed to Oracle BPM.

Back in the 5.x era, the studio IDE is a Swing based app. As far as I know, from 5.7 BEA started to implement i18n for Studio. However, only several languages are available. It can be switched via menu.

From 6.0 whose code name is puma, a new Studio IDE is built on top of Eclipse IDE. In theory it is should support multiligual. However there is not apparent options in the UI to switch language.

A coworker of mine in China asked my that why his ALBPM 6.0 Studio was in Chinese Simplified. And he was not able to change it. After looking at the locale setting which was zh_CN. And he was not willing to change the system locale. So I told him to try switching using eclipse way:) It did work. I then digged further into the installation folder and found it is multilingual in fact.

Tip applicable for version:
ALBPM Studio 6.0.x
Oracle BPM Studio 10gR3 (10.3) which is ALBPM 6.5

How to use:
Windows OS
Edit the Studio shortcut and add the -nl option. It should look like this:
C:\Oracle\OracleBPMStudio\eclipse\eclipse.exe -nl de

*NIX
Assume that we install Studio in /opt folder.
/opt/OracleBPMStudio/eclipse/./eclipse -nl de
Note: In the 10gR3 Studio installatio folder, there is even no icon for the app but a Eclipse icon...

Check the installation folder and you will find the available languages:
C:\OracleBPMStudio\studio\eclipse\plugins
/opt/OracleBPMStudio/studio/eclipse/plugins

en
es
ja
ko
zh
zh_TW
de
fr
it
nl
pt

For more info on Eclipse:
http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.platform.doc.user/tasks/running_eclipse.htm

by Terry Wang (noreply@blogger.com) at November 14, 2008 11:28 PM

November 11, 2008

Bill Benac

Convert YouTube Lectures to MP3

In addition to working for Oracle, I'm a student these days. Periodically I'm asked by a class to watch a lecture on YouTube. Most recently, I've been watching this lecture by thought-leader Jyri Engeström in which he discusses objects around which communities socialize (photos, mobile phones, potato harvests, cats, etc) and what makes compelling services around these social objects. It turns out his lecture doesn't rely heavily on his slides, and I found myself wanting to listen to this through my mp3 player instead of sitting tethered in front of my computer. Yeah, yeah, I know I wouldn't have this problem if I had an iPhone, but...

Here's how I converted a YouTube lecture to MP3:

* Grabbed the mp4 video by going to http://keepvid.com, entering the YouTube URL, then clicking the download button. At this point, the video was on my laptop
* Used MMConvert to "Convert to MP3" as its left menu offers. I had it use the video as the source instead of the audio files it expected.

That's great, but... don't you figure there's an easier way?

Turns out someone else set up a service to do this conversion. You can use http://www.flv2mp3.com/ for this.

Of course, some YouTube content just isn't suited for MP3 format. An example is of my favorite video lectures by an anthropologist and interpreter of Web 2.0, Michael Wesch. Over the summer he gave an incredible lecture for the Library of Congress entitled An Anthropological Introduction to YouTube." Instead of converting the visual content into audio content, it will convert the YouTube hater into a YouTube lover.

As much as I sometimes feel afflicted by the distractions of frivolity of social media, I can't ignore that they can provide critical community, career opportunities, entertainment, advice, and so forth. So I'm glad to learn ways to interact with and manipulate content that might otherwise look locked in a delivery channel (e.g. YouTube) or format (video). I hope you'll benefit from these too.

by bill at November 11, 2008 06:48 AM

Function1

The Stack Trace Strikes Back

Howdy all. Welcome to part two of three of what was originally conceived as a one part series. It's entirely possible that I'll get all George Lucas on you years from now and produce some more of these posts that are a complete letdown and affront to your childhood memories, but I digress. For now, rest assured that this post will knock your socks off as a follow-up to my last tidbit on decompiling Java code.

Without further ado, I give you...Stack Wars II: The Stacktrace Strikes Back (I'm completely aware that I'm abusing the metaphor here, but isn't that really what blogging is all about?).

Standard disclaimer: This post is intended for a technical audience with a focus on production support. Also, everything here is Java focused, but you can certainly apply some of the concepts in a .NET environment as well...you'll just have to create your own screencaps to replace the examples I've included below.

So, what is a stack trace, and why should you care? Well, one question at a time please.

What is a stack trace?

Wikipedia says a Stack Trace is, "A report of the active stack frames instantiated by the execution of a program." Now, I vaguely understand the Wikipedia definition, but I have also have a computer science degree from a second tier state university, so let me try to translate for those of you who were smart enough to get degrees in something besides CompSci: a Stacktrace is a snapshot of a program's behavior at a point in time. In the Java world, a stack trace will tell you which method was being executed at the time the trace was generated, along with its complete call stack, and usually line numbers as well. Take a look at the following simple stack trace below as an example:

stack_trace.png

Why should you care?

Good question. I'd venture a guess and say that about 99.99% of the world doesn't need to know nor care about stack traces. But here you are reading this post none-the-less, so here's why they're important:

1) Good programmers almost always print stack traces out in log files when an error in a program occurs. This gives us a useful tool to track down bugs. Whether you're just reporting information to a support team somewhere, or getting a little sassy and trying to fix a problem yourself, the stack trace is like a map for finding treasure buried deep in code. Except that instead of finding actual treasure, you're just finding a logic error. And instead of getting rich, you just get to complain about a problem, and maybe fix it.

2) You can tell the JVM to generate a stack trace for a running process. Doing so allows us to take a snapshot of the JVM at an arbitrary point in time, and see what all its threads are up to. This is useful when trying to figure out why a process (Tomcat for instance) is zombied (i.e. it's running, but not responding to requests), or when you're trying to fix deadlock issues, which are particularly difficult to run down.

Hit the jump for learning more about reading and interpreting stack traces!

November 11, 2008 04:56 AM

November 10, 2008

Bill Benac

Spreadsheet to Generate URLMapping Entries

The URLMapping section of portalconfig.xml isn't the most elegant part of the ALUI portal configuration. You are required, for each URL you intend to support, to repeat a block of settings but with incremented index values. I'm working with a customer using dozens of URLMappings, and we realized there had to be a better way than updating these individually. Enter Excel.

I created two spreadsheets, and the one you use depends on your environment and preferences. The simpler urlmapping-generator.xls creates a single mapping for each single URL you want to use, and this is what you would expect is required. However, as I wrote last year, there's a bug in how URLMappings are handled when a proxy or load balancer is involved, and the way to fix it is with an extra URLMapping. I have an advanced spreadsheet, urlmapping-generator-proxybugfix.xls for this situation, and it creates both the first mapping you would expect as well as the second mapping to handle the bug.

I hope this is helpful.

by bill at November 10, 2008 10:29 PM

October 28, 2008

Ross Brodbeck

Back in the Saddle (Again)

As you may have noticed (or not noticed, if your read this site from your aggregator), my blog has undergone some much needed renovation. I realize that as a blog reader myself, I appreciate a dearth of "State of the Union" posts in the blogs I read. Nonetheless, there have been quite a few changes, so here's an infrequent update...

  • I use Movable Type to publish, and despite its complexity, I love the customizability and performance. I found a great style from the CMR Movable Type Styles Blog, and have customized it to my liking. Finally, no more blah "Minimalist Red" scheme.
  • Dev2Dev is finally gone for good, which means some of my blog images were 404'ing. Thank you helpful readers for pointing this out. I finally went back and reset them to point to my own blog.
  • Bill Benac recommended we Plumtree bloggers start linking to each other, so you'll notice a blogroll on the right side of the page. If you're blogging and you want to be listed here, give me a shout.
  • The blog slogan has now officially become "Tech + Caffeine = blog", since I'm tired of dealing with these product name changes. As are other people, apparently.
  • That Jeep in the picture is mine, featured in some mind-blowingly isolated terrain right outside the Badlands.

So what's in store for the future? Well, I still have some posts to write in my Search Series, I have a long backlog of posts regarding various technical minutiae, and then there is your input... Thoughts?

by hross at October 28, 2008 09:38 PM