“From the horses mouth (I'm the lead developer on Fluent NHibernate): the reason Fluent Hibernate doesn't exist is exactly because of the lack of lambda expressions [in Java]. It's not just the lack of basic lambdas, but the ability to parse those expressions that FNH relies heavily on; without which you'd need to resort to strings and that's no better than XML in my opinion. It's always a possibility for the future though. – James Gregory Oct 22 '09 at 9:08”
Quoi qu'il en soit
Wednesday, 23 March 2011
Monday, 28 June 2010
Release port 8080 after tomcat crash on windows 7
Check which process is using port 80
On the command prompt window, type the following command.
netstat -o -n -a | findstr 0.0:8080
C:\dev>netstat -o -n -a | findstr 0.0:8080
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 6352
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 6352
- Right click on the taskbar to open the the task manager.
- Go to the Processes tab.
- Click the View menu
- And make sure you select the PID (Process Identifier)
Tuesday, 27 April 2010
Oracle: convert a varchar2 to a CLOB without dropping the table
Current defn of column in table NOTIFICATION
DETAIL VARCHAR2(4000),
Want it to be a CLOB.
create a temporary table 'NOTIFICATION2' with the required column defintions. This is then used as a template to convert the table column.
exec dbms_redefinition.start_redef_table('TSUSER','NOTIFICATION','NOTIFICATION2','ID, RECIPIENT, SUBJECT, TO_CLOB(DETAIL) DETAIL, FOOTER, ISSUE_DATE, SENT_DATE, SENT_STATUS, RETRY_COUNT, ROLE',dbms_redefinition.cons_use_pk);
exec dbms_redefinition.finish_redef_table('TSUSER','NOTIFICATION','NOTIFICATION2');
DETAIL VARCHAR2(4000),
Want it to be a CLOB.
create a temporary table 'NOTIFICATION2' with the required column defintions. This is then used as a template to convert the table column.
exec dbms_redefinition.start_redef_table('TSUSER','NOTIFICATION','NOTIFICATION2','ID, RECIPIENT, SUBJECT, TO_CLOB(DETAIL) DETAIL, FOOTER, ISSUE_DATE, SENT_DATE, SENT_STATUS, RETRY_COUNT, ROLE',dbms_redefinition.cons_use_pk);
exec dbms_redefinition.finish_redef_table('TSUSER','NOTIFICATION','NOTIFICATION2');
Thursday, 15 April 2010
Scala asymmetrical function definitions
I was impressed by the clarity of the "Better Haskell solution" to this Odd Word problem. (Disclaimer: I don't know haskell, but I can just about read a simple example like the one in this problem.)
haskell:
So I added a Scala version that is a translation of the Haskell which I'm repeating here which copies the essence of the Haskell algorithm as well as the names used:
The core logic is a bit longer than the Haskell version because
(a) Its doing IO(!) and handling input corner cases and is self contained and runnable.
(b) It defines cycle which is no big deal
(c) It defines method parameters and their types
(d) It has more brackets than haskell as haskell does not use brackets for function application. Not much we can do about that.
So, we have to define method parameters and their types, or do we? Now it could be argued that defining the parameters and types is good for readability, but it would be nice to have the choice. But of course with inline anonymous functions, the parameters and types are not required. So instead of defining the add method separately, we can write,
or to name the parameters without declaring the types,
So that's the asymmetry: Scala named function definitions require parameter names and types, and the anonymous functions don't, because the parameter types can usually be inferred by usage. The Haskell "where" syntax is rather nice and a similar feature in Scala would be great...
An imaginary Scala syntax for haskell style context based method definition:
It would just be an aliased anonymous functions which could (a) be used more than once in the expression and (b) simplify the overall expression compared to usage with anonymous functions.
Just a thought!
haskell:
import Data.List
enumerate = zip $ cycle [0,1]
oddwords x = foldl' add "" (enumerate ws) ++ "."
where add "" (_,t) = t
add s (0, t) = s ++ " " ++ t
add s (1, t) = s ++ " " ++ reverse t
ws = words $ takeWhile (/= '.') x
So I added a Scala version that is a translation of the Haskell which I'm repeating here which copies the essence of the Haskell algorithm as well as the names used:
object OddWordProblem1 {
// define cycle as per Haskell as Scala does not define it
def cycle[T](seq: Seq[T]) = Stream.continually(seq).flatten
def enumerate[T](words: Seq[T]) = cycle(List(0,1)) zip words
def oddwords(input : String) = {
def add(stringSoFar : String, wordAndOddIndicator : (Int,String)) =
(stringSoFar, wordAndOddIndicator) match {
case ("", (_, t)) => t
case (s, (0, t)) => s + " " + t
case (s, (1, t)) => s + " " + t.reverse
}
def ws(words : Seq[String]) = words takeWhile ("." !=)
// split the string into words, first making sure that "kansas." always becomes "kansas ."
val words = input.replaceFirst("""\.""", " .").split(" +").toList
enumerate(ws(words)).foldLeft("")(add) + "."
}
def main(args : Array[String]) = {
println(oddwords("whats the matter with kansas."))
}
}
The core logic is a bit longer than the Haskell version because
(a) Its doing IO(!) and handling input corner cases and is self contained and runnable.
(b) It defines cycle which is no big deal
(c) It defines method parameters and their types
(d) It has more brackets than haskell as haskell does not use brackets for function application. Not much we can do about that.
So, we have to define method parameters and their types, or do we? Now it could be argued that defining the parameters and types is good for readability, but it would be nice to have the choice. But of course with inline anonymous functions, the parameters and types are not required. So instead of defining the add method separately, we can write,
def oddwords(input : String) = {
def ws(words : Seq[String]) = words takeWhile ("." !=)
val words = input.replaceFirst("""\.""", " .").split(" +").toList
enumerate(ws(words)).foldLeft(""){
(_, _) match {
case ("", (_, t)) => t
case (s, (0, t)) => s + " " + t
case (s, (1, t)) => s + " " + t.reverse
}
} + "."
}
or to name the parameters without declaring the types,
// ...
enumerate(ws(words)).foldLeft(""){
(stringSoFar, wordAndOddIndicator) =>
(stringSoFar, wordAndOddIndicator) match {
case ("", (_, t)) => t
case (s, (0, t)) => s + " " + t
case (s, (1, t)) => s + " " + t.reverse
}
} + "."
So that's the asymmetry: Scala named function definitions require parameter names and types, and the anonymous functions don't, because the parameter types can usually be inferred by usage. The Haskell "where" syntax is rather nice and a similar feature in Scala would be great...
An imaginary Scala syntax for haskell style context based method definition:
// ...
enumerate(ws(words)).foldLeft("")(add)
where {
def add =
(_, _) match {
case ("", (_, t)) => t
case (s, (0, t)) => s + " " + t
case (s, (1, t)) => s + " " + t.reverse
}
}
// other defs
}
It would just be an aliased anonymous functions which could (a) be used more than once in the expression and (b) simplify the overall expression compared to usage with anonymous functions.
Just a thought!
Friday, 26 March 2010
The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
I got this error after redeploying a web app to tomcat6 in myeclipse 8.
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 22 in the generated java file
The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
Stacktrace:
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:423)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:317)
The reason was that
javax.servlet.jsp.jar
javax.servlet.jar
had been copied to
...\webapps\myapp\WEB-INF\lib
And the versions conflicted with the tomcat versions
Deleting
javax.servlet.jsp.jar
javax.servlet.jar
from
...\webapps\myapp\WEB-INF\lib
fixed the problem
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 22 in the generated java file
The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
Stacktrace:
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:423)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:317)
The reason was that
javax.servlet.jsp.jar
javax.servlet.jar
had been copied to
...\webapps\myapp\WEB-INF\lib
And the versions conflicted with the tomcat versions
Deleting
javax.servlet.jsp.jar
javax.servlet.jar
from
...\webapps\myapp\WEB-INF\lib
fixed the problem
Tuesday, 23 February 2010
Dynamically create spring bean
I used this in a dbunit test to create a dummy service layer bean dynamically.
The rest of the beans were configured in xml files. I created this bean dynamically in the test so that I didn't have to pollute the xml config.
The rest of the beans were configured in xml files. I created this bean dynamically in the test so that I didn't have to pollute the xml config.
// Dynamically create a DummyServiceToMakeCodeTransactional bean and register with spring
DefaultListableBeanFactory autowireCapableBeanFactory = (DefaultListableBeanFactory) getApplicationContext().getAutowireCapableBeanFactory();
AbstractBeanDefinition beanDefinition =
BeanDefinitionBuilder.rootBeanDefinition(
DummyServiceToMakeCodeTransactional.class.getName()).getBeanDefinition();
autowireCapableBeanFactory.registerBeanDefinition("DummyService", beanDefinition);
DummyServiceToMakeCodeTransactional bean = (DummyServiceToMakeCodeTransactional)
getApplicationContext().getBean("DummyService");
Wednesday, 4 November 2009
C# Linq OrderBy, Scala SortWith and SortBy (and Scary Implicits)
Here is a tiny example of a little bit of linq at work in Visual Studio 2010 Beta2. Lets order a list of names in C#
What happens when we run it: We get:
So the clause "OrderBy(person => person.DateOfBirth)" worked. Cool. C# knows how to compare birthdays.
But then Kaboom! The debugger stops at line 42 with ArgumentExeption "At least one object must implement IComparable". So "people.OrderBy(person => person)" was not checked at compile time. Wow! So lets implement IComparable on Person sorting on LastName:
And hey presto, C# knows how to sort people.
These clauses: "person => person.DateOfBirth" and "person => person" are known in C# are known as keySelector and are part of the .net linq library. If you want to drink the full linq Kool-Aid you can write
But its just doing the same thing under the covers.
So lets do the same thing in Scala, using the sortWith method, which until 22 Oct 2009 was the only thing available. Lets sort by DateOfBirth first
So now for the ordering naturally too
My head is about to explode. If you followed that last paragraph well done. If you didn't then read the next one instead.
Anyhow, the compiler inserts an "implicit" "thing" into the last parameter of the sortBy method. And that "implicit" "thing" knows how to order people about into neat lines. It just works.
So what about ordering by say firstName?
So what about ordering by say dateOfBirth?
But we can say:
But now for something scary. If I accidentally import this definition from some library that I happen to be using
If People line up in the wrong order then nobody cares, but lets call that class StocksToShortRightNow instead. Bang goes my Christmas bonus!
I hope I am somehow wrong here, and this is a bug or I am thinking about this the wrong way. But it makes me nervous.
Here is the complete code with the scary implicit commented out.
[Update: 2009-11-05]
I posted a question about the SomeOtherPersonOrderingObjectInadvertentlyImported overriding the Person extends Ordered[Person] natural ordering. Here is Martin Odersky's response:
Implicits that are explicitly declared or imported take precedence over implicits that come with the type. Btw you can find out what implicits are inserted by running scalac with option -Xprint:typer. This will print out the tree after type checking.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestOrderBy
{
class Person
{
public Person(string firstName, string lastName, DateTime dateOfBirth)
{
FirstName = firstName;
LastName = lastName;
DateOfBirth = dateOfBirth;
}
public readonly string FirstName;
public readonly string LastName;
public readonly DateTime DateOfBirth;
override public string ToString()
{
return FirstName + ", " + LastName + " " + DateOfBirth.ToShortDateString();
}
}
class Program
{
static void Main(string[] args)
{
var people = new List() {
new Person("Alan", "Kay", new DateTime(1973,12,1)),
new Person("James", "Gosling", new DateTime(1991,12,1)),
new Person("Anders", "Hejlsberg", new DateTime(1999,12,1)),
new Person("Martin", "Odersky", new DateTime(2000,12,1)),
new Person("Guido", "Van Rossum", new DateTime(2002,12,1)),
new Person("Yukihiro", "Matsumoto", new DateTime(1990,12,1))
};
var peopleOrderedByDob = people.OrderBy(person => person.DateOfBirth);
foreach (var p in peopleOrderedByDob)
Console.WriteLine(p);
Console.WriteLine();
var peopleOrderedNaturally = people.OrderBy(person => person);
foreach (var p in peopleOrderedNaturally)
Console.WriteLine(p);
Console.WriteLine();
Console.ReadLine();
}
}
}
What happens when we run it: We get:
Alan, Kay 01/12/1973 Yukihiro, Matsumoto 01/12/1990 James, Gosling 01/12/1991 Anders, Hejlsberg 01/12/1999 Martin, Odersky 01/12/2000 Guido, Van Rossum 01/12/2002
So the clause "OrderBy(person => person.DateOfBirth)" worked. Cool. C# knows how to compare birthdays.
But then Kaboom! The debugger stops at line 42 with ArgumentExeption "At least one object must implement IComparable". So "people.OrderBy(person => person)" was not checked at compile time. Wow! So lets implement IComparable on Person sorting on LastName:
class Person : IComparable
{
...
int IComparable.CompareTo(object obj)
{
Person otherPerson = obj as Person;
if (otherPerson != null)
return this.LastName.CompareTo(otherPerson.LastName);
else
throw new ArgumentException("Object is not a Person");
}
}
And hey presto, C# knows how to sort people.
Alan, Kay 01/12/1973 Yukihiro, Matsumoto 01/12/1990 James, Gosling 01/12/1991 Anders, Hejlsberg 01/12/1999 Martin, Odersky 01/12/2000 Guido, Van Rossum 01/12/2002 James, Gosling 01/12/1991 Anders, Hejlsberg 01/12/1999 Alan, Kay 01/12/1973 Yukihiro, Matsumoto 01/12/1990 Martin, Odersky 01/12/2000 Guido, Van Rossum 01/12/2002
These clauses: "person => person.DateOfBirth" and "person => person" are known in C# are known as keySelector and are part of the .net linq library. If you want to drink the full linq Kool-Aid you can write
var peopleOrderedByDob =
from p in people
orderby p.DateOfBirth
select p;
foreach (var p in peopleOrderedByDob)
Console.WriteLine(p);
But its just doing the same thing under the covers.
So lets do the same thing in Scala, using the sortWith method, which until 22 Oct 2009 was the only thing available. Lets sort by DateOfBirth first
import org.scala_tools.time.Imports._
object TestSortBy {
case class Person(firstName: String, lastName: String, dateOfBirth: DateTime)
{
override def toString() = {
firstName + ", " + lastName + " " + DateTimeFormat.shortDate().print(dateOfBirth);
}
}
def main(args : Array[String]) : Unit = {
val people =
Person("Alan", "Kay", new DateTime(1973,12,1,0,0,0,0))::
Person("James", "Gosling", new DateTime(1991,12,1,0,0,0,0))::
Person("Anders", "Hejlsberg", new DateTime(1999,12,1,0,0,0,0))::
Person("Martin", "Odersky", new DateTime(2000,12,1,0,0,0,0))::
Person("Guido", "Van Rossum", new DateTime(2002,12,1,0,0,0,0))::
Person("Yukihiro", "Matsumoto", new DateTime(1990,12,1,0,0,0,0))::Nil
val peopleOrderedByDob = people.sortWith((p1,p2) => p1.dateOfBirth < p2.dateOfBirth)
peopleOrderedByDob foreach println
println
}
}
Which works just fine: Alan, Kay 01/12/73 Yukihiro, Matsumoto 01/12/90 James, Gosling 01/12/91 Anders, Hejlsberg 01/12/99 Martin, Odersky 01/12/00 Guido, Van Rossum 01/12/02
So now for the ordering naturally too
val peopleOrderedNaturally = people.sortWith((p1,p2) => p1 < p2)
peopleOrderedNaturally foreach println
println
but line 2 does not compile (unlike c# where this is a runtime error) because the compiler does not know how to compare one Person with another. Doh! So lets add Ordered[Person] to Person to tell the compiler how to judge people :) case class Person(firstName: String, lastName: String, dateOfBirth: DateTime)
extends Ordered[Person]
{
override def toString() = {
firstName + ", " + lastName + " " + DateTimeFormat.shortDate().print(dateOfBirth);
}
def compare(otherPerson: Person) = {
lastName.compareTo(otherPerson.lastName)
}
}
And hey presto, same results as C# Alan, Kay 01/12/73 Yukihiro, Matsumoto 01/12/90 James, Gosling 01/12/91 Anders, Hejlsberg 01/12/99 Martin, Odersky 01/12/00 Guido, Van Rossum 01/12/02 James, Gosling 01/12/91 Anders, Hejlsberg 01/12/99 Alan, Kay 01/12/73 Yukihiro, Matsumoto 01/12/90 Martin, Odersky 01/12/00 Guido, Van Rossum 01/12/02Well that was easy. But if you look at Scala sortWith compared to C# OrderBy, you realize that in Scala you have to say how to do a comparison, whereas in C# you say what thing to order by.
Scala val peopleOrderedByDob = people.sortWith((p1,p2) => p1.dateOfBirth < p2.dateOfBirth) C# var peopleOrderedByDob = people.OrderBy(person => person.DateOfBirth);When the Scala team saw that the C# version was shorter, and worse still, more functional than Scala's imperativeness, there was a great silence of the lambdas and then they recursed and recursed until they'd invented the entire Scala implicits system described well here and here. (Well maybe that wasn't quite how it happened...) So, very recently the sortBy method got added to the SeqLike trait as was kindly pointed out to me by Ismael Juma in an earlier post. So now we can write
val peopleOrderedNaturallyWithSortBy = people.sortBy(person => person) peopleOrderedNaturallyWithSortBy foreach println printlnand this works fine. (Note that if you take the "extends Ordered[Person]" away from Person then "people.sortBy(person => person)" will not compile.) So how does it do it. Lets look at the signature of SortBy on the SeqLike trait.
def sortBy[B](f: A => B)(implicit ord: Ordering[B]): ReprI'm not sure what Repr is, but the "implicit ord: Ordering[B])" is a suitable "thing" that knows how to order a B. In our case a B is a Person, which is an Ordered[Person] but not an Ordering[Person]. But Ordering.scala contains a trait LowPriorityOrderingImplicits with an implicit def that know how to "upgrade" an Ordered[Person] to an Ordering[Person] "thing" and that is then passed to the sortBy method to be used to get-the-job-done-tm.
My head is about to explode. If you followed that last paragraph well done. If you didn't then read the next one instead.
Anyhow, the compiler inserts an "implicit" "thing" into the last parameter of the sortBy method. And that "implicit" "thing" knows how to order people about into neat lines. It just works.
So what about ordering by say firstName?
val peopleOrderedByDobWithSortBy = people.sortBy(person => person.firstName)
peopleOrderedNaturallyWithSortBy foreach println
println
Well that works fine. Turns out its because there is a whole stack of implicit object defs in Ordering.scala that provide instances of Ordering traits for the basic value types like String and Int etc.So what about ordering by say dateOfBirth?
val peopleOrderedByDobWithSortBy = people.sortBy(person => person.dateOfBirth)
peopleOrderedNaturallyWithSortBy foreach println
println
It doesn't compile at line 2: "type arguments [org.scala_tools.time.imports.DateTime] do not conform to method ordered's type parameter bounds [A <: Ordered[A]]". Silly me, bah humbug! Its because a org.joda.time.DateTime isn't an Ordered[DateTime]. Now Scala-Time uses the pimp-my-library technique to upgrade org.joda.time.DateTime to RichDateTime, so we can try changing Scala-Time's RichDateTime to class RichDateTime(val underlying: DateTime) extends Ordered[RichDateTime] {
def compare(y: RichDateTime): Int = {
return underlying.compareTo(y.underlying)
}
...
but that still doesn't compile "people.sortBy(person => person.dateOfBirth)" because, the compiler is not "upgrading" DateTime to RichDateTime.But we can say:
val peopleOrderedByDobWithSortBy = people.sortBy(person => RichDateTime(person.dateOfBirth))but thats not very pretty. So what's the answer? Put in an implicit object that knows how to order DateTime.
implicit object DateTimeOrderingObject extends Ordering[DateTime] {
def compare(x: DateTime, y: DateTime) = x.compareTo(y)
}
That definition should live in the Scala-Time library, but for now, it can be in my program. Now this will compile: val peopleOrderedByDobWithSortBy = people.sortBy(person => person.dateOfBirth)and the code works.
But now for something scary. If I accidentally import this definition from some library that I happen to be using
implicit object SomeOtherPersonOrderingObjectInadvertentlyImported extends Ordering[Person] {
def compare(p1: Person, p2: Person) = (p1.firstName+p1.lastName).compareTo(p2.firstName+p2.lastName) }Then my code breaks because the people are printed in a different order. The code still compiles, but I get the SomeOtherPersonOrderingObjectInadvertentlyImported object used to do the sorting of the People instead of People's normal ordering.
If People line up in the wrong order then nobody cares, but lets call that class StocksToShortRightNow instead. Bang goes my Christmas bonus!
I hope I am somehow wrong here, and this is a bug or I am thinking about this the wrong way. But it makes me nervous.
Here is the complete code with the scary implicit commented out.
import org.scala_tools.time.Imports._
object TestSortBy {
case class Person(firstName: String, lastName: String, dateOfBirth: DateTime)
extends Ordered[Person]
{
override def toString() = {
firstName + ", " + lastName + " " + DateTimeFormat.shortDate().print(dateOfBirth);
}
def compare(otherPerson: Person) = {
lastName.compareTo(otherPerson.lastName)
}
}
// Comment this is and watch the behaviour change. This could be imported accidentally
// implicit object SomeOtherPersonOrderingObjectInadvertentlyImported
// extends Ordering[Person] {
// def compare(p1: Person, p2: Person) =
// (p1.firstName+p1.lastName).compareTo(p2.firstName+p2.lastName)
// }
implicit object DateTimeOrderingObject extends Ordering[DateTime] {
def compare(x: DateTime, y: DateTime) = x.compareTo(y)
}
def main(args : Array[String]) : Unit = {
val people =
Person("Alan", "Kay", new DateTime(1973,12,1,0,0,0,0))::
Person("James", "Gosling", new DateTime(1991,12,1,0,0,0,0))::
Person("Anders", "Hejlsberg", new DateTime(1999,12,1,0,0,0,0))::
Person("Martin", "Odersky", new DateTime(2000,12,1,0,0,0,0))::
Person("Guido", "Van Rossum", new DateTime(2002,12,1,0,0,0,0))::
Person("Yukihiro", "Matsumoto", new DateTime(1990,12,1,0,0,0,0))::Nil
val peopleOrderedByDob = people.sortWith((p1,p2) => p1.dateOfBirth < p2.dateOfBirth)
peopleOrderedByDob foreach println
println
val peopleOrderedNaturally = people.sortWith((p1,p2) => p1 < p2)
peopleOrderedNaturally foreach println
println
val peopleOrderedNaturallyWithSortBy = people.sortBy(person => person)
peopleOrderedNaturallyWithSortBy foreach println
println
val peopleOrderedByDobWithSortBy = people.sortBy(person => person.dateOfBirth)
peopleOrderedNaturallyWithSortBy foreach println
println
}
}
[Update: 2009-11-05]
I posted a question about the SomeOtherPersonOrderingObjectInadvertentlyImported overriding the Person extends Ordered[Person] natural ordering. Here is Martin Odersky's response:
Implicits that are explicitly declared or imported take precedence over implicits that come with the type. Btw you can find out what implicits are inserted by running scalac with option -Xprint:typer. This will print out the tree after type checking.
Subscribe to:
Posts (Atom)
Blog Archive
-
►
2009
(14)
-
►
October
(7)
- Becoming really rich with Scala
- Checking how to use blogger for side by side code ...
- Scala, lazy evaluation and the Sieve of Eratosthen...
- Scala Streams for iteration / Use streams to avoid...
- Scala: C style iterate function for building lists...
- C style for loops in Scala with break and continue...
- Using syntax version of SyntaxHighlighter with Blo...
-
►
October
(7)