Friday, 24 July 2015

[English] indefinite vs. definite articles

Articles are so difficult for me. It is inevitable to make mistake when writing a research paper. It is also a problem always mentioned by reviewers, including my supervisor as well. It is so bad!
Besides, I also took a test from British Council. The result is no surprise. Only 7 in 12 are right.
Below is a summary from references for a/an and the articles.

Reasons to use the indefinite (a/an) article before a noun

  • countable nouns but doesn’t know exactly which one
    • I would like an apple.
  • one of a group
    • I am a student in the university.
  • a job or position
    • I am a software engineer.
  • all things of the kind
    • A computer has a CPU. (All computers have a CPU.)

Reasons to use without articles before a noun

  • plural nouns
    • Many softwares are developed to increase the productivity at work.
  • uncountable nouns
    • Information can be encoded into different formats in a computer.
    • Life is harder today than …
  • continents
    • Africa, Asia, North America, South America, Antarctica, Europe and Australia
  • languages
    • Chinese, English, French etc
    • She is fluent in French.
  • specific year
    • She was born in 1989.

Reasons to use the definite article before a noun

  • only one
    • The earth/the sun/the moon
  • before superlative adjective
    • She is the most beautiful girl in our class.
    • She is the best person I ever met.
  • only one in that place
    • The button on the right window is blue.
  • already mention it
    • This work presents a new approach to address the model checking issue. The approach is …
  • all things referred by a noun
    • The elephant is really a big animal. (Elephants are really big animals.)
  • musical instruments
    • I can play the piano.
    • The guitar is a popular musical instrument.
  • refer to a system or service
    • The police is on the way.
    • I am listening to the radio.
    • How long does it take by the bus?
  • with adjectives to talk about groups of people
    • The poor
    • The rich
    • The elderly
    • The disabled
  • no article with names
    • London is a big city.
    • Jane Austen was an English novelist.
    • We are from China.
  • names of countries contain Kingdom, States and Republic
    • the United Kingdom
    • the United States
    • the People’s Republic of China
  • names of counties are plural
    • the Netherlands, the Philippines
  • geographical features
    • the Atlantic, the Arctic Ocean, the West Lake, the Panama Canal, the Himalayas
  • newspapers
    • The Times, The Sun, The Daily Mail
  • famous buildings or works of art
    • the Taj Mahal, the Great Wall, the Mona Lisa
  • organisations
    • the United Nations, the Red Cross
  • hotels, pubs and restaurants
    • the Grand Budapest Hotel
    • no article if it’s the owner’s name: Hilton Hotel
  • families
    • the Smiths
  • decade/era
    • For people born in the 1960’s,
​

Monday, 13 July 2015

[Eiffel] design by contract


This is a very simple example. There are two levels of contract.
  • The contract for set_val routine: require states the precondition of this routine that the argument v shall not be negative; ensure enforces the postcondition of this routine that the val shall be equal to v. 
  • Class invariant enforces that for all objects/instances of this class their val shall not be negative.
The do  clause actually is an implementation of the specification, expressed by precondition and postcondition, of reset or set_val. If the implementation violates the specification, then bugs are found. This concept is similar to the refinement check in B method. When we regard class in Eiffel as a B machine, member features map to variables in B, create maps to initialisation in B and invariant to invariant. However in B method, a specification and its implementation are in different machine but Eiffel takes them together.

In B method, it can check the correctness between the implementation and the specification by a theorem prover or a model checker. In Eiffel, it might use the hybrid method (static analysis plus test run) to check it.

If we can write the specification in B method (or similar formal languages such as Z notation, VDM), then refine them to an implementation by the refinement check. Afterwards, we may translate this refinement to Eiffel language and also keep the specification. It might be a good way from a formal specification, formal verification and finally to the code.

[Eiffel] first impression

Just read a blog from professor Bertrand Meyer at CACM. For me, it is the second time to hear about Eiffel. I can not recall when to read it before but just have a bit impression of this term.
I also searched my email@University and found some information about it. One is about a seminar from the professor but unfortunately I didn’t participate. And another news is about the honorary doctorate to the professor from my university (University of York) in 2014.
When I was reading the post, I am very interested in the concept of fixing bugs automatically by AutoFix. So took some time (about 4 hours) to read the introductions of Eiffel from Wikipedia and Eiffel Software. And there are some good presentations.
Some key features of Eiffel are shown below.
​



Eiffel Language
  • Object-Oriented
    • Inheritance
    • Class
      • Feature
      • Create
      • Invariant
  • Design by Contract [Specification]
    • Precondition by "require"
    • Postcondition by "ensure"
    • Class Invariant
      • Inherited
  • Static Typing
    • Instead of dynamic typing
    • Typing check before execution and done in compiler
  • Void-Safety
    • NullPointer is a nightmare (Java, C, ...)!
    • Protect runtime errors caused by calls to null
    • An attached variable is not allowed to be set to void
  • SCOOP
    • Only add one "separate" keyword

Wednesday, 8 July 2015

Multiple Java versions management and switch on Mac OS X

For my research, I do need at least two different Java versions (6.0 and 7.0 or above) on my Mac OS X. I found this tool jEnv is very useful and the Andrew’s “ Managing multiple versions of Java on OS X” is helpful.
  • Check Current Java Version
      $ java -version
      java version "1.6.0_65"
      Java(TM) SE Runtime Environment (build 1.6.0_65-b14-466.1-11M4716)
      Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-466.1, mixed mode)
      $ /usr/libexec/java_home
      /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
      $ ls /System/Library/Java/JavaVirtualMachines/
      1.6.0.jdk
    

Installation of jEnv

  • Install
      $brew install jenv
    
      ==> Downloading https://homebrew.bintray.com/bottles/jenv-0.4.3.yosemite.bottle.tar.gz
      ######################################################################## 100.0%
      ==> Pouring jenv-0.4.3.yosemite.bottle.tar.gz
      ==> Caveats
      To enable shims and autocompletion add to your profile:
        if which jenv > /dev/null; then eval "$(jenv init -)"; fi
    
      To use Homebrew's directories rather than ~/.jenv add to your profile:
        export JENV_ROOT=/usr/local/opt/jenv
    
      ==> Summary
      🍺  /usr/local/Cellar/jenv/0.4.3: 74 files, 308K 
    
  • Follow the instruction
      $ echo 'if which jenv > /dev/null; then eval "$(jenv init -)"; fi' >> .bash_profile
    
  • Check
      $ jenv versions
      * system (set by /Users/ykf_2001/.jenv/version)
    

Installation of Java 8

  • Download and install it manually from Oracle
  • Check it
      $java -version
      java version "1.8.0_45"
      Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
      Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
      $ /usr/libexec/java_home
      /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
      $ ls /Library/Java/JavaVirtualMachines/
      jdk1.8.0_45.jdk
    
  • So now the OS comes with Java 8
  • List all javas installed
      $ /usr/libexec/java_home -verbose
      Matching Java Virtual Machines (3):
          1.8.0_45, x86_64:    "Java SE 8"    /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
          1.6.0_65-b14-466.1, x86_64:    "Java SE 6"    /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    

Add of old Java 6 and Java 8 to jEnv

    $ jenv add /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    oracle64-1.6.0.65 added
    1.6.0.65 added
    1.6 added
    $ jenv versions
    * system (set by /Users/ykf_2001/.jenv/version)
      1.6
      1.6.0.65
      oracle64-1.6.0.65
    $ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/
    oracle64-1.8.0.45 added
    1.8.0.45 added
    1.8 added
    $ jenv versions
    * system (set by /Users/ykf_2001/.jenv/version)
      1.6
      1.6.0.65
      1.8
      1.8.0.45
      oracle64-1.6.0.65
      oracle64-1.8.0.45

Configurations

  • Set global Java version to Java 8
      $ jenv global oracle64-1.6.0.65
      $ jenv versions
        system
        1.6
        1.6.0.65
        1.8
        1.8.0.45
      * oracle64-1.6.0.65 (set by /Users/ykf_2001/.jenv/version)
        oracle64-1.8.0.45
      $ jenv global oracle64-1.8.0.45
      $ jenv versions
        system
        1.6
        1.6.0.65
        1.8
        1.8.0.45
        oracle64-1.6.0.65
      * oracle64-1.8.0.45 (set by /Users/ykf_2001/.jenv/version)
      $ cat ~/.jenv/version
      oracle64-1.8.0.45
      $ java -version
      java version "1.8.0_45"
      Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
      Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
    
  • Set the Java 6 for local directories
      ~/Programs/eclipse-kepler-for-czt$ jenv local oracle64-1.6.0.65
      ~/Programs/eclipse-kepler-for-czt$ jenv versions
        system
        1.6
        1.6.0.65
        1.8
        1.8.0.45
      * oracle64-1.6.0.65 (set by /Users/ykf_2001/Programs/eclipse-kepler-for-czt/.java-version)
        oracle64-1.8.0.45
      ~/Programs/eclipse-kepler-for-czt$ cd ~/Workspace/czt-code-20150622/
      ~/Workspace/czt-code-20150622$ jenv local oracle64-1.6.0.65
      ~/Workspace/czt-code-20150622$ jenv versions
        system
        1.6
        1.6.0.65
        1.8
        1.8.0.45
      * oracle64-1.6.0.65 (set by /Users/ykf_2001/Workspace/czt-code-20150622/.java-version)
        oracle64-1.8.0.45
    
​

Thursday, 21 May 2015

[Linux] A progress bar implemented in C on Linux and MacOS X

A progress bar implemented in C on Linux and MacOS X

Implementations

  • CR - carriage return (\r)
  • CSI_1 - move up one row and back to column 1, and then erase display from cursor to end of display (\033[1F\033[J)
  • CSI_2 - move up one row and back to column 1, and then erase display from start of display to cursor (\033[1F\033[1J)
  • CSI_3 - move up one row and then erase whole line (\033[1A\033[2K)
CSI Sequence Reference:

Source code


// An implementation of progress bar in C on Linux
//
// Usage:
//    ./prog [type]
//        type: CR, CSI_1, CSI_2, CSI_3
//
// Bar style: 
//  0 - 10% [====                                                 ] 
//  1 -     |====.................................................| 10%
//  2 -     [||||.................................................] 10%
//
// Implementations
//  CR    - carriage return (\r) 
//  CSI_1 - move up one row and back to column 1, and then 
//          erase display from cursor to end of display (\033[1F\033[J)
//  CSI_2 - move up one row and back to column 1, and then 
//          erase display from start of display to cursor (\033[1F\033[1J)
//  CSI_3 - move up one row and then erase whole line (\033[1A\033[2K)
//  
//  Reference for CSI sequence: man console_codes(4)
//

#include 
#include 
//#include  // usleep deprecated
#include    // nanosleep
#include    // strcmp

//#define BAR_STYLE   0
//#define BAR_STYLE   1
#define BAR_STYLE   2

typedef enum
{
    T_CR,
    T_CSI_1,
    T_CSI_2,
    T_CSI_3,
}TYPE_OF_CONTROL;

void usage()
{
    printf("./prog [type]\n");
    printf("    type: CR, CSI_1, CSI_2, CSI_3\n");
}

void prog_bar (int done, int all, int width, TYPE_OF_CONTROL t)
{
    float ration = (done*100)/(float)all;
    int d = (int)(ration * width)/100;
    int i;

#if BAR_STYLE == 0
    printf("%d%% [", (int)ration); 
    for(i = 0; i < d; i++)
        printf("=");

    for(i = d; i < width; i++)
        printf(" ");

    printf("]"); 
#elif BAR_STYLE == 1
    printf("|"); 
    for(i = 0; i < d; i++)
        printf("=");

    for(i = d; i < width; i++)
        printf(".");

    printf("| %d%% ", (int)ration); 
#elif BAR_STYLE == 2
    printf("["); 
    for(i = 0; i < d; i++)
        printf("|");

    for(i = d; i < width; i++)
        printf(".");

    printf("] %d%% ", (int)ration); 
#endif
    switch(t)
    {
        case T_CR: 
            printf("\r");
            fflush(stdout);
            break;
        case T_CSI_1:
            // move cursor up for 1 line and then erase from cursor to end of display 
            printf("\n\033[1F\033[J");
            break;
        case T_CSI_2:
            // move cursor up for 1 line and then erase from start of display to cursor
            printf("\n\033[1F\033[1J");
            break;
        case T_CSI_3:
            // move cursor up for 1 line and then erase whole line. 
            printf("\n\033[1A\033[2K");
            break;
        default:
            break;
    }
}

int main(int argc, char *argv[])
{
    int i = 0;
    const struct timespec t = {0, 100000000}; //100ms
    TYPE_OF_CONTROL ctrl_type = T_CR;

    if(0 == isatty(1))
    {
        printf("Not a terminal.\n");
        fflush(stdout);
    }

    switch (argc)
    {
        case 1:
            ctrl_type = T_CR;
            break;
        case 2:
            if (strcmp(argv[1], "CR") == 0)
            {
                ctrl_type = T_CR;
            }
            else if (strcmp(argv[1], "CSI_1") == 0)
            {
                ctrl_type = T_CSI_1;
            }
            else if (strcmp(argv[1], "CSI_2") == 0)
            {
                ctrl_type = T_CSI_2;
            }
            else if (strcmp(argv[1], "CSI_3") == 0)
            {
                ctrl_type = T_CSI_3;
            }
            else
            {
                usage(); 
                exit(-1);
            }
            break;
        default:
            usage();
            exit(-1);
    }

    for(i = 0; i <= 100; i++)
    { 
        if(isatty(1))
        { 
            prog_bar(i, 100, 100, ctrl_type); 
        } 
        nanosleep(&t, NULL); //0.1 sec
    }

    exit(0);
}

Test

MacOS X

Different terminal emulators
Apple Terminal
  • Works: CR, CSI_1, CSI_2, CSI_3
  • $echo $TERM is xterm-color
iTerm2
  • Works: CR, CSI_1, CSI_2, CSI_3
  • $echo $TERM is xterm-color
xterm
  • Works: CR, CSI_1, CSI_2, CSI_3
  • $echo $TERM is xterm

Ubuntu

virtual terminal (tty)
  • Works: CR, CSI_1, CSI_2, CSI_3
  • $echo $TERM is linux
gnome-terminal
  • Works: CR, CSI_1, CSI_2, CSI_3
  • $echo $TERM is gnome-terminal
xterm
  • Works: CR, CSI_1, CSI_2, CSI_3
  • $echo $TERM is xterm
ssh from iTerm2 on MacOS X
  • Works: CR, CSI_2, CSI_3
  • Doesn’t work: CSI_1
  • $echo $TERM is xterm-color
ssh from xterm on MacOS X
  • Works: CR, CSI_1, CSI_2, CSI_3
  • $echo $TERM is xterm
​

Wednesday, 20 May 2015

[Linux] tty, ttyS, ttyUSB, pty, console .... etc

Virtual Console (tty)

Linux console

Linux console aims for kernel or other processes
  • to output text-based messages to the user (display)
  • to receive text-based input from the user (keyboard)
Therefore, it is a combination of display and keyboard for user interface.
System console
System console is the device which receives all kernel messages and warnings and which allows logins in single user mode. (Reference: CONFIG_VT_CONSOLE)

Linux console devices

  • Virtual terminals
    • Usually have 6 virtual terminals and switch by Alt+F1, …, and Alt+F6 in text mode (Number 7 for X)
    • Or Ctrl+Alt+F1, …, and Ctrl+Alt+F6 in X window mode
    • /dev/tty0 or /dev/console: current console or system console
    • /dev/tty1, /dev/tty2, …
      • virtual consoles
  • Serial port (ttyS0, ttyS1…)
    • Embedded Linux
  • USB serial port (ttyUSB0, ttyUSB1, …)
    • such as USB Dongle 3G module
  • VGA in text-mode
  • Framebuffer (fb)
    • Embedded Linux (connect to LCD display)

Linux console_codes or escape code

console_codes(4) - Linux console escape and control sequences

Terminal Emulator

Terminal emulator is a program that emulates a video terminal within some other display architecture, such as
  • Konsole
  • gnome-terminal
  • tilda
  • xterm (X Window System)
  • iTerm (Mac OS X)

Pseudo devices

Pseudo devices are device nodes on Unix-like systems do not necessarily have to correspond to physical devices.

Examples

  • /dev/null
  • /dev/zero
  • /dev/full
  • /dev/random
  • /dev/pts/

Pseudo-terminals

Pseudo-terminals, or PTY, s a pair of pseudo-devices, one of which, the slave, emulates a real text terminal device, the other of which, the master, provides the means by which a terminal emulator process controls the slave.

Master and Slave

  • PTM (Pseudo-Terminal Master) & PTS (Pseudo-Terminal Slave)
  • Master is not a terminal and just a normal device for read/write.
  • Slave is a terminal.
    write → [Master] — [Slave] → read (stdin for process connected)
read ← [Master] — [Slave] ← write (stdin for master)
  • Write to master is treated as input to the foreground process that is connected to slave (like input from keyboard terminal)
    • Ctrl+C in terminal emulator will send a SIGINT signal to the foreground process that is connected to slave
  • Write to slave is treated as output to master

Other references

Device file

  • /dev/ptmx character file (major 5 & minor 2): used to create a pseudoterminal master and slave pair
  • /dev/pts/n pseudoterminal slave device

Common framework to use pseudo terminal

  • Open /dev/ptmx file
    • fd_ptm = posix_openpt(O_RDWR);
    • or fd_ptm = open("/dev/ptmx", O_RDWR);
      • By opening ptmx device, a fd is returned. Besides, a slave device, let’s say 4, is created under /dev/pts/4.
  • Grant access to the slave pseudoterminal
    • ret = grantpt(fd_ptm);
  • Unlock a pseudoterminal master/slave pair
    • ret = unlockpt(fd_ptm);
  • Open slave device
    • fd_pts = open(ptsname(fd_ptm), O_RDWR);
      • ptsname get the corresponding slave device name, such as /dev/pts/4.
  • Fork a child process
  • In parent process,
    • close fd_pts since it never uses it
    • use select to listen message from stdin or from master device (fd_ptm)
      • if it is from stdin, then write to master device (fd_ptm). Finally child process will get this message from its stdin.
      • if it is from fd_ptm, so it is also from child process (by write to fd_pts), so display it by writing to stdout
  • In child process,
    • close fd_ptm
    • close opened stdin, stdout and stderr because we need to redirect them to fd_pts
    • set terminal parameter of slave to RAW mode by tcsetattr
    • use dup(fd_pts); three times to duplicate 0, 1, and 2 fro fd_pts
    • then use execl-like functions to execute a command such as echo, bc.
    • so for command, its stdin, stdout and stderr are all redirected to fd_pts.

Examples

  • terminal emulator
  • script(1)
  • expect(1)
  • ssh(1), telnet(1), rlogin(1) etc
​

Tuesday, 19 May 2015

[Unix] a potential usage of script(1) command - test script for progress bar

script(1) command

script(1) command on Unix or Linux aims to make typescript of terminal session (Reference: Unix Help or man 1 script ). Its implementation is based on pseudoterminal. Here’s a diagram that shows how script is implemented.
For example, $script -c "echo helloworld" will run echo helloword to print helloword on terminal (stdout). In addition, it will produce a typescript file that is a copy of everything printed on terminal of the command. In this case, typescript likes below
    Script started on Tue 19 May 2015 10:34:26 BST
    helloworld

    Script done on Tue 19 May 2015 10:34:26 BST

one use case

Scenario

If we have a command that will show a progress bar (like scp) and we need to write a test case for this command to test if the progress bar works as expected, we can not easily capture its output by redirecting its stdout to a file because usually this command will check if the file descriptor for output is a terminal or not by isatty function.
if(isatty(fd))
{
// show a progress bar
}
With redirection like $cmd > file, stdout points to a file. Therefore, isatty function will return 0. Finally progress bar is hidden. That’s not what we expect.

Solution

script -c "cmd" | sed "s/\\r/\\n/g" > prog.txt
With script, the output of cmd is still a terminal (stdout) and so we can capture its output. Besides, through sed, we replace carriage return (\r) by line feed (\n), and then every print by cmd can be captured.
Now prog.txt will record the output of progress bar in this cmd command. That’s what we expected.
​