This document is aimed at guiding a release manager through the general release process. You will need either a Linux, Mac, or failing that a Linux Virtual (with at least a 50GB Drive) on Win.
Run ant -f rat.xml > report.txt on trunk to ensure all licences are in place.
Branch the version to release and ensure it builds and passes all tests.
Add a buildbot CI setup for branch here:
Basically search for the following line and it should be obvious how to add a new builder:
c['builders'].append(tomee_hemera_builder("tomee-trunk-ubuntu", "tomee/tomee/trunk"))
An SVN trigger must be added afterwards. This can only be done by someone with admin permissions, such as any PMC chair or an Infra team member. Just drop an email to<EMAIL_ADDRESS>Branch the TCK using the same version as the release branch from here:
https://svn.apache.org/repos/tck/tomee-tck/trunk
Update the TCK branch files to point to the version branch.
\tckbranch\plus.properties
\tckbranch\pom.xml
\tckbranch\webprofile-plus.properties
\tckbranch\webprofile.properties
Run ant -f rat.xml > report.txt on the branch.
Pre-authenticate svn repositories to ensure your credentials are cached before using any tools.
svn mkdir --username [apacheuser] --password [apachepw] -m "Create test dir" https://svn.apache.org/repos/asf/tomee/tomee/branches/testdir1
svn delete --username [apacheuser] --password [apachepw] -m "Delete test dir" https://svn.apache.org/repos/asf/tomee/tomee/branches/testdir1
svn mkdir --username [apacheuser] --password [apachepw] -m "Create test dir" https://repository.apache.org/content/repositories/testdir2
svn delete --username [apacheuser] --password [apachepw] -m "Delete test dir" https://repository.apache.org/content/repositories/testdir2
svn mkdir --username [apacheuser] --password [apachepw] -m "Create test dir" https://dist.apache.org/repos/dist/dev/tomee/testdir3
svn delete --username [apacheuser] --password [apachepw] -m "Delete test dir" https://dist.apache.org/repos/dist/dev/tomee/testdir3
Ensure your maven .m2/settings.xml correct, and be aware that the tools currently require a clear text password:
<server>
<id>apache.snapshots.https</id>
<username>un</username>
<password>pw.in.clear</password>
</server>
<server>
<id>apache.releases.https</id>
<username>un</username>
<password>pw.in.clear</password>
</server>
<server>
<id>apache.dist.https</id>
<username>un</username>
<password>pw.in.clear</password>
</server>
<profiles>
<profile>
...
<repositories>
<repository>
<id>apache.dist.https</id>
<url>https://dist.apache.org/repos/dist</url>
</repository>
</repositories>
If this is your first release then you will have to ensure that you have a code signing key prepared on the machine from which you perform the release. The process is quite intense. You can find information here:
However, the basic steps are:
Once you have your key then you will need to append it to the key file here:
That is best done as the file itself explains, once you open and view it in a UTF-8 safe text editor you will see the description at the top.
Just follow the instructions there on how to append your key. The basic steps are also here, please read both before you proceed:
Checkout the release tools using SVN from here https://svn.apache.org/repos/asf/tomee/sandbox/release-tools
Really read the README.mdtext and follow the instructions for building the 3rd party libraries.
Basically SVN checkout and compile Swizzle and Tentacles
Build the release tools, mvn clean install -DskipTests -DfailIfNoTests=false
Have a look at run.sh to see the entry point.
Understand that the release tools are not polished, and you currently may have to edit source and re-compile.
For some of the release steps you will need to provide documentation on the site. Checkout the site here:
https://svn.apache.org/repos/asf/tomee/site/trunk
Most of the content can be found under 'content' and subdirectories.
When you commit changes the site should be built automatically by the buildbot, but you can force a build on IRC using:
**tomee-bot: force build tomee-site-staging**
The buildbot staging result can be seen here:
http://ci.apache.org/builders/tomee-site-staging
And the actual staging site, where you can review your changes, is here:
http://tomee.staging.apache.org/
Once you are happy with the staging you can publish to the real site using:
https://cms.apache.org/tomee/publish
Ensure TCK is passing all tests, and if so create an SVN tag from the branch.
Note: It is a future goal to either separate OpenEJB from TomEE or unify the versions so the
[maven-release-plugin](http://maven.apache.org/maven-release/maven-release-plugin/) can be used.
Because we cannot use the Maven release tools we currently have to create a an SVN tag manually. The best way to do this is to:
- Copy the branch to a staging branch using:
> svn copy https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version] https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging -m "Staging [version]"
- Checkout the staging branch using:
> svn co https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging tomee-[version]-staging
- Update all SNAPSHOT versions to the release versions in the local tomee-[version]-staging and commit.
- Create the tag from the staging:
> svn copy https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging https://svn.apache.org/repos/asf/tomee/tomee/tags/tomee-[version] -m "Tag [version]"
- Delete the staging branch using:
> svn rm https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging -m "Delete staging"
Open a console on the release-tools directory.
Note: Before running any ./run.sh activity always check the release tools code for the command tomee-release-tools/src/main/java/org/apache/openejb/tools/release/cmd. At the moment some of the commands need manually editing to work. Eventually the commands should be re-written.
All JIRA actions should be performed on the ASF JIRA here:
https://issues.apache.org/jira/browse/TOMEE
Ensure JIRAs have been filed for commits using ./run.sh reviewcommits
Update fixVersions for JIRAs used in SVN commits using ./run.sh updatejiras - Untested, requires investigation
Review and bulk Close all JIRAs for the version to be released.
Publish the changed binaries report (if any) using ./run.sh comparelibraries
Write and publish the release notes preview on the staging site.
Publish a summary of the RAT report preview on the staging site.
Using the RAT report as a guide update LICENSE and NOTICE files for any changed binaries, and add new ones if required.
Update branch versions. How you do this is up to you at this point in time.
Update trunk versions. How you do this is up to you at this point in time.
Create the next version iterations in JIRA.
Note: Before running anything below ensure you either have:
- A valid tomee-release.properties from the last release in your home directory (Speak to the last release manager).
- Or have modified **tomee-release-tools/src/main/java/org/apache/openejb/tools/release/Release.java** with current versions and **mvn clean install**.
Ensure the TCK passes with preview repositories by editing and ensuring paths are correct in the following files:
\tckbranch\plus.properties
\tckbranch\pom.xml
\tckbranch\webprofile-plus.properties
\tckbranch\webprofile.properties
Publish the preview using ./run.sh roll binaries legal releasenotes preview - You can run these tasks like so, or individually in order. It will be likely that this will have to be repeated several times before a successful vote.
The legal step will create the legal report files in the /tmp/download/staging-[revision]/legal directory. These need to be added to the staging repo. - Delete the [legal]/repo and [legal]/content directories, as these are no longer required rm -R /tmp/download/staging-[revision]/legal/content rm -R /tmp/download/staging-[revision]/legal/repo
Once the binaries are in place add the staging repository to the corresponding TCK project and fire off a build. To fire off a build on EC2 from the TCK directory speak to the last release manager for the curl command to use
If the TCK fails then discuss, fix and re-roll.
Publish a Vote if, and only if, the TCK passes.
Votes are generally managed and identified using keywords such as [VOTE], [CANCELLED] and [RESULT]
If the vote fails then discuss, fix and re-roll.
Once the vote has passed then release the binaries on Nexus: https://repository.apache.org/index.html#welcome
Update both OpenEJB and TomEE JIRA versions as released (Set the release date).
Copy the binaries to the release location (User rights require a PMC to do this)
From: https://dist.apache.org/repos/dist/dev/tomee/staging-[stagingId]/tomee-[version]
To: https://dist.apache.org/repos/dist/release/tomee/tomee-[version]
Wait for the binaries to replicate to mirrors. Here is a neat script from David to check the status:
#!/bin/bash
RELEASE=${1?Specify a release, such as './mirror_check.sh tomee-1.7.1'}
function list_mirrors {
DYN=http://www.apache.org/dyn/closer.cgi/tomee/$RELEASE/
wget -q -O - $DYN | tr '">< ' '\n' | grep "^http.*$RELEASE/" | sort | uniq
}
function status_code {
wget -v "$1" 2>&1| grep 'awaiting response' | tr ' ' '\n' | grep "[0-9]"
}
list_mirrors | while read n; do
echo "$(status_code $n) $n"
done | sort | grep 'http'
Commit and publish changes to the site, see Site Staging
https://cms.apache.org/tomee/publish
Announce to the world that TomEE has new bells and whistles!
https://blogs.apache.org/roller-ui/login.rol
http://twitter.com/ApacheTomEE
http://facebook.com/ApacheTomEE
https://plus.google.com/118203123063829126066


From http://en.wikipedia.org/wiki/Sokoban
The game is played on a board of squares, where each square is a floor or a wall. Some floor squares contain boxes, and some floor squares are marked as storage locations. The player is confined to the board, and may move horizontally or vertically onto empty squares (never through walls or boxes). The player can also move into a box, which pushes it into the square beyond. Boxes may not be pushed into other boxes or walls, and they cannot be pulled. The puzzle is solved when all boxes are at storage locations.
Reeborg’s World allows to solve Sokoban-like puzzles. However, instead of using the arrow keys to control Reeborg, one uses code telling Reeborg what to do. However, just like the original Sokoban, boxes may not be pushed into other boxes or walls. Unlike the original Sokoban, attempting to do so will make Reeborg complain and stop its program.
You can solve sokoban puzzles using only move() and turn_left() … but that would be extremely tedious. Furthermore, Reeborg’s oil leak would make a mess of things. It is much better to import the functions up(), down(), left(), and right() from the sokodan library and use them: they behave like you would expect arrow keys would behave. Furthermore, these functions take an integer as an optional argument, indicating how many times you want this function to be repeated: this allow to write much shorter programs.
Finally, when importing the sokodan library, Reeborg’s oil leak is automatically stopped.
Because boxes can be turned into bridges for Reeborg when they are pushed in water, different types of challenges can be made, which would be impossible to create with the original Sokoban.
Finally, one can think of adding ice tiles to make things a bit more slippery and challenging.
Sokoban type problems are logic problems which can be challenging to solve. From my own experimentation, they seem more difficult to solve using code than using traditional environment where arrow keys can be used to control the character. [Note to self: implement special mode with arrow key control and recording mode.]
They can be of interest to complete beginners, who have not learned yet of control flow structures (if/elif/else/while/...) but want to program a robot to do a difficult task.
Once a sokoban has been solved using the special sokoban functions up(), down(), left(), right(), students may be asked to transform this solution so as to make use only of move() and turn_left().
For experts only
The following will not make sense, unless you are an advanced programmer.
Sokoban puzzles can be solved using search techniques taught to advanced students. In order to be able to use such techniques, information about the world must be obtained by a program directly. Worlds are actually encoded as javascript object (only properties, no methods) which can be converted from json strings into Python dicts. If you run the following program, you will be able to see how whatever world is loaded is represented and how to transform its representation into a Python dict.
import json # very incomplete Brython module from browser import window # First, use the builtin JSON Javascript function as it can # show a nicely formatted representation of the world; # this should have been implemented in the Brython json module # but is currently missing. world_str = window.JSON.stringify(RUR.current_world, None, 2); print(world_str) # Convert the json world representation into a Python dict # using Brython's json module. world_dict = json.loads(world_str) # We can now use Python's standard notation for dicts and lists # to extract the required information. print(world_dict["robots"][0]["orientation"] == RUR.EAST)


Search Panel
Here you can select from 5 different algorithms with 2 seperate approaches. Once an algorithm is selected you can either learn more about the approach of that specific algorithm or run the algorithm on the current configurations of the 8 puzzle. If the algorithm is an informed search you will also have to select a heuristic. Statistics about the algorithm will be displayed in the table below.
Initial State
Search Result
|
This is the starting state for the current search.
Initial State:
|
- |
|---|---|
|
A boolean value for if current search type has found result with current configuration
Found Solution?
|
- |
|
The time taken to complete search (As javascript datatypes for storing values take different times to retrieve data only compare
Time Taken:
|
- |
|
The moves to the goal (L = move blank tile to left | R = move blank tile to right | U = move blank tile up | D= move blank tile to down)
Solution Path:
|
- |
|
The number of moves to goal for current search algorithms solution.
Solution Length:
|
- |
|
Search nodes that were not expanded/checked in search.
Open List Size:
|
- |
|
Search nodes that have been expanded in search.
Closed List Size:
|
- |
Goal State


--- layout: post name: frenzy hypothesis: true hidden: true eta: false toc: false hypothesis: false icons: sport: icon: badminton-racket-and-feather desc: possibility for sport activities biking: icon: bicycle-rider desc: (Mountain-)Biking possible rafting: icon: boiting desc: Rafting nature: icon: butterfly-catcher desc: Nature camping: icon: camper-caravan desc: caravan-camping possible children: icon: cart-wagon desc: suitable for children climbing: icon: climbing desc: rock-climbing possible hiking: icon: hiking desc: hiking trail (no special prerequisites needed) hiking-bouldering: icon: climbing-with-rope desc: alpine hiking involving some bouldering (bring good shoes) hiking-climbing: icon: climbing-sport desc: alpine hiking involving climbing (only for experienced hikers) barbecue: icon: closed-barbacue desc: official barbecueing area with facilities barbecue-unofficial: icon: food-on-branch desc: inofficial barbecueing area without facilities scenic: icon: digital-camera desc: scenic area open-water-fishing: icon: fishing-fish desc: open-water fishing allowed fishing: icon: fishing-man desc: fishing from waterside allowed accommodation: icon: forester-house desc: accommodation for overnight stay available golf: icon: golf-ball-and-iron desc: golf course riding: icon: horse-riding desc: horse riding possible diving: icon: jumping-to-the-water desc: diving possible kayaking: icon: kayak desc: kayaking possible torch-needed: icon: lantern-on desc: bring a torch kiting: icon: man-flying-a-kite desc: bring a kite canoeing: icon: man-in-canoe desc: canoeing possible lake: icon: man-on-a-boat desc: lake area swimming: icon: man-swimming desc: swimming allowed camping-tent: icon: night-camping desc: tent camping possible treasure-hunting: icon: outdoor-rock desc: treasure hunting for children map-needed: icon: outdoors-map desc: remote area (bring a map!) fenced: icon: picket-fence desc: fenced area picnic: icon: picnic-desk desc: picnic area available quad: icon: quad-bike desc: quad driving possible running: icon: running-man desc: running trail sailing: icon: sailing-boat-sailing desc: sailing possible signposted: icon: signpost desc: trail is signposted (no map needed) skateboarding: icon: skateboard desc: skateboarding possible ski: icon: ski-lift desc: skiing possible sleeping-bag: icon: sleeping-bag desc: bivouacing possible alpine: icon: snowed-mountains desc: alpine area panorama: icon: spyglass desc: panorama park: icon: sunny-park desc: park area surfing: icon: surfer-surfing desc: surfing possible public-bath: icon: swimming-pool-ladder desc: public pool available playground: icon: swings desc: playground for children available knife: icon: swiss-pocket-knife desc: bring a knife forest: icon: two-pines desc: forest area stormy: icon: walking-with-a-storm desc: dangerous in bad weather water-skiing: icon: water-ski desc: water-skiing possible wheelchair: icon: wheelchair-sport desc: accessible by wheelchair deer: icon: wild-deer desc: wild animals compass: icon: wind-rose-compass desc: bring a compass ---
{% for frenzy in page['frenzy'] %} {% endfor %}
{% if page.duration %} {{page.duration}} {% endif %} {% if page.distance %} {{page.distance}} {% endif %} {% if page.altitude %} {{page.altitude}} {% endif %} {% if page.season %} {{page.season}} {% endif %}
{% if page.parking %} {{page.parking}} {% endif %}
{% assign map_url = page.path | replace_first: '_posts/', '/assets/img/' | replace_first: '.md', '/map.pdf' %} Download map
{{ content }}


public abstract class WakefulBroadcastReceiver
extends BroadcastReceiver
BroadcastReceiver
that receives a device wakeup event and then passes the work off
to a android.app.Service
, while ensuring that the
device does not go back to sleep during the transition.
This class takes care of creating and managing a partial wake lock
for you; you must request the android.Manifest.permission#WAKE_LOCK
permission to use it.
A WakefulBroadcastReceiver
uses the method
startWakefulService()
to start the service that does the work. This method is comparable to
startService()
, except that
the WakefulBroadcastReceiver
is holding a wake lock when the service
starts. The intent that is passed with
startWakefulService()
holds an extra identifying the wake lock.
The service (in this example, an android.app.IntentService
) does
some work. When it is finished, it releases the wake lock by calling
completeWakefulIntent(intent)
. The intent it passes as a parameter
is the same intent that the WakefulBroadcastReceiver
originally
passed in.
| Constructor and Description |
|---|
WakefulBroadcastReceiver() |
| Modifier and Type | Method and Description |
|---|---|
static boolean |
completeWakefulIntent(Intent intent)
Finish the execution from a previous
startWakefulService(Context, Intent) . |
static ComponentName |
startWakefulService(Context context,
Intent intent)
Do a
Context.startService , but holding a wake lock while the service starts. |
public static ComponentName startWakefulService(Context context, Intent intent)
Context.startService
, but holding a wake lock while the service starts.
This will modify the Intent to hold an extra identifying the wake lock;
when the service receives it in Service.onStartCommand
, it should pass back the Intent it receives there to
#completeWakefulIntent(android.content.Intent)
in order to release
the wake lock.context
- The Context in which it operate.intent
- The Intent with which to start the service, as per
Context.startService
.public static boolean completeWakefulIntent(Intent intent)
startWakefulService(Context, Intent)
. Any wake lock
that was being held will now be released.intent
- The Intent as originally generated by startWakefulService(Context, Intent)
.