1
0
mirror of https://github.com/kirsle/kirsle.net synced 2024-12-22 06:59:29 +00:00

Initial commit

This commit is contained in:
Noah 2014-04-09 14:56:29 -07:00
commit f35ec3ea62
56 changed files with 3214 additions and 0 deletions

5
README.md Normal file
View File

@ -0,0 +1,5 @@
# Kirsle.net
This is the source code of my personal website,
[Kirsle.net](http://www.kirsle.net/). It runs on top of my Python CMS called
[Rophako](https://github.com/kirsle/rophako).

27
www/about.html Normal file
View File

@ -0,0 +1,27 @@
{% extends "layout.html" %}
{% block title %}About Me{% endblock %}
{% block content %}
<h1>About Me</h1>
My name is Noah and this is my website. I am a software engineer who lives in
Los Angeles. My areas of expertise are primarily in Perl and Python back-end
software development, however I believe I have a knack for the front end as well.<p>
I built Kirsle.net from the ground up. I made the web design in Photoshop and
pieced it together using standards compliant HTML 5.0 (the spec, not the
buzzword), CSS and a little bit of JavaScript. The back end is entirely written
in Python.<p>
The code supports a web blog, photo albums, and comments. It's also an open
source project of mine that I call Rophako. You can
<a href="https://github.com/kirsle/rophako">clone it on Github</a>.<p>
Besides being a rockstar at back end development and a pretty decent web designer,
I've dabbled in some 3D modeling, Flash animation and other artistic things.
You can find them under the "Creativity" section on the left navigation. :)<p>
Some of my personal projects are listed under the "Software" section to your
left. The rest you'll find on my GitHub page and CPAN profile.
{% endblock %}

82
www/contact/index.html Normal file
View File

@ -0,0 +1,82 @@
{% extends "layout.html" %}
{% block title %}Contact Me{% endblock %}
{% block content %}
<h1>Contact Me</h1>
You can use the form below to send me an e-mail. Alternatively you can contact
me on an instant messenger:
<blockquote>
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td align="center" valign="middle">
<img src="/static/icons/aim.gif" title="AIM">
</td>
<td align="left" valign="middle">
<strong>AIM:</strong> <a href="aim:goim?ScreenName=Kirsle">Kirsle</a>
</td>
</tr>
<tr>
<td align="center" valign="middle">
<img src="/static/icons/skype.png" title="Skype">
</td>
<td align="left" valign="middle">
<strong>Skype:</strong> Kirsle
</td>
</tr>
<tr>
<td align="center" valign="middle">
<img src="/static/icons/xmpp.gif" title="XMPP">
</td>
<td align="left" valign="middle">
<strong>XMPP:</strong> kirsle@kirsle.net
</td>
</tr>
</table>
</blockquote><p>
<strong>You may NOT</strong> use this form to send me any SEO business
solicitations. That will probably just make me ban your IP address from visiting
my site ever again.<p>
<form name="contact" action="{{ url_for('contact.send') }}" method="POST">
<input type="hidden" name="token" value="{{ csrf_token() }}">
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td width="50%" align="left" valign="middle">
<strong>Your name:</strong><br>
<small>(so I know who you are)</small><br>
<input type="text" size="40" name="name">
</td>
<td width="50%" align="left" valign="middle">
<strong>Your email:</strong><br>
<small>(if you want a response)</small><br>
<input type="email" size="40" name="email">
</td>
</tr>
<tr>
<td colspan="2" align="left" valign="middle">
<strong>Message subject:</strong><br>
<small>(optional)</small><br>
<input type="text" size="40" name="subject" style="width: 100%"><p>
<strong>Message:</strong><br>
<small>(required)</small><br>
<textarea cols="40" rows="12" name="message" style="width: 100%"></textarea>
</td>
</tr>
<tr>
<td colspan="2" align="right" valign="middle">
<button type="submit">Send Message</button>
</td>
</tr>
</table>
<div style="display: none">
If you can see these boxes, don't touch them.<br>
<input type="text" size="40" name="contact" value=""><br>
<input type="text" size="40" name="website" value="http://">
</div>
</form>
{% endblock %}

44
www/download.html Normal file
View File

@ -0,0 +1,44 @@
{% extends "layout.html" %}
{% block title %}Download Manager{% endblock %}
{% block content %}
{% if method == "index" %}
<h1>Project {{ project }}</h1>
You are about to download the file <strong>{{ file }}</strong> from the
project <strong>{{ project }}</strong>. This file has been downloaded
{{ hits }} time(s).
<h1>Download</h1>
To continue your download, click on the button below.
<br><br><br>
<form name="download" action="/download" method="POST">
<input type="hidden" name="token" value="{{ csrf_token() }}">
<input type="hidden" name="method" value="get">
<input type="hidden" name="project" value="{{ project }}">
<input type="hidden" name="file" value="{{ file }}">
<span style="background-color: #88AADD; padding: 15px; border-top: 2px solid #006699;
border-left: 2px solid #006699; border-right: 2px solid #AACCFF; border-bottom: 2px solid #AACCFF">
<button type="submit">Download Now</button>
</span>
</form>
{% elif method == "get" %}
<h1>Downloading File...</h1>
Your download of <strong>{{ file }}</strong> will begin shortly. If it doesn't,
<a href="/projects/{{ project }}/{{ file }}">download it directly</a>.
{% endif %}
{% endblock %}
{% block scripts %}
{% if method == "get" %}
<script>
$(document).ready(function() {
window.location.href = "/projects/{{ project }}/{{ file }}";
});
</script>
{% endif %}
{% endblock %}

192
www/errorgen.html Normal file
View File

@ -0,0 +1,192 @@
{% extends "layout.html" %}
{% block title %}Error Message Generator{% endblock %}
{% block content %}
<h1>Error Message Generator</h1>
<ul>
<li><a href="#intro">Project Description</a></li>
<li><a href="#screenshots">Screenshots</a></li>
<li><a href="#zenmsg">ZenMsg</a></li>
<li><a href="#license">License</a></li>
<li><a href="#downloads">Downloads</a></li>
</ul>
<a name="intro"></a>
<img src="projects/ErrorGen/logo.png" alt="ErrorGen" width="400" height="90">
<h2>Project Description</h2>
The <strong>Error Message Generator</strong> (ErrorGen) is a simple
program that generates customized error dialogs. The idea was inspired
by a web-based error generator which created <em>images</em> of error
boxes. My program, however, creates "real" error boxes that can be
dragged around the screen and interacted with.<p>
The command-line, scriptable version of Error Message Generator is called
<strong>ZenMsg</strong>, named after the GNOME utility, Zenity. It's
a version of the generator that can be provoked from batch files and
scripts.
<h3>Features</h3>
<ul>
<li>Fully customizable error box: select the title, icon,
and message.</li>
<li>Create up to THREE buttons for the error box and specify
what each of them say, and which ones are "greyed out"</li>
<li>Advanced features to make the error keep coming back until
the right button is selected.</li>
<li>A button that minimizes and renames the control window,
leaving only the error dialog visible on screen.</li>
</ul>
<a name="screenshots"></a>
<h2 style="margin-top: 0px">Screenshots</h2>
<table border="0" cellspacing="0" cellpadding="0" style="margin-left: auto; margin-right: auto">
<tr>
<td align="center" valign="top">
<a href="projects/ErrorGen/ErrorGen.jpg">
<img src="projects/ErrorGen/ErrorGenS.jpg" width="600" height="364" alt="Screenshot">
</a><br>
ErrorGen in action, surrounded by example error messages.<br>
(click for a larger version)
</td>
</tr>
</table>
<a name="zenmsg"></a>
<h2 style="margin-top: 0px">ZenMsg</h2>
ZenMsg is a command-line version of Error Message Generator that
can be invoked by batch files or scripts. Example usage:
<pre style="overflow-x: auto">ZenMsg --error -t "An error has occurred." -b "Abort" -b "Retry" -b "Fail"</pre>
The executable comes with an HTML help file. <code>ZenMsg -?</code>
will display the same help file at the command line. The document
describes how to use ZenMsg.<p>
There is no binary Linux version of this utility. The source code
however is available and will execute under Linux; I've just not
compiled a standalone executable (there are a handful of other
utilities that do the job: see
<a href="http://live.gnome.org/Zenity">Zenity</a>. Source code
is available on the Downloads tab.
<h3>Windows Executable</h3>
<blockquote>
<img src="images/dos.png" width="32" height="32" alt="Win32" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=ZenMsg&amp;file=ZenMsg-0.01-bin.zip">
Download ZenMsg</a><br>
Version 0.01 - 2008/09/18<br>
<small>ZIP format/3.6 MB</small>
</blockquote>
<a name="license"></a>
<h2 style="margin-top: 0px">Software License</h2>
<pre> Error Message Generator
Copyright (C) 2008 Casey Kirsle
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</pre>
<a name="downloads"></a>
<h2 style="margin-top: 0px">Downloads</h2>
It's recommended that you download the latest version of this software
as listed below. To download older versions and source code, skip to
the next section.
<h3>Windows Executable</h3>
<blockquote>
<img src="images/dos.png" width="32" height="32" alt="Win32" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=ErrorGen&amp;file=ErrorGen-1.2_bin.zip">
Download Error Message Generator</a><br>
Version 1.2 - 2007/06/28<br>
<small>ZIP format/2.1 MB</small>
</blockquote>
<h3>Linux Binary</h3>
<blockquote>
<img src="images/exec.png" width="32" height="32" alt="Linux" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=ErrorGen&amp;file=ErrorGen-1.2_linux.tar.gz">
Download Error Message Generator</a><br>
Version 1.2 - 2007/06/28<br>
<small>TAR.GZ format/4.6 MB</small>
</blockquote>
<h2>All Distributions</h2>
The following are all the distributions available for this software,
starting with the most recent. Source code is also available for all
versions.<p>
<table border="0" cellspacing="2" cellpadding="2" class="distro">
<tr>
<th>Release</th>
<th>Windows EXE</th>
<th>Linux Binary</th>
<th>Source Code</th>
</tr>
<tr>
<td>
<b>ErrorGen 1.2</b><br>
<small>2007/06/28</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=ErrorGen&amp;file=ErrorGen-1.2_bin.zip">ErrorGen 1.2</a><br>
<small>(ZIP; 2.1 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<a href="/download?type=bin&amp;project=ErrorGen&amp;file=ErrorGen-1.2_linux.tar.gz">ErrorGen 1.2</a><br>
<small>(TAR.GZ; 4.6 MB)</small>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=ErrorGen&amp;file=ErrorGen-1.2_src.tar.gz">ErrorGen 1.2</a><br>
<small>(TAR.GZ; 114.1 KB)</small>
</tr>
<tr>
<td>
<b>ZenMsg 0.01</b><br>
<small>2008/09/18</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=ZenMsg&amp;file=ZenMsg-0.01-bin.zip">ZenMsg 0.01</a><br>
<small>(ZIP; 3.6 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=ZenMsg&amp;file=ZenMsg-0.01-src.zip">ZenMsg 0.01</a><br>
<small>(ZIP; 13 KB)</small>
</tr>
</table>
{% endblock %}

605
www/firered.html Normal file
View File

@ -0,0 +1,605 @@
{% extends "layout.html" %}
{% block title %}Sequence Breaking Pokemon FireRed{% endblock %}
{% block content %}
<h1>Sequence Breaking Pokemon FireRed</h1>
This is the story of my quest to <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/SequenceBreaking">Sequence
Break</a> Pokemon FireRed Version. I decided a good place to begin my quest would be Fuchsia City instead of
Palette Town. This is what happened...
{% set pages = {
"1": "Getting to Fuchsia City",
"2": "Level Grinding on Silence Bridge",
"3": "On the Road to Cerulean City",
"4": "Breaking Mt. Moon"
} %}
<ul>
{% for i in pages|sort %}
{% set link = pages[i] %}
<li>
{% if i == page %}
<strong>Part {{ i }} - {{ link }}</strong>
{% else %}
<a href="/firered{% if i != '1' %}/{{ i }}{% endif %}">Part {{ i }} - {{ link }}</a>
{% endif %}
</li>
{% endfor %}
<li><a href="/firered/full">All on one page</a></li>
</ul>
{% if page == "1" or page == "full" %}
<h2>The Original Idea</h2>
In the zoo in Fuchsia City in front of the
Safari Zone, there is an extinct Pokemon. This Pokemon will be either
Omanyte or Kabuto -- which one it is depends on which fossil you chose in
Mt. Moon. So the question was, <em>If you could get to Fuchsia City without
having chosen a fossil, what Pokemon would be shown at the zoo?</em><p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/000.png" width="480" height="320" alt="Screenshot">
</div><p>
So, I set out to sequence break Pokemon Fire Red version. I decided to
use walk through walls cheats to get to Fuchsia City as soon as it was
convenient. I had to play the game long enough to get a starter Pokemon
(I chose Charmander) and a Pokedex, because the game does extremely
weird things if you cheat and start battling and capturing Pokemon
without having these two items first.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/001.png" width="480" height="320" alt="Screenshot"><br>
<em>My level 7 Charmander.</em>
</div><p>
So, enable the cheat codes and get out of Palette Town!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/002.png" width="426" height="438" alt="Screenshot"><br>
<em>The Walk Thru Walls cheat and Level 1 Wild Pokemon</em>
</div><p>
I couldn't find a cheat code that would disable random battles entirely,
so I used a "Level 1 Pokemon" cheat so any random battles I do get into
will be with Pokemon of reasonable levels.
<h1>Getting to Fuchsia City</h1>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/003.png" width="480" height="320" alt="Screenshot"><br>
<em>Walking south towards Cinnabar Island.</em><p>
<img class="portrait" src="/creativity/articles/fire-red/004.png" width="480" height="320" alt="Screenshot"><br>
<em>A wild Tentacool decided to fight me. Good thing it's only Level 1.</em><p>
<img class="portrait" src="/creativity/articles/fire-red/005.png" width="480" height="320" alt="Screenshot"><br>
<em>Finally arrived at Cinnabar Island.</em><p>
<img class="portrait" src="/creativity/articles/fire-red/006.png" width="480" height="320" alt="Screenshot"><br>
<em>Cinnabar Island with no badges and only 1 Pokemon!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/007.png" width="480" height="320" alt="Screenshot"><br>
<em>Finally arrived in Fuchsia City.</em>
</div><p>
Now that we've finally arrived in Fuchsia City, let's check out the zoo
and see what extinct Pokemon is there!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/008.png" width="480" height="320" alt="Screenshot"><br>
<em>Looks like the default is a Kabuto. Mystery solved!</em>
</div><p>
If you didn't choose a fossil Pokemon, it looks like the default is
to show Kabuto in the zoo. Remember that ordinarily it's not supposed
to be possible to get to Fuchsia City without having chosen one of the
fossils, because the fossils block your path through Mt. Moon.<p>
<h1>Getting Caught Up</h1>
Now that we're in Fuchsia City, can we try to continue the game from
here without cheating any more? We should be able to! I only have
a level 7 Charmander and every Pokemon in this part of Kanto is around
level 30, so what can I do about that?<p>
Use the Safari Zone! I can catch wild Pokemon here without having to
battle them, and the Pokemon levels will be comparable to the average
level of Pokemon in the Fuchsia City area.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/009.png" width="480" height="320" alt="Screenshot"><br>
<em>And I have $3,024 to spend on the Safari Zone game!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/010.png" width="480" height="320" alt="Screenshot"><br>
<em>Entering the Safari Zone!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/011.png" width="480" height="320" alt="Screenshot"><br>
<em>The first wild Pokemon I run into is a Lv31 Nidorino!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/012.png" width="480" height="320" alt="Screenshot"><br>
<em>Captured!</em>
</div><p>
Remember also that the Safari Zone contains the Surf HM. But, I
can't use Surf outside of battle until I defeat the Fuchsia City
gym leader. Good thing I'm in Fuchsia City!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/013.png" width="480" height="320" alt="Screenshot"><br>
<em>I found the Surf HM inside the Safari Zone.</em>
</div><p>
From the Safari Zone, I've captured a Nidorino, Ryhorn, Nidoran&#x2640;,
Paras, Exeggcute, and Venomoth. Unfortunately none of my Pokemon are
able to learn Surf, so even if I do defeat the Fuchsia City gym leader,
how will I escape?<p>
But wait! There's a Fishing Guru in Fuchsia City! I can get a fishing
rod from him!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/014.png" width="480" height="320" alt="Screenshot"><br>
<em>I got the Good Rod.</em>
</div><p>
I was wondering for a minute how the fishing rods worked. Ordinarily you
find the first Fishing Guru in Vermilion City, and you get the Old Rod
which can only catch Magikarp. Then you get the Good Rod from Fuchsia
City which can catch Goldeen, Poliwag and Magikarp. And then the Super
Rod can catch more Pokemon.<p>
I was wondering if maybe the rods were incremental, and that the Fuchsia
City Fishing Guru would give me the Old Rod since I talked to him first.
But apparently the rods are hard-coded, so I got the Good Rod. With this
I caught myself a Level 10 Goldeen from the pond in the Fishing Guru's
back yard.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/015.png" width="480" height="320" alt="Screenshot"><br>
<em>My party so far...</em>
</div><p>
Before taking on the Fuchsia City gym, I need to level up my Pokemon
some more. The best place to do that is to head out on Route 15.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/016.png" width="480" height="320" alt="Screenshot"><br>
<em>Route 15 from Fuchsia City to Lavender Town.</em>
</div><p>
My Charmander is too weak to battle, but my other Pokemon aren't. I
can power-level Charmander by putting it out first in battle and then
switching it with someone else. The first few battles caused Charmander
to level up 2 or 3 times at once. Three short battles later, and...<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/017.png" width="480" height="320" alt="Screenshot"><br>
<em>Charmander is evolving!</em>
</div>
{% if page == "1" %}
<p>&gt; Continue to <a href="/firered/2">Part 2 - {{ pages["2"] }}</a>
{% endif %}
{% endif %}
{% if page == "2" or page == "full" %}
<h1>Level Grinding on Silence Bridge</h1>
After battling my way through the Bikers and Bird Catchers, I finally
made my way to the bottom of Silence Bridge.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/018.png" width="480" height="320" alt="Screenshot"><br>
<img class="portrait" src="/creativity/articles/fire-red/019.png" width="480" height="320" alt="Screenshot"><br>
<img class="portrait" src="/creativity/articles/fire-red/020.png" width="480" height="320" alt="Screenshot"><br>
<em>Silence Bridge - Route 12.</em>
</div><p>
It's a straight shot north to Lavender Town!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/021.png" width="480" height="320" alt="Screenshot"><br>
<em>The Fishing Guru's house.</em>
</div><p>
I found the other Fishing Guru's house and got a Super Rod. With
this I can catch Dratini in the Safari Zone. Dragon Pokemon are
cool, right? And I don't even have a single gym badge yet!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/022.png" width="480" height="320" alt="Screenshot"><br>
<em>A sleeping Pokemon blocks the way!</em>
</div><p>
And, here's Snorlax. This Pokemon blocks my access to Lavender
Town to the north, and Vermilion City to the west. I can't get
a PokeFlute to wake up Snorlax until I've already been to
Lavender Town and Celadon City.<p>
But look! I could Surf right around Snorlax and get to Lavender
Town! Now I have my plan. I just need to defeat the Fuchsia
City Gym Leader, teach my Goldeen how to Surf, Surf around the
Snorlax and get to Lavender Town!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/023.png" width="480" height="320" alt="Screenshot"><br>
<em>My party so far...</em>
</div><p>
My Exeggcute knows Confusion, which is Super Effective against
poison type Pokemon. The Fuchsia City gym is full of poison types,
so Exeggcute is my best bet for beating the gym leader.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/024.png" width="480" height="320" alt="Screenshot"><br>
<em>Used Exeggcute to defeat Koga, the gym leader.</em>
</div><p>
Now I can Surf around Snorlax! I caught a Level 10 Goldeen with
the Good Rod, now let's teach it how to Surf.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/025.png" width="480" height="320" alt="Screenshot"><br>
<img class="portrait" src="/creativity/articles/fire-red/026.png" width="480" height="320" alt="Screenshot"><br>
<em>Sequence breaking at its finest.</em><p>
<img class="portrait" src="/creativity/articles/fire-red/027.png" width="480" height="320" alt="Screenshot"><br>
<em>Welcome to Lavender Town!</em>
</div><p>
Now that we've gotten to Lavender Town, it will be really easy
to get back on track. At this point we can Surf, but we still
don't have any Pokemon that knows how to Cut. But we can easily
find our way back to Vermilion City and Cerulean City from here!
Just watch...<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/028.png" width="480" height="320" alt="Screenshot"><br>
<em>Taking the Underground Path from Lavender Town to Celadon City.</em><p>
<img class="portrait" src="/creativity/articles/fire-red/029.png" width="480" height="320" alt="Screenshot"><br>
<em>Here we are in Celadon City!</em>
</div><p>
Now I've made it to Celadon City. There's a lot of exciting things
I can do here! For starters, I can buy a Leaf Stone to evolve my
Exeggcute.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/030.png" width="480" height="320" alt="Screenshot"><br>
<em>I bought myself a Leaf Stone.</em><p>
<img class="portrait" src="/creativity/articles/fire-red/031.png" width="480" height="320" alt="Screenshot"><br>
<em>I evolved Exeggcute with it! More power!</em>
</div><p>
While I'm in Celadon City, I'd <em>love</em> to be able to get
straight to the gym and completely destroy the Grass-type Pokemon
there with my Charmeleon, but I can't get in!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/032.png" width="480" height="320" alt="Screenshot"><br>
<em>I don't have Cut!</em>
</div><p>
Rain check! I need to get to Cerulean City and defeat the water
Pokemon gym leader to be allowed to use Cut, and I need to get
to Vermilion City to actually get my hands on the Cut HM to teach
it to one of my Pokemon!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/033.png" width="480" height="320" alt="Screenshot">
</div><p>
In the virtual Game Freak headquarters in Celadon City, you get
the Hot Tea, which you then give to the guards that surround
Saffron City and then they allow you into the city. Saffron City
is the central hub between Cerulean City, Celadon City, Lavender
Town, and Vermilion City. This will allow us to get back to all
the major Kanto cities. Now we're getting back on track!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/034.png" width="480" height="320" alt="Screenshot"><br>
<em>Giving the Hot Tea to the Saffron City guards...</em><p>
<img class="portrait" src="/creativity/articles/fire-red/035.png" width="480" height="320" alt="Screenshot"><br>
<em>Here we are in Saffron City!</em>
</div><p>
We've made it to Saffron City now, and we only have a single
gym badge! :D<p>
Now, the next place I should go is north to Cerulean City. You
can get <em>in</em> to the city without Cut, but you can't get
back out. I'll need to see Bill anyway to get the S.S. Ticket,
so I can get the Cut HM from the S.S. Anne. So, north it is!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/036.png" width="480" height="320" alt="Screenshot"><br>
<em>North to Cerulean City, south to Vermilion City.</em>
</div>
{% if page == "2" %}
<p>&gt; Continue to <a href="/firered/3">Part 3 - {{ pages["3"] }}</a>
{% endif %}
{% endif %}
{% if page == "3" or page == "full" %}
<h1>On the Road to Cerulean City</h1>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/037.png" width="480" height="320" alt="Screenshot"><br>
<em>The south border to Cerulean City.</em>
</div><p>
See, this is why you need Cut to get out of Cerulean City. I'm
<em>supposed</em> to be on the other side of this wall. But,
somebody's stupid Slowbro is in the way anyway.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/038.png" width="480" height="320" alt="Screenshot"><br>
<em>This is how you get into Cerulean City.</em>
</div><p>
I'm not supposed to be on top of this ledge. When I jump down,
I'll be stuck in Cerulean City until I complete the "go see
Bill" side quest. But, I must see Bill so that I can get the
S.S. Ticket!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/039.png" width="480" height="320" alt="Screenshot">
</div><p>
Since the Cerulean City Gym is right here, let's go and beat
Misty real quick so we'll be <em>allowed</em> to use Cut once
we finally get it.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/040.png" width="480" height="320" alt="Screenshot"><br>
<em>I know Rhyhorn is weak against Starmie, but c'mon.</em>
</div><p>
Even Misty's strongest Pokemon is no chance against mine.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/041.png" width="480" height="320" alt="Screenshot"><br>
<em>Thanks! This is what I came here for!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/042.png" width="480" height="320" alt="Screenshot"><br>
<em>Oh look, it's my rival, Blue!</em>
</div><p>
My rival Blue challenges you when you try to leave Cerulean
City to see Bill to the north. Ordinarily, if you play the
game properly, you're trapped in Cerulean City with nowhere
to go <em>but</em> north.<p>
Blue's Pokemon though are super weak compared to mine.
Completely destroying him takes no effort at all. And then
I'm off to see Bill, destroying any trainer who gets in my
way.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/043.png" width="480" height="320" alt="Screenshot"><br>
<em>I got the S.S. Ticket from Bill here.</em>
</div><p>
And with the S.S. Ticket, I'm able to get out of Cerulean City
and head south. I cut through Saffron City instead of taking
the underground tunnel and arrive in Vermilion City.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/044.png" width="480" height="320" alt="Screenshot"><br>
<em>Welcome to Vermilion City!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/045.png" width="480" height="320" alt="Screenshot"><br>
<em>I head straight for the S.S. Anne to get my Cut HM.</em>
</div><p>
Now, this is where the first really interesting quirk happened
with my sequence breaking. I didn't waste time battling trainers
on the S.S. Anne since they don't stand a chance against me
anyway, and I headed straight for the Captain's Cabin.<p>
Ordinarily, your rival will challenge you to a battle right before
the Captain's Cabin. But, Blue was absent! He didn't show up to
challenge me. I wonder why? Is it because I have the Fuchsia City
gym badge already?<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/046.png" width="480" height="320" alt="Screenshot"><br>
<em>Where are you, Blue? Are you too embarrassed to battle me again?</em><p>
<img class="portrait" src="/creativity/articles/fire-red/047.png" width="480" height="320" alt="Screenshot"><br>
<em>I went ahead and got the Cut HM from the Captain.</em>
</div><p>
Now, with the Cut HM, I can challenge the Vermilion City gym leader.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/048.png" width="480" height="320" alt="Screenshot"><br>
<em>Bye-bye, S.S. Anne!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/049.png" width="480" height="320" alt="Screenshot"><br>
<em>Time to take on the Vermilion City gym!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/050.png" width="480" height="320" alt="Screenshot"><br>
<em>The gym trainers stood no chance against me.</em><p>
<img class="portrait" src="/creativity/articles/fire-red/051.png" width="480" height="320" alt="Screenshot"><br>
<em>The gym leader also lost spectacularly to my overpowered Pokemon.</em>
</div><p>
Now with the Vermilion City gym out of the way, I went back to
Celadon City to pwn my way through their Grass-type Pokemon
with my Charmeleon.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/052.png" width="480" height="320" alt="Screenshot">
</div><p>
Now, when I defeated the Vermilion City gym, I'm able to use
Fly now. I can get Fly in Celadon City, so, let's go get it.
Also, I captured a random Pidgey I found in the grass so that
I'd have a Pokemon to teach Fly to.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/053.png" width="480" height="320" alt="Screenshot"><br>
<em>Received HM02 - Fly.</em><p>
<img class="portrait" src="/creativity/articles/fire-red/054.png" width="480" height="320" alt="Screenshot"><br>
<em>My gym badges so far. I never got the 1<sup>st</sup> badge.</em>
</div>
{% if page == "3" %}
<p>&gt; Continue to <a href="/firered/4">Part 4 - {{ pages["4"] }}</a>
{% endif %}
{% endif %}
{% if page == "4" or page == "full" %}
<h1>Breaking Mt. Moon</h1>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/055.png" width="480" height="320" alt="Screenshot"><br>
<em>Where should I Fly to next?</em>
</div><p>
As you can see, I've now been to every city except for Pewter
City and Indigo Plateau (but the latter is normal, as that's
the very last city you go to).<p>
I'm gonna fly to Cerulean City because I have an idea on how
I can further sequence-break this game. Since I can Surf, I can
escape from Cerulean City going west and get to Mt. Moon, and
enter Mt. Moon from the wrong side.<p>
This will place me on the <em>other</em> side of the fossils,
and let me choose my fossil without having to battle the Pokemon
trainer who guards them!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/056.png" width="480" height="320" alt="Screenshot"><br>
<em>Surfing here to get out of Cerulean City!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/057.png" width="480" height="320" alt="Screenshot"><br>
<em>The Cerulean City cave.</em>
</div><p>
This trainer is blocking the entrance to the Cerulean City Cave,
where Mewtwo lives, because you can't get in there until you've
beaten the entire game. But I'm not interested in that cave, I'm
going to head west to Mt. Moon!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/058.png" width="480" height="320" alt="Screenshot"><br>
<em>Mt. Moon - The back entrance.</em><p>
<img class="portrait" src="/creativity/articles/fire-red/059.png" width="480" height="320" alt="Screenshot"><br>
<em>The fossils!</em>
</div><p>
And here we are. Ordinarily, I would be on the opposite side of
the fossils, and I'd have to battle the trainer down there first.
After winning, he'd let me choose a fossil, and he'd take the
opposite one. But I'm standing right by the fossils right now!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/060.png" width="480" height="320" alt="Screenshot"><br>
<em>I'll take the Kabuto fossil!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/061.png" width="480" height="320" alt="Screenshot"><br>
<em>The trainer automatically goes and takes the other one.</em>
</div><p>
As I expected, taking the fossil has triggered the trainer to
take the other one. But, I've skipped the battle with him now!
See, look!<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/062.png" width="480" height="320" alt="Screenshot"><br>
<em>I know, I've been to Cinnabar Island!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/063.png" width="480" height="320" alt="Screenshot"><br>
<em>Through Mt. Moon, onward to Pewter City!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/064.png" width="480" height="320" alt="Screenshot"><br>
<em>I'm positive that you are mistaken. I've never been to Viridian Forest!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/065.png" width="480" height="320" alt="Screenshot"><br>
<em>All this excitement has caused my Charmeleon to evolve!</em><p>
<img class="portrait" src="/creativity/articles/fire-red/066.png" width="480" height="320" alt="Screenshot"><br>
<em>Oh. Thanks for the warm welcome to Pewter City.</em>
</div><p>
I've encountered Pewter City's "invisible wall" from the wrong side. The
invisible wall is this trainer who's supposed to stop you from leaving
Pewter City until you've defeated the gym leader, Brock.<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/067.png" width="480" height="320" alt="Screenshot"><br>
<em>I'm sure I have the right stuff, buddy.</em><p>
<img class="portrait" src="/creativity/articles/fire-red/068.png" width="480" height="320" alt="Screenshot"><br>
<em>Brock doesn't know what he's getting himself into...</em><p>
<img class="portrait" src="/creativity/articles/fire-red/069.png" width="480" height="320" alt="Screenshot"><br>
<em>Brock's strongest Pokemon doesn't even stand a chance.</em>
</div><p>
With Brock defeated, I've now run out of ways to sequence-break this
game. I have the first 5 badges and have unlocked the paths to every
city in the game. This is the point at which the game played
legitimately and my sequence-broken game converge.<p>
I guess I can head south to Viridian City though...<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/070.png" width="480" height="320" alt="Screenshot"><br>
<em>Dude, I was catching Pokemon since before you were programmed.</em>
</div><p>
This old man stopped me on my way in to town to teach me how to catch
a Pokemon. Because I never talked to him before I left for Fuchsia
City at the beginning of my quest.<p>
And at this point I'm out of ideas. I guess I <em>could've</em> held
off on fighting Brock, and headed straight for the Pokemon League
and had a little battle with my rival Blue and completely kicked his
ass...<p>
My last idea is to head back to the Fuchsia City Zoo, and see that
extinct Pokemon one more time. Since I took the Kabuto fossil, I
shouldn't expect to see a Kabuto at the zoo now...<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/071.png" width="480" height="320" alt="Screenshot"><br>
<em>It's an Omanyte! What happened to Kabuto?</em>
</div><p>
Apparently they didn't like their Kabuto anymore after they saw I
took the Kabuto fossil, and they replaced him with Omanyte. :)<p>
<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/072.png" width="480" height="320" alt="Screenshot"><br>
<em>Here's my final party.</em>
</div><p>
At this point I'm done with my experiment. From this point in the
game, the plot has caught up with me and I'm no longer sequence
breaking anymore. I'm at a state in this game where I could've
gotten to the same place through legitimate means.<p>
So this is where my quest comes to an end. If anybody has any new
ideas, feel free to leave me a comment about them. :)
{% endif %}
<p>
{{ include_page("comment.partial_index",
thread="article-firered",
subject="Sequence Breaking FireRed Version",
) | safe }}
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends "layout.html" %}
{% block title %}AiChaos Warners - Flash Animations{% endblock %}
{% block content %}
<h1>AiChaos Warners</h1>
<embed src="/creativity/flash/warners.swf" width="550" height="400"
autoplay="true" loop="true" hidden="false" quality="high"><p>
&#0171; <a href="/flash">More Flash Animations</a>
{% endblock %}

37
www/flash/index.html Normal file
View File

@ -0,0 +1,37 @@
{% extends "layout.html" %}
{% block title %}Flash Animations{% endblock %}
{% block content %}
<h1>Flash Animations</h1>
I'm not much of an animator, but I have made a couple of things in Flash. Out of
the many animations I'd started working on that never got completed, here are a
few that did.<p>
<a href="/flash/kanian-azulian-war">Kanian/Azulian War</a><br>
This is probably the best animation I've ever completed. It's about a war that's
happening between the Kanians and the Azulians (two species of creature I made
up). The Kanians are ridiculously defenseless and they owe the humans a favor for
helping save their planet, and the humans are in danger at the hands of the
Azulians, who are genetically engineered killing machines. The Kanians have to
fight the Azulians to save the humans, but are they getting in way over their heads?<p>
<a href="/flash/pwnizard-i-choose-you">Pwnizard, I Choose You!</a><br>
In a sugar high one night, I started talking about a Pokemon called Pwnizard, in
which it's virtually impossible to win against it, because its mere presence in a
battle automatically ensures its victory. This is a quick Flash animation I made
using the graphics of <em>Pokemon FireRed Version</em> to illustrate. In this case,
Pwnizard has taken the form of a red Rattata, although I've always envisioned Pwnizard
looking like something useless, like Magikarp, to add to the irony of how ridiculously
powerful it is).<p>
<a href="/flash/aichaos-warners">AiChaos Warners</a><br>
From 2003 to 2005 I worked on a site called <em>AiChaos, Inc.</em> (formerly known
as <em>Chaos A.I. Technology</em>), which was a site about the programming of
Instant Messenger Chatterbots. For the bots that chatted on AOL Instant Messenger,
their main problem was AIM's warning system. Almost anybody could warn the bot plus
20% and that had a negative impact on the bot's ability to chat (a form of Denial-of-Service
attack). This is a short Flash animation I put up to give the warners a piece of
my mind.
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends "layout.html" %}
{% block title %}Kanian/Azulian War - Flash Animations{% endblock %}
{% block content %}
<h1>Kanian/Azulian War</h1>
<embed src="/creativity/flash/KanianAzuWar.swf" width="550" height="400"
autoplay="true" loop="true" hidden="false" quality="high"><p>
&#0171; <a href="/flash">More Flash Animations</a>
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends "layout.html" %}
{% block title %}Pwnizard, I Choose You! - Flash Animations{% endblock %}
{% block content %}
<h1>Pwnizard, I Choose You!</h1>
<embed src="/creativity/flash/pwnizard.swf" width="480" height="320"
autoplay="true" loop="true" hidden="false" quality="high"><p>
&#0171; <a href="/flash">More Flash Animations</a>
{% endblock %}

51
www/fonts.html Normal file
View File

@ -0,0 +1,51 @@
{% extends "layout.html" %}
{% block title %}TrueType Fonts{% endblock %}
{% block content %}
<h1>TrueType Fonts</h1>
Here are the few TTF font files I've created, in the chronological order of their
creation.
<h2>Azulian</h2>
<img src="/projects/TTF/azulian.png" width="300" height="100"><p>
This is the first font I've created. The characters were based off the original
design for the Azulian language set. I don't remember what program I created this
font in, but it sucked and I had to actually use two different programs, because
one of them wouldn't allow the final TTF file to be created. At any rate, I later
abandoned this font for a new Azulian set that looks a lot less like English.<p>
&#0164; <a href="/download?project=TTF&file=Azulian.zip">Download Azulian.ttf</a> (ZIP; 16.8 KB)
<h2>Azulian Nexus</h2>
<img src="/projects/TTF/nexus.png" width="300" height="100"><p>
This is the new font for the Azulian language. It was created in Macromedia
Fontographer 4.<p>
&#0164; <a href="/download?project=TTF&file=Nexus.zip">Download Nexus.ttf</a> (ZIP; 11.4 KB)
<h2>Rive</h2>
<img src="/projects/TTF/rive.png" width="300" height="100"><p>
The characters for this font were drawn by my friend Barry and I to use on a
website that we never got around to creating.<p>
&#0164; <a href="/download?project=TTF&file=Rive.zip">Download Rive.ttf</a> (ZIP; 13.7 KB)
<h2>Lorelei</h2>
<img src="/projects/TTF/lorelei.png" width="300" height="100"><p>
I created this font in Fontographer while developing some ideas for this story
about Lorei, the Nightmare Realm. I felt like creating a new non-English language
for it, and this font resulted from it. I think this font has considerably less
letters than are in the English alphabet and I did that on purpose.<p>
&#0164; <a href="/download?project=TTF&file=Lorelei.zip">Download Lorelei.ttf</a> (ZIP; 7.66 KB)
{% endblock %}

13
www/guestbook.html Normal file
View File

@ -0,0 +1,13 @@
{% extends "layout.html" %}
{% block title %}My Guestbook{% endblock %}
{% block content %}
<h1>My Guestbook</h1>
{{ include_page("comment.partial_index",
thread="guestbook",
subject="My Guestbook",
header=False,
) | safe }}
{% endblock %}

13
www/index.html Normal file
View File

@ -0,0 +1,13 @@
{% extends "layout.html" %}
{% block title %}Welcome!{% endblock %}
{% block content %}
<h1>Welcome!</h1>
Welcome to <a href="http://www.kirsle.net/">Kirsle.net</a>! This is the personal
website of Noah Petherbridge, and it's where my various software projects and
web blog lives.<p>
{{ include_page("blog.partial_index") | safe }}
{% endblock %}

42
www/javascript.html Normal file
View File

@ -0,0 +1,42 @@
{% extends "layout.html" %}
{% block title %}Creative JavaScripts{% endblock %}
{% block content %}
<h1>Creative JavaScripts</h1>
This page contains links to my creative JavaScript pages. This page is <b>not</b>
intended to provide cut-and-paste JavaScript code for your own personal use.
In many cases, the scripts here were specially programmed for my own purposes
and are not easily reconfigurable to suit other needs. In other words, this page
is to show off my JavaScript skills, not to provide code snippits to enable
less-than-savvy Internet users the ammunition needed to clone my scripts.
<h2>Text-Based RPG Game</h2>
This is a classic-style text-based roleplaying game programmed entirely in
JavaScript. It's known to work on Internet Explorer and Firefox. This script
uses key capturing and updates the page with all of the (relevant) keys you type
in. It even supports the Backspace key to delete the last character you typed.
I recommend opening this in a new window so that your Backspace key won't be
mistaken for the "Back" button on your browser.<p>
I created this script as part of my web design course in college. The assignment
was to "find or create a JavaScript to impress," and since it was obvious that
all the noobs would just go to cut-and-paste JavaScript sites, the best way to
come up with something totally original was to make a game out of it. And not the
lame kind of game like Tetris and Tic-Tac-Toe, which get reprogrammed far too
often in the JavaScript world, but a roleplaying game that requires a lot of
programming and attention to detail.<p>
&#0164; <a href="creativity/javascript/jsrpg.html" onClick="return openWin(this)">
View this script in action</a><p>
{% endblock %}
{% block scripts %}
<script type="text/javascript">
function openWin(obj) {
window.open (obj.href);
return false;
}
</script>
{% endblock %}

4
www/js/jquery-2.1.0.min.js vendored Normal file

File diff suppressed because one or more lines are too long

145
www/js/offsite.js Normal file
View File

@ -0,0 +1,145 @@
/*
##########################################################
# Hyperlink Editor Script || Copyright 2007 Casey Kirsle #
#--------------------------------------------------------#
# This script makes all offsite links open in a new #
# window, and turns all e-mail links in the format of #
# "name-at-domain.com" into "name@domain.com" #
#--------------------------------------------------------#
# Use content only with permission. Get permission from #
# casey "at" cuvou.org #
##########################################################
*/
var localAddr = new Array();
localAddr[0] = "kirsle.com";
localAddr[1] = "www.kirsle.com";
localAddr[2] = "kirsle.net";
localAddr[3] = "www.kirsle.net";
localAddr[4] = "kirsle.org";
localAddr[5] = "www.kirsle.org";
localAddr[6] = "epsilon.kirsle.com";
localAddr[7] = "dev.kirsle.com";
localAddr[8] = "www.dev.kirsle.com";
localAddr[9] = "local.kirsle.com";
localAddr[10] = "ds.kirsle.net";
localAddr[11] = "kirsle.noahpwns.com";
localAddr[12] = "localhost";
if (document.getElementsByTagName) {
var links = document.getElementsByTagName("a");
for (var i = 0; i < links.length; i++) {
var loc = links[i].href;
// Deobfuscate Siikir-encoded e-mail links.
if (links[i].className == "cms-email") {
// Rot13-decode everything.
var parts = links[i].href.split("to=");
email = rot13(parts[1]);
var newmail = email.split("+").join("@");
links[i].href = "mailto:" + newmail;
// If the label is an e-mail format too, do the same to it.
var lab = links[i].innerHTML;
if (lab.indexOf("+") > -1) {
lab = rot13(lab);
var newlab = lab.split("+").join("@");
links[i].innerHTML = newlab;
}
}
else {
// Continue with link formatting by protocol.
var parts = loc.split ("/"); // http, null, domain name, request
var prot = parts[0].split(":");
var protocol = prot[0];
protocol.toLowerCase;
if (protocol == "http" || protocol == "https") {
// This is an absolute URL.
var isLocal = 0;
for (var j = 0; j < localAddr.length; j++) {
if (parts[2] == localAddr[j]) {
isLocal = 1;
}
}
if (isLocal == 1) {
// Local links don't need to be modified.
}
else {
// Remote links need to open in a new window.
links[i].target = "_blank";
}
}
else if (protocol == "mailto" || protocol=="msnim" || protocol=="xmpp") {
// MailTo link. See if this isn't a normal link.
if (loc.indexOf("-at-") > -1) {
var newhref = loc.split("-at-").join("@");
links[i].href = newhref;
// Convert it in the text too.
if (links[i].innerHTML.indexOf("-at-") > -1) {
var mailLabel = links[i].innerHTML.split("-at-");
var newLabel = mailLabel.join ("@");
links[i].innerHTML = newLabel;
}
}
}
}
}
}
function sblogShowMoreTags() {
if (document.getElementById) {
document.getElementById("sblog-tags-hidden").style.display = "block";
document.getElementById("sblog-tags-hiddenlink").style.display = "none";
}
return false;
}
/*
##########################################################
# Rot13 Encoder/Decoder Functions #
##########################################################
*/
function rot13(txt) {
var result = '';
for (var i = 0; i < txt.length; i++) {
var b = txt.charCodeAt(i);
// 65 = A 97 = a
// 77 = M 109 = m
// 78 = N 110 = n
// 90 = Z 122 = z
var isLetter = 0;
if (b >= 65 && b <= 77) {
isLetter = 1;
b += 13;
}
else if (b >= 97 && b <= 109) {
isLetter = 1;
b += 13;
}
else if (b >= 78 && b <= 90) {
isLetter = 1;
b -= 13;
}
else if (b >= 110 && b <= 122) {
isLetter = 1;
b -= 13;
}
if (isLetter) {
result += String.fromCharCode(b);
}
else {
result += String.fromCharCode(b);
}
}
return result;
}

169
www/layout.html Normal file
View File

@ -0,0 +1,169 @@
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% endblock %} - Kirsle.net</title>
<link rel="stylesheet" type="text/css" media="screen" href="/solar/screen.css">
<link rel="stylesheet" type="text/css" media="print" href="/solar/print.css">
<link rel="stylesheet" type="text/css" media="all" href="/solar/vim-syntax.css">
<link rel="alternate" type="application/rss+xml" title="Kirsle's RSS Feed" href="/rss">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div class="k-supernova"></div>
<div class="k-kirsle" onClick="self.location='/'"></div>
<div class="k-content-panel">
{% with messages = get_flashed_messages() %}
{% if messages %}
<h1>Notice!</h1>
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
<div class="k-copyright">
Copyright &copy; 2014 Noah Petherbridge<br>
Powered by {{ app["name"] }} v{{ app["version"] }}<br>
Page generated in %time_elapsed%s.
</div>
</div>
<div class="k-navpanel">
<div class="k-section">Kirsle</div>
<div class="k-navi">
&#0187; <a href="/">Homepage</a> (<a href="{{ url_for('blog.rss') }}">RSS</a>)<br>
&#0187; <a href="/about">About Me</a><br>
&#0187; <a href="/photos/albums">Photo Albums</a><br>
&#0187; <a href="/guestbook">Guestbook</a><br>
&#0187; <a href="/contact">Contact Me</a>
</div>
<div class="k-section">Channels</div>
<div class="k-navi">
{{ include_page("blog.partial_tags")|safe }}
</div>
<div class="k-section">Creativity</div>
<div class="k-navi">
&#0187; <a href="/rendering">3D Renderings</a><br>
&#0187; <a href="/flash">Flash Animation</a><br>
&#0187; <a href="/javascript">JavaScript</a><br>
&#0187; <a href="/fonts">Fonts</a><br>
&#0187; <a href="/metacity">Metacity</a><br>
&#0187; <a href="/doc/">Tutorials</a>
</div>
<div class="k-section">Software</div>
<div class="k-navi">
&#0187; <a href="/rivescript">RiveScript</a><br>
&#0187; <a href="/errorgen">Error Generator</a><br>
&#0187; <a href="/tkcalc">Tk Calculator</a><br>
&#0187; <a href="http://sh.kirsle.net/" target="_blank">Terminal Apps</a><br>
&#0187; <a href="/pccc">CyanChat Client</a>
</div>
<div class="k-section">Web Tools</div>
<div class="k-navi">
&#0187; <a href="/wizards/ttf2eot.cgi">TTF to EOT</a><br>
&#0187; <a href="/wizards/fader.cgi">Text Fader</a><br>
&#0187; <a href="/wizards/favicon.cgi">Favicons</a><br>
&#0187; <a href="/wizards/distance.cgi">Distance Calc</a><br>
&#0187; <a href="/wizards/translator.html">Azulian Encoder</a><br>
&#0187; <a href="/wizards/xbmask.cgi">XBM Masks</a>
</div>
<div class="k-section">Subdomains</div>
<div class="k-navi">
&#0187; <a href="http://sh.kirsle.net/">Shell Scripts</a><br>
&#0187; <a href="http://rpm.kirsle.net/">Linux RPMs</a><br>
&#0187; <a href="http://nano.kirsle.net/">Kirsle::Nano</a><br>
&#0187; <a href="http://minecraft.kirsle.net/">Minecraft Server</a>
</div>
<div class="k-section">Miscellany</div>
<div class="k-navi">
&#0164; <a href="/firered">Pokemon Fuchsia City</a><br>
&#0164; <a href="/msdos">DOS and Windows</a><br>
&#0164; <a href="/raspberrypi">Raspberry Pi</a>
</div>
<div class="k-section">Links</div>
<div class="k-navi">
&#0164; <a href="https://www.google.com/+NoahPetherbridge">Google+</a><br>
&#0164; <a href="https://www.facebook.com/npetherbridge">Facebook</a><br>
&#0164; <a href="https://twitter.com/kirsle">Twitter</a><br>
&#0164; <a href="https://myspace.com/kirsle">MySpace</a><br>
&#0164; <a href="https://github.com/kirsle">Github</a><br>
&#0164; <a href="http://search.cpan.org/~kirsle">CPAN</a>
</div>
<div style="text-align: center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-0838718168234603";
/* Kirsle.net Nav */
google_ad_slot = "1728209841";
google_ad_width = 120;
google_ad_height = 240;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
<div class="k-section">Fan Club</div>
<div class="k-navi">
{% if session["login"] %}
&#0164; Hi, <big>{{ session["name"] }}</big><br>
{% if session["role"] == "admin" %}
&#0187; <a href="{{ url_for('admin.index') }}">Admin Center</a><br>
{% endif %}
&#0187; <a href="{{ url_for('blog.update') }}">Update Blog</a><br>
{% if "impersonator" in session %}
&#0187; <a href="{{ url_for('admin.unimpersonate') }}">Unimpersonate</a><br>
{% endif %}
&#0187; <a href="{{ url_for('account.logout') }}">Log Out</a>
{% else %}
&#0187; <a href="{{ url_for('account.login') }}">Log In</a>
{% endif %}
</div><p>
<div class="k-navi">
<div class="center">
<a href="http://validator.w3.org/check?uri=referer">
<img src="/static/images/html.png" width="88" height="31" alt="HTML 4.01 Strict">
</a><br>
<a href="http://jigsaw.w3.org/css-validator/validator?uri=http://www.kirsle.com/solar/screen.css">
<img src="/static/images/css.png" width="88" height="31" alt="CSS">
</a>
</div>
</div>
</div>
<script type="text/javascript" src="/js/jquery-2.1.0.min.js"></script>
{% block scripts %}{% endblock %}
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-27498092-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</body>
</html>

67
www/metacity.html Normal file
View File

@ -0,0 +1,67 @@
{% extends "layout.html" %}
{% block title %}Metacity Desktop Themes{% endblock %}
{% block content %}
<h1>Metacity Desktop Themes</h1>
These are some themes for the Metacity window manager on the GNOME desktop. If
you don't know what that is, then you probably aren't a Linux user, and you can
ignore the existence of this page.
<h2>RazrFX</h2>
<img src="/projects/Metacity/razr.png" width="272" height="57" alt="RazrFX"><p>
This is my first hand-drawn Metacity theme (Zune and Lunacity were derived from screenshots). The intent
was to have a thin but good-looking Metacity theme. This one adamantly keeps a 20 pixel height on the
title bar, regardless of your font size (read: use 10pt title font size or smaller).<p>
&#0164; <a href="/download?type=gpl&project=Metacity&file=Metacity-RazrFX-0.02.tar.gz">RazrFX 0.02</a>
(TAR.GZ; 46.4 KB)
<h2>Zune</h2>
<img src="/projects/Metacity/zune.png" width="274" height="68" alt="Zune"><p>
It's the Windows XP Zune theme for Metacity. There's also an XFWM4 theme for
users who use the XFCE desktop environment.<p>
&#0164; <a href="/download?project=Metacity&file=Metacity-Zune-0.02.tar.gz">Zune 0.02</a>
(TAR.GZ; 27.4 KB)
<h2>Lunacity</h2>
<img src="/projects/Metacity/Luna/blue.png" width="274" height="68" alt="Lunacity Blue"><br>
<img src="/projects/Metacity/Luna/olive.png" width="274" height="68" alt="Lunacity Olive Green"><br>
<img src="/projects/Metacity/Luna/silver.png" width="274" height="68" alt="Lunacity Silver"><br>
<img src="/projects/Metacity/Luna/pink.png" width="274" height="68" alt="Lunacity Pink"><p>
These are Metacity clones of the default Luna themes for Windows XP. Oh, and
there's also a pink version of Luna Silver.<p>
&#0164; <a href="/download?project=Metacity&file=Metacity-Lunacity-0.02.tar.gz">Lunacity 0.02</a>
(TAR.GZ; 75.5 KB)
<h1>XFWM4 Desktop Themes</h1>
These themes are for XFCE's window manager <strong>only</strong> and not Metacity.
<h2>Sun OpenSolaris Nimbus</h2>
<img src="/projects/Metacity/nimbus.png" width="308" height"80" alt="Nimbus"><p>
This is a port of the Nimbus theme from OpenSolaris to XFWM4. I didn't realize
until <em>after</em> I completed this theme that somebody else had already
done it. So, I decided to 1up that person and add the other XFWM4 window
buttons for "shade" and "stick". They look like the Nimbus buttons but are
teal and purple.<p>
Also there's a second version I made (also named Nimbus, so only install one at
a time) that shows application icons instead of the normal menu button.<p>
&#0164; <a href="/download?project=Metacity&file=XFWM4-Nimbus-0.04.tar.gz">Nimbus 0.04</a>
(TAR.GZ; 24 KB)<br>
&#0164; <a href="/download?project=Metacity&file=XFWM4-Nimbus-MenuIcon.tar.gz">Nimbus w/ App Icons</a>
(TAR.GZ; 22 KB)
{% endblock %}

56
www/msdos.html Normal file
View File

@ -0,0 +1,56 @@
{% extends "layout.html" %}
{% block title %}MS-DOS{% endblock %}
{% block content %}
<h1>MS-DOS &amp; Software</h1>
This page contains download links for a very old Microsoft operating system so
that it can be preserved -- on this corner of the Internet, anyway -- for
anyone who is curious to tinker with the first versions of Windows or who just
wants to take a trip down Nostalgia Avenue.<p>
The operating systems here are distributed as floppy disk image files (with an
.img extension). If you actually have a floppy drive, you'll have to flash
these images onto floppy disks. If you just want to use
<a href="http://www.virtualbox.org/">VirtualBox</a>, it can make use of the
floppy image files directly.<p>
<img src="/creativity/articles/doswin31_thumb.jpg">
<h2>MS-DOS 6.22</h2>
The last version of MS-DOS from the Windows 3.1 era, before Windows 95.<p>
&#0164; <a href="download?project=DOS&file=MS-DOS-6.22.zip">Download</a> (.zip, 3.5 MB)
<h2>Windows for Workgroups 3.11</h2>
The first version of Windows to support TCP/IP networking.<p>
&#0164; <a href="download?project=DOS&file=WfW-3.11.zip">Download</a> (.zip, 10.3 MB)
<h2>Hardware Drivers for VirtualBox</h2>
These are some hardware drivers for DOS and Windows 3.x that are known to work
with VirtualBox's emulated hardware. Drivers include:
<ul>
<li>CD-ROM driver</li>
<li>DOSIDLE to make MS-DOS stop consuming 100% CPU</li>
<li>WQGHLT to make Windows 3.x stop consuming 100% CPU</li>
<li>SoundBlaster 16 as a CD image (requires the CD-ROM driver)</li>
</ul>
&#0164; <a href="download?project=DOS&file=DOS-Drivers.zip">Download</a> (.zip, 4.0 MB)<p>
<h1>Comments</h1>
For tips, tricks, or to leave comments, see the relevant blog post "<a href="/blog/kirsle/ms-dos-and-windows-3-1">MS-DOS and Windows 3.1</a>". The comments on that blog post are shared to this page as well (so comments on either page show up in both places).<p>
{{ include_page("comment.partial_index",
thread="blog-42",
subject="MS-DOS",
header=False,
) | safe }}
{% endblock %}

354
www/pccc.html Normal file
View File

@ -0,0 +1,354 @@
{% extends "layout.html" %}
{% block title %}Perl CyanChat Client{% endblock %}
{% block content %}
<h1>Perl CyanChat Client</h1>
<ul>
<li><a href="#intro">Project Description</a></li>
<li><a href="#screenshots">Screenshots</a></li>
<li><a href="#license">License</a></li>
<li><a href="#downloads">Downloads</a></li>
</ul>
<a name="intro"></a>
<img src="projects/PCCC/logo.png" alt="PCCC" width="400" height="90">
<h2>Project Description</h2>
<strong>Perl CyanChat Client</strong> (PCCC) is a chat client for
<em>CyanChat</em>, the official chat room of
<a href="http://www.cyanworlds.com/">Cyan Worlds, Inc.</a>.<p>
This project is now hosted on Github:
<a href="https://github.com/kirsle/PCCC">https://github.com/kirsle/PCCC</a>
<h3>Features</h3>
Here's a brief list of some of PCCC's features:
<ul>
<li>Full support of Version 1 of the CyanChat protocol.</li>
<li>Save the conversation in XHTML format, keeping colors intact.</li>
<li>Configurable "default nickname", and the ability to automatically
sign you into the chat when you connect.</li>
<li>Configurable CC host and port, automatically connect on startup,
and reconnect when disconnected.</li>
<li>Configurable colors, both for the main window and for the chat
message and nickname colors.</li>
<li>Configurable "echo" color, so that your own nickname in chat will
show up in a different color, so you can quickly distinguish
your messages from everyone else's.</li>
<li>Clickable hyperlinks when they appear in chat.</li>
<li>Support for IRC-style "/me" actions.</li>
<li>Messages in the format <b>*...*</b> can be displayed as "/me" actions
automatically.</li>
<li>Sound effects!</li>
<li>Private message windows so you can chat privately in an
Instant Messenger style.</li>
<li>Option to ignore private messages from ChatServer (useful when
Cho goes down and you need to use the debug port)</li>
<li>Option to automatically ignore users who ignore you.</li>
<li>Option to notify you when users ignore you.</li>
<li>Option to send a "real" ignore command to the server when you
ignore a user (as opposed to a local ignore).</li>
<li>Options to reverse the orientation of the chat client, so that
new messages appear on the bottom, and the input text box
is at the bottom (like most traditional chat programs).</li>
<li>A full built-in documentation system.</li>
<li>Built-in packet viewer with the Debug Window / Console.</li>
<li>A dialog to send raw commands to the CC server.</li>
</ul>
<a name="screenshots"></a>
<h2 style="margin-top: 0px">Screenshots</h2>
<table border="0" cellspacing="0" cellpadding="0" style="margin-left: auto; margin-right: auto">
<tr>
<td align="center" valign="top">
<a href="projects/PCCC/ss07.png">
<img src="projects/PCCC/t_ss07.png" width="324" height="256" alt="Screenshot">
</a><br>
PCCC 3.0 running on Windows 7 Beta.
</td>
<td align="center" valign="top">
<a href="projects/PCCC/ss08.png">
<img src="projects/PCCC/t_ss08.png" width="324" height="256" alt="Screenshot">
</a><br>
Ignore List preferences on Windows 7 Beta.
</td>
</tr>
<tr>
<td align="center" valign="top">
&nbsp;<br>
<a href="projects/PCCC/ss06.png">
<img src="projects/PCCC/t_ss06.png" width="324" height="269" alt="Screenshot">
</a><br>
Linux: PCCC connected to a local CyanChat server,<br>
demonstrating the colors of Cyan Admins and<br>
Special Guests.
</td>
<td align="center" valign="top">
&nbsp;<br>
<a href="projects/PCCC/ss05.png">
<img src="projects/PCCC/t_ss05.png" width="324" height="240" alt="Screenshot">
</a><br>
PCCC running on Mac OS X using X Windows.<br>
<small>Screenshot credit: Amonre</small>
</td>
</tr>
<tr>
<td align="center" valign="top">
&nbsp;<br>
<a href="projects/PCCC/ss04.png">
<img src="projects/PCCC/t_ss04.png" width="324" height="270" alt="Screenshot">
</a><br>
Linux: A tab from the Preferences window.
</td>
<td align="center" valign="top">
&nbsp;<br>
<a href="projects/PCCC/ss03.png">
<img src="projects/PCCC/t_ss03.png" width="324" height="240" alt="Screenshot">
</a><br>
Linux: PCCC in action.
</td>
</tr>
<tr>
<td align="center" valign="top">
&nbsp;<br>
<a href="projects/PCCC/ss02.gif">
<img src="projects/PCCC/t_ss02.gif" width="324" height="257" alt="Screenshot">
</a><br>
Windows XP: PCCC with a couple dialog windows open.
</td>
<td align="center" valign="top">
&nbsp;<br>
<a href="projects/PCCC/ss01.gif">
<img src="projects/PCCC/t_ss01.gif" width="324" height="257" alt="Screenshot">
</a><br>
Windows XP: PCCC 2.0's main window.
</td>
</tr>
</table>
<a name="license"></a>
<h2 style="margin-top: 0px">Software License</h2>
<pre> Perl CyanChat Client
Copyright (C) 2013 Noah Petherbridge
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</pre>
<a name="downloads">
<h2 style="margin-top: 0px">Downloads</h2>
It's recommended that you download the latest version of this software
as listed below. To download older versions and source code, skip to
the next section.
<h3>Windows Executable</h3>
<blockquote>
<img src="images/dos.png" width="32" height="32" alt="Win32" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-3.0_bin.zip">
Download Perl CyanChat Client</a><br>
Version 3.0 - 2007/06/21<br>
<small>ZIP format/2.3 MB</small>
</blockquote>
<h3>Linux Binary</h3>
<blockquote>
<img src="images/exec.png" width="32" height="32" alt="Linux" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-3.0_linux.tar.gz">
Download Perl CyanChat Client</a><br>
Version 3.0 - 2007/06/21<br>
<small>TAR.GZ format/4.7 MB</small>
</blockquote>
<h2>All Distributions</h2>
The following are all the distributions available for this software,
starting with the most recent. Source code is also available for all
versions.<p>
<table border="0" cellspacing="2" cellpadding="2" class="distro">
<tr>
<th>Release</th>
<th>Windows EXE</th>
<th>Linux Binary</th>
<th>Source Code</th>
</tr>
<tr>
<td>
<b>3.0</b><br>
<small>2007/06/21</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-3.0_bin.zip">PCCC 3.0</a><br>
<small>(ZIP; 2.3 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-3.0_linux.tar.gz">PCCC 3.0</a><br>
<small>(TAR.GZ; 4.7 MB)</small>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-3.0_src.tar.gz">PCCC 3.0</a><br>
<small>(TAR.GZ; 175 KB)</small>
</tr>
<tr>
<td>
<b>2.8</b><br>
<small>2007/06/01</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-2.8_bin.zip">PCCC 2.8</a><br>
<small>(ZIP; 2.2 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-2.8_linux.tar.gz">PCCC 2.8</a><br>
<small>(TAR.GZ; 4.6 MB)</small>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.8_src.tar.gz">PCCC 2.8</a><br>
<small>(TAR.GZ; 48.7 KB)</small>
</tr>
<tr>
<td>
<b>2.7</b><br>
<small>2007/05/23</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-2.7_bin.zip">PCCC 2.7</a><br>
<small>(ZIP; 2 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-2.7_linux.tar.gz">PCCC 2.7</a><br>
<small>(TAR.GZ; 4.5 MB)</small>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.7_src.zip">PCCC 2.7</a><br>
<small>(TAR.GZ; 42 KB)</small>
</tr>
<tr>
<td>
<b>2.6</b><br>
<small>2007/04/14</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<em>Not available.</em>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.6_src.tar.gz">PCCC 2.6</a><br>
<small>(TAR.GZ; 40.7 KB)</small>
</tr>
<tr>
<td>
<b>2.3</b><br>
<small>2006/11/07</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-2.3_bin.zip">PCCC 2.3</a><br>
<small>(ZIP; 3.2 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.3_src.zip">PCCC 2.3</a><br>
<small>(ZIP; 31.2 KB)</small>
</tr>
<tr>
<td>
<b>2.1</b><br>
<small>2006/10/24</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<em>Not available.</em>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.1_src.zip">PCCC 2.1</a><br>
<small>(ZIP; 23.5 KB)</small>
</tr>
<tr>
<td>
<b>2.0</b><br>
<small>2006/10/01</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<em>Not available.</em>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.0_src.zip">PCCC 2.0</a><br>
<small>(ZIP; 21.2 KB)</small>
</tr>
<tr>
<td>
<b>1.2</b><br>
<small>2005/07/19</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-1.2_bin.zip">PCCC 1.2</a><br>
<small>(ZIP; 3.2 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-1.2_src.zip">PCCC 1.2</a><br>
<small>(ZIP; 16.2 KB)</small>
</tr>
</table>
{% endblock %}

86
www/raspberrypi.html Normal file
View File

@ -0,0 +1,86 @@
{% extends "layout.html" %}
{% block title %}Raspberry Pi{% endblock %}
{% block content %}
<h1>Raspberry Pi</h1>
This page is my personal reference/cheat sheet for Raspberry Pi
related topics.<p>
<h1>Raspbian Wheezy</h1>
<h2>Install the XFCE Desktop</h2>
To install XFCE to use it instead of the default LXDE.
<pre>$ sudo apt-get install task-xfce-desktop</pre>
<h2>XFCE for the TightVNC Server</h2>
After setting up TightVNC, you can configure it to load the XFCE desktop environment
by modifying your <code>~/.vnc/xstartup</code> file. Mine looks like this:
<pre>#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid grey
export XXL_XMODMAP_DISABLE=1
/usr/bin/xfce4-session</pre>
<ul>
<li>Use <code>vncpasswd</code> to set a password.</li>
<li>Use <code>vncserver</code> to start a VNC server (defaults to display :1
for the first server)</li>
<li>Use <code>vncserver -kill :1</code> to kill a server.
</ul>
<h2>Pi User Groups</h2>
If you add other users to the system, you'll probably want them to be members of
all the groups the pi user is part of. So...
<ul>
<li>adm</li>
<li>dialout</li>
<li>cdrom</li>
<li>sudo</li>
<li>audio</li>
<li>video</li>
<li>plugdev</li>
<li>games</li>
<li>users</li>
<li>netdev</li>
<li>input</li>
</ul>
<pre>$ sudo usermod -a -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,netdev,input <ins>kirsle</ins></pre>
<h2>Sound access for other users</h2>
If you add a second user to the system besides the default "pi" user, they don't
get access to the sound device by default - so for example, the XFCE Mixer applet
gives a gstreamer error.
To get the XFCE Mixer applet to work, make sure the gstreamer plugins are
installed.
<pre>$ sudo apt-get install gstreamer0.10-plugins</pre>
<h3>Method 1: audio user group</h3>
This is probably the preferred way. Make sure your alternate user is a member of
the <code>audio</code> group.
<h3>Method 2: Add your user to the ACL for /dev/snd</h3>
<pre>$ sudo setfacl -m u:<ins>kirsle</ins>:rw /dev/snd/*</pre>
You'll need to do this <em>before</em> starting the VNC server. If you've already
started one, shut it down and restart it.
{{ include_page("comment.partial_index",
thread="article-raspberrypi",
subject="Raspberry Pi",
) | safe }}
{% endblock %}

128
www/rendering.html Normal file
View File

@ -0,0 +1,128 @@
{% extends "layout.html" %}
{% block title %}3D Renderings{% endblock %}
{% block content %}
<h1>3D Renderings</h1>
This page contains some of my better 3D renderings. Most of these images were
modeled more or less in AutoCAD 2006 and rendered in 3DS Max 8.<p>
<table border="0" cellspacing="10" cellpadding="0">
<tr>
<td align="center" valign="top">
<a href="/creativity/rendered/kawar.jpg">
<img src="/creativity/rendered/kawar-thumb.jpg"
width="300" height="225" alt="Kanian/Azulian War">
</a><br>
Resolution: 800x600
</td>
<td align="left" valign="top">
<h2 class="top">Kanian/Azulian War</h2>
I made this in one of my high school CAD classes. It's
a 3D rendering of a scene from the Kanian/Azulian War.
</td>
</tr>
<tr>
<td align="center" valign="top">
<a href="/creativity/rendered/kanian.jpg">
<img src="/creativity/rendered/kanian-thumb.jpg"
width="300" height="225" alt="Kanians">
</a><br>
Resolution: 800x600
</td>
<td align="left" valign="top">
<h2 class="top">The Kanians</h2>
I also made this in one of my high school CAD classes.
It's just an artsy picture of the Kanians, showing the
evil, neutral, and angelic varieties.
</td>
</tr>
<tr>
<td align="center" valign="top">
<a href="/creativity/rendered/bob.jpg">
<img src="/creativity/rendered/bob-thumb.jpg"
width="300" height="225" alt="Bob-Omb Battlefield">
</a><br>
Resolution: 800x600
</td>
<td align="left" valign="top">
<h2 class="top">Bob-Omb Battlefield</h2>
This originally started out to be just a gang of shiny
Bob-Ombs. The next idea was to put them on a bright green
Mario64-style terrain, and then it was only natural to
create some of the other Mario baddies and throw them in
there. Those include the Chain Chomp and Goombas, and also
a life mushroom and a warp pipe.
</td>
</tr>
<tr>
<td align="center" valign="top">
<a href="/creativity/rendered/hotel.jpg">
<img src="/creativity/rendered/hotel-thumb.jpg"
width="300" height="225" alt="Hotel Suite">
</a><br>
Resolution: 720x540
</td>
<td align="left" valign="top">
<h2 class="top">Hotel Suite</h2>
I made this for my MITES project in my senior year CAD
class. It got me 1st place in the regional competition
and 4th in the state competition, and also a "Best of
Architectural Award" on the regional. I didn't even take
architectural CAD, which makes it that much cooler that
I got that award.
</td>
</tr>
<tr>
<td align="center" valign="top">
<a href="/creativity/rendered/battlefield.jpg">
<img src="/creativity/rendered/battlefield-thumb.jpg"
width="300" height="225" alt="Virtual Battlefield">
</a><br>
Resolution: 1024x768
</td>
<td align="left" valign="top">
<h2 class="top">Virtual Battlefield</h2>
I made this one just for fun. It's a virtual battlefield
being "materialized" into existence. You can even see some
of the wire frame in the parts that hadn't been materialized
yet. It's kinda <em>Code Lyoko</em> style.
</td>
</tr>
<tr>
<td align="center" valign="top">
<a href="/creativity/rendered/island.jpg">
<img src="/creativity/rendered/island-thumb.jpg"
width="300" height="225" alt="Island Invasion">
</a><br>
Resolution: 1024x768
</td>
<td align="left" valign="top">
<h2 class="top">Island Invasion</h2>
During my first quarter of college, I had this really lame
class called <em>Problem Solving</em>. During a particularly
slow day, I discovered the school computers had AutoCAD and
3DS Max, and I created and rendered this drawing before the
end of class that day.
</td>
</tr>
<tr>
<td align="center" valign="top">
<a href="/creativity/rendered/nupiter.jpg">
<img src="/creativity/rendered/nupiter-thumb.jpg"
width="300" height="225" alt="Sunrise on Nupiter">
</a><br>
Resolution: 1024x768
</td>
<td align="left" valign="top">
<h2 class="top">Sunrise on Nupiter</h2>
This one was actually drawn entirely in Photoshop, but it
looks like it would fit in well with these other 3D renderings.
The idea was to make a planetary kind of picture from the view
of some unknown planet. The planet itself was taken from a desert
scene (with any plant life photoshopped out).
</td>
</tr>
</table>
{% endblock %}

180
www/rivescript.html Normal file
View File

@ -0,0 +1,180 @@
{% extends "layout.html" %}
{% block title %}RiveScript{% endblock %}
{% block content %}
<h1>RiveScript</h1>
<ul>
<li><a href="#intro">Project Description</a></li>
<li><a href="#site">Project Website</a></li>
<li><a href="#history">History</a></li>
</ul>
<a name="intro"></a>
<img src="projects/RiveScript/logo.png" alt="RiveScript" width="400" height="90">
<h2>Project Description</h2>
<strong>RiveScript</strong> is a text-based scripting language for giving responses to chatterbots.
The project was started in late 2004 and tentatively named <em>AiChaos Alpha</em>. It has a simple,
easy to learn format and it could be argued that it's more powerful than AIML (Artificial Intelligence
Markup Language).<p>
In short, it's a scripting language used to match a response to a message provided by the human.<p>
In its simplest form, RiveScript code might look like this:
<pre>+ hello bot
- Hello, human!</pre>
And can get into some more complicated things like this:
<pre>+ my name is *
* &lt;get name&gt; == undefined =&gt; &lt;set name=&lt;formal&gt;&gt;Nice to meet you, &lt;get name&gt;&gt;!
* &lt;get name&gt; == &lt;formal&gt; =&gt; I know, you've told me your name before.
* &lt;get name&gt; == &lt;bot name&gt; =&gt; &lt;set name=&lt;formal&gt;&gt;Wow, we have the same name!
* &lt;get name&gt; != &lt;formal&gt; =&gt; &lt;set name=&lt;formal&gt;&gt;Did you get a name change?</pre>
<a name="site"></a>
<h2>Project Website</h2>
This project's official website is <a href="http://www.rivescript.com/">RiveScript.com</a>.
Go there to learn more, download bots and RiveScript interpreters, and join the forum.<p>
For my Perl RiveScript library, the latest version can always be downloaded from CPAN:<br>
<a href="http://search.cpan.org/perldoc?RiveScript">http://search.cpan.org/perldoc?RiveScript</a>
<a name="history"></a>
<h2>History</h2>
<h3>A Brief Introduction to Bots</h3>
In short, chatterbots are programs that communicate with humans using natural language. Often,
chatterbots will communicate with humans over a common interface, such as an instant messenger.
I got into bot programming around the years of 2000 and 2001, starting out with RunABot.com, where
many other would-be botmasters start. RunABot used AIML (Artificial Intelligence Markup Language)
as their method of programming replies for the bots.<p>
Due to RunABot's restrictions and the fact that free bot accounts would suffer anytime there was
a server problem, I found my way to the website of the <a href="http://www.alicebot.org/">ALICE A.I.
Foundation</a>, the home of AIML and the chatterbot that made it famous: Alice. I downloaded AliceBot
Program D, a Java-based AIML robot that worked on AIM and IRC. Immediately it was much more responsive
and fast than RunABot, but at a price: it had no built-in rate limit circumvention. The bot I ran from
Program D wasn't popular enough that it would violate its rate limits by sending its messages instantly
to its users, but it was a concern of mine. Also, it had no way of defending itself against the
infamous Warning system that AIM has.
<h3>Programming My Own</h3>
Due to AliceBot Program D's disregard to the worrisome aspects of the AIM protocol, and because I
wanted to have a bot for MSN Messenger, I googled for MSN bots and found my way to WiredBots.com,
where they had simple Perl bot templates for AIM and MSN bots. These templates were very simplistic
and they were only programmed to send a random quote from a text file in response to all human
messages. I also had never really dealt with Perl very much before this. I had mainly only worked
with the more simplistic languages of JavaScript and HTML.<p>
I learned a lot about Perl just by tinkering with these bot templates. After I got a good handle
on the language, I started releasing my own bot templates based on the WiredBots code, before
rewriting some of my own templates from scratch. The one thing I missed about my past bot adventures
that I couldn't get from Perl: the AIML language of Alice bots.
<h3>Alternatives to AIML</h3>
Somebody made a Perl-based Alice bot once. It was called Program V, and as of now it's impossible
to find anymore. Nobody I know could ever figure out how to make this program work, though. And its
AIML modules were difficult to port. Alice bot programs tend to be complete all-in-one bots. I only
wanted the module that parses AIML, but I couldn't separate that module from the other ones that
managed the configuration and other intricate details that don't apply to what I wanted it for.<p>
Ultimately giving up with Program V's code, and failing numerous times with XML parsers trying to
create my own, I had little other choice than to create something new. Something easier for Perl
to parse. I made a couple of my own XML-based languages, which failed. A couple other attempts later,
and I ended up with a rather simple concept: creating a text-based language driven by command characters
and lines of text. The basic idea was that the language should look like this:
<pre>+ hello bot
- Hello human!</pre>
A plus for the trigger to match against the human's message, and a minus for the bot's response.
Following that format I added a few more commands to enable it to handle conditionals, redirections,
topics, and a lot of the other cool things that AIML can do.
<h3>Chatbot::Alpha</h3>
The first incarnation of my chatterbot scripting language was called <em>AiChaos Alpha</em>,
where AiChaos was the name of my website devoted to bots and Alpha was the name of the scripting
language itself. I chose the Chatbot:: namespace because it's difficult to get a root level namespace
on <a href="http://www.cpan.org/">CPAN</a>, and because Chatbot::Eliza was looking pretty lonely there,
being the only module under the Chatbot space.<p>
After working on Chatbot::Alpha for a while, it grew to be more powerful than the simple idea that
started it, however it wasn't being programmed very efficiently. It wasn't as powerful as AIML yet,
and the logic of the program didn't allow for complicated things that would rival the &lt;that&gt; tag
from AIML.
<pre>&lt;!-- This is an example of the &lt;that&gt; tag in AIML --&gt;
&lt;category&gt;
&lt;pattern&gt;ASK ME A QUESTION&lt;/pattern&gt;
&lt;template&gt;
&lt;random&gt;
&lt;li&gt;Do you have a dog?&lt;/li&gt;
&lt;li&gt;What's your favorite color?&lt;/li&gt;
&lt;/random&gt;
&lt;/template&gt;
&lt;/category&gt;
&lt;category&gt;
&lt;pattern&gt;YES&lt;/pattern&gt;
&lt;that&gt;DO YOU HAVE A DOG&lt;/that&gt;
&lt;template&gt;
What is its name?
&lt;/template&gt;
&lt;/category&gt;</pre>
<h3>Chatbot::RiveScript</h3>
Since I programmed myself into a corner with Alpha, I changed its name to RiveScript and
started over from scratch. The syntax was still very similar, but RiveScript was rebuilt
from the ground up, this time with Alpha's limitations in mind. It wasn't very long before
RiveScript not only matched the features of AIML, but surpassed AIML in multiple areas.
After it became quite a large program, I submitted a request to CPAN to have a root-level
name space. The CPAN admins accepted my request and gave me the root-level name space
of RiveScript. And thus, the module went from being "Chatbot::RiveScript" to simply "RiveScript".
<h3>RiveScript 1.00</h3>
The module started at version 0.01 as Chatbot::RiveScript, and I wanted to make sure it
was perfect before calling it 1.00. After about a year of development, it was about as
perfect as it was going to get. I released the 1.00 version. Years went by before new bugs
were reported, and it eventually went to 1.02 and stayed there. The chatterbot scene was
drying up by now. The once lively forum of <a href="http://www.bot-depot.com/">Bot-Depot</a>
was losing all its best members. Nobody was actively developing bots anymore, and all that
was left were the occasional newbies asking questions that nobody might answer.<p>
Thus, I lost interest in furthering the development of RiveScript. That was in 2005. Now,
three years later, somebody in a different forum posted a thread about wanting to learn
Perl. I asked why (for CGI or for offline programming) so I could link him to the appropriate
tutorial, and he said he wanted to learn it because he heard he could program bots with it.
That inspired me to dust off the old RiveScript module and fix it up.<p>
<h3>RiveScript 2.00</h3>
So, I registered the domain name <a href="http://www.rivescript.com/">RiveScript.com</a>,
which is now the "RiveScript Headquarters". I decided I would also come up with a new standard
for RiveScript. Learning from the limitations of the old version and how it relied on Perl
so much, the new standard was written with multiple implementations in mind. I published
a "RiveScript 2.00 Working Draft", a document describing the standards of the RiveScript
language from an implementation-agnostic point of view. It describes how RiveScript itself
should work -- it's up to the programmer to implement it. The new standards raised the bar
over what the old language was capable of, and I began development of a new RiveScript
module to meet these new standards.<p>
Development of a RiveScript 2.00-compliant module is still in development, but it's getting
close to completion. I'm trying to learn C++ with the goal of eventually making a RiveScript
interpreter in that, which could be compiled into a DLL or Shared Object that other programs
could utilize, or provide the source code to allow it to be directly compiled in with other
programs.
{% endblock %}

BIN
www/solar/kirsle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
www/solar/navbody.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
www/solar/navfoot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

BIN
www/solar/navtop.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
www/solar/panelbg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

235
www/solar/print.css Normal file
View File

@ -0,0 +1,235 @@
body {
background-color: #FFFFFF;
font-family: Verdana,Arial,Helvetica,sans-serif;
font-size: small;
color: #000000;
margin: 0px;
padding: 0px
}
a:link, a:visited {
color: #0000FF;
text-decoration: underline
}
a:hover, a:active {
color: #0000FF
}
a img {
border: 0px
}
h1,h2,h3,h4 {
font-family: "Trebuchet MS",Arial,Helvetica,sans-serif;
margin: 0px;
padding-top: 10px;
padding-bottom: 10px;
font-weight: bold
}
h1 {
font-size: 32pt;
padding-top: 15px;
padding-bottom: 15px;
}
h1:first-of-type {
padding-top: 0px;
}
h2 {
font-size: 24pt
}
h3 {
font-size: 18pt
}
h4 {
font-size: 16pt
}
pre,code {
font-family: "Lucida Console","DejaVu LGC Sans Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
font-size: 9pt;
color: #000000
}
pre {
display: block;
border: 1px dashed #000000;
padding: 10px;
margin-left: 5px;
margin-right: 5px;
margin-top: 10px;
margin-bottom: 10px;
overflow-x: auto
}
code {
display: inline
}
label {
cursor: pointer
}
legend {
color: #000000;
font-weight: bold
}
table,th,td {
border-color: #999999
}
table.box {
border: 1px solid #999999
}
/*******************************************************************************
* General CSS Classes *
******************************************************************************/
.center {
margin: auto;
text-align: center
}
.right {
margin-left: auto;
margin-right: 0px;
text-align: right
}
.invisible {
display: none
}
/*******************************************************************************
* Styles Needed by Specific Pages in the CMS *
******************************************************************************/
/* Downloads */
.distro {
border: 1px solid #CCCCCC
}
.distro th {
width: 150px;
text-align: center;
vertical-align: top
}
.distro td {
width: 150px;
text-align: center;
vertical-align: top;
border: 1px solid #808080
}
.distro td img {
float: left
}
/********
* Blog *
*******/
/* Blog titles when shown on index view */
a.blog-title-index:link, a.blog-title-index:visited {
font-family: "Trebuchet MS",Verdana,Arial,sans-serif;
font-size: 32pt;
font-weight: bold;
color: #FFFFFF;
text-decoration: none
}
a.blog-title-index:hover, a.blog-title-index:active {
text-decoration: underline
}
/* Poster's avatar box */
.blog-author, .comment-author {
float: right;
background-color: #444444;
border: 1px solid #CCCCCC;
padding: 2px;
margin-left: 10px;
margin-bottom: 10px;
width: 100px; /* 96 avatar width + 4px padding */
text-align: center;
font-weight: bold
}
/* Timestamp and author line below blog titles */
.blog-timestamp {
font-size: smaller;
font-style: italic;
padding-left: 30px;
padding-top: 5px;
padding-bottom: 10px
}
ul.blog-categories {
list-style: none;
display: inline;
margin: 0;
padding: 0;
}
ul.blog-categories li {
display: inline;
}
ul.blog-categories li:after {
content: ", ";
}
ul.blog-categories li:last-child:after {
content: "";
}
/* Blog comment wrapper */
.comment {
border: 1px dashed #006699;
padding: 5px
}
/*******************************************************************************
* Supernova Website Design Classes - Copyright 2009 Casey Kirsle - Kirsle.com *
******************************************************************************/
/*************
* Eye Candy *
************/
.k-supernova {
/* Main BG image */
display: none
}
.k-kirsle {
/* Kirsle logo */
display: none
}
/********************
* Navigation Panel *
*******************/
.k-navpanel {
/* Wrapper for nav bar */
display: none
}
.k-section {
/* Division of navigation bar */
}
.k-navi {
/* Stretches of hyperlinks inside the nav bar */
}
/* Hyperlinks inside the nav bar */
.k-navi a:link, .k-navi a:visited {
}
/*********************
* Main Content Area *
********************/
.k-content-panel {
/* Wrapper for the content panel */
display: inline;
margin-left: 25px;
margin-right: 25px
}
.k-copyright {
/* Copyright text */
text-align: center;
font-size: x-small;
color: #000000;
font-weight: bold;
padding: 20px 0px
}
.k-space {
background-image: url("space.png");
background-repeat: repeat;
background-position: 0px 0px;
height: 50px
}

460
www/solar/screen.css Normal file
View File

@ -0,0 +1,460 @@
body {
background-color: #000000;
background-image: url("space.png");
background-repeat: repeat;
background-position: 0px 0px;
background-attachment: fixed;
font-family: Verdana,Arial,Helvetica,sans-serif;
font-size: small;
color: #BEBEBE;
margin: 0px;
padding: 0px
}
a:link, a:visited {
color: #99CCFF;
text-decoration: underline
}
a:hover, a:active {
color: #FFCCFF
}
a img {
border: 0px
}
h1,h2,h3,h4 {
font-family: "Trebuchet MS",Arial,Helvetica,sans-serif;
margin: 0px;
padding-top: 10px;
padding-bottom: 10px;
font-weight: bold;
color: #FFFFFF;
text-shadow: 0px 0px 10px #0099FF;
-moz-text-shadow: 0px 0px 10px #0099FF;
-webkit-text-shadow: 0px 0px 10px #0099FF
}
h1 {
font-size: 32pt;
padding-top: 15px;
padding-bottom: 15px;
}
h1:first-of-type {
padding-top: 0px;
}
h2 {
font-size: 24pt
}
h3 {
font-size: 18pt
}
h4 {
font-size: 16pt
}
pre,code {
font-family: "Lucida Console","DejaVu LGC Sans Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
font-size: 9pt;
color: #00CCCC
}
pre {
display: block;
border: 1px dashed #CCCCCC;
padding: 10px;
margin-left: 5px;
margin-right: 5px;
margin-top: 10px;
margin-bottom: 10px;
overflow-x: auto
}
code {
display: inline
}
label {
cursor: pointer
}
fieldset {
border: 1px solid #006699;
}
legend {
color: #0099FF;
font-weight: bold
}
table.box {
border: 1px solid #999999
}
input[type="text"],
input[type="password"],
input[type="number"],
input[type="email"],
textarea,
input[type="file"],
select { /* To hell with IE */
background-color: #000000;
font-family: Verdana,Arial,Helvetica,sans-serif;
font-size: small;
color: #CCCCCC;
border-top: 1px solid #666666;
border-left: 1px solid #666666;
border-right: 1px solid #CCCCCC;
border-bottom: 1px solid #CCCCCC
}
acronym,abbr {
border-bottom: 1px dotted #BEBEBE;
cursor: help;
}
/*******************************************************************************
* General CSS Classes *
******************************************************************************/
.center {
margin: auto;
text-align: center
}
.right {
margin-left: auto;
margin-right: 0px;
text-align: right
}
.invisible {
display: none
}
.clear {
clear: both;
}
table.table,
table.table th,
table.table td {
border: 1px solid #999999;
}
table.table {
border-collapse: collapse;
border-spacing: 0;
margin: 0px;
padding: 0px;
}
table.table-wide {
width: 100%;
}
table.table th {
background-color: #003366;
color: #FFFFFF;
text-align: left;
padding: 4px;
}
table.table tr:nth-child(even) {
background-color: #000000;
}
table.table tr:nth-child(odd) {
background-color: #202020;
}
table.table td {
padding: 4px;
}
/*******************************************************************************
* Styles Needed by Specific Pages in the CMS *
******************************************************************************/
/* Downloads */
.distro {
border: 1px solid #CCCCCC
}
.distro th {
width: 150px;
text-align: center;
vertical-align: top
}
.distro td {
width: 150px;
text-align: center;
vertical-align: top;
border: 1px solid #808080
}
.distro td img {
float: left
}
/**********
* Photos *
**********/
/* Photo Grids: see http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */
ul.photo-grid {
list-style: none;
display: inline;
margin: 0;
padding: 0;
position: relative;
}
ul.photo-grid li {
position: relative;
/*float: left;*/
display: inline-block;
width: 260px;
height: 260px;
margin-left: 20px;
margin-top: 20px;
}
ul.photo-grid li .dummy {
padding-top: 100%;
}
.photo-grid-item {
cursor: pointer;
overflow: hidden; /* Crop off long names, etc. */
/* We use absolute positioning to detach this element from the flow, */
/* allowing the .dummy to dictate the height of the square. */
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.photo-grid-item img {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.photo-grid-item .name {
position: absolute;
top: 4px;
left: 4px;
right: 4px;
font-family: Arial,Helvetica,sans-serif;
font-size: 14pt;
font-weight: bold;
color: #FFFFFF;
text-align: left;
text-shadow: 1px 1px 0px #000000,
-1px -1px 0px #000000,
1px -1px 0px #000000,
-1px 1px 0px #000000;
}
/*ul#arrange-photos {
list-style-type: none;
margin: 0px;
padding: 0px;
}
ul#arrange-photos li {
cursor: pointer;
margin: 20px;
padding: 1px;
float: left;
width: 150px;
}*/
/********
* Blog *
*******/
/* Blog titles when shown on index view */
a.blog-title-index:link, a.blog-title-index:visited {
font-family: "Trebuchet MS",Verdana,Arial,sans-serif;
font-size: 32pt;
font-weight: bold;
color: #FFFFFF;
text-decoration: none;
text-shadow: 0px 0px 10px #0099FF;
-moz-text-shadow: 0px 0px 10px #0099FF;
-webkit-text-shadow: 0px 0px 10px #0099FF
}
a.blog-title-index:hover, a.blog-title-index:active {
text-decoration: underline;
text-shadow: 0px 0px 10px #FF99FF;
-moz-text-shadow: 0px 0px 10px #FF99FF;
-webkit-text-shadow: 0px 0px 10px #FF99FF
}
/* Poster's avatar box */
.blog-author, .comment-author {
float: right;
background-color: #444444;
border: 1px solid #CCCCCC;
padding: 2px;
margin-left: 10px;
margin-bottom: 10px;
width: 100px; /* 96 avatar width + 4px padding */
text-align: center;
font-weight: bold
}
.blog-author a, .comment-author a {
text-decoration: none;
}
div.siikir-avatar {
width: 96px;
margin: auto;
}
/* Timestamp and author line below blog titles */
.blog-timestamp {
font-size: smaller;
font-style: italic;
padding-left: 30px;
padding-top: 5px;
padding-bottom: 10px
}
ul.blog-categories {
list-style: none;
display: inline;
margin: 0;
padding: 0;
}
ul.blog-categories li {
display: inline;
}
ul.blog-categories li:after {
content: ", ";
}
ul.blog-categories li:last-child:after {
content: "";
}
/* Blog comment wrapper */
.comment {
border: 1px dashed #006699;
padding: 5px
}
/*******************************************************************************
* Supernova Website Design Classes - Copyright 2009 Casey Kirsle - Kirsle.com *
******************************************************************************/
/* Make a photo look nice. */
.portrait {
display: inline;
background-color: #CFCFCF;
padding: 4px;
border: 1px solid #000000;
box-shadow: 0px 0px 4px #0099FF;
-moz-box-shadow: 0px 0px 4px #0099FF;
-webkit-box-shadow: 0px 0px 4px #0099FF;
}
/*************
* Eye Candy *
************/
.k-supernova {
/* Main BG image */
position: fixed;
z-index: 100;
top: 0px;
left: 0px;
width: 960px;
height: 1000px;
background-image: url("supernova.jpg");
background-repeat: no-repeat;
background-position: 0px 0px
}
.k-kirsle {
/* Kirsle logo */
position: absolute;
z-index: 150;
top: 9px;
left: 433px;
width: 317px;
height: 177px;
background-image: url("kirsle.png");
background-repeat: no-repeat;
background-position: 0px 0px;
cursor: pointer
}
/********************
* Navigation Panel *
*******************/
.k-navpanel {
/* Wrapper for nav bar */
background-image: url("panelbg.png");
background-repeat: repeat-y;
background-position: 0px 0px;
position: absolute;
z-index: 200;
top: 203px;
left: 57px;
width: 152px;
border: 2px ridge #0099FF;
border-radius: 10px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px
}
.k-section {
/* Division of navigation bar */
display: block;
font-family: "Trebuchet MS",Arial,Helvetica,sans-serif;
font-size: 14pt;
font-weight: bold;
text-align: center;
color: #FFFFFF;
border-bottom: 1px solid #FFFFFF;
margin-left: 2px;
margin-right: 2px;
padding: 0px;
text-shadow: 0px 0px 10px #0099FF;
-moz-text-shadow: 0px 0px 10px #0099FF;
-webkit-text-shadow: 0px 0px 10px #0099FF
}
.k-navi {
/* Stretches of hyperlinks inside the nav bar */
padding-left: 4px;
padding-right: 4px;
font-size: x-small;
line-height: 160%
}
/* Hyperlinks inside the nav bar */
.k-navi a:link, .k-navi a:visited {
font-size: x-small;
font-weight: bold
}
/*********************
* Main Content Area *
********************/
.k-content-panel {
/* Wrapper for the content panel */
background-image: url("panelbg.png");
background-repeat: repeat;
background-position: 0px 0px;
z-index: 300;
position: absolute;
top: 203px;
left: 262px;
right: 40px;
padding: 6px;
border: 2px ridge #0099FF;
border-radius: 10px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px
}
.k-copyright {
/* Copyright text */
text-align: center;
font-size: x-small;
color: #999999;
font-weight: bold;
padding: 20px 0px
}
.k-space {
background-image: url("space.png");
background-repeat: repeat;
background-position: 0px 0px;
height: 50px
}

BIN
www/solar/space.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
www/solar/supernova.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

29
www/solar/vim-syntax.css Normal file
View File

@ -0,0 +1,29 @@
/* CSS classes used by vim syntax highlighting */
pre.vim {
background-color: #000000;
color: #FFFFFF;
max-height: 450px;
overflow: auto;
}
pre.vim span.Identifier {
color: #00FFFF;
font-weight: bold;
}
pre.vim span.Constant {
color: #FF99FF;
font-weight: bold;
}
pre.vim span.Statement {
color: #FFFF00;
font-weight: bold;
}
pre.vim span.Comment {
color: #0099FF;
font-weight: bold;
}
pre.vim span.PreProc {
color: #8080FF;
font-weight: bold;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

BIN
www/static/avatars/gnu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
www/static/avatars/java.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

BIN
www/static/avatars/tk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
www/static/icons/aim.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

BIN
www/static/icons/email.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
www/static/icons/icq.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
www/static/icons/msn.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
www/static/icons/skype.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
www/static/icons/www.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 977 B

BIN
www/static/icons/xmpp.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
www/static/icons/yahoo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

BIN
www/static/images/css.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
www/static/images/html.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

0
www/static/photos/.dummy Normal file
View File

154
www/tkcalc.html Normal file
View File

@ -0,0 +1,154 @@
{% extends "layout.html" %}
{% block title %}TkCalc{% endblock %}
{% block content %}
<h1>Tk Calculator</h1>
<ul>
<li><a href="#intro">Project Description</a></li>
<li><a href="#screenshots">Screenshots</a></li>
<li><a href="#license">License</a></li>
<li><a href="#downloads">Downloads</a></li>
</ul>
<a name="intro"></a>
<img src="projects/tkcalc/logo.png" alt="tkcalc" width="400" height="90">
<h2>Project Description</h2>
The <strong>Perl/Tk Calculator</strong> is a simple graphical calculator
program I wrote in Perl using the Tk GUI toolkit, hence its name. That's
about as creative as it gets.<p>
The calculator performs a lot of mathematical functions, and can even
plot graphs and then tell you all the points that it plotted on said
graph.
<h3>Features</h3>
<ul>
<li>Performs math functions.</li>
<li>Unlike the Windows calculator, you can enter full equations
in this and they're displayed on-screen at all times.</li>
<li>Buttons can be clicked to insert math operators, or you can
type them yourself with the keyboard.</li>
<li>Generate graphs of functions and display it, and return all
the points that it plotted on the graph.</li>
</ul>
<a name="screenshots"></a>
<h2 style="margin-top: 0px">Screenshots</h2>
<table border="0" cellspacing="0" cellpadding="0" style="margin-left: auto; margin-right: auto">
<tr>
<td align="center" valign="top">
<img src="projects/tkcalc/ss01.jpg" width="616" height="434" alt="Screenshot"><br>
tkcalc in action, showing two of the program's tabs.
</td>
</tr>
</table>
<a name="license"></a>
<h2 style="margin-top: 0px">Software License</h2>
<pre> Perl/Tk Calculator
Copyright (C) 2008 Casey Kirsle
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</pre>
<a name="downloads"></a>
<h2 style="margin-top: 0px">Downloads</h2>
It's recommended that you download the latest version of this software
as listed below. To download older versions and source code, skip to
the next section.
<h3>Windows Executable</h3>
<blockquote>
<img src="images/dos.png" width="32" height="32" alt="Win32" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=tkcalc&amp;file=tkcalc-1.1_bin.zip">
Download Tk Calculator</a><br>
Version 1.1 - 2006/12/18<br>
<small>ZIP format/3.5 MB</small>
</blockquote>
<h3>Linux Binary</h3>
<blockquote>
<img src="images/exec.png" width="32" height="32" alt="Linux" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=tkcalc&amp;file=tkcalc-1.1_linux.tar.gz">
Download Tk Calculator</a><br>
Version 1.1 - 2006/12/18<br>
<small>TAR.GZ format/4.4 MB</small>
</blockquote>
<h2>All Distributions</h2>
The following are all the distributions available for this software,
starting with the most recent. Source code is also available for all
versions.<p>
<table border="0" cellspacing="2" cellpadding="2" class="distro">
<tr>
<th>Release</th>
<th>Windows EXE</th>
<th>Linux Binary</th>
<th>Source Code</th>
</tr>
<tr>
<td>
<b>1.1</b><br>
<small>2006/12/18</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=tkcalc&amp;file=tkcalc-1.1_bin.zip">tkcalc 1.1</a><br>
<small>(ZIP; 3.5 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<a href="/download?type=bin&amp;project=tkcalc&amp;file=tkcalc-1.1_linux.tar.gz">tkcalc 1.1</a><br>
<small>(TAR.GZ; 4.4 MB)</small>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=tkcalc&amp;file=tkcalc-1.1_src.zip">tkcalc 1.1</a><br>
<small>(ZIP; 6.0 KB)</small>
</tr>
<tr>
<td>
<b>1.0</b><br>
<small>2006/12/05</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=tkcalc&amp;file=tkcalc-1.0_bin.zip">tkcalc 1.0</a><br>
<small>(ZIP; 3.5 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=tkcalc&amp;file=tkcalc-1.0_src.zip">tkcalc 1.0</a><br>
<small>(ZIP; 6.0 KB)</small>
</tr>
</table>
{% endblock %}