You are currently browsing the category archive for the ‘GemTools’ category.

[1]

GemTools 1.0-beta.2 features:

  • fix update client logic to use #lastMetacelloVersionLoad
  • change annotation pane and make more room for useful info
  • inspect undefined and inspect sent but not implemented menu items available only when tests are installed
  • clean up preferences problems
  • Admin>>Seaside submenu available only when Seaside2.8 installed
  • improve session window label (include the session name) when working with multiple stones

Install

To install the GemTools Client in a virgin Squeak or Pharo image jump to the Install instructions.

Update

For version 1.0-beta.0 of the GemTools Client,  follow these Update instructions.

For version 1.0-beta.1:

  1. Logout of your GemStone session(s).
  2. Click on the Update Client button and select ‘1.0-beta.2’.
  3. Save your client image.

—–
[1]http://www.flickr.com/photos/dystopos/91980377/ / CC BY-NC 2.0

[1]

With the 1.0-beta.1 release of the GemTools Client, we’re doing two things:

  1. Conforming to the new Metacello configuration naming convention.
  2. Getting ready for the imminent GLASS 1.0-beta.0 release.

GemTools 1.0-beta.1 features:

  • Convert to using ConfigurationOfGemTools.
  • Nicer info dialog when Undefined symbols and Unsent messages are clean
  • Support for GemStone/S 3.0 GciErrSType
  • Change restore from backup done message … do not prompt to start Seaside gems if Seaside is not installed
  • Replace dialogs that are calling “ifNotEmpty:” with: “isEmptyOrNil” (from Gerhard)
  • autoAbort _before_ commands is now optional (off by default)

If you’ve already installed the GemTools Client 1.0-beta.0, then you want to follow the Update instructions. To install the GemTools Client in a virgin Squeak or Pharo image jump to the Install instructions.

Update

With GemTools Client 1.0-beta.0 already installed, we need to update to using ConfigurationOfMetacello as well as ConfigurationOfGemTools:

  1. Load the latest version of the ConfigurationOfMetacello package  from http://seaside.gemstone.com/ss/metacello.
  2. Load the latest version of the ConfigurationOfGemTools package  from http://seaside.gemstone.com/ss/GLASSClient.
  3. Execute the following expression in a workspace:
    ConfigurationOfMetacello loadLatestVersion.
    ConfigurationOfGemTools loadLatestVersion.

Then continue with Step 3 of the installation instructions.

Installation

If you haven’t already been using the GemTools 2.3.1 Preview for all platforms (which is based on Pharo), then you should download the preview GemTools client and follow the instructions for setting up your session to verify that you can connect to your stone. You’ll need the session information and the gci files from the Preview to get things running with the either Squeak or Pharo.

I’ve tested the installation procedure using Squeak3.10.2-Trunk-090912 and pharo1.0-10492-rc1dev09.11.1.

To load GemTools into a client image:

  1. Load the latest version of the ConfigurationOfGemTools package  from http://seaside.gemstone.com/ss/GLASSClient.
  2. Execute the following expression in a workspace:
    ConfigurationOfGemTools loadLatestVersion.
  3. Execute the following expression to open the GemTools launcher:
    OGLauncher open
  4. Copy the session information from your old GemTools Client to the new GemTools Client in your image. Use the Edit session menu item on the Session Menu in the launchers.
  5. Save the image.
  6. Copy the gci files (gciForWindows.dll, gciForLinux.so, and gciForMacintosh.so) from GemTools-2.3.1-preview.app/Contents/Resources in the one-click into the directory containing your image and changes files. On the Macintosh, the gciForMacintosh.so needs to be copied to both the image directory and the vm.app/Contents/Resources directory (thanks Mark and Ken).
  7. Press the Login button on the GemTools Launcher and you should be in business.

—–
[1]http://www.flickr.com/photos/randyweiner/ / CC BY-NC-ND 2.0

[1]

Shortly after I announced the GemTools Client for Pharo, Gerhard Obermann jumped in and refactored a number of the GemTools menus using sub menus. Unfortunately, I got involved in a number of other tasks (including refining the Metacello API) before I could push his changes out. Now that Metacello is stabilized, it is time to revisit the installation and update procedures for the GemTools Client.

[Update 10/16/2009: fixed egregious errors in the installation instructions … 2 steps and the first step was plain wrong:) … thanks Gerhard]

[Update 11/04/2009] Please see the GemTools Client 1.0-beta.1 post for up-to-date instructions.

Installation

[Update 11/04/2009] Please see the GemTools Client 1.0-beta.1 post for up-to-date instructions.

If you haven’t already been using the GemTools 2.3.1 Preview for all platforms (which is based on Pharo), then you should download the preview GemTools client and follow the instructions for setting up your session to verify that you can connect to your stone. You’ll need the session information and the gci files from the Preview to get things running with the either Squeak or Pharo.

I’ve tested the installation procedure using Squeak3.10.2-Trunk-090912 and pharo1.0-10470-BETAdev09.10.2.

To load GemTools into a client image:

  1. Load the latest version of the GemTools-Configuration package  from http://seaside.gemstone.com/ss/GLASSClient. GemTools-Configuraton-dkh.12 is currently the most recent version.
  2. Execute the following expression in a workspace:
    GemToolsConfiguration loadLatestVersion.
  3. Execute the following expression to open the GemTools launcher:
    OGLauncher open
  4. Copy the session information from your old GemTools Client to the new GemTools Client in your image. Use the Edit session menu item on the Session Menu in the launchers.
  5. Save the image.
  6. Copy the gci files (gciForWindows.dll, gciForLinux.so, and gciForMacintosh.so) from GemTools-2.3.1-preview.app/Contents/Resources in the one-click into the directory containing your image and changes files.
  7. Press the Login button on the GemTools Launcher and you should be in business.

Last December when I first introduced the GemTools Launcher, it took 6 steps to install the GemTools Client code:

installSteps1

In July I announced the GemTools Client for Pharo (based on version 0.9 of Metacello), it took 4 steps:

installSteps2

Today it takes only 2 steps:

installSteps3

The configuration class bootstraps Gofer and Metacello, then loads FFI and finally loads the OGLauncher application code. Danged close to a one-click install:)

Update

To update the GemTools Client to a later version, you can follow the instructions for the Update…menu.

If you have any trouble join and send mail to the GLASS Beta Mailing List.

—–
[1]Photo by Okinawa Soba (Creative Commons).

PharoThis morning, Adrian Leinhard announced the first Pharo 1.0 beta release.

As most of you are aware, I’ve been heads down on Metacello going on several months now. I’m making very good progress.

In the last couple of weeks, I’ve been reworking the internal GLASS build procedures to use Metacello. I’ve also had a couple of GLASS users using Metacello for creating their own custom extents (i.e., loading only the projects that they are interested in, rather than the whole enchilada you get with the GLASS package).

When I read Adrian’s announcement, I thought this was a perfect time to kill two birds with one stone: release a version of GemTools that runs on the latest Pharo image and get a little more real world exposure for Metacello by using Metacello in the install/update procedure for the GemTools Client.

If you haven’t already been using the GemTools 2.3.1 Preview for all platforms (which is based on Pharo), then you should download the preview GemTools client and follow the instructions for setting up your session and verify that you can connect to your stone. You’ll need the session information and the gci files from the Preview to get things running with the Pharo 1.0 beta.

Installing GemTools Client in Pharo 1.0 beta

[Updated: 10/17/2009] Updated instructions for installing the GemTools Client in Pharo and Squeak can be found here.

If you’ve already been using Pharo as a GemTools client, then follow these instructions to get cooking:

  1. Download and install the Pharo 1.0 beta. Don’t forget to get the latest Pharo vm for your platform (also available on the downloads page).
  2. Load Metacello-All-dkh.6 from http://seaside.gemstone.com/ss/metacello (loads Metacello-Core, Metacello-MC, MetacelloProject and OB-Metacello).
  3. Delete the Metacello-All working copy. Once you’ve got Metacello loaded, you don’t need Metacello-All anymore.
  4. Execute the following expression to load the GemTools Client Metacello project (project meta-information):
    (MetacelloMCProject instance packageSpec
      file: 'GemStone-MetacelloProject-dkh.116';
      repositoryName:
        'http://seaside.gemstone.com/ss/GLASSproject';
      yourself) load
  5. Execute the following expression to load the GemTools Client code:
    (GemToolsClientMetacelloProject version: '0.9') load
  6. Execute the following expression to open the GemTools launcher:
    OGLauncher open
  7. Copy the session information from your old GemTools Client to the new GemTools Client in your Pharo 1.0 beta image. Use the Edit session menu item on the Session Menu in the launchers.
  8. Save the image.
  9. Copy the gci files (gciForWindows.dll, gciForLinux.so, and gciForMacintosh.so) from GemTools-2.3.1-preview.app/Contents/Resources in the one-click into the directory containing your Pharo 1.0 beta image and changes files.
  10. Press the Login button on the GemTools Launcher and you should be in business.

[Update 8/1/2009: Use the Update Client and load version 0.9.1, to get a bugfix for interrupt handling].

newUpdateClient

Moving forward, you’ll use the Update Client button or Update… menu item to get newer versions of the GemTools client.

The ink is barely dry on version 0.9 of the GemTools Client, so if you run into issues, send mail to the GLASS Beta Mailing List (subscription required).

Next GLASS Beta Update

If things go smoothly, I expect to have a new GLASS version (using Metacello of course) available in a couple of weeks. The new update will include Seaside 2.8.4Pier 1.2 and a handful of bugfixes.

Metacello

My priorities at the moment are to:

  1. Use Metacello to replace the old GLASS package system for communicating software updates and package dependencies.
  2. Finish implementing the features that are planned for 1.0 so that I can go into beta with Metacello. I hope to have gone beta with Metacello prior to ESUG.
  3. Finish up the Metacello tutorials so that other folks can start using Metacello for their own projects.
  4. Define a Metacello project for Swazoo 2 and Aida to make it possible for folks to track the ongoing development of GLASS while using Aida.

Seaside 2.9

We plan to release GemStone/S Version 2.4 within the next couple of months. 2.4 includes VM support for partial continuations, so it will be feasible to run Seaside 2.9 on top of GLASS.

[1]

In the month since the last beta update, I’ve been mostly heads down working on Metacello a version control/configuration managements framework. Metacello isn’t ready for public consumption yet, when it is, you will hear about it here. [Update later that day] Metacello is not a Monticello replacement, it is a Monticello enhancement.

Besides Metacello there have been a handful of bugfixes that are worth packaging up. The most important of which gets rid of potential infinite recursion in ExceptionA>>description.

GemStone-dkh.467

No GemTools changes. Added GLASS.230-dkh.231 to update list as an alpha release.

GLASS.230-dkh.231

GLASS bugfixes and additions:

  • fix for ExceptionA>>description infinite recursion problem reported by Dario
  • non-recursive MCAncestry>>ancestorsDoWhileTrue:
  • added methods to be able to cleanUp MethodVersionHistory instances (thanks Gerhard)
  • fix problem with recompile:, where method hasn’t been loaded because of other issues
  • bugfix 39932 – Url decoding not decoding ‘+’ in url
  • fix a problem reading an MCZ reported by Dario … turns out we needed a ‘null’ Error handler:)
  • incorporate Squeak protocol additions from Ramon Leon.

Update Process

To update an existing installation to GemStone-dkh.467 and GLASS.230-dkh.231, follow these instructions. If you have recently downloaded an appliance or installed GemStone/S 64 2.3.1, then follow these instructions telling you how to get a recent GemTools client vm.

If you update to GLASS.230-dkh.231 from a version prior to GLASS.230-dkh.231, a Warning dialog will pop up – proceed through the warning.

—–
[1] Photo by dashananda (Creative Commons).

[1]

A couple of weeks ago we published a one-click GemTools 2.4 download. We named the file 2.4 to differentiate it from the 2.3.1 GemTools client download, but we inadvertently included 2.4 gci files in the download – we haven’t released 2.4 yet.

We’ve now made two one-click GemTools preview downloads available on the download page:

  • GemTools 2.3.0-preview for all platforms (for use with version 2.3.0 of GemStone/S, like the 1.0beta11 appliance)
  • GemTools 2.3.1-preview for all platforms (for use with version 2.3.1 of GemStone/S)

If you are using the GemTools 2.4 download and have experienced problems then you should definitely download and use the one-click file that matches your stone version.

—–
[1] Photo by Nessa Land (Creative Commons).

[1]

As much fun as round trips can be, when those roundtrips are over the WAN using GemTools, it can get a bit tiring.

A little over a month ago (GLASS.230-dkh.194) I added the class OBUpdateConcentrator to GLASS. The job of the concentrator is to collect OB-related #update: messages sent to Morphic widgets on the client from the server and ship them across the wire in one roundtrip instead of n roundtrips (see this section for more info). The net effect is that the number of roundtrips for browser interactions is reduced by about 50%.

I didn’t turn on the concentrator for the latest preview, because there were some apparent update problems (they may have been transient Pharo problems). After announcing the preview, I realized that folks who need to connect over the WAN probably wouldn’t mind a few update problems in return for better UI performance. So I decided to make another preview drop primarily aimed at providing relief for roundtrip sufferers.

In order to turn on the concentrator, the method ClientForwarder>>_asOop needs to be implemented. the method contains a primitive call and you need to be SystemUser to compile the method, so you need to use topaz (your input highlighted in gray):

foos:c_gss64bit_230>topaz -l
___________________________________________________________________________
|                             Configuration Files                             |
|                                                                             |
………………….
|_____________________________________________________________________________|
topaz> set user SystemUser pass swordfish
Warning: GemStone is clearing the previous GemStone password.
topaz> login
[Info]: LNK client/gem GCI levels = 830/830
[Info]: User ID: SystemUser
[Info]: Repository: c_gs64stone_230
[Info]: Session ID: 2
[Info]: GCI Client Host: <Linked>
[Info]: Page server PID: -1
[Info]: Login Time: 03/25/09 13:46:51.706 PDT
gci login: currSession 1 rpc gem processId -1
successful login
topaz 1> method: ClientForwarder
_asOop
<primitive: 86>
self _primitiveFailed: #asOop
%

topaz 1> commit
Successful commit
topaz 1> logout

After defining the method and committing, it is  worth turning off some of the optional UI features (in the Preferences Browser under the browsing category), namely: annotationPanels, mercuryPanel, optionalButtons, and syntaxHighlightingAsYouType. These OB options, while useful, consume additional roundtrips for each refresh of the browser. Yes, the preferences you set in your client (either Squeak or Pharo) will be propogated to the server…

Last night I ran some tests from home running against a stone on my office desktop machine and got a 3x performance boost (3 seconds per click versuse 10 seconds per click). I  started doing some development tasks to make sure that all of the browsers were functional when  optionalButtons is disabled (it turned out that the Test Runner wasn’t the first time around) and while I wasn’t doing intense development (I was keeping an eye on the Utah/Rockets game), the performance was good enough that I forgot that I was working on a stone in the office.

GemStone-dkh.449

There have been no major changes in the GemTools since the last preview release other than a new Find… Menu command was added called Case Sensitive String…, which searches through all method source doing a case sensitive search.

Take a look at the GemTools change log for a complete history of changes since GemStone-dkh.441.

GLASS.230-dkh.216

In addition to the roundtrip performance improvements, a number of bugs have been fixed:

  • fix Bug39828 – fastcgi and uploadfile problems
  • fix Bug39766 – WAGsWalkbackErrorHandler is not subclassable
  • fix Bug39778 – Collection should include #ifNotEmpty:ifEmpty:
  • fix Bug39810 – Can’t use DateTimes in SIXX
  • fix Bug39869 – Unicode and debugging
  • fix Bug38428 – a collection of glass shards in the browser
  • fix Bug38458 – Monticello Browser – Viewing history has impact on repository pane
  • fix Bug39369 – MCReader(C)>>readerClassForFileNamed: needs more error checks
  • fix Bug39552 – case-sensitive methods containing search
  • fix Bug38320 – SystemBrowser update problem
  • fix Bug38389 – WB, trying to load a package that had it’s working copy deleted
  • fix Bug38436 – Nothing happens on Repository Browser:”refresh”
  • fix Bug38438 – Browse Monticello package needed
  • fix Bug39756 – need to implment String>>restoreFromSnapshot:
  • fix Bug39763 – Date>>+ has bugs
  • fix Bug39579 – confusing warning from Monticello save after a merge
  • fix Bug38424 – Need way to propogate compiler warnings to tools
  • fix Bug39755 – MC1 should raise errors when there are unloaded classes methods
  • fix Bug39767 – possible stack overflow during FileDirectory>>forceNewDirectoryNamed:
  • fix Bug38550 – Confirmation for Monticello unl;oad package

Take a look at the GLASS change log for a complete history of changes since GLASS.230-dkh.209.

Updating

If you are already using a preview GemTools client, you only need to follow these instructions. If you are using a version of the GemTools Client earlier than GemStone-dkh.441, then you should follow these instructions.

—–
[1] Photo by BenJTsunami (Creative Commons).

GemTools Launcher

[Update 6/5/2010] For the latest GemTools 1.0-beta.6 documentation see  the GemTools Guide on the glassdb wiki.

This post started out as a beta update post, but as I added more and more material I realized that it deserved to be a reincarnation of the Terse Guide to the GLASS Tools. It’s been a year since I wrote the original Terse Guide and there have been significant changes to the whole GLASS tool set, so a new version has been long overdue. However, I do have an announcement post to finish (and it depends upon the information in the Terse Guide), so rather than delay the announcement of the preview release, I decided to publish the Terse Guide before it was complete.

I have completed all of the sections that describe the new functionality of the GemTools Launcher, including a section on installing the GemTools Client in a fresh image. Over the next week, I plan to finish the Terse Guide.

Over time as new features are added I intend to revisit and revise this post. To that end, I’ve created a little update section, where I’ll record information about the updates I make over time:

  • current as of GemStone-dkh.441 and GLASS.230-dkh.209 (March 12, 2009)
  • one-click GemTools download available, based on Pharo0.1 update 10243 (March 22, 2009)
  • Process Browser section updated as of GemStone-dkh.465 and GLASS.230-dkh.228 – Philippe how do you like the fonts? (April 14, 2009)

All of the screen shots in this post were taken using a Pharo image. The GemTools Client runs in both Squeak and Pharo images (see Installation and Update Steps for instructions on setting up an image).

You can click on the screen shots in this post to see full size images.

Read the rest of this entry »

[1]

[Update 3/16/2009: see the post GLASS Beta Update: Cooking with GLASS (Preview) for the latest preview information].

With the latest dev release of Pharo (pharo0.1-10243dev09.02.3), the new GemTools Client has stopped working correctly. From what I can see, a number of updates were made to OmniBrowser which causes the buttons to disappear from the OGLauncher….I stopped looking for additional problems at that point:). I’m not going to complain, though, the Pharo image is pretty cool already and it is still pre-Beta.

As of pharo0.1-10213dev09.01.3 (and probably pharo0.1-10236dev09.02.2.zip) the GemTools Client was working correctly. Until further notice don’t use the latest versions of Pharo.

I have been pretty busy fixing bugs recently and anticipate a refresh of the GemTools Client and the GLASS package in a week or so.

—–
[1] Photo by milomingo via Flickr (Creative Commons).

[1]

[Update 3/16/2009: see the post GLASS Beta Update: Cooking with GLASS (Preview) for the latest preview information].

As a few brave souls discovered, the process for updating to the new crop of tools is a little more complicated than it needs to be. A couple of them even got their fingers pinched during the update:).I was looking for feedback, so I appreciate the effort. Hopefully their sacrifices will be worthwhile.

updatelauncher

There weren’t that many changes made to the OmniBrowser code in GLASS post GLASS.230-dkh.177, however, the changes that were made created havoc for any windows opened prior to the update. I had originally hoped that a couple of errors between friends would be okay, but enough people ran into odd problems during the updates to GLASS.230-dkh.182 and GLASS.230-dkh.183, that it became clear that the update process needed to be improved.

I tried a number of things including an attempt to work around the problems with the new GemTools Client code. I was successful in getting the new GemTools Client to run against the older versions of GLASS (which is a step in the right direction), but I wasn’t able to get around the crashes and walkbacks. With a nudge from Igor Stasenko, I finally settled on using an update script.

In the end I made two significant changes to the update process:

  1. Update the GemTools client before updating the server. In the past we’ve updated the server-side code first and then updated the client-side code. However, since we’re recommending that users move to a completely different client image, I think it is easier to get the client update out of the way before doing the server update, especialy now that the latest GemTools Client code will run against older versions of GLASS. Any problems in getting the GemTools Client built and connected to the server can be worked out before making changes on the server side.
  2. Update the Server using a script instead of the Monticello Browser. With this particular update, using a script is necessary since the windowing mechanism for the current session becomes broken during the update. In the long run, it is useful to have a script-based update mechanism that can be used to update production repositories that aren’t easily accessed through the GemTools Client.

Preview GLASS.230-dkh.187

Since GLASS.230-dkh.183 I’ve made a handful of improvements that are worth trying out:

  • merge Pier-Model-lr.245, load Pier-Blog-lr.103.
  • OSTestRunner bugfixes.
  • debugIt implemented. debugIt opens a Debugger on the selected code, setting a breakpoint on the first statement.
  • exploreIt implemented. exploreIt opens a Chasing Inspector on the result of evaluating the selected code.
  • Remove MonticelloConfigurations as a required package.

If you’ve been following the mailing list, you will have noted that we’ve received a flurry of bug reports in the last week or so. I appreciate the bug reports, but because I intend to address a good number of them before the next beta update, the next update will be deferred for at least 2 more weeks.

1. Update GemTools Client: GemStone-dkh.355

If you choose to use Pharo as the basis of your GemTools Client, be sure to download the latest dev image as a starting point. As of today, pharo0.1-10211dev09.01.2.zip is the latest dev image. If you choose to use Squeak as your GemTools Client, start with a basic 3.10 image like Squeak3.10-7159-basic.zip.

sessiondef1Use the Universe Browser, select the GemTools-Client version 0.355 package (in Network category) and install it. Note that during the install using 3.10, you will be warned about an extension to OTToolset – is is safe to proceed.

Open a Workspace and evaluate the expression ‘OGLauncher open‘ and then edit the Glass session, inserting the login information that is relevant to your system – stoneHost, gemHost, stoneName and netLDI.

Login using the GemToolsLauncher and get ready to update the GLASS repository to GLASS.230-dkh.187. Note that during the login using Pharo, you will get a warning about using a deprecated #authorInitials: api – it is safe to proceed.

Even though the Class Browser and Monticello Browser are functional, I wouldn’t try to do too much work using the new GemTools Client and an old version of GLASS. For best results you should immediately update your GLASS repository.

I’ve used the new GemTools Client to upgrade GLASS.230-dkh.164 (corresponding to 2.3 release and the 1.0beta11 appliance) and GLASS.230-dkh.177 (corresonding to the 2.3.1 release) with good results.

Since I’m still actively working on the new tools, I don’t plan to publish a ‘one-click’ GemTools Client, until the rate of change has settled down.

2. Update GemStone Repository: GLASS.230-dkh.187

The following update script:

  1. Adds a method to SystemChangeAnnouncement.
  2. Turns off autoMigrate.
  3. Loads GLASS.230-dkh.187 from the GemSource repository.
  4. Sets autoMigrate back on.
  5. Performs a commit.

The code should be pasted into the workspace pane of a Gemstone-dkh.355 GemTools Launcher or run from a topaz session.

| httpRepository version rg |
SystemChangeAnnouncement 
    compileMethod: 'item: ignored' 
    category: 'accessing'.
MCPlatformSupport autoMigrate: false.
httpRepository := MCHttpRepository
    location: 'http://seaside.gemstone.com/ss/GLASS'
    user: ''
    password: ''.
"pick up the GLASS repository if it's already
 in default repository group"
MCRepositoryGroup default repositoriesDo: [:rep |
    rep = httpRepository ifTrue: [ httpRepository := rep ]].
version := httpRepository
    loadVersionFromFileNamed: 'GLASS.230-dkh.187.mcz'.
version load.
rg := version workingCopy repositoryGroup.
rg addRepository: httpRepository.
MCPlatformSupport autoMigrate: true.
System commitTransaction.

If you’ve used the GemTools Launcher to run the update script you should logout and then log back in before continuing with your work. If you use topaz to update the repository, you need to remember to use a GemStone-dkh.355 GemTools Client to connect to your repository.

The GemTools Client is still in preview, so unless you are brave and/or curious, I’d recommend that you stick with a more stable version of GLASS.

———-

[1] Photo by EricGjerde via Flickr (Creative Commons).

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Join 446 other followers

Categories

RSS GLASS updates

  • An error has occurred; the feed is probably down. Try again later.

RSS Metacello Updates

  • An error has occurred; the feed is probably down. Try again later.

RSS Twitterings

  • An error has occurred; the feed is probably down. Try again later.
April 2021
M T W T F S S
 1234
567891011
12131415161718
19202122232425
2627282930