Thursday, January 31, 2019

How to start your first React project?

Software Required
-NPM version 6.4.1
-expo version 2.6.14
-Atom 1.34.0
-NativeBase 2.10.0. Please refer to link

Note: React Native has too many dependencies and issues for a beginner like me. I have gone through those and it has burnt my many precious hours. Even though I decided to use NativeBase framework to speed up my development cycle but I still need to clear those hurdle that blocked me to get to the end result. I reused sample code from NativeBase as a very simple kickstart for beginners like me to avoid those unnecessary frustration.

Steps
  • Run command below to create your first React navigation project.
$ expo init AwesomeNativeBase
  • During the prompt of the "Choose a template", choose "> blank minimum dependencies to run and an empty root component" option
  • When project creation process is completed, change to "AwesomeNativeBase" directory, run the command below to install native-base component.
$ npm install native-base --save
  • Run command below to install vector-icons.
$ npm install @expo/vector-icons --save
  • Launch App.js using the Atom IDE. Paste the sample code as shown below
import React, { Component } from 'react';
import { StatusBar } from 'react-native';
import { Container, Header, Title, Content, Footer, FooterTab, Button, Left, Right, Body, Icon, Text } from 'native-base';
import {Font, Expo, AppLoading} from 'expo';

export default class AnatomyExample extends Component {
  state={
    isReady: false
  }

  async componentWillMount() {
    await Font.loadAsync({
      'Roboto': require('native-base/Fonts/Roboto.ttf'),
      'Roboto_medium': require('native-base/Fonts/Roboto_medium.ttf'),
    });
    this.setState({isReady:true})
  }

  render() {
    if (!this.state.isReady) {
      return <AppLoading />;
    }

    return (
        <Container>
          <Header>
            <Left>
              <Button transparent>
                <Icon name='menu' />
                </Button>
            </Left>
            <Body>
              <Title>Header</Title>
            </Body>
            <Right />
          </Header>
          <Content>
            <Text>
              This is Content Section
            </Text>
          </Content>
          <Footer>
            <FooterTab>
              <Button full>
                <Text>Footer</Text>
              </Button>
            </FooterTab>
          </Footer>
          <StatusBar hidden />
        </Container>
    );
  }
}
  • Back to your command prompt, enter command below to start your CLI.
$ expo start
  • Expo Metro bundler will be launched. 

  • I'm using Expo Android client to conduct my testing. Please refer to link.
  • Make sure "Tunnel" is selected at the "Connection" field. Use the Expo Android client to scan the QR code, your application will be launched as shown in the screenshot below. 

Friday, January 18, 2019

How to resolve "Missing write access to /usr/local/lib/node_modules" when install expo-cli?

Software Required
- NPM version 6.4.1

Problems
  • I'm exploring React and try to install expo-cli by executing command "npm install -g expo-cli", error as shown below is displayed
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  { [Error: EACCES: permission denied, access '/usr/local/lib/node_modules']
npm ERR!   stack:
npm ERR!    "Error: EACCES: permission denied, access '/usr/local/lib/node_modules'",
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules' }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
  • I know this is a common problem and solutions is available over the internet, I think this is necessary to write a small little note for my own jot down.
Steps
  • Run command below to resolve the permission problem
$ mkdir ~/.npm-global
$ npm config set prefix '~/.npm-global'
$ export PATH=~/.npm-global/bin:$PATH
$ source ~/.profile
  • Run command below to install expo-cli
$ mkdir ~/.npm-global
$ npm config set prefix '~/.npm-global'
$ export PATH=~/.npm-global/bin:$PATH
$ source ~/.profile
$ npm install -g expo-cli
  • You are good to create your React project now.

Thursday, January 17, 2019

How to setup moodle development environment?

Software Required
- docker-compose version 1.22.0
- macOS High Sierra
- docker version 18.06.1-ce
- Moodle 3.6.1

Moodle source code and environment requirement
  • I'm using the Moodle 3.6.1 source code to configure my development environment. Below are the environment requirement by the Moodle 3.6.1 application
Steps
  • Below are the folder structure to build my containers
Parent
|
|-conf
| |-mysql
| | |-moodle.cnf (1)
| |-php
| | |-custom.php.ini (2)
|-src
| |-moodle (3)
| | |- (All the Moodle source code)
| |-scripts
| | |-moodle.sql (4)
|-Dockerfile (5)
|-docker-compose.yml (6)
  • Refer to (5), I have a Dockerfile to configure both Apache, PHP and MySql in my container.  I have added the command to create the "/var/www/moodledata" folder.
FROM php:7.0.33-apache 
RUN docker-php-ext-install mysqli

RUN mkdir /var/www/moodledata 
RUN chmod 777 -R /var/www/moodledata

  • Refer to (6), it is my docker-compose.yml that I used to configure my application service.
version: "2"
services:
    www:
        build: .
        ports: 
            - "8001:80"
        volumes:
 (6-1)-->   - ./src/moodle:/var/www/html/ 
 (6-2)-->   - ./conf/php/custom.php.ini:/usr/local/etc/php/conf.d/custom.php.ini 
        links:
            - db
        networks:
            - default
    db:
        image: mysql:5.7.13
        ports: 
            - "3306:3306"
        environment:
            ALLOW_EMPTY_PASSWORD: "yes"
            MYSQL_DATABASE: moodle
            MYSQL_USER: user
            MYSQL_PASSWORD: test
            MYSQL_ROOT_PASSWORD: test
        volumes:
 (6-3)-->   - ./src/scripts/dump:/docker-entrypoint-initdb.d 
 (6-4)-->   - ./conf/mysql:/etc/mysql/conf.d
            - persistent:/var/lib/mysql
        networks:
            - default
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links: 
            - db:db
        ports:
            - 8000:80
        environment:
            MYSQL_USER: user
            MYSQL_PASSWORD: test
            MYSQL_ROOT_PASSWORD: test
volumes:
    persistent:

  • Refer to (6-1) in the docker-compose.yml, I have mounted the source code development folder to "./src/moodle" [Please refer to (3) at folder structure]. Please map your project directory from your favourite IDE to this folder. All the changes in the source code will be reflected in your development container immediately.
  • Refer to (6-2) in the docker-compose.yml, all the configuration for your php.ini will be placed in custom.php.ini file. I have mounted the container's php configuration into "./conf/php/custom.php.ini" [Please refer to (2) at folder structure]. Please refer to the content of my custom.php.ini as shown below. I have included the opcache configuration which is required by Moodle installation here.
display_startup_errors=On
log_errors=On

zend_extension=opcache.so

[opcache]
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60

; Required for Moodle
opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0

  • Refer to (6-3) in the docker-compose.yml, I added my Moodle's DB dump (moodle.sql) at "./conf/mysql/" folder [Please refer to (4) at folder structure] on my local machine. I have mounted it to the container and all the SQL files place in this folder will be executed during the installation. Assumption: You have configured your Moodle with complete database.
  • Refer to (6-4) in the docker-compose.yml, all the customization for your my.cnf will be placed in "./conf/mysql/" folder [Please refer to (1) at folder structure]. For Moodle installation, I have created moodle.cnf and placed all my configuration in this file. Please refer to the content of my moodle.cnf as shown below.
[client]
default-character-set = utf8mb4

[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake

[mysql]
default-character-set = utf8mb4
  • Start the Moodle installation by executing command below. Browse to http://localhost:8001, your Moodle side is ready for use now.
#docker-compose up
Extra Tips: Clean docker container and image (Optional)
$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)
$ docker rmi $(docker images -q)
$ docker volume rm $(docker volume ls -q)

Extra Tips: Explore the structure of the image in the container

  • Run command below to check the container ID
$ docker ps
  • Based on the container ID that we get from the previous command, run command below to remote into the container to explore the file structure
$docker exec -t -i [container id] /bin/bash

Monday, January 14, 2019

How to upload your source code to BitBucket?

Software Required
- git version 2.17.2 

Precondition
- BitBucket account has been registered
- Source code repository has been created on BitBucket  

Problems
- I'm a SVN user who heavily rely on it to manage my source code version control. I'm a rookie to use Git on both GitHub/BitBucket platform.
- During my Moodle and Dockers exploration, I decided to use BitBucket and git client to manage my source code.
- The reason I choose BitBucket is it support:- 
  • Unlimited private repository 
  • Git/Mercurial.
Steps
- Assume you have BitBucket account and repository created.
- Clone your empty repository from BitBucket into a source folder by executing the command below. Please fill in [username], [project name] and [repository] parameter based on the user account and repository name that you created at BitBucket.
$ git clone https://[username]@bitbucket.org/[project name]/[repository].git
- Copy your Moodle source code into the source folder
- Run the command below to add all the new files into the staging area.
$ git add .
- Run command below to commit the source code in the staging area into the BitBucket repository with the description
$ git commit -m "First commit"
- Run command below to check on the branch and master differences
$ git status

On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits)
- If message "Your branch is ahead of 'origin/master' by 1 commit" is observed, run the command below to push the origin to master
$ git push origin master
- Check on the BitBucket console, all the source code is uploaded/committed successfully.



How to turn on Moodle debug message on Dockers container?

Software Required
- docker-compose version 1.22.0
- macOS High Sierra
- docker version 18.06.1-ce
Moodle version 3.6.1

Problems
- During the process of configuring Moodle on my Docker container, encountered the error message "Error reading from database" when launching my Moodle portal. I can't launch the Moodle main login page.
- I can't proceed from there and have no clue on what is going on that blocked the system from launching.
- I need more details through the Moodle debug message

Steps
- Came across Moodle support side, it provided steps to turn on the Moodle debug message. However, it does not provide the configuration details on Dockers.
- I'm using docker-compose, hence, I added configuration below to my docker-compose.yml file
volumes: - ./phpconf/custom.php.ini:/usr/local/etc/php/conf.d/custom.php.ini
- I created "phpconf" folder in my docker-compose parent folder and place "custom.php.ini" file in the folder.
- Below are the content of the "custom.php.ini" file. 
display_startup_errors=On
log_errors=On
- Added configuration below in the Moodle config.php
ini_set ('display_errors', 'on');
ini_set ('log_errors', 'on');
ini_set ('display_startup_errors', 'on');
ini_set ('error_reporting', E_ALL);
$CFG->debug = 30719; // DEBUG_ALL, but that constant is not defined here

//The configuration must above this line
require_once(__DIR__ . '/lib/setup.php');
- Restart the docker-compose by running the command below
#docker-compose down
#docker-compose kill
#docker-compose up
- Refresh the Moodle page, error message "Table "sessions" does not exist" is displayed. Obviously, the DB dump that I used to restore the database in Dockers MySQL database is not complete. 
- In order to check the configuration has been taken effect in the php.ini file, add phpinfo() into config.php. Reload the page, you will be able to confirm the implementation has been taken effect.




Wednesday, January 2, 2019

How to resolve Intl extension enabling issue when install Moodle on XAMPP?

Software Required

- macOS High Sierra
- XAMPP 7.0.33 / PHP 7.0.33. Please refer to download
- Moodle version 3.6.1. Please refer to download

Problem
  • During the Moodle installation on XAMPP, Intl extension checking message is displayed. Please refer to the screenshot below

Steps
  • To check the location of php.ini, browse to http://localhost/dashboard/phpinfo.php
  • Obviously, php.ini is located at "/Applications/XAMPP/xamppfiles/etc/" directory
  • Run command below to check the php path
which php
  • Run command below to change the PHP path to XAMPP PHP folder if default path is "/usr/bin/php"
PATH="/Applications/XAMPP/xamppfiles/bin:${PATH}"
  • Run command below to generate Intl extension
brew tap kyslik/homebrew-php
brew install kyslik/php/php70-intl
    • Alter php.ini by inserting the configuration as shown below
    extension="/usr/local/Cellar/php70-intl/7.0.27_25/intl.so"
        • Press "Reload" button, the Intl extension error will be resolved. 

        Tuesday, January 1, 2019

        How to resolve mysql_full_unicode_support error when deploy Moodle on XAMPP?

        Software Required

        - macOS High Sierra
        - XAMPP-VM/PHP 7.3.0. Please refer to download
        - Moodle version 3.6.1

        Problem

        • During the Moodle installation on XAMPP, mysql_full_unicode_support error message is prompted. Please refer to the screenshot below
        • "Barracuda file format" and "full support of UTF-8 on MySql" errors need to be fixed.
        Steps
        • Locate my.cnf that located at "/opt/lampp/etc/" directory. Insert the configuration as shown below
        [client]
        default-character-set = utf8mb4
        
        [mysqld]
        innodb_file_format = Barracuda
        innodb_file_per_table = 1
        innodb_large_prefix
        
        character-set-server = utf8mb4
        collation-server = utf8mb4_unicode_ci
        skip-character-set-client-handshake
        
        [mysql]
        default-character-set = utf8mb4
        
        
              • Restart MySql server. Done!