<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Windows on bramp.net</title>
    <link>https://blog.bramp.net/</link>
    <description>Recent content in Windows on bramp.net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <lastBuildDate>Thu, 23 Sep 2010 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.bramp.net/tags/windows/" rel="self" type="application/rss+xml" />
    
    <item>
      <title>UTF-8 Directory Listing</title>
      <link>https://blog.bramp.net/post/2010/09/23/utf-8-directory-listing/</link>
      <pubDate>Thu, 23 Sep 2010 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2010/09/23/utf-8-directory-listing/</guid>
      <description><p>I had a need to create a directory listing with all the UTF-8 characters intact. This seems quite a chore on Windows, as doing anything via the shell seems to mangle the characters and show ???? instead of the real characters. For example, both the built in <strong>dir</strong> and Cygwin <strong>ls</strong> or <strong>find</strong> seemed affected. This turns out to be a <a href="http://stackoverflow.com/questions/379240/is-there-a-windows-command-shell-that-will-display-unicode-characters">limitation in the windows shell</a>.</p>
<p>To solve this problem I wrote a bit of python to read the file names in full UTF-8 and output the results directly to a file (and not via a pipe, which would again be via the shell). The resulting very simple script is as follows:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">codecs</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">log</span> <span class="o">=</span> <span class="n">codecs</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;listing&#39;</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&#34;utf-8&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">root</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">files</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="sa">u</span><span class="s1">&#39;.&#39;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">log</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">root</span> <span class="o">+</span> <span class="sa">u</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">file</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">files</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="n">log</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">file</span><span class="p">)</span> <span class="o">+</span> <span class="sa">u</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">log</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span></code></pre></div></description>
    </item>
    
    <item>
      <title>Converting MBR to GPT without deleting your partitions</title>
      <link>https://blog.bramp.net/post/2010/08/30/converting-mbr-to-gpt-without-deleting-your-partitions/</link>
      <pubDate>Mon, 30 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2010/08/30/converting-mbr-to-gpt-without-deleting-your-partitions/</guid>
      <description><p>Today I tired to convert my Windows 2TB RAID disk from a <a href="http://en.wikipedia.org/wiki/Master_boot_record">master boot record</a> (MBR) layout to a <a href="http://en.wikipedia.org/wiki/GUID_Partition_Table">GUID partition table</a> (GPT) one. The reason I wanted to swap is that GPT supports partitions larger than 2TB. Normally it is easy to convert a MBR disk to a GPT one by <a href="http://technet.microsoft.com/en-us/library/cc738416(WS.10).aspx">using the Disk Management GUI</a>. However, Microsoft do not allow you to convert you disk if you have any partitions on the disk.</p>
<p>After some searching I found that you could <a href="https://bbs.archlinux.org/viewtopic.php?id=62984">convert the disk non-destructively on Linux</a>, but due to various reasons, my RAID <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=411172">does not work</a> inside my Debian Linux :( I had also read a <a href="http://www.rodsbooks.com/gdisk/mbr2gpt.html">document outlining how to the conversion works</a>, and it seems such a simple process I was surprised that Microsoft didn’t support it.</p>
<p>Some more searching and I found a Linux/Windows tool that will convert MBR to GPT quite easily. <a href="http://sourceforge.net/projects/gptgen/">Gptgen</a> is a simple command line tool that seemed to work like a charm. I will quickly outline the steps I took to use it “safely”.</p>
<p>Firstly I identified with disk I wanted to alter. This is done by looking at which number the disk is in Disk Management. I then quickly tested the tool without writing the changes</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gptgen.exe <span class="se">\\</span>.<span class="se">\\</span>physicaldrive1
</span></span></code></pre></div><p>This outputted quite a few lines, including the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Write primary.img to LBA address 0.
</span></span><span class="line"><span class="cl">Write secondary.img to LBA address 4395431903.
</span></span></code></pre></div><p>When you don’t write the changes to disk, gptgen creates two binary files “primary.img”, and “secondary.img”, which contain what it would have written to disk. The console output from gptgen tells me it would have written primary to <a href="http://en.wikipedia.org/wiki/Logical_block_addressing">LBA address</a> 0, and secondary.img to LBA address 4395431903. So I figured it was a good idea to make a backup of those sections first. To do this I use the <a href="http://www.chrysocome.net/dd">Windows version of the classic tool dd</a></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span><span class="se">\\</span>.<span class="se">\\</span>physicaldrive1 <span class="nv">of</span><span class="o">=</span>primary-backup.img <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> <span class="nv">count</span><span class="o">=</span><span class="m">34</span> 
</span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span><span class="se">\\</span>.<span class="se">\\</span>physicaldrive1 <span class="nv">of</span><span class="o">=</span>secondary-backup.img <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> <span class="nv">count</span><span class="o">=</span><span class="m">33</span> <span class="nv">skip</span><span class="o">=</span><span class="m">4395431903</span>
</span></span></code></pre></div><p>The count and skip values might have to change. The two count values relate to the file sizes of primary.img and secondary.img. Find their file sizes and divide them by 512. In my case, primary.img was exactly 17,408 bytes, so 17408 / 512 = 34. Do the same for secondary.img. The skip number is the LBA address shown by gptgen just a minute ago.</p>
<p>Ok, if you have run dd ok, you should have backups of the two sections it is going to overwrite. Now you can tell gptgen to actually make the changes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gptgen.exe -w <span class="se">\\</span>.<span class="se">\\</span>physicaldrive1
</span></span></code></pre></div><p>That should be it, BUT if you need to (for whatever reason) restore the backups issue these commands:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>primary-backup.img   <span class="nv">of</span><span class="o">=</span><span class="se">\\</span>.<span class="se">\\</span>physicaldrive1 <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> <span class="nv">count</span><span class="o">=</span><span class="m">34</span> 
</span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>secondary-backup.img <span class="nv">of</span><span class="o">=</span><span class="se">\\</span>.<span class="se">\\</span>physicaldrive1 <span class="nv">bs</span><span class="o">=</span><span class="m">512</span> <span class="nv">count</span><span class="o">=</span><span class="m">33</span> <span class="nv">seek</span><span class="o">=</span><span class="m">4395431903</span>
</span></span></code></pre></div><p>(notice how the “if” and “of” arguments have swapped, and the word “skip” has changed to “seek”.)</p>
</description>
    </item>
    
    <item>
      <title>Humble Indie Bundle md5sums</title>
      <link>https://blog.bramp.net/post/2010/05/07/humble-indie-bundle-md5sums/</link>
      <pubDate>Fri, 07 May 2010 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2010/05/07/humble-indie-bundle-md5sums/</guid>
      <description><p>I just purchased the <a href="http://www.wolfire.com/humble">Humble Indie Bundle</a>, 5 games which run on Windows, Linux and Mac. They kindly offered md5 hashes, however they weren’t in a convenient format, so I created a md5sums file.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">187287db6226ef6a306a4cd0cfa8dd45 *Aquaria111.2008.12.12.exe
</span></span><span class="line"><span class="cl">8b24ddeeb553e028bbd501102f891cc2 *aquaria-lnx-humble-bundle.mojo.run
</span></span><span class="line"><span class="cl">336d89eb431e0b00535a2b50146c579d *WorldOfGooSetup.1.30.exe
</span></span><span class="line"><span class="cl">f5afa40893d0fbcc37885191404f6d8c *WorldOfGooSetup.1.41.tar.gz
</span></span><span class="line"><span class="cl">b373132f6e78665f1076752b038a8218 *gish153-1.tar.gz
</span></span><span class="line"><span class="cl">94e82d53e2104914f19ec97f7cf5da42 *gish1531.zip
</span></span><span class="line"><span class="cl">41ea2e41fe42c40b5ad017ae1afb45c7 *lugaru-full-linux-x86-1.0c.bin
</span></span><span class="line"><span class="cl">d40d4076ed3ffa2a9bc9913202c55a06 *lugaru-windows.zip
</span></span><span class="line"><span class="cl">56060bb550e0cd7e90bc7bc60d7c4c23 *penumbra_overture_1.1.exe
</span></span><span class="line"><span class="cl">539567b590cf53e65a8e8f1b2bc728b3 *penumbra_overture_1.1.sh
</span></span></code></pre></div><p>and for those that prefer sha1:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">ec8fd66bb44c6f67eab40f73e57838dcb5e2f4dd *Aquaria111.2008.12.12.exe
</span></span><span class="line"><span class="cl">48267967b3a57fb406fa6545261f8b758edb8fb5 *aquaria-lnx-humble-bundle.mojo.run
</span></span><span class="line"><span class="cl">70fad514746d6fc482fc3d681a7e9d498374bdad *WorldOfGooSetup.1.30.exe
</span></span><span class="line"><span class="cl">4f7202a4ac17dd1665a1ab7f90153e5b813e16f1 *WorldOfGooSetup.1.41.tar.gz
</span></span><span class="line"><span class="cl">27b862939b6a01c29b1b146ed1307c0027217855 *gish153-1.tar.gz
</span></span><span class="line"><span class="cl">7a1341822d4d4e0010cc1e8cce68da6bb02ea904 *gish1531.zip
</span></span><span class="line"><span class="cl">2349bdea3d595c3aaedca0810229d12f96323874 *lugaru-full-linux-x86-1.0c.bin
</span></span><span class="line"><span class="cl">73f09414e0cabd371802eea1b9c75c76522c5934 *lugaru-windows.zip
</span></span><span class="line"><span class="cl">557c6988eda16c6269d09a35031fd1754e042c02 *penumbra_overture_1.1.exe
</span></span><span class="line"><span class="cl">e115f7cfcf9710d7aa5b2a5a9186b3736bb55cf2 *penumbra_overture_1.1.sh
</span></span></code></pre></div><p>Note, these were correct and validated on the 8th of May, however, if any of the files have been updated the hashes might no longer much. Feel free to <a href="/about-me/">contact me</a> to tell me if this happens.</p>
</description>
    </item>
    
    <item>
      <title>Threadnetperf v1.0</title>
      <link>https://blog.bramp.net/post/2009/06/01/threadnetperf-v1.0/</link>
      <pubDate>Mon, 01 Jun 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/06/01/threadnetperf-v1.0/</guid>
      <description><p>Today I am proud to announce that I’m releasing a tool I’ve used privately for well over a year now. It is a multi-threaded network testing tool which gives the user great control over how many connections, threads and processes the tool uses, and which CPU cores the threads/processes are allowed to execute on.</p>
<p>Currently the tool runs on Linux, FreeBSD, and Windows, and has performance as good as (if not better) than other similar tools, such as netperf, iperf, but with the added flexibility. Additionally, Threadnetperf has been completely written from scratch in C, using modern programming techniques and APIs (such as ePoll on Linux) which ensures the program runs as far as possible with minimal overheads.</p>
<p>You can <a href="https://github.com/bramp/threadnetperf">download the source from GitHub</a>, which contains instructions on how to build it.</p>
<p>So that you get an extra idea of it’s features here is the README.txt</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">****** Threadnetperf ******
</span></span><span class="line"><span class="cl">A multi-threaded network benchmark tool
</span></span><span class="line"><span class="cl"> by  Andrew Brampton (2007-2009)
</span></span><span class="line"><span class="cl"> and Mathew Faulkner (2007-2009)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Threadnetperf is a highly customisable high performance network benchmarking
</span></span><span class="line"><span class="cl">tool. The key difference from previous tools is that the user is able to control
</span></span><span class="line"><span class="cl">how many threads threadnetperf uses, as well as which cores these threads are
</span></span><span class="line"><span class="cl">pinned to. This tool was useful in our research for measuring the effect of
</span></span><span class="line"><span class="cl">sending or receiving from one core, and having the OS network stack run on
</span></span><span class="line"><span class="cl">another core. Additionally the tool can be configured to use an unlimited number
</span></span><span class="line"><span class="cl">of connections, threads or processes, which scale considerably well due to the
</span></span><span class="line"><span class="cl">use of the epoll API.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Threadnetperf has previously worked on Windows, Linux, and FreeBSD, however, we
</span></span><span class="line"><span class="cl">do not test it very rigorously so one of these platforms may be broken. All
</span></span><span class="line"><span class="cl">patches are welcome.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">To build on a *nix style system just use the simple &#34;Makefile&#34; by executing the
</span></span><span class="line"><span class="cl">command &#34;make&#34; or &#34;gmake&#34;. To build on Windows just use the provided
</span></span><span class="line"><span class="cl">threadnetperf.2008.sln file.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">All the commands of Threadnetperf are documented within the application, but a
</span></span><span class="line"><span class="cl">quick overview is here:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Usage: threadnetperf [options] tests
</span></span><span class="line"><span class="cl">Usage: threadnetperf -D [options]
</span></span><span class="line"><span class="cl">       -c level,interval   Confidence level, must be 95 or 99
</span></span><span class="line"><span class="cl">       -D         Use daemon mode (wait for incoming tests)
</span></span><span class="line"><span class="cl">       -d time    Set duration to run the test for
</span></span><span class="line"><span class="cl">       -e         Eat the data (i.e. dirty it)
</span></span><span class="line"><span class="cl">       -H host    Set the remote host(and port) to connect to
</span></span><span class="line"><span class="cl">       -h         Display this help
</span></span><span class="line"><span class="cl">       -i min,max Set the minimum and maximum iterations
</span></span><span class="line"><span class="cl">       -m [t,p]   What programming model to use, [thread or process]
</span></span><span class="line"><span class="cl">       -n         Disable Nagle&#39;s algorithm (e.g no delay)
</span></span><span class="line"><span class="cl">       -p port    Set the port number for the first server thread to use
</span></span><span class="line"><span class="cl">       -s size    Set the send/recv size
</span></span><span class="line"><span class="cl">       -T         Timestamp packets, and measure latency (only on *nix)
</span></span><span class="line"><span class="cl">       -t         Use TCP
</span></span><span class="line"><span class="cl">       -r         Packets per second rate (default: ~0)
</span></span><span class="line"><span class="cl">       -u         Use UDP
</span></span><span class="line"><span class="cl">       -v         Verbose
</span></span><span class="line"><span class="cl">       -V         Display version only
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">       tests      Combination of cores and clients
</span></span><span class="line"><span class="cl">       tests      Core numbers are masks, for example 1 is core 0, 3 is core 0
</span></span><span class="line"><span class="cl">and core 1
</span></span><span class="line"><span class="cl">               N{c-s}   N connections
</span></span><span class="line"><span class="cl">                        c client cores mask
</span></span><span class="line"><span class="cl">                        s server cores mask
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">You can run tests locally, or across two machines. Here are some examples:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    threadnetperf -n -s 10000 1{1-1}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Will run a local TCP test, with Nagle&#39;s algorithm disabled, a send size of
</span></span><span class="line"><span class="cl">10,000, and 1 TCP connection between cores 0 and 0.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    threadnetperf 10{1-1} 10{2-2} 10{4-4}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Will again run a local TCP test, however this time 10 connection from core 0 to
</span></span><span class="line"><span class="cl">core 0, 10 connections from core 1 to core 1, and 10 connections from core 2 to
</span></span><span class="line"><span class="cl">core 2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">To run across a network just start the threadnetperf daemon on one of the
</span></span><span class="line"><span class="cl">machines like so:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">     threadnetperf -D
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">and on the other machine execute:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">     threadnetperf -H serverIP 1{1-2}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">which will conduct a TCP test from the client to the server, with one thread
</span></span><span class="line"><span class="cl">executing on client&#39;s core 0, and the server&#39;s core 1.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">There is no need to give the threadnetperf daemon any options, as the options
</span></span><span class="line"><span class="cl">configured on the server will be passed over the network. This make running many
</span></span><span class="line"><span class="cl">tests very easy as the daemon will continue to wait for new tests until it is
</span></span><span class="line"><span class="cl">told otherwise.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">If you find this tool useful, or you have any suggestions for improvements then
</span></span><span class="line"><span class="cl">please contact us.
</span></span></code></pre></div></description>
    </item>
    
  </channel>
</rss>
