Kamis, 13 Januari 2011

Using Scala with JDBC to connect to MySQL

A quick howto on connecting Scala to a MySQL database using JDBC. There are a number of database libraries for Scala, but I ran into a problem getting most of them to work. I have the highest hopes for Querulous, a library created by Twitter. However, it currently only supports Scala 2.7.7 and I’m running a 2.8 candidate which is the only compatible version with the template engine I’m using. Hopefully things stabilize once 2.8 is final.
I attempted to use scala.dbc, scala.dbc2 and Scala Query but either they aren’t supported, have a very limited featured set or abstracts SQL to a weird pseudo language. So I ended up with basic Java JDBC and it turned out to be the easiest solution.
Here is the code for the a database query example using JDBC. You need to change the connection string parameters and modify the query for your database.



import java.sql.{Connection, DriverManager, ResultSet};

// Change to Your Database Config


val conn_str = "jdbc:mysql://localhost:3306/DBNAME?user=DBUSER&password=DBPWD"

// Load the driver

classOf[com.mysql.jdbc.Driver]
// Setup the connection
val conn = DriverManager.getConnection(conn_str)

try {
// Configure to be Read Only
val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)

// Execute Query
val rs = statement.executeQuery("SELECT quote FROM quotes LIMIT 5")
// Iterate Over ResultSet
while (rs.next) {
println(rs.getString("quote"))

}
}
finally {
conn.close
}

You will need to download the mysql-connector jar. Download the mysql connector jar from here.
Or if you are using maven, the pom snippets to load the mysql connector

mysql
mysql-connector-java
5.1.12


To run the example, save the following to a file (query_test.scala) a run using, the following specifying the classpath to the connector jar:

scala -classpath mysql-connector-java-5.1.12.jar:. query_test.scala

Hope it helps.

Simple Scala App

















import scala.swing._
import event._
import scala.actors._
import Actor._
import java.awt.Color

object NetAssetAppGUI extends SimpleGUIApplication {
def top = mainFrame
val mainFrame = new MainFrame {
title = "Net Asset"
val dateLabel = new Label { text = "Last updated: ----- " }
val valuesTable = new Table(
NetAssetStockPriceHelper.getInitialTableValues,
Array("Ticker" , "Units" , "Price" , "Value" )) {
showGrid = true
gridColor = Color.BLACK
}
val updateButton = new Button { text = "Update" }
val netAssetLabel = new Label { text = "Net Asset: ????" }
contents = new BoxPanel(Orientation.Vertical) {
contents += dateLabel
contents += valuesTable
contents += new ScrollPane(valuesTable)
contents += new FlowPanel {
contents += updateButton
contents += netAssetLabel
}
}
listenTo(updateButton)
reactions += {
case ButtonClicked(button) =>
button.enabled = false
NetAssetStockPriceHelper fetchPrice uiUpdater
}

val uiUpdater = new Actor {
def act = {
loop {
react {
case (symbol : String, units : Int, price : Double, value : Double) =>
updateTable(symbol, units, price, value)
case netAsset =>
netAssetLabel.text = "Net Asset: " + netAsset
dateLabel.text = "Last updated: " + new java.util.Date()
updateButton.enabled = true
}
}
}
override protected def scheduler() = new SingleThreadedScheduler
}
uiUpdater.start()
def updateTable(symbol: String, units : Int, price : Double, value : Double) {
for(i <- 0 until valuesTable.rowCount) {
if (valuesTable(i, 0) == symbol) {
valuesTable(i, 2) = price
valuesTable(i, 3) = value
}
}
}
}
}

Rabu, 12 Januari 2011

CrunchBang 10 Statler


New CrunchBang Statler images are available now. The new images were built on Wednesday 5th January 2011 and feature all package updates available at that time from the Debian Squeeze and CrunchBang Statler repositories.

These updated Statler images feature the following changes:

* Google Chrome installed as the default browser.
* A new live-installer, as used by the LMDE project.
* Plymouth graphical boot loader enabled by default after installation.
* Improved font rendering.
* Improved post-installation script, providing optional installs of:
o Liquorix/Zen kernel.
o Sun Java(TM) Runtime Environment and browser plugin.
* Back to black artwork.
* 100s of additional plugins and filters for GIMP via the ‘gimp-plugin-registry’ package.
* Updated Dropbox packages and Thunar Dropbox extensions installed by default.
* Pino replaced by Heybuddy, a micro blogging Indenti.ca client.
* Various other minor fixes and improvements, including, but not limited to:
o Xfce menu fixed for applications requiring root privileges.
o Missing ‘wireless-tools’ package is now included.
o Viewnior image viewer rebuilt without the GNOME specific features.
o Updated Elementary icons.

Existing Statler users should not need to perform a reinstall, instead a simple ‘sudo apt-get update && sudo apt-get dist-upgrade’ should suffice.

IMPORTANT NOTE FOR UNETBOOTIN USERS: CrunchBang images will more than likely fail to work if copied to USB devices with Unetbootin. Please use the recommended method for creating USB installation media.

As always with CrunchBang, this release is not recommended for anyone who requires a stable system. Anyone who uses CrunchBang should be comfortable with occasional or even frequent breakage. Remember, CrunchBang Linux could make your computer go CRUNCH! BANG! :)

If you do decide to give CrunchBang a try, please visit the forums and join the conversation. We would love to read your feedback and suggestions for improvements!

Sumber :

http://crunchbanglinux.org/blog/2011/01/06/crunchbang-10-statler-r20110105/

Install OpenOffice Crunchbang Linux

Install OpenOffice Crunchbang Linux

#!/bin/sh
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-style-galaxy_3.2.1-11_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/s/stlport4.6/libstlport4.6ldbl_4.6.2-7_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/uno-libs3_1.6.1+OOo3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/ure_1.6.1+OOo3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-common_3.2.1-11_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/ttf-opensymbol_3.2.1-11_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/s/silgraphite2.0/libgraphite3_2.3.1-0.2_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/h/hyphen/libhyphen0_2.5-1_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/m/mythes/libmythes-1.2-0_1.2.1-1_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/n/neon27/libneon27-gnutls_0.29.3-3_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/r/raptor/libraptor1_1.4.21-2_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/r/rasqal/librasqal2_0.9.20-1_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/r/redland/librdf0_1.0.10-3_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-core_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/python-uno_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-emailmerge_3.2.1-11_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openjdk-6/openjdk-6-jre-lib_6b18-1.8.3-2_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/c/ca-certificates-java/ca-certificates-java_20100412_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/t/tzdata/tzdata-java_2010o-1_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/j/java-common/java-common_0.40_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openjdk-6/openjdk-6-jre-headless_6b18-1.8.3-2_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/j/java-common/default-jre-headless_1.6-40_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/j/java-access-bridge/libaccess-bridge-java_1.26.2-5_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/j/java-access-bridge/libaccess-bridge-java-jni_1.26.2-5_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openjdk-6/openjdk-6-jre_6b18-1.8.3-2_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/j/java-common/default-jre_1.6-40_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/g/gcj-4.4/gcj-4.4-base_4.4.5-2_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/g/gcc-defaults/libgcj-common_4.4.5-1_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/g/gcj-4.4/libgcj10_4.4.5-2_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/g/gcj-4.4/gcj-4.4-jre-lib_4.4.5-2_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/libc/libcommons-collections3-java/libcommons-collections3-java_3.2.1-4_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/libc/libcommons-logging-java/libcommons-logging-java_1.1.1-8_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/c/commons-beanutils/libcommons-beanutils-java_1.8.3-1_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/libc/libcommons-compress-java/libcommons-compress-java_1.0-1_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/libc/libcommons-digester-java/libcommons-digester-java_1.8.1-2_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/libd/libdb-je-java/libdb-je-java_3.3.62-3_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/d/db4.7/libdb4.7-java_4.7.25-9_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/g/gcc-defaults/libgcj-bc_4.4.5-1_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/d/db4.7/libdb4.7-java-gcj_4.7.25-9_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/t/tomcat6/libservlet2.5-java_6.0.28-9_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/h/hsqldb/libhsqldb-java_1.8.0.10-9_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/i/icu4j/libicu4j-java_4.0.1.1-1_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/libj/libjaxp1.3-java/libjaxp1.3-java_1.3.05-1_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/j/jline/libjline-java_0.9.94-5_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/j/jtidy/libjtidy-java_7+svn20070309-4_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/l/lucene2/liblucene2-java_2.9.2+ds1-1_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/libr/libregexp-java/libregexp-java_1.5-2_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/libt/libtextcat/libtextcat-data-utf8_2.2-4_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-base-core_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-writer_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-calc_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-draw_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-impress_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-math_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-java-common_3.2.1-11_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-base_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-report-builder-bin_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/t/ttf-sil-gentium-basic/ttf-sil-gentium-basic_1.1-2_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-officebean_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-filter-mobiledev_3.2.1-11_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-filter-binfilter_3.2.1-11_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/t/ttf-sil-gentium/ttf-sil-gentium_1.02-11_all.deb
wget -c http://ftp.de.debian.org/debian/pool/main/o/openjdk-6/icedtea-6-jre-cacao_6b18-1.8.3-2_i386.deb
wget -c http://ftp.de.debian.org/debian/pool/main/x/xfonts-mathml/xfonts-mathml_4_all.deb

download semua jadikan satu dalam folder dan install aplikasinya

$su
password

#dpkg -i *.deb

:)

Selasa, 11 Januari 2011

Crunchbang Linux Wvdial





After installing CrunchBang 8.04.2 and with no Wired LAN access, or Wifi,

I needed wvdial to get the Broadcom Firmware downloaded by Dialup.



HOWTO: Install wvdial to download and update Broadcom Wifi Firmware

to enable Wifi after HD install from CrunchBang LiveCD 8.04.2

FOR: CrunchBang Version 8.04.2



REQUIRED DEBS: wvdial & dependencies

(NOTE: Download path was found by running Synaptic and trying to

install wvdial)



DEBS:

libwvstreams4.4-extras_4.4.1-0ubuntu2_i386.deb

libxplc0.3.13_0.3.13-1build1_i386.deb

wvdial_1.60.1_i386.deb

libuniconf4.4_4.4.1-0ubuntu2_i386.deb

libwvstreams4.4-base_4.4.1-0ubuntu2_i386.deb



Download the required files with another computer, and save on a USB Memory Stick,

then copy to the HD archive folder.....



sudo cp /media/CENTON?USB/crunchbang/archives/*.deb /var/cache/apt/archives

Open Synaptic and Install wvdial

Setup wvdial and detect the Modem with:

sudo wvdialconf /etc/wvdial.conf



Add your information to the configuration of wvdial, pap-secrets,

and chap-secrets :



sudo nano /etc/wvdial.conf

(NOTE: your /dev/ttyS0 is probably different and the last three

lines will need to be your login information, example follows)





[Dialer Defaults]

Auto DNS = yes



Init1 = ATZ

Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0



Stupid Mode = yes

Modem Type = Analog Modem



Baud = 115200

New PPPD = yes



Modem = /dev/ttyS0

ISDN = 0



Phone = 3211234

Password = password

Username = login@isp.net



sudo nano /etc/ppp/pap-secrets

(NOTE: your login info must be inserted)



login@isp.net * password



sudo nano /etc/ppp/chap-secrets

(NOTE: your login info must be inserted)



login@isp.net * password



Dial and test with:



wvdial



(NOTE: You will leave the Terminal window open during the session, and

when finished use CNTL C to terminate wvdial, then you can close the window.)



Wifi was enabled, and after connecting to a local Wifi router my Update was

completed by the Wifi connection......All 260 files.

Moved 06-12-2009 to Tips, Tricks & Scripts from HOWTO: Sticky .......

lkraemer

Simple Actor Scala

::::::::::::::
test1.sh
::::::::::::::
#!/bin/sh
# $Id: test1.sh,v 1.1 2009/10/19 16:45:09 kishi Exp kishi $

scala -classpath ActorTest.jar com.ykishi.scala.Main

::::::::::::::
src/Main.scala
::::::::::::::
import scala.actors.Actor._

package com.ykishi.scala
{
object Main extends Application {

case class MetaInfo(key: Int, value: String)

override def main(args: Array[String]){
val a = actor {
loop {
receive {
case s: String => println("received: " + s)
case m: MetaInfo => println("received: " + m.key + "," + m.value)
case -1 => {
reply("complete")
exit()
}
}
}
}

//--------------------------------------------
// Send messages to actor repeatedly
//--------------------------------------------
a ! "HELLO!"
a ! MetaInfo(1123, "KISHI Yasuhiro")
val retval = a !? -1
println("Actor's reply: " + retval)

}

}

}

■ 実行結果
$ ./test1.sh
received: HELLO!
received: 1123,KISHI Yasuhiro
Actor's reply: complete

react Scala

$ more Main.scala
import scala.actors.Actor._
import scala.actors._

package com.ykishi.scala {

object Main extends Actor {

case class MetaInfo ( key: Int, value: String )

def act() {
react {
case s: String =>
reply ( "Thanks! " + s )
act()
case m: MetaInfo =>
println ( "*** received: " + m.key + "," + m.value )
reply ( "successfully completed!" )
act()
case -1 => {
reply ( "BYE!" )
exit()
}

}
}

def main ( args: Array[String] ) {

var a = Main.start()

println ( a !? "HELLO!" )

println ( a !? MetaInfo ( 1123, "KISHI Yasuhiro" ) )

val retval = a !? -1
println ( "Actor's reply: " + retval )

}

}

}

$ ./test1.sh
Thanks! HELLO!
*** received: 1123,KISHI Yasuhiro
successfully completed!
Actor's reply: BYE!

reduceLeft

$ cat max.scala

val myList = List("OK", "foobar", "All I can do is to finishi it", "The touch")
println( myList )

val longest = myList.reduceLeft(
(a,b) => if (a.length > b.length ) a else b
)
println( longest )


$ scala max.scala
List(OK, foobar, All I can do is to finishi it, The touch)
All I can do is to finishi it

foldRight Scala

$ cat Main.scala
object Main {
def main ( args: Array[String] ) {
try {
val elems = args map Integer.parseInt
println ( "The sum of my arguments is: " + elems.foldRight ( 0 ) ( _ + _ ) )
} catch {
case e: NumberFormatException =>
println ( "Usage: scala Main ... " )
}
}
}


$ scalac Main.scala


$ scala Main `seq 1 10`
The sum of my arguments is: 55


$ scala Main `seq 1 100`
The sum of my arguments is: 5050


$ scala Main `seq 1 1024`
The sum of my arguments is: 524800

Program konsole sederhana Scala

$ cat main.sh
#!/bin/sh

scala -classpath TraitTest.jar com.ykishi.scalatest.Main

$ ./main.sh
Hello!
doing action!
---------------------------------------------
BEFORE doAction()
doing action!
AFTER doAction()

$ more *.scala
::::::::::::::
Main.scala
::::::::::::::
package com.ykishi.scalatest

object Main {
def main(args :Array[String]) {

println( "Hello!" );

val action1 = new MyAction
action1.doAction

println("---------------------------------------------")
//
// In case when weaving is required, you can mix-in a specific trait as you prefer
//
val action2 = new MyAction with TWeaver
action2.doAction

}
}
::::::::::::::
MyAction.scala
::::::::::::::
package com.ykishi.scalatest

class MyAction extends TAction {
def doAction = { println("doing action!" ) }
}
::::::::::::::
TAction.scala
::::::::::::::
package com.ykishi.scalatest

trait TAction {
def doAction
}
::::::::::::::
TWeaver.scala
::::::::::::::
package com.ykishi.scalatest

trait TWeaver extends TAction {
abstract override def doAction {
println("BEFORE doAction()")

super.doAction

println("AFTER doAction()")
}
}

yield

$ scala
cygwin warning:
MS-DOS style path detected: d:\jdk1.6/bin/java
Preferred POSIX equivalent is: /cygdrive/d/jdk1.6/bin/java
CYGWIN environment variable option "nodosfilewarning" turns off this warning.
Consult the user's guide for more details about POSIX paths:
http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
Welcome to Scala version 2.7.7.final (Java HotSpot(TM) Client VM, Java 1.6.0_13).
Type in expressions to have them evaluated.
Type :help for more information.

scala> var aList = List(1,2,3,4,5)
aList: List[Int] = List(1, 2, 3, 4, 5)

scala> for(num <- aList) yield num * 10 res0: List[Int] = List(10, 20, 30, 40, 50) scala> aList.map( i => i * 10 )
res1: List[Int] = List(10, 20, 30, 40, 50)


$ scala
Welcome to Scala version 2.7.7.final (Java HotSpot(TM) Client VM, Java 1.6.0_13).
Type in expressions to have them evaluated.
Type :help for more information.

scala> var aList = List(1,2,3,4,5)
aList: List[Int] = List(1, 2, 3, 4, 5)

scala> for(num <- aList) yield println(num * 10)
10
20
30
40
50
res0: List[Unit] = List((), (), (), (), ())

Proses Arguments

$ cat args.scala

println( args(0) )
println( "# of arguments :" + args.length )

$ scala args.scala Hey! Bagaimana keadaan kamu?
Hey!
# of arguments :4

IF Scala

$ cat script.sh
#!/bin/sh
exec scala "$0" "$@"
!#

if ( args.length != 1 ) {
println("Usage: script.sh [Who]")
exit
}
println("Thanks, " + args(0) + "!")

val aList = List(1,2,3)
aList.foreach( a => println(a) )



$ ./script.sh John
Thanks, John!
1
2
3


$ ./script.sh
Usage: script.sh [Who]

foreach

$ cat printargs.scala

args.foreach( arg => println(arg) )

$ scala printargs.scala foo bar baz quux hoge fuga piyo hogehoge foobar
foo
bar
baz
quux
hoge
fuga
piyo
hogehoge
foobar

Senin, 10 Januari 2011

nesting "for"

$ cat ForTest.sh
#!/bin/sh
exec scala "$0" "$@"
!#

for { i <- 0 to 9
j <- 0 to 9 }
println( "i=" + i + ",j=" + j + ": " + i*j )

$ ./ForTest.sh
i=0,j=0: 0
i=0,j=1: 0
i=0,j=2: 0
i=0,j=3: 0
i=0,j=4: 0
i=0,j=5: 0
i=0,j=6: 0
i=0,j=7: 0
i=0,j=8: 0
i=0,j=9: 0
i=1,j=0: 0
i=1,j=1: 1
i=1,j=2: 2
i=1,j=3: 3
i=1,j=4: 4
i=1,j=5: 5
i=1,j=6: 6
i=1,j=7: 7
i=1,j=8: 8
i=1,j=9: 9
i=2,j=0: 0
i=2,j=1: 2
i=2,j=2: 4
i=2,j=3: 6
i=2,j=4: 8
i=2,j=5: 10
i=2,j=6: 12
i=2,j=7: 14
i=2,j=8: 16
i=2,j=9: 18
i=3,j=0: 0
i=3,j=1: 3
i=3,j=2: 6
i=3,j=3: 9
i=3,j=4: 12
i=3,j=5: 15
i=3,j=6: 18
i=3,j=7: 21
i=3,j=8: 24
i=3,j=9: 27
i=4,j=0: 0
i=4,j=1: 4
i=4,j=2: 8
i=4,j=3: 12
i=4,j=4: 16
i=4,j=5: 20
i=4,j=6: 24
i=4,j=7: 28
i=4,j=8: 32
i=4,j=9: 36
i=5,j=0: 0
i=5,j=1: 5
i=5,j=2: 10
i=5,j=3: 15
i=5,j=4: 20
i=5,j=5: 25
i=5,j=6: 30
i=5,j=7: 35
i=5,j=8: 40
i=5,j=9: 45
i=6,j=0: 0
i=6,j=1: 6
i=6,j=2: 12
i=6,j=3: 18
i=6,j=4: 24
i=6,j=5: 30
i=6,j=6: 36
i=6,j=7: 42
i=6,j=8: 48
i=6,j=9: 54
i=7,j=0: 0
i=7,j=1: 7
i=7,j=2: 14
i=7,j=3: 21
i=7,j=4: 28
i=7,j=5: 35
i=7,j=6: 42
i=7,j=7: 49
i=7,j=8: 56
i=7,j=9: 63
i=8,j=0: 0
i=8,j=1: 8
i=8,j=2: 16
i=8,j=3: 24
i=8,j=4: 32
i=8,j=5: 40
i=8,j=6: 48
i=8,j=7: 56
i=8,j=8: 64
i=8,j=9: 72
i=9,j=0: 0
i=9,j=1: 9
i=9,j=2: 18
i=9,j=3: 27
i=9,j=4: 36
i=9,j=5: 45
i=9,j=6: 54
i=9,j=7: 63
i=9,j=8: 72
i=9,j=9: 81

For Scala

$ cat for.scala

for ( arg <- args ) {
println( arg )
}

$ scala for.scala foo bar baz quux hoge fuga piyo hogehoge foobar
foo
bar
baz
quux
hoge
fuga
piyo
hogehoge
foobar

List Scala

$ cat list-test.scala
val aList = List(1,2,3)
println( aList )
println()

val bList = List(4,5,6)
val newList = aList :: bList
println( newList )
println()

val yaNewList = aList ::: bList
println( yaNewList )
println( "The first one is " + yaNewList(0) )
println( "The last one is " + yaNewList(yaNewList.length -1) )
println(
"# of elements that are greater than 2: "
+ yaNewList.count( e => e > 2 )
)
println(
"The list that the leading two elements are eliminated: "
+ yaNewList.drop( 2 )
)
println(
"The list that the trailing three elements are eliminated: "
+ yaNewList.dropRight( 3 )
)
println(
"Whether or not the value 4 exists: "
+ yaNewList.exists( e => e == 4 )
)
println(
"Filtering data in a specific condition: "
+ yaNewList.filter( e => e < 4 ) ) println( "Checking if all the elements are positive: " + yaNewList.forall( e => e > 0 )
)
println(
"Processing all the elements by a particular logic: "
+ yaNewList.map( e => e * 10 )
)
println(
"Creating a new string from the list: "
+ yaNewList.mkString( ", " )
)
println(
"Sorting with some logic: "
+ yaNewList.sort( (s,t) => s > t )
)
println(
"Removing elements by a specified rule: "
+ yaNewList.remove( e => e % 2 == 0 )
)
println( "Head: " + yaNewList.head )
println( "Tail: " + yaNewList.tail )
println( "Last: " + yaNewList.last )

println()

$ scala list-test.scala
List(1, 2, 3)

List(List(1, 2, 3), 4, 5, 6)

List(1, 2, 3, 4, 5, 6)
The first one is 1
The last one is 6
# of elements that are greater than 2: 4
The list that the leading two elements are eliminated: List(3, 4, 5, 6)
The list that the trailing three elements are eliminated: List(1, 2, 3)
Whether or not the value 4 exists: true
Filtering data in a specific condition: List(1, 2, 3)
Checking if all the elements are positive: true
Processing all the elements by a particular logic: List(10, 20, 30, 40, 50, 60)
Creating a new string from the list: 1, 2, 3, 4, 5, 6
Sorting with some logic: List(6, 5, 4, 3, 2, 1)
Removing elements by a specified rule: List(1, 3, 5)
Head: 1
Tail: List(2, 3, 4, 5, 6)
Last: 6

Partially applied function

$ cat test2.scala
val list = List(3,5,60,12,-9,53)

list.foreach( x => println(x) )

println("")

list.foreach( println _ )

$ scala test2.scala
3
5
60
12
-9
53

3
5
60
12
-9
53

Abbreviated form of function Scala

$ cat Abbreviation.scala
val list = List(3,5,60,12,-9,53)

println (list)

println( list.filter( (x: Int) => x%3 == 0 ) )
println( list.filter( (x) => x%3 == 0 ) )
println( list.filter( x => x%3 == 0 ) )


$ scala Abbreviation.scala
List(3, 5, 60, 12, -9, 53)
List(3, 60, 12, -9)
List(3, 60, 12, -9)
List(3, 60, 12, -9)

Nested Function Scala ( Fungsi Bersarang )

One of the noteworthy features of Scala is that it supports nested function.

See below:

$ cat NestFunction.scala
object NestFunction {
def outside ( x: Int ) {
def inside ( x: Int ) : Int = {
if ( x > 10 ) ( x * -1 ) else ( x + 5 );
}

println ( x + " --> " + inside ( x ) )
}

def main ( args: Array[String] ) {
outside ( 1 )
outside ( 15 )
}
}

$ scalac NestFunction.scala && scala NestFunction
1 --> 6
15 --> -15

Switch Scala

$ cat Test1.scala
import scala.io._

def toInt(in: String): Option[Int] =
try {
Some(Integer.parseInt(in.trim))
} catch {
case e: NumberFormatException => None
}

val a = toInt("102");
println(a);
println("The value is " + a.get); // the value can be retrieved by Option#get

val b = toInt("A");
println(b);

$ scala Test1.scala
Some(102)
The value is 102
None

Array Scala

$ cat array-test.scala

val pets = new Array[String](4)

pets(0) = "Tama"
pets(1) = "Shiro"
pets(2) = "Chako"
pets(3) = "Butchie"

for( i <- 0 to 3 ){ println( i + ": " + pets(i) ) } $ scala array-test.scala 0: Tama 1: Shiro 2: Chako 3: Butchie Sumber : http://sites.google.com/site/playingwithscala/home/getting-started/scala-script--basis/data/array

Actor that transacts messages by specific types

$ cat Main.scala
import scala.actors.Actor._

object Main extends Application {
override def main ( args: Array[String] ) {
val a = actor {
loop {
receive {
case s:String => println ( "I got it! " + s )
case _ => println ( "Sorry..." )
}
}
}

a ! "HELLO!"
a ! 1.5
a ! 9876
a ! "HELLO!"
}
}


$ scalac Main.scala && scala Main
I got it! HELLO!
Sorry...
Sorry...
I got it! HELLO!


$ ls -1
Main$$anonfun$1$$anonfun$apply$2$$anonfun$apply$1.class
Main$$anonfun$1$$anonfun$apply$2.class
Main$$anonfun$1.class
Main$.class
Main.class
Main.scala

Sumber :

http://sites.google.com/site/playingwithscala/home/getting-started/actor/actor-that-processes-messages-by-specific-types

Java Vs Scala

Scala :

$ more *.scala *.java
::::::::::::::
JFrameTest.scala
::::::::::::::
import javax.swing.JFrame
import javax.swing.JFrame._

object JFrameTest {
def main(args :Array[String]) {
var win = new JFrame("Scala-based");

win.setSize(320,240)
win.setDefaultCloseOperation(EXIT_ON_CLOSE)
win.setVisible(true)
}
}

Java

::::::::::::::
JFrameTest2.java
::::::::::::::
import java.awt.*;
import javax.swing.*;

class JFrameTest2 extends JFrame {
JFrameTest2() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Java-based");
setSize(320, 240);
setVisible(true);
}
public static void main(String [] args) {
new JFrameTest2();
}
}

Compile Linux kernel 2.6


ompiling custom kernel has its own advantages and disadvantages. However, new Linux user / admin find it difficult to compile Linux kernel. Compiling kernel needs to understand few things and then just type couple of commands. This step by step howto covers compiling Linux kernel version 2.6.xx under Debian GNU Linux. However, instructions remains the same for any other distribution except for apt-get command.

Step # 1 Get Latest Linux kernel code

Visit http://kernel.org/ and download the latest source code. File name would be linux-x.y.z.tar.bz2, where x.y.z is actual version number. For example file inux-2.6.25.tar.bz2 represents 2.6.25 kernel version. Use wget command to download kernel source code:
$ cd /tmp
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-x.y.z.tar.bz2

Note: Replace x.y.z with actual version number.

Step # 2 Extract tar (.tar.bz3) file

Type the following command:
# tar -xjvf linux-2.6.25.tar.bz2 -C /usr/src
# cd /usr/src

Step # 3 Configure kernel

Before you configure kernel make sure you have development tools (gcc compilers and related tools) are installed on your system. If gcc compiler and tools are not installed then use apt-get command under Debian Linux to install development tools.
# apt-get install gcc

Now you can start kernel configuration by typing any one of the command:

* $ make menuconfig

- Text based color menus, radiolists & dialogs. This option also useful on remote server if you wanna compile kernel remotely.

* $ make xconfig

- X windows (Qt) based configuration tool, works best under KDE desktop

* $ make gconfig

- X windows (Gtk) based configuration tool, works best under Gnome Dekstop.

For example make menuconfig command launches following screen:

$ make menuconfig

You have to select different options as per your need. Each configuration option has HELP button associated with it so select help button to get help.

Step # 4 Compile kernel

Start compiling to create a compressed kernel image, enter:

$ make
Start compiling to kernel modules:

$ make modules

Install kernel modules (become a root user, use su command):

$ su -
# make modules_install

Step # 5 Install kernel

So far we have compiled kernel and installed kernel modules. It is time to install kernel itself.

# make install

It will install three files into /boot directory as well as modification to your kernel grub configuration file:

* System.map-2.6.25
* config-2.6.25
* vmlinuz-2.6.25

Step # 6: Create an initrd image

Type the following command at a shell prompt:
# cd /boot
# mkinitrd -o initrd.img-2.6.25 2.6.25

initrd images contains device driver which needed to load rest of the operating system later on. Not all computer requires initrd, but it is safe to create one.
Step # 7 Modify Grub configuration file - /boot/grub/menu.lst

Open file using vi:

# vi /boot/grub/menu.lst

title Debian GNU/Linux, kernel 2.6.25 Default
root (hd0,0)
kernel /boot/vmlinuz root=/dev/hdb1 ro
initrd /boot/initrd.img-2.6.25
savedefault
boot

Remember to setup correct root=/dev/hdXX device. Save and close the file. If you think editing and writing all lines by hand is too much for you, try out update-grub command to update the lines for each kernel in /boot/grub/menu.lst file. Just type the command:

# update-grub

Neat. Huh?
Step # 8 : Reboot computer and boot into your new kernel

Just issue reboot command:

# reboot

Sumber :

http://www.cyberciti.biz/tips/compiling-linux-kernel-26.html

Scala koneksi database

I'm starting to learn Scala. It's a statically- and strongly-typed functional language that compiles to Java byte code and integrates well with Java.

One of the things I'm struggling with is the language's strong static typing. Scala is nice in that it tries very hard to infer types. That means the programmer doesn't spend much time typing "wasteful" type declarations. If Scala didn't have that, I would have run away screaming already.

I've figured out how to connect to a MySQL database. There are a few database access methods that are being developed in Scala. The one that ships with the language is called "dbc". It comes with a PostgreSQL connection interface but no MySQL version. Here's my MySQL version along with some simple code that performs a select. (I'd move the connection information into a properties file if I were to really use this code.)

import scala.dbc._
import scala.dbc.Syntax._
import scala.dbc.syntax.Statement._
import java.net.URI

object MysqlVendor extends Vendor {
val uri = new URI("jdbc:mysql://localhost:3306/my_database_name")
val user = "my_database_user"
val pass = "my_database_password"

val retainedConnections = 5
val nativeDriverClass = Class.forName("com.mysql.jdbc.Driver")
val urlProtocolString = "jdbc:mysql:"
}

object BulkUploadRunner extends Application {
val db = new Database(MysqlVendor)

val rows = db.executeStatement {
select fields ("email_id" of characterVarying(32)) from ("bulk_uploads")
}
for (val r <- rows; val f <- r.fields) { Console.println(f.content.nativeValue) // or .sqlValue } db.close } Sumber : http://jimmenard.blogspot.com/2007/01/scala-baby-steps.html

Ebook Scala

1. Programming in Scala

2. Scala by Example

3. Scala IDE

4. Scala Intro Object

Scala


SEJARAH :

Scala adalah sebuah “general purpose programming language” artinya sebuah bahasa pemrograman yang digunakan untuk menyelesaikan masalah-masalah umum. Scala dirancang untuk mengekspresikan pola pemrograman biasa secara ringkas, elegan, dan tipe-cara aman. Scala mengintegrasikan fitur berorientasi objek dan bahasa-bahasa fungsional, memungkinkan Java dan pemrogram lain untuk menjadi lebih produktif.

Kode Java dan keterampilan pemrogram sepenuhnya dapat digunakan kembali. Program Scala berjalan di Java VM, Scala memiliki kode byte yang kompatibel dengan Java sehingga kita dapat memanfaatkan sepenuhnya library yang ada pada JAVA atau kode aplikasi yang sudah ada.

Pada tahun 2001 Scala lahir. Kompilator ditulis oleh Martin Oderskyyang juga menulis referensi Java compiler, yang digunakan oleh jutaan programmer Java hari ini. Martin Odersky, Profesor di EPFL, sangat menyadari rasa frustrasi yang dihadapi oleh programmer Java. Ia membentuk visi menerapkan pengetahuan terbaik dari penelitian akademis masyarakat terhadap masalah membuat pengalaman pemrograman Java lebih baik, bahkan menyenangkan. Pada gilirannya memungkinkan fusi alami dengan konsep-konsep pemrograman fungsional yang sangat penting untuk menangani concurrency.

KONSEP :

Scala adalah murni berorientasi obyek-bahasa dalam arti bahwa setiap nilai adalah obyek. Jenis dan perilaku objek yang digambarkan oleh kelas dan sifat. Kelas diperluas oleh subclassing dan fleksibel berbasis komposisi mixin mekanisme sebagai pengganti yang bersih untuk beberapa warisan.

Lebih jauh lagi, pengertian Scala pencocokan pola secara alami meluas ke pengolahan data XML dengan bantuan kanan-mengabaikan pola urutan. Dalam konteks ini, urutan comprehensions berguna untuk merumuskan pertanyaan. Fitur-fitur ini membuat Scala ideal untuk mengembangkan aplikasi seperti layanan web.

Scala ini dirancang untuk beroperasi dengan baik dengan populer Java 2 Runtime Environment (JRE). Secara khusus, interaksi dengan mainstream berorientasi obyek bahasa pemrograman Java adalah sebagai selancar mungkin. Scala memiliki model kompilasi yang sama (terpisah kompilasi, kelas dinamis loading) seperti Java dan memungkinkan akses ke ribuan yang ada perpustakaan berkualitas tinggi. Dukungan untuk. NET Framework (CLR) juga tersedia.

EDITOR :

Sedangkan untuk menulis syntax scala bisa menggunakan software editor eclipse 3.4.2

SUMBER :

http://www.scala-lang.org

Belajar Memprogram atau Belajar Pemrograman ?

Salah satu produk termutakhir saat ini adalah komputer. Apabila kita berbicara mengenai komputer, kita tidak bisa terlepas dari peranan perangkat lunak (software) yang menjadi jantung dan jembatan penghubung antara pengguna (user) dan perangkat keras komputer itu sendiri. Tanpa perangkat lunak, komputer hanyalah sebuah barang elektronik yang tidak berguna. Jika kita telusuri lebih dalam lagi, ternyata sebuah perangkat lunak itu terdiri dari ratusan, ribuan, bahkan jutaan digit biner. Namun berkat kemajuan pemikiran manusia sendiri, kode-kode tersebut diterjemahkan ke dalam bahasa-bahasa pemrograman yang mudah dimengerti dan mudah diingat.


Mempelajari teknik pemrograman tidaklah sesulit seperti yang kita bayangkan. Anggapan para calon programmer yang saat ini menganggap belajar pemrograman merupakan sesuatu yang sangat sulit adalah salah besar dan harus dihindari sejak dini, karena hal ini akan menyurutkan semangat dan menimbulkan sugesti yag kurang baik dalam proses pembelajarannya di kemudian hari. Dalam mempelajari teknik pemrograman diperlukan semangat dan motivasi yang tinggi, tetapi tidak cukup hanya itu, diperlukan juga suatu ketekunan, kesabaran serta semangat pantang menyerah, karena kita ketahui bersama di dunia ini tidak ada sesuatu yang instant, semuanya membutuhkan proses dan kerja keras, ibarat pepatah mengatakan “berakit-rakit ke hulu, berenang-renang ketepian, bersakit-sakit dahulu bersenang-senang kemudian”. Pepatah tersebut berlaku juga dalam proses pembelajaran teknik pemrograman, karena untuk menguasi suatu bahasa pemrograman dibutuhkan kerja keras yang sangat tinggi, namun jika kita telah menguasai suatu bahasa pemrogaman, kita akan merasa mudah untuk berpindah dari satu bahasa ke bahasa pemrogaman lainnya.

Selaku manusia yang dikaruniai akal dan kecerdasan, maka dalam mempelajari teknik pemrograman diperlukan suatu strategi yang jitu, sehingga proses pembelajaran akan semakin efektif.


Belajar memprogram sebenarnya adalah belajar berkomunikasi dengan sebuah perangkat, dalam hal ini adalah komputer. Untuk bisa berkomunikasi dengan perangkat tersebut, kita dituntut mempelajari bahasa komunikasi yang dimengerti perangkat tersebut, dalam hal ini adalah bahasa pemrograman. Jadi intinya, mempelajari teknik pemrograman adalah mempelajari bahasa pemrograman, meskipun para programmer professional mengatakan ” jangan mempelajari bahasa pemrograman, namun pelajarilah teknik pemrograman”, tetapi hal itu tidak berlaku di sini, seperti halnya dalam kehidupan manusia, jika sudah dapat berkomunikasi dengan menggunakan salah satu bahasa, maka teknik-teknik berkomunikasi tersebut akan dengan sendirinya mengikuti, dalam artian, sedikit-demi sedikit tujuan pembelajaran teknik pemrograman akan tercapai dengan mempelajari bahasa pemrograman.


Banyak pilihan bahasa pemrograman mana yang akan dipelajari, diantaranya C, C++, Pascal, Java, Basic, dan lain-lain. Setiap bahasa pemrograman memiliki prospek yang cerah dan memiliki reliabelitas yang tinggi. Namun disarankan untuk memilih bahasa pemrograman yang cenderung populer di masa kini, karena akan memudahkan dalam mencari referensinya di kemudian hari. Dalam hal ini disarankan menggunakan bahasa C, karena disamping banyak digunakan, referensinya pun banyak ditemukan di situs-situs internet.


Efesiensi proses pembelajaran akan tercapai jika pembelajaran dilakukan dengan melihat atau mempelajari contoh-contoh yang sudah ada, seperti apa yang dikatakan oleh Albert Einstein, yaitu : “proses pembelajaran hanya dapat dilakukan melalui contoh”. Pada tahap awal, hilangkan rasa malu untuk membuat progam “Hello World”, karena program ini merupakan modal dasar untuk terciptanya system perangkat lunak yang super kompleks. Intinya proses pembelajaran dimulai dari topik manajemen output, kemudian berlanjut ke manajemen input. Dalam hal ini dipelajari cara meminta dan membaca data masukan kemudian menampilkan data masukan tersebut sebagai output dari progam.


Berikutnya topik yang harus dikuasai setelah menguasai manajemen Input/Output adalah struktur penulisan program dalam suatu bahasa pemrograman secara umum. Kenali cara mendelarasikan variable, konstanta, dan struktur kode program secara umum. Walaupun dalam setiap bahasa pemrograman memiliki cara pendeklarasian program yang berbeda, namun pada dasarnya memiliki struktur yang sama. Sampai di sini, para calon programmer biasanya sudah memiliki kemampuan berkomunikasi dengan komputer, kalau dianalogikan manusia, bagaikan seorang anak yang sudah dapat berbicara namun belum mengenyam pendidikan TK. Untuk lebih memperdalam kemampuan, materi selanjutnya yang harus dikuasai adalah struktur pemilihan (selection). biasanya struktur ini terdiri dari dua jenis, yaitu “IF…Then..Else…” dan “Case…Of”. Struktur ini mutlak harus dikuasai oleh para calon programmer, karena setiap aplikasi yang akan dibuat tidak terlepas dari struktur pemilihan dan logika.


Dalam memprogram komputer, terdapat beberapa perintah yang diulang dengan tujuan tertentu. Missal untuk mendapatkan bilangan dari satu sampai dengan seribu, maka digunakan struktur perulangan. Pada pembelajaran struktur perulangan, seharusnya para programmer menikmati setiap contoh yang ada sekaligus mempelajarinya secara mendetail, karena struktu rini sangat menentukan efektifitas dan kecepatan program yang dibuat. Namun pada kenyataannya, para calon programmer mengalami kesulitan dalam mempelajari logika berpikir struktur perulangan itu sendiri, sehingga menimbulkan rasa malas. Hal ini seharusnya dapat diatasi dengan mempelajari contoh-contoh sederhana terlebih dahulu, kemudian dilanjutkan ke contoh yang lebih kompleks lagi. Berbagai sumber referensi telah banyak tersedia di situs-situs internet.


Sebagai modal dasar untuk memprogram, sebenarnya pemahaman sampai dengan struktur perulangan sudah cukup memadai untuk bisa mengkomunikasikan maksud atau pemikiran kita kepada komputer. Namun untuk meningkatkan efisiensi program yang dibuat, sebaiknya dipelajari juga struktur sub program tau sering disebut sebagai prosedur dan fungsi.


Dengan melakukan pembelajaran seperti di atas, sebenarnya para calon programmer telah menguasai teknik dasar pemprograman, karena latihan-latihan yang dilakukan dalam mempelajari sintaks (cara penulisan) dan struktur dari suatu bahasa pemrograman, telah memaksa mereka untuk berpikir secara teknik.


Jika para calon programmer telah mengusai salah satu bahasa pemprograman komputer, baru pepatah “pelajarilah teknik pemrograman dan jangan mempelajari bahasa pemrograman” sepenuhnya berlaku. Sebenarnya pepatah itu agar tidak bersyarat harus diperbaiki menjadi “pelajarilah teknik pemrograman sambil mempelajari bahsa pemrograman”. Jika dianalogikan teknik pemrogrman dengan peluru, maka bahasa pemrograman itu adalah senapan. Senapan tanpa peluru bisa digunakan walaupun fungsinya tidak terlalu dominan muncul, karena masih dapat digunakan untuk membela diri. Tapi jika peluru tanpa senapan adalah sia-sia. Karena tidak ada yang dapat dilakukan dengan menggunakan peluru tanpa senapan. Teknik pemrogrman pada awalnya adalah pelengkap bahasa pemrograman, namun karena teknik pemrograman utnuk setiap bahasa pemrograman adalah sama, maka semakin ke sini paradigma tersebut berubah menjadi ” bahasa pemrograman adalah pelengkap teknik pemrograman”.

Terkadang para calon programmer sering terjebak dengan paradigm baru tersebut. Mereka hanya berkutat dengan buku-buku textbook yang terfokus pada teknik pemrograman, tanpa menghiraukan bahasa pemrograman itu sendiri. Jadi bagaikan “menegakan benang basah”, sampai kapanpun mereka akan mengalami kesulitan untuk memulai berkomunikasi dengan komputer. Inti dari pembelajaran suatu bahasa, baik itu bahasa manusia maupun bahasa komputer adalah praktek. Jadi intinya adalah membiasakan diri dengan menggunakan bahasa tersebut.

Sumber :

http://blog.yw.web.id/programming/belajar-memprogram-atau-belajar-pemrograman