<![CDATA[teknik]]>http://teknik.categori.se/Ghost 0.8Mon, 17 Oct 2022 10:36:55 GMT60<![CDATA[split PDFs from the Linux command line]]>My scanner allows me to scan multiple pages to PDF with a single process. It's a great feature--especially for capturing multi-page documents as a single file. It can also be a time-saver for scanning multiple single-page documents—with only a bit of command line:

pdftk multi-page-input-file.pdf burst  

And

]]>
http://teknik.categori.se/split-pdfs-from-the-linux-command-line/16105a27-0381-4ac8-8ea3-7fbdc423b05dSun, 24 Apr 2016 12:34:15 GMTMy scanner allows me to scan multiple pages to PDF with a single process. It's a great feature--especially for capturing multi-page documents as a single file. It can also be a time-saver for scanning multiple single-page documents—with only a bit of command line:

pdftk multi-page-input-file.pdf burst  

And there you have it!

The utility pdftk (for PDF Toolkit, by PDF Labs) is a utility commonly used for client-side scripting or server-side processing of PDFs.

PDFtk’s features are fully documented on its man page.

]]>
<![CDATA[reset user password in self-hosted Ghost Blog]]>A little tip from the file ghost_dir/core/server/models/user.js:

Hash the provided password with bcrypt return nodefn.call(bcrypt.hash, _user.password, null, null);

Generate bcrypt hash and updated it in content/data/.

Or just use this hash which is for “password”: $2a$10$f29LDrB8S1JMfdF40Vmf1.h2OyhtlcefaMrFQVpHeX9XQ7Xiq17KC

]]>
http://teknik.categori.se/reset-user-password-in-your-own-ghost-blog/08b14838-8122-4ae0-861a-677bad6e156eSat, 16 Apr 2016 01:34:36 GMTA little tip from the file ghost_dir/core/server/models/user.js:

Hash the provided password with bcrypt return nodefn.call(bcrypt.hash, _user.password, null, null);

Generate bcrypt hash and updated it in content/data/.

Or just use this hash which is for “password”: $2a$10$f29LDrB8S1JMfdF40Vmf1.h2OyhtlcefaMrFQVpHeX9XQ7Xiq17KC

In bash, run this command to drop into an sqlite shell:

sqlite3 ghost.db  

Then issue the series of commands to reset your user password:

sqlite> UPDATE users SET password="$2a$10$f29LDrB8S1JMfdF40Vmf1.h2OyhtlcefaMrFQVpHeX9XQ7Xiq17KC" where id = 1;  

or replace WHERE id =1 with email = <<YOUR_EMAIL_ADDRESS>>

And then quit.

sqlite> .quit  

If the account has been locked, you can set status to active to unlock the account, like that:

update users set status = “active”;

Now try to log with updated credentials.

References:

]]>
<![CDATA[save Linux terminal history to a file]]> 
If you want to save the terminal history in another file, use the following command:

history > history_file.txt

This new file will contain also and the commands used in your currently opened terminal session.1

A new file called history_file.txt will be created in your

]]>
http://teknik.categori.se/save-linux-terminal-history-to-a-file/f69494d5-0acd-4577-a10d-48bf3366c401Thu, 14 Apr 2016 20:53:11 GMT 
If you want to save the terminal history in another file, use the following command:

history > history_file.txt

This new file will contain also and the commands used in your currently opened terminal session.1

A new file called history_file.txt will be created in your currently working directory containing your last used commands (by default HISTSIZE=1000 and HISTFILESIZE=2000, but you can change these values in ~/.bashrc).

  1. There is a hidden file in your home directory called .bash_history. In a default configuration, this doesn't contain the commands used in your current opened terminal session.

References

]]>
<![CDATA[rotate PDFs from the Linux command line]]>ImageMagick's mogrify tool can be used to rotate PDF documents.

The commands work the same as with any image file:

mogrify -rotate 270 document.pdf

Note, however, that manipulating a PDF in this way will result in loss of image quality. To get around this, specify a particular output

]]>
http://teknik.categori.se/rotate-pdf/8347c295-e818-427f-bfdf-cf152329ec1bMon, 04 Apr 2016 18:50:23 GMTImageMagick's mogrify tool can be used to rotate PDF documents.

The commands work the same as with any image file:

mogrify -rotate 270 document.pdf

Note, however, that manipulating a PDF in this way will result in loss of image quality. To get around this, specify a particular output density, such as follows:

mogrify -density 200 -rotate 270 document.pdf

References

]]>
<![CDATA[rotate images from the Linux command line]]>Two tools for rotating images from the command line are jpegtran and exiftran.

jpegtran

jpegtran transforms JPEG files. It can translate the coded representation from one variant of JPEG to another, for example from baseline JPEG to progressive JPEG or vice versa. It can also perform some rearrangements of the

]]>
http://teknik.categori.se/rotate-images-from-the-command-line/ab8e63d7-7c0b-412d-8130-26c46703c73bSun, 27 Dec 2015 08:54:58 GMTTwo tools for rotating images from the command line are jpegtran and exiftran.

jpegtran

jpegtran transforms JPEG files. It can translate the coded representation from one variant of JPEG to another, for example from baseline JPEG to progressive JPEG or vice versa. It can also perform some rearrangements of the image data, for example turning an image from landscape to portrait format by rotation. The transpose transformation has no restrictions regarding image dimensions. jpegtran's default behaviour when transforming an odd-size image is designed to preserve exact reversibility and mathematical consistency of the transformation set.

The command to rotate input.jpg 90 degrees clockwise and save the result to output.jpg is:

    jpegtran -rotate 90 input.jpg output.jpg

All switch names may be abbreviated; for example, -optimize may be written -opt or -o. Upper and lower case are equivalent. British spellings are also accepted (e.g., -optimise), though for brevity these are not mentioned below.

TRANSFORM OPTIONS

  • -flip horizontal Mirror image horizontally (left-right).
  • -flip vertical Mirror image vertically (top-bottom).
  • -rotate 90 Rotate image 90 degrees clockwise.
  • -rotate 180 Rotate image 180 degrees.
  • -rotate 270 Rotate image 270 degrees clockwise (or 90 ccw).

The transpose transformation has no restrictions regarding image dimensions. The other transformations operate rather oddly if the image dimensions are not a multiple of the iMCU size (usually 8 or 16 pixels), because they can only transform complete blocks of DCT coefficient data in the desired way. The other transforms can be built up as sequences of transpose and flip operations; for consistency, their actions on edge pixels are defined to be the same as the end result of the corresponding transpose-and-flip sequence.

exiftran

exiftran is a command line utility to transform digital image jpeg images. It can do lossless rotations like jpegtran, but unlike jpegtran it cares about the EXIF data: It can rotate images automatically by checking the exif orientation tag, it updates the exif information if needed (image dimension, orientation), it also rotates the exif thumbnail. It can process multiple images at once.

TRANSFORM OPTIONS

  • -a automatic (using exif orientation tag)
  • -9 rotate by 90 degrees clockwise
  • -1 rotate by 180 degrees clockwise
  • -2 rotate by 270 degrees clockwise
  • -f flip vertical
  • -F flip horizontal
  • -t transpose
  • -T transverse
  • -nt don't rotate exif thumbnail.
  • -ni don't rotate jpeg image. (e.g., you might need this or or the -nt option to fixup things in case you rotated the image with some utility which ignores the exif thumbnail. Just generating a new thumbnail with -g is another way to fix it.
  • -no Don't update the orientation tag. By default exiftran sets the orientation to "1" (no transformation needed) to avoid other exif-aware applications try to rotate the already-rotated image again.

To autorotate all jpeg files in the current directory:

    exiftran -ai *.jpeg

References

]]>
<![CDATA[re-size images from the Linux command line]]>I keep a repository of photographs connected to my server, and from it will copy images over into websites I am drafting. In their original format, these images are sized far in excess of what is necessary for high-definition (HD) viewing on the web, and page loading speeds are incredibly

]]>
http://teknik.categori.se/command-line-resize-images/ff97f0d5-0b6a-4d5f-a0d1-cb15f62c6da6Wed, 30 Sep 2015 18:13:06 GMTI keep a repository of photographs connected to my server, and from it will copy images over into websites I am drafting. In their original format, these images are sized far in excess of what is necessary for high-definition (HD) viewing on the web, and page loading speeds are incredibly slow. To re-size them, I use a few simple ImageMagick commands (no GUI needed)!

re-sizing with ImageMagick's convert

A simple convert command can be used to define a resize value in pixels. This operation produces a copy of the original file with a different name:

$ convert fig-1.png -resize 550x fig-1-s.png

With this command, the x signifier after the pixel value (with no space) explicity defines image width. To specify the height, just prefix the pixel value with an x, like this:

$ convert fig-1.png -resize x250 fig-1-s.png

By specifying only the height or width of an image, the non-specified values are proportionally adjusted automatically.

ImageMagick's convert can be used on a number of images at the same time (i.e., a batch process) with scripting.

For example, to reduce the size of an image and to rename it and change the uppercase '.JPG' extension to lower case '.jpg', you would write a script such as follows, and then execute it with the sh command:

#!/bin/bash
for i in `ls *.JPG`; do  
    convert $i -resize 10% ${i%.JPG}.jpg;
done  

NOTE: Make sure to give your script a sensible name to recognize it later on, e.g., resize-to-10-percent.sh.

Change the script to suit your needs, of course. You can, for instance, define your desired image size in pixels by replacing the 10% value (e.g., 400x600). To change the output file format to something other than .jpg, just plug it where .jpg is given in the example above. [ImageMagick can read, convert and write images in a variety of formats (about 100) including GIF, JPEG, JPEG-2000, PNG, PDF, PhotoCD, TIFF and DPX.] To rename your converted files, add some form of identifier, such as -s (for 'small').

Here's another example:

#!/bin/bash
for i in `ls *.JPG`; do  
    convert $i -resize 500x ${i%.JPG}-s.png;
done  

When scripting, be aware that filenames must not contain any space, and that the filename must match to the first two “.JPG” or “.jpg”. Also keep in mind that the script will resize all the pictures in the current folder, but not in any sub folders.


re-sizing with ImageMagick's mogrify

The mogrify tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option).

Here are some exaples:

To reduce the size of an image by percentage:

mogrify -resize 50% image.jpg

To resize all .jpg images in a folder to a maximum dimension of 256x256, the command would be as follows:

mogrify -resize 256x256 *.jpg

Mogrify outputs can be written to a target directory as follows:

mogrify -resize 600x900 -quality 100 -path ../new-images *.jpg

Mogrify can also be used to convert images from one file type to another by using -format, such as follows:

mogrify -format jpg *.png

References:

]]>
<![CDATA[trying to understand pelican themes]]>I have been reading over the pelican documentation on theming, but I find that it's rather terse with respect to its guidance on working with Jinja filters. I am therefore having trouble just trying to install frankV's 'twenty-pelican-html5up' theme.

FrankV's theme notes a few caveats with regard to the install.

]]>
http://teknik.categori.se/understanding-pelican-themes/78716f46-ed35-4ad6-903d-a83cf173194fSat, 10 Jan 2015 03:50:05 GMTI have been reading over the pelican documentation on theming, but I find that it's rather terse with respect to its guidance on working with Jinja filters. I am therefore having trouble just trying to install frankV's 'twenty-pelican-html5up' theme.

FrankV's theme notes a few caveats with regard to the install. I seem to be caught on the second of these caveats (at least for now):

Using a custom jinja filter I determine the type of page and then return the appropriate body class. In code it looks like this:

<body class="{% if page_name %}{{ page_name|sidebar }}{% endif %} loading">

There's a number of different ways to include a custom defined jinja filter in your pelican project. Here's the documentation for it.

And here's the filter code:

def sidebar(value):  
  if value.startswith('archives') or value.startswith('category'):
    return 'right-sidebar'
  elif value == 'index':
    return 'index'
  else:
    return 'no-sidebar'

This is where I'm at:

  1. I verify that pelican is working with the default theme
  2. I install the 'twenty' theme (and to do this, it appears i need sudo to install to /usr/local/lib/python2.7/dist-packages/pelican/themes/twenty
  3. I confirm the theme is installed with pelican-themes -l
  4. I attempt to generate my site content using the theme with pelican content -s pelicanconf.py -t twenty

Here's the hang-up:

CRITICAL: no filter named 'sidebar'

... how do I create the filter?

This article by linkpeek suggests that all I need is:

  1. the filter code (as above)

  2. to register the function in the pelicanconf.py, such as as (the linkpeek example):

    import sys
    sys.path.append('.')
    
    
    import liblinkpeek
    JINJA_FILTERS = {'linkpeek':liblinkpeek.api_v1}
    
  3. to "use the new filter in [the] template (again, the linkpeek example):

    <img src="{{russell.ballestrini.net|linkpeek(size='500')}}" />
    

The challenge is that I don't understand the parts!

For the pelicanconf.py config, here's my problem with the transcription:

import sys    ## What is sys?  
sys.path.append('.')    ## What does it mean to append sys to the current directory?

import sidebar  
JINJA_FILTERS = {'sidebar':????}    ## What goes on the right side of the column and why?  

Then, to use the new filter in the template, do we just rely on FrankV's code (which is located in his base.html)?

<body class="{% if page_name %}{{ page_name|sidebar }}{% endif %} loading">


I had tinkered around a bit following the example from FrankV's pelicanconf.py file:

from utils import filters  
JINJA_FILTERS = { 'sidebar': filters.sidebar, 'pretty_date': filters.pretty_date }  

... but when I add this to my pelicanconf.py file, I just get more errors:

Traceback (most recent call last):  
  File "/usr/local/bin/pelican", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/pelican/__init__.py", line 351, in main
    pelican, settings = get_instance(args)
  File "/usr/local/lib/python2.7/dist-packages/pelican/__init__.py", line 337, in get_instance
    settings = read_settings(config_file, override=get_config(args))
  File "/usr/local/lib/python2.7/dist-packages/pelican/settings.py", line 145, in read_settings
    local_settings = get_settings_from_file(path)
  File "/usr/local/lib/python2.7/dist-packages/pelican/settings.py", line 197, in get_settings_from_file
    module = load_source(name, path)
  File "pelicanconf.py", line 13, in <module>
    from utils import filters
ImportError: No module named utils  

Can anyone help?

]]>
<![CDATA[start Ghost on boot as a service on Ubuntu]]>I was looking for an easy way to start Ghost on boot up and keep it running even if the applicaiton crashes. To do this, one has a few options. I initially wanted to get it working as a service under /etc/init.d/, but accomplishing this turned out to

]]>
http://teknik.categori.se/starting-ghost-on-boot-as-a-service/767c01c8-fe5c-4077-a5d7-df9bfbc61604Wed, 20 Nov 2013 17:19:00 GMTI was looking for an easy way to start Ghost on boot up and keep it running even if the applicaiton crashes. To do this, one has a few options. I initially wanted to get it working as a service under /etc/init.d/, but accomplishing this turned out to be a bit more tricky than I had anticipated. In the end, I couldn't manage it via init.d (even with the new and fancy-looking script provided by the folks at Ghost).

Fortunately for me, there's a good alternative that accomplishes my objectives: including a script in /usr/bin/ and then executing it on reboot via crontab.

Starting Ghost as a Service [persistent across reboot]

First, create your script file:

touch /usr/bin/ghost

Then ensure that the file can be executed:

chmod +x /usr/bin/ghost

After that, just past in the script:

#!/bin/bash 
    ###########################################################
# This script is made to control Ghost as if it were a
# service running on your system.
#
# Place in your path ie /usr/bin/
#
# This script was tested on Ubuntu 12.04.2 LTS.
# It should, however, be *NIX independent
#
# Make sure you alter the variables to your directories
#
# Original Author: Paul Williams
# www.infinitepercent.com
# Modifications for Forever: Aaron Dennis
# http://teknik.categori.se
 ###########################################################

# Variables:
GhostDIR=/path/to/ghost/ #BE SURE TO ADJUST THIS TO YOUR GHOST DIRECTORY  
NodeDIR=/path/to/node #BE SURE TO ADJUST THIS TO YOUR NODE DIRECTORY

# Functions:

# start function will test if Ghost is running, if not it will start it with forever
start()  
{
    PID=$(ps -ef | grep node | grep -v grep | grep -v ps | awk '{print $2}')
    if [ "$PID" = "" ]; then
        cd $GhostDIR && sudo forever start index.js
    else
        echo "Ghost is already running!"
    fi
}

# stop function will test if Ghost is running, it if is it will stop it with forever
stop()  
{
    PID=$(ps -ef | grep node | grep -v grep | grep -v ps | awk '{print $2}')
    if [ "$PID" = "" ]; then
        echo "Ghost isn't running!"
    else
       sudo kill $(ps -ef | grep node | grep -v grep | grep -v ps | awk '{print $2}')
    fi
}

# restart function calls stop function and then calls start function
restart()  
{
    stop
    start
}

# WARNING, DO NOT EVER MANUALLY ENTER BOOT
# YOU MAY END UP WITH MULTIPLE INSTANCES OF GHOST
# THIS OPTION IS MEANT TO BE USED FOR A CRON @REBOOT
boot()  
{
        cd $GhostDIR && sudo forever start index.js
}

# status function is used to check on the status of Ghost
status()  
{
    PID=$(ps -ef | grep node | grep -v grep | grep -v ps | awk '{print     $2}')
    if [ "$PID" = "" ]; then
        echo "Ghost isn't currently running!"
    else
        echo "Ghost is currently running!"
    fi

    echo "Here is the tail of the log:"
    sudo cat $GhostDIR/nohup.out | tail
}

# monitor function is used to monitor the Ghost log
monitor()  
{
    PID=$(ps -ef | grep node | grep -v grep | grep -v ps | awk '{print $2}')
    if [ "$PID" = "" ]; then
        echo "Ghost isn't currently running!"
    else
        echo "Please exit monitor mode with ^C"
        echo "Sleeping for 5 seconds to allow you to read how to exit"
        sleep 5
        sudo tail -f $GhostDIR/nohup.out
    fi
}

cd $GhostDIR  
NodeDIR=$NodeDIR/bin/npm

if [ "$1" = "start" ]; then  
    start
elif [ "$1" = "stop" ]; then  
    stop
elif [ "$1" = "restart" ]; then  
    restart
elif [ "$1" = "status" ]; then  
    status
elif [ "$1" = "monitor" ]; then  
    monitor
elif [ "$1" = "boot" ]; then  
    boot
else  
    echo "$0 {start|stop|restart|status|monitor}"
fi  

Credits:

]]>
<![CDATA[persistent Ghost on Ubuntu Server with Forever]]>This entry addresses how to make the Ghost application persist: Forever.

Forever is a programme that can be used to start Ghost and keep it alive as a background process (i.e. allowing you to continue to use--even close--your terminal without it stopping Ghost). Also, Forever will monitor Ghost and

]]>
http://teknik.categori.se/ghost-on-ubuntu-server-forever-persistent/432f18bb-bacb-4369-aec0-2aadb4402bc9Mon, 18 Nov 2013 14:32:53 GMTThis entry addresses how to make the Ghost application persist: Forever.

Forever is a programme that can be used to start Ghost and keep it alive as a background process (i.e. allowing you to continue to use--even close--your terminal without it stopping Ghost). Also, Forever will monitor Ghost and restart automatically it if it crashes.

Installing Forever

Forever should be installed globally via the Node Package Manager:

npm install -g forever

Basic Use Case: Starting and Stopping Ghost with Forever

You have to use Forever from your Ghost-directory using the index.js (as opposed the usual npm start --production).

Starting Ghost

Per default, forever start index.js will start Ghost in development mode. To use Ghost in production mode, all you need to do is to specify an environment variable:

NODE_ENV=production forever start index.js

Stopping Ghost via Forever

Stopping Ghost is as simple as replacing the start command:

forever stop index.js

or
NODE_ENV=production forever stop index.js

Be sure that you use the same user and environmental parameters when attempting to stop Ghost!

Advanced Use Cases

Logging

Forever Stream Logs to stdout

Streaming Logs to stdout is easy:

forever -f start index.js

Forever Log to File

To use different files, all you need is to specify the log location and to use the -l flag:

forever -l /path/to/ghost/forever.log start index.js

Starting Ghost on Reboot

To ensure that Ghost persists also across reboots, one has a few options. I wanted to get it working as a service under /etc/init.d/, but couldn't manage it (even with the new and fancy-looking script provided by the folks at Ghost).

Fortunately for me, there's a good alternative that accomplishes my objectives: including a script in /usr/bin/ and then executing it on reboot via crontab.

For this to work, you'll need first to create your script file:

touch /usr/bin/ghost

Then you'll need to ensure that the file can be executed:

chmod +x /usr/bin/ghost

After that, just past in the script:

#!/bin/bash

###########################################################
# This script is made to control Ghost as if it were a
# service running on your system.
#
# Place in your path ie /usr/bin/
#
# This script was created/tested on a Rasberry Pi
# running Raspbian.  It was then re-test on Ubuntu 12.04.2 LTS.
# It should, however, be *NIX independent
#
# Make sure you alter the variables to your directories
#
# Original Author: Paul Williams
# www.infinitepercent.com
# Modifications for Forever: Aaron Dennis
# http://teknik.categori.se
###########################################################

# Variables:
GhostDIR=/path/to/ghost/ #BE SURE TO ADJUST THIS TO YOUR GHOST DIRECTORY
NodeDIR=/path/to/node #BE SURE TO ADJUST THIS TO YOUR NODE DIRECTORY

# Functions:

# start function will test if Ghost is running, if not it will start it with forever
start()
{
    PID=$(ps -ef | grep node | grep -v grep | grep -v ps | awk '{print $2}')
    if [ "$PID" = "" ]; then
        cd $GhostDIR && sudo forever start index.js
    else
        echo "Ghost is already running!"
    fi
}

# stop function will test if Ghost is running, it if is it will stop it with forever
stop()
{
    PID=$(ps -ef | grep node | grep -v grep | grep -v ps | awk '{print $2}')
    if [ "$PID" = "" ]; then
        echo "Ghost isn't running!"
    else
       sudo kill $(ps -ef | grep node | grep -v grep | grep -v ps | awk '{print $2}')
    fi
}

# restart function calls stop function and then calls start function
restart()
{
    stop
    start
}

# WARNING, DO NOT EVER MANUALLY ENTER BOOT
# YOU MAY END UP WITH MULTIPLE INSTANCES OF GHOST
# THIS OPTION IS MEANT TO BE USED FOR A CRON @REBOOT
boot()
{
        cd $GhostDIR && sudo forever start index.js
}

# status function is used to check on the status of Ghost
status()
{
    PID=$(ps -ef | grep node | grep -v grep | grep -v ps | awk '{print     $2}')
    if [ "$PID" = "" ]; then
        echo "Ghost isn't currently running!"
    else
        echo "Ghost is currently running!"
    fi

    echo "Here is the tail of the log:"
    sudo cat $GhostDIR/nohup.out | tail
}

# monitor function is used to monitor the Ghost log
monitor()
{
    PID=$(ps -ef | grep node | grep -v grep | grep -v ps | awk '{print $2}')
    if [ "$PID" = "" ]; then
        echo "Ghost isn't currently running!"
    else
        echo "Please exit monitor mode with ^C"
        echo "Sleeping for 5 seconds to allow you to read how to exit"
        sleep 5
        sudo tail -f $GhostDIR/nohup.out
    fi
}

cd $GhostDIR
NodeDIR=$NodeDIR/bin/npm

if [ "$1" = "start" ]; then
    start
elif [ "$1" = "stop" ]; then
    stop
elif [ "$1" = "restart" ]; then
    restart
elif [ "$1" = "status" ]; then
    status
elif [ "$1" = "monitor" ]; then
    monitor
elif [ "$1" = "boot" ]; then
    boot
else
    echo "$0 {start|stop|restart|status|monitor}"
fi

Credits:

]]>
<![CDATA[configuring Gmail for Ghost on Ubuntu Server]]>The official Ghost documentation has a pretty good write-up about how to congifure your mailserver for various clients. This post offers a bit more insight into configuring Gmail.

The Ghost documents describe the process for configuring Gmail [in config.js] as follows:

mail: {
    transport: 'SMTP',
    options: {
        service: 'Gmail',
        auth: {
            user:
]]>
http://teknik.categori.se/ghost-on-ubuntu-server-configuring-mail-server/2e3a161a-9250-4058-ad97-7ac58c035d99Fri, 15 Nov 2013 02:32:36 GMTThe official Ghost documentation has a pretty good write-up about how to congifure your mailserver for various clients. This post offers a bit more insight into configuring Gmail.

The Ghost documents describe the process for configuring Gmail [in config.js] as follows:

mail: {
    transport: 'SMTP',
    options: {
        service: 'Gmail',
        auth: {
            user: 'youremail@gmail.com',
            pass: 'yourpassword'
        }
    }
}

I found that this configuration worked for my accounts that end with @gmail.com. [For instance I have an old account for this server: kategorisera@gmail.com, for which the above config settings worked just fine.] I experienced problems, however, when I tried to enter in a google-managed domain (i.e. one where I use Gmail, but have @mydomainname.com instead of @gmail.com).

To make Google mananaged, custom domain email work in Ghost, you'll need a slightly different config.js entry:

mail: {
            service: "Gmail",
            fromaddress: 'youremail@yourdomain.com',
            transport: 'SMTP',
            options: {
                host: "smtp.gmail.com", 
                secureConnection: true,
                port: 465,
                auth: {
                    user: 'youremail@yourdomain.com',
                    pass: 'password'
                 }
            }
        }

Credits

Thanks to kurapika1811 for explaining this!

]]>
<![CDATA[using Ghost with Apache on Ubuntu Server]]>Ghost is built on top of Node.js, which has built in HTTP server — meaning that people who only run Ghost on their server don't need to bother with Apache. I am not such a person. Rather, I host several web-based applications from the same machine, and use Apache

]]>
http://teknik.categori.se/ghost-on-ubuntu-server-with-apache/86179d95-98fa-4264-96d8-56eafdf83900Mon, 11 Nov 2013 08:00:00 GMTGhost is built on top of Node.js, which has built in HTTP server — meaning that people who only run Ghost on their server don't need to bother with Apache. I am not such a person. Rather, I host several web-based applications from the same machine, and use Apache to direct my traffic.

NOTE: I am beginning to suspect this exposes me to some vulnerability and latency issues that could be avoided by swithcing to nginx, but for the moment I'm going to stick to what know.

Anyway... without further ado, here are the steps I used to install Ghost on Ubuntu 12.04.3 Server with Apache:

The Basics

The environment:

Most people reading this article probably already has Apache installed, and is merely need an easy configuration example. In the case you don't (and for the sake of excessive detail), here's how to install Apache:

sudo apt-get install apache2

To get Apache to play well with Ghost, you'll also need to install and enable modules:

sudo apt-get install libapache2-mod-wsgi
a2enmod proxy proxy_http
service apache2 restart

Asking Apache to Listen:

With Apache and mod_wsgi installaed, the next step is to ask Apache to listen to incoming traffic. Again, this is a step you've probably already taken at some point if you need Apache to direct traffic to Ghost. And if you've done it once — you're done (no need to double the entry)!

So again, to be explicit:

Navigate to you Apache directory — cd /etc/apache2/ — and edit either your httpd.conf or your ports.conf file (your choice!) to listen on port 80:

vi ports.conf

...then add the line:

Listen 80

save and exit.

NOTE: Unless you've specified otherwise, the internet traffic coming from your URL domain will be on port 80.

The Configuration

Your choice of site management:

Now all we need to do is tell Apache what to do with incomming traffic. We configure bit of the puzzle in /etc/apache2/sites-available.

You have a couple of options for how to configure the settings for Ghost. The "easy" way is to just add the configurations in the default file. The alternative is to create a separate file for Ghost, with an easily intelligble name (something like ghost.example.com).

The information you're really after:

Whichever file you chose, here's what you'll need to add:

<VirtualHost *:80>
    ServerName ghost.example.com
    DocumentRoot /path/to/ghost/
    ProxyPreserveHost on
    ProxyPass / http://127.0.0.1:2368/
    ProxyPassReverse / http://127.0.0.1:2368
</VirtualHost>

Notice that Apache directing all incomming traffic on your desired subdomain to your locally-running Ghost (on default port 2368). You're more than welcome to tinker with any of these settings.

If you chose to create a separate entry rather than dumping everything into the defeault file, you'll need to enable it in Apache. To do this, run:

a2ensite ghost.example.com

And to get Apache to recognize these changes, restart it:

service apache2 restart

Assuing that Ghost was already running (that is, internally on localhost), you should now be reach your Ghost installation from the public Internet.

A note about config.js

My blog post about installing Ghost suggests changes to the config.js file in Ghost's root directory. Using ProxyPass, you can pretty much just leave these settings alone, since Apache will be interfacing with Ghost and relaying traffic. You therefore need only to change the url setting.

Credits

I first consulted Alberto Corona's 0X1A blog when trying to get Ghost working with Apache on my server. I ran into some troubles, however, when trying to follow his instructions with regard to config.js (note, too, that as of the time I am writing this, the setting he posted are those of an unmodified the config.example.js file, which I am suggesting should work without changing the host or port settings). Alberto also has us attempting to run Forever using the NODE_ENV=production variable, and I also ran into some trouble with this... but I think my trouble derived precisely from my attempt to change the server IP parameters.

The site How To Install Ghost has a more technical-looking guide, which I saw only after mucking through the process I outline here.

]]>
<![CDATA[installing Ghost on Ubuntu Server]]>Ghost is an Open Source application which allows you to write and publish your own blog. It's simple, elegant, and designed so that you can spend less time making your blog work and more time blogging. Right now to use Ghost you'll have to download it and install it yourself.

]]>
http://teknik.categori.se/ghost-on-ubuntu-server/c625c3bd-f4f0-469e-8003-ad294c8edba0Mon, 11 Nov 2013 08:00:00 GMTGhost is an Open Source application which allows you to write and publish your own blog. It's simple, elegant, and designed so that you can spend less time making your blog work and more time blogging. Right now to use Ghost you'll have to download it and install it yourself.

Update Ubuntu Server

Of course, start by ensuring your server is up-to-date:

sudo apt-get update
sudo apt-get upgrade

Install C Compilier

Before you will get anywhere installing node (and subsequently Ghost), you'll need to install a few packages:

sudo apt-get install build-essential libssl-dev curl git-core

If you don't do this, you'll likely encounter the following error when trying to ./configure node:

Node.js configure error: No acceptable C compiler found!

Install Python Utilities [OPTIONAL]

Gregg Housh's Ghost installation guude suggests a package for python:

sudo apt-get install python-software-properties

NOTE: I didn't experience any problems running the install using only Ubuntu's default python packages.

Install ZIP Archive Utility

Ghost is bundled as a ZIP archive, which vanilla installations of Ubuntu Server will need some help to open:

sudo apt-get install zip unzip

Choose a Software Directory

You'll need to decide for yourself where you wish to keep node and Ghost on your server. Good practice would be to defer to the Filesystem Hierarchy Standard, which suggests /usr/local is the appropriate place for use by the system administrator when installing software locally (ie, for applications installed only on this machine, not on every machine on the network).

cd /usr/local

Download and Install Node

Downloading:

You can get the lastest verison of node using this command:

wget http://nodejs.org/dist/node-latest.tar.gz

I copied the link of the latest version at the time of writing this blog, and since I'll refernce the version extension (-v0.10.21) in the next step, I'll define this just to be explicit:

wget http://nodejs.org/dist/v0.10.21/node-v0.10.21.tar.gz

Extracting and Housekeeping:

To extract the downloaded tar archive:

tar -zxvf node-v0.10.21.tar.gz 

And just to keep things neat and tidy, I loke to mv the downloaded folder to a shorter name:

mv node-v0.10.21 node

Installing Node:

To install, first cd to the node/ directory, them it's as easy as 1, 2, 3:

./configure
make
make install

Download and Install Ghost

Downloading:

If you're still in the node folder, you'll want to cd .. back to /usr/local.

Next we need to make the ghost directory and then download and extract the archive. There is probably a faster, more elegant way of doing this, but here's the route I take:

mkdir ghost
cd ghost
wget https://ghost.org/archives/ghost-0.3.3.zip
unzip ghost-0.3.3.zip

Installing Ghost:

Installing ghost is super simple:

npm install --production

Configuring:

Once Ghost is installed, it will pretty much just work. That is, when I tested the installation on my local computuer, I could navigate directly to 127.0.0.1:2368 and see the programme working.

Working with a server may be a bit more complicated in some contexts. I use EC2, which doesn't allow me to pull up a browser window to view processes running on my localhost (at least, not without a lot of work). So before you can 'see' Ghost after installing it on your server, you'll have to make a few adjustments to your your configuration.

Assuming you haven't yet tried to spin up the programme, you'll need to copy the example config file as follows:

cp config.example.js config.js

Next, open the config.js for editing and find the section that applies for your purposes. Most references I have seen on the internet suggest starting directly with the ###Production section, where you'd need to change the following:

url:  'http://my-ghost-blog.com'
host: '127.0.0.1',
port: '2368'   

to

url:  '[your URL]
host: '[your IP Address]'
port: '[whatever you want]'

NOTE: The assumption here is that you have an URL domain name and a static IP address. For instance, I use the domain categori.se, and have set up Apache to direct my incoming traffic on tankar.categori.se to Ghost (which means that I can leave the default values for all but the url section and everything works great. If all that I were running on categori.se were ghost, I could enter my public IP address in host and use port: 80, which would open Ghost publically. Since I have a few other programmes listening on port 80, this approach isn't feasible for me (hence the Apache set-up). If you also have programmes listening on 80, but don't want to mess around with Apache, you could always assign Ghost to something like port: 8080 (or just leave the default port), but you would need to make sure that whatever port you chose is open to the server (i.e. by chaning your 'security group' or router settings).

Starting Ghost

With all of that out of the way, all we need to do is to start up Ghost. Assuming you're working from the 'production' environment, you'd need to specify that:

sudo npm start --production

Otherwise, you can intialize the default 'development' environment with the basic command:

npm start

References:

c compiler:
http://stackoverflow.com/questions/11659721/node-js-configure-error-no-acceptable-c-compiler
http://stackoverflow.com/questions/3329355/how-to-compile-install-node-jscould-not-configure-a-cxx-compiler-ubuntu

zip installation:

http://www.distrogeeks.com/install-zip-rar-7zip-ubuntu/

node and ghost installation:
http://docs.ghost.org/installation/linux/
http://www.howtoinstallghost.com/how-to-install-ghost-on-ubuntu-server-12-04/

tip about python tools:

http://0v.org/installing-ghost-on-ubuntu-nginx-and-mysql/#.Un-0Yflmh8E

reference for locating programmes in /var/local:

http://superuser.com/questions/90479/what-is-the-conventional-install-location-for-applications-in-linux

]]>
<![CDATA[window managers and desktop environments | Arch Linux]]>

A window manager (WM) is the component of a system's graphical user interface (GUI). The window manager controls the appearance of an application and how it is managed: the border, titlebar, size, and ability to resize a window are handled by window managers. Many window managers provide additional functionality, such

]]>
http://teknik.categori.se/regarding-windows-managers-and-desktop-environments-arch-linux/4ae08cb7-e8c5-464a-8c9c-e454060f1601Tue, 24 Jul 2012 19:27:00 GMT

A window manager (WM) is the component of a system's graphical user interface (GUI). The window manager controls the appearance of an application and how it is managed: the border, titlebar, size, and ability to resize a window are handled by window managers. Many window managers provide additional functionality, such as application docking, a start menu, configuration menus etc.

A window manager (WM) is different than a full-fledged desktop environment. Window managers generally do not a complete user interface, including icons, windows, toolbars, wallpapers, and desktop widgets, which are commonly seen in desktop environments (though it is possible to add icons in a WM with another program). Because of the lack of extras, WMs are much lighter on system resources.


After installing Arch Linux, the user has a functional GNU/Linux environment, but one that is extremely bare bones. The initial interface allows users to interact with the OS via a virtual text console. This initial log-in mode is not considered a ‘graphical’ mode, and before it is possible to use programmes via graphical user interfaces (GUIs), a graphical mode must be installed and switched on.

The X Window System provides the foundation for a graphical user interface. [Xorg is a variable standard for Linux distributions] The X server initiated with the command startx. The default windows manager program called with the ‘startx’ command is ‘twm’. The settings for this call are given in /etc/X11/xinit/xinitrc

twm &
xclock –geometry 50x50-1+1 &
xterm –geometry 80x50+494+51 &
xterm –geometry 80x20+494-0 &
exec xterm –geometry 80x66+0+0 –name login

WM are distinguished according to three rough typologies. I am still learning about the relative strengths and limitations of each.

  • Stacking (aka floating) window managers provide the traditional desktop metaphor used in commercial operating systems like Windows and OSX. Windows act like pieces of paper on a desk, and can be stacked on top of each other.[For available Arch Wiki pages see Category:Stacking WMs.]

Being accustomed to traditioal desktop environments, I really enjoy having the ability to stack, move and arrange windows on the fly. I initially looked to using openbox as my WM, hoping that i could achieve 'floating' windows called from xterm, but without forcing me to exit xterm in order to spin-up a pseudo desktop environment.

  • Tiling window managers automatically organize ("tile") windows so that none overlap. They usually make very extensive use of key-bindings and have less (or no) reliance on the mouse. Tiling behaviors may be defined manual or based on predefined layouts, or both. [For available Arch Wiki pages see Category:Tiling WMs.]

I enjoy using the mouse, and an not as relaint on key bindings as are many other power users. This partially has to do with challenge of memorizing the bindings in the first place—as I use often those few I know.

  • Dynamic window managers can dynamically switch between tiling or floating window layout. [For available Arch Wiki pages see Category:Dynamic WMs.]

This sounds intriguing—like the best of both worlds! The question is how they work in practice.

See Comparison of Tiling Window Managers and [Wikipedia:Comparison of X window managers[(http://en.wikipedia.org/wiki/ComparisonofXwindowmanagers) for comparison of window managers.

Fluxbox has the ability to tab windows.

seeCategory:Stacking
Category:Dynamic
Category:Tiling

]]>
<![CDATA[colorizing bash | Arch Linux]]>


After installing Arch Liunux, I decided that I needed to spruce up my bash environment.

The Arch Linux wiki page on colorizing bash prompt offers us some basic configuration options for colorizing the prompt itself for individual users. One just needs to edit ~/.bashrc by commenting out the defaults and

]]>
http://teknik.categori.se/colorizing-bash/e3883870-ab05-4b70-aff4-8973f4686a35Mon, 23 Jul 2012 14:58:00 GMT


After installing Arch Liunux, I decided that I needed to spruce up my bash environment.

The Arch Linux wiki page on colorizing bash prompt offers us some basic configuration options for colorizing the prompt itself for individual users. One just needs to edit ~/.bashrc by commenting out the defaults and defining one's desired parameter.

Let's say I want a a green prompt:

vi ~/.bashrc
# PS1='[\u@\h \W]\$ '
PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\] '

Colored prompts are nice and all, but I'm after a slightly more colorful environment: one that makes my 'ls' outputs pretty and allows me to easily discern a file from a folder. To accomplish this, I needed a few more lines of code:

#
# ~/.bashrc
#

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

alias ls='ls --color=auto'
PS1='[\u@\h \W]\$ '

# ATTEMPT: redefine bash colors
if [ "$TERM" = "linux" ]; then

echo -en "\e]P0000000" #black
echo -en "\e]P8393939" #bright-black
echo -en "\e]P1ff3a3a" #red
echo -en "\e]P9ff6d6d" #bright-red
echo -en "\e]P260b045" #green
echo -en "\e]PAaddaa0" #bright-green
echo -en "\e]P3d9d03f" #yellow
echo -en "\e]PBfff333" #bright-yellow
echo -en "\e]P41895fb" #blue
echo -en "\e]PC06c9fb" #bright-blue
echo -en "\e]P5c46dab" #magenta
echo -en "\e]PDd5b2e1" #bright-magenta
echo -en "\e]P657ddca" #cyan
echo -en "\e]PEaceee5" #bright-cyan
echo -en "\e]P7f8f8f8" #white
echo -en "\e]PFdedede" #white-grey
clear #for background artifacting

fi

Testing color choices for can be facilitated a script a script to print your color pallet. [NOTE: Scripts need +x permission in order to run the . preface.]

For example:

#touch print
#vim print

-then paste in the script-

#!/bin/bash
# tputcolors

echo
echo -e "$(tput bold) reg  bld  und   tput-command-colors$(tput sgr0)"

for i in $(seq 1 7); do
  echo " $(tput setaf $i)Text$(tput sgr0) $(tput bold)$(tput setaf $i)Text$(tput sgr0) $(tput sgr 0 1)$(tput setaf $i)Text$(tput sgr0)  \$(tput setaf $i)"
done

echo ' Bold            $(tput bold)'
echo ' Underline       $(tput sgr 0 1)'
echo ' Reset           $(tput sgr0)'
echo

-enable execution and run it-

chmod +x print
./print

I'm pretty happy with the results.

... After I eventually settled on xmonad for my window manager (WM), I discovered that xterm draws color settings from ~/.Xresources, and that I would have to tell my xterm programme to merge in my user settings before it would actually load my colors.

Once loaded, I had to stop and start X before setting changes would take effect... resulting in a more time intensive period of fine-tuning and adjusting. I eventually got my xterm looking how I wanted by fooling with ~./Xresources and giving it a similar color scheme. To stop it from showing bolded files, I used these settings:

xterm*font: fixed
xterm*boldFont: fixed

To automate the loading of your color palate, add some additional configuration parameters to ~/.xinrc

Now I just need to figure out how to colorize vim.

]]>
<![CDATA[Arch Linux - a trial]]>

This entry walks the reader through the process of installing Arch Linux. It basically re-presents the steps defined in the Beginner's Guide to Installing Arch Linux—with me contributing only minor edits and comments to improve clarity and to help me more quickly re-deploy a system if I bungle

]]>
http://teknik.categori.se/arch-linux-a-trial/43953492-60a3-4ca5-84a9-5fa8a15427f0Sun, 22 Jul 2012 10:16:00 GMT

This entry walks the reader through the process of installing Arch Linux. It basically re-presents the steps defined in the Beginner's Guide to Installing Arch Linux—with me contributing only minor edits and comments to improve clarity and to help me more quickly re-deploy a system if I bungle it.

  1. Installing Arch Linux from USB *.iso
    a. Establish an internet connection

A Personal Note Detailing Why I Like Arch Linux

I am new to Linux.
I have been using Ubuntu for just over a year now—mostly to help me work with a data and knowledge management system for my very tiny consulting firm.

When I first started using Ubuntu, I felt disappointed. I had an experience as a college junior involving a team of geeks not getting RedHat Linux to work on a Gateway laptop. The two hours I spent listening to the geek-speak of "tweaking the kernel" conjured in my mind a mystery of what Linux is and how insanely technical it must. When years later I finally was re-encouraged into trying Ubuntu (actually, Linux Mint at first, which I kept for about a week), I found it to look, act and feel just the same as Windows and MacOSX: just a horse of different color (and one that couldn't support MS Office—tool of my trade). Why all the fuss?

Over the course of the last year, I learned a lot about what Linux "is" and what distinguishes it from other operating systems. During my year of working with Ubuntu, I deleted and re-installed the OS about 20 times--each time looking up some esoteric setting to get the desktop situated the way I like. It was a steep learning curve of researching and re-researching minor tweaks, box-dependent bugs and the like. [I finally decided I should keep track of all of this for the next occasion I make a mess of my system and have to wipe it... something that advanced users seem never to need to do, but is the only routine I know in times of egregious folly.]

But why start this post on ArchLinux by speaking of Ubuntu?

Because Arch is different.

In a way, Arch "is" what Linux "is". It is remarkably simply, light, and yet versatile operating systems intended to give user total control over their environment. Arch dispenses with all the trickery of trying to be an "easy to intuit" system, and instead asks you why you're even on the computer in the first place. You start from the command line—the base layer of user–machine interaction—and decide from there what you want to do and how to get it done. It's a step closer to the high wizardry of the super-geek, and it offers none of the frills and bloat of the other systems, nor does it start you out in a desktop environment meant to replicate the look and feel of either Mac or MSWindows. Here's how another blogger puts it.

Unfortunately, Arch brings me no closer to being able to ditch MSOffice (which tethers me to MSWindows in one form or another), but that's a different post.


Installing Arch Linux from USB *.iso

Localize

The default keyboard layout us. If you have a non-US keyboard layout, run:
# loadkeys layout

...where layout can be fr, uk, dvorak, be-latin1, etc. Use the command localectl list-keymaps to list all available keymaps.

Also, for languages using more the 26 English letter glyphs, it's necssart to change teh font—otherwise some foreign characters may show up as white squares or as other symbols.

Note that the name is case-sensitive:
# setfont Lat2-Terminus16

If you would like to change the language for the install process (German, in this example), remove the # in front of the locale you want from /etc/locale.gen, along with English (US).

Please choose the UTF-8 entry.

# nano /etc/locale.gen
en_US.UTF-8 UTF-8
de_DE.UTF-8 UTF-8
# locale-gen
# export LANG=de_DE.UTF-8

Establish an internet connection

Wired

The dhcpcd network daemon starts automatically during boot and it will attempt to start a wired connection. Try to ping a server to see if a connection was established.

For example, Google's webservers:
# ping -c 3 www.google.com

If you're not connected, disable the dhcpcd service:

# systemctl stop dhcpcd.service

Use the command ip link to discover the names of your interfaces. Example output will looks something like this":

1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp2s0f0: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether 00:11:25:31:69:20 brd ff:ff:ff:ff:ff:ff
3: wlp3s0: mtu 1500 qdisc mq state UP mode DORMANT qlen 1000 link/ether 01:02:03:04:05:06 brd ff:ff:ff:ff:ff:ff

In this example, the Ethernet interface is enp2s0f0. If you are unsure, your Ethernet interface is likely to start with the letter "e", and unlikely to be "lo" or start with the letter "w".

Activate the connected Ethernet interface (e.g. enp2s0f0):
# ip link set enp2s0f0 up

Add the address:
# ip addr add ip_address/mask_bits dev interface_name

For example:
# ip addr add 192.168.1.2/24 dev enp2s0f0

For more options, run man ip.

Add your gateway like this, substituting your own gateway's IP address:
# ip route add default via ip_address

For example:
# ip route add default via 192.168.1.1

Edit resolv.conf, substituting your name servers' IP addresses and your local domain name:

# nano /etc/resolv.conf

nameserver 61.23.173.5
nameserver 61.95.849.8
search example.com

Note: Currently, you may include a maximum of three nameserver lines. Should you need to overcome this limitation, you can use a locally caching nameserver like Dnsmasq.

Once all these settings are configured, you should now have a working network connection. If not, try troubleshooting by by referencing the Arch Linux network configuration page.

Wireless

must be repeated from the actual installed system after booting into it.

The basic procedure will be:

  • Identify the wireless interface:

# lspci | grep -i net

  • Ensure udev has loaded the driver, and that the driver has created a usable wireless kernel interface with iwconfig:

Note: If you do not see output similar to this, then your wireless driver has not been loaded. If this is the case, you must load the driver yourself. Please see Wireless Setup for more detailed information.

# iwconfig

enp2s0f0 no wireless extensions.
wlp3s0  IEEE 802.11bgn ESSID:"NETGEAR97"
Mode:Managed Frequency:2.427 GHz Access Point: 2C:B0:5D:9C:72:BF
Bit Rate=65 Mb/s Tx-Power=16 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Power Management:on
Link Quality=61/70 Signal level=-49 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:430 Missed beacon:0
lo      no wireless extensions.

In this example, wlp3s0 is the available wireless interface.

  • Bring the interface up with:

# ip link set wlp3s0 up

A small percentage of wireless chipsets also require firmware, in addition to a corresponding driver. If the wireless chipset requires firmware, you are likely to receive this error when bringing the interface up:

Next, use netcfg's wifi-menu to connect to a network:

# wifi-menu wlp3s0

Warning: At the moment, netcfg's wifi-menu, when executed without arguments, will look for "wlan0". Execute wifi-menu with your interface as the argument in order to use it.

You should now have a working network connection. If you do not, check the detailed Wireless Setup page.

Prepare the storage drive

MBR GPT

# mkfs.ext4 /dev/sda1
# mkfs.ext4 /dev/sda2

If you have made a partition dedicated to swap (code 82), don't forget to format and activate it with:

# mkswap /dev/sdaX
# swapon /dev/sdaX

Then mount the home partition and any other separate partition (/boot, /var, etc), if you have any:

# mkdir /mnt/home
# mount /dev/sda2 /mnt/home

In case you have a UEFI motherboard, mount the UEFI partition:

# mkdir /mnt/boot/efi
# mount /dev/sdaX /mnt/boot/efi

Select a mirror

Before installing, you may want to edit the mirrorlist file and place your preferred mirror first. A copy of this file will be installed on your new system by pacstrap as well, so it's worth getting it right.

# nano /etc/pacman.d/mirrorlist
##
## Arch Linux repository mirrorlist
## Sorted by mirror score from mirror status page
## Generated on 2012-MM-DD
##

Server = http://mirror.example.xyz/archlinux/$repo/os/$arch
...

Install the base system

The base system is installed using the pacstrap script.

The -i switch can be omitted if you wish to install every package from the base and base-devel groups without prompting.

# pacstrap -i /mnt base base-devel

Note: If pacman fails to verify your packages, check the system time with cal. If the system date is invalid (e.g. it shows year 2010), signing keys will be considered expired (or invalid), signature checks on packages will fail and installation will be interrupted. Make sure to correct the system time, either by doing so manually or with the ntp client, and retry running the pacstrap command. Refer to Time page for more information on correcting system time.

Note: If pacman complains about invalid signatures during the pacstrap phase (error: failed to commit transaction (invalid or corrupted package)) run the following command below.

# pacman-key --init && pacman-key --populate archlinux

  • base: Software packages from the [core] repo to provide the minimal base environment.
  • base-devel: Extra tools from [core] such as make, and automake. Most beginners should choose to install it, as it will likely be needed to expand the system. The base-devel group will be required to install software from the Arch User Repository.

This will give you a basic Arch system. Other packages can be installed later using pacman.

Generate an fstab

Generate an fstab file with the following command. UUIDs will be used because they have certain advantages (see fstab#Identifying filesystems). If you would prefer to use labels instead, replace the -U option with -L.

Note: If you encounter errors running genfstab or later in the install process, do not run genfstab again; just edit the fstab file.

# genfstab -U -p /mnt | sed 's/rw,relatime,data=ordered/defaults,relatime/' >> /mnt/etc/fstab
# nano /mnt/etc/fstab

Warning: The fstab file should always be checked after generating it. If you made an EFI system partition earlier, then genfstab has incorrectly added options to your EFI system partition. This will in fact prevent your computer from booting from that drive, so you need to remove all options for the EFI partition except for noatime. For the other partitions that use it, be sure to replace "codepage=cp437" with "codepage=437" or else when you next reboot, any mounts with this option will fail and systemd will halt and drop into recovery mode. This should be fixed by linux 3.8

A few considerations:

  • Only the root (/) partition needs 1 for the last field. Everything else should have either 2 or 0 (see fstab#Field definitions).

Chroot and configure the base system

Next, we chroot into our newly installed system:

# arch-chroot /mnt

Note: Use arch-chroot /mnt /bin/bash to chroot into a bash shell.

At this stage of the installation, you will configure the primary configuration files of your Arch Linux base system. These can either be created if they do not exist, or edited if you wish to change the defaults.

Closely following and understanding these steps is of key importance to ensure a properly configured system.

Locale

Locales are used by glibc and other locale-aware programs or libraries for rendering text, correctly displaying regional monetary values, time and date formats, alphabetic idiosyncrasies, and other locale-specific standards.

There are two files that need editing: locale.gen and locale.conf.

  • The locale.gen file is empty by default (everything is commented out) and you need to remove the # in front of the line(s) you want. You may uncomment more lines than just English (US), as long as you choose their UTF-8 encoding:

# nano /etc/locale.gen

en_US.UTF-8 UTF-8
de_DE.UTF-8 UTF-8

# locale-gen

This will run on every glibc upgrade, generating all the locales specified in /etc/locale.gen.

  • The locale.conf file doesn't exist by default. Setting only LANG should be enough. It will act as the default value for all other variables.

    # echo LANG=en_US.UTF-8 > /etc/locale.conf
    # export LANG=en_US.UTF-8
    

Note: If you set some other language than English at the beginning of the install, the above commands would be something like:

# echo LANG=de_DE.UTF-8 > /etc/locale.conf
# export LANG=de_DE.UTF-8

To use other LC_* variables, first run locale to see the available options. An advanced example can be found here.

Warning: Using the LC_ALL variable is strongly discouraged because it overrides everything. Console font and keymap

If you set a keymap at the beginning of the install process, load it now, as well, because the environment has changed. For example:

# loadkeys de-latin1
# setfont Lat2-Terminus16

To make them available after reboot, edit vconsole.conf:

# nano /etc/vconsole.conf

KEYMAP=de-latin1
FONT=Lat2-Terminus16
  • KEYMAP – Please note that this setting is only valid for your TTYs, not any graphical window managers or Xorg.
  • FONT – Available alternate console fonts reside in /usr/share/kbd/consolefonts/. The default (blank) is safe, but some foreign characters may show up as white squares or as other symbols. It's recommended that you change it to Lat2-Terminus16, because according to /usr/share/kbd/consolefonts/README.Lat2-Terminus16, it claims to support "about 110 language sets".
  • Possible option FONT_MAP – Defines the console map to load at boot. Read man setfont. Removing it or leaving it blank is safe.

See Console fonts and man vconsole.conf for more information.
Time zone

Available time zones and subzones can be found in the /usr/share/zoneinfo/<Zone>/<SubZone> directories.

To view the available <Zone>, check the directory /usr/share/zoneinfo/:

# ls /usr/share/zoneinfo/

Similarly, you can check the contents of directories belonging to a <SubZone>:

# ls /usr/share/zoneinfo/Europe

Create a symbolic link /etc/localtime to your zone file /usr/share/zoneinfo/<Zone>/<SubZone> using this command:

# ln -s /usr/share/zoneinfo/<Zone>/<SubZone> /etc/localtime

Example:

# ln -s /usr/share/zoneinfo/Europe/Minsk /etc/localtime

Hardware clock

Set the hardware clock mode uniformly between your operating systems. Otherwise, they may overwrite the hardware clock and cause time shifts.

You can generate /etc/adjtime automatically by using one of the following commands:

  • UTC (recommended)

Note: Using UTC for the hardware clock does not mean that software will display time in UTC.

# hwclock --systohc --utc

To synchronize your "UTC" time over the internet, see NTPd.

  • localtime (discouraged; used by default in Windows)

Warning: Using localtime may lead to several known and unfixable bugs. However, there are no plans to drop support for localtime.

# hwclock --systohc --localtime

If you have (or planning on having) a dual boot setup with Windows:

  • Recommended: Set both Arch Linux and Windows to use UTC. A quick registry fix is needed. Also, be sure to prevent Windows from synchronizing the time on-line, because the hardware clock will default back to localtime.

Not recommended: Set Arch Linux to localtime and disable any time-related services, like NTPd . This will let Windows take care of hardware clock corrections and you will need to remember to boot into Windows at least two times a year (in Spring and Autumn) when DST kicks in. So please don't ask on the forums why the clock is one hour behind or ahead if you usually go for days or weeks without booting into Windows.

Hostname

Set the hostname to your liking (e.g. arch):

# echo myhostname > /etc/hostname

Note: You no longer need to edit /etc/hosts. The nss-myhostname package will provide host name resolution, and is installed on all systems by default.

Configure the network

You need to configure the network again, but this time for your newly installed environment. The procedure and prerequisites are very similar to the one described above, except we are going to make it persistent and automatically run at boot.

Note: For more in-depth information on network configration, visit Configuring Network and Wireless Setup.

Wired
Dynamic IP

If you only use a single fixed wired network connection, you do not need a network management service and can simply enable the dhcpcd service. Where <interface> is your wired interface:

# systemctl enable dhcpcd@<interface>.service

Alternatively, you can use netcfg's net-auto-wired, which gracefully handles dynamic connections to new networks:

Install ifplugd, which is required for net-auto-wired:

# pacman -S ifplugd

Set up the dhcp profile and enable the net-auto-wired service:

# cd /etc/network.d
# ln -s examples/ethernet-dhcp .
# systemctl enable net-auto-wired.service

Static IP

Install ifplugd, which is required for net-auto-wired:

# pacman -S ifplugd

Copy a sample profile from /etc/network.d/examples to /etc/network.d:
# cd /etc/network.d # cp examples/ethernet-static .

Edit the profile as needed:
# nano ethernet-static

Edit /etc/conf.d/netcfg and modify the network interface name, most likely it is not eth0. You can find out more about the naming in the warning above.

WIRED_INTERFACE="<interface>"

Enable the net-auto-wired service:

# systemctl enable net-auto-wired.service

Wireless

You will need to install additional programs to be able to configure and manage wireless network profiles for netcfg.

NetworkManager and Wicd are other popular alternatives.

Install the required packages:
# pacman -S wireless_tools wpa_supplicant wpa_actiond dialog

If your wireless adapter requires a firmware (as described in the above Establish an internet connection section and also here), install the package containing your firmware. For example: # pacman -S zd1211-firmware

  • After finishing the rest of this installation and rebooting, you can connect to the network with wifi-menu <interface>(where <interface> is the interface of your wireless chipset), which will generate a profile file in /etc/network.dnamed after the SSID. There are also templates available in /etc/network.d/examples/ for manual configuration.

    # wifi-menu <interface>
    

Warning: If you're using wifi-menu, this must be done after your reboot when you're no longer chrooted. The process spawned by this command will conflict with the one you have running outside of the chroot. Alternatively, you could just configure a network profile manually using the templates previously mentioned so that you don't have to worry about using wifi-menu at all.

  • Enable the net-auto-wireless service, which will connect to known networks and gracefully handle roaming and disconnects:

# systemctl enable net-auto-wireless.service

Note: Netcfg also provides net-auto-wired, which can be used in conjunction with net-auto-wireless.

  • Make sure that the correct wireless interface (e.g. wlp3s0) is set in /etc/conf.d/netcfg:

    # nano /etc/conf.d/netcfg
    WIRELESS_INTERFACE="wlp3s0"
    

It is also possible to define a list of network profiles that should be automatically connected, using the AUTOPROFILESvariable in /etc/conf.d/netcfg. If AUTOPROFILES is not set, all known wireless networks will be tried.

xDSL (PPPoE), analog modem or ISDN

For xDSL, dial-up and ISDN connections, see Direct Modem Connection.

Configure pacman

Pacman is the Arch Linux package manager. It is highly recommended to study and learn how to use it. Read man pacman, have a look at the pacman article, or check out the Pacman Rosetta article for a comparison to other popular package managers.

For repository selections and pacman options, edit pacman.conf:
# nano /etc/pacman.conf

Most people will want to use [core], [extra] and [community].

If you installed Arch Linux x86_64, it's recommended that you enable the [multilib] repository, as well (to be able to run both 32 bit and 64 bit applications):

Note: When choosing repos, be sure to uncomment both the [repo_name] header lines, as well as the lines below. Failure to do so will result in the selected repository being omitted! This is a very common error. A correct example for the multilib repository is found below.

[multilib]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist

You will then need to update the package list by running pacman with the -Sy switch. Failing to do so will generate "warning: database file for 'multilib' does not exist" error when next using pacman.

See Official Repositories for more information, including details about the purpose of each repository.

For software unavailable directly through pacman, see Arch User Repository.

Create an initial ramdisk environment

Tip: Most users can skip this step and use the defaults provided in mkinitcpio.conf. The initramfs image (from the /boot folder) has already been generated based on this file when the linux package (the Linux kernel) was installed earlier with pacstrap.

Here you need to set the right hooks if the root is on a USB drive, if you use RAID, LVM, or if /usr is on a separate partition.

Edit /etc/mkinitcpio.conf as needed and re-generate the initramfs image with: # mkinitcpio -p linux

Note: Arch VPS installations on QEMU (e.g. when using virt-manager) may need virtio modules in mkinitcpio.confto be able to boot.

# nano /etc/mkinitcpio.conf
MODULES="virtio virtio_blk virtio_pci virtio_net"

Set the root password and add a regular user

Set the root password with: # passwd

Warning: Linux is a multi-user operating system. You should not perform everyday tasks using the root account. It is considered a very poor practice and could be extremely dangerous. The root account should only be used for administrative tasks.

Then add a normal user account. The user archie is just an example.

# useradd -m -g users -G wheel -s /bin/bash archie
# passwd archie

If you wish to start over, use userdel. The -r option will remove the user's home directory and its content, along with the user's settings (the so-called "dot" files).

# userdel -r archie

For more information, read Users and Groups.

Install and configure a bootloader

For BIOS motherboards

For BIOS systems, there are three bootloaders - Syslinux, GRUB, and LILO. Choose the bootloader as per your convenience. Below only Syslinux and GRUB are explained.

  • Syslinux is (currently) limited to loading only files from the partition where it was installed. Its configuration file is considered to be easier to understand. An example configuration can be found here.
  • GRUB is more feature-rich and supports more complex scenarios. Its configuration file(s) is more similar to a scripting language, which may be difficult for beginners to manually write. It is recommended that they automatically generate one.

Note: Some BIOS systems may have issues with GPT. See http://mjg59.dreamwidth.org/8035.html andhttp://rodsbooks.com/gdisk/bios.html for more info and possible workarounds.

Syslinux

Install the syslinux package and then use the syslinux-install_update script to automatically install the files (-i), mark the partition active by setting the boot flag (-a), and install the MBR boot code (-m):

Note: If you have partitioned the drive as GPT, install gptfdisk package, as well (pacman -S gptfdisk), because it contains sgdisk, which will be used to set the GPT-specific boot flag.

# pacman -S syslinux
# syslinux-install_update -i -a -m

Configure syslinux.cfg to point to the right root partition. This step is vital. If it points to the wrong partition, Arch Linux will not boot. Change /dev/sda3 to reflect your root partition (if you partitioned your drive as in the example, your root partition is sda1). Do the same for the fallback entry.

# nano /boot/syslinux/syslinux.cfg
...
LABEL arch
        ...
        APPEND root=/dev/sda3 ro
        ...

For more information on configuring and using Syslinux, see Syslinux.
GRUB

Install the grub-bios package and then run grub-install:

Note: Change /dev/sda to reflect the drive you installed Arch on. Do not append a partition number (do not use sdaX).

Note: For GPT-partitioned drives on BIOS motherboards, GRUB needs a 2 MiB "BIOS Boot Partition".

# pacman -S grub-bios
# grub-install --target=i386-pc --recheck /dev/sda
# cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo

While using a manually created grub.cfg is absolutely fine, it's recommended that beginners automatically generate one:

Tip: To automatically search for other operating systems on your computer, install os-prober (pacman -S os-prober) before running the next command.

# grub-mkconfig -o /boot/grub/grub.cfg

For more information on configuring and using GRUB, see GRUB.

GRUB

Note: In case you have a system with 32-bit EFI, like pre-2008 Macs, install grub-efi-i386 instead, and use --target=i386-efi.

# pacman -S grub-efi-x86_64 efibootmgr
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck
# cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo

The next command creates a menu entry for GRUB in the UEFI boot menu. However, as of grub-efi-x86_64 version 2.00, grub-install tries to create a menu entry, so running efibootmgr may not be necessary. See UEFI#efibootmgr for more info.

# efibootmgr -c -g -d /dev/sdX -p Y -w -L "Arch Linux (GRUB)" -l '\EFI\arch_grub\grubx64.efi'

Next, while using a manually created grub.cfg is absolutely fine, it's recommended that beginners automatically generate one:

Tip: To automatically search for other operating systems on your computer, install os-prober (pacman -S os-prober) before running the next command.

# grub-mkconfig -o /boot/grub/grub.cfg

For more information on configuring and using GRUB, see GRUB.

Unmount the partitions and reboot

Exit from the chroot environment: # exit

Since the partitions are mounted under /mnt, we use the following command to unmount them: # umount /mnt/{boot,home,}

Reboot the computer: # reboot

Tip: Be sure to remove the installation media, otherwise you will boot back into it.

Of course, configuration can be difficult...

]]>