I've considered signing up for new reading challenges next year, like this Classics challenge or even revisiting the Off the Shelf challenge to try to clear that shelf for good (hahahahaha). But I decided not to. I love reading, and I will still read for pleasure, and for research, but 2012 must be devoted to writing the book that I keep telling people I'm going to write. I can't allow myself to be distracted by reading challenges, tempting though they are. My focus must narrow a bit, at least for now. It's time to put up or shut up.
What challenges, reading or other, are you going to tackle in 2012?
Congrats on finishing your reading challenges. I finished mine too - and mine were also not very challenging. I'm going to do fewer reading challenges next year too - not for the same reason as you (I'm not writing a book) but I think because I chose challenges this year that I knew I could complete, which really isn't the point of a challenge, is it? I'm going to do the War Through the Generations challenge again next year, which will be World War I, but that may be the only one. Good luck on your book!
Congratulations on your reading accomplishment for 2011. I recognized the title of the one on New Orleans because I bought it last summer in hopes of reading it before our NOLA trip. That didn't happen, but it might make an interesting read for me in 2011 as I sift through my NOLA memories.
Thanks, Cheryl. I think even though we completed our challenges easily, we still benefitted from them! Good luck with next year's challenge. It sounds like an interesting one.
Claire--I think you'll like Piazza's book. It was very easy to read, interesting, and, I thought, nicely summed up the allure, spirit and feeling of New Orleans. It should be a good companion while you sift through your NOLA memories.
It's nice when you feel like you've accomplished something with your reading--and that includes just enjoying the books you pick whether at whim or planned. I did pretty well with the last couple of challenges I did, too. I try not to join many unless I had wanted to read the books in any case (which for me--reading more classics is something I want to do next year). How exciting that you are planning on doing some serious writing. I think there must be a point where you just have to do it and not plan or think about it!
Danielle--Maybe some people like challenges in order to read anything--or anything out of their comfort zones? You and I don't have a problem with reading (!), and you seem quite adventurous in your tastes...I've begun reading more widely thanks to you and other bookish folks.
You're right, too, about just starting to write. I've been planning and thinking and educating myself all through 2011 with not much writing to show for it on the book. 2012 will have to be more writing, less "reading about writing."


text:
import React from 'react';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import AppBarContainer from '../containers/AppBarContainer';
import DrawerContainer from '../containers/DrawerContainer';
import MapContainer from '../containers/MapContainer';
import SnackbarContainer from '../containers/SnackbarContainer';

const App = () => (
  <MuiThemeProvider>
    <div>
      <AppBarContainer />
      <DrawerContainer />
      <MapContainer />
      <SnackbarContainer />
    </div>
  </MuiThemeProvider>
);

export default App

redpajama_set_name: RedPajamaGithub


Apple today introduced the new iPhone 3G S, featuring improved speed and performance—up to twice as fast as iPhone 3G—longer battery life, a high-quality 3 megapixel autofocus camera, easy to use video recording and hands free voice control. iPhone 3G S includes the new iPhone OS 3.0, with over 100 new features such as Cut, Copy and Paste, MMS, Spotlight Search, landscape keyboard and a new Find My iPhone feature that works together with MobileMe to help you locate a lost iPhone. Filed under: iPhone.


text:
Street Style: Copy Veronika Heilburnner's Retro-Cool Summer Look
Photo via: Vogue
Veronika Heilbrunner sure knows a thing or two when it comes to creating retro-cool summer looks. Applauding the way she wears wayfarer sunglasses, layered necklaces and a basic black tee tucked into high-waisted pants with embroidered details. Her bright yellow Miu Miu bag adds the perfect pop of color to this fun look.
+ Ray-Ban Original Wayfarer Sunglasses
+ CHRLDR Noir Tee
+ Henri Bendel Gotham Mini Tote
+ Moto Pale Blend Joni Jeans
+ ASOS RIdley High Waist Jeans
Posted by EB
Labels: BAG, BRIGHTS, EMBROIDERED, LAYERS, LEATHER, MIU MIU, NECKLACE, PANTS, SPRING/SUMMER INSPIRATION, STREET STYLE, SUNGLASSES, TSHIRT, VERONIKA HEILBRUNNER
Visit LeFashion's profile on Pinterest.
My Other Blogs:
Blog Archive January (72) December (128) November (112) October (123) September (83) August (71) July (55) June (64) May (71) April (97) March (110) February (75) January (108) December (54) November (20) October (23) September (14) August (13) July (26) June (44) May (34) April (43) March (35) February (31) January (40) December (40) November (30) October (41) September (64) August (60) July (53) June (35) May (32) April (35) March (41) February (55) January (64) December (63) November (83) October (98) September (101) August (119) July (92) June (183) May (226) April (68) March (57) February (17) January (29) December (27) November (29) October (37) September (24) August (23) July (42) June (35) May (37) April (37) March (25) February (23) January (31) December (33) November (41) October (30) September (28) August (23) July (32) June (27) May (42) April (49) March (53) February (39) January (36) December (27) November (24) October (25) September (27) August (25) July (25) June (24) May (27) April (21) March (26) February (21) January (25) December (22) November (17) October (27) September (27) August (25) July (32) June (27) May (32) April (30) March (30) February (32) January (31) December (30) November (38) October (35) September (39) August (34) July (34) June (24) May (29) April (33) March (40) February (39) January (36) December (37) November (42) October (42) September (43) August (45) July (48) June (39) May (44) April (49) March (57) February (46) January (54) December (52) November (66) October (87) September (102) August (110) July (93) June (101) May (98) April (93) March (90) February (89) January (49) December (38) November (69) October (84) September (136) August (127) July (190)

redpajama_set_name: RedPajamaCommonCrawl


Dr Gabriel S. Levi is a Board Certified Orthopaedic Surgeon specializing in joint replacement and arthroscopy of the knee, hip, and shoulder. He has a special interest in treatment of cartilage injuries of the hip and knee, and all sport related injuries. Dr. Levi utilizes minimally invasive surgery, bloodless surgical techniques, computer assisted surgery, and various methods of cartilage repair and restoration.
If you wish to be advised on the most appropriate treatment, please call (773) 878-6233 to schedule an appointment or click to request an appointment online.


The City of San Antonio maintains general obligation bond ratings of 'AAA' by the three major bond rating agencies, Standard & Poor's, Fitch, and Moody's. The 'AAA' bond rating is the highest credit rating that an entity can receive. San Antonio is the only city with a population of more than 1 million to receive a 'AAA' general obligation rating from all three major rating agencies. These bond ratings mean a low cost of borrowing on the City's property tax supported debt, which allows for potentially more funding for many of the City's capital projects.
The City's latest fiscal year Comprehensive Annual Financial Report (CAFR) was submitted to the Government Finance Officers Association (GFOA) for participation in its Certificate of Achievement for Excellence in Financial Reporting Program (pdf), an award which the City of San Antonio has received for the last 40 consecutive years.
The Purchasing Division has received many awards and honors, including the National Purchasing Institute's (NPI) Achievement of Excellence in Procurement (AEP) Award. The City is one of 44 government agencies in Texas and one of 65 cities in the United States and Canada to receive the award. The City of San Antonio has received the award for 18 consecutive years. This national award is earned by organizations that demonstrate excellence in innovation, professionalism, e-procurement, productivity, and leadership.


Capt Jack's Family Buffet Panama City Fl Good Hot Sale Living Room Sport Silhouette Wall Mural Home Decor Golf is a part of 24 Newest Capt Jack's Family Buffet Panama City Fl pictures gallery.
, we all choices the best series having greatest image resolution exclusively for you, and now this photos is usually considered one of photographs libraries in your ideal pictures gallery in relation to Local Capt Jack's Family Buffet Panama City Fl. Lets hope you will think it's great.
published by simply Christian Meyer at 2019-02-11 00:22:46. To view just about all photographs with Local Capt Jack's Family Buffet Panama City Fl graphics gallery remember to comply with that web page link.


That the results of the Lancet review were very sensitive to the definition of 'large' trials.
Because of heterogeneity between the trials included in the review, its results are less definite than claimed. The conclusion that homeopathy is, and that conventional treatment is not, a placebo effect, was not based on a comparative analysis and is unjustified because of the heterogeneity of trials and lack of sensitivity analysis.
The review did however, demonstrate that the quality of homeopathy trials was on average better than the conventional trials analysed.
In August 2005, The Lancet published an editorial entitled 'The End of Homeopathy', prompted by a review comparing clinical trials of homeopathy with trials of conventional medicine. The claim that homeopathic medicines are just placebo was based on 6 clinical trials of conventional medicine and 8 studies of homeopathy but did not reveal the identity of these trials. The review was criticised for its opacity as it gave no indication of which trials were analysed or the various assumptions made about the data.
Analysis of all high quality trials of homeopathy yields a positive conclusion.
The 8 larger higher quality trials of homeopathy were all for different conditions. Homeopathy works for some of these but not others, implying that homeopathy is not placebo.
The comparison with conventional medicine was meaningless.
Doubts remain about the opaque, unpublished criteria used in the review, including the definition of 'higher quality'.
Due to a lack of funding, there are a limited number of homeopathic studies. As a result, it is quite possible to interpret homeopathic data selectively and unfavourably, which is what appears to have been done in the Lancet paper. If we assume that homeopathy does not work for just one condition (Arnica for post-exercise muscle stiffness), or alter the definition of 'larger trial', the results are positive. The comparison with conventional medicine was meaningless: the original 110 trials were matched, but matching was lost after the trials were reduced to 8 in one group and 6 in the other. Interestingly, the quality of homeopathic trials was better than conventional trials.
This reconstruction casts serious doubts on the Lancet review, showing that it was based on a series of hidden judgments unfavourable to homeopathy. An open assessment of the current evidence suggests that homeopathy is probably effective for a number of conditions including allergies, upper respiratory tract infections and 'flu, but more research is desperately needed.
Lüdtke R, Rutten ALB. The conclusions on the effectiveness of homeopathy highly depend on the set of analyzed trials. J Clin Epidemiol 2008. doi:10.1016/j.jclinepi.2008.06.015 Rutten ALB, Stolper CF. The 2005 meta-analysis of homeopathy: the importance of post-publication data. Homeopathy 2008. doi:10.1016/j.homp.2008.09.008.


1 * AA 1.5V battery included.
Nelson Style Eye Wall Clock is a high quality reproduction in the style of the original design.
Twice the scale of the earlier clock designs, the original (1957) constitutes part of the designer's iconic collection of oversized clocks. Turning the human eye into a figurative composition of geometric forms, the clock is at once playful and sophisticated-a combination for which Nelson is well known. Able to be hung vertically or horizontally, the Eye Clock's size does not preclude its use in smaller homes and offices. Bold, graphic hands make for easy at-a-glance time-telling.
The name George Nelson and Eye Clock is used to describe the product, not as a trademark.


text:
You are at:Home»News & Politics»Local News»Lecturers to strike
C50TRK One day strike by teachers and civil servants to protest at changes in pensions- group of members of UCU union with placards
Lecturers to strike
By Emma Victoria Jewkes on	 February 19, 2018 Local News, News & Politics, Politics, Students' Union, UK News, Uni News, Union News
UCU, the UK's largest higher education Union, has stated that 14 days of "escalating strike action" will take place nationally in February and March.
The strikes will occur over a four-week period, and result from an ongoing dispute over proposed changes to staff pensions.
The expected strike dates are:
– Thursday 22, Friday 23 February
– Monday 26, Tuesday 27, Wednesday 28 February
– Monday 5, Tuesday 6, Wednesday 7, Thursday 8 March
– Monday 12, Tuesday 13, Wednesday 14, Thursday 15, Friday 16 March
Professor Oliver Turnbull, Pro Vice-Chancellor (Teaching & Learning) said: "On these days, some members of staff may be taking part in the strike action, and there may be some disruption to some teaching activities. However, as not all University staff are members of the Union, the impact of the strike will vary from one part of the University to the other.
"The University will remain open during the strike action and staff who are not members of the University and College Union will continue to work as normal. As a result, there will be minimal impact in some areas, whilst in other areas teaching activity could be affected.
Professor Carol Tully, Pro Vice-Chancellor (Students) said: "The University is keen for there to be a rapid negotiated settlement to this dispute. These negotiations are conducted through a national group called the Joint Negotiating Committee, which includes representatives of the Union and Universities. Unions and employers are committed to this national-level process ("collective bargaining") as it helps ensure fairness and parity for employees across the country.
"Whilst legally staff do not have to provide advanced notice of their intention to strike, our experience is that staff will often do this and wherever possible your department will let you know of any changes in advance."
The dispute centres on UUK's proposals to end the defined benefit element of the Universities Superannuation Scheme (USS) pension scheme. UCU says this would leave a typical lecturer almost £10,000 a year worse off in retirement than under the current set-up.
In the recent strike ballot UCU members overwhelmingly backed industrial action. Overall, 88% of members who voted backed strike action and 93% backed action short of a strike.
UCU general secretary Sally Hunt said: "Staff who have delivered the international excellence universities boast of are understandably angry at efforts to slash their pensions. They feel let down by vice-chancellors who seem to care more about defending their own pay and perks than the rights of their staff.
"Strike action on this scale has not been seen before on UK campuses, but universities need to know the full scale of the disruption they will be hit with if they refuse to sort this mess out."
In Bangor, a group of students have decided to show their support for lecturers by setting up a facebook page and starting a petition. Katie Medlin, 20, from the School of Biological Sciences said: "I am incredibly shocked at the drastic cuts to pensions, proposed by the UUK, which would detrimentally affect the rest of our lecturers' lives.
"Many would be living below the poverty line, forcing them to struggle to afford essentials. This isn't a life that anyone deserves, let alone those which spend their lives educating and supporting others. "
Our lecturers deserve better, which is why I co-founded the 'Support our Lecturers' Facebook group and started the online petition. I'm shocked by the amount of members and supporters both the group and petition have amassed and grateful for the support of Bangor University students for their lecturers."
All together, 61 Universities across the U.K. are set to be affected by the planned strikes. Katie Monkford, 22, of The University of Hull said: "My uni has told students that 2 in 5 lectures might be affected by this strike, this means that individually I might miss all my lectures in one week alone!
"As a third year student I don't feel that a strike this semester is the best course of action, we've been told that lectures won't be rescheduled and that they won't give extensions for course work based around the lectures we have missed!!
"It's so frustrating that my grades this semester might suffer because the big wigs at the top won't listen to concerns brought about by students and lecturers alike!"
Staff at Bangor University are keen to stress that if the strike action should affect any assessments, the University will take this into account when considering extensions or special circumstances.
Emma Victoria Jewkes
Editor 2017/18 Deputy Editor (Content) 2016/17 Lifestyle Editor 2015/16 Secretary 2015/17
Universities face 14 days of strikes during exams if… Universities across the UK will be hit with another 14 days of strikes around exam time if the pensions dispute…
Bangor Rated One Of The Best In The UK For Student… Once again, Bangor University has been ranked in the top 10 of the UK's non-specialist universities, according to the latest…
Student Satisfaction: Still On Top Bangor University places in UK's Top 15 for student satisfaction Results from the annual independent National Student Survey (NSS), which…
OPINION: Student Protestors – "We're not attacking… The protest organised for the 18th of January against the proposed cuts has been accused by a slim number of…
Student Protest Against Bangor University Cuts… A student protest has been organised to oppose proposed cuts made by Bangor University, it is being organised by two…
TIMELINE: Redundancy, Retirement, Cuts & Chaos… Still struggling to grasp the various controversies that have surrounded Bangor University? Seren presents a concise timeline of the events…


This is round three of this particular page's blackout (or smudge) poeming.
I'm not sure if I've done this before (taken one source and made multiple blackout or smudge poems from it) but I like this idea enough that I may turn it into a project.
April is coming up fast, and with it, NaPoWriMo I'll be participating for my (I think) 7th year in a row. I hope you'll join us - poeming is for everyone!
There's free daily prompts in many, many places online (too many to link to, honestly, but a search for mine will take you here) and some books you can purchase - Words Dance is run by a friend and has two editions of prompts that I know of, here's volume one) and at least one guided group happening (this one led by Amy, aka Mama Scout, who is also a friend).
I'm excited and I hope you are too, whether you decide to poem it out yourself, or just read as many poems as you can. Enjoy!
* Oooh, they've even gotten awesome and started calling it GloPoWriMo (Global, instead of National): yay!


text:
Sofia Black-D'Elia, née le  à Summit dans le New Jersey, est une actrice américaine.

Biographie
Sofia Black D'Elia commence à jouer la comédie à cinq ans au théâtre de Broadway.

À 17 ans, elle obtient le rôle de Bailey Wells dans le soap opera La Force du destin et se fait remarquer par le rôle de Tea Marvelli dans le teen drama Skins. Il s'agit de l'adaptation américaine de la série télévisée anglaise du même nom. Dès lors, elle apparaît régulièrement à la télévision.

En 2011, elle apparaît dans le clip The Chase is On d'Hoodie Allen. Elle joue dans la dernière saison de la série télévisée Gossip Girl, les éphémères Betrayal, et The Messengers. Dans cette dernière, elle incarne le rôle d'un messager de dieu, capable de guérir les personnes, afin d'arrêter l'Apocalypse.

En 2016, elle est à l'affiche de la mini-série dramatique The Night Of.

Parallèlement, elle fait quelques incursions sur le grand écran, en étant à l'affiche de longs métrages comme The Immigrant, Projet Almanac, Viral et Ben-Hur.

De 2017 à 2018, elle joue le rôle de Sabrina Pemberton dans la série télévisée comique Very Bad Nanny.

Filmographie

Cinéma

Courts métrages

2012 : Somewhere Road de Ryan Sloan et Robert Spat : Erika
2016 : 10 Crosby : la mère de Ronnie

Longs métrages
 2013 : The Immigrant de James Gray : Not Magda
 2014 : Born of War de Vicky Jewson : Mina
 2015 : Projet Almanac de Dean Israelite : Jessie Pierce
 2016 : Viral de Ariel Schulman et Henry Joost : Emma Drakeford
 2016 : Ben-Hur de Timur Bekmambetov : Tirzah
2021 : À tous les garçons : Toujours et à jamais, Lara Jean (To All the Boys: Always and Forever, Lara Jean) de Michael Fimognari : Heather

Télévision

Séries télévisées
 2009–2010 : La Force du destin: Bailey Wells (28 épisodes)
 2011 : Skins Web épisode : Tea Marvelli (Web-série, 3 épisodes)
 2011 : Skins : Tea Marvelli (10 épisodes)
 2012 : Gossip Girl : Natasha "Sage" Spence (saison 6, 9 épisodes)
 2013 : Betrayal : Jules Whiteman (4 épisodes)
 2015 : The Messengers : Erin Calder (13 épisodes)
 2016 : The Night Of : Andrea Cornish (Mini-série, 6 épisodes)
2016 : Invisible : Tatiana Ashland (6 épisodes)
2017–2018 : Very Bad Nanny : Sabrina Pemberton (37 épisodes)
2019 : Your Honor : Frannie (10 épisodes)
2022 : Single Drunk Female : Samantha Fink

Notes et références

Lien externe

Actrice américaine
Naissance en décembre 1991
Naissance à Clifton
Enfant acteur américain

redpajama_set_name: RedPajamaWikipedia


The INTELECOM Online Resources Network®, an online service of Intelecom Learning, is a hosted and supported database of curriculum-aligned video clips, fully hosted and streamed on demand. Support student success, improve course retention and completion rates, enhance the teaching and learning experience within both online and traditional courses.
Intelecom Learning is a non-profit service of the California Community Colleges, using technology to open doors to learning and improve student success.


2003 Yamaha V Star 650 Custom Factory Service Manuals - Search Results: All listed. 1642 boats were found that matched your search. Scroll down and click on the ID or Boat Description to view. Click here to receive e-mail when more boats of this type become available ( All listed ). Manuals Warehouse is your source for copies of owners manuals, service manuals and other documentation on audio, music, stage and studio equipment.. Find the Sailboat of your dreams or list your current sailboat for sale for free with free sailboat classified ads. Sailboat Listings include racers, cruisers, sloops, catamarans, trimarans, daysailers, sailing dinghies, and overnighters in our photo ads of used sailboats for sale..
La storia del libro segue una serie di innovazioni tecnologiche che hanno migliorato la qualità di conservazione del testo e l'accesso alle informazioni, la portabilità e il costo di produzione.. Fukuoka | Japan Fukuoka | Japan. The tube is lightweight and highly portable and provides water on demand, on site. There were many things we liked about it, but one of the things that really impressed us was the way it dealt with the different water pressures one has to cope with, so th.


In order to implement integration services in a consistent and secure manner and with proper authorization and controls from data custodians Emory requires a review of all new internal web or ESB services and events at Emory (developed at Emory or vended) prior to publication to end users for production use. Additionally, Emory requires a review of any new consumers of web or ESB services and events prior to authorizing production use. Internal ESB or web services are those intended for use by Emory people, Emory affiliates, and Emory applications only and not external entities or the general public. This process is initiated by LITS in consultation with Legal Counsel and the Emory Healthcare and Emory University Compliance Officers. To begin this process, please visit the Emory Review Process for Internal-facing ESB, Web, and FHIR Services. While internally published web and ESB services do not have the same security and compliance requirements as publicly published services, internal web and ESB services have many of the same custodial, legal, compliance, and security implications. For this reason Emory must perform technical, compliance, regulatory, and security reviews for internal ESB and web services as well as perform a data custodian review to obtain a data release specific to the proposed use. ESB and web services may be published internally to a limited user base for development and testing purposes prior to this review, but the reviews must be completed satisfactorily prior to publishing services and events for production use.
Emory requires that all web and ESB services developed at Emory be listed in the Emory ESB and Web Service Registry and appear in the Emory ESB and Web Service Dashboard. This practice helps ensure that Emory can track ESB and web service usage, implement proper authorization and other controls specified by the data custodian, manage application updates, and otherwise support and secure the services. Emory must also determine if the ESB or web services collect, transmit, or store any sensitive data and, if so, ensure that Emory's FERPA, HIPAA, PCI, or other appropriate compliance obligations are met. Some vended web services such as those provided by cloud and software-as-a-service providers may require publication by the vendor. Such services are subject to the Policy for Services and Events Published by Other Entities and Consumed by Emory.
Emory requires a review of all ESB and web services and events developed at Emory prior exposing them to external entities or the general public over the internet. This process is initiated by LITS in consultation with Legal Counsel and Emory Healthcare and Emory University Compliance Officers. To begin the process, please visit Emory Review Process for External-facing ESB, Web, and FHIR Services. All ESB and web services bound for external publication should first complete the internal review process, which identifies the data custodian and obtains proper release with any specific controls from the data custodian. Prior to external publication, the service must be reviewed by data custodians and assessed by Compliance and Information Security for any vulnerabilities specific to general availability on the internet.
Emory must also determine if the ESB or web services collect, transmit, or store any sensitive data and, if so, ensure that Emory's FERPA, HIPAA, PCI, or other appropriate compliance obligations are met. Publication of web or ESB services to any external (non-Emory affiliated) entities without completing Emory's service review process is prohibited.
Emory requires a review of all ESB and web services used for purposes subject to Emory policy and regulatory compliance. These purposes include the acquisition, storage, and transmission of data that is subject to Emory compliance policies such as student information, employee data, and protected health information. ESB and web services developed at Emory are already covered under internal and external publication review policies. This process applies specifically to ESB and web services available from vendors and software-as-a-service providers, vendor-provided services.
Emory requires that all vendor-provided services that are intended to acquire, store, or transmit sensitive information be reviewed for suitability and compliance by the appropriate Compliance Officer and Information Security. Emory must also determine if the ESB or web services collect, transmit, or store any sensitive data and, if so, ensure that Emory's FERPA, HIPAA, PCI, or other appropriate compliance obligations are met. Once approved, all Vended Apps will be listed in the Emory Web Service Registry along with a description of their approved use and when appropriate prohibited uses. To begin this process visit Emory Review Process for Vendor- or Partner-provided ESB, Web, or FHIR Services.


As a CSMS member, you receive exclusive financing offers, customized for your practice.
Webster Bank is a personal and business banking partner that understands the needs of healthcare practices, listens to your concerns, and provides solutions to help you meet your goals.
If you would like further information or would like to speak to a Webster Banker, please contact Jace D'Amico, Senior Vice President, Healthcare Specialty Banking at 203-962-5839.


Welcome to The TV MegaSite's Doctor Who Site!
WE ARE BUILDING THIS SECTION AND REDESIGNING OUR WHOLE SITE, SO THERE IS NOTHING WORKING YET IN "DOCTOR WHO" EXCEPT THIS MAIN PAGE!
The new "Doctor Who" started in 2005 (We don't cover the old series yet). It has been a smash hit ever since, and the show is just great fun. In the U.S., it airs on BBC America and sometimes on Syfy. Doctor Who is a Time Lord, the last of his race. He is able to travel through time and space, and he often helps or saves people. He has had many traveling companions through the years. When The Doctor, as he is known, dies, he can regenerate, so he comes back looking very different. It's very good science fiction, fantasy, drama, and just plain fun!
Check out our new Doctor Who Spoilers Page and Doctor Who Appearances Page!
'Doctor Who': Is David Tennant the best doctor ever?
'Torchwood' exclusive: Would U.S. version turn Capt. Jack straight?
Come visit our Primetime Forum to talk about Doctor Who and read lots of TV news!!!


text:
Jack Grimmer on the 'little Wycombe' tag and hoping to beat Wayne Rooney's Derby County
Wycombe 's Jack Grimmer on facing Wayne Rooney's Derby at Pride Park
Jack Grimmer playing against Watford (Adam Davy/PA)
Jack Grimmer hopes Wycombe can cause an upset against Derby County this weekend.
It will be the first-ever meeting between the two sides with both teams in need of a win.
READ MORE: 'I hope it is not too bad' - Jack Grimmer on Dominic Gape's shoulder injury
Despite being on a good run of losing just one of the last six matches, Wycombe have only scored six goals in the league this season and have the worst goal difference, whilst Derby are bottom of the division and are looking for a new manager.
The Rams will have ex-Manchester United striker Wayne Rooney in temporary charge of the club along with former Reading man Liam Rosenior and ex-Newcastle goalkeeper Shay Give, but the Scotsman hopes this can be the perfect opportunity to secure their third win of the season.
Grimmer said: "We're used to the pressure and the spotlight being on the other team."
"They might have a new manager coming in and there is of course numerous talk about Rooney as well.
"For me, that adds pressure for them that they don't want and that is something that we thrive on."
READ MORE: Full-time at Adams Park: Wycombe Wanderers 0-0 Huddersfield Town: Two clean sheets in a row
"We know that some teams don't like playing us because there is that pressure of 'little Wycombe could cause an upset.'
"I don't mean no disrespect to Wycombe but we're always viewed with that term in this league as we achieved the unimaginable last season.
"So it is something that we play on and we love and we love so if we can go there and cause an upset, it would be a great thing."


The Garden Spot High School counseling department is committed to providing comprehensive, developmental counseling services to all students. Below is information regarding the post-secondary planning services counselors provide to students at each grade level.
Freshmen receive classroom guidance lessons focused on academic success in high school. Students will meet individually with the 9th grade counselor to discuss course selection, four year planning and career and educational goals beyond high school.
Sophomores recieve classroom guidance lessons to help them better understand how their academic performance is connected to their post-secondary goals. Students will meet indiviudally with their counselor to discuss course selection, academic planning and post-secondary planning.
Juniors recieve classroom guidance lessons with a focus on the college application process, financial aid, career training, military opportunities and joining the workforce. Counselors help students explore Naviance, a college and career research tool and college application management system.
Seniors will attend a presentaiton at the very beginning of their senior year helping them navigate the process of applying to colleges. In the Fall, counselors meet with senior individually to conduct the senior interview, helping every student actively pursue their post-secondary goals.
To view timelines for post-secondary planning, please see the "Guidance Documents" page.


text:
Haaretz Corrects: Israel Didn't Refuse Request To Supply Vaccines for Palestinian Health Workers
CAMERA's Israel office yesterday prompted correction of a Haaretz Op-Ed by Shannon Maree Torrens which falsely claimed that Israel refused a request from the World Health Organization to provide vaccines for Palestinian health workers. The Jan. 11 Op-Ed, "COVID vaccines: The latest example of Israel's most lethal disregard for Palestinian lives," appeared in the English's print edition as well as online. Torrens, identified as an international and human rights lawyer from Australia who has worked at the United Nations international criminal tribunals, leveled the fallacious charge:
The World Health Organization asked Israel to make the vaccine available for Palestinian health workers but Israel refused, arguing that they did not have enough vaccines, all while surpassing the rest of the world in the rate at which it is vaccinating its people.
In fact, both Israel's Ministry of Health and the World Health Organization official responsible for the Palestinian territories issued statements which refute Torrens' baseless charge that "Israel refused" WHO's request to supply vaccines for Palestinian health workers.
In a Jan. 8 BBC interview, Gerald Rockenschaub, head of WHO's office for the Palestinian territories, explained that there were informal talks about Israel providing vaccines for Palestinian health workers, and that no decision has yet been made since Israel still does not have vaccines for all its citizens. He told the BBC:
"I think there are also some shortages that the Israelis are facing at the moment. We had some informal discussion asking whether at least some quantities could be relocated to vaccinate the health workers in the Palestinian territories. We're having discussions at the moment but no final results yet."
Similarly, as Reuters reported Sunday (Jan. 9):
A WHO official said on Sunday the organisation had held "informal discussions" with Israel over allocating some supplies to the Palestinians to inoculate health workers. The official, Gerald Rockenschaub, head of the WHO office in the Palestinian territories, said Israel indicated it would explore the option. (Emphasis added.)
As for Israel's Ministry of Health, in response to a verification request from CAMERA UK regarding The Independent's identical claim earlier in the week that Israel refused the WHO request, an official for the Ministry responded: "The Israeli Ministry of Health, which has a very healthy working relationship with the WHO and is running the current vaccine drive, has never received a request like this from the WHO."
Prior to the publication of Haaretz's Op-Ed, the Independent had already improved its coverage, adding that WHO clarified that "informal discussions" took place in which the Israeli ministry "indicated they would explore this option," and also that the health ministry denied that a request had been made.
In response to communication from CAMERA, Haaretz editors commendably amended the digital article. The amended text now states:
The World Health Organization asked Israel informally to make the vaccine available for Palestinian health workers; Israel responded that due to shortages, they were not currently in a position to supply vaccines but would explore the option, despite surpassing the rest of the world in the rate at which it is vaccinating its people.
In addition, a note appended to the bottom of the article alerts readers to the change, stating:
This article has been updated in the light of further reporting on the response of the Israeli Ministry of Health to the WHO's informal request to supply Palestinians with COVID vaccines.
Unfortunately, a correction does not appear in today's print edition.
Separately, regarding the well-documented vaccination of Palestinians in east Jerusalem, Torrens equivocated: "Israel has reportedly given Palestinians in east Jerusalem access to the vaccine. . . ." The qualifying term "reportedly" falsely suggests that the considerable effort to vaccinate east Jerusalem Palestinians cannot be confirmed. Haaretz's own Nir Hasson detailed that Israeli HMOs Clalit, Leumit and Meuhedet are all offering the vaccine to east Jerusalem's Palestinians. (See hyperlink.)
Similarly, in the aforementioned BBC interview, WHO's Rockenschaub made clear: "The only Palestinians that were vaccinated so far are those living with Jerusalem IDs in East Jerusalem and who have access to Israeli health system.""
To their credit, editors agreed, and removed the inappropriate qualification, "reportedly."
Beyond these two narrow points, Torrens' underlying, false premise is that Israel's failure to uphold its supposed obligation "under international law and international human rights law" to provide West Bank and Gaza Palestinians with the covid vaccine exhibits "a complete disregard for the humanity and lives of Palestinians." As CAMERA has previously documented, it is the bilateral Oslo Accords which govern Israeli-Palestinian relations, and Article 17 of the Interim Accords obligates the Palestinian authorities to vaccinate their citizens in the West Bank and Gaza Strip.
With False Report That Palestinian Prisoner Died in Jail, AP Adopts Anti-Israel Propaganda
Corrections: Coronavirus Crisis
Shannon Maree Torrens


text:
Soyedina producta är en bäcksländeart som först beskrevs av Peter Walter Claassen 1923.  Soyedina producta ingår i släktet Soyedina och familjen kryssbäcksländor. Inga underarter finns listade i Catalogue of Life.

Källor

Kryssbäcksländor
producta


LOOP ....... Report message to a moderator Re: PLS-00371: at most one declaration for 'V_MSG' is permitted [message #240565 is a reply to message #240522] Fri, 25 May 2007 03:59 Join our community for more solutions or to ask questions. Connect with top rated Experts 15 Experts available now in Live!
Email check failed, please try again Sorry, your blog cannot share posts by email. %d bloggers like this: 토픽을 선택하세요 DBMS MySQL PostgreSQL Firebird Oracle Informix Sybase MS-SQL DB2 Cache If necessary, remove all but one declaration of the identifier. DECLARE -- Global variables my_var1 VARCHAR2(30) := 'input1'; my_var2 VARCHAR2(30) := 'input2'; BEGIN dbms_output.put_line('Outer Variable my_var1: ' || my_var1); dbms_output.put_line('Outer Variable my_var2: ' || my_var2); I would have figured that would fail because it's a keyword, but I tried it and it worked.
dev> exec test.return := 'Hi!'; BEGIN test.return := 'Hi!'; END; * ERROR at line 1: ORA-06550: line 1, column 12: PLS-00371: at most one declaration for 'TEST.RETURN' is permitted ORA-06550: line If necessary, remove all but one declaration of the identifier. Show 7 replies 1. Probably did that just after you read the original.
Remove the declararion of MonthRunDate and WeekRunDate from your package body. I just found out how you can detect these problems at compile time. anyway..here is the one comeplete with the line numbers... Senior Member CTRL-F is what you need Frank.
What's the difference between /tmp and /run? For example as like below compliant way of writing the global variable without getting PLS-00371 error. More discussions in PL/SQL and SQL All PlacesDatabaseDatabase Application DevelopmentPL/SQL and SQL This discussion is archived 7 Replies Latest reply on Nov 19, 2015 11:21 AM by Billy~Verreynne Duplicate identifier in Senior Member You'll have an END; where Oracle is expecting to see END IF;.
But maybe, I don't see the obvious, so: is this really a bug? Like Show 2 Likes(2) Actions 2. more stack exchange communities company blog Stack Exchange Inbox Reputation and Badges sign up log in tour help Tour Start here for a quick overview of the site Help Center Detailed Your exception handler is very hard to check too..
Sure, it creates a symbol table, and it's the reference to the symbol table that creates the error when it find a duplicate.However, in the example I showed, it's the compiler Try this code: create or replace package tq84 as return varchar2(10); somevar varchar2(5); somevar varchar2(5); end tq84; / set serveroutput on BEGIN tq84.return:='Test'; dbms_output.put_line(tq84.return); END; / That shows return as a Join the community of 500,000 technology professionals and ask your questions. So it is, in my view, less intelligent. 1 person found this helpful Like Show 0 Likes(0) Actions 5.
Promoted by Recorded Future Do you know the main threat actor types? return := 'return'; function function return return . Action: Check the spelling of the identifier. Are there any rules or guidelines about designing a flag?
Answer / samuel delete one of the declarative identifier in the declarative block.it worked Try to be consequent in your indenting. We are not PL/SQL syntax analyzer.


text:
Samuel H. McLeary (1881 – July 2, 1924) was an aviation pioneer. He was one of the first 24 people chosen by the Aviation Section of the U.S. Signal Corp to be pilots.

Biography
He was born in 1881.

He was murdered by a hitchhiker on July 2, 1924 in Chesterfield, South Carolina. He was buried in Arlington National Cemetery.

References

External links
Samuel H. McLeary at Arlington National Cemetery

See also
 List of aviation pioneers

1881 births
1924 deaths
American aviators
Burials at Arlington National Cemetery


text:
Q: converting mysql datetime in vb.net I am using this code in my vb.net app:
If reader3.GetString(6).ToString = "0000-00-00" Then
    product_detail_from_date = ""
Else
    product_detail_from_date = Convert.ToDateTime(reader3.GetString(6)).ToString("dd/MM/yyyy")
End If

on this occasion, reader3.getstring(6) does equal 0000-00-00
Unable to convert MySQL date/time value to System.DateTime

how can i stop this error showing and get the code working with the IF statement?

redpajama_set_name: RedPajamaStackExchange


When she's on Shimmer & Shine time, it's probably going to be lasting for awhile. So make sure she has the outfit to match her favorite show, and whether it's play time or time to watch a few episodes, she'll have a sweet tee with her favorite characters on it!
This officially licensed Shimmer & Shine Girls Shine girl's t-shirt comes in a gorgeous purple color, and it features a bold graphic print of all of her favorite Nickelodeon characters. With a glitter trim finish, and the phrase "Love Ya!" printed on the front, it will be a fun way to spread a little cheer. Because what day couldn't use a little extra genie cheer?
100 percent cotton, this t-shirt is officially licensed, and the perfect way to make sure her wardrobe is genie-riffic. When Shimmer and Shine are a part of her day, everything's going to be all "Boom Zahramay!"
Image on front of Shimmer, Shine & their pets w/ phrase "Love Ya!"


Cassone's RV is a new RV dealership in Phoenix, Arizona. Originally called A Smooth Finish RV, the business has grown from an RV service and repair business to include a sales division. The client wanted a new name and look to launch the sales aspect of the business.
The client requested that the logo include a stylized letter "C" and the color red. I took that idea and developed the "C" to be a border that surrounds the logo. It's curved shape and variance in the line weight convey motion and speed while providing a sense of perspective that resembles the open road customers will experience in their new RVs.


If you're looking for a bold new departure from your usual makeup routine, then you're in luck: one of the hottest makeup trends for summer 2011 involves neon lips colors like watermelon pink and bright orange.
Fuschia, coral, hot pink, and chili red are all hot for summer, and they're easier to wear than you might think. The newest incarnations of these colors are meant for every skin tone, and you can choose from different color formulas, from glosses to lipsticks, to control the intensity of your color result.
If you're nervous about experimenting with such bold color choices, start with a sheer gloss, which gives you a light pop of color and shine. It's a less heady way to try out a new lip color for the first time.
If you want to take the plunge into high-impact color, look for a matte lipstick, the hippest new way to wear bold color. If you can't find a matte lipstick in the shade you want, you can get a similar effect by lining and filling in lips with a boldly hued lip pencil.
If you're worried about your hot new lipcolor melting away in the summer heat, look for a lipstain, which traditionally gives long-wearing color with a matte finish. As an added bonus, lipstains won't rub off while you're eating and drinking, so they're great for a summer picnic!
Since your bold lips will draw enough attention all by themselves, keep the rest of your makeup simple; a little basic eyeliner and mascara and a natural-toned blush or bronzer should be all you need to complete your look.
If you're really feeling experimental, take this trend one step further by adding boldly hued nails, another big trend for summer 2011! Try different color combinations – yellow with pink lips, turquoise with coral to see what works best for you.
PreviousThe new ipad2, just for you!


Cary Connoway had heard rumors of a mysterious Cult of Death even before he arrived in San Mario, but nothing could have prepared him for the unspeakable evil that stalked him now. He had come to the primitive Caribbean island for rest and instead found love in the arms of Juana, a beautiful island girl.
Now in the jungle they both faced a relentless, oncoming horror that only the awesome power of voodoo could have raised and only the power of voodoo could stop.


text:
Die Vorsorgekasse Hoesch ist eine deutsche Sterbegeldkasse. Die Kasse hat 130.000 Mitglieder. Sie ist in der Rechtsform eines Versicherungsvereins auf Gegenseitigkeit organisiert und gehört somit den Versicherten selbst.

Geschichte
Die Männer der Maschinenabteilung Hochofen der Dortmunder Westfalenhütte gründeten im Frühjahr 1923 die "Sterbegeld-Beihilfe" und legten damit den Grundstein für die heutige Vorsorgekasse Hoesch (VKH). Zunächst als Hilfe im Todesfall unter der Kollegenschaft gedacht wuchs die Anzahl der Beteiligten rasch. 1924 beteiligten sich schon 300 Mitglieder, von denen im Todesfall eines Kollegen jeder eine Reichsmark an die Angehörigen zahlte. Damit wollten die Arbeiter die Not der Angehörigen nach einem Todesfall mildern. Zwar hatte Werksgründer Leopold Hoesch schon unmittelbar nach dem Bau der Westfalenhütte im Jahre 1871 wichtige Sozialeinrichtungen – wie die "Fabrikkrankenkasse" (1874), die "Pensions-, Witwen- und Waisenkasse für Beamte" (1872) sowie die "Arbeiter-Versorgungskasse" (1906) – eingeführt; doch das und das spätere staatliche Sozialpaket reichten nicht immer aus. Starb ein Kollege, geriet seine Familie oft in große finanzielle Schwierigkeiten.

Nach Aufforderung der Stadtverwaltung und zunächst massiven Protesten durch die Arbeiterschaft wurde die "Sterbegeld-Beihilfe" 1936 der Zuständigkeit des Versicherungsamtes der Stadt Dortmund unterstellt. Dadurch wurde die "Sterbegeld-Beihilfe" erstmals rechtsfähig und statt im Umlageverfahren wurden die Leistungen nach versicherungsmathematischen Grundlagen gezahlt.

Nach dem Zweiten Weltkrieg wuchs die Kasse enorm und musste sich deswegen dem Bundesaufsichtsamt für Versicherungs- und Bausparwesen in Berlin unterstellen. Damit einher ging eine Namensänderung zur "Sterbegeld-Beihilfe der Belegschaft der Hoesch Westfalenhütte AG".

Die Fusion der Dortmund-Hörder Hüttenunion mit der Hoesch AG 1966 führte zu einem erneuten rasanten Anstieg der Mitgliedszahlen. Der Geltungsbereich der Sterbekasse wurde auf die gesamte Belegschaft der Werke Phoenix und Union erweitert, womit die Kasse 10.000 Mitglieder fasste. Dies führte aus verwaltungstechnischen Gründen dazu, dass seitdem die Mitgliedsbeiträge auch direkt vom Gehalt einbehalten werden können. Drei Jahre darauf bot die Sterbekasse ihre Leistungen im gesamten Hoesch-Konzern an. Ab dem 1. Januar 1970 wurde dann die Möglichkeit der sogenannten "Kindermitversicherung" bei einer monatlichen Zahlung von 0,10 DM und einer Versicherungssumme von 1.000 DM angeboten.

Die Sterbekasse wuchs weiter: Sowohl die Mitgliedszahlen als auch das Vermögen und die Leistungen kletterten in den folgenden Jahren immer höher. 1983 bekam die Sterbekasse ihren heutigen Namen: "Vorsorgekasse Hoesch" (VKH). 1988 wurde durch die Öffnung der Sterbekasse für Konzernfremde aus der kleinen Solidaritätsgemeinschaft von 1923 endgültig die größte Sterbekasse Deutschlands mit mittlerweile 130.000 Mitgliedern, 681.000 Versicherungsverträgen und einer Bilanzsumme von 232 Mio. Euro. Der erwirtschaftete Überschuss fließt in Form von Gewinnzuschlägen und Bonuserhöhungen an die Versicherten zurück.

Durch eine Erweiterung ihres Angebotes passte sich die Vorsorgekasse Hoesch dem Wandel von der Betriebs- zur allgemein zugänglichen Vorsorgekasse an. Seit 1996 bietet die VKH neben der Sterbegeld- auch eine Lebensversicherung an.

Verschmelzungen und Bestandsübertragungen seit 1995
Die Vorsorgekasse wuchs in der Vergangenheit auch durch zahlreiche Verschmelzungen und Bestandsübertragungen, so von der Wohlfahrts-Sterbekasse Grüne (zum 1. Januar 1995), dem Verein Treuer Nachbarn (zum 1. Januar 1998), der Begräbnis-Beihilfe Sprockhövel (zum 1. Januar 1998), der Sterbegeld-Selbsthilfe (zum 1. Januar 1999), der Sterbekasse Henrichshütte (zum 1. Januar 1999), der Sterbekasse der Eisenwerk Rothe Erde (zum 1. Januar 1999), der Sterbeunterstützungskasse Mülheim-Ruhr-Heißen (zum 1. Januar 1999), der Allgem. Sterbekasse "Selbsthülfe" Schwerte (Ruhr) (zum 1. Januar 2000), der Sterbekasse Hinterbliebenenhilfe Krupp VVaG Essen (zum 1. Januar 2000), dem Bestattungsverein Hamburg-Harburg von 1923 (zum 1. Januar 2001) und der Sterbegeld-Beihilfe der Belegsch. der DAB VVaG (zum 1. Januar 2001).

Im September 2004 wurde die Sterbekasse Henkel mit der Vorsorgekasse Hoesch verschmolzen. Die 19.000 Mitglieder der Sterbekasse Henkel wurden von der Vorsorgekasse Hoesch übernommen, rückwirkend zum 1. Januar 2004. Im Jahr 2006 wurde der Bestand der Sterbekasse der BKK Chemie Partner übernommen, rückwirkend zum 1. Januar 2005. Zum 1. Januar 2007 wurde der Bestand der Sterbekasse der Werksanhörigen der DK Recycling und Roheisen übernommen. Ebenso wurde rückwirkend zum 1. Januar 2007 die UK Geisweid übernommen.

Im Dezember 2011 hat die BaFin als zuständige Aufsichtsbehörde die Verschmelzung der Allgemeine Sterbekasse Essen auf die VKH genehmigt, diese wurde rückwirkend zum 1. Januar 2011 verschmolzen. Am 31. August 2012 hat die BaFin die Verschmelzung der Justiz-Versicherungskasse Lebensversicherungsverein a.G. mit 5.200 Mitgliedern auf die VKH genehmigt, diese wurde rückwirkend zum 1. Januar 2012 verschmolzen.

Am 19. Dezember 2013 hat die BaFin die Übertragung der Bestände der Sterbekasse Thyssen Draht auf die VKH genehmigt. Am 15. Dezember 2014 hat die BaFin die Übertragung der Bestände der Oberbarmer Sterbekasse "Einheit" VVaG auf die VKH genehmigt. Am 16. Dezember 2016 hat die BaFin die Übertragung des gesamten Bestands der Begräbnishilfe Dortmund-Bövinghausen V.V.a.G. auf die VKH genehmigt.

Die Übertragung des gesamten Versicherungsbestand des Versicherungsverein aG Witten auf die Vorsorgekasse Hoesch ist im Dezember 2017 erfolgt. Im Dezember 2018 wurde dann die Übertragung des Bestands der Sterbekasse "Hilfe am Grabe Freudenberg" VVaG genehmigt.

Weblinks

Einzelnachweise

Versicherungsverein auf Gegenseitigkeit
Versicherungsunternehmen (Dortmund)
Gegründet 1923


text:
Q: Can I keep working on "do X Y times" achievements by replaying missions? In Metro 2033 if I repeat missions from the "Load" option can I still work on achievements like "Get 20 kills with a throwing knife" when I finish the campaign. So if I killed 18 people during my play through if I go back to a specific mission can I get 2 kills with a throwing knife and get the achievement? Or do I have to start the game again?

A: No, If you start the game again all your stats are wiped. So if you had 18/20 at the end of the game, by replaying a mission or starting again for that instance you have 0/20.


It is COLOR YOUR BRAND 's commitment that you can live from your talents and work from your strengths.
Learn to be clear on what you are, why you do what you do and what is your story in a few minutes.
What do we see? Does your website and work match your pitch? We will look into everything in detail.
We are going to put everything on the table. Let's find your personal style, concepts, and ideas of any type.
First, we will mood board our company. Colors, textures, text. After that, we will break down all the ideas above and make them possible options in mood boards too.
I will teach you to use the SMART system to plan your dream business and your projects, so you can start tomorrow if you want. We will make a production plan.
With your pre-production plan on your hand now you can GO out & PLAY. Bring your plan to live.
Let's review what you have done and if is coherent with the plan and idea you had. Our goal is that you are behind every choice you make.
To find a match you need to understand and see what is out there. We are going to dive into the information of the brands, competition and possible clients you can have.
Your website, your logo, your presence on & offline. We will look at your new perosnal branding and how you can communicating it from now on. Make a plan and make decisions.
One of the most difficult things is to put a price on your talent or your service. For that you need to gather information, but which one?
We will learn how to connect the dots of your "essence words" for each project and for your business. This way you will never lose track of your mission and of your personal branding again.
You can choose the best option for your needs.
This coaching is One on One via Zoom (video conference system).
Book in this link your free 20 min call via Skype or Zoom with me.


In this post, I will demonstrate how to craft your first API calls with the tool Postman. Postman is a tool for developing and testing APIs, and is available as a Windows, Mac, or Linux native client for free at https://www.getpostman.com.
If you're an app developer interested in making sure your users are aware of the best content and that they will stay highly engaged, read below for my tips on how to leverage the "Recommended by Your Apps" row on Fire TV.
This article is intended as a brief overview and explanation of the Amazon GameOn API keys, which should be helpful as you go through the GameOn documentation and plan your technical integration.
Fire OS-based devices update apps automatically and, as a developer, you can expect that most of your users will transition to the latest version of your app in a matter of days. Some users, however, turn this functionality off. On some devices, like phones, this often gets turned off to save data.
Developers targeting older Amazon Fire tablets (2012 and earlier) who are upgrading their Unity engines should be an aware of an important change in Unity's Android support.
Starting with Android 6 (API 23), users can grant or revoke certain permissions to apps while they are running, instead of when they first install the app. This helps streamline the app install process for the user because he can install an app without setting permissions he doesn't want included.
Check out our tips and tricks for safeguarding your APK from copyright infringement.


text:
package org.apache.zeppelin.jdbc;

import org.apache.zeppelin.completer.CompletionType;
import org.apache.zeppelin.interpreter.InterpreterContext;
import org.apache.zeppelin.interpreter.InterpreterException;

import org.apache.commons.lang3.StringUtils;
import org.apache.zeppelin.interpreter.InterpreterOutput;
import org.apache.zeppelin.interpreter.InterpreterResult;
import org.apache.zeppelin.interpreter.InterpreterResultMessage;
import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
import org.apache.zeppelin.scheduler.FIFOScheduler;
import org.apache.zeppelin.scheduler.ParallelScheduler;
import org.apache.zeppelin.scheduler.Scheduler;
import org.apache.zeppelin.user.AuthenticationInfo;
import org.apache.zeppelin.user.UserCredentials;
import org.apache.zeppelin.user.UsernamePassword;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.TimeoutException;

import com.mockrunner.jdbc.BasicJDBCTestCaseAdapter;
import net.jodah.concurrentunit.Waiter;

import static java.lang.String.format;
import static org.apache.zeppelin.jdbc.JDBCInterpreter.COMMON_MAX_LINE;
import static org.apache.zeppelin.jdbc.JDBCInterpreter.DEFAULT_DRIVER;
import static org.apache.zeppelin.jdbc.JDBCInterpreter.DEFAULT_PASSWORD;
import static org.apache.zeppelin.jdbc.JDBCInterpreter.DEFAULT_PRECODE;
import static org.apache.zeppelin.jdbc.JDBCInterpreter.DEFAULT_STATEMENT_PRECODE;
import static org.apache.zeppelin.jdbc.JDBCInterpreter.DEFAULT_URL;
import static org.apache.zeppelin.jdbc.JDBCInterpreter.DEFAULT_USER;
import static org.apache.zeppelin.jdbc.JDBCInterpreter.PRECODE_KEY_TEMPLATE;
import static org.apache.zeppelin.jdbc.JDBCInterpreter.STATEMENT_PRECODE_KEY_TEMPLATE;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

/**
 * JDBC interpreter unit tests.
 */
public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter {
  static String jdbcConnection;
  InterpreterContext context;

  private static String getJdbcConnection() throws IOException {
    if (null == jdbcConnection) {
      Path tmpDir = Files.createTempDirectory("h2-test-");
      tmpDir.toFile().deleteOnExit();
      jdbcConnection = format("jdbc:h2:%s", tmpDir);
    }
    return jdbcConnection;
  }

  public static Properties getJDBCTestProperties() {
    Properties p = new Properties();
    p.setProperty("default.driver", "org.postgresql.Driver");
    p.setProperty("default.url", "jdbc:postgresql://localhost:5432/");
    p.setProperty("default.user", "gpadmin");
    p.setProperty("default.password", "");
    p.setProperty("common.max_count", "1000");

    return p;
  }

  @Before
  public void setUp() throws Exception {
    Class.forName("org.h2.Driver");
    Connection connection = DriverManager.getConnection(getJdbcConnection());
    Statement statement = connection.createStatement();
    statement.execute(
        "DROP TABLE IF EXISTS test_table; " +
        "CREATE TABLE test_table(id varchar(255), name varchar(255));");

    PreparedStatement insertStatement = connection.prepareStatement(
            "insert into test_table(id, name) values ('a', 'a_name'),('b', 'b_name'),('c', ?);");
    insertStatement.setString(1, null);
    insertStatement.execute();
    context = InterpreterContext.builder()
        .setAuthenticationInfo(new AuthenticationInfo("testUser"))
        .setParagraphId("paragraphId")
        .setInterpreterOut(new InterpreterOutput())
        .build();
  }

  @Test
  public void testForParsePropertyKey() {
    JDBCInterpreter t = new JDBCInterpreter(new Properties());
    Map<String, String> localProperties = new HashMap<>();
    InterpreterContext interpreterContext = InterpreterContext.builder()
        .setLocalProperties(localProperties)
        .build();
    assertEquals(JDBCInterpreter.DEFAULT_KEY, t.getDBPrefix(interpreterContext));

    localProperties = new HashMap<>();
    localProperties.put("db", "mysql");
    interpreterContext = InterpreterContext.builder()
        .setLocalProperties(localProperties)
        .build();
    assertEquals("mysql", t.getDBPrefix(interpreterContext));

    localProperties = new HashMap<>();
    localProperties.put("hive", "hive");
    interpreterContext = InterpreterContext.builder()
        .setLocalProperties(localProperties)
        .build();
    assertEquals("hive", t.getDBPrefix(interpreterContext));
  }

  @Test
  public void testForMapPrefix() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    String sqlQuery = "select * from test_table";
    Map<String, String> localProperties = new HashMap<>();
    localProperties.put("db", "fake");
    InterpreterContext context = InterpreterContext.builder()
        .setAuthenticationInfo(new AuthenticationInfo("testUser"))
        .setLocalProperties(localProperties)
        .build();
    InterpreterResult interpreterResult = t.interpret(sqlQuery, context);

    // if prefix not found return ERROR and Prefix not found.
    assertEquals(InterpreterResult.Code.ERROR, interpreterResult.code());
    assertEquals("Prefix not found.", interpreterResult.message().get(0).getData());
  }

  @Test
  public void testDefaultProperties() {
    JDBCInterpreter jdbcInterpreter = new JDBCInterpreter(getJDBCTestProperties());

    assertEquals("org.postgresql.Driver", jdbcInterpreter.getProperty(DEFAULT_DRIVER));
    assertEquals("jdbc:postgresql://localhost:5432/", jdbcInterpreter.getProperty(DEFAULT_URL));
    assertEquals("gpadmin", jdbcInterpreter.getProperty(DEFAULT_USER));
    assertEquals("", jdbcInterpreter.getProperty(DEFAULT_PASSWORD));
    assertEquals("1000", jdbcInterpreter.getProperty(COMMON_MAX_LINE));
  }

  @Test
  public void testSelectQuery() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    String sqlQuery = "select * from test_table WHERE ID in ('a', 'b'); ";

    InterpreterResult interpreterResult = t.interpret(sqlQuery, context);

    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());
    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType());
    assertEquals("ID\tNAME\na\ta_name\nb\tb_name\n", resultMessages.get(0).getData());

    context = getInterpreterContext();
    context.getLocalProperties().put("limit", "1");
    interpreterResult = t.interpret(sqlQuery, context);

    resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType());
    assertEquals("ID\tNAME\na\ta_name\n", resultMessages.get(0).getData());
  }

  @Test
  public void testSelectWithRefresh() throws IOException, InterruptedException, TimeoutException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    final Waiter waiter = new Waiter();
    context.getLocalProperties().put("refreshInterval", "1000");
    Thread thread = new Thread(() -> {
      String sqlQuery = "select * from test_table WHERE ID in ('a', 'b');";
      try {
        InterpreterResult interpreterResult = t.interpret(sqlQuery, context);
        assertEquals(InterpreterResult.Code.ERROR, interpreterResult.code());
      } catch (InterpreterException e) {
        fail("Should not be here");
      }
      waiter.resume();
    });

    thread.start();

    Thread.sleep(5000);
    t.cancel(context);
    waiter.await(5000);
  }

  @Test
  public void testInvalidSelectWithRefresh() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    context.getLocalProperties().put("refreshInterval", "1000");
    String sqlQuery = "select * from invalid_table;";

    InterpreterResult interpreterResult = t.interpret(sqlQuery, context);
    assertEquals(InterpreterResult.Code.ERROR, interpreterResult.code());
    assertTrue(interpreterResult.toString(), interpreterResult.message()
            .get(0).getData().contains("Table \"INVALID_TABLE\" not found;"));
  }

  @Test
  public void testColumnAliasQuery() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    String sqlQuery = "select NAME as SOME_OTHER_NAME from test_table limit 1";

    InterpreterResult interpreterResult = t.interpret(sqlQuery, context);
    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(interpreterResult.toString(),
            InterpreterResult.Code.SUCCESS, interpreterResult.code());
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType());
    assertEquals("SOME_OTHER_NAME\na_name\n", resultMessages.get(0).getData());
  }

  @Test
  public void testSplitSqlQuery() {
    String sqlQuery = "insert into test_table(id, name) values ('a', ';\"');" +
        "select * from test_table;" +
        "select * from test_table WHERE ID = \";'\";" +
        "select * from test_table WHERE ID = ';';" +
        "select '\n', ';';" +
        "select replace('A\\;B', '\\', 'text');" +
        "select '\\', ';';" +
        "select '''', ';';" +
        "select /*+ scan */ * from test_table;" +
        "--singleLineComment\nselect * from test_table;";

    Properties properties = new Properties();
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();
    List<String> multipleSqlArray = t.splitSqlQueries(sqlQuery);
    assertEquals(10, multipleSqlArray.size());
    assertEquals("insert into test_table(id, name) values ('a', ';\"')", multipleSqlArray.get(0));
    assertEquals("select * from test_table", multipleSqlArray.get(1));
    assertEquals("select * from test_table WHERE ID = \";'\"", multipleSqlArray.get(2));
    assertEquals("select * from test_table WHERE ID = ';'", multipleSqlArray.get(3));
    assertEquals("select '\n', ';'", multipleSqlArray.get(4));
    assertEquals("\nselect replace('A\\;B', '\\', 'text')", multipleSqlArray.get(5));
    assertEquals("\nselect '\\', ';'", multipleSqlArray.get(6));
    assertEquals("\nselect '''', ';'", multipleSqlArray.get(7));
    assertEquals("\nselect /*+ scan */ * from test_table", multipleSqlArray.get(8));
    assertEquals("\n\nselect * from test_table", multipleSqlArray.get(9));
  }

  @Test
  public void testQueryWithEscapedCharacters() throws IOException,
          InterpreterException {
    String sqlQuery = "select '\\n', ';';" +
        "select replace('A\\;B', '\\', 'text');" +
        "select '\\', ';';" +
        "select '''', ';'";

    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    properties.setProperty("default.splitQueries", "true");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    InterpreterResult interpreterResult = t.interpret(sqlQuery, context);

    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());
    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType());
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(1).getType());
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(2).getType());
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(3).getType());
    assertEquals("'\\n'\t';'\n\\n\t;\n", resultMessages.get(0).getData());
    assertEquals("'Atext;B'\nAtext;B\n", resultMessages.get(1).getData());
    assertEquals("'\\'\t';'\n\\\t;\n", resultMessages.get(2).getData());
    assertEquals("''''\t';'\n'\t;\n", resultMessages.get(3).getData());
  }

  @Test
  public void testSelectMultipleQueries() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    properties.setProperty("default.splitQueries", "true");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    String sqlQuery = "select * from test_table;" +
        "select * from test_table WHERE ID = ';';";
    InterpreterResult interpreterResult = t.interpret(sqlQuery, context);
    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());

    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(2, resultMessages.size());

    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType());
    assertEquals("ID\tNAME\na\ta_name\nb\tb_name\nc\tnull\n",
            resultMessages.get(0).getData());

    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(1).getType());
    assertEquals("ID\tNAME\n", resultMessages.get(1).getData());
  }

  @Test
  public void testDefaultSplitQuries() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    String sqlQuery = "select * from test_table;" +
        "select * from test_table WHERE ID = ';';";
    InterpreterResult interpreterResult = t.interpret(sqlQuery, context);
    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());

    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(2, resultMessages.size());

    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType());
    assertEquals("ID\tNAME\na\ta_name\nb\tb_name\nc\tnull\n",
            resultMessages.get(0).getData());
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(1).getType());
    assertEquals("ID\tNAME\n",
            resultMessages.get(1).getData());
  }

  @Test
  public void testSelectQueryWithNull() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    String sqlQuery = "select * from test_table WHERE ID = 'c'";

    InterpreterResult interpreterResult = t.interpret(sqlQuery, context);

    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType());
    assertEquals("ID\tNAME\nc\tnull\n", resultMessages.get(0).getData());
  }

  @Test
  public void testSelectQueryMaxResult() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    String sqlQuery = "select * from test_table";

    InterpreterResult interpreterResult = t.interpret(sqlQuery, context);

    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());

    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType());
    assertEquals("ID\tNAME\na\ta_name\n", resultMessages.get(0).getData());
    assertEquals(InterpreterResult.Type.HTML, resultMessages.get(1).getType());
    assertTrue(resultMessages.get(1).getData().contains("Output is truncated"));
  }

  @Test
  public void concurrentSettingTest() {
    Properties properties = new Properties();
    properties.setProperty("zeppelin.jdbc.concurrent.use", "true");
    properties.setProperty("zeppelin.jdbc.concurrent.max_connection", "10");
    JDBCInterpreter jdbcInterpreter = new JDBCInterpreter(properties);

    assertTrue(jdbcInterpreter.isConcurrentExecution());
    assertEquals(10, jdbcInterpreter.getMaxConcurrentConnection());

    Scheduler scheduler = jdbcInterpreter.getScheduler();
    assertTrue(scheduler instanceof ParallelScheduler);

    properties.clear();
    properties.setProperty("zeppelin.jdbc.concurrent.use", "false");
    jdbcInterpreter = new JDBCInterpreter(properties);

    assertFalse(jdbcInterpreter.isConcurrentExecution());

    scheduler = jdbcInterpreter.getScheduler();
    assertTrue(scheduler instanceof FIFOScheduler);
  }

  @Test
  public void testAutoCompletion() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    JDBCInterpreter jdbcInterpreter = new JDBCInterpreter(properties);
    jdbcInterpreter.open();

    jdbcInterpreter.interpret("", context);

    List<InterpreterCompletion> completionList = jdbcInterpreter.completion("sel", 3,
            context);

    InterpreterCompletion correctCompletionKeyword = new InterpreterCompletion("select", "select",
            CompletionType.keyword.name());

    assertEquals(1, completionList.size());
    assertEquals(true, completionList.contains(correctCompletionKeyword));
  }

  private Properties getDBProperty(String dbPrefix,
                                   String dbUser,
                                   String dbPassowrd) throws IOException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    if (!StringUtils.isBlank(dbPrefix)) {
      properties.setProperty(dbPrefix + ".driver", "org.h2.Driver");
      properties.setProperty(dbPrefix + ".url", getJdbcConnection());
      properties.setProperty(dbPrefix + ".user", dbUser);
      properties.setProperty(dbPrefix + ".password", dbPassowrd);
    } else {
      properties.setProperty("default.driver", "org.h2.Driver");
      properties.setProperty("default.url", getJdbcConnection());
      properties.setProperty("default.user", dbUser);
      properties.setProperty("default.password", dbPassowrd);
    }
    return properties;
  }

  private AuthenticationInfo getUserAuth(String user, String entityName, String dbUser,
      String dbPassword) {
    UserCredentials userCredentials = new UserCredentials();
    if (entityName != null && dbUser != null && dbPassword != null) {
      UsernamePassword up = new UsernamePassword(dbUser, dbPassword);
      userCredentials.putUsernamePassword(entityName, up);
    }
    AuthenticationInfo authInfo = new AuthenticationInfo();
    authInfo.setUserCredentials(userCredentials);
    authInfo.setUser(user);
    return authInfo;
  }

  @Test
  public void testMultiTenant_1() throws IOException, InterpreterException {
    // user1 %jdbc  select from default db
    // user2 %jdbc  select from default db
    // user2 %jdbc  select from from hive db
    Properties properties = getDBProperty("default", "dbuser", "dbpassword");
    properties.putAll(getDBProperty("hive", "", ""));

    JDBCInterpreter jdbc = new JDBCInterpreter(properties);
    AuthenticationInfo user1Credential = getUserAuth("user1", null, null, null);
    AuthenticationInfo user2Credential = getUserAuth("user2", "hive", "user2Id", "user2Pw");
    jdbc.open();

    // user1 runs default
    InterpreterContext context = InterpreterContext.builder()
            .setAuthenticationInfo(user1Credential)
            .setInterpreterOut(new InterpreterOutput())
            .setReplName("jdbc")
            .build();
    jdbc.interpret("", context);

    JDBCUserConfigurations user1JDBC1Conf = jdbc.getJDBCConfiguration("user1");
    assertEquals("dbuser", user1JDBC1Conf.getPropertyMap("default").get("user"));
    assertEquals("dbpassword", user1JDBC1Conf.getPropertyMap("default").get("password"));

    // user2 run default
    context = InterpreterContext.builder()
        .setAuthenticationInfo(user2Credential)
        .setInterpreterOut(new InterpreterOutput())
        .setReplName("jdbc")
        .build();
    jdbc.interpret("", context);

    JDBCUserConfigurations user2JDBC1Conf = jdbc.getJDBCConfiguration("user2");
    assertEquals("dbuser", user2JDBC1Conf.getPropertyMap("default").get("user"));
    assertEquals("dbpassword", user2JDBC1Conf.getPropertyMap("default").get("password"));

    // user2 run hive
    Map<String, String> localProperties = new HashMap<>();
    localProperties.put("db", "hive");
    context = InterpreterContext.builder()
            .setAuthenticationInfo(user2Credential)
            .setInterpreterOut(new InterpreterOutput())
            .setLocalProperties(localProperties)
            .setReplName("jdbc")
            .build();
    jdbc.interpret("", context);

    user2JDBC1Conf = jdbc.getJDBCConfiguration("user2");
    assertEquals("user2Id", user2JDBC1Conf.getPropertyMap("hive").get("user"));
    assertEquals("user2Pw", user2JDBC1Conf.getPropertyMap("hive").get("password"));

    jdbc.close();
  }

  @Test
  public void testMultiTenant_2() throws IOException, InterpreterException {
    // user1 %hive  select from default db
    // user2 %hive  select from default db
    Properties properties = getDBProperty("default", "", "");
    JDBCInterpreter jdbc = new JDBCInterpreter(properties);
    AuthenticationInfo user1Credential = getUserAuth("user1", "hive", "user1Id", "user1Pw");
    AuthenticationInfo user2Credential = getUserAuth("user2", "hive", "user2Id", "user2Pw");
    jdbc.open();

    // user1 runs default
    InterpreterContext context = InterpreterContext.builder()
            .setAuthenticationInfo(user1Credential)
            .setInterpreterOut(new InterpreterOutput())
            .setReplName("hive")
            .build();
    jdbc.interpret("", context);

    JDBCUserConfigurations user1JDBC1Conf = jdbc.getJDBCConfiguration("user1");
    assertEquals("user1Id", user1JDBC1Conf.getPropertyMap("default").get("user"));
    assertEquals("user1Pw", user1JDBC1Conf.getPropertyMap("default").get("password"));

    // user2 run default
    context = InterpreterContext.builder()
            .setAuthenticationInfo(user2Credential)
            .setInterpreterOut(new InterpreterOutput())
            .setReplName("hive")
            .build();
    jdbc.interpret("", context);

    JDBCUserConfigurations user2JDBC1Conf = jdbc.getJDBCConfiguration("user2");
    assertEquals("user2Id", user2JDBC1Conf.getPropertyMap("default").get("user"));
    assertEquals("user2Pw", user2JDBC1Conf.getPropertyMap("default").get("password"));

    jdbc.close();
  }

  @Test
  public void testPrecode() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    properties.setProperty(DEFAULT_PRECODE,
            "create table test_precode (id int); insert into test_precode values (1);");
    JDBCInterpreter jdbcInterpreter = new JDBCInterpreter(properties);
    jdbcInterpreter.open();
    jdbcInterpreter.executePrecode(context);

    String sqlQuery = "select * from test_precode";

    InterpreterResult interpreterResult = jdbcInterpreter.interpret(sqlQuery, context);

    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());
    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(3, resultMessages.size());
    assertEquals(InterpreterResult.Type.TEXT, resultMessages.get(0).getType());
    assertEquals("Query executed successfully. Affected rows : 0\n\n",
            resultMessages.get(0).getData());
    assertEquals(InterpreterResult.Type.TEXT, resultMessages.get(1).getType());
    assertEquals("Query executed successfully. Affected rows : 1\n",
            resultMessages.get(1).getData());
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(2).getType());
    assertEquals("ID\n1\n", resultMessages.get(2).getData());
  }

  @Test
  public void testIncorrectPrecode() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    properties.setProperty(DEFAULT_PRECODE, "select 1");
    properties.setProperty("incorrect.driver", "org.h2.Driver");
    properties.setProperty("incorrect.url", getJdbcConnection());
    properties.setProperty("incorrect.user", "");
    properties.setProperty("incorrect.password", "");
    properties.setProperty(String.format(PRECODE_KEY_TEMPLATE, "incorrect"), "incorrect command");
    JDBCInterpreter jdbcInterpreter = new JDBCInterpreter(properties);
    jdbcInterpreter.open();
    InterpreterResult interpreterResult = jdbcInterpreter.executePrecode(context);

    assertEquals(InterpreterResult.Code.ERROR, interpreterResult.code());
    assertEquals(InterpreterResult.Type.TEXT, interpreterResult.message().get(0).getType());
  }

  @Test
  public void testPrecodeWithAnotherPrefix() throws IOException,
          InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("anotherPrefix.driver", "org.h2.Driver");
    properties.setProperty("anotherPrefix.url", getJdbcConnection());
    properties.setProperty("anotherPrefix.user", "");
    properties.setProperty("anotherPrefix.password", "");
    properties.setProperty(String.format(PRECODE_KEY_TEMPLATE, "anotherPrefix"),
            "create table test_precode_2 (id int); insert into test_precode_2 values (2);");
    JDBCInterpreter jdbcInterpreter = new JDBCInterpreter(properties);
    jdbcInterpreter.open();

    Map<String, String> localProperties = new HashMap<>();
    localProperties.put("db", "anotherPrefix");
    InterpreterContext context = InterpreterContext.builder()
        .setAuthenticationInfo(new AuthenticationInfo("testUser"))
        .setInterpreterOut(new InterpreterOutput())
        .setLocalProperties(localProperties)
        .build();
    jdbcInterpreter.executePrecode(context);

    String sqlQuery = "select * from test_precode_2";

    InterpreterResult interpreterResult = jdbcInterpreter.interpret(sqlQuery, context);

    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());

    assertEquals(3, resultMessages.size());
    assertEquals(InterpreterResult.Type.TEXT, resultMessages.get(0).getType());
    assertEquals("Query executed successfully. Affected rows : 0\n\n",
            resultMessages.get(0).getData());
    assertEquals(InterpreterResult.Type.TEXT, resultMessages.get(1).getType());
    assertEquals("Query executed successfully. Affected rows : 1\n",
            resultMessages.get(1).getData());
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(2).getType());
    assertEquals("ID\n2\n", resultMessages.get(2).getData());
  }

  @Test
  public void testStatementPrecode() throws IOException, InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    properties.setProperty(DEFAULT_STATEMENT_PRECODE, "set @v='statement'");
    JDBCInterpreter jdbcInterpreter = new JDBCInterpreter(properties);
    jdbcInterpreter.open();

    String sqlQuery = "select @v";

    InterpreterResult interpreterResult = jdbcInterpreter.interpret(sqlQuery, context);

    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());
    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType());
    assertEquals("@V\nstatement\n", resultMessages.get(0).getData());
  }

  @Test
  public void testIncorrectStatementPrecode() throws IOException,
          InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    properties.setProperty(DEFAULT_STATEMENT_PRECODE, "set incorrect");
    JDBCInterpreter jdbcInterpreter = new JDBCInterpreter(properties);
    jdbcInterpreter.open();

    String sqlQuery = "select 1";

    InterpreterResult interpreterResult = jdbcInterpreter.interpret(sqlQuery, context);

    assertEquals(InterpreterResult.Code.ERROR, interpreterResult.code());
    assertEquals(InterpreterResult.Type.TEXT, interpreterResult.message().get(0).getType());
    assertTrue(interpreterResult.toString(),
            interpreterResult.message().get(0).getData().contains("Syntax error"));
  }

  @Test
  public void testStatementPrecodeWithAnotherPrefix() throws IOException,
          InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("anotherPrefix.driver", "org.h2.Driver");
    properties.setProperty("anotherPrefix.url", getJdbcConnection());
    properties.setProperty("anotherPrefix.user", "");
    properties.setProperty("anotherPrefix.password", "");
    properties.setProperty(String.format(STATEMENT_PRECODE_KEY_TEMPLATE, "anotherPrefix"),
            "set @v='statementAnotherPrefix'");
    JDBCInterpreter jdbcInterpreter = new JDBCInterpreter(properties);
    jdbcInterpreter.open();

    Map<String, String> localProperties = new HashMap<>();
    localProperties.put("db", "anotherPrefix");
    InterpreterContext context = InterpreterContext.builder()
        .setAuthenticationInfo(new AuthenticationInfo("testUser"))
        .setInterpreterOut(new InterpreterOutput())
        .setLocalProperties(localProperties)
        .build();

    String sqlQuery = "select @v";

    InterpreterResult interpreterResult = jdbcInterpreter.interpret(sqlQuery, context);

    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());
    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType());
    assertEquals("@V\nstatementAnotherPrefix\n", resultMessages.get(0).getData());
  }

  @Test
  public void testSplitSqlQueryWithComments() throws IOException,
          InterpreterException {
    Properties properties = new Properties();
    properties.setProperty("common.max_count", "1000");
    properties.setProperty("common.max_retry", "3");
    properties.setProperty("default.driver", "org.h2.Driver");
    properties.setProperty("default.url", getJdbcConnection());
    properties.setProperty("default.user", "");
    properties.setProperty("default.password", "");
    properties.setProperty("default.splitQueries", "true");
    JDBCInterpreter t = new JDBCInterpreter(properties);
    t.open();

    String sqlQuery = "/* ; */\n" +
        "-- /* comment\n" +
        "--select * from test_table\n" +
        "select * from test_table; /* some comment ; */\n" +
        "/*\n" +
        "select * from test_table;\n" +
        "*/\n" +
        "-- a ; b\n" +
        "select * from test_table WHERE ID = ';--';\n" +
        "select * from test_table WHERE ID = '/*'; -- test";

    InterpreterResult interpreterResult = t.interpret(sqlQuery, context);
    assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code());
    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
    assertEquals(3, resultMessages.size());
  }

  private InterpreterContext getInterpreterContext() {
    return InterpreterContext.builder()
            .setAuthenticationInfo(new AuthenticationInfo("testUser"))
            .setParagraphId("paragraphId")
            .setInterpreterOut(new InterpreterOutput())
            .build();
  }
}


At this time of year on the farm we are planning ahead to next year, all those cute spring babies need careful planning and Farmer Nick has a meticulously planned timetable for all the animals. Our sheep are Jacobs, known for their lovely black and white colouring and horns. We have found them to be pretty, gentle and to give us just the cutest lambs. We aim for lambs from March through April, this involves finding a suitable Ram and letting him loose on our ewes a couple at a time from now to the end of November.
different Ram each year to avoid inbreeding. This year we have a real handsome devil, entirely fitting of his name Rambo! He has been delivered to the field next to the ewes and eagerly eyeing them up for the past couple of days.
We don't have a farm dog, but never mind, we have the wonderful trio that is Farmer Nick, Farmer Ted and Me! I know it is not going to be easy when I am roped in to assist, and they know I will have the camera in one hand! But I figured trying to capture these lovely ewes and separate one off for our eager Rambo would be entertaining so I gamely joined the team.
After 2 laps of the field I see why farmers with hundreds of sheep need a dog, even our dozen really gave us the run a round. Finally we cornered them and coaxed them in the direction of the carrel, before separating the lucky lady to meet her boyfriend!
Well it tickled me making it anyway! Now here's to hoping for some beautiful lambs from late February onwards, if you are booked to stay there should be cuddles all round and the treat of bottle feeding any orphans from the group.