text:
Privacy Policies for Small Businesses
Privacy Policies for Small Businesses ...
OneTrust Blog / Privacy Policies for Small Businesses  Privacy Policies for Small Businesses
Growing businesses count on a relatively small group of people to accomplish many tasks — especially when compared to large, established businesses. Organizations with limited resources must carefully manage their team's bandwidth to continue driving towards ambitious company goals while avoiding burnout.
Under these circumstances, staying on top of the fast-changing privacy landscape can be challenging.
Many organizations are already required to comply with the European Union General Data Protection Regulation (GDPR) and California's California Consumer Privacy Act (CCPA). If neither of these applies to you yet, know that 15 states are considering similar laws in 2022.
If you run a small business, there's no doubt you need a privacy policy published on your website. But implementing a small business privacy policy isn't a one-off project. Your organization has an obligation to keep it up-to-date when regulations, internal processes, or data-related activities change.
Growing organizations with limited resources need a cost-effective, low-maintenance solution for their privacy policies.
Rather than starting from scratch, maturing organizations are turning to automation-driven processes with embedded regulatory intelligence. This approach significantly increases a team's capacity to keep up with privacy compliance requirements without losing sight of their big-picture goals.
Updating a Small Business Privacy Policy
Most small businesses keep their privacy policies up-to-date through manual efforts — if at all.
Depending on your organization's structure, the process requires meetings with multiple stakeholders, including marketing, website, operations, legal, and privacy teams.
The privacy team (or those responsible for maintaining the privacy policy) will need to monitor and identify incoming regulatory changes affecting the organization. They'll need to call a meeting with the department heads impacted by these changes and develop a plan to modify the privacy policy — and possibly review and revise any internal processes related to the handling of personal data.
Once drafted, the new privacy policy will need a legal review and final sign-off from the company's leadership team. Finally, the marketing and development team will need to implement the changes to the website and notify customers of the change, where applicable.
Automating Small Business Privacy Policy Updates
Coordinating privacy policy updates is complex, especially when you have limited resources. That's where automation comes in.
Automating policy updates is the best solution for busy teams.
This is true if a company hasn't yet grown to a size that justifies hiring dedicated privacy staff. But it also applies to larger organizations seeking to create scalable workflows that create cohesion across the policy lifecycle from implementation through enforcement.
Starting from scratch isn't the most efficient approach.
Working with preconfigured templates and workflows helps get automated privacy policy management off the ground quickly and effectively. Because the overall effort requires cross-functional input, working with a tool that connects the dots across teams saves time — and makes it easy to get started.
And, if your team can tap into an existing network of regulatory intelligence, you can gain confidence that your organization is capable of effectively managing compliance risk.
Automate Your Data Map
Creating and updating compliant small business privacy policies requires an initial foundational effort: Building a data map.
Frequently, organizationally-held data is fragmented across sources, formats, and locations. This makes a manual effort to create a data map nearly impossible to justify. And since privacy policy compliance isn't optional, teams need to find a way to make it manageable.
Using automation to create your data map is the most sustainable solution. It enables you to holistically understand how your organization processes data, making your privacy policy maintenance efforts a more straightforward endeavor.
Once equipped with your automated data map as a foundation, you can issue revised internal and external privacy policies as your processes evolve. Then, you can auto-publish the updates to your website, pulling from pre-built templates to streamline the process from start to finish.
Enforcing internal policies as they evolve is the final step.
Based on the procedures you have enforced, integrations with your data lakes will help ensure authorized stakeholders can access the data they need. It will gate sensitive data from unauthorized access, enforce data retention policies, and much more.
Automation can also support this effort by flagging when a policy is violated based on activities within your data map.
Build Long-term Defensibility for your Growing Business
OneTrust's suite of privacy automation tools helps small businesses to build long-term defensibility through an effective privacy program. Our products provide built-in regulatory intelligence and help growing companies maintain up-to-date privacy policies through automation.
OneTrust enables you to free your team from privacy assessments and rights requests. We automate data discovery, privacy rights fulfillment, incident response, and policy enforcement.
Find out how OneTrust can support your growing business. Start building your privacy program today.
Subscribe to our newsletter for the latest news on privacy, security, and trust.
cybersecurity awareness m... cybersecurit... cybersecurity awa...
Strengthen your cybersecurity management policy with the human firewall
GRC GRC GRC
6 Questions, 2 InfoSec Directors: Your Policy Management Answers
compliance compliance compliance
Policy Attestation: If You Can't Measure It, You Can't Manage It
Addressing UK app Code of Practice requirements with OneTrust
Ultimate guide to the EU CSRD ESG regulation for businesses
Continuous improvement: The leading indicator for successful compliance programs
Build trust, promote your program in the Third-Party Risk Exchange
Building trust in a zero trust world
Consent management by the numbers: 2022 DMA report summary
Navigating the California Privacy Rights Act as a HIPAA-compliant business
US state privacy bills on the horizon in 2023


text:
Disabled fans to benefit at Penicuik
Monday October 22nd 2018
Penicuik Athletic, photo by Jim Dick
Penicuik Athletic is planning to introduce a viewing platform for disabled fans after switching leagues.
The football club moved from the East Region of the Scottish Junior Football Association to the East of Scotland Football League at the start of the season.
They were one of 24 clubs to make the move to the sixth tier of the Scottish football pyramid.
Now the club have applied for planning permission to create new changing facilities, toilets and a raised viewing platform at their ground at Penicuik Park in the town.
The club currently rent the playing pitch, pavilion and public toilet block at the park from Midlothian Council.
But they said that as part of the football league regulations they now needed to upgrade the facilities on offer.
And it is required to have toilet facilities within the perimeter of the grounds, while the public block lies outside the boundary.
The club have applied for planning permission for a temporary cabin-style facility which would have changing facilities for officials and players, public toilets and a raised viewing platform for disabled fans to access.

redpajama_set_name: RedPajamaCommonCrawl


Enterprise Technology Pvt Ltd provides IP-based Surveillance solutions to Sri Lanka. The video surveillance market is booming, driven by increased public and private security concerns, as well as a technology shift. The transition to network video is a reality as customers take advantage of flexible, industry standard systems for security and video surveillance. Network video provides users, particularly in the security surveillance industry, with many advantages over traditional analog CCTV (closed-circuit television) systems. As the network camera and the video encoder are computer-based equipment, they have capabilities that cannot be matched by an analog CCTV camera. As security management over the IP network expands and intelligence capabilities move out to network cameras, systems can scale much more easily. This move to open systems empowers a much more productive and cost-effective means of surveillance than was ever possible.
IP network video products provide an easy way to capture and distribute high-quality video over any network or the Internet. The video can be stored at remote locations for convenience and security, and the information can be transported over the LAN or Internet.
A fully integrated IP network video system can be used for a multitude of applications simultaneously: for instance, access control, building management, point-of-sales systems, ATMs, as well as fire, intruder and visitor management.
You can choose exactly what you need today, and scale the system at any time to meet your growing needs. New technologies, additional cameras, and extra storage capacity can all be easily added as required, thanks to strict adherence to industry standards.
Based on open standards, IP network video products run on networks. Using standard PC server hardware rather than proprietary equipment such as DVRs radically reduces management and equipment costs, particularly for larger systems where storage and servers are a significant portion of the total solution cost.
These days, a massive amount video is being recorded, but never watched or reviewed due to lack of time. As a result, events and activities are missed, and suspicious behaviors remain unnoticed. With network video, intelligence has been brought into the camera itself.


Like bumblebees buzzing around a hive, you will see the yellow wrapped Northwest Landscaping vehicles busy at work beautifying many large corporate campuses in the Seattle area, including the ginormous Microsoft campus in Redmond. The well branded, unique yellow color of Northwest Landscaping Services (NLS) lets those who encounter NLS workers know, "yes, you belong here".
Hundreds of these yellow wrapped NLS vehicles are on the road every day creating millions of impressions for their business. In addition, the fleet color and graphics create a professional impression and provide assurance to those who see the vehicles on the premises while their crews are at work - cutting, pruning, blowing, planting, and more.
At one time, NLS was painting all their white vans and trucks yellow. They would then add the final branding with vinyl graphics. Take a look at our post on NLS Ford F-150 warp to learn more about the advantage of a vinyl wrap vs paint to brand a vehicle or fleet.


Sometimes I paint in order to liberate the pent-up emotions from months or days or years ago. Sometimes I paint because I have nothing to say and I just need to paint. Sometimes I have this feeling that something has taken control of my hands and the energy needs to be released with brush on canvas. Sometimes I hate what I paint and I get frustrated and end up painting nothing.
My intention in creating my pieces is not to reinvent the wheel, nor to find immortality. I paint because I love the smell of fresh paint. Because I love the wine and rum that tend to accompany the work hours. Because I love the smell of cigar smoke in my studio. I paint to meet the challenge of reinventing reality in each new work, of having the eyes and faces of my subjects be the ones to observe the viewer. I seek that my brush strokes do not hold fear, that they are free-flowing, allowing the paint and brush run freely on the canvas.
Abraham's life has been a journey full of colorful experiences of all kinds.
From playing in bands to karate instructor. Abraham has had a multiple of rich experiences which he draws upon when creating his works. A few years spent traveling and working with a circus allowed him the opportunity to travel and meet people from all over the world. This instilled in him a passion for discovering new horizons which in time developed into deep artistic talent.
With uninhibited brushstrokes, Abraham's art lies between abstract and figurative.
His artist's eye, a natural sense of form and balance, and a unique voice give each piece a soul all its own.
Today as a full-time professional artist, Abraham works with galleries and collectors in the US,Europe, Latin America and Asia.
His story has been published in several magazines and newspapers including Forbes Mexico and USA today.


text:
SLC26 transporters and the inhibitory control of pancreatic ductal bicarbonate secretion
P. Hegyi, Z. Rakonczay, L. Tiszlavicz, A. Varró, A. Tóth, Gábor Rácz, G. Varga, Michael A. Gray, Barry E. Argent
SLC26 anion exchangers (probably SLC26A3 and SLC26A6) are expressed on the apical membrane of pancreatic duct cells and play a key role in HCO 3 - secretion; a process that is inhibited by the neuropeptide, substance P (SP). SP had no effect on basolateral HCO 3 - transporters in the duct cell or on CFTR Cl- channels, but inhibited a Cl--dependent HCO3 - efflux step on the apical membrane. In microperfused ducts, luminal H 2DIDS (0.5 mM) caused intracellular pH to alkalinize (consistent with inhibition of HCO3 - efflux) and, like SP, inhibited HCO3 - secretion. SP did not reduce HCO3 - secretion further when H2DIDS was applied to the duct lumen, suggesting that SP and H2DIDS inhibit the same transporter on the apical membrane. As SLC26A6 is DIDS-sensitive, this isoform is the likely target for SP. The inhibitory effect of SP was mimicked by phorbol 12,13-dibutyrate (PDBu), an activator of protein kinase C (PKC). Moreover, bisindolylmaleimide, a blocker of PKC, relieved the inhibitory effect of both SP and PDBu on HCO3 - secretion. Western blot analysis revealed that guinea pig pancreatic ducts express the α, β1, δ, ε, η, θ, ζ and μ isoforms of PKC. We conclude that PKC is a negative regulator of SLC26 activity in pancreatic duct cells.
Novartis Foundation Symposium
Protein Kinase C
Pancreatic Ducts
Phorbol 12,13-Dibutyrate
4,4'-Diisothiocyanostilbene-2,2'-Disulfonic Acid
Hegyi, P., Rakonczay, Z., Tiszlavicz, L., Varró, A., Tóth, A., Rácz, G., ... Argent, B. E. (2006). SLC26 transporters and the inhibitory control of pancreatic ductal bicarbonate secretion. In Novartis Foundation Symposium (Vol. 273, pp. 164-173). (Novartis Foundation Symposium; Vol. 273).
SLC26 transporters and the inhibitory control of pancreatic ductal bicarbonate secretion. / Hegyi, P.; Rakonczay, Z.; Tiszlavicz, L.; Varró, A.; Tóth, A.; Rácz, Gábor; Varga, G.; Gray, Michael A.; Argent, Barry E.
Novartis Foundation Symposium. Vol. 273 2006. p. 164-173 (Novartis Foundation Symposium; Vol. 273).
Hegyi, P, Rakonczay, Z, Tiszlavicz, L, Varró, A, Tóth, A, Rácz, G, Varga, G, Gray, MA & Argent, BE 2006, SLC26 transporters and the inhibitory control of pancreatic ductal bicarbonate secretion. in Novartis Foundation Symposium. vol. 273, Novartis Foundation Symposium, vol. 273, pp. 164-173.
Hegyi P, Rakonczay Z, Tiszlavicz L, Varró A, Tóth A, Rácz G et al. SLC26 transporters and the inhibitory control of pancreatic ductal bicarbonate secretion. In Novartis Foundation Symposium. Vol. 273. 2006. p. 164-173. (Novartis Foundation Symposium).
Hegyi, P. ; Rakonczay, Z. ; Tiszlavicz, L. ; Varró, A. ; Tóth, A. ; Rácz, Gábor ; Varga, G. ; Gray, Michael A. ; Argent, Barry E. / SLC26 transporters and the inhibitory control of pancreatic ductal bicarbonate secretion. Novartis Foundation Symposium. Vol. 273 2006. pp. 164-173 (Novartis Foundation Symposium).
@inproceedings{a573791fd85b44f08630580192f88f03,
title = "SLC26 transporters and the inhibitory control of pancreatic ductal bicarbonate secretion",
abstract = "SLC26 anion exchangers (probably SLC26A3 and SLC26A6) are expressed on the apical membrane of pancreatic duct cells and play a key role in HCO 3 - secretion; a process that is inhibited by the neuropeptide, substance P (SP). SP had no effect on basolateral HCO 3 - transporters in the duct cell or on CFTR Cl- channels, but inhibited a Cl--dependent HCO3 - efflux step on the apical membrane. In microperfused ducts, luminal H 2DIDS (0.5 mM) caused intracellular pH to alkalinize (consistent with inhibition of HCO3 - efflux) and, like SP, inhibited HCO3 - secretion. SP did not reduce HCO3 - secretion further when H2DIDS was applied to the duct lumen, suggesting that SP and H2DIDS inhibit the same transporter on the apical membrane. As SLC26A6 is DIDS-sensitive, this isoform is the likely target for SP. The inhibitory effect of SP was mimicked by phorbol 12,13-dibutyrate (PDBu), an activator of protein kinase C (PKC). Moreover, bisindolylmaleimide, a blocker of PKC, relieved the inhibitory effect of both SP and PDBu on HCO3 - secretion. Western blot analysis revealed that guinea pig pancreatic ducts express the α, β1, δ, ε, η, θ, ζ and μ isoforms of PKC. We conclude that PKC is a negative regulator of SLC26 activity in pancreatic duct cells.",
author = "P. Hegyi and Z. Rakonczay and L. Tiszlavicz and A. Varr{\'o} and A. T{\'o}th and G{\'a}bor R{\'a}cz and G. Varga and Gray, {Michael A.} and Argent, {Barry E.}",
series = "Novartis Foundation Symposium",
booktitle = "Novartis Foundation Symposium",
T1 - SLC26 transporters and the inhibitory control of pancreatic ductal bicarbonate secretion
AU - Hegyi, P.
AU - Rakonczay, Z.
AU - Tiszlavicz, L.
AU - Varró, A.
AU - Tóth, A.
AU - Rácz, Gábor
AU - Varga, G.
AU - Gray, Michael A.
AU - Argent, Barry E.
N2 - SLC26 anion exchangers (probably SLC26A3 and SLC26A6) are expressed on the apical membrane of pancreatic duct cells and play a key role in HCO 3 - secretion; a process that is inhibited by the neuropeptide, substance P (SP). SP had no effect on basolateral HCO 3 - transporters in the duct cell or on CFTR Cl- channels, but inhibited a Cl--dependent HCO3 - efflux step on the apical membrane. In microperfused ducts, luminal H 2DIDS (0.5 mM) caused intracellular pH to alkalinize (consistent with inhibition of HCO3 - efflux) and, like SP, inhibited HCO3 - secretion. SP did not reduce HCO3 - secretion further when H2DIDS was applied to the duct lumen, suggesting that SP and H2DIDS inhibit the same transporter on the apical membrane. As SLC26A6 is DIDS-sensitive, this isoform is the likely target for SP. The inhibitory effect of SP was mimicked by phorbol 12,13-dibutyrate (PDBu), an activator of protein kinase C (PKC). Moreover, bisindolylmaleimide, a blocker of PKC, relieved the inhibitory effect of both SP and PDBu on HCO3 - secretion. Western blot analysis revealed that guinea pig pancreatic ducts express the α, β1, δ, ε, η, θ, ζ and μ isoforms of PKC. We conclude that PKC is a negative regulator of SLC26 activity in pancreatic duct cells.
AB - SLC26 anion exchangers (probably SLC26A3 and SLC26A6) are expressed on the apical membrane of pancreatic duct cells and play a key role in HCO 3 - secretion; a process that is inhibited by the neuropeptide, substance P (SP). SP had no effect on basolateral HCO 3 - transporters in the duct cell or on CFTR Cl- channels, but inhibited a Cl--dependent HCO3 - efflux step on the apical membrane. In microperfused ducts, luminal H 2DIDS (0.5 mM) caused intracellular pH to alkalinize (consistent with inhibition of HCO3 - efflux) and, like SP, inhibited HCO3 - secretion. SP did not reduce HCO3 - secretion further when H2DIDS was applied to the duct lumen, suggesting that SP and H2DIDS inhibit the same transporter on the apical membrane. As SLC26A6 is DIDS-sensitive, this isoform is the likely target for SP. The inhibitory effect of SP was mimicked by phorbol 12,13-dibutyrate (PDBu), an activator of protein kinase C (PKC). Moreover, bisindolylmaleimide, a blocker of PKC, relieved the inhibitory effect of both SP and PDBu on HCO3 - secretion. Western blot analysis revealed that guinea pig pancreatic ducts express the α, β1, δ, ε, η, θ, ζ and μ isoforms of PKC. We conclude that PKC is a negative regulator of SLC26 activity in pancreatic duct cells.
T3 - Novartis Foundation Symposium
BT - Novartis Foundation Symposium


text:
Llandudno PopMaster contestant discovers opponent is his second cousin
A LLANDUNO resident appeared on the BBC Radio 2 quiz PopMaster last week without realising that his opponent was, in fact, a distant relative of his.
Tim Hayman, a courier delivering electrical products across North Wales, was beaten 18-9 on the show by Ian Butterfield from Doncaster on Wednesday, January 19.
But shortly after the quiz ended, Tim received a phone call from his uncle telling him that he and Ian are second cousins.
Tim, 50, has since got back in touch with Ian, and the two plan to soon meet up in person for the first time.
The story also got a mention by PopMaster host Ken Bruce on his show the following day.
Tim, who is also a self-taught guitarist, said: "There's a PopMaster Facebook group where you post about when you're going on the show, so I had seen my opponent for that day on there, but never thought we were related.
"So I went on the show, played against Ian, and then 10 minutes later, my uncle David from Nottingham phoned and said: 'You're actually related; the pair of you'. It turned out our mums are cousins, which makes us second cousins!
"From then on, we've kept in touch. It's a small world; it was just a complete coincidence. It got a mention on the show the following day, because Ian had emailed in and told the story to Ken.
"I've never met him before in my life! All being well in the not too distant future, we'll have a family reunion as well."
Though he was disappointed to lose to Ian, Tim admitted that this pleasant surprise took the edge off the defeat somewhat.
Since the show, they have been busy sharing family memories, and have bonded over their mutual love of music.
Tim added: "I enjoyed the experience. It was a bit nerve-wracking, and I was disappointed that I lost, but obviously, this softened the blow slightly.
"I messaged Ian congratulating him on his win, and then said: 'By the way, we're related!' We put a few names of old relatives who've been and gone in the mix and just took it from there.
"He's a big music fan and so am I, so we seem to have quite a bit in common. We're just communicating over Facebook at the moment, sharing old photos.
"His sister attended my mum and dad's wedding back in the 1960s, so I've been in touch with my mum and she's got the old pictures out.
"He was a bit shocked; it was a bit of shock to both of us, to be honest, but pleased that we found each other after all this time."
You can listen back to Tim and Ian's PopMaster appearance at: www.bbc.co.uk/sounds/play/m0013jl5 (starts at 58 minutes).


Treat yourself to these custom letterpress monogram note cards for a classic way to keep in touch with those you care about. They would also make perfect gifts for Christmas, Mother's Day, work as wedding thank you cards or as a gift for the newlywed couple.
These note cards are printed one at a time on my antique letterpress. There may be variations in inking and printing as a result. Letterpress leaves an amazing impression in the paper that you can see and feel.
Production time is 2-3 weeks.


text:
Tag Archives: imprint: MxM Bookmark
M/M romance, The Thousand Smiles of Nicholas Goring
Book 3 of the Butterfly Hunter Trilogy
Blurb: Dave and Nicholas, married for seven years now, are happily settled together – but as an Australian prime minister once observed, "Life wasn't meant to be easy." An unexpected threat to their beloved waterhole forces Dave to try asserting his unofficial custodianship of the Dreamtime site, and a visit from Nicholas's nephew Robin doesn't help as he brings his own surprises. And there's always the question of Nicholas's health hanging over their heads …
Genre: male-male romance; contemporary; established relationship; novel
Nomination in the M/M Romance Group Member's Choice Awards 2014 on Goodreads, in the category Best Established Couple.
An Honourable Mention in the Rainbow Awards 2015.
Click here for an excerpt of text, and here for the reviews.
I've received queries! So, if you are concerned about how this series ends, and don't mind spoilers, you can click here for a bit of info.
Amazon US, Amazon UK, Amazon AU, Amazon DE, and other Amazon marketplaces worldwide
and The Ripped Bodice!
Also available in French from MxM Bookmark:
Amazon FR (Kindle), Amazon FR (paperback) and other Amazon marketplaces
First published by Manifold Press on 1 November 2014. Re-released by LIBRAtiger on 15 September 2018.
content: novelformat: ebookformat: paperbackheat level: 4imprint: LIBRAtigerimprint: MxM Bookmarkother: MOST POPULAR!status: publishedtranslation: French
A Threefold Cord, M/M romance
Blurb: Grae Edwards and his co–stars Chris Willoughby and Ben Clyde work together well. Maybe they even have a chemistry. Certainly they are friends and Grae is tempted to ask for more … After the beautiful tart Chris has the temerity to turn him down, Grae settles into a comfortable loving relationship with the more chivalrous Ben. But the idea of Chris never quite goes away – and when Chris finally suggests the three of them spend a night together, Grae glimpses a solution he hardly dares hope for.
Genre: male-male-male romance; contemporary; threesome; novel
An Honourable Mention and a Finalist in the Gay Contemporary Romance category of the Rainbow Awards 2014.
Nomination and a Finalist in the M/M Romance Group Member's Choice Awards 2014 on Goodreads, in the category Best Polyamorous (theme).
and The Bookshop Darlinghurst!
Available in audiobook format, narrated by Christopher Preece, from:
Also available in French as "Nous" from MxM Bookmark:
Amazon FR, and other Amazon marketplaces
First published on 1 May 2014 by Manifold Press. Re-released by LIBRAtiger on 1 June 2018.
content: novelformat: audiobookformat: ebookformat: paperbackheat level: 5imprint: LIBRAtigerimprint: MxM Bookmarkother: MOST POPULAR!status: publishedtranslation: French
M/M romance, Of Dreams and Ceremonies
Blurb: It seemed like a great idea at the time… Aussie Dave Taylor has followed Nicholas Goring to England, and the lovers have become engaged. But now Dave has to cope with living in a mansion full of family and servants, making wedding plans, getting his head around visa applications, and wondering why on earth he'd ever want to wear a 'mourning suit'. He's not sure if it will prove any easier, but right now Dave would love to just skip ahead to the honeymoon…
Genre: male-male romance; contemporary; wedding; novel
Available in French as "La Ceremonie" from:
Butterfly Hunter, M/M romance
Blurb: It started as a simple assignment for Aussie bush guide Dave Taylor – escort a lone Englishman in quest of an unknown species of butterfly. However Nicholas Goring is no ordinary tourist, his search is far from straightforward, and it's starting to look as if the butterflies don't want to be found. As Dave teaches Nicholas everything he needs to survive in the Outback he discovers that he too has quite a bit to learn – and that very often the best way to locate something really important is just not to want to find it…
Genre: male-male romance; contemporary; travel quest; novel
Click here for an excerpt of text, and here for reviews.
Honourable Mention in the 2012 Rainbow Awards, in the category One Perfect Score.
Nominations in the M/M Romance Group Member's Choice Awards 2012 on Goodreads, in the following categories:
Best Couple/MCs (main characters)
Best Story That Should/Must Have a Sequel
Best Overall Book of 2012
Equal first in Feliz's Top Books for 2012 in the Guest Reviewer's Top Picks for 2012 onReviews by Jessewave.
One of Mandy's 2012 Favorites in the Reviewers of Hearts' 2012 Favorite Lists onHearts on Fire Reviews.
Nomination in the M/M Romance Group Member's Choice Awards 2013 on Goodreads, in the category Favorite All Time M/M Romance Book.
Nomination in the M/M Romance Group Member's Choice Awards 2014 on Goodreads, in the category Favorite All-Time Series.
Selected as a Prism Book Alliance Recommended Read in February 2015.
Nominated in the M/M Romance Group Member's Choice Awards 2015 on Goodreads, in the category Favorite All-Time M/M Romance.
Recommended for someone new to the genre as Contemporary – Sweet by Kaje Harper in Rainbow Gold Reviews interview in February 2016.
Available in audiobook format, narrated by Ray Cross, from:
and iTunes US
Available in French as "Chasseur de Papillons" from:
First published by Manifold Press on 1 August 2012. Slightly revised edition published by LIBRAtiger on 15 September 2018.
"name": "Butterfly Hunter", "author": { "@type": "Person", "name": "Julie Bozza" }, "image": "https://libra-tiger.com/wp-content/uploads/2012/09/BUTTERFLY-HUNTER-new.jpg", "description": "It started as a simple assignment for Aussie bush guide Dave Taylor – escort a lone Englishman in quest of an unknown species of butterfly. However Nicholas Goring is no ordinary tourist, his search is far from straightforward, and it's starting to look as if the butterflies don't want to be found. As Dave teaches Nicholas everything he needs to survive in the Outback he discovers that he too has quite a bit to learn – and that very often the best way to locate something really important is just not to want to find it ...",
"bookFormat" : "EBook", "isbn": "9781908312099", "comment": "AISN B00BD9RG9A",
"award": "Honourable Mention, Rainbow Awards 2012", "character": [ { "@type": "Person", "name": "Dave Taylor" }, { "@type": "Person", "name": "Nicholas Goring" } ], "contentLocation": "Queensland, Australia", "copyrightHolder": { "@type": "Person", "name": "Julie Bozza" }, "copyrightYear": "2012", "datePublished": "2012-08-01", "genre": "male-male romance, contemporary, travel quest",
"isPartOf": { "@type": [ "Book", "PublicationVolume" ], "datePublished": "2014", "name": "The Butterfly Hunter Trilogy", "volumeNumber": "1", "author": { "@type": "Person", "name": "Julie Bozza" } },
"inLanguage": "en-GB", "isAccessibleForFree": "false", "isFamilyFriendly": "false", "keywords": "gay, bisexual, australia, quest, butterflies, outback, romance", "publisher": { "@type": "Organization", "name": "Manifold Press" }, "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4", "reviewCount": "689" }, "review": [ { "@type": "Review", "author": "Lucy", "datePublished": "2012-09-04", "name": "Hearts on Fire Reviews", "reviewBody": "How very lovely this softly flowing, sweet story is. It is extremely character driven (with the butterflies in question needing to be considered a character as well), with a setting that is at once beautiful and dangerous. It is written in such a way that it draws you in without you realizing, and I ended up reading the whole thing in one sitting because I wanted to see what happened.", "reviewRating": { "@type": "Rating", "ratingValue": "4.5" } }, { "@type": "Review", "author": "Feliz", "datePublished": "2012-08-27", "name": "Gay Book Reviews", "reviewBody": "This book was enchanting, with finely drawn, adorable characters and a delicate, tender love story that was to die for. ... The characters are the backbone to this story. Both Dave and Nicholas were lonely souls (though otherwise fully capable of looking after themselves). The increasingly intense emotions between them never took away from their dignity or their masculinity. ... In fact, it is almost as if the land was a character in and of itself, and it lends this book a solid reality as well as a hint of magic with the mystery that is the Dreamtime, interwoven strong and palpable with the storyline in a respectful and unobtrusive way. But the greatest lure of this book lay in the writing itself, which was exquisite.", "reviewRating": { "@type": "Rating", "ratingValue": "5" } } ], "url": "https://libra-tiger.com/category/m-m-romance/butterfly-hunter/" }


text:
#include <stdarg.h>
#include <stdlib.h>
#include "sqlite.h"
#include "sql.h"

#define SQL_NOT_NULL_MASK SQL_NOT_NULL
#define SQL_AUTOINCREMENT_MASK SQL_AUTOINCREMENT
#define SQL_PRIMARY_KEY_MASK SQL_PRIMARY_KEY
#define SQL_UNIQUE_MASK SQL_UNIQUE(0)

static int sql_stmt_vinit(sqlite3_stmt **stmt, sqlite3 *db, char *sql, va_list args) {
  *stmt = NULL;
  char *formatted_sql = sqlite3_vmprintf(sql, args);

  if (formatted_sql == NULL) {
    return SQLITE_NOMEM;
  }

  int result = sqlite3_prepare_v2(db, formatted_sql, -1, stmt, NULL);
  sqlite3_free(formatted_sql);
  return result;
}

static int sql_stmt_init(sqlite3_stmt **stmt, sqlite3 *db, char *sql, ...) {
  va_list args;
  va_start(args, sql);
  int res = sql_stmt_vinit(stmt, db, sql, args);
  va_end(args);
  return res;
}

static int sql_stmt_bind(sqlite3_stmt *stmt, const value_t *values, const int nValues) {
  int result = sqlite3_reset(stmt);
  if (result != SQLITE_OK) {
    return result;
  }
  for (int cIx = 0; cIx < nValues; cIx++) {
    switch (values[cIx].type) {
      default:
        break;
      case VALUE_NULL:
        result = sqlite3_bind_null(stmt, cIx + 1);
        break;
      case VALUE_FUNC:
      case VALUE_TEXT:
        result = sqlite3_bind_text(stmt, cIx + 1, VALUE_AS_TEXT(values[cIx]), -1, SQLITE_STATIC);
        break;
      case VALUE_DOUBLE:
        result = sqlite3_bind_double(stmt, cIx + 1, VALUE_AS_DOUBLE(values[cIx]));
        break;
      case VALUE_INTEGER:
        result = sqlite3_bind_int(stmt, cIx + 1, VALUE_AS_INT(values[cIx]));
        break;
    }
    if (result != SQLITE_OK) {
      return result;
    }
  }

  return result;
}

static void sql_stmt_destroy(sqlite3_stmt *stmt) {
  if (stmt != NULL) {
    sqlite3_finalize(stmt);
  }
}

static int sql_stmt_exec(sqlite3 *db, sql_callback row, sql_callback nodata, void *data, char *sql, va_list args) {
  sqlite3_stmt *stmt = NULL;
  int result = sql_stmt_vinit(&stmt, db, sql, args);

  if (result != SQLITE_OK) {
    return result;
  }

  int stmt_res = sqlite3_step(stmt);
  if (stmt_res == SQLITE_DONE) {
    if (nodata != NULL) {
      int callback_res = nodata(db, stmt, data);
      if (callback_res != SQLITE_ABORT) {
        stmt_res = callback_res;
      }
    }
  } else {
    if (row == NULL) {
      while (stmt_res == SQLITE_ROW) {
        stmt_res = sqlite3_step(stmt);
      }
    } else {
      while (stmt_res == SQLITE_ROW) {
        int callback_res = row(db, stmt, data);
        if (callback_res == SQLITE_ABORT) {
          stmt_res = SQLITE_DONE;
        } else if (callback_res != SQLITE_OK) {
          stmt_res = callback_res;
        } else {
          stmt_res = sqlite3_step(stmt);
        }
      }
    }
  }

  if (stmt_res != SQLITE_DONE) {
    result = stmt_res;
  }

  sql_stmt_destroy(stmt);
  return result;
}

static int row_string(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  char **out = (char **)data;
  int col_count = sqlite3_column_count(stmt);
  if (col_count > 0) {
    const unsigned char *text = sqlite3_column_text(stmt, 0);
    int length = sqlite3_column_bytes(stmt, 0);
    if (length <= 0) {
      *out = NULL;
    } else {
      *out = (char *)sqlite3_malloc(length + 1);
      if (*out == NULL) {
        return SQLITE_NOMEM;
      }
      memmove(*out, text, (size_t)length + 1);
    }
    return SQLITE_ABORT;
  } else {
    return SQLITE_MISUSE;
  }
}

static int nodata_string(sqlite3 *db, sqlite3_stmt *stmt, void *out) {
  *((char **)out) = NULL;
  return SQLITE_ABORT;
}

int sql_exec_for_string(sqlite3 *db, char **out, char *sql, ...) {
  va_list args;
  va_start(args, sql);
  int result = sql_stmt_exec(db, row_string, nodata_string, out, sql, args);
  va_end(args);
  return result;
}

static int row_int(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  int col_count = sqlite3_column_count(stmt);
  if (col_count > 0) {
    *((int *)data) = sqlite3_column_int(stmt, 0);
    return SQLITE_ABORT;
  } else {
    return SQLITE_MISUSE;
  }
}

static int nodata_int(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  *((int *)data) = 0;
  return SQLITE_ABORT;
}

int sql_exec_for_int(sqlite3 *db, int *out, char *sql, ...) {
  va_list args;
  va_start(args, sql);
  int result = sql_stmt_exec(db, row_int, nodata_int, out, sql, args);
  va_end(args);
  return result;
}

static int row_double(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  int col_count = sqlite3_column_count(stmt);
  if (col_count > 0) {
    *((double *)data) = sqlite3_column_double(stmt, 0);
    return SQLITE_ABORT;
  } else {
    return SQLITE_MISUSE;
  }
}

static int nodata_double(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  *((double *)data) = 0.0;
  return SQLITE_ABORT;
}

int sql_exec_for_double(sqlite3 *db, double *out, char *sql, ...) {
  va_list args;
  va_start(args, sql);
  int result = sql_stmt_exec(db, row_double, nodata_double, out, sql, args);
  va_end(args);
  return result;
}

static int abort_after_first_row(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  return SQLITE_ABORT;
}

int sql_exec(sqlite3 *db, char *sql, ...) {
  va_list args;
  va_start(args, sql);
  int result = sql_stmt_exec(db, abort_after_first_row, NULL, NULL, sql, args);
  va_end(args);
  return result;
}

int sql_exec_all(sqlite3 *db, char *sql, ...) {
  va_list args;
  va_start(args, sql);
  int result = sql_stmt_exec(db, NULL, NULL, NULL, sql, args);
  va_end(args);
  return result;
}

int sql_exec_stmt(sqlite3 *db, sql_callback row, sql_callback nodata, void *data, char *sql, ...) {
  va_list args;
  va_start(args, sql);
  int result = sql_stmt_exec(db, row, nodata, data, sql, args);
  va_end(args);
  return result;
}

static int sql_check_table_exists_nodata(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  *((int *) data) = 0;
  return SQLITE_ABORT;
}

static int sql_check_table_exists_row(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  *((int *) data) = 1;
  return SQLITE_ABORT;
}

int sql_check_table_exists(sqlite3 *db, const char *db_name, const char *table_name, int *exists) {
  int result = sql_exec_stmt(db, sql_check_table_exists_row, sql_check_table_exists_nodata, exists, "PRAGMA \"%w\".table_info(\"%w\")", db_name, table_name);
  if (result != SQLITE_OK) {
    *exists = 0;
  }

  return result;
}

typedef struct {
  int found;
  const char *name;
} column_to_find_t;

static int sql_check_column_exists_row(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  column_to_find_t *c = (column_to_find_t *)data;
  if (sqlite3_strnicmp(c->name, (const char *)sqlite3_column_text(stmt, 1), strlen(c->name) + 1) == 0) {
    c->found = 1;
  }
  return SQLITE_OK;
}

int sql_check_column_exists(sqlite3 *db, const char *db_name, const char *table_name, const char *column_name, int *exists) {
  column_to_find_t c;
  c.found = 0;
  c.name = column_name;
  if (c.name == NULL) {
    return SQLITE_ERROR;
  }

  int result = sql_exec_stmt(
                 db, sql_check_column_exists_row, NULL, &c,
                 "PRAGMA \"%w\".table_info(\"%w\")", db_name, table_name
               );

  *exists = c.found;

  return result;
}

static int sql_count_columns(const table_info_t *table_info) {
  int nColumns = 0;
  const column_info_t *column = table_info->columns;
  while (column->name != NULL) {
    column++;
    nColumns++;
  }
  return nColumns;
}

typedef struct {
  errorstream_t *error;
  int *cols_found;
  int nColumns;
  const table_info_t *table_info;
  int flags;
} check_cols_data;

static int sql_check_cols_row(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  check_cols_data *check = (check_cols_data *)data;
  errorstream_t *error = check->error;
  int *found = check->cols_found;
  int nColumns = check->nColumns;
  const table_info_t *table_info = check->table_info;

  // 0 index
  // 1 name
  // 2 type
  // 3 not null
  // 4 default value
  // 5 primary key
  char *name = (char *)sqlite3_column_text(stmt, 1);
  int index = -1;
  for (int c = 0; c < nColumns; c++) {
    if (sqlite3_strnicmp(table_info->columns[c].name, name, strlen(table_info->columns[c].name) + 1) == 0) {
      index = c;
      break;
    }
  }

  if (index != -1) {
    char *type = (char *)sqlite3_column_text(stmt, 2);
    if (sqlite3_strnicmp(table_info->columns[index].type, type, strlen(table_info->columns[index].type) + 1) != 0) {
      error_append(error, "Column %s.%s has incorrect type (expected: %s, actual: %s)", table_info->name, name, table_info->columns[index].type, type);
    }

    int not_null = sqlite3_column_int(stmt, 3);
    if (not_null != 0 && (table_info->columns[index].flags & SQL_NOT_NULL) == 0) {
      error_append(error, "Column %s.%s should not have 'not null' constraint\n", table_info->name, name);
    } else if (not_null == 0 && table_info->columns[index].flags & SQL_NOT_NULL) {
      error_append(error, "Column %s.%s should have 'not null' constraint", table_info->name, name);
    }

    if ((check->flags & SQL_CHECK_DEFAULT_VALUES) != 0) {
      value_t default_value = table_info->columns[index].default_value;
      if (default_value.type == VALUE_TEXT) {
        char *expected = sqlite3_mprintf("'%s'", VALUE_AS_TEXT(default_value));
        if (sqlite3_column_type(stmt, 4) == SQLITE_NULL) {
          error_append(error, "Column %s.%s has incorrect default value: expected '%s' but was NULL", table_info->name, name, expected);
        } else {
          const char *actual = (const char *)sqlite3_column_text(stmt, 4);
          if (sqlite3_strnicmp(expected, actual, strlen(expected) + 1) != 0) {
            error_append(error, "Column %s.%s has incorrect default value: expected '%s' but was '%s'", table_info->name, name, expected, actual);
          }
        }
        sqlite3_free(expected);
      } else if (default_value.type == VALUE_FUNC) {
        char *expected = sqlite3_mprintf(VALUE_AS_TEXT(default_value));
        if (sqlite3_column_type(stmt, 4) == SQLITE_NULL) {
          error_append(error, "Column %s.%s has incorrect default value: expected '%s' but was NULL", table_info->name, name, expected);
        } else {
          const char *actual = (const char *)sqlite3_column_text(stmt, 4);
          if (sqlite3_strnicmp(expected, actual, strlen(expected) + 1) != 0) {
            error_append(error, "Column %s.%s has incorrect default value: expected '%s' but was '%s'", table_info->name, name, expected, actual);
          }
        }
        sqlite3_free(expected);
      } else if (default_value.type == VALUE_INTEGER) {
        int expected = VALUE_AS_INT(default_value);
        if (sqlite3_column_type(stmt, 4) == SQLITE_NULL) {
          error_append(error, "Column %s.%s has incorrect default value: expected %d but was NULL", table_info->name, name, expected);
        } else {
          int actual = sqlite3_column_int(stmt, 4);
          if (actual != expected) {
            error_append(error, "Column %s.%s has incorrect default value: expected %d but was %d", table_info->name, name, expected, actual);
          }
        }
      } else if (default_value.type == VALUE_DOUBLE) {
        double expected = VALUE_AS_DOUBLE(default_value);
        if (sqlite3_column_type(stmt, 4) == SQLITE_NULL) {
          error_append(error, "Column %s.%s has incorrect default value: expected %f but was NULL", table_info->name, name, expected);
        } else {
          double actual = sqlite3_column_double(stmt, 4);
          if (actual != expected) {
            error_append(error, "Column %s.%s has incorrect default value: expected %f but was %f", table_info->name, name, expected, actual);
          }
        }
      } else if (default_value.type == VALUE_NULL) {
        if (sqlite3_column_type(stmt, 4) != SQLITE_NULL) {
          const char *actual = (const char *)sqlite3_column_text(stmt, 4);
          error_append(error, "Column %s.%s has incorrect default value: expected NULL but was %s", table_info->name, name, actual);
        }
      }
    }

    int pk = sqlite3_column_int(stmt, 5);
    if (pk != 0 && (table_info->columns[index].flags & SQL_PRIMARY_KEY) == 0) {
      error_append(error, "Column %s.%s should not be part of primary key", table_info->name, name);
    } else if (pk == 0 && table_info->columns[index].flags & SQL_PRIMARY_KEY) {
      error_append(error, "Column %s.%s should be part of primary key", table_info->name, name);
    }
    found[index] = 1;
  } else {
    error_append(error, "Redundant column %s.%s", table_info->name, name);
  }

  return SQLITE_OK;
}

static int sql_check_table_schema(sqlite3 *db, const char *db_name, const table_info_t *table_info, int check_flags, errorstream_t *error) {
  int nColumns = sql_count_columns(table_info);
  int *found = (int *)sqlite3_malloc(nColumns * sizeof(int));
  if (found == NULL) {
    return SQLITE_NOMEM;
  }
  memset(found, 0, nColumns * sizeof(int));
  check_cols_data data = { error, found, nColumns, table_info, check_flags };

  int result = sql_exec_stmt(db, sql_check_cols_row, NULL, &data, "PRAGMA \"%w\".table_info(\"%w\")", db_name, table_info->name);

  if (result == SQLITE_OK) {
    for (int i = 0; i < nColumns; i++) {
      if (found[i] == 0) {
        if (error) {
          error_append(error, "Column %s.%s is missing\n", table_info->name, table_info->columns[i].name);
        }
      }
    }
  }

  sqlite3_free(found);

  return result;
}

static int sql_format_missing_row(const char *db_name, const table_info_t *table_info, const value_t *row, errorstream_t *error) {
  int result;
  strbuf_t errmsg;

  result = strbuf_init(&errmsg, 256);
  if (result != SQLITE_OK) {
    goto exit;
  }

  result = strbuf_append(&errmsg, "Table %s.%s is missing row (", db_name, table_info->name);
  if (result != SQLITE_OK) {
    goto exit;
  }

  int nColumns = sql_count_columns(table_info);
  for (int cIx = 0; cIx < nColumns; cIx++) {
    if (cIx > 0) {
      result = strbuf_append(&errmsg, ", ");
      if (result != SQLITE_OK) {
        goto exit;
      }
    }

    switch (row[cIx].type) {
      default:
        break;
      case VALUE_NULL:
        result = strbuf_append(&errmsg, "%s: NULL", table_info->columns[cIx].name);
        break;
      case VALUE_FUNC:
      case VALUE_TEXT:
        result = strbuf_append(&errmsg, "%s: '%s'", table_info->columns[cIx].name, VALUE_AS_TEXT(row[cIx]));
        break;
      case VALUE_DOUBLE:
        result = strbuf_append(&errmsg, "%s: %g", table_info->columns[cIx].name, VALUE_AS_DOUBLE(row[cIx]));
        break;
      case VALUE_INTEGER:
        result = strbuf_append(&errmsg, "%s: %d", table_info->columns[cIx].name, VALUE_AS_INT(row[cIx]));
        break;
    }
    if (result != SQLITE_OK) {
      goto exit;
    }
  }
  result = strbuf_append(&errmsg, ")", table_info->name);
  if (result != SQLITE_OK) {
    goto exit;
  }

  result = error_append(error, "%s", strbuf_data_pointer(&errmsg));

exit:
  strbuf_destroy(&errmsg);
  return result;
}

static int sql_check_data(sqlite3 *db, const char *db_name, const table_info_t *table_info, errorstream_t *error) {
  if (table_info->nRows <= 0) {
    return SQLITE_OK;
  }

  int nColumns = sql_count_columns(table_info);

  int result = SQLITE_OK;
  strbuf_t sql;
  char *query = NULL;
  sqlite3_stmt *stmt = NULL;

  result = strbuf_init(&sql, 4096);
  if (result != SQLITE_OK) {
    goto exit;
  }

  const column_info_t *columns = table_info->columns;
  strbuf_append(&sql, "SELECT * FROM \"%w\".\"%w\" WHERE", db_name, table_info->name);
  for (int i = 0; i < nColumns; i++) {
    if (i > 0) {
      strbuf_append(&sql, " AND");
    }
    strbuf_append(&sql, " \"%w\" IS ?", columns[i].name);
  }
  result = strbuf_data(&sql, &query);

  if (result != SQLITE_OK) {
    goto exit;
  }

  result = sql_stmt_init(&stmt, db, query);
  if (result != SQLITE_OK) {
    goto exit;
  }

  for (size_t rIx = 0; rIx < table_info->nRows; rIx++) {
    const value_t *row = table_info->rows + (rIx * nColumns);
    result = sql_stmt_bind(stmt, row, nColumns);
    if (result != SQLITE_OK) {
      goto exit;
    }

    int step_res = sqlite3_step(stmt);
    if (step_res == SQLITE_ROW) {
      // OK
    } else if (step_res == SQLITE_DONE) {
      if (error) {
        result = sql_format_missing_row(db_name, table_info, row, error);
        if (result != SQLITE_OK) {
          goto exit;
        }
      }
    } else {
      result = step_res;
      goto exit;
    }
  }

exit:
  strbuf_destroy(&sql);
  sql_stmt_destroy(stmt);
  sqlite3_free(query);
  return result;
}

static int sql_format_insert_data(const char *db_name, const table_info_t *table_info, char **query) {
  strbuf_t sql;
  int result = strbuf_init(&sql, 4096);
  if (result != SQLITE_OK) {
    return result;
  }

  int nColumns = sql_count_columns(table_info);
  const column_info_t *columns = table_info->columns;
  result = strbuf_append(&sql, "INSERT OR IGNORE INTO \"%w\".\"%w\" (", db_name, table_info->name);
  if (result != SQLITE_OK) {
    goto exit;
  }
  for (int i = 0; i < nColumns; i++) {
    if (i > 0) {
      result = strbuf_append(&sql, ",\"%w\"", columns[i].name);
    } else {
      result = strbuf_append(&sql, "\"%w\"", columns[i].name);
    }
    if (result != SQLITE_OK) {
      goto exit;
    }
  }
  result = strbuf_append(&sql, ") VALUES (", table_info->name);
  if (result != SQLITE_OK) {
    goto exit;
  }

  for (int i = 0; i < nColumns; i++) {
    if (i > 0) {
      result = strbuf_append(&sql, ",?");
    } else {
      result = strbuf_append(&sql, "?");
    }
    if (result != SQLITE_OK) {
      goto exit;
    }
  }
  result = strbuf_append(&sql, ")");

  if (result == SQLITE_OK) {
    result = strbuf_data(&sql, query);
  }

exit:
  strbuf_destroy(&sql);
  return result;
}

static int sql_insert_data(sqlite3 *db, const char *db_name, const table_info_t *table_info, errorstream_t *error) {
  if (table_info->nRows <= 0) {
    return SQLITE_OK;
  }

  sqlite3_stmt *stmt = NULL;
  int result = SQLITE_OK;
  char *query = NULL;

  result = sql_format_insert_data(db_name, table_info, &query);
  if (result != SQLITE_OK) {
    goto exit;
  }

  result = sql_stmt_init(&stmt, db, query);
  if (result != SQLITE_OK) {
    goto exit;
  }

  int nColumns = sql_count_columns(table_info);

  for (size_t rIx = 0; rIx < table_info->nRows; rIx++) {
    const value_t *row = table_info->rows + (rIx * nColumns);
    result = sql_stmt_bind(stmt, row, nColumns);
    if (result != SQLITE_OK) {
      goto exit;
    }
    int step_res = sqlite3_step(stmt);
    if (step_res != SQLITE_DONE) {
      result = step_res;
      if (error) {
        result = error_append(error, sqlite3_errmsg(db));
        if (result != SQLITE_OK) {
          goto exit;
        }
      }
      goto exit;
    }
  }

exit:
  sqlite3_free(query);
  sql_stmt_destroy(stmt);
  return result;
}

#define SQL_CONSTRAINT_IX(flags) ( (flags >> 4) & 0xF)
#define SQL_IS_CONSTRAINT(flags, mask, ix) ((flags & mask) && (ix == -1 || SQL_CONSTRAINT_IX(flags) == ix))

static void appendTableConstraint(const table_info_t *table_info, strbuf_t *sql, int constraint_mask, int constraint_idx) {
  char *constraint_name;
  if (constraint_mask == SQL_PRIMARY_KEY_MASK) {
    constraint_name = "PRIMARY KEY";
  } else if (constraint_mask == SQL_UNIQUE_MASK) {
    constraint_name = "UNIQUE";
  } else {
    return;
  }

  int has_cols = 0;
  int nColumns = sql_count_columns(table_info);

  for (int i = 0; i < nColumns; i++) {
    int flags = table_info->columns[i].flags;
    if (SQL_IS_CONSTRAINT(flags, constraint_mask, constraint_idx)) {
      has_cols = 1;
      break;
    }
  }

  if (!has_cols) {
    return;
  }

  strbuf_append(sql, ",\n  %s (", constraint_name);
  int first = 1;
  for (int i = 0; i < nColumns; i++) {
    int flags = table_info->columns[i].flags;
    if (SQL_IS_CONSTRAINT(flags, constraint_mask, constraint_idx)) {
      if (first) {
        first = 0;
        strbuf_append(sql, "\"%w\"", table_info->columns[i].name);
      } else {
        strbuf_append(sql, ", \"%w\"", table_info->columns[i].name);
      }
    }
  }
  strbuf_append(sql, ")");
}

static int sql_create_table(sqlite3 *db, const char *db_name, const table_info_t *table_info, errorstream_t *error) {
  int result;
  strbuf_t sql;
  result = strbuf_init(&sql, 4096);
  if (result != SQLITE_OK) {
    return result;
  }

  int pk_count = 0;
  int max_uk = -1;
  int nColumns = sql_count_columns(table_info);

  const column_info_t *columns = table_info->columns;
  for (int i = 0; i < nColumns; i++) {
    if (columns[i].flags & SQL_PRIMARY_KEY_MASK) {
      pk_count++;
    }
  }

  strbuf_append(&sql, "CREATE TABLE IF NOT EXISTS \"%w\".\"%w\" (", db_name, table_info->name);
  for (int i = 0; i < nColumns; i++) {
    if (i > 0) {
      strbuf_append(&sql, ",\n  \"%w\" %s", columns[i].name, columns[i].type);
    } else {
      strbuf_append(&sql, "\n  \"%w\" %s", columns[i].name, columns[i].type);
    }
    int flags = columns[i].flags;
    if (flags & SQL_NOT_NULL_MASK) {
      strbuf_append(&sql, " NOT NULL");
    }
    if ((flags & SQL_PRIMARY_KEY_MASK) && pk_count == 1) {
      strbuf_append(&sql, " PRIMARY KEY");
      if (flags & SQL_AUTOINCREMENT) {
        strbuf_append(&sql, " AUTOINCREMENT");
      }
    }

    switch (columns[i].default_value.type) {
      default:
        break;
      case VALUE_TEXT:
        strbuf_append(&sql, " DEFAULT %Q", VALUE_AS_TEXT(columns[i].default_value));
        break;
      case VALUE_FUNC:
        strbuf_append(&sql, " DEFAULT (%s)", VALUE_AS_FUNC(columns[i].default_value));
        break;
      case VALUE_DOUBLE:
        strbuf_append(&sql, " DEFAULT %g", VALUE_AS_DOUBLE(columns[i].default_value));
        break;
      case VALUE_INTEGER:
        strbuf_append(&sql, " DEFAULT %d", VALUE_AS_INT(columns[i].default_value));
        break;
    }

    if (columns[i].column_constraints != NULL) {
      strbuf_append(&sql, " %s", columns[i].column_constraints);
    }

    if (flags & SQL_UNIQUE_MASK) {
      int ix = SQL_CONSTRAINT_IX(flags);
      if (ix > max_uk) {
        max_uk = ix;
      }
    }
  }

  if (pk_count > 1) {
    appendTableConstraint(table_info, &sql, SQL_PRIMARY_KEY_MASK, -1);
  }

  if (max_uk > 0) {
    for (int i = 0; i <= max_uk; i++) {
      appendTableConstraint(table_info, &sql, SQL_UNIQUE_MASK, i);
    }
  }

  strbuf_append(&sql, "\n)");

  result = sql_exec(db, strbuf_data_pointer(&sql));
  if (result != SQLITE_OK && error) {
    error_append(error, sqlite3_errmsg(db));
  }

  strbuf_destroy(&sql);

  return result;
}

#define SQL_CREATE 1

static int sql_init_check_table(sqlite3 *db, const char *db_name, const table_info_t *table_info, int flags, errorstream_t *error) {
  if (error == NULL) {
    return SQLITE_MISUSE;
  }

  int exists = 0;
  int result = sql_check_table_exists(db, db_name, table_info->name, &exists);
  if (result == SQLITE_OK) {
    if (exists) {
      result = sql_check_table_schema(db, db_name, table_info, flags, error);

      if (result == SQLITE_OK && (flags & SQL_CREATE) != 0) {
        result = sql_insert_data(db, db_name, table_info, error);
      }

      if (result == SQLITE_OK && (flags & SQL_CHECK_DEFAULT_DATA) != 0) {
        result = sql_check_data(db, db_name, table_info, error);
      }
    } else if ((flags & SQL_MUST_EXIST) != 0) {
      if ((flags & SQL_CREATE) == 0) {
        error_append(error, "Table %s.%s does not exist", db_name, table_info->name);
      } else {
        result = sql_create_table(db, db_name, table_info, error);

        if (result == SQLITE_OK) {
          result = sql_insert_data(db, db_name, table_info, error);
        }
      }
    }
  }

  return result;
}

int sql_check_table(sqlite3 *db, const char *db_name, const table_info_t *table_info, int check_flags, errorstream_t *error) {
  return sql_init_check_table(db, db_name, table_info, check_flags & ~SQL_CREATE, error);
}

int sql_init_table(sqlite3 *db, const char *db_name, const table_info_t *table_info, errorstream_t *error) {
  return sql_init_check_table(db, db_name, table_info, SQL_CREATE | SQL_MUST_EXIST, error);
}

int sql_begin(sqlite3 *db, char *name) {
  return sql_exec(db, "SAVEPOINT %Q", name);
}

int sql_commit(sqlite3 *db, char *name) {
  return sql_exec(db, "RELEASE SAVEPOINT %Q", name);
}

int sql_rollback(sqlite3 *db, char *name) {
  return sql_exec(db, "ROLLBACK TO SAVEPOINT %Q", name);
}

int sql_init_stmt(sqlite3_stmt **stmt, sqlite3 *db, char *sql) {
  return sql_stmt_init(stmt, db, sql);
}

static int sql_integrity_check_row(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  const char *row = (const char *)sqlite3_column_text(stmt, 0);
  if (sqlite3_strnicmp(row, "ok", 3) != 0) {
    error_append((errorstream_t *)data, "integrity: %s", row);
  }
  return SQLITE_OK;
}

static int sql_integrity_check(sqlite3 *db, const char *db_name, errorstream_t *error) {
  return sql_exec_stmt(db, sql_integrity_check_row, NULL, error, "PRAGMA integrity_check");
}

typedef struct {
  int id;
  int seq;
  const char *table;
  const char *from_column;
  const char *to_column;
} foreign_key_info_t;

typedef struct {
  foreign_key_info_t *info;
  int index;
  int found;
} sql_foreign_key_info_data;

static int sql_foreign_key_info_row(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  sql_foreign_key_info_data *d = (sql_foreign_key_info_data *)data;
  int index = sqlite3_column_int(stmt, 0);
  if (index == d->index) {
    d->found = 1;
    d->info->id = index;
    d->info->seq = sqlite3_column_int(stmt, 1);
    d->info->table = sqlite3_mprintf("%s", sqlite3_column_text(stmt, 2));
    d->info->from_column = sqlite3_mprintf("%s", sqlite3_column_text(stmt, 3));
    d->info->to_column = sqlite3_mprintf("%s", sqlite3_column_text(stmt, 4));
    return SQLITE_ABORT;
  } else {
    return SQLITE_OK;
  }
}

static int sql_foreign_key_info(sqlite3 *db, const char *db_name, const char *table_name, int index, foreign_key_info_t *info, errorstream_t *error) {
  sql_foreign_key_info_data data;
  memset(&data, 0, sizeof(sql_foreign_key_info_data));
  data.info = info;
  data.index = index;
  data.found = 0;

  int result = sql_exec_stmt(
                 db, sql_foreign_key_info_row, NULL, &data,
                 "PRAGMA \"%w\".foreign_key_list(\"%w\")", db_name, table_name
               );
  if (result == SQLITE_OK && !data.found) {
    error_append(error, "Could not find foreign key in table %s with index %d", table_name, index);
    result = SQLITE_ERROR;
  }

  return result;
}

typedef struct {
  const char *db_name;
  errorstream_t *error;
} foreign_key_check_data;

static int sql_foreign_key_check_row(sqlite3 *db, sqlite3_stmt *stmt, void *data) {
  int result = SQLITE_OK;
  foreign_key_check_data *d = (foreign_key_check_data *)data;
  foreign_key_info_t info;
  char *value = NULL;

  memset(&info, 0, sizeof(foreign_key_info_t));

  char *table = sqlite3_mprintf("%s", sqlite3_column_text(stmt, 0));
  sqlite3_int64 rowId = sqlite3_column_int64(stmt, 1);
  char *referred_table = sqlite3_mprintf("%s", sqlite3_column_text(stmt, 2));
  int foreign_key_index = sqlite3_column_int(stmt, 3);

  result = sql_foreign_key_info(db, d->db_name, table, foreign_key_index, &info, d->error);
  if (result != SQLITE_OK) {
    goto exit;
  }

  result = sql_exec_for_string(db, &value, "SELECT \"%w\" FROM \"%w\".\"%w\" WHERE ROWID = %d", info.from_column, d->db_name, table, rowId);
  if (result != SQLITE_OK) {
    goto exit;
  }

  error_append(d->error, "%s: foreign key from '%s' to '%s.%s' failed for value '%s'", table, info.from_column, referred_table, info.to_column, value);

exit:
  sqlite3_free((void *)info.table);
  sqlite3_free((void *)info.from_column);
  sqlite3_free((void *)info.to_column);
  sqlite3_free(table);
  sqlite3_free(referred_table);
  sqlite3_free(value);

  return result;
}

static int sql_foreign_key_check(sqlite3 *db, const char *db_name, errorstream_t *error) {
  foreign_key_check_data data = {
    db_name,
    error
  };
  return sql_exec_stmt(db, sql_foreign_key_check_row, NULL, &data, "PRAGMA foreign_key_check");
}

typedef int(*check_func)(sqlite3 *db, const char *db_name, errorstream_t *error);

static check_func checks[] = {
  sql_integrity_check,
  sql_foreign_key_check,
  NULL
};

int sql_check_integrity(sqlite3 *db, const char *db_name, errorstream_t *error) {
  int result = SQLITE_OK;

  check_func *current_func = checks;
  while (*current_func != NULL) {
    result = (*current_func)(db, db_name, error);
    if (result != SQLITE_OK) {
      break;
    }
    current_func++;
  }

  return result;
}

int sql_create_function(sqlite3 *db, const char *name, void (*function)(sqlite3_context *, int, sqlite3_value **), int args, int flags, void *user_data, void (*destroy)(void *), errorstream_t *error) {
  int function_flags = SQLITE_UTF8;

#if SQLITE_VERSION_NUMBER >= 3008003
  if (((flags & SQL_DETERMINISTIC) != 0) && sqlite3_libversion_number() >= 3008003) {
    function_flags |= SQLITE_DETERMINISTIC;
  }
#endif

  int result = sqlite3_create_function_v2(
                 db, name, args, function_flags, user_data, function, NULL, NULL, destroy
               );
  if (result != SQLITE_OK) {
    error_append(error, "Error registering function %s/%d: %s", name, args, sqlite3_errmsg(db));
  }

  return result;
}

redpajama_set_name: RedPajamaGithub


"A Young Person's Guide to the Orchestra" has been a regular in my car for years. Our recording is of the New York Philharmonic Orchestra under the direction of Leonard Bernstein. I don't pay close attention to the variations after this many hundreds of grocery trip concerts, but I always find myself listening again at the end. Benjamin Britten's Fugue is almost more than I can handle.
The piccolo starts, pipey and frantic, desperate to get in her say while she can.
The other woodwinds follow, just as panicked, trampling their little sister. Her fears were the same, and are now realized.
The violins swoop in, snooty and self-important as always. They are so sure of their superiority as to barely allow a fair entrance to the steadfast, modest, and (let's be honest) more personable cellos.
Basses . . . um, yes, I can hear somebody down there now . . . oh, no--the violas! Well, I guess they made it on their own again. Next time I am for sure going to cue the violas!
HARP. You are so weird, harp. Say your piece.
And, OK, the whole brass family is terrible. But surely the French horns ought to know better than to blast their way in like this!
and the trombones are as close as they can get to outright honking without Leonard having to stop the whole thing . . .
the tuba's probably doing it too but it's become such a blaring jumble we can't even tell if we should be scowling at him. Seriously, is there a score here or is everybody playing whatever fool thing comes into their heads?
And now, just what we need: percussion. I might have to stop the car.
And then, out of the squeaks and the swoops, the blasts and the blows: the theme. Purposeful. Powerful. Perfect. It rises somehow from this mess and these maniacs. It is what we have been working for all this time; even when we doubted the hints a fugue so crazed was barely generous enough to toss our way, even when we couldn't remember the promises we'd been made through all the sectionals where we began. The twitters, swoops, and explosions, which earlier were senseless distractions, transform the monolith into a triumphant magnificence of grace. Maybe a critic does not find Purcell's theme extraordinary. But only a critic could be deaf to the miracle that a score exists, that a performance succeeds, that any orchestra works.
The theme will rise from our screechers, snoots, honkers, and blasters. Our flutes will whisper, "It's OK, Mom." Our violins and violas will hug each other and talk on the phone every day. Our oboes will murmur, "I'm sorry too, and I forgive you, if there's anything to forgive." Our stately horns will chuckle, "Do you remember that time we honked?" Our tubas will guffaw, "I can't believe we thought you didn't know!" Our basses will mention, "I already took care of it." Our cymbals will crash into the room, and instead of getting mad, everyone will laugh. Our piccolos will trill, our trumpets will proclaim, our cellos will hum, "I love you! I love you! I love you."
There's something wrong with my eyes. I might have to stop the car.
Love this so much. I might give each child a new nickname :) And when all those unique instruments from each unique family join with the heavenly throng, what a joyous praise that will be to the God who created, saves, and sustains them all.


text:
Q: SSHD Failed to retrieve unit: Connection time out After upgrading from ubuntu 14 to ubuntu 16 sshd service is having problems. It keeps to long to connect, sometimes fails to connect etc.
When i try to restart sshd service most of the times i get an error message:
myuser@myserver:~$ sudo service sshd restart
Failed to retrieve unit: Connection timed out
Failed to restart sshd.service: Connection timed out
See system logs and 'systemctl status sshd.service' for details

When i check systemctl status the error is:
myuser@myserver:~$ systemctl status sshd.service
Failed to get properties: Connection timed out

It seems like the problem is not only for the sshd service because it does the same thing also for other services. For example when i am installing or uninstalling anything from the server i get:
Failed to execute operation: Connection timed out

redpajama_set_name: RedPajamaStackExchange


Win one of 5 pairs of super comfortable Merrell MOAB 2.0 MID GTX boots in our Merrell MOAB Giveaway.
To launch their new range of boots and shoes for autumn 2017, the good people at Merrell have given us 5 pairs of Merrell MOAB 2.0 Mid GTX boots to giveaway.
The MOAB range, which stands for "Mother of all Boots" has long been a core part of Merrell's hiking range, coming in a wide range of models, low, mid, vented, goretex etc but all the while offering excellent comfort and dependable grip.
Experience out-of-the-box comfort in this Gore-Tex® hiker from Merrell. With durable synthetic leather, a supportive footbed, and Vibram® traction, the Moab 2 Mid is a versatile package.
-Make it through rain with ease thanks to Gore-Tex waterproof coverage.
-A Merrell M Select™ FIT.ECO+ blended EVA footbed provides contoured foot support and cushioning, while the rubber toe cap provides a barrier between feet and rough terrain.
-A Vibram® TC5+ outsole with 5mm lugs lends this wet weather hiker its grit.
So, now that you're interested, what do you need to do to win one of these pairs in our Merrell MOAB Giveaway?
Read the form below and give us some details.
The following are the terms and conditions of the Great Outdoors Merrell MOAB Giveaway. Your participation in the competition shall be deemed to be your complete acceptance of the terms and conditions herein.
•All entrants will have their email address added to ours and Merrell's mailing lists. To unsubscribe in the future, simply use the unsubscribe link in any of the emails you receive.
•The winners will be announced via social media channels on Monday, October 16th. •Closing date for all applications is Midnight on Sunday October 15th 2017.


Becoming a heart surgeon is a lengthy process.
According to the Centers for Disease Control, heart disease is the leading cause of death for both men and women in the United States, accounting for one out of every four deaths. As a heart surgeon, treating heart patients will give you lots of opportunity to save and change lives, but it won't happen easily or quickly. You'll have to be an outstanding student. You will also have to settle in for the long haul and prepare to spend at least 15 years in training.
A four-year bachelor's degree is going to be the first stop on your educational journey. Don't bother looking in college catalogs for a "pre-med" major because you usually won't find it. You can earn a degree in any major as long as it meets the prerequisites for entry into a medical or osteopathic college. Usually that means a few humanities courses, calculus or statistics, basic courses in physics, chemistry and biology, and some advanced work in microbiology or organic chemistry. Each school's requirements are different, so if your heart is set on a specific school it's smart to find out ahead of time what the requirements are.
After earning your bachelor's degree -- preferably with a very high grade point average -- it's time for medical school. This is going to take up another four years of your life. Most schools organize their curriculum with the first two years in classrooms and laboratories and the final two years in clinical rotations. Your classroom time will cover medical law and ethics and some of the practical considerations of running a medical practice. It'll also get into the rest of the scientific knowledge you need to be a doctor, including anatomy and physiology, medical genetics, pharmacology and immunology. During the third and fourth years you'll get hands-on exposure to the major branches of medicine, including surgery, during supervised clinical time.
Once you graduate from medical school, the real work begins. You'll have to earn a place in a surgical residency, which provides you with four to five years of hands-on training in general surgery. You'll start off mostly watching and listening, but by the later years you'll have strong enough skills to work independently and help train newer residents. General surgery residencies give you exposure to a range of traditional and minimally-invasive surgical techniques, mostly in abdominal, breast and vascular surgery. If you're planning a career in heart surgery you should try to wrangle some extra time in the cardiac ward. When your residency is finished, you're eligible to take certification exams through the Board of Surgery.
After your residency you'll be a board-certified general surgeon, but you still have more to learn. The final stage of your training is a specialized fellowship in cardiovascular or cardiothoracic surgery, which will take another two to three years. You'll be part of a cardiac surgical team with experienced surgeons, other fellows, cardiac and perioperative nurses, anesthesiologists and many other professionals. During this time you'll gain a deeper knowledge of heart surgery and its related clinical and diagnostic skills. When you're finished, you'll need to pass one more set of certification exams to become a board-certified heart surgeon. That's a total of 14 to 16 years invested in training.


text:
Michael James Aleck Snow, CC (* 10. Dezember 1928 in Toronto, Ontario; † 5. Januar 2023 ebenda) war ein kanadischer avantgardistischer Filmregisseur, Experimental-Filmemacher, Maler, Bildhauer, Schriftsteller, Fotograf und Jazz-Musiker.

Leben und Werk

Michael Snow studierte am Upper Canada College und am Ontario College of Art. Nach seinem Studium besuchte er 1953/54 Europa und arbeitete im Anschluss bis 1956 für eine kleine Torontoer Filmproduktionsgesellschaft. Im selben Jahr hatte er seine erste eigene Ausstellung in der Avrom Isaacs's Greenwich Gallery in Toronto. Seit damals wurden seine Arbeiten auf Ausstellungen in ganz Europa, Nordamerika und Südamerika gezeigt. Es folgte 1962 bis 1964 ein Aufenthalt in New York, er kehrte 1972 nach Toronto zurück. Zwischen 1961 und 1967 schuf er mehrere Werke in unterschiedlichen Medien, die auf der Silhouette einer jungen Frau basierten. Eine Werkreihe von elf Skulpturen wurden an der Expo 67 im Pavillon von Ontario gezeigt.

Er war mit einigen Filmen als Teilnehmer der Documenta 5 in Kassel im Jahr 1972 in der Abteilung Filmschau: New American Cinema und auch auf der Documenta 6 im Jahr 1977 als Künstler vertreten. Seine Werke wurden unter anderem im Jahr 2000 im Centre Pompidou in Paris und 2005 im Museum of Modern Art in New York City gezeigt. Michael Snow gilt als einer der einflussreichsten experimentellen Filmemacher. Zu seinen bekanntesten öffentlichen Werken zählen die Skulpturen an der Sportarena Rogers Centre und die Skulptur Flightstop im Eaton Centre, welches Kanadagänse im Inneren des Einkaufszentrums darstellt.

Ursprünglich war er professioneller Jazz-Musiker und hat Soundtracks zu seinen Filmen, zum Beispiel New York Eye und Ear Control selbst konzipiert.

Als Pianist trat er als Solist und mit anderen Musikern, insbesondere in der Gruppe CCMC, die er mitgründete, in Nordamerika, Europa und Japan auf. Snow trat regelmäßig in Kanada sowie international auf und war laut Tom Lord zwischen 1948 und 2015 an 64 Aufnahmesessions beteiligt, u. a. mit Ken Dean's Hot Seven, Pee Wee Russell, der Artist's Jazz Band und dem Joe Giardullo Open Ensemble. Er war außerdem als Bildhauer und Zeichner international bekannt. Snow war mit der kanadischen Filmkünstlerin Joyce Wieland (1931–1998) verheiratet.

Filmografie (Auswahl)
 1956: A to Z
 1964: New York Eye and Ear Control
 1965: Short Shave
 1967: Wavelength
 1967: Standard Time
 1969: One Second in Montreal
 1969: Dripping Water (mit Joyce Wieland)
 1969: <---> (Back and Forth)
 1970: Side Seat Paintings Slides Sound Film
 1971: La Région Centrale
 1974: Two Sides to Every Story
 1974: Rameau's Nephew by Diderot (Thanx to Dennis Young) by Wilma Schoen
 1976: Breakfast (Table Top Dolly)
 1981: Presents
 1982: So Is This
 1988: Seated Figures
 1990: See You Later
 1991: To Lavoisier, Who Died in the Reign of Terror
 2000: Prelude
 2000: The Living Room
 2002: Corpus Callosum
 2003: WVLNT ("Wavelength For Those Who Don't Have the Time")
 2005: SSHTOORRTY

Diskografie (Auswahl)

 Musics For Piano, Whistling, Microphone And Tape Recorder, Chatham Square Productions 1975
 The Last LP. Unique Last Recordings Of The Music Of Ancient Cultures, Art Metropole 1987 (re-issue 1994)
 Sinoms, Art Metropole 1990
 Hearing Aid, supposé 2002, ISBN 978-3-932513-34-3

Ausstellungen
 2014: Michael Snow: Photo-Centric., Philadelphia Museum of Art.

Literatur
 Ausstellungskatalog: documenta 5. Befragung der Realität – Bildwelten heute; Katalog (als Aktenordner) Band 1: (Material); Band 2: (Exponatliste); Kassel 1972
 documenta Archiv (Hrsg.); Wiedervorlage d5 – Eine Befragung des Archivs zur documenta 1972; Kassel/Ostfildern 2001, ISBN 3-7757-1121-X
 Katalog zur documenta 6: Band 1: Malerei, Plastik/Environment, Performance; Band 2: Fotografie, Film, Video; Band 3: Handzeichnungen, Utopisches Design, Bücher; Kassel 1977 ISBN 3-920453-00-X

Weblinks

 Kurze Biografie
 Artcyclopedia

Einzelnachweise

Bildhauer (Kanada)
Maler (Kanada)
Musiker (Kanada)
Filmregisseur
Fotograf (Kanada)
Zeichner (Kanada)
Jazz-Pianist
Improvisationsmusiker
Künstler (documenta)
Companion of the Order of Canada
Künstler (Toronto)
Kanadier
Geboren 1928
Gestorben 2023
Mann

redpajama_set_name: RedPajamaWikipedia


The critically acclaimed dive into the psychosis of a Pict warrior thrust Ninja Theory back into the limelight in 2017. The game won them tons of awards, and played a big part in Microsoft deciding to acquire the studio in the middle of 2018. However, that hasn't stopped their multi-platform efforts and independent streak with Hellblade. In a real surprise announcement, the game is coming to Nintendo Switch this spring.


text:
Presidential "Electability" and its Gatekeepers
November 5, 2019 November 5, 2019 Camille Cressman	0 Comments	kamala harris, trump
During the 2004 Democratic primaries, The New Yorker ran an article about the two Democratic frontrunners, John Kerry and Howard Dean. In the article, they write that Democratic voters were "seeking above all this year a candidate who can beat Bush" [1]. Dean represented the anti-war, anti-establishment outsider who tapped into voters' frustrations, while Kerry, with twenty years of experience in the foreign and domestic policy better fit the "cold calculus of electability." Ultimately, Kerry's impressive resume secured him the nomination, but he lost.
In January 2016, when only Clinton and Sanders were left fighting for the Democratic nomination, the Clinton campaign argued that while Bernie Sanders is nice, only Hillary Clinton can actually win a general election [2]. Clinton's campaign sought to meet Republicans halfway and maintain moderate, accessible policies that would appeal to larger constituencies than Sanders's campaign could. Her electability argument won, but in the general election, she lost.
Polls show that Democratic voters are looking for a presidential candidate that will, above all else, be able to beat President Trump. They want someone who is electable, rather than a candidate that upholds certain values or policies. The concept of electability is always prevalent in primary and general elections, but it seems more salient this time around. In the past few months, we've seen major news sources discuss the electability of virtually every candidate: CNN ran a piece titled "Amy Klobuchar's best argument for 2020: Electability," The Hill writes that "Pollster says voters associate Biden with electability," and The Week asserted that "Cory Booker is the only Democrat with a data-driven electability argument" [3] [4] [5]. These articles speak to a prevailing compulsion in U.S. politics boosted by the media. Time and time again, we hear about the primacy of electability; which candidates are electable is self-evident. But it seems as though no amount of professional pundits, number crunching, or daily horoscopes can really predict a candidate that can win an election. Trump and Obama were not considered electable. The fact is that nobody really knows what electability means.
Why then, do we keep talking about electability as such an important metric? Many of the more left-wing writers speculate that many media organizations (owned and operated by billionaires) assert moderate candidates are more electable to draw voters away from candidates they agree with, to ones more in line with the agenda of the corporate wing of the Democratic Party. The priority of electability establishes a false dichotomy between wanting to beat Trump and caring about values. This may be why we see more moderate pundits defending the problematic backgrounds of candidates like Kamala Harris and Joe Biden in order to preserve their perceived electability metric. The focus on electability stifles productive conversations on the ideology that voters want to preserve by instead focusing on the intrinsic properties like race, gender, or sexual orientation of candidates that would allow them to effectively take on President Trump.
In absence of an empirical definition for electability, the term grows to reflect collective biases for things that we believe but do not want to say. This is why on occasion we will hear that the United States is not ready for a woman in the White House, that a candidate is too progressive to win in a general election, or that a person will not appeal to white or middle-class voters. There are many stereotypes and biases that pundits and writers are latently reinforcing when they discuss electability as it relates to minorities and the working class. In other words, electability as a metric is inherently racist, sexist, and classist.
There is undoubtedly a way we can continue to consider electability in the 2020 primaries, but it requires a different perspective on what qualities a Democratic candidate needs in order to beat Donald Trump next year. Instead of thinking about candidates who can appeal to moderates, or even people who voted for Trump in 2016, we can, and should, think about candidates who appeal to and excite the 42 percent of registered voters who didn't vote in 2016 [6]. A candidate who motivates and excites large constituencies who have felt disconnected from American democratic institutions, who felt no connection to policies or values that candidates in the past have espoused. A politician that is electable is not someone who can appeal to a certain demographic or the current Democratic base, but one that can establish an enthusiastic, grassroots campaign that transcends demographics and can bolster voters' excitement not just around defeating Donald Trump, but about contributing to what they believe is a meaningful change in American politics.
[1] https://www.newyorker.com/magazine/2004/02/09/the-shakeout
[2] https://time.com/4174587/hillary-clinton-new-hampshire-electability/
[3] https://www.cnn.com/2019/02/08/politics/amy-klobuchar-electability/index.html
[4] https://thehill.com/hilltv/what-americas-thinking/442346-pollster-says-voters-associate-biden-with-electability
[5] https://theweek.com/articles/860637/cory-booker-only-democrat-datadriven-electability-argument
[6] https://www.pbs.org/newshour/politics/voter-turnout-2016-elections
CAMILLE CRESSMAN is a senior from Southern California. She studies Political Science and English and served a mission in Sweden. Her academic interests include critical theory of literature and class structure, political economy, and grassroots mobilization. Her normal interests include embroidery, pretentious films, sewing, and angry political podcasts. After graduation, Camille plans on attending law school and working in either labor protection or family law
Latest posts by Camille Cressman (see all)
The Gig Economy's Precarious Growth - March 6, 2020
Re-Thinking the United States' Relationship with Iran - February 4, 2020
The Politics of Loneliness at the End of History - December 23, 2019
We Should Care About the Kurds - December 6, 2019
← The Thin Blue Line
You are What You Wear →
Is Pulling Out of Syria an Effective Strategy?
February 14, 2019 February 14, 2019 Sage Smiley	0
The Migrant Caravan: We only have ourselves to blame
December 9, 2018 December 9, 2018 Amelia Campbell	0
America First Gives China a Top Spot
February 8, 2018 March 14, 2018 Sarah Austin	0
The Thin Blue Line by Tyler Clancy
You are What You Wear by Reagan Curtis


text:
Independent Canadian News
True Conspiracies (?)
GMO Horror Stories Copied Here:
The History of Governments and Police
Conspiracies That Hit Home?
The Nasties are Ramping Up Their Attack Strategies Aimed at Election Time
August 12, 2019 douglas otterson Comments Off on The Nasties are Ramping Up Their Attack Strategies Aimed at Election Time
– Monday, August 12, 2019 – 80˚F / 27˚C & cloudy @ 3:30 pm near Ithaca, New York –
– The above has been copied and pasted from our "Inter World News" blog – I like the way most of that blog looks. – —djo—
– I copied and pasted the above here, too, maybe I'll do this for the whole article. – —djo—
– "Economic Warfare .101 – Why do people get crazy when workers ask for a living wage when CEOs get $10,000.00 (or more) an hour?" – —djo—
– This was my 'sign off' for the article I posted yesterday – —djo—
— Now, if our buddy, "HJdA", could get the design elements of the above blog to work here – I'd vote to double his salary at our next bored meeting 😉 – return multiply by zero error 😉
Wednesday, February 20th, 2019 – Patty Hearst's Birthday
August 10, 2019 douglas otterson Comments Off on Wednesday, February 20th, 2019 – Patty Hearst's Birthday
Wednesday, February 20th, 2019 – +27˚F / -3˚C & cloudy in the Ithaca, New York area @ 1:30 pm Eastern Time –
— It's been a while since anyone's posted anything new here – and that isn't because there is nothing newsworthy going on. Real Life has a way of interfering with our blogging / reporting aspirations.
– The CRTC – Canada's Telecommunications Regulater – { Kind of their version of the FCC } Has found deceptive practices and "misleading, high pressure tactics" are too common among Canadian Companies trying to sell you their telecommunications services. – It's Official –
The CRTC says an inquiry has confirmed allegations Canada's telecommunications industry used unacceptable sales practices that misled consumers and harmed vulnerable members of the public.
The commission says the misleading and aggressive practices exist in all types of sales channels, including in stores, online, over the telephone and at homes when companies conduct door-to-door sales campaigns.
'I feel cheated' — Consumers speak out at CRTC review of telecom sales tactics
But the report doesn't identify which companies or areas of the country have had the worst track record.
The CRTC compiled the report after five days of testimony at public hearings in October and months of information gathering, including more than 1,000 comments from individual Canadians.
The regulator looked into the issue after CBC's reporting into sales tactics at some of Canada's biggest telecom companies.
The CRTC says it plans to follow up its report with measures to address the problems identified through the inquiry, but most of them will require additional regulatory proceedings.
The Canadian Radio-television and Telecommunications Commission is a semi-autonomous federal agency responsible for upholding the Telecommunications Act and the Broadcasting Act, which are both under review by the federal government.
— Donald J Trump Watch :
– I was in Canada Yesterday – Spending as much quality time with my sweetie as I could and probably woke up the neighbours when I whooped loudly as I heard an FBI spokesperson tell the world that Donald J Trump is being investigated as a possible threat to US National Security. I haven't been able to find the time after zooming home and getting ready to power nap before work to see if that was reported down here. But –
America's auto industry is bracing for a potential escalation in U.S. President Donald Trump's tariff war with the world, one that could weaken the global auto industry and economy, inflate car prices and trigger a backlash in Congress.
CEOs say Trump policies hurt business, investment
Late Sunday, the Commerce Department sent the White House a report on the results of an investigation Trump had ordered of whether imported vehicles and parts pose a threat to U.S. national security. Commerce hasn't made its recommendations public, and the White House has so far declined to comment. If Commerce did find that auto imports imperil national security, Trump would have 90 days to decide whether to impose those import taxes.
Trump has repeatedly invoked his duty as president to safeguard national security in justifying previous rounds of tariffs. An obscure provision in trade law authorizes a president to impose unlimited tariffs on particular imports if his Commerce Department concludes that those imports threaten America's national security.
Whatever Commerce has concluded in this case, Trump has made clear his enthusiasm for tariffs in general and for auto tariffs in particular. Some analysts say they think Commerce has likely endorsed the tariffs, not least because the president has conveyed his preference for them.
Among Commerce's recommendations "will certainly be tariffs because, hey, he's a tariff man," said William Reinsch, a former U.S. trade official and now a senior adviser at the Center for Strategic and International Studies, referring to a nickname that Trump gave himself.
Industry conference call to discuss what might happen
Industry officials took part in a conference call Tuesday to discuss the possible steps Trump could take. They include tariffs of up to 25 per cent on imported parts only; on assembled vehicles only; or on both vehicles and parts — including those from Mexico and Canada. The last option would be an especially unusual one given that the United States, Mexico and Canada reached a new North American trade deal late last year, and the legislatures of all
three nations must still ratify it.
In public hearings last year, the idea of imposing import taxes on autos drew almost no support. Even U.S. automakers, which ostensibly would benefit from a tax on their foreign competitors, opposed the potential tariffs. Among other concerns, the automakers worry about retaliatory tariffs that the affected nations would impose on U.S. vehicles. Many U.S. automakers also depend on imported parts that could be subject to Trump's tariffs and could become more expensive.
Ottawa says Ontario's call to drop retaliatory tariffs would mean 'surrender'
Getting around Trump: Trudeau focuses on other 'levers' to end tariffs
A similar Commerce investigation last year resulted in the Trump administration imposing taxes on imported steel and aluminum in the name of national security. The administration has adopted an extraordinarily broad view of national security to include just about anything that might affect the economy.
In addition to steel and aluminum, Trump has imposed tariffs on dishwashers, solar panels and hundreds of Chinese products. Targeting autos would further raise the stakes. The United States imported $340 billion in cars, trucks and auto parts in 2017.
If this, then that
If the administration imposed 25 per cent tariffs on imported parts and vehicles including those from Canada and Mexico, the price of imported vehicles would jump more than 17 per cent, or an average of around $5,000 each, according to estimates by IHS Markit. Even the prices of vehicles made in the U.S. would rise by about 5 per cent, or $1,800, because all of them use some imported parts.
Canada quietly concludes additional auto talks with Japan
Luxury brands would absorb the sharpest increase: $5,800 on average, IHS concluded. Mass-market vehicle prices would rise an average of $3,300.
If the tariffs were fully assessed, IHS predicts that price increases would cause U.S. auto sales to fall by an average of 1.8 million vehicles a year through 2026. Auto industry officials say that if sales fall, there almost certainly will be U.S. layoffs. Dealers who sell German and some Japanese brands would be hurt the most by the tariffs.
"The economic fallout would be significant, with auto tariffs hurting the global economy by distorting prices and creating inefficiencies, and the impact would reverberate across global supply chains," Moody's Investors Service said in a report. "The already weakening pace of global expansion would magnify global growth pressures, causing a broader hit to business and consumer confidence amid tightening financial conditions."
Congress could resist the auto tariffs. Sens. Pat Toomey, R-Penn., and Mark Warner, D-Va., have introduced legislation to reassert congressional control over trade. Their bill would give Congress 60 days to approve any tariffs imposed on national security grounds. It would also shift responsibility for such investigations away from Commerce to the Pentagon.
Using tariffs as leverage
Some analysts say they suspect that Trump intends to use the tariffs as leverage to pressure Japan and Europe to limit their auto exports to the United States and to prod Japanese and European automakers to build more vehicles at their U.S. plants.
Reinsch notes that Trump's top trade negotiator, Robert Lighthizer, worked in the Reagan administration, which coerced Japan into accepting "voluntary" limits on its auto exports.
"This is the way Lighthizer thinks," Reinsch said.
Even if the tariff threat resulted in negotiations, Europe and Japan would have demands of their own. A likely one: Compelling the U.S. to drop its longstanding 25 per cent tax on imported light trucks.
Trump is "pursuing something that, as near as I can tell, the domestic (auto) industry doesn't want," Reinsch said. "Once he pursues it, he is going to be under pressure to give up the one thing the auto industry really does want" — the U.S. tariff on imported light trucks.
International trade in 2018: making sense of a 'tarrifying' year
For now, many in the industry are upset that the Commerce Department report remains secret, feeding uncertainty.
"The 137,000 people who work for Toyota across America deserve to know whether they are considered a national security threat," Toyota said in a statement Tuesday. "And the American consumer needs to know whether the cost of every vehicle sold in the U.S. may increase."
The American International Automobile Dealers Association this week called the Commerce Department's investigation "bogus."
"Now, dealerships must continue to operate under a cloud of uncertainty, not knowing if at any moment their products will be slapped with 25 per cent tariffs, raising vehicle and repair costs by thousands of dollars and slashing sales," the association's CEO, Cody Lusk, said in a statement.
CBC's Journalistic Standards and Practices|About CBC News
{ Canadian Auto makers' Unions have a campaign they're paying television broadcasters to air – asking everyone up there to boycott any GM products made in Mexico – and/or not to buy any General Motors vehicles unless they have been manufactured in Canada. GM is closing down a long-time auto plant a bit to the east of Toronto in favour of shifting production to Mexico where they can get away with under-paying their workers in factories that do not have to follow as strict safety regulations as Canadian factories need to abide by. I am ashamed to admit that I haven't been on twitter lately to see what Michael Moore has to say about this. -djo- }
— And I should also be ashamed to admit that I need a little bit of sleep before I have to get up and remain reasonably alert on the night shift down here.
— Above news articles 'lifted' / copied and pasted from the CBC News Web Site : <– That is a link
— Hang in there, America – We need you –
— djo —
Internet Defense League
Area Churches (Arnprior)
CBC Headlines
Editorials?
Editor In Chief:
Doug Otterson
I was born with this irritating need to know what life is all about. I've tested as having an Indigo Aura / might be an Indigo Child. (Trouble Maker?) (Why bother? Trouble knows where to find me... He stops by for coffee regularly-) My First Nation / Native American friends say I have an Owl teaching me to see through lies. They tell me that dishonest people are afraid of me, because they know I can see through their b.s.
Authors ( Copied from The ArnpriorNews)
Subscribe / Follow this Blog via Email
Monday, Iowa Caucuses Day – & The 'Tweet-Us-Sphere' is full of Way Too Cute Animal Pix?
Another Wednesday in Amerika?
– Economic Warfare & Slavery – Wednesday Update :
"Always Question Authority"
"Ekonomic Warfare"
"Forbidden Knowledge"
"http://cafr1.com"
"Just give us the Truth!"
"oops"
"Reality"
"We don't need Fracking Politicians!"
"We don't want to be ALLOWED to vote for someone else's agenda – We want to change the agenda-" – Germaine Greer –
"Well -'duh!'."
'Smart' appliances emit too much radiation that might harm you or interfere with sleep
'Smart' meters – appliances- etc. = 'Not Good'
'The Energy Non-Crisis'
– We need more positive News! –
A Camel is a horse designed by committee?
Battle for intenet neutrality
Battle for Internet Freedom
Bears and hikers
Big Pharma Kills
Big Pharma wants you sick and will not cure your illness if they can make more money out of treating symptoms
Canadian Interest
Creative People vs "Bottom Line" types
Ekonomics
Enough Natural Gas being pumped back into the ground in Alaska to light up the east coast Free for 3 years
First Nations Issues
Fracking is NOT SAFE!
Fredericton's Harvest Jazz & Blues Festival
G.M.O. food is POISON!
Health Care vs Big Pharma Bucks
Interdimensional
Navigation Tips
New Brunswick Local News
New Brunswick Provincial Elections
No Bears Today
Pastor Lindsey Williams
PC Party
People's Alliance Party
Politicians in Bed with Big Business
Politiks
Positve Outlook
PTSD vs Government bean counters
Sports Guys behaving badly
Sugar feeds cancer cells
The bad guys will kill each other off.
THINK before you do something stupid!
Who's Pulling Whose Strings?


Messy Handz Studio, a multi faceted art program that provides people of all ages the opportunity to experience art and express themselves with no rules or limits. It's all about bringing out the creative expression in all of us. Messy Handz will also help with design ideas for the perfect creative spaces. From kids bedrooms, play areas, preschools and craft rooms. Any space that you want to reflect your imagination!
We will help create the space you have always wanted!
Book your party! Parties are $180.00 for an hour art program that is geared toward the interest of the birthday boy/girl. All materials included and project ideas. We will travel to your location.
Ladies Night!!! Get a group of your girls together and lets get those pinterest pins brought to life! Most materials are provided and the cost is $15.00 per person.
We will bring our Art Erichment Program to your Preschool.!
Call Eleanor for details and sign up information.


There is a need to introduce innovations in the manufacture of snake antivenoms to increase the supply of these products worldwide. In this work, the fractionation of equine hyperimmune plasma with a new methodology that includes an aqueous two phase system (ATPS) as a primary purification step was compared with the traditional method of caprylic acid precipitation. Hyperimmune plasma from horses immunized with the venoms of three snakes from sub-Saharan Africa was used as starting material for the production of both formulations. After being adjusted to the same lethal neutralizing activity, both antivenoms were compared in terms of their immunoreactivity, neutralization of in vitro venom activities, physicochemical characteristics, and stability. Their performance in terms of yield and purity was also assessed. The neutralization profile of in vitro enzymatic activities and the immunoreactivity, analyzed by ELISA and antivenomic approaches, were very similar for both preparations. Likewise, they behaved similarly in stability studies. However, ATPS-fractionated antivenom showed improved physicochemical profile and immunochemical purity and yield, mainly owing to its lower protein content. Additionally, this methodology allowed the recovery of albumin as a byproduct. ATPS purification constitutes a promising technology for antivenom production and should be further evaluated at preclinical and clinical levels.


rcd wiring diagram australia residual current devicea residual current device rcd or residual current circuit breaker rccb is a device that instantly breaks an electric circuit to prevent serious harm from an ongoing electric shock.mmucc thousands collection of electric wiring diagramhonda generator wiring harness inverter wiring diagram in home car stereo wire diagram renault megane wiring diagram free download nissan patrol wiring diagram download.
So, if you'd like to get the outstanding graphics regarding rcd wiring diagram australia, just click save link to download the graphics to your personal pc. These are ready for save, if you'd rather and wish to grab it, just click save logo in the post, and it'll be immediately saved in your home computer.
Thanks for visiting our website, articleabove rcd wiring diagram australia published by admin. Nowadays we are excited to announce we have discovered a veryinteresting nicheto be discussed, that is rcd wiring diagram australia Most people attempting to find information about and definitely one of them is you, is not it?