Hack of the Week

November 5th, 2008

Overview:

Set up a proxy server with SSH in order to bypass network throttling, and content filtering.

Here is what I did:

Follow this page to installing squid on Linux and get a basic understanding of how a proxy server works:

http://www.ubuntugeek.com/how-to-setup-transparent-squid-proxy-server-in-ubuntu.html

Then connect using putty but first add some ports.  Follow this page in order to get a basic understanding of putty and tunneling:

http://kimmo.suominen.com/docs/proxy-through-ssh/

The important thing to note is they probably have port 3128 and 8080 throttled, since that is used for proxy.  So I just changed my Source Port to 1337, and my destination is localhost:3128. This means that on my local computer 1337 will end up on the remote computer as localhost 1337.

Finally I changed my settings in Firefox to use the proxy by going to Tools->Options->Advanced->Connection Settings…  The HTTP proxy is localhost port 1337.  This will allow us to bypass any network throttling.  Of course there will be a performance loss because of the encryption, but it is probably still faster.  It will also allow us to get around stuff like WebSense and censorship.

Enjoy!

Operating System Independence

October 30th, 2008

Operating system independence means not relying on a specific operating system to be productive and accomplish tasks quickly and efficiently.  Everyone has a preferred operating system, and for a lot of us we stick to that operating system.  However, when we are forced to use a different system like in the work place versus in our home, we feel like we lose a lot of control and compatibility.  I am here to tell you; that is untrue.  We can remain productive power users completely independent of our environment.  Here I would like to discuss some software alternatives for different operating systems to meet some common needs.

Here are a few scenarios to keep in mind:

Dual Booting is the process of installing multiple operating systems on a single computer set up.  This can be accomplished by using a file system that is compatible with both operating systems, or using completely separate partitions, an advanced boot-loader is needed to allow the user to choose at startup which operating system to boot into.  In this scenario, the operating system runs on the native hardware, and only 1 operating system can be run at a time.

Virtualization is making a computer emulate multiple computers.  This works by having a main computer run virtualization software on the native hardware, we will call this our host.  The host can now emulate the architecture of another computer by processing CPU and hardware device logic in software form instead of actual hardware.  We will call these computers our clients.  A virtualization solution can emulate multiple computers at the same time, meaning we can boot and run multiple operating systems in parallel.

VMWare on OS X

Now let’s talk about some of the differences between operating systems.

Graphical User Interfaces:

The most obvious difference between operating systems is the graphical user interface or GUI for short.  This is how an operating system looks, for example the start menu and desktop on Windows, or the Dock and Finder on a Mac.  One of the hardest things for people to learn is how to use a different environment when it looks and acts completely different.  But underneath it all, the environments are not very different at all.  This is evident by the fact that they all have to run on the same type of CPU and hardware.

There is software available that has the capability to drastically change the way Windows looks.  We can make Windows look and act just like a Mac.  Stardock and TweakUI are examples of this.  They can apply user made themes to Windows.  Some of these themes are vastly different from how Windows looks by default.  Stardock has some more in depth features that includes a Dock that looks and acts like the one available in OS X.  On Linux, a lot of theme functionality can be accessed using Emerald and Compiz/Fusion formerly Barrel.

Compiz/Fusion

A lot of functionality comes from the Dash Board available in OS X.  Other operating systems like Windows and Linux can tap into this functionality as well through Google Desktop.  Google Desktop enables functionality such as Quick Searches and system information right at your fingertips.

Google Desktop

If you are a Mac or Linux user, you are probably familiar with the command line.  This functionality can now be achieved on Windows.  Microsoft Power Shell is software similar to the command prompt that exist on Windows by default, but is gives the user a lot more control, and it acts similar to Linux command line shells.  If you are looking for a more in depth solutions, CygWin is for you.  CygWin is a Windows port of a lot of UNIX functionality; maintained now by Red Hat and NetApp.

Cross Platform and Cloud Computing:

Software compatibility is, in many cases, a determining factor of what operating system to use.  For example, not all systems are compatible with the advanced features of Microsoft Exchange.  For accessing the Exchange online, browsers other than Internet Explorer have limited functionality; this could pose problems for Linux and Mac users.  Contrary to that, some software is fully featured and available for both Windows and OS X.  For example, Adobe Creative Suite has always been available for both operating systems.

This still leaves a market, though rather small, in the dark.  Linux desktop users are many times left out of the software circle and forced to fend for themselves.  Luckily, there are Open Source community maintained software suites that can be compiled for any system.  Open Office is a good example of this.  Open Office supports many of the features that Microsoft Office does, but without the dependence on Windows.

Open Office Impress

Sometimes we wish to erase the line between software and the system it depends on.  This can be done with cloud computing.  Cloud computing is a term used to describe a solution that exists over the internet.  These solutions hide the complexity of the infrastructure that supports them.  Google Apps is a great example of cloud computing.  It is in itself an operating system, which can be accessed and run by a web-browser.   Development for the Google Apps platform is also made easier by cloud computing by abstracting the complex infrastructure into easy-to-use APIs.

Remember our second scenario, Virtualization?  There is a solution to becoming operating system independent that uses a similar idea called Web Desktop.  Web Desktop is a method of accessing fully functional desktop environments, provided by any operating system, over the internet or local network.  This relates to Virtualization by a single system used to serve out any number of desktops and environments to its clients.  Many times, Web desktops are actually handled by virtual servers that can allow many connections to the same operating system but in a completely isolated user space.

Development and Getting Things Done:

Development solutions are an essential part to a Computer Scientist’s productivity.  These solutions even have their own name/acronym, Integrated Development Environment or IDE.  Now when it comes to cloud computing Integrated doesn’t sound like a friendly term; cloud computing tries to accomplish all the functionality without the need to be integrated with anything.  Therefore, we as developers are still stuck using an operating system of a specific flavor.  Fortunately, there are IDEs for every environment.  Eclipse and NetBeans are cross platform IDEs built on the Java technology.  Which IDE works best for you, is mostly personal preference since they all support plug-ins and extensions for expanding their functionality.

If you are more of a text-based developer, TextMate is an excellent solution.  Unfortunately, it is only available for Mac.  However, E Text Editor is provided by a completely different company and is available for Windows.  It even supports the exact same bundle files as TextMate.

Now for the hard part: What about Linux?  Adobe Creative Suite isn’t supported on Linux, neither is Visual Studio or TextMate.  This means I can’t develop in anything .Net, and I can’t use Adobe’s unique suite of web-development tools like Dreamweaver.  The only thing left to use is VIM.

Fortunately, for Linux users, there is an entire community of people with this exact same problem.  In addition, they can all pool together to make lots of open source software that can be accessed for free with a handy package manager.  Nevertheless, it is Linux, and there is always a hard, longer path to take.  Wine is an implementation of the Windows API for X, OpenGL, and UNIX.  Wine can help us accomplish the overly difficult and tedious task of installing and running some Windows software on *nix.  There is a lot of information available on getting Creative Suite to run on Linux, you just have to search for it.

Wine Running Photoshop

Our solution to developing .Net software on Linux is Mono.  Mono is a cross platform, open source .Net development framework.  It includes things like running ASP.Net on apache using the mod_mono module.  They even offer and IDE for developing in .Net called MonoDevelop.

Getting Things Done or GTD, is a popular method used to manage one’s time and resources to accomplish everyday tasks more efficiently.  Managing tasks can be complicated but there is a lot of software available to help.  On Windows, I have always been a fan of using the Microsoft Office Suite for task management.  OneNote is handy software for taking notes in meetings or class.  However, it can also be used for making lists of things I have to do, and organizing many list items by date or location that I have to accomplish them.  OneNote can synchronize with other devices like a laptop or even my phone.  It also connects to Outlook for creating appointments and sending e-mails.

OmniFocus is popular GTD software for Mac.  In addition Linux just takes a simple Google search to find open source software that will work just as well.  You could even go a step further and implement your own cloud computing solution and use gtd-php, a web based PHP solution for Getting Things Done!

Finally, one of the most important topics to becoming independent of operating systems is being able to play video games!  Games are becoming more and more compatible with Windows AND Mac OS X.  However, Linux users are once again left to fend for themselves.  MAME is a cross platform arcade emulator.  It can also emulate things like DOS for running older games.  For newer games however, Cedega is a company dedicated to making games compatible with Linux.  Cedega by TransGaming works closely with the Wine project, modifying some of Wine’s shortcomings in order to be compatible with newer games.  They provide a full list of supported games and can guarantee they will work on your Linux system.

MAME

Conclusion:

I hope I have convinced you that there are plenty of solutions for every use and operating system.  We don’t have to be victim to operating system wars and, with a little effort, can always find alternative solutions to meet our needs.

Here are some links to get you started on being independent of your OS:

VMWare

Make your Windows desktop look like OS X

Stardock

Compiz/Fusion

Google Desktop

Cygwin

Open Office

Sun Global Desktop

Eclipse

NetBeans

TextMate

E Text Editor

Wine

Running CS3 in Wine

Mono

OmniFocus

gtd-php

Using OneNote for GTD - via LifeHacker.com

Cedega

MAME

Making a Batman Costume: Preface

October 25th, 2008

I decided to blog about this subject because all of my friends are tired of me talking about it.  Fortunately they also don’t read my blog.

Background:

I decided I wanted to do this project ever since The Dark Knight came out in theaters.  I have become an even bigger fan of Batman since Christopher Nolan started directing for the franchise.  Tim Burton did a great job for the time, but compared to the new movies (Batman Begins, and The Dark Knight) he never took it seriously enough.  I attended DefCon last August, where there was a female dressed in a ninja costume.  They generally have a Black and White party, and my eagerness to create a Batman costume grew.

The Plan:

I have thought a lot about what materials to use for such a costume.  I have considered aluminum plating for the armor pieces, I have researched metallic mesh for the under-armor, and I have made many trips to arts and crafts stores and hardware stores looking for materials.  I came across a close up shot of the costume on the front of a magazine, I decided to read the text on the side, what just happened to be an interview, they asked what materials were used.  I discovered the armor plates are rubber, lots of rubber.  I decided this was the best solution; I would first form all the pieces out of clay, then invert the mold using plaster, and finally pour different strengths of rubber for different sections.  I had finally found a solution that was feasible.

I plan on spreading this project out over a year.  I will be working on the castings for each piece as shown in the scene with Fox presenting the new suit to Bruce.  I would like for some parts to be removable so that the under-armor it attaches to can be washed.

Here is one of the best pictures I have seen of the costume:

dark_knight.jpg

Certain parts like the bands that hold on the gauntlets and arms pads will be a stretchy type of rubber which I plan to attach little metal hooks to, and the actual armor parts like the shoulders will be a much harder rubber.  I anticipate the hardest parts to create will be the pants, the utility belt, and the chest plates.

the-dark-knight-got-milk.jpg

thedarkknight1.jpg

batbelt.jpg

Computer Coffee Table

October 23rd, 2008

For the last few weeks I have been working on a project of a different kind.  I decided to build a coffee table to house my media server.  As you can see from the photos, it has come along nicely.  It is complete with sound activated cathodes, and a monitor sitting under the glass top.  The project cost me around $300 when I had initially planned on only spending about $100.  I still think it was worth it.

dsc03122.JPG

The table is 4 feet by 2 feet, about 18 inches tall, and has 3/8 inch tempered glass.  The computer components are pretty standard.  I use a long DVI cable and convert it to HDMI to go in to my receiver.  The audio output is digital over coaxial, coming from an Audigy 3.  A wireless Logitech mouse and keyboard is useful for typing and browsing from the couch.  It also has sound activated cold cathodes that look really cool when playing music with lots of sub.

dsc03121.JPG

I think it turned out pretty well…

Setting Up a DNS Server

October 23rd, 2008

Background:

Before last night I had never used a DNS server.  I lacked any understanding of how the registry and ROOT servers worked, and I definitely didn’t know how to configure the domains on my end.  The reason I wanted to set up a DNS server is so that I didn’t have to rely on another company for domain forwarding or sub-domain set up.

Terminology:

Let’s get some terminology out of the way first, just so that when I toss around words below, it can be better understood by everyone.
The Registry: An international database of all the textual domain names registered on the internet.
TLD: Top-level-domain: is the last part of an internet address, for example .com or .net.
Root-Server:
A DNS server that redirects requests to the appropriate TLD server.
Domain Name: A text representation of an address on the internet.  For example bjcullinan.com is a domain name.
DNS: Domain Name System is a hierarchical naming system for computers, services, or any resource participating in the Internet.
DNS-Server: or Name Server is a server that provides access to the DNS system, it accepts requests for a domain, then returns an answer being an IP address or another domain.  So the requests waterfall down through the DNS servers until it finally reaches an IP address it is looking for.
Sub-Domain: is a more specific address that is underneath (in hierarchical terms) the domain name. For example wiki.bjcullinan.com has a sub-domain “wiki” for the domain “bjcullinan” with the TLD “.com”.
Lookup and Resolve: Lookup is the action of asking a DNS server where to go when trying to access a website.  Resolve is a term used to describe a domain being found and pointing to an IP address or another DNS server that contains the IP address.

DNS Explained:

From the beginning, and this part will probably be dumbed down because I hardly understand the interworking of it myself.  There are 14 ROOT servers around the world; these servers contain the TLD (.com, .edu, .net) information for other servers.  These other servers hold the domain names.  So when a look up is performed it first selects the correct TLD, and then selects the domain that you are looking for.  Finally it returns a list of name servers that point to a specific IP address.  A name server basically contains information about the domain, sub-domain, and IP address to pair it with.

Here is where it gets a little more complicated.  I started playing around with a domain I claimed for my mother, pqbride.net.  I changed the name server for that domain to ns1.bjcullinan.com.  This allows all traffic trying to reach pqbride.com, and sub-domain <anything>.pqbride.net, to be directed towards my DNS server at ns1.bjcullinan.com.  So, how would I get ns1.bjcullinan.com to point to my server?  Well, bjcullinan.com points to my server, but ns1 is a sub-domain, this was problematic for me because I cannot register sub-domains in my domain providers DNS server, so now I was stuck.

Here’s the catch.  I have control over bjcullinan.com, so I changed the name server for bjcullinan.com to ns1.bjcullinan.com.  Now I have a loop, in order to resolve bjcullinan.com I have to resolve ns1.bjcullinan.com, but in order to resolve ns1.bjcullinan.com I have to resolve bjcullinan.com.  The solution for this is a feature provided by the registry.  There is an option to register a name server completely independent of the domain.  You pair this name server with the IP address.  Finally, I registered ns1.bjcullinan.com as a name server and sent that to my IP address.

The Task:

Now that I have completed the domain name set up, I can start configuring my own domains.  Every address that I want people to access must be specified and handled by my DNS server.  Otherwise the lookup will be broken and the address will be inaccessible.

I started off by installing bind9, this consisted of a simple apt-get command on Ubuntu.  I did this step months ago and finally got around to configuring it last night.  I configured my zones, which is a fairly simple task.  Here is an example of a zone definition in my named.conf.local file:

zone "pqbride.net" {
   type master;
   file "/etc/bind/zones/pqbride.net.db";
};

Obviously I need the same type of definition for my bjcullinan.com domain.  This points to a DB file where all the subdomains are listed.  Here is my bjcullinan.com db file:

$TTL 3D
@ IN SOA ns1.bjcullinan.com. admin.bjcullinan.com. (
   2008062001
   28800
   3600
   604800
   38400
)
       IN    A          209.250.30.30
       IN    NS         ns1.bjcullinan.com.
ns1    IN    A          209.250.30.30
www    IN    A          209.250.30.30

So now we can dissect the configuration a little.  The $TTL is Time To Live and specifies how long a DNS server should wait before checking for updates.  The IN stands for Internet.  The NS stands for Name Server.  The 2008062001 is a version number for the configuration file that I have formatted to look like a date, but it can be anything.  This number must be incremented every time the configuration changes.  The reason for this is because other computers will download this configuration and cache it, this allows for faster lookups when requests are made.  If the index number is the same, they will just assume they have the latest version and ignore the changes.  At the bottom there is a list of 4 items that handle the domain and sub-domains.  It tells the IP address, in this case, that each domain points to.  As you can see the sub-domain “ns1” points to my IP address.  So now when pqbride.net is looked up it will resolve to ns1.bjcullinan.com which then resolves to my IP address.

Conclusion:

Task accomplished!  I am now able to add sub-domains to my domain names without relying on another company.  When I register a domain name all I have to do is point it to my name server that is all set up.  Awesome!

Computer Science

October 14th, 2008

Yet another semester of school progresses and projects pile up higher and higher.  I was inspired to write this article and have been meaning to do so since last spring.  I have always wanted to be a Computer Scientist; I knew it was the field for me since I was very young.  It has however been a lot harder of a path then I expected.

History:

For as long as I can remember I have used a computer.  Before I learned how to program I played Reader Rabbit and Treasure Mountain.  I remember most vividly the day our Gateway arrived in ’95.  It booted into Windows 95 and I was excited and very fascinated.  Of course the first software we installed was Doom, Wing Commander, and Myst.

I remember a day when I came home from school to find my step dad programming a Tax Calculator.  The exercise was from the VB 4 book that came with Visual Studio.  Later when he was not around I looked at the code he had written, intrigued I clicked the compile button and saw the incredible potential of programming computer applications.  At age 12 we wrote a computer Pokedex program together.  After that project my step dad didn’t do much programming in Visual Studio anymore, however I continued to learn and add features to my Pokedex, and eventually moved on to greater projects.

After that experience I knew that I wanted to be a computer scientist.  A college education has always been expected of me and my brothers.  Steve (my step dad) invested in tuition credits, and my father has always held high expectations of me.  So when I finally got to college I already knew that Computer Science was the right field of study.

Computer science is…

Not just writing code, or drawing pictures, or making a game.

In fact that sums up only about half of what we do; for those are all just applications of the skills and concepts we learn.  The other half of the field is based on the theoretical.  As computer scientists we are constantly encouraged to ask “why” and “how”.  Why do we still use a Von Neumann Architecture?  Will it ever change with the coming of optical computing or quantum computing?

Unlike many other fields, computer science is an abstract science, in that every concept we need to learn cannot always coincide with a real world or practical example.  In some science and engineering fields you are expected to learn “everything” that is currently known in the industry.  After you have a degree and you work in that field you discover new things to add to the industry.  Computer science is different in this respect, because it requires us to learn everything about the industry at any given time.  Why do we use this type of technology?  What brought us to this point?  Where will it go from here?

As you can imagine, the theoretical aspect, as well as the rapid progression of technology, makes computer science a difficult field to keep up with.  As computer scientists, we must constantly be learning new technology, and new methods of solving problems.  I frequently encounter cases where lower classmen for example do not know how to program.  Programming is the easy part, understanding how to develop software is the hard part.

Present:

Now I have always been a Do-It-Yourself-er, so when it comes to some functionality that I need on my computer, I can just write something up real quick to make it happen.  Most of the general public that goes about their simple computer interacting lives don’t appreciate that ability.  Or they think that it is computer wizardry.  But knowledge is relative.  My list of computer science wizards would include John von Neumann, Edsger Dijkstra, Linus Torvalds.  To most people those names mean nothing, but to me they are gods.

We learn many different aspects of computers, how processors work, how abstraction works, even how to calculate how long an algorithm will take to execute.  My most recent project is writing my own programming language in Compilers class.  We use high level languages like Java and Visual Basic.  40 years ago people were using punch cards to make a computer do what they wanted.   30 years ago people wrote software using processor commands in binary.  10 years ago people cared about how much memory a computer has, and how big programs are.  Today, memory management is frivolous.

Computers have come a long way even within the last 10 years and if a computer scientist doesn’t keep up to date with that technology, they will be filtered out by the industry.

Technically speaking…

Some of the fun technical things I have learned, trees and stacks grow downwards, as you can tell by the illustration.

cartoon.jpg

I really just wanted an excuse to make a cartoon.

Detailing the Media Server Website

September 21st, 2008

My progress on the media server website has been slow, but nevertheless it is coming along. The framework and backend part of the site is reaching the public testing stages and the source will soon be available for hacking.

As I mentioned in previous posts, the site revolves around 2 main sections of functionality. The ‘modules’ section which contains the input processors for reading in files, and the ‘plugins’ section which contains very specific functionality for using the files. The information is stored in a generalized database with each table containing the data for each individual module. The front end can consist of various templates.

Aesthetically pleasing design:

I have stopped working on the inferior but still useful list output, and have implemented an API called Ext JS that offers a wider range of functionality. Although it uses some intense JavaScript, the library is very stable and has turned out nicely. The best part is; I didn’t have to design any of it graphically. All I have done is implement the conceptual ideas and some extra functionality.

I am trying to accomplish a design that combines features from our favorite operating systems and media players. The windows like look and feel of a file browser, the iTunes look and feel of a media player, and a VLC conversion engine on the backend is the ultimate goal. As you can see from the site below, it is coming along nicely.

http://209.250.30.30/mediaserver/

Please save the security testing until the code is available, I am constantly making improvements on the backend security, but I can only work so fast.

Friends

April 23rd, 2008

I have been thinking a little bit about writing this follow up to the April 20th post. I realize this isn’t a LiveJournal, so I will keep this brief. I do however consider managing your relationships a project (not meant to be taken literally). Maybe some famous person said this:

We are the defined by the sum of our experiences.

I don’t know; it sounds legitimate, but I would say:

We are the product of aspirations inspired by our friends.

Just to analyze that a bit. Our friends influence and encourage us to be great in many ways. Personally, my closest friends are the ones that are there to criticize me. Even though I may not always respond well to the criticism; in fact I act like I hate it, but I still take it to heart. Furthermore, I believe friends represent our intellect and principles that we want to project to everyone else. For example, I have certain expectations of all my friends. They are intelligent, well versed, and never afraid to stand up for what they believe. This is very much what I want people to think of me. And close.

Relationship Advice for the Young Hearted

April 20th, 2008

I have had a growing urge to write an entry of this caliber for a while now. I have been in a few relationships, some good, and some bad. But even the bad relationships are good experiences so I will share some of them with my readers. Please either consider this advice, or discard it as you will.

Getting into a relationship:

Common interests can make or break a relationship. These things should be evaluated from the start. Find things that you are both interested in, and if there aren’t enough things you have in common, then try going outside of your usual bounds try something new. Try to avoid devoting too much time to the things you don’t have in common. Especially in conversation, wait for the invitation before digressing on your own field of interest. People always like to talk about themselves, so you have to be the responsible one and ask questions to balance the conversations.

passion_night_1.jpgSexuality plays a big role when finding a person you are interested in. A simple touch may be enough to set you or that person over the edge. I would even say that physical attraction to another person is the main catalyst that leads to developing other aspects of the relationship. But physical attraction can be blinding and prevent us from seeing certain traits of a person. As Shakespeare so elegantly put it,

Love is blind, and lovers cannot see,
The pretty follies that themselves commit.

Sharing experiences you’ve had in the past is always important for people to get to know each other. However, try to limit the sharing to the maturity of the relationship; giving away too much initially may be overwhelming for your partner. Just like when Carla gives the Janitor advice on Scrubs,

You have to dole out your crazy in little pieces,
You can’t do it all at once.

The beginning of the end:

Now I will stop quoting famous people and share personal experience with you. When I was in a relationship I found myself attracted to other women, so I took some things into consideration and ultimately made the right choice. Although the relationship eventually ended, it ended for the right reasons.

Evaluate the good and bad aspects of your relationship. Determine if the good outweighs the bad, and if it does then try to eliminate some of the bad things by changing tendencies or habits. A lot of times minor things can end up clashing with your partner, and these things can be fixed easily, they don’t require you to change who you are, or your personality. Grow together, not individually.

The wrong reason to break off a relationship would be because of another person. Although you may see that person as being a better match or “perfect”, it is likely that if you did get into a relationship with them, you will find just as many things you don’t like about them. Personally, I found myself attracted to another woman when I was already in a relationship. I got to know this other woman more, without jeopardizing my current relationship, and I found she was not attractive at all. Lust plays a large part in this situation.

loneliness.jpgRealize why you are together, and not just because you met and it is convenient. But think about all the things that clash and cooperate in your personalities. Out of six billion people in the world it is likely there will always be someone “better” for you. However, you shouldn’t destroy a relationship based on simple attraction; follow your heart. Get out of a relationship because it is not right, because there is too much clash, or because it is stifling your true potential, not because the grass looks greener on the other side.

If it ends, that just means that there is someone out there better for you. Don’t be afraid of a new relationship.

In the ring of fire:

Intimacy is key to keeping any relationship alive, even a sexually abstinent one. Act on desire and spontaneity; if both parties are consenting of course. Don’t be afraid to talk to your partner about being intimate, and when. In case you didn’t catch the reference in the section title, here is the quote from Johnny Cash’s Ring of Fire,

Love is a burning thing
and it makes a firery ring
bound by wild desire
I fell in to a ring of fire…

Spending time and money is inevitable. If you have a steady income this makes the money part a lot easier. But it can complicate the time part even more. Sometimes it is hard to find a balance between friends, family, work, school, and of course your partner. It is a good idea to take a moment every now and then to plan out a balance between all of these things. Having a scheduled Date Night can simplify when to spend time with your partner, and it will also keep the relationship alive and “going steady”.

Keep the fire burning by staying attracted in every aspect. If you are physically attracted to each other, then spend time on being spiritually, emotionally, and mentally attracted. Stay physically attracted to each other by BEING attractive, keep the body that you and your partner desire (eg. work out together).

Friends are a part of everyone’s lives. So when you are in a relationship try to blur the line between your friends and your partner’s friends, make it OUR friends. Find something that everyone can participate in, and socialize.

Conclusion:

Relationships are great. They should stay simple and joyfully easy like they usually start off as. When things become complicated, from misunderstandings for example, communication with your partner becomes even more important. A lot of relationships never come to an end, and people live happily ever after. So I hope my advice can help that happen to you, everyone deserves true love…

Media Server Progress

April 10th, 2008

Overview:

I have made a lot of progress on my media server website. I finally came up with a method of abstraction that I am happy with. I have the site organized into modules, which handle files of different types, and plug-ins, which handle displaying different aspects of each module.

Modules:

Modules handle files of different types, for example audio files or video files. Every module is extended from the “files” module which just stores general file information. Every module has some requirements that they must override, for example the handles function which takes a file as input and determines if the module can handle that file.

Plug-ins:

This contains the core functionality of the site. The plug-ins includes things like RSS feed, the file getter, and the viewer. The plug-ins can interact with each other, in which case they would have “dependencies”. Plug-ins are mainly responsible for display data that the modules collect.

Other Features:

The site will have strong template support. And if a file is not found for a template, then the default template file will be used. The appearance should mainly depend on the CSS template. There will also be a nice admin section.