<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: Debedb's Code Snippets</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Mon, 06 Oct 2008 15:59:14 GMT</pubDate>
    <description>DZone Snippets: Debedb's Code Snippets</description>
    <item>
      <title>Add a concat() aggregate function to SQLite</title>
      <link>http://snippets.dzone.com/posts/show/3717</link>
      <description>I often need string concatenation to behave just like an aggregate function.&lt;br /&gt;Once again I find a need to do that in SQLite, and to do that without recompiling&lt;br /&gt;SQLite for every platform we distribute for... &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include "sqlite3ext.h"&lt;br /&gt;SQLITE_EXTENSION_INIT1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;typedef struct SCtx SCtx;&lt;br /&gt;struct SCtx {&lt;br /&gt;  int rowCnt;&lt;br /&gt;  int charCnt;&lt;br /&gt;  char *result;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;static void concat_step(sqlite3_context* ctx, int argc, sqlite3_value**argv) {&lt;br /&gt;&lt;br /&gt;  SCtx *p = (SCtx *) sqlite3_aggregate_context(ctx, sizeof(*p));&lt;br /&gt;&lt;br /&gt;  char *sep = sqlite3_value_text(argv[1]);&lt;br /&gt;&lt;br /&gt;  char *txt = sqlite3_value_text(argv[0]);&lt;br /&gt;&lt;br /&gt;  if (p-&gt;rowCnt) {&lt;br /&gt;    char *txt2 = malloc(strlen(txt) + strlen(sep) + 1);&lt;br /&gt;    strcpy(txt2,sep);&lt;br /&gt;    strcat(txt2,txt);&lt;br /&gt;    txt = txt2;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //  printf("%d. Txt: [%s] len %d\n", p-&gt;rowCnt, txt, strlen(txt));&lt;br /&gt;&lt;br /&gt;  int len = strlen(txt);&lt;br /&gt;&lt;br /&gt;  if (!p-&gt;result) {&lt;br /&gt;    p-&gt;result = malloc(len + 1);&lt;br /&gt;    strcpy(p-&gt;result, txt);&lt;br /&gt;  } else {&lt;br /&gt;    p-&gt;result = realloc(p-&gt;result, strlen(p-&gt;result) + len + 1);&lt;br /&gt;    strcat(p-&gt;result,txt);&lt;br /&gt;  }&lt;br /&gt;  //  printf ("intermediate [%s]\n", p-&gt;result);&lt;br /&gt;  p-&gt;rowCnt++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void concat_final(sqlite3_context* ctx,&lt;br /&gt;                         int argc,&lt;br /&gt;                         sqlite3_value** argv) {&lt;br /&gt;&lt;br /&gt;  SCtx *p = (SCtx *) sqlite3_aggregate_context(ctx, sizeof(*p));&lt;br /&gt;  //  printf("Finally: %s\n", p-&gt;result);&lt;br /&gt;  sqlite3_result_text(ctx,  p-&gt;result, strlen(p-&gt;result), NULL);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int sqlite3_extension_init(&lt;br /&gt;  sqlite3 *db,&lt;br /&gt;  char **pzErrMsg,&lt;br /&gt;  const sqlite3_api_routines *pApi&lt;br /&gt;){&lt;br /&gt;  SQLITE_EXTENSION_INIT2(pApi)&lt;br /&gt;  sqlite3_create_function(db, "concat", 2, SQLITE_ANY, 0, NULL, concat_step, concat_final);&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I compiled this with the following (here, ./src is the SQLite code - I used&lt;br /&gt;http://www.sqlite.org/sqlite-source-3_3_13.zip). &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;gcc -fpic -c agg.c -I./src&lt;br /&gt;gcc -shared -Wl,-soname,libagg.so -o libagg.so agg.o&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And here's how it works:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sqlite&gt; CREATE TABLE test (animals VARCHAR, interjection VARCHAR);&lt;br /&gt;&lt;br /&gt;sqlite&gt; insert into test (animals, interjection) values ('lions', 'oh my');&lt;br /&gt;&lt;br /&gt;sqlite&gt; insert into test (animals, interjection) values ('tigers', 'oh my'); &lt;br /&gt;&lt;br /&gt;sqlite&gt; insert into test (animals, interjection) values ('bears', 'oh my');&lt;br /&gt;&lt;br /&gt;sqlite&gt; select load_extension('./libagg.so');&lt;br /&gt;&lt;br /&gt;sqlite&gt; select concat(animals, ' and '), interjection from test group by interjection;&lt;br /&gt;&lt;br /&gt;sqlite&gt; lions and tigers and bears|oh my&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;1. http://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions&lt;br /&gt;2. http://souptonuts.sourceforge.net/readme_sqlite_tutorial.html&lt;br /&gt;3. http://www.sqlite.org/capi3ref.html</description>
      <pubDate>Fri, 23 Mar 2007 03:27:46 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3717</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
    <item>
      <title>Flex/ActionScript: Making trace() display the method it was called in</title>
      <link>http://snippets.dzone.com/posts/show/3703</link>
      <description>While trace() is useful, its indiscriminate use by me often crowds &lt;br /&gt;the console of my fellow developers. We agreed on making every trace() show&lt;br /&gt;the method it came from, but I am too lazy to do this, this makes it automatic:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public static function TRACE(s:Object):void {&lt;br /&gt;  try {&lt;br /&gt;    throw new Error();&lt;br /&gt;  } catch (e:Error) {&lt;br /&gt;    var stack:String = e.getStackTrace();&lt;br /&gt;    var frames:Array = stack.split("\n");&lt;br /&gt;    var myFrame:String = String(frames[2]);&lt;br /&gt;    myFrame = myFrame.replace("\t", "");&lt;br /&gt;  &lt;br /&gt;    // "at " can be followed by some part of the package&lt;br /&gt;    // you don't want to see. E.g., if your code is all in&lt;br /&gt;    // com.foo.bar, you can put "at com.foo.bar." so as not&lt;br /&gt;    // to crowd the display&lt;br /&gt;    myFrame = myFrame.substr("at ".length);&lt;br /&gt;    myFrame = myFrame.substring(0, myFrame.indexOf("["));&lt;br /&gt;    trace(myFrame + ": " + s);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 20 Mar 2007 06:12:03 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3703</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
    <item>
      <title>Converting file list into a class list</title>
      <link>http://snippets.dzone.com/posts/show/3627</link>
      <description>Converting file list into a class list - this is particularly useful for &lt;a href=http://labs.adobe.com/wiki/index.php/Talk:Flex_Ant_Tasks#include-classes_without_pattern_matching&gt;include-classes attribute of compc&lt;/a&gt; task in Flex, but may be useful for Java. The &lt;chainmapper&gt; is most probably pleonastic but it works for me this way, and I don't feel like trying it without it...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   &lt;path id="xmlrpc_class_list_1"&gt;&lt;br /&gt;      &lt;fileset dir="${user.dir}/xmlrpc"&gt;&lt;br /&gt;         &lt;include name="com/mattism/**"/&gt;&lt;br /&gt;         &lt;exclude name="**/Test*"/&gt;&lt;br /&gt;      &lt;/fileset&gt;&lt;br /&gt;   &lt;/path&gt;&lt;br /&gt;   &lt;pathconvert &lt;br /&gt;      property="xmlrpc_class_list_2" &lt;br /&gt;      pathsep=" " &lt;br /&gt;      dirsep="." &lt;br /&gt;      refid="xmlrpc_class_list_1"&gt;&lt;br /&gt;      &lt;map from="${user.dir}/xmlrpc/" to=""/&gt;&lt;br /&gt;      &lt;mapper&gt;&lt;br /&gt;         &lt;chainedmapper&gt;&lt;br /&gt;            &lt;globmapper from="*.as" to="*"/&gt;&lt;br /&gt;         &lt;/chainedmapper&gt;&lt;br /&gt;      &lt;/mapper&gt;&lt;br /&gt;&lt;/pathconvert&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 04 Mar 2007 10:15:35 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3627</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
    <item>
      <title>Getting build number for Ant build in Continuum</title>
      <link>http://snippets.dzone.com/posts/show/3626</link>
      <description>Getting build number for Ant build in Continuum&lt;br /&gt;&lt;br /&gt;&lt;code&gt;   &lt;br /&gt;&lt;timestampselector property="mostrecentlog"&gt;&lt;br /&gt;&lt;path&gt;&lt;br /&gt;&lt;fileset dir="${user.dir}/../../cont-output/1"&gt;&lt;br /&gt;&lt;include name="*.log.txt" /&gt;&lt;br /&gt;&lt;/fileset&gt;&lt;br /&gt;&lt;/path&gt;&lt;br /&gt;&lt;/timestampselector&gt;			&lt;br /&gt;&lt;br /&gt;&lt;basename property="reportsDirName" file="${mostrecentlog}" suffix=".log.txt"&gt;&lt;br /&gt;&lt;/basename&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 04 Mar 2007 10:08:18 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3626</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
    <item>
      <title>Print call sequence of a C program</title>
      <link>http://snippets.dzone.com/posts/show/3593</link>
      <description>Perl script to run gdb and collect information about method call&lt;br /&gt;sequences. See also &lt;A href=http://debedb.blogspot.com/2007/02/poor-mans-tracepoints-and-call-sequence.html&gt;the blog entry&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/perl &lt;br /&gt;&lt;br /&gt;use FileHandle;&lt;br /&gt;use IPC::Open2;&lt;br /&gt;&lt;br /&gt;if (! (-e "tags")) {&lt;br /&gt;  print "Cannot find tags, will run\n";&lt;br /&gt;  $tagCmd = "ctags *.h *.c";&lt;br /&gt;  print "\t$tagCmd\n";&lt;br /&gt;  system($tagCmd) &amp;&amp; die ("Make sure ctags is installed\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;%breakId2Func = {};&lt;br /&gt;%func2Args = {};&lt;br /&gt;&lt;br /&gt;#if ($ARGV[0] eq "prepare") {&lt;br /&gt;#  exec('ctags *.h *.c');&lt;br /&gt;  $exec = $ARGV[0];&lt;br /&gt;  splice(@ARGV, 0, 1);&lt;br /&gt;  &lt;br /&gt;  $pid = open2(*Reader, *Writer, "gdb -annotate 3 --interpreter=mi $exec");&lt;br /&gt;&lt;br /&gt;  while (&lt;Reader&gt;) {&lt;br /&gt;    chop;&lt;br /&gt;    last if ($_ eq "(gdb) ") &lt;br /&gt;  }    &lt;br /&gt;  print Writer  "set print pretty on\n";&lt;br /&gt;  while (&lt;Reader&gt;) {&lt;br /&gt;    chop;&lt;br /&gt;    last if ($_ eq "(gdb) ") &lt;br /&gt;  }    &lt;br /&gt;&lt;br /&gt;  print Writer  "set print array on\n";&lt;br /&gt;  while (&lt;Reader&gt;) {&lt;br /&gt;    chop;&lt;br /&gt;    last if ($_ eq "(gdb) ") &lt;br /&gt;  }    &lt;br /&gt;  print Writer  "set print union on\n"; &lt;br /&gt;  while (&lt;Reader&gt;) {&lt;br /&gt;    chop;&lt;br /&gt;    last if ($_ eq "(gdb) ") &lt;br /&gt;  }    &lt;br /&gt;  &lt;br /&gt;  print "...\n";&lt;br /&gt;  open(GREP, 'grep "f$" ./tags|') || die "Do you have ctags?\n";&lt;br /&gt;  while (&lt;GREP&gt;) {&lt;br /&gt;    ($func, $file, $regexp, $f) = split(/\t+/);&lt;br /&gt;    $from = index($regexp, "(") + 1;&lt;br /&gt;    $to = rindex($regexp, ")");&lt;br /&gt;    $args = substr($regexp, $from, $to - $from);&lt;br /&gt;&lt;br /&gt;    print Writer  "break $func\n";&lt;br /&gt;    while (&lt;Reader&gt;) {&lt;br /&gt;      # Store the number of the breakpoint, we will&lt;br /&gt;       # need it later to determine when it's hit&lt;br /&gt;      chop;&lt;br /&gt;       if ($_ =~ /Breakpoint/) {&lt;br /&gt;	 $breakId = substr($_, length('~"Breakpoint '));&lt;br /&gt;         $breakId = substr($breakId, 0, index($breakId, " "));&lt;br /&gt;         $breakId2Func{$breakId} = $func;&lt;br /&gt;       } &lt;br /&gt;       last if $_ eq "(gdb) ";&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;    ##############################################################&lt;br /&gt;    # I wrote this when I didn't realize I can call "info args"&lt;br /&gt;    # But maybe saving this is still useful for more information&lt;br /&gt;    # like figuring out the type of variable and printing more&lt;br /&gt;    # info about it, in case it's some pointer to struct to whatever&lt;br /&gt;    #&lt;br /&gt;    # Save argument names for evaluation when breakpoint is hit    &lt;br /&gt;    # @args = split(/,/, $args );&lt;br /&gt;    #&lt;br /&gt;    # @$func = ();&lt;br /&gt;    # foreach $arg (@args) {&lt;br /&gt;    #  @typeAndVar = split(/\s+/,$arg);&lt;br /&gt;    #&lt;br /&gt;    #  $$func[++$#$func] = $typeAndVar[$#typeAndVar];&lt;br /&gt;    # }&lt;br /&gt;    #    $func2Args{$func} = \@$func;&lt;br /&gt;    #    *x = $func2Args{$func};&lt;br /&gt;    #    print "$func &gt; @x\n";&lt;br /&gt;    # }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;print "Calling run @ARGV\n";&lt;br /&gt;print Writer "run @ARGV\n";&lt;br /&gt;&lt;br /&gt;$inBreak = 0;&lt;br /&gt;while (&lt;Reader&gt;) {&lt;br /&gt;  chop;&lt;br /&gt;  if ($_ =~ /Breakpoint/) {&lt;br /&gt;    #      print "$_\n";&lt;br /&gt;    $breakId = substr($_, length('~"Breakpoint '));&lt;br /&gt;    $breakId = substr($breakId, 0, index($breakId, ","));&lt;br /&gt;    &lt;br /&gt;    $func = $breakId2Func{$breakId};&lt;br /&gt;    $inBreak = $breakId;&lt;br /&gt;    &lt;br /&gt;    # Which one is better?&lt;br /&gt;    print Writer "info args\n";&lt;br /&gt;    # print Writer "-stack-list-arguments 1 0 0\n";&lt;br /&gt;&lt;br /&gt;    print Writer "cont\n";&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  if ($inBreak) {&lt;br /&gt;    if ($_ =~ /~\"Continuing./) {&lt;br /&gt;      $inBreak = 0;&lt;br /&gt;      print "***************************\n";&lt;br /&gt;    } else {&lt;br /&gt;      if ($_ ne "(gdb) " &amp;&amp;&lt;br /&gt;	  $_ ne "^done" &amp;&amp;&lt;br /&gt;	  $_ ne '~"\n"' &amp;&amp;&lt;br /&gt;          $_ ne '&amp;"cont\n"' &amp;&amp;&lt;br /&gt;	 $_ !~ /stopped/) {&lt;br /&gt;&lt;br /&gt;	$_ =~ s/\\[nt]//g;&lt;br /&gt;	$_ =~ s/\\032//g;&lt;br /&gt;	$_ =~ s/^~\"//g;&lt;br /&gt;	print "$_\n";&lt;br /&gt;	&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 28 Feb 2007 01:59:15 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3593</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
    <item>
      <title>Beginnings of a fixed-width file import wizard in wxPython</title>
      <link>http://snippets.dzone.com/posts/show/3074</link>
      <description>A draft, saved for future reference, of an analog of &lt;A href=http://python-dsv.sourceforge.net/&gt;Python-DSV&lt;/a&gt;, but for fixed-length files...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;from wxPython.grid import wxGrid&lt;br /&gt;from wxPython.wx import wxPySimpleApp&lt;br /&gt;from wxPython.wx import wxFrame&lt;br /&gt;import wx&lt;br /&gt;import string&lt;br /&gt;import types&lt;br /&gt;&lt;br /&gt;class FixLenDiscovery(wxFrame):&lt;br /&gt;    colNum = 2&lt;br /&gt;    &lt;br /&gt;    rowNum = 6&lt;br /&gt;    &lt;br /&gt;    defLen = "5"&lt;br /&gt;&lt;br /&gt;    def addField(self,event):&lt;br /&gt;        self.fieldGrid.InsertCols(pos = self.colNum)&lt;br /&gt;        self.grid.InsertCols(pos = self.colNum)&lt;br /&gt;        self.fieldGrid.SetCellValue(0, self.colNum, self.defLen)&lt;br /&gt;        self.colNum = self.colNum + 1&lt;br /&gt;        self.Layout()&lt;br /&gt;        &lt;br /&gt;    def removeField(self,event):&lt;br /&gt;        if self.colNum &gt; 1:&lt;br /&gt;            self.fieldGrid.DeleteCols(self.colNum  - 1)&lt;br /&gt;            self.grid.DeleteCols(self.colNum  - 1)&lt;br /&gt;            self.colNum = self.colNum - 1&lt;br /&gt;        self.Layout()&lt;br /&gt;&lt;br /&gt;        &lt;br /&gt;    def loadFile(self,event):&lt;br /&gt;         path = self.filePicker.GetPath()&lt;br /&gt;         file = open(path, 'r')&lt;br /&gt;         &lt;br /&gt;         self.grid.ClearGrid()&lt;br /&gt;         for row in range(0, self.rowNum -1):&lt;br /&gt;             for col in range(0, self.colNum):&lt;br /&gt;                 width = self.fieldGrid.GetCellValue(0, col)&lt;br /&gt;                 width = string.atoi(width)&lt;br /&gt;                 value = file.read(width)&lt;br /&gt;                 self.grid.SetCellValue(row, col, value)&lt;br /&gt;             &lt;br /&gt;         self.grid.AutoSize()&lt;br /&gt;   &lt;br /&gt;    def __init__(self):&lt;br /&gt;        wxFrame.__init__(self, None, -1, '', size=(1000, 500))&lt;br /&gt;        &lt;br /&gt;        self.filePicker = wx.FilePickerCtrl(self, 1)&lt;br /&gt;        &lt;br /&gt;        self.loadButton = wx.Button(self, wx.FIXED, "Preview")&lt;br /&gt;        self.loadButton.Bind(wx.EVT_BUTTON, self.loadFile)&lt;br /&gt;        &lt;br /&gt;        self.grid=wxGrid(self, -1)&lt;br /&gt;        self.grid.CreateGrid(self.rowNum, self.colNum)&lt;br /&gt;        self.grid.DisableCellEditControl()&lt;br /&gt;       &lt;br /&gt;        topBox = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;#        topBox.Add(wx.StaticText(self, wx.FIXED, "File: "), 1)&lt;br /&gt;        topBox.Add(self.filePicker, 3)&lt;br /&gt;        topBox.Add(wx.StaticText(self, wx.FIXED, ""), 1)&lt;br /&gt;        topBox.Add(self.loadButton, 1)&lt;br /&gt;        &lt;br /&gt;        fieldsBox = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;        &lt;br /&gt;        fieldsButtonBox = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;        &lt;br /&gt;        self.fieldGrid = wxGrid(self, -1)&lt;br /&gt;        self.fieldGrid.CreateGrid(1, self.colNum)&lt;br /&gt;        for i in range(0, self.colNum):&lt;br /&gt;            self.fieldGrid.SetCellValue(0, i, self.defLen)&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        addFieldButton = wx.Button(self, wx.FIXED, "Add field")&lt;br /&gt;        addFieldButton.Bind(wx.EVT_BUTTON, self.addField)&lt;br /&gt;        removeFieldButton = wx.Button(self, wx.FIXED, "Remove field")&lt;br /&gt;        removeFieldButton.Bind(wx.EVT_BUTTON, self.removeField)&lt;br /&gt;        &lt;br /&gt;        fieldsButtonBox.Add(addFieldButton, 1)&lt;br /&gt;        fieldsButtonBox.Add(removeFieldButton, 1)&lt;br /&gt;        &lt;br /&gt;        fieldsBox.Add(self.fieldGrid, 1)&lt;br /&gt;        fieldsBox.Add(fieldsButtonBox, 1)&lt;br /&gt;        &lt;br /&gt;        mySizer = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;        mySizer.Add(topBox, 1)&lt;br /&gt;        mySizer.Add(fieldsBox, 3)&lt;br /&gt;&lt;br /&gt;        mySizer.Add(self.grid, 4)&lt;br /&gt;        &lt;br /&gt;        self.SetAutoLayout(True)&lt;br /&gt;        self.SetSizer(mySizer)&lt;br /&gt;        self.Layout()&lt;br /&gt;       &lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    app = wxPySimpleApp()&lt;br /&gt;    frame = FixLenDiscovery()&lt;br /&gt;    frame.Show(True)&lt;br /&gt;    app.MainLoop()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 04 Dec 2006 12:22:20 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3074</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
    <item>
      <title>One-click connect from cygwin to full-screen Linux (X stuff required)</title>
      <link>http://snippets.dzone.com/posts/show/1298</link>
      <description>Optional: execute the following once (see http://hacks.oreilly.com/pub/h/66 for &lt;br /&gt;details), to avoid typing in the password.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;set LINUX_HOST=mylinuxhost&lt;br /&gt;ssh-keygen -t rsa&lt;br /&gt;ssh %USERNAME%@%LINUX_HOST% "mkdir .ssh; chmod 0700 .ssh"&lt;br /&gt;bash -c 'scp ~/.ssh/id_rsa.pub %LINUX_HOST%:.ssh/authorized_keys2'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now, if you save the following as a BATCH file, you can just click it &lt;br /&gt;to connect to fullscreen Linux: &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;set LINUX_HOST=mylinuxhost&lt;br /&gt;start /min xinit &lt;br /&gt;xhost +%LINUX_HOST%&lt;br /&gt;ssh %LINUX_HOST% "declare -x DISPLAY=%COMPUTERNAME%:0; echo $DISPLAY;gnome-session"'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;NOTES: &lt;br /&gt;1. &lt;br /&gt;Sometimes xhost + does not execute in time. O well. Just close&lt;br /&gt;all windows that got opened and try again.&lt;br /&gt;&lt;br /&gt;2.&lt;br /&gt;If you didn't do the step one (ssh keys), you will be prompted &lt;br /&gt;to enter the linux password; this increases the chances of the above&lt;br /&gt;error.&lt;br /&gt;&lt;br /&gt;3.&lt;br /&gt;The single terminal window appearing in the Linux desktop is in fact &lt;br /&gt;a window from your PC. &lt;br /&gt;&lt;br /&gt;</description>
      <pubDate>Wed, 25 Jan 2006 22:13:49 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1298</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
    <item>
      <title>JUnit: Convenient use of TestSuite based on parameterized TestCases</title>
      <link>http://snippets.dzone.com/posts/show/752</link>
      <description>Here's a frequently (at least for me) occurring problem: let's say&lt;br /&gt;you have a TestCase where each testXXX() method really does mostly &lt;br /&gt;the same thing, parameterized by some instance variables. For instance,&lt;br /&gt;I have a file consisting of good data for each parameter, such as:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;goodAAA=foo&lt;br /&gt;goodBBB=bar&lt;br /&gt;goodCCC=baz&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You don't want to create tens or hundreds of methods (testAAA(), &lt;br /&gt;testBBB(), etc.) by copying and pasting. So you create a TestCase that &lt;br /&gt;has:&lt;br /&gt;&lt;br /&gt;- An field called, say, key&lt;br /&gt;&lt;br /&gt;- A single testKey() method that, based on the &lt;br /&gt;key, gets the good data, gets the test data and compares them.&lt;br /&gt;&lt;br /&gt;- static suite() method that, in a loop, creates instances of your &lt;br /&gt;TestCase and sets their keys appropriately.&lt;br /&gt;&lt;br /&gt;This is all well and good. But when you run it, a failure will always &lt;br /&gt;show up in testKey() method in JUnit's UI. (Sure, you can add a message&lt;br /&gt;that shows the key for which it failed, but it does not give&lt;br /&gt;you an at-a-glance feedback.)&lt;br /&gt;&lt;br /&gt;So for convenience, you override getName() to return key. Now&lt;br /&gt;it's very easy to tell, by merely glancing at that JUnit bar, what &lt;br /&gt;failed. &lt;br /&gt;&lt;br /&gt;But if you run it within IDE, say, Eclipse, you want to click on the &lt;br /&gt;failed test so that Failure Trace appears, where you can click on any &lt;br /&gt;Stack Trace Element and get to the exact line of failure in your code. &lt;br /&gt;But because the failed test's name is based on the key field, it does &lt;br /&gt;not correspond to a real testXXX() method in your TestCase. So your&lt;br /&gt;IDE can't take you to the code that failed.&lt;br /&gt;&lt;br /&gt;Here's how to override getName() to get the best of both worlds:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public String getName() {&lt;br /&gt;    StackTraceElement[] st = new Throwable().getStackTrace();&lt;br /&gt;    if (st.length &lt; 4 || !st[3].getMethodName().equals("endTest")) {&lt;br /&gt;        return key; 	  // Meaningful name to appear in the bar&lt;br /&gt;    } else {&lt;br /&gt;        return "testKey"; // Real method name to appear in Failure Trace&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Tue, 20 Sep 2005 00:28:35 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/752</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
    <item>
      <title>Lowercasing a string in BAT files</title>
      <link>http://snippets.dzone.com/posts/show/554</link>
      <description>Using &lt;a href=http://www.bigbold.com/snippets/posts/show/553&gt;this silliness&lt;/a&gt;, here's an example of BAT file that will&lt;br /&gt;lower-case a string given as an argument.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;echo&gt;%1&lt;br /&gt;dir /b/l %1&gt;lower.tmp&lt;br /&gt;set /p result=&lt;lower.tmp&lt;br /&gt;echo %result%&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Saving this as lower.bat, I run &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;lower "HELLO WORLD"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and get &lt;br /&gt;&lt;br /&gt;hello world&lt;br /&gt;&lt;br /&gt;as a result</description>
      <pubDate>Fri, 05 Aug 2005 06:30:21 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/554</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
    <item>
      <title>Using Unix shell's backquote functionality in DOS/Windows batch files</title>
      <link>http://snippets.dzone.com/posts/show/553</link>
      <description>In BAT files, an equivalent of a Unix shell's&lt;br /&gt;&lt;code&gt;&lt;br /&gt;set foo `bar`&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;can be accomplished as&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;bar&gt;bar.tmp&lt;br /&gt;set /p foo=&lt;bar.tmp&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you're spoiled by Unix's notion of &lt;br /&gt;true pipes, note that the following:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;bar | set /p foo=&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;does not work.</description>
      <pubDate>Fri, 05 Aug 2005 06:23:23 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/553</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
  </channel>
</rss>
