If you’re setting up your MacBook for development, having a well-configured terminal is essential. This guide will walk you through installing and configuring a powerful terminal setup using Homebrew, iTerm2, and Oh My Zsh, along with useful plugins.
1. Install Homebrew
Homebrew is a package manager that simplifies installing software on macOS.
Your terminal is now set up for an optimized development experience! With Homebrew, iTerm2, Oh My Zsh, and useful plugins, your workflow will be faster and more efficient.
unset GEM_HOME
rvm implode
rm -rf ~/.rvm
sudo rm -rf /usr/share/rvm
sudo rm /etc/profile.d/rvm.sh
sudo rm /etc/rvmrc
sudo rm ~/.rvmrc
vim ~/.zshrc # or ~/.bash_profile related to machine/software you use and remove rvm related lines
Make sure that your ~/.bash_profile or ~/.zshrc file contains the following lines to load rvm to the shell:
# RVM manual script for loading rvm to shell
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
After installing check RVM by:
โ rvm list
# No rvm rubies installed yet. Try 'rvm help install'.
โ rvm install 2.7.2
Searching for binary rubies, this might take some time.
Found remote file https://rubies.travis-ci.org/ubuntu/18.04/x86_64/ruby-2.7.2.tar.bz2
Checking requirements for ubuntu.
Requirements installation successful.
ruby-2.7.2 - #configure
ruby-2.7.2 - #download
..............
No checksum for downloaded archive, recording checksum in user configuration.
ruby-2.7.2 - #validate archive
ruby-2.7.2 - #extract
ruby-2.7.2 - #validate binary
ruby-2.7.2 - #setup
ruby-2.7.2 - #gemset created ~/.rvm/gems/ruby-2.7.2@global
ruby-2.7.2 - #importing gemset ~/.rvm/gemsets/global.gems..................................
ruby-2.7.2 - #generating global wrappers.......
ruby-2.7.2 - #gemset created ~/.rvm/gems/ruby-2.7.2
ruby-2.7.2 - #importing gemsetfile ~/.rvm/gemsets/default.gems evaluated to empty gem list
ruby-2.7.2 - #generating default wrappers.......
โ rvm list
=* ruby-2.7.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
โ rvm gemset list
gemsets for ruby-2.7.2 (found in ~/.rvm/gems/ruby-2.7.2)
=> (default)
global
โ rvm gemset create foobar
ruby-2.7.2 - #gemset created ~/.rvm/gems/ruby-2.7.2@foobar
ruby-2.7.2 - #generating foobar wrappers.......
โ rvm gemset list
gemsets for ruby-2.7.2 (found in ~/.rvm/gems/ruby-2.7.2)
=> (default)
foobar
global
โ rvm gemset use foobar
Using ruby-2.7.2 with gemset foobar
โ rvm gemset list
gemsets for ruby-2.7.2 (found in ~/.rvm/gems/ruby-2.7.2)
(default)
=> foobar
global
โ rvm list gemsets
rvm gemsets
ruby-2.7.2 [ x86_64 ]
=> ruby-2.7.2@foobar [ x86_64 ]
ruby-2.7.2@global [ x86_64 ]
For preserving the gemset for the current directory create .rvmrc file:
vim .rvmrc
# add this: rvm --rvmrc use foobar
If rvm is not loading into the shell after changing the terminal preferences, check the rvm_path env variable.
$rvm_path
zsh: no such file or directory: /usr/share/rvm
If you don’t have that directory you must change the above path to a correct rvm installed path.
By default rvm installed in this path: ${HOME}/.rvm So you can add this path to rvm_path
Set it like:
export rvm_path="${HOME}/.rvm"
You can add this line into your ~/.zshrc OR ~/.bash_profile file.
You can check rvm env variables and info by:
env | grep rvm
rvm info
Check ruby version by: ruby -v If ruby is not loading try to add the following line into your bash_profile:
export PATH=~/.rvm/gems/ruby-2.7.2/bin:$PATH # change version: ruby-2.7.2 to your installed version
source ~/.bash_profile OR source ~/.zshrc # whatever you use
ruby -v
and then copy the *-service.jar into the same folder
You can see these are processing and started in the server logs.
INFO [com.liferay.portal.kernel.deploy.auto.AutoDeployScanner][AutoDeployDir:263] Processing sitesService.api.jar
~/liferay-ce-portal-tomcat-7.3.0-ga1-20200127150653953/liferay-ce-portal-7.3.0-ga1/osgi/modules][BundleStartStopLogger:39] STARTED sitesService.api_1.0.0 [1115]
[com.liferay.portal.kernel.deploy.auto.AutoDeployScanner][AutoDeployDir:263] Processing sitesService.service.jar
~/liferay-ce-portal-tomcat-7.3.0-ga1-20200127150653953/liferay-ce-portal-7.3.0-ga1/osgi/modules][BundleStartStopLogger:39] STARTED sitesService.service_1.0.0 [1116]
Now check the database, if the Site_ table with all columns are created or not
You can see the table and columns are created. In the next topic we discuss about adding services to this service builder.
A portlet is fragment on a webpage as web application and is used with portlets on the same webpage.
When you access a web site, you interact with an application. That application may be simple: it may only show you information, such as an article. The application may be complex, including forms, sending data etc. These applications run on a platform that provides application developers the building blocks they need to make applications.
If there are so many implementations of MVC frameworks in Java, why did Liferay create yet another one?
Liferay MVC provides these benefits:
Itโs lightweight, as opposed to many other Java MVC frameworks. There are no special configuration files that need to be kept in sync with your code. Itโs a simple extension of GenericPortlet. You avoid writing a bunch of boilerplate code, since Liferayโs MVC framework simply looks for some pre-defined parameters when the init() method is called. The controller can be broken down into MVC command classes, each of which handles the controller code for a particular portlet phase (render, action, and resource serving phases). Liferayโs portlets use it. That means there are plenty of robust implementations to reference when you need to design or troubleshoot your Liferay applications.
Each portlet phase executes different operations:
Init:
The init() method is called by the portlet container during deployment and reads init parameters defined in portlet.xml file. The Portlet interface exposes the init method as: void init (PortletConfig config) throws PortletException The PortletConfig interface is to retrieve configuration from the portlet definition in the deployment descriptor. The portlet can only read the configuration data. The configuration information contains the portlet name, the portlet initialization parameters, the portlet resource bundle and the portlet application context.
Render:
Generates the portletโs contents based on the portletโs current state. When this phase runs on one portlet, it also runs on all other portlets on the page. The Render phase runs when any portlets on the page complete the Action or Event phases.
In this phase portlet generates content and renders on webpage.
The render phase is called in below cases: 1. The page that contains portlet is rendered on web page 2. After completing Action Phase 3. After completing Event Processing phase
In response to a user action, performs some operation that changes the portletโs state. The Action phase can also trigger events that are processed by the Event phase. Following the Action phase and optional Event phase, the Render phase then regenerates the portletโs contents.
its result of user actions such as add,edit, delete
only one portlet can be entered into action phase for a request in a portlet container
Any events triggered during the Action phase are handled during the Event phaseof the portlet lifecycle. Events can be used when portlets want to communicatewith each other. The Render phase will be called when all events have been handled.
Event:
Processes events triggered in the Action phase. Events are used for IPC. Once the portlet processes all events, the portal calls the Render phase on all portlets on the page. Resource-serving: Serves a resource independent from the rest of the lifecycle. This lets a portlet serve dynamic content without running the Render phase on all portlets on a page. The Resource-serving phase handles AJAX requests.
Reference:
You can see more details and clarify your doubts by checking the following docs:
Step 4: Deploy again so that you can see the jar file is created as below:
The jar file created
Copy the jar file into this tomcat server folder, so that it can pick the package
Step 5: You can see the package status in the Gogo shell Liferay provides, goto the http://localhost:8080 and check inside the Configuration section Gogo Shell. Type command: lb
See the status – Installed. It should be ACTIVE after we deploy it.
Here are the list of osgi lifecycle status:
Step 6: Handle the Errors if any
I am getting some issues with this creation, lets see what is the problem.
I don’t have any idea why I am getting this. After some research I tried to add the module that is missing here, but no luck. Then I realised we are on Liferay 7.3 and See the pic of the IDE there we selected 7.2 version because thats the latest version available there. Hmm…So…yeahh that may be the issue here. You got that!
So Update your IDE and create the package again.
Now it Works!
And check our newly created portlet in the right side section (inside Widget) of Liferay Site.
You can see this messge that we wrote inside the Class inside my check registration logic controller in your server console in IDE. And this message This portlet is created by Abhilash inside the Portlet.
Congrats .. You have created your first custom portlet in Liferay.
Goto your workspace folder (our developer studio workspace ~/eclipse-workspace):
$ cd ~/eclipse-workspace
$ nvm use 10.5
$ npm install -g generator-liferay-theme
$ npm install -g yo gulp
$ yo liferay-theme
Provide theme name, id, liferay version and font information
? What would you like to call your theme? Theme Moon
? What id would you like to give to your theme? theme-moon
? Which version of Liferay is this theme for? 7.3
? Would you like to add Font Awesome to your theme? No
.........
The project has been created successfully.
Now we will invoke gulp init for you, to configure your deployment
strategy.
Remember, that you can change your answers whenever you want by
running gulp init again.
? Select your deployment strategy (Use arrow keys)
โฏ Local App Server // select this
Docker Container
Other
? Select your deployment strategy Local App Server
? Enter the path to your app server directory: /home/abhilash/liferay-ce-portal-tomcat-7.3.0-ga1-20200127150653953/liferay-ce-portal-7.3.0-ga1/tomcat-9.0.17
? Enter the url to your production or development site: http://localhost:8080
Run the command below from the themeโs root folder to build the files:
$ cd theme-moon
$ gulp build # this creates the build folder
Now do the following changes to edit the created theme.
** Create a new /src/templates/ folder and copy portal_normal.ftl from the build/templates/ folder into it.
Configure the theme to extend the Atlas theme. Add aclay.scss file to the theme’s /src/css/ folder and add the import shown below:
@import "clay/atlas";
Create an _imports.scss file in the /src/css/ folder and add the imports shown below to it. This includes the default imports and replaces the clay/base-variables with the Atlas base variables:
You’ve generated the theme, prepared it for development, and configured it to extend the Atlas theme
Customizing the Header and Logo of your theme
Open portal_normal.ftl and replace the <header>...</header> element and contents with the updated code snippet below. This updates the structure slightly, making the banner expand the full width of the Header, and adds a new header_css_class variable to the class attribute. This variable is defined in a later step.
The logo’s height is retrieved with the ${site_logo_height} variable. The height of the logo is a bit too large for the this theme, so you must adjust it. Remove the width attribute from the logoโs image so it defaults to auto:
This applies Bootstrap and Clay utility classes to provide the overall look and feel of the Header. Assigning the classes to a variable keeps portal_normal clean and makes the code easy to maintain. If you want to update the classes, you just have to modify the variable (e.g. header_css_class = header_css_class + " my-new-class").
Add the code snippet below to update the logo_css_class variable to use Bootstrapโs navbar-brand class:
NEW THUMBNAIL FOR THE THEME
Before you upload the theme to see what it looks like so far, you must create a theme thumbnail so you can identify it. Create a thumbnail.png and replace the default from the /src/images/ folder. Note that its dimensions are 480px by 270px. These dimensions are required to display the theme thumbnail properly.
DEVELOPER MODE (If not enabled you may face CSS / JS loading issues )
The theme isnโt complete yet, but youโll deploy what you have so you can replace the default logo with the your logo. Enableย Developer Modeย before deploying your theme, so the themeโs files are not cached for future deployments.
Once I faced CSS loading issue in my AWS Liferay site for one theme. After a lot of research I found that, the server doesn’t haveportal-ext.propertiesfile and not enabled the so calledDeveloper Mode
Custom CSS Loading in Liferay
My custom _import.scss almost look like this:
/* These inject tags are used for dynamically creating imports for themelet styles, you can place them where ever you like in this file. */
/* inject:imports */
/* endinject */
/* This file allows you to override default styles in one central location for easier upgrade and maintenance. */
@import "bourbon";
@import "mixins";
@import "compat/mixins";
@import "clay/atlas-variables";
@import "./style.scss";
@import "./innerstyle.scss";
@import "./mixedslider.scss";
------
Liferay loads this css file in HTML like as follows:
This is because of I was not enabled the ‘Developer Mode’ in portal.ext file.
After enabling it as below, my _import.scss styles shows up in Liferay’s main.css file.
Create aย portal-ext.propertiesย file in your serverโs root folder if it doesnโt exist.
Add the line below to it:
include-and-override=portal-developer.properties
Start the server, if itโs not already started, and deploy the theme with the command below:
$ gulp deploy
.....
[20:34:49] Finished 'plugin:deploy' after 32 ms
[20:34:49] Finished 'deploy:war' after 32 ms
[20:34:49] Finished 'deploy' after 4.78 s
CHANGE LOGO
Open the Control Menu and navigate to Site Builder โ Pages. Click the Gear icon next to Public Pages to open the configuration menu. Under the Look and Feel tab, scroll down and click the Change Current Theme button and select the Lunar Resort Theme. Scroll to the Logo heading, click the Change button, upload the new-logo.png logo, and click the Save button to apply the theme and logo.
keep a specified number of backups in storage. After each backup is performed, it will remove older backup package files based on the keep setting.
keep as a Number
If a number has been specified and once the keep limit has been reached, the oldest backup will be removed.
Note that if keep is set to 5, then the 6th backup will be transferred and stored, before the oldest is removed. So be sure you have space available for keep + 1 backups
keep as Time
When a Time object is set to keep it will keep backups until that time. Everything older than the set time will be removed.
When I was working on a Rails project, I encountered a situation where I needed to find the association class of an association object. I have the object and its association name as inputs. How can I find the association class?
Suppose we have Student class that belongs to a school
class School
has_many students
end
class Student
belongs_to :school
end
and suppose so many other relations like this in our project.
So we have
s = Student.last
:school symbol
I can use
s.school.class and s.school.class.name
But what if the school is blank? The result is ‘NilClass’ From the above code.
Basically for has_many associations now we get the class name as
"ActiveRecord::Associations::CollectionProxy"
because recently in new rails version a change of the Array of objects as associations to its own ‘CollectionProxy’ collections.
So we can use ‘ActiveRecord::Reflection::ClassMethods’ for finding all the association info.
Note that this Rails module is so useful to find all the association related information.
In the above situation we can use ‘reflect_on_association’ method for finding association reflection info. And it returns ‘ActiveRecord::Reflection’ Object.
In the most recent version of Rails, there has been a change where Array of objects as associations have been replaced with their own ‘CollectionProxy’ collections. As a result, we can now use ‘ActiveRecord::Reflection::ClassMethods’ to find all the association information we need. This module is extremely useful in finding all association-related information.
To find association reflection information in the situation described above, we can use the ‘reflect_on_association’ method. This method will return an ‘ActiveRecord::Reflection’ object.
Postgres uses role based access for the unix users. After the installation a default role called ‘postgres’ will be created. You can login to postgres account and start using or creating new roles with Postgres.
Sign in as postgres user
$ sudo -i -u postgres
Access the postgres console by
$ psql
But i cannot enter into the console and I got the following error:
postgres@8930a29k5d05:/home/rails/my_project$ psql
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Original Reason: PostgreSQL Server was not running after the installation.
I tried rebooting the system and via init script the server should run automatically. But the server is not running again. I understood that something prevents postgres from running the server. What is it?
root@8930a29k5d05:/home/rails/my_project# /etc/init.d/postgresql start
* Starting PostgreSQL 9.3 database server
[ OK ]
root@8930a29k5d05:/home/rails/my_project# ps aux | grep postgres
postgres 158 0.1 2.0 244928 20752 ? S 06:28 0:00 /usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main -c config_file=/etc/postgresql/9.3/main/postgresql.conf
postgres 160 0.0 0.3 244928 3272 ? Ss 06:28 0:00 postgres: checkpointer process
postgres 161 0.0 0.4 244928 4176 ? Ss 06:28 0:00 postgres: writer process
postgres 162 0.0 0.3 244928 3272 ? Ss 06:28 0:00 postgres: wal writer process
postgres 163 0.0 0.5 245652 6000 ? Ss 06:28 0:00 postgres: autovacuum launcher process
postgres 164 0.0 0.3 100604 3336 ? Ss 06:28 0:00 postgres: stats collector process
root 178 0.0 0.0 8868 884 ? S+ 06:28 0:00 grep --color=auto post
root@8930a29k5d05:/home/rails/my_project#
Now the server starts running. If still not works, then try to reconfigure your locales as mentioned here
$ dpkg-reconfigure locales
It is strange that, after installing such a popular database software, it doesn’t provide any information regarding the failure of its own server. It should give the developers some clue so that they can save their precious time.
The reason of this failure, what I concluded is
1. After installation we have to run the server manually
OR
2. I tried resetting the locales (So if no locales set in the machine may prevented the postgres from starting automatically?)
Lets do the deployment for staging environment.
Create a ruby file under config/deploy/ folder named staging.rb
Copy the following content
set :domain, "mydomain.in"
role :app, domain
role :web, domain
role :db, domain, :primary => true
role :resque_worker, domain # if you are using workers in your project, set role for them if needed
role :resque_scheduler, domain # if you are using workers in your project
set :deploy_to, "/home/my_deploy_path/" # the deployment directory
set :environment, "staging"
set :rails_env, "staging"
set :branch, "staging"
set :previous_environment, "develop"
STEP 4:
Setup capistrano in deployment server
$ cap staging deploy:setup
This will Create folder structure that capistrano uses in the process.
Make sure that everything is set up correctly on the server by the command
$ cap staging deploy:check
Now you can see a message like: “You appear to have all necessary dependencies installed”
Create shared/config folder in your deploy_to path
and copy database.yml and other config files as you written in the symlink_shared task in cap recipie (if any)