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
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



Convert YouTube Lectures to MP3

| | Comments (0)
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.

Spreadsheet to Generate URLMapping Entries

| | Comments (0)
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.

Fully Disable Search in ALUI Collab 4.5

| | Comments (2)
I'm working with a Collab deployment where we want to disable the search feature. This involves two things: disabling index requests from Collab to the Search Server and removing the search form from Collab's web UI.

Disabling Index Requests from Collab to Search

The easy part is disabling index requests from Collab to the Search Server. Just open %ALUI_HOME%\ptcollab\4.5\settings\config\config.xml and change the value for "search enabled" from "yes" to "no."

Removing Search from Project Explorer UI

For whatever reason, the Project Explorer view of Collab shows a search form even when the app is configured to not have its content index. This is shown below:

collab.projexp.search.before.jpg

















The only way I know of to remove the form is to modify the JSP files within collab.war. The process for modifying collab.war is:

  1. Open %ALUI_HOME%\ptcollab\4.5\webapp
  2. Backup webapp.war to webapp.war.orig
  3. Create a new subdirectory called build
  4. Extract collab.war into a new directory at %ALUI_HOME%\ptcollab\4.5\webapp\build
  5. Make the appropriate edits (described below)
  6. Package up the contents of %ALUI_HOME%\ptcollab\4.5\webapp\build
  7. Stop Collab
  8. Replace the old collab.war with the new one
  9. Start Collab
In the case you want to remove the search UI, as in this case, make the following edits:

  1. Open %ALUI_HOME%\ptcollab\4.5\webapp\war\project\appView\projectToolbar.jsp
  2. Comment out these lines:

        <jsc:toolbarHtmlBlock align="right"><nobr>
            <fmt:message key="project.search"/>
            <input type="text" id="searchText" class="formInputBoxText" align="center"/>
            <select id="searchScope" class="objectText" width="0%">
                <option value="all"><fmt:message key="project.search.scope.all.folders"/></option>
                <option value="current"><fmt:message key="project.search.scope.current.folder"/></option>
            </select>&nbsp;
        </jsc:toolbarHtmlBlock>
        <jsc:toolbarHtmlBlock align="right"><nobr>
            <collab:img src="search.gif" border="0" align="center" onclick="searchHandler()"/></nobr>
        </jsc:toolbarHtmlBlock>

  3. Open %ALUI_HOME%\ptcollab\4.5\webapp\war\layout\templates\appViewSearchBar.jsp
  4. Comment out these lines:

        <input type="hidden" name="projID" value="${fn:escapeXml(baseAppViewBean.currentProject.ID)}">
        <input type="hidden" name="isAppView" value ="true">
        <input type="hidden" name="projRestr" value ="1">
        <input type="hidden" name="collabType" value ="<%=com.plumtree.collaboration.cssearch.CollabIndexManager.OBJECT_TYPE_ALL%>">
            <td class="banText" align="${fn:escapeXml(tdAlign)}" width="50%" nowrap style="padding-right:5">
                <b><fmt:message key="project.search.label"/></b>
                <input size="32" name="searchString" value="" class="formInputBoxText">
                <collab:simpleUI>
                    <input type="submit" name="go" value="<fmt:message key="key.search"/>" class="formBtnText">
                </collab:simpleUI>
                <collab:notSimpleUI>
                <a href="#" onClick="document.searchForm.submit();"><collab:img src="search.gif" border="0" align="absmiddle" altKey="key.search"/></a>
                <a href="${fn:escapeXml(advancedSearchURL)}"><collab:img src="advancedSearch.gif" border="0" align="absmiddle" altKey="search.advanced"/></a>&nbsp;
                <input type="button" name="closeWindow" value="<bean:message key="button.close"/>" onClick="window.close()" class="formEditorBtnText">
                </collab:notSimpleUI>
            </td>

            <collab:simpleUI>
                <td class="banText" align="right">
                    <tiles:insert attribute="help"/>
                </td>
            </collab:simpleUI>


  5. Add the following lines in the place of what was just commented out:

    <td class="banText" align="${fn:escapeXml(tdAlign)}" width="50%" nowrap style="padding-right:5">
    <input type="button" name="closeWindow" value="<bean:message key="button.close"/>" onClick="window.close()" class="formEditorBtnText">
    </td>


  6. Save the files


The edits remove the undesired UI component from each project's individual view and the Project Explorer view, this latter being shown here:

collab.projexp.search.after.jpg

















By the way, these steps are a little tedious if you will need to tweak your customizations as you try to get it right. After setting up the directories and unzipping the original collab.war, I wrap the remaining steps in a script that lets me quickly run my iterations. That script's contents:

net stop "BEA ALI Collaboration"
c:
cd c:\bea\alui\ptcollab\4.5\webapp\build
zip -r collab.war *
mv -f collab.war ..\.
net start "BEA ALI Collaboration"


Note that I'm using command line tools "mv" and "zip" that come from the Unxutils project, a collection of Windows ports of Unix utilities.

That's it. Enjoy!


I spend a lot of time in web-based email systems, and I've lost way too many email messages to a timed-out session. If I'm writing something both important and complicated, then I often am still composing after my session times out. Then when I click send? I get an error message.

webmail_error.jpg

























Today though I realized that since the content of my message is still in my browser and resubmitted every time I refresh that error page, I can actually retrieve it. In Firefox, I have a HTTP header monitor called TamperData that shows me my headers, including the POST section from my web-based emails. In MSIE, I would use Fiddler, though I've not tested this exact use case there. In any case, I can indeed retrieve the message.

webmail_header.jpg















The next problem though is the message is encoded with plus+signs+between+the+words and without line breaks separating paragraphs. I realized I could write some simple Javascript to decode the message properly. You may want to do the same thing. I'll put the code here for you to read/take, and I'll also put the form here for my use and yours.

Enjoy.

<script>
function getit(sin) {
mystr=unescape(sin)
mystr=mystr.replace(/\+/g," ")
document.myform.theoutput.value=mystr
}
</script>
<form name=myform>
<hr><b>Enter your encoded message:</b><br>
<textarea rows=4 cols=80 name=theinput></textarea>
<br>
<input type=button value="Decode it!"onclick=getit(theinput.value)>
<br>
<textarea rows=20 cols=80 name=theoutput></textarea>
</form>
 

Enter your encoded message:




Recently I had a conversation with someone about the features available in ALUI for portlet developers. We spoke mostly about what the IDK offers, but there's more too. The IDK is largely about data access and content transformation on the back end, either at the remote server level or in the portal's "gateway" processing space. But much can be done on the browser side too using adaptive portlets. I wrote a guide for this a long while ago, and it's still relevant and helpful. So I'll post it here.

The guide starts with a Word document that gives an overview and screenshots of adaptive portlets. Then it gives installation instructions for the samples that are provided with the guide in its zip file. I'll put the first few pages of the Word document in this post so you can know whether you want to download the entire guide with its sample code.

Getting Started with  Adaptive Portlets

BEA uses the term "Adaptive Portlets" to refer to portlets using AJAX--technologies generally based in JavaScript and XML that allow richer application development.  A simple introduction to this technology is provided through the "Intro to Adaptive Portlets" community with its associated portlets. This document describes that community and how to install it on your own system.

The "Intro to Adaptive Portlets" community consists of several pages. The main page describes the adaptive portlet technology.  Subsequent pages of the community illustrate different design patterns individually, and then the last page shows all technologies together in a cacophonous celebration. Screenshots of the pages are below.

Main Page


Auto Refresh


Inline Navigator


Inline Post


Master/Detail


Broadcast Listener


All in One!


How to Remove Individual Components of Collab

| | Comments (1)
Let's get to know how to easily do what the Collab installer doesn't let you do easily: manage its individual components.

At my current client, we're upgrading ALUI Collab 4.2 to 4.5 as part of our upgrade to ALUI 6.5. One feature of the new ALUI suite is that it offers a "common notification service" that replaces the collab-specific notification service that had been part of 4.2. Accordingly, we don't need the old Collab notification service. The official upgrade documentation says "If you have an existing Notification Service from your previous installation of Collaboration, disable or uninstall it." But how do you do that?

If you run the Collab 4.2 or 4.5 uninstaller on a machine with more than one Collab component, it will remove every component. That doesn't work well since you're trying to upgrade the Collab piece and remove the notification piece. Similarly, you may realize that you installed Collab 4.5's Search Service on the Collab box when you really want it on the Search box, so how do you remove just the Search Service?

In either case, you can use the batch file that is part of the undesired component, remove the service, then delete the files from the file system. In the case of the 4.2 notification, use this batch file: %ALUI_HOME%ptnotification\4.2\bin\ptnotificationserverd.bat, and in the case of the Search Service, use this batch file: %ALUI_HOME%searchservice\1.1\bin\searchservice.bat. Pass in the parameter "remove" and you're done.

Enjoy!

Firefox Plugin Shows Host Portal Info

| | Comments (3)
ALUIportalhost.jpgAre you familiar with the routine of opening the HTML source of an ALUI portal page, scrolling to the bottom, and checking for the name of the host server? This is something I've done countless times in load balanced environments when trying to test or debug a server.

I decided to make a Firefox plugin that will extract that portal host information then display it at the bottom of the browser so that I can immediately see the portal host.

I've had several other people try this plugin, and they found it useful. I hope you'll find it helpful too. To install it, download the plugin, then drag it onto your Firefox browser. It's been tested on FF versions 1.5 through 3.1.

Enjoy!

Updated October 7:

Thanks to Andreas Mersch who improved on my original extension. With his addition, the browser will now display the portal performance information along with the portal host. The new version can be downloaded with the same link as before.

Configuring Proxies in ALUI Core Products

| | Comments (0)
To access the public Internet from many enterprise environments, one needs to configure the browser on his or her laptop to go through a proxy server. Sometimes, this requirement applies as well to the servers that run ALUI as well. With a browser, it's a fairly straight forward point-and-clickety-clickety-click to enter the proxy information, but with ALUI products, it's more involved. It seems like I always need to check my old emails to find configuration instructions, so I'll post here to make it easier for me, and hopefully easier for you too.

Of the several core ALUI products, only a few need proxy information. Products like the Search or Document Repository server of course do not need to make requests to resources outside of the ALUI servers. The portal is the most obvious component for doing so. You might have a some portlets provide by Google for example that users should be able to access. The portal's proxy is configured by updating %ALUI_HOME%\settings\common\serverconfig.xml to use the following settings:



A less obvious component that should be configured for proxy access is the automation server.  In some cases, portal administrators and content managers may choose to create a job that runs a portlet web service as its operation. One reason to do this is to generate the HTML that comes from a slow-running dynamic portlet. Antoer reason to do this could be if the code behind an URL ran some job. The automation server uses the same proxy setting configuration that the portal does in %ALUI_HOME%\settings\common\serverconfig.xml.

Finally, the new Remote Portlet Service's RSS Reader needs a proxy configured in order to get feeds outside the enterprise. The settings are to be put in %ALUI_HOME%\remoteps\1.0\settings\config\wrapper.conf. In myco's case, the proper settings were:

wrapper.java.additional.22=-Dhttp.proxyHost=www-proxy.myco.com
wrapper.java.additional.23=-Dhttp.proxyPort=31060
wrapper.java.additional.24=-Dhttp.nonProxyHosts="localhost|*.myco.com"

It is important to follow the example settings in the file correctly. The nonProxyHosts setting needs to be in quotation marks, but the proxyHost and proxyPort should not be.

It is also important to not follow the example settings with regard to the setting number. The file suggests:

#wrapper.java.additional.19=-Dhttp.proxyHost=
#wrapper.java.additional.20=-Dhttp.proxyPort=
#wrapper.java.additional.21=-Dhttp.nonProxyHosts=

However, 19, 20, and 21 are used by previous settings, so the proper wrapper.java.additional numbers will be increased as shown in the myco example.

Enjoy!

Find recent content on the main index or look in the archives to find all content.