Consciousness

Cellcraft: RTS for Cell Biology

Posted in Biology, Video Games by Personalife on the July 18th, 2010

I stumbled upon this game via Kotaku:

http://www.cellcraftgame.com

It’s a Real Time Strategy game where you start off as an empty cell, and you build components to basically survive through many challenges. I really love how it explains what each part of the cell does, and how it explores the micro- part of cell biology, as in the inner workings of each organelle and attempts to explain in clear detail the chemical processes for each without much confusion.

Japanese Translator is Back

Posted in Uncategorized by Personalife on the June 25th, 2010

I fixed it.

RSA Animate – What motivates us?

Posted in Uncategorized by Personalife on the May 28th, 2010

I’m proud of you, Adam

Posted in Friends by Personalife on the May 8th, 2010

I’ve known one of my close friends, Adam, since we were in high school together. Today, my friends and I went to see him perform at the San Jose State theater as he was a finalist in an oral interpretation contest.

He was doing his version of a segment from Dr. Horrible. He stumbled during his introduction, but his piece had flow. In my opinion, he was not the best of group, but what really mattered was that he was there, performing, in front of MANY people, and this was a feat that none of us would have ever imagined possible with him.

Adam has a history of social anxiety, due to how people treated him in his childhood. As a result, things like getting a job was impossible for him, or even being apart of a dorm room for more than one week. I’ve known him since high school to be this way.

As I saw him on that stage, smiling as Dr. Horrible, I realized that he’s up there probably because of the LARPing (Live Action Role Playing) he has done throughout his college years (along with other confidence builders), which has given him the courage to be in public and not be afraid to interact with people. Originally, I would laugh at the idea of LARPing, but I started to understand how it can be of help to those who have issues with communication and being around others.

For Adam, it’s brought him a long way – from the person I once known who couldn’t hold a job for more than one day to someone who exhibits more confidence in himself than probably most people I know.

Someone like him just proves that it’s possible to overcome fears with enough effort; next week he’s finally graduating college as well, has a job, and now he’s looking forward to the world out there.

Congrats Adam, and we’ll be with you completely every way.

How to compile nginx / fcgi / PHP from scratch in CentOS 5 the CORRECT way

Posted in php by Personalife on the April 25th, 2010

There was no single guide that provided this answer, so here’s my own after tinkering around for the entire day on CentOS 5.4.

When I installed CentOS, I did not install a desktop environment, and only added development libraries and tools.

Update your packages
Assuming this is a fresh CentOS install, you’ll want to update your packages:


yum update

Say ‘y’ to every question asked. The update process may take some time depending on the speed of your connection. After this is complete, proceed below:

Download Nginx source
http://wiki.nginx.org/NginxInstall

As of this writing, I downloaded the development 0.8.36 version.

Configre Nginx
Where I have extracted the Nginx source to, I used the compile-time option #3 found at:

http://wiki.nginx.org/NginxInstallOptions


./configure \
  --prefix=/usr \
  --conf-path=/etc/nginx/nginx.conf \
  --http-log-path=/var/log/nginx/access_log \
  --error-log-path=/var/log/nginx/error_log \
  --pid-path=/var/run/nginx.pid \
  --http-client-body-temp-path=/var/tmp/nginx/client \
  --http-proxy-temp-path=/var/tmp/nginx/proxy \
  --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
  --with-md5-asm --with-md5=/usr/include \
  --with-sha1-asm \
  --with-sha1=/usr/include \
  --with-http_realip_module \
  --with-http_ssl_module \
  --with-http_perl_module \
  --with-http_stub_status_module

Compile and Install Nginx
In the same directory, perform


make install

To install Nginx.

Create The Nginx Service File

edit /etc/init.d/nginx in your editor of choice and paste in the following:


#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /usr/local/nginx/logs/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac


Save the file.

Register the nginx service


chmod +x /etc/init.d/nginx
chkconfig nginx on

#This portion exists because nginx will not start without it
mkdir /var/tmp/nginx

http://www.hikaro.com/linux/centos/nginx-init-script.html is the original source with some modifications.

Download PHP and Install
http://www.php.net/downloads.php

Extract the source to a directory.

I have my PHP configured with the following options:


yum install libtool-ltdl-devel
yum install openssl-devel

./configure --with-zlib --with-bz2 --with-curl --with-curlwrappers --enable-exif --enable-ftp --with-gd --with-ldap --enable-mbstring --with-mcrypt --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --enable-soap --enable-sqlite-utf8 --enable-zip --with-openssl

Compile and Install PHP
In the same directory, perform


make install

Copy the php.ini file
Still in the PHP source directory.


cp php.ini-production /etc/php.ini

You should edit the php.ini to match your wanted PHP configuration.

Download Spawn-Fcgi and install
(http://elasticdog.com/2008/02/howto-install-wordpress-on-nginx/ was very useful for this portion)

Spawn-Fcgi comes from the lighttpd project. We are not installing the lighttpd server, but one of the components from the project.

Download spawn-fcgi from:
http://redmine.lighttpd.net/projects/spawn-fcgi/news

As of this writing, I downloaded version 1.6.3. Extract the source to a directory, and change to it.

Configure and install with


./configure
make install

spawn-fcgi should now be installed to /usr/local/bin.

Create the service file for PHP Fastcgi
edit /etc/init.d/fastcgi in the editor of your choice and paste in the following:


#!/bin/sh
#
# php-cgi - php-fastcgi swaping via  spawn-fcgi
#
# chkconfig:   - 85 15
# description:  Run php-cgi as app server
# processname: php-cgi
# config:      /etc/sysconfig/phpfastcgi (defaults RH style)
# pidfile:     /var/run/php_cgi.pid
# Note: See how to use this script :
# http://www.cyberciti.biz/faq/rhel-fedora-install-configure-nginx-php5/
# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

spawnfcgi="/usr/local/bin/spawn-fcgi"
php_cgi="/usr/local/bin/php-cgi"
prog=$(basename $php_cgi)
server_ip=127.0.0.1
server_port=9000

#####EDIT THIS TO MATCH YOUR USER AND GROUP
server_user=marketdark
server_group=marketdark
############################
server_childs=5
pidfile="/var/run/php_cgi.pid"

# do not edit, put changes in /etc/sysconfig/phpfastcgi
[ -f /etc/sysconfig/phpfastcgi ] && . /etc/sysconfig/phpfastcgi

start() {
    [ -x $php_cgi ] || exit 1
    [ -x $spawnfcgi ] || exit 2
    echo -n $"Starting $prog: "
    daemon $spawnfcgi -a ${server_ip} -p ${server_port} -u ${server_user} -g ${server_group} -P ${pidfile} -C ${server_childs} -- "${php_cgi} -c /etc/php.ini"
    retval=$?
    echo
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} $prog -QUIT
    retval=$?
    echo
    [ -f ${pidfile} ] && /bin/rm -f ${pidfile}
    return $retval
}

restart(){
        stop
        sleep 2
        start
}

rh_status(){
        status -p ${pidfile} $prog
}

case "$1" in
    start)
        start;;
    stop)
        stop;;
    restart)
        restart;;
    status)
        rh_status;;
    *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 3
esac

Save the file.

Register the fastcgi service


chmod +x /etc/init.d/fastcgi
chkconfig fastcgi on

Test:


[root@localhost init.d]# service fastcgi start
Starting php-cgi: spawn-fcgi: child spawned successfully: PID: 9146
Starting fastcgi:                                            [  OK  ]

Configure Nginx for FastCGI and PHP
Edit the file /etc/nginx/fastcgi_params

And make sure the file looks like this
(From http://nakedtrout.com/site-performance/nginx-php-fpm-apc-awesome-wordpress-performance/42063


fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param  REDIRECT_STATUS    200;

fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

Save the file.

Edit the file /etc/nginx/nginx.conf

My file looks like this:
(Source: http://interfacelab.com/nginx-php-fpm-apc-awesome/)



#CHANGE THIS TO THE USER TO RUN THE SERVER UNDER
user  marketdark;
#####################
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            #CHANGE THIS TO THE PATH TO YOUR WEB ROOT DIRECTORY
            root   /var/www/marketdark;

            index  index.html index.htm index.php;

            # if file exists return it right away
            if (-f $request_filename) {
                    break;
            }

            # otherwise rewrite the fucker
            if (!-e $request_filename) {
                    rewrite ^(.+)$ /index.php$1 last;
                    break;
            }

        }

        # if the request starts with our frontcontroller, pass it on to fastcgi
        location ~ ^/index.php
        {
                fastcgi_pass 127.0.0.1:9000;

                #CHANGE THIS TO THE PATH TO YOUR WEB ROOT DIRECTORY
                fastcgi_param SCRIPT_FILENAME /var/www/marketdark$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }

    }
}

Start nginx
Test:


[root@localhost init.d]# service nginx start
Starting nginx:                                            [  OK  ]

Test your install

Where you have defined your web directory path (where I have it noted #CHANGE THIS TO THE PATH TO YOUR WEB ROOT DIRECTORY) ,
create an index.php file with the following:


< ?php phpinfo(); ?>

Now, figure out the IP of your server and go to it in a browser (for example, since I have my centOS installed on hyper-v under a private NAT, it would be http://http://10.1.10.10/).

At this point you should see the PHP information page!

Stuck In Learning Sciences?

Posted in science by Personalife on the March 27th, 2010

http://www.khanacademy.org/

About:
http://www.khanacademy.org/press/chronicle.html

This is the one link you need. This man is spending his well-educated life teaching via YouTube, lots of Science and Math subjects. Lots of people have benefited from watching his videos… for free!

The man covers everything from your 1 + 1 to advanced calculus to physics, bio and chem.

I sound like an advertisement, but the guy is doing a great thing, and lots of people are benefiting and learning from it.

Oracle Drop and Recreate Existing Materialized View

Posted in Oracle by Personalife on the January 25th, 2010

Couldn’t find a script online that appropriately dropped and recreated an MV. We had an issue using impdp on 11g R1 where the MVs were imported under the right schema user, but for some reason, we couldn’t refresh the MV. The solution was to drop and recreate the MVs.


-- Drop and recreate MV for the current schema owner by Theo Chakkapark (http://suteki.nu)
DECLARE
	v_sql varchar2(32767);
 	TYPE mv_tables IS TABLE OF dba_mviews%rowtype INDEX BY PLS_INTEGER;

	mvrows mv_tables;
BEGIN

    	SELECT * BULK COLLECT INTO mvrows FROM user_mviews;

	IF(mvrows.count <> 0) THEN
	  FOR i IN mvrows.FIRST .. mvrows.LAST
	  LOOP
      v_sql := 'DROP MATERIALIZED VIEW ' || mvrows(i).owner || '.' || mvrows(i).mview_name;
      execute immediate (v_sql);
      dbms_output.put_line(v_sql);
      v_sql := 'CREATE MATERIALIZED VIEW ' || mvrows(i).owner || '.' || mvrows(i).mview_name || '
BUILD IMMEDIATE REFRESH COMPLETE AS ' || mvrows(i).query;
      execute immediate (v_sql);
      dbms_output.put_line(v_sql);
      END LOOP;
	END IF;

END;
/


LASIK and Haze / Foggy / Cloudy Vision

Posted in LASIK by Personalife on the August 27th, 2009

So yesterday, I woke up to a major shift in the vision in my left eye – things were REALLY hazy like as if it was when I just came out of the operation. I knew that post-op you’re to expect shift in vision quality, but this was a major negative shift. I had six hours of sleep, and I always put lube drops in my eyes prior to sleep. I called my doc to ask what’s going on, and she asked me what I was doing prior (sleep), and if I might have rubbed my eyes (only thing I can think of is I sometimes sleep face down on the pillow, which puts pressure on the eye).

Anyways, she thinks it was just major dry eyes, and told me to put drops in my eyes every 30 mins (I usually do every 2-3 hours), and told me that as long as I’m not feeling any pain (I was not), I should be fine. She also scheduled an appointment to see her today if it was necessary.

Gradually through yesterday, my sight improved again, and this morning, it’s back to normal.

I made this post as a general FYI to those who experience this to not freak out completely. If it persists for more than one day, then see a doctor.

But man, that was sorta scary.

How To Implement and Set Up DomainKeys Identified Mail (DKIM) on hMail Server

Posted in email by Personalife on the August 20th, 2009

We recently moved from using Magic Winmail as our mail server to hMailServer since it was more cost effective (as in free) and had more features. One of these features is DKIM, or DomainKeys Identified Mail, which if enabled, would improve deliverability of our e-mails. Here’s how I set mine up:

1. Generate the public and private keys. You need OpenSSL to do this.

> openssl genrsa -out private.key 1024
> openssl rsa -in private.key -pubout -out public.key

2. Enter the corresponding TXT records into your DNS for your domain. For example, my domain is journal.suteki.nu. I would do the following in my DNS:

_domainkey.journal.suteki.nu  IN TXT  t=y; o=-;
_adsp._domainkey.journal.suteki.nu  IN TXT dkim=all
[selector]._domainkey.journal.suteki.nu  IN TXT  g=*; k=rsa; p=[public_key]

Where [selector] is the name of your selector (eg ‘mail’), and [public_key] is your key from your public.key file generated from #1. Just make up something for [selector] and keep note of it.

An example would be

_domainkey.journal.suteki.nu  IN TXT  t=y; o=-;
_adsp._domainkey.journal.suteki.nu  IN TXT dkim=all
mail._domainkey.journal.suteki.nu  IN TXT  g=*; k=rsa; p=bNJOPhYuAAxTdO0PNGiKSL9rLLdDBuj3q0Rpa3pg2r/oNTONqGSIb3DQ8mz16NbSSSs5YcBkKTRDunxOFP0UtEmZJMQk0yERL1jEg86l8ZDmOckldH5EWIhsnbDjGh1fxT5ku7cXjtKwIDAQABMIGfMA0GCSqADCBaku0mO6bbcm/mEfnBKov3otig6iPXiQKBgQDxdpMEBAQUAA4GNEdKCn

(
Note: That’s a made up public key :P
Notex2: The t=y is a testing flag. You will want to remove this once you’ve verified your keys work.
Notex3: It will take up to one day for your DNS records to propagate. Do not be frustrated if the tests come up negative within the first 10 minutes of filling in the records!
)

3. Set up DKIM in hMailServer for a domain.

Open up your hMailServer administrator and go to the domain you want to enable DKIM in. For the private key file, select the private.key you generated from #1. In selector, type in the [selector] you selected.

For signing algorithm, choose either SHA1 or SHA256. I went with SHA1 so our server resources do not get consumed as much when signing the e-mails. The config should look something like this:

DKIM configuration

Save the config. Your domain is now set up for DKIM.

4. Send a test e-mail from one of your accounts in the domain.

I sent a test-email from an account I created, test@journal.suteki.nu, to one of my accounts on gmail. When it arrived in gmail, I checked the headers:

Show headers

What you want to check for is the dkim-signature block in the headers:

A successful one looks like this:

Authentication-Results: mx.google.com; dkim=pass header.i=@journal.suteki.nu
dkim-signature: v=1; a=rsa-sha1; d=journal.suteki.nu; s=mail;
	c=relaxed/relaxed; q=dns/txt; h=From:Subject:Date:Message-ID:To:MIME-Version:Content-Type:Content-Transfer-Encoding;
	bh=/edzoYuyn17WXm8KeqcX/R+khdQ=;	b=0cnc21MgZMy9suqAgFPlA5OqD5fpFmuGoK+UYlf9zvqPwRgRgjb6OP+VwjwYE2AVxhdVRdX8nEdQ0XnUht45SQHKh78dCXK+UiS7x6qE2haLrZi7CHvs6qp8otQdkcLBrYF0Z95Blp1Vh9BHvQFodNdwJUhgp9u/BoZH/Gq8xx0=

While an unsuccessful one might (might as in I haven’t determined if this is considered invalid, but this is what it first looked like for me) look like:

Authentication-Results: mx.google.com; dkim=neutral (no key) header.i=@journal.suteki.nu
dkim-signature: v=1; a=rsa-sha1; d=journal.suteki.nu; s=mail;
	c=relaxed/relaxed; q=dns/txt; h=From:Subject:Date:Message-ID:To:MIME-Version:Content-Type:Content-Transfer-Encoding;
	bh=/edzoYuyn17WXm8KeqcX/R+khdQ=;	b=h9BHvQFodNdw0cnc21MgZMy9suqAgFPlA5OqD5fpFmuGoK+UYlf9zvqPwRgRgjb6OP+VwjwYE2AVxhdVRdX8nEdQ0XnUht45SQHKh78dCXK+UiSp8otQdkcLBrYF0Z95Blp1V7x6qE2haLrZi7CHvs6qJUhgp9u/BoZH/Gq8xx0=

Hope that helps! See the links below for more information and a way to test and fine-tune your configuration.

Links:
Domainkeys for Postfix – Started with this guide
DKIM flags – understand what the flags are that we used above.
DKIM generator – Generates your private/public key and gives you the DNS info necessary to make DKIM work! You can skip Step #1 with this.
DKIM Tools – Verify your DNS DKIM records.
Author Domain Signing Practices (ADSP) – Understand what the _adsp record is for.

Native Compile for PL/SQL on Windows Oracle 10g R2 x64

Posted in Oracle by Personalife on the August 14th, 2009

I couldn’t find any definitive guides on how to compile PL/SQL natively on Windows, so after reading lots of documentation, I finally managed to figure it out. You will need the following:

- Visual Studio .NET 2003. .NET 2005 does not work (at least from what I’ve read), and if you use the x64 version of Oracle, MinGW will not work either. It’s gotta be Visual Studio .NET 2003 with the C++ component installed (ALL components, including the unchecked win platform one)
- Microsoft SDK for Windows. Our boxes are Windows Server 2003 R2, so I downloaded the corresponding SDK for it.

- Important: Make sure when you install the Microsoft SDK, you install it into a directory called ‘C:\Program Files\Microsoft Platform SDK’. The default will be something like ‘C:\Program Files\Microsoft Platform SDK for Windows Sever 2003 R2′; you do not want this! Oracle will look specifically for the directory named ‘C:\Program Files\Microsoft Platform SDK’.

- Important: Make sure you have enough RAM to increase your SGA and PGA memory size. I’ve had cases where I’ve used native compilation only to find that the native version runs slower than the interpreted complation! Or worse, your programs will just crash.

Install both, and open up a sqlplus session (probably under the ’system’ user), and run the following:


   alter system set plsql_native_library_dir='C:\oracle\db10g\native' scope=both;
   alter system set plsql_native_library_subdir_count=5 scope=both;
   alter system set plsql_code_type='NATIVE';

- plsql_native_library_dir should be pointing to a directory you specify. I created a ‘native’ directory in my Oracle installation and pointed it there. All the compiled PL/SQL will go into that directory.
- plsql_native_library_subdir_count determines how many directories to use when generating the compiled objects. The reason why this exists is if you have a large amount of procedures / packages to be compiled (large as in > 10,000), there will be I/O issues if you store all the compiled items in one directory. If you specify the count to be more than one, then each compiled item will be put in a subdirectory, round-robin style.
- Since plsql_native_library_subdir_count=5 in the example above, you need to manually create 5 directories in the ‘native’ directory created, called dn (where n is a number starting with 0 to subdir_count) ie:

C:\Oracle\db10g\native\d0
C:\Oracle\db10g\native\d1

C:\Oracle\db10g\native\d4

At this point, try compiling your PL/SQL packages or procedures. You can check your subdirectories to see that things are being compiled.

Congrats! You should now have a (slightly) speedier Oracle system. Unfortunately, there are no speed improvements using native compilation for SQL statements. Instead, you need to do your standard optimization techniques for your schemas, such as creating proper indexes, partitions, etc. If you use heavy algorithms PL/SQL, native compilation will benefit this most.

And, if in the event you want to switch out of native compilation, use the following:

ALTER SYSTEM SET plsql_compiler_flags = 'INTERPRETED';
ALTER SYSTEM set plsql_code_type='INTERPRETED';

For more information, see the Oracle PL/SQL NComp document.

Next Page »

Powered by WordPress .::. Designed by SiteGround Web Hosting