<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Chromed Shark]]></title>
  <link href="http://chromedshark.com/atom.xml" rel="self"/>
  <link href="http://chromedshark.com/"/>
  <updated>2013-08-25T14:57:44-04:00</updated>
  <id>http://chromedshark.com/</id>
  <author>
    <name><![CDATA[Stephen]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[U-verse IPv6 With ASUS RT-N66U]]></title>
    <link href="http://chromedshark.com/blog/2013/08/u-verse-ipv6-with-asus-rt-n66u.html"/>
    <updated>2013-08-25T13:17:00-04:00</updated>
    <id>http://chromedshark.com/blog/2013/08/u-verse-ipv6-with-asus-rt-n66u</id>
    <content type="html"><![CDATA[<p>Back in February of last year, details of how to connect to U-verse&#8217;s 6rd border
router started to show up. I&#8217;ve been interested in setting up IPv6 since then, and
finally purchased an IPv6-capable router, upgrading from a D-Link DGL-4500 to an
ASUS RT-N66U.</p>

<p><em><strong>Note:</strong> To simplify the instructions, I&#8217;m not going to talk about setting up the router
to work in concert with the AT&amp;T provided residential gateway. There are many
different posts around the internet detailing exactly how to set up your own
router as the primary one for your network.</em></p>

<p>One of the most interesting benefits of IPv6 is that every computer can have it&#8217;s
own globally unique IP address, allowing direct access to any computer in the
network over the internet. The downside is that a firewall is now required to
ensure that unwanted access is forbidden. Thus, the first step in the process was
figuring out how to provide an IPv6-capable firewall. The stock firmware does not
include one, but <a href="https://github.com/RMerl/asuswrt-merlin">RMerlin</a> has a firmware
variant that is close to stock that does include one. The latest version can be
found at <a href="http://www.mediafire.com/asuswrt-merlin/">mediafire.com/asuswrt-merlin/</a>
in the &#8220;RT-N66U_All_models&#8221; directory.</p>

<p style="text-align:center;">
  <img src="http://chromedshark.com/images/posts/mediafire-root.png" width="787" height="631"/><br/>
  <br/>
  <img src="http://chromedshark.com/images/posts/mediafire-rt-n66u_all_models-directory.png" width="787" height="631"/>
</p>


<p>Download the latest version and unzip it to get the firmware file and a more
comprehensive README. <strong>It is strongly advised that you read the README before
upgrading your firmware.</strong> To install, open up the router &#8220;Administration&#8221; section
and go to the &#8220;Firmware Upgrade&#8221; tab. Choose the &#8220;TRX&#8221; file from the zip and click
Upload.</p>

<p style="text-align:center;"><img src="http://chromedshark.com/images/posts/firmware-upgrade.png" width="787" height="631"/></p>


<p>Once the update process completes, it&#8217;s time to configure IPv6. Go to the IPv6
section in the router configurations and configure it like the image below. You
will also need to pick an IPv6 DNS server - I&#8217;m using
<a href="https://developers.google.com/speed/public-dns/docs/using">Google Public DNS</a>,
which has the following IPv6 addresses: <code>2001:4860:4860::8888</code> and <code>2001:4860:4860::8844</code>.
The IPv6 Firewall is on by default, so nothing needs to be done to configure it.</p>

<p style="text-align:center;"><img src="http://chromedshark.com/images/posts/ipv6-config.png" width="787" height="631"/></p>


<p><strong>Congratulations!</strong> You are now running a dual-stack network. You can test it out
by visiting <a href="http://test-ipv6.com/">test-ipv6.com</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SWF Verification and Flex RSLs]]></title>
    <link href="http://chromedshark.com/blog/2012/12/swf-verification-and-flex.html"/>
    <updated>2012-12-02T15:05:00-05:00</updated>
    <id>http://chromedshark.com/blog/2012/12/swf-verification-and-flex</id>
    <content type="html"><![CDATA[<p>I have been playing around with SWF Verification in Flash Media Server (or Adobe
Media Server as it&#8217;s now called), and was unable to get it working after several
hours of effort. I finally found <a href="http://forums.adobe.com/message/3475552">this posting</a>,
and after re-compiling my swfs with <code>-static-rsls</code> on, I was able to get it working.</p>

<p>So if you are ever having trouble with SWF Verification, make sure you are not
loading any additional SWCs at runtime, or you may have trouble.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Installing Ruby 1.9.2 Using RVM and Homebrew on Lion]]></title>
    <link href="http://chromedshark.com/blog/2011/09/installing-ruby-1-9-2-using-rvm-and-homebrew-on-lion.html"/>
    <updated>2011-09-25T11:43:00-04:00</updated>
    <id>http://chromedshark.com/blog/2011/09/installing-ruby-1-9-2-using-rvm-and-homebrew-on-lion</id>
    <content type="html"><![CDATA[<p>There seem to be a lot of people having trouble installing Ruby 1.9.2-p290 under
Lion, based off of the many blog posts about changing the C compiler and using
MacPorts, Homebrew, and/or RVM to install a bunch of dependencies. Below is the
process that I used to install it. I&#8217;m not quite sure why RVM automatically used
<code>/usr/bin/gcc-4.2</code> to compile everything on my computer, and why some people need
to set some environment flags to change their default compiler to this. If you
are getting compiler errors, you may need to run <code>export CC=gcc-4.2</code> before
the <code>rvm install</code> step.</p>

<p>First, we&#8217;re going to install a newer version of the readline library. I used
Homebrew for this, but you should be able to use <code>rvm pkg install readline</code> as
well.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>brew install readline
</span></code></pre></td></tr></table></div></figure>


<p>Once that is finished, take note of where Homebrew said it installed readline.
For me, that path was <code>/usr/local/Cellar/readline/6.2.1</code> (minus the lib directory).</p>

<p>Next, we&#8217;re going to update RVM to make sure there aren&#8217;t any issues with Lion
and Ruby 1.9.2 that haven&#8217;t been solved in the latest release.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rvm get latest
</span><span class='line'><span class="c"># rvm get head upgrades to the latest dev release</span>
</span></code></pre></td></tr></table></div></figure>


<p>The last step in this process is to install Ruby 1.9.2-p290. If you used RVM to
install readline, your path for readline should be changed to <code>$rvm_path/usr</code>.
If you are using MacPorts, your readline path should be changed to <code>/opt/local</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rvm install 1.9.2 -C --enable-shared,--with-readline-dir<span class="o">=</span>/usr/local/Cellar/readline/6.2.1 <span class="se">\</span>
</span><span class='line'>--with-iconv-dir<span class="o">=</span>/usr --with-zlib-dir<span class="o">=</span>/usr --with-openssl-dir<span class="o">=</span>/usr,<span class="se">\</span>
</span><span class='line'>--build<span class="o">=</span>x86_64-apple-darwin10
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Update On ruby-audio]]></title>
    <link href="http://chromedshark.com/blog/2010/03/update-on-ruby-audio.html"/>
    <updated>2010-03-25T19:10:00-04:00</updated>
    <id>http://chromedshark.com/blog/2010/03/update-on-ruby-audio</id>
    <content type="html"><![CDATA[<p>As a lot has changed over the past two weeks with ruby-audio, I thought an update
would be in order.</p>

<p>After trying to put the existing version (0.2.0) into production code, I ran into
a whole bunch of issues with the API. It was not ruby-like at all, which made the
code I was writing look ugly. In addition, reading into a small buffer and writing
out to a new sound wasn&#8217;t possible to do without a lot of unnecessary object
instantiation, as there was no API for writing only a portion of a buffer out to
the sound. Hence, a rewrite was in order. Armed with copies of the ruby 1.8 and
1.9 source code, I set out to re-write the C extension with a prettier API and
without the previous version&#8217;s issues. The result is ruby-audio version 1.0
(now 1.2.0 as of this writing).</p>

<p>ruby-audio now has three data classes - <code>Sound</code>, <code>Buffer</code>, and <code>SoundInfo</code>. These
correspond to their C parents - <code>CSound</code>, <code>CBuffer</code>, and <code>CSoundInfo</code>. <code>SoundInfo</code> maps
to the <code>SF_INFO</code> struct, providing information like sound length, channel count,
and format. <code>Buffer</code> is a thin wrapper around a C array of one of the four
datatypes supported for read and write by libsndfile. Finally, <code>Sound</code> provides
all the standard functions you would expect from an <code>IO</code> object, including seeks,
reads, and writes.</p>

<p>With that out of the way, let&#8217;s look at some code. The following example takes
an array of compatible sound files and numbers and turns it into a single
one-channel wav.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;rubygems&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;ruby-audio&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Create wav output file</span>
</span><span class='line'><span class="n">info</span> <span class="o">=</span> <span class="no">RubyAudio</span><span class="o">::</span><span class="no">SoundInfo</span><span class="o">.</span><span class="n">new</span> <span class="ss">:channels</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">:samplerate</span> <span class="o">=&gt;</span> <span class="mi">44100</span><span class="p">,</span>
</span><span class='line'>                                <span class="ss">:format</span> <span class="o">=&gt;</span> <span class="no">RubyAudio</span><span class="o">::</span><span class="no">FORMAT_WAV</span><span class="o">|</span><span class="no">RubyAudio</span><span class="o">::</span><span class="no">FORMAT_PCM_16</span>
</span><span class='line'><span class="n">out</span> <span class="o">=</span> <span class="no">RubyAudio</span><span class="o">::</span><span class="no">Sound</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;out.wav&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">info</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Initialize read/write and pause buffers</span>
</span><span class='line'><span class="n">one_sec</span> <span class="o">=</span> <span class="no">RubyAudio</span><span class="o">::</span><span class="no">Buffer</span><span class="o">.</span><span class="n">double</span><span class="p">(</span><span class="mi">44100</span><span class="p">)</span>
</span><span class='line'><span class="n">one_sec</span><span class="o">.</span><span class="n">real_size</span> <span class="o">=</span> <span class="mi">44100</span>
</span><span class='line'><span class="n">buf</span> <span class="o">=</span> <span class="no">RubyAudio</span><span class="o">::</span><span class="no">Buffer</span><span class="o">.</span><span class="n">double</span><span class="p">(</span><span class="mi">10000</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># For numbers, insert a pause for the given number of milliseconds</span>
</span><span class='line'><span class="c1"># For strings, open the sound file and append</span>
</span><span class='line'><span class="n">wavs</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">wav</span><span class="o">|</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">wav</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="no">Numeric</span><span class="p">)</span> <span class="c1"># Pause</span>
</span><span class='line'>    <span class="n">secs</span> <span class="o">=</span> <span class="p">(</span><span class="n">wav</span><span class="o">/</span><span class="mi">1000</span><span class="p">)</span><span class="o">.</span><span class="n">to_i</span>
</span><span class='line'>    <span class="n">millisecs</span> <span class="o">=</span> <span class="n">wav</span> <span class="o">%</span> <span class="mi">1000</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1"># Handle milliseconds</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">millisecs</span> <span class="o">&gt;</span> <span class="mi">0</span>
</span><span class='line'>      <span class="n">one_sec</span><span class="o">.</span><span class="n">real_size</span> <span class="o">=</span> <span class="p">(</span><span class="mi">44100</span> <span class="o">*</span> <span class="n">millisecs</span><span class="o">/</span><span class="mi">1000</span><span class="p">)</span><span class="o">.</span><span class="n">to_i</span>
</span><span class='line'>      <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">one_sec</span><span class="p">)</span>
</span><span class='line'>      <span class="n">one_sec</span><span class="o">.</span><span class="n">real_size</span> <span class="o">=</span> <span class="mi">44100</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="n">secs</span><span class="o">.</span><span class="n">times</span> <span class="p">{</span> <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">one_sec</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="no">RubyAudio</span><span class="o">::</span><span class="no">Sound</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">wav</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">snd</span><span class="o">|</span>
</span><span class='line'>      <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span> <span class="k">while</span> <span class="n">snd</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">out</span><span class="o">.</span><span class="n">close</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you have any issues with the API or features you&#8217;d like to see implemented,
don&#8217;t hesitate to fork and fix it on <a href="https://github.com/warhammerkid/ruby-audio">github</a>,
add it to the issues, or send me an e-mail.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Revival of ruby/audio]]></title>
    <link href="http://chromedshark.com/blog/2010/02/revival-of-rubyaudio.html"/>
    <updated>2010-02-09T13:33:00-05:00</updated>
    <id>http://chromedshark.com/blog/2010/02/revival-of-rubyaudio</id>
    <content type="html"><![CDATA[<p>I needed to do some audio concatenation for a project I&#8217;m working on, and after
much research, came to the conclusion that <a href="http://www.mega-nerd.com/libsndfile/">libsndfile</a>
would be the easiest to work with. However, with all of the overhead of calling
out to a command-line program for every file I wanted to join, I figured it would
be better to write a C-based gem wrapper around it. Thus, ruby/audio.</p>

<p>Google quickly led me to <a href="https://github.com/fugalh/ruby-audio">Hans&#8217; ruby-audio</a>,
which hadn&#8217;t had any major modifications since November of 2006. Looking at the
forks lead to the most recent fixes by others. After finding and fixing a bug
noticed in my audio concatenation project, I decided to turn it into a gem and
put it up on Gemcutter.</p>

<p>If you&#8217;d like to get started using it, first install ruby-audio from gemcutter:
<code>gem install ruby-audio --source="http://gemcutter.org"</code></p>

<p>Afterwards, simply require audio/sndfile and start writing code. Here&#8217;s an
example that concatenates a list of files and writes the final file to out.wav.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;rubygems&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;audio/sndfile&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">out_conf</span> <span class="o">=</span> <span class="no">Sndfile</span><span class="o">::</span><span class="no">SF_INFO</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="n">out_conf</span><span class="o">.</span><span class="n">format</span> <span class="o">=</span> <span class="no">Sndfile</span><span class="o">::</span><span class="no">SF_FORMAT_WAV</span><span class="o">|</span><span class="no">Sndfile</span><span class="o">::</span><span class="no">SF_FORMAT_PCM_16</span>
</span><span class='line'><span class="n">out_conf</span><span class="o">.</span><span class="n">channels</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class='line'><span class="n">out_conf</span><span class="o">.</span><span class="n">samplerate</span> <span class="o">=</span> <span class="mi">44100</span>
</span><span class='line'><span class="n">out</span> <span class="o">=</span> <span class="no">Audio</span><span class="o">::</span><span class="no">Soundfile</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;out.wav&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">out_conf</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="o">[</span><span class="s1">&#39;audio1.wav&#39;</span><span class="p">,</span> <span class="s1">&#39;audio2.wav&#39;</span><span class="o">].</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">file</span><span class="o">|</span>
</span><span class='line'>  <span class="n">snd</span> <span class="o">=</span> <span class="no">Audio</span><span class="o">::</span><span class="no">Soundfile</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
</span><span class='line'>  <span class="n">buf</span> <span class="o">=</span> <span class="no">Audio</span><span class="o">::</span><span class="no">Sound</span><span class="o">.</span><span class="n">float</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span>
</span><span class='line'>  <span class="n">read</span> <span class="o">=</span> <span class="n">snd</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</span><span class='line'>  <span class="k">while</span> <span class="n">read</span> <span class="o">!=</span> <span class="mi">0</span>
</span><span class='line'>    <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</span><span class='line'>    <span class="n">read</span> <span class="o">=</span> <span class="n">snd</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">snd</span><span class="o">.</span><span class="n">close</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">out</span><span class="o">.</span><span class="n">close</span>
</span></code></pre></td></tr></table></div></figure>


<p>My code can be found Github at <a href="https://github.com/warhammerkid/ruby-audio">warhammerkid/ruby-audio</a>,
and I expect to make a few more modifications to it to clean up the API and
improve the documentation over the next couple weeks.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rack Middleware in Rails 2]]></title>
    <link href="http://chromedshark.com/blog/2009/10/rack-middleware-in-ruby.html"/>
    <updated>2009-10-09T10:00:00-04:00</updated>
    <id>http://chromedshark.com/blog/2009/10/rack-middleware-in-ruby</id>
    <content type="html"><![CDATA[<p>If you have a rack middleware packaged as a gem that you would like to use in
your rails app, add these lines to your environment.rb file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">gem</span> <span class="s1">&#39;rack-amf&#39;</span><span class="p">,</span> <span class="ss">:lib</span> <span class="o">=&gt;</span> <span class="s1">&#39;rack/amf&#39;</span><span class="p">,</span> <span class="ss">:source</span> <span class="o">=&gt;</span> <span class="s2">&quot;http://gemcutter.org/&quot;</span>
</span><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">middleware</span><span class="o">.</span><span class="n">use</span> <span class="s1">&#39;Rack::AMF&#39;</span><span class="p">,</span> <span class="ss">:url</span> <span class="o">=&gt;</span> <span class="s1">&#39;/amf&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Make sure you put the middleware name in a string, or rails initialization will
fail because the gem hasn&#8217;t loaded yet.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Strings in AS3 and Memory]]></title>
    <link href="http://chromedshark.com/blog/2009/03/strings-in-as3-and-memory.html"/>
    <updated>2009-03-20T12:55:00-04:00</updated>
    <id>http://chromedshark.com/blog/2009/03/strings-in-as3-and-memory</id>
    <content type="html"><![CDATA[<p>I was doing some experimenting to see whether having multiple references to a
string took up much space, and it turns out that Flash doesn&#8217;t actually deep-copy
strings when you copy them around. Instead it copies by reference until a change
is made, which then forces a deep copy. This is similar to the way PHP works,
passing strings by value but not actually creating a new object until the value
is changed. Below is the code I used to determine this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='as3'><span class='line'><span class="k">import</span> <span class="nn">flash.system.System</span><span class="o">;</span>
</span><span class='line'><span class="k">import</span> <span class="nn">flash.utils.ByteArray</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function </span><span class="nf">clone</span><span class="o">(</span><span class="n">source</span><span class="o">:</span><span class="kt">Object</span><span class="o">):</span><span class="kt">*</span> <span class="o">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="n">copier</span><span class="p">:</span><span class="kt">ByteArray</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">ByteArray</span><span class="o">();</span>
</span><span class='line'>    <span class="n">copier</span><span class="o">.</span><span class="na">writeObject</span><span class="o">(</span><span class="n">source</span><span class="o">);</span>
</span><span class='line'>    <span class="n">copier</span><span class="o">.</span><span class="na">position</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>    <span class="k">return</span><span class="o">(</span><span class="n">copier</span><span class="o">.</span><span class="na">readObject</span><span class="o">());</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="n">str</span><span class="p">:</span><span class="kt">String</span> <span class="o">=</span> <span class="s2">&quot;This is a test of string copying&quot;</span><span class="o">;</span>
</span><span class='line'><span class="kd">var</span> <span class="n">storeA</span><span class="p">:</span><span class="kt">Array</span> <span class="o">=</span> <span class="o">[];</span>
</span><span class='line'><span class="kd">var</span> <span class="n">storeB</span><span class="p">:</span><span class="kt">Array</span> <span class="o">=</span> <span class="o">[];</span>
</span><span class='line'><span class="kd">var</span> <span class="n">before</span><span class="p">:</span><span class="kt">int</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Test A</span>
</span><span class='line'><span class="n">before</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">totalMemory</span><span class="o">;</span>
</span><span class='line'><span class="k">for</span><span class="o">(</span><span class="kd">var</span> <span class="n">i</span><span class="p">:</span><span class="kt">int</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10000</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">storeA</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">clone</span><span class="o">(</span><span class="n">str</span><span class="o">)</span> <span class="k">as</span> <span class="n">String</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="nf">trace</span><span class="o">(</span><span class="n">System</span><span class="o">.</span><span class="na">totalMemory</span> <span class="o">-</span> <span class="n">before</span><span class="o">);</span> <span class="c1">// Total Mem Increase: 3280896</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Test B</span>
</span><span class='line'><span class="n">before</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">totalMemory</span><span class="o">;</span>
</span><span class='line'><span class="k">for</span><span class="o">(</span><span class="kd">var</span> <span class="n">j</span><span class="p">:</span><span class="kt">int</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="mi">10000</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">storeB</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">str</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'><span class="nf">trace</span><span class="o">(</span><span class="n">System</span><span class="o">.</span><span class="na">totalMemory</span> <span class="o">-</span> <span class="n">before</span><span class="o">);</span> <span class="c1">// Total Mem Increase: 49152</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Can you change str without affecting storeB?</span>
</span><span class='line'><span class="n">str</span> <span class="o">=</span> <span class="s2">&quot;New value&quot;</span><span class="o">;</span>
</span><span class='line'><span class="nf">trace</span><span class="o">(</span><span class="n">storeB</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span> <span class="c1">// &#39;This is a test of string copying&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Can you change storeB[0] without affecting storeB[1]?</span>
</span><span class='line'><span class="n">storeB</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">+=</span> <span class="s1">&#39;a&#39;</span><span class="o">;</span>
</span><span class='line'><span class="nf">trace</span><span class="o">(</span><span class="n">storeB</span><span class="o">[</span><span class="mi">0</span><span class="o">]+</span><span class="s2">&quot; vs &quot;</span><span class="o">+</span><span class="n">storeB</span><span class="o">[</span><span class="mi">1</span><span class="o">]);</span>
</span><span class='line'><span class="c1">// &#39;This is a test of string copyinga vs This is a test of string copying&#39;</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
</feed>
