Hexa's Blog

Run gnome-terminal and open new program

14/10/2014 Linux

This is script which open a new gnome-terminal window and automatically run, execute program on this gnome-terminal.

gnome-terminal  -x zsh -c "echo hello;pwd;whoami;zsh"

The workflow of this script is:

1. Open new gnome-terminal
2. execute command `echo hello`
3. execute command `pwd`
4. execute command `whoami`
5. execute command `zsh`

!!!NOTE: THE END OF EXECUTE SENTENCE SHOULD END WITH zsh

Making new table on an exist database - Android

18/07/2014 Android

When working on my assignment in course named Mobile Application. I had a problem that my program has two tables, both of them belong to a single database.

In my program, I used SQLiteHelper, the program has two diffirential classes which handle database working process.

1. GroupDaoImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
public class TaskGroupImpl extends SQLiteOpenHelper implements TaskGroupDao{
    private static TaskGroupImpl instance = null;
    private Context context;
    private ArrayList<TaskGroup> groups;
    //DATABASE information
    private static final int DB_VERSION = 1;
    private static final String DB_NAME = "TaskManager";
    private static final String TABLE_NAME = "task_group";

    //TABLE information
    private static final String GROUP_ID = "ID";
    private static final String GROUP_NAME = "NAME";


    private TaskGroupImpl(Context context){
       super(context, DB_NAME, null, DB_VERSION);
       this.context = context;
    }
    public static TaskGroupImpl getInstance(Context context){
        Log.v("TaskGroupImpl: ", "getInstance() active");
        if (instance == null){
            instance = new TaskGroupImpl(context);
            instance.groups = new ArrayList<TaskGroup>();
        }
        return instance;
    }
    public ArrayList<TaskGroup> getAllGroups(){
        return groups;
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String create_db = "CREATE TABLE " + TABLE_NAME+ "("
                + GROUP_ID + " INTEGER PRIMARY KEY, "
                + GROUP_NAME + " TEXT"  + ")";
        sqLiteDatabase.execSQL(create_db);
        Log.v("TaskGroup: ", "Did make TaskGroup table");
    }
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXIST " + TABLE_NAME);
        onCreate(sqLiteDatabase);
    }

    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //super.onDowngrade(db, oldVersion, newVersion);
    }

    @Override
    public int createGroup(TaskGroup taskGroup) {
        try {
            int maxID;
            if(groups.isEmpty() == true){
                maxID = 0;
                taskGroup.setID(maxID);
            } else {
                maxID = groups.get(groups.size() - 1).getID() + 1;
                taskGroup.setID(maxID);
            }
            groups.add(taskGroup);
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues values= new ContentValues();
            values.put(GROUP_ID,taskGroup.getID());
            values.put(GROUP_NAME, taskGroup.getName());
            db.insert(TABLE_NAME, null, values);
            db.close();
            return 1;
        } catch (Exception ex){
            Log.v("TaskGroupImpl: ", "cannot create new group" );
            return 0;
        }
    }
    @Override
    public TaskGroup getTaskGroupById(int id) {
        for(int i = 0; i < groups.size(); i++){
            if (groups.get(id).getID() == id){
                return groups.get(id);
            }
        }
        return null;
    }
    @Override
    public int updateTaskGroup(TaskGroup taskGroup) {
        return 0;
    }
    @Override
    public int deleteTaskGroup(TaskGroup taskGroup) {
        try{

            SQLiteDatabase db = this.getWritableDatabase();
            db.delete(TABLE_NAME, GROUP_ID + " = ?", new String[] {String.valueOf(taskGroup.getID())});
            groups.remove(taskGroup);
            return 1;
        }
       catch (Exception ex){
           return 0;
       }
    }
    public void init(){
        groups.removeAll(groups);
        String query = "SELECT * FROM " + TABLE_NAME;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor  = db.rawQuery(query, null);

        if (cursor.moveToFirst()){
            do{
                TaskGroup group = new TaskGroup();
                group.setID(Integer.parseInt(cursor.getString(0)));
                group.setName(cursor.getString(1));
                groups.add(group);
            } while (cursor.moveToNext());
        }
    }
}

2. TaskDaoImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
public class TaskDaoImpl extends SQLiteOpenHelper implements TaskDao  {
    //singleton
    private static TaskDaoImpl instance = null;
    private Context context;

    private ArrayList<Task> tasks;
    private static final int DATABASE_VERSION = 1;
    private static final  String DATABASE_NAME = "TaskManager";
    private static final String TABLE_TASK = "task";


    //TABLE INFORMATION
    private static final String taskId = "ID";
    private static final String taskTitle= "TITLE";
    private static final String taskNote= "NOTE";
    private static final String taskDueDate = "DATE";
    private static final String taskPriorityLevel = "PRIORITY";
    private static final String taskCollaborators = "COLLABORATOR";
    private static final String taskStatus = "STATUS";
    private static final String taskGroupId = "GROUPID";
    private SQLiteDatabase mydatabase;



    private TaskDaoImpl(Context context){
        super(context,DATABASE_NAME, null,DATABASE_VERSION);
        this.context = context;
    }

    public static TaskDaoImpl getInstance(Context ctx){
        if(instance == null){
            instance = new TaskDaoImpl(ctx);
            instance.tasks = new ArrayList<Task>();
            instance.createTableIfNotExist();
            Log.v("TaskDaoImpl: ", "getInstance() active");

        }
        return instance;
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String create_db = "CREATE TABLE " + TABLE_TASK + "(" +
                taskId + " INTEGER PRIMARY KEY, "+
                taskTitle +" TEXT, "+
                taskNote + " TEXT, "+
                taskDueDate +" INTEGER, "+
                taskPriorityLevel +" INTEGER, "+
                taskCollaborators + " TEXT, "+
                taskStatus + " INTEGER, "+
                taskGroupId + " INTEGER"
                + ")";
        sqLiteDatabase.execSQL(create_db);
        Log.v("TaskDaoImpl", "Did create table " +TABLE_TASK);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {
        onCreate(sqLiteDatabase);
    }

    public void createTableIfNotExist(){
        mydatabase = this.getWritableDatabase();
        String create_db = "CREATE TABLE IF NOT EXISTS " + TABLE_TASK + "(" +
                taskId + " INTEGER PRIMARY KEY, "+
                taskTitle +" TEXT, "+
                taskNote + " TEXT, "+
                taskDueDate +" INTEGER, "+
                taskPriorityLevel +" INTEGER, "+
                taskCollaborators + " TEXT, "+
                taskStatus + " INTEGER, "+
                taskGroupId + " INTEGER"
                + ")";
        mydatabase.execSQL(create_db);
    }
    @Override
    public ArrayList<Task> getAllTasks() {
        return tasks;
    }

    @Override
    public int createTask(Task task) {
        int maxID;
        if(tasks.isEmpty() == true){
            maxID = 0;
        } else {
            int id = tasks.get(tasks.size()-1).getId();
            maxID = id+1;
        }
        task.setId(maxID);
        tasks.add(task);
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(taskId, task.getId());
        values.put(taskTitle, task.getTitle());
        values.put(taskNote, task.getNote());
        values.put(taskDueDate, task.getDueDate().getTime()/1000);
        values.put(taskPriorityLevel, task.getPriorityLevel());

        //collaborator from arraylist to String
        StringBuilder stringB = new StringBuilder();
        for (int i = 0; i < task.getCollaborator().size(); i++){
            stringB.append(task.getCollaborator().get(i));
            if (i < task.getCollaborator().size() -1){
                stringB.append(",");
            }
        }
        values.put(taskCollaborators, stringB.toString());
        values.put(taskStatus, task.isCompletionStatus());
        values.put(taskGroupId,task.getGroupID());

        db.insert(TABLE_TASK,null,values);
        db.close();
        return 1;
    }
    @Override
    public Task getTaskByID(int id) {
        for(int i = 0;i < tasks.size(); i++){
            if(tasks.get(i).getId() == id ){
                return tasks.get(i);
            }
        }
        return null;
    }
    public ArrayList<Task> getTaskByGroupID(int id){
        ArrayList<Task> filteredList = new ArrayList<Task>();
        for (int i = 0; i <tasks.size(); i++){
            if(tasks.get(i).getGroupID() == id){
                filteredList.add(tasks.get(i));
            }
        }
        return filteredList;
    }
    public void deleteTaskByGroupID(int groupID){
        for(int x = 0; x < tasks.size();x++){
            if(tasks.get(x).getGroupID() == groupID){
                deleteTask(tasks.get(x));
                x--;
            }
        }
    }
    @Override
    public int updateTask(Task task) {
        for (int i = 0; i< tasks.size();i++){
            if(tasks.get(i).getId() == task.getId()){
                tasks.get(i).setCollaborator(task.getCollaborator());
                tasks.get(i).setCompletionStatus(task.isCompletionStatus());
                tasks.get(i).setDueDate(task.getDueDate());
                tasks.get(i).setPriorityLevel(task.getPriorityLevel());
                tasks.get(i).setTitle(task.getTitle());
                tasks.get(i).setNote(task.getNote());
                return 1;
            }
        }
        return 0;
    }
    @Override
    public int deleteTask(Task task) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.beginTransaction();
        db.delete(TABLE_TASK, taskId + " = ?", new String[] {String.valueOf(task.getId())});
        db.setTransactionSuccessful();
        db.endTransaction();
        Log.v("TaskDaoImpl: ", task.getId() + "-"+task.getTitle());
        tasks.remove(task);
        db.close();

        return 0;
    }

    public void init(){
        tasks.removeAll(tasks);
        Log.v("TaskDaoImpl: " , "init method");
        SQLiteDatabase db = this.getReadableDatabase();
        String query = "SELECT  * FROM " + TABLE_TASK;
        Cursor cursor = db.rawQuery(query, null);
        if(cursor.moveToFirst()){
            do{
                Task task = new Task();
                task.setId(Integer.parseInt(cursor.getString(0)));
                task.setTitle(cursor.getString(1));
                task.setNote(cursor.getString(2));
                Date datetime = new Date(Long.parseLong(cursor.getString(3)) * 1000);
                Log.v("datetime ", datetime.toString());
                task.setDueDate(datetime);

                task.setPriorityLevel(Integer.parseInt(cursor.getString(4)));
                //get collaborators
                String collaboratorsS = cursor.getString(5);
                ArrayList<String> colaList = new ArrayList<String>(Arrays.asList(collaboratorsS.split(",")));
                task.setCollaborator(colaList);
                //get status
                if(Integer.parseInt(cursor.getString(6)) == 0){
                    task.setCompletionStatus(false);
                } else {
                    task.setCompletionStatus(true);
                }
                //set group id
                task.setGroupID(Integer.parseInt(cursor.getString(7)));
                task.print();
                //add to array list - lists
                tasks.add(task);
            } while(cursor.moveToNext());
        }
    }
}

#ISSULE AND PROBLEM In general, in order to use SQLiteHelper to make new table and database. function named onCreate(SQLiteDatabase db) will be invoked to do that. In my program, TaskGroupImpl instance is initialized before TaskDaoImpl, bug happend here, when I make a new instance of TaskDaoImpl - ofcourse after TaskGroupImpl, table named task would not be created or function named onCreate(SQLiteDatabase db) is not invoked.

#Solution

I make an extra function to make new table manually. This function named createTableIfNotExist(), it belong to TaskDaoImpl class - because it has a new table which I want to make but not create automatically by SQLiteHelper.

When make call a instance of TaskDaoImpl, I also check to make a new table name task. If it is exist, make no new table, if not, make a new table.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void createTableIfNotExist(){
        mydatabase = this.getWritableDatabase();
        String create_db = "CREATE TABLE IF NOT EXISTS " + TABLE_TASK + "(" +
                taskId + " INTEGER PRIMARY KEY, "+
                taskTitle +" TEXT, "+
                taskNote + " TEXT, "+
                taskDueDate +" INTEGER, "+
                taskPriorityLevel +" INTEGER, "+
                taskCollaborators + " TEXT, "+
                taskStatus + " INTEGER, "+
                taskGroupId + " INTEGER"
                + ")";
        mydatabase.execSQL(create_db);
    }

In the contructor, I call this function to make a new table.

1
2
3
4
5
6
7
8
9
10
ublic static TaskDaoImpl getInstance(Context ctx){
        if(instance == null){
            instance = new TaskDaoImpl(ctx);
            instance.tasks = new ArrayList<Task>();
            instance.createTableIfNotExist();
            Log.v("TaskDaoImpl: ", "getInstance() active");

        }
        return instance;
    }

How to compile executable jar file from source code

14/07/2014 etc

This thread will illustrate how to make a executable file.

#1.Create file “manifest.txt”

1
2
Main Class: package.to.my.ProgramLaucher
\n - 'this character will not be writen, I mean that you need to end with a new line'

for example, my class is:

1
2
3
4
5
6
package cosc2101.assignment1.controller;
public class ProgramLauncher {
    public static void main(String[] args) {
	     System.out.println("Hello World");
    }
}

then, my manifest file should be

1
2
Main Class: cosc2010.assignment1.controller.ProgramLaucher
next line here(compulsory)

#2. Making file .class This file is a compiled file of file.java. In order to make this file. Use the following command on the terminal.

javac .path/to/file.java

In this case, my output is a file named ProgramLaucher.class #3.Setting up folder for compile In order to compile java source code, you need to add file manifest.txt and compiled file file.class. For example in the case above, after make a new directory, our directory should be

------/
      manifest.txt
	  cosc2101/assignment1/controller/ProgrammerLaucher.class

#4. Make .jar file Within this directory

jar -cvfm ProgramLaucher.jar manifest.txt *.class

'c' refers to creating new archive file, in this case, it is
`ProgramLaucher.jar`
'v' refers to verbose, while processing, all relevant details will be report on
the terminal screen
'f' refers to specified file .jar will be created - creating option is assigned
by `c` but, what and where to create is assigned by `f`
'm' refers to manifest file

#5. Run file .jar Using the following command

java -jar ProgramLaucher.jar

Youtube video downloader for Conkeror

29/03/2014 Conkeror

I am now introducing a simple way to download video from Youtube by conkeror and an extra terminal program name cclive. This program take role to catch the link of youtube video and download it to assigned directory. In addition, you can choose type of video to download, of course, it also depends on the source.However, I am not going to further to that point.

What you need is: cclive, conkeror-spawn-helper Firstly, you need to install cclive. if you are using Fedora, you can install it by this simple command on the terminal.

sudo yum install cclive -y

Then, you open your conkeror file init.js, and append it with the following lines

//download video from youtube using cclive
interactive("download-video-2-music","Download current playing video.",
			function(I){
			  var path = I.buffer.current_uri.path;
			  path = path.substr(9,30);
   			  I.minibuffer.message("Downloading video to folder Music ");
			  shell_command_blind("cclive -d /home/nguyenvinhlinh/Music \"https://www.
			  							  youtube.com/watch?v=\""+ path);
			});

interactive("download-video-2-downloads","Download current playing video.",
			function(I){
			  var path = I.buffer.current_uri.path;
			  path = path.substr(9,30);
			  I.minibuffer.message("Downloading video to folder Downloads");
			  shell_command_blind("cclive -d /home/nguyenvinhlinh/Downloads \"https:
			  							  	 //www.youtube.com/watch?v=\""+ path);
			});

You can active these functions by M-x download-video-2-download, M-x download-video-2-music or assign these function to hot keys, for example:

define_key(default_global_keymap, "C-M", "download-video-2-music" );
define_key(default_global_keymap, "C-D", "download-video-2-downloads" );

Backspace issue with using google document by conkeror

23/03/2014 Conkeror

By default, conkeror users may not use backspace to delete previous characters when they do simple task in google document, perharp also for other google product. The solution is that you have to enable quote mode in conkeror

M-x quote-mode

Using command 'sudo' without password

18/03/2014 Linux

In the daily work, I may have to type sudo your_command and your password many times, it costs your time, in my case, it makes me feel crazy. The solution is that, you will add command which you mostly type into a list, then, when you want to type it with prefix sudo it wont ask you for password.

You have to modify file sudoers in /etc/sudoers. For example, you want to run command such as “yum”, “apachectl” without passwor

#1. Find the path of those commands by using command which in this case, those commands locates in /usr/sbin/apachectl and /usr/bin/yum.

#2. Modify file sudoers

username ALL=(ALL) NOPASSWD = /usr/sbin/apachectl, /usr/bin/yum

Now, you can run those command without password, REMEMBER, You still need prefix sudo

Command Alias, this feature will help you save your time if you want to assign group of command, for example, you have 2,3 user or group, it should be not convenient to type similar commands many times. Now, what you have to do is group them all, then use the command alias instead!

Cmmd_Alias CommandAliasName = /pathToCommand1, /pathToCommand2, /pathToCommand3
username1 ALL=(ALL) NOPASSWD = CommandAliasName
username2 ALL=(ALL) NOPASSWD = CommandAliasName

Ruby On Rails: Javascript did not active after follow a link

02/03/2014 Ruby on Rails 4

Description: After writing javascript code, There is an error, when users click on the hyperlink, javascript does not run. However, if users refresh the web page, javascript run automatically.My project using Jquery.

Instead of writing code like:

$(document).ready ->
  alert("page is load")

You should write:

$(document).on "page:change", ->
  alert "page has loaded!"

File Transfer, first child of my programming life

02/03/2014 Projects

I write this program to transfer files between Window and Linux computer.I knew that there are a software which already solved this issue. However,I believe that It could be an extra solution for you guy.

By using this software (required available LAN network), you can save time when transfer file to another computer.

1: Window vs Window, Microsoft support file sharing, It is absolutely good. However, setting FileTransfer as a plan B is a good practice

2: Window vs Linux, Linux vs Linux. Firstly, I write this software because I am a full-time Linux user. During using time you could face a case that you want to share file, it should be wasteful if you choose to upload your file to google drive, attached in gmail or any remote repository. Using this software saves your time and increases your performance.

Currently, this software allows users to sends file by once, if you want to send again, press send again after sending completely, or open two program. Anyway, I will enhance this feature soon, and it depend on the demand of users or only me. If you are interest in my FileTransfer, You can clone it with the branch “master” I also attach a jar file. FileTransfer.jar. It is an executable jar file.

Known issue: The speed of FileTransfer is low, approximately 0.5MB/s. The reason is that I did not cut file into multiple parts and transfer it concurently, this software send file in only one connection.

Link Download: https://github.com/nguyenvinhlinh/FileTransfer.git

Enjoy it.