text:
Monograms are popular from shirt cuffs to tote bags to baby blankets. They are everywhere and popular in wedding invitations, cakes, etc. In a recent order for a bridal shower the requested design was to include a monogram of the bride and groom's initials. Of course not wanting to disappoint, I replied 'I can do that.' I admit I stressed a bit as writing on cookies is one of my weaknesses in cookie decorating. The finished cookies were nice but the monogram lacked the clean, professional look I imagined.
After hundreds of hours of practice with ink and paper I can create pretty calligraphy letters but with a piping bag, well that's another ball of wax. I finally discovered the tool used by many cookie artists … Stencils. There are stencils for all kinds of designs and lettering stencils were the perfect solution. A professional calligrapher penned the script letters and a machine perfectly embosses the letters to create the stencil.
I practiced on some iced cookies. The stenciled initials are of family members. You know who you are …. find your cookie and see how pretty it looks!
Every new decorating technique is a learning experience to figure out what works and what does not. The single monograms were easy but the double monograms were a bit more challenging. I like the flourishes of the interlocking monograms, although in applying the second letter it was a challenge to hold the stencil firmly without compromising the icing on the first letter. Sometimes the stencil slipped and the icing smudged or was too thick which is visible in the photos. I waited 20 minutes before applying the second monogram which was not enough time for the icing to dry on the first letter.
My first tip about using stencils would be to apply just a small amount of icing onto the spatula to cover the design. Second, for double letters wait at least one hour before applying the second letter to allow the first letter to harden. These monogram cookies were done with a three-inch heart cookie cutter and it was a bit of a squeeze to fit two letters onto one cookie. Others were done with a four-inch round cutter with ample space. Just last week I spotted a larger, four-inch heart cookie cutter which will be perfect for double monograms.
Come see my practice sessions below.
Monogram Cookies
Heart and Round Shortbread Cookies
Royal Icing for outlining and flooding tinted with Wilton Ivory
Royal Icing for flooding and detail tinted Light Green with AmeriColor Avocado
Royal Icing for flooding and detail tinted Peach with AmeriColor Peach and AmeriColor Brown
Disposable piping bags & couplers
Squeeze bottles
Wilton Decorating Tip #2
Letter Stencils
Outline and flood cookie with #2 tip in ivory icing. (View video tutorial)
Pipe lines with #2 tip in green and peach flood icing.
Using a toothpick, swirl the icing to create design. (View video tutorial)
Let dry overnight.
Place the stencil on cookie. Apply light pressure so the stencil stays in place.
Spread detail icing with spatula removing excess.
Gently lift stencil. Let dry overnight.
(View video tutorial by Mary of Emma's Sweets)


text:
|NSFW Content
|User Rankings
|Original Content
|Funny Pictures
|Funny Videos
|Funny GIFs
|YouTube Videos
|RSS Feeds
What do you think? Give us your opinion. Anonymous comments allowed.
#66 - nigeltheoutlaw ONLINE (05/03/2013) [-]
I remember when I got home from having my wisdom teeth taken out I tried to play Ratchet and Clank. I had a five second delay every time I tried to jump or shoot my gun and got pissed that I couldn't beat the boss, then I realized I had been drooling for an hour into my lap and it looked like a I pissed myself. Those drugs **** you up.

subset: commoncrawl


text:
6/27/2014 (3 months ago)
Catholic Online (www.catholic.org)
Man's natural desire for happiness is of "divine origin: God has placed it in the human heart in order to draw man to the One who alone can fulfill it" (CCC 1718). Our Savior, in an incomparable act of divine compassion, offered his Sacred Heart for the good of humankind, in order to fulfill man's irrepressible thirst for happiness and love.
Catholic Online (www.catholic.org)
6/27/2014 (3 months ago)
Published in Living Faith
Keywords: Sacred Heart of Jesus, most sacred heart, divine heart, divine love, the solemnity of the sacred heart, Jesus, devotion to the Sacred Heart of Jesus, F. K. Bartels
GLADE PARK, CO (Catholic Online) -- The Catholic Encyclopedia informs us that, while devotion to the love of Jesus dates to the apostolic Church, the first unmistakable signs of devotion to the Sacred Heart of Jesus appeared in the eleventh and twelfth centuries, where it arose in the fervent atmosphere of either the Benedictine or Cistercian monasteries. During this time, the wound in the heart of Jesus symbolized the wound of love: He was "pierced for our offenses, crushed for our sins" (Is. 53:5). In an infinite outpouring of Divine Love, the Sacred Heart of Jesus is wounded for our sins and for the love of mankind.
The vision of St. Gertrude (d. 1302) on the feast of St. John the Evangelist marks a notable point in the history of the devotion. While resting her head near the wound in the Savior's side, St. Gertrude heard the beating of the Divine Heart. She asked St. John if, at the Last Supper, he too had felt those delightful pulsations, why he had not spoken of them. He replied that this revelation had been reserved for subsequent ages when the world had grown cold, at which time its love would need rekindling (ibid.).
From the thirteenth to the sixteenth century, although the devotion was quite widely practiced, it yet remained a private and individual one of the mystical order, with no general involvement among the laity. In the seventeenth century, the devotion began to further spread when Blessed Jean Eudes established a feast day for it. But it was through St. Margaret Mary Alacoque's (1647-1690) numerous and profound revelations that Jesus chose to invigorate devotion to his Sacred Heart. On the feast of St. John, as with St. Gertrude before her, Margaret Mary was permitted to rest her head over the Savior's heart, which, like a floodgate, opened to her the wonders of Jesus' superabundant love:
"And He showed me that it was His great desire of being loved by men and of withdrawing them from the path of ruin into which Satan hurls such crowds of them, that made Him form the design of manifesting His Heart to men, with all the treasures of love, of mercy, of grace, of sanctification and salvation which it contains, in order that those who desire to render Him and procure for Him all the honor and love possible, might themselves be abundantly enriched with those divine treasures of which this Heart is the source" (Revelations of Our Lord to St. Margaret Mary, qtd. from sacredheartdevotion.com/).
That the Son of God, eternally begotten of the Father and made man by the power of the Holy Spirit, through whom all things were made (Jn 1:3), should desire to be loved by men, is of itself astonishing! Here we are presented with an apparent paradox: the omnipotent and omniscient second Person of the Holy Trinity, whose divine nature lacks nothing in itself and is in need of nothing outside itself, reaches out to finite humanity with a tender compassion that is entirely beyond words. This compassion is bound up in a love of such immense depth that, for our sake, Jesus is moved to die an unimaginably painful death on a Roman cross. God did not become man and suffer and die to add something to himself, for there is nothing that can be added to God's flawless perfection and infinite glory. Rather, Jesus poured out the most precious blood of his Sacred Heart for the salvific good of mankind.
True God and true man, whose divine nature is the fount of life and light of men (cf. Jn 1:4), thirsts to draw all men into his most Sacred Heart, the well-spring of his love, and thus re-create humankind as sons and daughters of God. What are we, whose life passes by as a shadow (Wis. 2:5), that the Word made flesh should offer his living heart on the cross, giving of himself for our sins as the sacrificial Lamb of God? We are undeserving of these incomparable acts of love. Yet God has done them. Further, continuing to act and intervene in human history, Jesus this moment thrusts open the sublime treasures of his Sacred Heart upon mankind, that we "may have life, and have it abundantly" (Jn 10:10).
From the time of St. Margaret Mary onward, devotion to the Sacred Heart of Jesus has steadily increased. In 1856 the feast of the Sacred Heart was extended to the universal Church by Pope Pius IX. In 1875, consecration to the Sacred Heart was made throughout the Catholic faithful. And on 11 June, 1899, all mankind was solemnly consecrated to the Sacred Heart of Jesus with a formula prescribed by Pope Leo XIII.
Associated with the practice of devotion to the Sacred Heart are twelve promises given by Jesus to St. Margaret Mary, with special promises for those who participate in the Liturgy of the Mass and receive Eucharist on the first Friday of the month for nine consecutive months:
"I promise you in the excessive mercy of my Heart that my all-powerful love will grant to all those who communicate on the First Friday in nine consecutive months, the grace of final penitence: they will not die in my disgrace, nor without receiving their Sacraments. My Divine Heart shall be their safe refuge in this last moment."
Safe refuge. Is that not the desire of every man, even those who do not yet know Jesus? Is not there an irrepressible force within every human heart, whether Christian or otherwise, that leads us to both hope in and seek out permanent, safe refuge? There is perhaps no other time when the desire for safe refuge is more pressing than the moment of death. In our final hour the illusions of self-reliance and disordered autonomy and power, all of which are built up by the structures of pride, if they have not already done so, must evaporate in the face of our encounter with God.
But man desires safe refuge throughout his life. We might say, then, that man is a refuge seeker. The desire for safe refuge is bound up with man's desire for happiness. And it is no accident that man seeks happiness; for God has placed within man's heart such an unceasing desire in order to lead him steadily and with unwavering purpose toward his end-goal of perfect happiness: a reality attained in God alone. Ultimately, then, there can be no permanent, safe refuge apart from God. Nor can lasting and perfect happiness be attained outside of the Sacred Heart of Jesus, who so loved the world as to open his own heart to it.
If we desire mercy and love, happiness and refuge, these and every other grace -- whether conceivable or inconceivable -- are freely offered by Jesus. For our part we may receive these treasures if we will but seek shelter through faith in the most Sacred Heart of Jesus, and thus give our heart to him as he gave his to us, in an embrace of divine and human love.
"Grant, we pray, almighty God, that we, who glory in the Heart of your beloved Son and recall the wonders of his love for us, may be made worthy to receive an overflowing measure of grace from that fount of heavenly gifts" -- Roman Missal Collect, The Solemnity of The Most Sacred Heart of Jesus
Deacon Fred Bartels serves the Diocese of Pueblo, Colorado, as a member of the Catholic Clergy. He is a Catholic writer who knows his Catholic Faith is one of the greatest gifts a man could ever receive. He is a contributing writer for Catholic Online. Visit him also at joyintruth.com
N.s.de Loreto Holy Card
Prayer Cards
O.l. Of Fatima Holy Card
Prayer Cards
St.therese Rosary Ring
St Stephen Holy Card
Prayer Cards
Biography Of St Rose Of Lima
Prayer Cards
By Deacon Keith A Fournier
In 1999 I was a part of Project Reconciliation led by a true peacemaker, paralyzed police officer Detective Steven McDonald. This trip was a part of Steven McDonald's mission of preaching peace through forgiveness. It had the goal of helping to heal the wounds ... continue reading
By Deacon Frederick K. Bartels
What leads to permanent and lasting happiness? As Jesus points out, becoming "rich in what matters to God" is the key. When we place God first, and love our neighbor as another self, we soon begin to experience a perceptible, lasting happiness that is not of this ... continue reading
By Catholic Online (NEWS CONSORTIUM)
Pope Francis cleared the process for sainthood for Pope Paul VI after his beatification over the weekend. Pope Paul VI led the Catholic Church through internal reform during a tumultuous time of social and political change before his death in 1978. LOS ANGELES, ... continue reading
By Deacon Keith A Fournier
We need Bishops like Ignatius in this new missionary age of the Church. There is a literal assault on marriage and the family in much of the West. Yet, what the Church has to offer on the truth about marriage and the family paves the path to a future of true ... continue reading
By Catholic Online (NEWS CONSORTIUM)
Pope Francis is renting out the Sistine Chapel for charity. The decision marks the first time that the chapel has ever been rented out for charity. It will be used for a private concert hosted by Porsche. LOS ANGELES, CA (Catholic Online) - The Vatican has announced ... continue reading
By Catholic Online (NEWS CONSORTIUM)
Today is World Food Day and we are all called to do what we can to feed others. This year's World Food Day falls during Pope Francis' 'Week of Action' where all Catholics are called to pray and act to feed the world's hungry. LOS ANGELES, CA (Catholic Online) - Today, ... continue reading
By Catholic Online (NEWS CONSORTIUM)
Pope Francis reiterated in his morning homily that faith is not about appearances and superficially following Church laws. The Pontiff said that God wants to see a faith that inspires action and is "working in charity" and making sacrifices for others. LOS ... continue reading
By Andrew M. Greenwell, Esq.
O Sacred Heart of Jesus, O burning furnace of divine Love, you are the symbol and summary of the whole mystery of our Redemption. O mystery of mysteries, an infinite Love which no vessel can contain emptied itself into a finite human vessel of love-and so became ... continue reading
By Catholic Online (NEWS CONSORTIUM)
"Raise a voice for the hungry," Pope Francis tweeted in support of his 'Week of Action' to fight world hunger. From October 12-18, the 'Week of Action' is intended to bring awareness to Catholics about world hunger and to motivate them to actually do something about ... continue reading
By Catholic Online (NEWS CONSORTIUM)
Homosexual relationships destroy "the identity of the man and the identity of the woman," according to a Catholic Archbishop attending the Vatican's Synod of the Bishops. Archbishop Zbigevs Stankevis, has accused the U.S. and other countries of trying to promote a ... continue reading


text:
MERRILLVILLE | It may not have been Hollywood, but eight local "stars" took to the Celebrity Ballroom dance floor Thursday at the Radisson Hotel at Star Plaza.
The four couples performed for charity and trophies during the Dancing with the Local Stars contest, which benefited the Lake Area United Way.
While dancers in town for the annual Indiana Challenge this weekend looked on, a high school teacher and a financial secretary took first and second place in performances that won high praise from the judges.
The first place trophy was won by Dave Pishkur, of Valparaiso, teacher and varsity baseball coach and Andrean High School. With partner Danielle Karczewski, of the Fred Astaire Dance Studio, Pishkur performed an energetic swing dance to the beat of "Get Back" by the Beatles. Andrean baseball team members, as well as Pishkur's wife, family and friends, cheered him across the dance floor.
"It was definitely a different environment," Pishkur said of the dance competition. "(But) it was really fun. I enjoyed the practices, I enjoyed every moment of it."
Financial secretary Rosa Maria Rodriquez and her partner Kenneth Kollasch, of Arthur Murray Dance Studio, won second place. Rodriquez pronounced herself nervous prior to the dance, but Kollasch said that was a good thing.
"I've always been told that if you aren't a little nervous, then you aren't into the excitement (of the moment)," he said.
Melissa Bohacek, communications manager/executive assistant for Northwest Indiana Community Action, and partner Kevin Crowe, of Fred Astaire, won third place for a cha cha.
Matt Sharp, an Indiana University Northwest student and intern at The Times, paired with Hannah Pender, of Fred Astaire, and took fourth place.
Each year the event, organized by Tim and Sue Bourget of Second Street Dance Studio in Schererville, features local amateurs and professionals who perform publicly to raise money for the United Way. All money raised by Thursday night's ticket sales went to the 2014 United Way Campaign.


text:
Toyota Pickup
I have a 1988 Toyota PUP 2WD, 22R Engine with 107,000 Miles. When I start the Pickup up the engine RPM go to about as high as it can go and does not comes down, so I have to turn it off right away almost as soon as I start it. Any idea where to start fixing the problem.
May 11, 2007.
May 11, 2007.
Check the choke initial opening and fast idle adjustment-Something is sticking or jamming the choke assy.
May 11, 2007.
May 11, 2007.
If i took out my 91 toyota carolla engine what other cars would it be compatible with?
4 answers • 1991 Toyota Corolla
We have two Jeeps that we need to replace the 4.0 engines on. a 1996 2 wheel drive and a 1998 4 wheel drive. We have found a 1994 2 wheel drive engine that we are planning on putting ...
2 answers • 1998 Jeep Laredo • 165,000 miles
1992 Isuzu Rodeo 3.1 V6 mileage: 135,000. I am wanting to replace the engine in my Isuzu Rodeo. I have seen many different types of redo's but I would like to put a 305 V8 and change ...
2 answers • 1992 Isuzu Rodeo • 135,000 miles
1990 Toyota Camry mileage: 150,000. 1. The oil warning light is on. 2. There are four quarts of oil in the car. 3. The oil filter is dry. 4. The engine sounds rough. 5. There is noise ...
3 answers • 1990 Toyota Camry • 150,000 miles


text:
Also available in big and tall sizes
Was £20.00
Now £12.00
Now £8.00
60% Off
Save a total of £12.00
Dark blue washed chino shorts
Item No.0900102053
These smart chino shorts from Maine New England come in dark blue, with a zip fly, flat front and two front pockets. Available in a range of colours. Also available in big and tall sizes.
This item is available for
UK Home Delivery Free (UK orders over £30) or £3.99
Delivered within 4 working days
Next or Named Day Delivery
7 days a week between 8am - 6pm
Monday to Friday - order by 7pm - £4.99
Saturday & Sunday - order by 6pm - £4.99
Next or Named Evening Delivery
7 days a week between 6pm - 10pm
Monday to Sunday - order by 10pm - £6.99
Collect from store the next day - FREE
Order before 7pm for next day collection after 12pm
Show participating stores
- Model height: 6'1" / 185cm
- Model waist: 29" / 74cm
- 100% cotton
- Smart shorts
- Zip fly fastening
- Two front pockets
- Two rear pockets
- Machine washable
Debenhams is happy to exchange or refund your purchase within 28 days providing the goods are in a fully resaleable condition (including tags) and not within the exclusion policy*. This policy does not affect your statutory rights. You can return unwanted items either by visiting your local store (the fastest way to get a refund), by arranging a courier collection or returning by post. Exclusions apply to selected products. For instructions on how to return products and information on Debenhams refund policy visit the returns and refunds section of the website.
Why not try


text:
We purchased a huge bag of sugar to be used for bear baiting - on the package it states:
"Naturally fat-free" 15 calories per teaspoon"
A few decades ago, itwas concluded that fat was our problem with the increase of heart disease. So, the food manufactures took fat out of a lot of processed foods and replaced it with sugar. Unfortunately, for most consumers that was just replacing one evil with another. So, while sugar may be naturally fat-free, that does not make it a better food (if you can call it food since it is empty calories, devoid of nutrition).
What do you think, does being "naturally fat-free" make it a good food choice?
My garmin gives me an average pace of 10:36. I told my hubby when I left that I was hoping to do an 11:00 min/mi.
It was a beautiful day for a run today. The weather was just right. It has been hot and humid most of the summer so this was actually a pleasant run
Uggh! I cannot stand that phrase. I just read a blog about someone who just started running a month ago and he is so proud of his being able to stick with it that he has now set himself as the standard for anyone to be able to start running.
For one thing, just because someone else has been able to accomplish a particular feat, does not mean another person can accomplish the same thing. It has been my experience that it my determination, perseverance and effort will cause my success, not the abiltiy of another.
So, while it is great to boast about one's accomplishment, I do not believe it is correct to say that because I can do, then so can you. But, then again, I have always been the "odd man out" and never really went for doing something just because someone else was doing it.
Well, I am now off to the 5k race: "If I can do it, so can you"
On the schedule was a tempo run; I was to run 2 miles at a 10:21 pace. Well, I did my mile warm-up, stopped for a water break and to set up my garmin with the virtual partner for the 2 miles. Oh, I am running, and running at a good pace and then I look up and see a hawk circling above me and looking my way. This maked me nervous because I watched a few videos where birds of prey took down some good-sized animals.
I slowed down to a walk and kept an eye on the bird. As I am wallking, I hear a car and the driver rolls down the window and says, laughing, "There was a small deer running after you up the road. Did you see it?"
The hawk must have had the deer in its sight, not me. Whew!!!
Oh, yeah in case anyone is wondering, I did not make the 10:21 pace. My average pace was 10:46 for the two miles Second mile was the slow one.


text:
Knights of Pen and Paper and Angry Birds go free
Two really great apps are free this week. First up, Knights of Pen and Paper is an (in my opinion) underrated and very charming turn-based RPG, with the unique premise that you're actually playing an old pen-and-paper role-playing game, complete with a dungeonmaster describing every environment you enter and NPC you come across. Or you can play DM yourself, and design an adventure for your gamers. The game is on iPhone and iPad, so more users than ever have a chance to download and enjoy it.
And on the complete other end of the spectrum from underrated, the original Angry Birds app (and its HD counterpart) have gone free on iOS. It's hard to believe that you haven't played Angry Birds yet, as there have been lite versions, lots of sales and a number of various spinoffs and ways to play the game on all of its various platforms. But just in case you haven't gone back and played the original iOS hit, now's your chance.
Do try Knights of Pen and Paper, though. It's really good.
Subscribe to Newsletter
Software Updatesmore updates
- Dropbox adds support for TouchID
- YouTube for iOS gets updated with full support for iPhone 6 and 6 Plus
- iOS 8.0.1 update now available (Updated -- Don't update!)
- NFL Mobile updated for 2014 Season with new Fantasy Football features, NFL Now integration
- Yahoo Mail improves email inbox searching with new filtering options
- Ember for Mac gains 'hugely-requested' screen recording feature


text:
There is exciting new hope on the horizon for the treatment of combat-related trauma, and I feel that I have had a front-row seat in watching this ground-breaking and hopeful solution to one of our country's most heart-breaking problems -- Post Traumatic Stress Disorder (PTSD) in the military. Let me elaborate.
As a psychoanalyst, I had the pleasure of attending a conference in Los Angeles that highlighted the work of Dr. Russell Carr, a naval psychiatrist who heads up inpatient psychiatry at the National Naval Medical Center in Bethesda, Md. Dr. Carr has spent a decade in military campaigns since 9/11 in both Iraq and Afghanistan. With this experience of his, if anyone can empathize with and develop ways to effectively treat PTSD in military personnel, I believe that Dr. Carr can. But before he was able to do this, first he had to look for ways to help himself.
In an attempt to survive and to tolerate his own shattering experiences with war, Dr. Carr read widely, seeking knowledge from various areas in psychology and psychoanalysis. Although drawn to psychoanalysis, Dr. Carr found that psychoanalytic theory and treatments were not specifically developed to address problems that arise in adulthood, such as the effects of combat on soldiers; that is, until he discovered the work of famed Los Angeles psychoanalyst, Dr. Robert Stolorow.


text:
(Source: mad-ylka)
#karneval #gif
(Source: mad-ylka)
ピットくん by 水平 線
(Source: haruichisatoru)
(Source: msbikasa)
Pikachu & Its Eevee Friends + Scenery
(Source: trick-or-saba)
Work by とまと (Twitter)
(Source: ringo23)
(Source: fangasming)
170 carat opal with Contra luz color plays. Origin: Opal Butte, Oregon. Contra Luz opals describe precious opals where the play of colors is only visible when held up to the light.
The cutest little booble that ever boobled.
First time rigging and animating a character in after effects. It was fun!
It's Monday again. Do you need a pick-me-up? Have some hilarious quotes from The Lego Movie. You're welcome and everything is awesome.
(Source: entertainingtheidea)
oMFG I just came downstairs and I found my sister with a lighter and I told her she can't use fire and that it could catch the house on fire. She said that she was doing something important so I asked "what the hell is so important that you need fire for!?" and she told me with serious face " I am using black magic to summon demons to get the mean girls at my school." i can't fucking breathe. I sat and watched her ritual hahahahaha shes fucking 10 years old
This should be a wake-up call to her parents.
She obviously needs help.
Her parents should to talk to her about those mean girls,
and teach her that she can't summon demons with just candles.
You need at least a pentagram drawn in a perfect circle
with goat or lamb blood,
and a proper incantation from a book of dark magick.
This is great way to to teach your child early on
about geometry and foreign languages.
Good art lesson too. Drawing perfect circles is hard
dOES NO ONE ELSE FIND THIS EXTREMELY DISTURBING
Actually I find this girl fantastic. Ending bullying one curse at a time.
She might want to hold off on summoning demons until she's a bit more mature but yes curse those fuckers you go, girl
Now hang on, just hang on a moment there. Let's make one thing clear right now:
There is not a goddamned thing wrong with calling on someone bigger and stronger then you for help if need be.
If that stronger someone just happens to have tentacles and two-foot-long fangs, well, that's more the problem of certain mean girls, I'd say.
Here kid, i drew you a new pal. You summoned a demon, you got one. Sorry i couldn't put more time into this sketch but his name is Bill.
I love everything about this post
only on tumblr
I will always reblog this.
My mom bought these recently and they have made both of my dogs really sick. She later saw an article online about duck and sweet potato treats made in China(these fit the description) killing dogs and the FDA is doing nothing about it. Apparently over the last few years 600 young, healthy dogs have died after eating these treats and I don't want anymore to suffer or be killed so please spread the word and don't let your dogs have these!
This is VERY important! A lot of these animal treats made in China are killing dogs and cats. It's not that the FDA isn't doing anything about it, it's simply that they don't know why it's happening.
They are conducting investigation after investigation, but the ingredients used in the food killing dogs (and 10 cats) is used in many different brands and companies that have been shipped, all from overseas. At this rate, a total recall and knowledge of where it's coming from has proven very difficult. Just recalling one brand in particular will not solve the problem. Please conduct a thorough search about any brand of treats that have been made in China should you pick them up for your pet before you feed it to them. If all else fails, just buy local.
EDIT: Here is a list of food that has been recalled (so far) with more information
Please PLEASE be aware that this isn't only happening to dogs, but some cat treats, too!
This may save lives!!
Toph Tuesday!
Toph is approved! Royal House Bei Fong, Lord of Melons, Ruler of Earth, Supreme Metalbender, Team Avatar, titles titles
The biggest Earthbender of all times…
I really needed Toph Tuesday, thanks to everyone that reblogged and liked. I hope it goes round and round! ♥♥♥
i know a lot of these background masterposts probably already exist, but i really love doing masterposts cause they're really useful for me and hopefully other people??
**none of these pictures belong to me
- pattern backgrounds { here }
- gradient backgrounds { here }
- sky backgrounds { here }
- floral backgrounds { here }
- nature backgrounds { here }
- pixel backgrounds { here }
- animated backgrounds { here }
- eiffel tower backgrounds { here }
- balloon backgrounds { here }
- other backgrounds { here }
other pictures
themes (shortened from my other masterpost)
Bad End
(Source: aobaseragayki)


text:
localsearch 2.0
LocalSearch searches all pages of your Internet website for keywords and provides a search function. With the help of an assistant and a few mouse clicks you provide an entire quantitative search engine. LocalSearch lists every search result according to frequency of appearance. The design of your Internet appearance can automatically be templated. With LocalSearch Deluxe you can place an input field and the results anywhere on your web page
See also: search solution, search software, search tool, search, site search engine, site search, search engine, html search function, search function, local search engine, local search, localsearch, create search engine, local-search-engine, search program
Active Search Engine 2.52
Active Search Engine is a feature rich server application that allows you to create your own Yahoo style search engine in just minutes. It features an appealing interactive user interface and advanced administration tools for advanced link management and approval, category creation, keyword based search, automatic confirmation of new links, user email list management, a banner advertising system, full integration with Google Adsense and much more
See also: google adsense, links, mailing list, windows server, reuters news, search, portals, create engine, directories, construction, search engines, build Yahoo style directory, solution, search engine, asp applications, link checker, microsoft asp.net
Xtreeme Search Engine Studio 4
Search Engine Studio automatically indexes your web site (using 4 methods e.g. HTTP crawler) and then creates a professional, ultra fast search engine for your website or an offline search for CD-ROM / DVD distributions. No installation on server required thanks to a built-in highly optimized database engine! You can fully customize the search results (no ads!) and has tons of Google-like features. Indexes HTML, PDF, Office,Flash docs & many more
See also: search, engine, builder, creator, generator, web, site, offline, build, create, generate, cd-rom, cdrom, cgi, script, php, engines, searches, server, index
Xtreeme SiteXpert Professional Edition 9
With this software you can create professional navigation schemes (12 types, e.g: sitemap trees, dhtml menus, Google sitemaps, and more). SiteXpert can also generate a search engine (Internet, Intranet or Offline). SiteXpert comes with hundreds of predefined graphical schemes. Included are free DreamWeaver/FrontPage/GoLive/NOF plugins. You can use the crawler module to automatically read existing website structure (through http/ftp/local disk)
See also: dhtml, javascript, java, script, drop, down, sitemap, site, map, tree, index, search, engine, menu, cgi, website, navigation, generator, creator, builder, generate, create, build, mapper, mapping, indexer, dynamic, html, frontpage, golive, dreamweaver, netobjects, fusion
Search Maker Pro 3.2
Automatically create a local JavaScript search engine that will search your website or offline CD or DVD.
Features include:
Can create a working search engine in under a minute.
Indexes HTML, Adobe PDF, Word Doc & RTF, Excel XLS, PowerPoint PPT and other formats.
No programming required.
No server software or server cgi access required.
Stylesheet and template support.
Boolean and wildcard search provisions.
Advanced search page feature
See also: DVD, Client, Internet, Javascript, Website, Engine, Search, Create
Search Engine Composer 5.3.12
With three steps, Search Engine Composer will help you create JavaScript, PHP and ASP search engines for your online web site, Intranet, CD and DVD in minutes! It indexes your entire site, build an efficient search engine. It supports indexing static html, dynamic html (e.g. ASP, PHP, CGI), xml, Microsoft Word, PowerPoint, Excel, Adobe PDF and RTF files. It also provides visitors' search activity reports.
See also: build search engine, create search engine, site search engine, add search engine to website
Text Finding V1.2.5
Text Finding can instantly search files on your pc and other networked machines by creating text search index. It can perform full text content search in numerous types of files, inlcluding PDF, Word, Excel, HTML, Outlook Express, text, webpage source, program source etc.. You can search files by specific text string or file name no matter they are stored in your computer or networked computers. You can preview and download the found files easily
See also: desktop search softwar, network file search, file search software, file indexing software, find text in files, content search software. PDF search engine, index multiple files, create search index
Rich Snippet Generator 188.8.131.52
Download Rich Snippet creator application from company website www.ibusinessutilities.com to create rich snippets. Rich Snippet Generator software is helpful for your website listing in search engine such as Google, Yahoo, Bing, MSN etc.
See also: Snippet, generator, create, export, events, markup, people, listing, organic, website, search, engine, utilities, MSN, book, review, business, application, Google, yahoo, design, Bing, micro, data, product, code, text, file
Rich Snippet Generator Software 184.108.40.206
Do you want to create Google compatible micro data code for your company website? Then visit www.db-convert.net to download one and only Rich Snippet Generator Software which is highly effective to improve and increase the visibility of your website without any special knowledge or advice.
See also: Rich, Snippet, Generator, maker, create, search, engine, markup, Google, micro, data, code, organization, increase, business, product, website, visibility, add, star, review, movies, event, listing, text, html, file
Microdata Generator 184.108.40.206
Visit website www.drpudatabase.com and use Microdata Generator software to increase web page rank without charging any extra cost and time .Reliable markup text creating application add micro data and code on your webpage and export created codes in any of file format like text or HTML.
See also: Download, code, design, create, Microdata, rich, snippet, text, creating, application, install, computer, system, develop, craft, build, Microcode, increase, enhance, webpage, rank, search, engine, produce, markup, data
4c 3.0
The innovative browser add-on 4c is the first one to support the visual memory. Thus the revolutionary browser add-on 4c achieves to integrate the visualisation of websites and all other applications on your computer within the navigation. You don�t need to mark these cryptic adresses any more or find a specific word document through trial and error within the windows task bar. Just one click and you see all apllications that are in use.
See also: web development, search result, search engine, Internet software, euris, web browser, pop-up, surfing in web, history, favourites, preview, Internet, download, shareware, browser, desktop, innovative, solution, programme, tabbed browsing
Axl Traffic 8.0
Axl Traffic is the most efficient, powerful, and completely automated way to promote your website to over 700,000 Search Engines, Directories, Link Pages, Online Malls, Classified Sites! 100% Automated - A Complete Traffic Generating Machine!!!
See also: website promotion, traffic builder, promotion, search engine promotion, google search engine placement, web site promotion marketing, search engine positioning, top search engine ranking, search engine submissions, promote your website, add your website
Deep Log Analyzer 2.6
Analyze your website usage. Get 40+ reports on traffic, visitors, referrals, search engines and key phrases, browsers and more.
Deep Log Analyzer features hierarchical reports presentation with interactive navigation, graphical charts and open database format.
View how statistics change over time, compare reports for different intervals, dig deeper into the data with the unique hierarchical reports and reveal hidden patterns in your site stats.
See also: SEO, internet marketing, roi, web server logs, web site stats, website statistics, data mining, web analytics, log analyzer, search engine optimizaiton, web traffic, site visitors
Canadian Company Search Engine 1.0.1
CCSE is a powerful search engine of Canadian company information and capable of searching out relevant companies and their contacts instantly in accordance with your enquiry configuration.
Gernerate your own sales leads or maillinging list in 1 minutes!
You shall instantly have the company information you have desired : your potential customers, your business partners and the ideal suppliers.
CCSE is your perfect marketing tool.
See also: Canadian sales leads, Targeted Mailing Lists, Marketing Sales Leads, Business Leads Generation, Business Search Engine, Canada Yellow Pages, consumer list, direct marketing, business database, Canada
Site Submitter 1.0
Automatically Submit Your web site to many Search Engines. Helps keep your site listed in the search engines. Has an update feature to stay current. Search engine submission tool.
See also: submitter, submission, search engine submission, submit, search engine, url submission
TrafficTravis 1.1.2
Traffic Travis Search Engine Optimization Software (SEO) is a leading SEO Software designed to analyze links, build link popularity, add link partners, add reciprocal links to your links pages and gain top search engine ranking in Google, Yahoo, MSN and more! It also enables advanced analysis of keywords and keyword examination as well as a fully integrated pay per click (PPC) section allowing users to monitor and edit their AdWords
See also: Search Engine Optimization Software, SEO Software, Search Ranking, Reciprocal Links, Search Engine Ranking, PageRank, Reciprocal Link Exchange, Link Partners, Website Promotion Software, Link Popularity Software, Analyze Links
Site Promote Pro 1.0
Site Promote Pro: Search engine submission software including 1000's of sites built in. This is a great way to increase traffic and ranking for your web-site. Simple form simply asks for just six items about your web-site. All categories are automatically selected. This software is 100% automated. You just click Submit after filling in six simple fields and the rest is 100% automatic.
See also: promote, promotion, links, link, submission, submit, link exchange, content, Internet, marketing, search, search engine, directory
Cyberfetch Website Submitter 2.0.5
Cyberfetch Website Submitter is one of the easiest Web automated promotion tools to use on the market by filling in three simple forms. With our software you will never need to search for places to advertise again. Easily submit multiple Web sites in one click. Large search engine and category list to submit your site to along with three different-sized ad fields. Free Demo submits to 20 sites.
See also: site submitter, website submitter, search engine submitter, marketing, advertising, submitter, advertising software
infosearch 1.0
Welcome to your amazing tools and guide for make money online in success internet business. Use this mini search engine to finding whats you need. This mini tools just like major search engine do.
See also: search, engine, money, home, business, ebook, Online business, home business, internet business, make money online, internet, online
INI Edit and Password Saver 2.1
INI-Edit is a great tool when you work with INI files or when you need to organize and save your passwords. INI-Edit can show you the sections, names, values and comments in an orderly fashion, so you don't have to think about the ini file syntax and you can encrypted the file when you save it, so nobody can read your passwords. NI-Edit can also hide all the comment's so it is easier to find values. There is of course also a search function.
See also: ini, edit, editor, create, password, organize, password saver, encrypt, fast, syntax, key, search, find, value, comment, open, read, write, save, file


text:
PeopleForBikes retailers in action: Virginia's The Bike Lane
We spoke with this Virginia bike shop about how they're getting the next generation on two wheels.
We spoke with this Virginia bike shop about how they're getting the next generation on two wheels.
Sign a petition to support protected bike lanes on Commonweath Ave.
The capital of the New South is working on its latest highway network. This one is going to smell a lot nicer.
Sure, they get you from Point A to Point B, but these bikes are capable of so much more.
Grab a green Pronto Cycle Share bike today!
After one bicyclist tracked down the teen driver who threw trash at him, he invited the boy to go for a bike ride.
There is no shortage of people who think bicycling should be added to the massive list of "don'ts" for pregnant women, but many doctors (and moms) disagree.
Our East Coast events crew are foodies to the core. Here they share with us their five food favorites from their summer travels.
We formed PeopleForBikes with the goal of uniting one million riders. Here's why.
Weigh in and triple the size of Austin's bike sharing system.
We chat with Bikes and Moore about how they're getting more veterans on bikes.
This season, PeopleForBikes is sponsoring a Bike to School Challenge with the Safe Route to School National Partnership.
The West Coast Crew gets a new perspective when they switch from road bikes to mountain bikes mid-season.
The Atlanta Bike Challenge is a free, fun competition for Atlanta workplaces.
Want to work in the bike industry? We are expanding our staff!


text:
According to the 1880 census for Granby, Oswego co., NY Robert Jaycox age 74 with wife, Lucy age 74 lived in the household of their son, Fletcher Jaycox, who worked in a glass factory, age 41 with wife, Louisa age 39 and their children: Joseph age 10; Charlotte, age 8; Fletcher age 6. All were b. NY,but Robert's mother was from Nova Scotia and both Lucy's parents were English born.
Notify Administrator about this message?
|Home | Help | About Us | Site Index | Jobs | PRIVACY | Affiliate
|© 2007 The Generations Network


text:
Firefighters transfer the flag draped casket containing the remains of Philadelphia firefighter Capt. Michael Goodwin at St. Michaels Lutheran Church on Thursday in Philadelphia. Goodwin died Saturday in a roof collapse while battling a fire in a three-story building in the city's Queen Village section. He was 53. (AP Photo/Matt Rourke)
© Copyright 2014, phillyburbs.com, Levittown, PA. [Terms of Use | Privacy Policy]


text:
Kinect@Home is a place where you can help robotics and computer vision researchers around the world and get 3D models of your room, office or whatever you want in return, right in your browser!
Kinect@Home aims to use your powers to make robots more awesome than ever. Robotics and computer vision researchers need vast amount of images from everyday environments such as homes and offices to improve their algorithms.
"D is for Diode" – Circuit Playground Episode 4 is out now! CLICK HERE TO WATCH!
Have an amazing project to share? Join the SHOW-AND-TELL every Wednesday night at 7:30pm ET on Google+ Hangouts.
Join us every Wednesday night at 8pm ET for Ask an Engineer!
Learn resistor values with Mho's Resistance or get the best electronics calculator for engineers "Circuit Playground" – Adafruit's Apps!
No Comments
No comments yet.
Sorry, the comment form is closed at this time.


text:
The Glacier Bay Chelsea 24 in. Vanity in Nutmeg with Porcelain Vanity Top in White with White Basin will instantly upgrade your bath or powder room decor. The vanity is built-to-last with solid wood and laminated engineered wood construction in a warm nutmeg finish that complements many decor styles. Providing ample storage space behind double doors, the doors have brushed nickel hardware for a decorative accent that complements the finish. The porcelain vanity top has an integral sink and a 1 in. H backsplash and is pre-drilled for a 4 in. center set faucet. Ideal for smaller spaces, this vanity coordinates with other Chelsea Collection pieces for a pull-together, polished look that is simple to achieve and easy to enjoy. Limited Lifetime Warranty.
- Doors feature 6-way adjustable European concealed hinges for a clean, seamless look
- Porcelain vanity top included with integral sink and 0.75 in. H backsplash
- Included vanity top is pre-drilled for 4 in. centerset faucet
- Brushed nickel cabinet hardware adds elegant touch
- Durably constructed of solid wood and laminated engineered wood
- Furniture-style toe kick adds a decorative accent
- Interior cabinet provides ample storage space
- Faucet not included
- Note: Product may vary by store


text:
Surgery, Kaiser Permanente Wailuku Clinic
- 80 Mahalani St
Wailuku, HI 96793
- 1 Office Location
- Email a Friend
- (808) 243-6000
Dr. Anita R. Gambhir has been practicing medicine for 16 years. Dr. Gambhir graduated from the Albany Medical College in 1998. She practices medicine in Wailuku, HI and specializes in Surgery. Dr. Gambhir is affiliated with Maui Memorial Medical Center and Kaiser Permanente Moanalua Medical Center.
Gender: Female
Years in Practice: 16 Years
Languages Spoken: English
Medical School: Albany Medical College
Graduation Date: 1998
Hospital Affiliations: Maui Memorial Medical Center, Kaiser Permanente Moanalua Medical Center
Specialties: Surgery
©2005-2014 WebMD, LLC. All rights reserved.
WebMD does not provide medical advice, diagnosis or treatment. See additional information.


text:
File this under "Stuff that should have always worked this way by default"...
The Android Development Toolkit (ADT) comes with two important applets - the SDK Manager, and the Android Virtual Device Manager. The SDK Manager is the tool that downloads and installs all the Android APIs, build tools, etc. The Virtual Device Manager allows you to create and customize the Android emulators. You can setup as many different device emulators as you desire, each with different form factors and Android OS levels
Two very important tools, but neither is available directly from Eclipse (which is where I spend most of my time when developing SMP apps for Kapsel or native Android). On Windows, they're executables located in the android-sdk\tools\lib folder. So, you could create shortcuts out on the desktop, or pin them to the tart menu, but that means leaving Eclipse to launch them. Too much trouble for me... It's even more complex on my Macbook! You have to open a Terminal window, navigate to the /tools folder, and run android avd or android sdk. I mean, I went to the trouble of installing the ADT plugins into Eclipse - the least they could do is give me an easier way to run these critical apps!
Well, I found a way to add them to the Window menu in Eclipse, and it was so easy it made me wonder why this isn't the default behavior... (The screen shots here are for the Mac version of Eclipse Kepler, but this is exactly the same for Windows and Linux).
Go to Window > Customize Perspective...
Select the Command Groups Availability button, and check ON the Android SDK and AVD Manager option.
Now, when you return to the Window menu, you'll see the two options for Android SDK Manager and Android Virtual Device Manager right under the Navigation... option.
In this blog I would like to introduce you to the custom scripting capabilities that were introduced with the Integration Gateway in SAP Mobile Platform 3.0 SP04. If you are interested in seeing which other new features were introduced, I can highly recommend you to read my colleague Mustafa's blog: What's New in Integration Gateway in SAP Mobile Platform 3.0 SP04.
A little while ago I wrote a blog/tutorial about creating an OData service based on SAP Gateway, SOAP, JDBC and JPA data sources. As you could see in that blog, there was only a mapping capability available for SOAP data sources. For ODC, JDBC and JPA data sources this meant that the names of the entity sets and their properties had to correspond exactly to the fields of the data sources. Sometimes this resulted in rather ugly looking entity sets, as you had to keep the case lettering identical to the source and keep the technical field names of the source. You can see it in this example:
However, as of the latest release of SAP Mobile Platform, it is possible to create powerful enhancements using the JavaScript and Groovy scripting languages. After assigning a data source to an entity set, there some user exits are provided where you can modify the requests before they are sent to the data source, and modify the responses as they are returned from the data source. Some examples of what you can do with this are delta token handling, tombstone support, SOAP authentication, or data source mapping.
In the following, I'd like to show you how you can map an entity set to a JDBC data source using JavaScript. Taking the example from the image above, the result will look as follows, after having performed a data mapping:
Along with the new service pack, a new set of OData modeling tools called SAP Mobile Platform Tools were released. You can find more information about this in my colleague Amit's blog: SAP Gateway Developer Tools – Bridging the Past, Present and Future.
The SAP Mobile Platform tools are based on Eclipse Kepler and support the new features of the SAP Mobile Platform 3.0 SP04. But of course they are downwards compatible and you may use them to work on your SP03 projects.
So, if you haven't done so already, please download Eclipse Kepler and install the SAP Mobile Platform Tools by following these instructions.
Do a right click in the Project Explorer view and select: New > Other > SAP Mobile Platform > SAP Mobile Platform OData Implementation Project
Provide a project name and select the target runtime SAP Mobile Platform 3.0 SP4.
Provide a model name, select Blank OData Model and finish the wizard.
2. Modeling the entity set and assigning the data source
Please model your entity set as follows:
Perform a right click on the JDBCmapping.odatasrv file and select Select Data Source. In the following wizard, assign the Data Source JDBC and finish.
3. Defining the Custom Code
Expand the nodes under the odatasrv-file, do a right click on Data Source JDBC and select Define Custom Code.
You may keep the suggested file name, and select the script type JavaScript.
Now Eclipse will open a JavaScript file with some sample coding. The script contains four JavaScript functions; processRequestData, processRequestSQL, processResponseData, processResponseResult:
4. Implementing the mapping
In order to do the mapping, we will need to implement the processRequestData function. Luckily, it comes with sample coding to perform such a mapping. The coding should look like this:
function processRequestData(message) { //Import statements importPackage(com.sap.gateway.ip.core.customdev.util); importPackage(java.util); importPackage(org.apache.olingo.odata2.api.edm); importPackage(com.sap.gateway.core.ip.component.commons); importPackage(org.apache.olingo.odata2.api.uri); importPackage (com.sap.gateway.ip.core.customdev.logging); importPackage(com.sap.gateway.ip.core.customdev.api); //Create the table map and populate with EntitySet name and DB Table name var tableMap = new HashMap(); tableMap.put("LocationsSet","COMPANYLOCATIONS"); //Create the entity map and the two property maps var entitiesMap = new HashMap(); var companyLocationsMap = new HashMap(); //Property map companyLocationsMap.put("LocationID","LOC_ID"); companyLocationsMap.put("LocationName","DESCRIPTION"); //Entities map populated with property maps against relevant EntitySets entitiesMap.put("LocationsSet", companyLocationsMap); //Set the header in the message object with the two maps created message.setHeader(ODataCamelExchangeHeaders.JDBC_TABLE_MAPPING.toString(), tableMap); message.setHeader(ODataCamelExchangeHeaders.JDBC_PROP_MAPPING.toString(), entitiesMap); //Logger this will log error to the console - useful for finding errors log.logErrors(LogMessage.TechnicalError, message.getBody()); return message; }
This is all you need to do to perform the mapping. Now you only need to deploy your project to the SAP Mobile Platform server, assign the JDBC destination to your entity set, and then you are done.
5. Testing the service
When you call your service, you will find that the mapping is in place, and it is returning the data from your database:
Thanks for reading, I hope you will find this helpful.
Kind regards
With our latest release of the SAP Mobile Platform Server we have done some important enhancements to the tools used to monitor system health and analyze server performance. The new enhancements give administrators the visibility and controls they need to efficiently manage their Mobile Platform deployment.
In this blog I give you a quick update in the following areas:
in addition to point you to where you can get more information if you like what you just read.
The first source of information for administrators is the server logs for monitoring SAP Mobile Platform (SMP) system health. Troubleshooting can be viewed on the SMP server Admin Console and from here the administrator can change the Log level to the needed depth at runtime in addition to view the logs.
Solution Manager integration
Gives you a second level of information layer to access supportability features such as change analysis, workload analysis, system availability and end to end trace.
Solution Manager is integrated with Wily Introscope to extend the workload analysis feature for the larger enterprise system. The Introscope agent on SAP Mobile Platform Server captures the workload metrics which then can be reviewed using Solution Manager or the Introscope Enterprise Manager dashboard.
Solution Manager periodically retrieves server and application-level configurations from SAP Mobile Platform. In the Solution Manager dashboard any configuration changes that have been made over a specific period of time be reviewed and discovered.
Solution Manager provides a central point of access for monitoring a system's technical availability for the SAP Mobile Platform. In the Solution Manager dashboard you can evaluate the SAP Mobile Platform's overall system status in the mobile system landscape
End to End Trace:
Finally the Solution Manager also provides the capability to capture the analytics for each system in a mobile transaction and consolidate it to further analysis
If this topic interests you and you want to get more information on how to run your mobile solutions I recommend you to join us at TechEd this year. We have several Lectures and Hands-On sessions, which will give you more details on this topic.
Also check out our latest blogs covering more news about this new SAP Mobile Platform release:
Hi everyone,
Working with the error archive.
As discussed in the previous blog, we need to manually execute delete operations against the error archive entries to purge them. In theory it is pretty simple, you know how to delete an entity from an OData collection (covered in the blog #04).
But it actually turns out that we need to come up with a way to associate and identify each request and its error in the error archive.
There could be different approaches how to do it - and one possible tip is to use the simple technique called "custom tag". By assigning each request a unique custom tag, it will appear in both the request object in the callback and the property of the error archive entity.
How do we add a custom tag? In the blog #04, we learned how to do the CUD operation by means of schedule<CUD>Entity methods.
For example, the Create operation is invoked with this method.
01 [store scheduleCreateEntity:entity collectionPath:@"CollectionName" delegate:self options:nil];
Alternatively, if we want to add a custom tag, we can invoke the Create operation with scheduleRequest: method.
01 SODataRequestParamSingleDefault *requestParam 02 = [[SODataRequestParamSingleDefault alloc] initWithMode:SODataRequestModeCreate 03 resourcePath:@"CollectionName"]; 04 requestParam.payload = entity; 05 requestParam.customTag = @"myCustomTag"; 06 [store scheduleRequest:requestParam delegate:self];
From the functional perspective, both do the same job - but the scheduleCreateEntity: does the better abstraction, in fact it calls very similar logic behind the scenes. In the bottom of this blog you can refer the CRUD operations code with scheduleRequest:.
Hold on, now I have a second thought with the line #05. It is a good idea to give each request some kind of unique custom tag, it can be useful for debugging.
01 requestParam.customTag = [NSString stringWithFormat:@"tag%@", [[NSUUID UUID] UUIDString]];
Now that a custom tag has been assigned to a CUD operation, how do we make use of it in the offlineStoreRequestFailed:?
01 - (void) offlineStoreRequestFailed:(SODataOfflineStore*) store 02 request:(id<SODataRequestExecution>) requestExecution 03 error:(NSError*) error 04 { 05 ... 06 id<SODataRequestParamSingle> request = (id<SODataRequestParamSingle>)requestParam; 07 NSString *resourcePath = [NSString stringWithFormat:@"ErrorArchive?$filter=CustomTag eq '%@'", requestParam.customTag]; 08 [offlineStore scheduleReadEntityWithResourcePath:resourcePath delegate:self options:nil]; 09 }
First of all, your custom tag can be referred in the request object. In #08, you see how the requestParam.customTag is obtained. It should have the assigned tag value like "tag25716A15-667A-4468-AC88-B56598D42E0D". And it build an OData query string like "ErrorArchive?$filter=CustomTag eq tag25716A15-667A-4468-AC88-B56598D42E0D", which let you identify the associated error item out of the error archive. With the line #08, it triggers OData query against the error archive, which locally exists with the offline store.
It will invoke requestServerResponse: method, and as it was queried, it returns the entity set - simply delete the associated error entity out of the error archive.
01 - (void) requestServerResponse:(id<SODataRequestExecution>)requestExecution 02 { 03 id<SODataRequestParam> requestParam = requestExecution.request; 04 if ([requestParam conformsToProtocol:@protocol(SODataRequestParamSingle)]) { 05 id<SODataRequestParamSingle> request = (id<SODataRequestParamSingle>)requestParam; 06 if (request.mode == SODataRequestModeRead) { 07 id<SODataResponseSingle> responseSingle = (id<SODataResponseSingle>)requestExecution.response; 08 if ([responseSingle.payload conformsToProtocol:@protocol(SODataEntitySet)]) { 09 id<SODataEntitySet> errors = (id<SODataEntitySet>)responseSingle.payload; 10 for (id<SODataEntity> entity in errors.entities) { 11 [offlineStore scheduleDeleteEntity:entity delegate:self options:nil]; 12 // purging an error item is complete 13 } 14 } 15 ...
That's all about how to handle the situation in which the OData Producer fails one of the queued requests during a flush. Hope you get some solid idea how all gizmos are working in the offline scenario and how to work with them.
This is a kind of closing of the offline scenario - but not the end of the show. I'll add some more things, which should be helpful for the actual implementation (that's a whole idea of these blogs). Tiny but important bits and pieces. Thanks for keeping company so far.
See you in the next blog,
Create operation (= HTTP POST)
01 [store scheduleCreateEntity:entity collectionPath:@"CollectionName" delegate:self options:nil];
is equivalent to
01 SODataRequestParamSingleDefault *requestParam 02 = [[SODataRequestParamSingleDefault alloc] initWithMode:SODataRequestModeCreate 03 resourcePath:@"CollectionName"]; 04 requestParam.payload = entity; 07 [store scheduleRequest:requestParam delegate:self];
Read operation (= HTTP GET)
01 [store scheduleReadEntityWithResourcePath:entity.resourcePath delegate:self options:nil];
is equivalent to
01 SODataRequestParamSingleDefault *requestParam 02 = [[SODataRequestParamSingleDefault alloc] initWithMode:SODataRequestModeRead 03 resourcePath:entity.resourcePath]; 04 [store scheduleRequest:requestParam delegate:self];
Update operation (= HTTP PUT)
01 [store scheduleUpdateEntity:entity delegate:self options:nil];
is equivalent to
01 SODataRequestParamSingleDefault *requestParam 02 = [[SODataRequestParamSingleDefault alloc] initWithMode:SODataRequestModeUpdate 03 resourcePath:entity.editResourcePath]; 04 requestParam.payload = entity; 07 [store scheduleRequest:requestParam delegate:self];
Delete operation (= HTTP DELETE)
01 [store scheduleDeleteEntity:entity delegate:self options:nil];
is equivalent to
01 SODataRequestParamSingleDefault *requestParam 02 = [[SODataRequestParamSingleDefault alloc] initWithMode:SODataRequestModeDelete 03 resourcePath:entity.editResourcePath]; 04 [store scheduleRequest:requestParam delegate:self];
This blog content is joint work with Thasneem Yasmin Hameed from the SAP Development team in Dublin, California - special thanks to Thasneem!
Hi everyone!
Let's start with the last question.
- What if the OData Producer fails one of the queued requests during a flush?
In an online scenario, the result of any request is immediately propagated to the client. For example, a create request call will immediately return a 201 if it is successful or an error message if the entry was not created successfully at the OData producer end. Upon receiving the result, the client can manage subsequent requests based on the outcome.
But this doesn't happen in an offline scenario where there is no connectivity. For example, if an application makes a create request in offline mode, the corresponding data is only available in the local database on the device. The application could continue to do an update on the same data while still being offline.
Another scenario might be where an entry may have been deleted on the OData producer, but an offline application, which is unaware of this change, may still schedule an update on it.
A typical scenario for an offline app is to schedule a series of requests when offline. When the device becomes online and a flush call is initiated, all of these requests are sent to the server. For each request queued in the flush, the outcome must be propagated to the application.
The SDK provides the SODataOfflineStoreRequestErrorDelegate protocol for this purpose. This delegate has one method
For example if 10 requests are being queued in a flush call and result in 3 requests failing at the backend, then the offlineStoreRequestFailed:request:error: will be called 3 times, each time with the error message specific to the failed request. In the scenario mentioned above where there is an offline create and then an update on the same entry in offline mode, then during a flush call, if the create has fails at the server, the offlineStoreRequestFailed:request:error: will be called first for the create request failure and subsequently for the update request failure, which of course will fail (since there is no such entry as the create had failed).
Note: The call to this delegate method cannot stop or modify the flush operation. So, if a series of 10 requests are sent in a flush call, then the flush will execute all the 10 requests in the backend regardless of whether some of the requests fail in the process (thereby invoking the delegate method for each failure.) For apps that expect to have large numbers of requests in each flush we strongly recommend that the apps be written to try to remove the possibility of such errors. For example, a create can be made not to fail if the application is written to do some validation so invalid property values are never sent to the server in the first place.
An offline application can also view the offline request errors by means of the Error Archive, which is a collection of offline request errors stored on the local device. When an offline request fails during a flush call, the error is immediately added to the error archive. The application can retrieve the error archive from the offline store with a simple read request with the resource path set to "ErrorArchive".
The ErrorArchive collection can be queried the same way as any other OData collection, so you can use $filter, $top etc. query options to modify the search. There is no limit to the number of errors that will be stored in the archive, and it is up to the application to manually execute delete operations against the archive entries to purge them.
So let's try to code. Don't forget to declare and set the SODataOfflineStoreRequestErrorDelegate.
01 [offlineStore setRequestErrorDelegate:self];
And the method will be called back. Most likely you want to do two things in the pseudo code below.
01 - (void) offlineStoreRequestFailed:(SODataOfflineStore*) store 02 request:(id<SODataRequestExecution>) requestExecution 03 error:(NSError*) error 04 { 05 // A. Notify the user a CUD operation was failed 06 // B. Purge an item from the error archive 07 }
Implementing A. is nothing special, after examining the requestExecution and error objects, a dry (boring) popup with an error message might be just fine, but as you know iOS devices provide fancy options to notify users with cool user experience, it is all up to our imagination with the brand-new technology :-)
Here comes another good question with B. - how to purge them?
We'll discuss in the next blog!
See you in the next blog,
Dear All,
Just to share my experience with SAP Mobile Platform 3.0, as we all know that from SMP 3.0 onwards there is not standard configuration for the Database file like in the previous versions wherein the setup used to create a Database file, be it a development system or a production system. From SMP 3.0 onwards, we have two versions the development system and the production system, both differing in the installation process.
For the development system the installation is straight forward as we can install it over the Derby Database, but for Production system we need to proceed with a custom Database, though i have tried the production installation on Derby Database and it worked but its been advised from SAP not to run Production systems on Derby Databases. So now the only option left with us is to carry on with the Custom Database which would be an additional pain for the Basis team to install a Database Server first and then install the SAP Mobile Platform server. The supported database as of now are
Once this is installed, SAP provides a pre coded script that we just need to run in order to create users, password and the database file (phewww that saves some amount of effort) but again sometimes the scripts runs fine but we are not able to connect the database to SAP Mobile Platform. This is actually where the actual pain starts because the entire installation went through properly still it does not work. When we try to view data by running an OData service on the Gateway Management Cockpit we receive an error "Could not send a message" this is a place where we need to worry coz this is the point when SMP is not able to communicate with the custom Database.
So i am writing this blog post to just verify that everything went through properly before actually investing our time in development prior to verification.
First step is to login to the SAP Gateway Cockpit from the url http://smpserveraddress:smpport/gateway/cockpit
By default you will see a service by the name ESPM Service.
This guy is our helper who will tell us are we on the path or off it.
So we start taking help with the helper.
Step 1 : Go to the Destinations tab and click on Create a new Destination
A Window will pop up. We will create a JPA2 Destination
Enter the below details
Destination Type : JPA
Persistence Unit : com.sap.espm.model
Authentication Type : Basic Authentication
Username : the same you used in the DDL file for running the script. If you didn't change the script it will be gomobile
Password : the same you used in the DDL file for running the script. If you didn't change the script it will be secret.
Step 2 : Adding the Destination to the ESPM Service
Navigate back to the services tab and click on the ESPM Service.
It will open up the detail window of the ESPM Service.
At the bottom you will see a small rectangular section mentioning DESTINATIONS.
Click on Add Destination and a small window will pop up fetching the destination which you recently created in step 1, in the drop down. Select your destination and click on Save.
Step 3 : Checking if the SMP Server is able to communicate with the Custom Database.
Go back to the Services tab and against the ESPM Service on the right you have a hyperlink which states Open Service Document which will open up the list of services for the ESPM Service.
Now to check if the server is communicating with the Database.
Pick up any of the methods of the choice and run it in the url
For eg If i am wanting to see Sales Order Items data from the sample database the url will be something like this https://smpserverip:gatewayport(8080/8081)/gateway/odata/sap/ESPMService;v=1/SalesOrderItems
Click enter to see the response. If all works good and SMP is able to communicate to the custom DB you will see a response like below
If you see a message like below or any other message , it means the SAP Mobile Platform is nt able to communicate with the Custom Database and you need to re install SAP Mobile Platform Server and reconfigure the Custom Database and re run the custom script.
Hope this helps,
Rakshit Doshi
Hi everyone, time to code.
In order to refresh the offline store...
This single line of code does the job.
01 [offlineStore scheduleRefreshWithDelegate:self];
Just like the other delegates so far, we need a new delegate named SODataOfflineStoreRefreshDelegate. In this example it is declared in the same class, so simply set self. This delegate has two mandatory callback methods:
And two optional callback methods:
That's all for the refresh. How about the flush?
01 [offlineStore scheduleFlushQueuedRequestsWithDelegate:self];
Yes we have a delegate for this too. It is SODataOfflineStoreFlushDelegate (yes, your wild guess is correct :-) ). It has two mandatory callback methods:
And two optional callback methods:
...Hope you're pleasantly surprised with its simplicity.
Yes, I hear you. The question is "What if the OData Producer fails one of the queued requests during a flush?"
We'll discuss about it in the next one, stay tuned.
See you in the next blog,
Hi everyone, let's continue.
In order to use SODataOfflineStore, we need to understand how the offline store works.
During initialization, the offline store communicates with the server to collect the data from that OData Endpoint and stores it locally on the device. In the last blog, we learned how to do it with the defining request in the code snippet.
A formal description about the defining request is:
A defining request is an OData read request that targets the OData Endpoint associated with the offline store and retrieves a subset of the OData Endpoint data. Before a store is opened, it is initialized with a set of defining requests. The set of data that is made available while disconnected on the device corresponds to the union of data received by executing all of the defining requests. During initialization, the offline store communicates with the server to collect the data from that OData Endpoint and stores it locally on the device.
Once you obtained an offline store successfully, you can do the Read operation just like you do with an online store. One thing we have to keep in mind is the fact that the offline store is the locally stored data. This means if you try to read the OData collection, which is not defined during the initialization (via the defining request), you will get an empty result.
Okie, so what we have learned is once the creation of an offline store is done, we can read the store. But we can expect that over time, the locally stored data may grow out of date compared to the OData Endpoint.
It's time to learn another new cool thing - MobiLink, introduced with SMP3 SP4.
SODataOfflineStore is running with MobiLink behind the scenes. MobiLink is responsible to synchronize the local database in the mobile device and the database in the SMP server.
When the developer works with the SODataOfflineStore, it refers the local data in an offline store. And MobiLink handles the data communication in the most efficient way. If the OData service supports Delta Query mechanism, the transferred data can be optimized too.
It has two key tasks:
Refresh is to asynchronously communicate with the server to download any new changes to the OData content. During a refresh, the offline store communicates with the server to re-collect the data from the OData Endpoint and reconciles it with the locally stored data.
An offline store enables the application to modify data (that is, CUD operation) while disconnected. As a result, modification requests made to the offline store are stored locally in a request queue until connectivity can be re-established. When connectivity is available, the application must flush the request queue in order to propagate the stored requests to the OData Producer. During a flush, the offline store communicates with the server and attempts to execute all of the stored requests against the OData Producer.
...that's all about MobiLink 101 with SMP3 SP4. Hope you have gained a quick idea how SODataOfflineStore works - so what we haven't done yet is how we implement it with the API. We'll talk about it in the next blog!
See you in the next blog,
Ladies and Gentlemen,
Time to start the offline scenario. Before jumping in the new API, let's recall the formal description about what the ODataStore is.
The ODataStore is covering exactly one OData service (service document and metadata). It shall be possible for an application to create multiple ODataStores (also in combination on- and offline) at the same time, which shall be completely independent from the API perspective and have own life cycles.
For online we use SODataOnlineStore. For offline, we need to understand another store object called SODataOfflineStore.
Both stores declare SODataStoreAsync protocol, this means SODataOfflineStore can use the same CRUD methods with SODataOnlineStore.
Let's have a look at how we create SODataOfflineStore:
01 SODataOfflineStore *offlineStore = [[SODataOfflineStore alloc] init]; 02 SODataOfflineStoreOptions *options = [[SODataOfflineStoreOptions alloc] init]; 03 options.host = serverHost; 04 options.port = serverPort; 05 options.serviceRoot = [NSString stringWithFormat:@"/%@", applicationId]; 06 options.conversationManager = myConversationManager; 07 options.storeEncryptionKey = @"MyEncryptionKey"; 08 options.definingRequests[@"req1"] = @"/CarrierCollection"; 09 .. 10 [offlineStore setOfflineStoreDelegate:self]; 11 [offlineStore openStoreWithOptions:options error:&error];
Once you get familiar with SODataOnlineStore, it should be pretty easy. The difference is we supply option values via ODataOfflineStoreOptions, by which we set the values like SMP server host name or HttpConversationManager.
#07 is the optional parameter, which encrypts the store. If you don't set it explicitly, the store won't get encrypted. You only need to provide it to the store options. After that, the library takes care of encrypting/decrypting all of the content.
You have noticed a new line ".definingRequests" in #08. The defining requests define the entire set of data that will be available to read out of the store (we'll discuss the detail in the next blog). As it is NSMutableDictionary, you can add as many defining requests as you like. The value is OData URLs, relative to the service root.
For ODataOfflineStore, we use another delegate protocol named SODataOfflineStoreDelegate. For this example the delegate is declared in its own class, so simply set self. Finally we can try to open the offline store by openStoreWithOptions: which triggers following callback methods:
And two optional callback methods:
The offlineStoreStateChanged:state: callback method keeps us informed what the current status is.
01 - (void) offlineStoreStateChanged:(SODataOfflineStore *)store state:(SODataOfflineStoreState)newState 02 { 03 switch (newState) { 04 case SODataOfflineStoreOpening: 05 break; 06 07 case SODataOfflineStoreInitializing: 08 break; 09 10 case SODataOfflineStorePopulating: 11 break; 12 13 case SODataOfflineStoreDownloading: 14 break; 15 16 case SODataOfflineStoreOpen: 17 // the offline store has opened...read the OData 18 break; 19 20 case SODataOfflineStoreClosed: 21 break; 22 } 23 }
Once it reaches the SODataOfflineStoreOpen state, the offline store is ready.
Tip: Make sure to call GlobalInit and GlobalFini at the beginning and ending of the app code to use SODataOfflineStore.
01 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 02 { 03 [SODataOfflineStore GlobalInit]; 04 ... 05 }
01 - (void)applicationWillTerminate:(UIApplication *)application 02 { 03 [SODataOfflineStore GlobalFini]; 04 }
Congratulations, now you have successfully obtained the offline store. As explained, this store can use the same CRUD methods you had learned in the blog #03 and #04. The difference is one important fact - this store has the "offline" state. What does that mean to the API? We'll discuss it in the next blog.
See you in the next blog,
PS. Additional explanation of offlineStoreNotification:notification: method -
Currently, there are only two possible notifications and they indicate that either a refresh or a flush (both will be covered in the next blog) was in progress when the store was previously closed and that the store may be able to continue these operations where it left off if the application calls the refresh/flush operation again. The advantage to doing this is to save on bandwidth and processing since you are picking up where you left off from last time instead of starting the entire process from a scratch.
To date, more than three thousand users are subscribed to the SAP Mobile Platform cloud version trial account over the last 12+ months. Many developers are attracted to the simplicity of a cloud based mobile platform to securely connect to on-premise back-end business systems and leverage a reliable push abstraction layer for their mobile business apps.
With the release of the SAP HANA Cloud Platform mobile services, SAP is further consolidating mobile technology and making it available as a Service.
SAP HANA Cloud Platform mobile services (HCPms) will replace the well-known SAP Mobile Platform, enterprise edition, cloud version (commonly referred to as SMP Cloud) as SAP's Platform as a Service (MaaS) offering. At first glance this sounds like a rebranding, but in fact this release is much more than that.
The new name really makes more sense. First it clearly states that our product is running on top of the SAP HANA Cloud Platform, SAPs in-memory, feature-rich and easy-to-use development environment in the cloud. Secondly the name tells us that the mobile services are on par with other services like database, security, integration or app services. This is an important distinction as over the last year, I've had many discussions with people who thought that SMP Cloud was just an SMP 3.0 installed on virtual machines somewhere in the cloud. HCPms is a real Mobile-as-a-Service offering therefore you don't have to worry about upgrades, backup, patching, scalability and so forth. SAP will take care of that.
Given that SMP 3.0 and HCPms are not the same offering – a logical question is "What do the two have in common?". In developing HCPms, we have merged the two source-code baselines so that the bulk of the code is common between the two products and therefore expose the same behavior. A key benefit of this approach is that it allows us to develop features, deploy it to HCPms and you can benefit from it and with the next update of SMP 3.0 on-premise customers will have the same feature available as well. All this glued together with a single mobile SDK means that an app written for HCPms can also run against SMP 3.0 - no code change required.
There are a few differences behind the scenes, such as HCPms' use of SAP HANA Cloud Integration services instead of Integration Gateway and the use of HANA Cloud Platform security infrastructure.
I hope this sounds good to you and I have more great new features to share for HCPms so read on!
HCPms supports the full set of Apache Cordova Plugins that we ship with our Mobile SDK SP05. From AppUpdate (allowing content updates in Cordova project at runtime, controlled by the server) to Offline Plugin, which allows to run full offline OData applications in a hybrid manner.
With SDK SP05 we shipped the first set of plugins for Windows 8.1 – all compatible with HCPms. If you want to read more about the new features of the SDK, you can do it here SAP Mobile SDK SP05 - What is new ?
One of the most anticipated features this year is definitely the Offline OData Service. This combination of easy to use API and a feature-rich, proven sync technology allows developer to create offline mobile Apps without having a PhD in "Offline Technology". Developers are now able to create sophisticated offline applications the same way they would develop online applications – there is no development paradigm chance. If you want to find out more check the maybe you want to check this Getting Started with Kapsel - Part 15 -- Offline OData (New in SP05).
The new enhanced Push API allows back-end systems to publish business events to HCPms with ease and flexibility. The back-end just needs to know, which user and what app needs to be notified with what kind of message. This eliminates the need for the back-end to know anything about the device.
In addition to that the new API enables bulk push messages. All in all, this is what you need for your notification scenarios – regardless of target device: we support notification for Android, Apple, Blackberry and Windows.
The picture below is an example for the Push API. Given information is: a message to be shown on the device, a target application and a list of users to be notified. This information will be send to the Push API resulting in three notifications: two for User A (she owns two devices) and one for User B. The other users will not receive a notification since they are not in the recipients list and do not have the app.
A picture is worth a thousand words:
The new fresh design is responsive and can be accessed via phones or tables and of course from you laptop in your office. If the appearance of the Admin UI reminds you of SAP Fiori, there's a good reason for that. The new Admin UI was built using the same open source UI5 framework as SAP Fiori. Needless to say that it's easy to use and probably you'll never visit the documentation we put together to explain you all the details.
There is more to tell about the new features in this release, but I doubt that you would have the time to read through every aspect of HCPms – it would fill a book on it's own. Nevertheless, I hope I have raised your curiosity and share my excitement about this new release.
In closing, I would like to share one more thing with you: HCPms supports full-cloud scenarios, where the back-end is already available in the cloud as well as hybrid-cloud scenarios where the back-end is located on premise. The latter is made possible by the SAP HANA Cloud Connector, which establishes a secure connection and allows whitelisting of resources to be accessed by HCPms. I think the following picture explains it better than a description.
I hope that you now have a good understanding of what SAP HANA Cloud Platform mobile services is all about and are starting to think of how you would utilize it. We are working hard on providing a trial infrastructure as soon as possible, and expect to have it online in the first quarter of 2015.
Stay tuned and have fun!
Martin Grasshoff
Product Management, SAP HANA Cloud Platform mobile services
For the ones who want to learn more I have some links:
Hi everyone.
Onboarding. User on-boarding is the process of registering a user and giving them appropriate access to data and applications. SMP offers the proven onboarding scheme together with the API.
OData SDK bundles the Mobile Application Framework(MAF) UI. With the MAF UI, you can use the out-of-the-box onboarding features with very minimal development effort.
Let's have a look at the typical onboarding implementation with MAF UI.
01 MAFLogonUIViewManager *logonUIViewManager = [[MAFLogonUIViewManager alloc] init]; 02 [logonUIViewManager.logonManager setApplicationId:appID]; 03 [logonUIViewManager.logonManager setLogonDelegate:self]; 04 [logonUIViewManager.logonManager logon]; // Shows MAF UI
The appID in #02 is the application id, which is configured in the SMP server. #03 is for the delegate named MAFLogonNGDelegate. #04 renders the MAF UI for end user. Once the end user entered all the onboarding info (SMP server name, credentials, etc.), the logonFinishedWithError: method is called back - this method is defined in the MAFLogonNGDelegate. Once the method is called back, make sure we configure the HttpConversationManager in the logonFishedWithError:.
01 -(void) logonFinishedWithError:(NSError*)anError 02 { 03 ... 04 HttpConversationManager *httpConvManager = [[HttpConversationManager alloc] init]; 05 [[logonUIViewManager.logonManager logonConfigurator] configureManager:httpConvManager]; 06 // onboarding completed 07 }
Remember the HttpConversationManager in the blog#02? Once completing the steps above, we can happily use the HttpConversationManager instance to create the ODataStore instance.
One remark is the logonUIViewManager needs the topmost ViewController so it can display the logon screens as modal screens on top of it. This code demonstrates how to set the current ViewController as the parentViewController of the logonUIViewManager.
Note: You have to make sure the parentViewController is set before the logon method gets called.
01 - (void)viewWillAppear:(BOOL)animated 02 { 03 .. 04 logonUIViewManager.parentViewController = self; 05 .. 06 }
Once the onboarding is completed, we can access the user specific onboarding data. This code fetches the OData application endpoint URL that routes the SMP server as a content proxy.
01 MAFLogonRegistrationData *regData = [logonUIViewManager.logonManager registrationDataWithError:&error]; 02 NSString *endpointUrl = regData.applicationEndpointURL;
That's all for the onboarding step with MAF UI. Without onboarding, you can't obtain the ODataStore instance, so it is a must knowledge for you.
Next one is offline API :-)
See you in the next blog,
I have done some findings in the area of JVM memory analysis and adjustment that I wanted to share.
In the Agentry Server prior to SMP one had the option to adjust the JVM heap memory size of each Agentry Server by adjusting the corresponding parameters of the Agentry.ini file.
The parameters were:
Now on SMP 3.0 the Agentry Server(s) are using the same runtime as the SMP, and you can no longer set memory allocation in the Agentry.ini (as it no longer exist). And you cannot set it in the Management Cockpit either, eventhough you have the [Java-1] section in your Backend configuration part of your Application definition.
So how do you analyse and adjust the JVM heap memory of the SMP 3.0 ?
Please note that the SMP 3.0 is using the SAP Java runtime JVM.
Fortunately a simple Analyzer tool is included in the SMP installation.
The tool is located in <SMP_HOME>\sapjvm_7\bin\jconsole.exe
If you start the tool directly, it will display Java processes executing in your user, and you can connect directly. Normally you would have to start the SMP by Go.bat.
If your SMP server is running as a service it will normally be executing under a different user (smpServiceUser), and you will need to start jconsole a little differently.
Start the Task Manager, and determine the process ID of the java.exe process hosting your SMP platform.
In my case the SMP java.exe is executing under process ID 1632.
Now open a command prompt and navigate to the folder where jconsole is located.
Issue the command "jconsole <PID>", where <PID> is the process ID of the SMP java process.
You will get this warning, but just click "Insecure connection".
You are located directly on the host so I don't see any problem in this.
You will now get an overview, and you can navigate to multiple tabs for various information.
On the "VM Summary" tab, you can find info of the current and maximum heap size, as well as all kinds of other info regarding the VM.
Adjusting memory
If your server is running out of heap memory (java.lang.OutOfMemoryError), you may want to increase the heap memory allocation on the SMP.
Startup parameters for the JVM is set in the file: <SMP_HOME>\Server\props.ini
Default memory parameters are:
-Xms1024m Initial Heap size
-Xmx2048m Max Heap size
-XX:PermSize=256M Initial memory allocation for permanent objects
-XX:MaxPermSize=512M Max memory allocation for permanent objects
By adjusting the value of Xmx you can change the max allowed memory allocation for the JVM.
It is good practice to set Xms to 50% of the Xmx value (as far as I know).
A restart of the SMP server is needed for the changes to take effect.
I hope this is helpfull.
Søren Hansen
Now that we have the SODataEntitySet instance, we pick up each entity out of the entityset.
01 id<SODataEntity> entity = [entityset.entities objectAtIndex:row];
Obtaining the value out of the entity is demonstrated here:
01 NSString *propValue = (NSString *)[(id<SODataProperty>)entity.properties[propName] value];
Question - how do we pick up the value out of the complex type? - Here's the answer.
01 NSDictionary *details = (NSDictionary *)[(id<SODataProperty>)entity.properties[detailsName] value]; 02 NSString *propValue = (NSString *) [(id<SODataProperty>)details[propName] value];
So the complex type gets returned as the NSDictionary object.
Okie, so far we have done pretty much about Read operation. Let's move on to the CUD scenario.
First thing we need to understand is how we construct an entity. Here's the code snippet:
01 NSMutableArray *properties = [NSMutableArray array]; 02 id<SODataProperty> prop = [[SODataPropertyDefault alloc] initWithName:@"myKey1"]; 03 prop.value = @"My prop value"; 04 [properties addObject:prop]; 05 prop = [[SODataPropertyDefault alloc] initWithName:@"myKey2"]; 06 prop.value = @"Another prop value"; 07 [properties addObject:prop]; 08 // goes on and on.. 09 SODataEntityDefault *entity = [[SODataEntityDefault alloc] initWithType:@"MyEntity"]; 10 for (id<SODataProperty> prop in properties) { 11 [entity.properties setObject:prop forKey:prop.name]; 12 }
#02, #03, and #04 are creating key/value pair of each property. We'll repeat until we set all the property values for the entity. And #09, #10, 11, and #12 is iterating through to set the SODataEntity properties.
Note about #09 - the snippet uses an entity name as "MyEntity", but in an actual case, you need to qualify the entity type with the full namespace such as "RMTSAMPLEFLIGHT.Booking".
Now that you got an idea about how to work with an entity object, let's take a look at the CUD methods. As you have understood the Read operation, they should be very straightforward.
Create operation (= HTTP POST)
01 [onlineStore scheduleCreateEntity:entity collectionPath:@"CollectionName" delegate:self options:nil];
Update operation (= HTTP PUT)
01 [onlineStore scheduleUpdateEntity:entity delegate:self options:nil];
Delete operation (= HTTP DELETE)
01 [onlineStore scheduleDeleteEntity:entity delegate:self options:nil];
One coding remark about Update and Delete. Before invocation of the methods, make sure you set ResourcePath for the entity. The url value would be something like "TravelagencyCollection('00000105')" - something you can identify the entity in OData convention. In most case the setResourcePath: and editResourcePath: should set the same value but it depends on how your OData service is implemented.
Tip: If you already get the entity with the store, the entity should already contain these resourcePaths.
01 [entity setResourcePath:url editResourcePath:url];
And - Read operation (= HTTP GET)
01 // if you want to refresh/reload an entity 02 [onlineStore scheduleReadEntity:entity delegate:self options:nil]; 03 // or..specify the resource path 04 [onlineStore scheduleReadEntityWithResourcePath:resourcePath delegate:self options:nil];
That's pretty much all I want to share about the online scenario. You can be confident you got a solid fundamental about how OData online API works. Next blog will introduce you the onboarding API. I know - everyone is interested in offline API, but let me quickly cover the onboarding first.
See you in the next blog,
This guide will give a clear understanding on how to create an OData service for a given SAP Gateway data source. Here, i am using publicly available demo gateway service : Flight example
Service URL : https://sapes1.sapdevcenter.com/sap/opu/odata/IWFND/RMTSAMPLEFLIGHT/
Note: To access this URL, you must have an account on SAP Gateway Demo system. How to get access
Now,to make this service available through SMP 3.0 server, i am going to import it in eclipse and then will deploy to SMP server.
Tools Used: Eclipse Kepler, SAP Mobile Platform 3.0 SP04 PL01, Advanced REST Client
Prerequisite: Installing "SAP Mobile Platform Tools" in Eclipse Kepler Reference Document
2. Select Model Content as "OData Service URL" , Click "Next"
3. Provide the service URL https://sapes1.sapdevcenter.com/sap/opu/odata/IWFND/RMTSAMPLEFLIGHT/ and click "Go". Enter correct credentials to connect to sapes1.sapdevcenter.com server
Note: Not able to retrieve the service details? Look at Troubleshooting #1.
4. Once done, you can see the automatic creation of OData entities.
5. Next task is to assigning data sources to each and every Entitysets.
Note: How to identify what is the correct Namespace for a particular SAP gateway service? I generally prefer to a cross-check from step #9.
6. Right click project > Generate and Deploy Integrate Content
7. Now, i have to register RMTSAMPLEFLIGHT service in Gateway cockpit
|Destination Name
|Destination Type
|Destination URL
|Authentication Type
|Basic Authentication
User Name
|SAP Gateway Demo system usename
|SAP Gateway Demo system password
8. Select the "ES1" destination, click on "Test Connection". You should see a SUCCESS message.
Note: Not able to ping successfully? Look at Troubleshooting #2
9. Register Back-End service from ES1 sever
This is how it should look like:
Note: As you can see the "IWBEP" is the namespace of the service coming directly from server "ES1" and "SAP" is the namespace of the service deployed through Eclipse.
10. Add destination "ES1" to the service "SAMPLEFLIGHT" by clicking on it.
Note: I didn't find assigning a destination (ES1) to the deployed OData model (SAMPLEFLIGHT) since backend service (RMTSAMPLEFLIGHT) has already been registered in gateway cockpit. But for best practices it is good.
You should see that "ES1" destination has been mapped to service "SAMPLEFLIGHT".
11. Open "Service Document" as highlighted above. (Assuming you have created a security profile named "SAP" in admin cockpit)
This URL will return all entity sets contained in the service
12. To test each Entityset details, just add the Entityset name at the end of above URL.
a. http://smpserverip:8080/gateway/odata/SAP/SAMPLEFLIGHT;v=1/CarrierCollection('AA')
This URL will return carrier CARRIER NAME, CURRENCY CODE, URL for Carrier ID "AA"
b. http://smpserverip:8080/gateway/odata/SAP/SAMPLEFLIGHT;v=1/TravelagencyCollection
This will return all Travel Agencies details available in ES1 system.
c. http://smpserverip:8080/gateway/odata/SAP/SAMPLEFLIGHT;v=1/SubscriptionCollection
d. http://smpserverip:8080/gateway/odata/SAP/SAMPLEFLIGHT;v=1/FlightCollection
If you are using any proxy setting to access any external network, you may encounter below issues:
1. Connection timed out: connect
Resolution: Go to Windows>Preferences>Network Connections. Select Active provider as 'Manual' and provide proxy details for HTTPS. Check Reference Document for more details.
2. Connection has Failed: Connection to https://sapes1.sapdevcenter.com:443 refused
a. Set HTTP/HTTPS proxy settings in Admin cockpit. > SETTINGS>SYSTEM
b. Add the HTTPS certificate to the SMP Keystore. Reference Document
3. Could not retrieve services from the destination ES1
Set the proxy server details for the destination ES1. Go to path:C:\SAP\MobilePlatform3\Server\config_master\service.destinations\destinations
Open ES1. And proxy details.
e.g. Proxy=proxyserver:80
save the file and NO need of restarting SMP server.
4. When you try to access any entityset information, you are encountered with message saying "Error in Getting the service",
Check if you have missed registering the service as mentioned in step #9.
Follow these forums for latest update on SAP Mobile Platform 3.0 : SAP Mobile Platform Developer Center, SAP for Mobile
Note: Big thanks to Bjoern Woppmann for helping me in writing this blog.