<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-7712713462173177127</atom:id><lastBuildDate>Thu, 31 Jul 2008 03:35:16 +0000</lastBuildDate><title>Alphaios Blog</title><description/><link>http://alphaios.net/blog/</link><managingEditor>noreply@blogger.com (The Music Guy)</managingEditor><generator>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-8137651056955049731</guid><pubDate>Thu, 31 Jul 2008 03:33:00 +0000</pubDate><atom:updated>2008-07-30T22:35:16.886-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>resources</category><category domain='http://www.blogger.com/atom/ns#'>python</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><title>Resource Management System Changed</title><description>The resource management system I posted before has been drastically changed. If you were using it and are expecting an updated version, expect the new version to be completely incompatible with your code!</description><link>http://alphaios.net/blog/2008/07/resource-management-system-changed.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-7550566330585221734</guid><pubDate>Thu, 31 Jul 2008 03:22:00 +0000</pubDate><atom:updated>2008-07-30T22:32:31.646-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>tracked</category><category domain='http://www.blogger.com/atom/ns#'>new</category><category domain='http://www.blogger.com/atom/ns#'>music</category><category domain='http://www.blogger.com/atom/ns#'>update</category><category domain='http://www.blogger.com/atom/ns#'>module</category><title>Songs No. 74 and No. 75 Finished</title><description>I finished two new songs. (Actually I finished them over 2 weeks ago but I forgot to upload them with the rest of the other songs).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://alphaios.net/music/files/mod/0074_ifiknew.xm"&gt;No. 74 - "If I Knew"&lt;/a&gt;&lt;br /&gt;&lt;a href="http://alphaios.net/music/files/mod/0075_dancetrack.xm"&gt;No. 75 - "Running on the Dance Track"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm also working on an alternate version of 74 that uses guitars and a piano instead of synth instruments, but I'm having trouble with the lead in the second half.</description><link>http://alphaios.net/blog/2008/07/songs-no-74-and-no-75-finished.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-3593600660015768437</guid><pubDate>Sun, 27 Jul 2008 23:08:00 +0000</pubDate><atom:updated>2008-07-27T18:10:50.554-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>wii</category><title>Mystery Solved</title><description>Yep, it's a battery. The panel on the bottom of the Wii is for the battery-backed memory. (Booooring...)</description><link>http://alphaios.net/blog/2008/07/blog-post.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-6468414578355358895</guid><pubDate>Thu, 24 Jul 2008 04:25:00 +0000</pubDate><atom:updated>2008-07-27T18:12:25.809-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>wii</category><title>Weird Panel on the Bottom of the Wii</title><description>I just took advantage of Nintendo's free Wiimote jacket deal. (Yeah, apparently that's still going on.) While looking for the serial number for the Wii, I noticed a small, inconspicuous, removable panel on the bottom below the eject button:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://alphaios.net/blog/uploaded_images/Photo_072308_001-719232.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://alphaios.net/blog/uploaded_images/Photo_072308_001-719229.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm not really sure what it's for, but the best I could get from various Google searches is that it holds some sort of button-cell battery for keeping the clock ticking when its unplugged. That would make sense; nearly every computer has one of these hidden in them somewhere.&lt;br /&gt;&lt;br /&gt;I'm afraid to actually remove the panel to see what's inside. First of all, because it isn't my Wii. It's my brother's. ^_^ Second, because there's a small, small chance it would void the warranty...not likely, but not risking it. Third, because I don't have a Philip's head screwdriver small enough to get the screw out...&lt;br /&gt;&lt;br /&gt;I'll bet this little mystery is solved by the manual. Of course, I don't know where the manual went, so that's no help. :P</description><link>http://alphaios.net/blog/2008/07/weird-panel-on-bottom-of-wii.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-1400947611490218323</guid><pubDate>Mon, 21 Jul 2008 07:19:00 +0000</pubDate><atom:updated>2008-07-21T02:30:09.081-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>resources</category><category domain='http://www.blogger.com/atom/ns#'>API</category><category domain='http://www.blogger.com/atom/ns#'>engine</category><category domain='http://www.blogger.com/atom/ns#'>python</category><category domain='http://www.blogger.com/atom/ns#'>code</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><category domain='http://www.blogger.com/atom/ns#'>dream game</category><title>Resource Management System for Game Engine</title><description>I have just completed the resource management system for my upcoming game engine, "Scrollback". It hasn't been tested yet, but the syntax is, at least, correct.&lt;br /&gt;&lt;br /&gt;If anyone would like to comment on the API or anything else, please do. I'm looking for some (inteligent) input.&lt;br /&gt;&lt;br /&gt;Sorry about the sidebar on the right covering up the code...not much I can do about that right now, unfortunately. :( You should still be able to highlight and copy.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;# sbak/resource.py&lt;br /&gt;"""&lt;br /&gt;    This module defines the resource management system.&lt;br /&gt;    &lt;br /&gt;    This version of the resoruce management system has been significantly&lt;br /&gt;    toned down from what I originally had it mind. This version does not have&lt;br /&gt;    any system of library hierarchies, names, or aliases, as did the original&lt;br /&gt;    plan. Instead, there is only the "registry," and all resources are&lt;br /&gt;    automatically registered with it when they are created, loaded, or stubbed.&lt;br /&gt;    (Incidentally, creating a resource is how a resource is stubbed!)&lt;br /&gt;    &lt;br /&gt;    Complete but untested as of 2008-07-21.                      - The Music Guy&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;import os.path&lt;br /&gt;from error import ResourceError&lt;br /&gt;import core._debug&lt;br /&gt;&lt;br /&gt;__all__ = (&lt;br /&gt;    'init',&lt;br /&gt;    'register',&lt;br /&gt;    'unregister',&lt;br /&gt;    'get',&lt;br /&gt;    'get_exists',&lt;br /&gt;    'BaseResource'&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;# This maps the IDs of registered resources the actual resources.&lt;br /&gt;_resource = {}&lt;br /&gt;&lt;br /&gt;# Current "working directory" of the resource manager&lt;br /&gt;_cwd = ''&lt;br /&gt;&lt;br /&gt;def init():&lt;br /&gt;    """ Initializes the resource management system.&lt;br /&gt;        Must be called before using the resource management system&lt;br /&gt;        NOTE: This method doesn't actually do anything right now, but I'm fairly&lt;br /&gt;        sure I will need it later, so I'm defining it anyway.&lt;br /&gt;    """&lt;br /&gt;    pass&lt;br /&gt;&lt;br /&gt;def register(res):&lt;br /&gt;    """ Registers a resource with the manager.&lt;br /&gt;    &lt;br /&gt;        You don't need to call this usually because resources will register&lt;br /&gt;        themselves automatically, provided they call the BaseResource&lt;br /&gt;        initializer on themselves.&lt;br /&gt;        &lt;br /&gt;        Raises error.ResourceError if you attempt to register a resource with an&lt;br /&gt;        ID that is in use by another registered resource, or if you attempt to&lt;br /&gt;        register an object which does not appear to be a resource.&lt;br /&gt;    """&lt;br /&gt;    global _resource&lt;br /&gt;    try:&lt;br /&gt;        theID = res.id&lt;br /&gt;    except AttributeError:&lt;br /&gt;        raise ResourceError,"Object being registered does not have a resource ID."&lt;br /&gt;    if theID in _resource:&lt;br /&gt;        raise ResourceError,'Duplicate registration of resource ID "%s".'%theID&lt;br /&gt;    _resource[theID] = res&lt;br /&gt;&lt;br /&gt;def unregister(res):&lt;br /&gt;    """ Unregisters a resource from the resource manager.&lt;br /&gt;    &lt;br /&gt;        Call this on a resource object or ID that has been registered to make&lt;br /&gt;        the system drop its reference to the resource. However, you will no&lt;br /&gt;        longer be able to get a reference to the resource by ID.&lt;br /&gt;        &lt;br /&gt;        Raises error.ResourceError if you attempt to unregister a resource that&lt;br /&gt;        is not currently registered.&lt;br /&gt;    """&lt;br /&gt;    pass # TODO: unregister&lt;br /&gt;&lt;br /&gt;def get(id):&lt;br /&gt;    """ Returns the resource with the given ID.&lt;br /&gt;        Loads the resource explicitly if it has not already been loaded.&lt;br /&gt;        Returns None if there isn't a resource registered with the ID.&lt;br /&gt;    """&lt;br /&gt;    global _resource&lt;br /&gt;    try:&lt;br /&gt;        res = _resource[id]&lt;br /&gt;    except KeyError:&lt;br /&gt;        return None&lt;br /&gt;    res.load()&lt;br /&gt;    return res&lt;br /&gt;&lt;br /&gt;def _get_implicit(id):&lt;br /&gt;    """ Internal function.&lt;br /&gt;        Implicitly loads the resource with the given ID and returns it.&lt;br /&gt;        Returns None if there isn't a resource registered with the ID.&lt;br /&gt;    """&lt;br /&gt;    global _resource&lt;br /&gt;    try:&lt;br /&gt;        res = _resource[id]&lt;br /&gt;    except KeyError:&lt;br /&gt;        return None&lt;br /&gt;    res.load(True)&lt;br /&gt;    return res&lt;br /&gt;&lt;br /&gt;def get_exists(id):&lt;br /&gt;    ' Returns whether or not there is a resource registered with the given ID. '&lt;br /&gt;    return id in _resource&lt;br /&gt;&lt;br /&gt;def set_directory(*d):&lt;br /&gt;    """ Sets the "current working directory" of the resource manager.&lt;br /&gt;    &lt;br /&gt;        You may pass a directory in "pieces" as a arbitrary number of arguments.&lt;br /&gt;        The pieces will be reassembled using the os.path.join() function.&lt;br /&gt;        &lt;br /&gt;        This directory will be prefixed to the paths of filenames of resources&lt;br /&gt;        loaded or stubbed from the time of the calling till the end of the next&lt;br /&gt;        cycle.&lt;br /&gt;    """&lt;br /&gt;    global _cwd&lt;br /&gt;    _cwd = join_paths(*d)&lt;br /&gt;&lt;br /&gt;class BaseResource(object):&lt;br /&gt;    """ Base class for all resource types.&lt;br /&gt;    &lt;br /&gt;        The following methods should be overwritten by subclasses:&lt;br /&gt;        __init__, load, unload&lt;br /&gt;        &lt;br /&gt;        See the documentation for each of these methods for more info.&lt;br /&gt;        &lt;br /&gt;        Additionally, subclasses should define a `save` method for allowing a&lt;br /&gt;        resource to save its data to a file. It should be defined as such:&lt;br /&gt;        &lt;br /&gt;        class SomeResourceType(BaseResource):&lt;br /&gt;            ...&lt;br /&gt;            def save(self,filename=None):&lt;br /&gt;                ...&lt;br /&gt;                &lt;br /&gt;        The `filename` argument is the file to which the resoruce data will be&lt;br /&gt;        saved relative to the "current working directory" of the resource&lt;br /&gt;        system, which can be determined by calling `resource.get_cwd()`.&lt;br /&gt;        If the filename is not present, the value of `self.filename` should be&lt;br /&gt;        assumed.&lt;br /&gt;    """&lt;br /&gt;    &lt;br /&gt;    __slots__ = (&lt;br /&gt;        '_id',       # Unique keyword ID of the resource&lt;br /&gt;        '_filename', # Name of file from which this resource was last saved/loaded&lt;br /&gt;        '_loaded',   # Loaded status (0=not loaded, 1=explicit, 2=implicit)&lt;br /&gt;        '_loads',    # Number of times this resource has been loaded&lt;br /&gt;        '_depend',   # List of the IDs of all dependencies&lt;br /&gt;    )&lt;br /&gt;    &lt;br /&gt;    def __init__(self, ID=None, filepath=None, ext=None):&lt;br /&gt;        """ BaseResource initializer.&lt;br /&gt;            &lt;br /&gt;            You may optionally omit either the ID or the filename, but not both.&lt;br /&gt;            The value present will be used in place of the value missing.&lt;br /&gt;            &lt;br /&gt;            In the case of a missing ID but a present filename, the ID will be&lt;br /&gt;            the filename without any directory prefixes and without the&lt;br /&gt;            extension.&lt;br /&gt;            &lt;br /&gt;            If the `ext` paramater is used, it will be added to the end of the&lt;br /&gt;            filename as its extension, but only if the filename was determined&lt;br /&gt;            from the ID.&lt;br /&gt;            &lt;br /&gt;            Tip: When loading or stubbing many resources at a time from multiple&lt;br /&gt;            directories, it may be helpful to use the resource.chdir() function,&lt;br /&gt;            which adds a prefix to all filenames without changing the working&lt;br /&gt;            directory.&lt;br /&gt;            &lt;br /&gt;            This should be called by subclasses.&lt;br /&gt;        """&lt;br /&gt;        global _cwd&lt;br /&gt;        &lt;br /&gt;        trueFName = filename&lt;br /&gt;        trueID = ID&lt;br /&gt;        &lt;br /&gt;        # Subbing ID for filename&lt;br /&gt;        if ID is None:&lt;br /&gt;            # Fail if neither filename nor ID are present&lt;br /&gt;            if filename is None:&lt;br /&gt;                raise ValueError,'Must pass at least an ID or a filename.'&lt;br /&gt;            trueID = os.path.basename(filename)&lt;br /&gt;            trueID = trueID[0:trueID.find('.')]&lt;br /&gt;        # Subbing filename for ID&lt;br /&gt;        if filename is None:&lt;br /&gt;            if ext is None:&lt;br /&gt;                trueFName = ID&lt;br /&gt;            else:&lt;br /&gt;                trueFName = ID + '.' + ext&lt;br /&gt;        # Fill in the blanks&lt;br /&gt;        self._id = trueID&lt;br /&gt;        self._filename = os.path.join(_cwd,trueFName) # Add the cwd prefix&lt;br /&gt;        self._loaded = 0 # Not loaded&lt;br /&gt;        self._loads = 0 # Has been loaded 0 times&lt;br /&gt;        self._depend = [] # Default empty dependency table&lt;br /&gt;        # Attempt to register&lt;br /&gt;        register(self)&lt;br /&gt;    &lt;br /&gt;    def add_depend(self, *deps):&lt;br /&gt;        """ Adds one or more dependencies to the resource's dependency list.&lt;br /&gt;            The dependencies should be resources or resource IDs. A duplicate ID&lt;br /&gt;            will raise error.ResourceError, as will attempting to use an object&lt;br /&gt;            which is not a dependency or string.&lt;br /&gt;        """&lt;br /&gt;        for dep in deps:&lt;br /&gt;            if dep in self._depend:&lt;br /&gt;                raise ResourceError,'Duplicate dependency "%s" for resource "%s".'%(dep,self._id)&lt;br /&gt;            if isinstance(dep,str):&lt;br /&gt;                self._depend.append(dep)&lt;br /&gt;            else:&lt;br /&gt;                try:&lt;br /&gt;                    self._depend.append(dep.id)&lt;br /&gt;                except AttributeError:&lt;br /&gt;                    raise ResourceError,'Dependency %s is not a string and has no id property.'%dep&lt;br /&gt;    &lt;br /&gt;    def remove_depend(self, dep):&lt;br /&gt;        """ Removes the given dependency from this resource.&lt;br /&gt;            Raises error.ResourceError if the resource does not depend on the&lt;br /&gt;            other resource.&lt;br /&gt;        """&lt;br /&gt;        if dep not in self_depend:&lt;br /&gt;            raise ResourceError,'No dependency "%s" exists for resource "%s".'%(dep,self_id)&lt;br /&gt;        self._depend.remove(dep)&lt;br /&gt;    &lt;br /&gt;    def depends_on(self, dep):&lt;br /&gt;        """ Returns whether or not this resource depends on the given resource. """&lt;br /&gt;        return dep in self._depends&lt;br /&gt;    &lt;br /&gt;    def get_depends(self):&lt;br /&gt;        """ Returns a list of all resources this resource depends on. """&lt;br /&gt;        return self._depends[:]&lt;br /&gt;    &lt;br /&gt;    def test_depends(self):&lt;br /&gt;        """ Make sure all dependencies exist.&lt;br /&gt;            Return True if all dependencies exist, otherwise False.&lt;br /&gt;            If recurse is true, also tests that dependencies of dependencies&lt;br /&gt;            are met, and so on.&lt;br /&gt;            TODO: Add recursive dependency checking capabilities&lt;br /&gt;        """&lt;br /&gt;        for dep in self._depends:&lt;br /&gt;            if not get_exists(dep):&lt;br /&gt;                return False&lt;br /&gt;        return True&lt;br /&gt;        &lt;br /&gt;    def load(self,implicit=False):&lt;br /&gt;        """ Loads the resource data explicitly (default) or implicitly.&lt;br /&gt;        &lt;br /&gt;            Subclasses should overwrite this method to allow their data to be&lt;br /&gt;            loaded, but should also call this base method AFTER they do so.&lt;br /&gt;            &lt;br /&gt;            Subclasses should not load data if it is already loaded.&lt;br /&gt;            &lt;br /&gt;            If a resource depends on other resources it should load them&lt;br /&gt;            implicitly when this method is called.&lt;br /&gt;            &lt;br /&gt;            Other resources depending on this resource should call this method&lt;br /&gt;            with implicit == True when they load it&lt;br /&gt;        """&lt;br /&gt;        if implicit:&lt;br /&gt;            if self._loaded == 0:&lt;br /&gt;                self._loaded = 2&lt;br /&gt;        else:&lt;br /&gt;            if self._loaded != 1:&lt;br /&gt;                self._loaded = 1&lt;br /&gt;    &lt;br /&gt;    def unload(self):&lt;br /&gt;        """ Unloads the resource data if it is loaded.&lt;br /&gt;        &lt;br /&gt;            Also decrements the load count.&lt;br /&gt;            &lt;br /&gt;            Subclasses should overwrite this method to allow their data to be&lt;br /&gt;            unloaded, but should also call this base method AFTER they do so.&lt;br /&gt;            &lt;br /&gt;            In debug mode, a warning will be issued when this method is called&lt;br /&gt;            and there still seems to be other objects using it, or if the data&lt;br /&gt;            is not loaded.&lt;br /&gt;        """&lt;br /&gt;        if self._loads &gt; 0 and core._debug:&lt;br /&gt;            print "Warning: Resource '"+self._id+"' unloaded while still in use!"&lt;br /&gt;        &lt;br /&gt;        self._loads -= 1&lt;br /&gt;        &lt;br /&gt;        if self._loads &lt; 0 or self._loaded==0:&lt;br /&gt;            if core._debug:&lt;br /&gt;                print "Debug Warning: Attempt to unload resource '"+self._id+"', but it is not loaded !"&lt;br /&gt;            self._loads = 0&lt;br /&gt;        &lt;br /&gt;        self._loaded = 0&lt;br /&gt;    &lt;br /&gt;    def unload_implicit(self):&lt;br /&gt;        """ Decrements the load count and calls self.unload() if it hits 0.&lt;br /&gt;            &lt;br /&gt;            Returns whether or not the data was actually unloaded.&lt;br /&gt;            &lt;br /&gt;            Does not unload data unless it was loaded implicitly!&lt;br /&gt;            &lt;br /&gt;            In debug mode, a warning will be issued if this method is called&lt;br /&gt;            when the data does not seem to be loaded.&lt;br /&gt;        """        &lt;br /&gt;        self._loads -= 1&lt;br /&gt;        &lt;br /&gt;        if self._loads==0 and self._loaded==2:&lt;br /&gt;            self._loads += 1 # This is to compensate for the decrement of the&lt;br /&gt;                             # unload() method&lt;br /&gt;            self.unload()&lt;br /&gt;&lt;br /&gt;    # In subclasses, the `save` method would usually bed defined about here&lt;br /&gt;&lt;br /&gt;    def get_id(self):&lt;br /&gt;        return self._id&lt;br /&gt;    &lt;br /&gt;    id = property(get_id, None, None,&lt;br /&gt;        """ (Read only.) The unique identifying string of the resource. """)&lt;br /&gt;    &lt;br /&gt;    def get_filename(self):&lt;br /&gt;        return self._filename&lt;br /&gt;    &lt;br /&gt;    def set_filename(self,v):&lt;br /&gt;        if not isinstance(v, str):&lt;br /&gt;            raise TypeError,'filename must be a string'&lt;br /&gt;        self._filename = v&lt;br /&gt;        &lt;br /&gt;    filename = property(get_filename, set_filename, None,&lt;br /&gt;        """ The full path and name of the file to which this resource's data is&lt;br /&gt;            saved and from which it is loaded relative to the current working&lt;br /&gt;            directory of the program. Should be a string.&lt;br /&gt;        """)&lt;br /&gt;    &lt;br /&gt;    def get_loaded(self):&lt;br /&gt;        return self._loaded&lt;br /&gt;    &lt;br /&gt;    loaded = property(get_loaded, None, None,&lt;br /&gt;        """ (Read only.) The loaded status of this resoruce.&lt;br /&gt;            0 = Not loaded,&lt;br /&gt;            1 = Loaded explicitly,&lt;br /&gt;            2 = Loaded implicitly. The data of implicitly-loaded resources are&lt;br /&gt;                unloaded automatically when its load count hits 0.&lt;br /&gt;        """)&lt;br /&gt;    &lt;br /&gt;    def get_loads(self):&lt;br /&gt;        return self._loads&lt;br /&gt;    &lt;br /&gt;    loads = property(self._loads,None,None,&lt;br /&gt;        """ (Read-only.) Number of times the resource has been told to load,&lt;br /&gt;            minus the number of times it has been told to unload.&lt;br /&gt;        """)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Man, it would be nice if Blogger supported a code block feature...</description><link>http://alphaios.net/blog/2008/07/resource-management-system-for-game.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-6764675135842398708</guid><pubDate>Fri, 18 Jul 2008 07:49:00 +0000</pubDate><atom:updated>2008-07-18T03:14:30.349-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>tracked</category><category domain='http://www.blogger.com/atom/ns#'>music</category><category domain='http://www.blogger.com/atom/ns#'>module</category><title>Song Archive Uploaded</title><description>I have just uploaded my entire set of tracked modules, &lt;b&gt;a whopping total of 73!&lt;/b&gt; I had no idea I had so many! I guess over the years they can really add up...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://alphaios.net/music"&gt;(Go to the Music section)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Anyway, because there were so many, I did not do a writeup for all of them. Instead, I added a simple script to the music page that will dynamically list all of the files in a certain directory.&lt;br /&gt;&lt;br /&gt;Some of these songs are extremely old--I found a date stamp of 2003 on one of them. I have tried to sort them all in order of completion by using a 4-digit number in the filenames. However, I really don't know for sure what the order was; after all, some of these songs are over five years old.&lt;br /&gt;&lt;br /&gt;Please check out some of these songs, at least the first few. I want to know what you think!</description><link>http://alphaios.net/blog/2008/07/song-archive-uploaded.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-380093165796097508</guid><pubDate>Thu, 17 Jul 2008 05:47:00 +0000</pubDate><atom:updated>2008-07-17T02:02:42.055-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>python</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><category domain='http://www.blogger.com/atom/ns#'>project</category><title>There Are No Dumb Questions</title><description>In my recent efforts at creating a data resource management system for my game engine I have  entered #python several times to ask questions and get other's opinions. It has helped me so far, so I plan to continue.&lt;br /&gt;&lt;br /&gt;The thing that most intrigues me about this experience is that even though I don't always get the answers that I was looking for I always seem to get what I really needed. Now, you may be thinking, "Well, duh, TMG! Those guys know Python--not to mention coding in general-- at least 1,000 times better than you do! " and that is almost always true. However, there is another thing that I have noticed, which has nothing to do with the experience of the experts: Simply talking about my problems helps me to solve them on my own, even when no one has an answer for me. I suppose its because putting enough mental effort to explain my code and ideas well enough that other people can understand them makes me see things from other angles, which in turn helps me to get a better grasp of the problem and therefore makes it much easier to see the solution.&lt;br /&gt;&lt;br /&gt;I've known it for a while, but it seems that now that I've finally begun to utilize the social networking power of IRC the need for talking about my coding woes has become much more obvious.  The key word in that statement is "begun." I've ONLY begun to really use IRC for practical purposes. I'm still fairly new to the world of IRC--and given my nonstandard perspective on practically everything at all, it will be a while until I really understand IRC. ^_^&lt;br /&gt;&lt;br /&gt;That concludes my little rant. I hope you learned something useful that you can apply to your life, etc. etc. blah blah....</description><link>http://alphaios.net/blog/2008/07/there-are-no-dumb-questions.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-2861096449091385584</guid><pubDate>Sat, 12 Jul 2008 00:02:00 +0000</pubDate><atom:updated>2008-07-12T16:45:56.259-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>retro</category><category domain='http://www.blogger.com/atom/ns#'>nes</category><category domain='http://www.blogger.com/atom/ns#'>wii</category><category domain='http://www.blogger.com/atom/ns#'>megaman</category><category domain='http://www.blogger.com/atom/ns#'>awesome</category><category domain='http://www.blogger.com/atom/ns#'>video games</category><category domain='http://www.blogger.com/atom/ns#'>capcom</category><category domain='http://www.blogger.com/atom/ns#'>nostalgia</category><title>Heaven is Blue</title><description>AHHHHHHHHHHHHHHHHHHHHH!!!!!!! The impossible! The unthinkable! The mind-blowingly awesome! It can't be...yet it is!&lt;br /&gt;&lt;br /&gt;All you folks out there who keep saying that Mega Man &amp;amp; Bass is the only "Mega Man 9" that exists...well, now there is &lt;a href="http://wii.ign.com/dor/objects/14260822/mega-man-9/videos/mm9multidebu.html%22"&gt;UNDENIABLE PROOF TO THE CONTRARY!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I literally feel like jumping and screaming "WOOOOOOOOOOOOOOOOO!" at the top of my lungs. This got got to be the most insanely awesome thing that Capcom has ever done. It looks like they still love us after all...&lt;br /&gt;&lt;br /&gt;Ok, here's what I've heard from other blogs, IGN, and the like...I'll probably mangle some of this information so go check it out yourself. Besides, for a lot of people, this is old news by now, but who cares, I'm posting it anyway. :P&lt;br /&gt;&lt;br /&gt;First off, the Japan release in September. Speculators say that a US release should follow shortly after since there is obviously not going to be too much effort needed in translating. However, no official date has been set yet.&lt;br /&gt;&lt;br /&gt;Next, the game is definitely coming out for WiiWare. Also, it looks like (according to the video) that it's also coming to Xbox Live and Playstation Network. I'm definitely getting the WiiWare version, even though there's a fresh new 360 in my house that just recently got online. Somehow it would just feel unnatural to play a game like this on anything but the Wii.&lt;br /&gt;&lt;br /&gt;From what I hear, this game is based mostly on MM2, apparently because most fans said that was their favorite game in the original lineup. In fact, some of the lucky schmucks who got to play the unreleased game Personally, I thought 2 was okay, but not really my favorite. But then, I didn't actually play 2 until many years after conquering 3-8, with 3 being the first MM game I ever played...and fell in love with. :)&lt;br /&gt;&lt;br /&gt;It looks like Dr. Light's shop is coming back. (Weird...but cool!) That means that many of the items that you had to "find" in the original series will be bought instead...but hopefully they will still have a few hidden items that you have to find in the stages.&lt;br /&gt;&lt;br /&gt;The charge buster is only available from the shop as well--you don't actually start with the ability to charge. That's just cool. But from what I hear, you can't slide...darn. I liked the slide. However, GamesRadar (one of those lucky folk I mentioned) said that there are little tunnles strewn about that look like you should be able to slide through them, so who knows. Maybe it's a hidden ability, like the charge buster.&lt;br /&gt;&lt;br /&gt;What amuses me the most is the range of responses that all the hype is getting. 4/5 people are like, "AWESOME!!! I can't believe they're actually doing this!" while the other 1/5 says "This is completely retarded. I can't believe they're actually doing this." All I can do is roll my eyes at the second group. Clearly you don't understand what this really is.&lt;br /&gt;&lt;br /&gt;Anyway, W00T!! ^_^   ^_^   ^_^</description><link>http://alphaios.net/blog/2008/07/heavenly-chorus-is-chiptune.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-4281781586899237702</guid><pubDate>Sun, 06 Jul 2008 04:58:00 +0000</pubDate><atom:updated>2008-07-06T00:36:38.828-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>blog</category><title>Using Pre-Fab Template for Blog</title><description>I realized that the Alphaios-resembling Blogger template that I wrote was severely lacking as a blog template. Rather than try to correct the many, many areas in which it falls short, I've decided to just use one of the existing Blogger templates instead. I picked a blue one because...well, I like blue.&lt;br /&gt;&lt;br /&gt;You may notice that this new template isn't perfect, either. (For one thing, the sidebar covers up code blocks.) Well, I don't really care. So...there.</description><link>http://alphaios.net/blog/2008/07/using-pre-fab-template-for-blog.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-3189485423353880430</guid><pubDate>Tue, 24 Jun 2008 07:53:00 +0000</pubDate><atom:updated>2008-06-24T03:04:09.983-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>strings</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><category domain='http://www.blogger.com/atom/ns#'>c</category><title>C String Handling</title><description>While attempting to write a utility for accessing the internal data of tracked modules I found that I required a C function that could break a string into an array of strings using a delimiter. I spent an hour or more just trying to figure out how to do it, and ended up with the following code (which you may use if you wish):&lt;br /&gt;&lt;code style="white-space: pre;"&gt;&lt;br /&gt;/* 2008-06-24 */&lt;br /&gt;&lt;br /&gt;char **split_str(const char *str, const char *teststr) {&lt;br /&gt;  /* Splits a string into one or more substrings based on a test string.&lt;br /&gt;   * The substrings are returned as an array of strings, terminated with&lt;br /&gt;   * a NULL pointer.&lt;br /&gt;   * If the teststr is not found in the original string, an array with just&lt;br /&gt;   * that string is returned, as would be expected. Therefore, it might be a&lt;br /&gt;   * good idea to make sure the teststr is in the string before you call this&lt;br /&gt;   * function on it.&lt;br /&gt;   * If you pass an empty string as the str, you will get an empty array;&lt;br /&gt;   * i.e. an array with one object that is a NULL pointer.&lt;br /&gt;   * Note that the test str is not included in the results.&lt;br /&gt;   * Memory for the array is dynamically allocated using malloc, so remember&lt;br /&gt;   * to free it when you're done (unless you get a NULL pointer, of course).&lt;br /&gt;   */&lt;br /&gt;   char **subs = NULL;&lt;br /&gt;   char const * breakstart = str;&lt;br /&gt;   char *breakend = NULL;&lt;br /&gt;   int splits = 0;&lt;br /&gt;   int startstrlen = 0;&lt;br /&gt;   int teststrlen = 0;&lt;br /&gt; &lt;br /&gt;   startstrlen = strlen(str); /* Length of original str */&lt;br /&gt;   teststrlen =  strlen(teststr); /* Length of the test string */&lt;br /&gt;&lt;br /&gt;   /* Scan until break */&lt;br /&gt;   while (breakstart[0] != '\0') {&lt;br /&gt;      splits ++;&lt;br /&gt;&lt;br /&gt;      /* Continually add more space for the subs */&lt;br /&gt;      subs = realloc(subs,sizeof(char*)*splits);&lt;br /&gt;      /* Find the next break end */&lt;br /&gt;      breakend = strstr(breakstart,teststr);&lt;br /&gt;      /* If there was no occurence of the substr, put the break at the end */&lt;br /&gt;      if (!breakend)&lt;br /&gt;          breakend = (char*) str+strlen(str)+1;&lt;br /&gt;      /* Create a new block for the substr */&lt;br /&gt;      subs[splits-1] = malloc(sizeof(char*)*(breakend-breakstart)+1);&lt;br /&gt;      /* Copy the substring */&lt;br /&gt;      memcpy(subs[splits-1],breakstart,(breakend-breakstart));&lt;br /&gt;      /* Add the null byte */&lt;br /&gt;      subs[splits-1][breakend-breakstart] = '\0';&lt;br /&gt;      /* If there is more string to scan, continue scanning it */&lt;br /&gt;      if (breakend)&lt;br /&gt;          breakstart = breakend + teststrlen;&lt;br /&gt;      /* If there is no more to scan, don't scan anymore */&lt;br /&gt;      else&lt;br /&gt;          break;&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   /* Terminate the array */&lt;br /&gt;   subs = realloc(subs,sizeof(char*)*splits+1);&lt;br /&gt;   subs[splits] = NULL;&lt;br /&gt; &lt;br /&gt;   return subs;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Shortly after writing this function I stumbled upon a little library called &lt;a href="http://bstring.sourceforge.net/"&gt;Bstrings (Better String Library)&lt;/a&gt; which is supposed to implement this feature, as well as solve a lot of common problems with strings in C.&lt;br /&gt;&lt;br /&gt;I guess I'm kind of relieved and frustrated at the same time...</description><link>http://alphaios.net/blog/2008/06/c-string-handling.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-3958250592217662891</guid><pubDate>Wed, 11 Jun 2008 07:12:00 +0000</pubDate><atom:updated>2008-06-11T02:20:26.314-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>blog</category><category domain='http://www.blogger.com/atom/ns#'>news</category><category domain='http://www.blogger.com/atom/ns#'>updates</category><title>News: Blog Merging with the News Updates.</title><description>If you recently used the usual http://alphaios.net link that I keep posting everywhere you may have noticed that you were automatically redirected to this blog. That is because, from now on, I want all visitors to the site to see the blog first. Why? Because I've officially abandon the &lt;span style="font-weight: bold;"&gt;very, very old&lt;/span&gt; static news page in favor of using the blog engine for posting updates.&lt;br /&gt;&lt;br /&gt;For now the old news page can still be accessed at the same URL as before, but I will no longer be using it. I'll keep it up for a while so that older updates can still be accessed, at least until I can move those updates into the blog--or until they become so incredibly old that they no longer are relevant.  (And that will be very soon...)&lt;br /&gt;&lt;br /&gt;Also, the home page is still available as an "about" page from the house-shaped icon in the navigational bar.</description><link>http://alphaios.net/blog/2008/06/news-blog-merging-with-news-updates.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-3896434331587383312</guid><pubDate>Fri, 30 May 2008 22:10:00 +0000</pubDate><atom:updated>2008-05-30T17:16:35.385-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>cms</category><category domain='http://www.blogger.com/atom/ns#'>aios</category><category domain='http://www.blogger.com/atom/ns#'>python</category><category domain='http://www.blogger.com/atom/ns#'>php</category><category domain='http://www.blogger.com/atom/ns#'>frustration</category><category domain='http://www.blogger.com/atom/ns#'>project</category><title>New AIOS Engine Will Use PHP, Not Python</title><description>It looks like there is just no good way to make a dynamic content management system using Python through CGI. In order to make it work you have to do all kinds of crazy stuff, and I don't want to do try it anymore...So, I've quit on the Python AIOS project altogether. Instead, I'm going to go back to the old days: PHP. Yes, good ol' highly-compatible PHP.&lt;br /&gt;&lt;br /&gt;Don't get me wrong. I love Python. But it just is no good for making a CMS unless you have the access privileges to your web server to install all the stuff you need, and you usually don't. (I certainly don't.) I will still use it for other things, but for now...Alphaios.net is going back to PHP.</description><link>http://alphaios.net/blog/2008/05/new-aios-engine-will-use-php-not-python.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-102697095735853612</guid><pubDate>Sun, 11 May 2008 01:26:00 +0000</pubDate><atom:updated>2008-06-24T03:09:45.824-05:00</atom:updated><title>Food, Drink, and Tracked Music</title><description>http://necrofamicon.com/swt/Music/index.html&lt;br /&gt;&lt;br /&gt;While searching for code or libs that might be useful to me in producing the ultimate Python-compatible tracked music system, I stumbled across the link above. Apparently I have a lot in common with this guy...though I haven't posted them all yet, there are at least as many original songs on my hard drive as are on this page. Only I went through the trouble of actually naming mine.&lt;br /&gt;&lt;br /&gt;Anyway, some of those songs are pretty cool, and even the randomly-generated ones at the bottom of the page sound pretty good. Some of</description><link>http://alphaios.net/blog/2008/05/food-drink-and-tracked-music.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-5981162732309368522</guid><pubDate>Sun, 11 May 2008 01:00:00 +0000</pubDate><atom:updated>2008-05-10T20:06:18.975-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>ctypes</category><category domain='http://www.blogger.com/atom/ns#'>libmikmod</category><category domain='http://www.blogger.com/atom/ns#'>tracked</category><category domain='http://www.blogger.com/atom/ns#'>mikmod</category><category domain='http://www.blogger.com/atom/ns#'>python</category><category domain='http://www.blogger.com/atom/ns#'>music</category><category domain='http://www.blogger.com/atom/ns#'>c</category><category domain='http://www.blogger.com/atom/ns#'>module</category><title>MikMod in Python</title><description>Well, after neglecting my studies for about a day and I half I finally managed to make libmikmod.so work with Python using ctypes. That means it is, in fact, possible to play tracked module music using Python. Soon I will release a Python package that will wrap MikMod completely and implement some Python classes that will make it very easy to use MikMod in a so-called "Pythonic" way. I will use it to implement the script on Alphaios.net that will automatically display information about modules that I upload.&lt;br /&gt;&lt;br /&gt;...at least, that's the plan. Everyone knows how bad I am about keeping those kind of promises. ^_^</description><link>http://alphaios.net/blog/2008/05/mikmod-in-python.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-1745903580173973326</guid><pubDate>Sat, 10 May 2008 00:53:00 +0000</pubDate><atom:updated>2008-05-09T20:01:12.493-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>superheat</category><category domain='http://www.blogger.com/atom/ns#'>email</category><category domain='http://www.blogger.com/atom/ns#'>water</category><category domain='http://www.blogger.com/atom/ns#'>microwave</category><title>The Danger of Microwaved Water</title><description>A friend of mine recently sent me the following email, which I'm sure has spread all over the internet by now:&lt;br /&gt;&lt;br /&gt;&gt; &gt; Microwaving Water!&lt;br /&gt;&gt; &gt;&lt;br /&gt;&gt; &gt; A 26-year old man decided to have a cup of coffee. He took a cup of&lt;br /&gt;&gt; &gt; water&lt;br /&gt;&gt; &gt; and put it in the microwave to heat it up (something that he had&lt;br /&gt;&gt; &gt; done&lt;br /&gt;&gt; &gt; numerous times before). I am not sure how long he set the timer for,&lt;br /&gt;&gt; &gt; but&lt;br /&gt;&gt; &gt; he wanted to bring the water to a boil. When the timer shut the oven&lt;br /&gt;&gt; &gt; off,&lt;br /&gt;&gt; &gt; he removed the cup from the oven. As he lookIed into the cup, he&lt;br /&gt;&gt; &gt; noted that&lt;br /&gt;&gt; &gt; the water was not boiling, but suddenly the water in the cup 'blew&lt;br /&gt;&gt; &gt; up'&lt;br /&gt;&gt; &gt; into his face. The cup remained intact until he threw it out of his&lt;br /&gt;&gt; &gt; hand ,&lt;br /&gt;&gt; &gt; but all the water had flown out into his face due to the build up&lt;br /&gt;&gt; &gt; of&lt;br /&gt;&gt; &gt; energy. His whole face is blistered and he has 1st and 2nd degree&lt;br /&gt;&gt; &gt; burns&lt;br /&gt;&gt; &gt; to his face which may leave scarring.&lt;br /&gt;&gt; &gt;&lt;br /&gt;&gt; &gt; He also may have lost partial sight in his left eye. While at the&lt;br /&gt;&gt; &gt; hospital, the doctor who was attending to him stated that this is a&lt;br /&gt;&gt; &gt; fairly&lt;br /&gt;&gt; &gt; common occurrence and water (alone) should never be heated in a&lt;br /&gt;&gt; &gt; microwave&lt;br /&gt;&gt; &gt; oven. If water is heated in this manner, something should be placed&lt;br /&gt;&gt; &gt; in&lt;br /&gt;&gt; &gt; the cup to diffuse the energy such as a wooden stir stick, tea bag,&lt;br /&gt;&gt; &gt; etc.,&lt;br /&gt;&gt; &gt; (nothing metal).&lt;br /&gt;&gt; &gt;&lt;br /&gt;&gt; &gt; It is however a much safer choice to boil the water in a tea&lt;br /&gt;&gt; &gt; kettle.&lt;br /&gt;&gt; &gt;&lt;br /&gt;&gt; &gt; General Electric's&lt;br /&gt;&gt; &gt; Response:&lt;br /&gt;&gt; &gt;&lt;br /&gt;&gt; &gt; Thanks for contacting us, I will be happy to assist you. The e-mail&lt;br /&gt;&gt; &gt; that you&lt;br /&gt;&gt; &gt; received is correct. Microwaved water and other liquids do not&lt;br /&gt;&gt; &gt; always&lt;br /&gt;&gt; &gt; bubble when they reach the boiling point. They can actually get&lt;br /&gt;&gt; &gt; superheated and not bubble at all. The superheated liquid will&lt;br /&gt;&gt; &gt; bubble up&lt;br /&gt;&gt; &gt; out of the cup when it is moved or when something like a spoon or&lt;br /&gt;&gt; &gt; tea bag is&lt;br /&gt;&gt; &gt; put into it.&lt;br /&gt;&gt; &gt;&lt;br /&gt;&gt; &gt; To prevent this from happening and causing injury, do not heat any&lt;br /&gt;&gt; &gt; liquid&lt;br /&gt;&gt; &gt; for more than two minutes per cup. After heating, let the cup stand&lt;br /&gt;&gt; &gt; in the&lt;br /&gt;&gt; &gt; microwave for thirty seconds! before moving it or adding anything&lt;br /&gt;&gt; &gt; into it&lt;br /&gt;&gt; &gt;&lt;br /&gt;&gt; &gt; Here is what our local science teacher had to say on the matter:&lt;br /&gt;&gt; &gt; 'Thanks for the microwave warning. I have&lt;br /&gt;&gt; &gt; seen this happen before. It is caused by a phenomenon known as&lt;br /&gt;&gt; &gt; super&lt;br /&gt;&gt; &gt; heating. It can occur anytime water is heated and will particularly&lt;br /&gt;&gt; &gt; occur&lt;br /&gt;&gt; &gt; if the vessel that the water is heated in is new, or when heating a&lt;br /&gt;&gt; &gt; small&lt;br /&gt;&gt; &gt; amount of water (less than half a cup).&lt;br /&gt;&gt; &gt;&lt;br /&gt;&gt; &gt; What happens is that the water heats faster than the vapor bubbles&lt;br /&gt;&gt; &gt; can form.&lt;br /&gt;&gt; &gt;   If the cup is very new then it is unlikely to have small surface&lt;br /&gt;&gt; &gt; scratches inside it that provide a place for the bubbles to form. As&lt;br /&gt;&gt; &gt; the&lt;br /&gt;&gt; &gt; bubbles cannot form and release some of the heat that has built up,&lt;br /&gt;&gt; &gt; the&lt;br /&gt;&gt; &gt; liquid does not boil, and the liquid continues to heat up well past&lt;br /&gt;&gt; &gt; its&lt;br /&gt;&gt; &gt; boiling point.&lt;br /&gt;&gt; &gt;&lt;br /&gt;&gt; &gt; What then usually happens is that the liquid is bumped or jarred,&lt;br /&gt;&gt; &gt; which is&lt;br /&gt;&gt; &gt; just enough of a shock to cause the bubbles to rapidly form and&lt;br /&gt;&gt; &gt; expel the&lt;br /&gt;&gt; &gt; hot liquid. The rapid formation of bubbles is also why a carbonated&lt;br /&gt;&gt; &gt; beverage&lt;br /&gt;&gt; &gt; spews when opened after having been&lt;br /&gt;&gt; &gt; shaken.'&lt;br /&gt;&gt; &gt;&lt;br /&gt;&gt; &gt; If you pass this on you could very well save someone from a lot of&lt;br /&gt;&gt; &gt; pain and&lt;br /&gt;&gt; &gt; suffering&lt;br /&gt;&lt;br /&gt;I knew water could be supercooled, which is really awesome to watch, but&lt;br /&gt;I didn't know it could be superheated as well. That explains the "flash&lt;br /&gt;boiling" effect I sometimes get when I heat a mug of water in a&lt;br /&gt;microwave for about 4 minutes and then drop a tea bag in. I always&lt;br /&gt;thought it was caused by small amounts of air in the teabag suddenly&lt;br /&gt;expanding because of the heat in the water...apparently it's the water,&lt;br /&gt;not the air, that is expanding.&lt;br /&gt;&lt;br /&gt;I didn't actually forward this to anybody...</description><link>http://alphaios.net/blog/2008/05/danger-of-microwaved-water.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-6874384309743142706</guid><pubDate>Tue, 01 Apr 2008 20:27:00 +0000</pubDate><atom:updated>2008-04-01T15:29:07.835-05:00</atom:updated><title>A Completely Useless Title</title><description>Unfortunately I've never been any good at fooling anyone so I'm not going to do any April fooling today.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Just kidding. April Fools!</description><link>http://alphaios.net/blog/2008/04/completely-useless-title.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-2464943068817862516</guid><pubDate>Sat, 29 Mar 2008 18:32:00 +0000</pubDate><atom:updated>2008-03-29T14:26:29.618-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>dreams</category><category domain='http://www.blogger.com/atom/ns#'>video games</category><category domain='http://www.blogger.com/atom/ns#'>japanese import</category><category domain='http://www.blogger.com/atom/ns#'>dream game</category><category domain='http://www.blogger.com/atom/ns#'>zero</category><category domain='http://www.blogger.com/atom/ns#'>mega man</category><category domain='http://www.blogger.com/atom/ns#'>dream</category><title>Dream Game: MegaMan ZX2 (Japanese Rockman Zero 2)</title><description>Last night I dreamt that I somehow got my hands on a Japanese import game entitled "Mega Man ZX2" but was pronounced "Mega Man Zero 2" but, of course, should have been titled "Rockman &lt;something&gt; 2". (Hey, its dream logic.) Ayway, it was supposed to be a Mega Man game that was only released in Japan. I'm not sure if it was supposed to be a member of the ZX series or the Zero series since the pronunciation of the title and the way the title was spelled did not agree.&lt;br /&gt;&lt;br /&gt;Of course, this game, being a dream game, was ridiculously cool, and--despite being a Japanese import--was entirely in English. It was for the Nintendo DS.&lt;br /&gt;&lt;br /&gt;The title screen was nothing too spectacular...just the misleading "Mega Man ZX2" with some kind of light-colored green-and-white background, I guess kind of like the one in the real Mega Man ZX, only without the 3D object floating around. The options were "Game Start," "Continue," and "Options."&lt;br /&gt;&lt;br /&gt;Selecting Game Start took you to this really complicated character select screen that I didn't understand. It showed two variations of the Zero from the Zero series, one was the usual MMZ Zero holding some weird weapons, and the other was a slightly more evil-looking and cool-looking version of that same Zero that had a lot more black and blue. They were both the well-drawn full-sized pictures like in the cut scenes from MMZ4. Also, there were a bunch of other options you could customize but they didn't make any sense to me so I left them alone and selected the more regular Zero.&lt;br /&gt;&lt;br /&gt;After that, their was a short loading screen, followed by a cut scene. It was voiced acted in Japanese, and the English subtitles...I guess I just didn't read those. I don't remember/didn't understand the cut scene, but it had some kind of operator reploid that kind of reminded me of Iris from Mega Man X 4, only her voice was much less annoying. Zero also had a few lines, and there was a narrator as well, but he didn't say much.&lt;br /&gt;&lt;br /&gt;Even though I didn't really understand the plot I get the feeling that it was kind of unrelated to the actual MMZ plot, and the Zero in this game was somehow a different Zero than the one in the other games, even though at first he appeared to be the same one.&lt;br /&gt;&lt;br /&gt;So finally I got to the actual game play, and here's where things diverged from the usual Zero games significantly...&lt;br /&gt;&lt;br /&gt;The game starts you off with all kinds of crazy crap. First, you get four different kinds of boots: Normal dash boots, fast-dash boots, air-dash boots w/upward dash, and some other kind of boots that I didn't understand but looked really cool. Second, you started off with 2 subtanks. Third, you had two different types of helmets, one was like the usual MMZ helmet except that the dark purple part was white and the crystal was shaped kind of like a 4-point star instead of the usual upside-down triangle. The other helmet was like the first except that the crystal was bigger and more slightly more stylized. In either picture the crystal would grow brightly whenever you put the cursor over one to select it. Finally, the game started you off with two weapons: the usual hand buster/plasma pistol thing, and a &lt;span style="font-weight: bold;"&gt;hammer&lt;/span&gt;. Not even an an energy hammer, it was just a big battle hammer, like a sledge hammer, only mechanical and colorful like Zero. There was no Z-Saber to be seen.&lt;br /&gt;&lt;br /&gt;The game started you off in this great big jungle area, way up in the middle of the area in some kind of observer's platform. There were tree branches and artificial platforms all over the place that you could jump around on. And this place was huge--you would have to travel up, down, left, or right for quite a while before you finally hit the edge of the area. Not only that, but it had upgrades hidden all over the place.&lt;br /&gt;&lt;br /&gt;Another weird thing about this game is that collecting a subtank would cause all your existing sub tanks and the one you just collected to merge into one great big "super tank." This essentially turned sub tanks that were lying around into sub tank &lt;span style="font-style: italic;"&gt;upgrades&lt;/span&gt; which would add more points to the maximum capacity of your super tank. A side effect of this is that there were these "mini tanks" you could find which would add to you super tank's maximum but would not add as much as a regular sub tank. One of these mini tanks was right in front of you on top of a table in the observer's platform when you started the game. It had hot pink and some weird little triangular symbol in the area that usually shows how much energy is in the tank, and of course, the tank was smaller than a regular sub tank.&lt;br /&gt;&lt;br /&gt;The weirdest thing of all about this game was that the DS game card had a model hammer--like the one in the game--sticking out of it. It had a motion sensor in it so that when you rocked the DS so as to "swing" the hammer it would make Zero swing his hammer. (Of course, this wasn't the only way to make him swing...)&lt;br /&gt;&lt;br /&gt;But, that was my weird game dream. I'm sure that there's lots of other details but I can't remember.</description><link>http://alphaios.net/blog/2008/03/dream-game-megaman-zx2-japanese-rockman.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-3979933142002270946</guid><pubDate>Sat, 29 Mar 2008 04:06:00 +0000</pubDate><atom:updated>2008-03-28T23:20:06.155-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>homework</category><category domain='http://www.blogger.com/atom/ns#'>lazy</category><category domain='http://www.blogger.com/atom/ns#'>video games</category><category domain='http://www.blogger.com/atom/ns#'>school</category><category domain='http://www.blogger.com/atom/ns#'>weekend</category><title>Procrastinating the Weekend Away</title><description>&lt;p&gt;This weekend's gotten off to a bad start...its already 11 pm and I haven't done any of the things that I wanted to do. Instead, all I did today was download Kirby 64 off the Wii Shop channel, played that for hours, played through classic mode on Brawl as Sonic (didn't even unlock anything...), then went to my room and watched a few random ABS animations, ate dinner, then when back to my room again and played Mega Man Legends 2 for who knows how long.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I probably would have worked on some of my various projects but I've been feeling kind of tired and uninspired. Well, I guess I won't be working on that stuff THIS weekend...tomorrow I have to do 12+ pages of algebra homework so's I can be ready for the test on tuesday, and I also have to study a chapter for business ethics, and I haven't even SEEN this chapter yet. Then, I've got a bunch of other stuff to do besides...&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;All this procrastinating is going to catch up with my GPA one of these days. :(&lt;/p&gt;</description><link>http://alphaios.net/blog/2008/03/procrastinating-weekend-away.html</link><author>noreply@blogger.com (The Music Guy)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7712713462173177127.post-8815204635849007926</guid><pubDate>Fri, 28 Mar 2008 06:52:00 +0000</pubDate><atom:updated>2008-03-28T02:01:44.819-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>blog</category><category domain='http://www.blogger.com/atom/ns#'>blogging</category><title>The First Ever Alphaios.net Blog</title><description>&lt;p&gt;For a long time now I have wanted a blog, but I hesitated to get one because I wanted to write it myself. And, I know, the whole &lt;b&gt;point&lt;/b&gt; of a blog is to write in it yourself, but I wanted to write not only the content but the entire blogging engine itself. Not only that, but I wanted it to be fully integrated into my own CMS that I've been working on. In fact, I wanted the blog to be something that could be created &lt;i&gt;using&lt;/i&gt; the CMS; like, you could add a new section to the site with the CMS interface, call the new section "My Blog" or whatever, give it whatever characteristics you wanted and then, *poof*, you have a blog.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Well, that didn't work out how I wanted. For one thing, I'm extremely indecisive when it comes to programming on a large scale project like a CMS. I have made a lot of progress with it and there is definitely a good start there, but with school and everything else I can't keep my mind wrapped around the complexities of the CMS's programming long enough to make important coding decisions.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So, hopefully this blog will do. I managed to make it look fairly well integrated with the site, so it should suffice for now.&lt;/p&gt;</description><link>http://alphaios.net/blog/2008/03/first-ever-alphaiosnet-blog.html</link><author>noreply@blogger.com (The Music Guy)</author></item></channel></rss>