<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6238377795342889441</id><updated>2024-10-27T00:12:02.913+02:00</updated><category term="scala"/><category term="machine learning"/><category term="C#"/><category term="Java"/><category term="OOP"/><category term="decision tree"/><category term="graph"/><category term="monads"/><title type='text'>onof&#39;s blog</title><subtitle type='html'>Journal of a programmer</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://onof80en.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238377795342889441/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://onof80en.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6238377795342889441.post-4488919202267611298</id><published>2011-09-09T21:05:00.001+02:00</published><updated>2011-09-09T21:05:29.604+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="scala"/><title type='text'>scala-recog builds now hosted on scala-tools</title><content type='html'>&lt;div class=&#39;posterous_autopost&#39;&gt;&lt;p&gt;I&#39;m glad to announce that &lt;a href=&quot;http://code.google.com/p/scala-recog/&quot; title=&quot;scala-recog&quot;&gt;scala-recog&lt;/a&gt;&#39;s builds are hosted on &lt;a href=&quot;http://scala-tools.org/&quot; title=&quot;scala-tools&quot;&gt;scala-tools&lt;/a&gt; now!&lt;/p&gt;  &lt;p&gt;More info about how to include the build with SBT on the &lt;a href=&quot;http://code.google.com/p/scala-recog/&quot;&gt;project&#39;s main page&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onof80en.blogspot.com/feeds/4488919202267611298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://onof80en.blogspot.com/2011/09/scala-recog-builds-now-hosted-on-scala.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238377795342889441/posts/default/4488919202267611298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238377795342889441/posts/default/4488919202267611298'/><link rel='alternate' type='text/html' href='http://onof80en.blogspot.com/2011/09/scala-recog-builds-now-hosted-on-scala.html' title='scala-recog builds now hosted on scala-tools'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238377795342889441.post-1402867775852259486</id><published>2011-08-05T22:27:00.002+02:00</published><updated>2011-08-06T13:03:42.144+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="machine learning"/><category scheme="http://www.blogger.com/atom/ns#" term="monads"/><category scheme="http://www.blogger.com/atom/ns#" term="scala"/><title type='text'>Scala-recog: flexibility with logistic regression</title><content type='html'>&lt;div class=&#39;posterous_autopost&#39;&gt;&lt;p&gt;In &lt;a href=&quot;http://code.google.com/p/scala-recog/wiki/LogisticRegressionTraits&quot;&gt;this wiki page&lt;/a&gt; I have put some example on the flexibility you can reach using stackable modification.&lt;/p&gt;  &lt;p&gt;Indeed my effort on logistic regression on scala-recog was to get the more flexibility without getting rid of the optimizations needed by a training algorithm.&lt;/p&gt;  &lt;p&gt;What I would like to reach, anyway, needs an extra effort. I would like a very general library, unaware of the domain.&lt;/p&gt;  &lt;p&gt;For example, I would like to write something like this:&lt;/p&gt;  &lt;div class=&quot;CodeRay&quot;&gt; &lt;div class=&quot;code&quot;&gt;
&lt;pre class=&quot;brush: scala&quot;&gt;
import org.scalarecog.logisticregression.SigmoidClassifier._  
val myStuff = List( 
                Stuff(3, 2.1, &amp;quot;just&amp;quot;), 
                Stuff(2, 1.1, &amp;quot;an&amp;quot;), 
                Stuff(3, 1.2, &amp;quot;example&amp;quot;) 
              )  
val trainingSet = myStuff toTrainingSet ( 
                   _.number, _.number2), _.classLabel 
                  )           
val classifier = trainingSet.train
&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt;   &lt;p&gt;But, I would like also to reach this kind of flexibility, with monads:&lt;/p&gt;  &lt;div class=&quot;CodeRay&quot;&gt; &lt;div class=&quot;code&quot;&gt;
&lt;pre class=&quot;brush: scala&quot;&gt;
val classifier = ( 
    for(stuff &amp;lt;- trainingSet; writer &amp;lt;- stuff.toWriter ) 
  ) train  

(classifier.log) foreach(println(_))
&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt;   &lt;p&gt;Maybe this could be achieved providing a support for monads in training sets, as &lt;a href=&quot;http://blog.tmorris.net/the-writer-monad-using-scala-example/&quot;&gt;in this example of Tony Morris&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onof80en.blogspot.com/feeds/1402867775852259486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://onof80en.blogspot.com/2011/08/untitled.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238377795342889441/posts/default/1402867775852259486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238377795342889441/posts/default/1402867775852259486'/><link rel='alternate' type='text/html' href='http://onof80en.blogspot.com/2011/08/untitled.html' title='Scala-recog: flexibility with logistic regression'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238377795342889441.post-4842349147907944199</id><published>2011-07-23T18:19:00.003+02:00</published><updated>2011-07-29T13:08:25.326+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="decision tree"/><category scheme="http://www.blogger.com/atom/ns#" term="graph"/><category scheme="http://www.blogger.com/atom/ns#" term="machine learning"/><category scheme="http://www.blogger.com/atom/ns#" term="scala"/><title type='text'>Decision trees with scala-recog: a machine learning library in Scala</title><content type='html'>&lt;a href=&quot;http://code.google.com/p/scala-recog/&quot;&gt;scala-recog&lt;/a&gt; is a project I created on Google code, a library of machine learning algorithms written in Scala. A feature is the implementation of ID3 algorithm: it allows to build a decision tree based on a training set of known elements. 

&lt;h2&gt;Example: classifying curricula for a job site&lt;/h2&gt;
In a job site you need to classify curricula to show to the logged users and you can extract a &lt;strong&gt;huge&lt;/strong&gt; quantity of data, but let you extract some of them:
&lt;ul&gt;
&lt;li&gt;if the employee has some certifications&lt;/li&gt;
&lt;li&gt;if the guy is talkative&lt;/li&gt;
&lt;li&gt;(s)he joined a golf club&lt;/li&gt;
&lt;li&gt;(s)he earned a master degree&lt;/li&gt;
&lt;/ul&gt;
and put all in a class:

&lt;pre class=&quot;brush: scala&quot;&gt;
  case class Person(
                val hasCertifications : Boolean,
                val isTalkative : Boolean,
                val golfClub : Boolean,
                val hasMasterDegree : Boolean,
                val job : String
               )

  val persons = Person(hasCertifications = true, isTalkative = false, 
                       golfClub = false, hasMasterDegree = true, 
                       job = &quot;Programmer&quot;) ::
                Person(hasCertifications = false, isTalkative = false, 
                       golfClub = false, hasMasterDegree = true, 
                       job = &quot;Junior Programmer&quot;) ::
                Person(hasCertifications = true, isTalkative = false, 
                       golfClub = false, hasMasterDegree = false, 
                       job = &quot;Programmer&quot;) ::
                Person(hasCertifications = false, isTalkative = true, 
                       golfClub = false, hasMasterDegree = true, 
                       job = &quot;Seller&quot;) ::
                Person(hasCertifications = false, isTalkative = true, 
                       golfClub = false, hasMasterDegree = false, 
                       job = &quot;Seller&quot;) ::
                Person(hasCertifications = true, isTalkative = true, 
                       golfClub = false, hasMasterDegree = false, 
                       job = &quot;Seller&quot;) ::
                Person(hasCertifications = false, isTalkative = true, 
                       golfClub = true, hasMasterDegree = true, 
                       job = &quot;CEO&quot;) ::
                Person(hasCertifications = false, isTalkative = false, 
                       golfClub = true, hasMasterDegree = false, 
                       job = &quot;CEO&quot;) ::
                Person(hasCertifications = false, isTalkative = false, 
                       golfClub = true, hasMasterDegree = false, 
                       job = &quot;CEO&quot;) ::
                Nil
&lt;/pre&gt;
In the list &lt;em&gt;persons&lt;/em&gt; I put my training set. To use the ID3 algorithm, just import the right object and use the list for training:

&lt;pre class=&quot;brush: scala&quot;&gt;
import org.scalarecog.decisiontree._

def toVector(p : Person) = Vector(p.hasCertifications, p.isTalkative, p.golfClub, p.hasMasterDegree)
val dataset = persons map (p =&gt; (toVector(p), p.job))

val tree = new ID3[Boolean,String] buildTree dataset
&lt;/pre&gt;

The reason for &lt;em&gt;toVector&lt;/em&gt; is that the ID3 class needs a &lt;a href=&quot;http://www.scala-lang.org/api/current/scala/collection/immutable/Vector.html&quot;&gt;Vector&lt;/a&gt;.&lt;br/&gt;
Now &lt;em&gt;tree&lt;/em&gt; can classify a person:

&lt;pre class=&quot;brush: scala&quot;&gt;

val newPerson = Person(false, false, false, false, &quot;?&quot;)
assert(
   tree.classify(toVector(newPerson)) == &quot;Junior Programmer&quot;
)

&lt;/pre&gt;

But it would be fine to see the decision tree created by ID3. With &lt;a href=&quot;http://www.jgraph.com/jgraph.html&quot;&gt;JGraph&lt;/a&gt; it&#39;s straightforward, and i get this:

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjURy2RaMy6jiGXRHvjIYjXqHXRpPSMkE8BxMC_HRveGrxEk-PHFhjfaaH0YsUwtb1PIgY9x6JE4XQJgGtYLgGB8L9eKFPP5IW6llFcxvoq9JD4XQ3CtZ6FsRQEy_gt2xGAncRzUo8qlmJG/s1600/scalarecog.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;293&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjURy2RaMy6jiGXRHvjIYjXqHXRpPSMkE8BxMC_HRveGrxEk-PHFhjfaaH0YsUwtb1PIgY9x6JE4XQJgGtYLgGB8L9eKFPP5IW6llFcxvoq9JD4XQ3CtZ6FsRQEy_gt2xGAncRzUo8qlmJG/s400/scalarecog.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

Hey, it&#39;s the real life! ^_^ &lt;br/&gt;
Here is the full code:
&lt;pre class=&quot;brush: scala&quot;&gt;

package scalarecoggraph

import org.scalarecog.decisiontree._
import javax.swing.JFrame
import com.mxgraph.swing.mxGraphComponent
import com.mxgraph.view.mxGraph

class Program(tree : DecisionTree[Vector[Boolean], String], propertyNames : Vector[String]) extends JFrame(&quot;ScalaRecog&quot;) {
  type Tree = DecisionTree[Vector[Boolean], String]
  type Vertex = (AnyRef, (Double, Double))

  draw()

  def draw() {
    val graph: mxGraph = new mxGraph
    val root = graph.getDefaultParent

    def draw(t : Tree, parentPos : (Double, Double), offset : (Int, Int)) : Vertex = {
      def createVertex(label : String, action : Vertex =&gt; Unit = v =&gt; {}) : Vertex = {
        val vertexSize = (100, 30)
        val newPos = (parentPos._1 + offset._1, parentPos._2 + offset._2)
        val created = (graph.insertVertex(root, null, label, newPos._1, newPos._2 , vertexSize._1, vertexSize._2), newPos)
        action(created)
        created
      }
      def createEdge(label : String, from : Vertex, to : Vertex) = graph.insertEdge(root, null, label, from._1, to._1)

      t match {
        case a : DecisionLeaf[Vector[Boolean],String] =&gt; createVertex(a.label)
        case a : DecisionBranchVector[String,Boolean] =&gt;
          createVertex(propertyNames(a.index), n =&gt; {
            for (  ((label, child), index) &lt;- a.branches.zipWithIndex  )
              createEdge(label.toString, n, draw(child, n._2, (120*index, offset._2)))
            })
      }
    }

    graph.getModel.beginUpdate
    try {
      draw(tree, (0, 0), (120, 120))
    }
    finally {
      graph.getModel.endUpdate
    }
    getContentPane.add(new mxGraphComponent(graph))
  }
}

object Program  {

  case class Person(
                val hasCertifications : Boolean,
                val isTalkative : Boolean,
                val golfClub : Boolean,
                val hasMasterDegree : Boolean,
                val job : String
               )

  def main(args : Array[String]) : Unit = {

    val persons = Person(hasCertifications = true, isTalkative = false, golfClub = false, hasMasterDegree = true, job = &quot;Programmer&quot;) ::
                  Person(hasCertifications = false, isTalkative = false, golfClub = false, hasMasterDegree = true, job = &quot;Junior Programmer&quot;) ::
                  Person(hasCertifications = true, isTalkative = false, golfClub = false, hasMasterDegree = false, job = &quot;Programmer&quot;) ::
                  Person(hasCertifications = false, isTalkative = true, golfClub = false, hasMasterDegree = true, job = &quot;Seller&quot;) ::
                  Person(hasCertifications = false, isTalkative = true, golfClub = false, hasMasterDegree = false, job = &quot;Seller&quot;) ::
                  Person(hasCertifications = true, isTalkative = true, golfClub = false, hasMasterDegree = false, job = &quot;Seller&quot;) ::
                  Person(hasCertifications = false, isTalkative = true, golfClub = true, hasMasterDegree = true, job = &quot;CEO&quot;) ::
                  Person(hasCertifications = false, isTalkative = false, golfClub = true, hasMasterDegree = false, job = &quot;CEO&quot;) ::
                  Person(hasCertifications = false, isTalkative = false, golfClub = true, hasMasterDegree = false, job = &quot;CEO&quot;) ::
                  Nil

    def toVector(p : Person) = Vector(p.hasCertifications, p.isTalkative, p.golfClub, p.hasMasterDegree)
    val dataset = persons map (p =&gt; (toVector(p), p.job))

    val tree = new ID3[Boolean,String] buildTree dataset

    val newPerson = Person(false, false, false, false, &quot;?&quot;)
    assert(
      tree.classify(toVector(newPerson)) == &quot;Junior Programmer&quot;
    )

    val frame = new Program(tree, Vector(&quot;Has certifications?&quot;, &quot;Is talkative?&quot;, &quot;Likes playing golf?&quot;, &quot;Has a master degree?&quot;))
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
    frame.setSize(400, 320)
    frame.setVisible(true)
  }
}

&lt;/pre&gt;

Enjoy!</content><link rel='replies' type='application/atom+xml' href='http://onof80en.blogspot.com/feeds/4842349147907944199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://onof80en.blogspot.com/2011/07/decision-trees-with-scala-recog-machine.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238377795342889441/posts/default/4842349147907944199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238377795342889441/posts/default/4842349147907944199'/><link rel='alternate' type='text/html' href='http://onof80en.blogspot.com/2011/07/decision-trees-with-scala-recog-machine.html' title='Decision trees with scala-recog: a machine learning library in Scala'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjURy2RaMy6jiGXRHvjIYjXqHXRpPSMkE8BxMC_HRveGrxEk-PHFhjfaaH0YsUwtb1PIgY9x6JE4XQJgGtYLgGB8L9eKFPP5IW6llFcxvoq9JD4XQ3CtZ6FsRQEy_gt2xGAncRzUo8qlmJG/s72-c/scalarecog.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238377795342889441.post-7720517330190560118</id><published>2011-07-15T13:57:00.001+02:00</published><updated>2011-07-15T14:05:11.212+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="OOP"/><title type='text'>static should be deprecated</title><content type='html'>&lt;p&gt;In a &lt;a href=&quot;http://twitter.com/#!/onof80/statuses/90740628048183296&quot;&gt;tweet I jokingly proposed&lt;/a&gt; to abolish the &lt;q&gt;static&lt;/q&gt; keyword in all (garbage collected) languages. 

At the beginning it was just a joke, but then i wonder:
&lt;blockquote&gt;can I get rid of &lt;em&gt;static?&lt;/em&gt;&lt;/blockquote&gt;

First of all: why get rid of static? Because it&#39;s a source of troubles.

&lt;h2&gt;Factory&lt;/h2&gt;
&lt;p&gt;
We have a class and a harmless static method to build it up:

&lt;pre class=&quot;brush: java&quot;&gt;
public class DumbClass {

  private String foo;
  public String getFoo() { return foo; }
  public void setFoo(String foo) { this.foo = foo; }

  private String initializedStuff;
  public String getInitializedStuff() { return initializedStuff; }

  private DumbClass(String foo, String initializedStuff) {
    this.initializedStuff = initializedStuff;
    this.foo = foo;
  }

  public static DumbClass create(Context c) {
    return new DumbClass( c.doSomethingToGetFoo(), c.doSomethingToGetStuff() );
  }
}

&lt;/pre&gt;

Requirements always change, &lt;a href=&quot;http://prasanthaboutjava.blogspot.com/2008/06/design-patterns-explained-by-alan.html&quot;&gt;Alan Shalloway docet&lt;/a&gt;, so a customer wants &lt;em&gt;foo&lt;/em&gt; in CamelCase rather than UPPERCASE. Case must not change for all other customers, so I would say:

&lt;blockquote&gt;Easy to do: I will create a new library for that customer and put a class extending.. OOps, I can&#39;t! It&#39;s a static method. What if I had an abstract factory, instead?&lt;/blockquote&gt;

&lt;pre class=&quot;brush: java&quot;&gt;

public class DumbClass {

  private String foo;
  public String getFoo() { return foo; }
  public void setFoo(String foo) { this.foo = foo; }

  private String initializedStuff;
  public String getInitializedStuff() { return initializedStuff; }

  DumbClass(String foo, String initializedStuff) {
    this.initializedStuff = initializedStuff;
    this.foo = foo;
  }
}

public interface IDumbClassFactory {
  DumbClass create(Context c);
}

public class DefaultDumbClassFactory {
  public DumbClass create(Context c) {
    return new DumbClass( c.doSomethingToGetFoo(), c.doSomethingToGetStuff() );
  }
}

&lt;/pre&gt;

Then I would make a wrapper of &lt;em&gt;DefaultDumbClassFactory&lt;/em&gt; or I would make another implementation of &lt;em&gt;IDumbClassFactory&lt;/em&gt;: it would work!&lt;br /&gt;
&lt;blockquote&gt;The moral of the story: &lt;strong&gt;don&#39;t use static methods, especially public ones!&lt;/strong&gt;&lt;/blockquote&gt;
&lt;/p&gt;

&lt;h2&gt;Private fields&lt;/h2&gt;
&lt;p&gt;
Sometimes you want keep a counter of instances of a certain class to know how many of them you have in memory. Ok, I would do it with a static field:

&lt;pre class=&quot;brush: java&quot;&gt;
public class Foo {

  private static int howMany;

  public Foo(Something s) {
    howMany++;
  }
  ...
}

&lt;/pre&gt;

After a year you find out that nobody reads that counter anymore and, once deployed your library on a web server running continuously for two years, it could get negative (integer overflow) or cause an exception, unhandled, of course. Or you will need that it doesn&#39;t trace derived class or you will need the counter to be saved in a database and then? You find out that you need an abstract factory.

&lt;blockquote&gt;Now: when I&#39;m going to write &lt;em&gt;static&lt;/em&gt;, &lt;strong&gt;I stop, think it over and finally I nearly alwasy I write: &lt;em&gt;interface&lt;/em&gt;&lt;/strong&gt;&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
&lt;a title=&#39;By Photo: Andreas Praefcke (Self-published work by AndreasPraefcke) [CC-BY-3.0 (www.creativecommons.org/licenses/by/3.0) or GFDL (www.gnu.org/copyleft/fdl.html)], via Wikimedia Commons&#39; href=&#39;http://commons.wikimedia.org/wiki/File:Wolfsburg_VW-Werk.jpg&#39;&gt;&lt;img width=&#39;400&#39; alt=&#39;Wolfsburg VW-Werk&#39; src=&#39;http://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Wolfsburg_VW-Werk.jpg/800px-Wolfsburg_VW-Werk.jpg&#39;/&gt;&lt;/a&gt;
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://onof80en.blogspot.com/feeds/7720517330190560118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://onof80en.blogspot.com/2011/07/static-should-be-deprecated.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238377795342889441/posts/default/7720517330190560118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238377795342889441/posts/default/7720517330190560118'/><link rel='alternate' type='text/html' href='http://onof80en.blogspot.com/2011/07/static-should-be-deprecated.html' title='static should be deprecated'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>