Call By Name and Call By Value in Scala

In Scala, function can evaluate arguments passed by name (called call-by-name) and by value (call-by-value), let’s take a look at the example below:

def something() = {
  println("calling something")
  1 // return value
}

Now lets define two functions that accept Int argument that are exactly the same except the one takes the argument call-by-value style (x: Int) and the other in a call-by-name style (x: => Int).

def callByValue(x: Int) = {
  println("x1=" + x)
  println("x2=" + x)
}

def callByName(x: => Int) = {
  println("x1=" + x)
  println("x2=" + x)
}

Now what happens when we call them with our side-effecting function?

scala> callByValue(something())
calling something
x1=1
x2=1

scala> callByName(something())
calling something
x1=1
calling something
x2=1

So you can see that in the call-by-value version, the side-effect of the passed-in function call (something()) only happened once. However, in the call-by-name version, the side-effect happened twice.

This is because call-by-value functions compute the passed-in expression’s value before calling the function, thus the same value is accessed every time. However, call-by-name functions recompute the passed-in expression’s value every time it is accessed.

Source : http://stackoverflow.com/questions/13337338/call-by-name-vs-call-by-value-in-scala-clarification-needed

Posted in scala

Symfony Learning Note (1)

Project structure

A symfony project is made of applications.

An application is devided into modules.

Symfony data model

1. Database schema:

# config/doctrine/schema.yml

2. Database:

$ mysqladmin -uroot -p create jobeet

Enter password: ********

$ php symfony configure:database

“mysql:host=localhost;dbname=jobeet” root mYsEcret

3. ORM (Object Relational Model)

a. Model

$ php symfony doctrine:build –model

For each table generate three classes:

1)      JobeetJob.php

An object of this class represents a single of record of the JobeetJob table. This class is empty by default.

2)      BaseJobeetJob.php

The parent class of JobeetJob. Each time you run command doctrine:build –model, this class is overwritten, so all customizations must be done in the JobeetJob class.

3)      JobeetJobTable.php

This class defines methods that mostly return collections of JobeetJob objects. This class is empty by default.

b. SQL (data/sql/)

$ php symfony doctrine:build –sql

c. Insert SQL

$ php symfony doctrine:insert-sql

d. All compelete command

$ php symfony doctrine:build –all –and-load

4. Module

$ php symfony doctrine:generate-module –with-show –non-verbose-templates frontend job JobeetJob

The layout

The decorator design pattern: the template is decorated after the content is rendered by a global template, called layout in symfony.

Helper function:

# apps/frontend/templates/layout.php

include_stylesheets() –> apps/frontend/config/view.yml

# apps/frontend/config/view.yml

stylesheets: [main.css]

has_layout: true

layout: layout –> decorates every page with layout.php

Configuration Principles in symfony

For many symfony configuration files, the same setting can be defined at different levels:

• The default configuration is located in the framework

• The global configuration for the project (in config/)

• The local configuration for an application (in apps/APP/config/)

• The local configuration restricted to a module (in apps/APP/modules/MODULE/config/)

View configuration

is made by one of or both:

1)      view.yml

2)      use_stylesheet()

The Action

Slots

Helper

<?php include_slot(‘title’) ?>

<?php echo get_slot(‘title’) ?>

<?php include_stylesheets() ?>

<?php echo get_stylesheets() ?>

Routing

Object route class

# jobeet\frontend\config\routing.yml:

job_show_user:

url:      /job/:company_slug/:location_slug/:id/:position_slug

class:    sfDoctrineRoute

options:  { model: JobeetJob, type: object }

param:    { module: job, action: show }

requirements:

id: \d+

sf_method: get

# jobeet\frontend\modules\job\template\indexSuccess.php:

object > route > url

<a href=”<?php echo url_for(array(‘sf_route’ => ‘job_show_user’, ‘sf_subject’ => $job)) ?>”>;

<a href=”/frontend_dev.php/job/sensio-labs/paris-france/1/web-developer”>Web Developer</a>

Or

<?php echo link_to($job->getPosition(), ‘job_show_user’, $job) ?>

<a href=”/job/sensio-labs/paris-france/1/web-developer”>Web Developer</a>

# jobeet\frontend\modules\job\actions\actions.class.php:

url > route > object

public function executeShow(sfWebRequest $request) {

$this->job = $this->getRoute()->getObject();

}

If you want to generate a URL from an action, you can use the generateUrl() method:

$this->redirect($this->generateUrl(‘job_show_user’, $job));

Route Debugging

$ php symfony app:routes frontend

$ php symfony app:routes frontend job_edit

More with the Model

Custom Configuration

# apps/frontend/config/app.yml:

all:

active_days: 30

in the application: sfConfig::get(‘app_active_days’)

Dynamic Fixtures

# data/fixtures/jobs.yml:

JobeetJob:

# Starts at the beginning of the line (no whitespace before)

<?php for ($i = 100; $i <= 130; $i++): ?>

job_<?php echo $i ?>:

JobeetCategory: programming

company: Company <?php echo $i.”\n” ?>

position: Web Developer

location: Paris, France

description: Lorem ipsum dolor sit amet, consectetur adipisicing elit.

how_to_apply: |

Send your resume to lorem.ipsum [at] company_<?php echo $i ?>.sit

is_public: true

is_activated: true

token: job_<?php echo $i.”\n” ?>

email: job@example.com

<?php endfor ?>

Secure the Job Page

# apps/frontend/config/routing.yml:

job_show_user:

url:      /job/:company_slug/:location_slug/:id/:position_slug

class:    sfDoctrineRoute

options:

model: JobeetJob

type: object

method_for_query: retrieveActiveJob

param:    { module: job, action: show }

requirements:

id: \d+

sf_method: [GET]

# lib/model/doctrine/JobeetJobTable.class.php:

class JobeetJobTable extends Doctrine_Table {

public function retrieveActiveJob(Doctrine_Query $q) {

$q->andWhere(‘a.expires_at > ?’, date(‘Y-m-d H:i:s’, time()));

return $q->fetchOne();

}

}

Final Thoughts

Playing with the Category Page

Whenever you start implementing a new feature, it is a good practice to first think about

the URL and create the associated route. And it is mandatory if you removed the default

routing rules.

  1. The category route: route.yml
  2. The category link: indexSuccess.php
  3. The category actions
  4. Job Category Module Creation: symfony generate:module frontend category
  5. Templates

The process to add a new feature to a symfony website is always the same:

1) think about the URLs,

2) create some actions,

3) update the model, and

4) write some templates.

Partials

// apps/frontend/modules/job/templates/_list.php:

<?php foreach ($jobs as $i => $job): ?>

// in apps/frontend/modules/job/templates/indexSuccess.php

<?php include_partial(‘job/list’,

array(‘jobs’ => $category->getActiveJobs(

sfConfig::get(‘app_max_jobs_on_homepage’)))) ?>

–          Is snippet of template code that can be shared among several templates

–          Starts with an underscore ( _ )

–          Include using include_partial(args1, args2)

–          First argument: [module name]/[partial name]. Eg. “job/list”

–          Second argument: an array of variables to pass to the partial

The Forms

How to:

  1. Define a widget: options, attributes
  2. Define validators for a widget: options, messages
    1. Logical operations of validators
    2. Pre and post validators
    3. Render a widget of a field: label, tag, error
    4. Render global errors
    5. Render hidden fields
Posted in symfony

symfony quickstart

From existing database and tables
– build schema
– build model

From yml schema file
– build model
– build sql
– insert sql

Posted in symfony

Merenungkan (kembali) Cita-Cita

Selamat pagi pak, selamat pagi bu,
ucap anak sekolah dengan sapaan palsu.
Lalu merekapun belajar sejarah palsu dari buku-buku palsu.
Di akhir sekolah mereka terperangah melihat hamparan
nilai mereka yang palsu. Karena tak cukup nilai, maka berdatanganlah
mereka ke rumah-rumah bapak dan ibu guru untuk
menyerahkan amplop berisi perhatian dan rasa hormat palsu.

Sambil tersipu palsu dan membuat tolakan-tolakan palsu, akhirnya
pak guru dan bu guru terima juga amplop itu sambil berjanji palsu
untuk mengubah nilai-nilai palsu dengan nilai-nilai palsu yang baru.
Masa sekolah demi masa sekolah berlalu, merekapun
lahir sebagai ekonom-ekonom palsu, ahli hukum palsu,
ahli pertanian palsu, insinyur palsu. Sebagian
menjadi guru, ilmuwan atau seniman palsu. Dengan gairah
tinggi mereka menghambur ke tengah pembangunan palsu
dengan ekonomi palsu sebagai panglima palsu. Mereka
saksikan ramainya perniagaan palsu dengan ekspor
dan impor palsu yang mengirim dan mendatangkan
berbagai barang kelontong kualitas palsu.

Dan bank-bank palsu dengan giat menawarkan bonus
dan hadiah-hadiah palsu tapi diam-diam meminjam juga
pinjaman dengan ijin dan surat palsu. Masyarakat pun
berniaga dengan uang palsu yang dijamin devisa palsu.
Maka uang-uang asing menggertak dengan kurs palsu
sehingga semua blingsatan dan terperosok krisis
yang meruntuhkan pemerintahan palsu ke dalam
nasib buruk palsu. Lalu orang-orang palsu
meneriakkan kegembiraan palsu dan mendebatkan
gagasan-gagasan palsu di tengah seminar dan dialog-
dialog palsu menyambut tibanya demokrasi palsu yang
berkibar-kibar begitu nyaring dan palsu.

Agus R. Sarjono 1998

Tagged with:
Posted in blog.me

Tangan Tuhan di Balik Virus Flu Burung

Generasi ini memang butuh cerita. Tapi bukan cerita membosankan yang dilakonkan melalui pelajaran sejarah di bangku sekolah yang tak lain hanya untuk menjawab pertanyaan tentang siapa dan kapan. Ibu Siti Fadilah Supari melalui bukunya, ‘Saatnya Dunia Berubah’, ternyata lebih tahu bagaimana seharusnya sejarah diajarkan. Dengan gaya penulisan yang cenderung santai namun kental nuansa heroik, singkat tak bertele-tele tapi tegas, sederhana namun syarat makna akan perjuangan martabat manusia, beliau menorehkan dengan tangannya sendiri sejarah emas bangsa Indonesia. Catatan harian yang bukan sekedar kisah kronologis melintasi ruang dan waktu, melainkan dengan emosi memutar kembali memori dalam kepala untuk menjadi lukisan baru sejarah.

Ahh, alangkah indahnya jika sejarah perjuangan kemerdekaan negara misalnya, dikisahkan sebagaimana Ibu Siti menuturkan perjuangannya. Maka sejarah tak akan menjadi sekedar kumpulan nama dan angka. Toh buku-buku pelajaran sejarah itu tidak akan menurun kualitasnya gara-gara ditulis seolah buku harian pejuang Soekarno, atau Bung Hatta, atau Panglima Sudirman. Yaa, sejarah benar-benar akan mengasyikkan. Semangat, inspirasi, inovasi, ide, cita-cita, hikmah, atau bahkan muslihat dan intrik menjadi pesan utama yang harus disampaikan kepada generasi muda tentang sejarah bangsanya.

Apakah sebenarnya yang diperjuangkan Ibu Siti? Prasangka dengan mudah bisa saja mendakwa, wild virus yang nantinya dijadikan seed virus sebagai tahap awal menemukan vaksin, bisa dijadikan senjata untuk meraup keuntungan sebesar-besarnya. Dijual dengan harga tinggi kepada produsen vaksin, dan bagi hasil yang menjanjikan dari hasil penjualan vaksin. Prasangka ini bisa saja benar, sebab memang salah satunya ini yang diperjuangkan. Namun, bukan ini yang menjadi taruhan utama Ibu Siti. Keadilan dan kesetaraan. Ya, inilah yang menjadi alasan utama.

Selama ini, lingkaran setan ‘Circulus Vitiosus’ dalam distribusi virus flu burung dan vaksinnya telah menjadi alat imperialisme negara maju terhadap negara miskin/berkembang, terutama yang terjangkit virus. Lingkaran setan ini bermula saat negara yang terjangkit virus H5N1 harus mengirimkan sample virusnya ke WHO CC (Collaborating Center), tempat dilakukannya risk assessment. Hanya ada 4 WHO CC di dunia ini, yaitu di London, Melbourne, Tokyo, dan Atlanta. Demikian ketat syarat untuk mendirikan WHO CC, yang jelas negara-negara berkembang, miskin apalagi, hampir tidak mungkin untuk memiliki WHO CC.

Apa yang terjadi…

Tagged with: , , ,
Posted in Resensi

Past Chat: Hakikat bugs..

5:20 PM mas nofan…
5:21 PM Nofanto: apa bid?
me: kalo dari pgalaman, ksalahan palilng gawat yang pernah apa mas..?
pas implementasi gitu
Nofanto: lha selama lbu ini masa g ada kesalahan sih?
5:22 PM hmm.. brarti lbu ini lancar2 aja ya
me: mksdnya penglaman mas nofan sndiri..
5:23 PM Nofanto: g ada yg gawat sih..
me: wuish…
hahaha
Nofanto: paling susah implementasi ya lbu ini..
clientnya kan banyak..
me: karena?
Nofanto: 2000 bank hehehe
5:24 PM me: susah sosialisasinya ya, harus datengin satu2…
Nofanto: biasanya sih cmn implementasi di satu tempat sj..
me: haah
Nofanto: ato satu server dipake banyak tempat..
intinya klo ada bug fix g sbrapa susah dibandingkan sm lbu client
5:25 PM tapi faktor sukses implementasi itu harus tekan bugs seminimal mungkin..
me: huumm…
5:26 PM Nofanto: klo dah ngerti haikat bugs itu apa .. gampang bgt tuh hehehe
me: wukakakaa… ampun dah
sampe hakikat bugs sgala
5:27 PM Nofanto: lho… harus tau rootnya bid..
sejarah pasti akan berulang hehehe
daripada memprediksi masa datang.. lebih baik belajar dari masa lalu hehehe
me: hm, betul2…
5:28 PM mantab2.. bener sekali guru..:D
Nofanto: iya lah..
kmu baru masuk sekolah ..aku dah pegang komputer hehehe
me: whuaaa…
5:29 PM Nofanto: dah hapal apa yg dicari org dg sistem terkomputerisasi hehehe
me: mksdnya?
Nofanto: apapun software/sistem komputernya… tujuannya cmn satu.. hehehe
5:30 PM me: what that…
Nofanto: membantu pengguna😀
5:31 PM tenang saja bid..
implementasi konversi pasti aman kok😀
me: aman, ? karena?
5:32 PM Nofanto: infrastrukturnya dah mumpuni tuh..
me: hehee.. mantab2..
Nofanto: buat nyelesaiin tugas..
pondasi harus mantap..
harus ada kerangka..
5:33 PM me: ya ya..
Nofanto: formconversionbase nya kan dah mantap tuh hehehe
ditambah converterbase😀
5:34 PM me: emang ngukurnya dari apa mas?
Nofanto: gampang..
dilihat dari class hirarkinya..
me: trus..
5:35 PM Nofanto: smakin banyak diturunin.. biasanya makin baik tuh..
abstraksinya dah dpt..
me: owwhh…
makin banyak diturunin?
Nofanto: klo abstraksinya dah dpt.. brarti penguasaan materinya jg mantap
5:36 PM me: hmm…
Nofanto: iya.. smakin banyak diturunin
dan code2nya kebanyakan di base classnya..
intina bgini bid..
5:37 PM mulai skrg klo nulis code harus dipikirin supaya programmer lain gampang makainya
5:38 PM me: wuuhh… betol2..
Nofanto: gampang customize tanpa harus ngedelete code yg telah kmu buat
latihan itu dulu.. hbs itu baru beranjak ke dsign API
me: ya ya…
5:39 PM Nofanto: klo dapat sih.. hbs ini ada project .net baru..
web-based jg..
me: ohya??
dimana??
Nofanto: freeport
me: owhh..
gede juga?
kyk lbu?
Nofanto: ntar kmu bisa ditarik deh..
5:40 PM pake enginenya LBU..
tapi ada enhancement di core2nya
me: wow… projectny mirip?
Nofanto: bisnisnya beda bgt..
me: bukan laporan2 gini?
Nofanto: tapi frameworknya lbu bisa akomodir kok
5:41 PM bukan lah..
me: mining support?
Nofanto: bikin reservasi penerbangan..
kayak site2nya maskapai gitu
me: heh??? huaaa, keren tuh…
5:42 PM (ga tau keren kenpa)
Nofanto: ya lumayan lah project nya bisa buat matengin framework .net yg ada..
5:43 PM rencanaku sih ntar frameworknya dioptimize lg..
object modelnya dire-design biar lbh intuitive dan secure hehehe
me: mangstab2…
5:44 PM Nofanto: kan skrg ini yg masterpresenter agak g intuitive tuh..
me: object model tu yang mana mas?
Nofanto: trus dataaccessnya kurang secure jg
objectmodel itu kaya cara kmu menggunakan class2 yang ada..
5:45 PM klo kmu pake presenter2 kan msh sering bingung tuh..
mgkn harus di design ulang biar agak lbh friendly buat novice programmer hehehe
5:46 PM biar g susah2 cari org buat ngerjain hehehe
5:47 PM me: hehehe…
“novice programmer” suka nyusain emang
tanya2 mulu…
5:48 PM hhehee,maklum namanya juga belajar
Nofanto: seharusnya g perlu belajar mestinya bisa..
klo frameworknya mantap hehehe
kmu msh sering bingung pas make presenter2?
5:50 PM me: hehee… ya begitulah🙂
5:51 PM Nofanto: tenang saja… ntar klo versi selanjutnya mestinya lbh mudah kok
me: bisa seharian ngutak-ngatik presenter aja
hrs ngerti page, control, presenter…
Nofanto: dokumentasinya kurang ya..
g sempat bikin sih..
5:52 PM me: cari orang buat bkin?
Nofanto: yg msh ngerti tuh felix sm adhi hehehe
ntar aja klo versi selanjutnya..
minta dokumenter ke p juf hehehe
5:55 PM me: karena programmer never writes docs ?
hehee
5:56 PM Nofanto: sblm ada facebook mmg suatu keharusan tuh nulis doc hehehe
me: hah?? mksdnya?
5:57 PM Nofanto: klo skrg sih.. drpada nulis doc mending update status hehehe
5:58 PM me: wukakakkaa.. asem..😀

Tagged with:
Posted in blog.me

Attach database using sqlcmd

USE [master]
GO
CREATE DATABASE [database_name] ON
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\<database name>.mdf' ),
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\<database name>.ldf' )
FOR ATTACH ;
GO

Atau cara lain:

use master

go

sp_detach_db '<databasename>'

use master
go
sp_attach_db '<databasename>','path\to\mdf','path\to\ldf'
go

Tagged with: ,
Posted in CodeLog