The Booster shot put me down

It’s 3:20 am. After tossing and turning for about 3 hours, I got up to do two things: write this, and drink some water – let’s help my kidneys get rid of any wastes that’s contributing to how bad I was feeling.
So I have an early day today. Around 9pm yesterday, I broke a 10mg melatonin tablet into two, downed one half, put the other half in the pills bottle, changed my mind, got the remaining half out of the bottle and sent it down the hatch with some water as well.
Then I went to bed around 11pm. Read part of a book I borrowed from the Libby app on my iPhone courtesy of the Lehi public library. Finally turned in around 11:30pm. I like some white noise so I had one of those 10-hour rain video on YouTube playing on the TV.
First thing I noticed was I was shivering like crazy. So I doubled up on the blanket (one on top of another on top of me). Didn’t do a lot. I finally fell asleep.
At some point I dreamt about what it would be like to have powers like the Greek gods of old. I am sure this is due to the book. I was on book 3 of the “Olympus Bound” trilogy by author Jordanna Max Brodsky. (Book 3 of the series).
All this while, I believe I was partially awake because I knew I was feverish and tossing and turning and rubbing my legs together – good thing I sleep alone, but not so good in the sense of “bros, at your age, you are still single?”.
Just before I got up I started “dancing” (in my mind) to the song Essence by Wizkid (and no I didn’t remember who sang it or the title at the time). Which triggered an idea for something I have been thinking of, and putting off for a couple of years. I even have an alarm on my phone to go off at 3pm weekdays with the message “Do the video”. Each of the video clips will go on my YouTube channel and possibly TikTok, Instagram, and Snapchat. It will consist of me dancing to a popular song cutting across culture, country, currency, and genres (got tired of looking for that fourth “C” word 🙂 ). Anyway I will be dressed all in black, with a white plastic face mask, the official video of the song will be playing on the TV behind me. Near the one minute mark a voice in Yoruba will say something like “bros, oya, let’s come and be going” to which I stop, cuff my hand behind my ear like I was listening, waive then walk out of the video frame.
I knew I had a thermometer around here somewhere but it took a minute to find it. I got it off eBay so not sure how accurate it is. It read 35.5C when I put it on, rinsed it, stuck it under my tongue, pulled it out when it started beeping. It read 37.9C.
Time to drink that water, get back in bed and try to sleep. I get up at 6:50am and it’s 3:37am now. First COVID shot, the effect was really mild, with the second shot I had a mild fever throughout the next day. But this booster shot put me down: wiped the floor with me.

Still awake at 4:30am
PS: I should have taken paracetamol to lessen the fever but it didn’t cross my mind 5:30am. So I definitely take some of the blame for how shitty I felt.

Porting Replit (Phaser) game to IONIC/ANGULAR

I mentored three D-Tech high school student over two weeks that came up with the game  https://blank-game.lorenzoharrold.repl.co/

Source code available at https://replit.com/@LorenzoHarrold/blank-game#index.html (requires invitation)

I decided to investigate how to port it to a locally hosted environment as well as the possibility of generating an Android/IOS from the code.

(Phaser is a JavaScript game development library)

– Setup the game development environment on CentOS/OEL 8.x or Mac OSX

[opc@phaser ~]$ sudo firewall-cmd –add-port=8000-8199/tcp
[opc@phaser ~]$ sudo firewall-cmd –add-port=8000-8199/tcp –permanent
[opc@phaser ~]$ wget https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/s/screen-4.6.2-12.el8.x86_64.rpm
[opc@phaser ~]$ sudo yum localinstall -y screen-4.6.2-12.el8.x86_64.rpm
[opc@phaser ~]$ sudo setenforce 0
[opc@phaser ~]$ sudo yum install -y curl wget git

– You can download the MAC OSX installer or zip file from https://nodejs.org/ (e.g., node-v16.13.0-darwin-x64.tar.gz)

[opc@phaser ~]$ wget -O node-v16.13.0-linux-x64.tar.xz “https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.xz
[opc@phaser ~]$ VERSION=v16.13.0
[opc@phaser ~]$ DISTRO=linux-x64
[opc@phaser ~]$ sudo mkdir -p /usr/local/lib/nodejs
[opc@phaser ~]$ sudo tar -xJvf node-$VERSION-$DISTRO.tar.xz -C /usr/local/lib/nodejs
[opc@phaser ~]$ sudo chown -R opc:opc /usr/local/lib/nodejs
[opc@phaser ~]$ cp .bash_profile .bash_profile.org
[opc@phaser ~]$ cat >> .bash_profile <<EOF
# Nodejs
VERSION=v16.13.0
DISTRO=linux-x64
export PATH=/usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin:$PATH
CAPACITOR_ANDROID_STUDIO_PATH=/home/opc/android-studio/bin/studio.sh
export LANG=en_US.UTF-8
EOF
[opc@phaser ~]$ 

– NOTE: on Mac OSX, the default shell is zsh, so the profile file is .zprofile and not .bash_profile

[opc@phaser ~]$ . ~/.bash_profile
[opc@phaser ~]$ rm -rf .npm-global
[opc@phaser ~]$ npm –version
8.1.0
[opc@phaser ~]$ npm i -g @ionic/cli
[opc@phaser ~]$ /usr/local/lib/nodejs/node-v16.13.0-linux-x64/bin/ionic –version
6.18.1
[opc@phaser ~]$ npm remove -g  formidable@1.2.6
[opc@phaser ~]$ npm i -g formidable@v3


--- Install Angular globally. Alternatively, you can install it per project
aitayemi@aitayemi-mac ~ % npm install -g @angular/cli
aitayemi@aitayemi-mac ~ % npm install -g @angular/core

—- List globally installed packages (“npm ls”  in the top level directory of a project will list only packages installed in that project)

aitayemi@aitayemi-mac ~ % npm ls -g
/usr/local/lib/nodejs/node-v16.13.0-darwin-x64/lib
\__ @angular/cli@13.0.3
\__ @angular/core@13.0.2
\__ @ionic/cli@6.18.1
\__ corepack@0.10.0
\__ formidable@3.1.3
\__ npm@8.1.4

——————- PORTING THE EXISTING SCAVENGER GAME FROM REPLIT —————-

—– create a blank Ionic project

aitayemi@aitayemi-mac ~ % ionic start scavenger blank –type=angular
aitayemi@aitayemi-mac ~ % cd scavenger
aitayemi@aitayemi-mac scavenger % npm audit fix 
aitayemi@aitayemi-mac scavenger % 

—– INSTALL phaser into the project, then update index.html to use a local copy (alternative to downloading the phaser from the repl.co as configured in the index.html)
aitayemi@aitayemi-mac scavenger % npm install -D phaser
aitayemi@aitayemi-mac scavenger % npm audit fix
aitayemi@aitayemi-mac scavenger % cp node_modules/phaser/dist/phaser.min.js src/assets

———- COPY the replit game files from replit to the assets sub-folder ————————–
– index.html goes in the src folder, while all other files go in the src/assets folder 

aitayemi@aitayemi-mac scavenger % ls
angular.json            e2e                     karma.conf.js           package-lock.json       src                     tsconfig.json
capacitor.config.ts     ionic.config.json       node_modules            package.json            tsconfig.app.json       tsconfig.spec.json
aitayemi@aitayemi-mac scavenger % ls src
app             assets          environments    global.scss     index.html      main.ts         polyfills.ts    test.ts         theme           zone-flags.ts
aitayemi@aitayemi-mac scavenger % ls src/assets
GridLayout.js           addons.js               endPage.jpg             firespritesheet.json    inhouse2.jpg            phaser.min.js           sounds                  wall-e.jpg
Scene1.js               brick.png               finalBook.png           firespritesheet.png     main.js                 robot01.png             spritesheet.json        well.png
Scene2.js               broken_robot.png        fire_spritesheet.json   helper.js               open-book.png           robot_sprite.png        spritesheet.png
SimpleScene.js          dude.png                fireezgif.png           icon                    openbook.png            seedPack.png            tilesets
aitayemi@aitayemi-mac scavenger % ls src/assets/tilesets
door.png        floor.png       green.png       hazard.png      mario.png       purple.png      stair.png
aitayemi@aitayemi-mac scavenger % ls src/assets/sounds
terminator2b.mp3
aitayemi@aitayemi-mac scavenger %

————- remove dependency on Replit by downloading the various Javascript files referenced in index.html to the src/assets folder and updating the index.html to reference the local files instead

aitayemi@aitayemi-mac scavenger % curl -o src/assets/phaser.js https://game-lib.leonyoung.repl.co/phaser.js   (optional since we will use the installed phaser.min.js file)
aitayemi@aitayemi-mac scavenger % curl -o src/assets/helper.js https://game-lib.leonyoung.repl.co/helper.js
aitayemi@aitayemi-mac scavenger % curl -o src/assets/addons.js https://game-lib.leonyoung.repl.co/addons.js
aitayemi@aitayemi-mac scavenger % curl -o src/assets/GridLayout.js https://game-lib.leonyoung.repl.co/GridLayout.js
aitayemi@aitayemi-mac scavenger % curl -o src/assets/SimpleScene.js https://game-lib.leonyoung.repl.co/SimpleScene.js

——– EDIT index.html to update the location of relevant files including Scene1.js and Scene2.js scripts:
aitayemi@aitayemi-mac scavenger % grep script src/index.html
    <script src=”https://game-lib.leonyoung.repl.co/phaser.js”></script>
    <script src=”https://game-lib.leonyoung.repl.co/helper.js”></script>
    <script src=”https://game-lib.leonyoung.repl.co/addons.js”></script>
    <script src=”https://game-lib.leonyoung.repl.co/GridLayout.js”></script>
    <script src=”https://game-lib.leonyoung.repl.co/SimpleScene.js”></script>
    <script src=”Scene1.js”></script>
    <script src=”Scene2.js”></script>
    <script src=”main.js”></script>

aitayemi@aitayemi-mac scavenger % vi src/index.html 

aitayemi@aitayemi-mac scavenger % vi src/index.html
aitayemi@aitayemi-mac scavenger % 
aitayemi@aitayemi-mac scavenger % grep script src/index.html
    <script src=”assets/phaser.min.js”></script>
    <script src=”assets/helper.js”></script>
    <script src=”assets/addons.js”></script>
    <script src=”assets/GridLayout.js”></script>
    <script src=”assets/SimpleScene.js”></script>
    <script src=”assets/Scene1.js”></script>
    <script src=”assets/Scene2.js”></script>
    <script src=”assets/main.js”></script>
aitayemi@aitayemi-mac scavenger %

————- ADD  <base href=”/”>  to the index.html so that all the referenced files can be located
aitayemi@aitayemi-mac scavenger % grep -B1 “</head>” src/index.html
    <base href=”/”>
  </head>

aitayemi@aitayemi-mac scavenger %


————- RUN the game with either ionic or ng. (“npm run build” creates the “www” sub-directory).
aitayemi@aitayemi-mac scavenger % ionic serve –external
aitayemi@aitayemi-mac scavenger % npm run build
aitayemi@aitayemi-mac scavenger % ng serve

———— ACCESS the game using a web browser with either the loopback interface or the IP address of the system running the ionic environment e.g., http://<ip-address>:<port>/ )

————————————- END OF GAME PORT ——————————————————

————————————————————————————————————————–

—————– OPTIONAL SECTION BELOW – BUILD GAME FOR ANDROID/IOS ————–

—— Install Android studio: https://vitux.com/how-to-install-android-studio-on-centos/ and https://developer.android.com/studio/install
[opc@phaser ~]$ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
[opc@phaser ~]$ sudo yum install -y java-1.8.0-openjdk

— for Mac OSX, download JAVA from https://java.com/en/download/ (e.g., jre-8u311-macosx-x64.dmg) and install it

—- Download Android Studio from https://developer.android/com/studio (e.g., android-studio-2020.3.1.25-mac.dmg for MAC OSX)
[opc@phaser ~]$ tar xf android-studio-2020.3.1.25-linux.tar.gz
[opc@phaser ~]$ cd android-studio/bin/

—- RUN the Android Studio installer from a X-session such as MobaXterm and follow the prompts in the GUI wizard installer to complete the install:
[opc@phaser android-studio]$ ./studio.sh

—- INSTALL Cocoapods and (full) Xcode Developer Tools (from App Store)  – both are required to add “ios” to the project (one-time installation task for both). You need to accept the Xcode license after installation. Either launch the IDE and accept the license when prompted, or run “sudo xcodebuild -license” from Terminal session).

aitayemi@aitayemi-mac scavenger % sudo gem install cocoapods       (see https://guides.cocoapods.org/using/getting-started.html#installation to install it only for a specific user, instead of “globally”)

aitayemi@aitayemi-mac scavenger % xcode-select install

———– OPTIONALLY ADD Android & iOS application support/code – you need to install the necessary libraries/tools so the iOS support will only work on a MAC —————————-
aitayemi@aitayemi-mac my-game % export CAPACITOR_ANDROID_STUDIO_PATH=/home/opc/android-studio/bin/studio.sh

— installing locally for this project only as opposed to globally or linking the globally-installed packages to this project. Installing locally to the project only ensures that the correct versions of packages this project requires are installed in the project.
aitayemi@aitayemi-mac scavenger % npm install @capacitor/cli @capacitor/core
aitayemi@aitayemi-mac scavenger % npm audit fix
aitayemi@aitayemi-mac scavenger % npm install @capacitor/android
aitayemi@aitayemi-mac scavenger % npm audit fix
aitayemi@aitayemi-mac scavenger % npm install @capacitor/ios
aitayemi@aitayemi-mac scavenger % npm audit fix
aitayemi@aitayemi-mac scavenger % ionic cap add android
aitayemi@aitayemi-mac scavenger % npx cap add android
aitayemi@aitayemi-mac scavenger % ng build
aitayemi@aitayemi-mac scavenger % ionic cap add ios
aitayemi@aitayemi-mac scavenger % npx cap add ios
aitayemi@aitayemi-mac scavenger % ng build

—- IN ORDER to build the Android version of the game code, you can either:
   (1) launch Android Studio from the MAC OSX Lauchpad, then select “File -> Open” menu in the Android Studio IDE, and select the top-level folder of the project (e.g., my-game), then select the “android” sub-folder, then the “open” button to open the project, OR
   (2) setup the CAPACITOR_ANDROID_STUDIO_PATH to point to the Android Studio executable so that the “ionic cap open android” command can launch the Android Studio IDE. On Linux, execute the “ionic” command from an X-session such as MobaXterm. On MAC OSX, launch the Android Studio IDE from the Launchpad, and then select the menu option “Tools -> Create Command-line Launcher…” to generate a terminal-executable file as /usr/local/bin/studio which you can then set as the value of the CAPACITOR_ANDROID_STUDIO_PATH variable. 
aitayemi@aitayemi-mac scavenger % export CAPACITOR_ANDROID_STUDIO_PATH=/home/opc/android-studio/bin/studio.sh
aitayemi@aitayemi-mac scavenger % export CAPACITOR_ANDROID_STUDIO_PATH=usr/local/bin/studio

NOTE: an alternate setup on an OCI instance (with no physical video card) couldn’t launch the emulator. I see “Starting AVD…” at the bottom right of the IDE but the emulator (device) never shows up. I think this is due to the lack of a video card on the instance.

NOTE: Open “Tools -> SDK Manager” from the Android Studio IDE menu, select/check “Android 11.0 (R)” under the “SDK Platforms’ tab. This line shows 30 under the “API Level” column and and that corresponds to the line “targetSdkVersion = 30” in the my-game/android/variables.gradle file. Android Studio will ask you to confirm the download of the SDK (click OK), then follow the installation wizard prompts to complete the installation (without this step, you will get a “module not specified” error and won’t be able to compile or run the project. You may also see a message concerning failed gradle sync at the bottom of the interface. Without this step, you may not be able to build the project (especially if it depends on the “Android 11.0 (R)” SDK.

— IF you don’t have a real/physical Android device connected, then use the “AVD Manager” (“Tools -> AVD Manager” menu option) to create a suitable emulated (Emulator) device

NOTE: I couldn’t build the native apps successfully in Android Studio or X-code if I use “ionic cap add android/ios” instead of “npx cap add android/ios”

NOTE:  if you are using NPM/NPX as opposed to ionic, see my other note for similar commands: https://confluence.oraclecorp.com/confluence/display/~ayotunde.itayemi@oracle.com/Phaser3+and+IONIC+on+NodeJS%3A+Game+Development

—- IN ORDER to build the iOS version of the game code, either run “npx cap open ios” from the project top-level folder, OR launch Xcode, then  open the project by selecting the App sub-folder  e.g., ~/scavenger/ios/App). Once the project is loaded, click on the top-level “App” in the “tree’ to the left of the IDE, then click on “Signing & Capabilities” tab in the main section of the IDE, you will need to select your team (you have to login to your iCloud account then select an existing team or create a new one – Xcode will popup the wizard), then also update your “Bundle Identifier” accordingly. Mine is “com.itayemi”. The default of “io.ionic.starter” or “org.cocoapods.Capacitor” will cause the project build to fail since it does not exist in your iCloud config by default). 
aitayemi@aitayemi-mac scavenger % export LANG=en_US.UTF-8
aitayemi@aitayemi-mac scavenger % ionic cap open ios
aitayemi@aitayemi-mac scavenger % npx cap open ios

NOTE: enable “Developer Mode” (and then under it, enable “USB Debugging”) on your real/physical Android device (“Settings” -> “About Phone” -> tap 5 times on the “build number” field to enable “Developer Mode”).
If your physical Android device doesn’t automatically appear in the available devices list in the Android Studio IDE after you connect it via your USB cable, you can click the “devices” drop down and select “Troubleshoot Device Connections” which gives you a “Rescan devices” button. My test android device had some issue with its power port so I have to wiggle the cable a little to get Android Studio to detect it)

References:

https://www.cyberithub.com/install-ionic-framework-in-linux-rhel-centos/
https://gamedevacademy.org/creating-mobile-games-with-phaser-3-and-cordova/
https://medium.com/swlh/easy-peasy-setup-of-a-phaser-3-project-with-ionic-fb4f4dc01625
https://www.tomspencer.dev/blog/2017/05/29/a-guide-to-installing-cordova-on-your-mac/
https://cordova.apache.org/docs/en/10.x/guide/platforms/osx/
https://ccoenraets.github.io/cordova-tutorial/create-cordova-project.html
https://ionicframework.com/docs/v1/guide/installation.html
https://github.com/nodejs/help/wiki/Installation
https://medium.com/enappd/how-to-create-mobile-games-pwa-with-ionic4-and-phaser-7fb1e917678e
https://vitux.com/how-to-install-android-studio-on-centos/ and https://developer.android.com/studio/install
https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
https://phaser.io/phaser3/gettingstarted
https://www.joshmorony.com/create-native-html5-games-with-phaser-and-capacitor/
https://github.com/joshuamorony/phaser3-typescript-webpack-capacitor.git
https://guides.cocoapods.org/using/getting-started.html#installation
https://github.com/ourcade/phaser3-ionic-example
https://wpbeaches.com/installing-node-js-on-macos-big-sur-and-earlier-macos-versions/
https://www.knowledgehut.com/blog/web-development/install-angular-on-macos
https://www.zeolearn.com/magazine/setup-angular-mac
https://vuedose.tips/build-a-game-in-vuejs-with-phaser
https://www.freecodecamp.org/news/how-to-build-a-simple-game-in-the-browser-with-phaser-3-and-typescript-bdc94719135/
https://ionicframework.com/docs/cli/commands/serve

Converting WMA/MP3 and SWF/MP4 using FFMPEG

Using Apple MAC OSX to convert WMA to MP3

  • in terminal app, install brew, run: ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” < /dev/null 2> /dev/null
  • in terminal app, run “brew install ffmpeg”
  • then you can run a command such as “ffmpeg -i input.wma -q:a 0 output.mp3” to convert a file called input.wma to output.mp3
  • if you have all the WMA files in the same directory/folder, you can create a script that will convert them all in one go
  • save the 6 lines below into a text file in the same directory as the WMA files e.g., called the file my_converter
  • make the script executable with the command “chmod 700 my_converter”
  • run the script with the command “./my_converter” (without the double-quotes)
  • you can change the 128k to something like 192k or smaller/bigger depending on the quality you want to MP3 to have
  • the 44100 frequency can also be increased to something like 48000 if you want
  • Below is the script (assumes all the source files are in the same directory)

#!/bin/bash
echo WMA to mp3 converter! Work begins!
for FILE in *.wma; do
echo -e “Processing file ‘$FILE'”;
ffmpeg -i “${FILE}” -vn -ab 128k -ar 44100 -y “${FILE%.wma}.mp3”;
done;

Convert Flash SWF to MP4 using Linux

– Install ffmpeg (CentOS 7)
$ sudo yum install epel-release
$ sudo yum localinstall –nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
$ sudo yum install ffmpeg ffmpeg-devel

– Below is the script (assumes all the source files are in the same directory)

#!/bin/bash
echo SWF to MP4 converter! Work begins!
for FILE in *.swf; do
echo -e “Processing file ‘$FILE'”;
ffmpeg -i “${FILE}” “${FILE}.mp4”;
done;

NOTE: the conversion didn’t work out.

– Then I found some reference to using SWFtools and Gnash

git clone git://git.sv.gnu.org/gnash.git
sudo yum install -y agg-devel boost-devel SDL-devel GConf2-devel expat expat-devel libjpeg-devel speex-devel fontconfig-devel giflib-devel dejagnu curl-devel haxe

cd gnash/
/autogen.sh
./configure –enable-renderer=agg –enable-gui=dump –disable-menus –enable-media=ffmpeg –disable-jemalloc
make
sudo make install

NOTE: the conversions didn’t work properly, but old Firefox versions such as 47 can play the flash files. You can find Firefox 47 portable with flash on the Internet.
Just download it, run it, and choose “File -> Open File …” from the Firefox menu (ALT+F) and select the flash file
do not use this browser for regular browsing since it is hold and likely hackable 🙂

The Elfin Princess

Into the same tavern walked the elfin princess;
Wielder of magic;
Third in line to the throne of Frigga;
Here as an ambassador of peace

From her very lips I heard she suffered a loss
Her head still held high and her back straight
But from time to time you see the pain fleet across her face
Under her hoodie and her hair, are ears that hear a butterfly flap its wings a mile away

I have been asked the color of her eyes
I do not know for I fear to look too closely
I might look too deep or too long and be lost forever

Alcohol affects not one of her race
She can down a stein just as well as a thousand
But for mere mortals sake, a cup or two would do

What lives in her little purse?
A potion?
An elixir?
An army?  
A bow?
Some arrows?
A portal?

She’s fine of form and stature
Be not deceived,
Her strength is neither in her arms nor legs
With her mind, she will make you kneel

Her magic attracts all and sundry:
It makes the flowers grow;
The heart light;
The grass green;
The heavens weep on the farmer’s crops 

Her name is Jayde;
Princess Jayde;
Elfin princess;
Wielder of magic;
Third in line to the throne of Frigga;
Here as an ambassador of peace 

For Latara … 2021



2 Corinthians 4:16-18: “So we do not lose heart. Though our outer self is wasting away, our inner self is being renewed day by day. For this light momentary affliction is preparing for us an eternal weight of glory beyond all comparison, as we look not to the things that are seen but to the things that are unseen. For the things that are seen are transient, but the things that are unseen are eternal.”

Make me laugh

How or where do I start? If I have a dollar for every lady’s dating profile I have come across where the condition that takes pride of place is “make me laugh”, I would be a millionaire. Yes, I do a lot of “swiping”. I am told it’s a game of numbers. 

I was chatting with a friend one day, and she started laughing because I just had my thumb swiping right without looking at the screen. If I do match with someone I am not interested in, I could always “unmatch”. Of course, there have been some cringe-worthy moments when (even though my profile is configured as “interested in women” only) I find myself matched with a guy. Those are the times I swiftly find the unmatch button! I am not homophobic, but I am only interested in women. Most of these occurrences are with either Bi or gay guys who have probably set their profile to match both sexes or just guys. 

Back to the subject, the following is my opinion at the time of writing this piece and I reserve the right to change it at any time. 

I think it is time women realize the simple requirement of “make me laugh” is likely a huge contributing factor to the proliferation of single baby mamas. Lots of guys have the skill to laugh all the way into your pants, and laugh all the way out, leaving you with a baby to raise by yourself while chasing them around for child support. 

I know a lady under 30 with five kids (not all the same father) who’s still look for a “good man to make her laugh”. You would think after 5 kids, it would be clear to her that the “make me laugh” kitsch is not “working” for her.  Maybe she needs someone to hit her over the head with a dirty diaper.

Yes, lots of guys who will “make you laugh” have no sense of responsibility for anything other than themselves – some don’t even have that. The scales only fall from your eyes when it’s too late – when there’s one or more kids involved. Then with some, the abuse starts, and the lady is wondering why the guy changed. No, he didn’t change. Your primary requirement was “make me laugh” and that’s easy when the only responsibility was still to take you out to dinner, parties, clubs, exploring. 

I watch a lot of true crime shows, and it’s no longer surprising to me the number of women killed by their partners (compare 62% of women killed by their partners who are mostly men to just 5% of men killed by their partners who are mostly women). It’s a vicious circle. Single baby mamas raise these boys with no father figures to teach them how to be a man and have respect for themselves and others. All the learning they have done is from their peers and the neighborhood older “bad” boys with no discernible direction in life beyond making the next quick buck. Who would have made several trips to jail by the time they are out of their teenage years and it’s all downhill from there. They in turn produce single baby mamas and the cycle continues. Producing these boys and men who won’t or can’t take no. The famous cliche “if I can’t have you, then no one else” repeats itself over and over again. 

You are in your early twenties and already saddled with a kid or more. No, it’s not because you or the other party changed. It’s because you were too young; it’s because you didn’t see beyond the “make me laugh”, it’s because you didn’t see beyond the exciting trips and partying when it was just the two of you; it’s because you think you are “grown” at 18; it’s because you got your first car at 16 making you believe you are independent and mature; it’s because you made your “own money” from working part-time at some eatery. It’s because you started dating at 14. It’s because some parents and guardians that should know better, in the name of equality, believe that if boys can run wild, they can let girls do to. But boys don’t get pregnant. Boys don’t carry a living being in their bellies for 9 months, so it’s easy for them not to have an attachment to the little screaming bundle that keeps you up at night. **

Women need to be taught to have a higher standard than “make me laugh.”

Of course, I may just be bitter that I am single because I can’t make anyone laugh.

– – – – – – – – – – – – – – – – – – – Finito – – – – – – – – – – – – – – – – – – – –

** I am simplifying the scope of the problem of course. Other factors such as abuse, trauma, drugs, etc also come into play. 

Building Microsoft CBL-Mariner (Linux) ISO

NOTE: I was able to build the ISO on Ubuntu 20.04 as the work platform (I got lots of errors with Ubuntu 18.04)

The only guide that worked for me is: https://www.techrepublic.com/article/microsoft-linux-is-not-what-you-think-or-hoped-it-would-be/ but I made some changes to the procedure (i.e., I built CBL-Mariner instead of CBL-MarinerDemo)

root@ub2004:/wip# add-apt-repository ppa:longsleep/golang-backports
root@ub2004:/wip# apt-get update
root@ub2004:/wip# apt -y install -y make tar wget curl rpm qemu-utils golang-1.15-go genisoimage python-minimal bison gawk
root@ub2004:/wip# apt -y install pigz
root@ub2004:/wip# ln -vsf /usr/lib/go-1.15/bin/go /usr/bin/go
root@ub2004:/wip# curl -fsSL https://get.docker.com -o get-docker.sh
root@ub2004:/wip# sh get-docker.sh
root@ub2004:/wip# usermod -aG docker $USER

root@ub2004:/wip# git clone https://github.com/microsoft/CBL-Mariner.git
root@ub2004:/wip# pushd CBL-Mariner/toolkit
root@ub2004:/wip/CBL-Mariner/toolkit# git checkout 1.0-stable
root@ub2004:/wip/CBL-Mariner/toolkit# make package-toolkit REBUILD_TOOLS=y
root@ub2004:/wip/CBL-Mariner/toolkit# cd ..
root@ub2004:/wip/CBL-Mariner# cp out/toolkit-1.0.20210722.0141-x86_64.tar.gz .
root@ub2004:/wip/CBL-Mariner# tar -xzvf toolkit-*.tar.gz
root@ub2004:/wip/CBL-Mariner# cd toolkit/
root@ub2004:/wip/CBL-Mariner/toolkit# make iso REBUILD_TOOLS=y REBUILD_PACKAGES=n CONFIG_FILE=./imageconfigs/full.json

root@ub2004:/wip/CBL-Mariner/toolkit# du -sh /wip/CBL-Mariner/out/images/full/full-1.0.20210722.0200.iso

678M /wip/CBL-Mariner/out/images/full/full-1.0.20210722.0200.iso

I was able to install the ISO on VirtualBox.

You can follow the steps on this page to install the output ISO on VirtualBox: https://linuxiac.com/microsoft-cbl-mariner-linux-1/

VMWare OVFTools required to build OVA CBL-mariner images (VHDX, OVA/VMDK)

– download 64-bit Linux VMWare-tools from https://my.vmware.com/group/vmware/downloads/details?downloadGroup=OVFTOOL441&productId=646
# chmod a+x VMware-ovftool-4.4.1-16812187-lin.x86_64.bundle
# ./VMware-ovftool-4.4.1-16812187-lin.x86_64.bundle
(NOTE: “./VMware-ovftool-4.4.1-16812187-lin.x86_64.bundle –uninstall-product vmware-ovftool” to uninstall)

– # make image REBUILD_TOOLS=y REBUILD_PACKAGES=n CONFIG_FILE=./imageconfigs/core-ova.json
(builds OVA, VMDK, and VMX files in CBL-Mariner/out/images/ )


– # make image REBUILD_TOOLS=y REBUILD_PACKAGES=n CONFIG_FILE=./imageconfigs/core-efi.json
(builds a 381MB VHDX file in CBL-Mariner/out/images/core-efi/ )

NOTE: in the VMDK file, the password field for the root user in the /etc/shadow file is set to <NULL>. Which meant that after creating a VM with the VMDK, I couldn’t login after I booted up the CBL-Mariner. I had to slave the VMDK to another VM, in order to manually change the <NULL> to the encrypted value of a known password. Alternatively, you can use the VMware disk tool to mount the VMDK after generating it on the Ubuntu instance, and edited the /etc/shadow file. On the other hand, the username and password for the CBLMarinerDemo is mariner_user  and p@ssw0rd

Thou shalt know thy neighbors

No, I do not mean camping outside their house or becoming a nuisance. But go out of your way if necessary to say hello regularly. 

To the subject of this article, I was reading about a recent incident where a lady was attacked in her house (by an ex or so) and she made it out, and all the way to a neighbor’s house where she screamed and knocked on the door around 3am or so. 

The neighbor heard the scream, turned over, and went back to sleep. 

In the morning he discovered blood streaks on his door. The attacker apparently trailed the lady and dragged her back to her house and finished the job. 

From the neighbor’s comment you can sense he was a little sad he didn’t get up, but from the way he referred to the lady, I wouldn’t even suggest they were acquaintances. 

Now, this is all conjecture after the fact so we can never be sure of what difference it would have made if any to the subsequent events that took place. But it is possible the neighbor heard the scream, and his brain subconsciously goes something like: (1) no one is breaking into my house, (2) I didn’t hear my name, (3) I don’t really know anyone in this neighborhood, (4) it’s not my business, (5) go back to sleep. 

Now consider the difference it might have made if for example the victim had regularly greeted this neighbor (at a minimum), or gone a step further and had known the neighbor’s name, and instead of just screaming, had screamed the neighbor’s actual name out in her distress.  The neighbor’s brain might instead have gone: (1) no one is breaking into my house, (2) was that my name I heard? (3) sounds like that lady a few houses down the street that always says hello, (4) I better get up and make sure she’s not in trouble. 

So yes, we have the extreme at one end where neighbors become busybodies, and the other extreme where even though we are just yards apart we might as well have been on different continents. We need to find a middle ground. The typical African and possibly other cultures (which for some reason appears to have a correlation with third world nations) almost never have a neighbor who is a stranger. Whereas the independence (and huge personal space) that an affluent lifestyle associated with first world nations have over time created the opposite – strangers that may have dwelled next to each other for years or decades. 

I am also guilty of the same thing. I have new neighbors on two sides. To the neighbors at the back, I did say hi once, to which they responded but it didn’t go beyond that. I do not know their names. On one side is a new Hispanic family to which I do not even believe we have ever exchanged greetings. Part of the reason of course is that we all literally arrive at home and disappear inside our various houses. 

This lack of connection does not bode well for a neighbor getting into trouble and expecting some help from those around. Yes, people will call the police if the disturbance is obvious or loud enough, but in general refuse to really “engage”. They may step out when the neighborhood is flooded in “blue” with their lights flashing, but usually by then the damage is already done, whereas maybe even a neighbor putting on their floodlights and stepping outside during the incident itself (not saying they put themselves in danger) may cause an attacker to cease long enough to make a difference to the outcome. 

Ultimately, lack of familiarity makes our response impersonal. We literally fail to respond, or do the minimum possible. I always try to imagine when driving if someone cuts me off for example, that the person is an acquaintance at a minimum. That literally prevents me from having any angry thoughts that might escalate to road rage. For example, say you recognize the car, what are you likely to do? You might smile, pull level with the other car, wind down your window, get their attention, and say something like “you clown! You just cut me off!” with a smile on your face and in your voice. To which the other party (also recognizing you) might respond with a smile and a wave acknowledging you in return. Even on a bad day where you are completely frustrated, you would still likely not react angrily if you recognize the other car. In fact it may completely change your mood for the better. 

But when we have no personal connection with another party, our default response is nonchalance at a minimum, suspicious, or aggressive at the other end of the scale. 

It also makes me wonder what difference it might have made to some of the suicide cases in the news regularly. Take some of the well-known celebrities that have committed suicide. They seem happy, have many friends, have every material thing their heart desires, appear well adjusted, then their suicide seems to happen out of the blues. Now I am not talking of the celebrity friends they have, that they only meet on the red carpet or at exclusive parties; nor the celebrity friends living in the same zip code each behind their 10-foot electrified-fence mansions (nothing wrong with having a mansion), but instead say they have a run-of-the-mill neighbor (who would also be rich but not necessarily a celebrity) who says a genuine hello from time to time. Maybe the person with suicidal tendencies may have come across the neighbor on the faithful day and that “hello” might be all it takes to make a difference. 

So make some effort to know your neighbors. Respect their privacy of course. The line maybe subtle but a greeting here and there hurts no one. An invitation to a house party or a kid’s birthday party (if they also have children) may taw the ice or foster some familiarity or help know where that line is where the neighbor is comfortable interacting over. For example, if they appear uninterested or gruff, don’t take it personal, still say hello wherever your paths cross. You can never be sure what difference you might be making in their lives as well as yours. 

7:30pm Hogle Zoo, SLC, Utah. 

Timeout with the Raspberry Pi 2

There is a website called EstateSales ( https://estatesales.org/ ) where you can bid for all sorts of stuff (new, used, etc.) and I believe they have a presence in most US states if not the larger cities.

I bidded on a Raspberry Pi 2 (status not tested) and got it for $2. If I add the gas to drive to the pickup location and back, maybe the total would come to about $8. I then bought a USB WiFi card for $4 on Ebay since the Pi 2 does not come with a WiFi inbuilt chip on the board.

Below are my notes from the “experience”:

– – – – This section is only if you can’t get the Pi on the network via its Ethernet interface – – –

– My first issue was that the Pi came with a HDMI port for which I didn’t have the cable, but fortunately my German friend left a Monitor with a VGA-to-HDMI cable attached. I connected it to the Pi as well as a USB keyboard and powered the Pi using its USB port connected to a USB port on my desktop PC.

– Second issue was that I didn’t know the password of the pi user since it was pre-owned so I had to intercept the boot process (the splash screen says to press the SHIFT key), append “init=/bin/bash” to the “kernel” line, and then issue a “mount -o rw,remount /” followed by a password reset for the pi and root users.
– – – – – – – – – – – – – – – – – – – – – –

– Connect through a console (HDMI Monitor and USB keyboard). If you decide not to get a WiFi card and you don’t want to attach the Pi via an Ethernet cable to your router, you can do the following to get access to the Pi from a Windows PC that you have connected to it via its Ethernet port (I couldn’t get it to access the Internet via ICS for some reason).
– Set ethernet interface eth0 to dhcp in /etc/network/interfaces
– Connect it to a Windows PC via an ethernet cable
– Configure ICS on say the WIFI interface of the Windows PC with the Ethernet as the “home network” (ICS then pops-up the message that it will assign 192.168.137.1 to the Ethernet interface on the PC)
– Run “arp -a” on the Windows PC and look for all IPs in the 192.168.137.x (one of them will be the IP assigned to the raspberry by ICS)
– The interface on this specific Pi has the MAC address b8-27-eb-90-b3-30 which is also visible in the “arp -a” output
– SSH to the Pi IP address and login with the root or pi user

– NOTE: ping the broadcast IP of the IP address assigned to the Windows Ethernet interface may help get the MAC/IP assigned to the Raspberry Pi to show up in the output of the “arp -a” command e.g., “ping 192.168.137.255”

– NOTE: if you can’t get the Pi to be assigned an IP address via ICS, do the following:

  1. Make sure ICS service is running on the Windows PC (restart it if necessary)
  2. Disable ICS on the NIC that is being shared via ICS (e.g., the WiFi NIC) then re-enable ICS

NOTE: watch out for the SD card on which the O/S is installed. It is very easy to eject it without noticing – if you are on the console, you will see it start to display “read errors” on the SD card and essentially stops working. If you are just attempting to boot up the Pi, it won’t boot at all since the O/S is on the SD card.

Issue three: The much older kernel on the Pi (I think it was 3.18 from year 2016) did not have drivers for the Ralink WiFi (USB) card I got off E-Bay. I was able to upgrade the O/S to a 4.19 kernel, but later decided I would just install a completely new Pi distribution by using the https://www.raspberrypi.org/software/ Windows Raspberry Pi Imager (there is a version for Ubuntu as well). The Imager prompts to select a O/S distro/version and the target Storage (I inserted the SD card into my Windows laptop using a Micro SD Adapter) and it will then download the selected image and (over)write it to the the SD card so backup its contents first if you need them.
The latest version as at 05/26/2021 is the 1.1GB Raspberry Pi OS (32-bit) released 2021-03-04 (includes the Pi Desktop).
There is also a 0.4GB Raspberry Pi OS Lite (32-bit) with no desktop environment released on the same date (2021-03-04)

– In order to access the instance via SSH, you need to enable the SSH service first:
sudo systemctl enable ssh
sudo systemctl start ssh

– I decided to configure the Pi to boot into multi-user mode (CLI with network services) instead of graphical mode which will consume more system resources:
sudo systemctl set-default multi-user


My particular Ralink WiFI USB card had the MAC address 00:E0:2D:90:70:34
Sample network interface file content: https://gist.github.com/spikeheap/7857064

– Configure the WiFI network you intend the system to join in the file /etc/wpa_supplicant/wpa_supplicant.conf :

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US

network={
ssid=”IA”
psk=”my-Super-Password”
}

– Configure the network interfaces in the file /etc/network/interfaces

source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

alow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

auto eth0
iface eth0 inet dhcp

– Reconfigure the WiFI start the card:
sudo wpa_cli -i wlan0 reconfigure
sudo ifdown wlan0
sudo ifup wlan0

– Restart the networking service if necessary:
sudo systemctl restart networking

– Troubleshooting: To scan and check WiFI networks, use the command “sudo iwlist wlan0 scan” and check the essid field. This field should be the same as what you entered in the ssid field in the /etc/wpa_supplicant/wpa_supplicant.conf file .

root@raspberrypi:~# lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
Bus 001 Device 005: ID 0bda:c811 Realtek Semiconductor Corp. <—- needs drivers
Bus 001 Device 006: ID 148f:7601 Ralink Technology, Corp. <—- supported out of the box by the 2021-03-04 distro


Just for fun: I also had a Realtek WiFi USB card as well that is normally connected to my Windows Desktop PC so I can avoid using an Ethernet cable to connect it to the Internet router which is somewhere else in the house. You can see it is detected from the output of the “lsusb” command above but the Pi OS did not have in-built drivers for it. You can install the drivers as follows:

sudo wget http://downloads.fars-robotics.net/wifi-drivers/install-wifi -O /usr/bin/install-wifi
sudo chmod +x /usr/bin/install-wifi
sudo /usr/bin/install-wifi
(this script detects the card, downloads and install the appropriate driver and configures the card. In this case, it downloaded the driver file 8821cu-5.10.17-1403.tar.gz)

– Some Links

http://downloads.fars-robotics.net/ (lots of commands related to setting up networking on the Pi)
http://downloads.fars-robotics.net/wifi-drivers/ (drivers for Realtek cards)
https://www.raspberrypi.org/forums/viewtopic.php?p=1133815#p1133815 (where I got the reference to the install-wifi script)

Pi 2 with the WiFI USB card

Using Let’s encrypt SSL certificates

Letsencrypt certificates are only valid for 90 days so you have to continually renew them.

– Install letsencrypt (certbot)
# sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# sudo yum install -y letsencrypt

- Generate initial certificate for the domain interactively
# certbot certonly -d 'itayemi.com,*.itayemi.com' --manual

————- output truncated by me ——————-

Please deploy a DNS TXT record under the name
_acme-challenge.itayemi.com with the following value:

w8zN-xGQjCtT8kEOkA-Wt3INaRLZzWmRBXwDnBoEoHs

( – done in cPanel cosole for domain itayemi.com, then press ENTER to continue the certbot setup )
————- output truncated by me ——————-

Create a file containing just this data:

s8yfXSlTZXiFJNR_pd-jKfxJQ06StoCJFSGxDy5oBCM.vrNHNIC3FVyuv2kJU8JcnmZK_lfarmjV_FDWrtWY1wc

And make it available on your web server at this URL:

http://itayemi.com/.well-known/acme-challenge/s8yfXSlTZXiFJNR_pd-jKfxJQ06StoCJFSGxDy5oBCM

( – done in cPanel cosole for domain itayemi.com, then press ENTER to continue the certbot setup )
————- output truncated by me ——————-

————- Summary output at the end of the certbot certification creation command ———–

  • Congratulations! Your certificate and chain have been saved at:
    /etc/letsencrypt/live/itayemi.com/fullchain.pem
    Your key file has been saved at:
    /etc/letsencrypt/live/itayemi.com/privkey.pem
    Your certificate will expire on 2022-03-07. To obtain a new or
    tweaked version of this certificate in the future, simply run
    certbot again. To non-interactively renew all of your
    certificates, run “certbot renew”

————— End of initial certificate creation for itayemi.com ———–

————— Setting up auto-renewal (doesn’t work) ——————————————

# sudo crontab -e
# sudo crontab -l
# auto renewal for itayemi.com certificate created initially on 12/7/2021
45 2 5 3,6,9,12 * /bin/certbot renew

—————- INSTALLING the letsencrypt certificate in cPanel ————
(repeat every 3 months when the certificate is about to expire. start by generating a new certificate using the “certbot certonly …” command above)
– Copy out the updated files (generated by the “certbot renew” cron job) /etc/letsencrypt/live/itayemi.com/cert.pem and /etc/letsencrypt/live/itayemi.com/privkey.pem from the local server
– Login to hihostnow.com.ng (Client Area) -> Select “Services” -> “My Services” from the menu
– Click on the “Status” button to the right of the target service e.g., itayemi.com
– Expand the “Actions” menu (left-side of page) and click on “Login to cPanel”
– In itayemi.com cPanel, select “SSL/TLS” (under the “Security” section)
– Select “INSTALL AND MANAGE SSL FOR YOUR SITE (HTTPS) – Manage SSL sites”
– For each listed FQDNs/certificate row, select the “Update Certificate” link under the “Actions” column; populate the “Certificate: (CRT)” textbox with the content of the file /etc/letsencrypt/live/itayemi.com/cert.pem on the Linux system, and populate the “Private Key (KEY)” field with the content of the file /etc/letsencrypt/live/itayemi.com/privkey.pem, then click the “Install Certificate” button.