<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0EASHk-fyp7ImA9WhRUGUg.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574</id><updated>2012-01-30T21:40:49.757Z</updated><category term="java web start" /><category term="Micro Credit" /><category term="RendezVous RV" /><category term="Rijndael" /><category term="AES" /><category term="finance" /><category term="html5" /><category term="swing" /><category term="Mystery Trader" /><category term="France" /><category term="time machine" /><category term="misery" /><category term="coding challenge" /><category term="job" /><category term="Chelsea Pier" /><category term="bootcamp" /><category term="etrading" /><category term="Gosling" /><category term="Quants" /><category term="Paris" /><category term="sun" /><category term="Man On Wire" /><category term="Stock Plunge" /><category term="quick time crash" /><category term=".net" /><category term="Parser" /><category term="eclipse" /><category term="x509" /><category term="closures" /><category term="Rugby" /><category term="file transfer" /><category term="ryanair" /><category term="table" /><category term="a380" /><category term="oil" /><category term="java" /><category term="Arc de Triomphe" /><category term="security" /><category term="maths" /><category term="Christmas" /><category term="Golf" /><category term="language" /><category term="memory pie chart" /><category term="Mandarin" /><category term="cobra" /><category term="Java Native Interface" /><category term="Chrome Web Store" /><category term="gui" /><category term="misc" /><category term="US Dollar" /><category term="yanni" /><category term="Brent" /><category term="IT Security" /><category term="android" /><category term="password manager" /><category term="mac" /><category term="europe" /><category term="mondial 2010" /><category term="credit crunch" /><category term="editing" /><category term="Esper" /><category term="jide" /><category term="crisis" /><category term="violin" /><category term="hedge funds" /><category term="crypto" /><category term="ide" /><category term="garbage collectors" /><category term="Babyloan" /><category term="Noel" /><category term="pricing" /><category term="multi-touch" /><category term="cab" /><category term="JOGL" /><category term="Philippe Petit" /><category term="formulas" /><category term="Gateau Polonais aux pommes" /><category term="apple" /><category term="tablet" /><category term="rsa" /><category term="usa" /><category term="Top 14" /><category term="OCaml" /><category term="supergrid" /><category term="New-York" /><category term="graph" /><category term="oogifu" /><category term="beust" /><category term="grid" /><category term="C++" /><category term="JEE 6" /><category term="Scala" /><category term="greek tragedy" /><category term="ibm" /><category term="bank" /><category term="Embarrassingly parallel" /><category term="elections 2007" /><category term="standard deviation" /><category term="Hadoop" /><category term="antlr" /><category term="TSP" /><category term="Google plus" /><category term="Docking" /><category term="football" /><category term="london" /><category term="air france" /><category term="javafx" /><category term="feed burner" /><category term="Gource" /><category term="politics" /><category term="Jobs" /><category term="mac os x" /><category term="music" /><category term="games" /><category term="CEP" /><category term="euro" /><category term="Eiffel Tower" /><category term="root-finding algo" /><category term="netbeans" /><category term="..." /><category term="$" /><category term="C#" /><category term="rcp" /><category term="lending" /><category term="Gui Builder" /><category term="job losses" /><category term="Linux" /><category term="adsense" /><category term="San Francisco" /><category term="cell flashing" /><category term="nexus one" /><category term="java RMI" /><category term="microsoft" /><category term="joke" /><category term="Netbook" /><category term="Ubuntu" /><category term="command line" /><category term="Cake" /><category term="debt" /><category term="frozen columns" /><title>oogifu</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://oogifu.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>215</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Oogifu" /><feedburner:info uri="oogifu" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0EASHk9fyp7ImA9WhRUGUg.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-2922959823644165558</id><published>2012-01-30T21:40:00.003Z</published><updated>2012-01-30T21:40:49.767Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-30T21:40:49.767Z</app:edited><title>CLASSEMENT DE LA LIBERTÉ DE LA PRESSE 2011/2012</title><content type="html">Hmm...
&lt;a href="http://fr.rsf.org/press-freedom-index-2011-2012,1043.html"&gt;CLASSEMENT DE LA LIBERTÉ DE LA PRESSE 2011/2012&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-2922959823644165558?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iYWfNqK4lGP4yVrQXoNNxDycX5k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iYWfNqK4lGP4yVrQXoNNxDycX5k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iYWfNqK4lGP4yVrQXoNNxDycX5k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iYWfNqK4lGP4yVrQXoNNxDycX5k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/SGA5xr1cfOk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/2922959823644165558/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=2922959823644165558" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/2922959823644165558?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/2922959823644165558?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/SGA5xr1cfOk/classement-de-la-liberte-de-la-presse.html" title="CLASSEMENT DE LA LIBERTÉ DE LA PRESSE 2011/2012" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2012/01/classement-de-la-liberte-de-la-presse.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UHQnY8eip7ImA9WhRVGUU.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-8134903404245384288</id><published>2012-01-19T16:07:00.000Z</published><updated>2012-01-19T16:07:13.872Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-19T16:07:13.872Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><category scheme="http://www.blogger.com/atom/ns#" term="javafx" /><title>Scala, JavaFX, TableColumns</title><content type="html">In my &lt;a href="http://oogifu.blogspot.com/2012/01/memory-pie-chart-in-tableview-with.html"&gt;previous post&lt;/a&gt; we created a bunch of columns using the following code:

&lt;pre&gt;
val maxMemColumn = new TableColumn[MyTableRow, Long]("Max")
maxMemColumn.setCellValueFactory(new PropertyValueFactory[MyTableRow, Long]("maxMem"))
&lt;/pre&gt;

It would be nice to abstract this call, create a template for it.
Looking at the &lt;a href="http://docs.oracle.com/javafx/2.0/api/javafx/scene/control/TableColumn.html"&gt;TableColumn API&lt;/a&gt;, 
another way to bind a cell to an object value is to use setCellValueFactory on the TableColumn:

&lt;pre&gt;
firstNameCol.setCellValueFactory(new Callback&lt;CellDataFeatures&lt;Person, String&gt;, ObservableValue&lt;String&gt;&gt;() {
  public ObservableValue&lt;String&gt; call(CellDataFeatures&lt;Person, String&gt; p) {
    // p.getValue() returns the Person instance for a particular TableView row
	return p.getValue().firstNameProperty();
  }
});
&lt;/pre&gt;

Note that firstNameProperty is of type ObservableValue.
We can therefore remove all the other properties from MyTableRow and just leave the ones which are of type ObservableValue...
We are then left with:

&lt;pre&gt;
sealed class MyTableRow2 {
  val totMem = new SimpleLongProperty(0L)
  val maxMem = new SimpleLongProperty(0L)
  val freeMem = new SimpleLongProperty(0L)
  val usedMem = new SimpleLongProperty(0L)
}
&lt;/pre&gt;

Now, let's try to write a generic create column Scala function (newCol_2 below):

&lt;pre&gt;
private def newCol_2[R, V](displayName: String, get: (R) =&gt; ObservableValue[V]): TableColumn[R, V] = {
  val column = new TableColumn[R, V](displayName)
  column.setCellValueFactory(new Callback[CellDataFeatures[R, V], ObservableValue[V]] {
    override def call(p: CellDataFeatures[R, V]) : ObservableValue[V] = get(p.getValue())
  })
  column
}
&lt;/pre&gt;

the columns are now initialised like this:

&lt;pre&gt;
val maxMemColumn = newCol_2("Max", {r:MyTableRow2 =&gt; r.maxMem})
val totalMemColumn = newCol_2("Tot", {r:MyTableRow2 =&gt; r.totMem})
val freeMemColumn = newCol_2("Free", {r:MyTableRow2 =&gt; r.freeMem})
val usedMemColumn = newCol_2("Used", {r:MyTableRow2 =&gt; r.usedMem})
&lt;/pre&gt;  
  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-8134903404245384288?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PmRILBEMkfTZUNnn_YIXIX37CCI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PmRILBEMkfTZUNnn_YIXIX37CCI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PmRILBEMkfTZUNnn_YIXIX37CCI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PmRILBEMkfTZUNnn_YIXIX37CCI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/4bY_63ok3eI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/8134903404245384288/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=8134903404245384288" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/8134903404245384288?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/8134903404245384288?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/4bY_63ok3eI/scala-javafx-tablecolumns.html" title="Scala, JavaFX, TableColumns" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2012/01/scala-javafx-tablecolumns.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AEQ304cSp7ImA9WhRVFUo.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-4413323090787808384</id><published>2012-01-14T20:08:00.000Z</published><updated>2012-01-14T20:08:22.339Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T20:08:22.339Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><category scheme="http://www.blogger.com/atom/ns#" term="memory pie chart" /><category scheme="http://www.blogger.com/atom/ns#" term="javafx" /><title>Memory Pie Chart in TableView with Scala and JavaFX</title><content type="html">In my series (Scala, JavaFX 2) - another code snippet to display a memory pie chart in a tableview with a custom renderer.
Below is the code to achieve this:
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-mUwOR5yuayg/TxHfN11JGmI/AAAAAAAABO0/PtNBh5MvgBU/s1600/MemTable.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="140" width="320" src="http://4.bp.blogspot.com/-mUwOR5yuayg/TxHfN11JGmI/AAAAAAAABO0/PtNBh5MvgBU/s320/MemTable.png" /&gt;&lt;/a&gt;&lt;/div&gt;

The imports in used:

&lt;pre&gt;
import javafx.application.Application
import javafx.beans.property.SimpleLongProperty
import javafx.beans.property.SimpleObjectProperty
import javafx.scene.control.cell.PropertyValueFactory
import javafx.scene.control.TableColumn
import javafx.scene.control.TableView
import javafx.scene.layout.BorderPane
import javafx.scene.paint.Color
import javafx.scene.Scene
import javafx.stage.Stage
import javafx.util.Callback
import javafx.scene.control.TableCell
&lt;/pre&gt;

Then the class representing one line in the table (Note the use of a tuple2 what will later be used for the chart - not really needed as the row can be accessed in the custom renderer - but other posts will follow...):

&lt;pre&gt;
sealed class MyTableRow {
  val totMem = new SimpleLongProperty(0L)
  def totMemProperty = totMem
  def getTotMem : Long = totMem.get
  def setTotMem(value: Long) = totMem.set(value)
  
  val maxMem = new SimpleLongProperty(0L)
  def maxMemProperty = maxMem
  def getMaxMem : Long = maxMem.get
  def setMaxMem(value: Long) = maxMem.set(value)
  
  val freeMem = new SimpleLongProperty(0L)
  def freeMemProperty = freeMem
  def getFreeMem : Long = freeMem.get
  def setFreeMem(value: Long) = freeMem.set(value)
  
  val usedMem = new SimpleLongProperty(0L)
  def usedMemProperty = usedMem
  def getUsedMem : Long = usedMem.get
  def setUsedMem(value: Long) = usedMem.set(value)
  
  val chartData = new SimpleObjectProperty((0L, 0L))
  def chartDataProperty = chartData
  def getChartData : Tuple2[Long, Long] = chartData.get
  def setChartData(value: Tuple2[Long, Long]) = chartData.set(value)
}
&lt;/pre&gt;

Then the main application:

&lt;pre&gt;
sealed class MemTable extends Application {
  def runInJFXThread(f: () =&gt; Unit) = javafx.application.Platform.runLater(new Runnable() {def run() {f()}})
  
  val timer = new java.util.Timer
  val table = new TableView[MyTableRow]
  val tableData = javafx.collections.FXCollections.observableArrayList[MyTableRow]()
  table.setItems(tableData)
  
  val singleRow = new MyTableRow
  tableData.addAll(singleRow)
  
  override def start(stage: Stage) = {
    val borderPane = new BorderPane
    val scene = new Scene(borderPane, 400, 300, Color.WHITE)
    borderPane.setCenter(table)
    setupUI
    stage.setTitle("Memory Table")
    stage.setScene(scene)
    stage.show
    timer.schedule(new HeapSnapshotTask, 0L, 1000L)
  }
  
  sealed class HeapSnapshotTask extends java.util.TimerTask {
    val inKb = 1024L
    override def run = {
      val r = Runtime.getRuntime
      val totalMemory = r.totalMemory / inKb
      val freeMemory = r.freeMemory / inKb
      val maxMemory = r.maxMemory / inKb
      val usedMemory = totalMemory - freeMemory
      
      runInJFXThread{() =&gt; {
        singleRow.totMem.set(totalMemory)
        singleRow.maxMem.set(maxMemory)
        singleRow.freeMem.set(freeMemory)
        singleRow.usedMem.set(usedMemory)
        singleRow.chartData.set((freeMemory, usedMemory))
      }}
      
      println("T = " + totalMemory + ", F = " + freeMemory + ", M = " + maxMemory + ", U = " + usedMemory)
    }
  }
  
  private def setupUI = {
    val memColumns = new TableColumn[MyTableRow, AnyRef]("Memory")
    
    val maxMemColumn = new TableColumn[MyTableRow, Long]("Max")
    maxMemColumn.setCellValueFactory(new PropertyValueFactory[MyTableRow, Long]("maxMem"))
    val totalMemColumn = new TableColumn[MyTableRow, Long]("Total")
    totalMemColumn.setCellValueFactory(new PropertyValueFactory[MyTableRow, Long]("totMem"))
    val freeMemColumn = new TableColumn[MyTableRow, Long]("Free")
    freeMemColumn.setCellValueFactory(new PropertyValueFactory[MyTableRow, Long]("freeMem"))
    val usedMemColumn = new TableColumn[MyTableRow, Long]("Used")
    usedMemColumn.setCellValueFactory(new PropertyValueFactory[MyTableRow, Long]("usedMem"))
    val chartColumn = new TableColumn[MyTableRow, AnyRef]("Chart")
    chartColumn.setCellValueFactory(new PropertyValueFactory[MyTableRow, AnyRef]("chartData"))
&lt;b&gt;
    val chartRenderer = new Callback[TableColumn[MyTableRow, AnyRef], TableCell[MyTableRow, AnyRef]] {
      override def call(col : TableColumn[MyTableRow, AnyRef]) : TableCell[MyTableRow, AnyRef] = {
        new TableCell[MyTableRow, AnyRef] {
          import javafx.scene.chart.PieChart
          import javafx.collections.FXCollections
          import javafx.scene.layout.Pane
          import javafx.scene.control.Label
   
          val usedMemData = new PieChart.Data("Used", 0.0)
          val freeMemData = new PieChart.Data("Free", 0.0)
          val pieChartData = FXCollections.observableArrayList(usedMemData, freeMemData)
          val pieChart = new PieChart(pieChartData)
          pieChart.setPrefSize(150, 150)
          pieChart.setLabelsVisible(true)
          pieChart.setLegendVisible(false)
          val borderPane = new BorderPane
          val southPane = new Pane
          setGraphic(borderPane)
          borderPane.setCenter(pieChart)
          borderPane.setBottom(southPane)
          val southLabel = new Label
          southPane.getChildren().addAll(southLabel)
          override def updateItem(value : AnyRef, empty : Boolean) = {
            val row = getTableRow
            if (row != null &amp;&amp; value != null) {
              val datum = value.asInstanceOf[Tuple2[Long, Long]]
              val free = datum._1
              val used = datum._2
              usedMemData.setPieValue(used)
              freeMemData.setPieValue(free)
              val desc = "F="+free+" U="+used
              southLabel.setText(desc)
            } // if
          } // updateItem
        }
      }
    } // chartRenderer
&lt;/b&gt;
    chartColumn.setCellFactory(chartRenderer)
    
    memColumns.getColumns().addAll(maxMemColumn, totalMemColumn, freeMemColumn, usedMemColumn)
    
    table.getColumns().addAll(memColumns, chartColumn)
  }
}

object MemTable {
  def main(args: Array[String]): Unit = {
    javafx.application.Application.launch(classOf[MemTable])
  }
}
&lt;/pre&gt;

That's it for now&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-4413323090787808384?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KlTan31Yw3w-4H1DzNpoQ7KOvuY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KlTan31Yw3w-4H1DzNpoQ7KOvuY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KlTan31Yw3w-4H1DzNpoQ7KOvuY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KlTan31Yw3w-4H1DzNpoQ7KOvuY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/Qsvy88uN1Cw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/4413323090787808384/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=4413323090787808384" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/4413323090787808384?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/4413323090787808384?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/Qsvy88uN1Cw/memory-pie-chart-in-tableview-with.html" title="Memory Pie Chart in TableView with Scala and JavaFX" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-mUwOR5yuayg/TxHfN11JGmI/AAAAAAAABO0/PtNBh5MvgBU/s72-c/MemTable.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2012/01/memory-pie-chart-in-tableview-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAGSHo5cSp7ImA9WhRVFU4.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-4362341024382772973</id><published>2012-01-13T17:59:00.001Z</published><updated>2012-01-14T09:52:09.429Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T09:52:09.429Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><title>Callback a la scala</title><content type="html">The first (and not only) un-natural element when moving from Java to Scala is that callback via interfaces and anonymous classes are not needed anymore.
Let's walk through a simple example, using the Spring-like SQL template

First in Java:

&lt;pre&gt;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.sql.DataSource;

interface ICallbackHandler {
  void process(ResultSet rs);
}

final class JSqlTemplate {
  DataSource ds = null;
 
  public void query(final String sql, final ICallbackHandler cb) throws Exception {
    final Connection conn = ds.getConnection();
    final Statement stmt = conn.createStatement();
    final ResultSet rs = stmt.executeQuery(sql);
    while(rs.next()) cb.process(rs);
      rs.close();
      stmt.close();
      conn.close();
    }
}

public class DBCallbackTest {
  public static void main(String[] args) throws Exception {
    new JSqlTemplate().query("select * from whatever", new ICallbackHandler() {
      public void process(ResultSet rs) {
        // get stuff here
      }
    });
  }
}
&lt;/pre&gt;

In Scala, there is no need to define a ICallbackHandler .. you can just go for:

&lt;pre&gt;
import javax.sql.DataSource
import java.sql.ResultSet

sealed class SSqlTemplate(dataSource: DataSource)  {
  def query(sql: String, rowHandler: (ResultSet) =&gt; Unit) = {
    val conn = dataSource.getConnection
    val stmt = conn.createStatement
    val rs = stmt.executeQuery(sql)
    while (rs.next) rowHandler(rs)
    rs.close
    stmt.close
    conn.close
  }
}

object SDbCallback {
  def main(args: Array[String]): Unit = {
    val ds:DataSource = null
    new SSqlTemplate(ds).query("select * from whatever",
        {(rs: ResultSet) =&gt;
          // get stuff here
       })
  }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-4362341024382772973?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n_iNYNB1BDHh4jI6CvHdd37f9aY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n_iNYNB1BDHh4jI6CvHdd37f9aY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n_iNYNB1BDHh4jI6CvHdd37f9aY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n_iNYNB1BDHh4jI6CvHdd37f9aY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/liWX5G5svX8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/4362341024382772973/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=4362341024382772973" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/4362341024382772973?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/4362341024382772973?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/liWX5G5svX8/callback-la-scala.html" title="Callback a la scala" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2012/01/callback-la-scala.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAASXk-cSp7ImA9WhRVFU4.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-2006439002207043480</id><published>2012-01-13T15:41:00.000Z</published><updated>2012-01-14T09:52:28.759Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T09:52:28.759Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><title>In response to 'Generating every combination without duplicates'</title><content type="html">Peter, a friend of mine, posted this : &lt;a href="http://vanillajava.blogspot.com/2012/01/generating-every-combination-without.html"&gt;Java riddle&lt;/a&gt;...

Here is my scala solution using &lt;a href="http://code.google.com/p/scalaz/"&gt;Scalaz&lt;/a&gt;:

&lt;pre&gt;
import scalaz._
import Scalaz._

object Combi1 {
  def combine[A](xs: List[A]): List[List[A]] = xs.replicate[List](xs.size).sequence
  
  def main(args: Array[String]): Unit = {
    val list = List(1, 1, 2, 3, 3, 3)
    def isCorrect(list: List[Int]) : Boolean = {
      list.count(i =&gt; i == 1) == 2 &amp;&amp;
      list.count(i =&gt; i == 2) == 1 &amp;&amp;
      list.count(i =&gt; i == 3) == 3
    }
    val combi = combine(list).filter(l =&gt; isCorrect(l)).distinct
    println(combi.size + " elements")
    combi.foreach(l =&gt; println(l))
  } 
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-2006439002207043480?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XE2tJBAvazdYikj0xtmFdwdzDvU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XE2tJBAvazdYikj0xtmFdwdzDvU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XE2tJBAvazdYikj0xtmFdwdzDvU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XE2tJBAvazdYikj0xtmFdwdzDvU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/9htSc1lWz8U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/2006439002207043480/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=2006439002207043480" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/2006439002207043480?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/2006439002207043480?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/9htSc1lWz8U/in-response-to-generating-every.html" title="In response to 'Generating every combination without duplicates'" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2012/01/in-response-to-generating-every.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IASHszeCp7ImA9WhRVEk8.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-8252210698303448394</id><published>2012-01-10T19:59:00.000Z</published><updated>2012-01-10T19:59:09.580Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T19:59:09.580Z</app:edited><title>Memory Pie Chart (Scala, JavaFX2)</title><content type="html">Another simple code snippet using Scala and JavaFX2: A memory visualiser..

&lt;pre&gt;
package org.mychart

import javafx.application.Application

import javafx.scene.control.Label
import javafx.scene.Scene
import javafx.scene.paint.Color
import javafx.scene.layout.BorderPane
import javafx.stage.Stage
import javafx.scene.chart.PieChart
import javafx.collections.FXCollections
import javafx.scene.layout.Pane

sealed class RealtimeMemory extends Application {
  val timer = new java.util.Timer
  val usedMemData = new PieChart.Data("Used", 0.0)
  val freeMemData = new PieChart.Data("Free", 0.0)
//  val totalMemData = new PieChart.Data("Total", 0.0)
  val pieChartData = FXCollections.observableArrayList(usedMemData, freeMemData)
  val chart = new PieChart(pieChartData)
  val southPane = new Pane
  val southLabel = new Label
  
  override def start(stage: Stage) = {
    val borderPane = new BorderPane
    val scene = new Scene(borderPane, 800, 600, Color.BEIGE)
    stage.setTitle("JFX Xiphias Pricing Client")
    stage.setScene(scene)
    chart.setLabelsVisible(true)
    chart.setLegendVisible(false)
    borderPane.setCenter(chart)
    borderPane.setBottom(southPane)
    
    southPane.getChildren.addAll(southLabel)
    
    stage.show
    
    timer.schedule(new HeapSnapshotTask, 0L, 1000L)
  }
  
  def runInJFXThread(f: () =&gt; Unit) = 
    javafx.application.Platform.runLater( new Runnable() { def run() {f()} } )
  
  sealed class HeapSnapshotTask extends java.util.TimerTask {
    override def run = {
      val r = Runtime.getRuntime
      val totalMemory = r.totalMemory / 1024 / 1024 
      val freeMemory = r.freeMemory / 1024 / 1024
      val maxMemory = r.maxMemory / 1024 / 1024
      val usedMemory = totalMemory - freeMemory
      
      usedMemData.setPieValue(usedMemory)
      freeMemData.setPieValue(freeMemory)
//      totalMemData.setPieValue(totalMemory)
      
      runInJFXThread(()=&gt;southLabel.setText(
          "Max: " +maxMemory+", Used:"+usedMemory+
          ", Free:"+freeMemory+", Total:"+totalMemory))
    }
  }
}

object RealtimeMemory {  
  def main(args: Array[String]): Unit = {
    javafx.application.Application.launch(classOf[RealtimeMemory])
  }
}


&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-8252210698303448394?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jE0-j-S3MCp9fy_t28XmBmbVMVA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jE0-j-S3MCp9fy_t28XmBmbVMVA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jE0-j-S3MCp9fy_t28XmBmbVMVA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jE0-j-S3MCp9fy_t28XmBmbVMVA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/OJ5jlVVpLiQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/8252210698303448394/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=8252210698303448394" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/8252210698303448394?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/8252210698303448394?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/OJ5jlVVpLiQ/memory-pie-chart-scala-javafx2.html" title="Memory Pie Chart (Scala, JavaFX2)" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2012/01/memory-pie-chart-scala-javafx2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcAQ3Y4fip7ImA9WhRWGUg.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-6408367176755676436</id><published>2012-01-07T15:27:00.000Z</published><updated>2012-01-07T15:27:22.836Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-07T15:27:22.836Z</app:edited><title>Small crypto code for Android</title><content type="html">I'd like to share a simple class that I wrote a while ago as a cryptographic utility for Android.
It uses the &lt;a href="http://www.bouncycastle.org/"&gt;Bouncy Castle&lt;/a&gt; crypto lib for JDK 6 and the Apache Base 64 encoder.

&lt;pre&gt;&lt;font size=3&gt;
package org.oogifu.crypto;

import org.apache.base64.Base64;
import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.BufferedBlockCipher;
import org.bouncycastle.crypto.engines.AESFastEngine;
import org.bouncycastle.crypto.paddings.PKCS7Padding;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.Arrays;

public final class BCEncryptionUtils {
  private static final BCEncryptionUtils instance = new BCEncryptionUtils();
 
  private transient byte rawKey[] = null;
 
  private BCEncryptionUtils() {
  }
 
  public static BCEncryptionUtils getInstance() {
    return instance;
  }
 
  public String getCipherInfo() {
    return "AES-256 provided By Bouncy Castle";
  }

  public String getFormat() {
    return "256";
  }
 
  public void setMasterPassword(String password) throws Exception {
    final byte[] masterPassword = new byte[32];
    Arrays.fill(masterPassword, (byte)0);
     
    if (password.length() &gt; 32) password = password.substring(0, 32);
       
    final byte[] source = password.getBytes();
       
    System.arraycopy(source, 0, masterPassword, 0, source.length);
       
    rawKey = masterPassword;
  }

  public String decryptFromBase64(final String edata64) throws Exception {
    final byte[] edb = Base64.decodeBase64(edata64);
    final byte[] data = decode(edb);
    return new String(data).trim();
  }

  public String encryptToBase64(final String data) throws Exception {
    final byte[] newData = data.getBytes("UTF-8");
    return Base64.encodeBase64String(encode(newData));
  }
 
  private byte[] encode(final byte[] inputBytes) throws Exception {
    final BufferedBlockCipher cipher = getCipher(true);
    final byte[] outputBytes = new byte[cipher.getOutputSize(inputBytes.length)];
  
    int outputLen = cipher.processBytes(inputBytes, 0, inputBytes.length, outputBytes, 0);
    outputLen += cipher.doFinal(outputBytes, outputLen);
     
    return outputBytes;
  }
 
  private byte[] decode(final byte[] inputBytes) throws Exception {
    final BufferedBlockCipher cipher = getCipher(false);
  
    final byte[] outputBytes = new byte[cipher.getOutputSize(inputBytes.length)];
   
    int outputLen = cipher.processBytes(inputBytes, 0, inputBytes.length, outputBytes, 0);
    outputLen += cipher.doFinal(outputBytes, outputLen);
     
    return outputBytes;
  }
 
  private BufferedBlockCipher getCipher(final boolean forEncryption) {
    final BlockCipher aesEngine = new AESFastEngine();
    final BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(aesEngine, new PKCS7Padding());
    cipher.init(forEncryption, new KeyParameter(rawKey));
    return cipher;
  }
}

&lt;/font&gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-6408367176755676436?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9MBV9HRgniCQrVk0qGhFc4fQtyE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9MBV9HRgniCQrVk0qGhFc4fQtyE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9MBV9HRgniCQrVk0qGhFc4fQtyE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9MBV9HRgniCQrVk0qGhFc4fQtyE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/IOJf42dDvB0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/6408367176755676436/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=6408367176755676436" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/6408367176755676436?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/6408367176755676436?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/IOJf42dDvB0/small-crypto-code-for-android.html" title="Small crypto code for Android" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2012/01/small-crypto-code-for-android.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcHRn0-eCp7ImA9WhRRE0g.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-4957047905288272738</id><published>2011-11-27T00:24:00.001Z</published><updated>2011-11-27T01:07:17.350Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-27T01:07:17.350Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><title>Scala Lazy Types</title><content type="html">I have been working on a pricing engine [PE] (a piece of software that calculates bond prices using different models) for the last year, written in Java 6.
A PE is essentially a DAG (Directed Acyclic Graph), and there are many ways to implement the relationships between the pricing nodes: remote nodes if you fancy distributed processes, matrix for the parent-child edges, or a pure OO approach where a pricing node has a direct reference to its parents.
An example of such a naive implementation would look like this:

&lt;pre&gt;
public abstract class AbsNode {
  protected List&lt;absnode&gt; parents = new LinkedList&amp;lt;&amp;gt;();
  protected double price, yield;
  public abstract void calculate();
}

class FutureNode extends AbsNode {
  @Override public void calculate() {
  }
}

class GrossBasisNode extends AbsNode {
  @Override public void calculate() {
    price = parents.get(0).price * 0.98 + 1.0;
  }
}

class BenNode extends AbsNode {
  @Override public void calculate() {
    yield = parents.get(0).yield * 3.14;
  }
}
&lt;/pre&gt;

This obviously is only there to demonstrate the following issues: (1) The code cannot guaranty that the child of a future node must only be a ben node, or that the child of a ben node can only be a ben node, (2) that price and yield should only exist for bonds, and price only for futures (3) you can do pre-check at runtime using &lt;i&gt;instanceof&lt;/i&gt; but it is not very nice, (4) there are potential class cast exceptions, (5) there is no compile-time check.

Learning Scala, I was wondering if the very much debated type system could come to the rescue.
I came up with:

&lt;pre&gt;
trait MyNode {
  type parentType
  var parents:List[parentType] = List()
  var calcPrice = Double.NaN
  def addParent(parent: parentType) = parents = parent :: parents
}
trait MyBond extends MyNode {
  var calcYield = Double.NaN
}
trait MyFuture extends MyNode
sealed class GenFuture extends MyFuture
sealed class GenBenBond extends MyBond {
  type parentType = MyBond
}
sealed class GenGbnBond extends MyBond {
  type parentType = MyFuture
}
&lt;/pre&gt;

Notice the override of the type &lt;i&gt;parentType&lt;/i&gt;: in &lt;i&gt;GenBenBond&lt;/i&gt; I enforce the type to be a bond, whereas for the &lt;i&gt;GenGbnBond&lt;/i&gt; bond I enforce the type to be &lt;i&gt;MyFuture&lt;/i&gt;.
This s quite neat.

It allows me to write this:

&lt;pre&gt;
val fut = new GenFuture
val gbn = new GenGbnBond
val ben = new GenBenBond
gbn.addParent(fut)
ben.addParent(gbn)
&lt;/pre&gt;

but this
&lt;pre&gt;
ben.addParent(fut)
&lt;/pre&gt;

does not compile... exactly what I want.

The following amended code shows another good side-effect, the &lt;i&gt;parent&lt;/i&gt; in &lt;i&gt;calculate&lt;/i&gt; are of the right type:

&lt;pre&gt;
trait MyNode {
  type parentType
  var parents:List[parentType] = List()
  var calcPrice = Double.NaN
  def addParent(parent: parentType) = parents = parent :: parents
  def calculate = {}
}
trait MyBond extends MyNode {
  var calcYield = Double.NaN
}
trait MyFuture extends MyNode
sealed class GenFuture extends MyFuture
sealed class GenBenBond extends MyBond {
  type parentType = MyBond
  override def calculate = {
    val bond = parents(0)
    bond.calcYield
    bond.calcPrice
  }
}
sealed class GenGbnBond extends MyBond {
  type parentType = MyFuture
  override def calculate = {
    val fut = parents(0)
    // only calcPrice available
    fut.calcPrice 
  }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-4957047905288272738?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YzUd0QeFk4aNljv-TZVSzvJXBuA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YzUd0QeFk4aNljv-TZVSzvJXBuA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YzUd0QeFk4aNljv-TZVSzvJXBuA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YzUd0QeFk4aNljv-TZVSzvJXBuA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/WU6jTn8xKHg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/4957047905288272738/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=4957047905288272738" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/4957047905288272738?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/4957047905288272738?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/WU6jTn8xKHg/scala-lazy-types.html" title="Scala Lazy Types" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2011/11/scala-lazy-types.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8NRH48eSp7ImA9WhdXFUw.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-5421088770337924242</id><published>2011-08-28T08:07:00.001Z</published><updated>2011-08-28T08:08:15.071Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-28T08:08:15.071Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google plus" /><title>Plus</title><content type="html">&lt;a href="https://plus.google.com/"&gt;Google plus!&lt;/a&gt; is very good. 
&lt;br /&gt;Give it a try.
&lt;br /&gt;I am not a Facebook user, so I cannot compare, but Plus' simple interface suits me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-5421088770337924242?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WcCr92g9z6SmqRRj-bv1MlZwe5U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WcCr92g9z6SmqRRj-bv1MlZwe5U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WcCr92g9z6SmqRRj-bv1MlZwe5U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WcCr92g9z6SmqRRj-bv1MlZwe5U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/oSAmx4TqvsA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/5421088770337924242/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=5421088770337924242" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/5421088770337924242?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/5421088770337924242?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/oSAmx4TqvsA/plus.html" title="Plus" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2011/08/plus.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIFSXg9fip7ImA9WhdQGUk.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-4210361691236528851</id><published>2011-08-21T17:23:00.001Z</published><updated>2011-08-21T17:25:18.666Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-21T17:25:18.666Z</app:edited><title>01190 &amp; Patates</title><content type="html">Me voila sous 36 degres a &lt;a href="http://en.wikipedia.org/wiki/Arbigny"&gt;Arbigny&lt;/a&gt;.. petit village de l'Ain ou il fait bon vivre... a l'aube d'une crise financiere mondiale, je reprends des forces et je fais pousser des patates...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-4210361691236528851?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fXuKC9g4d_M6sA-dBAj5jPg---k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fXuKC9g4d_M6sA-dBAj5jPg---k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fXuKC9g4d_M6sA-dBAj5jPg---k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fXuKC9g4d_M6sA-dBAj5jPg---k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/PTSsivynz54" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/4210361691236528851/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=4210361691236528851" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/4210361691236528851?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/4210361691236528851?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/PTSsivynz54/01190-patates.html" title="01190 &amp; Patates" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2011/08/01190-patates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cHSHc9eCp7ImA9WhZVF0s.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-5307228891504940455</id><published>2011-05-30T13:09:00.002Z</published><updated>2011-05-30T13:10:39.960Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-30T13:10:39.960Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="air france" /><category scheme="http://www.blogger.com/atom/ns#" term="a380" /><title>A380 - Air France</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-LzbGlD7SX1k/TeOXO78mtpI/AAAAAAAAAYQ/Mzbw98f21R4/s1600/A380-AF2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://3.bp.blogspot.com/-LzbGlD7SX1k/TeOXO78mtpI/AAAAAAAAAYQ/Mzbw98f21R4/s320/A380-AF2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5612495843499619986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-NDlijX5qpOs/TeOXOj9IT9I/AAAAAAAAAYI/S5vHPMksuqQ/s1600/A380-AF1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://4.bp.blogspot.com/-NDlijX5qpOs/TeOXOj9IT9I/AAAAAAAAAYI/S5vHPMksuqQ/s320/A380-AF1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5612495837059370962" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-5307228891504940455?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-NLFXdHXZoZqNmsF2XuRFTmmaX8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-NLFXdHXZoZqNmsF2XuRFTmmaX8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-NLFXdHXZoZqNmsF2XuRFTmmaX8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-NLFXdHXZoZqNmsF2XuRFTmmaX8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/pytMD-d8j34" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/5307228891504940455/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=5307228891504940455" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/5307228891504940455?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/5307228891504940455?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/pytMD-d8j34/a380-air-france.html" title="A380 - Air France" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-LzbGlD7SX1k/TeOXO78mtpI/AAAAAAAAAYQ/Mzbw98f21R4/s72-c/A380-AF2.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2011/05/a380-air-france.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIFQXw7fyp7ImA9WhZTFUk.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-3506516828625034396</id><published>2011-03-19T13:14:00.000Z</published><updated>2011-03-19T13:15:10.207Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-19T13:15:10.207Z</app:edited><title>Intelligence and Rational Thinking</title><content type="html">As Daniel Kahneman at Princeton University puts it, intelligence is about brain power whereas rational thinking is about control.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-3506516828625034396?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-Vyl6tFtXuXlRg3R8BNKbUtZRQU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-Vyl6tFtXuXlRg3R8BNKbUtZRQU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-Vyl6tFtXuXlRg3R8BNKbUtZRQU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-Vyl6tFtXuXlRg3R8BNKbUtZRQU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/4Cf0A4fqBWk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/3506516828625034396/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=3506516828625034396" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/3506516828625034396?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/3506516828625034396?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/4Cf0A4fqBWk/intelligence-and-rational-thinking.html" title="Intelligence and Rational Thinking" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2011/03/intelligence-and-rational-thinking.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQDSXs9eip7ImA9Wx9VEkk.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-3467914958218309944</id><published>2011-01-28T19:51:00.001Z</published><updated>2011-01-28T19:52:58.562Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-28T19:52:58.562Z</app:edited><title>French Quote Of The Day</title><content type="html">C'est parce que la vitesse de la lumiere est superieure a celle du son, que certains ont l'air brillant avant d'avoir l'air con!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-3467914958218309944?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tRz9PUnajbRZelj6LdKeeJLcYN0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tRz9PUnajbRZelj6LdKeeJLcYN0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tRz9PUnajbRZelj6LdKeeJLcYN0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tRz9PUnajbRZelj6LdKeeJLcYN0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/G9WOGdpCvvA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/3467914958218309944/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=3467914958218309944" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/3467914958218309944?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/3467914958218309944?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/G9WOGdpCvvA/french-quote-of-day.html" title="French Quote Of The Day" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2011/01/french-quote-of-day.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8MQXg-eSp7ImA9Wx9WE00.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-7897092487842468845</id><published>2011-01-17T22:37:00.000Z</published><updated>2011-01-17T22:38:00.651Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-17T22:38:00.651Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scala" /><title>Scala wins EU grant!</title><content type="html">&lt;a href="http://www.scala-lang.org/node/8579"&gt;Read this&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-7897092487842468845?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8wQ7t_4-VT1kcrZEnzMFR7353sE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8wQ7t_4-VT1kcrZEnzMFR7353sE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8wQ7t_4-VT1kcrZEnzMFR7353sE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8wQ7t_4-VT1kcrZEnzMFR7353sE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/BeILjyUBepM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/7897092487842468845/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=7897092487842468845" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/7897092487842468845?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/7897092487842468845?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/BeILjyUBepM/scala-wins-eu-grant.html" title="Scala wins EU grant!" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2011/01/scala-wins-eu-grant.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MCQHc8fCp7ImA9Wx9QFEk.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-5083833424857581557</id><published>2010-12-27T11:30:00.000Z</published><updated>2010-12-27T11:31:01.974Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-27T11:31:01.974Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Micro Credit" /><category scheme="http://www.blogger.com/atom/ns#" term="Babyloan" /><title>Micro Credit</title><content type="html">Avec &lt;a href="http://www.babyloan.org/"&gt;Babyloan&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-5083833424857581557?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/I9Jj8QG2l1FbCQ0PyzYffX2bGqs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I9Jj8QG2l1FbCQ0PyzYffX2bGqs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/I9Jj8QG2l1FbCQ0PyzYffX2bGqs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I9Jj8QG2l1FbCQ0PyzYffX2bGqs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/3c6DwiPb4ZI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/5083833424857581557/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=5083833424857581557" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/5083833424857581557?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/5083833424857581557?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/3c6DwiPb4ZI/micro-credit.html" title="Micro Credit" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/12/micro-credit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cBQn48fip7ImA9Wx9QEkQ.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-8326811403868230803</id><published>2010-12-25T17:43:00.002Z</published><updated>2010-12-25T17:44:13.076Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-25T17:44:13.076Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Chrome Web Store" /><title>Chrome Web Store</title><content type="html">&lt;a href="https://chrome.google.com/webstore"&gt;Very very impressive&lt;/a&gt;.. You can feel how irrelevant the desktop will be in a few years....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-8326811403868230803?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fjltxajiklGlMc9KFxsV6QFGZPw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fjltxajiklGlMc9KFxsV6QFGZPw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fjltxajiklGlMc9KFxsV6QFGZPw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fjltxajiklGlMc9KFxsV6QFGZPw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/cO06DH6OP4M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/8326811403868230803/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=8326811403868230803" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/8326811403868230803?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/8326811403868230803?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/cO06DH6OP4M/chrome-web-store.html" title="Chrome Web Store" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/12/chrome-web-store.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkACSX0-cSp7ImA9Wx9RF0s.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-4760892564464557965</id><published>2010-12-19T14:21:00.003Z</published><updated>2010-12-19T14:26:08.359Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-19T14:26:08.359Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cake" /><category scheme="http://www.blogger.com/atom/ns#" term="Gateau Polonais aux pommes" /><title>Gateau Polonais aux pommes</title><content type="html">Nothing to do today: snow all over the place, no golf, cant drive the car...So a recipe for a famous cake.&lt;br /&gt;&lt;br /&gt;* 150g de farine&lt;br /&gt;* 120g de sucre&lt;br /&gt;* 4 pommes&lt;br /&gt;* 2 oeufs&lt;br /&gt;* 1/2 verre de lait&lt;br /&gt;* 80g de matiere grasse&lt;br /&gt;* levure&lt;br /&gt;&lt;br /&gt;- Melanger sucre et matiere grasse&lt;br /&gt;- Ajouter les oeufs, puis la farine et le lait&lt;br /&gt;- Incorporer la levure&lt;br /&gt;- Ajouter les morceaux de pommes (decoupe fine)&lt;br /&gt;&lt;br /&gt;Faire cuire au four pendant 30/35 minutes a 180 degres.&lt;br /&gt;&lt;br /&gt;Voila!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-4760892564464557965?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Lri6cYHRMxVy-P9N7YfL8rhYULA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Lri6cYHRMxVy-P9N7YfL8rhYULA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Lri6cYHRMxVy-P9N7YfL8rhYULA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Lri6cYHRMxVy-P9N7YfL8rhYULA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/pSO4mAxDgtM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/4760892564464557965/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=4760892564464557965" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/4760892564464557965?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/4760892564464557965?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/pSO4mAxDgtM/gateau-polonais-aux-pommes.html" title="Gateau Polonais aux pommes" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/12/gateau-polonais-aux-pommes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEFSHg8eSp7ImA9Wx5aEkk.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-1654594796830768662</id><published>2010-11-08T20:19:00.000Z</published><updated>2010-11-08T20:20:19.671Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-08T20:20:19.671Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Mandarin" /><title>One chinese character per day</title><content type="html">&lt;a href="http://www.bestvoc.com/p/1-chinese-character-a-day.php"&gt;1 character per day&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-1654594796830768662?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/37Q1q1rNOdujFhsdXZu9MAm9BFc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/37Q1q1rNOdujFhsdXZu9MAm9BFc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/37Q1q1rNOdujFhsdXZu9MAm9BFc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/37Q1q1rNOdujFhsdXZu9MAm9BFc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/_MfdDRPLIyg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/1654594796830768662/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=1654594796830768662" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/1654594796830768662?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/1654594796830768662?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/_MfdDRPLIyg/one-chinese-character-per-day.html" title="One chinese character per day" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/11/one-chinese-character-per-day.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYFQ34yfSp7ImA9Wx5bF04.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-2864369287178031428</id><published>2010-11-02T21:07:00.000Z</published><updated>2010-11-02T21:08:32.095Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-02T21:08:32.095Z</app:edited><title>Railway Children</title><content type="html">&lt;a href="http://www.railwaychildren.org.uk/"&gt;Every year, in the UK 100,000 under 16 run away from home&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-2864369287178031428?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Zzsd91qUYhaA1phVtCdLm7FrPo8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Zzsd91qUYhaA1phVtCdLm7FrPo8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Zzsd91qUYhaA1phVtCdLm7FrPo8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Zzsd91qUYhaA1phVtCdLm7FrPo8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/s1raBlK_Vxk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/2864369287178031428/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=2864369287178031428" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/2864369287178031428?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/2864369287178031428?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/s1raBlK_Vxk/railway-children.html" title="Railway Children" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/11/railway-children.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8MQ3Y_fip7ImA9Wx5VEk8.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-5702597163383112398</id><published>2010-10-04T19:32:00.002Z</published><updated>2010-10-04T19:34:42.846Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-04T19:34:42.846Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Brent" /><category scheme="http://www.blogger.com/atom/ns#" term="root-finding algo" /><title>Brent</title><content type="html">Whoever is interested in p2y/y2p interpolations, or others root-finding techniques, should check-out the Brent's root-finding algorithm implemented as part of &lt;a href="http://commons.apache.org/math/"&gt;Apache Commons Math&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-5702597163383112398?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nBN7Pz6I1rJa-dKB95MzqwUHCzU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nBN7Pz6I1rJa-dKB95MzqwUHCzU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nBN7Pz6I1rJa-dKB95MzqwUHCzU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nBN7Pz6I1rJa-dKB95MzqwUHCzU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/X0V3d86-ExQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/5702597163383112398/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=5702597163383112398" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/5702597163383112398?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/5702597163383112398?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/X0V3d86-ExQ/brent.html" title="Brent" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/10/brent.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8MSHo9fyp7ImA9Wx5WF0U.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-8593592553959137037</id><published>2010-09-29T19:34:00.001Z</published><updated>2010-09-29T19:34:49.467Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-29T19:34:49.467Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Gosling" /><title>Gosling's interview</title><content type="html">&lt;a href="http://www.basementcoders.com/transcripts/James_Gosling_Transcript.html"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-8593592553959137037?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kz0t5d6Mk4yTNKfI57yrf_1CI_E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kz0t5d6Mk4yTNKfI57yrf_1CI_E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kz0t5d6Mk4yTNKfI57yrf_1CI_E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kz0t5d6Mk4yTNKfI57yrf_1CI_E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/RrcwZbpKo0o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/8593592553959137037/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=8593592553959137037" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/8593592553959137037?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/8593592553959137037?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/RrcwZbpKo0o/goslings-interview.html" title="Gosling's interview" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/09/goslings-interview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAAQn85eSp7ImA9Wx5WF0U.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-3200303121057982809</id><published>2010-09-29T19:19:00.002Z</published><updated>2010-09-29T19:32:23.121Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-29T19:32:23.121Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="football" /><title>My First Football Game</title><content type="html">I attended my first ever football game last night. After 10 years+ in London, I had the opportunity to go and watch Chelsea-Marseille at the Stamford Bridge stadium.&lt;br /&gt;Chelsea won 2-0, but that is not the interesting part. The interesting part is that if you are a foreigner attending a game with the local supporters, be sure to wear the local shirt...in this case the Chelsea shirt...Avoid speaking any language that is not English.. actually, do not speak at all :-), and do not *ever* applaud a good action from the opposing team; otherwise, you'll find yourself in all kinds of trouble...&lt;br /&gt;Still an enjoyable evening...&lt;br /&gt;Supporters-wise, Marseille 10 - Chelsea 0&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=THUlZdj12o0"&gt;Ohhhh-Hisse&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ieQt5iIxeaQ/TKOTs7nOYYI/AAAAAAAAAUg/o_7AZDzLcDo/s1600/Chelsea1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_ieQt5iIxeaQ/TKOTs7nOYYI/AAAAAAAAAUg/o_7AZDzLcDo/s320/Chelsea1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5522419968212099458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ieQt5iIxeaQ/TKOUBQsaLQI/AAAAAAAAAUo/gKUvV7TCDtI/s1600/Chelsea4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ieQt5iIxeaQ/TKOUBQsaLQI/AAAAAAAAAUo/gKUvV7TCDtI/s320/Chelsea4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5522420317468372226" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-3200303121057982809?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PjoOCySIQnZrzbR8FVgZMncLB0g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PjoOCySIQnZrzbR8FVgZMncLB0g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PjoOCySIQnZrzbR8FVgZMncLB0g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PjoOCySIQnZrzbR8FVgZMncLB0g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/dee01bkkH-s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/3200303121057982809/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=3200303121057982809" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/3200303121057982809?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/3200303121057982809?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/dee01bkkH-s/my-first-football-game.html" title="My First Football Game" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ieQt5iIxeaQ/TKOTs7nOYYI/AAAAAAAAAUg/o_7AZDzLcDo/s72-c/Chelsea1.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/09/my-first-football-game.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04HRn4_eCp7ImA9Wx5TFks.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-8497255801571333371</id><published>2010-08-01T11:19:00.003Z</published><updated>2010-08-01T11:25:37.040Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-01T11:25:37.040Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="file transfer" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Android Password Manager File Transfer</title><content type="html">For the few people using my passwords manager for Android (&lt;a href="http://janaudy.com/android/"&gt;http://janaudy.com/android/&lt;/a&gt;) - well, just me may be, here is an easy way to transfer the files from your desktop to your phone:&lt;br /&gt;&lt;br /&gt;- Install &lt;a href="https://www.dropbox.com"&gt;https://www.dropbox.com&lt;/a&gt; for your desktop and on your phone (via Android Market)&lt;br /&gt;- Install ASTRO file manager (&lt;a href="http://www.androidtapp.com/astro-file-manager/"&gt;http://www.androidtapp.com/astro-file-manager/&lt;/a&gt;) via Android Market&lt;br /&gt;- Export the encrypted file per usual, drop it in the drop box&lt;br /&gt;- Run ASTRO on the Android phone and copy the file from your local drop box folder to the root of the /sd card&lt;br /&gt;&lt;br /&gt;Painless. No more cables.&lt;br /&gt;&lt;br /&gt;I have also tried a free Bluetooth file transfer that also just works fine!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-8497255801571333371?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JwxzsSChD9FeSUlckB_uCuMGEa8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JwxzsSChD9FeSUlckB_uCuMGEa8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JwxzsSChD9FeSUlckB_uCuMGEa8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JwxzsSChD9FeSUlckB_uCuMGEa8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/Uq65pQ6JwJc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/8497255801571333371/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=8497255801571333371" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/8497255801571333371?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/8497255801571333371?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/Uq65pQ6JwJc/android-password-manager-file-transfer.html" title="Android Password Manager File Transfer" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/08/android-password-manager-file-transfer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIBSHczeyp7ImA9Wx5TFUQ.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-2029129458949313665</id><published>2010-07-31T16:41:00.001Z</published><updated>2010-07-31T16:42:39.983Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-31T16:42:39.983Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="San Francisco" /><category scheme="http://www.blogger.com/atom/ns#" term="Jobs" /><title>Jobs in San Francisco</title><content type="html">Just returned from a business trip in San Francisco.&lt;br /&gt;A link to share for job openings: &lt;a href="http://sfbay.craigslist.org/"&gt;Craig's List&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-2029129458949313665?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DQvHszDlt_BRmaGd0lNiYerRv3U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DQvHszDlt_BRmaGd0lNiYerRv3U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DQvHszDlt_BRmaGd0lNiYerRv3U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DQvHszDlt_BRmaGd0lNiYerRv3U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/XC4bezPsy3s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/2029129458949313665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=2029129458949313665" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/2029129458949313665?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/2029129458949313665?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/XC4bezPsy3s/jobs-in-san-francisco.html" title="Jobs in San Francisco" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/07/jobs-in-san-francisco.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QBR3w4cSp7ImA9WxFaGUo.&quot;"><id>tag:blogger.com,1999:blog-1436098877388372574.post-1753587078970385267</id><published>2010-07-24T11:35:00.001Z</published><updated>2010-07-24T11:35:56.239Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-24T11:35:56.239Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TSP" /><title>Interested in TSP?</title><content type="html">This is *the* place to visit: &lt;a href="http://www.tsp.gatech.edu/"&gt;http://www.tsp.gatech.edu/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1436098877388372574-1753587078970385267?l=oogifu.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ulq5jKUw3UP0kMJBEVM-XoYomOU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ulq5jKUw3UP0kMJBEVM-XoYomOU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ulq5jKUw3UP0kMJBEVM-XoYomOU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ulq5jKUw3UP0kMJBEVM-XoYomOU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Oogifu/~4/Kw6MEIyZwpw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://oogifu.blogspot.com/feeds/1753587078970385267/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1436098877388372574&amp;postID=1753587078970385267" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/1753587078970385267?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1436098877388372574/posts/default/1753587078970385267?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Oogifu/~3/Kw6MEIyZwpw/interested-in-tsp.html" title="Interested in TSP?" /><author><name>Thierry Janaudy</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-GGHoZzBj5RY/AAAAAAAAAAI/AAAAAAAABNc/_SIxS9U5Z1g/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://oogifu.blogspot.com/2010/07/interested-in-tsp.html</feedburner:origLink></entry></feed>

