About a year ago I wrote this letter to the editors of the Polaris ATV magazine. I did a little more research and sadly Polaris is just not interested in encouraging handicapped riders of ATV's because of liability issues.
I 100% understand their position - the whole ATV businees is horribly lawsuit prone - stupid people buy machines that are way too fast and floor it and aim at the nearest tree and then want to be paid for the rest of their life. Makes it all the much harder for the majority of ATV riders who are responsible.
Since the letter will never see the light of day, I figured I would blog it - It is a cute bit of writing.
October 16, 2005
Dear Escape Magazine,
My son Brent has Cerebral Palsey and has reduced ability in his legs. He walks with arm crutches. In February, Brent needed hip surgery. We decided that after he recovered from the surgery we would purchase him an ATV. The Polaris Predator 90 was the only choice because of its hand operated transmission. We purchased his new Predator in May and have been riding it all summer. By the end of summer, Brent and I were having so much fun that mom wanted her own, so we added a 2005 Phoenix to the family.
Riding his Polaris is about the only physical activity where Brent does not have to compromise because of his disability. Riding, leaning, and standing up on his Polaris is some of the best exercise that Brent can do. Riding his ATV has improved his strength, flexibility, and balance.
On his Polaris he can go as fast as he wants and do donuts like any other fourteen year old kid. Riding with Brent deep in a forest and chasing him power-sliding through sweep turns makes me think about "escape" in a whole new way.
I really would give my most heartfelt thanks to whomever inside of Polaris made the decision to build a hand-shifted 90 CC quad with reverse in 2005. For us the timing was perfect.
Charles Severance
Lansing, Michigan
------
You are welcome to edit my letter in any way you like. I know that it is too long for the format of the letters page. You are welcome to use the pictures in any way you like.
Brent's Predator was purchased at Full Throttle MotorSports in Lansing, MI. They have been so wonderful to work with. The Phoenix 2005 was purchased on eBay from a really great guy - it was in wonderful shape and a great deal. It was originally purchased at Spicer's Boat City in Houghton Michigan. I have added Full Throttle and Spicers to this message.
I have many other photos and video about Brent if you are interested (as you might expect) including what I call "donut practice". Escape, Full Throttle and Spicers are welcome to use the pictures and letter in any way they like as well.
I made a short movie about Brent and his ATV - right after we purchased the
Predator in May. As you can tell from the movie - this all means a lot to me.
http://www.dr-chuck.com/media.php?comment=wmv&id=48
The basic steps to deploying a portlet in GridSphere by hand are the
following (which can also be a check list if things go wrong):
-1. Shutdown tomcat.
0. Edit Tomcat's conf/tomcat-users.xml file and add the line
<user username="gridsphere" password="gridsphere" roles="manager"/>
1. Make sure you have a portlet.xml file.
2. Modify your web.xml file to use GridSphere specific settings. The
Ant task should do this for you.
3. Make sure you have the file gridsphere-portlet.xml in your portlet's
WEB-INF directory. You never need to actually edit this, so you can
copy from one portlet to another.
4. Make sure you have gridsphere-ui-tags.jar in your portlet's
WEB-INF/lib directory.
5. Compile everything and create a war file. Your war file name is
important--it needs to match stuff in web.xml.
6. Copy this war file to tomcat's webapps directory.
7. Create an empty file (using unix's "touch" command) in tomcat's
webapps/gridsphere/WEB-INF/CustomPortal/portlets directory. This should
have the same name as your war file. If your portlet is myjunk.war,
then "touch /path/to/tomcat/webapps/WEB-INF/CustomPortal/portlets/myjunk".
8. Restart tomcat.
Subject: Re: Help with Gridsphere
Date: Fri, 19 May 2006 11:51:26 -0400
From: Marlon Pierce <mpierce near cs.indiana.edu>
To: Yu (Marie) Ma <yuma workingat cs.indiana.edu>
CC: Mehmet Nacar <mnacar closeto cs.indiana.edu>
Thanks to some timely help from Jim Martino of Johns-Hopkins providing a test uPortal instance - I kind of got after the Sakai JSR-168 portlets. I fixed some bugs and cleaned and tightened things up a lot.
The biggest thing is that I built a brand new variant of the Portlet called SakaiLaunch (added to SakaiGallery and SakaiTree). SakaiLaunch is the best of the portlets and probably almost makes all of the others obsolete.
SakaiLaunch eliminates all but one iframe and provides a very clean and simple breadcrumb navigation. It also autosizes like the Charon portal so there are *no* scrollbars. There is only one tool on the screen at one time. The reset button is folded into navigation.
I attach a few action shots of SakaiLaunch working in Pluto 1.1.
I fixed a number of nagging issues with Sakai's web services - like the lack of a real session, the loss of login events, and chat not working when you log in over web services.
Improved the debugging of the portlets - added a property to control debug printing. I left the portlets chatty by default to help in debugging.
Figured out how to deploy the portlets in Pluto 1.1 and tested the portlets both in Pluto 1.0 and Pluto 1.1. Also figured out how to make a generic, uploadable war - I tested this in Pluto 1.0 and she works. Here is the war.
http://www-personal.umich.edu/~csev/sakai/portlet/sakai-portlets-r14056.war
To really make it work you should un-war it and set the portal password and sakai host address in sakaiportlet.properties and then war it back up prior to uploading to your portal. Also make sure to get all the patches listed below (commits) installed in your Sakai before doing too much playing. The inside Sakai improvements are important to make it all work smoothly.
Remember that you must pull the portlet out of svn separately form the rest of sakai:
cd ~/dev/sakai
svn co https://source.sakaiproject.org/svn/portlet/trunk portlet
The "portlet" directory shoudl be a peer to the "portal" directory once properly checked out.
Note - If you want to use Pluto 1.1, you should look at this blog post.
http://www.dr-chuck.com/csev-blog/000194.html
Related JIRAs: SAK-2473, SAK-6113, SAK-3134, SAK-5827
Related Commits: 14062, 14063, 14064, 14065
This is Gibberish
http://localhost:8080/portal/tool/19a66248-561f-4421-80bd-2c5e213d5eb0?sakai.session=d94f9115-e678-43f1-00ad-fbe9b802348b
Add Main
Dashes become x's
http://localhost:8080/portal/title/b61b3656-bb0b-4926-0051-0581b956e172?reset=true
name="Main19a66248x561fx4421x80bdx2c5e213d5eb0"
id="Main19a66248x561fx4421x80bdx2c5e213d5eb0"
title="Message of the Day Content"
class ="portletMainIframe"
height="50"
width="100%"
frameborder="0"
marginwidth="0"
marginheight="0"
scrolling="auto"
src="http://localhost:8080/portal/tool/19a66248-561f-4421-80bd-2c5e213d5eb0?panel=Main">
var TREE_ITEMS = [
['My Workspace',0,
['Home','http://localhost:8080/portal/page/dc0e247e-4822-4031-80d3-e2fea1975436?sakai.session=68b64974-8f78-42a1-80d8-461c68172910',
['Message of the Day','http://localhost:8080/portal/tool/19a66248-561f-4421-80bd-2c5e213d5eb0?sakai.session=68b64974-8f78-42a1-80d8-461c68172910'],
['My Workspace Information','http://localhost:8080/portal/tool/faec4393-f522-418d-0096-b53af44e0868?sakai.session=68b64974-8f78-42a1-80d8-461c68172910']
]
,
['Profile','http://localhost:8080/portal/page/d6b70f83-f1ae-42d3-8049-4e63bf89062d?sakai.session=68b64974-8f78-42a1-80d8-461c68172910'
]
http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=85&t=000043
If you wish to pass parameters within a URL, for example, "user=bob", then you simply create an Action URL (which will cause the portlets processAction() method to fire) and invoke "setParameter(key, value)" on it.
An example,
Create your ActionURL object as you would do so normally.
ActionURL myURL = renderResponse.createActionURL();
then add your parameters,
myURL.setParameter("user", "bob");
When testing in local host - use KSESSIONID for Sakai - could work for non-load balanced situations. In load balanced situations - must run separate servers for Sakai and portal.
http://maven.apache.org/maven-1.x/plugins/war/
If you need to copy the web.xml file in order to replace some filter tokens or simply perform some custom modification to it, simply write a pre-goal to the war:war-resources goal in which you perform the manipulation. Then set the maven.war.webxml property to point to your modified web.xml.
Three things are messed up in pluto 1.1 right now
==== Bug in pageId lookup in trunk ======
======= Neither trunk nor beta1 will build unless maven.test.skip=true ========
===== The beta1 tag builds but will not pluto:install =======
Three things are messed up in pluto
/Chuck
==== Bug in pageId lookup in trunk ======
This worked about a week ago - so I am thinking something recent happenned.
The trunk has a bug where PageId's end up with a prefix of a "/" and so the configuration can never find find pages - and things blow up horribly.
To reproduce - simply bring up pluto, log in as tomcat, and navigate to a page other than the default.
The fix is below:
vi pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/RenderConfig.java
public PageConfig getPageConfig(String pageId) {
if (pageId == null || "".equals(pageId)) {
if (LOG.isDebugEnabled()) {
LOG.debug(
"Requested page is null. Returning default: " +
defaultPageId);
}
pageId = defaultPageId;
}
PageConfig retval = (PageConfig) pages.get(pageId);
// TODO: Fix Hack
if ( retval == null && pageId.startsWith("/") && pageId.length() > 2 ) {
System.out.println("HACK ALert - Trimming off slash " + pageId.substring(1));
retval = (PageConfig) pages.get(pageId.substring(1));
}
System.out.println("retval = " + retval);
return retval;
}
[DEBUG] PortalURLParser - Parsing URL: /pluto/portal/Pluto%20Admin
[DEBUG] PortalURLParser - Parsing request pathInfo: /Pluto Admin
[DEBUG] PortalDriverServlet - Processing render request.
[DEBUG] PortalDriverServlet - Rendering Portal: Requested Page: /Pluto Admin
HACK ALert - Trimming off slash Pluto Admin
retval = org.apache.pluto.driver.services.portal.PageConfig@f50e8d
======= Neither trunk nor beta1 will build unless maven.test.skip=true ========
[INFO] Surefire report directory: /Users/csev/dev/pluto-1.1/pluto-trunk/pluto-descriptor-impl/target/surefire-reports
org.apache.maven.surefire.booter.SurefireExecutionException: Unable to create test class 'org.apache.pluto.descriptors.services.castor.WebAppDescriptorServiceImplTest'; nested exception is java.lang.ClassNotFoundException: org.apache.pluto.descriptors.services.castor.WebAppDescriptorServiceImplTest; nested exception is org.apache.maven.surefire.testset.TestSetFailedException: Unable to create test class 'org.apache.pluto.descriptors.services.castor.WebAppDescriptorServiceImplTest'; nested exception is java.lang.ClassNotFoundException: org.apache.pluto.descriptors.services.castor.WebAppDescriptorServiceImplTest
org.apache.maven.surefire.testset.TestSetFailedException: Unable to create test class 'org.apache.pluto.descriptors.services.castor.WebAppDescriptorServiceImplTest'; nested exception is java.lang.ClassNotFoundException: org.apache.pluto.descriptors.services.castor.WebAppDescriptorServiceImplTest
java.lang.ClassNotFoundException: org.apache.pluto.descriptors.services.castor.WebAppDescriptorServiceImplTest
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.apache.maven.surefire.booter.IsolatedClassLoader.loadClass(IsolatedClassLoader.java:100)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:84)
at org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:147)
at org.apache.maven.surefire.Surefire.run(Surefire.java:108)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:225)
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:747)
[INFO] ----------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ----------------------------------------------------------------------------
===== The beta1 tag builds but will not pluto:install =======
The key here is that you need to clean out your maven repo before doing install and pluto:install.
cd ~/.m2
rm -rf `find . -name '*SNAPSHOT*'`
If you don't clean this up and have been building from trunk, the beta pluto:install *will* find the artifact and happily install the wrong thing (i.e. not the recently compiled beta1) code.
[INFO] ----------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ----------------------------------------------------------------------------
[INFO] Failed to resolve artifact.
GroupId: org.apache.pluto
ArtifactId: pluto-portal
Version: 1.1.0-SNAPSHOT
Reason: Unable to download the artifact from any repository
org.apache.pluto:pluto-portal:1.1.0-SNAPSHOT:war
from the specified remote repositories:
central (http://repo1.maven.org/maven2)
UsageSessionSerivce needs a new method that does not demand an Authorization not a httprequest as a parameter.
For now the code is living in SakaiPortalLogin.jws and SakaiLogin.jws so these can be used in older versions of Sakai.
Need to add the method the the BASE API, test it out, then commit it - then sometime later - likey *after* 2.3 - remove the code from the two web service calls.
vi ./event-impl/impl/src/java/org/sakaiproject/event/impl/UsageSessionServiceAdaptor.java
public boolean login(Authentication authn, HttpServletRequest req)
{
// establish the user's session - this has been known to fail
UsageSession session = startSession(authn.getUid(), req.getRemoteAddr(), req.getHeader("user-agent"));
if (session == null)
{
return false;
}
// set the user information into the current session
Session sakaiSession = sessionManager().getCurrentSession();
sakaiSession.setUserId(authn.getUid());
sakaiSession.setUserEid(authn.getEid());
// update the user's externally provided realm definitions
authzGroupService().refreshUser(authn.getUid());
// post the login event
eventTrackingService().post(eventTrackingService().newEvent(EVENT_LOGIN, null, true));
return true;
}
public UsageSession startSession(String userId, String remoteAddress, String userAgent)
{
// do we have a current session?
Session s = sessionManager().getCurrentSession();
if (s != null)
{
UsageSession session = (UsageSession) s.getAttribute(USAGE_SESSION_KEY);
if (session != null)
{
// If we have a session for this user, simply reuse
if (userId != null && userId.equals(session.getUserId()))
{
return session;
}
// if it is for another user, we will create a new session, log a warning, and unbound/close the existing one
s.setAttribute(USAGE_SESSION_KEY, null);
M_log.warn("startSession: replacing existing UsageSession: " + session.getId() + " user: " + session.getUserId()
+ " for new user: " + userId);
}
// create the usage session and bind it to the session
session = new BaseUsageSession(idManager().createUuid(), serverConfigurationService().getServerIdInstance(), userId,
remoteAddress, userAgent, null, null);
// store
if (m_storage.addSession(session))
{
// set as the current session
s.setAttribute(USAGE_SESSION_KEY, session);
return session;
}
}
return null;
}
SakaiLogin.jws:
UsageSessionService_loginDirect(user.getId(), id, ipAddress, "SakaiLogin.jws");
// This code is adapted from the file:
// ./event-impl/impl/src/java/org/sakaiproject/event/impl/UsageSessionServiceAdaptor.java
// Method
// public boolean login(Authentication authn, HttpServletRequest req)
// We want to do exactly what this routine *does* but we do not have an HttpServletRequest
// to hand it
public boolean UsageSessionService_loginDirect(String userId, String userEid, String ipAddress, String userAgent)
{
// establish the user's session - this has been known to fail
UsageSession session = UsageSessionService.startSession(userId,ipAddress,userAgent);
if (session == null)
{
return false;
}
// set the user information into the current session
Session sakaiSession = SessionManager.getCurrentSession();
sakaiSession.setUserId(userId);
sakaiSession.setUserEid(userEid);
// update the user's externally provided realm definitions
AuthzGroupService.refreshUser(userId);
String EVENT_LOGIN = "user.login";
// post the login event
EventTrackingService.post(EventTrackingService.newEvent(EVENT_LOGIN, null, true));
return true;
}
}
There is a bug (I think) in session handling in Pluto 1.1. Why would Pluto 1.1 keep a session across a Tomcat restart!
I think that this has to do with Tomcat's session serialization across startups and Pluto's blind dependence on Tomcat session for storing the Pluto session.
../work/Catalina/localhost/sakai-portlets/SESSIONS.ser
If I am crazy - just tell me so.
I have a portlet - with these lines at the beginning:
public void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
PortletSession pSession = request.getPortletSession(true);
String fred = (String) pSession.getAttribute("fred");
System.out.println("Fred = "+fred);
pSession.setAttribute("fred","fred was here");
The "fred" attribute is used no where else in the portlet. Sometimes the portlet puts non-serializable stuff in session.
[DEBUG] PortletEntityImpl - Loading portlet definition for context: /sakai-portlets[DEBUG] PortletEntityImpl - Retrieved cross context: org.apache.catalina.core.ApplicationContextFacade@5e2d6c
[DEBUG] PortletRequestImpl - Retreiving portlet session (create=true)[DEBUG] PortletRequestImpl - Creating new portlet session...
Fred = null
Ran the portlet in a way that puts a non-serializable thing in session.
Shutdown Tomcat - got the following exception:
WARN: Cannot serialize session attribute javax.portlet.p./sakai-portlets.SakaiLaunch?site.list for session 77C3CD8BE5687531A4BA57BC87AFCB5C (2006-08-27 11:53:07,973 main_org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/sakai-portlets])
java.io.NotSerializableException: org.sakaiproject.portlets.SakaiLaunch$SakaiSite at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1245) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1069)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1369) at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:380)
at java.util.Vector.writeObject(Vector.java:1018)
I start Tomcat back up - the serialized file does not exist before I run my portlet:
ls -l ../work/Catalina/localhost/sakai-portlets/SESSIONS.ser
ls: ../work/Catalina/localhost/sakai-portlets/SESSIONS.ser: No such file or directory
When my portlet first runs, my session is clean:
[DEBUG] PortletRequestImpl - Retreiving portlet session (create=true)
[DEBUG] PortletRequestImpl - Creating new portlet session...
Fred = null
The serialization file does not exist.
ls -l ../work/Catalina/localhost/sakai-portlets/SESSIONS.ser
ls: ../work/Catalina/localhost/sakai-portlets/SESSIONS.ser: No such file or directory
Ran ran portlet in such a way that the session data *was* all serializable.
Shutdown Tomcat - no exceptions and SESSIONS.ser appears :(
ls -l ../work/Catalina/localhost/sakai-portlets/SESSIONS.ser
-rw-r--r-- 1 csev csev 2724 Aug 27 11:43 ../work/Catalina/localhost/sakai-portlets/SESSIONS.ser
*** Had the fred string in the file
Start Tomcat back up - no exceptions - everything is serializable - but the session stuff came back (i.e. the value for fred lasted across server reboots!)
[DEBUG] PortletEntityImpl - Loading portlet definition for context: /sakai-portlets
[DEBUG] PortletEntityImpl - Retrieved cross context: org.apache.catalina.core.ApplicationContextFacade@d55e49
[DEBUG] PortletRequestImpl - Retreiving portlet session (create=true)
[DEBUG] PortletRequestImpl - Creating new portlet session...
Fred = fred was here
The workaround is to simply remove the ../work/Catalina/localhost/sakai-portlets/SESSIONS.ser each time it exists.
And even more clever workaround is to put something horrible and non-serializable in the session, each time.
This seems like a very bad policy - that portlet session data lives beyond server restart. This looks like it is Tomcat doing the session management and Pluto 1.1 is just using the Tomcat Session to store the data - but we do need inside portlets to know when we are being run for the first time for a new user to do things like log in and retrieve web services.
Is there something in my portlet.xml to say "I would like (DUH) a fresh session when the server restarts" - or is this unspecified behavior - i it is unspecified - the Pluto 1.1 behavior is wrong.
This is the version I am using
charles-severances-computer:~/dev/pluto-1.1/pluto-1.1 csev$ svn info
Path: .
URL: http://svn.apache.org/repos/asf/portals/pluto/trunk
Repository Root: http://svn.apache.org/repos/asf
Repository UUID: 13f79535-47bb-0310-9956-ffa450edef68
Revision: 434235
Node Kind: directory
Schedule: normal
Last Changed Author: cdoremus
Last Changed Rev: 434172
Last Changed Date: 2006-08-23 16:54:38 -0400 (Wed, 23 Aug 2006)
Properties Last Updated: 2006-05-11 09:16:39 -0400 (Thu, 11 May 2006)
http://radio.javaranch.com/balajidl/2006/02/06/1139245423141.html
//based on Axis 1.3
import org.apache.axis.Constants;
import org.apache.axis.MessageContext;
....
....
MessageContext messageContext = MessageContext.getCurrentContext();
String ipAddress = messageContext.getStrProp(Constants.MC_REMOTE_ADDR);
[DEBUG] DefaultPortletPreferencesService - Portlet preferences stored for: user=tomcat;portletName=SakaiGallery
site.list = null sakai.host=null
autoLogin = null autoDone=null remote=tomcat session=null
[DEBUG] PortletRequestImpl - Retreiving portlet session (create=true)
Portal Login and Create http://localhost:8080/sakai-axis/SakaiPortalLogin.jws
SakaiPortalLogin.loginAndCreate id=tomcat pw=plug-xyzzy sec=plug-xyzzy
fn=Tom ln=Cat em=tom@cat.com
Creating Sakai Account...
User Created...
Have User
Site exists...~64674719-ed89-4996-8077-cf21973e6e25
Adding to session site.list=[My Workspace] sakai.session=24dcb926-270f-4ad8-0097-02d1dab03410 sakai.host=http://localhost:8080
loadSiteList site.list=[My Workspace]
From session host=http://localhost:8080 session=24dcb926-270f-4ad8-0097-02d1dab03410
sakai.tool = null Placement = null
Galery tool url=http://localhost:8080/portal/gallery?sakai.session=24dcb926-270f-4ad8-0097-02d1dab03410
[DEBUG] PortletContainerImpl - Portlet Container [Pluto Portal Driver]: Portlet rendered for: SakaiGallery
[DEBUG] PortalDriverServlet - Render request processed.
Wahoo - My media releigion is about to change 180 degrees. First, a couple of things - I am *NOT* a purist. I want clean, fast workflow for video production and I want my video to be seen by as many people as possible without forcing them to install software. I have *despised* the idiotic games that Quicktime, Real, and Windows Media have gone through during the past decade to force us to choose.
In that crappy environment I chose not based on best codecs or even most convienent format -but simply the majority of the desktops. This was my media flow:
Capture on DV - Sony DC30
Use Final Cut Pro on MacBook Pro
Dub Back to DV
Digitize DV into Pinnacle on PC
Trim things up in Pinnacle and produce DV encoded AVI
Priduce MPEG2 1440kbps using Pinnacle
Produce WMV 323 kbps using Windows Media Encoder
Use WMV 323 as my upload format for the web
Use MPEG2 as my upload format for Google Video
This has lots of problems - but it basically hit 90% of the desktops woff the get go.
This is my new pattern
Capture on my (borrowed from Rich) DVCPRO Sony 3CCD PD100
Edit on Final Cut Pro
Produce Full Resolution Export
Run that through JSDeinterlace (yes Victoria the Apple/Quicktime forgot the deinterlace checkbox on the encoding screen)
Run the output of that through Quicktime Pro to produce "Lan/Internet" 1440 kbps MOV file. Send that to Google.
Run the deinterlaced output through Quicktime to FLV using Macromedia Flash. Use that for the web with the Wimpy inline player - also send the FLV up to YouTube.
Go back to Final Cut pro and put a copy on Mini DV
This is pretty dang cool because I get virtually 100% desktops and some PDA devices with FLV. And the MOV format at 1440KBPS is pretty fine quality - especially deinterlaced.
Only fly in the ointment is that FLV seems to croak on certian file sizes and/or movie lengths. Grrr. This seems to be universal across FLV players - Both the Spark and Wimpy player exhibited this behavior.
So that might force me to produce both a 1400 kbps WMV in addition to the 1400 KBPS QT for clips > 8 minutes. The FLV will have to be a preview there.
But all in all, I end up with a much nicer near archival format in the form of 1440 MOV files rather than MPEG2 which did not give quality for the disk space it took. I might need to still run it through a PC for WMV - but the end user experience is much better with both YouTube and Google Video available.
Sweet.
The Quicktime Codec that worked for me on Google Video was: 640x480, Audio - AAC, Video H.264 - this is the "LAN/Internet" preset in the Quicktime Export dialog.
This is just Gibberish
charles-severances-computer:~/dev/pluto-1.1/pluto-1.1/pluto-portal-driver csev$ find . -name '*Impl*' | grep -v svn
./src/main/java/org/apache/pluto/driver/config/impl/AdminConfigurationImpl.java
./src/main/java/org/apache/pluto/driver/config/impl/DriverConfigurationImpl.java
./src/main/java/org/apache/pluto/driver/core/PortletWindowIDImpl.java
./src/main/java/org/apache/pluto/driver/core/PortletWindowImpl.java
./src/main/java/org/apache/pluto/driver/core/ResourceURLProviderImpl.java
./src/main/java/org/apache/pluto/driver/services/container/ContainerServicesImpl.java
./src/main/java/org/apache/pluto/driver/services/container/PortalCallbackServiceImpl.java
./src/main/java/org/apache/pluto/driver/services/container/PortalContextImpl.java
./src/main/java/org/apache/pluto/driver/services/container/PortletURLProviderImpl.java
./src/main/java/org/apache/pluto/driver/services/impl/resource/PortletRegistryServiceImpl.java
./src/main/java/org/apache/pluto/driver/services/impl/resource/PropertyConfigServiceImpl.java
./src/main/java/org/apache/pluto/driver/services/impl/resource/RenderConfigServiceImpl.java
charles-severances-computer:~/dev/pluto-1.1/pluto-1.1/pluto-portal-driver csev$
16 ./src/main/java/org/apache/pluto/driver/config/DriverConfigurationFactory.java
8 ./src/main/java/org/apache/pluto/driver/url/PortalURLFactory.java
Interfaces:
src/main/java/org/apache/pluto/driver/config/AdminConfiguration.java
src/main/java/org/apache/pluto/driver/config/DriverConfiguration.java
src/main/java/org/apache/pluto/driver/services/portal/admin/PortletRegistryAdminService.java
src/main/java/org/apache/pluto/driver/services/portal/admin/RenderConfigAdminService.java
src/main/java/org/apache/pluto/driver/services/portal/DriverConfigurationService.java
src/main/java/org/apache/pluto/driver/services/portal/PortletRegistryService.java
src/main/java/org/apache/pluto/driver/services/portal/PropertyConfigService.java
src/main/java/org/apache/pluto/driver/services/portal/RenderConfigService.java
Wires up the impls
pluto-portal/src/main/webapp/WEB-INF/pluto-portal-driver-services-config.xml
This file reads the above file and away we go. Pretty Slick:
pluto-portal-driver/src/main/java/org/apache/pluto/driver/config/DriverConfigurationFactory.java
Works in the pluto-1-1 (not in the beta)
mvn -Dmaven.test.skip=true install
mvn -DinstallDir="/Users/csev/dev/apache-tomcat-5.5.17/" pluto:install
http://localhost:8080/pluto/portal/Test%20Page
Make sure to do the steps at the end
svn co https://source.sakaiproject.org/svn/portlet/trunk portlet
cd portlet
maven bld
maven dpl
WEB-INF/pluto-portal-driver-config.xml
Web.xml changed a lot:
-->
charles-severances-computer:~/dev/apache-tomcat-5.5.17 csev$ more conf/Catalina/localhost/sakai-portlets.xml
./WEB-INF/classes/org/sakaiproject/portlets/sakaiportlet.properties
http://www.adorama.com/BOMX601.html?sid=1156364824497858
http://www.zotzdigital.com/index.php?cid=60
http://www.atbatt.com/videolights_videocamera.asp
http://www.markertek.com/ProdList.asp?mfg=Smith+Victor
In the secure area
IMAP: 993 "Always Secure Wrapped Port"
SMTP: 587 "Secure if Available (STARTTLS)"
The rest of this is pretty much spot on:
http://www.itd.umich.edu/itcsdocs/s4321/apple.html
P.S. My treo went into an infinite reboot loop the other day - required hard reset and pure rebuild so I needed to re-derive this all while walking around on Washginton, DC streets.
Caveat: This is personal opinion and should not be quoted out of context to imply *anything* particular or specific about the Patent 6,988,138. This is general commentary about software patents only. This is not official Sakai position. This post is Copyright Me - All Rights Reserved Period! Do not quote this in ANY media without contacting me for permission which I will likely give freely assuming that you convince me that my comments will be given the right context to maintain my original intent.
Let me add, that I am not categorically opposed to patents or even software patents - the essential problem is that the patent office allows overly broad and non-novel patents to get through because they are not willing to say "no" during their examination of the patent.
During the examination phase - it is a sole lonely examiner buried under a mound of paperwork versus dug-in lawyers from a well-funded corporation with no public scrutiny of the process. So to keep from being pummeled, the examiner lets the patents go through and then dumps them in the court system. *That* is the problem - the only time any true public analysis or dialog around a software patent happens is in the context of a lawsuit. And once a court case starts, we all talk have to each other with our hands tied behind our collective backs.
Each time a patent examiner takes the "easy way out" - doing a quick and dirty prior art search - the market wastes 20 million or so and a couple of years to sort it all out.
Here is the worst part - because the system is so flawed - we cannot fault companies for filing tons of patents in their space to defend themselves from scummy individuals who speculatively patent obvious ideas and then hold companies hostage. We *can* fault companies for what they *do* with those patents once they get them - but we cannot fault companies for going after defensive patents.
Here is one of those scummy individual patents:
http://www.eff.org/patent/wanted/patent.php?p=ideaflood
The patented the concept of "personalized subdomains" like csev.umich.edu. AAARGH!
So we have a bad system that is set up to encourage and reward bad behavior on the part of individuals and companies. A patent which was initially filed as "defensive" may be pressed into "offensive" use because of market conditions - and again if the court system rewards "offensive" use of "defensive" patents - it will happen more and more.
Until we can fix the patent system, we must simply spend the money each time one of these patents come out and pay lawyers to talk to each other - so we need a talented legal team (SFLC) at the ready all the time.
Again - the overall theme from me - if you are unhappy - write a check to the SFLC. Do it now. Not just for any one patent - but for a whole series of patents that are likely to come out and not just for our market - for the next market as well and not just for the next few months - but as long as it takes.
Caveat: This is personal opinion and should not be quoted out of context to imply *anything* particular or specific about the Patent 6,988,138. This is general commentary about software patents only. This is not official Sakai position. This post is Copyright Me - All Rights Reserved Period! Do not quote this in ANY media without contacting me for permission which I will likely give freely assuming that you convince me that my comments will be given the right context to maintain my original intent.
The worst part about this Blackboard patent is the fact that thousands of people across many open source projects and commercial companies who eight weeks ago were working long days to design, build, deploy, and use the most innovative software possible for teaching and learning are now "amateur lawyers" reading patents and patent law.
I am glad that the Wikipedia entry exists and that the EdTech bloggers like Michael Feldstein (mfeldstein.com) are passionate about this issue - it is a big deal and something that needs to stay in the public consciousness until it is resolved.
What bothers me is that we just lost 10% of our brainpower across the field as everyone reacts to the patent. From the sound of things it is likely to get worse - as more patents come out we will need to invest in and react to each new patent and see (a) it applies (b) is it too broad (c) was there prior art (d) will it hold up in court (e) will we get sued (f) will our adopters get sued and (g) what is the right legal reaction to this approach. Urgh! What a colossal waste of time for brilliant innovators.
If I had any prior art other than my November 1997 IEEE Computer Article on Educational Technology (http://www.dr-chuck.com/dr-chuck/papers/columns/), I would be scrambling to add it to Wiki or putting it up on NoEduPatents.org.
I want to do *something* to try to make the world a better place and to get back to where this market again feels free to innovate (like it did 8 weeks ago). For me since this has moved into a legal arena (According to press releases Blackboard does not plan to sue open source projects or their customers *at this time*.) the solution must be a legal solution. Very sad.
Since I am not a lawyer - the only solution is to hire one. Sakai has retained SFLC (www.softwarefreedom.org) - SFLC is working pro bono for Sakai - that is great and cool and in my role in Sakai - I thank profusely whoever gave SFLC the money so they could be ready to come to our assistance when we needed legal advice.
To borrow and adapt a few words from Richard Stallman in an interview I did with him in 1995 (reference below), "Free legal advice refers to freedom not price".
SFLC needs money - the more money they get the more likely they will spend more time on this area - and give it the attention that all of the commercial, open source, and even home-grown CMS software needs. Like it or not we are all in this together. You cannot escape this by switching software vendors or writing it yourself - knowingly violating patents using the "we are below the radar" defense is a mistake in any and all organizations.
So - if we all want to keep cooperating and innovating - it is time to act - send some money to SFLC (www.softwarefreedom.org) - It is a nonprofit so you might be able to deduct it ?.
I just sent in my first personal check to SFLC:
http://www.flickr.com/photos/dr-chuck/220947794/
It is not much - barely a single tank of gas - there will be more - and perhaps I need to also give to the Public Patent Foundation (www.pubpat.org) and/or the EFF Patent Busting Effort (http://www.eff.org/patent/). I like the fact that when you give to the EFF, you get a hat or T-Shirt. So for now I am going to pace myself - the $50.00 is a symbolic gesture in the name of freedom.
It would be darn cool if a bunch of $50 (smaller or bigger is OK) started to pile up on the desks of the SFLC. Regardless of whether you are a student, or teacher, developer, company in this market, or even a really wealthy social activist - it time to write your first check in this matter.
Remember - "Free refers to freedom - not price".
http://www-personal.umich.edu/~csev/media/nbn/otr/gnu128.rm
So far - working with the Free Riva encoder and
References:
http://www.flvplayer.com/
http://www.webmonkey.com/templates/print_template.htmlt?meta=/webmonkey/05/38/index0a_meta.html
http://www.videospark.com/
http://www.rivavx.com/
http://www.youtube.com/
Some interesting stuff. I bought the Wimpy Flash Player to get a drag bar.
My FLV video hangs at 8:22 on all operating systems on all browsers when streaming. The video is 11:19 and 35.4MB - so it hangs around 26MB. Playback on local disk is fine.
This happens on the Wimpy player and the free player. Here is one more weird thing. If it is playing on the Wimpy player, and once things are downloaded past the 8:22 mark - if you seek past 8:22 randomly it hangs and you can no longer seek.
I am sure that if you were using a real streaming server this would not happen. So the plan is to encode to a length below 26MB, - at 21 MB and see if it works better.
-- It does work better - I can randomly navigate through the whole video. So word to your mother - don't make FLV's too large.
Here is some more information that does not sound like it is right - but I note it here just cause it took me some googling to find it.
http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_14437
A Flash movie can have as many as 16,000 frames. Exceeding that limit will cause the movie playback to stop. While this limit is rarely reached by most developers, it is possible to have movies that are this long. If your movie must have more than this number of frames, it would be best to create multiple movies with fewer than 16,000 frames each, and link them together with a method such as LoadMovie.
Even though I don't think this is the problem - it bears more testing because - at 16000 frames and 30 frames per second - it does turn out to be 8.88 minutes. WHen I have a better upload speed I might just try this out.
Man I hate doing QA when it takes 8 minutes to reproduce a problem! GRRRR.
I now have tethered mode working from my MacBook pro to Treo 650 - as my ISP - in tethered mode. So this post is from my car. I will post technical details later.
I am not driving.
Sakai recently debated the addition of a Beacon to each distribution so we could track usage in real time around the world. It was a great discussion - look at the Sakai dev list archives for the great fun.
But part way through the follows was a small part of a response:
On Aug 11, 2006, at 11:03 AM, Luke FERNANDEZ wrote:
In sakai-dev I'll hazard that most most everyone recognizes the
possibility that software isn't just a physical artifact but is also
about a community and (even further) that this community implicitly
forwards a certain idea of what is 'good' for a university. People get
excited about the beacon because it has the potential (in a small way)
to strenghten this sense of community identity and to forward this good.
This triggered in me a long-simmering set of thoughts. So I figured I would write them down this Sunday morning.
This is a really important point and one I think that needs a lot of thought over the next 10 years. We come from a very "tight" perspective on privacy and many have been habituated to react strongly to the slightest thing that might invade privacy. Draconian laws like the US FERPA law and over zealous Human Subjects Committees have left many academics so fearful that even thinking about looking at the data surrounding educational activity produces an almost Pavlovian jolt of fear.
For example, this is one reason why Sakai to date has ZERO tracking software and that the first cool tracking software is coming from Portugal with needs coming from the distance education and community college spaces. These areas are (a) less fearful and (b) have a burning need for tracking. My feeling is that the farther away from US R1 Universities and FERPA you get - the more you are likely to contemplate using tracking as a tool.
But my stock anti FERPA rant was not the intent of this message.
If we are to truly revolutionize teaching and learning going forward - we must find ways to begin to exchange usage data on artifacts. We need folks to be able to see how popular an artifact is, how many hours students looked at the artifact, and if exam scores later in the course for those students could be correlated to the number of hours spent looking at that artifact. (i.e. did students who spent 10 hours with the artifact score higher than those that ignored the artifact).
For us to all benefit from understanding the learning process - we will need to find ways to make this data available across time and across institutions.
This is *not* trivial and will take *many* years. Publishing rich data is a very complex and touchy problem. I just want to make sure that we think lofty thoughts over the next decade together and realize that sharing highly anonmized usage data is a critical pre-requisite to taking the "next step" in truly making education better.
I am continuously frustrated that because we do not yet have suitable teaching and learning software that delightlfuly covers the "basics" - we never get to attack these truly revolutionary problems. Ah well. 2012 will be here soon enough.
Wow - Coffee and a Sunday morning, and no crisis to work on is a scary combination.
I moved the Sakai map to www.sakaiproject.org here are my notes and source code in case anyone wants to look at hte code. Feel free to reuse - it is sample code I borrowed form Google anyways.
The complete source code is here:
http://www.dr-chuck.com/sakai-map.tar
This should be pretty simple to make work. The key is that you need to get your own authorization key. See this page:
http://www.google.com/apis/maps/
One thing to suggest is that my code is not the "cleanest" - I just built it as quickly as I could using the excellent documentation from Google.
http://www.google.com/apis/maps/documentation/
My code really is nothing more than a bit of composing the little Google examples together and then setting up a new way to get the data and wrapping a little PHP around it to allow different subsets of the data to be displayed.
You are welcome to use my code in any way you like - *without any attribution*. Consider it sample code to help you out.
We are going to clean it up and rewrite the data aspects it to pull from a "adopter database" that the adopters will maintain. This will be *much* cleaner.
Wow - This is SO simple and damn elegant.
http://webservices.devchannel.org/webserviceschannel/04/02/11/1432220.shtml?tid=47&tid=51&tid=54