Getting Groovy With "with" Thursday, November 13, 2008

UPDATE 12/15/2008: I committed a change yesterday that changes the behavior of the .with method to use DELEGATE_FIRST as the resolveStrategy instead of OWNER_FIRST. If you are not sure what that means, you should by the end of this post.

Strange enough title.

Let's start with a hypothetical conversation between a geeky developer and his much less geeky wife:


Jeff: Betsy, how are you?

Betsy: I am fine thanks. How are you?

Jeff: Betsy, I am fine thank you.

Betsy: Great.

Jeff: Betsy, you know my birthday is the day after tomorrow right?

Betsy: Yes, I haven't forgotten. You mention it about 9 times a day you know.

Jeff: Betsy, yes I know. Are we going to have an ice cream cake?

Betsy: Yes, I think that would be good.

Jeff: Betsy, are you going to buy me the new Opeth DVD?

Betsy: I will get it for you but that music sucks big time.

Jeff: Betsy, that is awesome. Thank you.

Betsy: Why do you keep saying "Betsy" at the beginning of every sentence?

Jeff: Betsy, I guess I am used to inflexible languages which aren't very expressive.


Um, what does any of that have to do with Groovy? Well, lets talk about the problem with this conversation (aside from the lady's lack of appreciation for Swedish heavy metal). What is wrong is Jeff begins each sentence with "Betsy". Why might he do that? One reason is so Betsy knows that he is talking to her. Clearly this isn't necessary. It isn't necessary because she already knows he is talking to her. A context has been established which makes the addressing unnecessary. Jeff began the conversation by addressing Betsy, they probably made eye contact and were in close proximity. Once the conversation started, there isn't much question about who each sentence is being directed to.

Again, what does any of that have to do with Groovy? Lets press on...

Consider the following Java code which prints out a specific date.


// PrintIndependenceDay.java

import java.util.Calendar;
import java.util.Date;

public class PrintIndependenceDay {

public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.MONTH, Calendar.JULY);
calendar.set(Calendar.DATE, 4);
calendar.set(Calendar.YEAR, 1776);
Date time = calendar.getTime();
System.out.println(time);
}
}


Groovy developers can look at that and find quite a bit of noise that doesn't really have anything to do with what the code is trying to do but I want to focus on one specific thing. That one thing is all of the interaction with the calendar variable. Notice that we call clear() on the calendar, then call set() several times and later call getTime() on that same variable. All of those calls are prefixed with "calendar." so the compiler knows what we want to do. If we called "clear()" instead of "calendar.clear()", what would that mean? Are we calling the clear() method in this class? If that was our intent, it would not work because there is no clear() method. We have to prefix the call with an object reference so the compiler knows where to send the request. That seems to make sense. However, if we are going to do a bunch of things "with" the same object, wouldn't it be kind of nice if we could somehow do all of those things without all the repetition. Specifically, it might be nice if we could get rid of all of those "calendar." prefixes.

On to Groovy...

The following Groovy code does the same thing that the Java code above does.


// PrintIndependenceDay.groovy

def calendar = Calendar.instance
calendar.with {
clear()
set MONTH, JULY
set DATE, 4
set YEAR, 1776
println time
}


Wow. That is a good bit cleaner than what we started with. Part of the reason for that is we were able to get rid of all of those "calendar." prefixes. What allowed us to do that is calling the "with" method on the calendar object and passing a closure as an argument. What we have done there is establish a context that says "do all of this stuff with this calendar object". When the closure executes, the calendar is given an opportunity to respond to method calls like clear() and set() and the implicit call to getTime() when referring to the "time" property which is being passed to println. Likewise, the references to MONTH, JULY, DATE and YEAR properties are also being handled by the calendar object.

That is pretty slick. Lets dig just a little deeper to get a little better understanding of what is really going on.

Groovy closures have a delegate associated with them. The delegate is given an opportunity to respond to method calls which happen inside of the closure. Here is a simple example:


// define a closure
def myClosure = {
// call a method that does not exist
append 'Jeff'
append ' was here.'
}

// assign a delegate to the closure
def sb = new StringBuffer()
myClosure.delegate = sb

// execute the closure
myClosure()

assert 'Jeff was here.' == sb.toString()


When the closure is executed, those calls to append() in the closure end up being sent to the delegate, the StringBuffer in this case.

Something similar is happening in the Groovy calendar code above. A closure is being passed to the with() method. That closure is calling methods like set() and getTime() which don't really exist in that context. The reason those calls don't fail is the with() method is assigning a delegate to the closure before it is executed. The delegate being assigned is the object that the with() method was invoked on. In the calendar example, the delegate is the calendar object. Something like this is happening...


def closure = {
clear()
set MONTH, JULY
set DATE, 4
set YEAR, 1776
println time
}
def calendar = Calendar.instance
closure.delegate = calendar
closure()


This code does the same thing as the first Groovy example. Obviously the first one is cleaner.

I sort of lied a bit, or at least left out a detail that may be significant. The closure that is being passed to the with() method is really being cloned and it is the clone that is assigned the delegate and executed. This is a safer approach than monkeying with the original closure. If the reasons for that aren't clear, the explanation is another story.

Another bit of info that is missing here is the strategy that a closure uses to decide when to send method calls to the delegate. Each Groovy closure has a resolveStrategy associated with it. This property determines how/if the delegate comes in to play. The 4 possible values for the resolveStrategy are OWNER_FIRST, DELEGATE_FIRST, OWNER_ONLY and DELEGATE_ONLY (all constants defined in groovy.lang.Closure). The default is OWNER_FIRST. Consider the owner to be the "this" wherever the closure is defined. Here is a simple example...


class ResolutionTest {

def append(arg) {
println "you called the append method and passed ${arg}"
}

def doIt() {
def closure = {
append 'Jeff was here.'
}

def buffer = new StringBuffer()

closure.delegate = buffer

// the append method in this ResolutionTest
// will be called because resolveStrategy is
// OWNER_FIRST (the default)
closure()

// give the delegate first crack at method
// calls made inside the closure
closure.resolveStrategy = Closure.DELEGATE_FIRST

// the append method on buffer will
// be called because the delegate gets
// first crack at the call to append()
closure()
}

static void main(String[] a) {
new ResolutionTest().doIt()
}
}


So you see how the with() method helps establish a context where a bunch of things may happen "with" a specific object without having to refer to that object over and over. This can help clean up code like the Java code we started with. This approach can also be really useful when building a domain specific language in Groovy, a topic for another time.

Enjoy! :)

161 comments:

Ken Sipe said...

This is great information and funny as heck!

robpatrick said...

Jeff, great post thanks.
Jeff, really enjoyed it.

Ronald Pieterse said...

Good stuff, Jeff. And Opeth Rocks btw :-) Gonna see them next week in Amsterdam.

Jeff Brown said...

robpatrick: Funny! Thanks.

ronald: Thanks. I hope you enjoy the show. I saw them most recently a few weeks ago here in St. Louis. Good stuff!

Anonymous said...

NEWS FLASH: Jeff Brown shows Matt Taylor yet another Groovy language feature he can no longer live without.

Mario said...

I find this kind of programming very intuitive. Ruby 1.9 introduces a new method to the Object class called instance_exec which allows you to do this same kind of thing. I abhor typing so I think with is a better method name than instance_exec. *sigh*

Josh Stone said...

Mario:

Try this:

class Object
  def with(&b)
    self.instance_exec(&b)
  end
end

Jim Shingler said...

Darn it, . . . ;-) now I have to go back and simply some of my code.

Very Nice!


Thanks for the tip

Jim

Ammad Zafeer said...

with all the plugins there are on grails.org, is there one for admin to change the theme instead of storing it in a cookie with "Skinnable" plugin. i have been looking for something like that for sometime. maybe you can guide me in the right direction. thanks

p.s. this was really funny!

Anonymous said...

Nice one Jeff. I have never used with() in groovy to this day. I knew it was there but... thought there were some issues with scoping.

Anyway, all I can say is LONG LIVE PASCAL man. Groovy rocks, but Pascal is the daddy. Pascal had "with" back in the 80s!

...and Pascal sets and ranges are still superior to anything we have these days... except perhaps the limit to 32/64bit range/members on the sets and ranges eh :)

Right I'm off to write a dynamic version of Delphi. We could call it Dynamic Pascal. Or Dyphi. Or Daphne.

James E. Ervin, IV said...

That is a nice example, also gave me a better understanding of Closures. I admit I have been just using them without understanding much. I know I have dealt with this in Java by using return values, if the method (particularly a setter) returns void, have it return the object it refers to. Makes the code cleaner, but will not help with the other 99.99999% of Java code that has already been written. Sigh makes me wish to use Groovy in my development work more. Need to work on getting Eclipse PDE working better with Groovy so that I can.

James E. Ervin, IV said...

Also be nice to get some IDE support for this, thanks for the article you got my brain cells charged and running.

Katie said...

Nah, I still think the major problem is the lack of appreciation of Swedish metal. ;)

Lee Grey said...

Jeff, I thought your post was going to solve my dilemma, but it didn't help. I'm trying to figure out how to access "this" at evaluation time, not closure creation time.

For example, I create a dynamic getter and setter by adding them to the metaClass. But when the getter or setter is evaluated, I can't access fields of the object whose property is being accessed, because "this" was locked down when the closure was first created.

If this doesn't make sense, there's a thread named Combining evaluate with MOP on the groovy-user mailing list where I've posted broken code. :-)

I sure could use a solution to this. I'm confident I'm doing something wrong. I just don't know how to fix it.

BTW, I enjoyed your presentation last time you were at Atlanta JUG.

Mykola Golubyev said...

Thanks for this post.
I've just tried

someobject.with { myclosure() }

where 'myclosure' tried to call methods of 'someobject' and it didn't work.

But with
myclosure.delegate = someobject
myclosure()
it does. This is awesome.

Anonymous said...

酒店打工 酒店兼職
台北酒店 打工兼差 酒店工作
酒店經紀 禮服店
酒店兼差 酒店上班 酒店PT 酒店酒店喝酒 酒店消費 喝花酒 粉味

Webmaster said...

Sun Java is one of the most flexible platform for application development Sun Java development gives the way to develop complex applicaton development.

Anonymous said...

角色扮演,
睡衣,
SM,
潤滑液,
情趣玩具,
愛愛,

情人趣味用品,
情人趣味千奈,
情人趣味愛戀,
情趣味用品,
情趣用具,

跳蛋,
G點,
按摩棒,
跳蛋,
飛機杯,
充氣娃娃,
自慰套,
情趣娃娃,
自慰器,
情趣用品,情趣,

viagra online said...

hahah the conversation kills me xD!
It's like a conversation between, php and oracle... who can understand that, because like the guy there's not point in saying a name at the begining of every sentence ? now there's any kind of logic of doing it ? what you think ?

Einar Jónsson said...

Great post, I'm definitely going to start using the with() method more in my Groovy code.

P.S. The new Opeth DVD (Royal Albert Hall) is excellent ;-)

Nirav Assar said...

Jeff, there is also an identity closure that people used for setters and so on for objects. What is the difference between with and identity. Thankss

Nirav Assar said...
This comment has been removed by the author.
seositeden.blogspot.com said...

Thanks for your article, quite useful piece of writing.

limo service in EAST Brunswick said...

Thanks for your post, I like this post very much.

Logo Design Company said...

This is one of the most incredible blogs I have read in a very long time. Your blog is great for anyone who wants to understand this subject more. Great stuff.
Brochure Design

Abby said...

WAO its totally indifferent i'm so impressed the way you presented this

Buy Acne creams said...

Great tips, many thanks for sharing. I have printed and will stick on the wall! I like this blog.

maquinas de coser said...

There are some very great sources here and thank you for being so kind to post them here.

maquinas de bordar

Natural supplements said...

I agree with you. This post is truly inspiring. I like your post and everything
you share with us is current and very informative, I want to bookmark the page
so I can return here from you that you have done a fantastic job ...

Natural supplements

Natural supplements said...

I had a great time reading your article and I found it interesting.
This is such a beautiful topic that my friends are talking about. Thanks
for this blog, we are enlightened.

Natural supplements

best over the counter sleep aid said...

This is one of the most incredible blogs I have read in a very long time. Your blog is great for anyone who wants to understand this subject more. Great stuff; please keep it up!

ignition lock said...

Thanks for your marvelous posting! I actually enjoyed reading it, you will be a great author.I will ensure that I bookmark your blog and will come back in the foreseeable future. I want to encourage that you continue your great job, have a nice weekend!think you’ve made some truly interesting points

organic supplements said...

nice to see it thanks for sharing it

Unknown said...

Great stuff Buy Aldara Cream . The information and the detail were just perfect. Order Biltricide 600mg think that your perspective is deep, its just well thought out and really fantastic to see someone who knows how to put these thoughts down so well. Great job on this.

Locksmith Washington DC said...

I am very happy to be here because this is a very good site that provides lots of information about the topics covered in depth.

city locksmith said...

Great information & Funny,I like this Blog,thanks for sharing.

floridagator forum said...

Absolutely fantastic topic! Great blog. Thanks for taking the time and writing this

[url=http://www.gatorsportsnation.com]floridagator forum[/www.gatorsportsnation.com]

laptop repair melbourne said...

I am speechless after seeing these pictures! I love them all! I teach kindergarten and I'm going to make a theme, and photographs have given me so many ideas! You are so talented! Thanks!

laptop screen fix melbourne said...

You will be missed.The one place where as a venue and fan I could search by what ever perimeters I chose .Good Luck with your future endeavors.

melbourne pc repair said...

I am speechless after seeing these pictures! I love them all! I teach kindergarten and I'm going to make a theme, and

photographs have given me so many ideas! You are so talented! Thanks!

Paxil SSRI said...

Your web site is nice really, I actually have seen your post which was terribly informative and extremely entertaining on behalf of me. Thanks for posting extremely Such Things. I ought to suggest your web site to my friends. Cheers.

geetha said...

) Ecorptrainings.com provides GROOVY in hyderabad with best faculties on real time projects. We give the best online trainingamong the GROOVY in Hyderabad. Classroom Training in Hyderabad India

Anonymous said...

I agree with this article completely, I must thank you for posting such helpful facts.writing essay

Anonymous said...

Always so interesting to visit your site.What a great info, thank you for sharing. this will help me so much in my learning.custom logo design service

Anonymous said...

This blog is very useful information for me and guidance.support in dissertation , thesis provider , writing service , pay for accounting help , uk university , written papers

niki194 said...

What could be better than having some extra cash when traveling? A payday loan site comes in handy for instant no credit approval and for a loan of upto $1500.

http://www.paydaycashloansnow.com/

niki194 said...

What could be better than having some extra cash when traveling? A payday loan site comes in handy for instant no credit approval and for a loan of upto $1500.
PAYDAY LOAN

Fitz said...

@Marc Palmer: Thank you! I thought I was going crazy, because I was certain that there was a with token in Java, but I must have been remembering my Pascal/Delphi days! I remember spending $55 at the University bookstore for a copy of Turbo Pascal and developing console applications. I didn't have the $80 for Turbo Pascal for Windows, which came out within a few weeks of me buying my copy of Turbo Pascal. LOL

High School Diploma Online said...

Good work thanks for sharing really appreciate.

Unknown said...
This comment has been removed by the author.
Anonymous said...

This is great information provided blogspot
SAP Successfactors Online Training
Get SAP Successfactors Online Training by Certified consultant from India. Enroll for Expert level Instructor Led Online SAP SuccessFactors Training. Apply today!

Unknown said...

W3 D Technologies is a pioneer in Dell Boomi Training sector, providing the Dell Boomi Online Training course we have experienced expert faculty for Dell Boomi

Dell Boomi Online Training | Dell Boomi Certification Course

Anonymous said...

We are offering Dell Boomi Online Training with latest techniques. Our experts have more than 8 years experienced and certified.
Dell Boomi Online Training

Anonymous said...

nice blog

Anonymous said...

Online training SAP Hybris

Unknown said...

We are offering Dell Boomi Online Training with latest techniques. Our experts have more than 8 years experienced and certified.
Dell Boomi Online Training

navya said...

Interesting Article

Java Online Training from India | Core Java Training Online

Java Online Training | Java EE Online Training

Unknown said...

Interesting article......We provide the cool gadgets...for more detail click here Cool Gadgets | Electronics Gadgets | Latest Technology

Oracle Fusion said...

Good content in this post and site. We need more fresh and good content like this. Thanks for giving such a wonderful article...........
R12 SCM Training

ERP said...

This post is very informative for everybody. I would like to appreciate your work for good
accuracy and got informative knowledge from here. Nice effort, very informative, this will
help me to complete my task. Thanks for share it keep it up.

from

Oracle Fusion HCM Online Training

ERP said...

we have almost all country students as our subscribers for online course.We have 10+ years of experience we can serve various ascent people. oracle fusion Cloud HCM online training at erptree.com is worlds best online training center. we have excelent knowledge sharing Platform we have user friendly website where you will be provided with all the required details and Self-paced DEMO videos. we have our branches in pune, gurgaon, noida, india, usa, uk, uae, oracle fusion hcm training, fusion Procurement training, fusion hcm, scm training.


Oracle fusion HCM Online Training

Oracle Fusion HCM Training

oracle34 said...

I agree with this article completely, I must thank you for posting such helpful facts
IgoFusion

jobs said...


Very good information.

Mobile repairing

training

jobs said...


Best blog .

Laptop repairing

training in hyderabad

Unknown said...

This is just the kind of information that I had been looking for a long time..............................Search for Oracle Project Accounting Training Institute details in our local search engine Calfre.

Rajesh said...

I am really enjoying reading your well-written articles. It looks like you spend a lot of effort and time on your blog. I have bookmarked it and I am looking forward to reading new articles. Keep up the good work.

Oracle Financials Training in Hyderabad

ananthinfo said...

nice post..ERP for textile solution
SAP BUSINESS ONE for textile solution

Sannihitha Technologies said...

Thanks for sharing this valuable information to our vision.

Unknown said...

Pretty article! I found some useful information in your blog, it was awesome to read, thanks for sharing this great content to my vision, keep sharing.
Oracle Fusion SCM Training

Unknown said...

Nice Post..Thanks for Sharing..
erp in chennai
erp providers in chennai
SAP B1 support chennai
SAP S/4 Hana support chennai
SAP R3 support chennai
hr outsourcing

ananthinfo said...

nice post..Retail Software Solution Chennai
Retail Software Companies in Chennai
ERP Solution Providers in Chennai

Sannihitha Technologies said...

I have discovered your blog today and I love it!!
You make very beautiful things and your tutorials are very good.
I will add your blog to my list. Congratulations for your works.
quickbooks training in hyderabad

siva said...

This is an awesome post.Really very informative and creative contents. These concept is a good way to enhance the knowledge.
I like it and help me to development very well.Thank you for this brief explanation and very nice information.Well, got a good knowledge.
Java training in Indira nagar
Java training in Rajaji nagar
Java training in Marathahalli
Java training in Btm layout
Java training in Marathahalli

Unknown said...

read online info.

service care said...

Thanks for such a great article here. I was searching for something like this for quite a long time and at last, I’ve found it on your blog.thanks for sharing
honor mobile service centre in Chennai
honor service center near me
honor service
honor service centres in chennai
honor service center velachery
honor service center in vadapalani

vishwa said...

This is most informative and also this post most user friendly and super navigation to all posts... Thank you so much for giving this information to me..
lenovo mobile service centre in chennai
lenovo service center in velachery
lenovo service center in porur
lenovo service center in vadapalani

Darshana M said...

You have provided an nice article....Thanks for sharing..

Java Training | Java Training Institute | Java Training in Chennai | Java Training Institute in Chennai

Tableau Training | Tableau Course | Tableau Training in Chennai | Tableau Course in Chennai

service care said...

Wow !! Really a nice Article. Thank you so much for your efforts. Definitely, it will be helpful for others. I would like to follow your blog. Share more like this. Thanks Again
redmi service center in velachery
redmi service center in t nagar
redmi service center in vadapalani

service care said...

Amazing article. Your blog helped me to improve myself in many ways thanks for sharing this kind of wonderful informative blogs in live. I have bookmarked more article from this website. Such a nice blog you are providing.
mobile service center chennai
mobile service centre near me
mobile service centre chennai
best mobile service center in chennai
best mobile service center in chennai

service care said...

Your blog’s post is just completely quality and informative. Many new facts and information which I have not heard about before. Keep sharing more blog posts.
coolpad service center chennai
coolpad service center in chennai
coolpad service centre chennai

service care said...

This is the exact information I am been searching for, Thanks for sharing the required infos with the clear update and required points.
apple service center chennai
apple service center in chennai
apple mobile service centre in chennai
apple service center near me

service care said...

Hi! Thank you for the share this information. This is very useful information for online blog review readers. Keep it up such a nice posting like this.
mobile service centre chennai
best mobile service center in chennai
best mobile service center in chennai

spot said...

Amazing article. Your blog helped me to improve myself in many ways thanks for sharing this kind of wonderful informative blogs in live. Kindly Visit Us @
Andaman tour packages
Andaman holiday packages
Andaman tourism package
family tour package in Andaman
Andaman tourism package

Openstack Training said...

Nice post..Keep on sharing....
Openstack Training
Openstack Certification Training
OpenStack Online Training
Openstack Training Course
Openstack Training in Hyderabad

MS Azure Training in Hyderabad said...

Thanks for delivering a good stuff.....
Openstack Training
Openstack Certification Training
OpenStack Online Training
Openstack Training Course
Openstack Training in Hyderabad

Venkatesh CS said...

Excellent Blog. Thank you so much for sharing.
best react js training in chennai
react js training in Chennai
react js workshop in Chennai
react js courses in Chennai
react js training institute in Chennai
reactjs training Chennai
react js online training
react js online training india
react js course content
react js training courses
react js course syllabus
react js training
react js certification in chennai
best react js training

Anonymous said...

nice blog
get best placement at VSIPL

digital marketing services
Web development Services
seo network point

Anonymous said...

Nice post
For the best Data science training in Bangalore, Visit:
Data Science training in Bangalore

Buy Viagra online said...


Erectile dysfunction is a condition where a man is not able to get an erection. Even if they are able to get an erection, it does not last for too long. Suffering from erectile dysfunction can affect the person both physically and mentally. Therefore a person needs to take medical help to make the condition better. Also suffering from erectile dysfunction can affect the relation of the person with their partners. The medication that has brought about a wave of change in this field is the use of Viagra for erectile dysfunction. It works by targeting the basic cause of the issue thus helping millions of men all across the world. If you are a man who has been facing an issue with getting and maintaining an erection for a long time now, then you should
.Buy Viagra online

shivam said...

profile creation sites

raj khan said...


Soma pill is very effective as a painkiller that helps us to get effective relief from pain. This cannot cure pain. Yet when it is taken with proper rest, it can offer you effective relief from pain.
This painkiller can offer you relief from any kind of pain. But Soma 350 mg is best in treating acute pain. Acute pain is a type of short-term pain which is sharp in nature. Buy Soma 350 mg online to get relief from your acute pain.

https://globalonlinepills.com/product/soma-350-mg/


Buy Soma 350 mg
Soma Pill
Buy Soma 350 mg online



Buy Soma 350 mg online
Soma Pill
Buy Soma 350 mg

Venkatesh CS said...

Thanks for sharing valuable information.
Digital Marketing training Course in chennai
digital marketing training institute in chennai
digital marketing training in Chennai
digital marketing course in Chennai
digital marketing course training in omr
digital marketing certification in omr
digital marketing course training in velachery
digital marketing training center in chennai
digital marketing courses with placement in chennai
digital marketing certification in chennai
digital marketing institute in Chennai
digital marketing certification course in Chennai
digital marketing course training in Chennai
Digital Marketing course in Chennai with placement
digital marketing courses in chennai

gokul said...

Thanks for this informative blog
Top 5 Data science training in chennai
Data science training in chennai
Data science training in velachery
Data science training in OMR
Best Data science training in chennai
Data science training course content
Data science certification in chennai
Data science courses in chennai
Data science training institute in chennai
Data science online course
Data science with python training in chennai
Data science with R training in chennai

MS Azure Training in Hyderabad said...

This concept is a good way to enhance the knowledge.thanks for sharing..
RedShift Training
AWS RedShift Training
Amazon RedShift Online Training

Lovable vicky said...



Nice information, want to know about Selenium Training In Chennai
Selenium Training In Chennai
Data Science Training In Chennai
Protractor Training in Chennai
jmeter training in chennai
Rpa Training Chennai
Rpa Course Chennai
Selenium Training institute In Chennai
Python Training In Chennai

Lovable vicky said...


Rpa Training in Chennai
Rpa Course in Chennai
Blue prism training in Chennai

Data Science Training In Chennai
Data Science Course In Chennai
Data Science Course In Chennai

Soft Online Training said...

Good Information Thanks for Sharing
Soft Online Provides best online training for Oracle Fusion and EBS R12 Courses
Oracle EBS Training in Hyderabad
Oracle Fusion SCM Training
Oracle Fusion HCM Training
Oracle Fusion Financials Training
For more info Visit us: https://www.softonlinetraining.com/

MS Azure Training in Hyderabad said...

Great Site, The Course were so simple and easy to understand.
GCP Training
Google Cloud Platform Training
GCP Online Training
Google Cloud Platform Training In Hyderabad

vijay said...

Great article! Thanks for taking time to share this with us.
aws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore

Durai Moorthy said...

This is an awesome blog. Really very informative and creative contents.

aws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore

Bhanu Sree said...

I found some useful information in your blog, it was awesome to read, thanks for sharing
SQL Azure Online Training
Azure SQL Training
SQL Azure Training

svrtechnologies said...

Thanks for sharing such a great information. Its really nice and informative. learn devops online. Devops Self-pace learning course devops training videos

Shopclues Winner List said...

Shopclues winner list here came up with a list of offers where you can win special shopclues prize list by just playing a game & win prizes.
Shopclues winner list
Shopclues winner list 2020
Shopclues winner name
Shopclues winner name 2020
Shopclues prize list

GlobalEmployees said...

Read my post here
Java programmer
Java programmer
Java programmer

Rajesh Anbu said...

Great post..Its very useful for me to understand the information..Keep on blogging..
aws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore

meritstep Technology said...

Thanks for Sharing This Article.It is very so much valuable content. I hope these Commenting lists will help to my website
best sailpoint online training

Situs Judi Online Terpercaya said...

NAGAQQ | AGEN BANDARQ | BANDARQ ONLINE | ADUQ ONLINE | DOMINOQQ TERBAIK

Yang Merupakan Agen Bandarq, Domino 99, Dan Bandar Poker Online Terpercaya di asia hadir untuk anda semua dengan permainan permainan menarik dan bonus menarik untuk anda semua

Bonus yang diberikan NagaQQ :
* Bonus rollingan 0.5%,setiap senin di bagikannya
* Bonus Refferal 10% + 10%,seumur hidup
* Bonus Jackpot, yang dapat anda dapatkan dengan mudah
* Minimal Depo 15.000
* Minimal WD 20.000

Memegang Gelar atau title sebagai QQ Online Terbaik di masanya

Games Yang di Hadirkan NagaQQ :
* Poker Online
* BandarQ
* Domino99
* Bandar Poker
* Bandar66
* Sakong
* Capsa Susun
* AduQ
* Perang Bacarrat (New Game)

Tersedia Deposit Via pulsa :
Telkomsel & XL

Info Lebih lanjut Kunjungi :
Website : NAGAQQ
Facebook : NagaQQ Official
Kontakk : Info NagaQQ
linktree : Agen Judi Online
WHATSAPP : +855977509035
Line : Cs_nagaQQ
TELEGRAM : +855967014811


BACA JUGA BLOGSPORT KAMI YANG LAIN:
agen bandarq terbaik
Winner NagaQQ
Daftar NagaQQ
Agen Poker Online

imutsss said...

togel online
bandar togel terpercaya
agen togel
judi togel

bhanu said...

online Golang course

pratheep said...

Thanks Admin For sharing this massive info with us. it seems you have put more effort to write this blog , I gained more knowledge from your blog. Keep Doing..

Robotic Process Automation (RPA) Training in Chennai | Robotic Process Automation (RPA) Training in anna nagar | Robotic Process Automation (RPA) Training in omr | Robotic Process Automation (RPA) Training in porur | Robotic Process Automation (RPA) Training in tambaram | Robotic Process Automation (RPA) Training in velachery

keerthana said...

I really appreciate
PHP Training in Chennai | Certification | Online Training Course | Machine Learning Training in Chennai | Certification | Online Training Course | iOT Training in Chennai | Certification | Online Training Course | Blockchain Training in Chennai | Certification | Online Training Course | Open Stack Training in Chennai |
Certification | Online Training Course

nisharoshan said...

I am feeling grateful to read this.you gave a nice info for us.please update more.

Web Designing Training Course in Chennai | Certification | Online Training Course | Web Designing Training Course in Bangalore | Certification | Online Training Course | Web Designing Training Course in Hyderabad | Certification | Online Training Course | Web Designing Training Course in Coimbatore | Certification | Online Training Course | Web Designing Training Course in Online | Certification | Online Training Course




bhanu said...


Thank you for sharing wonderful information with us to get some idea about that content.
workday hcm online training
workday hcm training
workday hcm certification

bhanu said...

angularjs online course

rocky said...

Thanks for Sharing This Article.It is very so much valuable content. I hope these Commenting lists will help to my website
python training in bangalore

python training in hyderabad

python online training

python training

python flask training

python flask online training

python training in coimbatore

dhinesh said...

An overwhelming web journal I visit this blog, it's unfathomably amazing. Unusually, in this present blog's substance made inspiration driving truth and reasonable. The substance of data is enlightening.


Full Stack Course Chennai
Full Stack Training in Bangalore

Full Stack Course in Bangalore

Full Stack Training in Hyderabad

Full Stack Course in Hyderabad

Full Stack Training

Full Stack Course

Full Stack Online Training

Full Stack Online Course



pavi said...

I feel really happy to have seen your webpage.I am feeling grateful to read this.you gave a nice information for us.please updating more stuff content...keep up!!


Data Science Training In Chennai

Data Science Online Training In Chennai

Data Science Training In Bangalore

Data Science Training In Hyderabad

Data Science Training In Coimbatore

Data Science Training

Data Science Online Training

Unknown said...

Thanks for provide great informatics and looking beautiful blog, really nice required information & the things i never imagined and i would request, wright more blog and blog post like that for us. Thanks you
DevOps Training in Chennai

DevOps Online Training in Chennai

DevOps Training in Bangalore

DevOps Training in Hyderabad

DevOps Training in Coimbatore

DevOps Training

DevOps Online Training

sharath said...

This is a nice article here with some useful tips for those who are not used-to comment that frequently. Thanks for this helpful information I agree with all points you have given to us. I will follow all of them.
Java Training in Chennai

Java Training in Bangalore

Java Training in Hyderabad

Java Training
Java Training in Coimbatore

Anonymous said...

Thanks for provide great informatic and looking beautiful blog
python training in bangalore | python online Training
artificial intelligence training in bangalore | artificial intelligence online training
machine learning training in bangalore | machine learning online training
uipath-training-in-bangalore | uipath online training
blockchain training in bangalore | blockchain online training
aws training in Bangalore | aws online training
data science training in bangalore | data science online training

bhanu said...

angularjs online course

ajith said...

thank you for the information

angular js course in chennai

angular course in chennai

angular js online course in chennai

angular js course in bangalore

angular js course in hyderabad

angular js course in coimbatore

angular js course

angular js online course



Neeta Borse said...

I really thank you for the valuable info on this great subject and look forward to more great posts. Thanks a lot for enjoying this beauty article with me. I am appreciating it very much! Looking forward to another great article. Good luck to the author! All the best!
Php projects with source code
Online examination system in php
Student management system in php
Php projects for students
Free source code for academic
Academic projects provider in nashik
Academic project free download

Nino Nurmadi , S.Kom said...

ninonurmadi.com
ninonurmadi.com
ninonurmadi.com
ninonurmadi.com
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom

venkateshj said...

That was o great Information which is a useful resources
Check one of our list which will help others
We provide best Selenium training in Bangalore, automation testing with live projects. Cucumber, Java Selenium and Software Testing Training in Bangalore.
Online selenium training in India - KRN Informatix is a leading Selenium Training Institute in Bangalore offering extensive Selenium Training
Selenium Training in Bangalore
Software Testing Training in Bangalore
Java Selenium Training in Bangalor
Best Selenium Training in Bangalore
Best Selenium Training Institute in Bangalore

meritstep Technology said...

Thanks for Sharing This Article.It is very so much valuable content. I hope these Commenting lists will help to my website
blockchain online training
best blockchain online training
top blockchain online training

meritstep123 said...

I just loved your article on the beginners guide to starting a blog.If somebody take this blog article seriously
in their life, he/she can earn his living by doing blogging.Thank you for this article.
top tibco sportfire online training

meritstep said...

I just loved your article on the beginners guide to starting a blog.If somebody take this blog article seriously
in their life, he/she can earn his living by doing blogging.Thank you for this article.
best tibco sportfire online training

bhanu said...


Thank you for sharing wonderful information with us to get some idea about it.
Workday Online Integration Course Hyderabad
Workday Online Integration Course India

meritstep123 said...

I just loved your article on the beginners guide to starting a blog.If somebody take this blog article seriously
in their life, he/she can earn his living by doing blogging.Thank you for this article.
tibco sportfire online training

veeraraj said...

Really nice blog post. provided helpful information. I hope that you will post more updates like this.

visit : https://www.acte.in/digital-marketing-training-in-bangalore | https://www.acte.in/digital-marketing-training-in-hyderabad

saketh321 said...

I have been searching to find a comfort or effective procedure to complete this process and I think this is the most suitable way to do it effectively. ExcelR Data Science Course In Pune

Rajesh Adhikesavan said...

IB chemistry
IGCSE chemistry
CBSE chemistry
MCAT

Rajesh Adhikesavan said...

hadoop training in chennai | Male infertility specialist in chennai | Andrologist in chennai | Male fertility clinic in chennai | Andrology doctor in chennai | Infertility specialist in chennai

meritstep said...

I just loved your article on the beginners guide to starting a blog.If somebody take this blog article seriously
in their life, he/she can earn his living by doing blogging.Thank you for this article.
tibco sportfire online training

meritstep said...

I just loved your article on the beginners guide to starting a blog.If somebody take this blog article seriously
in their life, he/she can earn his living by doing blogging.Thank you for this article.
python online training

meritstep said...

I just loved your article on the beginners guide to starting a blog.If somebody take this blog article seriously
in their life, he/she can earn his living by doing blogging.Thank you for this article.
blueprism online training

Unknown said...

Welcome to Softcore Technologies, The Best Training Center for your requirement of Software Programming Courses, Computer Basics, MS Office, Accounting Courses like Tally, Tuition for all subjects starting from 10th Standard (SSC) up to Post Graduation like MBA.

Best MS Office Training in Hyderabad
Best Spoken English Training in Hyderabad

Franklin said...

Organic Chemistry tutor
Organic chemistry
online tutor

bhanu said...


Thank you for sharing wonderful information with us to get some idea about that content.
Mulesoft Online Training in Hyderabad
Mulesoft Training

dhivya said...

thanks for sharing amazing content...
Ai Course in coimbatore
Machine Learning Course in Coimbatore
placement training institutes in coimbatore
job oriented courses in coimbatore
mean stack training in coimbatore
php Training in coimbatore
digital marketing training in coimbatore
ethical hacking training in coimbatore
Final Year Project Center in Coimbatore
React js training in coimbatore

Deekshitha said...

Informative blog
Data Science Course in Pune

Thakur98 said...

Iamlinkfeeder
Iamlinkfeeder
Iamlinkfeeder
Iamlinkfeeder
Iamlinkfeeder
Iamlinkfeeder
Iamlinkfeeder
Iamlinkfeeder
Iamlinkfeeder
Iamlinkfeeder

lkrasilnikovaludmila1976 said...

You Have Been Declined for Health Insurance in California, Now What? By Dennis Alexander. Boost DA upto 35+ at cheapest
Boost DA upto 45+ at cheapest . ArticleShare this article on FacebookShare this article on TwitterShare this article on LinkedinShare this article

laxmi said...

appium online training hyderabad
application packaging online training hyderabad
app v online training hyderabad
aws online training hyderabad
azure devops online training hyderabad

lkrasilnikovaludmila1976 said...

Thankyou for the wonderful content and knowledge. It was really Helpful. # BOOST Your GOOGLE RANKING.It’s Your Time To Be On #1st Page
Our Motive is not just to create links but to get them indexed as will
Increase Domain Authority (DA).We’re on a mission to increase DA PA of your domain
High Quality Backlink Building Service
1000 Backlink at cheapest
50 High Quality Backlinks for just 50 INR
2000 Backlink at cheapest
5000 Backlink at cheapest

ram said...

It was wonderfull reading your article. Great writing styleIamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder

Buy SEO Service said...

It was wonderfull reading your article. Great writing styleIamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder

Rohit said...

Kim Ravida is a lifestyle and business coach who helps women in business take powerful money actions and make solid, productiveIamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder

vivikhapnoi said...

Thanks for sharing your wealthy information. This is one of the excellent posts which I have seen. I go through your all of your blog, but this blog is the best one. It is really what I wanted to see hope in future you will continue for sharing such an excellent post

mua vé máy bay đi seoul

săn vé máy bay đi nhật giá rẻ

giá vé máy bay hà nội đi tokyo

giá vé máy bay hà nội đi đài loan

vé máy bay đi đài bắc

ve may bay di cao hung

ram said...

David Forbes is president of Alliance Marketing Associates IncIamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder

ram said...

David Forbes is president of Alliance Marketing Associates IncIamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder IamLinkfeeder

Thakur98 said...

We are used to the fact that we know only religious and public holidays and celebrate only them.Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder

Linkfeeder said...

Annabelle loves to write and has been doing so for many years.Cheapest and fastest Backlink Indexing Best GPL Store TECKUM IS ALL ABOUT TECH NEWS AND MOBILE REVIEWS

ram said...

Annabelle loves to write and has been doing so for many years.BUY SEO SERVICE BUY SEO SERVICE BUY SEO SERVICE BUY SEO SERVICE BUY SEO SERVICE BUY SEO SERVICE BUY SEO SERVICE BUY SEO SERVICE BUY SEO SERVICE BUY SEO SERVICE

un known said...

Thanks for Sharing This Article.It is very so much valuable content. I hope these Commenting lists will help to my website Workday HCM Online Training
best Workday HCM Online Training
top Workday HCM Online Training

salome said...

informative article.thank you for sharing.Angular training in Chennai

technologyforall said...

Get trained on data science course in hyderabad by real-time industry experts and excel your career with Data Science training by Technology for all. #1 online training institute for Data Science.

un known said...

Thanks for Sharing This Article.It is very so much valuable content. I hope these Commenting lists will help to my website Workday HCM Online Training
best Workday HCM Online Training
top Workday HCM Online Training

un known said...

Thanks for Sharing This Article.It is very so much valuable content. I hope these Commenting lists will help to my website mulesoft online training
best mulesoft online training
top mulesoft online training

bhanu said...

very useful information
ServiceNow admin Training Online
ServiceNow admin Online Training