Browse Source

Initial commit

pull/2/head
Noah Petherbridge 6 years ago
commit
f35ec3ea62
56 changed files with 3214 additions and 0 deletions
  1. +5
    -0
      README.md
  2. +27
    -0
      www/about.html
  3. +82
    -0
      www/contact/index.html
  4. +44
    -0
      www/download.html
  5. +192
    -0
      www/errorgen.html
  6. +605
    -0
      www/firered.html
  7. +12
    -0
      www/flash/aichaos-warners.html
  8. +37
    -0
      www/flash/index.html
  9. +12
    -0
      www/flash/kanian-azulian-war.html
  10. +12
    -0
      www/flash/pwnizard-i-choose-you.html
  11. +51
    -0
      www/fonts.html
  12. +13
    -0
      www/guestbook.html
  13. +13
    -0
      www/index.html
  14. +42
    -0
      www/javascript.html
  15. +4
    -0
      www/js/jquery-2.1.0.min.js
  16. +145
    -0
      www/js/offsite.js
  17. +169
    -0
      www/layout.html
  18. +67
    -0
      www/metacity.html
  19. +56
    -0
      www/msdos.html
  20. +354
    -0
      www/pccc.html
  21. +86
    -0
      www/raspberrypi.html
  22. +128
    -0
      www/rendering.html
  23. +180
    -0
      www/rivescript.html
  24. BIN
      www/solar/kirsle.png
  25. BIN
      www/solar/navbody.png
  26. BIN
      www/solar/navfoot.png
  27. BIN
      www/solar/navtop.png
  28. BIN
      www/solar/panelbg.png
  29. +235
    -0
      www/solar/print.css
  30. +460
    -0
      www/solar/screen.css
  31. BIN
      www/solar/space.png
  32. BIN
      www/solar/supernova.jpg
  33. +29
    -0
      www/solar/vim-syntax.css
  34. BIN
      www/static/avatars/RiveScript-Hazard-Labeled.png
  35. BIN
      www/static/avatars/RiveScript-Hazard.png
  36. BIN
      www/static/avatars/casey.png
  37. BIN
      www/static/avatars/darklink.png
  38. BIN
      www/static/avatars/gnu.png
  39. BIN
      www/static/avatars/java.png
  40. BIN
      www/static/avatars/rivescript.png
  41. BIN
      www/static/avatars/siikir-avatar.png
  42. BIN
      www/static/avatars/tk.png
  43. BIN
      www/static/avatars/user_guest.png
  44. BIN
      www/static/avatars/user_kirsle.png
  45. BIN
      www/static/icons/aim.gif
  46. BIN
      www/static/icons/email.gif
  47. BIN
      www/static/icons/icq.gif
  48. BIN
      www/static/icons/msn.gif
  49. BIN
      www/static/icons/skype.png
  50. BIN
      www/static/icons/www.gif
  51. BIN
      www/static/icons/xmpp.gif
  52. BIN
      www/static/icons/yahoo.gif
  53. BIN
      www/static/images/css.png
  54. BIN
      www/static/images/html.png
  55. +0
    -0
      www/static/photos/.dummy
  56. +154
    -0
      www/tkcalc.html

+ 5
- 0
README.md View File

@@ -0,0 +1,5 @@
# Kirsle.net

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

+ 27
- 0
www/about.html View File

@@ -0,0 +1,27 @@
{% extends "layout.html" %}
{% block title %}About Me{% endblock %}
{% block content %}

<h1>About Me</h1>

My name is Noah and this is my website. I am a software engineer who lives in
Los Angeles. My areas of expertise are primarily in Perl and Python back-end
software development, however I believe I have a knack for the front end as well.<p>

I built Kirsle.net from the ground up. I made the web design in Photoshop and
pieced it together using standards compliant HTML 5.0 (the spec, not the
buzzword), CSS and a little bit of JavaScript. The back end is entirely written
in Python.<p>

The code supports a web blog, photo albums, and comments. It's also an open
source project of mine that I call Rophako. You can
<a href="https://github.com/kirsle/rophako">clone it on Github</a>.<p>

Besides being a rockstar at back end development and a pretty decent web designer,
I've dabbled in some 3D modeling, Flash animation and other artistic things.
You can find them under the "Creativity" section on the left navigation. :)<p>

Some of my personal projects are listed under the "Software" section to your
left. The rest you'll find on my GitHub page and CPAN profile.

{% endblock %}

+ 82
- 0
www/contact/index.html View File

@@ -0,0 +1,82 @@
{% extends "layout.html" %}
{% block title %}Contact Me{% endblock %}
{% block content %}

<h1>Contact Me</h1>

You can use the form below to send me an e-mail. Alternatively you can contact
me on an instant messenger:

<blockquote>
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td align="center" valign="middle">
<img src="/static/icons/aim.gif" title="AIM">
</td>
<td align="left" valign="middle">
<strong>AIM:</strong> <a href="aim:goim?ScreenName=Kirsle">Kirsle</a>
</td>
</tr>
<tr>
<td align="center" valign="middle">
<img src="/static/icons/skype.png" title="Skype">
</td>
<td align="left" valign="middle">
<strong>Skype:</strong> Kirsle
</td>
</tr>
<tr>
<td align="center" valign="middle">
<img src="/static/icons/xmpp.gif" title="XMPP">
</td>
<td align="left" valign="middle">
<strong>XMPP:</strong> kirsle@kirsle.net
</td>
</tr>
</table>
</blockquote><p>

<strong>You may NOT</strong> use this form to send me any SEO business
solicitations. That will probably just make me ban your IP address from visiting
my site ever again.<p>

<form name="contact" action="{{ url_for('contact.send') }}" method="POST">
<input type="hidden" name="token" value="{{ csrf_token() }}">
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td width="50%" align="left" valign="middle">
<strong>Your name:</strong><br>
<small>(so I know who you are)</small><br>
<input type="text" size="40" name="name">
</td>
<td width="50%" align="left" valign="middle">
<strong>Your email:</strong><br>
<small>(if you want a response)</small><br>
<input type="email" size="40" name="email">
</td>
</tr>
<tr>
<td colspan="2" align="left" valign="middle">
<strong>Message subject:</strong><br>
<small>(optional)</small><br>
<input type="text" size="40" name="subject" style="width: 100%"><p>

<strong>Message:</strong><br>
<small>(required)</small><br>
<textarea cols="40" rows="12" name="message" style="width: 100%"></textarea>
</td>
</tr>
<tr>
<td colspan="2" align="right" valign="middle">
<button type="submit">Send Message</button>
</td>
</tr>
</table>
<div style="display: none">
If you can see these boxes, don't touch them.<br>
<input type="text" size="40" name="contact" value=""><br>
<input type="text" size="40" name="website" value="http://">
</div>
</form>

{% endblock %}

+ 44
- 0
www/download.html View File

@@ -0,0 +1,44 @@
{% extends "layout.html" %}
{% block title %}Download Manager{% endblock %}
{% block content %}

{% if method == "index" %}
<h1>Project {{ project }}</h1>

You are about to download the file <strong>{{ file }}</strong> from the
project <strong>{{ project }}</strong>. This file has been downloaded
{{ hits }} time(s).

<h1>Download</h1>

To continue your download, click on the button below.
<br><br><br>

<form name="download" action="/download" method="POST">
<input type="hidden" name="token" value="{{ csrf_token() }}">
<input type="hidden" name="method" value="get">
<input type="hidden" name="project" value="{{ project }}">
<input type="hidden" name="file" value="{{ file }}">

<span style="background-color: #88AADD; padding: 15px; border-top: 2px solid #006699;
border-left: 2px solid #006699; border-right: 2px solid #AACCFF; border-bottom: 2px solid #AACCFF">
<button type="submit">Download Now</button>
</span>
</form>
{% elif method == "get" %}
<h1>Downloading File...</h1>

Your download of <strong>{{ file }}</strong> will begin shortly. If it doesn't,
<a href="/projects/{{ project }}/{{ file }}">download it directly</a>.
{% endif %}

{% endblock %}
{% block scripts %}
{% if method == "get" %}
<script>
$(document).ready(function() {
window.location.href = "/projects/{{ project }}/{{ file }}";
});
</script>
{% endif %}
{% endblock %}

+ 192
- 0
www/errorgen.html View File

@@ -0,0 +1,192 @@
{% extends "layout.html" %}
{% block title %}Error Message Generator{% endblock %}
{% block content %}

<h1>Error Message Generator</h1>

<ul>
<li><a href="#intro">Project Description</a></li>
<li><a href="#screenshots">Screenshots</a></li>
<li><a href="#zenmsg">ZenMsg</a></li>
<li><a href="#license">License</a></li>
<li><a href="#downloads">Downloads</a></li>
</ul>

<a name="intro"></a>
<img src="projects/ErrorGen/logo.png" alt="ErrorGen" width="400" height="90">
<h2>Project Description</h2>

The <strong>Error Message Generator</strong> (ErrorGen) is a simple
program that generates customized error dialogs. The idea was inspired
by a web-based error generator which created <em>images</em> of error
boxes. My program, however, creates "real" error boxes that can be
dragged around the screen and interacted with.<p>

The command-line, scriptable version of Error Message Generator is called
<strong>ZenMsg</strong>, named after the GNOME utility, Zenity. It's
a version of the generator that can be provoked from batch files and
scripts.

<h3>Features</h3>

<ul>
<li>Fully customizable error box: select the title, icon,
and message.</li>
<li>Create up to THREE buttons for the error box and specify
what each of them say, and which ones are "greyed out"</li>
<li>Advanced features to make the error keep coming back until
the right button is selected.</li>

<li>A button that minimizes and renames the control window,
leaving only the error dialog visible on screen.</li>
</ul>

<a name="screenshots"></a>
<h2 style="margin-top: 0px">Screenshots</h2>

<table border="0" cellspacing="0" cellpadding="0" style="margin-left: auto; margin-right: auto">
<tr>
<td align="center" valign="top">

<a href="projects/ErrorGen/ErrorGen.jpg">
<img src="projects/ErrorGen/ErrorGenS.jpg" width="600" height="364" alt="Screenshot">
</a><br>
ErrorGen in action, surrounded by example error messages.<br>
(click for a larger version)
</td>
</tr>
</table>

<a name="zenmsg"></a>
<h2 style="margin-top: 0px">ZenMsg</h2>

ZenMsg is a command-line version of Error Message Generator that
can be invoked by batch files or scripts. Example usage:

<pre style="overflow-x: auto">ZenMsg --error -t "An error has occurred." -b "Abort" -b "Retry" -b "Fail"</pre>

The executable comes with an HTML help file. <code>ZenMsg -?</code>
will display the same help file at the command line. The document
describes how to use ZenMsg.<p>

There is no binary Linux version of this utility. The source code
however is available and will execute under Linux; I've just not
compiled a standalone executable (there are a handful of other
utilities that do the job: see
<a href="http://live.gnome.org/Zenity">Zenity</a>. Source code
is available on the Downloads tab.

<h3>Windows Executable</h3>

<blockquote>
<img src="images/dos.png" width="32" height="32" alt="Win32" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=ZenMsg&amp;file=ZenMsg-0.01-bin.zip">
Download ZenMsg</a><br>

Version 0.01 - 2008/09/18<br>
<small>ZIP format/3.6 MB</small>
</blockquote>

<a name="license"></a>
<h2 style="margin-top: 0px">Software License</h2>

<pre> Error Message Generator
Copyright (C) 2008 Casey Kirsle

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</pre>

<a name="downloads"></a>
<h2 style="margin-top: 0px">Downloads</h2>

It's recommended that you download the latest version of this software
as listed below. To download older versions and source code, skip to
the next section.

<h3>Windows Executable</h3>

<blockquote>
<img src="images/dos.png" width="32" height="32" alt="Win32" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=ErrorGen&amp;file=ErrorGen-1.2_bin.zip">

Download Error Message Generator</a><br>
Version 1.2 - 2007/06/28<br>
<small>ZIP format/2.1 MB</small>
</blockquote>

<h3>Linux Binary</h3>

<blockquote>

<img src="images/exec.png" width="32" height="32" alt="Linux" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=ErrorGen&amp;file=ErrorGen-1.2_linux.tar.gz">
Download Error Message Generator</a><br>
Version 1.2 - 2007/06/28<br>
<small>TAR.GZ format/4.6 MB</small>
</blockquote>

<h2>All Distributions</h2>

The following are all the distributions available for this software,
starting with the most recent. Source code is also available for all
versions.<p>

<table border="0" cellspacing="2" cellpadding="2" class="distro">
<tr>
<th>Release</th>
<th>Windows EXE</th>
<th>Linux Binary</th>
<th>Source Code</th>
</tr>

<tr>
<td>
<b>ErrorGen 1.2</b><br>
<small>2007/06/28</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=ErrorGen&amp;file=ErrorGen-1.2_bin.zip">ErrorGen 1.2</a><br>
<small>(ZIP; 2.1 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<a href="/download?type=bin&amp;project=ErrorGen&amp;file=ErrorGen-1.2_linux.tar.gz">ErrorGen 1.2</a><br>

<small>(TAR.GZ; 4.6 MB)</small>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=ErrorGen&amp;file=ErrorGen-1.2_src.tar.gz">ErrorGen 1.2</a><br>
<small>(TAR.GZ; 114.1 KB)</small>
</tr>
<tr>
<td>
<b>ZenMsg 0.01</b><br>
<small>2008/09/18</small>
</td>
<td>

<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=ZenMsg&amp;file=ZenMsg-0.01-bin.zip">ZenMsg 0.01</a><br>
<small>(ZIP; 3.6 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=ZenMsg&amp;file=ZenMsg-0.01-src.zip">ZenMsg 0.01</a><br>
<small>(ZIP; 13 KB)</small>
</tr>
</table>

{% endblock %}

+ 605
- 0
www/firered.html View File

@@ -0,0 +1,605 @@
{% extends "layout.html" %}
{% block title %}Sequence Breaking Pokemon FireRed{% endblock %}
{% block content %}

<h1>Sequence Breaking Pokemon FireRed</h1>

This is the story of my quest to <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/SequenceBreaking">Sequence
Break</a> Pokemon FireRed Version. I decided a good place to begin my quest would be Fuchsia City instead of
Palette Town. This is what happened...

{% set pages = {
"1": "Getting to Fuchsia City",
"2": "Level Grinding on Silence Bridge",
"3": "On the Road to Cerulean City",
"4": "Breaking Mt. Moon"
} %}
<ul>
{% for i in pages|sort %}
{% set link = pages[i] %}

<li>
{% if i == page %}
<strong>Part {{ i }} - {{ link }}</strong>
{% else %}
<a href="/firered{% if i != '1' %}/{{ i }}{% endif %}">Part {{ i }} - {{ link }}</a>
{% endif %}
</li>
{% endfor %}
<li><a href="/firered/full">All on one page</a></li>
</ul>

{% if page == "1" or page == "full" %}
<h2>The Original Idea</h2>

In the zoo in Fuchsia City in front of the
Safari Zone, there is an extinct Pokemon. This Pokemon will be either
Omanyte or Kabuto -- which one it is depends on which fossil you chose in
Mt. Moon. So the question was, <em>If you could get to Fuchsia City without
having chosen a fossil, what Pokemon would be shown at the zoo?</em><p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/000.png" width="480" height="320" alt="Screenshot">
</div><p>

So, I set out to sequence break Pokemon Fire Red version. I decided to
use walk through walls cheats to get to Fuchsia City as soon as it was
convenient. I had to play the game long enough to get a starter Pokemon
(I chose Charmander) and a Pokedex, because the game does extremely
weird things if you cheat and start battling and capturing Pokemon
without having these two items first.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/001.png" width="480" height="320" alt="Screenshot"><br>
<em>My level 7 Charmander.</em>
</div><p>

So, enable the cheat codes and get out of Palette Town!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/002.png" width="426" height="438" alt="Screenshot"><br>
<em>The Walk Thru Walls cheat and Level 1 Wild Pokemon</em>
</div><p>

I couldn't find a cheat code that would disable random battles entirely,
so I used a "Level 1 Pokemon" cheat so any random battles I do get into
will be with Pokemon of reasonable levels.

<h1>Getting to Fuchsia City</h1>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/003.png" width="480" height="320" alt="Screenshot"><br>
<em>Walking south towards Cinnabar Island.</em><p>

<img class="portrait" src="/creativity/articles/fire-red/004.png" width="480" height="320" alt="Screenshot"><br>
<em>A wild Tentacool decided to fight me. Good thing it's only Level 1.</em><p>

<img class="portrait" src="/creativity/articles/fire-red/005.png" width="480" height="320" alt="Screenshot"><br>
<em>Finally arrived at Cinnabar Island.</em><p>

<img class="portrait" src="/creativity/articles/fire-red/006.png" width="480" height="320" alt="Screenshot"><br>
<em>Cinnabar Island with no badges and only 1 Pokemon!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/007.png" width="480" height="320" alt="Screenshot"><br>
<em>Finally arrived in Fuchsia City.</em>
</div><p>

Now that we've finally arrived in Fuchsia City, let's check out the zoo
and see what extinct Pokemon is there!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/008.png" width="480" height="320" alt="Screenshot"><br>
<em>Looks like the default is a Kabuto. Mystery solved!</em>
</div><p>

If you didn't choose a fossil Pokemon, it looks like the default is
to show Kabuto in the zoo. Remember that ordinarily it's not supposed
to be possible to get to Fuchsia City without having chosen one of the
fossils, because the fossils block your path through Mt. Moon.<p>

<h1>Getting Caught Up</h1>

Now that we're in Fuchsia City, can we try to continue the game from
here without cheating any more? We should be able to! I only have
a level 7 Charmander and every Pokemon in this part of Kanto is around
level 30, so what can I do about that?<p>

Use the Safari Zone! I can catch wild Pokemon here without having to
battle them, and the Pokemon levels will be comparable to the average
level of Pokemon in the Fuchsia City area.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/009.png" width="480" height="320" alt="Screenshot"><br>
<em>And I have $3,024 to spend on the Safari Zone game!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/010.png" width="480" height="320" alt="Screenshot"><br>
<em>Entering the Safari Zone!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/011.png" width="480" height="320" alt="Screenshot"><br>
<em>The first wild Pokemon I run into is a Lv31 Nidorino!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/012.png" width="480" height="320" alt="Screenshot"><br>
<em>Captured!</em>
</div><p>

Remember also that the Safari Zone contains the Surf HM. But, I
can't use Surf outside of battle until I defeat the Fuchsia City
gym leader. Good thing I'm in Fuchsia City!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/013.png" width="480" height="320" alt="Screenshot"><br>
<em>I found the Surf HM inside the Safari Zone.</em>
</div><p>

From the Safari Zone, I've captured a Nidorino, Ryhorn, Nidoran&#x2640;,
Paras, Exeggcute, and Venomoth. Unfortunately none of my Pokemon are
able to learn Surf, so even if I do defeat the Fuchsia City gym leader,
how will I escape?<p>

But wait! There's a Fishing Guru in Fuchsia City! I can get a fishing
rod from him!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/014.png" width="480" height="320" alt="Screenshot"><br>
<em>I got the Good Rod.</em>
</div><p>

I was wondering for a minute how the fishing rods worked. Ordinarily you
find the first Fishing Guru in Vermilion City, and you get the Old Rod
which can only catch Magikarp. Then you get the Good Rod from Fuchsia
City which can catch Goldeen, Poliwag and Magikarp. And then the Super
Rod can catch more Pokemon.<p>

I was wondering if maybe the rods were incremental, and that the Fuchsia
City Fishing Guru would give me the Old Rod since I talked to him first.
But apparently the rods are hard-coded, so I got the Good Rod. With this
I caught myself a Level 10 Goldeen from the pond in the Fishing Guru's
back yard.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/015.png" width="480" height="320" alt="Screenshot"><br>
<em>My party so far...</em>
</div><p>

Before taking on the Fuchsia City gym, I need to level up my Pokemon
some more. The best place to do that is to head out on Route 15.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/016.png" width="480" height="320" alt="Screenshot"><br>
<em>Route 15 from Fuchsia City to Lavender Town.</em>
</div><p>

My Charmander is too weak to battle, but my other Pokemon aren't. I
can power-level Charmander by putting it out first in battle and then
switching it with someone else. The first few battles caused Charmander
to level up 2 or 3 times at once. Three short battles later, and...<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/017.png" width="480" height="320" alt="Screenshot"><br>
<em>Charmander is evolving!</em>
</div>

{% if page == "1" %}
<p>&gt; Continue to <a href="/firered/2">Part 2 - {{ pages["2"] }}</a>
{% endif %}
{% endif %}

{% if page == "2" or page == "full" %}
<h1>Level Grinding on Silence Bridge</h1>

After battling my way through the Bikers and Bird Catchers, I finally
made my way to the bottom of Silence Bridge.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/018.png" width="480" height="320" alt="Screenshot"><br>
<img class="portrait" src="/creativity/articles/fire-red/019.png" width="480" height="320" alt="Screenshot"><br>
<img class="portrait" src="/creativity/articles/fire-red/020.png" width="480" height="320" alt="Screenshot"><br>
<em>Silence Bridge - Route 12.</em>
</div><p>

It's a straight shot north to Lavender Town!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/021.png" width="480" height="320" alt="Screenshot"><br>
<em>The Fishing Guru's house.</em>
</div><p>

I found the other Fishing Guru's house and got a Super Rod. With
this I can catch Dratini in the Safari Zone. Dragon Pokemon are
cool, right? And I don't even have a single gym badge yet!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/022.png" width="480" height="320" alt="Screenshot"><br>
<em>A sleeping Pokemon blocks the way!</em>
</div><p>

And, here's Snorlax. This Pokemon blocks my access to Lavender
Town to the north, and Vermilion City to the west. I can't get
a PokeFlute to wake up Snorlax until I've already been to
Lavender Town and Celadon City.<p>

But look! I could Surf right around Snorlax and get to Lavender
Town! Now I have my plan. I just need to defeat the Fuchsia
City Gym Leader, teach my Goldeen how to Surf, Surf around the
Snorlax and get to Lavender Town!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/023.png" width="480" height="320" alt="Screenshot"><br>
<em>My party so far...</em>
</div><p>

My Exeggcute knows Confusion, which is Super Effective against
poison type Pokemon. The Fuchsia City gym is full of poison types,
so Exeggcute is my best bet for beating the gym leader.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/024.png" width="480" height="320" alt="Screenshot"><br>
<em>Used Exeggcute to defeat Koga, the gym leader.</em>
</div><p>

Now I can Surf around Snorlax! I caught a Level 10 Goldeen with
the Good Rod, now let's teach it how to Surf.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/025.png" width="480" height="320" alt="Screenshot"><br>
<img class="portrait" src="/creativity/articles/fire-red/026.png" width="480" height="320" alt="Screenshot"><br>
<em>Sequence breaking at its finest.</em><p>

<img class="portrait" src="/creativity/articles/fire-red/027.png" width="480" height="320" alt="Screenshot"><br>
<em>Welcome to Lavender Town!</em>
</div><p>

Now that we've gotten to Lavender Town, it will be really easy
to get back on track. At this point we can Surf, but we still
don't have any Pokemon that knows how to Cut. But we can easily
find our way back to Vermilion City and Cerulean City from here!
Just watch...<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/028.png" width="480" height="320" alt="Screenshot"><br>
<em>Taking the Underground Path from Lavender Town to Celadon City.</em><p>

<img class="portrait" src="/creativity/articles/fire-red/029.png" width="480" height="320" alt="Screenshot"><br>
<em>Here we are in Celadon City!</em>
</div><p>

Now I've made it to Celadon City. There's a lot of exciting things
I can do here! For starters, I can buy a Leaf Stone to evolve my
Exeggcute.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/030.png" width="480" height="320" alt="Screenshot"><br>
<em>I bought myself a Leaf Stone.</em><p>

<img class="portrait" src="/creativity/articles/fire-red/031.png" width="480" height="320" alt="Screenshot"><br>
<em>I evolved Exeggcute with it! More power!</em>
</div><p>

While I'm in Celadon City, I'd <em>love</em> to be able to get
straight to the gym and completely destroy the Grass-type Pokemon
there with my Charmeleon, but I can't get in!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/032.png" width="480" height="320" alt="Screenshot"><br>
<em>I don't have Cut!</em>
</div><p>

Rain check! I need to get to Cerulean City and defeat the water
Pokemon gym leader to be allowed to use Cut, and I need to get
to Vermilion City to actually get my hands on the Cut HM to teach
it to one of my Pokemon!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/033.png" width="480" height="320" alt="Screenshot">
</div><p>

In the virtual Game Freak headquarters in Celadon City, you get
the Hot Tea, which you then give to the guards that surround
Saffron City and then they allow you into the city. Saffron City
is the central hub between Cerulean City, Celadon City, Lavender
Town, and Vermilion City. This will allow us to get back to all
the major Kanto cities. Now we're getting back on track!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/034.png" width="480" height="320" alt="Screenshot"><br>
<em>Giving the Hot Tea to the Saffron City guards...</em><p>

<img class="portrait" src="/creativity/articles/fire-red/035.png" width="480" height="320" alt="Screenshot"><br>
<em>Here we are in Saffron City!</em>
</div><p>

We've made it to Saffron City now, and we only have a single
gym badge! :D<p>

Now, the next place I should go is north to Cerulean City. You
can get <em>in</em> to the city without Cut, but you can't get
back out. I'll need to see Bill anyway to get the S.S. Ticket,
so I can get the Cut HM from the S.S. Anne. So, north it is!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/036.png" width="480" height="320" alt="Screenshot"><br>
<em>North to Cerulean City, south to Vermilion City.</em>
</div>

{% if page == "2" %}
<p>&gt; Continue to <a href="/firered/3">Part 3 - {{ pages["3"] }}</a>
{% endif %}
{% endif %}

{% if page == "3" or page == "full" %}
<h1>On the Road to Cerulean City</h1>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/037.png" width="480" height="320" alt="Screenshot"><br>
<em>The south border to Cerulean City.</em>
</div><p>

See, this is why you need Cut to get out of Cerulean City. I'm
<em>supposed</em> to be on the other side of this wall. But,
somebody's stupid Slowbro is in the way anyway.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/038.png" width="480" height="320" alt="Screenshot"><br>
<em>This is how you get into Cerulean City.</em>
</div><p>

I'm not supposed to be on top of this ledge. When I jump down,
I'll be stuck in Cerulean City until I complete the "go see
Bill" side quest. But, I must see Bill so that I can get the
S.S. Ticket!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/039.png" width="480" height="320" alt="Screenshot">
</div><p>

Since the Cerulean City Gym is right here, let's go and beat
Misty real quick so we'll be <em>allowed</em> to use Cut once
we finally get it.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/040.png" width="480" height="320" alt="Screenshot"><br>
<em>I know Rhyhorn is weak against Starmie, but c'mon.</em>
</div><p>

Even Misty's strongest Pokemon is no chance against mine.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/041.png" width="480" height="320" alt="Screenshot"><br>
<em>Thanks! This is what I came here for!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/042.png" width="480" height="320" alt="Screenshot"><br>
<em>Oh look, it's my rival, Blue!</em>
</div><p>

My rival Blue challenges you when you try to leave Cerulean
City to see Bill to the north. Ordinarily, if you play the
game properly, you're trapped in Cerulean City with nowhere
to go <em>but</em> north.<p>

Blue's Pokemon though are super weak compared to mine.
Completely destroying him takes no effort at all. And then
I'm off to see Bill, destroying any trainer who gets in my
way.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/043.png" width="480" height="320" alt="Screenshot"><br>
<em>I got the S.S. Ticket from Bill here.</em>
</div><p>

And with the S.S. Ticket, I'm able to get out of Cerulean City
and head south. I cut through Saffron City instead of taking
the underground tunnel and arrive in Vermilion City.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/044.png" width="480" height="320" alt="Screenshot"><br>
<em>Welcome to Vermilion City!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/045.png" width="480" height="320" alt="Screenshot"><br>
<em>I head straight for the S.S. Anne to get my Cut HM.</em>
</div><p>

Now, this is where the first really interesting quirk happened
with my sequence breaking. I didn't waste time battling trainers
on the S.S. Anne since they don't stand a chance against me
anyway, and I headed straight for the Captain's Cabin.<p>

Ordinarily, your rival will challenge you to a battle right before
the Captain's Cabin. But, Blue was absent! He didn't show up to
challenge me. I wonder why? Is it because I have the Fuchsia City
gym badge already?<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/046.png" width="480" height="320" alt="Screenshot"><br>
<em>Where are you, Blue? Are you too embarrassed to battle me again?</em><p>

<img class="portrait" src="/creativity/articles/fire-red/047.png" width="480" height="320" alt="Screenshot"><br>
<em>I went ahead and got the Cut HM from the Captain.</em>
</div><p>

Now, with the Cut HM, I can challenge the Vermilion City gym leader.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/048.png" width="480" height="320" alt="Screenshot"><br>
<em>Bye-bye, S.S. Anne!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/049.png" width="480" height="320" alt="Screenshot"><br>
<em>Time to take on the Vermilion City gym!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/050.png" width="480" height="320" alt="Screenshot"><br>
<em>The gym trainers stood no chance against me.</em><p>

<img class="portrait" src="/creativity/articles/fire-red/051.png" width="480" height="320" alt="Screenshot"><br>
<em>The gym leader also lost spectacularly to my overpowered Pokemon.</em>
</div><p>

Now with the Vermilion City gym out of the way, I went back to
Celadon City to pwn my way through their Grass-type Pokemon
with my Charmeleon.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/052.png" width="480" height="320" alt="Screenshot">
</div><p>

Now, when I defeated the Vermilion City gym, I'm able to use
Fly now. I can get Fly in Celadon City, so, let's go get it.
Also, I captured a random Pidgey I found in the grass so that
I'd have a Pokemon to teach Fly to.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/053.png" width="480" height="320" alt="Screenshot"><br>
<em>Received HM02 - Fly.</em><p>

<img class="portrait" src="/creativity/articles/fire-red/054.png" width="480" height="320" alt="Screenshot"><br>
<em>My gym badges so far. I never got the 1<sup>st</sup> badge.</em>
</div>

{% if page == "3" %}
<p>&gt; Continue to <a href="/firered/4">Part 4 - {{ pages["4"] }}</a>
{% endif %}
{% endif %}

{% if page == "4" or page == "full" %}
<h1>Breaking Mt. Moon</h1>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/055.png" width="480" height="320" alt="Screenshot"><br>
<em>Where should I Fly to next?</em>
</div><p>

As you can see, I've now been to every city except for Pewter
City and Indigo Plateau (but the latter is normal, as that's
the very last city you go to).<p>

I'm gonna fly to Cerulean City because I have an idea on how
I can further sequence-break this game. Since I can Surf, I can
escape from Cerulean City going west and get to Mt. Moon, and
enter Mt. Moon from the wrong side.<p>

This will place me on the <em>other</em> side of the fossils,
and let me choose my fossil without having to battle the Pokemon
trainer who guards them!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/056.png" width="480" height="320" alt="Screenshot"><br>
<em>Surfing here to get out of Cerulean City!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/057.png" width="480" height="320" alt="Screenshot"><br>
<em>The Cerulean City cave.</em>
</div><p>

This trainer is blocking the entrance to the Cerulean City Cave,
where Mewtwo lives, because you can't get in there until you've
beaten the entire game. But I'm not interested in that cave, I'm
going to head west to Mt. Moon!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/058.png" width="480" height="320" alt="Screenshot"><br>
<em>Mt. Moon - The back entrance.</em><p>

<img class="portrait" src="/creativity/articles/fire-red/059.png" width="480" height="320" alt="Screenshot"><br>
<em>The fossils!</em>
</div><p>

And here we are. Ordinarily, I would be on the opposite side of
the fossils, and I'd have to battle the trainer down there first.
After winning, he'd let me choose a fossil, and he'd take the
opposite one. But I'm standing right by the fossils right now!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/060.png" width="480" height="320" alt="Screenshot"><br>
<em>I'll take the Kabuto fossil!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/061.png" width="480" height="320" alt="Screenshot"><br>
<em>The trainer automatically goes and takes the other one.</em>
</div><p>

As I expected, taking the fossil has triggered the trainer to
take the other one. But, I've skipped the battle with him now!
See, look!<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/062.png" width="480" height="320" alt="Screenshot"><br>
<em>I know, I've been to Cinnabar Island!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/063.png" width="480" height="320" alt="Screenshot"><br>
<em>Through Mt. Moon, onward to Pewter City!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/064.png" width="480" height="320" alt="Screenshot"><br>
<em>I'm positive that you are mistaken. I've never been to Viridian Forest!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/065.png" width="480" height="320" alt="Screenshot"><br>
<em>All this excitement has caused my Charmeleon to evolve!</em><p>

<img class="portrait" src="/creativity/articles/fire-red/066.png" width="480" height="320" alt="Screenshot"><br>
<em>Oh. Thanks for the warm welcome to Pewter City.</em>
</div><p>

I've encountered Pewter City's "invisible wall" from the wrong side. The
invisible wall is this trainer who's supposed to stop you from leaving
Pewter City until you've defeated the gym leader, Brock.<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/067.png" width="480" height="320" alt="Screenshot"><br>
<em>I'm sure I have the right stuff, buddy.</em><p>

<img class="portrait" src="/creativity/articles/fire-red/068.png" width="480" height="320" alt="Screenshot"><br>
<em>Brock doesn't know what he's getting himself into...</em><p>

<img class="portrait" src="/creativity/articles/fire-red/069.png" width="480" height="320" alt="Screenshot"><br>
<em>Brock's strongest Pokemon doesn't even stand a chance.</em>
</div><p>

With Brock defeated, I've now run out of ways to sequence-break this
game. I have the first 5 badges and have unlocked the paths to every
city in the game. This is the point at which the game played
legitimately and my sequence-broken game converge.<p>

I guess I can head south to Viridian City though...<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/070.png" width="480" height="320" alt="Screenshot"><br>
<em>Dude, I was catching Pokemon since before you were programmed.</em>
</div><p>

This old man stopped me on my way in to town to teach me how to catch
a Pokemon. Because I never talked to him before I left for Fuchsia
City at the beginning of my quest.<p>

And at this point I'm out of ideas. I guess I <em>could've</em> held
off on fighting Brock, and headed straight for the Pokemon League
and had a little battle with my rival Blue and completely kicked his
ass...<p>

My last idea is to head back to the Fuchsia City Zoo, and see that
extinct Pokemon one more time. Since I took the Kabuto fossil, I
shouldn't expect to see a Kabuto at the zoo now...<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/071.png" width="480" height="320" alt="Screenshot"><br>
<em>It's an Omanyte! What happened to Kabuto?</em>
</div><p>

Apparently they didn't like their Kabuto anymore after they saw I
took the Kabuto fossil, and they replaced him with Omanyte. :)<p>

<div class="center">
<img class="portrait" src="/creativity/articles/fire-red/072.png" width="480" height="320" alt="Screenshot"><br>
<em>Here's my final party.</em>
</div><p>

At this point I'm done with my experiment. From this point in the
game, the plot has caught up with me and I'm no longer sequence
breaking anymore. I'm at a state in this game where I could've
gotten to the same place through legitimate means.<p>

So this is where my quest comes to an end. If anybody has any new
ideas, feel free to leave me a comment about them. :)
{% endif %}

<p>
{{ include_page("comment.partial_index",
thread="article-firered",
subject="Sequence Breaking FireRed Version",
) | safe }}

{% endblock %}

+ 12
- 0
www/flash/aichaos-warners.html View File

@@ -0,0 +1,12 @@
{% extends "layout.html" %}
{% block title %}AiChaos Warners - Flash Animations{% endblock %}
{% block content %}

<h1>AiChaos Warners</h1>

<embed src="/creativity/flash/warners.swf" width="550" height="400"
autoplay="true" loop="true" hidden="false" quality="high"><p>

&#0171; <a href="/flash">More Flash Animations</a>

{% endblock %}

+ 37
- 0
www/flash/index.html View File

@@ -0,0 +1,37 @@
{% extends "layout.html" %}
{% block title %}Flash Animations{% endblock %}
{% block content %}

<h1>Flash Animations</h1>

I'm not much of an animator, but I have made a couple of things in Flash. Out of
the many animations I'd started working on that never got completed, here are a
few that did.<p>

<a href="/flash/kanian-azulian-war">Kanian/Azulian War</a><br>
This is probably the best animation I've ever completed. It's about a war that's
happening between the Kanians and the Azulians (two species of creature I made
up). The Kanians are ridiculously defenseless and they owe the humans a favor for
helping save their planet, and the humans are in danger at the hands of the
Azulians, who are genetically engineered killing machines. The Kanians have to
fight the Azulians to save the humans, but are they getting in way over their heads?<p>

<a href="/flash/pwnizard-i-choose-you">Pwnizard, I Choose You!</a><br>
In a sugar high one night, I started talking about a Pokemon called Pwnizard, in
which it's virtually impossible to win against it, because its mere presence in a
battle automatically ensures its victory. This is a quick Flash animation I made
using the graphics of <em>Pokemon FireRed Version</em> to illustrate. In this case,
Pwnizard has taken the form of a red Rattata, although I've always envisioned Pwnizard
looking like something useless, like Magikarp, to add to the irony of how ridiculously
powerful it is).<p>

<a href="/flash/aichaos-warners">AiChaos Warners</a><br>
From 2003 to 2005 I worked on a site called <em>AiChaos, Inc.</em> (formerly known
as <em>Chaos A.I. Technology</em>), which was a site about the programming of
Instant Messenger Chatterbots. For the bots that chatted on AOL Instant Messenger,
their main problem was AIM's warning system. Almost anybody could warn the bot plus
20% and that had a negative impact on the bot's ability to chat (a form of Denial-of-Service
attack). This is a short Flash animation I put up to give the warners a piece of
my mind.

{% endblock %}

+ 12
- 0
www/flash/kanian-azulian-war.html View File

@@ -0,0 +1,12 @@
{% extends "layout.html" %}
{% block title %}Kanian/Azulian War - Flash Animations{% endblock %}
{% block content %}

<h1>Kanian/Azulian War</h1>

<embed src="/creativity/flash/KanianAzuWar.swf" width="550" height="400"
autoplay="true" loop="true" hidden="false" quality="high"><p>

&#0171; <a href="/flash">More Flash Animations</a>

{% endblock %}

+ 12
- 0
www/flash/pwnizard-i-choose-you.html View File

@@ -0,0 +1,12 @@
{% extends "layout.html" %}
{% block title %}Pwnizard, I Choose You! - Flash Animations{% endblock %}
{% block content %}

<h1>Pwnizard, I Choose You!</h1>

<embed src="/creativity/flash/pwnizard.swf" width="480" height="320"
autoplay="true" loop="true" hidden="false" quality="high"><p>

&#0171; <a href="/flash">More Flash Animations</a>

{% endblock %}

+ 51
- 0
www/fonts.html View File

@@ -0,0 +1,51 @@
{% extends "layout.html" %}
{% block title %}TrueType Fonts{% endblock %}
{% block content %}

<h1>TrueType Fonts</h1>

Here are the few TTF font files I've created, in the chronological order of their
creation.

<h2>Azulian</h2>

<img src="/projects/TTF/azulian.png" width="300" height="100"><p>

This is the first font I've created. The characters were based off the original
design for the Azulian language set. I don't remember what program I created this
font in, but it sucked and I had to actually use two different programs, because
one of them wouldn't allow the final TTF file to be created. At any rate, I later
abandoned this font for a new Azulian set that looks a lot less like English.<p>

&#0164; <a href="/download?project=TTF&file=Azulian.zip">Download Azulian.ttf</a> (ZIP; 16.8 KB)

<h2>Azulian Nexus</h2>

<img src="/projects/TTF/nexus.png" width="300" height="100"><p>

This is the new font for the Azulian language. It was created in Macromedia
Fontographer 4.<p>

&#0164; <a href="/download?project=TTF&file=Nexus.zip">Download Nexus.ttf</a> (ZIP; 11.4 KB)

<h2>Rive</h2>

<img src="/projects/TTF/rive.png" width="300" height="100"><p>

The characters for this font were drawn by my friend Barry and I to use on a
website that we never got around to creating.<p>

&#0164; <a href="/download?project=TTF&file=Rive.zip">Download Rive.ttf</a> (ZIP; 13.7 KB)

<h2>Lorelei</h2>

<img src="/projects/TTF/lorelei.png" width="300" height="100"><p>

I created this font in Fontographer while developing some ideas for this story
about Lorei, the Nightmare Realm. I felt like creating a new non-English language
for it, and this font resulted from it. I think this font has considerably less
letters than are in the English alphabet and I did that on purpose.<p>

&#0164; <a href="/download?project=TTF&file=Lorelei.zip">Download Lorelei.ttf</a> (ZIP; 7.66 KB)

{% endblock %}

+ 13
- 0
www/guestbook.html View File

@@ -0,0 +1,13 @@
{% extends "layout.html" %}
{% block title %}My Guestbook{% endblock %}
{% block content %}

<h1>My Guestbook</h1>

{{ include_page("comment.partial_index",
thread="guestbook",
subject="My Guestbook",
header=False,
) | safe }}

{% endblock %}

+ 13
- 0
www/index.html View File

@@ -0,0 +1,13 @@
{% extends "layout.html" %}
{% block title %}Welcome!{% endblock %}
{% block content %}

<h1>Welcome!</h1>

Welcome to <a href="http://www.kirsle.net/">Kirsle.net</a>! This is the personal
website of Noah Petherbridge, and it's where my various software projects and
web blog lives.<p>

{{ include_page("blog.partial_index") | safe }}

{% endblock %}

+ 42
- 0
www/javascript.html View File

@@ -0,0 +1,42 @@
{% extends "layout.html" %}
{% block title %}Creative JavaScripts{% endblock %}
{% block content %}

<h1>Creative JavaScripts</h1>

This page contains links to my creative JavaScript pages. This page is <b>not</b>
intended to provide cut-and-paste JavaScript code for your own personal use.
In many cases, the scripts here were specially programmed for my own purposes
and are not easily reconfigurable to suit other needs. In other words, this page
is to show off my JavaScript skills, not to provide code snippits to enable
less-than-savvy Internet users the ammunition needed to clone my scripts.

<h2>Text-Based RPG Game</h2>

This is a classic-style text-based roleplaying game programmed entirely in
JavaScript. It's known to work on Internet Explorer and Firefox. This script
uses key capturing and updates the page with all of the (relevant) keys you type
in. It even supports the Backspace key to delete the last character you typed.
I recommend opening this in a new window so that your Backspace key won't be
mistaken for the "Back" button on your browser.<p>

I created this script as part of my web design course in college. The assignment
was to "find or create a JavaScript to impress," and since it was obvious that
all the noobs would just go to cut-and-paste JavaScript sites, the best way to
come up with something totally original was to make a game out of it. And not the
lame kind of game like Tetris and Tic-Tac-Toe, which get reprogrammed far too
often in the JavaScript world, but a roleplaying game that requires a lot of
programming and attention to detail.<p>

&#0164; <a href="creativity/javascript/jsrpg.html" onClick="return openWin(this)">
View this script in action</a><p>

{% endblock %}
{% block scripts %}
<script type="text/javascript">
function openWin(obj) {
window.open (obj.href);
return false;
}
</script>
{% endblock %}

+ 4
- 0
www/js/jquery-2.1.0.min.js
File diff suppressed because it is too large
View File


+ 145
- 0
www/js/offsite.js View File

@@ -0,0 +1,145 @@
/*
##########################################################
# Hyperlink Editor Script || Copyright 2007 Casey Kirsle #
#--------------------------------------------------------#
# This script makes all offsite links open in a new #
# window, and turns all e-mail links in the format of #
# "name-at-domain.com" into "name@domain.com" #
#--------------------------------------------------------#
# Use content only with permission. Get permission from #
# casey "at" cuvou.org #
##########################################################
*/
var localAddr = new Array();
localAddr[0] = "kirsle.com";
localAddr[1] = "www.kirsle.com";
localAddr[2] = "kirsle.net";
localAddr[3] = "www.kirsle.net";
localAddr[4] = "kirsle.org";
localAddr[5] = "www.kirsle.org";
localAddr[6] = "epsilon.kirsle.com";
localAddr[7] = "dev.kirsle.com";
localAddr[8] = "www.dev.kirsle.com";
localAddr[9] = "local.kirsle.com";
localAddr[10] = "ds.kirsle.net";
localAddr[11] = "kirsle.noahpwns.com";
localAddr[12] = "localhost";

if (document.getElementsByTagName) {
var links = document.getElementsByTagName("a");

for (var i = 0; i < links.length; i++) {
var loc = links[i].href;

// Deobfuscate Siikir-encoded e-mail links.
if (links[i].className == "cms-email") {
// Rot13-decode everything.
var parts = links[i].href.split("to=");
email = rot13(parts[1]);
var newmail = email.split("+").join("@");
links[i].href = "mailto:" + newmail;

// If the label is an e-mail format too, do the same to it.
var lab = links[i].innerHTML;
if (lab.indexOf("+") > -1) {
lab = rot13(lab);
var newlab = lab.split("+").join("@");
links[i].innerHTML = newlab;
}
}
else {
// Continue with link formatting by protocol.
var parts = loc.split ("/"); // http, null, domain name, request
var prot = parts[0].split(":");
var protocol = prot[0];
protocol.toLowerCase;
if (protocol == "http" || protocol == "https") {
// This is an absolute URL.
var isLocal = 0;

for (var j = 0; j < localAddr.length; j++) {
if (parts[2] == localAddr[j]) {
isLocal = 1;
}
}

if (isLocal == 1) {
// Local links don't need to be modified.
}
else {
// Remote links need to open in a new window.
links[i].target = "_blank";
}
}
else if (protocol == "mailto" || protocol=="msnim" || protocol=="xmpp") {
// MailTo link. See if this isn't a normal link.
if (loc.indexOf("-at-") > -1) {
var newhref = loc.split("-at-").join("@");
links[i].href = newhref;

// Convert it in the text too.
if (links[i].innerHTML.indexOf("-at-") > -1) {
var mailLabel = links[i].innerHTML.split("-at-");
var newLabel = mailLabel.join ("@");
links[i].innerHTML = newLabel;
}
}
}
}
}
}

function sblogShowMoreTags() {
if (document.getElementById) {
document.getElementById("sblog-tags-hidden").style.display = "block";
document.getElementById("sblog-tags-hiddenlink").style.display = "none";
}
return false;
}

/*
##########################################################
# Rot13 Encoder/Decoder Functions #
##########################################################
*/

function rot13(txt) {
var result = '';

for (var i = 0; i < txt.length; i++) {
var b = txt.charCodeAt(i);

// 65 = A 97 = a
// 77 = M 109 = m
// 78 = N 110 = n
// 90 = Z 122 = z

var isLetter = 0;

if (b >= 65 && b <= 77) {
isLetter = 1;
b += 13;
}
else if (b >= 97 && b <= 109) {
isLetter = 1;
b += 13;
}
else if (b >= 78 && b <= 90) {
isLetter = 1;
b -= 13;
}
else if (b >= 110 && b <= 122) {
isLetter = 1;
b -= 13;
}

if (isLetter) {
result += String.fromCharCode(b);
}
else {
result += String.fromCharCode(b);
}
}

return result;
}

+ 169
- 0
www/layout.html View File

@@ -0,0 +1,169 @@
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% endblock %} - Kirsle.net</title>

<link rel="stylesheet" type="text/css" media="screen" href="/solar/screen.css">
<link rel="stylesheet" type="text/css" media="print" href="/solar/print.css">
<link rel="stylesheet" type="text/css" media="all" href="/solar/vim-syntax.css">
<link rel="alternate" type="application/rss+xml" title="Kirsle's RSS Feed" href="/rss">

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>

<div class="k-supernova"></div>
<div class="k-kirsle" onClick="self.location='/'"></div>

<div class="k-content-panel">
{% with messages = get_flashed_messages() %}
{% if messages %}
<h1>Notice!</h1>

<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}

{% block content %}{% endblock %}

<div class="k-copyright">
Copyright &copy; 2014 Noah Petherbridge<br>
Powered by {{ app["name"] }} v{{ app["version"] }}<br>
Page generated in %time_elapsed%s.
</div>
</div>

<div class="k-navpanel">
<div class="k-section">Kirsle</div>
<div class="k-navi">
&#0187; <a href="/">Homepage</a> (<a href="{{ url_for('blog.rss') }}">RSS</a>)<br>
&#0187; <a href="/about">About Me</a><br>
&#0187; <a href="/photos/albums">Photo Albums</a><br>
&#0187; <a href="/guestbook">Guestbook</a><br>
&#0187; <a href="/contact">Contact Me</a>
</div>

<div class="k-section">Channels</div>
<div class="k-navi">
{{ include_page("blog.partial_tags")|safe }}
</div>

<div class="k-section">Creativity</div>
<div class="k-navi">
&#0187; <a href="/rendering">3D Renderings</a><br>
&#0187; <a href="/flash">Flash Animation</a><br>
&#0187; <a href="/javascript">JavaScript</a><br>
&#0187; <a href="/fonts">Fonts</a><br>
&#0187; <a href="/metacity">Metacity</a><br>
&#0187; <a href="/doc/">Tutorials</a>
</div>

<div class="k-section">Software</div>
<div class="k-navi">
&#0187; <a href="/rivescript">RiveScript</a><br>
&#0187; <a href="/errorgen">Error Generator</a><br>
&#0187; <a href="/tkcalc">Tk Calculator</a><br>
&#0187; <a href="http://sh.kirsle.net/" target="_blank">Terminal Apps</a><br>
&#0187; <a href="/pccc">CyanChat Client</a>
</div>

<div class="k-section">Web Tools</div>
<div class="k-navi">
&#0187; <a href="/wizards/ttf2eot.cgi">TTF to EOT</a><br>
&#0187; <a href="/wizards/fader.cgi">Text Fader</a><br>
&#0187; <a href="/wizards/favicon.cgi">Favicons</a><br>
&#0187; <a href="/wizards/distance.cgi">Distance Calc</a><br>
&#0187; <a href="/wizards/translator.html">Azulian Encoder</a><br>
&#0187; <a href="/wizards/xbmask.cgi">XBM Masks</a>
</div>

<div class="k-section">Subdomains</div>
<div class="k-navi">
&#0187; <a href="http://sh.kirsle.net/">Shell Scripts</a><br>
&#0187; <a href="http://rpm.kirsle.net/">Linux RPMs</a><br>
&#0187; <a href="http://nano.kirsle.net/">Kirsle::Nano</a><br>
&#0187; <a href="http://minecraft.kirsle.net/">Minecraft Server</a>
</div>

<div class="k-section">Miscellany</div>
<div class="k-navi">
&#0164; <a href="/firered">Pokemon Fuchsia City</a><br>
&#0164; <a href="/msdos">DOS and Windows</a><br>
&#0164; <a href="/raspberrypi">Raspberry Pi</a>
</div>

<div class="k-section">Links</div>
<div class="k-navi">
&#0164; <a href="https://www.google.com/+NoahPetherbridge">Google+</a><br>
&#0164; <a href="https://www.facebook.com/npetherbridge">Facebook</a><br>
&#0164; <a href="https://twitter.com/kirsle">Twitter</a><br>
&#0164; <a href="https://myspace.com/kirsle">MySpace</a><br>
&#0164; <a href="https://github.com/kirsle">Github</a><br>
&#0164; <a href="http://search.cpan.org/~kirsle">CPAN</a>
</div>

<div style="text-align: center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-0838718168234603";
/* Kirsle.net Nav */
google_ad_slot = "1728209841";
google_ad_width = 120;
google_ad_height = 240;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>

<div class="k-section">Fan Club</div>
<div class="k-navi">
{% if session["login"] %}
&#0164; Hi, <big>{{ session["name"] }}</big><br>
{% if session["role"] == "admin" %}
&#0187; <a href="{{ url_for('admin.index') }}">Admin Center</a><br>
{% endif %}
&#0187; <a href="{{ url_for('blog.update') }}">Update Blog</a><br>
{% if "impersonator" in session %}
&#0187; <a href="{{ url_for('admin.unimpersonate') }}">Unimpersonate</a><br>
{% endif %}
&#0187; <a href="{{ url_for('account.logout') }}">Log Out</a>
{% else %}
&#0187; <a href="{{ url_for('account.login') }}">Log In</a>
{% endif %}
</div><p>

<div class="k-navi">
<div class="center">
<a href="http://validator.w3.org/check?uri=referer">
<img src="/static/images/html.png" width="88" height="31" alt="HTML 4.01 Strict">
</a><br>

<a href="http://jigsaw.w3.org/css-validator/validator?uri=http://www.kirsle.com/solar/screen.css">
<img src="/static/images/css.png" width="88" height="31" alt="CSS">
</a>
</div>
</div>
</div>

<script type="text/javascript" src="/js/jquery-2.1.0.min.js"></script>
{% block scripts %}{% endblock %}

<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-27498092-1']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>

</body>
</html>

+ 67
- 0
www/metacity.html View File

@@ -0,0 +1,67 @@
{% extends "layout.html" %}
{% block title %}Metacity Desktop Themes{% endblock %}
{% block content %}

<h1>Metacity Desktop Themes</h1>

These are some themes for the Metacity window manager on the GNOME desktop. If
you don't know what that is, then you probably aren't a Linux user, and you can
ignore the existence of this page.

<h2>RazrFX</h2>

<img src="/projects/Metacity/razr.png" width="272" height="57" alt="RazrFX"><p>

This is my first hand-drawn Metacity theme (Zune and Lunacity were derived from screenshots). The intent
was to have a thin but good-looking Metacity theme. This one adamantly keeps a 20 pixel height on the
title bar, regardless of your font size (read: use 10pt title font size or smaller).<p>

&#0164; <a href="/download?type=gpl&project=Metacity&file=Metacity-RazrFX-0.02.tar.gz">RazrFX 0.02</a>
(TAR.GZ; 46.4 KB)

<h2>Zune</h2>

<img src="/projects/Metacity/zune.png" width="274" height="68" alt="Zune"><p>

It's the Windows XP Zune theme for Metacity. There's also an XFWM4 theme for
users who use the XFCE desktop environment.<p>

&#0164; <a href="/download?project=Metacity&file=Metacity-Zune-0.02.tar.gz">Zune 0.02</a>
(TAR.GZ; 27.4 KB)

<h2>Lunacity</h2>

<img src="/projects/Metacity/Luna/blue.png" width="274" height="68" alt="Lunacity Blue"><br>
<img src="/projects/Metacity/Luna/olive.png" width="274" height="68" alt="Lunacity Olive Green"><br>
<img src="/projects/Metacity/Luna/silver.png" width="274" height="68" alt="Lunacity Silver"><br>
<img src="/projects/Metacity/Luna/pink.png" width="274" height="68" alt="Lunacity Pink"><p>

These are Metacity clones of the default Luna themes for Windows XP. Oh, and
there's also a pink version of Luna Silver.<p>

&#0164; <a href="/download?project=Metacity&file=Metacity-Lunacity-0.02.tar.gz">Lunacity 0.02</a>
(TAR.GZ; 75.5 KB)

<h1>XFWM4 Desktop Themes</h1>

These themes are for XFCE's window manager <strong>only</strong> and not Metacity.

<h2>Sun OpenSolaris Nimbus</h2>

<img src="/projects/Metacity/nimbus.png" width="308" height"80" alt="Nimbus"><p>

This is a port of the Nimbus theme from OpenSolaris to XFWM4. I didn't realize
until <em>after</em> I completed this theme that somebody else had already
done it. So, I decided to 1up that person and add the other XFWM4 window
buttons for "shade" and "stick". They look like the Nimbus buttons but are
teal and purple.<p>

Also there's a second version I made (also named Nimbus, so only install one at
a time) that shows application icons instead of the normal menu button.<p>

&#0164; <a href="/download?project=Metacity&file=XFWM4-Nimbus-0.04.tar.gz">Nimbus 0.04</a>
(TAR.GZ; 24 KB)<br>
&#0164; <a href="/download?project=Metacity&file=XFWM4-Nimbus-MenuIcon.tar.gz">Nimbus w/ App Icons</a>
(TAR.GZ; 22 KB)

{% endblock %}

+ 56
- 0
www/msdos.html View File

@@ -0,0 +1,56 @@
{% extends "layout.html" %}
{% block title %}MS-DOS{% endblock %}
{% block content %}

<h1>MS-DOS &amp; Software</h1>

This page contains download links for a very old Microsoft operating system so
that it can be preserved -- on this corner of the Internet, anyway -- for
anyone who is curious to tinker with the first versions of Windows or who just
wants to take a trip down Nostalgia Avenue.<p>

The operating systems here are distributed as floppy disk image files (with an
.img extension). If you actually have a floppy drive, you'll have to flash
these images onto floppy disks. If you just want to use
<a href="http://www.virtualbox.org/">VirtualBox</a>, it can make use of the
floppy image files directly.<p>

<img src="/creativity/articles/doswin31_thumb.jpg">

<h2>MS-DOS 6.22</h2>

The last version of MS-DOS from the Windows 3.1 era, before Windows 95.<p>

&#0164; <a href="download?project=DOS&file=MS-DOS-6.22.zip">Download</a> (.zip, 3.5 MB)

<h2>Windows for Workgroups 3.11</h2>

The first version of Windows to support TCP/IP networking.<p>

&#0164; <a href="download?project=DOS&file=WfW-3.11.zip">Download</a> (.zip, 10.3 MB)

<h2>Hardware Drivers for VirtualBox</h2>

These are some hardware drivers for DOS and Windows 3.x that are known to work
with VirtualBox's emulated hardware. Drivers include:

<ul>
<li>CD-ROM driver</li>
<li>DOSIDLE to make MS-DOS stop consuming 100% CPU</li>
<li>WQGHLT to make Windows 3.x stop consuming 100% CPU</li>
<li>SoundBlaster 16 as a CD image (requires the CD-ROM driver)</li>
</ul>

&#0164; <a href="download?project=DOS&file=DOS-Drivers.zip">Download</a> (.zip, 4.0 MB)<p>

<h1>Comments</h1>

For tips, tricks, or to leave comments, see the relevant blog post "<a href="/blog/kirsle/ms-dos-and-windows-3-1">MS-DOS and Windows 3.1</a>". The comments on that blog post are shared to this page as well (so comments on either page show up in both places).<p>

{{ include_page("comment.partial_index",
thread="blog-42",
subject="MS-DOS",
header=False,
) | safe }}

{% endblock %}

+ 354
- 0
www/pccc.html View File

@@ -0,0 +1,354 @@
{% extends "layout.html" %}
{% block title %}Perl CyanChat Client{% endblock %}
{% block content %}

<h1>Perl CyanChat Client</h1>

<ul>
<li><a href="#intro">Project Description</a></li>
<li><a href="#screenshots">Screenshots</a></li>
<li><a href="#license">License</a></li>
<li><a href="#downloads">Downloads</a></li>
</ul>

<a name="intro"></a>
<img src="projects/PCCC/logo.png" alt="PCCC" width="400" height="90">
<h2>Project Description</h2>

<strong>Perl CyanChat Client</strong> (PCCC) is a chat client for
<em>CyanChat</em>, the official chat room of
<a href="http://www.cyanworlds.com/">Cyan Worlds, Inc.</a>.<p>

This project is now hosted on Github:
<a href="https://github.com/kirsle/PCCC">https://github.com/kirsle/PCCC</a>

<h3>Features</h3>

Here's a brief list of some of PCCC's features:

<ul>
<li>Full support of Version 1 of the CyanChat protocol.</li>
<li>Save the conversation in XHTML format, keeping colors intact.</li>
<li>Configurable "default nickname", and the ability to automatically
sign you into the chat when you connect.</li>
<li>Configurable CC host and port, automatically connect on startup,
and reconnect when disconnected.</li>
<li>Configurable colors, both for the main window and for the chat
message and nickname colors.</li>

<li>Configurable "echo" color, so that your own nickname in chat will
show up in a different color, so you can quickly distinguish
your messages from everyone else's.</li>
<li>Clickable hyperlinks when they appear in chat.</li>
<li>Support for IRC-style "/me" actions.</li>
<li>Messages in the format <b>*...*</b> can be displayed as "/me" actions
automatically.</li>
<li>Sound effects!</li>

<li>Private message windows so you can chat privately in an
Instant Messenger style.</li>
<li>Option to ignore private messages from ChatServer (useful when
Cho goes down and you need to use the debug port)</li>
<li>Option to automatically ignore users who ignore you.</li>
<li>Option to notify you when users ignore you.</li>
<li>Option to send a "real" ignore command to the server when you
ignore a user (as opposed to a local ignore).</li>
<li>Options to reverse the orientation of the chat client, so that
new messages appear on the bottom, and the input text box
is at the bottom (like most traditional chat programs).</li>

<li>A full built-in documentation system.</li>
<li>Built-in packet viewer with the Debug Window / Console.</li>
<li>A dialog to send raw commands to the CC server.</li>
</ul>

<a name="screenshots"></a>
<h2 style="margin-top: 0px">Screenshots</h2>

<table border="0" cellspacing="0" cellpadding="0" style="margin-left: auto; margin-right: auto">
<tr>
<td align="center" valign="top">
<a href="projects/PCCC/ss07.png">
<img src="projects/PCCC/t_ss07.png" width="324" height="256" alt="Screenshot">
</a><br>
PCCC 3.0 running on Windows 7 Beta.
</td>
<td align="center" valign="top">

<a href="projects/PCCC/ss08.png">
<img src="projects/PCCC/t_ss08.png" width="324" height="256" alt="Screenshot">
</a><br>
Ignore List preferences on Windows 7 Beta.
</td>
</tr>
<tr>
<td align="center" valign="top">
&nbsp;<br>

<a href="projects/PCCC/ss06.png">
<img src="projects/PCCC/t_ss06.png" width="324" height="269" alt="Screenshot">
</a><br>
Linux: PCCC connected to a local CyanChat server,<br>
demonstrating the colors of Cyan Admins and<br>
Special Guests.
</td>
<td align="center" valign="top">

&nbsp;<br>
<a href="projects/PCCC/ss05.png">
<img src="projects/PCCC/t_ss05.png" width="324" height="240" alt="Screenshot">
</a><br>
PCCC running on Mac OS X using X Windows.<br>
<small>Screenshot credit: Amonre</small>
</td>
</tr>

<tr>
<td align="center" valign="top">
&nbsp;<br>
<a href="projects/PCCC/ss04.png">
<img src="projects/PCCC/t_ss04.png" width="324" height="270" alt="Screenshot">
</a><br>
Linux: A tab from the Preferences window.
</td>
<td align="center" valign="top">

&nbsp;<br>
<a href="projects/PCCC/ss03.png">
<img src="projects/PCCC/t_ss03.png" width="324" height="240" alt="Screenshot">
</a><br>
Linux: PCCC in action.
</td>
</tr>
<tr>
<td align="center" valign="top">

&nbsp;<br>
<a href="projects/PCCC/ss02.gif">
<img src="projects/PCCC/t_ss02.gif" width="324" height="257" alt="Screenshot">
</a><br>
Windows XP: PCCC with a couple dialog windows open.
</td>
<td align="center" valign="top">
&nbsp;<br>
<a href="projects/PCCC/ss01.gif">

<img src="projects/PCCC/t_ss01.gif" width="324" height="257" alt="Screenshot">
</a><br>
Windows XP: PCCC 2.0's main window.
</td>
</tr>
</table>

<a name="license"></a>
<h2 style="margin-top: 0px">Software License</h2>

<pre> Perl CyanChat Client
Copyright (C) 2013 Noah Petherbridge

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</pre>

<a name="downloads">
<h2 style="margin-top: 0px">Downloads</h2>

It's recommended that you download the latest version of this software
as listed below. To download older versions and source code, skip to
the next section.

<h3>Windows Executable</h3>

<blockquote>
<img src="images/dos.png" width="32" height="32" alt="Win32" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-3.0_bin.zip">
Download Perl CyanChat Client</a><br>
Version 3.0 - 2007/06/21<br>
<small>ZIP format/2.3 MB</small>
</blockquote>

<h3>Linux Binary</h3>

<blockquote>
<img src="images/exec.png" width="32" height="32" alt="Linux" style="vertical-align: middle">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-3.0_linux.tar.gz">
Download Perl CyanChat Client</a><br>
Version 3.0 - 2007/06/21<br>

<small>TAR.GZ format/4.7 MB</small>
</blockquote>

<h2>All Distributions</h2>

The following are all the distributions available for this software,
starting with the most recent. Source code is also available for all
versions.<p>

<table border="0" cellspacing="2" cellpadding="2" class="distro">
<tr>

<th>Release</th>
<th>Windows EXE</th>
<th>Linux Binary</th>
<th>Source Code</th>
</tr>
<tr>
<td>
<b>3.0</b><br>
<small>2007/06/21</small>
</td>
<td>

<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-3.0_bin.zip">PCCC 3.0</a><br>
<small>(ZIP; 2.3 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-3.0_linux.tar.gz">PCCC 3.0</a><br>
<small>(TAR.GZ; 4.7 MB)</small>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-3.0_src.tar.gz">PCCC 3.0</a><br>
<small>(TAR.GZ; 175 KB)</small>

</tr>
<tr>
<td>
<b>2.8</b><br>
<small>2007/06/01</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-2.8_bin.zip">PCCC 2.8</a><br>
<small>(ZIP; 2.2 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-2.8_linux.tar.gz">PCCC 2.8</a><br>

<small>(TAR.GZ; 4.6 MB)</small>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.8_src.tar.gz">PCCC 2.8</a><br>
<small>(TAR.GZ; 48.7 KB)</small>
</tr>
<tr>
<td>
<b>2.7</b><br>
<small>2007/05/23</small>
</td>
<td>

<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-2.7_bin.zip">PCCC 2.7</a><br>
<small>(ZIP; 2 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-2.7_linux.tar.gz">PCCC 2.7</a><br>
<small>(TAR.GZ; 4.5 MB)</small>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.7_src.zip">PCCC 2.7</a><br>
<small>(TAR.GZ; 42 KB)</small>

</tr>
<tr>
<td>
<b>2.6</b><br>
<small>2007/04/14</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<em>Not available.</em>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>

<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.6_src.tar.gz">PCCC 2.6</a><br>
<small>(TAR.GZ; 40.7 KB)</small>
</tr>
<tr>
<td>
<b>2.3</b><br>
<small>2006/11/07</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-2.3_bin.zip">PCCC 2.3</a><br>

<small>(ZIP; 3.2 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.3_src.zip">PCCC 2.3</a><br>
<small>(ZIP; 31.2 KB)</small>
</tr>
<tr>
<td>
<b>2.1</b><br>

<small>2006/10/24</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<em>Not available.</em>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.1_src.zip">PCCC 2.1</a><br>
<small>(ZIP; 23.5 KB)</small>

</tr>
<tr>
<td>
<b>2.0</b><br>
<small>2006/10/01</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<em>Not available.</em>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>

<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-2.0_src.zip">PCCC 2.0</a><br>
<small>(ZIP; 21.2 KB)</small>
</tr>
<tr>
<td>
<b>1.2</b><br>
<small>2005/07/19</small>
</td>
<td>
<img src="images/dos.png" width="32" height="32" alt="Win32">
<a href="/download?type=bin&amp;project=PCCC&amp;file=PCCC-1.2_bin.zip">PCCC 1.2</a><br>

<small>(ZIP; 3.2 MB)</small>
<td>
<img src="images/exec.png" width="32" height="32" alt="Linux">
<em>Not available.</em>
<td>
<img src="images/perl.png" width="32" height="32" alt="Perl Source">
<a href="/download?type=gpl&amp;project=PCCC&amp;file=PCCC-1.2_src.zip">PCCC 1.2</a><br>
<small>(ZIP; 16.2 KB)</small>
</tr>
</table>

{% endblock %}

+ 86
- 0
www/raspberrypi.html View File

@@ -0,0 +1,86 @@
{% extends "layout.html" %}
{% block title %}Raspberry Pi{% endblock %}
{% block content %}

<h1>Raspberry Pi</h1>

This page is my personal reference/cheat sheet for Raspberry Pi
related topics.<p>

<h1>Raspbian Wheezy</h1>

<h2>Install the XFCE Desktop</h2>

To install XFCE to use it instead of the default LXDE.

<pre>$ sudo apt-get install task-xfce-desktop</pre>

<h2>XFCE for the TightVNC Server</h2>

After setting up TightVNC, you can configure it to load the XFCE desktop environment
by modifying your <code>~/.vnc/xstartup</code> file. Mine looks like this:

<pre>#!/bin/sh

xrdb $HOME/.Xresources
xsetroot -solid grey
export XXL_XMODMAP_DISABLE=1
/usr/bin/xfce4-session</pre>

<ul>
<li>Use <code>vncpasswd</code> to set a password.</li>
<li>Use <code>vncserver</code> to start a VNC server (defaults to display :1
for the first server)</li>
<li>Use <code>vncserver -kill :1</code> to kill a server.
</ul>

<h2>Pi User Groups</h2>

If you add other users to the system, you'll probably want them to be members of
all the groups the pi user is part of. So...

<ul>
<li>adm</li>
<li>dialout</li>
<li>cdrom</li>
<li>sudo</li>
<li>audio</li>
<li>video</li>
<li>plugdev</li>
<li>games</li>
<li>users</li>
<li>netdev</li>
<li>input</li>
</ul>

<pre>$ sudo usermod -a -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,netdev,input <ins>kirsle</ins></pre>

<h2>Sound access for other users</h2>

If you add a second user to the system besides the default "pi" user, they don't
get access to the sound device by default - so for example, the XFCE Mixer applet
gives a gstreamer error.

To get the XFCE Mixer applet to work, make sure the gstreamer plugins are
installed.

<pre>$ sudo apt-get install gstreamer0.10-plugins</pre>

<h3>Method 1: audio user group</h3>

This is probably the preferred way. Make sure your alternate user is a member of
the <code>audio</code> group.

<h3>Method 2: Add your user to the ACL for /dev/snd</h3>

<pre>$ sudo setfacl -m u:<ins>kirsle</ins>:rw /dev/snd/*</pre>