text:
Danley Does Double Duty for Richwoods Christian Church and Satellite Location
PEORIA, ILLINOIS – OCTOBER 2014: Richwoods Christian Church was founded in the late 1990s by pastor Jim Powell in Peoria, Illinois. Its congregation was initially small, a scant sixty-five people, but those congregants were motivated to grow the church. They succeeded, and today Richwoods Christian Church brings 1,400 people together every weekend, spread across four services at two locations. The larger location built its current sanctuary in a former high-end furniture store, where, despite low ceiling height, local A/V integration firm Advanced Audio and Lighting gave the church a highly-intelligible and musical sound reinforcement system based on Danley Sound Labs SH-50 full-range loudspeakers and TH-115 subwoofers. Not wanting to compromise at the satellite location, Richwoods Christian Church asked for Danley again. There, a collapsible system of self-powered Danley SH-96 loudspeakers and TH-118 subwoofers meets that goal.
davis@aadvert.com ⋅ Oct 24, 2014
"Everyone we worked with at Richwoods had a clear vision of what they wanted to achieve without getting overly involved in the nuts and bolts of how it would be achieved," said Trent Keeling, vice president at Advanced Audio and Lighting. "Quality audio was high on their priority list. They wanted a system that would deliver their very contemporary praise and worship style with authority. Because there's a lot of musical talent in the church, they needed something that would serve everything from orchestral music to a five-piece rock band, on top of having excellent intelligibility."
While the church's new location in a former furniture store would serve it well in terms of location and accessibility, it was not ideal for sound reinforcement. There was only a nineteen-foot distance between the floor and the low steel, which was compressed even further by a modest stage and drop ceiling. "That's not a standard hang height," laughed Keeling. "One of Richwoods' signature programs is its Christmas pageant, which involves, at various points, up to thirty children running around stage with open omnidirectional lavalier mics. If we could place the PA twenty-five feet up and twenty-five feet forward, then just about any loudspeaker could pull that off. But here we were going to be right above the stage, sixteen feet up. That's where you separate the men from the boys."
Keeling's solution was to cover the room with four Danley SH-50 full-range loudspeakers, two close-packed on each side of the stage. "Danley's Synergy Horn loudspeakers, like the flagship SH-50, have excellent phase coherency and precise pattern control down to 350Hz and lower," he said. "Because of that pattern control, the SH-50s can be right above the stage without collapsing into feedback. In addition, the fact that the SH-50 is a three-way enclosure gives Richwoods great vocal intelligibility." Two flown Danley TH-115 subwoofers provide low-end support. The system is nominally stereo, but because the six hundred-plus seat room is so wide, the techs are "discouraged from doing any hard panning," in Keeling's words. Biamp Audia provides modest processing, Lab.gruppen amplifiers power the system, the FOH desk is a Yamaha M7, and Shure microphones provide input.
The church was so pleased with the quality of its Danley sound reinforcement system that it motivated the approach they took to designing a satellite location, Richwoods East. "They recognized that the quality of their services was an important component of Richwoods' success," said Keeling. "They wanted the satellite to live up to the quality of the 'Mother Ship'." The 500-member congregation of Richwoods East meets at an Embassy Suites ballroom using a portable, plug-and-play system. Keeling maintained the 'Mother Ship's' quality by designing a ground-supported system of two self-powered Danley SH-96s and two self-powered Danley TH-115 subwoofers.
ABOUT DANLEY SOUND LABS
Danley Sound Labs is the exclusive home of Tom Danley, one of the most innovative loudspeaker designers in the industry today and recognized worldwide as a pioneer for "outside the box" thinking in professional audio technology.
www.danleysoundlabs.com
Clair Brothers Delivers LCBC Church Signature Sound at New Satellite Location
Vancouver's Tech-Savvy 2,200-Seat Crossroads Church Installs Danley in Main Facility and in Satellite Campus
Danley Synergy Horn Delivers Superior Pattern Control at Summit Church
Danley Loudspeakers, Subs, and Amps/DSP Installed at Maryland's Lighthouse Church
With Curiosity Piqued by the Sound Quality at the University of Iowa's Kinnick Stadium, Wildwood Church Upgrades to Danley Gear
With Fewer Boxes, Danley Sound Labs Revitalizes First Baptist Church of Ashland, Virginia
Historically Significant St. John's Congregational Church Builds New Sanctuary, Installs Danley
HARMAN's dbx PMC16 Personal Monitor Controller Performs Double-Duty at First United Methodist Church


text:
Home Computers Acer Unleashes NVIDIA Tegra K1-Powered 13.3-Inch Chromebook
Acer Chromebook 13
Acer Unleashes NVIDIA Tegra K1-Powered 13.3-Inch Chromebook
Acer Unleashes NVIDIA Tegra K1-Powered 13.3-Inch Chromebook – Aug 11, 2014– San Jose , USA (Techreleased) – Acer expands its Chromebook portfolio with a model that delivers enhanced mobile performance for graphic-intense apps, games and more; up to 13 hours of battery life and option for full HD display takes Chromebook from workday productivity to nighttime entertainment.
Acer America today announced the Acer Chromebook 13, the industry's first Chromebook powered by an NVIDIA Tegra K1 mobile processor and the company's first with a 13.3-inch display. The Chromebook 13 enhances Acer's already leading position in this category.
The combination of additional real estate on the vibrant 13.3-inch display, industry-leading battery life of up to 13 hours, and a thin and light fanless design makes the Acer Chromebook 13 the ideal choice for customers who want additional screen real estate along with a portable and productivity-boosting design. The Acer Chromebook 13 is available in two options – one with a full HD display with 1920×1080 resolution and another model with a 1366×768 display.
The Acer Chromebook 13 delivers the ultimate in mobility with the Tegra K1 with a 192-core GPU, enabling customers to get more done throughout their work day and after hours, no matter where they take their Chromebook. Customers will experience a first-rate multi-tasking experience when keeping multiple tabs open, playing a video and doing more all at once.
"The Acer Chromebook 13 is an ideal device for families who need a new or additional computer to share for school projects, research, entertainment and fun online," said John Miedema, director product marketing, Acer Europe. "The display is large and vibrant, so everything from homework to video is incredibly crisp and detailed. Plus, up to 13 hours of battery life means families can use the device all day for work or school and not have to recharge it for nighttime activities like homework and watching movies."
The Acer Chromebook 13 uses the NVIDIA Tegra K1 4-Plus-1 quad-core ARM Cortex A15 CPU plus a third-generation battery-saver core to provide up to 13 hours of battery life. Tegra K1 uses an NVIDIA Kepler architecture-based GPU with 192 programmable GPGPU cores to process rich and detailed graphics.
Two Options Provide Choice of Full HD Display, Extra-Long Battery Life
The Acer Chromebook 13′s large 13.3-inch display comes in two models to give customer the options that fit their needs. The version with a full HD 1920×1080 display shows video in lifelike 1080p resolution and provides up to 11.5 hours of battery life. In addition, models will be available with a bright and crisp 1366×768 resolution display that provides even longer battery life of up to 13 hours.(2) Both displays will have Acer ComfyView anti-glare panels that minimize light reflection that can cause eye fatigue. In addition, the Acer Chromebook 13′s display provides rich colors and excellent contrast, while the large size helps accommodate the spacious keyboard that is both comfortable and maximizes productivity.
Designed with mobility in mind, the Acer Chromebook 13 has an incredibly thin and light design that measures only 1.7 cm thin and weighs only 1.5 kg. The Acer Chromebook 13 keeps customers in touch and connected with 802.11ac WiFi, which provides speeds up to three times faster than 802.11n. Plus, the 2×2 MIMO antenna helps ensure reliable throughput.
Starts Quickly; Connects to Popular Devices
The new Acer Chromebook 13 boots up in less than 10 seconds and resumes nearly instantly from sleep mode. This enables customers to more quickly enjoy the more than 30,000 free and paid apps, themes and extensions in the Chrome web store.
Customers will enjoy faster data transfers of photos and video with the Acer Chromebook 13′s two USB 3.0 ports. Plus, streamed video and movies can be shared on a larger display or home TV using the Acer Chromebook 13′s HDMI port. Video chats and Google Talk are all enhanced by the Chromebook's HD webcam that provides 720p HD audio/video recording as well as the two built-in stereo speakers and microphone.
Fun to Share, Easy to Protect
Chromebooks are simple to use and ideal for sharing by multiple users, such as families, schools or at different shifts at a business. Users can log into their own account to access Gmail, Docs, website bookmarks and other information. Storage on Google Drive(2) protects files, documents, and photos safely in the cloud, and ensures that the most current version of the file or document is always available and safe, even if the Chromebook is lost or stolen. Plus, Acer Chromebook 13 users can view, edit, create and collaborate on-line and off-line with a growing number of programs, such as Office documents and Gmail.
Security is a key benefit of the Chrome operating system, as it's automatically updated to guard against ever-changing online threats. This is especially useful for families and schools who want to protect children.
Previous articleApacer Launches 2 TB AC233 USB 3.0 Portable Hard Drive
Next articleNevsky Shipyard Will Launch Multipurpose Salvage Vessel – SPASATEL DEMIDOV
https://www.techreleased.com
New Toyota Gr Yaris: A Rally Car For The Road

redpajama_set_name: RedPajamaCommonCrawl


Francis Carpenter receives funding from the Wellcome Trust.
Caswell Barry receives funding from Wellcome Trust, Royal Society, and UCL.
London's taxi drivers have to pass an exam in which they are asked to name the shortest route between any two places within six miles of Charing Cross – an area with more than 60,000 roads. We know from brain scans that learning "the knowledge" – as the drivers call it - increases the size of their hippocampi, the part of the brain crucial to spatial memory.
Now, new research suggests that bigger hippocampi may not be the only neurological benefit of driving a black cab. While the average person likely has many separate mental maps for different areas of London, the hours cabbies spend navigating may result in the joining of these maps into a single, global map.
Decades of work in both humans and animals has led to great leaps in our understanding of how the hippocampus and nearby brain regions form maps of space. A key breakthrough was made by John O'Keefe in the 1970s, who used electrodes to record the activity of individual brain cells in the hippocampus of rats as they walked around. He found cells that were active at single locations in space and named them place cells. For example, one cell was active when the rat was at the top left corner of the room, while others were active when the was rat in the middle of the room.
Four decades later, the same technique was used to identify so-called grid cells. Like place cells, grid cells are active at specific points in space, but unlike place cells become active at multiple points organised in a repeating triangular pattern. Together, these cells and others are thought to be the cellular basis of the brain's spatial map, and their discovery led to the award of a Nobel Prize in 2014.
A grid cell's activity as a rat moves around a room.
The repetitive pattern of grid cells means that they are activated in regular intervals as an animal explores an environment. It is thought that this repetitive activity can act like a ruler: by counting the number of times groups of grid cells become active, the rat's brain can calculate how far it has moved. Conversely, these cells could also be used to navigate between points in space by calculating how far you have to move to reach a goal. If grid cells did act as a ruler, to get consistent measurements, the distance between the points where the cells are active would need to be the same no matter where you are.
Yet this requirement has been questioned by recent findings showing that in certain places grid cell activity is distorted from its regular pattern. For example, the pattern is misshapen near to the walls of some environments, being particularly strongly affected in the corners of triangular spaces. It is therefore difficult to use the grid cells as a ruler in these places.
To investigate this issue, we recorded grid cells in rats exploring two compartments connected by a corridor. Crucially, the two compartments were identical: they looked, smelled and felt the same. We hypothesised that if grid cells do act as a useful measure of space their activity should span the two compartments even though they are perceptually identical, reflecting the fact that each has a different position in space.
A number of unglamorous months were spent in a dark room scattering rice around the compartments to encourage the rats to explore, followed by the only slightly more glamorous analysis of the data. Happily, we observed a number of interesting results. When the rats first started to explore, the activity patterns of the grid cells were identical in the two compartments, reflecting the identical sensory cues in each.
However, once the rats had spent a number of days exploring, the grid cells' activity became more regular, eventually forming a single continuous pattern spanning both compartments. The grid cells had moved from having two separate and identical maps for each compartment to a single and continuous map covering both. Placing both compartments on the same map means that the grid cells can be used as a measure of space and for navigation between them.
While an interesting development, this will certainly not be the final word on the function of grid cells. Other studies have found apparently permanent distortions in their activity patterns, and it remains to be seen whether there are certain factors that prevent the regular pattern forming, and what they may be. Crucial future steps will likely include identifying how distortions in grid cell activity patterns relate to inaccuracies in navigation, and whether inactivating grid cells prevents accurate navigation.
Most studies use rodents to investigate the brain's representation of space, as recording from single cells in humans currently requires invasive surgery. Brain scans have shown that humans also have grid cells, but new technologies are needed before we can ask whether the grid cells of cab drivers form the same global patterns seen in our rats.
Health Check: why do we itch?


Dr. John McFerran is a researcher in optical and atomic physics and a lecturer at the University of Western Australia (UWA). He has held research positions at the National Institute of Standards and Technology, Boulder, USA; LNE-SYRTE, Paris Observatory, France; XLIM, Limoges, France and Durham University, UK.
His research topics include, optical atomic clocks, laser spectroscopy, optical frequency synthesis and ultra-cold atoms and molecules. He received an Australian Research Council Future Fellowship in 2011 through which he with students developed a cold atom optical clock based on ytterbium at UWA.
In Paris 2009-2011, whilst working in the group of Sébastien Bize, he was instrumental in producing the world's first mercury based optical lattice clock and measuring the associated magic wavelength. These types of clocks are beginning to show superiority over all previous forms of clocks and will be invaluable for future tests of fundamental physics.


Worldwide retail sales are estimated at $7 trillion (USD).
The top 200 largest retailers account for 30% of worldwide demand.
The money spent on household consumption worldwide increased 68% between 1980 and 1998.
Retail sales are generally driven by people's ability (disposable income) and willingness (consumer confidence) to buy.
Approximately 2,000 companies voluntarily report on their economic, environmental and social policies, practices and performance.
The 1998 UNDP Human Development Report points to the fact that advertising has global expenditures (including in developing countries) increasing faster than the world economy, suggesting that the sector is becoming one of the major players in the development process.
An Arthur D. Little survey of 481 executives world-wide published in 1999 found that 95% of managers believed that sustainable development offered real business value and 75% said that companies would have to make the required adjustments in vision and strategy. But only 19% said that their companies were "well down the road" in making such changes.


Brighton have managed just one win in their previous six league matches (W1, D2, L3). However, their 3-1 away victory at Bournemouth in the FA Cup did relieve some of the pressure on the South-Coast side. Notably, it was just their second two-goal margin victory across all competitions this season.
Home form has been key for the 'Seagulls' so far, with only the top-six bettering their home points return of 18 (W5, D3, L2). Yet with leaders Liverpool coming to town, they will be desperate to improve on their record of just one win against any of the Premier League's (PL) current top-eight sides (W1, D2, L5).
After crashing out of the FA Cup on Monday night to Wolves, Liverpool switch their attention back to the league as they look to bounce back from their first PL defeat of the season against Manchester City. A half-time lead has been pivotal to their away success this season. They have led at half-time in six of their 11 away games, going onto win all of those six matches.
Liverpool have won all of the previous six competitive matches against Brighton, stretching back to Jan 1991. Additionally, they have scored three or more goals in three of the last five H2H meetings.
Players to watch: Seven of Glenn Murray's eight league goals have come at home, and he scored Brighton's consolation goal in a 5-1 defeat when the sides last met at the Amex Stadium.
Liverpool's leading scorer Mo Salah has two goals in his previous two appearances against Brighton – both of which came in the opening 30 minutes.
Stat attack: Brighton have scored in every PL home game.
Thirty-six percent of Brighton's home league goals have been conceded after the 75th minute.
Liverpool have scored in every PL away game this season.
There have been 3+ match goals in four of the last five competitive H2H meetings.


text:
Joe Schobert, né le  à Waukesha au Wisconsin, est un joueur américain de football américain. Il joue pour les Steelers de Pittsburgh dans la National Football League (NFL) au poste de linebacker

Biographie

Carrière universitaire
Étudiant à l'université du Wisconsin, il a joué pour l'équipe des Badgers de 2012 à 2015. À sa dernière saison universitaire, il est nommé linebacker de l'année dans la conférence Big Ten en plus d'être sélectionné dans l'équipe-type All-America.

Carrière professionnelle
Il est sélectionné par les Browns de Cleveland au quatrième tour, en  position, lors de la draft 2016 de la NFL.

Après avoir joué sa première saison professionnelle comme relève en défense et sur les unités spéciales, il est désigné titulaire comme linebacker intérieur pour le début de la saison 2017. Avec 144 plaquages, il mène la ligue au niveau des plaquages à égalité avec Blake Martinez et Preston Brown, en plus de réaliser 3 sacks, 4 passes déviées, une interception et 3 fumbles forcés. Il est sélectionné au Pro Bowl, en remplaçant Ryan Shazier des Steelers de Pittsburgh qui est blessé.

Durant la saison 2019, lors de la  semaine face aux Dolphins de Miami, il est nommé joueur défensif de la semaine dans l'AFC après avoir intercepté deux fois le quarterback Ryan Fitzpatrick en plus de dévier quatre passes. Il est le meilleur plaqueur et intercepteur de son équipe à l'issue de la saison, avec 133 plaquages et 4 interceptions.

Il rejoint les Jaguars de Jacksonville en mars 2020 sur un contrat de 5 ans pour 53,75 millions de dollars.

Références

Liens externes

Naissance en novembre 1993
Naissance à Waukesha
Joueur américain de football américain
Linebacker
Joueur sélectionné au Pro Bowl
Joueur de football américain des Badgers du Wisconsin
Choix de draft des Browns de Cleveland
Joueur des Browns de Cleveland
Joueur des Jaguars de Jacksonville
Joueur des Steelers de Pittsburgh

redpajama_set_name: RedPajamaWikipedia


text:
Q: What library to import for #import  I have imported ASIHTTP files into my project and inside  ASIWebPageRequest.m there is the following import:
#import <libxml/HTMLparser.h>

which is not recognized. What library should I add in order to be recognized?

A: Go to the Project build settings (Project->Edit Project Settings->Build) and find the "Search Paths". In "Header Search Paths" add the following path:

$(SDKROOT)/usr/include/libxml2

Note, you may be missing all development headers after upgrading OS X (at least this was the case for me with Mavericks). To reinstall the command line tools run:

xcode-select --install

A: With xcode 4.5, it doesn't work. I try with
    /usr/include/libxml2
and it works well

A: putting ${SDK_DIR}/usr/include/libxml2 for the "Header Search Paths" build setting worked for me.
*Info: I'm using xcode 5

redpajama_set_name: RedPajamaStackExchange


Reading greens starts before you even step foot onto the putting surface. Your preparation should begin as you are approaching the green. As you approach be sure to check out the entire landscape around the green. Look for high points and low points. Take note of any mountains which would push the ball away from it or any water (creeks, lakes, oceans) which will pull the ball down towards it. Keep looking at the surroundings and at the entire putting green as you approach your ball.
Once you mark your ball and are cleaning it, make sure to walk an entire circle around the cup. At this point try feeling the land under your feet. You should easily feel if you are walking downhill or uphill and if you have more weight leaning left or right. Take a second when you get to the back side of the hole to squat down and view the putt from there as this always gives you a great read.
In our DVD Putting Principles PGA Tour Veteran Jay Delsing and I cover how to read the break and the speed and Jay demonstrates this walk. I might suggest you get a copy to see how it is done by most tour players.
After you have done all the prep, you should have a pretty good idea of what the putt is going to do before you even squat down behind it and take a look at the line. From here, knowing the speed from the practice green and knowing the slope from your walk, just make the best guess you can, but be sure to always play a bit more break than you think as most people under read the break by 50% or so.
The pushing and pulling you are talking about is a stroke issue (provided you have a putter that is properly fit to your body type and stroke path). For that I would refer you to our drills section under Putting on the Instruction page here on the site. I have written over 30 drills and many are useful for training your path. If you putt on an arc a training aid like The Putting Arc can really help you groove a good path. If you putt on a straight path you can easily make your own putting track by laying down two clubs parallel to each other just wider than your putting head. Since it is somewhat off season now you might check out our Practice section as it has numerous Indoor Practice drills. The Baseboard drill sounds like it would be really good for you as it sounds like when you try to accelerate you get too much extra motion happening with your body and arms.
Try some of the drills and the prep routine for reading the green and let me know how it goes. I hope it helps! Be sure to start logging your scores in the free Game Tracker and log your practice sessions so we can help you with your plan of attack!


Sky Land Realty is pleased to offer this lovely 4 bedroom villa for rent in Jumeirah Islands. Currently vacant and ready for occupancy.
The villa is set on a plot of approximately 10,000 Sq. Ft with a front and rear garden that is easily maintainable with a lovely private pool. All the landscaping and pool will be freshly prepared for the new occupants.
The villa features 3 family rooms downstairs along with kitchen, guest bedroom, powder room, laundry room and maids room.
The master bedroom features a spacious study area with a terrace over-looking the beautiful cluster. Inside the bedroom there are walk-in-wardrobes, an en-suite bathroom walk-in-shower with his and hers basins and another balcony over-looking the garden, pool and lush greenery of Jumeirah Islands.
The other bedrooms have en-suite bathrooms, 1 with shower and 1 with bath tub. Both have built-in-wardrobes and lovely views of the garden and community.


This property's park-like setting backs onto Earl Bales Park and Outdoor Centre! 325 Bogert offers large inner courtyard, outdoor pool, steps to TTC, and only minutes to excellent shopping and entertainment at Yonge & Sheppard!
Outdoor pool is a great place to spend hot summer days!
BRAND NEW FITNESS FACILITIES will keep you active all year round!
This property with a park-like setting backs onto Earl Bales Park and Outdoor Centre! and offers large inner courtyard, outdoor pool, steps to TTC, minutes to Yonge & Sheppard, excellent shopping & entertainment!!!
Please use the contact form below to enquire about Heath Residence at 325 Bogert Ave. We're excited to talk to you!


You can say that the black tiger shrimp taste is the king of flavor since it has unbeatable and wonderful taste to experience in many dishes. Tiger shrimp is widely distributed and sold in various countries and it is also the most marketed shrimp in the world. The black tiger shrimp are harvested wildly along the coastline of Africa to the Sea of Japan. Although, more than 80 percents black tiger shrimp sold in the markets are cultivated by shrimp farmers with majority producers come from Asian countries while the rest taken from Latin America. This is makes the shrimp available each season.
How wonderful the black tiger shrimp taste?
Unlike the cold water shrimp species that usually have watery and almost bland taste; the black tiger shrimp which swim in warm water have more flavorful taste with sweet and bold flavor along with firm meat texture that makes the shrimp being called as 'poor man's lobster'. It is the reason of why black tiger shrimp is cherished by many people especially used by many top restaurants and hotels all around the world.
The raw black tiger shrimp characterized with the back to gray stripes encircle the shell and the female tigers can grow up to 33 cm while the male species often smaller than the female shrimp. Cooked black tiger shrimp usually have bright red to pink shell with white meat that softer than other species of shrimp. Farmed black tiger shrimp taste is milder than wild caught tiger shrimp that caught at the ocean.
Black tiger shrimp, the king of flavor!
The black tiger shrimp is widely known as the king of flavor due to the bold and unique taste which could not be turned down once you experience it. The black tiger shrimp is the most distributed and sold shrimp in the world which produced in large quantity each year. Larger tiger producers dominated by Asian countries like Indonesia, Thailand, Vietnam, etc. and more than 80 percents of them are harvested from the shrimp farms instead of wild caught.
When you want to cook simple dish using black tiger shrimp, it is better to purchase raw uncooked shrimp rather than buying pre-cooked shrimp. Uncooked shrimp easy to be added by many flavor and they are also have more wonderful taste than pre-cooked shrimp since it is difficult to add any flavor to already pre-cooked shrimp. In the end they offer a taste that not so good almost bland. Not to mention that pre-cooked shrimp usually are more expensive than the raw one.
In addition, it is better to buy alive, fresh, and raw shrimp because it has better taste cooked shrimp or frozen raw shrimp. However, if you cannot find black tiger shrimp that still alive then do not hesitate to buy frozen shrimp instead of fresh shrimp displayed on the seafood shelves at supermarket or grocery stores. Frozen black tiger shrimp taste and quality can be way better than fresh shrimp at supermarket. The fresh shrimp you see at the stores sometime is not the freshest one because they are possible already thawed before being sold to the customers.
Black tiger shrimp taste will be more delicious if you know how to cook them properly. Some people prefer to cook the shrimp with the shell still on or in other words, the unpeeled shrimp. Even if other people do not like to eat the shrimp with the head still attached, many restaurants and hotels like to serve whole shrimp unpeeled on their menu.
How to buy good black tiger shrimp?
It is important to pick good quality of shrimp so you can get better black tiger shrimp taste. First, if you buying fresh then the shrimp should have ocean smell and if you buying frozen, usually they are packaged inside airtight plastic bag or cartons so it is impossible to smell them, you can check the package to ensure that there are no damages or torn. Moreover, the shrimp flesh should stay firm and not moist. When the shrimp are cooked, they are not taste strange and instead the black tiger shrimp taste should taste clean, brisk, and flavorful. The taste should stay in your mouth. Once you taste the shrimp, you will never turn back!


text:
Local Alternatives
re-imagining the creative city in response to climate change
creative experiments
environmental arts collaboratory
sensing inheritance
This collaborative project focused on the question of what it feels like for
young people to inherit a world typified by climatic, social, and biopolitical crisis, a research initiative that we called Inheriting the Anthropocene. The project sought to engage critically with the Anthropocene as a particular conceptual,
material, and affective figuration of the current epoch, focusing on how the epoch is being sensed and felt by young people, and simultaneously, how museum spaces might be differently experienced and imagined. We sent out an open call for young people (ages 11–14) to join the Young Adventurers research team through the Museum's network, social media, and flyers distributed across the city of Manchester. Our call was specifically phrased as an invitation for young "movers, shakers, makers, hackers, activists, and dreamers" interested in disrupting and re-imagining what a museum could be.
Over the course of this project, decolonial concerns came increasingly to the fore as we explored the complexity of young people's encounters with the museum's galleries, collections, and store rooms containing more than 4.5 million objects, the vast majority of which are never seen by the public. Working in collaboration with our research team and curators from Manchester Museum, the Young Adventurers created their own series of installations and interventions in the museum reflecting their critical concerns about climate change, decolonisation, and the universalism of Western knowledge. These works were shown in the Inheriting the Anthropocene exhibition at Manchester Museum in 2019-2020, and included:
A Cabinet of Curiosities bringing together strange (even monstrous) assemblages of museological things and ideas evoking the uncertainty of young people's lives
in the Anthropocene;
A wearable Coat of Curiosities stuffed with everyday found objects collected by the Young Adventurers;
the Bureau of Unanswerable Questions, containing hundreds of questions raised by young people in the museum;
Scenes From Behind, a 360 video installation revealing parts of the museum usually restricted to the public;
Sounding Inheritance,
which allowed audiences to remix the sounds of the
museum recorded by young people; and
the Blotwalk, consisting of 28 inkblots on paper and an accompanying map which marked zones of colonial appropriation and exclusion across all levels of
the museum's public display areas
David Rousell (Manifold Lab, MMU)
Riikka Hohti (Manifold Lab, MMU)
Maggie MacLure (Manifold Lab, MMU)
Hannah-Lee Chalk (Manchester Museum)
Young Adventurers (ages 9-13)
Trinity College Kids (age 12-15)
©2018 by David Rousell and the Local Alternatives team.


Avarista J. Perez-Chatlin is currently a Career Development Specialist / Case Worker for the Institute for Career Development and Workforce Transformation, in connection with the Workforce Innovation and Opportunity Act (WIOA) program.
Ava previously worked with the Adult and Youth Programs for both Department of Labor and the Department of Economic Security. She has been with the program since 2010.


Other than excellent shopping and exciting night life, Mostar also offers many excellent, but inexpensive fast food, casual dining and fine dining restaurants. In most restaurants, you can order traditional and Dalmatian food, but Italian dishes also.
As far as the fast food restaurants and the pie bakeries are concerned, there are couple of world's famous fast food restaurants like McDonalds, Fornetti and Surf'n'Fries, but you can buy very cheap sandwiches, hamburgers, pizzas, bread rolls and similar food in local bakeries and fast food restaurants for 2 – 6 BAM.
When it comes to the traditional Herzegovinian restaurants, they offer various local specialties, like ćevapi (small beef sausages), veal meat, lamb meat, begova čorba (veal or chicken soup with vegetables), sarma (minced beef and rice rolled in cabbage), musaka (casserole made of meat, tomatoes, cheese and potatoes), pršut (air-dried ham), sudžuk (dried beef sausages) and similar dishes. With the meal, we recommend you to try out Herzegovinian high-class wines, like Žilavka (dry white wine), Vranac (red wine) or Blatina (dry red wine).
For the full experience, visit some of the following restaurants in Mostar: restaurant Babilon, restaurant Blue Line, restaurant Emem, restaurant Hindin Han, restaurant Megi, restaurant Rondo, restaurant Radobolja, restaurant Šadrvan, restaurant Veranda or restaurant Prestige. The price of an average meal with drinks is from 10 to 25 BAM.


Growing in Grace Podcast: 640. Summarizing the Scripture (Part 11): The Psalms: Beware of Old Covenant "Law Talk"
640. Summarizing the Scripture (Part 11): The Psalms: Beware of Old Covenant "Law Talk"
It's common for Christians to seek comfort and direction when reading the Bible, and the Psalms and Proverbs are often one of the first places people will turn for guidance. However, it is frequently assumed that everything within the Psalms is pointing us towards precepts and principles that are not necessarily meant to be applied for us who are in Christ, living in a New Covenant. We'll find all kinds of passages written from a very different perspective from those who were under the burden of the impossible law… something from which people have been delivered from since the cross.


4.7How fast do they work?
4.8How long does it work?
5.1How do you take Cialis?
5.4 Who should take Cialis 10 mg tablets?
5.3Can I take Cialis daily?
5.4Can Cialis be taken with food?
5.6How often can I take Cialis?
5.7Does Cialis have fewer side effects?
5.8Why is the Cialis dosage different to that of Viagra?
6.1Does Cialis work more quickly?
6.3Does my age or weight affect which dosage I should take?


text:
Why Is Civil Engineering Important?
All humans benefit from civil engineering.
You can thank civil engineers every time you use an electrical device, turn on a tap, take public transportation, or drive on a road. Civil engineers are responsible for the buildings, structures, and major public works projects that make modern life possible.
What Is Civil Engineering?
Civil engineering is the study of how to design, build, and maintain structures in the natural environment. It is perhaps the oldest type of engineering, as one could argue that civil engineering includes even the building of a simple shelter or the construction of a rudimentary bridge across a stream using a tree trunk.
Professional civil engineers often work both in offices and in the field. First, for each project, they must carefully design the technical systems and select materials to ensure efficiency and a high level of safety. Then, on the job site, civil engineers must monitor the project's structural and environmental details both during and after construction.
What Is the Importance of Civil Engineering in Shaping the World?
Quite simply, modern society would not exist without civil engineers. For example, civil engineers were necessary to build every part of our transportation infrastructure, from roads and bridges to docks, train stations, and airports. The development of our utilities, such as water, electricity, and phone and internet service, similarly required professional civil engineering knowledge. All that is before we even get into the use of civil engineering for huge public structures like dams, power plants, water treatment plants, and highways.
What Are Some Important Civil Engineering Projects?
You may have heard of certain famous civil engineering projects. Every major building had a civil engineer. For example, the creator of the Eiffel Tower, Gustave Eiffel, was a civil engineer. Similarly, every famous bridge (like the Golden Gate Bridge) and dam (like the Hoover Dam) was born in the mind of a professional civil engineer. Recent advances in civil engineering have even allowed for the construction of wondrous structures such as the human-made Palm Islands of Dubai.
In the past, civil engineers were crucial to the advancement of society by coming up with new concepts such as viaducts, tunnels, and canals. These inventions effectively improved the quality of life for many generations of humans to come.
Why Do We Need Civil Engineers?
We rely on civil engineers when we need to get water on hot summer days (by building reservoirs and pipelines). We also need them to design and build protective structures like levees and traffic barriers. In addition, every major construction project needs a civil engineer to account for the various things that may cause danger in the future, including natural disasters.
Moreover, civil engineering is a broad field, and its impacts are felt outside of just engineering. People in diverse fields are reliant on the expertise of their civil engineer counterparts. For instance, as part of their profession, civil engineers may:
Assist architects in the design of large buildings
Work with environmental engineers to ensure that each project is safe for the environment
Consult with transportation agencies on how best to manage traffic
Help public officials design new ways of meeting the needs of the public
Why Is Civil Engineering a Good Career?
Civil engineers enjoy excellent pay, earning a median salary of over $87,000 in 2019, good benefits, and many opportunities for advancement. This led U.S. News and World Report to rank civil engineering as the 33rd best job in its 2019 rankings.
Civil engineering may be a great career for you if you are patient, like to think critically to solve problems, and prefer to work with many people from different fields as part of a team.
What Are the Types of Civil Engineering Careers?
There are a number of areas of concentration within civil engineering, so if you choose this field, you may need to search for the role that is right for you. Civil engineers may work in transportation, structural engineering, environmental engineering, construction, architecture, and many other areas. Regardless, you must do research to find the right undergraduate or graduate program for you.
Civil engineers are among the most important engineers in our society. Essentially every aspect of life, from going to the store to taking a shower, depends on a construction project that could not have happened without a civil engineer. If you want to do creative work that helps the public, then you may want to put "becoming a structural engineer" at the top of your career list.
Science & Engineering Guides
Ultimate Guide to Civil Engineering
Among all the marvels of human achievement, there is the work of a civil engineer, which includes building soaring...
Science & Engineering Degrees
Best Online Master's in Social Sciences
Learn to understand humans in a wide variety of contexts with one of the 5 Best Online Master's in...
Most Affordable Online Social Sciences Degrees
Gain a firm understanding on social and cultural influences by earning one of the 25 Most Affordable Online Bachelor's...
Best Online Master's in Sustainability
The best online master's in sustainability studies will train you to lead the charge against environmental exploitation and global...
Science & Engineering FAQs
How to Become a Civil Engineering Technician
Civil engineering technicians work directly with civil engineers to plan, design, and build essential infrastructure. This includes bridges, highways,...
What Colleges Offer Civil Engineering Degrees?
You're most likely familiar with the "standard" type of civil engineer, somebody who designs, plans, and builds infrastructure. They may...
How Hard Is Civil Engineering?
You've decided to take the next step and attend college. Finding the right major can be difficult, as your...
What Can You Do With a Civil Engineering Degree?
When you think of civil engineering, you might picture vast bridges, underground subway stations, or gigantic dams. While these...
Which Is Better, Civil or Construction Engineering?
Both construction engineering and civil engineering are similar disciplines, as they are both affiliated with the field of construction....
Ultimate Guide to Web Development
We live in a digitally connected world, where almost any good or service is available from the palm of our hand. Our entertainment...
Do you have a passion for healthy living? Do you love spreading awareness and knowledge about how to live a healthy life? Or...
Best Online Mathematics Degrees
One of these best online bachelor's degrees in mathematics will teach you to become a problem solver in a lucrative and stable career...


text:
Kollektiv på Christiania er en dansk dokumentarfilm fra 1973, der er instrueret af Aase Steensen.

Handling
Filmen handler om nogle mennesker, der i 1972/73 flytter på Christiania. De fortæller om deres forudsætninger for og deres mening med at bo dér og med at bo i kollektiv.

Referencer

Eksterne henvisninger

Danske film fra 1973

Film fra Danmark (administrationskategori)
Christiania
Dokumentarfilm fra Danmark


Episode three explores how belonging to a community can shape your identity. Host Celeste Mitsiou looks at a vast array of communities centered around skate parks and communal gardens. The featured documentary is "The Workshop" created by La Trobe film graduate James Gray-Foster. It tells the story of Geoff Kennedy, a man who has created a work space, where others can express themselves through art and building. Special guest Andrew Stocker talks to Celeste about the documentary and the broader topic of community.


text:
"""
Tests for L{twisted.conch.client.knownhosts}.
"""

import os
from binascii import Error as BinasciiError, b2a_base64, a2b_base64

try:
    import Crypto
    import pyasn1
except ImportError:
    skip = "PyCrypto and PyASN1 required for twisted.conch.knownhosts."
else:
    from twisted.conch.ssh.keys import Key, BadKeyError
    from twisted.conch.client.knownhosts import \
        PlainEntry, HashedEntry, KnownHostsFile, UnparsedEntry, ConsoleUI
    from twisted.conch.client import default

from zope.interface.verify import verifyObject

from twisted.python.filepath import FilePath
from twisted.trial.unittest import TestCase
from twisted.internet.defer import Deferred
from twisted.conch.interfaces import IKnownHostEntry
from twisted.conch.error import HostKeyChanged, UserRejectedKey, InvalidEntry
from twisted.test.testutils import ComparisonTestsMixin

sampleEncodedKey = (
    'AAAAB3NzaC1yc2EAAAABIwAAAQEAsV0VMRbGmzhqxxayLRHmvnFvtyNqgbNKV46dU1bVFB+3y'
    'tNvue4Riqv/SVkPRNwMb7eWH29SviXaBxUhYyzKkDoNUq3rTNnH1Vnif6d6X4JCrUb5d3W+Dm'
    'YClyJrZ5HgD/hUpdSkTRqdbQ2TrvSAxRacj+vHHT4F4dm1bJSewm3B2D8HVOoi/CbVh3dsIiC'
    'dp8VltdZx4qYVfYe2LwVINCbAa3d3tj9ma7RVfw3OH2Mfb+toLd1N5tBQFb7oqTt2nC6I/6Bd'
    '4JwPUld+IEitw/suElq/AIJVQXXujeyiZlea90HE65U2mF1ytr17HTAIT2ySokJWyuBANGACk'
    '6iIaw==')

otherSampleEncodedKey = (
    'AAAAB3NzaC1yc2EAAAABIwAAAIEAwaeCZd3UCuPXhX39+/p9qO028jTF76DMVd9mPvYVDVXuf'
    'WckKZauF7+0b7qm+ChT7kan6BzRVo4++gCVNfAlMzLysSt3ylmOR48tFpAfygg9UCX3DjHz0E'
    'lOOUKh3iifc9aUShD0OPaK3pR5JJ8jfiBfzSYWt/hDi/iZ4igsSs8=')

thirdSampleEncodedKey = (
    'AAAAB3NzaC1yc2EAAAABIwAAAQEAl/TQakPkePlnwCBRPitIVUTg6Z8VzN1en+DGkyo/evkmLw'
    '7o4NWR5qbysk9A9jXW332nxnEuAnbcCam9SHe1su1liVfyIK0+3bdn0YRB0sXIbNEtMs2LtCho'
    '/aV3cXPS+Cf1yut3wvIpaRnAzXxuKPCTXQ7/y0IXa8TwkRBH58OJa3RqfQ/NsSp5SAfdsrHyH2'
    'aitiVKm2jfbTKzSEqOQG/zq4J9GXTkq61gZugory/Tvl5/yPgSnOR6C9jVOMHf27ZPoRtyj9SY'
    '343Hd2QHiIE0KPZJEgCynKeWoKz8v6eTSK8n4rBnaqWdp8MnGZK1WGy05MguXbyCDuTC8AmJXQ'
    '==')

sampleKey = a2b_base64(sampleEncodedKey)
otherSampleKey = a2b_base64(otherSampleEncodedKey)
thirdSampleKey = a2b_base64(thirdSampleEncodedKey)

samplePlaintextLine = (
    "www.twistedmatrix.com ssh-rsa " + sampleEncodedKey + "\n")

otherSamplePlaintextLine = (
    "divmod.com ssh-rsa " + otherSampleEncodedKey + "\n")

sampleHostIPLine = (
    "www.twistedmatrix.com,198.49.126.131 ssh-rsa " + sampleEncodedKey + "\n")

sampleHashedLine = (
    "|1|gJbSEPBG9ZSBoZpHNtZBD1bHKBA=|bQv+0Xa0dByrwkA1EB0E7Xop/Fo= ssh-rsa " +
    sampleEncodedKey + "\n")

class EntryTestsMixin:
    """
    Tests for implementations of L{IKnownHostEntry}.  Subclasses must set the
    'entry' attribute to a provider of that interface, the implementation of
    that interface under test.

    @ivar entry: a provider of L{IKnownHostEntry} with a hostname of
    www.twistedmatrix.com and an RSA key of sampleKey.
    """

    def test_providesInterface(self):
        """
        The given entry should provide IKnownHostEntry.
        """
        verifyObject(IKnownHostEntry, self.entry)

    def test_fromString(self):
        """
        Constructing a plain text entry from an unhashed known_hosts entry will
        result in an L{IKnownHostEntry} provider with 'keyString', 'hostname',
        and 'keyType' attributes.  While outside the interface in question,
        these attributes are held in common by L{PlainEntry} and L{HashedEntry}
        implementations; other implementations should override this method in
        subclasses.
        """
        entry = self.entry
        self.assertEqual(entry.publicKey, Key.fromString(sampleKey))
        self.assertEqual(entry.keyType, "ssh-rsa")

    def test_matchesKey(self):
        """
        L{IKnownHostEntry.matchesKey} checks to see if an entry matches a given
        SSH key.
        """
        twistedmatrixDotCom = Key.fromString(sampleKey)
        divmodDotCom = Key.fromString(otherSampleKey)
        self.assertEqual(
            True,
            self.entry.matchesKey(twistedmatrixDotCom))
        self.assertEqual(
            False,
            self.entry.matchesKey(divmodDotCom))

    def test_matchesHost(self):
        """
        L{IKnownHostEntry.matchesHost} checks to see if an entry matches a
        given hostname.
        """
        self.assertEqual(True, self.entry.matchesHost(
                "www.twistedmatrix.com"))
        self.assertEqual(False, self.entry.matchesHost(
                "www.divmod.com"))

class PlainEntryTests(EntryTestsMixin, TestCase):
    """
    Test cases for L{PlainEntry}.
    """
    plaintextLine = samplePlaintextLine
    hostIPLine = sampleHostIPLine

    def setUp(self):
        """
        Set 'entry' to a sample plain-text entry with sampleKey as its key.
        """
        self.entry = PlainEntry.fromString(self.plaintextLine)

    def test_matchesHostIP(self):
        """
        A "hostname,ip" formatted line will match both the host and the IP.
        """
        self.entry = PlainEntry.fromString(self.hostIPLine)
        self.assertEqual(True, self.entry.matchesHost("198.49.126.131"))
        self.test_matchesHost()

    def test_toString(self):
        """
        L{PlainEntry.toString} generates the serialized OpenSSL format string
        for the entry, sans newline.
        """
        self.assertEqual(self.entry.toString(), self.plaintextLine.rstrip("\n"))
        multiHostEntry = PlainEntry.fromString(self.hostIPLine)
        self.assertEqual(multiHostEntry.toString(),
                         self.hostIPLine.rstrip("\n"))

class PlainTextWithCommentTests(PlainEntryTests):
    """
    Test cases for L{PlainEntry} when parsed from a line with a comment.
    """

    plaintextLine = samplePlaintextLine[:-1] + " plain text comment.\n"
    hostIPLine = sampleHostIPLine[:-1] + " text following host/IP line\n"

class HashedEntryTests(EntryTestsMixin, ComparisonTestsMixin, TestCase):
    """
    Tests for L{HashedEntry}.

    This suite doesn't include any tests for host/IP pairs because hashed
    entries store IP addresses the same way as hostnames and does not support
    comma-separated lists.  (If you hash the IP and host together you can't
    tell if you've got the key already for one or the other.)
    """
    hashedLine = sampleHashedLine

    def setUp(self):
        """
        Set 'entry' to a sample hashed entry for twistedmatrix.com with
        sampleKey as its key.
        """
        self.entry = HashedEntry.fromString(self.hashedLine)

    def test_toString(self):
        """
        L{HashedEntry.toString} generates the serialized OpenSSL format string
        for the entry, sans the newline.
        """
        self.assertEqual(self.entry.toString(), self.hashedLine.rstrip("\n"))

    def test_equality(self):
        """
        Two L{HashedEntry} instances compare equal if and only if they represent
        the same host and key in exactly the same way: the host salt, host hash,
        public key type, public key, and comment fields must all be equal.
        """
        hostSalt = "gJbSEPBG9ZSBoZpHNtZBD1bHKBA"
        hostHash = "bQv+0Xa0dByrwkA1EB0E7Xop/Fo"
        publicKey = Key.fromString(sampleKey)
        comment = "hello, world"

        entry = HashedEntry(
            hostSalt, hostHash, publicKey.type(), publicKey, comment)
        duplicate = HashedEntry(
            hostSalt, hostHash, publicKey.type(), publicKey, comment)

        # Vary the host salt
        self.assertNormalEqualityImplementation(
            entry, duplicate,
            HashedEntry(
                hostSalt[::-1], hostHash, publicKey.type(), publicKey,
                comment))

        # Vary the host hash
        self.assertNormalEqualityImplementation(
            entry, duplicate,
            HashedEntry(
                hostSalt, hostHash[::-1], publicKey.type(), publicKey,
                comment))

        # Vary the key type
        self.assertNormalEqualityImplementation(
            entry, duplicate,
            HashedEntry(
                hostSalt, hostHash, publicKey.type()[::-1], publicKey,
                comment))

        # Vary the key
        self.assertNormalEqualityImplementation(
            entry, duplicate,
            HashedEntry(
                hostSalt, hostHash, publicKey.type(),
                Key.fromString(otherSampleKey), comment))

        # Vary the comment
        self.assertNormalEqualityImplementation(
            entry, duplicate,
            HashedEntry(
                hostSalt, hostHash, publicKey.type(), publicKey,
                comment[::-1]))

class HashedEntryWithCommentTests(HashedEntryTests):
    """
    Test cases for L{PlainEntry} when parsed from a line with a comment.
    """

    hashedLine = sampleHashedLine[:-1] + " plain text comment.\n"

class UnparsedEntryTests(TestCase, EntryTestsMixin):
    """
    Tests for L{UnparsedEntry}
    """
    def setUp(self):
        """
        Set up the 'entry' to be an unparsed entry for some random text.
        """
        self.entry = UnparsedEntry("    This is a bogus entry.  \n")

    def test_fromString(self):
        """
        Creating an L{UnparsedEntry} should simply record the string it was
        passed.
        """
        self.assertEqual("    This is a bogus entry.  \n",
                         self.entry._string)

    def test_matchesHost(self):
        """
        An unparsed entry can't match any hosts.
        """
        self.assertEqual(False, self.entry.matchesHost("www.twistedmatrix.com"))

    def test_matchesKey(self):
        """
        An unparsed entry can't match any keys.
        """
        self.assertEqual(False, self.entry.matchesKey(Key.fromString(sampleKey)))

    def test_toString(self):
        """
        L{UnparsedEntry.toString} returns its input string, sans trailing
        newline.
        """
        self.assertEqual("    This is a bogus entry.  ", self.entry.toString())

class ParseErrorTests(TestCase):
    """
    L{HashedEntry.fromString} and L{PlainEntry.fromString} can raise a variety
    of errors depending on misformattings of certain strings.  These tests make
    sure those errors are caught.  Since many of the ways that this can go
    wrong are in the lower-level APIs being invoked by the parsing logic,
    several of these are integration tests with the C{base64} and
    L{twisted.conch.ssh.keys} modules.
    """

    def invalidEntryTest(self, cls):
        """
        If there are fewer than three elements, C{fromString} should raise
        L{InvalidEntry}.
        """
        self.assertRaises(InvalidEntry, cls.fromString, "invalid")

    def notBase64Test(self, cls):
        """
        If the key is not base64, C{fromString} should raise L{BinasciiError}.
        """
        self.assertRaises(BinasciiError, cls.fromString, "x x x")

    def badKeyTest(self, cls, prefix):
        """
        If the key portion of the entry is valid base64, but is not actually an
        SSH key, C{fromString} should raise L{BadKeyError}.
        """
        self.assertRaises(BadKeyError, cls.fromString, ' '.join(
                [prefix, "ssh-rsa", b2a_base64(
                        "Hey, this isn't an SSH key!").strip()]))

    def test_invalidPlainEntry(self):
        """
        If there are fewer than three whitespace-separated elements in an
        entry, L{PlainEntry.fromString} should raise L{InvalidEntry}.
        """
        self.invalidEntryTest(PlainEntry)

    def test_invalidHashedEntry(self):
        """
        If there are fewer than three whitespace-separated elements in an
        entry, or the hostname salt/hash portion has more than two elements,
        L{HashedEntry.fromString} should raise L{InvalidEntry}.
        """
        self.invalidEntryTest(HashedEntry)
        a, b, c = sampleHashedLine.split()
        self.assertRaises(InvalidEntry, HashedEntry.fromString, ' '.join(
                [a + "||", b, c]))

    def test_plainNotBase64(self):
        """
        If the key portion of a plain entry is not decodable as base64,
        C{fromString} should raise L{BinasciiError}.
        """
        self.notBase64Test(PlainEntry)

    def test_hashedNotBase64(self):
        """
        If the key, host salt, or host hash portion of a hashed entry is not
        encoded, it will raise L{BinasciiError}.
        """
        self.notBase64Test(HashedEntry)
        a, b, c = sampleHashedLine.split()
        # Salt not valid base64.
        self.assertRaises(
            BinasciiError, HashedEntry.fromString,
            ' '.join(["|1|x|" + b2a_base64("stuff").strip(), b, c]))
        # Host hash not valid base64.
        self.assertRaises(
            BinasciiError, HashedEntry.fromString,
            ' '.join([HashedEntry.MAGIC + b2a_base64("stuff").strip() + "|x",
            b, c]))
        # Neither salt nor hash valid base64.
        self.assertRaises(
            BinasciiError, HashedEntry.fromString,
            ' '.join(["|1|x|x", b, c]))

    def test_hashedBadKey(self):
        """
        If the key portion of the entry is valid base64, but is not actually an
        SSH key, C{HashedEntry.fromString} should raise L{BadKeyError}.
        """
        a, b, c = sampleHashedLine.split()
        self.badKeyTest(HashedEntry, a)

    def test_plainBadKey(self):
        """
        If the key portion of the entry is valid base64, but is not actually an
        SSH key, C{PlainEntry.fromString} should raise L{BadKeyError}.
        """
        self.badKeyTest(PlainEntry, "hostname")

class KnownHostsDatabaseTests(TestCase):
    """
    Tests for L{KnownHostsFile}.
    """

    def pathWithContent(self, content):
        """
        Return a FilePath with the given initial content.
        """
        fp = FilePath(self.mktemp())
        fp.setContent(content)
        return fp

    def loadSampleHostsFile(self, content=(
            sampleHashedLine + otherSamplePlaintextLine +
            "\n# That was a blank line.\n"
            "This is just unparseable.\n"
            "|1|This also unparseable.\n")):
        """
        Return a sample hosts file, with keys for www.twistedmatrix.com and
        divmod.com present.
        """
        return KnownHostsFile.fromPath(self.pathWithContent(content))

    def test_readOnlySavePath(self):
        """
        L{KnownHostsFile.savePath} is read-only; if an assignment is made to
        it, L{AttributeError} is raised and the value is unchanged.
        """
        path = FilePath(self.mktemp())
        new = FilePath(self.mktemp())
        hostsFile = KnownHostsFile(path)
        self.assertRaises(AttributeError, setattr, hostsFile, "savePath", new)
        self.assertEqual(path, hostsFile.savePath)

    def test_defaultInitializerIgnoresExisting(self):
        """
        The default initializer for L{KnownHostsFile} disregards any existing
        contents in the save path.
        """
        hostsFile = KnownHostsFile(self.pathWithContent(sampleHashedLine))
        self.assertEqual([], list(hostsFile.iterentries()))

    def test_defaultInitializerClobbersExisting(self):
        """
        After using the default initializer for L{KnownHostsFile}, the first use
        of L{KnownHostsFile.save} overwrites any existing contents in the save
        path.
        """
        path = self.pathWithContent(sampleHashedLine)
        hostsFile = KnownHostsFile(path)
        entry = hostsFile.addHostKey(
            "www.example.com", Key.fromString(otherSampleKey))
        hostsFile.save()
        # Check KnownHostsFile to see what it thinks the state is
        self.assertEqual([entry], list(hostsFile.iterentries()))
        # And also directly check the underlying file itself
        self.assertEqual(entry.toString() + "\n", path.getContent())

    def test_saveResetsClobberState(self):
        """
        After L{KnownHostsFile.save} is used once with an instance initialized
        by the default initializer, contents of the save path are respected and
        preserved.
        """
        hostsFile = KnownHostsFile(self.pathWithContent(sampleHashedLine))
        preSave = hostsFile.addHostKey(
            "www.example.com", Key.fromString(otherSampleKey))
        hostsFile.save()
        postSave = hostsFile.addHostKey(
            "another.example.com", Key.fromString(thirdSampleKey))
        hostsFile.save()

        self.assertEqual([preSave, postSave], list(hostsFile.iterentries()))

    def test_loadFromPath(self):
        """
        Loading a L{KnownHostsFile} from a path with six entries in it will
        result in a L{KnownHostsFile} object with six L{IKnownHostEntry}
        providers in it.
        """
        hostsFile = self.loadSampleHostsFile()
        self.assertEqual(6, len(list(hostsFile.iterentries())))

    def test_iterentriesUnsaved(self):
        """
        If the save path for a L{KnownHostsFile} does not exist,
        L{KnownHostsFile.iterentries} still returns added but unsaved entries.
        """
        hostsFile = KnownHostsFile(FilePath(self.mktemp()))
        hostsFile.addHostKey("www.example.com", Key.fromString(sampleKey))
        self.assertEqual(1, len(list(hostsFile.iterentries())))

    def test_verifyHashedEntry(self):
        """
        Loading a L{KnownHostsFile} from a path containing a single valid
        L{HashedEntry} entry will result in a L{KnownHostsFile} object
        with one L{IKnownHostEntry} provider.
        """
        hostsFile = self.loadSampleHostsFile((sampleHashedLine))
        entries = list(hostsFile.iterentries())
        self.assertIsInstance(entries[0], HashedEntry)
        self.assertEqual(True, entries[0].matchesHost("www.twistedmatrix.com"))
        self.assertEqual(1, len(entries))

    def test_verifyPlainEntry(self):
        """
        Loading a L{KnownHostsFile} from a path containing a single valid
        L{PlainEntry} entry will result in a L{KnownHostsFile} object
        with one L{IKnownHostEntry} provider.
        """
        hostsFile = self.loadSampleHostsFile((otherSamplePlaintextLine))
        entries = list(hostsFile.iterentries())
        self.assertIsInstance(entries[0], PlainEntry)
        self.assertEqual(True, entries[0].matchesHost("divmod.com"))
        self.assertEqual(1, len(entries))

    def test_verifyUnparsedEntry(self):
        """
        Loading a L{KnownHostsFile} from a path that only contains '\n' will
        result in a L{KnownHostsFile} object containing a L{UnparsedEntry}
        object.
        """
        hostsFile = self.loadSampleHostsFile(("\n"))
        entries = list(hostsFile.iterentries())
        self.assertIsInstance(entries[0], UnparsedEntry)
        self.assertEqual(entries[0].toString(), "")
        self.assertEqual(1, len(entries))

    def test_verifyUnparsedComment(self):
        """
        Loading a L{KnownHostsFile} from a path that contains a comment will
        result in a L{KnownHostsFile} object containing a L{UnparsedEntry}
        object.
        """
        hostsFile = self.loadSampleHostsFile(("# That was a blank line.\n"))
        entries = list(hostsFile.iterentries())
        self.assertIsInstance(entries[0], UnparsedEntry)
        self.assertEqual(entries[0].toString(), "# That was a blank line.")

    def test_verifyUnparsableLine(self):
        """
        Loading a L{KnownHostsFile} from a path that contains an unparseable
        line will be represented as an L{UnparsedEntry} instance.
        """
        hostsFile = self.loadSampleHostsFile(("This is just unparseable.\n"))
        entries = list(hostsFile.iterentries())
        self.assertIsInstance(entries[0], UnparsedEntry)
        self.assertEqual(entries[0].toString(), "This is just unparseable.")
        self.assertEqual(1, len(entries))

    def test_verifyUnparsableEncryptionMarker(self):
        """
        Loading a L{KnownHostsFile} from a path containing an unparseable line
        that starts with an encryption marker will be represented as an
        L{UnparsedEntry} instance.
        """
        hostsFile = self.loadSampleHostsFile(("|1|This is unparseable.\n"))
        entries = list(hostsFile.iterentries())
        self.assertIsInstance(entries[0], UnparsedEntry)
        self.assertEqual(entries[0].toString(), "|1|This is unparseable.")
        self.assertEqual(1, len(entries))

    def test_loadNonExistent(self):
        """
        Loading a L{KnownHostsFile} from a path that does not exist should
        result in an empty L{KnownHostsFile} that will save back to that path.
        """
        pn = self.mktemp()
        knownHostsFile = KnownHostsFile.fromPath(FilePath(pn))
        entries = list(knownHostsFile.iterentries())
        self.assertEqual([], entries)
        self.assertEqual(False, FilePath(pn).exists())
        knownHostsFile.save()
        self.assertEqual(True, FilePath(pn).exists())

    def test_loadNonExistentParent(self):
        """
        Loading a L{KnownHostsFile} from a path whose parent directory does not
        exist should result in an empty L{KnownHostsFile} that will save back
        to that path, creating its parent directory(ies) in the process.
        """
        thePath = FilePath(self.mktemp())
        knownHostsPath = thePath.child("foo").child("known_hosts")
        knownHostsFile = KnownHostsFile.fromPath(knownHostsPath)
        knownHostsFile.save()
        knownHostsPath.restat(False)
        self.assertEqual(True, knownHostsPath.exists())

    def test_savingAddsEntry(self):
        """
        L{KnownHostsFile.save} will write out a new file with any entries
        that have been added.
        """
        path = self.pathWithContent(sampleHashedLine +
                                    otherSamplePlaintextLine)
        knownHostsFile = KnownHostsFile.fromPath(path)
        newEntry = knownHostsFile.addHostKey("some.example.com",
            Key.fromString(thirdSampleKey))
        expectedContent = (
            sampleHashedLine +
            otherSamplePlaintextLine + HashedEntry.MAGIC +
            b2a_base64(newEntry._hostSalt).strip() + "|" +
            b2a_base64(newEntry._hostHash).strip() + " ssh-rsa " +
            thirdSampleEncodedKey + "\n")

        # Sanity check, let's make sure the base64 API being used for the test
        # isn't inserting spurious newlines.
        self.assertEqual(3, expectedContent.count("\n"))
        knownHostsFile.save()
        self.assertEqual(expectedContent, path.getContent())

    def test_savingAvoidsDuplication(self):
        """
        L{KnownHostsFile.save} only writes new entries to the save path, not
        entries which were added and already written by a previous call to
        C{save}.
        """
        path = FilePath(self.mktemp())
        knownHosts = KnownHostsFile(path)
        entry = knownHosts.addHostKey(
            "some.example.com", Key.fromString(sampleKey))
        knownHosts.save()
        knownHosts.save()

        knownHosts = KnownHostsFile.fromPath(path)
        self.assertEqual([entry], list(knownHosts.iterentries()))

    def test_savingsPreservesExisting(self):
        """
        L{KnownHostsFile.save} will not overwrite existing entries in its save
        path, even if they were only added after the L{KnownHostsFile} instance
        was initialized.
        """
        # Start off with one host/key pair in the file
        path = self.pathWithContent(sampleHashedLine)
        knownHosts = KnownHostsFile.fromPath(path)

        # After initializing the KnownHostsFile instance, add a second host/key
        # pair to the file directly - without the instance's help or knowledge.
        with path.open("a") as hostsFileObj:
            hostsFileObj.write(otherSamplePlaintextLine)

        # Add a third host/key pair using the KnownHostsFile instance
        key = Key.fromString(thirdSampleKey)
        knownHosts.addHostKey("brandnew.example.com", key)
        knownHosts.save()

        # Check that all three host/key pairs are present.
        knownHosts = KnownHostsFile.fromPath(path)
        self.assertEqual([True, True, True], [
                knownHosts.hasHostKey(
                    "www.twistedmatrix.com", Key.fromString(sampleKey)),
                knownHosts.hasHostKey(
                    "divmod.com", Key.fromString(otherSampleKey)),
                knownHosts.hasHostKey("brandnew.example.com", key)])

    def test_hasPresentKey(self):
        """
        L{KnownHostsFile.hasHostKey} returns C{True} when a key for the given
        hostname is present and matches the expected key.
        """
        hostsFile = self.loadSampleHostsFile()
        self.assertEqual(True, hostsFile.hasHostKey(
                "www.twistedmatrix.com", Key.fromString(sampleKey)))

    def test_hasNonPresentKey(self):
        """
        L{KnownHostsFile.hasHostKey} returns C{False} when a key for the given
        hostname is not present.
        """
        hostsFile = self.loadSampleHostsFile()
        self.assertEqual(False, hostsFile.hasHostKey(
                "non-existent.example.com", Key.fromString(sampleKey)))

    def test_hasLaterAddedKey(self):
        """
        L{KnownHostsFile.hasHostKey} returns C{True} when a key for the given
        hostname is present in the file, even if it is only added to the file
        after the L{KnownHostsFile} instance is initialized.
        """
        key = Key.fromString(sampleKey)
        entry = PlainEntry(["brandnew.example.com"], key.sshType(), key, "")
        hostsFile = self.loadSampleHostsFile()
        with hostsFile.savePath.open("a") as hostsFileObj:
            hostsFileObj.write(entry.toString() + "\n")
        self.assertEqual(
            True, hostsFile.hasHostKey("brandnew.example.com", key))

    def test_savedEntryHasKeyMismatch(self):
        """
        L{KnownHostsFile.hasHostKey} raises L{HostKeyChanged} if the host key is
        present in the underlying file, but different from the expected one.
        The resulting exception should have an C{offendingEntry} indicating the
        given entry.
        """
        hostsFile = self.loadSampleHostsFile()
        entries = list(hostsFile.iterentries())
        exception = self.assertRaises(
            HostKeyChanged, hostsFile.hasHostKey,
            "www.twistedmatrix.com", Key.fromString(otherSampleKey))
        self.assertEqual(exception.offendingEntry, entries[0])
        self.assertEqual(exception.lineno, 1)
        self.assertEqual(exception.path, hostsFile.savePath)

    def test_savedEntryAfterAddHasKeyMismatch(self):
        """
        Even after a new entry has been added in memory but not yet saved, the
        L{HostKeyChanged} exception raised by L{KnownHostsFile.hasHostKey} has a
        C{lineno} attribute which indicates the 1-based line number of the
        offending entry in the underlying file when the given host key does not
        match the expected host key.
        """
        hostsFile = self.loadSampleHostsFile()
        hostsFile.addHostKey(
            "www.example.com", Key.fromString(otherSampleKey))
        exception = self.assertRaises(
            HostKeyChanged, hostsFile.hasHostKey,
            "www.twistedmatrix.com", Key.fromString(otherSampleKey))
        self.assertEqual(exception.lineno, 1)
        self.assertEqual(exception.path, hostsFile.savePath)

    def test_unsavedEntryHasKeyMismatch(self):
        """
        L{KnownHostsFile.hasHostKey} raises L{HostKeyChanged} if the host key is
        present in memory (but not yet saved), but different from the expected
        one.  The resulting exception has a C{offendingEntry} indicating the
        given entry, but no filename or line number information (reflecting the
        fact that the entry exists only in memory).
        """
        hostsFile = KnownHostsFile(FilePath(self.mktemp()))
        entry = hostsFile.addHostKey(
            "www.example.com", Key.fromString(otherSampleKey))
        exception = self.assertRaises(
            HostKeyChanged, hostsFile.hasHostKey,
            "www.example.com", Key.fromString(thirdSampleKey))
        self.assertEqual(exception.offendingEntry, entry)
        self.assertEqual(exception.lineno, None)
        self.assertEqual(exception.path, None)

    def test_addHostKey(self):
        """
        L{KnownHostsFile.addHostKey} adds a new L{HashedEntry} to the host
        file, and returns it.
        """
        hostsFile = self.loadSampleHostsFile()
        aKey = Key.fromString(thirdSampleKey)
        self.assertEqual(False,
                         hostsFile.hasHostKey("somewhere.example.com", aKey))
        newEntry = hostsFile.addHostKey("somewhere.example.com", aKey)

        # The code in OpenSSH requires host salts to be 20 characters long.
        # This is the required length of a SHA-1 HMAC hash, so it's just a
        # sanity check.
        self.assertEqual(20, len(newEntry._hostSalt))
        self.assertEqual(True,
                         newEntry.matchesHost("somewhere.example.com"))
        self.assertEqual(newEntry.keyType, "ssh-rsa")
        self.assertEqual(aKey, newEntry.publicKey)
        self.assertEqual(True,
                         hostsFile.hasHostKey("somewhere.example.com", aKey))

    def test_randomSalts(self):
        """
        L{KnownHostsFile.addHostKey} generates a random salt for each new key,
        so subsequent salts will be different.
        """
        hostsFile = self.loadSampleHostsFile()
        aKey = Key.fromString(thirdSampleKey)
        self.assertNotEqual(
            hostsFile.addHostKey("somewhere.example.com", aKey)._hostSalt,
            hostsFile.addHostKey("somewhere-else.example.com", aKey)._hostSalt)

    def test_verifyValidKey(self):
        """
        Verifying a valid key should return a L{Deferred} which fires with
        True.
        """
        hostsFile = self.loadSampleHostsFile()
        hostsFile.addHostKey("1.2.3.4", Key.fromString(sampleKey))
        ui = FakeUI()
        d = hostsFile.verifyHostKey(ui, "www.twistedmatrix.com", "1.2.3.4",
                                    Key.fromString(sampleKey))
        l = []
        d.addCallback(l.append)
        self.assertEqual(l, [True])

    def test_verifyInvalidKey(self):
        """
        Verfying an invalid key should return a L{Deferred} which fires with a
        L{HostKeyChanged} failure.
        """
        hostsFile = self.loadSampleHostsFile()
        wrongKey = Key.fromString(thirdSampleKey)
        ui = FakeUI()
        hostsFile.addHostKey("1.2.3.4", Key.fromString(sampleKey))
        d = hostsFile.verifyHostKey(
            ui, "www.twistedmatrix.com", "1.2.3.4", wrongKey)
        return self.assertFailure(d, HostKeyChanged)

    def verifyNonPresentKey(self):
        """
        Set up a test to verify a key that isn't present.  Return a 3-tuple of
        the UI, a list set up to collect the result of the verifyHostKey call,
        and the sample L{KnownHostsFile} being used.

        This utility method avoids returning a L{Deferred}, and records results
        in the returned list instead, because the events which get generated
        here are pre-recorded in the 'ui' object.  If the L{Deferred} in
        question does not fire, the it will fail quickly with an empty list.
        """
        hostsFile = self.loadSampleHostsFile()
        absentKey = Key.fromString(thirdSampleKey)
        ui = FakeUI()
        l = []
        d = hostsFile.verifyHostKey(
            ui, "sample-host.example.com", "4.3.2.1", absentKey)
        d.addBoth(l.append)
        self.assertEqual([], l)
        self.assertEqual(
            ui.promptText,
            "The authenticity of host 'sample-host.example.com (4.3.2.1)' "
            "can't be established.\n"
            "RSA key fingerprint is "
            "89:4e:cc:8c:57:83:96:48:ef:63:ad:ee:99:00:4c:8f.\n"
            "Are you sure you want to continue connecting (yes/no)? ")
        return ui, l, hostsFile

    def test_verifyNonPresentKey_Yes(self):
        """
        Verifying a key where neither the hostname nor the IP are present
        should result in the UI being prompted with a message explaining as
        much.  If the UI says yes, the Deferred should fire with True.
        """
        ui, l, knownHostsFile = self.verifyNonPresentKey()
        ui.promptDeferred.callback(True)
        self.assertEqual([True], l)
        reloaded = KnownHostsFile.fromPath(knownHostsFile.savePath)
        self.assertEqual(
            True,
            reloaded.hasHostKey("4.3.2.1", Key.fromString(thirdSampleKey)))
        self.assertEqual(
            True,
            reloaded.hasHostKey("sample-host.example.com",
                                Key.fromString(thirdSampleKey)))

    def test_verifyNonPresentKey_No(self):
        """
        Verifying a key where neither the hostname nor the IP are present
        should result in the UI being prompted with a message explaining as
        much.  If the UI says no, the Deferred should fail with
        UserRejectedKey.
        """
        ui, l, knownHostsFile = self.verifyNonPresentKey()
        ui.promptDeferred.callback(False)
        l[0].trap(UserRejectedKey)

    def test_verifyHostIPMismatch(self):
        """
        Verifying a key where the host is present (and correct), but the IP is
        present and different, should result the deferred firing in a
        HostKeyChanged failure.
        """
        hostsFile = self.loadSampleHostsFile()
        wrongKey = Key.fromString(thirdSampleKey)
        ui = FakeUI()
        d = hostsFile.verifyHostKey(
            ui, "www.twistedmatrix.com", "4.3.2.1", wrongKey)
        return self.assertFailure(d, HostKeyChanged)

    def test_verifyKeyForHostAndIP(self):
        """
        Verifying a key where the hostname is present but the IP is not should
        result in the key being added for the IP and the user being warned
        about the change.
        """
        ui = FakeUI()
        hostsFile = self.loadSampleHostsFile()
        expectedKey = Key.fromString(sampleKey)
        hostsFile.verifyHostKey(
            ui, "www.twistedmatrix.com", "5.4.3.2", expectedKey)
        self.assertEqual(
            True, KnownHostsFile.fromPath(hostsFile.savePath).hasHostKey(
                "5.4.3.2", expectedKey))
        self.assertEqual(
            ["Warning: Permanently added the RSA host key for IP address "
             "'5.4.3.2' to the list of known hosts."],
            ui.userWarnings)

class FakeFile(object):
    """
    A fake file-like object that acts enough like a file for
    L{ConsoleUI.prompt}.
    """

    def __init__(self):
        self.inlines = []
        self.outchunks = []
        self.closed = False

    def readline(self):
        """
        Return a line from the 'inlines' list.
        """
        return self.inlines.pop(0)

    def write(self, chunk):
        """
        Append the given item to the 'outchunks' list.
        """
        if self.closed:
            raise IOError("the file was closed")
        self.outchunks.append(chunk)

    def close(self):
        """
        Set the 'closed' flag to True, explicitly marking that it has been
        closed.
        """
        self.closed = True

class ConsoleUITests(TestCase):
    """
    Test cases for L{ConsoleUI}.
    """

    def setUp(self):
        """
        Create a L{ConsoleUI} pointed at a L{FakeFile}.
        """
        self.fakeFile = FakeFile()
        self.ui = ConsoleUI(self.openFile)

    def openFile(self):
        """
        Return the current fake file.
        """
        return self.fakeFile

    def newFile(self, lines):
        """
        Create a new fake file (the next file that self.ui will open) with the
        given list of lines to be returned from readline().
        """
        self.fakeFile = FakeFile()
        self.fakeFile.inlines = lines

    def test_promptYes(self):
        """
        L{ConsoleUI.prompt} writes a message to the console, then reads a line.
        If that line is 'yes', then it returns a L{Deferred} that fires with
        True.
        """
        for okYes in ['yes', 'Yes', 'yes\n']:
            self.newFile([okYes])
            l = []
            self.ui.prompt("Hello, world!").addCallback(l.append)
            self.assertEqual(["Hello, world!"], self.fakeFile.outchunks)
            self.assertEqual([True], l)
            self.assertEqual(True, self.fakeFile.closed)

    def test_promptNo(self):
        """
        L{ConsoleUI.prompt} writes a message to the console, then reads a line.
        If that line is 'no', then it returns a L{Deferred} that fires with
        False.
        """
        for okNo in ['no', 'No', 'no\n']:
            self.newFile([okNo])
            l = []
            self.ui.prompt("Goodbye, world!").addCallback(l.append)
            self.assertEqual(["Goodbye, world!"], self.fakeFile.outchunks)
            self.assertEqual([False], l)
            self.assertEqual(True, self.fakeFile.closed)

    def test_promptRepeatedly(self):
        """
        L{ConsoleUI.prompt} writes a message to the console, then reads a line.
        If that line is neither 'yes' nor 'no', then it says "Please enter
        'yes' or 'no'" until it gets a 'yes' or a 'no', at which point it
        returns a Deferred that answers either True or False.
        """
        self.newFile(['what', 'uh', 'okay', 'yes'])
        l = []
        self.ui.prompt("Please say something useful.").addCallback(l.append)
        self.assertEqual([True], l)
        self.assertEqual(self.fakeFile.outchunks,
                         ["Please say something useful."] +
                         ["Please type 'yes' or 'no': "] * 3)
        self.assertEqual(True, self.fakeFile.closed)
        self.newFile(['blah', 'stuff', 'feh', 'no'])
        l = []
        self.ui.prompt("Please say something negative.").addCallback(l.append)
        self.assertEqual([False], l)
        self.assertEqual(self.fakeFile.outchunks,
                         ["Please say something negative."] +
                         ["Please type 'yes' or 'no': "] * 3)
        self.assertEqual(True, self.fakeFile.closed)

    def test_promptOpenFailed(self):
        """
        If the C{opener} passed to L{ConsoleUI} raises an exception, that
        exception will fail the L{Deferred} returned from L{ConsoleUI.prompt}.
        """
        def raiseIt():
            raise IOError()
        ui = ConsoleUI(raiseIt)
        d = ui.prompt("This is a test.")
        return self.assertFailure(d, IOError)

    def test_warn(self):
        """
        L{ConsoleUI.warn} should output a message to the console object.
        """
        self.ui.warn("Test message.")
        self.assertEqual(["Test message."], self.fakeFile.outchunks)
        self.assertEqual(True, self.fakeFile.closed)

    def test_warnOpenFailed(self):
        """
        L{ConsoleUI.warn} should log a traceback if the output can't be opened.
        """
        def raiseIt():
            1 / 0
        ui = ConsoleUI(raiseIt)
        ui.warn("This message never makes it.")
        self.assertEqual(len(self.flushLoggedErrors(ZeroDivisionError)), 1)

class FakeUI(object):
    """
    A fake UI object, adhering to the interface expected by
    L{KnownHostsFile.verifyHostKey}

    @ivar userWarnings: inputs provided to 'warn'.

    @ivar promptDeferred: last result returned from 'prompt'.

    @ivar promptText: the last input provided to 'prompt'.
    """

    def __init__(self):
        self.userWarnings = []
        self.promptDeferred = None
        self.promptText = None

    def prompt(self, text):
        """
        Issue the user an interactive prompt, which they can accept or deny.
        """
        self.promptText = text
        self.promptDeferred = Deferred()
        return self.promptDeferred

    def warn(self, text):
        """
        Issue a non-interactive warning to the user.
        """
        self.userWarnings.append(text)

class FakeObject(object):
    """
    A fake object that can have some attributes.  Used to fake
    L{SSHClientTransport} and L{SSHClientFactory}.
    """

class DefaultAPITests(TestCase):
    """
    The API in L{twisted.conch.client.default.verifyHostKey} is the integration
    point between the code in the rest of conch and L{KnownHostsFile}.
    """

    def patchedOpen(self, fname, mode):
        """
        The patched version of 'open'; this returns a L{FakeFile} that the
        instantiated L{ConsoleUI} can use.
        """
        self.assertEqual(fname, "/dev/tty")
        self.assertEqual(mode, "r+b")
        return self.fakeFile

    def setUp(self):
        """
        Patch 'open' in verifyHostKey.
        """
        self.fakeFile = FakeFile()
        self.patch(default, "_open", self.patchedOpen)
        self.hostsOption = self.mktemp()
        knownHostsFile = KnownHostsFile(FilePath(self.hostsOption))
        knownHostsFile.addHostKey("exists.example.com",
            Key.fromString(sampleKey))
        knownHostsFile.addHostKey("4.3.2.1", Key.fromString(sampleKey))
        knownHostsFile.save()
        self.fakeTransport = FakeObject()
        self.fakeTransport.factory = FakeObject()
        self.options = self.fakeTransport.factory.options = {
            'host': "exists.example.com",
            'known-hosts': self.hostsOption
            }

    def test_verifyOKKey(self):
        """
        L{default.verifyHostKey} should return a L{Deferred} which fires with
        C{1} when passed a host, IP, and key which already match the
        known_hosts file it is supposed to check.
        """
        l = []
        default.verifyHostKey(self.fakeTransport, "4.3.2.1", sampleKey,
                              "I don't care.").addCallback(l.append)
        self.assertEqual([1], l)

    def replaceHome(self, tempHome):
        """
        Replace the HOME environment variable until the end of the current
        test, with the given new home-directory, so that L{os.path.expanduser}
        will yield controllable, predictable results.

        @param tempHome: the pathname to replace the HOME variable with.

        @type tempHome: L{str}
        """
        oldHome = os.environ.get('HOME')
        def cleanupHome():
            if oldHome is None:
                del os.environ['HOME']
            else:
                os.environ['HOME'] = oldHome
        self.addCleanup(cleanupHome)
        os.environ['HOME'] = tempHome

    def test_noKnownHostsOption(self):
        """
        L{default.verifyHostKey} should find your known_hosts file in
        ~/.ssh/known_hosts if you don't specify one explicitly on the command
        line.
        """
        l = []
        tmpdir = self.mktemp()
        oldHostsOption = self.hostsOption
        hostsNonOption = FilePath(tmpdir).child(".ssh").child("known_hosts")
        hostsNonOption.parent().makedirs()
        FilePath(oldHostsOption).moveTo(hostsNonOption)
        self.replaceHome(tmpdir)
        self.options['known-hosts'] = None
        default.verifyHostKey(self.fakeTransport, "4.3.2.1", sampleKey,
                              "I don't care.").addCallback(l.append)
        self.assertEqual([1], l)

    def test_verifyHostButNotIP(self):
        """
        L{default.verifyHostKey} should return a L{Deferred} which fires with
        C{1} when passed a host which matches with an IP is not present in its
        known_hosts file, and should also warn the user that it has added the
        IP address.
        """
        l = []
        default.verifyHostKey(self.fakeTransport, "8.7.6.5", sampleKey,
                              "Fingerprint not required.").addCallback(l.append)
        self.assertEqual(
            ["Warning: Permanently added the RSA host key for IP address "
            "'8.7.6.5' to the list of known hosts."],
            self.fakeFile.outchunks)
        self.assertEqual([1], l)
        knownHostsFile = KnownHostsFile.fromPath(FilePath(self.hostsOption))
        self.assertEqual(True, knownHostsFile.hasHostKey("8.7.6.5",
                                             Key.fromString(sampleKey)))

    def test_verifyQuestion(self):
        """
        L{default.verifyHostKey} should return a L{Default} which fires with
        C{0} when passed a unknown host that the user refuses to acknowledge.
        """
        self.fakeTransport.factory.options['host'] = 'fake.example.com'
        self.fakeFile.inlines.append("no")
        d = default.verifyHostKey(
            self.fakeTransport, "9.8.7.6", otherSampleKey, "No fingerprint!")
        self.assertEqual(
            ["The authenticity of host 'fake.example.com (9.8.7.6)' "
             "can't be established.\n"
             "RSA key fingerprint is "
             "57:a1:c2:a1:07:a0:2b:f4:ce:b5:e5:b7:ae:cc:e1:99.\n"
              "Are you sure you want to continue connecting (yes/no)? "],
             self.fakeFile.outchunks)
        return self.assertFailure(d, UserRejectedKey)

    def test_verifyBadKey(self):
        """
        L{default.verifyHostKey} should return a L{Deferred} which fails with
        L{HostKeyChanged} if the host key is incorrect.
        """
        d = default.verifyHostKey(
            self.fakeTransport, "4.3.2.1", otherSampleKey,
            "Again, not required.")
        return self.assertFailure(d, HostKeyChanged)

redpajama_set_name: RedPajamaGithub


text:
Asset Management One Co. Ltd. Purchases 197 Shares of Broadcom Inc. (NASDAQ:AVGO)
Posted by Logan Wallace on Jan 23rd, 2023
Asset Management One Co. Ltd. lifted its position in Broadcom Inc. (NASDAQ:AVGO – Get Rating) by 0.1% during the 3rd quarter, HoldingsChannel reports. The firm owned 184,127 shares of the semiconductor manufacturer's stock after acquiring an additional 197 shares during the quarter. Asset Management One Co. Ltd.'s holdings in Broadcom were worth $81,754,000 at the end of the most recent reporting period.
Several other large investors have also recently made changes to their positions in the company. Boston Trust Walden Corp grew its position in Broadcom by 6.9% in the second quarter. Boston Trust Walden Corp now owns 1,747 shares of the semiconductor manufacturer's stock worth $849,000 after acquiring an additional 113 shares in the last quarter. Veracity Capital LLC grew its position in Broadcom by 7.6% in the third quarter. Veracity Capital LLC now owns 537 shares of the semiconductor manufacturer's stock worth $239,000 after acquiring an additional 38 shares in the last quarter. Householder Group Estate & Retirement Specialist LLC purchased a new position in Broadcom in the third quarter worth about $118,000. Asset Dedication LLC grew its position in Broadcom by 10.6% in the second quarter. Asset Dedication LLC now owns 5,517 shares of the semiconductor manufacturer's stock worth $2,615,000 after acquiring an additional 531 shares in the last quarter. Finally, Bell Bank purchased a new position in Broadcom in the second quarter worth about $214,000. 81.28% of the stock is owned by institutional investors.
Get Broadcom alerts:
Insider Buying and Selling at Broadcom
In other Broadcom news, Director Justine Page sold 170 shares of the company's stock in a transaction on Tuesday, December 13th. The shares were sold at an average price of $574.86, for a total value of $97,726.20. Following the sale, the director now directly owns 2,981 shares of the company's stock, valued at $1,713,657.66. The transaction was disclosed in a filing with the SEC, which is available through the SEC website. 2.30% of the stock is owned by corporate insiders.
Broadcom Price Performance
Shares of AVGO opened at $570.56 on Monday. The firm has a market capitalization of $238.43 billion, a PE ratio of 21.54, a price-to-earnings-growth ratio of 1.19 and a beta of 1.08. The company has a debt-to-equity ratio of 1.72, a current ratio of 2.62 and a quick ratio of 2.35. Broadcom Inc. has a 1-year low of $415.07 and a 1-year high of $645.31. The company's fifty day moving average price is $549.52 and its 200-day moving average price is $514.14.
Broadcom (NASDAQ:AVGO – Get Rating) last announced its quarterly earnings data on Thursday, December 8th. The semiconductor manufacturer reported $9.75 earnings per share for the quarter, beating analysts' consensus estimates of $9.50 by $0.25. The firm had revenue of $8.93 billion for the quarter, compared to analyst estimates of $8.90 billion. Broadcom had a net margin of 34.62% and a return on equity of 70.00%. The business's quarterly revenue was up 20.6% compared to the same quarter last year. During the same period in the previous year, the company earned $7.01 earnings per share. On average, equities research analysts predict that Broadcom Inc. will post 37.39 EPS for the current year.
Broadcom Increases Dividend
The firm also recently declared a quarterly dividend, which was paid on Friday, December 30th. Shareholders of record on Tuesday, December 20th were issued a $4.60 dividend. This represents a $18.40 annualized dividend and a yield of 3.22%. This is a positive change from Broadcom's previous quarterly dividend of $4.10. The ex-dividend date was Monday, December 19th. Broadcom's dividend payout ratio is presently 69.43%.
Analysts Set New Price Targets
Several brokerages have issued reports on AVGO. Mizuho dropped their target price on Broadcom from $725.00 to $700.00 and set a "buy" rating for the company in a research report on Friday, December 9th. Susquehanna Bancshares dropped their target price on Broadcom from $680.00 to $650.00 and set a "positive" rating for the company in a research report on Monday, December 5th. StockNews.com upgraded Broadcom from a "buy" rating to a "strong-buy" rating in a research report on Wednesday, October 5th. Susquehanna dropped their target price on Broadcom from $680.00 to $650.00 in a research report on Monday, December 5th. Finally, Bank of America boosted their target price on Broadcom from $625.00 to $650.00 in a research report on Friday, December 9th. Two investment analysts have rated the stock with a hold rating, sixteen have issued a buy rating and one has issued a strong buy rating to the stock. Based on data from MarketBeat.com, Broadcom has a consensus rating of "Moderate Buy" and an average target price of $667.21.
Broadcom Profile
Broadcom, Inc is a global technology company, which designs, develops, and supplies semiconductor and infrastructure software solutions. It operates through the Semiconductor Solutions and Infrastructure Software segments. The Semiconductor Solutions segment manages movement of data in data center, telecom, enterprise, and embedded networking applications.
Get a free copy of the StockNews.com research report on Broadcom (AVGO)
Is Canadian Solar Too Hot to Handle?
UiPath is the Blue-Collar AI Platform to Watch in 2023
CVS Health is Growing into an Integrated Healthcare Organization
Is C3.ai Stock a ChatGPT Artificial Intelligence Play?
NVIDIA Outlook Improving: Watchlist Candidate for 2023
Want to see what other hedge funds are holding AVGO? Visit HoldingsChannel.com to get the latest 13F filings and insider trades for Broadcom Inc. (NASDAQ:AVGO – Get Rating).
Receive News & Ratings for Broadcom Daily - Enter your email address below to receive a concise daily summary of the latest news and analysts' ratings for Broadcom and related companies with MarketBeat.com's FREE daily email newsletter.
Advisor OS LLC Has $645,000 Position in Edwards Lifesciences Co. (NYSE:EW)
International Business Machines Co. (NYSE:IBM) Shares Sold by Asset Management One Co. Ltd.
Daily Ratings & News for Broadcom
Complete the form below to receive the latest headlines and analysts' recommendations for Broadcom with our free daily email newsletter:


Attackers in the Middle East are increasingly adding a new tool into their toolbox, according to Symantec.
Researchers at the security firm say that a remote access tool known as njRAT is gaining popularity among attack groups in the region. For the most part, njRAT appears to be used for ordinary cybercrime, however it has also been spotted on government systems in the region. It has only been publicly available since June of 2013, but it may have been developed and distributed privately as early as 2012, according to Symantec.
In terms of capabilities, njRAT is similar to most other remote access tools (RATs). What distinguishes it is that it is developed and supported by Arabic speakers and has therefore become popular among attackers in the region, Symantec noted.
According to Symantec, njRAT can download and execute additional malware, execute shell commands, read and write registry keys and capture screenshots. It can also log keystrokes and spy on webcams. It spreads using infected USB keys and networked drives.
"The main reason for njRAT's popularity in the Middle East and North Africa is a large online community providing support in the form of instructions and tutorials for the malware's development," according to Symantec's Security Response Team. "The malware's author also appears to hail from the region. njRAT appears to have been written by a Kuwait-based individual who uses the Twitter handle @njq8. The account has been used to provide updates on when new versions of the malware are available to download."
The majority of the command-and-control server IP addresses were traced to ADSL lines, indicating that most of the attackers using the malware could be home users in the Middle East, according to the firm. So far, some 24,000 computers have been found to be infected worldwide, and 542 command-and-control server domain names have been discovered. Nearly 80 percent of the C&C servers were located in the Middle East and North Africa, including Saudi Arabia, Iraq and Egypt.
Symantec has identified 487 groups of attackers using njRAT. The attacks appear to have a variety of motivations, from hacktivism to simple information theft. One such group is the S.K.Y.P.E/Tagged group, which has C&C servers hosted in Egypt and Algeria and uses a screensaver hosted on the file sharing site ge.tt to infect users. When victims download the compressed .rar file with the screensaver, they get an executable containing njRAT.
"The S.K.Y.P.E/Tagged group uses two C&C servers: njratmoony.no-ip.biz and njr.no-ip.biz," according to Symantec. 'The number of newly infected computers reporting to both servers spiked in October and November of 2012."
The malware has also been spotted being used by pro-Syrian government attackers in cyber-attacks on the opposition. According to a report by the Electronic Frontier Foundation and the Citizen Lab, the malware exfiltrates data to a command-and-control server at hacker1987.zapto.org, which resolves to 46.213.0.220, which is also on the Syriatel Mobile network.
"As large numbers of Middle Eastern attackers continue to use njRAT due to its accessibility, Symantec expects that they will try to find new ways of obfuscating the malware to evade detection by antivirus software," the Security Response Team continued. "They are likely to continue to use njRAT since an Arabic speaking community and its Arabic author (continues) to provide support for the malware. The more advanced threat actors, such as hacker groups, may continue to use njRAT for targeted attacks in the short term."