Schwartz Engine

Schwartz Engine

About This

I develop Android Apps and games. I play board games and I am an experienced GM in warhammer Fantasy Role Play (1st and 2nd Ed). I am also painting and sculpting miniatures.
Yes that's right I am a freak - No mistake there, I even exercise Ju-Jitsu twice a week too. I am using this media to track my work and organise it a little.

Yesss! Now my Android Phone Lives Yet Some Years Again...

Apps an' MobilesPosted by Carsten Schwartz Mar 08, 2019 16:36
Yep that's right!

I just added some more life to my OnePlus One Android device.

As of late I have noticed that my phone's battery performance have dropped significantly. So what to do? I looked for a OnePlus 6 on Ebay and you can easily get one for some $550 since it is last years top model in this range.

But then I tried to see if it was feasible to buy a new battery and replace it myself, low and behold the guys at IFIXIT have a nice guide on how to do this, so I ordered a battery at around $60, included in this package was a kit to do the replacement with 9 free tools as an extra.

I received the package and one afternoon I did the moves to replace the battery. The guide from IFIXIT made it for me. It was easy enough to get the back panel of the phone with the included plastic tool and then loosen the screws.

Then it started to get a little difficult. The battery is glued on the back side so you have apply some controlled force as you loosen it. But of it went and I inserted the new battery, mounted the screws back in and put on the back panel. I turned on the phone to check out the battery status, the phone booted but into a recovery menu, and I had some anxious moments because the #$!??! phone kept returning to this menu. Luckily I noticed that the back panel not was put back on all the way and that this held the volume button down, and surely enough as I clicked the panel in place the phone booted as normal.

I have given my phone some more years spending $60 and some sweat and saved some $500 in the process. I still baffles me in this hysterical climate debate and save the earth alarmist age, that you are unable to buy a new battery and replace it without having to take your phone apart in a difficult way. I am lucky that this phone only requires loosening of the back panel and some screws, other phones you need to heat up to disassemble with a higher risk of ruining your device. Some years ago it was easy take of the back panel and slide the battery out and put in the new battery. A waste of resources, that this causes a lot of people to buy a new phone after 2-3 years, and not very friendly towards the environment, but we don't talk about that do we?

BTW: To read about the unscientific climate debate I recommend reading Climate of Extremes: Global Warming Science They Don't Want You to Know by Patrick J. Michaels and Robert Balling Jr. A book on how Climatologist was told to shut up about the truth about the climate because it not fits with the alarmist narrative :-)

  • Comments(0)//

Creating a Central GIT Repo from Scratch

Apps an' MobilesPosted by Carsten Schwartz Oct 03, 2018 22:06
Achtung-Achtung! Nerdy GIT article yet again - You have been warned

Alas I discovered that I had forgot to put my TypeScript Code under wraps in a repository, so away I went to make a new repo, so I after some attempts I made a new repo using this command:

git --bare init --shared TypeScriptCode.git

This created a ready bare repository I intended to use as my central repository.

Next step was to create a place where I could work with my code. So:

cd ~/Work
git clone file:///home/carsten/GitOrigins/TypeScriptCode
cd TypeScriptCode/

Then I copied the code from where I had the original directories from my typescript work on amongst other things the Asteroids Clone, and after that started to add stuff:

echo '*/built/*' > .gitignore
git add .gitignore
git add AsteroidsGame/*.js
git add AsteroidsGame/*.ts
git add AsteroidsGame/*.html
git add AsteroidsGame/*.json
git add AsteroidsGame/resources/
git add AsteroidsGame/sound
git add CommonLib/*.ts
git commit -m "Initial Checkin"
git push

And then I was started, I added the rest and after some testing, now I have a central repository for my typescript code...

  • Comments(0)//

Griswolds' Edge aka I'll Kick Some Monsters Ass!

Apps an' MobilesPosted by Carsten Schwartz Sep 07, 2018 14:42
The other day putting some trunks up into my ceiling space, I fell over some old PC game's from way back. I had just listened to an episode of one of my favourite podcasts The Retro Hour about the making of Diablo at Blizzard North, and there it was in and old almost not dusty box, the original Diablo I CD Game I bought back then with manual and all.

Since I am running Linux now I started up Windows 10 in Virtual Box but Diablo I was not designed for this version of windows, so I went ahead and made a Windows XP instance and installed it in there.

It ran like a charm and I have been playing a lot of this with a true nostalgia feeling. After a while it started to annoy me that I had to have the CD in the drive to play. But that is the great part of running in VirtualBox, I simply made an iso of the CD and added that as the CD to the XP instance.

No more screams from the spinning up and down of the drive, and a big performance boost since the Diablo data now is loaded from an iso file on my SSD drive. This makes these old CD based games fly compared to the old days when tou had to have the disc in the drive.

And further more, Windows XP also boots and runs extremely fast from an SSD based VirtualBox based image, much faster than back in the day ;-)

I am considering using this for my graphical editing, since Paint Shop Pro might execute faster even though this is a VM.

BTW! I look like a Knight Tank now!

  • Comments(0)//

It's Insane I tell YA! - Aka The Git Based Buuugh Hunterrrrhh II!

Apps an' MobilesPosted by Carsten Schwartz Aug 11, 2018 09:18
Achtung-Achtung! You have been warned - A geeky article on Git and strange behaviour in the Java Swing API ahead!

First Step - Migration to new Git Repositories

Until recently I have used SVN for versioning of my game software, but the other day I talked to one of my colleagues about migrating my repository from SVN to Git. It seemed a natural choice, since Git its the versioning control system of this age and in my new job we work and code on a Linux platform using Git extensively on the command line.

I had some vague hints that I could use Git by calling git svn to clone my old SVN repository. Later that evening I had some time on my hands and started migrating. I don not use the cloud for backup I have several USB devices where I backup my stuff. My original repository is file based of the same reason and has this file based url:


So away to the terminal I went, created a GitOrigins folder for my new Git repositories. My Goal was to split my apps into individual Git repositories. I called git svn just to see what options I had before going ahead, but that didi not go well git: 'svn' is not a git command. See 'git --help' the terminal responded in its silent clinical way. No problem git-svn is part of the Git core system and can be installed on Ubuntu by calling:

sudo apt-get install git-core git-svn

Just to prepare I titled myself Sir GoogleALot for a period to find some recommendations on how to best procede after my web adventure I was ready to go. Starting with A Dungeon Horror Deed which was implemented with a trunk a folder called ADungeonHorrorDeedPilot/trunk in SVN I invoked my first magic Git conversion command in my GitOrigins folder:

git svn clone file:///home/usernam/Android/AndroidRepository/ADungeonHorrorDeedPilot/trunk

After a lot of conversion output in the terminal, I ended up getting a trunk folder. So now I needed to convince myself that it indeed was a valid Git repository so I installed some nifty Git tools for interactive meddling and started gitk which is a graphical viewer by calling these commands:

sudo apt-get install gitk
sudo apt-get install git-cola
sudo apt-get install git-gui
cd trunk

gitk is for browsing branches, commits and changes, git-gui as a helper for gitk and git-cola to work with commits and other git activities. Starting gitk showed med that I was in a valid Git repository.

But I wanted to extract the repository with the specific name ADHD, not trunk. I deleted the new trunk folder and invoked git-svn to extract to that specific name:

git svn clone file:///home/username/Android/AndroidRepository/ADungeonHorrorDeedPilot/trunk ADHD

And it went as expected, you can name the repository by adding the name you want at the end of the command as can be seen from the last calls. After this I went ahead and converted the rest of the repositories I had and checked all repositories with gitk for validity and they where ok. So far so good, at this stage I decided to make a zip of GitOrigins and saved it as a backup.

WTF! My origin must be bare!

After cloning all my projects to independent repositories, next i wanted to try out working with the code. As the first thing I made a Work folder and cloned the ADHD repository there by calling:

mkdir Work
cd Work
git clone file:///home/username/GitOrigins/ADHD

Git has to know who the user is to do its operations this was done with these commands:

git config --global “username”
git config --global “”
git config --global color.ui 'auto'

Now for the funny stuff, importing the ADHD project to Eclipse, building it and running it in a virtual Android device. It worked like a charm. However calling git status showed me that i had both a bin and a gen folder containing untracked files. These folders are generated but not needed to be put under version control, so in the best Git style i made a .gitignore file containing:


Now my git status command showed me that only the .gitignore was untracked so I tracked it and comitted it:

git add .gitignore
git commit -a -m "Initial version of ignore file"

No problem, so now to push this local change to the origin in the GitOrigins folder:

git push

But to my horror this failed to begin with. There are two types of Git repositories, bare and non-bare. Bare repositories are a working copies with out the actual files, but contains the Git version of the files in the form of structured changes and hashes, and these are the ones you per default can push your changes to.

To convert an existing working copy to a bare use these commands, for a working copy in a repository called myrepo:

cd myrepo
mv .git ../myrepo.git # renaming just for clarity
cd ..
rm -fr myrepo
cd myrepo.git
git config --bool core.bare true

I made a script containing these commands, that takes the name of the directory as the one argument to do this:

cd ${1}
mv .git ../${1}.git
cd ..
rm -fr ${1}
cd ${1}.git
git config --bool core.bare true

This was used to convert all the folders in my repository directory called
GitOrigins like this:

./ ACurrencyCalculator

Then I could Push ;-)

The Sultan of Swing - Aka Weird Bug Solving

After this initial effort I also imported my ADHDEditor project. It all ran smoothly and I only had to ignore a bin directory since the editor is a Java Swing application. So i tried it out and to my horror discovered an undetected bug in my editor. As it turns out I have been a lazy bastard when I made the editor using JOptionPane to create most of my entity editing dialogs. Some of them uses JComboBox to select an entity icon and dynamically show it when a new selection is made in the JComboBox through a cunning listener implementation:

In the code that prepares the JOptionPane I did this to set the JComboBox:

But due to something weird in the Swing API for this listener implementation the icon is not updated when I try to edit a Quest where the first entry in the type ComboBox is selected. Strangely enough I also have a JOptionPane setup for editing monsters but that does not have the same problem. After messing around I ended replacing the setSelectedItem call with this fix:

I solves the problem but is not really a satisfactory fix since I can not can find the core reason for the bug imidiately, but it will have to do for now.

Final Elimination of the Franken Bug

As an aside it just occurred to me that the editor code for different entities can be put into separate classes, making the code even more maintainable. I have started this process with the QuestEditor class. I it will also give me a chance to dig deeper into the problem, because it is easier to test a single class like this.

And testing this way have also enabled me to find the problem. You can not invoke a change listener by selecting and item that already is selected. So I have made a method that updates the Icon that can be called in the listener and be called during the creation of the editing dialog and this solved the problem.

As a follow up here a small week after I wrote this post I can tell that the Editors has been moved to separate class removing some 500 lines from the main class file and at the same time giving a much better overview, making it much easier to maintain.

Leaving stuff better than when I entered always makes me happy ;-)

  • Comments(0)//

I am not Looking Back II!

Apps an' MobilesPosted by Carsten Schwartz Jul 28, 2018 11:36
Recently I read on OMG!UBUNTU! that a tech contributor from online magazine had ditched Windows and tried using Ubuntu for two weeks, the guy did try another Linux distribution first but dropped it since the installation 'couldn't find a drive to install the OS to.'. He had the same issues as me with Windows even though he had used it for decades. After the experience he will continue using Ubuntu for his tech writing: ' this is absolutely my new daily driver for writing, working, communicating, browsing and media consumption'. Read the article by Following this link.

As a conclusion on my part, I still do not see that Windows is improving as It is the company OS at the business where I work. In fact it has gotten worse with updates and all. Linux however stays the same and is fast and pleasant to work with, I have never once had a nagging doubt after ditching Windows. The advantages you get by dropping the stagnating OS are many, amongst a lot of other things not mentioned here, you will get a system that:

- Always boots in 30 seconds or less
- Always shuts down in 5 seconds or less
- Not forces you to update, but allows you to select when
- Not degrades in performance over time
- Has a free office suite (Libre Office)
- Not has a slowly corrupting registry
- Runs significantly faster than Windows
- Not has an ugly tile based user Interface, who ever made that brain fart I do not know...

Note that this is not a commercial, I am not getting money from a sponsor to say this, I am simply recommending a good product.

I know Microsoft is trying with a valiant effort to make the company look like an open source advocate, but I am not convinced. And I am not getting money to not recommend them either.. :-)

  • Comments(0)//

Holiday At last, refactoring as therapy...

Apps an' MobilesPosted by Carsten Schwartz Jul 08, 2018 12:26
After a period in and out of the job market I have finally landed a job at a company I hope is more credible/stable than the other jobs I have had in the last year. So now I am on official Vacation at last and gathering strength at home with the family.

So I just sat down to look at my Asteroids Clone and discovered some things that could be improved in the code. To many hard coded values and a slight little problem where the spaceship could be smashed up even before the game started.

Try the new improved Asteroid Clone!

It is satisfying to be able to clean up and make corrections to the code relatively fast event though I have not touched it for a while.

As I say, Good Code is defined by answering this question:

Would you give the guy who wrote this a beer after maintaining it?

  • Comments(0)//

Not Big Enough I Say!

Apps an' MobilesPosted by Carsten Schwartz May 28, 2018 19:08
I did it again, as I was driving home in my car I wondered why the hugest of the asteroids in my clone of the Atari Asteroids Game from 1979 not just pushed the smaller Asteriods out of the way on impact, I had a revelation!

The mass of an Asteriod is not based of a one dimensional diameter length like metric or a two dimensional area like metric for that matter. Mass is mass and it is volume based, so away I went an added a cubicSize member to my asteroid class which is size*size*size, where size is the diameter of the smallest circle surrounding the center of mass of the asteroid. And behold it looks more like the effect i was after, try it out:

What a bummer! Using a one dimensional measure for volume, I must have been to eager to see the results of the collision algorithm when I implemented it. A typical trait when you make graphical software. It also goes to show that the human mind works in mysterious ways when it comes to trouble shooting and problem solving :-)

Software development is still a young craft and not easy ;-)

  • Comments(0)//

Reclaiming my Unit Testing!

Apps an' MobilesPosted by Carsten Schwartz May 02, 2018 20:16
This evening I had to make a new unit test for one of the classes in my A DUNGEON HORROR DEED editor, for a while Eclipse had spat some kind of IDE NULL pointer exception in my face every time I tried to run a test. I have not done anything about since the classes under test not have changed.

But now it was urgent, so away I went to the web and was lucky to find a couple of good suggestions on a Stack Overflow entry. I used this one that specified what to do in the Eclipse IDE:

- Go to help
- Select: Install New Software
- In the Work with text box type: Juno
- Expand Programming languages in the tree view
- Select: Install Eclipse Java Development Tools
- Install it
- Restart

And it worked in first try:

So now I can make my testing count again!

As an aside I can mention that the Dice class that have methods I have used since 1989 when I made a program for rolling new Characters for Warhammer Fantasy Roleplay have a method for rolling a specific range from (and including) a minimum integer value to a maximum. I have never tried what happens if you give the method a minimum that is larger than the maximum. So of course I made a test where I tried this. I expected the method to switch the two parameters and still deliver a range roll from (and including) the lowest to the highest of the two values.

And of course it crashed, away I went an refactored the method to switch the values if the minimum was largest and now the test succeeds. And then I added some explanatory java doc as well:

  • Comments(0)//
Next »