OSMOSIS JONES RATING: 5/10
For more reviews and movie screensavers, visit http://www.joblo.com/
PLOT: This film takes place in two different worlds. One is the real world with human beings, starring Bill Murray as the really un-hygienic guy, and the other is the animated world inside Murray's body, consisting of cells and germs (that talk!) trying to run his system from within. Osmosis Jones is one of the cells inside his body.
CRITIQUE: A very original story told in a very unique manner that doesn't necessarily hold together as tightly as an overall picture, with limited laughs, tension or attachment to its characters, and very few memorable moments on which to chew afterwards. I've been impressed with quite a number of animated movies over the past couple of years, but this one just didn't do all that much for me. It's a movie that seemed lost in its journey to find the perfect target audience, by including bits and pieces for every cultural, age and ratings demographic, but just not coming together as an effective, cohesive whole in the end. Sure, a couple of laughs sprout up here and there, the disgusting stuff is really gross and Bill Murray should be commended for allowing himself to look so bad in this film, but does it entertain throughout? Not really. It's got its moments and it's definitely sparked by an original streak, with a very clever look at the inside of one's body by way of an "underworld" living within, but when all is said and done, I just sat there and didn't really feel much either way. And even now, when I look back, there isn't really much about the movie that bowled me over.
It's actually ideally suited for the video market. The kids will dig on the gross stuff like snot running out of a man's nose and a zit popping onto a woman's lips, the teens will likely appreciate the hip-hop soundtrack and most adults might get a kick out of Chris Rock's voice portraying a white blood cell. Just don't expect much "oomph" from this film, because that's one aspect which seems to have been left on the cutting room floor when the picture went from a PG-13 rating to a PG. In the end, the bad guy is kinda bad, the laughs are kinda funny and the ending is kinda predictable, all of which equal a so-so film, not required to be seen on the big screen. In fact, the last sequence in the film features some really awful CGI work (the eyelash stuff!) that felt like it still needed about a week's work and for the love of God and all that is holy in this world, can someone please tell everyone in Hollywood that we are no longer amused by MATRIX parodies...I mean, c'mon man!! But overall, the film does contain a handful of clever scenes featuring characters and places set inside our bodies, which did entertain me somewhat, so I guess I'm about half-half on this movie. Not a killer flick but definitely not a snoozer either.
Where's JoBlo coming from? Atlantis (5/10) - Emperor's New Groove (8/10) - The Iron Giant (5/10) - Kingpin (9/10) - Rocky & Bullwinkle (4/10) - Shrek (8/10) - Small Soldiers (7/10) - There's Something About Mary (7/10)
Review Date: August 10, 2001 Directors: Peter & Bobby Farrelly Writer: Marc Hyman Producers: Peter & Bobby Farrelly, Denis Edwards Actors: Chris Rock as Osmosis Jones (voice) Laurence Fishburne as Thrax (voice) David Hyde Pierce as Drix (voice) Genre: Animated Comedy Year of Release: 2001 ------------------------------------ JoBlo's Movie Emporium http://www.joblo.com/ ------------------------------------ (c) 2001 Berge Garabedian
========== X-RAMR-ID: 29165 X-Language: en X-RT-ReviewID: 243829 X-RT-TitleID: 1109255 X-RT-SourceID: 573 X-RT-AuthorID: 1021 X-RT-RatingText: 5/10
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


[PAPER] Facets of phylodiversity: evolutionary diversification, divergence, and survival as conservation targets.
Along with my coauthors from the California Plant Phylodiversity Project, I have a new paper on California plant conservation priorities out this month in PhilTransB. This project had both empirical and conceptual goals.
Empirically, we wanted to develop a rigorous spatial conservation prioritization for California plants, a highly biodiverse and threatened group. We built distribution models for each of the state’s more than 5000 plant species, assembled a new dataset on the protection level of every parcel in California, and combined this with data on landscape intactness in an prioritization algorithm to identify optimal sites for the creation of new protected areas. Our data are being used by organizations including The Nature Conservancy, the CA Department of Fish and Wildlife, and the California Native Plant Society as part of their spatial conservation planning efforts.
Conceptually, we also wanted to advance our thinking about how evolutionary information can inform conservation priorities. Phylogenetic diversity (PD) is a well known approach for incorporating information on species relationships into biodiversity assessments, and is often considered one of the core “biodiversity facets.” In this paper, I argue that PD itself actually has three facets associated with the three main macroevolutionary processes (anagenesis, cladogenesis, extinction), and that these facets are each connected to distinct conservation goals.
This project was a fun collaboration with a lot of folks, and it’s exciting to see it published! Along with the paper itself, I also created a web app called the California Plant Phylodiversity Atlas that lets folks explore the underlying data.


Daily Lotto: One lucky winner on Wednesday
Here are the results and payouts for Wednesday's Daily Lotto draw.
In case you missed it, here are Wednesday's Lotto, Lotto Plus 1 and Lotto Plus 2 results:
*Please note that the information provided herein is third party information. Whilst every effort is expended to ensure that the information provided is true and accurate, we are not responsible for errors, omissions or any loss which an individual may experience. See the National Lottery Terms and conditions here.
See the National Lottery Terms and conditions here .
Tap here to download the News24 Android App or here to download the News24 iOS App .


Virtues of the month of Muharram
Virtues of the Month of Allah Al-Muharram and the Day of Ashura
Article written by Mohamed Baianonie.
The Prophet (صلى الله عليه وسلم) was asked about which salah is the best after a person performs the obligatory salah. He replied, "The salah in the last third of the night." Then, he was asked about the best fasting after the fasting of the month of Ramadan. He replied, "The month of Allah that you call Al-Muharram."
[Recorded by Imam Muslim and others]
The Prophet (صلى الله عليه وسلم) referred to this month as the month of Allah as a way of honoring it.
Fasting was legislated on the tenth day of this month called the day of Ashura. Actually, fasting on this day was mandatory upon Muslims even before the fasting of the month of Ramadan. However, later when fasting the whole month of Ramadan was made an obligation, fasting on the day of Ashura became recommended.
Aishah said, "The tribe of Quraish used to fast on the day of Ashura in the Pre-Islamic Period of Jahiliyah, and Allah's Messenger used to fast on that day too and ordered others to fast as well. Later when the fasting of the month of Ramdan was prescribed, he gave up fasting on the day of Ashura and it became optional for one to fast on it or to leave its fast."
[Recorded by Imams Buhkari and Muslim]
During the life of the Prophet (صلى الله عليه وسلم), the Jews and the Christians used to fast on the day of Ashura, out of respect and reverence, because it was the special day on which Allah saved Prophet Musa and his followers, from Pharaoh and his soldiers.
Prophet Musa fasted on that day as a way of showing his gratitude to Allah for saving him and his followers.
Ibn Abbaas said, "The Prophet (صلى الله عليه وسلم) came to Al-Madinah from Mecca and saw the Jews fasting on the day of Ashura and asked them about their fasting. They replied, 'This is a good day, the day on which Allah rescued the children of Israel from their enemy. So, Musa fasted on this day.' Therefore, the Prophet (صلى الله عليه وسلم) fasted on that day and ordered (the Muslims) to fast on that day as well."
[Recorded by Imams Buhkari and Muslim]
In anther narration the Prophet (صلى الله عليه وسلم) said: "If I live to next year I will fast the ninth day (as well as the tenth)."
[Recorded by Imams Muslim and Ahmad]
From this hadith, we learn the historical importance of fasting on the day of Ashura. It is a good day in which Allah saved Prophet Musa and his followers from their enemy: Pharaoh and his soldiers. To show his appreciation to Allah, Prophet Musa fasted on that day. Furthermore, the messenger Muhammad and we are more worthy of honoring Prophet Musa than the Jews because we are the true followers of the message of pure Oneness that Musa and all the other messengers came with. Also to set us apart from the Jews in their fasting of this day, we follow the Prophet's orders to fast the day before and the day of Ashura.
The Prophet (صلى الله عليه وسلم) was asked about the rewards of fasting on this day and he replied: "It wipes off the sins of the last year."
[Recorded by Imams Muslim, At-Tirmidhi, and Ahmed]
The opportunity to fast on this day and reap its rewards is a blessing and mercy of Allah upon His believing servants. We ask Allah to help us fast on this day and accept it.


This is a simple issue tracking app built with MEAN stack.
My inspiration comes from Jira Software and Angular Jira Clone.


Event Driven Microservice architecture
How to build and scale services into the universe and beyond
Created by Martin Humlund Clausen
Bounded Context
- An organizational chart of an application
-
- Defines the application domain
- Consists of multiple highly cooperative micro services
General service bus
- Producer/Consumer
- Publisher/subscriber
- Input queue pr service
It puts a message on the bus
- Sends a message directly on to the consumer input queue
- One way communication
- Commands
It puts a message on Topic
- Sends the message to a Topic, that forwards messages into subscribing input queues
- One to many communication
- Events
Commands and events - recap
Commands
- Has side effects
- Modifies state
- Does not return a result
- Send directly to the Handling service input queue
- Contains information needed to Update the state
Events
- Describe a thing that has happened
- Published onto a Topic
- Only contains identifying properties
CQRS
Command Query Responsibility Segregation
What is it?
Separates the read from the writes
Commands via Service bus
- Has side effects
- Modifies state
- Does not return a result
Queries via Http
- Answers a request
- Does modify state
- Does return a value
Variations of CQRS
- Single database read/writes
- Two databases, one of writes and one for read models
- Event sourcing
Embrace eventual consistency!
But deal with it with it, accordingly
Keep your users informed on whats going on!
Use signal R
Micro service(s)
With a twist
- A Service should be small
- Centred around an Domain entity / Aggregrate root
- Clean architecture
- The twist...
Each service has two services
What is this mad man talking about?
Each service
- Contains all the logic for the Domain
- It has a Api service - To process queries
- It has a Worker service - To process services
- In the their own process
>
Why?
- Complete separation of read/writes
- Easy data migrations - Events and data synchronization are not affecting the users
- Self balancing - in due time
The real magic
Individual scalable components!
Show Api - relays commands


This page demostrates how to use the browser's performance API.
A fallen tree.
A birthday cake for a 1-year old.
Delicious food.


--- layout: default ---
An Open Source Project Bringing accessible technology to the touch screen domain.
Learn MoreTo create a product that will allow a visually impaired person to interact with any touch screen.
Touch screens are becoming more and more common in everyday life. Airplanes, movie theatres, grocery stores, mall directories and more all use touch screens to provide services. Unfortunately these touch screens often do not have any accessible features for someone who is unable to clearly see all of its elements. In general touch screens aren't accessible to someone who is visually impaired, and we aim to change that.
The OpenTheia project is a continuation of the WatVision project. This project aims to expand on the source code created in the the original. Originally this effort was part of a fourth year design project at the University of Waterloo. The original team has now all graduated and moved to different companies and locations in the world. Two of its members decided to continue the project under a new name: OpenTheia.
WatVision's Website
The entirety of the code for the OpenTheia project is opensource and aims to stay that way. All issues and development will be recorded on Github.
Currently, the team is working to release an app onto the Android app store. If you want to support us we are investigating machine learning and could always use more training data! Please send an email to<EMAIL_ADDRESS>if you want to learn more.
View the Source Code Here:
The original project that that this effort is a continuation of won multiple awards:
The James Dyson Award is an annual competition which has the goal: 'design something that solves a problem'. This open ended Engineering Design award was made to encourage engineering, and innovation.
The WatVision team is incredibly proud to have won the James Dyson 2018 award at the national level. The WatVision design competed with different engineering solutions from all over Canada.
Here are a small selection of the articles written about this achievement:
- Engineering students’ project captures national Dyson award - University of Waterloo
- Waterloo developed app that helps visually impaired wins award - Kitchener Today
- Please search for: 'WatVision James Dyson Award' if you want to learn more!
The WatVision team presented at the University of Waterloo Mechatronics Symposium and won two awards: The General Motors Innovation award, and also 2nd place in the People's Choice award.
The team aims to ensure that this technology becomes available to as many people as possible in the future, and any further news will be posted on this site, or you can subscribe to be notified by email below. Stay tuned!
The WatVision project was featured on SpringWise, a site that aims to promote and discover innovation. You can read the article about the project here.
The OpenTheia team is currently made up of two engineers. Craig Loewen and Lior Lustgarten.
If you want to get in contact with the team you can email us at:
<EMAIL_ADDRESS>We are happy to answer any questions about our project.


A few days ago I managed to get my hands on some pills called methadone. I wasn't exactly sure what they were at first but I soon found out. They were just used to treat opium addiction. Last night a few of my buddies and I decided to go camping out. I have had the pills for a while now, I was just alittle nervous about taking them, especially out in the middle of the woods. I asked my friends if something went wrong and I had an allergic reaction would one of them be sober enough to drive me to the emergency room, several of them said yea dont worry about it. I took one 10 mg pill at about 8 pm as we were sitting around the camp-fire.
I didn't really feel a thing until about an hour later. My body started tingling and I just felt real good. I thought to myself, I guess this is all the pills are going to do to me, I'll be fine if I drink a few beers. After I drank about 2 beers I was feeling great, I honestly can't describe it. I can really tell why these pills are so addictive, I absolutely love the way they made me feel.
I drank about 3 more beers and as soon as I finished number 5 one of my friends showed up with some reefer. I told him I was really messed up and he asked me if I wanted to smoke. Of course I said yea. We went to his SUV and smoked 2 bowls out of my pipe. I was feeling fine and walked back to the fire. When I went to go sit down that was when I realized I was extremely messed up, the marijuana just increased my high from the pill.
It was 23 degrees and I couldn't feel a thing, the weather seemed like a perfect spring day. At about 12 I had to go back to my friends house that I was spending the night with. I walked into his kitchen and all of a sudden everything started spinning in one giant circle, kind of like when your drunk but 10 times worse. But I never got sick from it.
I laid down and fell asleep at about 1 am. I woke up the next day at around 12 pm and I felt sort of out of it. My body was still pretty numb and I felt just relaxed. I figured the pill would have worn off by now, 24 hours after I took it. Overall it was a great experience but I would reccomend being extremely careful in taking them. I've took many differnt kinds of pills but nothing was like taking methadone. I honestly don't know if I would ever take one again because I can get an endless supply of them. That would be really difficult to explain to my parents why their 16 year old son is addicted to synthetic heroin.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


ObjMarkDirty(), ObjSaveBlock()
Nearly all applications will save and restore their state so the user may shut down and return to precisely the same configuration he or she left. Saving of state is almost entirely contained within the system software; for the most part, only UI objects are saved to state files. You can, however, mark other object blocks and data for saving to a state file.
The state file for an application is a VM file containing object blocks. Only object blocks may be saved to the state file, though you can save LMem data by setting up object blocks with only data chunks in them. (Create the blocks with
MemAllocLMem()
, passing type LMEM_TYPE_OBJ_BLOCK, then simply use
LMemAlloc()
to allocate data chunks.) For more information about managing LMem and data chunks, see the Local Memory chapter. You can also save an extra data block to the state file using MSG_GEN_PROCESS_CLOSE_APPLICATION
and
MSG_GEN_PROCESS_OPEN_APPLICATION
. In the close message, you can return the handle of an extra block to be saved to the state file; in the open message, the handle of the extra block is given to you, and you can restore this data as necessary. See the reference information for these messages under
GenProcessClass
for more information.
When a state file is saved, the system recognizes and saves only the dirty (modified) objects and chunks. Later, when state is restored, the system merges the changes in the state file with the original object blocks, resulting in the state that was saved.
For individual objects or entire object blocks to be saved to the state file, they must be marked dirty. Generic objects automatically mark themselves dirty at the appropriate times, so you don't have to worry about them. To mark other objects dirty, use the routine
ObjMarkDirty()
. Each object which has been marked dirty will be saved to a state file when appropriate.
State files are dealt with at only two times: First, when the system starts up, it will check for the existence of application state files. If a state file exists, the system will attempt to load the application belonging to it; after loading the application's resources, it will merge the state changes with the default settings to restore the original state.
The second time state files are used is when the system shuts down. A simple shutdown (called a "detach") is invoked only by the UI and is not abortable. When a detach occurs, the system shuts down all geodes as cleanly and quietly as possible, saving them to state files. Only certain geodes will respond in extreme cases, offering the user the option of delaying the detach or cancelling an operation in progress. An example of this is the GEOS spooler; if one or more jobs are actively printing or queued for printing, the spooler will ask the user whether the job should continue and the detach be delayed, or whether the job should be aborted or delayed until the next startup. The spooler can not abort the detach in any case.
Another type of detach is called a "quit." Any geode may invoke a quit, which is actually a two-step detach. A quit will first notify all other geodes that the system will soon be detaching; other geodes then have the chance to abort the quit if they want. For example, if a terminal program were downloading a file and received a quit notification, it could ask the user whether she wanted to abort the quit or the download. If the user wanted to finish the download, she would abort the quit; if she wanted to quit, she would abort the download. The system would then either shut down via a normal detach or stop the quit sequence.
When a geode is first launched, no state file exists for it. The state file is not created until the geode is actually detached to a state file. If a geode is restored from a state file, the file will exist until the geode is detached again. A geode that gets closed (not detached to state) will remove any state file it may have created during a previous detach. A geode that is detached to state will create or modify its state file as appropriate.
The state of an application (how it was launched) is reflected in the
GAI_states
field of the GenApplication object. To retrieve the application's state, send it
MSG_GEN_APPLICATION_GET_STATE
. It will return a value of
ApplicationStates
. The most frequent use of this message is by applications that need to know whether a "quit" is underway when their process objects receive the
MSG_GEN_PROCESS_CLOSE_APPLICATION
message; the process object will query the GenApplication and see if it is in the AS_QUITTING state.
In addition to the above state-saving functionality, the kernel provides two routines that translate handles between the state file and memory.
ObjMapSavedToState()
takes the memory handle of an object block and returns its corresponding state file VM block handle.
ObjMapStateToSaved()
takes the state file VM block handle and returns the corresponding memory block handle, if any.
If your application's documents are VM files, it is a very simple matter to save document state. In fact, if you use the GenDocument and document control objects, they will take care of document state saving for you. Be sure that the VM file has the VMA_BACKUP flag set in its
VMAttributes
; then you can simply call
VMUpdate()
on the document file. (Note--do not use
VMSave()
instead; it will erase the backup and lock in the user's changes to the document.) If you are not using GEOS VM files, it is up to you how and if you will save the document's state. For more information about GEOS VM files, see the VM chapter.


Toggle navigation
Menu
Skiwer
Home
About
Post
Login
Logout
Man must explore, and this is exploration at its greatest
Problems look mighty small from 150 miles up
Posted by
skiwer
on August 24, 2014
文章标题：
标签：
概要：
文章内容：
提交


What do you want to do today?
Manage my reimbursements
Submit a new reimbursement
Refresh info
Log out


Overview:
Hospitality World is the multi-dimensional development of Virtual Communities by:
or by location such as:
which will evolve through common interests and goals. These communities are not limited to these categories and will be determined on the basis of inter-dependence for mutual benefit.
The foundation of the community will be a gathering of people by mind thought energy who believe that mankind has the knowledge for balanced personal and social transformation. This knowledge will be reflected by action that speaks louder than words. It will recognize that it is more important how we treat others than what we think they believe. We will understand that mankind is all one in the global village and by helping others we help ourselves. We will communicate through, Hospitality World, the science of human relationships for short term operational objectives and long-term personal and philosophical goals.
Commerce and employment provide the basic resources for a community to operate. Hospitality World has developed a model software program, "Share the Wealth," that compensates investors and employees in a system of balance. Investors are recognized with a fair return on investment and each employee shares in the profits recognizing their contribution to the total success of the business. The major asset in any activity is its people.
HISTORY
In 1996, Don Drumm, artist, sculptor, and philosopher, a long time friend of Spiro Goumas, introduced him to Jim Naus, operator of a cyber cafe, Coffee Configur@tions near the University of Akron. This introduction was the seed that began to develop a Hospitality World strategic alliance organizing team that has the vision and the talent to implement Hospitality World concepts.
Through Jim, Spiro was introduced to Don Mayer and Suzi John, owners of pidwanger productions, an innovative new multi-media and internet content development team in Massillon, Ohio. During several of the initial meetings of this group, Spiro relayed his philosophies of balance and asset distribution within the food industry specifically, and in the universe in general. Sparks began to fly. With the internet as a communication medium, Spiro now revitalized his ideas about Hospitality World and began to realize that the means were now available to make this dream a reality.
The next entity to join the Hospitality World team was Cantec Communications, an internet service provider owned and managed by Dave and Rita Bigham, of Canton, Ohio. Dave is a QC Engineer for Bailey Controls in Cleveland and Rita is a teacher in middle school for the Massillon City Schools. This added the technical aspect to the team. Soon this group was meeting on a regular basis. Jim Naus has put Coffee Configur@tions up for sale and is now working full time developing and promoting Hospitality World and selling web sites for pidwanger productions.
In July of 1997, the Hospitality World team added Randy and Marsha Linquist to the team. Randy is owner of Trivium Coffee Cafe with locations in Akron and Canton, Ohio and is also a writer/philosopher. His role in the Hospitality World concept is to assist in the development of newsletters, promotion of the Hospitality Concept ... and offers his restaurant as a meeting place.
The Hospitality World headquarters are located in Bath, Ohio. The office there offers a meeting place for clients from the Cleveland area.
In the course of "growing" HW (it IS very organic), Don stumbled across Terra Vista, a multi-user VRML 3-dimensional community. Don's initial idea was to take this existing world and give it a sense of purpose and to assist in its development. He realized the vision and spirit were there, but the project lacked the vitality and focus necessary to survive. Don enthusiastically presented the idea of incorporating an existing "community" into the existing concept of Hospitality World to the HW board of directors, but was met with a lukewarm reception. It was a difficult concept to grasp.
After several weeks of careful meditation and searching, Spiro realized that Don's idea was exactly what was needed to give Hospitality World its unified focus. The Terra Vistans teamed with pidwanger productions will be the developers and builders of the virtual community real estate. Terra Vista offered the community, Hospitality World offered the commerce. Separately, they were viable entities, but together they provide the balance necessary to their mutual success.
IMPLEMENTATION:
Hospitality World will plant the seeds and cultivate development of virtual communities in various categories, with a team that has the technical tools integrated with the philosophical wisdom to set in motion virtual communities for the purpose of personal and social transformation.
People within the following physical communities will provide the foundation for the corresponding virtual communities:
Communications Vehicles:
Information update and access will be key elements in the success of Hospitality World. It would be ideal if all Hospitality World members had access to the Internet and our member-exclusive web page. Unfortunately, that will not be the case - especially for the smaller or start-up enterprise. We will have to, therefore, make information available in a variety of media to satisfy our member obligations and requirements. We envision:
The Hospitality World concept has been designed to have local, national and international application. For that to happen, however, it will be necessary to create a detailed "operations manual" that identifies the actual application of all the systems and philosophies embodied in this marketing outline.
This operation manual must include actual "templates" of all operational systems, computer programs, administrative forms and "how to" guides to successfully launch, grow and administer the Hospitality World concept.
This will give rise to local/national/international web sites as well as membership directories. Although each Hospitality World "cell" will predominantly service the needs of a local or regional operating area, it will have broader implications and resource capabilities as the organization grows. Eventually local, regional, national and international access capabilities will bring the Hospitality World concept to full potential.
Cyber Cafe: The future of Hospitality World, and the industry, is in the concept of the "Cyber Cafe." It represents a physical and electronic gathering place much the same as the old English Public Houses.  It is the embodiment of mind and body balance. As more and more individuals avail themselves of electronic resources for all aspects of their personal and professional lives, a focal point of activity will become critical to their well-being from every aspect of their lives.
Promotional Media:
Although word-of-mouth will be a key mechanism for the initial launch and development of Hospitality World, sustained growth, both locally and beyond, will require a targeted media program for general awareness, member solicitation and industry credibility. When reviewing options, two vehicles make the most sense from a perspective of ROI and overall effectiveness:
Summary:
Hospitality World is a new, enlightened way of looking at the necessary link between business and personal growth. To a great extent, business has been seen as distinct and separate from spiritual development and, in some cases, moral considerations.
We have seen over the years, however, that those businesses that succeed and prosper understand the absolute need for a holistic approach to business and personal growth. Spiro Goumas, founder of Hospitality World, views it as the universal need " ... to communicate the science of human relationships through the economic system of balance."
The ultimate goal of Hospitality World is a system of sharing and development that will enhance the total process of doing business, from concept to end user, in a balanced and equitable way that acknowledges and rewards the efforts of every individual who contributed to the success of the enterprise. Or, as Spiro states it, "Hospitality World is a gathering of business enterprises for profit working together in balanced relationships."
HOSPITALITY WORLD F.A.Q. SHEET
WHAT IS HOSPITALITY WORLD?
Hospitality World is a philosophy of life that confirms we are spiritual beings living in a body. Mind, body, spirit, cannot be separated from our lives. Social, economic, or political, we need to maintain a universal balance. All actions of our lives reflect who we are.
Our institutions: family, education, religion, business, government, society are treated as separate entities. We have separated ourselves from our source, the universe. Anything that separates us from our origin is an illusion.
Money and food are basic physical and material needs. Hospitality World is a gathering of people who believe these two resources can effectively communicate "hospitality" as a science of human relations, providing a lifestyle to bring us in balance with the universe and each other.
The internet provides a unique opportunity to materialize these concepts to everyone, everywhere, anytime.
Q. Why is Terra Vista involved and what is in it for the Terra Vista community?
A partnership in the Hospitality World concept offers Terra Vista free rent, a place to build and grow, a place to play, increased publicity, a chance to participate in a "social transformation." This is a chance to take part in a new model of doing business with no strings or restrictions other than those that are self imposed. This can become a showcase for individual talents, a place to meet people, a place to check the local restaurant and movie schedules, or order a pizza online ... the possibilities are endless!
Hospitality World will thrive because it works in balance and in cooperation with an established community of people who understand what a cyberspace community is all about.
Where are you? What's going on in your town, village, state? This community will have no boundaries and is free to encompass the entire planet.
Q. Who will be able to view the HW/TV communities?
Everyone is welcome into the community. We may have areas that have restricted access such as private meeting rooms for industries and businesses, but the basic communal structure will be open to everyone. The concept is to allow this community to evolve freely. Restrictions will be applied if and as necessary. The entire idea is to allow for a free evolution.
Q. What are the minimum requirements for access?
We are targeting P100 with a decent video card as minimum specs, however this is not a restriction. Anyone can develop worlds aimed at slower machines. We are targeting the business end by designing today to be good tomorrow. The community end will be allowed to evolve to include everyone!
Q. Is the basis for Hospitality World within the confines of the "real world?" Are the buildings representing existing architecture?
The buildings in the Hospitality World VRML representation are based on existing and potential new or transformed buildings. A business person who is proud of his existing location should have a showcase for his establishment. Central to transforming existing buildings is the concept of co-operative real estate where landlords can maintain their equity and allow tenants to become partners.
Q. Is the intent of the project to be for "entertainment," or are we trying to promote the associated companies through "traditional" advertising?
Hospitality World seeks to avoid all traditional means of advertising. It is not opposed to displaying signs, etc., in business areas, but in the community area, we don't want people to feel bombarded with advertising, slogans.
The actual means of presenting a business will have to be determined by the owner. It is our job to convince him that we are looking for interesting content and context. Most of the businesses who are interested understand this and are in full agreement.
Q. Do you have any more focused knowledge of our business target market, and is the purpose of Hospitality World to attract a "traditional" market to these companies, or are we looking for more?
We aren't doing "traditional" anything. We are breaking the mold here! We are involved at the very root of designing a new paradigm, what Marilyn Ferguson calls a "social transformation." The rules are changing and we are at the core of writing the new rules. We have a groundwork of businesses and organizations and communities who realize this and are willing to work together to accomplish this.
As far as focused knowledge of our target, Spiro Goumas, originator of the HW concept, has some of the best contacts in diverse social, economic and political settings. We are already seeing the market expand astronomically and we are going to try to attract experts in each field with the same vision.
We were fortunate enough to make acquaintance with Phillip Nabors, the owner of the Mustard Seed Market in Fairlawn, Ohio. The Mustard Seed is rated as one of the best Organic Food Markets and restaurants in the country. Phillip looks like Pete Townsend with a pony tail, was sporting Bugs Bunny socks and red Converse All-stars. He has lived in communes and is very politically involved. He has appeared before senate committees with Ben Cohen (Ben & Jerry's) promoting the ban of Bovine Growth Hormones. His vision is to build a virtual market where one can click on any product and see its origin, how it is made, etc. He has done the necessary research. Nabors has the key for developing the food industry virtual community
We are doing nothing "traditional!"
SUMMARY:
Hospitality World as a concept was the evolution of a 30-year vision from Spiro Goumas's career experience in the food industry. This vision was formalized with graphics and philosophical writings in 1979. Hospitality World was incorporated in 1982 as a profit-making corporation. In 1993 it was activated with a Federal ID number as a food consulting company. Present technologies with the strategic alliance team gathering make the dream possible working with the Universal Energy.


Replaces a for-comprehension by the equivalent calls to flatMap, map, withFilter, and foreach.
flatMap
map
withFilter
foreach


You may change the behavior using some css classes. For example this text will not hide
when you expand the table below.
HTML:

You may change the behavior...

This text will be hidden after expand

CSS:
/*expageExpanded - added to the container when content is expanded*/
.expageExpanded th {
color: blue;
}
| This text will be hidden after expand. Also the table headers font color will became blue |
| 2012 |
Total |
|
C 22 |
C 21 |
C 20 |
C 19 |
C 18 |
C 17 |
C 16 |
C 15 |
C 14 |
Older |
| July |
42.9% |
|
0.3% |
0.7% |
35.4% |
2.7% |
1.3% |
0.6% |
0.4% |
0.3% |
0.2% |
1.0% |
| June |
41.7% |
|
|
0.4% |
1.6% |
35.4% |
1.5% |
0.7% |
0.4% |
0.3% |
0.3% |
1.1% |
| May |
39.3% |
|
|
0.1% |
0.5% |
15.8% |
19.8% |
0.9% |
0.5% |
0.3% |
0.3% |
1.1% |
| April |
38.3% |
|
|
|
0.3% |
0.9% |
31.3% |
3.4% |
0.6% |
0.3% |
0.3% |
1.2% |
| March |
37.3% |
|
|
|
|
0.6% |
1.5% |
31.9% |
1.0% |
0.4% |
0.4% |
1.5% |
| February |
36.3% |
|
|
|
|
0.3% |
0.9% |
17.1% |
15.3% |
0.6% |
0.5% |
1.6% |
| January |
35.3% |
|
|
|
|
|
0.3% |
1.1% |
30.5% |
1.1% |
0.6% |
1.7% |
| |
|
|
|
|
|
|
|
|
|
|
|
|
| 2011 |
Total |
C 17 |
C 16 |
C 15 |
C 14 |
C 13 |
C 12 |
C 11 |
C 10 |
C 9 |
C 8 |
Older |
| December |
34.6% |
0.7% |
13.4% |
17.8% |
0.9% |
0.4% |
0.4% |
0.2% |
0.2% |
0.1% |
0.1% |
0.4% |
| November |
33.4% |
0.4% |
1.0% |
28.1% |
1.6% |
0.5% |
0.5% |
0.2% |
0.2% |
0.1% |
0.1% |
0.7% |
| October |
32.3% |
|
0.5% |
3.3% |
25.5% |
0.9% |
0.8% |
0.3% |
0.3% |
0.1% |
0.1% |
0.5% |
| September |
30.5% |
|
|
0.7% |
11.2% |
16.0% |
1.1% |
0.3% |
0.3% |
0.1% |
0.1% |
0.7% |
| August |
30.3% |
|
|
0.3% |
1.0% |
21.2% |
6.0% |
0.5% |
0.3% |
0.1% |
0.2% |
0.7% |
| July |
29.4% |
|
|
|
0.7% |
1.2% |
25.3% |
0.7% |
0.4% |
0.2% |
0.2% |
0.7% |
| June |
27.9% |
|
|
|
0.2% |
0.8% |
17.3% |
7.6% |
0.8% |
0.2% |
0.2% |
0.8% |
| May |
25.9% |
|
|
|
|
0.3% |
1.1% |
21.0% |
2.2% |
0.3% |
0.3% |
0.7% |
| April |
25.6% |
|
|
|
|
|
0.6% |
1.9% |
21.3% |
0.6% |
0.4% |
0.8% |
| March |
25.0% |
|
|
|
|
|
0.1% |
0.8% |
14.8% |
7.7% |
0.6% |
1.0% |
| February |
24.1% |
|
|
|
|
|
|
0.2% |
0.9% |
17.0% |
4.8% |
1.2% |
| January |
23.8% |
|
|
|
|
|
|
|
0.7% |
1.3% |
20.4% |
1.4% |
| |
|
|
|
|
|
|
|
|
|
|
|
|
| 2010 |
Total |
|
|
|
|
C 9 |
C 8 |
C 7 |
C 6 |
C 5 |
C 4 |
Older |
| December |
22.4% |
|
|
|
|
1.2% |
16.6% |
3.5% |
0.4% |
0.4% |
0.2% |
0.1% |
| November |
20.5% |
|
|
|
|
0.6% |
0.9% |
17.7% |
0.7% |
0.4% |
0.2% |
0.0% |
| October |
19.2% |
|
|
|
|
|
0.3% |
5.6% |
12.3% |
0.6% |
0.2% |
0.2% |
| September |
17.3% |
|
|
|
|
|
|
0.6% |
11.4% |
4.9% |
0.3% |
0.1% |
| August |
17.0% |
|
|
|
|
|
|
0.1% |
1.3% |
15.1% |
0.3% |
0.2% |
| July |
16.7% |
|
|
|
|
|
|
|
0.8% |
15.3% |
0.4% |
0.2% |
| June |
15.9% |
|
|
|
|
|
|
|
0.7% |
13.9% |
1.1% |
0.2% |
| May |
14.5% |
|
|
|
|
|
|
|
0.3% |
3.4% |
10.6% |
0.2% |
| April |
13.6% |
|
|
|
|
|
|
|
|
2.5% |
10.8% |
0.3% |
| March |
12.3% |
|
|
|
|
|
|
|
|
1.7% |
10.4% |
0.2% |
| February |
11.6% |
|
|
|
|
|
|
|
|
1.0% |
10.0% |
0.6% |
| January |
10.8% |
|
|
|
|
|
|
|
|
|
2.8% |
8.0% |
| |
|
|
|
|
|
|
|
|
|
|
|
|
| 2009 |
Total |
|
|
|
|
|
|
|
C 4 |
C 3 |
C 2 |
C 1 |
| December |
9.8% |
|
|
|
|
|
|
|
1.9% |
7.7% |
0.1% |
0.1% |
| November |
8.5% |
|
|
|
|
|
|
|
1.1% |
7.1% |
0.2% |
0.1% |
| October |
8.0% |
|
|
|
|
|
|
|
0.5% |
7.0% |
0.4% |
0.1% |
| September |
7.1% |
|
|
|
|
|
|
|
0.4% |
2.7% |
3.9% |
0.1% |
| August |
7.0% |
|
|
|
|
|
|
|
|
0.8% |
6.1% |
0.1% |
| July |
6.5% |
|
|
|
|
|
|
|
|
0.3% |
6.0% |
0.2% |
| June |
6.0% |
|
|
|
|
|
|
|
|
0.2% |
4.6% |
1.2% |
| May |
5.5% |
|
|
|
|
|
|
|
|
|
0.8% |
4.6% |
| April |
4.9% |
|
|
|
|
|
|
|
|
|
0.4% |
4.4% |
| March |
4.2% |
|
|
|
|
|
|
|
|
|
0.2% |
3.9% |
| February |
4.0% |
|
|
|
|
|
|
|
|
|
0.1% |
3.8% |
| January |
3.9% |
|
|
|
|
|
|
|
|
|
0.1% |
3.7% |
| |
|
|
|
|
|
|
|
|
|
|
|
|
| 2008 |
Total |
|
|
|
|
|
|
|
|
|
C 1 |
Beta |
| December |
3.6% |
|
|
|
|
|
|
|
|
|
1.6% |
2.0% |
| November |
3.1% |
|
|
|
|
|
|
|
|
|
|
3.1% |
| October |
3.0% |
|
|
|
|
|
|
|
|
|
|
3.0% |
| September |
3.1% |
|
|
|
|
|
|
|
|
|
|
3.1% |


Alstahaug Marathon
Alstahaug NOR
Race Winners
(31 runnings)
09 Jun
2007
2006
---
---
11 Jun
2005
12 Jun
2004
14 Jun
2003
2002
09 Jun
2001
17 Jun
2000
12 Jun 1999
13 Jun
1998
1997
1996
10 Jun 1995
1994
12 Jun 1993
1992
1991
16 Jun 1990
1989
1988
1987
1986
1985
Note: 1985 is believed to have been the inaugural year.
11 Jun
2016
2:58:13
Emil Sorsell (NOR)
4:35:44
Karina-Sharon Fagerbakk (NOR)
13 Jun
2015
3:19:39
Jan-Helge Balto (NOR)
3:37:57
Karin Kjensli-3
14
Jun
2014
3:06:09
Martins Mikelsons
3:45:10
Karin Kjensli-2
08
Jun
2013
3:01:48
Andris Koskevics (LAT)
3:39:47
Sigrid Hjelle (NOR)
09 Jun
2012
3:18:59
Rune-Andre Jensen (NOR)
4:01:54
Karin Kjensli (NOR)
18 Jun
2011
3:07:39
Jan-Billy Aas (NOR)
4:56:04
Marit Ludvigsen-2
12 Jun
2010
3:28:39
Ole Forren (NOR)
4:31:15
Marit Ludvigsen (NOR)
13 Jun
2009
2:59:53
Vidar Skjerve (NOR)
14 Jun
2008
3:22:13
Eiolf Eivindsen-2
2:55:32
Jan Halland (NOR)
4:18:05
Lotte Guri-Bjogfellmo (NOR)
not held
not held
2:43:36
Roger Johansen (NOR)-2
3:32:28
Ria Buiten (NED)
2:45:25
Roger Johansen (NOR)
3:02:43
Jon Nersund-2
---
n/a
---
n/a
2:52:35
Tom-Roger Tangen (NOR)
---
n/a
2:51:33
Eiolf Eivindsen (NOR)
---
n/a
2:51:37
S Solfjeld (NOR)
---
n/a
2:47:12
Jon Nersund (NOR)
3:57:04
Ida Salbakk (NOR)
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
2:34:14
Bernt-A Stigum (NOR)
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
---
n/a
Most Wins (1984-date)
Men
2
Jon Nersund (NOR)
1998,2003
Roger Johansen (NOR)
2004-05
Eiolf Eivindsen (NOR)
2000,2008
Women
3
Karin
Kjensli (NOR)
2012,2014-15
Prize Money
No information on prize money has been received for this race.
Race Time Bias
Insufficient data to calculate race time bias.
Competitive Level
Insufficient data to calculate the competitive level.
Quality Performances
Men No man has run under 2:20. Women No woman has run under 2:50.
Last Updated on
05 Jul 2016
Contributors: Klaas Loonstra (50), Juraj Gasparovic (18)


John Legend to perform in Cascais
American musician John Legend, recently considered the sexiest man alive, responsible for songs such as “All of me” and “Ordinary People”, returns to Portugal in July for a concert at the CoolJazz festival in Cascais was announced on 20 November.
John Legend performs on 3 July at the Manuel Possolo Hippodrome, one of the venues in Cascais that will host the EDP CoolJazz festival shows, according to promoter Live Experiences.
Recently considered the "sexiest man alive" in the annual poll of American magazine People, the singer, musician, songwriter, producer and actor edited the debut album "Get Lifted" in 2003.
This was followed by “Where Again” (2006), “Evolver” (2008), “Wake Up” with The Roots (2010), “Love in the future” (2013) and “Darkness and light” (2016).
After that, among other stages of his career, he was co-producer and author of the movie “La La Land”, winner of seven Golden Globes and six Academy Oscars.
Over the course of his career, John Legend has racked up “a total of 33 awards and 88 nominations,” including Emmy, Grammy, an Oscar (in the category of “Glory” Best Music in the movie “Selma”, which he shares with 'rapper' Common) and a Tony, recalls Live Experiences.
John Legend debuted live in Portugal in 2013 at CoolJazz, at a time when the festival was taking place in Oeiras. After that, he performed twice more in Portugal: in 2015, at the Marés Vivas festival in Vila Nova de Gaia, and in 2017 at the Altice Arena in Lisbon.
For the 17th edition of the CoolJazz festival had already been announced the concert of Lionel Richie, on 25 July, also at the Manuel Possolo Hippodrome.


|
PassionsWhen The Guiding Light opened the era of televised soap operas in 1952, its creators could scarcely have imagined that the genre would eventually evolve to produce the gleefully bizarre and misanthropic viewing experience known as Passions.Wedding a keen ear for soap opera cliche with an obnoxious love for fetishistic extremes, Passions is not so much a parody of a soap opera as a completely straightforward soap opera in which all the normal ingredients are taken to absurd extremes. Debuting on NBC in 1999, Passions was the brainchild of veteran soap writer James E. Reilly, who had made a name for himself by transforming the venerable Days of Our Lives into a freak show throughout the 1990s. His plotting verged on the ridiculous, perhaps most infamously with the Satanic possession of the show's leading diva Dr. Marlena Evans and her subsequent exorcism by former assassin, ongoing amnesiac and conveniently also a former priest John Black. Many longtime Days fans were horrified by the liberties Reilly took with their beloved characters and his callous disregard for previous continuity -- a key element in most soaps, especially those that have run for decades. Reilly left Days to create Passions, which NBC hoped would recreate the ratings success Reilly had experienced on Days. Freed from any requirement to placate pre-existing fans, Reilly crafted a venue for his most deranged imaginings, the small New England town of Harmony. Passions employs a series of innovative storytelling strategies which endear it to some fans and infuriate others. These include: Infinite Time Scaling: Historically, soaps have roughly paralleled the passage of real time, i.e., one episode generally corresponds to about one day of story time (with exceptions for weddings and special events). On Passions, about 10 to 12 story days pass in the course of an entire year of episodes. A single day can take months to play out in episodes, at which point the next day magically starts and winter has become spring without explanation. It's not uncommon for Valentine's Day to take place one story day after New Year's Eve, for instance. No one ever comments on this, even when the scaling bizarrely impacts pregnancies (such as a recent case which played out over 11 months of television but only lasted four story days, of which the character showed a belly for only a week before delivering her child). Endless Recaps: Presumably, the producers of Passions expect that people only watch the show two or three days a week. Every single episode is packed with endless recaps and flashbacks of what happened in previous episodes, even when what happened previously is nothing (as is often the case). Extreme Suspension of Disbelief: Most television requires some suspension of disbelief, but good television provides internal consistency and logic. When you watch Passions, you get the distinct impression that its plots are based on the rule of "Hey, wouldn't it be cool if we did this?" and nothing else. There is no effort to make story developments consistent with common sense, or even consistent with what happened five minutes earlier. This allows a great deal of creative freedom, but requires extremely tolerant viewers. Imagine watching two six years olds playing with dolls and you'll get the general idea. Total Amorality of Viewpoint: While individual characters are often highly moralistic, the show itself is grounded in a completely amoral worldview in which just about anything is fair game. Although the show's audience is mostly made up of teenage girls, Passions seems to delight in sending these impressionable youths such messages as "incest is romantic" and "girls get raped because they're slutty." The show also sends the message that it's OK to win over your true love using pacts with the devil, date-rape drugs or whatever else happens to be at hand. Unreasonable Fakeouts (aka "Your baby is dead."): As a rule, you can't trust anything on Passions unless it's gone on for at least two episodes. The writers delight in showing much anticipated scenes (such as lovers reuniting) for an entire episode, only to have them turn out to be a dream after a ludicrous amount of time has passed.  Despite these innovations and a wicked sense of humor (that surfaces most often in over-the-top fantasy sequences), Passions exploits the usual soap conventions to great effect, and often to absurd extremes, including the "peering in the window" scene, the "gratuitously shirtless male" scene, the "long thoughtful look before a commercial break" scene and the "uber-romantic spur-of-the-moment candle-lit picnic" scene. In keeping with Soap Opera 101, the show also features three or four key families whose members come from different classes of society. Unlike most other soaps, however, the families of Harmony are a decidedly multicultural bunch. The wealthy scions of the town are the lily-white Cranes, the wealthiest family in the world, whose mogul-patriarch Alistair Crane (much like another famous A.C.) is the embodiment of evil. Alistair is also a stark-raving racist, a fact that fuels much of Harmony's activity. On the other end of the economic spectrum is the Lopez-Fitzgerald clan, the product of marriage between the long-suffering Pilar Lopez and the long-absent Martin Fitzgerald. The kids tend to be far more Hispanic than Irish, despite the fact that most of the actors portraying them are visibly unable to speak Spanish. The third-most prominent family are the African-American Russells. Matriarch Eve Russell harbored a secret past as a drug addict and loose woman who had a torrid affair with Julian Crane (son of Alistair), before becoming a doctor specializing in everything from pediatrics to brain surgery. Her husband, T.C., has a bad temper that leads to frequent and hilarious fight scenes that you really have to see to appreciate. Other characters in Harmony included Charity Standish, a strange-looking young woman with mystical powers, and her nemesis, Tabitha Lenox, a centuries-old witch who keeps the forces of Hell in her basement. Sam Bennett, Harmony's chief of police, has exactly two approaches to the many, many crimes that take place in his jurisdiction -- he either instantly solves them without explanation, or never, ever, ever solves them. As you might expect, most crimes fall into the latter category. Then there's the Wallace family, with psychotic daughter Beth, incontinent mother Edna and Edna's healthcare aide Precious, an orangutan (who recently departed the show). Beth is Harmony's "ugly" girl (i.e., a brunette with a bad haircut portrayed by a former Miss USA). Beth and Precious both pine after Luis Lopez-Fitzgerald, the top hunk in town. Despite protests by both animal activists and humorless nurses, Precious was known for engaging in elaborate and steamy costume fantasies about Luis. But Luis only has eyes for long-suffering heiress Sheridan Crane, whom he has pursued across several lifetimes with the assistance of reincarnation. According to the show's lore, there are two reasons why Sheridan and Luis can never be together:
These two factors ensure that Luis and Sheridan will face an ever-more-ridiculous series of obstacles to their love. Not that anyone else in town finds love an easier row to hoe. The couples who manage to hook up for any length of time are invariably separated by the emergence of a dark secret from the past. Passions has enjoyed a recent run of mainstream buzz thanks to one of the more noteworthy dark secrets to emerge from the past, the fact that teen supercouple Chad Harris and Whitney Russell are half-brother and sister. The "oops, it's incest" storyline is a hoary old soap opera standard, but Passions has extended the concept to its typical extreme. The classic formula is "boy meets girl, boy and girl fall in love, boy discovers he is girl's brother, relationship is shattered forever and everyone moves on with their lives." But that would be far too easy. First, Passions clued in viewers to the fact that Whitney and Chad were siblings very early, then lingered adoringly over their hot, steamy sex scenes for months. Then, Whitney became pregnant. Five minutes later, she discovered Chad was her half-brother. Whitney tricked everyone into believing another guy was the father of her baby (including the other guy and Chad). Although she was morally incapable of getting an abortion, she didn't have any problem trying to starve herself into a miscarriage while repeatedly fantasizing about giving birth to a monstrous Satan-spawn deformity. However, shortly before the delivery, Chad announced that he was still in love with Whitney despite the fact that she was his sister, and he proposed that the two live together chastely for the rest of their lives (a proposal met with some skepticism by everyone else). Whitney declined his offer, but confided to her best friend that she was still in love with Chad. Just for the record, we predict that this story will eventually conclude with a revelation that Whitney and Chad are not in fact brother and sister. But fakeout or not, the incest storyline has created quite a stir, winning Passions repeated mentions in mainstream magazines like Entertainment Weekly, which rarely deign to notice that soap operas exist, let alone that you might want to watch one. The buzz has not translated into ratings, however. Passions is the lowest-rated soap on network television, and its numbers have barely moved in its six years on the air. However, its demographic performance among teenage girls is strong enough that NBC isn't likely to pull the plug any time soon. In addition to its valuable advertising demographic, Passions has also turned to more innovative ways of making money, including extreme product placement for everything from water filters to cat food. The most visible example was a marketing deal the show signed with Mark Cosmetics, a multi-level marketing deal that aimed to be the Mary Kay of the teen set. The character of Jessica Bennett was repurposed so that her entire function on the show was to hawk Mark cosmetics to the other characters. The alliance ended early in 2005. Immediately after "quitting her job" with Mark, Jessica Bennett promptly donned slutty clothes, began drinking heavily, got herself drugged and date-raped (which, according to the show's philosophy, is her own fault) and slashed herself repeatedly with razor blades. One can infer from all this that there may have been a few hard feelings about the end of Mark's contract with the show. Let the product placement buyer beware. |


TL;DR
In this blog post, I share my thoughts on how to organize Minimal API projects to keep code structure under control and still get benefits from the low-ceremony approach.
Introduction
Minimal API is a refreshing and promising application model for building lightweight Web APIs. Now you can create a microservice and start prototyping without the necessity to create lots of boilerplate code and worrying about too much about code structure.
var app = WebApplication.Create();
app.MapGet("/", () => "Hello World!");
app.Run();
Presumably, this kind of style gives you a productivity boost and flattens the learning curve for newcomers. So it is considered as a more lightweight version, but using Minimal API doesn’t mean you have to write small applications. It is rather a different application model that one day will be as much powerful as MVC counterpart.
Problem Statement
One of the problems with Minimal API is that Program.cs
can get to big. So initial simplicity may lead you to the big ball of mud type of solution. At this point, you want to use refactoring techniques and my goal is to share some ideas on how to tackle emerging challenges.
Example: Building Minimal API
I’ve prepared a demo application. I strongly recommend checking it before you move further.
Source code can be found at GitHub: NikiforovAll/minimal-api-example
Recommendations
My general recommendation is to write something that may be called Modular Minimal API or Vertical Slice Minimal API.
Keep Program.cs aka Composition Root small
A Composition Root is a unique location in an application where modules are composed together. You should have a good understanding of what this application is about just by looking at it.
You want to keep Program.cs clean and focus on high-level modules.
var builder = WebApplication.CreateBuilder(args);
builder.AddSerilog();
builder.AddSwagger();
builder.AddAuthentication();
builder.AddAuthorization();
builder.Services.AddCors();
builder.AddStorage();
builder.Services.AddCarter();
var app = builder.Build();
var environment = app.Environment;
app
.UseExceptionHandling(environment)
.UseSwaggerEndpoints(routePrefix: string.Empty)
.UseAppCors()
.UseAuthentication()
.UseAuthorization();
app.MapCarter();
app.Run();
💡Tip: One of the techniques you can apply here is to create extension methods for IServiceCollection
, IApplicationBuilder
. For Minimal API I would suggest using “file-per-concern” organization. See ApplicationBuilderExtensions and ServiceCollectionExtensions folders.
$ tree
.
├── ApplicationBuilderExtensions
│ ├── ApplicationBuilderExtensions.cs
│ └── ApplicationBuilderExtensions.OpenAPI.cs
├── assets
│ └── run.http
├── Features
│ ├── HomeModule.cs
│ └── TodosModule.cs
├── GlobalUsing.cs
├── MinimalAPI.csproj
├── Program.cs
├── Properties
│ └── launchSettings.json
├── ServiceCollectionExtensions
│ ├── ServiceCollectionExtensions.Auth.cs
│ ├── ServiceCollectionExtensions.Logging.cs
│ ├── ServiceCollectionExtensions.OpenAPI.cs
│ └── ServiceCollectionExtensions.Persistence.cs
└── todos.db
And here is an example of how to add OpenAPI/Swagger concern:
namespace Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
public static partial class ServiceCollectionExtensions
{
public static WebApplicationBuilder AddSwagger(this WebApplicationBuilder builder)
{
builder.Services.AddSwagger();
return builder;
}
public static IServiceCollection AddSwagger(this IServiceCollection services)
{
services.AddEndpointsApiExplorer();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo()
{
Description = "Minimal API Demo",
Title = "Minimal API Demo",
Version = "v1",
Contact = new OpenApiContact()
{
Name = "Oleksii Nikiforov",
Url = new Uri("https://github.com/nikiforovall")
}
});
});
return services;
}
}
Organize endpoints around features
A MinimalApiPlayground from Damian Edwards is a really good place to start learning more about Minimal API, but things start to get hairy (https://github.com/DamianEdwards/MinimalApiPlayground/blob/main/src/Todo.Dapper/Program.cs). Functionality by functionality you turn into a scrolling machine more and more - no good 😛. It means we need to organize code into manageable components/modules.
Modular approach allows us to focus on cohesive units of functionality. Luckily, there is an awesome open source project - Carter. It supports some essential missing features (Minimal API .NET 6) and one of them is module registration ICarterModule
.
namespace MinimalAPI;
using Dapper;
using Microsoft.Data.Sqlite;
public class TodosModule : ICarterModule
{
public void AddRoutes(IEndpointRouteBuilder app)
{
app.MapGet("/api/todos", GetTodos);
app.MapGet("/api/todos/{id}", GetTodo);
app.MapPost("/api/todos", CreateTodo);
app.MapPut("/api/todos/{id}/mark-complete", MarkComplete);
app.MapDelete("/api/todos/{id}", DeleteTodo);
}
private static async Task<IResult> GetTodo(int id, SqliteConnection db) =>
await db.QuerySingleOrDefaultAsync<Todo>(
"SELECT * FROM Todos WHERE Id = @id", new { id })
is Todo todo
? Results.Ok(todo)
: Results.NotFound();
private async Task<IEnumerable<Todo>> GetTodos(SqliteConnection db) =>
await db.QueryAsync<Todo>("SELECT * FROM Todos");
private static async Task<IResult> CreateTodo(Todo todo, SqliteConnection db)
{
var newTodo = await db.QuerySingleAsync<Todo>(
"INSERT INTO Todos(Title, IsComplete) Values(@Title, @IsComplete) RETURNING * ", todo);
return Results.Created($"/todos/{newTodo.Id}", newTodo);
}
private static async Task<IResult> DeleteTodo(int id, SqliteConnection db) =>
await db.ExecuteAsync(
"DELETE FROM Todos WHERE Id = @id", new { id }) == 1
? Results.NoContent()
: Results.NotFound();
private static async Task<IResult> MarkComplete(int id, SqliteConnection db) =>
await db.ExecuteAsync(
"UPDATE Todos SET IsComplete = true WHERE Id = @Id", new { Id = id }) == 1
? Results.NoContent()
: Results.NotFound();
}
public class Todo
{
public int Id { get; set; }
public string? Title { get; set; }
public bool IsComplete { get; set; }
}
💡Tip: You can use Method Group (C#) instead of lambda expression to avoid formatting issues and keep code clean. Also, it provides automatic endpoint metadata aspnetcore#34540, that’s cool.
// FROM
app.MapGet("/todos", async (SqliteConnection db) =>
await db.QueryAsync<Todo>("SELECT * FROM Todos"));
// TO
app.MapGet("/api/todos", GetTodos);
async Task<IEnumerable<Todo>> GetTodos(SqliteConnection db) =>
await db.QueryAsync<Todo>("SELECT * FROM Todos");
To register modules you simply need to add two lines of code in Program.cs
. Modules are registered based on assemblies scanning and added to DI automatically, see. You can go even further and split Carter modules into separate assemblies.
builder.Services.AddCarter();
// ...
app.MapCarter();
I recommend you to enhance your Minimal APIs with Carter because it tries to close the gap between Minimal API and full-fledged ASP.NET MVC version.
High cohesion
Modules go well together with Vertical Slice Architecture. Simply start with ./Features
folder and keep related models, services, factories, etc. together.
Conclusion
Minimal API doesn’t mean your application has to be small. In this blog post, I’ve shared some ideas on how to handle project complexity. Personally, I like this style and believe that one day Minimal API will be as much powerful as ASP.NET MVC.
Reference
- https://www.hanselman.com/blog/carter-community-for-aspnet-core-means-enjoyable-web-apis-on-the-cutting-edge
- https://github.com/CarterCommunity/Carter
- https://github.com/AnthonyGiretti/aspnetcore-minimal-api
- https://www.youtube.com/watch?v=4ORO-KOufeU&ab_channel=NickChapsas
- https://www.youtube.com/watch?v=bSJ5n7alhTs&ab_channel=dotNET
- https://benfoster.io/blog/mvc-to-minimal-apis-aspnet-6/
- https://blog.ploeh.dk/2011/07/28/CompositionRoot/


{% load i18n %}
{% blocktrans trimmed %} You can create a port for the network. If you specify device ID to be attached, the device specified will be attached to the port created. {% endblocktrans %}


This is a Heading
This is a paragraph.
This is a paragraph.
This is another paragraph.
This is a link
ID
Name
City
ID_1
Name_1
City_1
ID-2
Name_2
City_2


Map Pin Tool
BETA
Basemaps
Streets
Satellite
Hybrid
Topographic
Gray Canvas
Oceans
National Geographic
Open Street Map
Map Pin Tester
Clear Map
50px by 50px maxiumum size.
Build a map pin
Future Tool


13 Using GitHub
GitHub is a platform for managing and storing files, data and code built atop Git, a popular open source version control software. GitHub accounts are free and it’s easy to get started. The one prerequisite is that you have Git installed on your local computer. There are installers for Mac, Windows and Linux.
13.1 How It Works
Version control is based on the ideas that you want to keep track of changes you make to a collection of files and that multiple people can work together without getting in each other’s way or having to do things in a set order. For individual users, it’s great for making sure that you always have your work.
GitHub users work in what are known as repositories on their local computers and also push changes to a remote repository located on GitHub. That remote repository is key: if you lose your computer, you can fetch a version of your files from GitHub. If you want to work with someone else on the same files, you can each have a local copy, push changes to GitHub and then pull each others’ changes back to your local computers.
So, like Microsoft Word’s track changes but with a remote backup and multiple editors.
13.2 Getting Started
After installing Git and signing up for a GitHub account, download and install GitHub Desktop. It will have you sign into your GitHub account and then you’ll have access to any existing repositories. If you don’t have any, that’s fine! You can make one locally.
GitHub has good documentation for working in the Desktop app, and while the emphasis in this book will be on using GitHub for version control, it also supports recording issues (read: problems or questions) with your files, contributing to projects that aren’t yours and more.
13.3 Video overview
This YouTube video from Coder Coder provides a nice overview of Git, GitHub and GitHub Desktop.
13.4 Advanced Use
Although our focus is on the GitHub Desktop app, you can use Git and GitHub from your computer’s command line interface, and GitHub has a purpose-built command line client, too. GitHub can also serve as a publishing platform for many types of files, and entire websites are hosted on GitHub Pages.


---
layout: post
title: cfhtmlhead
tags: []
status: publish
type: post
published: true
meta: {}
---
This tag will place any text string into the head element of your template. So for example you could leave all your JS libraries in a custom template saved as a var and then using cfhtmlhead used in your OnRequestEnd.cfm template. That way you make sure that the code is always included and also is placed where it belongs, i.e. in between your head elements rather than mixed in with your code. The same could be applied to style sheets, build up a keyword list dynamically based on content, etc...


Nokia 5.2 with a 3920 mAh battery gets certified by FCC - Gizchina.com
by Efe UdinNokia 5.2 with a 3920 mAh battery gets certified by FCC
4.4 (88.57%) 7 votes
According to a recent report, Finnish manufacturer, HMD Global, is preparing a successor to the recently released Nokia 2.2. According to a distributor database, Nokia is preparing a new smartphone – Nokia 2.3. The name of this device suggests that it is the successor to the Nokia 2.2. While we are still trying to verify the authenticity of this information, a new report from NPU claims that Nokia 5.2 has passed through FCC with model number “TA-1214”.
According to the report, this smartphone comes with a dimension of 157.69 × 75.41mm and the display is about 6.1 inches. According to the report, there are currently three versions of the Nokia 5.2. While “TA-1206” is a dual card version, “TA-1214” is a single card version, and “TA-1211” currently has no information. In addition, “TA-1209” also got a certification in India. This smartphone comes with a 3920 mAh battery.
It is possible that Nokia will unveil the entry-level Nokia 2.3 and Nokia 5.2 together. As of now, there is no information on the configuration of the Nokia 2.3. However, there are speculations that it should come with MediaTek’s Helio A22, and Bluetooth may use 5.0. Generally, the specifications of Nokia 2.3 device should be similar to Nokia 2.2. The Nokia 5.2 should be a mid-range smartphone.


Harry Redknapp urges Jose Mourinho to make Gareth Bale his first Tottenham signing
Jose Mourinho is the new man in charge of Tottenham and has been encouraged to make Gareth Bale his first signing after succeeding Mauricio Pochettino
by Sam MeadeJose Mourinho should try and bring Gareth Bale back to Tottenham if he wants to win the fans over.
The Special One was appointed as Mauricio Pochettino's successor 12 hours after the Argentine was axed.
Mourinho's arrival has divided fans but Harry Redknapp, who led Tottenham for four years, reckons the signing of Bale would be a major coup.
The Welshman was close to leaving Real Madrid in the summer and his relationship with the club's fans has broken down meaning his exit is likely.
"It could be couldn't it, yeah," Redknapp told Ally McCoist on talkSPORT on Wednesday morning.
"What a signing he'd be for the club. What a signing. That would get him on side straight away, the fans would love that. That would be an amazing move for him."
Bale left north London in 2013 for a then world-record fee of £86m to join Los Blancos.
Despite helping them deliver four Champions League titles and scoring over 100 goals Bale has never truly settled in Spain.
Zinedine Zidane's return in March looked to spell the end for Bale, but after a summer of huge interest he eventually remained at the Bernabeu.
He has faced plenty of criticism for his hobbies away from football and a lack of connection to the current squad.
Bale's love for golf has regularly been a stick to beat him with and Madrid keeper Thibaut Courtois called him "the golfer" earlier this year.
The 30-year-old though did little to endear himself to the Los Blancos supporters after he was pictured with a Welsh flag that said "Wales. golf. Madrid. In that order".
His native fans remixed the usual "Viva Gareth Bale" song to mock his love of the fairways and commitment to the national team, but it has not gone down well in Madrid.


---
layout: post
title: no title
date: '2008-11-09T19:31:33+01:00'
tags:
- google
- maps
- transit
- public
- italian
- city
- cities
- map
tumblr_url: http://blog.alezzandro.com/post/58823881/plan-a-transit-trip-in-cities-around-the-world
---
Plan a transit trip in cities around the world with Google Maps. Get step-by-step directions and travel times for your entire route, all in one place online.
Many cities supported, you can find also Italian cities on the list:
http://maps.google.com/transit
(Firenze, Genova, Torino).


The Infotrope ACAP Server has a handful of extensions. Don't rely on these unless, erm, well, you're me, really. And you're not. I can tell, you know.
On a more serious note, most of these extensions are somewhat subject to change. Sling a post on the mailing list if you're thinking of using any of them, and that way I'll know about your needs as well as mine.
A search modifier, with one Atom afterwards. Either LOCAL or IMMEDIATE is supported. Essentially you're telling the ACAP server what to follow when you specify DEPTH!=1. IMMEDIATE follows all datasets located immediately below the entry it's looking at, whereas LOCAL follows any on the same server.
In general, you want the default, which is IMMEDIATE. This will generate, during a SEARCH, REFER intermediate responses telling you where to find the dataset, and allows the client to track depth. You needn't wait for the first search to finish before sending your additional searches, on any ACAP server, and on Infotrope, it'll fire them off immediately. It's especially useful to do this if you're creating a heirarchical representation of the dataset structure in your client, since it allows the client to tell where the data actually is.
The alternative, LOCAL, will continue the search all over the server, tracking loops for you, etc. In particular, this is useful for addressbook searches and other searches where you don't care quite so much about the structure, just the data. Soup versus heirarchy, kind of thing.
As a final note, the syntax actually includes a REMOTE, too, which will generate an error, since the ACAP server has no client as yet. Besides which, I'm really not at all sure how that might work.
A store-list modifier. Basically, it interprets the entry path portion of the store list as an entry path prefix, and will tack on stuff such that the entry is newly created. It'll then return you the entry name in an ENTRY intermediate response. Helpful, eh?
The Infotrope ACAP Server implements this by tacking on the MODTIME, and if this fails, generating a new MODTIME until it succeeds.
Allows you to specify a modtime of NIL to RANGE search criteria, which in turn means "Look, I couldn't give a frigging monkey's when this context changed. I wanna see the range anyway."
Or, in less technical speak, the server will ignore the Modtime argument, and not perform any MODTIME checks on the context you're searching.
A replacement for DELETEDSINCE, which actually works, requires less 'brains' on the client, and does exactly what you need for resynchronizing offline caches.
Basically: Say "A01 XSESSION" at a server. It'll send back A01 XSESSION "some opaque quoted string", and a tagged OK. Make any contexts you like, but specify "XPERSIST" after MAKECONTEXT if you want them to persist.
Log out. Let time pass.
Now reconnect and log in again. Say A01 XSESSION "some opaque quoted string" - note that this time, you're providing an argument. The server will give you an XSESSION intermediate response, which may or may not have the same quoted string, and a tagged OK if it's the same, and a tagged NO if it's not, with some kind of reason.
Those contexts that you made persistent will send you all the tagged responses to bring your client up to date, at some point. It's probably worthwhile performing an "UPDATECONTEXT" command for each of them.
Finally, note that there's no requirement for the server to keep your sessions about if it doesn't feel like it, so this has to be the simplest extension in the world to support - basic minimal support simply means responding to XSESSION with a new session identifier, and issuing NO if there was an argument.
Compare and contrast with DELETEDSINCE, which is not only not supported by any server in existence, but also requires a lot more smarts on the client to deal with resolving the changes. Oh, and a real smart gotcha, if a dataset is renamed, then the modtimes on the entries within are not updated. So you've got to track that seperately.


Coronation Street actress Jean Fergusson died days after telling friends she wasn't feeling well
Jean Fergusson was described as 'the life and soul of any gathering'
by Vicki Newman, Charlotte Hadfield, Victoria JonesAn actress who appeared in Coronation Street and Last of the Summer Wine died just days after telling her friends that she wasn't feeling well at a party.
Jean Fergusson, 74, described as "the life and soul of any gathering", died at home on Thursday morning.
With an acting career spanning more than 50 years, she was best known for playing Marina in the long-running sitcom from 1985 until it ended in 2010.
She was also known for appearing in Coronation Street as Dorothy Hoyle from 2010 until 2011, as Liverpool Echo report.
On Sunday, Jean had been with friends celebrating Su Pollard's birthday, when she posed with 'Allo 'Allo star Vicki Michelle for what could have been her final picture, reports the Mirror Online.
Jean looks glam with her blonde hair in a classic up do, wearing a white roll-neck jumper with an off-white jacket and chiffon scarf.
Jean posed up with Vicki for a smiley picture.
After news of Jean's death at age 74, Vicki took to Twitter to share the picture, saying her friend had been feeling poorly.
She wrote: "Shocked & saddened to hear Jean Fergusson has passed Lovely lady, fabulous actress.
"Saw her Sunday at #SuPollard’s birthday, said she wasn’t feeling well. @benstockbiz and I planned to take her out next week. Can’t believe she’s gone #LastoftheSummerWine #SheKnowsYouKnow #Corrie"
Jean's cause of death is not yet known.
A statement from her agents, Scott Marshall Partners, said: "It is with great sadness that we announce the death of actress Jean Fergusson, known to millions as flirtatious Marina in the long running BBC comedy Last Of The Summer Wine.
"Jean was a much-loved and respected actress, a brilliant comedienne, raconteur, and the life and soul of any gathering. She will be much missed by her many friends and colleagues.
"Jean passed away, at home, in the early hours of Thursday November 14.
"She is survived by her beloved sister Marjorie, brother-in-law Roger and her nephews Daniel and William."
Fergusson's death comes just over a month after the death of her Last Of The Summer Wine co-star Juliette Kaplan, who played battleaxe Pearl Sibshaw.
Kaplan was 80 when she died from cancer in October.
Wakefield-born actress Fergusson was familiar in households across the UK for her role as the opinionated and attractive Marina in the popular BBC comedy series Last Of The Summer Wine, which ran from 1973 until 2010 and was set in the Yorkshire Dales.
She joined the sitcom in 1985 as the peroxide blonde love interest of Howard Sibshaw (Robert Fyfe), the pair conducting their affair behind his wife Pearl's back.
Fergusson first played the character in a stage version of the show in 1984 before joining the TV series.
Prior to starring in Corrie as Dorothy Hoyle, which saw her involved in a kidnapping storyline, she had previously appeared in two minor roles in the soap in 1987 and 1999.
Away from the small screen, Fergusson enjoyed a successful career on the stage, most notably the play She Knows You Know, which she wrote and starred in.
Her role as the comic Hylda Baker at London's Vaudeville Theatre saw her nominated for a Laurence Olivier Award in 1998.
In recent years, Fergusson appeared on a variety of celebrity quiz shows, including Pointless, and she was also a pantomime headliner.


--- layout: post authors: ["Greg Wilson"] title: "The Fourteenth Anniversary" date: 2013-07-19 time: "10:00" tags: ["Noticed"] ---
Fourteen years ago this October, I had the good fortune to attend a one-day workshop titled Open Source/Open Science at Brookhaven National Laboratory. A lot of the tools we work with have changed since then, but the central message remains the same: when it comes to science, the opposite of "open" isn't "closed" — it's "broken".


ExamineKeyboard()
语法
Result = ExamineKeyboard()概要
Updates the keyboard state. This function has to be called before using KeyboardInkey(), KeyboardPushed() or KeyboardReleased().
参数
无.
返回值
无.
参阅
KeyboardInkey(), KeyboardPushed() KeyboardReleased().
已支持操作系统
所有


Toggle navigation
01234 567890
Sign up
Borrow money
Invest your money
Our partners
About us
Get in touch
Where investors and borrowers club together.
You have the idea.
We have the investor.
This is your Murabaha moment.
When your investments makes a difference for others and a nice little profit for you.
Read more
Peer-to-peer lending and investments.
You find the opportunities. We’ll fund them.
This is your Murabaha moment.
When your investments makes a difference for others and a nice little profit for you.
Read more
Where investors and borrowers club together.
You’ve worked for every penny.
And now it’s working for you.
This is your Murabaha moment.
When your investments makes a difference for others and a nice little profit for you.
Read more
Borrow money
Borrow up to xx,xxx for many different uses
Consumer, property, and SME loans
Low rates
Loans available over 1, 2, 3, 4 or 5 years
OR
Invest your money
Earn up to X% on peer to peer investments
Ethnical financing all the way
Quick investment process
Lower risk
Our partners
Get in touch
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
Postal Address
Headquarters
121 King Street, Melbourne
Victoria 3000 Australia
Telephone
+1.234.567.8900
Email
<EMAIL_ADDRESS>Get Directions »
Drop us a line.
SEND
SAY HELLO
Be Social & Get in Touch with updates.
FACEBOOK
JOIN US
TWITTER
JOIN US
LINKEDIN
JOIN US
DRIBBLE
JOIN US
YOUTUBE
JOIN US
BEHANCE
JOIN US
Scroll
SAY HELLO
FACEBOOK
JOIN US
TWITTER
JOIN US
LINKEDIN
JOIN US
DRIBBLE
JOIN US
YOUTUBE
JOIN US
BEHANCE
JOIN US


Biography
Born in Florida in December, I started my life like any 90's child. I grew up in Vero Beach until I was 6 and moved to West Virginia. The closest town was an hour away but the landscape was vast and beautiful. When I was 12 my family and I moved to North Carolina. I spent the rest of my days there until I joined the Navy at 18. I served in Japan for 2 years then transferred to Washington and separated.
Education
- Forsyth County Middle College
- High School Diploma
- Divers Institute of Technology
- Diving Certificates
- Code Fellows
- Coding Certificates
Job Experience
This is a small description of past jobs I've held.
- Morrison
- Diver
- Top Pot Doghnuts
- Barista
- United States Navy
- Personnel Specialist
My Goals
This is a list of my short and long term goals.
- Save money
- Go back to Japan and hike Mt. Fuji
- Learn Bootstrap and PHP
- Short Term
- Backpack Europe
- Read a book each week
- Continue working out


| » HOME |
» ABOUT US |
» SERVICES |
We at Athlean aim to provide the finest equipment and fitness knowledge available to help its members achieve their individual potential. We follow a globally proven fitness training module with state-of-the-art infrastructure and delivery methodology and continuous up gradation through training programs. We’ve got a range of facilities here like Personal Trainers, Cardio Center, Strength Training equipments, a range of Free Weights, Steam Rooms and a lot more to achieve the maximum fitness levels. We also have qualified Dieticians and Professional Masseurs for different needs of different people. Add to it a Cafeteria and Juice Bar to hang out and rest and we have a great gym where you’ll cherish the gift of fitness….


GSF supports incremental updating. As the name implies, this means that there is support to do cheaper incremental updates to data, insead of computing everything from scratch, when something changes in the editor. This shows up in several places:
<script>
block in an HTML file. The virtual
source provider for CSS knows that this doesn't affect CSS. Therefore,
several optimizations are possible:
If you tell the infrastructure that you support incremental updating, GSF will keep some extra data around. First, it will keep your most recent parser result (and for embedded files, you more recent virtual source translation). Second, it will keep track of all the edits that have occurred since the last parser request.
When it's time to parse your file again, your incremental parser will be handed the edit history, and your previous parser result, and you can create a new parser result by analyzing your previous result and the edit deltas.
The most important concept for incremental updating is the
EditHistory object.
GSF provides you with an EditHistory
object when
you are asked to parse (for incremental parsers) or when you are
asked to generate a virtual source (for incremental embedding models).
The EditHistory
object provides information about
all the edits that have occurred since your last parse job.
Along with the EditHistory
object, you are passed your
most recent result, such that you can base your incremental computations
on it.
The EditHistory tracks edits accurately, so you can use the
convertOldToNew()
method to translate a pre-edits offsets
to a post-edits offsets. However, the EditHistory maintains a
more interesting concept: the affected region. The affected
region is roughly the start and end offsets in the original document
and the corresponding start and end offsets in the edited document.
You can think of the affected region as the "damaged region".
Everything before and after the affected region was unchanged.
The following key attributes are provided by EditHistory:
offset
and offset+originalSize
has been modified,
and after the edits, this region corresponds to
offset
to offset+editedSize
. Put another way,
all document positions below offset
are unaffected by the edits,
and all document positions above offset+originalSize
are uniformly
shifted up by a delta of editedSize-originalSize
(which can be negative,
when more text was deleted than added).
Here's how this works. First, let's suppose we insert some text:
Here, we've inserted XY
between the characters F
and G
. Here, the offset
where the differences
begin is 6. In the old document, the differences also end at offset 6,
whereas in the edited document, the differences end at 8.
Therefore, our offset
is 6, the originalSize
is 0,
the editedSize
is 2, and therefore the delta
is +2.
Here's a more complicated example, where we've performed multiple edits.
The affected region is going to be the extent surrounding all edits
from the edits to the lowest offset in the document, to the edits at the
highest offset in the document:
Here's we've deleted one character from two different locations in
the document - D
and H
. The blue regions
show the old region and the new corresponding region. Yes, some
of the contents within the old region are still there in the new region,
but the key point is that before the affected offset,
both documents are identical, and similarly, after the end of the
affected regions, both documents are identical. Typically, when
a user is editing, the changes will be local to a small region
(such as a function body), and an incremental parser can decide
that the entire affected region is in an incrementally parseable block.
It can also use the block delta to adjust offsets - add the delta
to all offsets outside the old region block.
To implement incremental parsing, rather than extending the plain Parser interface, implement the IncrementalParser interface instead. GSF will store the most recent parser result, and track editing history, for source files that are parsed by an incremental parser. The first time the file is opened, no previous parser result is available, so the plain parsing method will be called. However, for subsequent edits, the incremental parser will be called instead. If it fails, the regular parse method will be called instead.
Your incremental parser will typically perform the following steps:
EditHistory
's offset.
setUpdateState
with ParserResult.UpdateState.NO_SEMANTIC_CHANGE
and you're done.
EditHistory
and make sure the entire
affected region (history.getStart()
and history.getOldEnd
)
is completely inside the function body. If not, we've edited outside
of just a single function, so just exit.
history.convertOldToNew(oldFunctionEnd)
.
That's right, the end of the function is outside the edited region,
so (as described in the EditHistory section above) we just have to take
the old offset and shift it by history.getSizeDelta()
.
document.getText(offset, newEnd-offset)
.
oldFunctionStart
, so add oldFunctionStart
to all AST node start and end offsets to shift the AST nodes to their
correct place in the edited buffer.
history.getStart()
can be left alone, and all offsets greater than or equal to
history.getOldEnd()
should be incremented by
history.getSizeDelta()
. There are methods on the EditHistory
object to do this.
EditHistory
affected region since
we recompiled the entire function, not just the affected region) should
be removed, and all other errors passed on. Finally, add in our new
error messages from the compiled method.
ParserResult
instance, initialize
it with our AST, our updated error list, and set its setUpdateState
to ParserResult.UpdateState.UPDATED
. We also store in our
own ParserResult, references to the old and new function nodes we replaced.
This will be used by feature implementations like our SemanticAnalyzer
to perform incremental semantic analysis by only looking at the given
function node subtree.
The previous section described how to perform incremental parsing. From the checklist you can see that implementing incremental parsing isn't nontrivial. It may be even more difficult in cases where you don't own the parser yourself. For example, for Ruby, Python and Groovy the parser will probably be JRuby, Jython, and Groovyc respectively, so parsing method bodies for example will require support in the corresponding projects.
That doesn't mean incremental updating isn't possible. Parsing itself will have to process the full AST, but you can still analyze the edited region and reduce the amount of work.
As before, you should implement the
IncrementalParser
interface, such that GSF will pass your previous parser result and the EditHistory
to you. Then, you parse the request - and unfortunately, you'll be parsing the entire
document.
However, you should now use the EditHistory
along with the previous
ParserResult
to see whether the changes were local to a single block
such as a method. If they were, you can also compute exactly which method was just
updated, by looking up the corresponding offset in the EditHistory
and looking in your new parser result.
Now you know that only a single method in your new parser result is actually "new". In your downstream feature implementations, such as the semantic analyzer, you can use this information to combine your previous result (which you stashed on your previous parser result), with local computations based only on the changed method.
Therefore, you can drive the often more expensive computations (type analysis, semantic analysis, navigator/outline computations, etc) to do simple, incremental updates, even if the parse tree itself was fully regenerated by a non-incremental parser!
GSF supports embedding through "embedding models", which produce a "virtual source",
one for each targeted parser language in an embedded language. For example,
in an RHTML file, there is a virtual source generated for JavaScript (which gives
a JavaScript view of the file, typically concatenating the various
<script>
blocks and a few other things), as well as one for
CSS, and one for Ruby.
Each virtual source translator takes the original source language and computes a virtual source. With the incremental update support, a virtual source translator can tell the infrastructure that it supports incremental updates. First, instead of implementing the EmbeddingModel interface as before, implement IncrementalEmbeddingModel.
Once you do that, GSF will cache your virtual source for you, and when it's time
to update the virtual source parse trees, it will call your incremental
embedding model and pass it your previous virtual source and an
EditHistory
object. You can use the EditHistory
to
determine if the edits affects your virtual source.
For example, for JavaScript
, if you've edited something inside
the <style>
element (CSS code), the edit can't possibly affect
the JavaScript virtual source. Therefore, the virtual source doesn't change,
and therefore the previous JavaScript parse tree for the virtual source doesn't
have to be reparsed - it doesn't even have to be updated for new AST offsets,
since the AST itself hasn't changed. However, the embedding model itself
is responsible for mapping AST offsets to source document offsets.
Therefore, the incremental embedding model needs to go through its
position mapping tables and update them. Again, this typically just means
shifting positions above the affected region up by the edit history's
size delta.
If this succeeds, your embedding model can just return
IncrementalEmbeddingModel.UpdateState.COMPLETED
. This tells the
infrastructure that the embedding model was updated, and there is nothing else
to do - it doesn't have to parse the result of the virtual source!
But what if the user edited something in an edit region that affects the
virtual source? In that case, it can simply return
IncrementalEmbeddingModel.UpdateState.FAILED
. This tells the
infrastructure that an incremental update cannot be completed, and GSF
will perform a new (non-incremental) virtual source translation, and
parse the result.
Finally, if you're somewhere in between - you updated the virtual source
such that it now reflects the recent edits, but the model changed such that
it must be reparsed, return
IncrementalEmbeddingModel.UpdateState.UPDATED
. This tells the
infrastructure that the virtual source is up to date and that a parse
result should be computed for it.
Here's a complete example of how this works for an embedding model; this is the CSS embedding model's incremental update:
IncrementalEmbeddingModel.UpdateState incrementalUpdate(EditHistory history) { // Clear cache // prevLexOffset = prevAstOffset = 0; prevLexOffset = history.convertOldToNew(prevLexOffset); int offset = history.getStart(); int limit = history.getOldEnd(); int delta = history.getSizeDelta(); boolean codeOverlaps = false; for (CodeBlockData codeBlock : codeBlocks) { // Block not affected by move if (codeBlock.sourceEnd <= offset) { continue; } if (codeBlock.sourceStart >= limit) { codeBlock.sourceStart += delta; codeBlock.sourceEnd += delta; continue; } if (codeBlock.sourceStart <= offset && codeBlock.sourceEnd >= limit) { codeBlock.sourceEnd += delta; codeOverlaps = true; continue; } return IncrementalEmbeddingModel.UpdateState.FAILED; } return codeOverlaps ? IncrementalEmbeddingModel.UpdateState.UPDATED : IncrementalEmbeddingModel.UpdateState.COMPLETED; }
ParserResult
stores an UpdateState
enum value
indicating what kind of update was performed. For example, if it is
NO_SEMANTIC_CHANGE
we know that in this parser result,
nothing in the AST changed (though offsets may have changed).
This lets the infrastructure know that it can take certain shortcuts.
For example, semantic highlighting won't recompute the data, it will just
update its own offsets based on the edit history.
Not all GSF feature implementations are using the incremental data yet; this will change as soon as possible...
You should use the same approach for feature implementations in your language
plugin. Start with the most expensive computations (for example, type
analysis), and use the "what changed" data (either the EditHistory
,
or specific parse tree nodes derived from the EditHistory
)
to just filter your previously computed result.


--- layout: page title: About header-img: "img/about-bg.png" ---
Productive, professional full-stack web developer with a background in business building, leading small teams, and managing complex projects. I have powerful interpersonal, verbal, and written communication skills, along with boundless energy, insight, and inventiveness for solving problems in a collaborative environment.