text:
Proposed ordinance would require insurance for vicious dogs
The Newton City Council will be voting on a ordinance that requires owners of vicious dogs to have insurance of at least $50,000 and will review the definition of a vicious dog at tonight's 6 p.m. meeting.
If adopted, the following changes would be made to the vicious dog ordinance:
• A vicious dog would be defined as, "a dog which has killed a domestic animal or pet or inflicted injury upon a domestic animal pet such that the domestic animal or pet later dies or is euthanized due to the attack may be declared a vicious dog."
Story Archived
Please sign in with your Comment Member ID and password.
Having trouble?
If you have any technical difficulties, either with your username and password or with the payment options, please contact us by e-mail at email@example.com


text:
Community Calendar
View by subject
• Art Galleries• Auditions
• Benefits/Fundraisers
• Classes/Workshops
• Clubs/Meetings
• Community Events
• Concerts
• Dance
• Environment
• Exhibits
• Family and Kids
• Film
• Health
• Live Music
• On Stage
• Outdoors
• Religion/Spirituality
• Research Subjects
• Seniors
• Singles
• Special Events
• Sports
• Support Groups
• Lectures & Talks
• Teen Activities
• Volunteers
Blossom Birth Community Five Percent DayFor one day at Whole Foods Market in Palo Alto five percent of the store's sales will be donated to Blossom Birth. Blossom Birth will also be hosting baby-related workshops all day - visit the organization's Facebook page for a list of workshops and times, under the events tab: https://www.facebook.com/WFMPaloAlto. Dec. 10, 8 a.m.-10 p.m. Free. Whole Foods Market, 774 Emerson St., Palo Alto.
Cheese Night at Whole FoodsLearn how to create a cheese board and taste cheeses. Dec. 10, 6-7:30 p.m. Free. Whole Foods Market, 774 Emerson St., Palo Alto.
Special Events
Rengstorff House - Holiday Open HouseRengstorff House at Shoreline hosts its annual holiday open house. Dec. 10, 7-9 p.m. Free. Rengstorff House, 3070 N. Shoreline Blvd., Mountain View.
Community Events
Houdini - Magic of FlyingThe Oshman Family JCC hosts a conversation with early aviation historian Roy Mize about Harry Houdini as the 23rd person to fly and the first to fly in Australia. Dec. 10, 11 a.m.-noon. $15 nonmembers; $10 members. Oshman Family JCC, 3921 Fabian Way, Palo Alto.
Lectures & Talks
Technology and Society Committee Luncheon ForumRoger Harris, conservation biologist for an environmental consulting firm, will discuss the science behind global warming based on the Intergovernmental Panel on Climate Change and raises some political questions on how to respond. Dec. 10, 11:45 a.m.-1 p.m. Lunch is $12. Hangen Szechuan Restaurant, 134 Castro St., Mountain View.
Carbon Monoxide Poisoning OverviewA group of EMTs will lead an overview of the warning symptoms of carbon monoxide poisoning and what steps to take to make sure carbon dioxide levels in one's home remain at safe levels. Dec. 10, 1-2 p.m. Free. Mountain View Senior Center, 266 Escuela Ave., Mountain View.
Community Events
Office Hours with Assemblyman Rich GordonAssemblyman Rich Gordon will host office hours in Menlo Park. Ask questions about legislation and other state issues, share one's thoughts on state government or request help with a state agency or department. Dec. 10, 8-9 a.m. Free. Cafe Zoe, 1929 Menalto Ave., Menlo Park.
Chris Marker Film SeriesStanford University will be showing Chris Marker films on select Tuesdays in November and December. The films will be played at 7 p.m. See website for more details. Free. Stanford University, Various locations, Stanford.
Argentine TangoStudents will learn Argentine tango dance fundamentals and technique tools that will enable students to dance in a "milonga" (social tango dance) while working on balance, posture, changes of weight, pivots, coordination and walking with grace. Tuesdays, Sept. 10-Dec. 10 8-10 p.m. $284/$382. Arrillaga Recreation Center, 701 Laurel St., Menlo Park.
Family and Kids
Mothers TogetherMothers Together is a women's community/religious group that offers Christ-centered support for women in their roles as mothers, wives, daughters and friends. Childcare available. Sept. 10-Dec. 10, Tuesdays, 9:30-11:30 a.m. $10 suggested donation for childcare. Menlo Park Presbyterian Church, Fellowship Hall, 950 Santa Cruz Ave., Menlo Park.
Hidden Villa Holiday Online AuctionHidden Villa will host its first Holiday Online Auction, featuring local items and more. All proceeds will support Hidden Villas educational programs and scholarships. See URL below to start bidding. Bidding begins Nov. 25 and will close Dec. 10. Cost of auction items. Hidden Villa Holiday Auction, Online, No venue.
Special Events
26th Annual Christmas Creche ExhibitThe Church of Jesus Christ of Latter-day Saints celebrates Christmas with this exhibit, which includes more than 350 nativities from around the world. Dec. 7-11, Noon-9 p.m. Free. The Church of Jesus Christ of Latter-day Saints, 3865 Middlefield Road, Palo Alto.
Boomer Exercise Ball BlastThis workout class uses exercise (stability) balls to help improve spinal stability, core strength and balance. Offered as a once-a-week or biweekly class. Tuesdays/Thursdays, Sept. 10-Dec. 12, 10:30-11:30 a.m. $156 (once a week). Portola Valley Town Center, 765 Portola Road, Portola Valley.
Brazilian Dance and Martial ArtsClasses in the Brazilian martial art Capoeira, as well as Brazilian dance for children and adults begin next month through the City of Palo Alto. Instructor Mestre Beicola is a native of Rio de Janeiro. Oct. 1-Dec. 12. Times and cost vary - see website. Lucie Stern Community Center, 1305 Middlefield Road, Palo Alto.
Art Galleries
The Collage CentennialThis exhibit features collages by 11 artists. The exhibit runs Oct. 1-Dec. 13, Monday through Friday, 9 a.m.-5 p.m. Free. Menlo College Administration Building, 1000 El Camino Real, Atherton.
Scott's Seafood Holiday DriveScotts Seafood in Mountain View is partnering with Community Services Agency (CSA) in Mountain View for its annual holiday sharing program, benefiting CSA. This year will be a pajama dive; drop off donations at the restaurant until Dec. 14 between 11 a.m.-9 p.m. Scott's Seafood Mountain View , 420 Castro St. , Mountain View .
Tied House Holiday Giving TreeTied House Microbrewery and Cafe is participating in a holiday sharing program benefiting the Community Services Agency in Mountain View. Tied House will be holding a fundraiser where guests can take an instant photo of themselves and the photo will be placed on a Christmas tree at the brewery. Dec. 10-15, 11 a.m.-10 p.m. $5. Tied House Microbrewery and Cafe , 954 Villa St., Mountain View .
Music: 'Illuminate This Night'In three concerts, the Peninsula Women's Chorus sings holiday music from around the world, culminating in Conrad Susas "Carols and Lullabies," a collection of carols originally from Spain, Catalunya, Puerto Rico, and Mexico, accompanied by marimba, guitar, and harp. Ticket information at www.pwchorus.org. Concerts are on Dec. 7 and 14 at 2:30 p.m. at St. Mark's Episcopal Church, 600 Colorado Ave., Palo Alto, and on Dec. 15 at 4 p.m. at St. Patrick's Seminary, 320 Middlefield Road, Menlo Park. $35 premium; $30 general; $10 student (18 and under). Two venues, See addresses above, Palo Alto and Menlo Park.
PASC Soccer TryoutsThe Palo Alto Soccer Club is holding tryouts for boys and girls U8 U14, from Nov. 23 to Dec. 15. PASC is forming competitive teams for spring/fall 2014 and encourages boys and girls born from Aug. 1, 1999, to July 31, 2006, to join try out. Times vary. Free. Various field locations, Various times in the afternoon and evening, Palo Alto.
Bethany Lutheran Church DonationsBeginning Nov. 1, Bethany Lutheran Church will be collecting donations to help feed the local hungry. The money raised will be used to support a Thanksgiving dinner for homeless people and Christmas food baskets for East Palo Alto families. Bring monetary donations to the Church Office by Dec. 15. No cover. Bethany Lutheran Church , 1095 Cloud Ave., Menlo Park.
Art Galleries
'Bibliophilia' ExhibitThe Palo Alto Art Center will host "Bibliophilia," an exhibition featuring drawings, paintings, and sculptural works by 14 artists who use discarded books as raw materials. The exhibit will be on display until Dec. 15, every day except Monday during art center hours. Free. Palo Alto Art Center, 1313 Newell Road, Palo Alto.
Family and Kids
Portola Valley Library Toddler StorytimeStorytime for toddlers (18-36 months) at the Portola Valley Library includes songs, stories, and activities to encourage reading. A craft activity follows storytime on Dec. 17. No storytime on Dec. 24 and 31. Dec. 3-17, Tuesdays, 10:30-11 a.m. Free. Portola Valley Library, 765 Portola Road, Portola Valley.
Family and Kids
Baby Bounce and Rhyme Time"Baby Bounce and Rhyme" combines singing, dancing, reading, and playing. This program is specifically for babies ages 0-18 months (although older children are welcome too). May 7-December 17, 11:15-11:45 a.m. Free. Atherton Library, 2 Dinkelspiel Station Lane, Atherton.
2013 Annual Food DriveFrom Oct. 21 through Dec. 21, Neighbors Helping Neighbors will place barrels or boxes at participating grocery stores and retail businesses during the food drive season. Sign up via doodle poll: http://doodle.com/xzep33n86kc4em3i. Volunteer to be a sorter, bagger or driver. 10 a.m.-6 p.m. Free. Various locations, Various addresses, Palo Alto.
Live Music
Live Jazz Music at Morocco'sMorocco's Restaurant hosts Johnny Williams and Steven Gary to perform live jazz music. On Tuesdays, the restaurant also does not charge a corkage fee. 5-9:30 p.m. Free. Moroccos Restaurant, 873 Castro St., Mountain View.
Art Galleries
'Time' Gallery ExhibitIn this Gallery 9 exhibit, 30 artists explore many facets of time: changing seasons and color, aging, clocks and other abstract metaphors. A variety of 2D and 3D media is on display at Gallery 9 through Dec. 24. Tues.-Sat., 11 a.m.-5 p.m.; Sun., noon-4 p.m. Free. Gallery 9, 143 Main St., Los Altos.
Art Galleries
Gallery House Holiday Show and SaleThe Gallery House Holiday Show and Sale features art gifts in all mediums and price ranges. There will be a public reception on Nov.22 from 6-8 p.m. at the gallery. In December, extended hours include Sundays, 11 a.m.-3 p.m. Event runs Nov. 17 to Dec. 24. 11 a.m.-8 p.m. Free. Gallery House, 320 S. California Ave., Palo Alto.
University Public WorshipWeekly sermons are scheduled at Memorial Church from 10-11 a.m. with music by university organist Robert Huw Morgan and the Memorial Church choir. Dec. 1, 8 and 24: Rev. Joanne Sanders, associate dean for Religious Life; Nov. 17 and 24: Rev. Scotty McLennan, dean for Religious Life. Dec. 22: Rev. Dr. C. George Fitzgerald. Dec. 29: Rev. Susan Scott. 10-11 a.m. Free. Stanford Memorial Church, 450 Serra Mall, Stanford.
Art Galleries
Portola Art Gallery Group ShowAt Portola Art Gallery during the month of December, artists will participate in the group show, Small Works...Great Values. Artists will showcase original works of art that are small in size but "large on value and creativity." Dec. 2-31, every day except Sunday, 10 a.m.-5 p.m. Free. Portola Art Gallery, 75 Arbor Road, Menlo Park.
Art Galleries
'Art Meets Technology'Art Meets Technology presents work by 10 individuals whose accomplishments reside at the intersection of art, science, mathematics and technology. The exhibit draws on manuscript collections from the Stanford University Libraries. Ongoing every day through Jan. 15, 2014. 9 a.m.-5 p.m. Free. Peterson Gallery and Munger Rotunda, Green Library Bing Wing, 459 Lasuen Mall, Stanford.
Foothill College Winter Quarter RegistrationFoothill College Winter Quarter classes will run Jan. 6-March 28. Continuing students can register Nov. 25Jan. 5 and new/returning students, Nov. 30-Jan. 5. Review more registration dates and instructions at www.foothill.edu. No fee to apply for admission; California residents pay $31 per unit plus basic fees. Foothill College, 12345 El Monte Road, Los Altos Hills.
Exhibit: 'Metaphors in Color and Form'The Los Altos Art Club presents its group art exhibit at the Oshman Family Jewish Community Center in Palo Alto, on display from Oct. 21 through Jan. 6. There will be an artists' reception on Friday, Nov. 15, 6-8 p.m., at the Schultz Cultural Arts Hall. Free. Oshman Family Jewish Community Center, 3921 Fabian Way, Palo Alto.
Affordable Mental Health ProgramDeborah's Palm - a community woman's center in downtown Palo Alto - has started an affordable psychotherapy program to benefit low-income women. Nov. 19-Jan. 19, Tuesdays, 4-7 p.m. Fees start at $40/hour. Deborahs Palm, 555 Lytton Ave., Palo Alto.
Insight Meditation South BayShaila Catherine and guest teachers lead a weekly Insight Meditation sitting followed by a talk on Buddhist teachings. Nov. 26-Jan. 21, Tuesdays, 7:30-9 p.m. Free (donations accepted). St. Timothy's/Edwards Hall, 2094 Grant Road, Mountain View.
MVLA Adult Education Winter/Spring 2014 RegistrationRegistration for the winter and spring 2014 sessions at Mountain View-Los Altos Adult Education begins on Friday, Nov. 22. Course catalog available online for viewing starting Monday, Nov. 18. Winter 2014 session is Jan. 6-March 21; Spring 2014 is March 24-June 6. Cost of classes. MVLA Adult School, 333 Moffett Blvd., Mountain View.
'Harmony IV': A Fine Art Photography ExhibitThe Peking Duck Restaurant hosts the sixth in a series of rotating exhibits featuring photographs by Lisa Tesler, Paul Italiano, Kevin Shannon and Gordon C. Ulrickson. Reception with the photographers and Richard Dischler will be held on Saturday, Dec. 7 from 3 to 6 p.m. Exhibit shows through Feb. 3, 2014. 11 a.m.-9:30 p.m. Free. Peking Duck Restaurant, 151 S. California Ave., Palo Alto.

subset: commoncrawl


text:
After public outcry from St. Armands Circle and downtown event organizers, city commissioners voted Monday to delay implementation of a new special-event fee schedule that those organizers said would put their events at risk.
"I'm not just threatening that these events will go away — they will go away," said Diana Corrigan, executive director of the St. Armands Circle Association, which organizes 20 annual events on the Circle.
At the meeting, the City Commission decided to discuss the fees further with Corrigan and downtown event organizers. It will then hold another hearing on the issue in December and possibly implement the fees in January.
Corrigan said with the new fees, her group would be charged between $15,000 and $20,000 for the use of St. Armands Circle Park.
"We pay to keep the park clean, and now they're going to charge us to use it," she said.
City Manager Bob Bartolotta had hoped to recoup about $40,000 of the more than $200,000 he said it costs in man hours to process special-event permits each year, which he said was just 10% of what the county charges.
"Those costs don't go away," he said. "We had to choose — do we charge the event organizer or do we charge the taxpayer?"
Bartolotta commissioned an analysis that estimated that the St. Armands Circle Association would only incur costs of about $10,000 to put on its events.
But Corrigan said that estimate did not include all of her events and did not account for the full setup and tear down time.
"The city manager is not giving the commission all the facts," she said. "He's trying to snow them."
Bartolotta proposed exempting 10 events each year from paying the fees. But Corrigan suggested only charging the out-of-town event organizers who don't pay local taxes and take their profits with them.
"I understand they're grasping at straws, looking for revenue," said Corrigan. "Charge the (event organizers) coming from out of town to use the parks. Don't charge us."
Currently 0 Responses
- Dec
23 Winter Camp
9:00 am - 5:00 pm - Dec
24 Winter Camp
9:00 am - 5:00 pm - Dec
26 Winter Camp
9:00 am - 5:00 pm - Dec
27 Winter Camp
9:00 am - 5:00 pm - Dec
28 The Nutrition Path Weight Loss
7:00 am - 1:00 pm - Dec
30 Winter Camp
9:00 am - 5:00 pm - Dec
31 Winter Camp
9:00 am - 5:00 pm - Jan
2 Winter Camp
9:00 am - 5:00 pm
Family reunion
Sarasota Observer news editor and native Sarasotan Nolan Peterson was reunited with his brother Air Force Capt. Drew Peterson Dec. 1, at Bagram Air Base in Afghanistan. -
Lights in Bloom
Selby Gardens' Lights in Bloom will officially open to the public Friday. -
Send in your favorite holiday moments to be included in our Jan. 9 issue.


text:
Don't ad-block us - support your favorite websites. We have safe, unobstrusive, robotics related ads that you actually want to see - see here for more.
0 Members and 1 Guest are viewing this topic.
can you not make an R/C robot without a microcontroller? i thought u just needed to plug servo's and batterys into revciver?!ThanksJoe
Started by simplywel Software
Started by india.robot Software
Started by zephyrus Misc
Started by George221 Electronics


text:
First released: 23.12.2009
Current version: 18.104.22.168
Last Update:31.12.2009
Agora Mk2
Maybe you are wondering ,why a new version of Agora skin,the last weeks i try to rework the agora player ,but it was somehow very limited and so i decide to make a new layout
(i was never 100% satisfied with the player).And so comes one to the other ,and here is the new version,Main things based on the original agora theme ,with small changes and clean ups.
Now the skin fell more lighter and not so heavy
orginal Agora skin is still available but no longer developed / supported!
MicroPlayer with PopUp:
Extensions: MR , LV , SIP
eee Version:
small Version:
eee version is movable ,Small version is resizeable from seek bar to AArt and info (like image above )
Agora Mk2 v1,0,0,1.mmip
Agora Mk2 eee v1,0,0,1.mmip
Agora Mk2 Small v1,0,0,1.mmip
MonkeyRok 5 Skin's Link
LV Agora Mk2.mmip Skin forLyrics Viewer by gege
SIP Agora Mk2.mmip Skin forSong Information panel by k_r_eriksson
Fixes / News
release eee and small Version
version 22.214.171.124
fix player font cutoff on XP
Peace and Love
Enjoy , and have some nice Days


text:
Gulf Front House, Boathouse/Spectacular View*New Central A/C in Horseshoe Beach
- bedrooms 4
- baths 2½
- sleeps 12
- pool no
- hot tub no
- pets allowed yes
- type House
- community
rates (USD)
/ night
$ 1,245 - $ 1,555 / week
vacation rental description
Looking to get away from it all? You have found it! Quiet,
peaceful Horseshoe Beach - Florida's Last Frontier in the heart of
Florida's Nature Coast. Enjoy spectacular sunsets and starlit
nights with only the sound of mullet jumping in the Gulf waters
merely steps away from this beautifully-furnished home.
Excellent Speckled Trout and Redfish fishing await you inshore in
the grass flats and offshore you'll find great grouper, snapper,
sheepshead and king fishing. Horseshoe Beach is the best area to
get scallops when in season (July thru early September).
The house has a very private location at the end of a street. Relax
and unwind....
property availability
Last modified on 12-11-2013 at 8:10 PM.
email owner view full calendar
Eileen or Fred
house rental amenities
Boathouse, dock, fish cleaning station, High-Speed Wireless/plug-in Internet Access, Central Air Conditioning, Ceiling fans, Washer/Dryer, Linens, Covered Parking or RV/Boat/Trailer, BR#1 w/ one Queen and one Full, BR#2 w/ one Queen, BR#3 w/ one Queen, Loft overlooking living room with two Queen beds, sleeper sofa and full bath, Satellite TV, DVD, gas fireplace, full kitchen, Cooking Utensils Provided, Refrigerator, Microwave, Gas Grill, Gulf-front, Telephone, large mid-level deck, full wrap around upper deck, freight elevator, spectacular ocean vistas, sunset views, public boat ramp. Pets ($50 clean fee) have visited and we may allow at our discretion, please ask.
activities and attractions in Horseshoe Beach Gulf Coast North
Fishing, scalloping, kayaking, boating, swimming, snorkeling/diving,
biking, hiking, hunting, nature seeking, local restaurant and
convenience store.
Horseshoe Beach is adjacent to the Lower Suwanee National Wildlife
Refuge with its 54,000 acres of protected wetlands, perfect for
birdwatching, wildlife photography and kayaking.
vacation rental rates
Credit cards, checks accepted
Standard Rate ....................... $1245/week up to six persons
Nightly Rate......................... $ 210/night (two night minimum, add x1.25 for holiday)
Additional per person nightly charge for over 7 people or more ....$25/night
Friday Afternoon to Sunday Afternoon. $ 520/weekend stay up to six
persons (x1.25 for holiday)
Holidays............................. $1555/week up to six persons
Monthly...............................(please inquire)
Renting done on first come first serve basis (payment holds date). No refunds with exception to forecated hurricane for Horseshoe Beach,Fl but can offer open dates as replacement days, or refund all done at our discretion.
50% of rent to hold dates, Balance and security/damage deposit due 60 days prior to start date.
9% Florida tax added to above rates.
$250-$350 refundable security/damage deposit (if all goes well).
$100 cleaning,$50 add'l pet fee is required for all rentals
Note: Smoking outdoors only. Until confirmed, rates are subject to change without notice.
Eileen or Fred
payment methods
Owner has not provided their accepted payment methods
Prior to paying a reservation deposit, always verify payment instructions by calling the phone number displayed on this listing page. By contacting the owner directly and paying by an approved method - credit card, paypal, check or bank transfer - your reservation payment will be protected up to $1,000.
Learn more in our Security CenterTop things to do in Horseshoe Beach
- Go fishing
- Go crabbing
- Watch beautiful sunset from your private deck
- Go kayaking; explore nature preserves
- Relax!
Eileen or Fred , owner


text:
피드 수집기
MariaDB world record price per row 0.0000005$ on a single DELL R710
200 Billion records in a month and it should be transactional but not durable.
For regular workload we use LOAD DATA INFILE into partitioned InnoDB, but here we have estimated 15TB of RAID storage. This is a lot of disks and it can't no more stay inside a single server internal storage.
MariaDB 5.5 come with TokuDB storage engine for compression, but is it possible in the time frame impose by the workload?
We start benchmarking 380G of raw input data files, 6 Billion rows.
First let's check the compression with the dataset.
Great job my TokuDB 1/5, without tuning a single parameter other than durability! well i love you more every day my TokuDB.
My ex InnoDB, 30% compression missed in 8K, very bad compression ratio and slow insertion time. Don't worry InnoDB i still love you in memory :)
Ok every love affair have a dark side :)
So now you can see that it works for 200 Billions rows because it give 277 hours of processing time at 200K insert/s.
In a month if we impose 12 hours, 6 days a week of processing with full capacity this is 288 hours.
That was very short, getting compression over 200 Billions records and without sharding will be hard.
Fortunately MariaDB 10 have native network partitioning using the spider contribution don't miss that.
#002b64 is the new black (or #181818)
For my 25 readers (Italians would know better, citing The Betrothed by Alessandro Manzoni): if you are a techie and you do not know me , you can stop reading. No tech tips inside, nor 5 gazillion queries per second improvement in this post, sorry!
On the other hand, if curiosity is what drives you through the posts of PlanetMySQL you may find bits in this post of some interest, or even helpful.
Few days ago I opened my blog and found the last post, dated April 2013. It was a reminder for the readers that the OpenStack Summit and Percona Live were coming. A list of suggested talks was my contribution to the topic, followed by the usual advertisement for my personal talks, humbly secluded at the bottom of the post, 4 lines each.
After that post, I went completely silent. I did not add any more info, I had very few contacts at Percona Live and other events.
The last 6 months have been a roller coaster. The merge of SkySQL and Monty Program have dominated the scene, at least in my life and in the life of many at SkySQL. We have worked hard - and we are still working hard - in defining the balance between MariaDB Server as a Community project and MariaDB Enterprise as a product for our customers. We want to do things right for the Community, for our customers, for our investors and for us, and this is not an easy task to achieve.
Three weeks ago MariaDB 10 went beta. That was an amazing achievement from the MariaDB team but let's not forget the immense effort coming from external contributors. The large number of new features into this version justify the jump from 5.5 into 10. The objective of this release is to create a bridge between the "legacy" of MySQL and a NewSQL: although I fairly dislike this artificial term, it gives a clear idea of what to expect from the software in the current and in the future releases.
There are plenty of features in MariaDB 10 that will attract more than the standard audience, i.e. the typical MySQL user. The improvements in the optimizer, for example, can be a game changer for the ones who have to deal with auto-generated queries. The use of the Connect storage engine make data analysis and reporting way more simple, since you may not need to load a large set of data, in many cases you can simply connect external sources to read or write this data. And so the Spider engine has been significantly improved: it is now as simple and effective as table partitioning, so a "basic" sharding approach can be implemented with very few changes and virtually zero downtime.
My favourite enhancements are in the Replication. Multi-source replication, combined with the use of a new Global Transaction ID and Parallel slave threads, make now possible to use MariaDB in a way that was not possible before. With the combination of Galera Cluster, high availability can now come out of the box, both inside the data center of with geographical replication for disaster recovery. It is now possible to create a grid of MySQL servers and distribute the workload on many different servers in a way that was not possible before.
I will present different scenarios on how these technologies can fit together in future posts.
If the MariaDB team has worked so hard on the new generation of MySQL, let's not forget the big effort of the MySQL team in making InnoDB in 5.6 even better. This may be no news, but it is what makes MySQL and MariaDB an even more scalable, solid and reliable engine today.
I should carry on with the list of players in the MySQL world, starting from Percona of course, and mentioning the players in the storage engine as Tokutek, ScaleDB, Calpont and others. The list is pleasantly long.
Community and EnterpriseIf you have not figured it out yet, the hex number in the title a RGB code. It is the code used in the menu bar of mariadb.com. Now, if you turn your surf board to mariadb.org, you will see the menu bar in black (nearly black, the correct RGB code is #181818). So, the work on mariadb.com is what kept me away for a long time from the public.
Monty, Sergei and the MariaDB team are working hard to consolidate MariaDB 10 and make it GA as soon as it is reliable and ready for production. At the same time, a small team at SkySQL is working on what goes under an umbrella named MariaDB Enterprise.
We have used the term Enterprise to identify a ready-made business proposition, something that Marketing teams love to call Enterprise-grade solution. The term is pretty effective, but if you want to refer to these aspects using different terms, with Enterprise we refer to a set of software components and services that are combined together to provide accessible and valuable features around MariaDB and MySQL.
The core of the first release of MariaDB Enterprise is a MariaDB Galera Cluster. The instrumentation goes under the name of MariaDB Manager and it covers a combination of components for provisioning, administration and monitoring of MariaDB Galera Cluster.
One of the most interesting features provided by MariaDB Manager is a RESTful API that can be used to integrate and orchestrate the cluster. With a simple call to the API, you can provision a new Galera node and add it to an existing cluster. You can also integrate external tools like Nagios, Cacti, Graphite, Splunk and others to Galera for Monitoring and alerting. This is offered in combination with the use of MONyog, that comes as an option, as it is a monitoring tool that SkySQL customers know very well. MariaDB Manager also offers a standard Graphical User Interface, although it is still experimental and external contributors have already presented other GUI options.
Enterprise and Open SourceHaving called this new offering Enterprise does not necessarily imply that the software inside it closed source. At the moment, only MONyog inside MariaDB Enterprise is offered under a commercial license for closed source software, the rest of the components are open source. The "Enterprise value" comes from the combination of services (support, consulting and remote administration) and software combined together in what we identify as patterns and usage scenarios. In the near future you will see more posts from me and from others at SkySQL who will explain and present more in depth the features you will find in MariaDB Enterprise.
With an approach that some of my ex-MySQL friends and colleagues may certainly remember, we want to sell a product to users who have some money and no time, and at the same time we are happy to help the ones who have some time but no money. For the latter group, I really hope the posts we will publish and the knowledge base at mariadb.com will be of great help, and eventually they will contribute to the project or they will ask for SkySQL Services.
So, stay tuned with the SkySQL blogs and with PlanetMySQL. Lots of news new material is on the way.
MariaDB Database Disk snapshot backups on Windows
Using Snapshots to backup on Linux or Windows works well, assuming that the storage engine you use can recover on startup, the backups created this was are physically consistent but not logically, but InnoDB will recover this. Also note that any warnings about using snapshots with MyISAM also applies to the mysql database, i.e. the database metadata. Usually though, this is not an issue, but if you want to protect yourself even more then use a FLUSH TABLES WITH READ LOCK and backup the MyISAM tables separately somehow. But this is no different between Windows and Linux in this case, this is an attribute of any kind of disk snapshot backups.
VSS is a services that run on Windows and to utilize it some programming is needed, but luckily that has already been done for us, there is a simple utility called VSHADOW.EXE available from Microsoft that can be used to access the VSS service. Some version of Windows, such as Windows Server 2008, Windows Server 2012 and also with a version of Windows that is very little used, probably there are more users of Windows 3.10, than of Windows 8, come with DISKSHADOW.EXE, a utility that does the same thing, basically, but has a different interface. In Windows 7, that I tested on, there is VSSADMIN.EXE instead, but as VSHADOW.EXE can be added, I downloaded that one as it is more functional (It is part of the Windows SDK). All this mess (c) Microsoft.
So, how does this work then? As I said, this is different than on Linux (what? Windows being different than Linux? No kidding?). Using the API you can create two types of snapshots, persistent and non-persistent. The difference is that a persistent snapshot is one that remains until specifically removed, whereas a non-persistent one goes away when the program that created it exists. As we are about to take a backup here, I guess you think we want a permanent one, but that is not so, as VSHADOW can run a command file for us, before it exists.
I will use an example here, for that I have placed my MariaDB data on the E-drive in a directory called \data, which means my my.ini has this line in it:
Next question then is where the snapshot is placed? Well, the snapshot ends up as a Windows device with a name along the lines of \\?\Volume{5b3610ce-d2cb-11e2-a649-2cd05a8ad0c9}\ which is just as easy to remember and type as the novel War and Peace (Yes, Tolstoy was a Windows guy, I guess you didn't know that!). Yes, again, thank you Microsoft, Windows is SOO user friendly! Anyway, yet again VSHADOW helps us out, as it can create a command file for us that will contain the names of the devices and some other things. It can look something like this and I have called it vss-setvar.cmd:
@echo [This script is generated by VSHADOW.EXE for the shadow set {c8fcb322-ce02-409a-b609-7fc04311fad1}]
SET SHADOW_SET_ID={c8fcb322-ce02-409a-b609-7fc04311fad1}
SET SHADOW_ID_1={11243eaf-0234-4784-92e1-9bc24668b5b4}
SET SHADOW_DEVICE_1=\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy8
OK then, so this is generated for us, how do we use that? Well, what we do is create a command script that is called by VSHADOW as I said before, and this calls the generated scripts to get all the details. An example script, that I call e-backup.cmd, can look like this:
call vss-setvar.cmd
@echo off
dosdev T: %SHADOW_DEVICE_1%
robocopy T:\Data C:\Backup /MIR
dosdev /r /d T:
There are still a few missing bits here though. The call command is calling the generated file as above (you can call this anything you want, see the example command line below) and what about the command DOSDEV? What is that, that is a simple little utility you can find on the net (Google is your friend) that allows you to create a DOS device from a device descriptor, and it can also remove them. There are other ways of dealing with this, but I choose this path my my example here. Robocopy you probably know already and the /MIR option is used to tell robocopy to mirror a full directory tree.
So what the command script above will do is create a DOS device called T: for my snapshot, copy that to a directory called C:\Backup and then remove the T: device.
Now we have a command script (not two, the first one I showed was an example of a generated one) and an idea what it does, to do a shadow copy now, we just need to call vshadow, and it will do the work for us. We pass three parameters:
- The name of a script with the device names and things to generate.
- The name of a script to run
- The name of the drive to create a shadow device of.
vshadow -script=vss-setvar.cmd -exec=e-backup.cmd E:
So that's about it, now you know how to create an online snapshot backup of a MariaDB database on Windows.
Workaround for CURRENT_TIMESTAMP as default for a DATETIME value
This is fixed in MySQL 5.6 and MariaDB 10 which allows you to use a construct like this:
mysql> CREATE TABLE td1(
c1 INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
c2 DATETIME DEFAULT NULL());
So what can you do if you are on MariaDB? Well, you can use a trigger to achieve a similar result:
mysql> CREATE TABLE td1(
c1 INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
c2 DATETIME DEFAULT NULL());
delimiter //
mysql> CREATE TRIGGER td1_ins BEFORE INSERT ON td1 FOR EACH ROW
IF new.c2 IS NULL THEN
SET new.c2 = now();
delimiter ;
And then this works:
mysql> INSERT INTO td1 VALUES(NULL, '1960-04-10 16:45');
mysql> INSERT INTO td1 VALUES(NULL, NULL);
mysql> INSERT INTO td1(c1) VALUES(NULL);
mysql> SELECT * FROM td1;
| c1 | c2 |
| 1 | 1960-01-04 16:45:00 |
| 2 | 2013-11-23 15:57:51 |
| 3 | 2013-11-23 16:00:55 |
4 rows in set (0.00 sec)
Is this perfect? Nope, but it works while we wait for MariaDB 10.
Bet the company! Just do it!
But how often do you see a major company betting itself on one single product line? Not that often I say, but that might be because I do not know industries outside IT and Cars that well, and also you tend to forget the failures and the associated companies.
One reasonably well-known failure was the Schlitz Brewing Company that went downhill in the early 1980's after betting on new technologies in making beer to produce a less expensive beer to produce and increase margins. In the process though, the beer, even for American beers at that time, went of to taste even less, if that is possible and also the beer looked awful. So Schlitz lost it's customers and went downhill and was acquired a few times. Their most innovative Brewery, as far as technology goes, still exists, is owned by Anheuser-Busch and produces, well, you can guess it by now, Bud Light.
Anyway, enough of interesting things such as cars and beer, let's get back to boring computers again. Some of the biggest bet-the-company project we have seen are in the IT industry, one is when Microsoft decided to go with Windows, skipping out of the development of OS/2. If you look back at it now, and consider that at that time, IBM was still the dominant player and also that IBM had brought Microsoft to the position it was in (by giving them the right to print money, sort of, in the shape of allowing Microsoft the rights to DOS), this was pretty risky bet by Microsoft, but it worked out. There were more IT bet-the-company projects in the 1980's, from Commodore and Atari and so on, but they were largely failed. Also, we have Apple giving us the Mac, but in this case, Apple as a corporate entity never was betting on the Macintosh until it had proven itself in the marketplace.
But I think that one of the most substantial bet-the-company projects ever, in any industry, was when IBM bet on the 360 architecture in the beginning of the 1960's. At the time IBM had a huge array of conflicting and incompatible lines of computers, and this was the case with the computer industry in general at the time, it was largely a custom or small scale design and production industry, but IBM was such a large company and the problems of this was getting obvious: When upgrading from one of the smaller series of IBM computers to a larger one, the effort in doing that transition was so big so you might as well go for a competing product, the effort was actually similar, you had to redo everything. So IBM was getting some serious competition from the "BUNCH" (Burroughs, Univac, NCR, CDC and Honeywell) as they were called later when General Electric and RCA left the field of computing in the late 1960's.
Yes, the IBM 360 was truly revolutionary. It was a whole new range of computers, including software, hardware and peripherals. It had a whole bunch of features we now take for granted, like the 8-bit byte addressing (yes, this was not an obvious feature and the term "byte" itself, although not invented for the 360, was first used by IBM and was made 8-bits and nothing else with the 360-series). The risk that IBM took with the 360 series was enormous, and this is another factor of what bet-the-companies all about: taking a really big risk. Looking at what Xerox did, or rather didn't do, with PARC, explains a big chunk of why PARC was a failure, in terms of turning Xerox around, and why the 360 was not. The 360 really did turn IBM around, and many at IBM was not happy with the way that the 360-series was developing and what it was doing to existing IBM product lines, but the IBM management at that time stood by their decisions. As for Xerox in the 1970, they were much less supportive of PARC (and this is a gross understatement).
Anyway, the IBM management that dared taking the 360-project is to be applauded, and I think we need more of this kind of daring management, stuff is just happening too slow and it's time for a quantum leap. And although there is a risk to betting-the-company, the gains can be enormous and the effects of NOT taking that risk is also betting-the-company (look at those office equipment manufacturers that didn't dare to go into computers).
I think this is only of the issues with many Open Source projects, they are run and supported by people using the project the way it works today, and hence has limited interest in taking a huge risk at some new, unknown technology that currently has limited value for them. As Henry Ford said: "If I had asked people what they wanted, they would have said they wanted a faster horse".
MariaDB Dynamic Columns client API
As you have seen if you have read my previous blog on this subject, or whatever is written about MariaDB Dynamic Columns elsewhere, which is not much, MariaDB actually has no external representation of the dynamic column: Either you get the binary representation or you parse the binary representation using one of the supplied functions (like COLUMN_GET to get the value of an attribute in a dynamic column) or you get the binary. The only exception is the function COLUMN_JSON that retrieves the whole dynamic column and converts it to JSON, supporting nested objects also. Regrettably, there is no built-in means of adding a dynamic column in JSON format (Ulf Wendel has provided some JSON User Designed Functions though, but they don't line up with Dynamic Columns on the other hand).
Now, if we assume we are not using the COLUMN_GET function or something like that, can I programmatically parse a dynamic_column on the client? Well, I could sure use the server functions again, calling COLUMN_LIST and functions like that from a SELECT statement or in a Storage Procedure (I'll show this later), but what is real handy (if you are a C-developer like myself) is the DynamicColumns API functions in the MariaDB Client Library.
To begin with, these functions are not as easy to use as it might seem in the Knowledge Base article mentioned above. There are some bugs in what files are required that currently makes it kind of messy to build programs that use the Dynamic Columns API (which brings up another question: How many times can you write Dynamic Columns in one single blogpost?) This will be fixed eventually (it is known, reported bugs we talk about here), but until it is, let me show you some examples, so you get the point of this API.
To begin with, the API assumes that data passed to it is in the form of a DYNAMIC_COLUMN struct, which is a string with a specified length, i.e. it is NOT a null-terminated string but instead it is really, truly binary. This might be silly, but it is just how things are. So the DYNAMIC_COLUMN struct is set up with the data you got from a MariaDB Dynamic Column binary data. Still, this might not be valid Dynamic Column data, so to check that you should call the mariadb_dyncol_check() referencing this data to make sure it is valid Dynamic Column data.
The function that you then want to use is by far the most powerful one, mariadb_dyncol_unpack(). This will unpack a MariaDB dynamic column are retrieve the basic information on it:
- How many attributes there are (how many "Dynamic Columns")
- What the names of those attributes are.
- The the values of those attributes are.
I spent some time playing with this, most of that time was spent understanding how the API was meant to work and how to build an application on it. One night, after some heavy drinking, I decided that the best way to show this would be to write some code, instead of just blog about it on and on, so still severely drunk I wrote a simple tool for extracting Dynamic Column data from MariaDB and show it in some different ways (JSON, pretty JSON, Indented dynamic columns etc). To allow you to build it yourself I used autotools, but fact is to use that, you have to also copy some includefiles from the MariaDB source distribution (the reason is those bugs I mention above).
So there is a pre-built executable (I built this on an Ubuntu 10.10) that assumes you use the MariaDB 10.x Client Library (I used 10.0.4). If this doesn't work, as I said, you can always build it yourself (which isn't a throughly tested procedure). Also, for any of this to work, you need the Jansson JSON library.
I'll develop some more Dynamic Columns related tools eventually, but for now this is what I have in the dyncoltools toolset, the dyncoldebug tool available on sourceforge.
Optionutils 2.7 released
The cool thing with this library is that it is generic and largely follows the MySQL / MariaDB style of options and config files. Handling commandline options and config files in C is otherwise something you largely have to do yourself. This little library handles all that for you, and it is also quite advanced and has many cool options, such as support for integers and string with proper type checking, array of values, a kind of associative arrays is also supported, as well as configuration files with the MySQL format.
Version 2.7 of optionutil, including full documentation, is now available for download at sourceforge.
Using 4-byte UTF-8 (aka 3-byte UNICODE) in MariaDB and MySQL
Help is on the way though, in the utf8mb4 character set that is part of both MariaDB and MySQL. This is a character set that is just like the one just called utf8, except this one accepts all the UNICODE characters with up to 3 UNICODE bytes, or 4 bytes using the UTF-8 encoding.
This means that there are more limits to how long a column might be when using utf8mb4 compared to latin1 and even when compared to utf8. Let's try it:
First, I don't want MySQL to substitute any data types for me (why I would EVER want that is beyond me):
mysql> set sql_mode='strict_all_tables';
Query OK, 0 rows affected (0.00 sec)
Then we can create a table to hold a message using the latin1 character set:
mysql> CREATE TABLE msg(msgid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, msgtext VARCHAR(65528) CHARACTER SET latin1);
Now, we know this isn't terribly international, so lets go with UTF-8 instead:
mysql> DROP TABLE msg;
Query OK, 0 rows affected (0.12 sec)
mysql> CREATE TABLE msg(msgid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, msgtext VARCHAR(65528) CHARACTER SET utf8);
ERROR 1074 (42000): Column length too big for column 'msgtext' (max = 21845); use BLOB or TEXT instead
OK, that didn't work, so we'll reduce the size of the msg column and try again:
mysql> DROP TABLE msg;
Query OK, 0 rows affected (0.05 sec)
mysql> CREATE TABLE msg(msgid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, msgtext VARCHAR(21842) CHARACTER SET utf8);
Query OK, 0 rows affected (0.29 sec)
OK, so now we have a table with a UTF-8 column in it. Let's insert some data into it:
mysql> INSERT INTO msg VALUES(NULL, 'Some test message');
Query OK, 1 row affected (0.04 sec)
mysql> INSERT INTO msg VALUES(NULL, 'Some test message with utf8 åäö');
Query OK, 1 row affected (0.01 sec)
Right. That was OK. But what happens if we insert a 3-byte UTF-8 character into this table, say a "smiling face with horns" which is UNICODE 01F608 or as UTF-8 F09F9888. We do this using the MySQL UNHEX function:
mysql> INSERT INTO msg VALUES(NULL, CONCAT('Some test message with 3-buyte UNICODE ', UNHEX('F09F9888')));
ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x98\x88' for column 'msgtext' at row 1
Hmm, too bad, back to the drawing board and let's use the utf8mb4 character set:
mysql> DROP TABLE msg;
Query OK, 0 rows affected (0.08 sec)
mysql> CREATE TABLE msg(msgid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, msgtext VARCHAR(21842) CHARACTER SET utf8mb4);
ERROR 1074 (42000): Column length too big for column 'msgtext' (max = 16383); use BLOB or TEXT instead
Close, but no cigar I guess. We need to further reduce the size of the msg column, as each utf8mb4 character potentially takes up 1 more byte than when using utf8. So try this instead:
mysql> CREATE TABLE msg(msgid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, msgtext VARCHAR(16382) CHARACTER SET utf8mb4);
Query OK, 0 rows affected (0.29 sec)
OK, this worked better, now let's try that insert again:
mysql> INSERT INTO msg VALUES(NULL, CONCAT('Some test message with 3-byte UNICODE ', UNHEX('F09F9888')));
Query OK, 1 row affected (0.00 sec)
Cool, now we have some data in there, let's then just check if this really is a 4-byte UTF-8 encoded character in there.
mysql> SELECT LENGTH(msgtext), CHAR_LENGTH(msgtext) FROM msg;
| LENGTH(msgtext) | CHAR_LENGTH(msgtext) |
| 43 | 40 |
1 row in set (0.00 sec)
As can be seen, length(which returns the length of the column in bytes) returns a value 3 longer than the number of characters, which is just right!
So in conclusion, as utf8mb4 really is a superset of utf8, should I always use utf8mb4? No, you shouldn't, as in most cases you don't need those 3-byte UNICODE characters in strings for names, places, companies etc. But in this case, when it comes to some free format text that the user enters, then it might be useful. Also, as I have pointed out before, even though this is VARCHAR, which is variable length, there are situations where the full possible length is used, such as when the table data is sorted. And finally, as for collations, these are slightly different than those for utf8, but they are all there, like utf8mb4_bin, utf8mb4_general_ci, utf8mb4_unicode_ci etc.
I'm really bored with character sets and UNICODE and stuff like that now, so my next blog will NOT be about the fascinating subject of Byte Order Marks (BOM).
How MariaDB and MySQL makes life with UTF-8 a bit too easy. And how to fix it...
So, let's begin with UNICODE. UNICODE is a character set that is very complete, you should be able to make yourself understood in any language using the characters from this vast character set. This is not to say that all characters from all languages are in UNICODE, some are missing here and there and sometimes new characters make their way into languages, like different currency signs and stuff like that. In general though, you can use all the more than 100.000 characters in UNICODE to express text in any language.
So, then we know UNICODE; what is UTF-8, UTF-16 and all that? Those are ways to represent the bytes that make up UNICODE. The smartest, and most common, of these, by far, is UTF-8. To represent the highest byte-value of a UNICODE character, you would need 3 bytes for every character, but this is wasting space. Also, this would mean that all old program code that assumes that a character is 1 byte only (with 7 bits representing the good old US ASCII characters, but there are local variations of this, or interpreting up to 8 bits as latin1). Ken Thompson fixed this for us though with the UTF-8 representation.
UTF-8 is variable length, and the way this works is that if the first (highest) bit is 0, then this is a character in the range 0-127. If you stick with US ASCII, you can say this is actually UNICODE represented as UTF-8, as the 128 "first" caharacters in UNICODE are the same as 7-bit US ASCII. No issues there. When there are more than 1 byte to the character, then at least the first bit is 1 and the number of leading 1's, up to the first 0, tells how many following bytes there are. So the first byte either starts with 0, in which case there is 1 byte only, or with 110 (10 would mend 1 byte, but that starts with a 0). This in turn means that the first byte never starts with the bit pattern 10, so 10 is used as the leading bit pattern for any of following bytes. Using this scheme you can't represent as many bytes as you want, as you run out of 1's in the first byte, but enough bytes for UNICODE at least! And it's US ASCII compatible.
Potentially you should be able to have 8 bytes in total (all bits set to one in the first byte and then 7 following bytes). As the following bytes all start with 10, only 6 bits are significant, and as we have used up all the significant bits in the first byte, this means that we can now represent 7 * 6 = 42 bits of data or 5 bytes + 2 "extra" bits. But the scheme was never intended to go this far, originally it was envisioned that UNICODE might use all up to 6 bytes in the UTF-8 encoding (this doesn't mean that we would have that many characters, not all code-points are used as characters are organized in separate codepages). Eventually it was agreed that UNICODE would only use up to 21 bits or slightly less than 3 bytes, which encoded as UTF-8 requires up to 4 bytes.
So, now back to good old MySQL. MySQL does support UNICODE and it supports UTF-8, right, so we are all set then? Nope, I'm afraid not. You might have seen that MySQL makes space 3 * in a CHAR or VARCHAR column, to make sure that a 3-byte UTF-8 character can fit. In a VARCHAR that might not be significant, as it is variable length anyway? Right? Nope, depending on the MySQL Storage Engine, VARCHAR is actually allocated to the full potential length. OK, but you use InnoDB anyway, which doesn't behave like this, so you are in the clear? Again, I have to disappoint you, unless you never sort on that column, you need consider this as sorting involves sorting the potential length of data! Also, if you use the NDB Stoarge Engine and use Disk Data, you have the same issue (see: http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster-disk-data-storage-requirements.htm).
But there is another thing that might have caught your attention in the above section. I write that MySQL allocated 3 bytes per UTF-8 encoded UNICODE character, but I also say that UNICODE, when encoded as UTF-8, might occupy up to 4 bytes? What is going on is that the MySQL UTF-8 encoding is limited to 3 bytes, which means that MySQL can, when using UTF-8, not represent the whole UNICODE character set, specifically, it is limited to 4 + 6 + 6 = 16 bits or 2 bytes. This might not be a big deal, but it depends on your situation. I was reading up on this on Wikipedia for example, and it says "Three bytes are needed for characters in the rest of the Basic Multilingual Plane (which contains virtually all characters in common use[11]). Four bytes are needed for characters in the other planes of Unicode, which include less common CJK characters and various historic scripts and mathematical symbols." but this isn't altogether true, but someone who implemented the original UTF-8 probably read something like this.
What one has to understand is that UNICODE isn't only about languages, it's also about symbols, such as currency signs etc. But again, most of this also lives in UTF-8 3-byte space (even new ones do, as there is unused space in UNICODE). But then Facebook and Twitter comes around and screws it all up and nothing works again :-( suddenly the use of Smileys exploded. And this is where trouble starts. The simple smileys, like :-) all fit within 2 bytes of UNICODE, but the more advanced ones do not! Oh my!
There is help on the way though, as MySQL also supports a full UTF-8 encoding called (in MySQL lingo then) utf8mb4. Now you know what that is used for!
But I'm going to close here, and follow up real soon with a blog specifically on using utf8mb4. Fun, isn't it!
MariaDB Dynamic Columns
But ignoring the Cassandra engine for a while, let's look at what us mere mortals, brought up on mothers milk, SQL and Relational Theory under the watching eyes of E.F. Codd, can use this for, and fact is that it can be quite useful. All in all, what Dynamic Columns provide here is a means of adding non-schema data to a row in a structured way, you know where you used to emulate an array or something in a VARCHAR or use full blown Anchor Modelling for properties.
Which is not to say that Dynamic Columns is the best things since sliced bread, but it does have some good uses, so let me show you how they work. To begin with, a Dynamic Column contains structured data in the form of one or more pairs of <attribute name> = <attribute value>. In MariaDB 5.5, <attribute name> was numeric, in 10.x it is a proper name as it should have been from the start. All examples here assume you are using MariaDB 10.x.
The attribute names are not predefined or in a schema or anything, each instance of a Dynamic Column (i.e. every Dynamic Column in every row) might have different attributes with different values and types. And yes, is typed, but typing is automatic per instance of a Dynamic Columns (i.e. every Dynamic Column in every row of the table might have different type for an for the same ). The possible types are:
- String (Binary or Normal)
- Date
- Datetime
- Decimal
- Double
- Integer (Signed or Unsigned)
- Time
- Dynamic column
First, lets create a table that holds some useful attributes, in this case I have a table with my users, and for each user I want to store a range of mixed attributes that the application finds useful, but which are not in the normal TABLE schema, such a birthplace, car make, etc etc.
CREATE TABLE users(userid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(255), firstname VARCHAR(255), lastname VARCHAR(255), attrs BLOB);
Now we have to insert some data into this table. To create a Dynamic Column value you use the COLUMN_CREATE function which takes a even variable number of arguments, which are name value pairs. For example:
INSERT INTO users VALUES(NULL, 'bloggs', 'Joe', 'Bloggs', COLUMN_CREATE('shirtsize', 'L', 'colorpref', 'red'));
INSERT INTO users VALUES(NULL, 'doe', 'John', 'Doe', COLUMN_CREATE('shirtsize', 'L', 'vegetarian', FALSE));
Now we hopefully have some data in the table, and as you can see, we are mixing schema data with schemaless data in the same row. Before I end for this time on this subject, let's get a look at that data in the attrs column. There are a few different means of doing that, either you can get a specific Dynamic Column value, like this:
SELECT COLUMN_GET(attrs, 'colorpref' AS CHAR) FROM users;
| COLUMN_GET(attrs, 'colorpref' AS CHAR) |
| red |
2 rows in set (0.00 sec)
Or I can get all the attributes of a dynamic column in one go, in which case I get JSON back:
SELECT COLUMN_JSON(attrs) FROM users;
| COLUMN_JSON(attrs) |
| {"colorpref":"red","shirtsize":"L"} |
| {"shirtsize":"L","vegetarian":0} |
2 rows in set (0.00 sec)
That's it for now, but I'll be back with some more details and some cool things you can do with MariaDB Dynamic Columns!
Common Errors and Resolutions for Building your own MySQL or MariaDB C/C++ Program on Windows
In my previous post, Creating a basic C/C++ Program to Interact with MySQL and MariaDB, I ran into some errors along the way, so I wanted to share those and their resolutions.
1. fatal error C1083: Cannot open include file: 'mysql.h': No such file or directory
mysql1.c mysql1.c(2) : fatal error C1083: Cannot open include file: 'mysql.h': No such file or directory
At this point, my cl command was:
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" mysql1.c
So I needed to include the directory that contained mysql.h as well. So the above changed to:
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files\MySQL\MySQL Server 5.5\include" mysql1.c
2. error C2061: syntax error : identifier 'SOCKET'
This was actually a small slew of simple syntax errors. I could tell it wasn't the code, so I must have left something else out. Here was the full output/error:
mysql1.c c:\..\mysql_com.h(291) : error C2061: syntax error : identifier 'SOCKET' c:\..\mysql_com.h(337) : error C2059: syntax error : '}' c:\..\mysql_com.h(451) : error C2143: syntax error : missing ')' before '*' c:\..\mysql_com.h(451) : error C2143: syntax error : missing '{' before '*' c:\..\mysql_com.h(451) : error C2371: 'Vio' : redefinition; different basic types ... C:\..\mysql.h(374) : error C2143: syntax error : missing ')' before '*' C:\..\mysql.h(374) : error C2143: syntax error : missing '{' before '*' C:\..\mysql.h(374) : error C2059: syntax error : ')' C:\..\mysql.h(375) : error C2143: syntax error : missing ')' before '*' C:\..\mysql.h(375) : error C2143: syntax error : missing '{' before '*' C:\..\mysql.h(375) : fatal error C1003: error count exceeds 100; stopping compilation
This plethora of errors indicates we're missing the windows.h header file:
To fix, add the following to the program (which is already included in the program I provided), and then see #3 below:
#include <windows.h>
3. fatal error C1083: Cannot open include file: 'windows.h': No such file or directory
mysql1.c mysql1.c(2) : fatal error C1083: Cannot open include file: 'windows.h': No such file or directory
Similar to #1, we need to add another include path, the one that contains windows.h. You can search your system for windows.h with:
dir windows.h /s
For me, this returned:
c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include
So to fix it, I added it with another /I, so my command became:
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files\MySQL\MySQL Server 5.5\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MD "C:\Program Files\MySQL\MySQL Server 5.5\lib\libmysql.lib" mysql1.c
4. mysql1.obj : error LNK2019: unresolved external symbol _mysql_close@4 referenced in function _main
In fact, there were 4 similar altogether:
mysql1.obj : error LNK2019: unresolved external symbol _mysql_close@4 referenced in function _main mysql1.obj : error LNK2019: unresolved external symbol _mysql_real_connect@32 referenced in function _main mysql1.obj : error LNK2019: unresolved external symbol _mysql_init@4 referenced in function _main mysql1.exe : fatal error LNK1120: 3 unresolved externals
Turns out this indicates some 32-bit and 64-bit mis-matches.
I had forgot that while I'm on a 64-bit machine, and have 64-bit MySQL already installed (I'm using that header file in my include path), the VS Express is 32-bit. So I need to use a 32-bit header (and different include path), which I downloaded and extracted. So my new command became:
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MD "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.lib" mysql1.c
5. The program can't start because libmysql.dll is missing from your computer
mysql1 mysql1.exe - System Error The program can't start because libmysql.dll is missing from your computer. Try reinstalling the program to fix this problem. [OK]
In this case, I just wanted to get it built, so I simply copied libmysql.dll and libmysql.lib to this working directory. As I mentioned in my previous post, there is probably a better fix than this, but this worked quickly for now anyway.
6. error LNK2019: unresolved external symbol __imp__RegCloseKey@4 referenced in function _win_init_registry
Again, in this case, there were several similar unresolved external errors, so let me post them all:
mysqlclient.lib(my_init.obj) : error LNK2019: unresolved external symbol __imp__RegCloseKey@4 referenced in function _win_init_registry mysqlclient.lib(my_init.obj) : error LNK2019: unresolved external symbol __imp__RegEnumValueA@32 referenced in function _win_init_registry mysqlclient.lib(my_init.obj) : error LNK2019: unresolved external symbol __imp__RegOpenKeyExA@20 referenced in function _win_init_registry mysqlclient.lib(common.obj) : error LNK2019: unresolved external symbol __imp__IsValidSid@4 referenced in function ... mysqlclient.lib(common.obj) : error LNK2019: unresolved external symbol __imp__EqualSid@8 referenced in function ... mysqlclient.lib(common.obj) : error LNK2019: unresolved external symbol __imp__LookupAccountNameW@28 referenced in function ... mysqlclient.lib(common.obj) : error LNK2019: unresolved external symbol __imp__GetTokenInformation@20 referenced in function ... mysqlclient.lib(random.obj) : error LNK2019: unresolved external symbol __imp__CryptAcquireContextA@20 referenced in function ... mysqlclient.lib(random.obj) : error LNK2019: unresolved external symbol __imp__CryptReleaseContext@8 referenced in function ... mysqlclient.lib(random.obj) : error LNK2019: unresolved external symbol __imp__CryptGenRandom@12 referenced in function ... mysql1.exe : fatal error LNK1120: 10 unresolved externals
Fix: Switched from static (/MT) compilation to dynamic (/MD) compilation seemed to fix this:
So the command was (note "/MT …\mysqlclient.lib" to "/MD …\libmysql.dll"):
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MT "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\mysqlclient.lib" mysql1.c
And changed it to:
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MD "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.lib" mysql1.c
7. cl : Command line warning D9024 : unrecognized source file type 'C:\…\libmysql.dll', object file assumed
c:\chris\mysql1> cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MD "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.dll" mysql1.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. cl : Command line warning D9024 : unrecognized source file type 'C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.dll', object file assumed mysql1.c Microsoft (R) Incremental Linker Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:libmysql.exe "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.dll" mysql1.obj C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x368
The problem is trying to use the .dll instead of the .lib, so replace libmysql.dll with libmysql.lib.
That's all for now.
Hope this helps.
Creating a basic C/C++ Program to Interact with MySQL and MariaDB
In this post, I'll cover how to create a simple C/C++ program that interacts with MySQL using the C API (and Connector/C). I discussed in a previous post how to install the C Connector (both SkySQL and MySQL's), so please refer to that if you are looking for more specifics on that.
So once you have that set up, then there are just a few more things you need to have in order – at least this was the case in my environment.
1. Create a program (this one simply connects to the server and retrieves the server version):
#include <stdio.h> #include <windows.h> #include <mysql.h> MYSQL *conn; int version = 1; int main ( int argc, char *argv[] ) { conn = mysql_init ( NULL ); mysql_real_connect ( conn, "localhost", "root", "password", "test", 3308, NULL, 0 ); version = mysql_get_server_version( conn ); printf("\nMySQL Version = %d\n",version); mysql_close ( conn ); return 0; }
I saved it as c:\chris\mysql1\mysql1.c.
2. I copied libmysql.dll and libmysql.lib to c:\chris\mysql1
(There's probably a better way than this, but this works for now.)
3. cd c:\chris\mysql1\
4. Compile your program (I'm compiling from the command line, using cl.exe):
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MD "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.lib" mysql1.c
You need the various includes specified by the /I, and the /MD indicates we're compiling it dynamically (as opposed to statically – /MT).
5. Run Program, by just typing the name (from the same location) – "mysql1″ in this case:
Here is the full session output:
c:\chris\mysql1> cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MD "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.lib" mysql1.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. mysql1.c Microsoft (R) Incremental Linker Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:mysql1.exe "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.lib" mysql1.obj c:\chris\mysql1>mysql1 MySQL Version = 50532 c:\chris\mysql1>
Fwiw, I did run into a number of errors, but I've posted that in a follow-up, so as to keep this post more focused.
Hope this helps.
Setting Up Connector/C and SkySQL C Connector for MySQL and MariaDB
I'm writing a post on how to create your first C/C++ program for MySQL (using Windows, and from the command line). A prerequisite for that is to have a C Connector, such as MySQL Connector/C or SkySQL C Connector, so the program can communicate with mysqld.
I didn't want that post to be too scattered, so I decided to split it into two, more focused posts. That said, this first post will focus on the Connector, and the next post will actually cover the program itself.
Installing and using Connector/C with MySQL is quite simple, so I wanted to show how easy it is. I also wanted to show examples with both SkySQL C Connector with MariaDB (which also works with MySQL) and Connector/C with MySQL, since both are widely used. I also wanted to show some common errors one might encounter and their resolutions, so hopefully this will help anyone who might have issues along the way.
SkySQL C Connector & MariaDB:
1. Download SkySQL C Connector and extract to:
C:\Program Files\MySQL\mariadb_client-1.0.0
2. Test the Connector per the Docs:
cd C:\Program Files\MariaDB 5.5\bin mysql_client_test -uroot -p -P3314
"C:\Program Files\MariaDB 5.5\bin\mysql_client_test" -uroot -p -P3314
Connector/C & MySQL:
1. Download Connector/C extract to:
C:\Program Files\MySQL\MySQL Connector C 6.1
2. Test the Connector per the Docs:
cd C:\Program Files\MySQL\MySQL Server 5.5\bin mysql_client_test -uroot -p -P3308
"C:\Program Files\MySQL\MySQL Server 5.5\bin\mysql_client_test" -uroot -p -P3308
SkySQL C Connector & MariaDB:
##################################### client_connect ##################################### Establishing a connection to '' ...OK Connected to MySQL server version: 5.5.31-MariaDB (50531) Creating a test database 'client_test_db' ...OK ##################################### 1 of (1/1): test_view_sp_list_fields ##################################### ... tons of test output ...
Connector/C & MySQL:
##################################### client_connect ##################################### Establishing a connection to '' ...OK Connected to MySQL server version: 5.5.32-log (50532) Creating a test database 'client_test_db' ...OK ##################################### 1 of (1/1): test_view_sp_list_fields ##################################### ... tons of test output ...
Errors & Fixes:
This was very straight-forward overall, and I only ran into 2 quite basic issues, but want to share them here for completeness and in case anyone else runs into the same:
1. When I first invoked mysql_client_test, I received the following error:
mysql_client_test: unknown variable 'default-character-set=utf8'
This just means I had 'default-character-set=utf8′ set under the [client] section in my config file, and apparently this option cannot be read by mysql_client_test. The simple fix is to add the "loose-" prefix to this option in the config file:
[client] loose-default-character-set=utf8
Now, you can run the file without encountering this error. Instead, you'll just see a "warning" now about "unknown variable 'loose-default-character-set=utf8′".
Note there is *no* need to restart mysqld after making this change, since the change only applies 'clients' and not the server (i.e., mysqld).
2. The only other error I could stumble into is:
Establishing a connection to '' ... [MySQL] connection failed
And that was just because I invoked mysql_client_test without –user and –password options.
Hope this helps.
Resolving Error: master and slave have equal MySQL server UUIDs
If you've run into the following error, then there area couple quick fixes:
Errno: 1593 Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
To give some background first, starting in MySQL 5.6, the server generates a true UUID in addition to the –server-id supplied by the user. This is ultimately to help with new replication features.
From a under-the-hood view, when starting, the MySQL server automatically obtains a UUID as follows (per the manual):
- Attempt to read and use the UUID written in the file data_dir/auto.cnf (where data_dir is the server's data directory); exit on success.
- Otherwise, generate a new UUID and save it to this file, creating the file if necessary.
First, this means there is a new file (in 5.6+) located in the datadir named auto.cnf. In this file is a unique uuid for the server.
This is great, but if you are unaware of it, and simply copy the datadir to set up a slave, and do not remove this file, then you're in for some errors. So just be cautious/aware of this. Some of these errors are easier to track down, such as in this case, a master and slave with the same uuid throws an error right away in the SHOW SLAVE STATUS and the error log. However, if your master is different from the slave, but you have 2 slaves with the same uuid, you're in for trouble, and the errors are not very descriptive. [More on this soon, once I can test it a bit more, but I saw some strange behaviors in my first tests.]
So, to fix it, simply delete the auto.cnf file, and restart that instance. A new auto.cnf file / and uuid will be generated. For reference, you'd see something like the following in your error log:
2013-05-20 23:02:54 14552 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: ee603f24-c1c2-11e2-ad03-089e01009f6a.
The other way is to generate a new UUID (SELECT UUID(); from any MySQL/MariaDB command line) and replace it with the old one in the auto.cnf file.
In either case, you must restart mysqld after the delete or edit for the change to the uuid to take effect.
After that, you'll be good to go.
For reference, here is the SHOW SLAVE STATUS output:
mysql> show slave status\G *************************** 1. row *************************** ... Last_IO_Errno: 1593 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. ...
And here is the error logged to the error log:
[ERROR] Slave I/O: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593
Mitigating the Effect of Metadata Lock (MDL) Contention
If you see the "Waiting for table metadata lock" error, you may be wondering what is the best course of action to prevent it in the future. I have briefly discussed troubleshooting metadata locks before, however, that post more illustrated how easy it is to encounter the "Waiting for table metadata lock" error in both MyISAM and InnoDB. It provides simple examples for reproducing using both storage engines, so one could hopefully more easily identify where the locks are stemming from in their particular case.
Pin-pointing which transaction holds the locks is a different story. There are feature requests filed in MySQL and MariaDB bugs databases to track this information, but they are recent, and no ETA is scheduled for either yet, as far as I know:
Until some further instrumentation that tracks these internally is added, a few ways to mitigate or reduce the MDL locks being held by idle/inactive/inadvertent connections are:
- Lower wait_timeout and interactive_timeout to acceptable values (say 30 to 60 seconds).
- Use a cron-type script to kill old, idle connections that could be holding MDL locks.
- Track down in your code where connections are made and ensure transactions are not being started inadvertently (especially those for MyISAM-only users/apps), and committed when they are intended to be started.
The last is the ultimate way to fix this, but of course it can be hard to always track these things down, and/or these scenarios could be introduced depending on your application, so having some alternatives helps.
For reference, here is a quick way to reproduce using MyISAM (tested w/ 5.5.32):
Session #1:
create table test.t (id int) engine=myisam; begin; select * from test.t;
Session #2:
alter table test.t add index (id); // <-- HANGS
Below you can see the effect of at least lowering your timeouts (wait_timeout and interactive_timeout) to 60 seconds - which means that a blocked query would only wait 60 seconds to begin in the worst case.
The first output shows the idle connection (Id=46) blocking the ALTER TABLE (which is hung in the "Waiting for table metadata lock" state). The idle connection is at the 60 second mark, just before it is about to be wait_timeout-ed:
mysql> show full processlist; +----+---+-------+------+---------------------------------+-----------------------+ | Id |...| Commnd| Time | State | Info | +----+---+-------+------+---------------------------------+-----------------------+ | 46 |...| Sleep | 60 | | NULL | | 48 |...| Query | 32 | Waiting for table metadata lock | alter table test.t .. | | 49 |...| Query | 0 | NULL | show full processlist | +----+---+-------+------+---------------------------------+-----------------------+
And this output is 1 second later, which we see the idle connection was terminated, and the ALTER TABLE (Id=48) completed:
mysql> show full processlist; +----+---+---------+------+-------+-----------------------+ | Id |...| Command | Time | State | Info | +----+---+---------+------+-------+-----------------------+ | 48 |...| Sleep | 33 | | NULL | | 49 |...| Query | 0 | NULL | show full processlist | +----+---+---------+------+-------+-----------------------+
Hope this helps.
Resolving Missing sys Include Files: devpoll.h, epoll.h, event.h, and queue.h during CMake when Building MySQL on Windows
As I mentioned in a previous post that I'd mention how I resolved some additional missing include files when building MySQL on Windows.
In this post I cover 4 missing header files, as they are all related and have to do with polling, and headers (and functions) from libevent, and in the folder /sys. I'm not sure if one should even use these functions from libevent on Windows, as these are not needed for Windows, and may not be beneficial either (that last part I've just read briefly about, so I'd need to that a bit more myself to be 100%), but including the headers won't hurt, as it doesn't hurt if they don't exist.
At any rate, here were the 4 related missing header file warnings:
-- Looking for include file sys/devpoll.h -- Looking for include file sys/devpoll.h - not found -- Looking for include file sys/devpoll.h -- Looking for include file sys/devpoll.h - not found -- Looking for include file sys/epoll.h -- Looking for include file sys/epoll.h - not found -- Looking for include file sys/event.h -- Looking for include file sys/event.h - not found -- Looking for include file sys/queue.h -- Looking for include file sys/queue.h - not found
[I do see it looks for devpoll.h twice, not sure if that is necessary, so I filed a feature request.]
Anyway, we're missing devpoll.h, epoll.h, event.h, and queue.h.
There are probably better ways to accomplish this, but this is what worked for me:
To start, I downloaded libevent-2.0.21-stable.tar.gz for queue.h and event.h.
I then downloaded devpoll.h from here.
And then I got a working Windows version of epoll.h from here.
I copied all of the header files to (the location of the Visual Studio I'm using):
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sys
Now, when building, the above looks like:
c:\mysql\mysql-5.6.12\bld>cmake .. -- Building for: Visual Studio 10 -- Running cmake version 18.104.22.168 ... -- Looking for include file sys/devpoll.h -- Looking for include file sys/devpoll.h - found -- Looking for include file sys/devpoll.h -- Looking for include file sys/devpoll.h - found -- Looking for include file sys/epoll.h -- Looking for include file sys/epoll.h - found -- Looking for include file sys/event.h -- Looking for include file sys/event.h - found -- Looking for include file sys/queue.h -- Looking for include file sys/queue.h - found
Again, these may not even be necessary, and I want to look more into libevent for Windows, but at least this helps explain these missing header files (and how to eliminate the "not found" messages if you so desire).
Hope this helps.
Related Build Links:
- Building MySQL and MariaDB on Windows using Visual Studio 2012 Express versus Visual Studio 2010 Express:
http://www.chriscalender.com/?p=1245 - How to Build MySQL 5.7 on Windows from Source Code:
http://www.chriscalender.com/?p=1273 - How to Build MySQL 5.6 on Windows from Source Code:
http://www.chriscalender.com/?p=1233 - How to Build MySQL 5.5 on Windows from Source Code:
http://www.chriscalender.com/?p=689 - How to Build MariaDB 10.0 on Windows from Source Code:
http://www.chriscalender.com/?p=1224 - How to Build MariaDB 5.5 on Windows from Source Code:
http://www.chriscalender.com/?p=1087 - Building MariaDB 5.3 on Windows:
http://www.chriscalender.com/?p=864 - Building MariaDB 5.1 on Windows:
http://www.chriscalender.com/?p=736 - Building MariaDB 5.1 on Windows Revisited:
http://www.chriscalender.com/?p=1256 - Troubleshooting Building MariaDB 5.1 on Windows:
http://www.chriscalender.com/?p=1259 - MySQL 5.5 Windows Build Appendix : Full Outputs and Common Errors from Building MySQL 5.5 on Windows:
http://www.chriscalender.com/?p=720 - Maintaining (and Building) your MySQL Source Tree on Windows:
http://www.chriscalender.com/?p=759 - Resolving the bison.exe m4 Invalid argument Error when building MySQL/MariaDB/XtraDB on Windows:
http://www.chriscalender.com/?p=798 - Resolving sasl/sasl.h Not Found during CMake when Building MySQL on Windows:
http://www.chriscalender.com/?p=1302 - Resolving Missing 'sys' Include Files: devpoll.h, epoll.h, event.h, and queue.h during CMake when Building MySQL on Windows:
http://www.chriscalender.com/?p=1317 - Building XtraDB on Windows:
Another Idea to Help Foster a Vibrant Community: Please make all bugs public
Since MySQL recently implemented the following feature request (and discussed here and here) to help foster communication among public bugs and feature requests, and to provide a way to allow the Community to voice whether or not a bug affects them, I decided to file another feature request that I think would even further encourage communication amongst an already vibrant community, and that is to simply:
"Please make all bugs public"
And thanks to the new bugs feature, if you would like to see this implemented as well, please click on the bug link, and then on the "Affects Me" button. Please let your voice be heard. And who knows, perhaps if enough of us would like to see this, then maybe it will happen.
[Edit]: I just realized Erkan already filed the same feature request about a week ago. So please give his bug the "Affects Me" click, to let your voice fully be heard.
Resolving sasl/sasl.h Not Found during CMake when Building MySQL on Windows
When building MySQL (5.6 in this case) on Windows, if starting from a new/plain machine, there are some headers/libs/etc. missing that many distributions contain and/or are easy to add.
Resolving some of these, at least for me, have not always been intuitive on Windows. So I'm attempting to tackle them all and post the results to help others with the same issues. (I thought I'd fly through them all, and provide it all in a single post .. [insert laughs here] .. but that's not gonna happen, so I'll post them as I go. Might be better in the long run anyway for those searching for specific errors anyway.)
So this one is about the following, during the initial invocation of cmake:
-- Looking for include file sasl/sasl.h -- Looking for include file sasl/sasl.h - not found
Thus I need to get sasl.h. SASL stands for "Simple Authentication and Security Layer", which is a method for adding authentication support to connection-based protocols.
Steps I took to fix:
1. Downloaded Cyrus SASL file: cyrus-sasl-2.1.22
2. Extracted
3. Copied all files in "include" directory to "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sasl" (Where "10.0″ is your version of VS)
After that, re-run your cmake command, and you'll see it says "found" for sasl/sasl.h now:
c:\mysql\mysql-5.6.12\bld>cmake .. -- Building for: Visual Studio 10 -- Running cmake version 188.8.131.52 -- The C compiler identification is MSVC 16.0.30319.1 -- The CXX compiler identification is MSVC 16.0.30319.1 -- Check for working C compiler using: Visual Studio 10 -- Check for working C compiler using: Visual Studio 10 -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler using: Visual Studio 10 -- Check for working CXX compiler using: Visual Studio 10 -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check size of void * -- Check size of void * - done -- MySQL 5.6.12 -- Packaging as: mysql-5.6.12-win32 -- Looking for include file sasl/sasl.h -- Looking for include file sasl/sasl.h - found ...
Hope this helps.
Comprehensive How-To for Enabling the Standard InnoDB Plugin in MariaDB and MySQL
I'm always switching back-and-forth between the 2 different InnoDB flavors in MariaDB – XtraDB+ and the standard InnoDB plugin, so I thought I'd simply post all of the various combinations in a single place. (And then I cover enabling the InnoDB Plugin in MySQL, since it's an option in 5.1.) [Addition: Thanks to Andrew and Sergei for the tips on shortening plugin-load=. The changes are reflected below.]
Note: Below is for Windows. For Linux, simply change ".dll" to ".so" where appropriate.
MariaDB 10.0:
Do not add anything, as the standard InnoDB plugin is the current default (as of 10.0.3, although I do anticipate this changing in the near future, and I'll update the post accordingly when that happens).
MariaDB 5.5:
# Enable the 2 below to disable XtraDB+ and enable the standard InnoDB Plugin ignore_builtin_innodb plugin-load=ha_innodb.dll
MariaDB 5.3:
# Enable the 2 below to disable XtraDB+ and enable the standard InnoDB Plugin ignore_builtin_innodb plugin-load=ha_innodb_plugin.dll
MariaDB 5.2:
# Enable the 2 below to disable XtraDB+ and enable the standard InnoDB Plugin ignore_builtin_innodb plugin-load=ha_innodb_plugin.dll
MariaDB 5.1:
# Enable the 2 below to disable XtraDB+ and Enable the standard InnoDB Plugin ignore_builtin_innodb plugin-load=ha_innodb_plugin.dll
Note that enabling it in 5.1, 5.2, and 5.2 are the same. As for 5.5, the only difference is that the name of the .dll has changed from "ha_innodb_plugin.dll" to "ha_innodb.dll" (so that needs changed in each place it occurs).
MySQL 5.1:
For MySQL 5.1, you would enable the InnoDB Plugin in the same way you would for MariaDB 5.1:
# Enable the 2 below to enable the standard InnoDB Plugin ignore_builtin_innodb plugin-load=ha_innodb_plugin.dll
MySQL 5.5+:
In MySQL 5.5+, the InnoDB Plugin is the default (and only InnoDB flavor of InnoDB in MySQL).
And finally, since I'm discussing the InnoDB Plugin, I do have some older posts on the subject for anyone who may be interested:
InnoDB Plugin Versions
Ease of Switching to the InnoDB Plugin and the Numerous Benefits
InnoDB Plugin Version Numbering in MySQL and MariaDB
Hope this helps.
Setting the TZ Environment Variable for MySQL on Windows
Most of us are familiar with how MySQL handles timezones, and what one must do to keep up with the latest changes, etc. Most of us use the system timezone info, which is great – one less item to update when changes occur (usually because of daylight savings changes). And for those who need more specifics, most everyone (except Windows and HP-UX) can update their timezone info using the zoneinfo database from the OS.
For those few Windows and HP-UX, you have to download the package of pre-built time zone tables that MySQL provides. Per the manual (timezone section):
"If your system is one that has no zoneinfo database (for example, Windows or HP-UX), you can use the package of pre-built time zone tables that is available for download at the MySQL Developer Zone:"
So the questions becomes, is that your only option on Windows?
The answer is "no".
At the top of the same manual page, it says:
"You can also set it by setting the TZ environment variable before you start mysqld. The permissible values for –timezone or TZ are system dependent. Consult your operating system documentation to see what values are acceptable."
Now, it doesn't tell you what these are since they are OS-dependant. Also, I couldn't easily find any mentions of what the proper settings for Windows are for MySQL, but in the end, and after a good bit of testing various values (especially around DST times), I found what works (at least in the U.S. for now).
Of course, first, you must create an "environment variable" named TZ, unless you already have one, but that is doubtful (at least it is not default in my experience). If you are not familiar with how to create an environment variable, perhaps you should not do this for your first attempt, as I don't want you to mess up your system. But for those who would still like to know:
Control Panel -> System -> Advanced System Settings -> Environment Variables -> Click "New" *under* "System variables"
You'll want to give the "System variable" the name: TZ
And then 'some' of the permissible values are:
I had only tested these in the U.S., so you'll have to perform further tests if you wish to use other values. If you do use others, be sure to test them thoroughly, especially around your respective DST changeovers.
Fwiw, I did post the above tip in the "User Comments" on the manual page, but wanted to share the info here, in case to make it a bit easier to find.
Now why would any of this be useful?
Well, no values for TZ on Windows have been documented, nor tested, so at least this helps with that.
And as for practical uses, this would allow your MySQL to use the "system", but it could still differ from the "system". That is, your server could be in Pacific time zone, and you want the server system to remain PST, but you want MySQL to be Eastern (EST) for whatever reason. This would allow you to accomplish that without having to load the MySQL timezone tables (and then keep them up-to-date when changes occur).
Note that if you do set TZ to "EST5EDT", after re-starting MySQL, you will see (it only shows "EDT"):
mysql> show global variables like '%zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | EDT | | time_zone | SYSTEM | +------------------+--------+
This is normal, and expected, and the same occurs for EST5EDT, CST5CDT, MST5MDT, and PST5PDT.
Hope this helps.


text:
USPlabs Patented Anabolic Beta-Test Review/Feedback
First of all, let me document my gratitude and appreciation for the privilege to have received one bottle of the highly coveted USPLabs' Anabolic agent, otherwise known as USPlabs Patented Anabolic. I would like to thank Jacob, for making this possible in the first place; Josh for coordinating the shipping logistics to Europe; and Ben for managing the last lap of the shipping from the UK. Thank you so much!
Core Principle:
Second, as in my Pink-Magic and Compound-20 logs, I would like to highlight a key driving principle behind this beta feedback. As is obvious, I enjoy an affiliation to USPLabs as a Product Educator. As a consequence, even though, I will provide an objective feedback, there will be some that would question the objectivity of my feedback, due to my affiliation. To those, I will say the following:
The key idea of this beta-testing is to supply USPLabs with objective feedback to help it decide how to introduce its Patented Anabolic. As a consequence, I would be doing the company a serious disservice, if I deliberately provided it with feedback that differed from my true experience with the beta product. This might lead it to making the wrong choices regarding market introduction or otherwise, and that would certainly be counter-productive. So, my feedback will be objective. As usual!
Dosage and Duration of Review:
The dosage instructions are one capsule per day with food (non-workout days) or pre-workout meal (workout days). I have enough capsules for 30 consecutive days, the duration of the beta-test.
I will run Patented Anabolic solo, besides multivitamins and healthy fats such as MCT Oil, Palm Oil, and Mega EPA/DHA (an Omega-3 essential fatty acid complex).
Note: Following the tradition and style of my earlier logs, I will concentrate here solely on narrating my experience with the product in terms of specific categories (to be outlined shortly) and will not detail the amount of tonnage I move during my workouts.
Starting parameters are 110kg (243 lbs) and 12% BF.
I started USPlabs Patented Anabolic on November 16, 2012. Considering that the product is not a stimulant, I expect incremental (and cumulative) benefits over time, rather than an acute effect after the first dose. Hence, I will aim to update my feedback about twice per week, so that any effects from the product are easier to isolate.
Having clarified all that, it remains to say that I am truly looking forward to my USPlabs Patented Anabolic (henceforth "Anabolic") beta test.
Thank you for your interest and support!


text:
Where we last left off, I was debating between two final marketing automation solutions- one we could get for a very reasonable price, and another, more advanced system that would cost us 2-3 times the price. While we'd done a basic cost-benefit analysis, it was hard to say how much having any marketing automation solution would benefit us, much less the additional benefit we'd get from one solution over another. I was having trouble making a final call, and everybody else at the office was kind of split on their decision, as well.
Then our COO asked me a question that put it all into perspective…
He said, "For 2-3 times the price, it would mean a difference of tens of thousands of dollars each year. For that price, we could potentially hire another person in marketing. What do you think is worth more: the extra MA functionality or another human to help execute our campaigns?"
Once he put it that way, it was a no-brainer. Of course I'd rather have a person to help write emails and coordinate campaigns! Would it be nice to have the added MA functionality too? Perhaps. But we're just getting started with marketing automation, after all. The likelihood that we would "hit the wall" with the more economical solution in the first couple years and need a more advanced system that quickly is very unlikely. Plus, even if we didn't hire another person in marketing right away (which we don't plan to), I would still feel silly putting all that money into software that we couldn't get the full benefit from for many months or even years to come.
So I picked up the phone and called the vendor with our final decision. Read the rest of this entry »


text:
Interior Health will likely not be surprised if it receives a somewhat frosty public reception to the idea of giving addicts kits they could use to counteract a heroin overdose.
If it goes ahead, the pilot project for the Interior would give drug users Narcan, which they or someone with them could inject if they were overdosing.
According to a report from the University of Victoria's Centre for Addictions Research, the B.C. Interior has the highest per-capita rates for people being hospitalized due to drug and alcohol overdoses.
As such, the new harm-reduction program would try to reduce the number of such patients needing hospital care, thus saving lives and health-care money.
But the experts will have to forgive the rest of us if we question how realistic it is to expect addicts to, for starters, always carry the Narcan kit around with them. Is it going to be a priority for them or will it simply sit with the dust bunnies under the bed — if they are lucky enough to have a bed and home to keep it in. If they're homeless, there's even more potential for the kit to be forgotten somewhere or lost.
There's also the issue of the drug's effectiveness. In this case, it might work too good; as users are brought so quickly down to a sober state that they may be reluctant to use it.
We wonder if the person who is overdosing is with someone else, will that individual be in a state to assist in a meaningful way?
According to websites that describe how to administer naloxone (Narcan is a trade name), one must snap off the neck of an ampoule of the drug, draw 1 cc into the syringe, inject it into a muscle and perform rescue breathing until the drug takes effect.
And even if such a helper is lucid enough, will he want disrupt his own high to help someone else?
While a lot of unknowns remain for the public to understand how the program might work, if giving out a Narcan kit proves a successful way to save lives and keep overdosing addicts from jamming up emergency wards, it will be a worthwhile initiative.
We Say editorials represent the viewpoint of The Daily News and are written by publisher Tim Shoults, city editor Tracy Gilchrist, or associate news editors Dan Spark and Mark Rogers.