<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[FMS Devel]]></title><description><![CDATA[Emulators, programming and more...]]></description><link>https://fmsdevel.wisecoding.es/</link><image><url>https://fmsdevel.wisecoding.es/favicon.png</url><title>FMS Devel</title><link>https://fmsdevel.wisecoding.es/</link></image><generator>Ghost 4.32</generator><lastBuildDate>Thu, 23 Apr 2026 05:36:32 GMT</lastBuildDate><atom:link href="https://fmsdevel.wisecoding.es/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[NVidia Linux Drivers - Corruption after resume]]></title><description><![CDATA[<p>Recently I&apos;ve been moving my gaming rig from Windows 10 to Linux. After seeing how well everything works in the Steam Deck, I would prefer to be out of Windows as much as possible.</p><p>After preparing everything (I use Ubuntu 20.04 LTS as my Linux OS) and</p>]]></description><link>https://fmsdevel.wisecoding.es/nvidia-linux-drivers-corruption-after-resume/</link><guid isPermaLink="false">65a280dfca31f500019cb60b</guid><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Sat, 13 Jan 2024 12:51:58 GMT</pubDate><media:content url="https://fmsdevel.wisecoding.es/content/images/2024/01/NvidiaDriversSteam-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://fmsdevel.wisecoding.es/content/images/2024/01/NvidiaDriversSteam-1.png" alt="NVidia Linux Drivers - Corruption after resume"><p>Recently I&apos;ve been moving my gaming rig from Windows 10 to Linux. After seeing how well everything works in the Steam Deck, I would prefer to be out of Windows as much as possible.</p><p>After preparing everything (I use Ubuntu 20.04 LTS as my Linux OS) and installing the latest Nvidia Graphics, I set up Steam and started playing my actual games (I&apos;m pretty &quot;busy&quot; with Diablo IV) and everything went really fine.</p><p>But, one little issue appeared, after putting the computer in standby (suspend to ram) and resuming, the Steam UI did not work and hanged. I had to kill it and restart it.</p><p>The problem had to do with activating Steam UI Hardware Acceleration, that I had to enable because if not, the UI was really laggy.</p><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2024/01/Screenshot-from-2024-01-13-13-31-24.png" class="kg-image" alt="NVidia Linux Drivers - Corruption after resume" loading="lazy" width="634" height="96"></figure><p>If I disabled those options, Steam UI was working properly after resuming from STR.</p><p>After asome digging, I found out a post in the <a href="https://steamcommunity.com/groups/SteamClientBeta/discussions/0/3267933887521680505/">Steam Community Forums</a> that fixed the problem and I wanted to resume here the steps that worked for me.</p><p>1- Enable NVidia Suspend Service</p><!--kg-card-begin: markdown--><pre><code>sudo systemctl enable nvidia-suspend.service
</code></pre>
<!--kg-card-end: markdown--><p>2- Prepare a folder where the driver will store graphics memory. We want this to be into a ramdisk to optimize the suspend time. In my case, /tmp is not a ramdisk and it is stored in the root FS and because of that, I created a folder and configured fstab to mount it on restart:</p><!--kg-card-begin: markdown--><pre><code>sudo mkdir /tmp/nvidia-tmpfs
sudo vi /etc/fstab
</code></pre>
<p>Append to the file this line (and save it):</p>
<pre><code>tmpfs /tmp/nvidia-tmpfs tmpfs defaults 0 0
</code></pre>
<!--kg-card-end: markdown--><p>3- Create a module config for NVidia driver to use the temporary folder when computer is going STR:</p><!--kg-card-begin: markdown--><pre><code>sudo vi /etc/modprobe.d/nvidia-power-management.conf
</code></pre>
<p>And add this line to the file:</p>
<pre><code>options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=/tmp/nvidia-tmpfs
</code></pre>
<p>This line will tell the driver to enable the Video Memory storage to file when going STR</p>
<!--kg-card-end: markdown--><p>4- We need to update initramfs to include the module configuration:</p><!--kg-card-begin: markdown--><pre><code>sudo update-initramfs -u
</code></pre>
<!--kg-card-end: markdown--><p>5- Reboot to enable these changes.</p><p></p><p>After the computer being rebooted, you can check if driver is properly configured to handle STR correctly with theses command and their expected response:</p><!--kg-card-begin: markdown--><pre><code>$ grep -i pres /proc/driver/nvidia/params
PreserveVideoMemoryAllocations: 1

$ grep -i temp /proc/driver/nvidia/params
TemporaryFilePath: &quot;/tmp/nvidia-tmpfs&quot;
</code></pre>
<!--kg-card-end: markdown--><p>If you see &quot;1&quot; for PreserveVideoMemoryAllocations, you are fine (a 0 will be a bad thing) and in the TemporaryFilePath you should see the path we setup prevously.</p><p>One last check would be ensuring the folder we created previously for storing video ram is indeed a tmpfs, you can check this with this command:</p><!--kg-card-begin: markdown--><pre><code>$ df /tmp/nvidia-tmpfs/
Filesystem     1K-blocks  Used Available Use% Mounted on
tmpfs            8158628     0   8158628   0% /tmp/nvidia-tmpfs
</code></pre>
<p>If in the Filesystem column you get &quot;tmpfs&quot; everything is fine</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Raspberry PI OS USB Disk not entering standby mode]]></title><description><![CDATA[<p>Last Christmast I received a new external USB Disk for my Raspberry PI 4.</p><p>In this Raspi I have a set of SMB mounts to use for several things including:</p><ul><li>PS2 USB share (for loading PS2 games)</li><li>General SMB share</li><li>Backup of different Internet repositories I own</li></ul><p>Previous disk was</p>]]></description><link>https://fmsdevel.wisecoding.es/raspberry-pi-os-usb-disk-not-entering-standby-mode/</link><guid isPermaLink="false">659a7aab5a7bb4000199b0d2</guid><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Sun, 07 Jan 2024 11:08:15 GMT</pubDate><media:content url="https://fmsdevel.wisecoding.es/content/images/2024/01/ASSET_MMS_88528285-7.png" medium="image"/><content:encoded><![CDATA[<img src="https://fmsdevel.wisecoding.es/content/images/2024/01/ASSET_MMS_88528285-7.png" alt="Raspberry PI OS USB Disk not entering standby mode"><p>Last Christmast I received a new external USB Disk for my Raspberry PI 4.</p><p>In this Raspi I have a set of SMB mounts to use for several things including:</p><ul><li>PS2 USB share (for loading PS2 games)</li><li>General SMB share</li><li>Backup of different Internet repositories I own</li></ul><p>Previous disk was a Western Digital one that entered standby automatically after some time but my new one a 5TB Seagate was not spinning down</p><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2024/01/seagate.png" class="kg-image" alt="Raspberry PI OS USB Disk not entering standby mode" loading="lazy" width="908" height="622"></figure><p>I research in the issue and after some time, I found out that the OS (10 Buster) was not being able to use SMART in this drive and the drive firmware seems not to have automatic power down.</p><p>The OS, using SMART, can configure automatic spindown after some time being inactive, and this is what I wanted. So, after installing smart tools package (it wasn&apos;t install in my Raspi):</p><!--kg-card-begin: markdown--><p><code>sudo apt-get install smartmontools</code></p>
<!--kg-card-end: markdown--><p>And trying to do anything with the drive, I was getting errors regarding not supported USB drive:</p><!--kg-card-begin: markdown--><p><code>Read Device Identity failed: scsi error unsupported field in scsi command</code></p>
<!--kg-card-end: markdown--><p>After some digging (and thinking that the USB drive from Seagate was not appropiate for the usage I wanted) I found out the issue. The problem was that the drive was using the UAS module in the operating system and this module was generating the issue with SMART mon tools, so, let&apos;s configure Raspberry PI OS for not using UAS for this drive.</p><hr><p><strong>Get Vendor and Product ID</strong></p><!--kg-card-begin: markdown--><pre><code>fms@gate:~ $ lsusb
Bus 002 Device 003: ID 0bc2:2034 Seagate RSS LLC 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
</code></pre>
<!--kg-card-end: markdown--><p>In my case it was Vendor ID 0bc2 and Product ID 2034.</p><p><strong>Configure Raspberry PI OS boot sequence to not use UAS for this device.</strong></p><p>Edit /boot/cmdline.txt and add the following parameter to the kernel loading (ensure to put the correct Vendor and Product ID you got in the previous step):</p><!--kg-card-begin: markdown--><p><code>usb_storage.quirks=0bc2:2034:u</code></p>
<!--kg-card-end: markdown--><p>The cmdline file should look like this:</p><!--kg-card-begin: markdown--><p><code>console=serial0,115200 console=tty1 root=PARTUUID=8c926f11-02 rootfstype=ext4 elevator=deadline fsck.repair=yes usb_storage.quirks=0bc2:2034:u rootwait</code></p>
<!--kg-card-end: markdown--><p>And reboot the Raspi to apply this setting.</p><p><strong>Check the drive is accesible for SMART mon tools</strong></p><p>After reboot, execute a sample smartctl command to ensure the drive is acceisble for SMART tools, for example (if your drive is mapped to /dev/sda):</p><!--kg-card-begin: markdown--><p><code>sudo smartctl -a /dev/sda -d sat</code></p>
<!--kg-card-end: markdown--><p>You should get a full SMART response, similar to this one:</p><!--kg-card-begin: markdown--><pre><code>smartctl 6.6 2017-11-05 r4594 [armv7l-linux-5.4.79-v7l+] (local build)
Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda 2.5 5400
Device Model:     ST5000LM000-2AN170
Serial Number:    FMSSN
LU WWN Device Id: 5 000c50 0f21e09d5
Firmware Version: 0001
User Capacity:    5.000.981.078.016 bytes [5,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5526 rpm
Form Factor:      2.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-3 T13/2161-D revision 5
SATA Version is:  SATA 3.1, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Sun Jan  7 11:49:27 2024 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00)	Offline data collection activity
					was never started.
					Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0)	The previous self-test routine completed
					without error or no self-test has ever 
					been run.
Total time to complete Offline 
data collection: 		(    0) seconds.
Offline data collection
capabilities: 			 (0x73) SMART execute Offline immediate.
					Auto Offline data collection on/off support.
					Suspend Offline collection upon new
					command.
					No Offline surface scan supported.
					Self-test supported.
					Conveyance Self-test supported.
					Selective Self-test supported.
SMART capabilities:            (0x0003)	Saves SMART data before entering
					power-saving mode.
					Supports SMART auto save timer.
Error logging capability:        (0x01)	Error logging supported.
					General Purpose Logging supported.
Short self-test routine 
recommended polling time: 	 (   1) minutes.
Extended self-test routine
recommended polling time: 	 ( 808) minutes.
Conveyance self-test routine
recommended polling time: 	 (   2) minutes.
SCT capabilities: 	       (0x30a5)	SCT Status supported.
					SCT Data Table supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   076   069   006    Pre-fail  Always       -       44189864
  3 Spin_Up_Time            0x0003   096   096   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       29
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   065   060   045    Pre-fail  Always       -       3102614
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       455 (149 190 0)
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       13
183 SATA_Downshift_Count    0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   075   052   040    Old_age   Always       -       25 (Min/Max 25/40)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       19
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       77
194 Temperature_Celsius     0x0022   025   048   000    Old_age   Always       -       25 (0 18 0 0 0)
195 Hardware_ECC_Recovered  0x001a   076   069   000    Old_age   Always       -       44189864
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       37 (147 102 0)
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       3925279266
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       3612908854
254 Free_Fall_Sensor        0x0032   100   100   000    Old_age   Always       -       0

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.
</code></pre>
<!--kg-card-end: markdown--><p>We are almost there. We need SMART mon tools to be configure for setting up the spindown timer when the drive is connected to the Raspi (or the system is rebooted).</p><p><strong>Setup a UDEV rule for setting the automatic spindown on inactivity</strong></p><p>udev service will be the one handling the connecting of the USB drive, and as such, we can create a custom rule to automatically configure the spindown time.</p><p>The following command will create a file in the udev files folder and configure a 300 seconds spindown time (standby parameter represents a 5 seconds factor) for any &quot;sdX&quot; disk that is attached to the Raspi:</p><!--kg-card-begin: markdown--><pre><code>cat &gt;/etc/udev/rules.d/69-usbstandby.rules &lt;&lt;EOF
ACTION==&quot;add|change&quot;, KERNEL==&quot;sd[a-z]&quot;, ATTR{queue/rotational}==&quot;1&quot;, RUN+=&quot;/usr/sbin/smartctl --set standby,60 -d sat /dev/%k&quot;
EOF
</code></pre>
<!--kg-card-end: markdown--><p>Everything is ready and OK. You can check wheter this is working properly if, after 5 minutes (in my config) you can check that the drive is in standby mode. This can be done executing the following command:</p><!--kg-card-begin: markdown--><pre><code>sudo smartctl --nocheck standby -i /dev/sda -d sat | grep &quot;STANDBY&quot;
Device is in STANDBY mode, exit(2)
</code></pre>
<!--kg-card-end: markdown--><p>If you can see the response as in the example, your drive has been spinned down successfully.</p><p>Please note the --nocheck param as this will avoid smartctl spinning up the disk for SMART queries.</p>]]></content:encoded></item><item><title><![CDATA[Raspberry PI as WiFi Access point]]></title><description><![CDATA[Extending our WiFi network can be done using our little old Raspberry with no cost and it is a very easy configuration.
In this article, you will find step by step configurations for this.]]></description><link>https://fmsdevel.wisecoding.es/raspberry-pi-as-wifi-access-point-bridge/</link><guid isPermaLink="false">61cafc0fe60bf40001ca8fec</guid><category><![CDATA[raspberry]]></category><category><![CDATA[wifi]]></category><category><![CDATA[hostapd]]></category><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Sat, 01 Jan 2022 08:00:00 GMT</pubDate><media:content url="https://fmsdevel.wisecoding.es/content/images/2021/12/wifi-vector-logo-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://fmsdevel.wisecoding.es/content/images/2021/12/wifi-vector-logo-2.png" alt="Raspberry PI as WiFi Access point"><p>One of the useful thing we can do with our &quot;Raspberries if to use them as WiFi access points. This will allow us to have signal in some places where our connection does not reach properly.</p><p>Fortunately, if we have a Raspberry Pi 3 or later and an Ethernet cable in the zone we want to provide signal to, we can configure it as an access point with the hostap software following these simple instructions (ensure you are following them using a Ethernet connection or the Raspi console or you will lose connectivity).</p><!--kg-card-begin: markdown--><p><strong>Install hostapd</strong></p>
<p>First of all we need to install hostapd package. If our Raspberry PI OS is updated, we can just do it as follows:</p>
<p><code>sudo apt-get install hostapd</code></p>
<p>And enable the service to start with the system:</p>
<p><code>sudo systemctl unmask hostapd</code><br>
<code>sudo systemctl enable hostapd</code></p>
<p><strong>Create bridge device between ethernet and WiFi</strong></p>
<p>We need to create a network device that will allow network packets to flow between WiFi and Ethernet.</p>
<p><code>sudo vi /etc/systemd/network/bridge-br0.netdev</code></p>
<p>And insert inside:</p>
<pre><code>[NetDev]
Name=br0
Kind=bridge
</code></pre>
<p>Now, we can add the members to the bridge:</p>
<p><code>sudo vi /etc/systemd/network/br0-member-eth0.network</code></p>
<p>And insert:</p>
<pre><code>[Match]
Name=eth0

[Network]
Bridge=br0
</code></pre>
<p><strong>Disable dhcp client for eth0</strong></p>
<p><code>sudo vi /etc/dhcpcd.conf</code></p>
<p>At the end, add the following line:</p>
<pre><code>denyinterfaces eth0 wlan0
</code></pre>
<p><strong>Config br0 interface</strong></p>
<p><code>sudo vi /etc/network/interfaces.d/br0</code></p>
<p>And insert:</p>
<pre><code>auto br0
 
# Bridge setup
iface br0 inet dhcp
    bridge_ports eth0
</code></pre>
<p><strong>Enable the networkd service</strong></p>
<p><code>sudo systemctl enable systemd-networkd</code></p>
<p><strong>Configure the access point</strong></p>
<p><code>sudo vi /etc/hostapd/hostapd.conf</code></p>
<p>And in the content, change at least the values for the SSID name and passphrase</p>
<pre><code>interface=wlan0
bridge=br0
driver=nl80211
ssid=MonkeyIsland3
auth_algs=1
wpa=2
wpa_passphrase=torpeo123
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

country_code=ES
macaddr_acl=0
ignore_broadcast_ssid=0

# N
hw_mode=g
ieee80211n=1
wmm_enabled=1
require_ht=1
channel=8
ht_capab=[SHORT-GI-20][HT40][DSSS_CCK-40]
</code></pre>
<p>Secure the file:</p>
<p><code>sudo chown root:root /etc/hostapd/hostapd.conf</code><br>
<code>sudo chmod 600 /etc/hostapd/hostapd.conf</code></p>
<p><strong>Start the network for the bridge to be created and restart network</strong></p>
<p><code>sudo systemctl start systemd-networkd &amp;&amp; sudo systemctl restart networking</code></p>
<p><strong>Final restart</strong><br>
Your Wifi Access Point is working in bridge mode, however, a last shutdown is advisable to ensure that the software is started automatically when the system start.</p>
<p><code>sudo shutdown -r now</code></p>
<p>Ensure that after restarting you can see the SSID in your nearby WiFis</p>
<p><strong>Performance</strong><br>
I would like to share one last word in this article regarding the performance. Please, have always in mind the limitations that both the Ethernet interface and/or WiFi interface of our beloved Raspberri has depending on the model (Ethernet port in older models is limited by its link speed and interface to the main SoC, WiFi is limited by kind of standard supported, g,n,a, etc...) and so, this is a good use for older models (or newer if you want) but if you need high performance, you could need either to tweak the hostapd.conf parameters or even buy a dedicated HW for this.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Raspberry PI OS 11 on Raspberry PI 3]]></title><description><![CDATA[Do you have old Raspberry PIs hanging around and want to update their OS and use for interesting things?
This article will show you, step by step, how to update your old Raspi3 to Rasperry PI OS 11 in no time.]]></description><link>https://fmsdevel.wisecoding.es/raspos11_rasppi3/</link><guid isPermaLink="false">61cadd6de60bf40001ca8edb</guid><category><![CDATA[raspberry]]></category><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Tue, 28 Dec 2021 11:17:16 GMT</pubDate><media:content url="https://fmsdevel.wisecoding.es/content/images/2021/12/raspiscaled-6.png" medium="image"/><content:encoded><![CDATA[<img src="https://fmsdevel.wisecoding.es/content/images/2021/12/raspiscaled-6.png" alt="Raspberry PI OS 11 on Raspberry PI 3"><p></p><p>As we acquire the new Raspi models, old ones can be very useful for small tasks but, we should also update the OS version to the latest one.</p><p>One very good thing of Raspberry Foundation is that they keep backwards compatibility with older Raspi models. In this article, we will start from scratch (empty SD), in 2021, to configure a Rasp 3 with the base OS and in following articles, add new features from a Linux computer.</p><!--kg-card-begin: markdown--><p><strong>1 - Download the base OS</strong></p>
<p>First, we need the base image. In this article, I will use the <em>lite</em> version and we will install later whatever packages we could need.</p>
<p>Go to <a href="https://www.raspberrypi.com/software/operating-systems/">Raspberry PI Download page</a> and get the image.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/12/Screenshot-from-2021-12-28-11-00-36.png" class="kg-image" alt="Raspberry PI OS 11 on Raspberry PI 3" loading="lazy" width="769" height="215"></figure><!--kg-card-begin: markdown--><p><strong>2 - Write image to SD</strong></p>
<p>Now, the image needs to be written to a SD.</p>
<p><strong>WARNING: ALL DATA IN THE SD WILL BE DESTROYED AFTER EXECUTING THE FOLLOWING COMMAND.</strong></p>
<p>First, check what device name has been asigned to the SD. As this is a very important step, I recommend extracting and reinserting the SD and check what device name is assigned, for example:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/12/Screenshot-from-2021-12-28-11-05-06.png" class="kg-image" alt="Raspberry PI OS 11 on Raspberry PI 3" loading="lazy" width="868" height="200"></figure><!--kg-card-begin: markdown--><p>We can see the device is named sdc, and so, we can proceed writting the OS image.</p>
<p><code>unzip -p PATH_TO_THE_DOWNLOADED_FILE | sudo dd bs=1M of=YOUR_SD_DEVICE_NAME</code></p>
<p>After a while, the image will be completly written and you should get a message like this:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/12/Screenshot-from-2021-12-28-11-13-49.png" class="kg-image" alt="Raspberry PI OS 11 on Raspberry PI 3" loading="lazy" width="647" height="54"></figure><!--kg-card-begin: markdown--><p>Eject the device to ensure all buffers and cache if written to the SD.</p>
<p><code>sudo eject /dev/sdc</code></p>
<p><strong>3 - Prepare for first boot. Enable ssh access and disable auto resize</strong></p>
<p>We would like to use the Raspi with SSH as soon as it boots and we would like to avoid automatic SD resizing (as we could like to repartition with our own partition scheme).</p>
<p>To do so, first, reinsert the SD to the Linux where we&apos;re configuring the image and ensure the &quot;boot&quot; partition is mounted:</p>
<p><code>ls -al YOUR_MOUNT_PATH/boot</code></p>
<p>You should see something like this:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/12/Screenshot-from-2021-12-28-11-21-31.png" class="kg-image" alt="Raspberry PI OS 11 on Raspberry PI 3" loading="lazy" width="413" height="783"></figure><!--kg-card-begin: markdown--><p>Enable automatic SSH start by creating and empty file named &quot;ssh&quot;:</p>
<p><code>touch YOUR_MOUNT_PATH/boot/ssh</code></p>
<p>And disable automatic resizing:</p>
<p><code>sed -i &apos;s| init=/usr/lib/raspi-config/init_resize.sh||&apos; YOUR_MOUNT_PATH/boot/cmdline.txt</code></p>
<p>You can eject again the SD:</p>
<p><code>sudo eject /dev/sdc</code></p>
<p><strong>4 - Insert the SD on the Raspberry and boot it for the first time</strong></p>
<p>The Rasp will boot (give it a couple of minutes) and then we should be able to login using SSH (the IP you&apos;ll get will vary based in your local network configuration):</p>
<p><code>ssh pi@YOUR_RASP_IP</code></p>
<p>As this is the first time we connect to it, SSH will warn us about connecting to an unknown device and add list to the known hosts list (type yes, and use as password &quot;raspberry&quot; that is the default one):</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/12/Screenshot-from-2021-12-28-11-35-13.png" class="kg-image" alt="Raspberry PI OS 11 on Raspberry PI 3" loading="lazy" width="872" height="358"></figure><!--kg-card-begin: markdown--><p><strong>5 - Add your user and disable pi default user</strong></p>
<p>We need to secure a little the Raspi. First, create your own user, set it with a secure password and disable the &quot;pi&quot; one:</p>
<p><code>sudo adduser YOUR_USER_NAME</code><br>
<code>sudo cp /etc/sudoers.d/010_pi-nopasswd /etc/sudoers.d/010_custom-nopasswd</code><br>
<code>sudo sed -i &apos;s/^pi /YOUR_USER_NAME /g&apos; /etc/sudoers.d/010_custom-nopasswd</code></p>
<p>Logout and relogin but this time with your new user and the new password:</p>
<p><code>ssh YOUR_USER_NAME@YOUR_RASP_IP</code></p>
<p>Disable the pi default user:</p>
<p><code>sudo usermod -L pi</code></p>
<p>Also, I strongly recommend setting a public key for SSH authentication and avoid using a password. You can do that easily, provided you&apos;re in a computer with Linux and the private key just logging out of the Raspi and executing, from your desktop computer:</p>
<p><code>ssh-copy-id YOUR_USER_NAME@YOUR_RASP_IP</code></p>
<p>If there is no error, you will be able to log in to the Raspi without using the password.</p>
<p><strong>6 - Basic post-installation actions</strong></p>
<p>Your Raspi is up and running, you can SSH to it and do many things, but, commontly, it is recommended to go to the raspi-config utility:</p>
<p><code>sudo raspi-config</code></p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/12/Screenshot-from-2021-12-28-12-11-56.png" class="kg-image" alt="Raspberry PI OS 11 on Raspberry PI 3" loading="lazy" width="1113" height="363"></figure><!--kg-card-begin: markdown--><p>and configuring at least:</p>
<ul>
<li>System options -&gt; Wireless LAN: Set your country to be able to use WLAN (do not set SSID if you don&apos;t want to connect using WLAN yet)</li>
<li>Localisation options -&gt; Timezone: Set your timezone so the Rasp can show the localtime</li>
<li>Localisation options -&gt; Keyboard: Set your prefered keymap so you can use an attached keyboard if you need to</li>
</ul>
<p>After doing this, raspi-config will ask to reboot, select yes and the device will restart with the new settings.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[NodeMCU programming with VSCode]]></title><description><![CDATA[Configure Microsoft VSCode for programming your NodeMCU]]></description><link>https://fmsdevel.wisecoding.es/nodemcu-programming-with-vscode/</link><guid isPermaLink="false">5ff8896ed7ff430001043444</guid><category><![CDATA[NodeMCU]]></category><category><![CDATA[IoT]]></category><category><![CDATA[ESP8266]]></category><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Fri, 08 Jan 2021 18:21:31 GMT</pubDate><media:content url="https://fmsdevel.wisecoding.es/content/images/2021/01/nodemcu-50-4.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/nodemcu-50-4.png" alt="NodeMCU programming with VSCode"><p>Microsoft <a href="https://code.visualstudio.com/">Visual Studio Code</a> is a general purpose programming IDE that, thanks to plugins, can be used to develop in several languages, and in this case, for several devices.</p>
<p>NodeMCU is a device that, using a ESP8266, can be programmed using USB, and easily connect several IoT devices (like temperature and humidity sensors) and connect to a WiFi network to send data using the standard TCP or UDP protocol.</p>
<p>In this post, we will be configuring VSCode (we will assume it is already installed in the computer) to be able to upload an small C program to the device.</p>
<p><strong>Start the IDE</strong><br>
Start VSCode. A window similar to this one should open:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-17-42-49.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="687" height="385"></figure><!--kg-card-begin: markdown--><p><strong>Install the Platformio Extension</strong></p>
<p>The base installation of VSCode does not include support for IoT devices. We will use the <a href="https://platformio.org/">Platformio Extension for VSCode</a> for this.<br>
To install it, select the extensions icon in the left sidebar of the VSCode window and in the editbox for searching Extensions, write &quot;platformio&quot;.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-17-47-34.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="654" height="390"></figure><!--kg-card-begin: markdown--><p>Click on the install button for, in this case, the first result.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-17-48-30.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="1023" height="805"></figure><!--kg-card-begin: markdown--><p>To ensure the extension will be working properly, restart VSCode</p>
<p><strong>Create a new ESP8266 project</strong></p>
<p>After restarting, a new icon in the left sidebar should appear, this is our new extension. Click on it and then &quot;open&quot; to start IDE.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-17-53-12.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="1022" height="603"></figure><!--kg-card-begin: markdown--><p>Click on &quot;New Project&quot;. A popup window will ask you for the project data. In this post, we will create a project named &quot;THSensor&quot;, board will be NodeMCU 1.0.<br>
Also, you could choose a folder for the project (I&apos;m leaving it as default).</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-17-59-20.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="672" height="521"></figure><!--kg-card-begin: markdown--><p>The first time a project is created, an Internet connection is required as PlatformIO needs some setup to be done, wait until it finishes preparing the environment and your project is opened in the main window.</p>
<p>You can now go to the left tree window, expand src and double click on main.cpp.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-18-02-13.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="1021" height="800"></figure><!--kg-card-begin: markdown--><p>We got a scaffoldmain  where we can code whatever we want.</p>
<p><strong>Code your program</strong></p>
<p>Now we&apos;re ready to code our C program. As an example, we will be coding a program that will be blinking one of the NodeMCU leds every 5 seconds and keep it turned on for 500ms.</p>
<p>Change your main.cpp to be like this:</p>
<pre><code>#include &lt;Arduino.h&gt;

#define LED D4

void setup() {
  Serial.begin(74880);
  pinMode(LED, OUTPUT);
}

void loop() {
  //Turn off the led
  Serial.println(&quot;OFF\r\n&quot;);
  digitalWrite(LED, HIGH);

  //Wait for 5 seconds
  delay(5000);

  //Turn on the led
  Serial.println(&quot;ON\r\n&quot;);
  digitalWrite(LED, LOW);

  //Leave it on for 500ms
  delay(500);
}
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p><strong>Enable our Linux user to be able to use the serial ports</strong></p>
<p>Communitation to the NodeMCU uses a system device that is configured when the device is connected. For being able to upload code to the device (or files) we need to ensure our user is in the &quot;dialout&quot; group. You can check issuing the following command from a terminal:</p>
<pre><code>id
</code></pre>
<p>If in the response groups &quot;dialout&quot; group is not listed, add your user to it using the following command:</p>
<pre><code>sudo usermod -a -G dialout $USER
</code></pre>
<p>You will need to close your current session and log in again (check with the id command that your user is now in the dialout group).</p>
<p>In my case (using Ubuntu 20.04.1 LTS) I had to restart the user.slice service so that GDM is restarted and my user groups gets refreshed</p>
<pre><code>sudo systemctl restart user.slice
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p><strong>Configure monitor speed</strong></p>
<p>NodeMCU defaults to 74880 bps. To be able to use the serial monitor and see log messages, we need to change the default 9600 that PlatformIO has to this value.</p>
<p>Click on the PlatformIO icon in the left sidebar, then, in &quot;Quick Access&quot;, click &quot;Projects &amp; Configuration&quot;. Our project will be listed, click on &quot;Configure&quot;:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-18-36-40.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="1044" height="823"></figure><!--kg-card-begin: markdown--><p>Then, click on the 3 dots and select &quot;Common configuration&quot;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-18-37-18.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="1044" height="823"></figure><!--kg-card-begin: markdown--><p>In the &quot;New Option&quot; editbox, type &quot;monitor_speed&quot; and set to 74880</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-18-52-34.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="1044" height="823"></figure><!--kg-card-begin: markdown--><p>Click Save (accept the warning regarding the configuration that will be overwritten).</p>
<p><strong>Connect the NodeMCU</strong></p>
<p>Connect a USB cable to the NodeMCU micro USB port and to your computer port. The NodeMCU will blink briefly and in your computer a new USB should be reported:</p>
<pre><code>dmesg | tail
[ 4782.927702] usb 3-4: new full-speed USB device number 9 using xhci_hcd
[ 4783.076786] usb 3-4: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.54
[ 4783.076790] usb 3-4: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 4783.076793] usb 3-4: Product: USB2.0-Serial
[ 4783.078991] ch341 3-4:1.0: ch341-uart converter detected
[ 4783.079448] usb 3-4: ch341-uart converter now attached to ttyUSB0
</code></pre>
<p>The NodeMCU is ready on /dev/ttyUSB0</p>
<p>Click on the Serial Monitor icon in VSCode bottom icon bar (looks like an electrical plug). A task will be started in VSCode that will show a window like this one:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-19-09-59.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="1044" height="823"></figure><!--kg-card-begin: markdown--><p>Now, hit the &quot;RST&quot; button in the NodeMCU, the serial monitor will receive the startup log information from the NodeMCU similar to this one:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-19-14-18.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="1044" height="823"></figure><!--kg-card-begin: markdown--><p><strong>Compile and upload our program</strong></p>
<p>We&apos;re ready to compile and upload our test program. Click on the &quot;-&gt;&quot; icon to compile and upload our test program.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-19-01-53.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="1044" height="823"></figure><!--kg-card-begin: markdown--><p>The led should blink as we programmed and the serial monitor will show &quot;ON&quot; and &quot;OFF&quot; strings with the defined cadence.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/Screenshot-from-2021-01-08-19-15-15.png" class="kg-image" alt="NodeMCU programming with VSCode" loading="lazy" width="1044" height="823"></figure><!--kg-card-begin: markdown--><p>We&apos;ve got the basics here. Now we can program more usefull tasks in other little NodeMCU.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Mapping Ghost to the Internet with NGINX in your Raspberry]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Usually, you have already other services running in your raspberry and so, TCP port 80 and 443 (HTTP and HTTPS) are already being used.</p>
<p>In this case, you will need to configure a reverse proxy to handle the requests received in your Raspberry to the right docker. In this post,</p>]]></description><link>https://fmsdevel.wisecoding.es/mapping-ghost-with-nginx/</link><guid isPermaLink="false">5ff758658a757800016121fd</guid><category><![CDATA[raspberry]]></category><category><![CDATA[nginx]]></category><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Thu, 07 Jan 2021 19:23:29 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Usually, you have already other services running in your raspberry and so, TCP port 80 and 443 (HTTP and HTTPS) are already being used.</p>
<p>In this case, you will need to configure a reverse proxy to handle the requests received in your Raspberry to the right docker. In this post, I will share the steps I followed for this (provided you already had an nginx running in your Raspberry).</p>
<ol>
<li>Create a new site config for nginx:</li>
</ol>
<pre><code>sudo vi /etc/nginx/sites-available/fmsdevel.wisecoding.es.config
</code></pre>
<p>And write the following (please note you need to change &quot;fmsdevel.wisecoding.es&quot; to your specific configuration:</p>
<pre><code>server {
    listen 80;
    listen [::]:80;

    server_name fmsdevel.wisecoding.es;
    
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://127.0.0.1:2368;
    }
}
</code></pre>
<ol start="2">
<li>Enable the new configuration and reload nginx</li>
</ol>
<pre><code>sudo ln -s /etc/nginx/sites-available/fmsdevel.wisecoding.es.config /etc/nginx/sites-enabled/fmsdevel.wisecoding.es.config

systemctl reload nginx
</code></pre>
<ol start="3">
<li>
<p>Now, our Ghost servers is ready to receive requests from the Internet. Change the DNS to map your name (in the example above, fmsdevel.wisecoding.es, to your public IP where your NGINX is already working)</p>
</li>
<li>
<p>As now your blog is in the Internet, I suggest configuring the new DNS name in the Ghost configuration under:</p>
</li>
</ol>
<p>http://&lt;YOUR_RASPBERRY_LAN_IP&gt;:2368/ghost/#/settings/design</p>
<p>So it changes to something like this:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/change_url_design.png" class="kg-image" alt loading="lazy" width="1987" height="656"></figure><!--kg-card-begin: markdown--><ol start="5">
<li>If we&apos;re using cert bot for getting <a href="https://letsencrypt.org">Let&apos;s Encrypt certificates</a>, now we&apos;re ready to also protect our blog with SSL</li>
</ol>
<pre><code>sudo certbot --nginx -d fmsdevel.wisecoding.es
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for fmsdevel.wisecoding.es
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/fmsdevel.wisecoding.es.config

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you&apos;re confident your site works on HTTPS. You can undo this
change by editing your web server&apos;s configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press &apos;c&apos; to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/fmsdevel.wisecoding.es.config

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://fmsdevel.wisecoding.es

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=fmsdevel.wisecoding.es
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/fmsdevel.wisecoding.es/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/fmsdevel.wisecoding.es/privkey.pem
   Your cert will expire on 2021-04-07. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the &quot;certonly&quot; option. To non-interactively renew *all* of
   your certificates, run &quot;certbot renew&quot;
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let&apos;s Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
</code></pre>
<p>Remember to change the Ghost settings URLs to use https</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Migrating from Vosao & APPEngine to Ghost CMS and Raspberry PI]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Google has been evolving Appengine for long time and now, they changed some of the Terms Of Service for it. Now, you need to include a billing method even to use the free tiers and I would prefer not to risk to unwanted charges.</p>
<p>For some time, I&apos;ve</p>]]></description><link>https://fmsdevel.wisecoding.es/migtrating-from-vosao-appengine-to-ghost-cms-and-raspberry-pi/</link><guid isPermaLink="false">5ff70c2f1e4cac00012ea8d5</guid><category><![CDATA[ghost]]></category><category><![CDATA[raspberry]]></category><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Thu, 07 Jan 2021 18:33:34 GMT</pubDate><media:content url="https://fmsdevel.wisecoding.es/content/images/2021/01/raspi4.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/raspi4.jpg" alt="Migrating from Vosao &amp; APPEngine to Ghost CMS and Raspberry PI"><p>Google has been evolving Appengine for long time and now, they changed some of the Terms Of Service for it. Now, you need to include a billing method even to use the free tiers and I would prefer not to risk to unwanted charges.</p>
<p>For some time, I&apos;ve been thinking on evolving to another blog solution. Time has change, and now, many people, like me will have a 24x7 <a href="https://www.raspberrypi.org/">Raspberry Pi</a> at home.</p>
<p>This computing wonder allow us to evolve to our own hosted blog platform.</p>
<p>I would like to use this first post to document and describe how I configured Ghost in docker in my Raspberry. I have several services running on it and I prefer all of them to be dockerized (this way, they are OS version independent and gives additional layers of security).</p>
<p>Following, I detail the step I&apos;ve followed to have <a href="https://ghost.org/docs/">Ghost</a> working this way.</p>
<ol>
<li>Check prebuilt docker images available and select a version.<br>
You can see in your browser using <a href="https://hub.docker.com/_/ghost">DockerHub</a></li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/docker-ghostimg.png" class="kg-image" alt="Migrating from Vosao &amp; APPEngine to Ghost CMS and Raspberry PI" loading="lazy" width="1070" height="1134"></figure><!--kg-card-begin: markdown--><ol start="2">
<li>Predownload the image. Altought this step can be avoided and will be automatically downloaded when we do the docker run below, I always prefer to ensure manual image preloading.</li>
</ol>
<p>Execute:</p>
<pre><code>docker pull ghost:3.40.4-alpine
</code></pre>
<p>And, after a while, you will get an output similar to:</p>
<pre><code>3.40.4-alpine: Pulling from library/ghost
c58e8a26a840: Pull complete
11349be5853d: Pull complete
7b0d5f9228ff: Pull complete
4bf7dcdc3956: Pull complete
129c46fed0ed: Pull complete
fc05e34f99ff: Pull complete
02266fbbd074: Pull complete
23048f263933: Pull complete
f30021ef7671: Pull complete
Digest: sha256:95f54fd8ca13df328f54e39879a729cfb122504f4bfb897c6c3a658f230a4e5a
Status: Downloaded newer image for ghost:3.40.4-alpine
</code></pre>
<ol start="3">
<li>Prepare the persistence folder. As we will be running ghost from a dockerized service, we want to ensure our posts and data is persisted even if the container is detroyed (or upgraded) and so, create a folder that will store the Ghosts DBs.</li>
</ol>
<pre><code>mkdir ~/ghost
</code></pre>
<p>This will create a folder in your home folder named &quot;ghost&quot;</p>
<ol start="4">
<li>We&apos;re ready to drop the systemd script to control this docker as any other service (I&apos;m running Raspbian 10, but the script should be similar for your distribution).</li>
</ol>
<pre><code>sudo vi /etc/systemd/system/ghost-docker.service
</code></pre>
<p>Insert the following in the file (edit the values you may want to be different like TCP port and similar):</p>
<pre><code>[Unit]
Description=Ghost docker
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStartPre=-/usr/bin/docker stop %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --name=%n \
  -v &lt;PERSISTENT_FOLDER&gt;:/var/lib/ghost/content \
  -e url=http://&lt;YOUR_HOST_NAME&gt;:2368 \
  -p 2368:2368 \
  ghost:3.40.4-alpine

ExecStop=/usr/bin/docker rm -f %n
</code></pre>
<p>Please ensure you set the values for <strong>&lt;PERSISTENT_FOLDER&gt;</strong> (with full path) and <strong>&lt;YOUR_HOST_NAME&gt;</strong> correctly</p>
<ol start="5">
<li>Start the service:</li>
</ol>
<pre><code>sudo systemctl start ghost-docker
</code></pre>
<p>You can check if the docker container has correctly started using docker ps command. You should see something similar to:</p>
<pre><code> docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                       NAMES
1857012d8c3c        ghost:3.40.4-alpine     &quot;docker-entrypoint.s&#x2026;&quot;   2 seconds ago       Up 1 second         0.0.0.0:2368-&gt;2368/tcp                      ghost-docker.service
</code></pre>
<ol start="6">
<li>Check access to the ghost service and to the management API. In your browser check that you can access:</li>
</ol>
<p>http://&lt;YOUR_HOST_NAME&gt;:2368</p>
<p>And</p>
<p>http://&lt;YOUR_HOST_NAME&gt;:2368/ghost</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/ghost-welcome.png" width="1496" height="1146" loading="lazy" alt="Migrating from Vosao &amp; APPEngine to Ghost CMS and Raspberry PI"></div><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/ghost-admin-welcome-1.png" width="1390" height="1005" loading="lazy" alt="Migrating from Vosao &amp; APPEngine to Ghost CMS and Raspberry PI"></div></div></div></figure><!--kg-card-begin: markdown--><ol start="7">
<li>
<p>Now you can configure and create your admin user for ghost. I recommend reading the official <a href="https://ghost.org/docs/">Ghost documentation</a></p>
</li>
<li>
<p>Finally, I&apos;ve not found any automated means to migrate Vosao content to Ghost and so, I &quot;copied &amp; pasted&quot; the content from the old site to the new one.</p>
</li>
</ol>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[CPCDroid - Input control configuration]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Since CPCDroid went public, I&apos;ve received some questions about how to correctly configure the virtual button mapping to CPC emulated keys. In this entry, I will explain how this is done my favorite CPC game, Batman.</p>
<p>Of course, first, launch CPCDroid, the main screen will appear:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/selectdisk.png" class="kg-image" alt loading="lazy" width="1024" height="600"></figure><!--kg-card-begin: markdown--><p>Load the</p>]]></description><link>https://fmsdevel.wisecoding.es/cpcdroid-input-control-configuration/</link><guid isPermaLink="false">5ff707961e4cac00012ea8a2</guid><category><![CDATA[cpcdroid]]></category><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Sun, 27 Jan 2013 09:14:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Since CPCDroid went public, I&apos;ve received some questions about how to correctly configure the virtual button mapping to CPC emulated keys. In this entry, I will explain how this is done my favorite CPC game, Batman.</p>
<p>Of course, first, launch CPCDroid, the main screen will appear:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/selectdisk.png" class="kg-image" alt loading="lazy" width="1024" height="600"></figure><!--kg-card-begin: markdown--><p>Load the game DSK:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/selectdisk2.png" class="kg-image" alt loading="lazy" width="1024" height="600"></figure><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/startdiskemu.png" class="kg-image" alt loading="lazy" width="1024" height="600"></figure><!--kg-card-begin: markdown--><p>After the game has been loaded by the Amstrad CPC:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/game.png" class="kg-image" alt loading="lazy" width="1024" height="600"></figure><!--kg-card-begin: markdown--><p>Press the menu key to go to CPCDroid menu:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/game-keyboard.png" class="kg-image" alt loading="lazy" width="1024" height="600"></figure><!--kg-card-begin: markdown--><p>Once selected &quot;Keyboard&quot;, press &quot;1&quot;. The keyboard configuration screen will appear:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/game-key-1.png" class="kg-image" alt loading="lazy" width="1024" height="600"></figure><!--kg-card-begin: markdown--><p>Change the &quot;square&quot; control (is the virtual 2 key) to &quot;return&quot;. Don&apos;t get confused about enter and return, those are different keys in the Amstrad CPC:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/game-key-2.png" class="kg-image" alt loading="lazy" width="1024" height="600"></figure><!--kg-card-begin: markdown--><p>Exit back to the game (using the Android menu key).</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/game-2.png" class="kg-image" alt loading="lazy" width="1024" height="600"></figure><!--kg-card-begin: markdown--><p>Now, the &quot;2&quot; virtual key, allows to start the game.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/game2.png" class="kg-image" alt loading="lazy" width="1024" height="600"></figure><!--kg-card-begin: markdown--><p>The same for other games, only need to know what CPC key you want to map to a virtual key.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[CPCDroid - Public code repository]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I host many of my developments in BitBucket (<a href="http://www.bitbucket.org">http://www.bitbucket.org</a>). It&apos;s a free source code repository that supports many of the most common source control systems (Mercurial, GIT, etc...).</p>
<p>Until now, CPCDroid sources where private but I would like to give the opportunity to include new</p>]]></description><link>https://fmsdevel.wisecoding.es/cpcdroid-public-code-repository/</link><guid isPermaLink="false">5ff707371e4cac00012ea898</guid><category><![CDATA[cpcdroid]]></category><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Mon, 16 Apr 2012 13:30:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I host many of my developments in BitBucket (<a href="http://www.bitbucket.org">http://www.bitbucket.org</a>). It&apos;s a free source code repository that supports many of the most common source control systems (Mercurial, GIT, etc...).</p>
<p>Until now, CPCDroid sources where private but I would like to give the opportunity to include new fixes, features or anything to anyone. So, to access the source code, please go to:</p>
<p><a href="https://bitbucket.org/realfms/cpcdroid">https://bitbucket.org/realfms/cpcdroid</a></p>
<p>If you successfully make any patches, let me know so that I can merge them to the main branch.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Vosao & Google APP Engine]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Long time, no see, blog failure...</p>
<p>For some time, the FMSDevel BLOG has been rendering the pages really wrong. As I frequently check for new issues/improvements of the CPC emulator for Android, I saw this problem some time ago.</p>
<p>Finally, I had the time to check for the cause</p>]]></description><link>https://fmsdevel.wisecoding.es/vosao-google-app-engine/</link><guid isPermaLink="false">5ff706681e4cac00012ea881</guid><category><![CDATA[vosao]]></category><category><![CDATA[bug]]></category><category><![CDATA[appengine]]></category><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Wed, 31 Aug 2011 11:56:00 GMT</pubDate><media:content url="https://fmsdevel.wisecoding.es/content/images/2021/01/methoderror.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/methoderror.jpg" alt="Vosao &amp; Google APP Engine"><p>Long time, no see, blog failure...</p>
<p>For some time, the FMSDevel BLOG has been rendering the pages really wrong. As I frequently check for new issues/improvements of the CPC emulator for Android, I saw this problem some time ago.</p>
<p>Finally, I had the time to check for the cause and it&apos;s this</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/methoderror-1.jpg" class="kg-image" alt="Vosao &amp; Google APP Engine" loading="lazy" width="1151" height="407"></figure><!--kg-card-begin: markdown--><p>After wondering how is possible that, suddenly, a method is not found in the StringUtil class, I looked at <a href="http://appengine.google.com">Google APPEngine issues</a> and found out that many others had the same problem. It seems like Google has decided to remove the isEmpty method from the Java library that the applications use to run on their servers.</p>
<p>This made all static files (CSS, JPG, etc..) failing being sent to the client, and so, HTML rendering was not working.</p>
<p>The problem was that Vosao (the open source CMS used for this BLOG) used that method internally (had been working previously without a problem) and checked for an update.</p>
<p>Vosao 0.9 solves this problem and you can have again FMSDevel online!</p>
<p>If you&apos;re interested in starting your own website/BLOG/etc... I encourage you to check Vosao (and Google AppEngine) and deploy an application to publish your contents with this great CMS and Google&apos;s free application hosting.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/vosao-appengine.jpg" class="kg-image" alt="Vosao &amp; Google APP Engine" loading="lazy" width="501" height="280"></figure>]]></content:encoded></item><item><title><![CDATA[CPCDroid - Game disks]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Since I first used an Amstrad emulator (a PC-DOS version), I had to search for good sources of converted Amstrad programs. It is always easier than trying to make run my old CPC cassettes.</p>
<p>I found problems with some games (couldn&apos;t find a good working version) like for</p>]]></description><link>https://fmsdevel.wisecoding.es/cpcdroid-game-disks/</link><guid isPermaLink="false">5ff704d71e4cac00012ea856</guid><category><![CDATA[amstrad]]></category><category><![CDATA[cpc]]></category><category><![CDATA[links]]></category><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Sat, 05 Mar 2011 03:48:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Since I first used an Amstrad emulator (a PC-DOS version), I had to search for good sources of converted Amstrad programs. It is always easier than trying to make run my old CPC cassettes.</p>
<p>I found problems with some games (couldn&apos;t find a good working version) like for example &quot;Batman&quot; (Ocean version). When I replayed this game, once I got to the end of the game, the game was corrupt and the final graphics where bad. For avoiding this problems, I always use images from:</p>
<p><a href="http://cngsoft.no-ip.org/cng_zip_lz3.htm">C&#xE9;sar Repository - CPCE</a></p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/cng.jpg" class="kg-image" alt loading="lazy" width="600" height="381"></figure><!--kg-card-begin: markdown--><p>This repository has many of the original CPC games (many of them in Spanish) and I haven&apos;t found a corrupted one yet. C&#xE9;sar also categorizes the downloads specifying if a game is good, bad, or neutral. Also, he indicates what game may have problems.</p>
<p>So, this is my main source of DSK Images, but there are some games not present there. I get those games from:</p>
<p><a href="http://www.thegamearchives.com/?val=0_2_1_0_0_4_10_0_0_0_0">The Game Archives</a></p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/thegamearchives.jpg" class="kg-image" alt loading="lazy" width="600" height="633"></figure><!--kg-card-begin: markdown--><p>It has a very complete list of CPC programs.</p>
<p>Of course, there are a lot of other sources in the Internet, but, here you have my favorite ones for a start.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[CPCDroid - Amstrad CPC on Android phone]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Missing those great games you remember from your youth? Do you remember those pixelated graphics and the hours you spent playing those games? Now you can enjoy them again on your Android phone.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/amstrad_cpc464-3.jpg" width="799" height="520" loading="lazy" alt></div><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/abadia-cinta-5.jpg" width="391" height="552" loading="lazy" alt></div><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/batman1986-3.jpg" width="400" height="560" loading="lazy" alt></div></div></div></figure><!--kg-card-begin: html--><p style="text-align: justify;">
	Based on PSPCAP32 by Zx81 (<font color="#888888"><a href="http://zx81.zx81.free.fr/" target="_blank">http://zx81.zx81.free.fr</a></font>) and using Pelya SDL Android Port and</p>]]></description><link>https://fmsdevel.wisecoding.es/cpcdroid-amstrad-cpc-on-android-phone-2/</link><guid isPermaLink="false">5ff6f9873bad2400017f11d1</guid><category><![CDATA[cpcdroid]]></category><category><![CDATA[amstrad]]></category><category><![CDATA[cpc]]></category><category><![CDATA[android]]></category><dc:creator><![CDATA[Francisco Mayoral]]></dc:creator><pubDate>Wed, 02 Mar 2011 12:07:00 GMT</pubDate><media:content url="https://fmsdevel.wisecoding.es/content/images/2021/01/sdl5.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/sdl5.png" alt="CPCDroid - Amstrad CPC on Android phone"><p>Missing those great games you remember from your youth? Do you remember those pixelated graphics and the hours you spent playing those games? Now you can enjoy them again on your Android phone.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/amstrad_cpc464-3.jpg" width="799" height="520" loading="lazy" alt="CPCDroid - Amstrad CPC on Android phone"></div><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/abadia-cinta-5.jpg" width="391" height="552" loading="lazy" alt="CPCDroid - Amstrad CPC on Android phone"></div><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/batman1986-3.jpg" width="400" height="560" loading="lazy" alt="CPCDroid - Amstrad CPC on Android phone"></div></div></div></figure><!--kg-card-begin: html--><p style="text-align: justify;">
	Based on PSPCAP32 by Zx81 (<font color="#888888"><a href="http://zx81.zx81.free.fr/" target="_blank">http://zx81.zx81.free.fr</a></font>) and using Pelya SDL Android Port and official NDK, the new CPCDroid allows full emulation of the CPC machines (464, 6128, etc...).</p>
<p style="text-align: justify;">
	<strong>Version 1.5.1 features:</strong></p>
<p style="text-align: justify;">
	- Screenshot support</p>
<p style="text-align: justify;">
	- Snapshot support (5 slots per loaded disk name)</p>
<p style="text-align: justify;">
	- Disk A &amp; B Support</p>
<p style="text-align: justify;">
	- Autodetection of start file inside loaded DSK image (the program should start automatically after insertion of disk if not disabled in settings)</p>
<p style="text-align: justify;">
	- Comments for games</p>
<p style="text-align: justify;">
	- Cheats</p>
<p style="text-align: justify;">
	- Keyboard remapping (saving, loading, etc..) to ease use of CPC Keyboard with SDL touchscreen virtual buttons</p>
<p style="text-align: justify;">
	- Joystick remap (as in keyboard remapping)</p>
<p style="text-align: justify;">
	- Settings support (for changing emulator parameters as rendering mode, skip fps in slow or older phones, etc...)</p>
<p style="text-align: justify;">
	- Configuration men&#xFA; can be used without losing CPC emulation state</p>
<p style="text-align: justify;">
	- Text virtual keyboard can be used in the emulator (press &quot;AB&quot; virtual key on screen upper left side)</p>
<p style="text-align: justify;">
	- Onscreen virtual keypad with 6 buttons (configurable in the main menu) for controlling CPC programs.</p>
<p style="text-align: justify;">
	&#xA0;</p>
<p style="text-align: justify;">
	<strong>Installation guide:</strong></p>
<p style="text-align: justify;">
	- First, please check that your phone is configured to accept installation of non-market apks (Settings -&gt; Applications -&gt; Unknown sources)</p>
<p style="text-align: justify;">
	- Download apk from link below. The browser should start a background download</p>
<p style="text-align: justify;">
	<strong>&#xA0;&#xA0; -OR-</strong></p>
<p style="text-align: justify;">
	- Put the downloaded APK in the phone SDCard.</p>
<p style="text-align: justify;">
	- Install the APK (either by clicking in the download or in the APK from any Android File Manager) and accept permissions (Modify SD card for loading roms and saving snapshots), Internet communitacion for downloading of emulator data and Phone calls (read phone state and identity) used by SDL.</p>
<p style="text-align: justify;">
	- The emulator is installed and ready to use.</p>
<p style="text-align: justify;">
	&#xA0;</p>
<p style="text-align: justify;">
	<strong>Usage:</strong></p>
<p style="text-align: justify;">
	First time you start CPCDroid, <!--a config menu for SDL will be shown, just scroll down to "OK"&nbsp; and select it (it is not necessary to change anything):</p>
<p style="text-align: justify;">
	 </p>
<p style="text-align: center;">
	<img alt="SDL Config" src="/file/page/images/cpcdroid/captures/sdl1.png" style="width: 200px; height: 133px;" /></p>
<p style="text-align: center;">
	<img alt="SDL Config OK" src="/file/page/images/cpcdroid/captures/sdl2.png" style="width: 200px; height: 133px;" /></p>
<p style="text-align: center;">
	 </p>
<p style="text-align: justify;">
	After that, -->SDL will uncompress (and download if necessary) CPC Data (ROMs, etc...). This will only be done the first time the emulator is started:</p><!--kg-card-end: html--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/sdl3-1.png" class="kg-image" alt="CPCDroid - Amstrad CPC on Android phone" loading="lazy" width="480" height="320"></figure><!--kg-card-begin: html--><p style="text-align: justify;">
	The main menu screen will be drawn and here you can navigate using the on-screen controls (arrows and buttons from 1 to 6 and &quot;AB&quot; for text input):</p>
<p style="text-align: justify;">
	&#xA0;</p><!--kg-card-end: html--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/sdl4-1.png" class="kg-image" alt="CPCDroid - Amstrad CPC on Android phone" loading="lazy" width="480" height="320"></figure><!--kg-card-begin: html--><p style="text-align: justify;">
	The emulator can run most of the prexistent CPC Software. If must be in DSK format and should be loaded using the &quot;Load disk A&quot; in the main menu.</p>
<p style="text-align: justify;">
	If you have any roms, snapshots (PSPCAP32 and CAPRICE32 are compatible with CPCDroid), put them in the /sdcard/app-data/com.fms.cpcdroid subfolders as appropiate (DSK images in disk subfolder, snapshots in snap subfolder, etc...)</p>
<p style="text-align: justify;">
	The emulator has a HELP option included in the main menu.</p>
<p style="text-align: justify;">
	At any moment, press &quot;MENU&quot; button on the phone to go back. If in main menu, the &quot;MENU&quot; button will go to CPC emulator and if pressed in CPC emulator, the &quot;MENU&quot; button will show the main menu again.</p>
<p style="text-align: justify;">
	&#xA0;</p><!--kg-card-end: html--><figure class="kg-card kg-image-card"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/sdl5-2.png" class="kg-image" alt="CPCDroid - Amstrad CPC on Android phone" loading="lazy" width="480" height="320"></figure><!--kg-card-begin: html--><p style="text-align: justify;">
	&#xA0;</p>
<p style="text-align: justify;">
	<strong>Links:</strong></p>
<p style="text-align: justify;">
	Install package:</p>
<p style="text-align: justify;">
	- Primary download site:</p>
<p style="text-align: justify;">
	<a href="http://www.megaupload.com/?d=ZFD5UUC3"><span>CPCDroid.apk</span> (<span>v1.5.1</span>)</a></p>
<p style="text-align: justify;">
	<a href="http://www.megaupload.com/?d=ZFD5UUC3"><img alt="CPCDroid - Amstrad CPC on Android phone" src="https://chart.googleapis.com/chart?chs=150x150&amp;cht=qr&amp;chl=http://www.megaupload.com/?d=ZFD5UUC3&amp;choe=UTF-8" style="width: 150px; height: 150px;"></a></p>
<p style="text-align: justify;">
	&#xA0;</p>
<p style="text-align: justify;">
	- Automatic direct download site (in case the file is not available at the moment in megaupload or download directly to your phone):</p>
<p style="text-align: justify;">
	<a href="https://fmsdevel.wisecoding.es/file/sw/cpcdroid.apk"><span><span>CPCDroid.apk</span></span> (<span><span>v1.5.1</span></span>)</a></p>
<p style="text-align: justify;">
	<a href="https://fmsdevel.wisecoding.es/file/sw/cpcdroid.apk"><img alt="CPCDroid - Amstrad CPC on Android phone" src="https://chart.googleapis.com/chart?chs=150x150&amp;cht=qr&amp;chl=http://fmsdevel.wisecoding.es/file/sw/cpcdroid.apk&amp;choe=UTF-8" style="width: 150px; height: 150px;"></a></p>
<p style="text-align: justify;">
	&#xA0;</p>
<p style="text-align: justify;">
	&#xA0;</p>
<p style="text-align: justify;">
	Source code:</p>
<p style="text-align: justify;">
	<a href="http://www.megaupload.com/?d=9DR0WRS9">CPCDroid.tgz (v1.5.1)</a></p>
<p>
	&#xA0;</p>
<p>
	Please, feel free to leave your questions, suggestions or opinions in the contact me option.</p>
<p>
	&#xA0;</p>
<p>
	Enjoy again those CPC programs!</p><!--kg-card-end: html--><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/screenshot_0.png" width="480" height="272" loading="lazy" alt="CPCDroid - Amstrad CPC on Android phone"></div><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/screenshot_2.png" width="480" height="272" loading="lazy" alt="CPCDroid - Amstrad CPC on Android phone"></div><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/screenshot_3.png" width="480" height="272" loading="lazy" alt="CPCDroid - Amstrad CPC on Android phone"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/screenshot_4.png" width="480" height="272" loading="lazy" alt="CPCDroid - Amstrad CPC on Android phone"></div><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/screenshot_5.png" width="480" height="272" loading="lazy" alt="CPCDroid - Amstrad CPC on Android phone"></div><div class="kg-gallery-image"><img src="https://fmsdevel.wisecoding.es/content/images/2021/01/screenshot_8.png" width="480" height="272" loading="lazy" alt="CPCDroid - Amstrad CPC on Android phone"></div></div></div><figcaption>Captures from: La Adad&#xED;a del Crimen, Army Moves, Batman &amp; The Last Mission</figcaption></figure>]]></content:encoded></item></channel></rss>