Mar. 12, 2018Laundry isn't the most glamorous of subjects, but it's often the elephant in the room when it comes to living a greener, more eco-conscious lifestyle. Even if you've thoroughly greened your beauty routine and your cleaning supplies, you recycle and belong to your local composting co-op, the laundry room is often the last on the list to make the big switch.
Why is it that laundry is the final frontier in going green? Is it due to our habits (many of us stick with the same detergent our mothers used when we were children)? Or perhaps because of our deep-seated ideas that harsh detergents and industrially-made dryer sheets are simply the status quo — that is, the only way to get good and clean.
Unfortunately, while those store-bought necessities may leave our clothes smelling fresh, they often leave something far less pleasant behind: chemical residue. Dryer sheets especially. Invented after the rise in popularity of at-home washers and dryers, which brought our laundry indoors to be washed and dried (only the lucky few know the true joy of sun-dried sheets these days), dryer sheets were created to prevent static cling.
Eventually, along the way they picked up another use: to make our clothes smell even more fresh. Fresher than freshly washed. For many, dryer sheets also replaced fabric softener, which deposits a fine (chemical) film on clothes to make them feel soft. Modern dryer sheets took over for fabric softener, and now impart a softening film while they infuse our clothes with mountain fresh scents. The problem is, those chemicals are released into the air when the dryer is turned on, and even worse, they're worn right up against our skin when we get dressed every day.
Ethyl acetate — can irritate skin and respiratory function.
Dichlorobenzene — long-term exposure could affect the nervous system, known to irritate the eyes, nose and throat.
Chloroform — Yes, really. The same chloroform used in old-timey medicine that was often fatal. Can cause issues with the nervous system among other things.
And that's just the tip of the iceberg. It's enough to want to throw in the (staticky) towel. Luckily there is an alternative (can you guess what it might be?).
So, store-bought dryer sheets are out. What to do? Make your own, of course! Making your own dryer sheets is super easy and remarkably cheap — not only can you customize the scent using all natural ingredients, but the project costs about a fraction of what you might might spend on name brand dryer sheets, especially if you work with recycled materials, like an old tee shirt and upcycled jar.
And don't let its scent fool you, white vinegar actually has softening effects, and can even freshen and further deodorize laundry even more (and don't worry, the vinegar smell is gone as soon as your laundry is dry, leaving only the light fragrance of your essential oils behind). Ready to transform your laundry room into an eco-friendly paradise? Learn how to make your own dryer sheets below.
Use scissors to cut the fabric into uniform squares roughly the size of a store-bought dryer sheet. No need to be perfect – remember, their destination is the dryer.
Next, pour the white vinegar into the jar. Then add about 20 drops of your favorite essential oil combination. Seal the jar and shake to combine.
Add the fabric to the jar and allow the sheets to soak up the essential oil mixture. Add the cap and store in your laundry room or under the sink until ready to use.
Take a sheet or two out of the jar and squeeze out any excess liquid. Add to your dryer with your wet laundry and dry as normal. When your clothes are dry, just add the dryer sheets back to the jar and shake to soak. Refill with vinegar and essential oils when needed.


text:
Tag Archives: Wayne Morris
Watching 1939: The Kid from Kokomo (1939)
1939 film: The Kid from Kokomo
Cast: Wayne Morris, Joan Blondell, Pat O'Brien, Jane Wyman, May Robson, Sidney Toler, Maxie Rosenbloom, Stanley Fields, Ward Bond,
Director: Lewis Seiler
Fight promoter Billy Murphy (Pat O'Brien) is rarely on the straight and narrow with his fighters. One day he finds Homer Baston (Wayne Morris) on a farm, with a punch so strong that it sends men flying. Why did Homer punch them? Because they said Mother's Day was a racket. Homer is loyal to a mother that he never knew and hopes one day she will return. Murphy recruits Homer to become a fighter, but Homer is reluctant to leave home in case his mother returns. To con him into fighting, Murphy creates a publicity hunt for Homer's mother. Just as Homer is about to walk out, Murphy finds Maggie (May Robson), a drunken woman with a criminal past. He convinces Maggie to tell Homer that she is his mother to keep him from fighting. While Homer succeeds with his career, Maggie spends all of his money and bets it on horses.
Homer also meets and falls in love with Marian (Jane Wyman), who comes from a wealthy family and her father (Sidney Toler) is a judge…who recognizes Maggie.
• By 1939, Wayne Morris was one of the main contract players at Warner Brothers. He made eight films in both 1937 and 1938, but only two in 1939.
• This was one of six screenplays by Dalton Trumbo filmed in 1939.
• Adapted from the story "Broadway Cavalier."
Pat O'Brien, Wayne Morris and Joan Blondell
This is an entertaining B-movie. I love Wayne Morris as the sweet, naïve farm boy (my heart melted to butter when I saw him carrying a lamb). But May Robson steals the show here as the criminal posing as a mother, who ends up carrying for this sweet guy. May Robson was 80 years old when this film was released, so really she could have been a grandmother to 25-year-old Wayne Morris!
The May 20, 1939, New York Times review by Frank Nugent said "line between comedy and sheer bad taste has rarely been more clearly overstepped than in the Strand's "The Kid From Kokomo"…which I felt was a bit dramatic. The film is an innocent comedy that perhaps uses a guy's love for his mother to get him into boxing.
"The Kid from Kokomo" is not a unique film for any of the leads and far from the only film they made in 1939. The only actor in less than three films was Wayne Morris, who only released two films in 1939:
• May Robson: 7
• Jane Wyman: 5
• Pat O'Brien: 5
• Joan Blondell: 5
Though it was released in 1939, "The Kid from Kokomo" has the same brisk feel of most Warner Brothers comedies from 1936 to 1940. The year of release doesn't make it much different. In fact, Wayne Morris's role is very similar to his character in the comedy "Kid Galahad" (1937), another film that features Morris plucked from his daily life and groomed to be a boxer.
Once World War II began, this type of fast-paced, con-artist comedy seems to stop being used as a basic plotline theme.
Posted in 1939	| Tagged 1939, Films in 1939, Joan Blondell, Watching 1939, Wayne Morris
The forgotten Hollywood war hero: Wayne Morris
Warner Brothers star, Wayne Morris in he 1930s
He can be seen playing alongside Bette Davis as a boxer in "Kid Galahad" (1937) or a cadet running amok at the Virginia Military Institute in "Brother Rat."
Wayne Morris may not be a name you're familiar with but you have most likely seen the husky, affable blond in Warner Brothers 1930s and 1940s films.
But you may not be familiar with Morris' war time record.
We frequently hear about Hollywood actors such as James Stewart, Clark Gable and Mickey Rooney who enlisted and were decorated for their bravery during World War II.
However, Morris is rarely recognized for his service and was one of World War II's first flying aces.
His interest in flying started in Hollywood.
While filming "Flying Angles" (1940) with Jane Wyman and Dennis Morgan, Morris learned how to fly a plane.
Morris in 1944 in his plane "Meatball." The decals show how many Japanese planes he shot down.
Once World War II began, Morris joined the Naval Reserve and became a Naval flier in 1942 on the U.S.S. Essex. He put his career on hold to fight. The same year he was married to Olympic swimmer Patricia O'Rourke.
"Every time they showed a picture aboard the Essex, I was scared to death it would be one of mine," Morris said. "That's something I could never have lived down."
Morris flew 57 missions-while some actors only flew 20 or less- and made seven kills, which qualified him as an ace. He also helped sink five enemy ships.
He originally was told he was too big to fly fighter planes until he went to his uncle-in-law, Cdr. David McCampbell who wrote him a letter, allowing him to fly the VF-15, according to "McCampbell's Heroes: the Story of the U.S. Navy's Most Celebrated Carrier Fighter of the Pacific", Edwin P. Hoyt.
Three of his planes were so badly damaged by enemy fire that they were deemed unfit to fly and were dumped in the ocean, according to IMDB.
"As to what a fellow thinks when he's scared, I guess it's the same with anyone. You get fleeting glimpses in your mind of your home, your wife, the baby you want to see," Morris said. "You see so clearly all the mistakes you made. You want another chance to correct those mistakes. You wonder how you could have attached so much importance to ridiculous, meaningless things in your life. But before you get to thinking too much, you're off into action and everything else is forgotten."
For his duty, Morris was honored with four Distinguished Flying Crosses and two Air Medals.
When he returned to Hollywood after four year at war, his once promising career floundered and Warner Brothers did not allow him to act for a year.
Jack Warner welcoming actors home from the war in 1945 including Wayne Morris, Ronald Reagan, Army Air Forces; Jack Warner; Gig Young, Coast Guard; and Harry Lewis, Army.
Morris's most notable post-war films include "The Voice of the Turtle," "John Loves Mary" and "Paths of Glory." His career ended with several B-westerns.
At the age of 45, Morris passed away in 1959 from a massive heart attack.
But his service to his country was not forgotten. Morris is buried in Arlington Cemetery and was given full military honors at his funeral.
Morris with his wife Patricia and daughter Pamela in 1946.
Though I am thankful for all men and women who serve our country, I wanted to recognize Wayne Morris.
For years I saw Wayne Morris in films and knew nothing about him except that I liked him. He is one of those character actors that can make a movie special.
Morris seemed like a regular guy. Before he started out in Hollywood, he played football at Los Angeles Junior College and worked as a forest ranger.
After I researched him and discovered his war record, I wanted to honor his service and his work in films.
Thank you to Wayne Morris and men and women in the military for serving our country.
Check out the Comet Over Hollywood Facebook page for the latest updates or follow on Twitter at @HollywoodComet. E-mail us at cometoverhollywood@gmail.com
Posted in Hollywood and the Military, Star Profile	| Tagged Actor in World War II, Memorial Day, Wayne Morris, World War 2, World War II

redpajama_set_name: RedPajamaCommonCrawl


So on a Snowy Sunday afternoon, I tried out this Perdue Oven Ready Whole Seasoned Roaster which I got on sale at my local Kroger grocery store!! I grew up eating Perdue Chicken and sometimes when you are not feel well I do used prepped food meals to reduce the amount of time in the kitchen so I can recover my strength!! Two hours later, I enjoyed a juicy, flavorful roast chicken for my Sunday dinner that was season just right!! I enjoyed cooking but when I need extra help in the kitchen, I can count on this chicken product again in the future!!
This chicken was so well marinade that it was sliding off the bone after being fully cooked!!
Sounds like a good idea. I may have used one in the past, but I can't remember for sure. I pretty much always buy Perdue roasters when I occasionally buy a whole chicken, though if I'm doing a whole chicken I like to stuff it and do my own seasoning that goes with the stuffing. However, this would be a good time saver. I like their chicken breast singles though I usually get the plain ones.


The Planning and Development Office administers a broad range of community development and planning activities for the Town of Sandwich.
Board and committee members can be contacted at the department email address or by sending written correspondence to the department mailing address. Visit the Planning Board Page and the Board of Appeals Page for more information.


text:
Walk 6. Lady Hill and Foggieton Woods
Lady Hill and Foggieton Woods
A pleasant woodland walk on made-up, well-surfaced paths through Lady Hill and Foggieton Woods, starting from Cults Primary School and returning to the same point. The walk is signposted with yellow way markers for the first part and then, beyond Ladyhill Road, the route joins a Forestry Commission path network which is waymarked with posts. You can shorten the walk by turning back before you reach Ladyhill Road and perhaps exploring some of the many other paths that run through these woods closer to the starting point, or extend the return route by joining Walk 4, Quarry Wood.
You can join beside Cults Primary School or the gateway at the junction of Cairnlee Road East and Earlswells Road. Please observe all carparking restrictions around the school. There is a car park at side of the road on the road to Hillview Church and at the Church itself. The walk can be joined at any of these points (link path from the Church a bit rocky for the for the first few yards).
Download a printable pdf file of this walk.
Footpath Details
Terrain: Well surfaced paths.
Gradients: Easy.
Distance: 3 miles; 5 km.
Allow: 1½ hours
Cults Primary School to Ladyhill Road
Starting from the gateway at the junction of Cairnlee Road East and
Earlswells Road, walk a very short distance along the path to a junction, turn left and then left again at an open space. Follow the path, which undulates initially as it runs through the open space, and continue through the trees alongside the school perimeter road, then alongside the driveway to Hillview Community Church. When you reach a green wire fence, where the path turns right follow the path beside the fence. The path then bears right slightly as it leaves the fence and after passing a gap with a fence post, you reach an avenue with tall trees on both sides. Go straight on at the first junction which is just beyond the fence post, then turn left at the next junction and follow a line of telegraph poles. After a short distance, the path bears to the right to go towards Ladyhill Road.
Ladyhill Road to Forestry Commission car park
Cross Ladyhill Road with care and continue a short way on the path on the other side before bearing left which soon leads to a well-surfaced path with wooden way marker posts, which is part of a Forestry Commission path network *. Turn left on to this path and follow the red-topped way marker posts, first crossing an open area, then through mature woodland, then turning left at a junction in young birch woods, just before a small wooden bridge. Keep following the red marked posts until you reach the Forestry Commission car park, where there are information boards including a map of the various way-marked paths.
Return Route
You can use the map on the information board to select your return route: you can either continue to follow the red marker posts on the "Ladyhill Trail", through the car park and round on a loop path through mature woodland, or you can follow the "Warblers' Trail", a short way along from the information board, where the path forks, to make a direct return through the birch woods. Either of these routes will return you to the point * where you originally joined the Forestry Commission path network and where you take the rough path back to re-cross Ladyhill Road. You return on the path you followed on the outward route, remembering to turn right from the path alongside the telegraph poles on to the wide path through the avenue of trees. An alternative is to join Walk 4 Quarry Wood.


Chidlow, Mol Vis 2005; 11:387-396.
Purpose: In the current study, a non-histological approach, namely semi-quantitative RT-PCR, was used to provide information on retinal ganglion cell (RGC) injury and survival after optic nerve transection (ONT). The levels of mRNAs synthesized by RGCs and glial components were initially measured at defined time points after ONT. Subsequently, a comparison was made between the levels of these mRNAs in the ONT retinas of rats treated with the neuroprotectant BDNF and in rats which received vehicle.
Methods: Wistar rats received an ONT in one eye, while the fellow eye served as a control. ONT was performed 1-2 mm from the optic disc without damaging the retinal blood supply. In the first experiment, rats were killed at 1, 3, 5, 7, and 21 days after ONT. In the second experiment, brain derived neurotrophic factor (BDNF; 5 μg) or vehicle was injected intravitreally at the same time as the ONT and animals were killed after 7 days.
Results: After ONT, mRNA levels of RGC markers (NF-L and Thy-1) decreased substantially, while levels of GFAP and certain trophic factors mRNAs increased significantly. Administration of BDNF resulted in a substantial, but not complete, preservation of the levels of the RGC specific mRNAs, while ONT induced increases in GFAP and trophic factor mRNAs were not reduced to any great extent by BDNF.
Conclusions: The present studies show that measurement of NF-L and Thy-1 mRNAs provides a sensitive and reliable index of RGC injury after ONT, while measurement of GFAP and trophic factors mRNAs provides more general information on the effect of the injury on the retina.
Death of retinal ganglion cells (RGCs) is the cause of blindness in several diseases, including glaucoma. In recent years, much effort has gone into attempting to elucidate the causes and mechanisms of RGC loss so that strategies can be developed to counteract the process . Optic nerve transection (ONT) is a valuable model not only for investigation into pathways that contribute to RGC death but also as a model for neuronal apoptosis in the CNS . Death of RGCs does not commence until approximately 5 days following ONT, then, between day 5 and day 14, there is massive loss of RGCs and by day 14 only approximately 15% of the RGCs remain in the retina [3-5]. A variety of substances have been shown to attenuate RGC death after ONT, with brain derived neurotrophic factor (BDNF) receiving particular attention. Several studies have demonstrated that administration of BDNF delays RGC death after ONT, but importantly, even when the substance is administered chronically, the protection is only short lived [5-9].
Quantification of RGC injury following defined insults is a prerequisite in order to allow a comparison to be made between the effectiveness of potential neuroprotective drugs. In the CNS as a whole, neuroprotection is typically determined by quantifying the degree of cell loss. This is despite the fact that important reservations have been voiced concerning the limitations of a purely histological approach . The most common methodology utilized presently in the retina is retrograde labeling of RGCs with a tracer molecule such as fluorogold prior to performing the insult, with subsequent counting of surviving RGCs . However, there are certain drawbacks inherent in this approach: firstly, the procedure is only able to determine the effect of the potential neuroprotectant on the number of RGCs; it is unable to detect whether these remaining RGCs are dysfunctional or healthy, secondly, the effect of the insult and neuroprotectant on the surrounding cell types is unknown, and thirdly, only a small, predetermined area of the retina is usually studied and extrapolations of RGC numbers are made from counts that include only a small percentage of the total RGC population. In an attempt to provide an alternative and complementary approach, we developed a semiquantitative methodology to assess RGC injury in the whole of the retina after ischemia-reperfusion and excitotoxic injuries [11,12]. In this method, injury and subsequent death of RGCs can be followed by measurement of retinal mRNA levels of two markers specific to RGCs, namely Thy-1 and neurofilament light (NF-L). The method has proved reliable and sensitive [13,14] and similar strategies have been developed for analysis of brain tissue [15,16].
An important finding regarding the levels of RGC markers after certain injuries, which was first revealed by Hoffman et al.  and subsequently confirmed by Schlamp et al.  and by our group , is that downregulation of Thy-1 and NF-L mRNAs occurs in advance of detectable RGC death. Thus, in the period following the insult but prior to histological observation of cell loss, reduced levels of NF-L and Thy-1 can be viewed as an indicator of RGCs that are unhealthy and in all probability dysfunctional. Beside changes to RGCs, injuries such as ONT also cause activation of the retina's endogenous protection system. Precise knowledge of the various mechanisms that form this response is lacking, but upregulation of certain glial cell derived markers such as GFAP and trophic factors are one such event. It can therefore be argued that measurement of the levels of RGC markers, and of factors such as GFAP and FGF-2, in the period prior to and during cell loss should provide an accurate indication as to the health status of the retina in general and of RGCs in particular.
The purpose of this study was to assess the potential of RT-PCR as a tool for evaluating RGC injury and neuroprotection in the rat after ONT. Firstly, the levels of mRNAs synthesized by RGCs and glial components were measured at certain defined time points after ONT. Subsequently, a comparison was made between the levels of these mRNAs in the ONT retinas of rats treated with BDNF or vehicle. Since BDNF merely delays rather than prevents cell death, it is of considerable interest to discover what effect the compound has on the levels of these markers.
All experiments conformed to the ARVO Statement for the Use of Animals in Ophthalmic and Vision Research. Adult Sprague-Dawley rats (200-250 g) were housed in a temperature and humidity controlled room with a 12 h light: 12 h dark cycle and provided with food and water ad libitum. For experimental manipulations, animals were anesthetized with an intraperitoneal injection mixture of Xylazine (Rompun; Bayer AG, Kiel, Germany) and Ketamine (Ketalar; Parke-Davis, Pontypool, UK), 10-15 and 30-100 mg/kg body weight, respectively. Two separate experiments were performed in this study: in the first experiment, various retinal mRNA levels were measured at prescribed time points after ONT, while in the second experiment, the effect of BDNF injection on ONT induced mRNA changes was investigated.
ONT was performed in one eye as described previously . In brief, to access the optic nerve, an incision was made in the skin covering the superior orbital rim, the superior orbital contents were dissected and the superior and external muscles were sectioned. Following rotation of the eye, the dura mater sheath was longitudinally opened and the optic nerve was completely transected as close as possible to the eye with care taken to avoid damage to the retinal blood supply. Rats were killed at various time points after ONT and the retinas removed for mRNA analysis. In a preliminary experiment, the fellow eye received a sham ONT. However, the sham operation was found to have no effect on any of the mRNAs analyzed (Figure 1) and in all subsequent experiments the fellow eye was untreated.
In order to investigate the effectiveness of BDNF after ONT, 16 rats were randomly assigned to one of two groups: one group of 8 rats received a single injection of BDNF (human BDNF; PeproTech, London, UK; 5 μg in 5 μl of PBS containing 1% bovine serum albumin) into the vitreous humor one h before the ONT, while the second group received vehicle solution. All rats were killed after 7 days.
For RT-PCR studies, retinas were carefully dissected, total RNA was isolated using Tri-reagent (Sigma, Poole, UK) according to the manufacturer's instructions and first strand cDNA synthesis was performed on 2 μg DNase treated RNA as described previously .
For conventional RT-PCR, the individual cDNA species were amplified in a reaction containing the cDNA equivalent of 25 ng total RNA, PCR buffer, MgCl2 (5 mM for NF-L, 4.5 mM for GAPDH and 4 mM for all other primers), dNTPs, the relevant sense and antisense primers and AmpliTaq Gold (Applied Biosystems, Warrington, UK). Reactions were initiated by incubating at 94 °C for 10 min, and PCRs (94 °C, 12 s; annealing temperature, 30 s; 72 °C, 30 s) performed for a suitable number of cycles (Table 1) followed by a final extension at 72 °C for 3 min. Interexperimental variations were avoided by performing all amplifications in a single run. All of the PCR products yielded single bands corresponding to the expected molecular weights to the expected size in base pairs. (Table 1) and PCR products were sequenced (data not shown) to ensure their validity. The oligonucleotide primer sequences and their annealing temperatures are shown in Table 1. PCR reaction products were separated on 1.5% agarose gels using ethidium bromide for visualization. The relative abundance of each PCR product was determined by quantitative analysis of digital photographs of gels using Labworks software (UVP Products, Upland, CA).
Prior to semi-quantitative amplification of the experimental samples, the amount of cDNA in all of the samples was equalized. In addition, the optimal conditions (e.g., Mg2+ concentration, annealing temperature) for each set of primers were determined. Subsequently, cycle-dependent reactions were performed for each mRNA species, in order to determine the linear range of detection by ethidium bromide. Once the linear range was established, PCRs were performed at the lowest cycle number that gave a reliably detectable product. To minimize variability, duplicate runs were performed for each mRNA amplified and the data were averaged.
For assessment of the levels of the various mRNAs in the retina, all values were normalized to that of the housekeeping gene GAPDH. GAPDH, thus, acted as an internal standard to correct for any variations in RNA isolation and/or cDNA synthesis. All results are expressed as mean±standard error of the mean (SEM) and differences between control and treated retinas were assessed using Student's paired t-test. Differences between treatment groups in the BDNF and IPC experiments were assessed using Student's unpaired t-test. In both cases, p<0.05 was considered statistically significant.
Real-time RT-PCR reactions were carried out in 96 well optical reaction plates using the cDNA equivalent of 50 ng total RNA for each sample in a total volume of 25 μl using the TaqMan Universal PCR Master Mix (Applied Biosystems, Warrington, UK). The thermal cycling conditions of PCR were as follows: 50 °C for 2 min, 95 °C for 10 min and 40 cycles of amplification comprising 95 °C for 15 s and 60 °C for 1 min. The PCR assay was performed using the ABI Prism 7700 Sequence detector (Applied Biosystems). NF-L forward and reverse primers (5'-CAC CGA CCG CCA CCA T-3' and 5'-CAC GTA GCG CCG CTT GT-3', respectively) and probe (5'-CGT TCA GCT ACG AGC CGT ACT TTT CGA C-3') were selected from Genbank and designed using the primer design software Primer Express (Applied Biosystems), while GAPDH primers and probe were obtained from TaqMan rodent GAPDH control reagents (Applied Biosystems). Amplification of GAPDH mRNA was performed as the internal control gene to account for variations in RNA levels between different samples. In order to allow a comparison to be made between the levels of expression of NF-L in vehicle and BDNF treated retinas, results obtained from the real-time PCR experiments were quantified using the comparative threshold (2-ΔΔCT) method . This method essentially comprises the same two steps as for conventional RT-PCR: firstly, the amount of NF-L is normalized to the levels of the endogenous housekeeping gene (GAPDH), and secondly, the normalized amount of NF-L in the axotomized retina is then expressed relative to the normalized amount of NF-L in the control retina. The threshold cycles (CT) were calculated using ABI Prism 7000 SDS Software (Applied Biosystems).
Following enucleation, whole eyes were fixed in 10% neutral buffered formalin and processed for routine paraffin embedded sections on an automated tissue processor. Eyes were embedded sagitally and 5 μm serial sections were cut using a rotary microtome. For histopathology, sections were stained with hematoxylin and eosin. For immunohistochemistry, tissue sections were deparaffinized, rehydrated into 70% ethanol and treated for 10 min with 0.5% H2O2 in absolute methanol to block endogenous peroxidases before being taken to deionized water. Antigen retrieval was achieved by incubating the slides in boiling 10 mM citrate buffer (pH 6.0) at a pressure of 5 psi for 5 min. After being washed in PBS-T (PBS containing 0.1% Triton X-100) tissue sections were then equilibrated for in PBS-T containing primary antibody. Sections analyzed for immunohistochemical localization of NF-L were incubated overnight at 4 °C with mouse anti-neurofilament light antibody (1:225; Chemicon, Chandlers Ford, UK). Following incubation with primary antiserum, sections were washed in PBS-T and incubated in a solution of PBS-T containing anti-mouse secondary antibody linked to biotin (Vector Labs., Peterborough, UK; 1:100) and horse serum (1:100) for 30 min. After a further wash with PBS-T, sections were developed using a standard avidin-peroxidase detection system (Vector Laboratories, Peterborough, UK) with 0.1% (v/v) H2O2 and 0.1% (w/v) 3'-,3'-diaminobenzidine in PBS-T. Sections were mounted in PBS-glycerol and visualized by light microscopy.
Typical light photomicrographs of hematoxylin and eosin stained retinas taken 7 days after ONT are shown in Figure 1. In vehicle treated retinas, there appeared to be a selective loss of cells in the GCL (Figure 1B) compared to the control retina (Figure 1A). In BDNF treated retinas, this loss of cells was not apparent (Figure 1C). Due to the presence of an unknown number of displaced amacrine cells in the RGC layer and the difficulty in obtaining sections from exactly the same eccentricity, precise quantification of the numbers of cells in the GCL was not undertaken.
In order to confirm that NF-L is a marker for RGCs in the rat, NF-L immunohistochemistry was performed on transverse retinal sections. The results showed that NF-L labeling is associated with the somata and the axons of RGCs (Figure 1D,E) and with axons in the optic nerve head (Figure 1F), but is virtually absent from the other layers of the retina. The results correlated well with previous localization of NF-L immunoreactivity in the hamster , human and pig  retinas.
ONT followed by 21 days recovery caused substantial decreases in the total retinal levels of NF-L and Thy-1 mRNAs, but no change in the level of rhodopsin mRNA, relative to the control untreated retina (Figure 2). In order to verify that these differences are specific to axonal cut, and are not partially a response to the surgical procedure itself, a comparison was made between the mRNA levels and the a- and b-waves of the electroretinogram in ONT eyes, in eyes that received a sham operation and in untreated control eyes. It can be seen that the relative decreases in Thy-1 and NF-L mRNAs in ONT eyes were effectively identical, irrespective as to whether the contralateral eye was untreated or received a sham operation (Figure 2). Moreover, the sham procedure caused no changes in the levels of ganglion cell specific mRNAs and rhodopsin mRNA (Figure 2) or of GFAP and trophic factor mRNAs (data not shown) relative to control untreated eyes. The sham procedure was also found to have no effect on the electroretinogram (data not shown). As a consequence of these results, the contralateral eye was untreated in all subsequent ONT experiments. Analysis of the time courses of the decreases of NF-L and Thy-1 mRNAs revealed an excellent correlation between the levels of the two mRNAs at each time point (Figure 3). It can be seen that levels of both transcripts had begun to decline within 24 h of ONT, were substantially lower by 3 days, and that the decrease was close to maximal by 7 days, although some additional loss did occur during the remainder of the three week period.
The effect of ONT on the retinal levels of GFAP, FGF-2, CNTF, BDNF, NGF, and GDNF mRNAs is shown in Table 2. It can be seen that ONT caused a significant upregulation of all of the factors analyzed with the exception of GDNF. However, the time courses and magnitudes of the individual responses varied considerably. Upregulation of FGF-2 mRNA was first detectable after 3 days and continued to rise throughout the three week period analyzed, while expression of GFAP and CNTF increased during the first 7 days but then declined somewhat. The BDNF mRNA level was only elevated for the first 3 days following ONT, while the level of NGF mRNA was unchanged until 7 days, but remained higher than the control retina for the following 2 weeks.
In vehicle injected rats, ONT followed by 7 days recovery caused an 84% reduction in the total retinal level of NF-L mRNA when measured by real-time RT-PCR (Figure 4A) and a 66% reduction when measured by conventional RT-PCR (Figure 4B). In contrast, in BDNF injected rats, the total retinal level of NF-L was only reduced by 37% when measured by real-time RT-PCR (Figure 4A) and by 26% when measured by conventional RT-PCR (Figure 4B). Thus, BDNF elicited 56.2% or 61.6% protection against ONT induced loss of NF-L mRNA when measured by real-time and conventional RT-PCR, respectively. These values were not statistically different from each other.
The magnitude of the ONT induced decrease in the Thy-1 mRNA level in retinas of vehicle treated rats was, as expected, almost indistinguishable from the decrease in NF-L mRNA (Figure 5A). At 7 days after ONT, BDNF likewise afforded significant protection against the loss of Thy-1 mRNA, although the extent of protection against Thy-1 loss was marginally less pronounced than for NF-L (Figure 5A). In vehicle treated rats, significant increases in the retinal levels of FGF-2, CNTF, NGF and GFAP mRNAs were all measured 7 days after ONT (Figure 5B,C). Even though the increases in all four of these mRNAs were less marked in the retinas of BDNF treated rats (Figure 5B,C), a statistical difference was only apparent for NGF mRNA.
Optic nerve transection (ONT) is a well established model for investigation into the pathways that contribute to RGC death, which has been utilized extensively to screen the effectiveness of potential neuroprotectants . To date, the principal method of determining reliably whether particular treatments aid RGC survival has been by counting cells prelabeled with a tracer molecule . In the current study, we investigated the possibility of using a non-histological approach, namely semi-quantitative RT-PCR, to provide information on RGC injury and survival after ONT. The results showed that measurement of NF-L and Thy-1 mRNAs provides an alternative index of RGC injury, which is both sensitive and reliable, while measurement of GFAP and trophic factors mRNAs provides more general information on the effect of the injury on the retina as a whole.
Before drawing conclusions about the effect of ONT on mRNA levels in the retina, it was important to establish that changes are specific to axonal cut and are not partially a response to any associated ischemia. This was achieved by demonstrating that there were no differences in the electroretinogram or in mRNA levels in sham operated and untreated eyes. Subsequently, we measured changes in NF-L and Thy-1 mRNA levels at various time points after ONT and correlated the results with the histological progression of RGC death. The time course of RGC loss after ONT has been well documented: cell death is first observed at 4-5 days, reaches 50% of the original population by day 7 and 85% by day 14 [3,4]. In contrast, NF-L and Thy-1 mRNA levels, which responded in an almost identical fashion, had begun to decline within 24 h of ONT and were more than 50% lower than the control retina after 3 days. The results are in agreement with those of Schlamp et al.  who noted that loss of Thy-1 mRNA precedes cellular death after optic nerve crush in mice. This indicates that the RGC soma is adversely affected by optic nerve injury for a considerable period before actual cell death and clearance of cell debris occurs. Downregulation of these mRNAs can therefore be viewed as an early functional marker of RGC injury.
The results we obtained are also in agreement with the in situ hybridization studies of McKerracher et al. [23,24]. In their work, McKerracher and colleagues showed that, within the GCL, there was a decrease in the intensity of the hybridization signal for neurofilament medium (NF-M) mRNA during the first week after axotomy, which remained low thereafter. To determine whether the reduced NF-M mRNA level detected after ONT represented a specific change in the expression of this cytoskeletal protein or a more general cellular response to the injury, the mRNA level of the housekeeping gene GAPDH within the GCL was also measured. The results showed that the intensity of the GAPDH signal had also markedly declined by 2 weeks after injury, and thus that axotomization causes extensive and persistent changes in both structural and energy-generating pathways within RGCs that ultimately lead to their death.
Previous studies have shown that a single intravitreal injection of BDNF at the time of ONT results in the survival of all RGCs for one week, but thereafter cell death occurs at the same rate as in vehicle treated animals [5,7]. Given that RGC soma downregulate NF-L and Thy-1 genes within three days of ONT, it was of interest to ascertain whether administration of BDNF maintains the levels of these mRNAs for 7 days. The data showed that BNDF did significantly preserve the levels of the RGC specific mRNAs after ONT, but that the degree of protection was not as pronounced as that obtained by counting cells [5,7]. The explanation for the difference is given by the recognition that measurement of RGC markers is a more sensitive index of cellular damage and that while BDNF does improve the health status of the cells in the short term, it does not prevent the chain of events occurring that eventually leads to cell death. Schlamp et al.  and our own group  have previously argued that measurement of RGC markers may represent a functional assay of the health status of RGCs after injury, which would be particularly useful when testing the efficacy of neuroprotective drugs. This argument appears to be validated by the current results.
The development of real-time RT-PCR has allowed a more sensitive and precise quantification of the relative levels of particular transcripts between samples. This is because real-time PCR determines the level of mRNA during the exponential phase of amplification whereas conventional PCR detects the mRNA level in the succeeding linear phase. We measured the level of NF-L mRNA in vehicle and BDNF treated retinal samples using conventional and real-time RT-PCR to see whether the latter technique offered greater accuracy or precision in detecting differences between the treatments. The results showed in fact that a good correlation exists between the two methodologies; the protection conferred by BDNF differed by only 5% when measured by each procedure. The finding validates the use of conventional RT-PCR for use in studies such as these. Nevertheless, it should be noted that although the degree of protection was similar using both methods, the actual decrease in NF-L mRNA after ONT was slightly greater when measured by real-time PCR. This is explained by recognition of the fact that detection of PCR product yields by the agarose gel/ethidium bromide/densitometry method typically employed for conventional PCR offers lower resolution and sensitivity than the detection system incorporated into the real-time PCR system. Accordingly, conventional RT-PCR overestimated somewhat the amount of mRNA in samples with a low amount of NF-L. With regard to variability, the real-time data displayed only slightly (approximately 2%) less variability between samples than the data obtained via conventional PCR, which further emphasizes the legitimacy of both techniques. Employment of a more modern dye than ethidium bromide, such as SYBR Green, may offer increased sensitivity and a greater chance of detecting small differences in mRNA expression between samples.
Internal controls are critical in semiquantitative PCR to normalize for variations in mRNA levels between different samples. A number of different internal endogenous controls are used in studies of gene expression, including GAPDH, cyclophilin, β-actin, tubulin and ribosomal RNA. As discussed by a number of authors [25,26], the prime requirement for any control transcript is maintenance of a consistent level of expression under the experimental conditions. GAPDH is probably the most widely used control transcript, but its expression, like that of β-actin, can vary under a variety of circumstances. A number of authors advocate the use of 18S or 28S rRNA as internal standards; however, since these are ribosomal RNAs, they are not always representative of the mRNA population. To summarize, no one control is ideal and selection will depend on the system being studied. GAPDH was chosen as the internal control in this study because its level of expression is unaltered after ischemia/reperfusion in the rat  and appears unchanged following ONT . In much of the study, we also used cyclophilin and rhodopsin as internal controls (data not shown) and found that they gave similar results to GAPDH. Rhodopsin mRNA, which is expressed constitutively at a high level in the retina, is known to be unaffected in the early period following ONT and can function as a useful endogenous control transcript under a variety of circumstances where photoreceptors are not affected.
One theory put forward to account for the death of RGCs after ONT is that axotomy results in the loss of target derived neurotrophic factors . Much evidence has been accumulated in support of this hypothesis, for example, data showing that exogenous administration of various trophic factors delays RGC loss after ONT. Interestingly, endogenous expression of certain trophic factors increases after ONT [28-30]. These increases are suggested to form part of the innate response of the retina to injuries such as ONT, and come about largely through activation of Müller cells. Knowledge of the temporal sequence in which the different neurotrophic factors are upregulated may shed light on the survival pathways that are activated following ONT and why, ultimately, they fail to prevent RGC death. Moreover, we hypothesized that measuring the levels of GFAP and neurotrophic factor mRNAs after ONT would provide an indication as to the severity of neuronal injury, and that reduced levels of these endogenous survival factors would be present in retinas that had received neuroprotectant therapy.
In agreement with the results of previous studies, which have demonstrated increased protein levels of CNTF [29,30], FGF-2 , and GFAP  in the retina one week after ONT, we showed that the mRNAs encoding GFAP, FGF-2, and CNTF are all likewise elevated at this time point. In addition, we showed that the transcript for NGF, but not for BDNF or GDNF, is also significantly upregulated 7 days after ONT, although the magnitude of this response was less than for the others. Curiously, the earliest, most efficacious, and longest lasting response was by FGF-2, which is the least effective of these trophic factors when administered exogenously. It is conceivable that the robustness of the endogenous FGF-2 response negates the effectiveness of exogenously applied FGF-2. In retinas treated with the neuroprotectant BDNF, the ONT induced increases in FGF-2, CNTF, GFAP, and NGF mRNAs were all somewhat diminished compared with vehicle treated retinas, although only NGF significantly so. The result indicates that the Müller cells respond to the effects of the applied BDNF and modify their production of survival factors correspondingly. However, the relatively modest reductions in the levels of CNTF, FGF-2, and GFAP after BDNF treatment confirms that the Müller cells are also sensitive to the fact that BDNF will only afford temporary rescue to RGCs from the ongoing injury process.
Gao et al.  showed that optic nerve crush increased BDNF mRNA expression, which peaked at 48 h then declined to the basal level. In situ hybridization revealed it is the RGCs themselves, and not Müller cells, that upregulate the BDNF synthesis, and the authors suggested that the effect is an endogenous survival mechanism of the injured retina. In the current study, we showed that a similar response occurs after ONT. The BDNF mRNA level in the retina was elevated in the first 72 h after ONT, however, the effect had been lost by 7 days. It can be concluded that while elevated BDNF may be partly responsible for delaying the death of RGCs by a number of days, it is clearly insufficient to prevent the subsequent catastrophic loss of cells. The results correlate well with data showing that exogenous BDNF only delays loss of cells by a short period of time [5,7,8].
In contrast to the other trophic factors, the results obtained for GDNF were unexpected. A number of recent studies have demonstrated that GDNF promotes the survival of axotomized RGCs [33-35]. What is less clear is whether GDNF forms part of the endogenous response of the retina to optic nerve injury: Koeberle and Ball  showed that GDNF immunoreactivity is localized to RGCs and photoreceptors in the normal retina and is decreased following ONT. However, Lindqvist et al.  detected an upregulation of GDNF mRNA in the period after ONT. In the current study, in which we likewise measured GDNF mRNA after ONT, we did not observe any change in the amount of transcript after ONT. The reason for the discrepancy between the two studies is unresolved but could conceivably be related to the different techniques utilized to measure mRNA, or to the fact that different strains of rat were used.
The work was supported by grant PRO AGE RET (QLK6-2000-00569) from the European Community. The authors are grateful to Dr. Mark Graham of AstraZeneca for the use of the ABI Prism 7700 Sequence detector. The authors are grateful to Maria E. Aguilera and Antonio García for technical assistance. This manuscript is dedicated to the late Dr. Jose Melena who also provided expert technical assistance during the study.
1. Nickells RW. The molecular biology of retinal ganglion cell death: caveats and controversies. Brain Res Bull 2004; 62:439-46.
2. Kermer P, Klocker N, Weishaupt JH, Bahr M. Transection of the optic nerve in rats: studying neuronal death and survival in vivo. Brain Res Brain Res Protoc 2001; 7:255-60.
3. Villegas-Perez MP, Vidal-Sanz M, Rasminsky M, Bray GM, Aguayo AJ. Rapid and protracted phases of retinal ganglion cell loss follow axotomy in the optic nerve of adult rats. J Neurobiol 1993; 24:23-36.
4. Berkelaar M, Clarke DB, Wang YC, Bray GM, Aguayo AJ. Axotomy results in delayed death and apoptosis of retinal ganglion cells in adult rats. J Neurosci 1994; 14:4368-74.
5. Peinado-Ramon P, Salvador M, Villegas-Perez MP, Vidal-Sanz M. Effects of axotomy and intraocular administration of NT-4, NT-3, and brain-derived neurotrophic factor on the survival of adult rat retinal ganglion cells. A quantitative in vivo study. Invest Ophthalmol Vis Sci 1996; 37:489-500.
6. Mey J, Thanos S. Intravitreal injections of neurotrophic factors support the survival of axotomized retinal ganglion cells in adult rats in vivo. Brain Res 1993; 602:304-17.
7. Mansour-Robaey S, Clarke DB, Wang YC, Bray GM, Aguayo AJ. Effects of ocular injury and administration of brain-derived neurotrophic factor on survival and regrowth of axotomized retinal ganglion cells. Proc Natl Acad Sci U S A 1994; 91:1632-6.
8. Di Polo A, Aigner LJ, Dunn RJ, Bray GM, Aguayo AJ. Prolonged delivery of brain-derived neurotrophic factor by adenovirus-infected Muller cells temporarily rescues injured retinal ganglion cells. Proc Natl Acad Sci U S A 1998; 95:3978-83.
9. Isenmann S, Klocker N, Gravel C, Bahr M. Short communication: protection of axotomized retinal ganglion cells by adenovirally delivered BDNF in vivo. Eur J Neurosci 1998; 10:2751-6.
10. Corbett D, Nurse S. The problem of assessing effective neuroprotection in experimental cerebral ischemia. Prog Neurobiol 1998; 54:531-48.
11. Nash MS, Osborne NN. Assessment of Thy-1 mRNA levels as an index of retinal ganglion cell damage. Invest Ophthalmol Vis Sci 1999; 40:1293-8.
12. Chidlow G, Osborne NN. Rat retinal ganglion cell loss caused by kainate, NMDA and ischemia correlates with a reduction in mRNA and protein of Thy-1 and neurofilament light. Brain Res 2003; 963:298-306.
13. Chidlow G, Schmidt KG, Wood JP, Melena J, Osborne NN. Alpha-lipoic acid protects the retina against ischemia-reperfusion. Neuropharmacology 2002; 43:1015-25.
14. Osborne NN, Wood JP, Cupido A, Melena J, Chidlow G. Topical flunarizine reduces IOP and protects the retina against ischemia-excitotoxicity. Invest Ophthalmol Vis Sci 2002; 43:1456-64.
15. Hager G, Eckert E, Schwaiger FW. Semiquantitative analysis of low levels of mRNA expression from small amounts of brain tissue by nonradioactive reverse transcriptase-polymerase chain reaction. J Neurosci Methods 1999; 89:141-9.
16. Harrison DC, Medhurst AD, Bond BC, Campbell CA, Davis RP, Philpott KL. The use of quantitative RT-PCR to measure mRNA expression in a rat model of focal ischemia--caspase-3 as a case study. Brain Res Mol Brain Res 2000; 75:143-9.
17. Hoffman PN, Pollock SC, Striph GG. Altered gene expression after optic nerve transection: reduced neurofilament expression as a general response to axonal injury. Exp Neurol 1993; 119:32-6.
18. Schlamp CL, Johnson EC, Li Y, Morrison JC, Nickells RW. Changes in Thy1 gene expression associated with damaged retinal ganglion cells. Mol Vis 2001; 7:192-201 <http://www.molvis.org/molvis/v7/a27/>.
19. Livak KJ, Schmittgen TD. Analysis of relative gene expression data using real-time quantitative PCR and the 2(-Delta Delta C(T)) Method. Methods 2001; 25:402-8.
20. Kong WC, Cho EY. Antibodies against neurofilament subunits label retinal ganglion cells but not displaced amacrine cells of hamsters. Life Sci 1999; 64:1773-8.
21. Ruiz-Ederra J, Garcia M, Hicks D, Vecino E. Comparative study of the three neurofilament subunits within pig and human retinal ganglion cells. Mol Vis 2004; 10:83-92 <http://www.molvis.org/molvis/v10/a12/>.
22. Isenmann S, Kretz A, Cellerino A. Molecular determinants of retinal ganglion cell development, survival, and regeneration. Prog Retin Eye Res 2003; 22:483-543.
23. McKerracher L, Essagian C, Aguayo AJ. Temporal changes in beta-tubulin and neurofilament mRNA levels after transection of adult rat retinal ganglion cell axons in the optic nerve. J Neurosci 1993; 13:2617-26.
24. McKerracher L, Essagian C, Aguayo AJ. Marked increase in beta-tubulin mRNA expression during regeneration of axotomized retinal ganglion cells in adult mammals. J Neurosci 1993; 13:5294-300.
25. Thellin O, Zorzi W, Lakaye B, De Borman B, Coumans B, Hennen G, Grisar T, Igout A, Heinen E. Housekeeping genes as internal standards: use and limits. J Biotechnol 1999; 75:291-5.
26. Suzuki T, Higgins PJ, Crawford DR. Control selection for RNA quantitation. Biotechniques 2000; 29:332-7.
27. Villegas-Perez MP, Vidal-Sanz M, Bray GM, Aguayo AJ. Influences of peripheral nerve grafts on the survival and regrowth of axotomized retinal ganglion cells in adult rats. J Neurosci 1988; 8:265-80.
28. Kostyk SK, D'Amore PA, Herman IM, Wagner JA. Optic nerve injury alters basic fibroblast growth factor localization in the retina and optic tract. J Neurosci 1994; 14:1441-9.
29. Chun MH, Ju WK, Kim KY, Lee MY, Hofmann HD, Kirsch M, Oh SJ. Upregulation of ciliary neurotrophic factor in reactive Muller cells in the rat retina following optic nerve transection. Brain Res 2000; 868:358-62.
30. Sarup V, Patil K, Sharma SC. Ciliary neurotrophic factor and its receptors are differentially expressed in the optic nerve transected adult rat retina. Brain Res 2004; 1013:152-8.
31. Huxlin KR, Dreher Z, Schulz M, Dreher B. Glial reactivity in the retina of adult rats. Glia 1995; 15:105-18.
32. Gao H, Qiao X, Hefti F, Hollyfield JG, Knusel B. Elevated mRNA expression of brain-derived neurotrophic factor in retinal ganglion cell layer after optic nerve injury. Invest Ophthalmol Vis Sci 1997; 38:1840-7.
33. Klocker N, Braunling F, Isenmann S, Bahr M. In vivo neurotrophic effects of GDNF on axotomized retinal ganglion cells. Neuroreport 1997; 8:3439-42.
34. Koeberle PD, Ball AK. Effects of GDNF on retinal ganglion cell survival following axotomy. Vision Res 1998; 38:1505-15.
35. Yan Q, Wang J, Matheson CR, Urich JL. Glial cell line-derived neurotrophic factor (GDNF) promotes the survival of axotomized retinal ganglion cells in adult rats: comparison to and combination with brain-derived neurotrophic factor (BDNF). J Neurobiol 1999; 38:382-90.
36. Koeberle PD, Ball AK. Neurturin enhances the survival of axotomized retinal ganglion cells in vivo: combined effects with glial cell line-derived neurotrophic factor and brain-derived neurotrophic factor. Neuroscience 2002; 110:555-67.
37. Lindqvist N, Peinado-Ramonn P, Vidal-Sanz M, Hallbook F. GDNF, Ret, GFRalpha1 and 2 in the adult rat retino-tectal system after optic nerve transection. Exp Neurol 2004; 187:487-99.


text:
Ireland's most prestigious university, retaining a tranquil collegiate atmosphere in the midst of the city.
Irish Houses of Parliament
Today a branch of the Bank of Ireland, the old Irish Parliament buildings were a radical Neoclassical creation.
The Book of Kells
Ireland's most treasured medieval manuscript, dating back to the 9th century.
Merrion Square
A grand Georgian garden square with serious literary pedigree.
Trinity College Library
Wander through the endless rows of historical novels.
Dublin's Private Full Day Highlights Driving Tour
This full day driving tour will whisk you through Dublin's highlights, and give you great insight into Ireland and its people.
Enjoy the comfort of a private car for your excursion.
Learn about Dublin's extensive history with your private driver guide.
Snap photos of landmark sights, including Trinity College, O'Connell Street, and Dublin Castle.
Visit the historic St Patricks Cathedral.
Venture towards the Georgian Henrietta Street.
As you travel, your driver-guide will inform you about Dublin's 1,000 year history from the first Viking settlers to the Norman arrival and the building of the city into what you see today. Highlights of this tour include the beautiful Georgian squares and parks of Dublin, the Grand Canal Dock, Trinity College area, Templebar, O'Connell Street, the Guinness and Jameson areas, the historic Phoenix Park, Dublin Castle, St Patricks Cathedral and much more.
On your tour, you will have the opportunity to visit the historic St Patricks Cathedral which dates back to 1211 AD and was lovingly restored in the 1800's by the Guinness family. From St Patricks Cathedral, you will make your way across Dublin to the perfectly preserved Georgian Henrietta Street dating from the mid 1700's to visit this historical townhouse telling the story of Dublin in the 1800's. This site is closed on Monday and Tuesdays so alternatively one can enjoy a tour of Glasnevin Cemetery which has a fascinating history and is very much a who's who of Irish history.
Private Walking Tour of Dublin with a Local
Travel isn't just about travel, it's people, faces, food and cultures, fresh perspectives, discoveries and different ways of life - it's about uncovering the city's soul. It's about connection. On your private, guided tour of Dublin with a local:
Enjoy meaningful insights and Irish humour with a Dubliner.
Hear how locals describe Dublin - the experiences that have shaped their worldview, including Brexit and the tenuous 'open-border' question.
Spend a few hours walking around the city's highlights - including St Stephen's Green and O'Connell Street, with a private, local guide.
Pick up invaluable recommendations on off-the-beaten-tracks pubs, advice, and tips on finding the best whiskies.
Finish your tour over a pint of Guinness - or a coffee or tea- in your local guide's favorite haunt.
Ireland's compact capital - with its vibrant, historical and beautiful streets - has witnessed everything from the Great Famine to the fight for Irish Freedom. A city made for walking, easily navigable districts make orientation a breeze, but even if you get lost, the locals are some of the friendliest you will find in the world. The annual St. Patrick's Day Parade attracts millions of revellers to Irish folk songs and
Cèilidh dancing, but in Dublin there are free-flowing pints of "the black stuff" and live music year-round in lively watering holes.
Enjoying a private, guided tour with a local will help you discover the side-streets and stories often missed. Hear the intriguing backstories and learn the backstories and neighbourhood rumours which bring Dublin to life, from the revolution over a century ago to the country's current relationship to mainland Europe and the United Kingdom. There are no substitutes for anecdotes and first-hand insight – which is why we've built this tour: so that you can have a Dubliner's knowledge to help you swerve tourist traps, lengthy queues and over-priced nonsense. While you walk the city, you'll uncover its authenticity through the eyes of a Dubliner. Your tour is immersive - bringing meaningful and like-minded interesting people together that would never meet if you stuck to the main tourist drag. Experience the world-famous Irish humour, the lilt in the local accent, and great 'craic' over a beer or coffee at a local pub, and then jot down your guide's version of "must do Dublin."


text:
import expect, { createSpy } from 'expect';
import { Graph, Node } from 'graph-crdt';

import { Storage, Connection, Router, createRouter } from '../../mocks';
import ConnectionGroup from '../../connection-group';
import Context from '../context';
import database from '../root';

describe('Database', () => {
  const settings = database.configuration;
  let db;

  beforeEach(() => {
    db = database();
  });

  it('is an object', () => {
    expect(db).toBeAn(Object);
  });

  it('generates a database configuration', () => {
    const config = db[settings];
    expect(config).toBeAn(Object);
  });

  it('creates a new graph', () => {
    expect(db).toBeA(Graph);
  });

  it('instantiates a new router', () => {
    const db = database({
      router: createRouter,
    });

    expect(db.router).toBeA(Router);

    expect(createRouter).toHaveBeenCalled();
    expect(createRouter).toHaveBeenCalledWith(db, db[settings]);
  });

  describe('read()', () => {
    let router;

    beforeEach(() => {
      router = createRouter();

      db = database({
        router: createSpy().andReturn(router),
      });
    });

    it('returns null if nothing is found', async () => {
      const settings = await db.read('settings');
      expect(settings).toBe(null);
    });

    it('calls the router', async () => {
      await db.read('lobby');

      expect(router.pull).toHaveBeenCalled();
      const [read] = router.pull.calls[0].arguments;

      expect(read).toBeAn(Object);
      expect(read.keys).toEqual(['lobby']);
    });

    it('resolves with the router response', async () => {
      router.pull.andCall(() => {
        const node = new Node({ uid: 'weather' });
        node.merge({ response: 'router' });

        return [node.toJSON()];
      });

      const result = await db.read('weather');
      expect(result).toBeA(Context);
      expect(result.value('response')).toBe('router');
    });

    it('ignores the cache when a flag is set', async () => {
      await db.write('game', { created: 1492219766210 });

      await db.read('game');
      expect(router.pull).toNotHaveBeenCalled();

      await db.read('game', { force: true });
      expect(router.pull).toHaveBeenCalled();
    });

    describe('offline group', () => {
      it('is a connection group', async () => {
        await db.read('potato');

        expect(router.pull).toHaveBeenCalled();
        const [config] = router.pull.calls[0].arguments;

        expect(config.offline).toBeA(ConnectionGroup);
        expect([...config.offline]).toEqual([]);
      });

      it('contains every offline item', async () => {
        const conn1 = new Connection({ id: 'conn1' });
        const conn2 = new Connection({ id: 'conn2' });

        conn1.offline = true;
        conn2.offline = false;

        db[database.configuration].network.add(conn1);
        db[database.configuration].network.add(conn2);

        await db.read('things');

        const [config] = router.pull.calls[0].arguments;
        expect([...config.offline]).toEqual([conn1]);
      });
    });
  });

  describe('nodes()', () => {
    let storage;

    beforeEach(() => {
      storage = new Storage();
      storage.read = createSpy();

      db = database({ storage, router: createRouter });

      db.router.pull = createSpy();
    });

    it('is a function', () => {
      expect(db.nodes).toBeA(Function);
    });

    it('returns a promise', () => {
      const value = db.nodes(['stuff']);

      expect(value).toBeA(Promise);
    });

    it('resolves with an array', async () => {
      const value = await db.nodes([]);

      expect(value).toEqual([]);
    });

    it('ignores storage if the option is disabled', async () => {
      await db.nodes(['potato'], { storage: null });

      expect(storage.read).toNotHaveBeenCalled();
    });

    it('creates a read action', async () => {
      const keys = ['key1', 'key2'];
      await db.nodes(keys);

      expect(storage.read).toHaveBeenCalled();
      const [action] = storage.read.calls[0].arguments;

      expect(action.keys).toEqual(keys);
    });

    it('returns the nodes given by storage', async () => {
      storage.read.andCall(async () => {
        const node = new Node({ uid: 'a-node' });
        node.merge({ read: true });

        return [node];
      });

      const nodes = await db.nodes(['a-node']);
      const [value] = nodes;

      expect(nodes.length).toBe(1);
      expect(value).toBeA(Context);
      expect(value.snapshot()).toEqual({ read: true });
    });

    it('uses the correct context ID for resolved nodes', async () => {
      const uid = 'result';

      storage.read.andCall(async () => {
        const node = new Node({ uid });
        node.merge({ resolved: true });

        return [node.toJSON()];
      });

      const [result] = await db.nodes([uid]);

      expect(result.meta().uid).toBe(uid);
    });

    it('returns `null` if no value is given', async () => {
      storage.read.andCall(async () => [undefined]);
      const nodes = await db.nodes(['stuff']);

      expect(nodes).toEqual([null]);
    });

    it('supports node resolve values', async () => {
      storage.read.andCall(() => {
        const node = new Node({ uid: 'result' });
        node.merge({ resolved: true });

        return [node];
      });

      const [node] = await db.nodes(['result']);

      expect(node).toBeA(Context);
      expect(node.meta().uid).toEqual('result');
      expect(node.snapshot()).toEqual({ resolved: true });
    });

    it('caches the value', async () => {
      storage.read.andCall(() => {
        const node = new Node({ uid: 'stuff' });
        node.merge({ stuff: true });

        return [node];
      });

      const [node] = await db.nodes(['stuff']);

      expect(node).toBe(await db.read('stuff'), 'Node was not cached.');
    });

    it('returns the nodes in the order you requested', async () => {
      storage.read.andCall(() => {
        const nodes = [new Node({ uid: 'second' }), new Node({ uid: 'first' })];

        nodes.forEach(node => node.merge({ [node.meta().uid]: true }));

        return nodes;
      });

      const [first, second] = await db.nodes(['first', 'second']);

      expect(first.meta().uid).toBe('first');
      expect(second.meta().uid).toBe('second');
    });

    it('does not attempt to read the same nodes twice', async () => {
      storage.read.andCall(() => {
        const node = new Node({ uid: 'first' });
        node.merge({ first: true });

        return [node];
      });

      await db.nodes(['first', 'second']);
      await db.nodes(['first', 'second']);

      expect(storage.read.calls.length).toBe(2);
      const [action1] = storage.read.calls[0].arguments;
      const [action2] = storage.read.calls[1].arguments;

      expect(action1.keys).toEqual(['first', 'second']);
      expect(action2.keys).toEqual(['second']);
    });

    it('does not read from storage if everything is cached', async () => {
      storage.read.andCall(() => [
        new Node({ uid: 'first' }),
        new Node({ uid: 'second' }),
      ]);

      await db.nodes(['first', 'second']);
      await db.nodes(['first', 'second']);

      expect(storage.read.calls.length).toBe(1);
    });

    it('reads from the network', async () => {
      const keys = ['key1', 'key2'];
      await db.nodes(keys);

      expect(db.router.pull).toHaveBeenCalled();
      const [action] = db.router.pull.calls[0].arguments;

      expect(action).toBeAn(Object);
      expect(action.keys).toEqual(keys);
    });

    it('uses the resolve value from the router', async () => {
      db.router.pull.andCall(async () => {
        const node = new Node({ uid: 'router' });
        node.merge({ routed: true });

        return [node];
      });

      const [node] = await db.nodes(['router']);

      expect(node).toBeA(Context);
      expect(node.snapshot()).toEqual({ routed: true });
    });

    it('does not consult the router if everything is cached', async () => {
      db.router.pull.andCall(() => [new Node({ uid: 'result' })]);

      await db.nodes(['result']);
      await db.nodes(['result']);

      // Cached the first time.
      expect(db.router.pull.calls.length).toBe(1);
    });

    it('can override the network group', async () => {
      const network = ConnectionGroup.ensure(new Connection());

      await db.nodes(['stuff'], { network });

      const [read] = db.router.pull.calls[0].arguments;
      expect([...read.network]).toEqual([...network]);
    });

    it('invokes the pre-read pipeline', async () => {
      const hook = createSpy().andCall(action => ({
        ...action,
        keys: action.keys.map(key => `replaced/${key}`),
      }));

      const db = database({
        storage,
        hooks: {
          before: { read: { nodes: hook } },
        },
      });

      await db.nodes(['stuff']);

      const [action] = storage.read.calls[0].arguments;
      expect(action.keys).toEqual(['replaced/stuff']);
    });

    it('invokes the post-read pipeline', async () => {
      const hook = createSpy().andCall(action => action);
      storage.read.andCall(() => [new Node({ uid: 'things' })]);

      const db = database({
        storage,
        hooks: {
          after: { read: { nodes: hook } },
        },
      });

      const nodes = await db.nodes(['things']);

      expect(hook).toHaveBeenCalled();
      const [action] = hook.calls[0].arguments;

      expect(action.contexts).toEqual(nodes);
    });

    it('allows hooks to override the node values', async () => {
      const hook = createSpy().andCall(action => ({
        ...action,
        contexts: ['ha!'],
      }));

      const db = database({
        hooks: {
          after: { read: { nodes: hook } },
        },
      });

      const nodes = await db.nodes(['something']);

      expect(nodes).toEqual(['ha!']);
    });

    it('calls the post-read hooks for cached values', async () => {
      const hook = createSpy().andCall(action => ({
        ...action,
        contexts: ['replaced'],
      }));

      const db = database({
        hooks: {
          after: { read: { nodes: hook } },
        },
      });

      await db.write('things', {});
      const nodes = await db.nodes(['things']);

      expect(nodes).toEqual(['replaced']);
    });

    it('reads anyway if the read is forced', async () => {
      await db.write('node', {});
      await db.nodes(['node'], { force: true });

      expect(storage.read).toHaveBeenCalled();
    });

    it('ignores nodes it did not ask for', async () => {
      storage.read.andCall(async () => [new Node({ uid: 'ignore-me' })]);

      const [node] = await db.nodes(['something-else']);

      expect(node).toNotExist();
      expect(db.value('ignore-me')).toBe(null);
    });
  });

  describe('branch()', () => {
    it('returns a new database', () => {
      const result = db.branch();

      expect(result).toBeA(Graph);
      expect(result).toNotBe(db);
    });

    it('contains a config', () => {
      const branch = db.branch();
      const config = branch[database.configuration];

      expect(config).toBeAn(Object);
    });

    it('includes all hooks', () => {
      const hooks = {
        before: { write: createSpy() },
        after: { write: createSpy() },
      };

      const db = database({ hooks });

      const branch = db.branch();
      const config = branch[database.configuration];

      expect(config.hooks.before).toContain({ write: [hooks.before.write] });
      expect(config.hooks.after).toContain({ write: [hooks.after.write] });
    });

    it('includes all api extensions', () => {
      const extend = {
        context: { method: createSpy() },
        root: { method: createSpy() },
      };

      const db = database({ extend });

      const branch = db.branch();
      const config = branch[database.configuration];

      expect(config.extend.root).toEqual(extend.root);
      expect(config.extend.context).toEqual(extend.context);
    });

    it('does not contain storage plugins', () => {
      const db = database({ storage: new Storage() });
      const branch = db.branch();

      const config = branch[database.configuration];

      expect(config.storage).toEqual(null);
    });

    it('does not contain network plugins', () => {
      const connection = new Connection();
      const network = new ConnectionGroup();
      network.add(connection);

      const db = database({ network });
      const branch = db.branch();

      const config = branch[database.configuration];

      // Empty - no connection.
      expect(config.network).toBeA(ConnectionGroup);
      expect([...config.network]).toEqual([]);
    });

    it('does not contain a router', () => {
      const db = database({ router: Router.create });
      const branch = db.branch();
      const config = branch[database.configuration];

      expect(config.router).toBe(null);
    });

    it('contains all the current data', async () => {
      await db.write('user', { name: 'Bob' });
      const branch = db.branch();
      const node = branch.value('user');

      expect(node).toBeA(Node);
      expect([...node]).toEqual([['name', 'Bob']]);
    });

    it('sets the correct graph root', async () => {
      await db.write('node', {});
      const branch = db.branch();
      const node = await branch.read('node');

      expect(node.root).toBe(branch, 'Context has incorrect root reference');
    });

    it('does not mutate other branch context roots', async () => {
      const original = await db.write('node', {});
      const branch = db.branch();
      const node = await branch.read('node');

      expect(original.root).toNotBe(node.root);
    });

    it('does not affect other nodes with writes', async () => {
      const original = await db.write('node', {});
      const branch = db.branch();
      const node = await branch.read('node');
      await node.write('value', true);

      expect(original.snapshot()).toEqual({});
    });
  });

  describe('commit()', () => {
    let graph, node, beforeWrite, afterWrite, storage, router;
    const Identity = value => value;

    beforeEach(() => {
      beforeWrite = createSpy().andCall(Identity);
      afterWrite = createSpy().andCall(Identity);
      graph = new Graph();
      node = new Node();

      storage = new Storage();
      storage.write = createSpy();

      router = new Router();

      graph.merge({ [node]: node });

      db = database({
        hooks: {
          before: {
            write: beforeWrite,
          },
          after: {
            write: afterWrite,
          },
        },

        storage,

        router: createSpy().andReturn(router),
      });
    });

    it('returns a promise', () => {
      const result = db.commit(graph);

      expect(result).toBeA(Promise);
    });

    it('triggers the before write pipeline', async () => {
      await db.commit(graph);

      expect(beforeWrite).toHaveBeenCalled();

      const [pipe] = beforeWrite.calls[0].arguments;
      expect(pipe.update).toBeA(Graph);
      expect([...pipe.update]).toEqual([...graph]);
    });

    it('calls storage drivers', async () => {
      await db.commit(graph);

      expect(storage.write).toHaveBeenCalled();
      const [write] = storage.write.calls[0].arguments;

      expect(write.graph).toBeA(Graph);
    });

    it('calls the router', async () => {
      await db.commit(graph);

      expect(router.push).toHaveBeenCalled();

      const [config] = router.push.calls[0].arguments;

      expect(config).toBeAn(Object);
      expect(config.update).toBeA(Graph);
    });

    describe('offline group', () => {
      it('is a ConnectionGroup', async () => {
        await db.commit(graph);

        expect(router.push).toHaveBeenCalled();
        const [config] = router.push.calls[0].arguments;

        expect(config.offline).toBeA(ConnectionGroup);
      });

      it('it contains every offline connection', async () => {
        const conn1 = new Connection({ id: 'conn1' });
        const conn2 = new Connection({ id: 'conn2' });

        conn1.offline = true;
        conn2.offline = false;

        db[database.configuration].network.add(conn1);
        db[database.configuration].network.add(conn2);

        await db.commit(graph);

        const [config] = router.push.calls[0].arguments;
        expect([...config.offline]).toEqual([conn1]);
      });
    });

    it('passes the full state of each node to storage', async () => {
      await db.write('state', { existing: true });
      const update = new Graph();
      const node = new Node({ uid: 'state' });
      node.merge({ new: true });
      update.merge({ [node]: node });
      storage.write.reset();
      await db.commit(update);

      expect(storage.write).toHaveBeenCalled();
      const [write] = storage.write.calls[0].arguments;
      const state = write.graph.value('state');

      expect([...state]).toEqual([
        ...Node.from({
          existing: true,
          new: true,
        }),
      ]);
    });

    it('only contains nodes which updated', async () => {
      const update = new Graph();

      await db.write('unrelated', { ignore: 'please' });
      storage.write.reset();
      await db.commit(update);

      const [write] = storage.write.calls[0].arguments;
      expect(write.graph.value('unrelated')).toNotExist();
    });

    it('uses the storage options if given', async () => {
      await db.commit(graph, { storage: null });

      expect(storage.write).toNotHaveBeenCalled();
    });

    it('passes the deltas to plugins', async () => {
      await db.commit(graph);

      const [push] = router.push.calls[0].arguments;
      expect(push.history).toBeA(Graph);
      expect(push.update).toBeA(Graph);

      const [write] = storage.write.calls[0].arguments;
      expect(write.history).toBeA(Graph);
      expect(write.update).toBeA(Graph);
    });

    it('only sends the changes', async () => {
      const weather = new Node({ uid: 'weather' });
      weather.merge({ condition: 'sunny', temp: 65 });
      db.merge({ [weather]: weather });

      const changes = new Graph();
      changes.merge(db);
      changes.value(weather).merge({ temp: 70 });
      await db.commit(changes);

      const [push] = router.push.calls[0].arguments;
      expect([...push.update].length).toBe(1);
      expect([...push.update.value('weather')]).toEqual([['temp', 70]]);
    });

    it('caches the value after pipeline validation', async () => {
      const node = Node.from({ updated: true });
      graph.merge({ [node]: node });
      await db.commit(graph);

      const cached = db.value(String(node));
      expect(cached).toExist();
      expect([...cached]).toEqual([...node]);
    });

    it('triggers the after write pipeline', async () => {
      await db.commit(graph);

      expect(afterWrite).toHaveBeenCalled();
      const [write] = afterWrite.calls[0].arguments;

      expect(write.update).toBeA(Graph);
      expect(write.graph).toBeA(Graph);
    });

    it('returns the deltas', async () => {
      node.merge({ commit: null });
      const result = await db.commit(graph);

      expect(result).toBeAn(Object);
      expect(result.history).toBeA(Graph);
      expect(result.update).toBeA(Graph);
    });

    it('transforms nodes into DB contexts', async () => {
      node.merge({ count: 1 });
      await db.commit(graph);

      const { uid } = node.meta();
      expect(db.value(uid)).toBeA(Context);
    });

    it('turns node values into pointers', async () => {
      const user = await db.write('user', {});
      await db.write('users', { [user]: user });

      expect(db.value('users').value(user)).toEqual({
        edge: String(user),
      });
    });
  });

  describe('write()', () => {
    it('saves to the graph', async () => {
      await db.write('user', { name: 'Jesse' });

      const node = db.value('user');

      expect(node).toBeA(Context);

      const name = await node.read('name');
      expect(name).toBe('Jesse');
    });

    it('does not overwrite, instead merges', async () => {
      await db.write('user', { name: 'Bob' });
      await db.write('user', { handle: 'BobTheGreat' });

      const user = db.value('user');

      expect(await user.read('name')).toBe('Bob');
      expect(await user.read('handle')).toBe('BobTheGreat');
    });

    it('updates node fields', async () => {
      const user = await db.write('user', { followers: 50 });

      await db.write('user', { followers: 49 });
      expect(await user.read('followers')).toBe(49);

      await db.write('user', { followers: 51 });
      expect(await user.read('followers')).toBe(51);
    });

    it('returns the written context', async () => {
      const user = await db.write('user', {
        name: 'Bob',
      });

      expect(user).toBeA(Context);
      expect(user).toBe(db.value('user'));

      const name = await user.read('name');
      expect(name).toBe('Bob');
    });
  });

  describe('API extensions', () => {
    const extend = api =>
      database({
        extend: { root: api },
      });

    it('are added to the root', () => {
      const db = extend({
        method: () => true,
        prop: 'yep',
      });

      expect(db.method).toBeA(Function);
      expect(db.prop).toBe('yep');
    });

    it('are non-enumerable', () => {
      const db = extend({ prop: 'value' });
      const keys = Object.keys(db);
      expect(keys).toNotContain('prop');
    });

    it('are immutable', () => {
      const db = extend({ stuff: 'original' });
      expect(() => {
        db.stuff = 'something else';
      }).toThrow(Error);
    });
  });

  // ESLint bug: it thinks there's a missing comma on all for-await loops.
  // Source: https://github.com/babel/babel-eslint/issues/415
  describe('stream', () => {
    let db, storage;

    beforeEach(() => {
      storage = {
        async *[Symbol.asyncIterator]() {
          yield new Node({ uid: 'key' });
        },
      };

      db = database({ storage });
    });

    it.skip('throws if the storage plugin has no support', async () => {
      const db = database({ storage: {} });

      try {
        for await (const node of db) {
          expect(node).toBeA(Node);
        }

        throw new Error('Previous line should have thrown.');
      } catch (error) {
        expect(error.message).toMatch(/storage/i);
      }
    });

    it.skip('yields every value from storage', async () => {
      let run = false;

      for await (const pair of db) {
        run = true;
        expect(pair).toEqual(new Node({ uid: 'key' }));
      }

      expect(run).toBe(true);
    });

    it('ensures the values are nodes', async () => {
      storage[Symbol.asyncIterator] = async function*() {
        const node = new Node({ uid: 'a-node' });
        node.merge({ data: true });
        yield node.toJSON();
      };

      for await (const node of db) {
        expect(node).toBeA(Node);
        expect(String(node)).toBe('a-node');
      }
    });
  });
});

redpajama_set_name: RedPajamaGithub


text:
Meetup/London/130
< Meetup | London
Add your name to the list by adding a hash and four tildes like this:
Wikimedia Meetups +/-
London 151 9 February
Oxford 79 19 January
London 150 12 January
New York City 18 December
Cambridge 42 14 December
Hong Kong 122 23 November
Beijing 17 6 October
Shenyang 3 13 September
Igbo Wiki Strategy Salon 24 August
Manchester 36 9 June
London SkillShare 2 7 May
list of regular meetups
London · Hong Kong
London Wikimedia Meetup Number 130Edit
Date and time: Sunday 13 May 2018 — 13:00 onwardsEdit
Location: Penderel's Oak Pub, Holborn, London WC1Edit
Add this meeting to your Google calendar
Add this meeting to your Live calendar Update
AttendingEdit
# ~~~~
People of all ages and all Wikimedia projects are welcome. Complete newbies also welcome!
Please also invite any London Wikimedia people you know (or have had wiki dealings with) – spread the word!
Philafrenzy (talk) 23:13, 11 March 2018 (UTC)
WereSpielChequers (talk) 20:20, 21 April 2018 (UTC)
Thryduulf (talk: meta · en.wp · wikidata) 21:53, 26 April 2018 (UTC)
Edwardx (talk) 11:47, 3 May 2018 (UTC)
Leutha (talk) 17:37, 3 May 2018 (UTC)
ClemRutter (talk) 08:20, 6 May 2018 (UTC)
Should be. Johnbod (talk) 17:48, 11 May 2018 (UTC)
May be attendingEdit
Maybe. Joseph2302 (talk) 20:47, 23 April 2018 (UTC)
Catlemur (talk) 18:42, 25 April 2018 (UTC)
Nosebagbear (talk) 11:33, 6 May 2018 (UTC)
Curiositas42 (talk) 13:19, 7 May 2018 (UTC)
Conceivable as I will be at an event just up the road, but it depends what time you finish. Deb (talk) 13:33, 9 May 2018 (UTC)
There's usually a hard core left at 7pm. Johnbod (talk) 17:47, 11 May 2018 (UTC)
Skeptic sid (talk) 11:08, 11 May 2018 (UTC) will be at a talk at Conway Hall nearby, but will swing by before or after.
MassiveEartha (talk) 00:22, 12 May 2018 (UTC)
Andrew D. (talk) 15:00, 12 May 2018 (UTC)
Interested but not attendingEdit
I've always wanted to come to a London meetup, but Sundays are never really convenient for me. Has it ever been considered to have the meeting on a weekday evening, even as a one-off? Thanks. Seaweed (talk) 12:15, 23 April 2018 (UTC)
@Seaweed: We did have a series of weekday evening meets at Waitrose Café Canary Wharf, but they sort of fizzled out (despite being one of the closest I didn't always go, so partly my fault). There have also been a couple of one-off weekday evening meets, usually when someone is visiting from foreign parts and wants to meet, but I think the last one of those was early 2017. No reason not to do it again though - get some expressions of interest, work out a convenient time and venue and publicise it. Thryduulf (talk: meta · en.wp · wikidata) 02:43, 5 May 2018 (UTC)
@Seaweed: The last non-Sunday (Central) London meetup was London Wikimedia Meetup Number 106, on Tuesday 17 May 2016. The last East London meetup was East London Wikimedia Meetup Number 8, on Tuesday 25 October 2016. --Redrose64 (talk; at English Wikipedia) 07:01, 6 May 2018 (UTC)
Thanks for the replies. Over the years I've occasionally looked at the London meetup page, so I must have missed that one in 2016. I'll keep a more active interest in future meetups. Hopefully there'll be another weekday one at some point. Seaweed (talk) 12:58, 8 May 2018 (UTC)
Sorry, out of the country this month. Mccapra (talk) 00:41, 5 May 2018 (UTC)
Weekends are almost always booked up for me, a meet during the week would be much more likely. I'm also not comfortable with the presumption that drinking alcohol is "normal", so it's a pity that for the last couple of years the London meets have defaulted to weekend + pub, with virtually no alternatives apart from the odd editathon. --Fæ (talk) 12:59, 6 May 2018 (UTC)
@Fæ: I certainly agree with you about any presumption of drinking alcohol, however I am not sure that is a big issue here. I made sure that I found a non-alcohol venue for the East London Meetups and also made sure they were not at the weekend and not in Central London. I organised eight of these events, but then ran out of steam when I had all sorts of things to do following the death of my mother. During the year or so I ran these, I was interested to see whether anyone else would trouble themselves to organise other parallel events. I made sure the the venue was convenient for me as there was no-one else to share the commitment of making sure the events happened. (In fact I missed no 6 as I was away for Easter.) Perhaps this a situation where our old motto Be bold is relevant: it is up to us to make things happen. I have considered restarting the East London Meetups, but I decided to wait and see whether anyone else would get something going. In that respect I would advise:
make it local and convenient for yourself
make it weekday evening
make it a non-alcohol venue
In the meantime I would avoid changing the Sunday pub lunch format at a well-established venue, as we know this has proved to be viable. Thanks for raising the topic. Leutha (talk) 17:06, 10 May 2018 (UTC)
@Fæ: I don't know if you're familiar with Wetherspoons establishments, but they're not your average pub. In particular, they're family-friendly, and nobody objects if you buy nothing but soft drinks. They also have an offer on coffee or tea - you pay around £1.20-£1.75 (depending on the establishment) for the first cup - and refills are free of charge, as often as you like, for the rest of the day. Much cheaper than Costa, Starbucks, etc. --Redrose64 (talk; at English Wikipedia) 17:55, 11 May 2018 (UTC)
Re-notifying Fæ because it failed first time. --Redrose64 (talk; at English Wikipedia) 21:18, 16 May 2018 (UTC)
What sort of time does it usually finish? I am out of town until afternoon but I have been meaning to drop in. Mramoeba (talk) 20:44, 7 May 2018 (UTC)
5/6 pm. Philafrenzy (talk) 15:29, 9 May 2018 (UTC)
Once again I'm working on Sunday. --Redrose64 (talk; at English Wikipedia) 17:56, 11 May 2018 (UTC)
sorry again. Whispyhistory (talk) 21:50, 12 May 2018 (UTC)
About the meetupEdit
The Penderel's Oak in Holborn
Location of The Penderel's Oak
London meetups are generally casual social events where we...
Drink coffee, beer, tea and some of us have Sunday brunch. Sunday roasts are no longer offered but they do a reasonable pizza now and have a range of other snacks and dishes.
Welcome guests from around the world and other groups which meet there
Chat about Wikimedia or any other topics
Experienced Wikimedians help out new editors and share experiences about anything from copyright to editing tools.
You can expect to meet some very keen Wikimedians; however, this is also an open invite for anyone interested in finding out more about Wikipedia and other Wikimedia projects such as Wikimedia Commons, Wikiversity and WikiSource.
New and prospective editors are also very welcome.
The pub is quite quiet and family-friendly on a Sunday lunchtime, so younger Wikimedians will also feel welcome and safe. Alcohol consumption is not compulsory!
Disabled accessEdit
The pub has an accessible loo on the ground floor. There are some sections of the pub that are only accessible by steps, but we always meet in the main step free section, usually opposite the main doors.
Location: Penderel's OakEdit
The Penderel's Oak is a Wetherspoons pub in Holborn.
Address: 283-288 High Holborn, London, WC1V 7HP (OSM) (GMap)
Beer in the Evening
It's easy to find us – we're usually the crowd with several laptops on the large tables straight ahead of you when you enter the pub. If not, then look for a tabletop Wikimedia UK banner and laptops with Wikipedia stickers on them. Wikimania Tshirts can also be a good clue.
Getting thereEdit
Chancery Lane 0.2 miles
Farringdon 0.5 miles
The Penderel's Oak is between Holborn tube station and Chancery Lane tube station. Farringdon tube and Thameslink station is not too far, nor is City Thameslink (0.6 miles; 950m), albeit this station is closed on Sundays. The pub is also within walking distance of Waterloo railway station (1.3 miles; 2 km), St Pancras railway station (1.2 miles; 1.9 km) and Kings Cross.
Several bus routes also go directly to Holborn station; if travelling from Waterloo, it is quicker to travel by bus than by tube.
Bike hire (TfL scheme) is in Red Lion Street, just opposite the pub.
Visit the TfL Journey Planner for more information about your fastest route.
Back-up planEdit
In the rare event of a kitchen closure or another problem at the Penderel's Oak, the meetup will be relocated to the Shakespeare's Head – another Wetherspoons pub located nearby. To get there from the Penderel's Oak, when exiting onto the street turn left, then when walking past Holborn tube station turn left again down Kingsway, and after a short walk the pub will be found on the left-hand side.
Wikimedians' meet-ups in the UK
2 - 3 Dec 2004
3 - 26 Mar 2005
5 - 2 Jan 2007
7 - 12 Jan 2008
8 - 13 Apr 2008
9 - 11 May 2008
10 - 8 Jun 2008
11 - 13 Jul 2008
15 - 9 Nov 2008
18 - 8 Feb 2009
19 - 8 Mar 2009
24 - 9 Aug 2009
31 - 14 Mar 2010
33 - 9 May 2010
35 - 4 Jul 2010
41 - 9 Jan 2011
56 - 8 Apr 2012
56a - 15 Apr 2012
61 - 9 Sep 2012
64 - 9 Dec 2012
84 - 8 to 10 Aug 2014
100 - 13 Dec 2015
101 - 10 Jan 2016
102 - 14 Feb 2016
103 - 13 Mar 2016
104 - 10 Apr 2016
105 - 8 May 2016
106 - 17 May 2016
107 - 12 Jun 2016
108 - 10 Jul 2016
109 - 14 Aug 2016
110 - 11 Sep 2016
111 - 9 Oct 2016
112 - 13 Nov 2016
114 - 8 Jan 2017
117 - 9 Apr 2017
120 - 9 Jul 2017
134 - 9 Sep 2018
135 - 14 Oct 2018
137 - 9 Dec 2018
143 - 9 Jun 2019
151 - 9 Feb 2020
1 - 28 April 2013
2 - 28 Jul 2013
3 - 1 Sep 2018
4 - 1 Aug 2009
12 - 8 Oct 2011
4 - 22 February 2015
1 - 21 July 2013
3 - 18 October 2014
2 - 6 May 2012
4 - 26 January 2016
6 - 29 March 2016
3 - 1 Oct 2011
5 - 1 Feb 2015
16 - Cancelled
London Wikidata
1 - Cancelled
1 - 4 Nov 2012
2 - 31 August 2014
Retrieved from "https://meta.wikimedia.org/w/index.php?title=Meetup/London/130&oldid=18052058"