Initial commit
5
README.md
Normal 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
|
@ -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
|
@ -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
|
@ -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
|
@ -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&project=ZenMsg&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&project=ErrorGen&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&project=ErrorGen&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&project=ErrorGen&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&project=ErrorGen&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&project=ErrorGen&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&project=ZenMsg&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&project=ZenMsg&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
|
@ -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♀,
|
||||||
|
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>> 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>> 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>> 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 %}
|
12
www/flash/aichaos-warners.html
Normal 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>
|
||||||
|
|
||||||
|
« <a href="/flash">More Flash Animations</a>
|
||||||
|
|
||||||
|
{% endblock %}
|
37
www/flash/index.html
Normal 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 %}
|
12
www/flash/kanian-azulian-war.html
Normal 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>
|
||||||
|
|
||||||
|
« <a href="/flash">More Flash Animations</a>
|
||||||
|
|
||||||
|
{% endblock %}
|
12
www/flash/pwnizard-i-choose-you.html
Normal 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>
|
||||||
|
|
||||||
|
« <a href="/flash">More Flash Animations</a>
|
||||||
|
|
||||||
|
{% endblock %}
|
51
www/fonts.html
Normal 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>
|
||||||
|
|
||||||
|
¤ <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>
|
||||||
|
|
||||||
|
¤ <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>
|
||||||
|
|
||||||
|
¤ <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>
|
||||||
|
|
||||||
|
¤ <a href="/download?project=TTF&file=Lorelei.zip">Download Lorelei.ttf</a> (ZIP; 7.66 KB)
|
||||||
|
|
||||||
|
{% endblock %}
|
13
www/guestbook.html
Normal 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
|
@ -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
|
@ -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>
|
||||||
|
|
||||||
|
¤ <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
145
www/js/offsite.js
Normal 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
|
@ -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 © 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">
|
||||||
|
» <a href="/">Homepage</a> (<a href="{{ url_for('blog.rss') }}">RSS</a>)<br>
|
||||||
|
» <a href="/about">About Me</a><br>
|
||||||
|
» <a href="/photos/albums">Photo Albums</a><br>
|
||||||
|
» <a href="/guestbook">Guestbook</a><br>
|
||||||
|
» <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">
|
||||||
|
» <a href="/rendering">3D Renderings</a><br>
|
||||||
|
» <a href="/flash">Flash Animation</a><br>
|
||||||
|
» <a href="/javascript">JavaScript</a><br>
|
||||||
|
» <a href="/fonts">Fonts</a><br>
|
||||||
|
» <a href="/metacity">Metacity</a><br>
|
||||||
|
» <a href="/doc/">Tutorials</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="k-section">Software</div>
|
||||||
|
<div class="k-navi">
|
||||||
|
» <a href="/rivescript">RiveScript</a><br>
|
||||||
|
» <a href="/errorgen">Error Generator</a><br>
|
||||||
|
» <a href="/tkcalc">Tk Calculator</a><br>
|
||||||
|
» <a href="http://sh.kirsle.net/" target="_blank">Terminal Apps</a><br>
|
||||||
|
» <a href="/pccc">CyanChat Client</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="k-section">Web Tools</div>
|
||||||
|
<div class="k-navi">
|
||||||
|
» <a href="/wizards/ttf2eot.cgi">TTF to EOT</a><br>
|
||||||
|
» <a href="/wizards/fader.cgi">Text Fader</a><br>
|
||||||
|
» <a href="/wizards/favicon.cgi">Favicons</a><br>
|
||||||
|
» <a href="/wizards/distance.cgi">Distance Calc</a><br>
|
||||||
|
» <a href="/wizards/translator.html">Azulian Encoder</a><br>
|
||||||
|
» <a href="/wizards/xbmask.cgi">XBM Masks</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="k-section">Subdomains</div>
|
||||||
|
<div class="k-navi">
|
||||||
|
» <a href="http://sh.kirsle.net/">Shell Scripts</a><br>
|
||||||
|
» <a href="http://rpm.kirsle.net/">Linux RPMs</a><br>
|
||||||
|
» <a href="http://nano.kirsle.net/">Kirsle::Nano</a><br>
|
||||||
|
» <a href="http://minecraft.kirsle.net/">Minecraft Server</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="k-section">Miscellany</div>
|
||||||
|
<div class="k-navi">
|
||||||
|
¤ <a href="/firered">Pokemon Fuchsia City</a><br>
|
||||||
|
¤ <a href="/msdos">DOS and Windows</a><br>
|
||||||
|
¤ <a href="/raspberrypi">Raspberry Pi</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="k-section">Links</div>
|
||||||
|
<div class="k-navi">
|
||||||
|
¤ <a href="https://www.google.com/+NoahPetherbridge">Google+</a><br>
|
||||||
|
¤ <a href="https://www.facebook.com/npetherbridge">Facebook</a><br>
|
||||||
|
¤ <a href="https://twitter.com/kirsle">Twitter</a><br>
|
||||||
|
¤ <a href="https://myspace.com/kirsle">MySpace</a><br>
|
||||||
|
¤ <a href="https://github.com/kirsle">Github</a><br>
|
||||||
|
¤ <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"] %}
|
||||||
|
¤ Hi, <big>{{ session["name"] }}</big><br>
|
||||||
|
{% if session["role"] == "admin" %}
|
||||||
|
» <a href="{{ url_for('admin.index') }}">Admin Center</a><br>
|
||||||
|
{% endif %}
|
||||||
|
» <a href="{{ url_for('blog.update') }}">Update Blog</a><br>
|
||||||
|
{% if "impersonator" in session %}
|
||||||
|
» <a href="{{ url_for('admin.unimpersonate') }}">Unimpersonate</a><br>
|
||||||
|
{% endif %}
|
||||||
|
» <a href="{{ url_for('account.logout') }}">Log Out</a>
|
||||||
|
{% else %}
|
||||||
|
» <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
|
@ -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>
|
||||||
|
|
||||||
|
¤ <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>
|
||||||
|
|
||||||
|
¤ <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>
|
||||||
|
|
||||||
|
¤ <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>
|
||||||
|
|
||||||
|
¤ <a href="/download?project=Metacity&file=XFWM4-Nimbus-0.04.tar.gz">Nimbus 0.04</a>
|
||||||
|
(TAR.GZ; 24 KB)<br>
|
||||||
|
¤ <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
|
@ -0,0 +1,56 @@
|
||||||
|
{% extends "layout.html" %}
|
||||||
|
{% block title %}MS-DOS{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<h1>MS-DOS & 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>
|
||||||
|
|
||||||
|
¤ <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>
|
||||||
|
|
||||||
|
¤ <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>
|
||||||
|
|
||||||
|
¤ <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
|
@ -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">
|
||||||
|
<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">
|
||||||
|
|
||||||
|
<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">
|
||||||
|
<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">
|
||||||
|
|
||||||
|
<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">
|
||||||
|
|
||||||
|
<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">
|
||||||
|
<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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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&project=PCCC&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
|
@ -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
|
@ -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
|
@ -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 *
|
||||||
|
* <get name> == undefined => <set name=<formal>>Nice to meet you, <get name>>!
|
||||||
|
* <get name> == <formal> => I know, you've told me your name before.
|
||||||
|
* <get name> == <bot name> => <set name=<formal>>Wow, we have the same name!
|
||||||
|
* <get name> != <formal> => <set name=<formal>>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 <that> tag
|
||||||
|
from AIML.
|
||||||
|
|
||||||
|
<pre><!-- This is an example of the <that> tag in AIML -->
|
||||||
|
|
||||||
|
<category>
|
||||||
|
<pattern>ASK ME A QUESTION</pattern>
|
||||||
|
<template>
|
||||||
|
<random>
|
||||||
|
<li>Do you have a dog?</li>
|
||||||
|
<li>What's your favorite color?</li>
|
||||||
|
|
||||||
|
</random>
|
||||||
|
</template>
|
||||||
|
</category>
|
||||||
|
|
||||||
|
<category>
|
||||||
|
<pattern>YES</pattern>
|
||||||
|
<that>DO YOU HAVE A DOG</that>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
What is its name?
|
||||||
|
</template>
|
||||||
|
</category></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
After Width: | Height: | Size: 70 KiB |
BIN
www/solar/navbody.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
www/solar/navfoot.png
Normal file
After Width: | Height: | Size: 501 B |
BIN
www/solar/navtop.png
Normal file
After Width: | Height: | Size: 6.5 KiB |
BIN
www/solar/panelbg.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
235
www/solar/print.css
Normal 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
|
@ -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
After Width: | Height: | Size: 3.7 KiB |
BIN
www/solar/supernova.jpg
Normal file
After Width: | Height: | Size: 262 KiB |
29
www/solar/vim-syntax.css
Normal 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;
|
||||||
|
}
|
BIN
www/static/avatars/RiveScript-Hazard-Labeled.png
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
www/static/avatars/RiveScript-Hazard.png
Normal file
After Width: | Height: | Size: 9.8 KiB |
BIN
www/static/avatars/casey.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
www/static/avatars/darklink.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
www/static/avatars/gnu.png
Normal file
After Width: | Height: | Size: 9.6 KiB |
BIN
www/static/avatars/java.png
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
www/static/avatars/rivescript.png
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
www/static/avatars/siikir-avatar.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
www/static/avatars/tk.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
www/static/avatars/user_guest.png
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
www/static/avatars/user_kirsle.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
www/static/icons/aim.gif
Normal file
After Width: | Height: | Size: 138 B |
BIN
www/static/icons/email.gif
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
www/static/icons/icq.gif
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
www/static/icons/msn.gif
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
www/static/icons/skype.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
www/static/icons/www.gif
Normal file
After Width: | Height: | Size: 977 B |
BIN
www/static/icons/xmpp.gif
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
www/static/icons/yahoo.gif
Normal file
After Width: | Height: | Size: 873 B |
BIN
www/static/images/css.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
www/static/images/html.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
0
www/static/photos/.dummy
Normal file
154
www/tkcalc.html
Normal 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&project=tkcalc&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&project=tkcalc&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&project=tkcalc&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&project=tkcalc&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&project=tkcalc&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&project=tkcalc&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&project=tkcalc&file=tkcalc-1.0_src.zip">tkcalc 1.0</a><br>
|
||||||
|
<small>(ZIP; 6.0 KB)</small>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
{% endblock %}
|