Wednesday, January 10, 2018

Apache not sending emails on Centos 7

Applications on Apache webserver that are working fine but can't send out emails is a real headache. Especially if everything was working on the development server. Example of error encountered;

Could not execute: /usr/sbin/sendmail

In Wordpress, it refuses to send email. Once such instance is the Forget password window and you see the message
The e-mail could not be sent.
Possible reason: your host may have disabled the mail() function.

This is ONE possibly most common situation. 

On most Development servers, the SELinux is probable turned OFF or in permissive mode. However on the Production servers, they are almost always set to ON. In the web server document directory, check if the following SELinux status;

$ getsebool httpd_can_sendmail

It should be in status OFF. Change the status to ON and restart Apache with the command

$ setsebool -P httpd_can_sendmail on
$ systemctl restart  httpd.service

Second common situation

Still not receiving emails from apache or Wordpress? It is possible Postfix SMTP server is using values that the email relay SMTP is not accepting. Check the maillog for any errors such as this;

said: 450 4.1.8 <apache@production.localdomain>: Sender address rejected: Domain not found (in reply to RCPT TO command))  

Or

sendmail[2450]: NOQUEUE: SYSERR(apache): /etc/mail/sendmail.cf: line 0: cannot open: Permission denied

This is a story for another time.

Wednesday, December 20, 2017

Install Linux on Samsung NP150 Plus netbook - Part 1

Installation of Linux Mint 18.3 (Sylvia) Xfce 64-bit on Samsung NP150 Plus netbook. This is how I installed a dual boot of Linux Mint 18 on existing MS Windows 10 Home (Upgraded from MS Windows 7 Starter).

This little netbook runs on  1.66-GHz Intel Atom N450 processor with 1Gb of RAM and an x64-based processor. I am giving it a shot to see if its possible to install Mint and usability as a school student's laptop. Linux Mint is a project spun off from Ubuntu with a large library of applications. Version 18.3 is based on Linux kernel 4.4 with Ubuntu package on 16.04 and will receive security updates until 2021. Xfce is an open source software to provide a light weight desktop for low processor computers. See Whats new for more details.

Linux Mint Xfce vs (Cinnamon

Minimum requirement:
9Gb (20Gb) Disk space
1024x767 resolution (lower resolution require press Alt drag windows with mouse to fit monitor)
512Mb (2Gb) RAM


Linux Mint 18.3 with Xfce desktop

Installation

Linux Mint can be downloaded from linuxmint.com. Download then create a bootable Linux Mint on the USB disk. I used Rufus version 2.18.1213 (See error below when using Win32diskimager version 1.0.1) to extract the ISO file into the USB disk. File system on Rufus MUST be set to FAT (Default) with cluster size 64 kilobytes (Default).

(A) This netbook comes with MS Windows 10 Home Windows 7 Starter and a small capacity hard disk. Firstly create free space by using the apps in MS Windows.
  1. Open MS Windows Explorer. Right click "This PC" -> Manage.
  2. Choose Storage ->Disk Management
  3. Choose the unused disk partition and resize to 50Gb of free space. More would be better.
Choose "Manage" to access the Partition tools.


On some disk, it will need to "optimise disk" to reclaim more free space.

(B) Boot from USB disk
  1. Shutdown netbook. Plugin the Mint on USB disk into the netbook. 
  2. Boot netbook and press F2 to enter BIOS 
  3. Choose to boot USB HDD before the AHCI HDD
  4. Save and reboot.
Samsung N150 Plus BIOS screen to boot from USB Disk.

Note: Win32diskimager 1.0.0 to create USB Disk.
The Linux Mint boot up screen appears at first boot but ended up with following message.

32-bit relocation outside of kernel!
-- System halted

This is solved by formating the USB disk as FAT, then run Win32diskimager.

Note: Hangs after boot screen. 
Reboot then at the Linux mint boot screen, Choose first option "Linux Mint" and press TAB. Remove the text "quick splash" and press Enter. This reveals the error;

Uncompression Error
-- System halted

This is resolved by using a larger capacity USB disk. Initially it was a 2Gb USB stick then changed to a 4 Gb USB disk.

Its booting! Will continue with further post next time.



Linux Mint 18.3 Installed on N150 Plus


For now, the partition table plan as follows;

/  -  20000MB
swap  -  2
/home  -  Remainder space



Friday, November 17, 2017

What's new in Firefox Quantum (screens)



Firefox 57, also known as Quantum is a major upgrade for Firefox web browser. Here are initial screens of this new web browser compared to previous version of Firefox 56.






Tools menu






Toolbar


Preferences
 

Speedtest



Speedtest Ranking



Friday, November 10, 2017

Laravel and using custom CSS file

Laravel 5 supports CSS and JavaScript preprocessors through Elixir and Gulp. Elixir is a node.js tool that helps gulp in the use of less, sass and coffee methods. Gulp assist programmers by automating repeated task like copying files, testing, minify codes.

If all that sounds confusing, dig deeper and you will find that Laravel framework assist developers to build and test application faster through tools like Elixir and Gulp.

There will be cases where an existing and proven CSS file should be used within a Laravel 5 project. In this example, there is a CSS file name beautiful.css that provides a box when used in the DIV CLASS code of the php application as shown below;

<DIV class="beautiful-tip">
 <P>Hello World</P>
</DIV>

We will use an existing working Laravel 5 application that is installed at the folder named <project>. In the gulpfile.js, the mix.sass contains 'app.scss' where instructions to use the CSS will be recorded.

Step 1: Copy the CSS file to Project's node_modules folder

Create the folder "example" in <project>/node_modules
Copy beautiful.css into the folder <project>/node_modules/example and make sure the folder and its contents are readable by the web server service.

Step 2: Include the CSS file when gulp compiles SASS files.

Edit <project>/resources/assets/sass/app.scss

At the last row, add the command (name of CSS file without its extension) and save.
@import "node_modules/example/beautiful";

Step 3: Run gulp.

At a command prompt in the project folder, type
# gulp

Done

Friday, November 3, 2017

Can anyone use OSS in their product?

Use of open source (OSS) licensed software have gained widespread acceptance. Its no longer just for hobbyist and academic studies. R&D takes place much rapidly with these open knowledge available to masses but its very different from just copying the software when corporations and industry adopts OSS in their product.

Ever wonder why anyone would allow their codes formed from sweat and sleepless nights to be made available to everyone? Broadcom for example, provide their source codes and its become such a powerful references. Something to ponder, but lots of articles are around to help one understand.

If you intend to use OSS as part of a product that is sold (not the services) or distributed freely, there is the GPL and LGPL type of licensing type of OSS. A brief if not too broad explanation on the differences.

Products bundled with GPL type licensed OSS components and codes must distribute with the source code made available to the product recipient. Lets say, you develop a smart desktop suite called P99SmartDS that incorporates modified Mozilla Thunderbird to handle smtp and pop messaging to the desktop. Thunderbird expects you to ship the P99SmartDS with working source code and be licensed not more restrictive than that GPL licensed.

Products bundled with LGPL type licensed OSS component and codes must distribute with the license and library of that specific OSS component. Lets say, you develop a wireless driver interface and application to simplify configuration and its using a LGPL licensed OSS library. This application does not have to be OSS licensed.

Selling a product base on OSS is not just about submitting bugs or chats in forums. It sharing of knowledge gain via successful products. The OSS licensed is the guardian to ensure continuity of the freedom of choices and knowledge. Play your part to safe guard this freedom.

Wednesday, November 1, 2017

Laravel 5 and OpenSSL

Notes on updating Apache 2.4, Laravel 5.5 with PHP 5, to PHP 7.1. 


Currently, the openssl key on my Apache server is serving encryption with AES 128. Information here is for development server environment only.

Default new Laravel applications are generated with use of encryption key type AES 256 as found in <Laravelproject>/config/app.php

The cipher key in app.php can be changed, or just generate the new required AES 256 keys.

Steps to generate the OpenSSL public and private keys;

$ openssl genrsa -aes256 -out mysitename.key 2048
$ openssl rsa -in mysitename.key -out mysitename-decrypted.key
$ openssl req -x509 -nodes -new -sha256 -key mysitename-decrypted.key -out mysitename.crt


When restarting Apache on MS Windows 10, this error appears.
"Init: SSLPassPhraseDialog builtin is not supported on Win32"

Solution is to remove the pass phrase in private key (See). In this example, the public and private ssl certs are both stored in <Apache directory>/conf/ssl/
Step 1:
Copy private key mysitename.key to secure.key

Step 2: Remove pass phrase from private key in use.
In CLI of the folder for ssl type

$ openssl rsa -in secure.key -out mysitename.key

Step 3: Open <Apache directory>/conf/extra/httpd-ssl.conf and comment out the line
# SSLPassPhraseDialog  builtin

Step 4: Restart Apache

In the event the following error appears, it means the openssl module is not loaded. Find another compatible Apache server to be installed that can load the openssl in directory extension.

PHP Startup: Unable to load dynamic library
or
Undefined method openssl_cipher_iv_length( )

Laravel non-existent script error

Recently updated to PHP 7.1 and all the existing PHP projects are working fine.

However, this error appeared when I am trying to create a new Laravel 5 project,

You made a reference to a non-existent script @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
. . .

You made a reference to a non-existent script @php artisan key:generate

Lets fix this in one step;

Step 1: Update the composer,

$ composer self-update

Updating to version 1.5.2 (stable channel).
    Downloading: 100%
Use composer self-update --rollback to return to version 1.2.2

Run the command used to create the new project,

$ composer create-project laravel/laravel myapps

Wednesday, October 4, 2017

Android AlertDialog

How to display a delete confirmation box?

A simple method is to use AlertDialog that quickly provides the "CANCEL" and "OK" along with your custom confirmation message.



An example within a Fragment class where a user click's the Delete button which calls the deleteConfirmation( ) function with the title or name of item to be delete.

1:  private void deleteConfirmation(String title){  
2:    AlertDialog.Builder alert = new AlertDialog.Builder(getContext());  
3:    alert.setTitle("Delete");  // Declare the title
4:    alert.setMessage("Are you sure you want to delete \n"+title+"?");  // Set message below title
5:    alert.setIcon(R.mipmap.ic_delete);  // Set the icon at top left
6:    alert.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {  
7:      public void onClick(DialogInterface dialog, int which) {  
8:        // continue with delete  
9:        MainActivity.confirmDelete=true;  
10:        delete();  
11:      }  
12:    });  
13:    alert.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {  
14:      public void onClick(DialogInterface dialog, int which) {  
15:        // close dialog  
16:      }  
17:    });  
18:    MainActivity.confirmDelete=false;  
19:    alert.show();  
20:  }  

Note 1:
The Dialog class is the base class to AlertDialog that makes the user take an action before returning back to the Fragment or Activity. This is known as a Modal Event. Other example of Dialog class are DatePickerDialog and TimePickerDialog.

If used for Android API 25 and onward, the import statement is

import android.app.AlertDialog;

for API 11 to below API 25 use

import android.support.v7.app.AlertDialog;

Note 2:
There are 3 type of buttons that can be added (in the example above, only 2 are added) to an AlertDialog. Only one of each type can be added using the following methods;

alert.setPositiveButton
alert.setNegativeButton
alert.setNeutralButton

List can be added to AlertDialog if required.

Note 3:
There are several ways to pass message or status to the Activity or Fragment that created/launched the AlertDialog. In the example above, a static variable is declared in the MainActivity and values are changed base on button clicked.

In MainActivity.java

public static boolean confirmDelete=false;

Note 4:
To further customise the AlertDialog look, a resource file (XML) can be created and assigned with the method

LayoutInflater inflater = getActivity().getLayoutInflater();
alert.setView( inflater.inflate(R.layout.customDialog, null) )


Done.

Blog Archive