File Permissions for gmap_markers.js

| Drupal Development | 12 seen

Time after time I'm facing this issue with gmap markers. As mostly this happens when I'm doing something on the server side with file permissions, I decided to keep the notes

here is the problem

GMap is unable to save the marker bundle, so the markers will not work. Please check file system permissions of the public://js/gmap_markers.js!

Here is the solution

sudo chmod 755 /sites/all/files/js/gmap_markers.js

Simple CSS trick to Make Table Responsive

| Drupal Development | 51 seen

Working on the OptionsBrew.com project (website is powered by Drupal 8) I faced the following responsive table issue while browsing content with a table on smaller screens (phone)

Broken Table on a smaller screen

Luckily there is a simple CSS workaround:

in the .css file add the following to table properties:

display: block; overflow-x: auto;

like this:

table{ border-collapse: separate; border-spacing: 0; width:100%; margin: 25px 0 40px; display: block; overflow-x: auto; }

here is how it looks now

Responsive table

You can see a live example here: Top 20 Most Active Stock Options May 2020


Poppy fields near Marneuli

| | 94 seen

We love poppy fields, we have featured them a couple of times here at the Piece of Life series

  • Beautiful Poppy Field Near P104 (Jaunpils-Tukums) Road (Latvia)
  • Railroad crossing in Skrunda municipality, Latvia

Today we are going to share a brief photo story with poppy field near Marneuli, next to the Милена Оптовый Магазин (Milena mall)

It was one of the first days when travel restrictions between Georgia's inner cities were lifted and we decided to head to the Marneuli side looking for poppy fields (my partner have seen online some beautiful photos of poppies the day before). I love these wandering around days.

We didn't find the special poppy field, instead we found poppies. Surprisingly we made a lot of great family portraits here rich with poppies  in the background.

Poppy fields next to the Milena Shopping mall near Marneuli

Quite an interesting stop here, we spent about an hour in this flower field.

Poppy field

That was a nice day at the end of May 2020.


Drupal 7 Fix: SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'.

| Drupal Development | 1,125 seen

I was migrating Drupal 7 website to a newer infrastructure (PHP 7.4) and during the migration process when tried to connect to the MySQL database  I faced following error - SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'.

Here is the error code:

Resolve all issues below to continue the installation. For help configuring your database server, see the installation handbook, or contact your hosting provider. Failed to connect to your database server. The server reports the following message: SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'. Is the database server running? Does the database exist, and have you entered the correct database name? Have you entered the correct username and password? Have you entered the correct database hostname?

No_auto_create_user

After quick research I was able to find a patch (Mysql 8 Support on Drupal 7 #24)  which involves overwriting core database.inc file (inclues/database/mysql - > database.inc)

here I'm pasting full working example (for a patch see here)

<?php /** * @file * Database interface code for MySQL database servers. */ /** * @addtogroup database * @{ */ class DatabaseConnection_mysql extends DatabaseConnection { /** * Flag to indicate if the cleanup function in __destruct() should run. * * @var boolean */ protected $needsCleanup = FALSE; public function __construct(array $connection_options = array()) { // This driver defaults to transaction support, except if explicitly passed FALSE. $this->transactionSupport = !isset($connection_options['transactions']) || ($connection_options['transactions'] !== FALSE); // MySQL never supports transactional DDL. $this->transactionalDDLSupport = FALSE; $this->connectionOptions = $connection_options; $charset = 'utf8'; // Check if the charset is overridden to utf8mb4 in settings.php. if ($this->utf8mb4IsActive()) { $charset = 'utf8mb4'; } // The DSN should use either a socket or a host/port. if (isset($connection_options['unix_socket'])) { $dsn = 'mysql:unix_socket=' . $connection_options['unix_socket']; } else { // Default to TCP connection on port 3306. $dsn = 'mysql:host=' . $connection_options['host'] . ';port=' . (empty($connection_options['port']) ? 3306 : $connection_options['port']); } // Character set is added to dsn to ensure PDO uses the proper character // set when escaping. This has security implications. See // https://www.drupal.org/node/1201452 for further discussion. $dsn .= ';charset=' . $charset; $dsn .= ';dbname=' . $connection_options['database']; // Allow PDO options to be overridden. $connection_options += array( 'pdo' => array(), ); $connection_options['pdo'] += array( // So we don't have to mess around with cursors and unbuffered queries by default. PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE, // Because MySQL's prepared statements skip the query cache, because it's dumb. PDO::ATTR_EMULATE_PREPARES => TRUE, ); if (defined('PDO::MYSQL_ATTR_MULTI_STATEMENTS')) { // An added connection option in PHP 5.5.21+ to optionally limit SQL to a // single statement like mysqli. $connection_options['pdo'] += array(PDO::MYSQL_ATTR_MULTI_STATEMENTS => FALSE); } parent::__construct($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']); // Force MySQL to use the UTF-8 character set. Also set the collation, if a // certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci' // for UTF-8. if (!empty($connection_options['collation'])) { $this->exec('SET NAMES ' . $charset . ' COLLATE ' . $connection_options['collation']); } else { $this->exec('SET NAMES ' . $charset); } // Set MySQL init_commands if not already defined. Default Drupal's MySQL // behavior to conform more closely to SQL standards. This allows Drupal // to run almost seamlessly on many different kinds of database systems. // These settings force MySQL to behave the same as postgresql, or sqlite // in regards to syntax interpretation and invalid data handling. See // http://drupal.org/node/344575 for further discussion. Also, as MySQL 5.5 // changed the meaning of TRADITIONAL we need to spell out the modes one by // one. $connection_options += array( 'init_commands' => array(), ); $connection_options['init_commands'] += array( 'sql_mode' => "SET sql_mode = 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO'", ); // Execute initial commands. foreach ($connection_options['init_commands'] as $sql) { $this->exec($sql); } } public function __destruct() { if ($this->needsCleanup) { $this->nextIdDelete(); } } public function query($query, array $args = array(), $options = array()) { $query = preg_replace('/{([^}]+)}/', '`\1`', $query); // This to make Drush work $query = str_replace(' system.', ' `system`.', $query); $query = str_replace('`system` system', '`system` `system`', $query); return parent::query($query, $args, $options); } public function queryRange($query, $from, $count, array $args = array(), array $options = array()) { return $this->query($query . ' LIMIT ' . (int) $from . ', ' . (int) $count, $args, $options); } public function queryTemporary($query, array $args = array(), array $options = array()) { $tablename = $this->generateTemporaryTableName(); $this->query('CREATE TEMPORARY TABLE {' . $tablename . '} Engine=MEMORY ' . $query, $args, $options); return $tablename; } public function driver() { return 'mysql'; } public function databaseType() { return 'mysql'; } public function mapConditionOperator($operator) { // We don't want to override any of the defaults. return NULL; } public function nextId($existing_id = 0) { $new_id = $this->query('INSERT INTO {sequences} () VALUES ()', array(), array('return' => Database::RETURN_INSERT_ID)); // This should only happen after an import or similar event. if ($existing_id >= $new_id) { // If we INSERT a value manually into the sequences table, on the next // INSERT, MySQL will generate a larger value. However, there is no way // of knowing whether this value already exists in the table. MySQL // provides an INSERT IGNORE which would work, but that can mask problems // other than duplicate keys. Instead, we use INSERT ... ON DUPLICATE KEY // UPDATE in such a way that the UPDATE does not do anything. This way, // duplicate keys do not generate errors but everything else does. $this->query('INSERT INTO {sequences} (value) VALUES (:value) ON DUPLICATE KEY UPDATE value = value', array(':value' => $existing_id)); $new_id = $this->query('INSERT INTO {sequences} () VALUES ()', array(), array('return' => Database::RETURN_INSERT_ID)); } $this->needsCleanup = TRUE; return $new_id; } public function nextIdDelete() { // While we want to clean up the table to keep it up from occupying too // much storage and memory, we must keep the highest value in the table // because InnoDB uses an in-memory auto-increment counter as long as the // server runs. When the server is stopped and restarted, InnoDB // reinitializes the counter for each table for the first INSERT to the // table based solely on values from the table so deleting all values would // be a problem in this case. Also, TRUNCATE resets the auto increment // counter. try { $max_id = $this->query('SELECT MAX(value) FROM {sequences}')->fetchField(); // We know we are using MySQL here, no need for the slower db_delete(). $this->query('DELETE FROM {sequences} WHERE value < :value', array(':value' => $max_id)); } // During testing, this function is called from shutdown with the // simpletest prefix stored in $this->connection, and those tables are gone // by the time shutdown is called so we need to ignore the database // errors. There is no problem with completely ignoring errors here: if // these queries fail, the sequence will work just fine, just use a bit // more database storage and memory. catch (PDOException $e) { } } /** * Overridden to work around issues to MySQL not supporting transactional DDL. */ protected function popCommittableTransactions() { // Commit all the committable layers. foreach (array_reverse($this->transactionLayers) as $name => $active) { // Stop once we found an active transaction. if ($active) { break; } // If there are no more layers left then we should commit. unset($this->transactionLayers[$name]); if (empty($this->transactionLayers)) { if (!PDO::commit()) { throw new DatabaseTransactionCommitFailedException(); } } else { // Attempt to release this savepoint in the standard way. try { $this->query('RELEASE SAVEPOINT ' . $name); } catch (PDOException $e) { // However, in MySQL (InnoDB), savepoints are automatically committed // when tables are altered or created (DDL transactions are not // supported). This can cause exceptions due to trying to release // savepoints which no longer exist. // // To avoid exceptions when no actual error has occurred, we silently // succeed for MySQL error code 1305 ("SAVEPOINT does not exist"). if ($e->errorInfo[1] == '1305') { // If one SAVEPOINT was released automatically, then all were. // Therefore, clean the transaction stack. $this->transactionLayers = array(); // We also have to explain to PDO that the transaction stack has // been cleaned-up. PDO::commit(); } else { throw $e; } } } } } public function utf8mb4IsConfigurable() { return TRUE; } public function utf8mb4IsActive() { return isset($this->connectionOptions['charset']) && $this->connectionOptions['charset'] === 'utf8mb4'; } public function utf8mb4IsSupported() { // Ensure that the MySQL driver supports utf8mb4 encoding. $version = $this->getAttribute(PDO::ATTR_CLIENT_VERSION); if (strpos($version, 'mysqlnd') !== FALSE) { // The mysqlnd driver supports utf8mb4 starting at version 5.0.9. $version = preg_replace('/^\D+([\d.]+).*/', '$1', $version); if (version_compare($version, '5.0.9', '<')) { return FALSE; } } else { // The libmysqlclient driver supports utf8mb4 starting at version 5.5.3. if (version_compare($version, '5.5.3', '<')) { return FALSE; } } // Ensure that the MySQL server supports large prefixes and utf8mb4. try { $this->query("CREATE TABLE {drupal_utf8mb4_test} (id VARCHAR(255), PRIMARY KEY(id(255))) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ROW_FORMAT=DYNAMIC ENGINE=INNODB"); } catch (Exception $e) { return FALSE; } $this->query("DROP TABLE {drupal_utf8mb4_test}"); return TRUE; } } /** * @} End of "addtogroup database". */

May 2020 Dividend Income Report - $225.17

| Investments | 16 seen

Welcome to the thirty-seventh (#37) dividend income report, covering earnings I've made from dividend-paying stocks and peer to peer lending in May 2020.

Just like the previous month of April, in May we also spent in a self-isolation (because of Covid-19) here in Georgia. Some of the strict lockdown measurements were lifted (like using a private vehicle and going from city to city)  we did a few road trips here in Georgia.  Baby girl is doing her online class, learning about animals, shapes, continents, and even planets. Quite fascinating what a 22-month-old can do. Development is very rapid.

Saint Dimitri Tesalonikeli Fathers Moanstery near Mtksheta

May come with very sad news - my dad passed away, some 11 days before his 66 year birthday. My dad was like a best buddy to me, we talked a lot about investments, stocks, politics, we argued, disagreed, we had opinions  - most of our conversations were on WhatsApp chat, he was very tech guy, into gadgets.. dad I miss you. Everything's gonna be alright - this was his favorite phrase. His last message on WhatsApp was on May 8:

Last message from Dad on May 8, 2020

The loss of dad will leave a space in my life that can never get filled.

From the perspective of dividend income -  last May was very good, we were able to take $225.17, despite most of our dividends are trimmed by half and more. Back in March's market panic, we bought for a cheap a lot of FGB stock, this stock helped to boost this May's dividend income. FGB is not the stock we would like to keep for life, but I feel happy I bought it back in March.

Compared to the previous May in 2019, our monthly dividend has increased by a mere 4.16%  (+$9.00). Despite I was looking at a $300-$350 dividend this month a year ago, I will say the overall result is very good, taking into account the market downturn.

An additional $595.43 was made from options trading.   As options trading is not a passive form of making money while you are sleeping it wouldn't be fair to include them in dividend income reports. As we love selling options a lot, during the month of May I launched a separate website -  Investing with covered calls - OptionsBrew.com You can read our first options income review here: May 2020 Options Income Report - $595.43

If counted all together (dividends + options) it seems we have made $820.6 in total last month. 

Effective income yield last May was 4.36% (about 52.32% annually) Which is great. One of my monthly goals is to generate at least 2.5% income yield from the portfolio. As longs it's above to it - it's awesome.

From dividends + active trading taking 30% year seems quite doable. The first five months of 2020 have been a bumpy road, but we have been able to take more than 2.5% from the market in 3 out of the 5 months. 

Interest income in May 2020

From the stocks and peer to peer lending I got following income last month:

Ticker

Earnings

FGB

€75.23

BGLF

€36.30

XIN

€17.52

EDI

€14.04

Mintos

€11.26

EDF

€9.77

NRZ

€9.54

KNF1L

€9.05

RA

€7.60

NCV

€6.48

ET

€5.44

AWP

€3.66

Total EUR 206.58 / USD 225.17

In total there were 12 companies paying us dividend in May 2020 that is 3 companies less than in May 2019

Monthly income

I've been tracking my journey towards million dollars in a savings account since January 2017. More than three years already. The result, so far, looks quite good. Dividends are growing (even when they are not)

Monthly dividend Income chart as of May 2020

The cumulative earnings for 2020 now are $882.72  which is exactly 24.52% from my goal of 2020 ($3,600). On average, it would ask us to generate $388.89 every month for the next 7 months to reach this goal. Right, now the goal looks unattainable, as for now, I cannot see even a single $300 month for 2020, but this could change later, during the year as we are trying to add more quality stock to the portfolio. 

2019 in Review and Financial Goals for 2020

Goals for May 2021

This is my favorite part of the reports - trying to forecast/set goals for the next year. But before setting a goal for 2020, let's see what I forecasted/said a year ago (May 2019)

When setting goals for May 2020, I will say $300 seems a good number to work with, but I want more - at least $350 for May 2020

None of the numbers were reached. Taking into account the downturn in the markets and many dividend trims. I will say that it is quite acceptable. 

For May 2021 I have a goal to crack finally that $300 milestone, to get there will add more quarterly stocks paying dividends in May (like FBG, PBCT, and T). From today's perspective looks quite possible.


Top 30 Dividend Paying Stocks in Germany (DAX Index)

| Investments | 708 seen

Investing in Germany is quite easy, you could do so by buying German stocks. There are many German stocks to invest in, but in this article, I will talk about Germany's blue-chip stocks, stocks from the DAX index

The DAX (Deutscher Aktienindex (German stock index)) is a blue-chip stock market index consisting of the 30 major German companies trading on the Frankfurt Stock Exchange. Prices are taken from the Xetra trading venue. According to Deutsche Börse, the operator of Xetra, DAX measures the performance of the Prime Standard’s 30 largest German companies in terms of order book volume and market capitalization.

Here I have listed all 30 stocks from the DAX index, sorting by the highest dividend yield.

When looking at German stocks, I'm more interested in selling options on them, as to collect dividends, when talking about the DAX index - all stocks from the index are optionable, which is awesome. 

Click here to join my covered calls newsletter

Highest paying dividend stocks from the German DAX index

Use this table to find out the highest paying dividend stock in Germany, grouped by sector, stock, price, dividend yield and year established.

Company Prime Standard industry group Ticker symbol Price Dividend Yield Options Founded Deutsche Lufthansa Transport Aviation ETR:LHA €9.27 8.07% yes 1953 BASF Chemicals ETR:BAS €49.75 6.66% yes 1865 Allianz Insurance ETR:ALV €168.90 5.64% yes 1890 E.ON Energy ETR:EOAN €9.98 4.65% yes 2000 Munich Re Insurance ETR:MUV2 €210.00 4.59% yes 1880 Bayer Pharmaceuticals and chemicals ETR:BAYN €62.00 4.56% yes 1863 BMW Manufacturing ETR:BMW €54.39 4.54% yes 1916 Volkswagen Group Manufacturing ETR:VOW3 €140.12 4.53% yes 1937 Continental Manufacturing ETR:CON €91.78 4.37% yes 1871 Deutsche Post Logistics ETR:DPW €28.98 4.31% yes 1995 Deutsche Telekom Communications ETR:DTE €14.10 4.26% yes 1995 Siemens Industrial, electronics ETR:SIE €98.98 3.86% yes 1847 Covestro Chemicals ETR:1COV €34.92 3.47% yes 2015 Vonovia Real estate ETR:VNA €50.12 3.11% yes 2001 RWE Energy ETR:RWE €29.35 2.72% yes 1898 Daimler Manufacturing ETR:DAI €35.55 2.56% yes 1926 Henkel Consumer goods and chemicals ETR:HEN3 €78.54 2.35% yes 1876 Linde Industrial gases ETR:LIN €175.75 2.20% yes 1879 MTU Aero Engines Aerospace ETR:MTX €152.80 2.19% yes 1934 Fresenius Medical ETR:FRE €42.36 1.98% yes 1912 Deutsche Börse Securities ETR:DB1 €148.65 1.95% yes 1992 Adidas Clothing ETR:ADS €233.00 1.64% yes 1924 Fresenius Medical Care Medical ETR:FME €73.16 1.64% yes 1996 Deutsche Bank Banking ETR:DBK €7.79 1.41% yes 1870 SAP Software ETR:SAP €111.84 1.40% yes 1972 Infineon Technologies Semiconductors ETR:IFX €19.25 1.37% yes 1999 HeidelbergCement Building ETR:HEI €45.40 1.31% yes 1874 Merck Pharmaceuticals ETR:MRK €101.20 1.28% yes 1668 Beiersdorf Consumer goods and chemicals ETR:BEI €93.84 0.77% yes 1882 Wirecard Financial Technology ETR:WDI €89.25 0.22% yes 1999

Data source: DAX, stock prices as of May 27, 2020

It's amazing to note, all stocks from the DAX index are paying dividends. I'm not an expert in German stocks but seems dividends are paid annually (unlike in the US, where dividends are paid quarterly or even monthly)

Dividends are not the reason I'm looking at these German stocks, options are.

If you are interested to learn more about our options trades on these German stocks, see this covered call idea with Deutsche Bank stock (FRA:DBK)


How To Swap / Transfer IP address with Linode VPS

| Servers | 73 seen

Recently I was rebuilding a compromised VPS on the Linode - this was a small web server serving some 3 established websites. It took me a few hours from A-Z  - launch a new Linode, install a new webserver on it, then transfer data from one host to another.

Once all migration works were done, there was an option to change DNS entry to point to the new server. Nothing complicated. But there is a neat feature from Linode called - Swap IP (IP Transfer). That's a little perk from Linode and quite good for SEO

You can get a cheap VPS starting just $5/mo from Linode. That's what I did - bought a new Linode just for $10

If you have two Linodes in the same data center, you can use the IP transfer feature to switch their IP addresses. This could be useful in several situations. For example, if you’ve built a new server to replace an old one, you could swap IP addresses instead of updating the DNS records.

IP Transfer with Linode

Here are the instructions how to transfer IP on Linode (found here: How do I move an IP Address around between different Linodes?)

  • Login to the Linode Cloud Manager. https://cloud.linode.com
  • Click on "Linodes" in the bar on the left.
  • Select the Linode which has the IP address set up with DNS records.
  • In the upper-right corner of the page, you will see a pull down menu that shows the state of your Linode. If it is running, select Power Off and make a note of its name.
  • Go back to the Linodes page.
  • Select the Linode which you would like to get the IP which is already set up for DNS.
  • Click on the "Networking" tab and scroll to the bottom.
  • Click on "IP Transfer".
  • Select the IP Address (if there is more than one address assigned to this Linode)
  • Under Actions, select "Swap With"
  • A pulldown will appear that will let you select the Linode that has the IP address you want.
  • Select the IP address from those addresses that Linode has.
  • Click "Save"
  • You can now boot your Linode and work with it.

  • How To Block IP Address in Drupal 8

    | Drupal Development | 118 seen

    Unlike in Drupal 7 version where IP banning is enabled by default, with Drupal 8 version, there is one more step added - IP banning must be enabled from the extend section.

    Here is how. (source)

  • Log into your Drupal 8 admin interface.
  • From the top menu bar, click on the menu tab and then the Extend tab from the second menu bar.
  • You are now on the modules list page. The Ban module is listed under the Core category. To enable it, simply click on the checkbox to the left of the module.
  • Once selected, scroll to the bottom and click on the Save Configuration button to enable the module. Now that you have the Ban module enabled, you can now block IP addresses.
  • Now head to the Configuration -> People -> IP address bans and manually enter IP addresses that are abusing your Drupal 8 website

    Ip address bans in Drupal 8


    Under The Georgian Sun / King Davids Tower (s)

    | | 17 seen

    It was on the evening of April 27, 2020, I decided to switch glass (from the kit lens to telephoto) and make some photo for the month of April to put in the description in the monthly dividend income report.

    The photo of the month turned out to be a sunset in Tbilisi with skyscraper in the foreground

    King David Towers in Tbilisi

    From the KDR website

    Two landmark towers King David Residences and King David Business Center are harmonically united in an exclusive multifunctional complex King David.

    King David creates a five-star lifestyle within exceptionally elegant residential and business towers with beautifully designed amenity spaces organized enticingly as a multistory urban resort and exclusive collection of specially-designed services.

    King David Residences - the tall tower, which contains luxury Residences, has been designed to create a lifestyle of true sophistication. Floor-to-ceiling window walls capture the breathtaking panorama of Tbilisi, allow for abundant natural light and create a sense of tranquility in each and every home.

    Each residence will provide inspiration, comfort, and empowerment for its residents. This unique full-service condominium residence introduces a new way of living in Tbilisi, merging comfort and convenience to balance the demands of today’s active lifestyles. Residents can spend their days working, relaxing, and socializing throughout their own building.

    This project offers opportunities for people to live and work in the downtown area, meeting the city's long-term objectives. King David Business Center is built with thoughtful amenities and luxurious conveniences to create the right working environment for business organizations.

    King David is a celebration of excellence and innovation, with an estimated completion date of July 2017, which will be an architecturally significant addition to the Tbilisi skyline.

    Taken April 27, 2020 / Sigma photo lens 70-300mm

     


    How To HTTPS Secure Drupal 8 Running Nginx with Let's Encrypt on Ubuntu 18.04

    | Servers | 47 seen

    Let's Encrypt have done some very good job, providing SSL certificates that everyone can use absolutely for free. Encrypted HTTPS websites should be default in 2020.

    I have been implementing HTTPS secure websites for years. Until now I mostly worked with Drupal 7 websites and for securing them I have been using this guide, back from 2016 - Linode: How To Secure Nginx with Let's Encrypt on Ubuntu 12.04

    Now, in 2020, working on a new, Drupal 8 powered, website after then initial web development was completed,  I was looking for an easy way to implement a free SSL certificate from Let's Encrypt.

    And here comes this tutorial from Digital Ocean in help: How To Secure Nginx with Let's Encrypt on Ubuntu 18.04

     in 2020, installing, obtaining and renewing an SSL certificate is much easier than it was back in 2016

    Before proceeding, make sure you have installed Drupal 8 with Nginix on Ubuntu 18.04,

    Non secure Drupal 8 website

    Step 1: Installing Certbot

    The first step to using Let’s Encrypt to obtain an SSL certificate is to install the Certbot software on your server.

    Certbot is in very active development, so the Certbot packages provided by Ubuntu tend to be outdated. However, the Certbot developers maintain a Ubuntu software repository with up-to-date versions, so we’ll use that repository instead.

    First, add the repository:

    sudo add-apt-repository ppa:certbot/certbot

    You’ll need to press ENTER to accept.

    Install Certbot’s Nginx package with apt:

    sudo apt install python-certbot-nginx

    Certbot is now ready to use, but in order for it to configure SSL for Nginx, we need to verify some of Nginx’s configuration.

    Step 2: Obtaining an SSL Certificate

    Certbot provides a variety of ways to obtain SSL certificates through plugins. The Nginx plugin will take care of reconfiguring Nginx and reloading the config whenever necessary. To use this plugin, type the following:

    sudo certbot --nginx -d optionsbrew.com

    This runs certbot with the --nginx plugin, using -d to specify the names we’d like the certificate to be valid for.

    If this is your first time running certbot, you will be prompted to enter an email address and agree to the terms of service. After doing so, certbot will communicate with the Let’s Encrypt server, then run a challenge to verify that you control the domain you’re requesting a certificate for.

    If that’s successful, certbot will ask how you’d like to configure your HTTPS settings.

    Configuring certbot

    Select your choice then hit ENTER. The configuration will be updated, and Nginx will reload to pick up the new settings. certbot will wrap up with a message telling you the process was successful and where your certificates are stored:

    Your certificates are downloaded, installed, and loaded. Try reloading your website using https:// and notice your browser’s security indicator. It should indicate that the site is properly secured,

    Secure HTTPS Drupal 8 site

    Step 3: Verifying Certbot Auto-Renewal

    Let’s Encrypt’s certificates are only valid for ninety days. This is to encourage users to automate their certificate renewal process. The certbot package we installed takes care of this for us by adding a renew script to /etc/cron.d. This script runs twice a day and will automatically renew any certificate that’s within thirty days of expiration.

    To test the renewal process, you can do a dry run with certbot:

    sudo certbot renew --dry-run

    If you see no errors, you’re all set. When necessary, Certbot will renew your certificates and reload Nginx to pick up the changes. If the automated renewal process ever fails, Let’s Encrypt will send a message to the email you specified, warning you when your certificate is about to expire.


    How to Install Drupal 8 with Nginx, PHP-FPM 7.2, MySQL, phpMyAdmin on Ubuntu 18.04 - Linode Guide

    | Servers | 68 seen

    In this article, you will learn how to setup Drupal 8 with Nginx, PHP-FPM 7.2, MySQL and phpMyAdmin on Ubuntu 18.04

    For the following tutorial, I used very much the information from my previous guide with Ubuntu 16.04, but decided to rewrite it for Ubuntu 18.04 version as when I tried to setup my latest project about stock trading 0dtespxtrading.com  with Drupal 8.8.5  on Ubunut 16.04 machine an error from Drupal that PHP version shipped with Ubuntu 16.04   was outdated and instead of upgrading that box I decided to go with a new server from scratch, 

    Prerequisites

    • Ubuntu 18.04 
    • Root privileges.

    You can get a cheap VPS starting just $5/mo from Linode. That's what I did - bought a new nanode from Linode

    Deploying server with Linode

    Literally in couple of seconds the new server was up and running - that's what I love sticking with Linode for years

    Follow basic security guide, see: Securing Your Server

    I will use Putty for Windows to access SSH

    Secure your server

    Create the user, replacing example_user with your desired username. You’ll then be asked to assign the user a password:

    adduser example_user


    Add the user to the sudo group so you’ll have administrative privileges:

    adduser example_user sudo

    Disallow root logins over SSH. This requires all SSH connections be by non-root users. Once a limited user account is connected, administrative privileges are accessible either by using sudo or changing to a root shell using su -.

    sudo nano /etc/ssh/sshd_config

    Under # Authetification section change to

    # Authentication: ... PermitRootLogin no

    Update the Ubuntu system

    sudo apt-get update

    Install Nginx and PHP-FPM

    Install Nginx with the following apt command:

    sudo apt-get install nginx -y

    Next, install php7.0-fpm with php-gd extension that is required by Drupal core:

    sudo apt-get install php7.2-fpm php7.2-cli php7.2-gd php7.2-mysql php7.2-xml -y

    Configure Nginx and PHP-FPM

    In this step, we will configure Nginx to use php-fpm to serve HTTP requests for PHP pages. Go to the php-fpm directory "/etc/php/7.0/fpm" and edit the "php.ini" file:

    sudo nano /etc/php/7.2/fpm/php.ini

    Un-comment the cgi.fix_pathinfo line and change the value to "0"

    When using nano command you can use CTRL+W to locate that line. Once changed press CTRL+O to save changes and CTRL+X to exit from nano editor

    Now we should modify the default Nginx virtual host configuration. Edit the "default" file and enable the php-fpm directive.

    sudo nano /etc/nginx/sites-available/default

    Un-comment  location ~ \.php$ section, so it look like this

    location ~ \.php$ { include snippets/fastcgi-php.conf; # With php7.0-cgi alone: #fastcgi_pass 127.0.0.1:9000; # With php7.0-fpm: fastcgi_pass unix:/run/php/php7.2-fpm.sock; }

    CTRL+O and CTRL+X

    Then test the Nginx configuration with the command "nginx -t" to ensure that it is valid:

    nginx -t

    If there is no error, restart nginx and the php-fpm service:

    systemctl restart nginx systemctl restart php7.2-fpm

    PHP Info file (Optional)

    Next, test that php-fpm is working properly with nginx by creating new php info file in the web directory "/var/www/html"

    cd /var/www/html/ echo "<?php phpinfo(); ?>" > info.php

    Visit the info.php file at the server IP  in a web browser.

    Configure the VirtualHost for Drupal

    We will install Drupal 8 in the directory "/srv/www/0dtespxtrading.com". Please replace my domain name in your installation with the domain name of the website that you want to use this Drupal installation for. So let's create the directory:

    sudo mkdir -p /srv/www/0dtespxtrading.com/{public_html,logs} sudo usermod -a -G www-data admin sudo chown -R www-data:www-data /srv/www sudo chmod -R 775 /srv/www sudo nano /etc/nginx/sites-available/0dtespxtrading.com

    Paste the Nginx configuration for Drupal 8:

    server { server_name 0dtespxtrading.com; root /srv/www/0dtespxtrading.com/public_html; ## <-- Your only path $ access_log /srv/www/0dtespxtrading.com/logs/access.log; error_log /srv/www/0dtespxtrading.com/logs/error.log; listen 80; listen [::]:80; location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } # Very rarely should these ever be accessed outside of your lan location ~* \.(txt|log)$ { allow 192.168.0.0/16; deny all; } location ~ \..*/.*\.php$ { return 403; } location ~ ^/sites/.*/private/ { return 403; } # Block access to "hidden" files and directories whose names begin with a # period. This includes directories used by version control systems such # as Subversion or Git to store control files. location ~ (^|/)\. { return 403; } location / { # try_files $uri @rewrite; # For Drupal <= 6 try_files $uri /index.php?$query_string; # For Drupal >= 7 } location @rewrite { rewrite ^/(.*)$ /index.php?q=$1; } # In Drupal 8, we must also match new paths where the '.php' appears in the middle, # such as update.php/selection. The rule we use is strict, and only allows this pattern # with the update.php front controller. This allows legacy path aliases in the form of # blog/index.php/legacy-path to continue to route to Drupal nodes. If you do not have # any paths like that, then you might prefer to use a laxer rule, such as: # location ~ \.php(/|$) { # The laxer rule will continue to work if Drupal uses this new URL pattern with front # controllers other than update.php in a future release. location ~ '\.php$|^/update.php' { fastcgi_split_path_info ^(.+?\.php)(|/.*)$; #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini include fastcgi_params; include snippets/fastcgi-php.conf; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_intercept_errors on; fastcgi_pass unix:/run/php/php7.2-fpm.sock; } # Fighting with Styles? This little gem is amazing. # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6 location ~ ^/sites/.*/files/styles/ { # For Drpal >= 7 try_files $uri @rewrite; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } }

    CTRL+O and CTRL + X

    The Drupal virtual host file has been created, now we have to activate it by creating a symlink to the file in the "sites-enabled" directory:

    ln -s /etc/nginx/sites-available/0dtespxtrading.com /etc/nginx/sites-enabled/

    Test the Nginx configuration and if there is no errors restart Nginx:

    nginx -t systemctl restart nginx

    Install MySQL

    sudo apt-get install mysql-server ​sudo mysql_secure_installation

    Install phpMyAdmin

    sudo apt-get install phpmyadmin

    Hit ESC when the installation prompts you for auto-configuration, because there is no option for Nginx.

    Make an easy accessible symlink

    sudo ln -s /usr/share/phpmyadmin/ /srv/www/reinisfischer.com/public_html/phpmyadmin

    Install and Configure Drupal

    Enter the directory that we created earlier and download Drupal with wget. I'm using the latest Drupal 8.8.7]5. release as of April 23, 2020, make sure you are downloading latest version by visiting Drupal 8 download page and writing down the last numbers (version)

    cd /srv/www/0dtespxtrading.com sudo wget https://ftp.drupal.org/files/projects/drupal-8.8.5.tar.gz sudo tar -xvzf drupal-8.8.5.tar.gz sudo cp drupal-8.8.5/* public_html/ -R sudo chown www-data:www-data public_html -R

    Now visit your Drupal site in the web Browser, you should see following screen

    Drupal 8 welcome screen

    Now, it's just time to connect database and set up your Drupal 8 website


    April 2020 Dividend Income Report - $78.40

    | Investments | 16 seen

    Welcome to the thirty-sixth (#36) dividend income report, covering earnings I've made from dividend-paying stocks and peer to peer lending in April 2020.

    Last April we spent in a self-isolation (because of Covid-19) here in Georgia. Baby girl is doing her online class, learning about animals, shapes, continents, and even planets. Quite fascinating what a 21-month-old can do. Development is very rapid.

    King Davids Tower (s) in Tbilisi

    It was on the evening of April 27, 2020, I decided to switch glass (from the kit lens to telephoto) and make some photo for the month of April to put in the description for the monthly dividend income report.

    From the perspective of the market, last April was quite good, we recovered some 15% from the lost value, but still are under the water. From the perspective of dividends - this was a complete disaster - most ot the dividends were trimmed, some cut down to 0. Before the World's health crisis is was planned to take about $230 in dividends last April, but we managed to book only $78.40.

    That's one of the worst dividend months in years - the sad news, this is not over - it will take many months, if not years to recover.

    Compared to the previous April in 2019, that is a decrease of -52.26% (-$85.84)

    Options trades helped a little to offset the losses, but also were nothing impressive - I made some money with calls and puts, but lost some money with vertical spreads. At the end of the month, we were able to book $41.33 from options trades. 

    For a now I have decided to pause my adventures with crypto options, but I made some $9.28 last month

    When counted all together (dividends + options + crypto options), it seems I have made $129.01 in total last month. Effective income yield last April was 0.76% (about 9.12% annually) Which is humble for me, but anything positive in these times is good.

    One of my monthly goals is to generate at least 2.5% income yield from a portfolio. Let's see, can I get on the track in the futures months (Spoiler alert - the only way I see this happen is from option trading

    Interest income in April 2020

    From the stocks and peer to peer lending I got following income last month:

    Ticker

    Earnings

    EDI

    €27.26

    EDF

    €21.33

    Mintos

    €8.09

    RA

    €7.81

    NCV

    €3.88

    AWP

    €3.76

    Total EUR 71.83 / USD 78.40

    In total there were 6 companies paying us dividend in April 2020 that 5 companies less than in April 2020

    We didn't get payments this April from, NRZ (dividend will be paid in May, but is cut by 90%), PNNT (we still hold the stock, but our stock was sold on div ex-day back in March, so we didn't qualify for a dividend this April, hopefully, things will get better in July.

    If things were at the pre-COVID-19, we would collect at least $138.45 from NRZ and PNNT, but we didn't.

    Monthly income

    I've been tracking my journey towards million dollars in a savings account since January 2017.  More than three years already. The result for 2020 is lagging behind

    in 3 out of 4 months this year, the dividend income has been lower than in 2019

    Monthly dividend Income chart as of April 2020

    The cumulative dividend earnings for 2020 now are $657.55  which is exactly 18.27% from my goal of 2020 ($3,600). On average, it would ask me to generate $367.81 every month for the next 8 months to reach my goal. With 90% confidence, I'm saying this goal won't be reached this year.

    2019 in Review and Financial Goals for 2020

    Goals for April 2021

    This is my favorite part of the reports - trying to forecast/set goals for the next year. But before setting a goal for 2020, let's see what I forecasted/said a year ago (April 2019)

    When setting goals for April 2020, I will say I want to increase dividend income by at least $70 - it translates in $234. Let's keep an odd number. I like them. lol

    Wow, a total failure. I wasn't' smart enough to build Covid-19 proof dividend portfolio and instead of an increase of $70, we are now experiencing a decrease of more than $80.

    When setting goals for 2021 - I will say anything above $200 will be a great result. To get there it will ask a lot of smart investments and a lot of cash deployed


    Rundāle Palace and Garden

    | Tourism objects | 17 seen

    Rundāle Palace  is one of the two major baroque palaces built for the Dukes of Courland in what is now Latvia, the other being Jelgava Palace. The palace was built in two periods, from 1736 until 1740 and from 1764 until 1768. It is situated at Pilsrundāle, 12 km west of Bauska.

    The palace and its garden are among the top 10 destinations to visit in Latvia. 

    We have been heading to Rundāle once in a while, when in Latvia, preferably in Summer.

    Rundala palace and its garden

    In 1735 Duke of Courland Ernst Johann von Biron bought land in Rundāle with an old medieval castle in the territory of a planned summer residence. The old castle was demolished and construction after the design of Bartolomeo Rastrelli started in 1736.

    Construction proceeded slowly because part of the materials and resources were transferred to the construction of Jelgava Palace, a project which was more important for the duke. Following Biron's fall from grace in 1740, the palace stood unfinished and empty until 1762 when Biron returned from his exile.

    Under the supervision of Rastrelli its construction was finished in 1768. Johann Michael Graff produced lavish stucco decorations for the palace during this time. Ernst Johann von Biron loved the palace and moved there already in 1768. He often visited palace and spent summers there until his death in 1772. Son of an Ernst Johann duke Peter von Biron visited palace only a few times because unlike his father he preferred to spend summers in his Vircava manor.

    Garden at Rundale place

    The garden is really impressive. It can compete to the famous Keukenhof tulip fields in the Netherlands.

    The palace is one of the major tourist destinations in Latvia. It is also used for the accommodation of notable guests, such as the leaders of foreign nations. The palace and the surrounding gardens are now a museum


    Guest House Old Wall in Lagodekhi

    | Hotel reviews | 9 seen

    Offering a barbecue and children's playground, Guest House Old Wall is situated in Lagodekhi.

    Property is set within the historic walls of the old castle Lakuasti. Guests can enjoy the on-site bar. Free WiFi is available throughout the property and free private parking is available on site.

    This was our first stay in Lagodekhi, during a recent trip to the region (September 2019), we arrived here after a nice and comfy stay at Akhasheni Wine Resort near Gurjaani. 

    Guest House Old Wall in Lagodekhi

    It was decided to use this guesthouse as a base to reach the Ninoskhevi waterfall. And seems the guest house is one of the top choices for travelers from all around the World to get there.

    Rooms feature mountain or garden views. Guests can enjoy traditional Georgian dishes on site.

    Interior inside guest house

    Nice and cozy. We were offered a duplex room, but as we were traveling with a toddler, we asked to switch our rooms and were presented room in the first floor.

    During our one night stay here we met travelers from Germany, Israel. In the evening kid hosts made a supra for us in the outside garden.

    Traditional Georgian supra in the evening

    Grilled mead, salads and cheese, really good.


    3 Trades to Generate $200/mo Selling Naked Puts on Dividend Stocks

    | Investments | 45 seen

    Selling naked puts on dividend stocks is one of my favorite income-generating strategies. I've been selling options since the end of March 2019, and as a seasoned dividend income investor, I find options as one of the best inventions of our time. 

    3 Trades to Generate $165 - $350/mo Selling Cash-Secured Put Options

    Income from options regularly puts food on our family table (or at least buys some candies).

    To follow up on my trades in almost real-time - subscribe to my newsletter at Covered Calls with Reinis Fischer

    I sell puts and calls. Also, I do verticals on the S&P 500 (SPX), and trade futures on Gold, and other instruments. the most important - I find a lot of fun there.

    Investment Goal #7 - Selling Puts to Own / Generate Income

    Recently I was reading a good article about 3 Trades to Generate $1,000 Every Month Selling Puts article, where the author talks about selling puts on Microsoft, BP, and XLF stocks. The author also finds it will require about $46,100 to generate $1,020/mo or 2.21% yield/mo. 

    I decided to mirror this approach, but instead of selling puts on MSFT, BP, or XLF stocks, I will use stocks I hold in our portfolio - AT&T, Pfizer, and Cisco Systems. By the way, all three are great dividend stocks that combined are paying dividends every month of the year

    Generate monthly income selling puts on AT&T (T) stock

    At&T stock price as of February 7, 2020

    T probably is my favorite stock to sell options on it. There are a few reasons I like T - it is a component of the S&P 500 composite index, it has raised it's dividend for 34 consecutive years, and it has one of the highest dividends on the S&P 500 list.

    I have been selling puts on it since March or April 2019. T is the stock I have in my dividend stock portfolio and it contributes a little to our dividend income in February, May, August, and November.

    You could sell a put with March 6 expiry with a strike price of $38 for about $0.49. That gets you $49 and makes about 1.28% return is less than 30 days. Or about 15.36% annualized.  Break-even: $37.51

    If T stock closes above $38 on March 6, you keep the premium and start over. If the stock closes under $38 you get assigned but check your break-even points. There are several options you could use not to get assigned, like a roll down or roll forward. Or you could take stock, collect the dividend and sell covered calls. Win, win, win

    Remember, you are selling one contract, 100 shares of T stock, make sure you have $3,800 cash or buying power (margin) to buy 100 shares if assigned.

    Generate monthly income selling puts on Pfizer (PFE) stock

    Pfizer stock price as of February 7, 2020

    Just like AT&T, Pfizer stock is also a component of S&P 500, plus is on the list of Dow Jones, even more, Pfizer is part of the Dogs of the Dow list (highest dividend-paying stocks from Dow Jones index), the dividend is above 3%, and what's great Pfizer has increased its dividend for the past 9 consecutive years.

    Pfizer is one of the latest additions to our dividend income portfolio. I started to acquire Pfizer stock for the so-called Partnership fund, which basically means I'm buying once in a month Pfizer stock for my better part.

    I have been selling puts on Pfizer stock since January 2020. Pfizer stock also contributes some bits to our dividend income in the following months: March, June, September, and December

    You could sell a put on Pfizer stock with March 6 expiry and strike price of $38 for about $0.68. That gets you $68 and makes about 1.78% return is less than 30 days. Or about 21.36% annualized.  Break-even: $37.42

    If PFE stock closes above $38 on March 6, you keep the premium and start over. If the stock closes under $38 you get assigned but check your break-even points. There are several options you could use not to get assigned, like a roll down or roll forward. Or you could take stock, collect dividend and sell covered calls. Win, win, win

    Remember, you are selling one contract, 100 shares of PFE stock, make sure you have $3,800 cash or buying power (margin) to buy 100 shares if assigned.

    Generate monthly income selling puts on Cisco Systems (CSCO) stock

    Cisco stock price as of February 7, 2020

    Just like AT&T and Pfizer, Cisco Systems stock is also a component of S&P 500, and just like Pfizer, Cisco systems are on the list of Dow Jones, and like Pfizer is part of the Dogs of the Dow list, the dividend is just above shy 2%, I would like more, but as we can generate extra income from puts and calls it's quite good actually. Also, Cisco systems have increased dividends for the past 9 consecutive years.

    I have been adding Cisco Systems to our dividend income portfolio since January 2020, we are waiting for dividend income in the following months: January, April, July, and November

    You could sell a puton Cisco systems stock with March 6 expiry and strike price of $48 for about $1.21. That gets you $68 and makes about 2.52% return in less than 30 days. Or about 30.24% annualized.  Break-even: $46.79

    If CSCO stock closes above $48 on March 6, you keep the premium and start over. If the stock closes under $48 you get assigned but check your break-even points. There are several options you could use not to get assigned, like a roll down or roll forward. Or you could take stock, collect the dividend and sell covered calls. Win, win, win

    Remember, you are selling one contract, 100 shares of CSCO stock, make sure you have $4,800 cash or buying power (margin) to buy 100 shares if assigned.

    Subscribe to my newsletter at Covered Calls with Reinis Fischer


    Latest video

    Embedded thumbnail for Tsikhisdziri &amp; Batumi Botanical Garden

    Tsikhisdziri & Batumi Botanical Garden

    After returning from our amazing trip to Thessaloniki, we decided to extend our holiday a bit longer — this time in beautiful Tsikhisdziri. Huge thanks to Eto for kindly offering her cozy apartments at Bambo Beach, where we enjoyed a full week of relaxation by the sea.During our stay, we explored local gems like Shukura Tsikhisdziri (შუქურა…
    Embedded thumbnail for Summer in Latvia 2025

    Summer in Latvia 2025

    Summer in Latvia movie is out - Join us on our July (2025) journey through Latvia: installing a bathtub in our countryside cottage, setting up a pop-up store at Bangotnes, celebrating a birthday in Vērbeļnieki, traveling via Riga to Jaunpiebalga, Vecpiebalga, Smiltene, and Valka. From sipping sparkling wine with swallows to running 4K morning…
    Embedded thumbnail for Chateau Ateni. Gori

    Chateau Ateni. Gori

    This time (May 2025), our journey takes us to Gori and the enchanting Chateau Ateni - a hidden gem where authentic Georgian cuisine blends seamlessly with avant-garde natural wines, soulful traditional dance, and even the charming surprise of a small chick farm.What makes this trip extra special is sharing it with our Latvian/Georgian friends,…

    Living in Georgia

    12 Rounds Boxing Club in Tbilisi

    Sometimes even the most loyal gym-goers need to shake things up—and that's exactly what I did this month. After years of training at the "luxurious Axis Tower gym", I decided to take a short break. Not because I had any complaints about…

    Tbilisi Circus: A Historic Landmark with a Surprising Past

    Tbilisi Circus is an iconic part of the city's cultural landscape. Having lived in Georgia since 2011, I have passed by the Tbilisi Circus almost every day. However, it wasn’t until I attended a show that I truly appreciated its grandeur…

    Foraging for Mushrooms near Tsodoreti Lake: A Day in the Suburbs of Tbilisi

    Back in June 2024, I first came across Tsodoreti Lake during one of the Tbilisi Trails races, which turned out to be one of the most challenging runs of my life. While I tackled the 10K trail route, my partner and our kiddo took a gentler…

    Axel Georgian Business Angel Networking Event: Exploring Opportunities in Tbilisi

    In mid-October 2024, I had the pleasure of attending the Axel Georgian Business Angel networking event, held right here in Tbilisi. Having passively observed the Georgian tech scene for over a decade, this event provided the perfect…

    Frame House

    Frame House Upgrades: Big Windows, New Porch, and Apple Trees Planted in Latvia

    In mid-April, during our kiddo’s Easter school break, we traveled to Latvia for about 10 days — a trip packed with projects, energy, and transformation. A lot of pre-planning had gone into it before we even arrived: we ordered the windows…

    Frame House in Latvia: Outdoor Patio, Inner Walls, and More

    As June came to an end, our family embarked on a journey from Tbilisi to Latvia, skipping Renee's school year for the last week and focus on our frame house project. Here's a glimpse into our busy but rewarding time working on the house.We…

    Spring Break Project: Building Progress on Our Frame House in Latvia

    As the chill of winter slowly gives way to the warmth of spring, it's the perfect time to roll up our sleeves and dive back into the construction of our dream frame house in Latvia. During this Spring break from British International…

    Piece of Life

    Postcards from Marseille

    It’s been nearly two years since our last trip to Marseille, a sun-drenched jewel on France’s southern coast that left an indelible mark on our memories. That summer of 2023, we set out to explore the city’s vibrant beaches and winding old town, arriving and departing through the bustling hub of Marseille St. Charles train station. As I sit…

    Christmas Eve at Palolem Beach: Fire Shows, Old Monk

    While we just celebrated Orthodox Christmas in Georgia, I can’t help but delve into the memories of our Western Christmas last year (2024), spent on the serene shores of Palolem Beach in Goa, India. That evening was magical in every way, filled with vibrant energy, beautiful scenery, and a new discovery that made the night unforgettable.Palolem…

    A Family Guide to Borjomi: Hiking Trails and Sulfur Bath Tips

    As summer came to a close, we continued our family's tradition of visiting Borjomi. This year marked yet another memorable trip at the end of August 2024, reaffirming our love for this beautiful Georgian town. Visiting Borjomi at least twice a year has become a cherished routine, a piece of life that we look forward to, blending relaxation,…

    Travel guides

    Embedded thumbnail for Summer in Latvia 2025

    Summer in Latvia 2025

    Summer in Latvia movie is out - Join us on our July (2025) journey through Latvia: installing a bathtub in our countryside cottage, setting up a pop-up store at Bangotnes, celebrating a birthday in Vērbeļnieki, traveling via Riga to…

    Embedded thumbnail for Birthday in Thessaloniki, Greece

    Birthday in Thessaloniki, Greece

    Turning 40 is a milestone worth celebrating in style, and what better way than in Thessaloniki — a city that seamlessly blends history, culture, and cuisine. From affordable flights and boutique stays to seafood feasts and hidden beaches,…

    Embedded thumbnail for Azeula Fortress, Tbilisi Sea, and Ateni Sioni

    Azeula Fortress, Tbilisi Sea, and Ateni Sioni

    August ended with yet another packed and memorable weekend in Georgia. This time, our journey took us from the hills near Kojori to the refreshing waters of the Tbilisi Sea, and finally to the historical town of Gori, where we enjoyed a…

    Hotel Reviews

    Stays & Trails La Maison Hotel Review in Panaji

    At the tail end of 2024, just before catching our flight back to Delhi, we decided to book a one-night stay at Stays & Trails La Maison Fontainhas in Panaji, Goa. After weeks staying in Palolem beach, we wanted to wrap up our trip with…

    Schuchmann Wines Château: A Long-Awaited Stay in Georgia’s Premier Winery Hotel & Spa

    It took us over a decade to finally make it to Schuchmann Wines Château & Spa, and it was well worth the wait! We’ve spent years recommending this stunning winery hotel to visiting friends and business partners, yet somehow, we had…

    Hotel Belvedere Prague: A Practical Stay with Easy Access

    During our recent trip to Prague in mid-October 2024, we stayed at Hotel Belvedere. My partner attended the MEET Central Europe Translators conference, and we were joined by one of our office employees, so we opted to book two rooms. …

    Review: Art Hotel Prague – A Cozy Stay in a Tranquil Part of Prague

    During our recent trip to Prague in October 2024, we opted for a one-night stay at the Art Hotel Prague. We arrived at the hotel via Bolt taxi from Václav Havel Airport, which was straightforward and efficient. At about EUR 120 per room…

    Toursim objects

    Plage des Catalans: A Shrinking Memory in Marseille

    Plage des Catalans, a sandy crescent tucked along Marseille’s coastline, holds a special place in my travel tapestry. I first visited this beach in the summer of 2003, a carefree stop during my early adventures in the city. Back then, it felt like a haven—close to the bustling port yet offering a slice of Mediterranean calm. When I returned…

    Colva Beach: Golden Sands and Tranquility in Goa

    Colva Beach, located in South Goa, is known for its expansive golden sands and tranquil atmosphere. Stretching for several kilometers along the Arabian Sea, the beach offers a peaceful escape from the busier tourist hubs in the region. Its wide shoreline, framed by swaying palm trees, provides plenty of space for visitors to relax, stroll, or…

    Charles Bridge: A Timeless Landmark in Prague

    The Charles Bridge (Karlův most) in Prague is one of the most iconic and historic landmarks in Europe. Built in the 14th century under the reign of King Charles IV, this Gothic stone bridge spans the Vltava River, connecting Prague's Old Town with the Lesser Town (Malá Strana). Adorned with a series of 30 Baroque statues and surrounded by…

    Macroeconomics

    Servers and Drupal

    Genealogy