Monday 9 February 2015

Website Tutorial 2

For those of you that are following my web development series, you can download the latest tutorial here :
Website Tutorial 2 - HTML 5

Additionally here is a link to  Notepad++ !

Friday 23 January 2015

Android Application Development

I've just been digging around in some of my old projects and found my Hours Manager application.
The purpose of the application is to provide me with a way of logging the hours that I do, given that my schedule is so busy, trying to remember when I did what can often be challenging. Unfortunately  it never saw the light of day again due to my hectic schedule.

Given that again I am in a situation where having a log of my work schedule would be beneficial, of course you may be wondering, why don't I just download one of the many good time management apps for the play store? The answer for me is simple, what would I learn from that?
Programming in Java is something new for me and I have various other android app's that i have developed in the past although none of which have ever been polished enough to publish. Therefore I'm making a real effort to get this app on the market, not for profit just for the whole experience of releasing an application.

The challenge I have overcome today was adding the functionality to allow users to delete entries from the sql database.  To do so I wanted a dialog window to pop up when the user long pressed one of the entries in the list view.

The code that follows simply creates a new Alert Dialog window from within the SQL View fragment, from there two buttons are initialized (one to confirm and one to cancel). The database is also queried to ensure that the correct item is successfully removed, then the array adapter is notified that the data has changed. From there the list view adapter is updated with a new incarnation of the database.

Hopefully this snippet help's someone else who's struggling with creating a Alert Dialog within a Fragment. 

 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
    protected void removeRow(final long _position)
    {
        // Create a new Alert Dialog, with the fragment activity context
        AlertDialog.Builder alert = new AlertDialog.Builder(
              getActivity()
        );
        // Here we set the dialog title to that of a static string ("Delete Record?")
        alert.setTitle(R.string.dialog_title);

        // Now we open the database and query it for the current entry string - Date , Start Time, End Time etc
        openDatabase();
        alert.setMessage("Are you sure you want to remove the following entry?\n" + info.getRowInfo(_position));
        closeDatabase();

        // When the confirm button is pressed
        alert.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                // Open the database again
                openDatabase();
                // Delete the entry at a specific position
                info.deleteRow(_position);
                // Tell the adapter things have changed
                adapter.notifyDataSetChanged();
                adapter.notifyDataSetInvalidated();

                // Re-populate our information in the List Adapter
                populateList();
                lv.setAdapter(adapter);

            }
        });
        // If the cancel button is pressed simply dismiss
        alert.setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
            }
        });
        // Ensure our database is closed
        closeDatabase();
        // Finally show the alert dialog
        alert.show();
    }
Alert Dialog displaying record information



Monday 1 December 2014

Gender Diversity in the Games Industry

Gender diversity in the video games industry is currently a hot topic at the moment in the light of the gamer gate controversy.

For my Individual Study module I have looked into what the problems are surrounding the topic which you can view here.


I hope someone might find this work useful !


Saturday 19 July 2014

Real Time Rendering Assignment

Real Time Rendering Techniques

Modeling the castle

First and foremost to begin the project a suitable scene was designed using Auto Cad and modeled using the 3DS Max software package. When modeling any scene it is essential that everything is to scale and each element is proportional to another. This was the reasoning behind using Auto Cad to model the scene as it an architectural program by which designs can be made to scale.  This model provided the plans which were then used to model the scene in 3DS Max. In order to do this two sets of drawings were made, the first was a top down Birdseye view of the model, secondly an elevation plan which described the structures height.

Matsumoto Castle


Many of the castles that were researched whilst planning the project were considered however most castles all look rather bleak, old and diminished. Therefore it was decided that rather than your traditional European castle, a castle from Japan named Matsumoto was planned.

A vast period of time was then spend modeling the castle in 3ds max, as a highly detailed and accurate model of the castle was developed. Once the model was completed, another extended period of time was spend creating the texture maps for the model.  One cravat to creating the model was discovered  when a first attempt to load the model into direct X is that as the model had multiple hi-resolution textures the 3DS loading module unfortunately did not support the material mapping functionality that was implemented in 3DS MAX. There were two ways around this problem.

 Firstly, each individual component of the castle could be separated, a new texture map could be generated and loaded in as separate objects into DirectX. The other method would be to write a new 3DS object loader that fully supported material mapping functionality. Due to time constraints, rather than re-inventing the wheel, the objects of the castle were separated into individual components and loaded into DirectX. One problem that occurred at the beginning was due to the highly detailed models, the application took around 30 – 60 seconds to load in all of the meshes.  Therefore in order to address this issue, many of the complex and highly detailed mesh data was excluded and the model was compressed into around 222,000 vertices.
In order to texture the model each mesh was un-wrapped and a texture was individually hand made for each one which was a time consuming process. Bump and normal maps were applied to the Rocky and wooden features of the model to provide additional detail.  All of the textures were then pre-baked to include bump mapping and lighting calculations. This again took a very long time to process.











Wednesday 7 May 2014

Matsumoto Castle

For my final year real time rendering project, I decided to undertake the modeling of the Japanese Matsumoto castle. Most of the modeling was undertaken using 3DS Max of which took around two weeks to model, it was no easy task, given that I am by no means an artist ! This project took a considerable amount of time due to the complexity of the mostly hidden detail that this castle features. Here is a quick example video that took 3 days to render ! After my exams I'll do a better video of the model & have a play around with the lighting, additionally  I will explain some of the difficulties regarding exporting and loading this model into a DirectX program.

Friday 2 May 2014

Just handed in my last piece of coursework for my third year in University, what a momentous occasion! 
Update to follow detailing what I've been up to in my last term here in The University of South Wales. 
Now all I have left to do is complete exams in Concurrent & Parallel Programming and Artificial Intelligence then the fun beings ! 

The plan for the summer is to develop my skills in these areas : 


  • C# programming 
  • Direct X 11 Learn in depth 
  • Open GL  revising terrain project 
  • Complete a few unfinished android applications 


  • Build a render farm 
  • Re- learn some fundamental programming concepts which I have struggled with this year
  • Learn the basics of Windows Power shell & LUA 
  • Make some 3DS Max models  & possibly my own file format for use in my graphical applications  
It's certainly going to be a busy couple of months ! 


Saturday 15 February 2014

Mounting File Share from Terminal

After three days of hacking together mount commands finally my NAS is connected so that it can be accessed from terminal. 

The script's purpose is to mount a networked attached file store using terminal with the correct read and write attributes. 

1:  ################################################################  
2:  #     Author       :   Robert Lutken                       
3:  #     E-mail  :      rolandroid117@gmail.com                 
4:  #     Date   :      Sat, 15-02-2014                      
5:  #     File Name :     nasmount.sh                      
6:  #     Purpose  :      To connect to NAS                 
7:  #     Version      :      1.0                           
8:  #     Notes   :     Unsecure version should not be used in       
9:  #               volitile domains                 
10:  #                                          
11:  #################################################################  
12:    
13:  #!/bin/bash  
14:    
15:  ## The user name of the account on remote device i.e. admin   
16:  username=yourusername  
17:    
18:  ## The Password of the user's account on remote device  
19:  password=yourpasword  
20:    
21:    
22:  ## The source location of the server and the share directory.  
23:  ## In order to mount you should ensure that /etc/nsswitch.conf apears as so:  
24:  ## hosts:     files mdns4_minimal wins [NOTFOUND=return] dns mdns4   
25:  ## The order is important !   
26:  ## and that winsbind is installed -> sudo apt-get install winbind  
27:  ##  
28:  ## If it isn't then you may use the IP address of the local server  
29:    
30:  mountSRC=//nameofserver/sharedirectory  
31:    
32:  ## The local directory of where the shared folder should be mounted i.e. /mnt/myshare.   
33:  ## This will need to be created i.e. sudo mkdir /mnt/myshare  
34:  mountDST=/wheretomount/share  
35:    
36:  ## Finally the command that put's it all together with relvent read and write permissions.  
37:  sudo mount -t cifs $mountSRC $mountDST -o username=$username,password=$password,iocharset=utf8,file_mode=0777,dir_mode=0777  
38:    
39:    

There is however an inherent security issue with this script as it stores passwords in plain text. 

I would recommend that the use of a credentials file is used : 


sudo nano $HOME/Desktop/CIFSCRED  
All this file should contain is : 

 username=yourusername  
 password=yourpassword  
 domain=servername  
   
Press CTRL+X and enter Y and Return to save 

The file should then be restricted by using :

sudo chmod 0440 $HOME/Desktop/CIFSPWD  

Finally the original script can be updated to

1:  ################################################################  
2:  #     Author       :   Robert Lutken                       
3:  #     E-mail  :      rolandroid117@gmail.com                 
4:  #     Date   :      Sat, 15-02-2014                      
5:  #     File Name :     nasmount.sh                      
6:  #     Purpose  :      To connect to NAS                 
7:  #     Version      :      1.                           
8:  #     Notes   :     This version uses a credentials file  
9:  #               which should be secured using :  
10:  #  
11:  #               sudo chmod 0440 myPasswordFile                           
12:  #                                          
13:  #################################################################  
14:    
15:  #!/bin/bash   
16:    
17:  myCredentials=$HOME/Desktop/CIFSPWD  
18:    
19:  ## The source location of the server and the share directory.  
20:  ## In order to mount you should ensure that /etc/nsswitch.conf apears as so:  
21:  ## hosts:     files mdns4_minimal wins [NOTFOUND=return] dns mdns4   
22:  ## The order is important !   
23:  ## and that winsbind is installed -> sudo apt-get install winbind  
24:  ##  
25:  ## If it isn't then you may use the IP address of the local server  
26:    
27:  mountSRC=//nameofserver/sharedirectory  
28:    
29:  ## The local directory of where the shared folder should be mounted i.e. /mnt/myshare.   
30:  ## This will need to be created i.e. sudo mkdir /mnt/myshare  
31:  mountDST=/wheretomount/share  
32:    
33:  ## Finally the command that put's it all together with relvent read and write permissions.  
34:  sudo mount -t cifs $mountSRC $mountDST -o credentials=$myCredentials,iocharset=utf8,file_mode=0777,dir_mode=0777  
35: