text:
Camille Paglia reads from 'Glittering Images: A Journey Through Art from Egypt to Star Wars'
Camille Paglia's latest book takes readers on a journey through Western art's defining moments, from the ancient Egyptian tomb of Queen Nefertari to George Lucas' digitally enhanced duel in "Revenge of the Sith." 'Glittering Images' looks at more than two dozen seminal images: paintings, sculptures, architectural styles, performance pieces and digital art that have defined and transformed our visual world.
Gregory Martin reads from 'Stories for Boys'
Gregory Martin reads from his memoir about a father and a son finding a way to build a new relationship with one another after years of suppression and denial are given air and light. -- The author struggles to reconcile a father he thought he knew with a man who has just survived a suicide attempt; a man who had been having anonymous affairs with men throughout his 39 years of marriage; and who now must begin his life as a gay man.
Junot Díaz reads from 'This Is How You Lose Her'
'This Is How You Lose Her,' is his first book since winning the Pulitzer Prize for 'The Brief Wondrous Life of Oscar Wao.' -- Díaz's stories center on Yunior de las Casas, a Dominican-born, Jersey-raised writer and chronic womanizer. "Often caught between hopeless romanticism and flippant machismo, Díaz's characters are as vulnerable and maddening as they are endearing and sexy. ... Raw and honest, these stories pulsate with raspy ghetto hip-hop and the subtler yet more vital echo of the human heart." (Publishers Weekly)
Ivan Doig reads from his latest book, "The Bartender's Tale"
'The Bartender's Tale' tells the story of a father and son left on their own in a shifting world. -- Bartender-bachelor Tom Harry and son Rusty ("who had been an accident between the sheets") make an odd kind of family, with the bar their true home. They manage just fine until the summer of 1960, the year Rusty turns 12, when two women enter their lives. -- "Doig poignantly captures the charm and pathos of Rusty's efforts to understand this complicated and often baffling adult world. Doig is famous for celebrating the American West, and he also beautifully captures the cadences and details of daily life in this Montana town." (Publishers Weekly)
Clay Jenkinson presents a debate between Thomas Jefferson and Theodore Roosevelt
Humanities scholar and Chautauquan, Clay Jenkinson presents a debate between Thomas Jefferson, third president of the United States, and Theodore Roosevelt, 26th president of the United States, as part of the McLellan/O'Donnell Living History Series. -- This podcast features a three-part Chautauqua performance. First, Jenkinson appears in costume in the persona of his characters, speaking as Presidents Jefferson and Roosevelt. Next he opens the floor to questions from the audience. Finally, he breaks character and answers questions as a scholar, based on his research.
Steven Roby discusses 'Hendrix on Hendrix: Interviews and Encounters with Jimi Hendrix'
'Hendrix on Hendrix' includes the most important interviews from the peak of Jimi Hendrix's career, carefully selected by one of the world's leading Hendrix historians, Steven Roby. -- In Roby's book, Hendrix recalls for reporters his heartbreaking childhood. He explains that his concept of "Electric Church Music" is intended to wash their souls and give them a new direction. And in his final interview, just days before his death, he discloses that he wants to be remembered as not just another guitar player. -- 'Hendrix on Hendrix' (released near what would have been Hendrix's 70th birthday) includes new transcriptions from European papers, the African-American press, and counterculture newspapers; radio and television interviews; and previously unpublished court transcripts.
Thomas Ricks discusses 'The Generals: American Military Command from World War II to the Present'
Thomas Ricks explores why history has been kind to the American generals of World War II and less kind to the generals of the wars that followed. -- This is the story of a widening gulf between performance and accountability. During World War II, scores of American generals were relieved of command simply for not being good enough. Today, as one American colonel said bitterly during the Iraq War, "As matters stand now, a private who loses a rifle suffers far greater consequences than a general who loses a war." -- "Combining lucid historical analysis, acid-etched portraits of generals from 'troublesome blowhard' Douglas MacArthur to 'two-time loser' Tommy Franks, and shrewd postmortems of military failures and pointless slaughters such as My Lai, the author demonstrates how everything from strategic doctrine to personnel policies create a mediocre, rigid, morally derelict army leadership ... " Publisher's Weekly starred review.
Mark Bowden discusses 'The Finish: The Killing of Osama bin Laden'
Mark Bowden presents a gripping account of the hunt for and elimination of Osama bin Laden. -- With unprecedented access to key sources, Bowden tells about the highest profile special-forces operation ever to have been undertaken. 'The Finish' is his page-turning narrative of how the man behind 9/11 was finally brought to justice.
Jack Nisbet discusses his latest book 'David Douglas, a Naturalist at Work'
Jack Nisbet shows images and discusses his latest book, 'David Douglas, a Naturalist at Work: An Illustrated Exploration Across Two Centuries in the Pacific Northwest.' -- From 1825 to 1834, David Douglas made the first systematic collections of flora and fauna over many parts of the greater Pacific Northwest. Despite his early death, colleagues in Great Britain attached the Douglas name to more than 80 different species, including the iconic timber tree of the region. -- 'David Douglas, a Naturalist at Work' is an illustrated collection of essays that examines various aspects of Douglas' career, demonstrating the connections between his work in the Pacific Northwest of the 19th century and the modern landscape. This volume is the companion book to a major museum exhibit at the Northwest Museum of Arts & Culture in Spokane.
Cartoonist Ellen Forney discusses her book 'Marbles: Mania, Depression, Michelangelo, and Me.'
Shortly before her thirtieth birthday, Forney was diagnosed with bipolar disorder. Flagrantly manic and terrified that medications would cause her to lose creativity and her livelihood, she began a years-long struggle to find mental stability while retaining her passion and creativity. -- Searching to make sense of the popular concept of the crazy artist, Forney finds inspiration from the lives and work of other artists and writers who suffered from mood disorders, including: Vincent van Gogh, Georgia O'Keeffe, William Styron and Sylvia Plath. She analyzes the clinical aspects of bipolar disorder as she struggles with the strengths and limitations of a parade of medications and treatments. -- Forney's graphic memoir provides a visceral glimpse into the effects of a mood disorder on the artist's work. Her story seeks the answer to this question: If there's a correlation between creativity and mood disorders, is an artist's bipolar disorder a curse... or a gift?


text:
Q: How can I route a specific local device through a proxy? (Smart TV with no available proxy configuration, only gateway+dns) Current Setup
https://i.imgur.com/yEg2lg3.png
Currently just running a pi-hole DNS, and a lighttpd server on port 80 to access pi-hole admin web interface.
I have made a DHCP reservation on my router for my RPi (10.0.0.10).
What I want to do
https://i.imgur.com/wSryx3n.png
I want to route traffic from my Smart TV through a transparent mitmproxy.
I have the ability to configure these settings on my TV:

*

*IP Address

*Subnet mask

*Gateway

*DNS server

Questions / Confusion
Where does mitmproxy need to be within my network? Currently I'm trying to run it on the RPi on port 8080. I places dots (1, 2, 3) in the above image thinking of different places it could live, but I'm not sure.
Ideally only the traffic from my TV gets routed through the proxy. Particularly, I really only care about the traffic for a single domain my-domain.com and only for unencrypted HTTP protocol.
mitmproxy says I need to use a transparent proxy for clients that I can't setup proxy configurations for (which I can't for my TV). As part of the setup, it says I need to configure my network:

There are many ways to configure your network for transparent proxying. We'll look at two common scenarios:

*

*Configuring the client to use a custom gateway/router/"next hop"

*Implementing custom routing on the router

So my understanding is I can either:

*

*Set the gateway to the IP of my RPi (10.0.0.10) and REDIRECT port 80 -> 8080 on the pi. I tried this but my TV can't connect to the internet. This kind of makes sense to me, since I feel like my TV at least needs the router right?

*Or my router needs to be able to dynamically do this (which I don't think my router has settings for this... is there an easy way to put your own programs onto a router?)
I'm not sure if certain network setups can help me do some of this, or if I have to basically run all of my network traffic through mitmproxy. Wouldn't this be a bad idea for network performance?
If more hardware is needed to do what I want, I am open to those ideas.

redpajama_set_name: RedPajamaStackExchange


Thank you . . . so sweet!
These crowns would be perfect to make in blues and yellows to donate to Ellie's hats for all the little princes that are fighting childhood cancer!!
So cute Tanya!! I recently released a free tiara pattern that I made for the Ellie's Hats charity for kids battling childhood cancers. , I am going to make some of your crowns to donate for the brave little boys that are fighting for their lives.
That is AWESOME!! I hope you'll share a pic when you're done!!
I am working on one right now!! I'll send you a picture!!


Intelligence Squared (IQ2) Debate at the City Recital Hall, Sydney, Australia, August 12, 2014.
Interesting, I thought, that the negative won the debate on the night by the slightest of margins. Surprising. I wasn't at all convinced, although I guess it is comforting to believe that I have control, I have choice over, how I interact with technology.
Unfortunately, I'm not that delusional, and was much more convinced by Katina Michael's speech, which gave me a visceral sense of how I interact with technology. I laughed at my own neediness when it comes to the tech I rely on in my life. It also freaked me out: why do I feel the desire to check my emails at 3a.m.?!
I view my relationship with tech as an enslavement, since it's become an essential part of my life and though I've reconsidered some aspects of that relationship – I no longer participate in social media, for example – I can't not rely on it in so many other ways. It's become obvious that I've outsourced my mind to my phone, and thus imbued it with power over my life. I've broken out in a cold sweat with just the thought that my phone is lost. Indeed, I felt and acted as though I had lost my mind!
Corporations and governments are well aware of the power I've given over to my tech, and exploit it consequently, as you would expect, which is another, more insidious aspect of the enslavement. It makes me uneasy to think that governments and corporations can directly access everything in my digital world and in fact do.
I feel it is time to step back from this runaway train that's pulling me along blindly with the promise of BIGGER and BETTER ways to communicate, do business, stay alive, explore the universe. I'm told that tech allows me to be more efficient, more effective in the world, but is that what I really want? I'm not sure it is.
The recent IQ2 debate over whether we are enslaved by technology was both entertaining and timely. Katina Michael's rapper arguments got the message across strongly that we denizens of the "infosphere" are challenged by daily threats to our individual freedoms – whether they be sinister data trackers, commercial invaders of our personal space, or Internet-mediated addictions.
Is a monitor so-called because it monitors us as we tap away at the keyboard?
Is a screen so named because it screens us away from genuine human contact? Does a cell (phone) lock us into solitary confinement and alienation?
Judging by the audience response to Katina's imaginative performance, the Panglossian "no" case may have won a merely rhetorical victory on the night of the debate. Such public debate about computing technology is encouraging and reminds us that the word itself derives from the Latin computare – to think and consider together – and that the great enterprise of information should be a shared adventure in which human minds freely interact with and are not controlled by the enabling technology.
Whether or not we have something to hide, and what that something is, is unfortunately not something we can control. An arbitrary changing of the rules, like a macabre game of musical chairs, can be systematically used to weed out "undesirable" persons. The one-two punch of arbitrary rule change and surveillance has been well tested and with tragic effect. "Nothing to hide" could only work in a (non-existent) perfectly moral, free, and fair society. Invidious – I can't believe anyone is really so naive.


text:
Promoting Human Dignity through Family, Business, Society and Politics
MA Catholic Social Teaching
Home » Articles » Covid-19: the importance for body and soul of getting back to work
Covid-19: the importance for body and soul of getting back to work
One lasting legacy of the Covid-19 pandemic and the actions taken to slow its transmission will likely be a renewed understanding of the importance of work, not only as a means to earn one's livelihood, but also as an essential aspect of man's humanity and a vital element of the human person.
At the start of this month, the Catholic Church celebrated the feast of St. Joseph the Worker, reminding the faithful and the world about the dignity inherent in human work. Human work enables us to emulate our Creator. We use His gifts to provide sustenance and comfort to ourselves and our families and to craft things new and beautiful from the gifts of the earth.
St. Pope John Paul II, in Laborem Exercens, reminds us that "Work is one of the characteristics that distinguishes man from the rest of creatures", and adds "work bears a particular mark of man and of humanity, the mark of a person operating within a community of persons."
When we work, we enter a community of people, and our labour, joined with the labour of our co-workers, creates great things. The essential element which makes work special is not the material object created or the service provided, but rather the change which occurs in the person. Work gives purpose and dignity to the worker and allows them to co-operate with others to achieve some task. Work builds communion among mankind and allows the worker to continue participating in God's act of creation.
It must be recognised that any work, whether in the marketplace or in the home, is important for both body and soul. The Catholic Church recognises this and reminds us that the economy was made to serve man, not the other way around.
That sense of community has been affected by the recent pandemic. For those working at home, there may still be a sense of striving towards a common goal, though in many cases the bond may have been weakened by lack of propinquity. For those who have been furloughed or who have lost their jobs, those bonds are severed, and their dignity is wounded by the fact they were made redundant.As the pandemic comes under control and countries begin to reopen their economies and try to regain some sense of normality, the world's governments have and will continue to provide vast amounts of financial aid to support their economies. It is important that those crafting these aid packages make provisions to ensure people who have lost their jobs are given the opportunity for gainful employment, whether with their old employer or with someone new. The money being spent should not weaken incentives or the normal economic processes that encourage employment. It should go towards strengthening the social good of work and be earmarked to help the workers most impacted to ensure the economy moves back to a state in which employment is available for all who are able to work and whose family situation is such that work outside the home is appropriate.There is more to life than work and work need not be only labour for wages. It must be recognised that any work, whether in the marketplace or in the home, is important for both body and soul. The Catholic Church recognises this and reminds us that the economy was made to serve man, not the other way around. As John Paul II wrote in Laborem Exercens, work is "judged above all by the measure of the dignity of the subject of work, that is to say the person, the individual who carries it out."The importance of the goods of work – economically, socially and for man's personal fulfillment and development – have come into focus during the Covid-19 pandemic.
This must be remembered as over the next few months the world begins to rebuild its economic structures. The centre and purpose of the economy must be humanity, and the importance of work to humanity must be recognised as we carry out the task ahead of us.
About the author: Steve Nakrsosis
Stephen Nakrosis is currently working toward his D Phil in Theology at St. Mary's University. He works as a reporter for a financial newswire in New York City.
Photo by Rodolfo Quirós from Pexels
The importance of ethics in economics Subsidiarity post-covid Mental health, spiritual wellbeing and COVID-19 Covid-19: Love in a time of War
Never miss a post - subscribe to updates here
We use Mailchimp as our marketing platform. By clicking below to subscribe, you acknowledge that your information will be transferred to Mailchimp for processing.
Author: Steve Nakrsosis
Published: 13th May 2020
Reception switchboard: 020 8240 4000
Email: catholicsocialthought@stmarys.ac.ukClick here
Waldegrave Road
TW1 4SX
Covid and human dignity
Fratelli tutti – the rights and wrongs of private property
Character in the Courtroom
© Catholic Social Thought 2020

redpajama_set_name: RedPajamaCommonCrawl


text:
Ping Shen
Ping Shen, assistant professor of cellular biology, established the fruit fly Drosophila as a model system for the study of feeding motivation, social behavior, and alcoholism. His research showed that foraging motivation and food intake in Drosophila are regulated by the same molecules, signaling pathways, and neurochemical systems as those of mammals. Shen used the techniques of Drosophila genetics and developed novel tests to define neural circuits that modulate an animal's willingness to take risks and work for food, which is difficult to do in other systems. His pioneering studies are helpful in understanding many human behaviors and disorders of biomedical importance, such as obesity and anorexia, which are increasingly understood as failures of motivated feeding behavior. By taking advantage of a feature of the fly life cycle—its food avoidance as it begins to pupate—he also uncovered an ancient anti-stress/pain pathway in Drosophila, which provides a powerful genetic model for future pain research.


text:
A PERCEPTYX INSIGHTS REPORT
Why Hybrid Work Wins for Healthy Employees and a Healthier Organization
Changing federal and local guidelines, repeated viral surges, and differing views about where exactly employees should work have forced organizations to reinvent their return-to-office models numerous times. Two years later, for managers and employees alike, the core question has evolved from, "When will we go back?" to "How will we go back?" to "Should we go back at all?"
New research from Perceptyx indicates that while Officism is alive and well, and will require organizations to upskill their managers and prioritize more equitable behaviors, employees are unwilling to return to the pre-pandemic days of long commutes, inflexible schedules, and poor work-life balance.
Download the full report, detailing our data from more than 1,400 working Americans, to discover why hybrid work may represent the best of both worlds for both healthy employees and healthy workplaces, including new insights on:
How hybrid workers compare to their in-office and all-remote counterparts in terms of productivity, engagement behaviors, work/life balance, and professional relationships,
The lengths employees will go to preserve the flexibility they've enjoyed for the last two years, including potential impacts to advancement and compensation,
Why the quality of face-to-face interactions with peers and managers matters far more than the quantity, regardless of location, and
Actions organizations can take now to respond to workers' demands
for more autonomy, build stronger personal connections, and retain
critical talent.
© 2022 Perceptyx, Inc. All rights reserved | Privacy Policy


Orient Power, line post insulator manufacturer in China, has vast experience with all types of post insulator for HV T&D networks and power equipments all over the world. Porcelain line post insulators and porcelain pin post insulators are main types. Porcelain line post insulators include vertical & horizontal mounting tie-top type with stud base, vertical mounting clamp-top type with stud base, horizontal mounting clamp-top type with stud base and horizontal mounting clamp-top type with curved base. Line post insulator manufacturer supplies these porcelain pin / line post insulators manufactured and tested as per ANSI, BS, IEC, other standards and customer's requirements.
Types: ANSI 57-11, ANSI 57-12, ANSI 57-13, ANSI 57-14, ANSI 57-15, ANSI 57-21, ANSI 57-22, ANSI 57-23, ANSI 57-24, ANSI 57-25 are vertical or horizontal clamp top porcelain line post insulators with stud base.
Types: ANSI 57-31, ANSI 57-32, ANSI 57-33, ANSI 57-34, ANSI 57-35, ANSI 57-36 are inclined clamp-top porcelain line post insulators with curved base or gain-base. ANSI C29.7 Cantilever strength: 12.5KN.


text:
Озерное () — село в Зеленовском районе Западно-Казахстанской области Казахстана. Входит в состав Дарьинского сельского округа. Код КАТО — 274431200.

Село расположено на правом берегу реки Урал (в 5 км от главного устья, у озера-старицы Большое).

Население
В 1999 году население села составляло 756 человек (371 мужчина и 385 женщин). По данным переписи 2009 года, в селе проживало 717 человек (345 мужчин и 372 женщины).

История
Посёлок Дьяковский входил в 1-й Уральский военный отдел Уральского казачьего войска.

Примечания

Населённые пункты Байтерекского района

redpajama_set_name: RedPajamaWikipedia


A new release is now available on the Google Play Store! This release adds an achievements system: publish your score to the online leaderboard and unlock new cards!
Note that the LAN and Bluetooth modes are not compatible with previous releases.
This entry was posted in Game and tagged 0.15.0, release, screenshot by Memory. Bookmark the permalink.


text:
Donations pour in for family of young boy killed in crash
Victoria E. Freile
@vfreile
One day after an eight-year-old boy was killed in a two-vehicle crash, the Wheatland-Chili school community is mourning the loss.
Eight-year-old Kael Nicolosi of Chili died Thursday morning after he was thrown from a car on Scottsville-Chili Road in Chili. His cousin Keith Nicolosi, 9, mother Tiffany Nicolosi, 35, and grandmother Valerie Lewis were also injured in the crash. His cousin and mother remained hospitalized Friday morning.
A third-grader at TJ Conner Elementary School, "Kael was a wonderful, smart young man, who brought joy into the lives of those around him," Wheatland-Chili Central School District Superintendent Deb Leh said in a statement. "He started each day with a beautiful smile that brightened our school community. He will be deeply missed by all."
Boy killed, others injured in Chili crash
Kael would have turned nine later this month.
Wyatt Lewis said his younger brother, Kael, was "the most loving child you could imagine." He taught Kael to skateboard and the two often played soccer and hockey together. Kael enjoyed making YouTube videos.
"He was my best friend and one of the smartest kids I've know," Lewis said.
The district will have counselors on hand Friday for students, staff and families who need assistance, Leh said. Funeral arrangements have not been set yet. A GoFundMe account in Kael's memory has raised more than $15,000 in one day.
David Monacelli, 36, of Brockport was eastbound on Morgan Road when he became distracted and drove through a stop sign at the intersection with Route 386, striking a southbound car around 8:35 a.m., said Cpl. John Helfer of the Monroe County Sheriff's Office.
Kael Nicolosi and his cousin Keith were in the backseat when Monacelli's Jeep struck the passenger side of the car the family was in, Helfer said. Both boys were wearing their seat belts, but the impact of the crash caused the back window to shatter and Kael was thrown from the car after the impact. He slipped through his seat belt, deputies said.
Monacelli, who suffered minor injuries in the crash, was ticketed for failure to yield and failure to stop at a stop sign, Helfer said.
VFREILE@Gannett.com


A house lying on the very sea coast. Consists of 4 bedrooms, a big dining room and a kitchen, 3 WCs and 2 bathrooms. It also has a sauna, air conditioners and 2 terraces with a view to the sea. The house is suitable for a family vacation or a group of up to 8.
Restaurant - fresh fish, Bulgarian and European cuisine. Reasonable prices. Discounts for guests of the house. Possibility for renting a car.


You asked for shorts with larger cut-out in the back and higher waist. We made them for you. The Mia shorts were especially designed for pole dancing. Currently, these shorts are our most daring. The Mia shorts do not have any unnecessary seams, rubber waist bands or rubber in the pant legs, yet they stay perfectly on the body and cover everything that is necessary. The Mia shorts have a double-lining in the crotch area. Available also with lace. Try the Dragonfly shorts and you will never want anything else.


text:
Japan's moral high ground: Hiroshima & Nagasaki
Yesterday, US Ambassador Roos attended the Peace Ceremony in Hiroshima, reportedly to further Obama's future vision of eliminating nuclear weapons*. Roos' appearance was not enough for many, something understandable for those (civilians) who were affected by the bomb. Some other folks may have been disappointed that the country which for no good reason repeatedly attacked Japan while it was trying to free subjugated Asians from Western domination in order to place them under Japanese domination did not apologize for Hiroshima, Nagasaki, and causing Japan to attack Pearl Harbor.
We are fortunate that there are now peace education programs available to many to clear up any lack of knowledge of what happened in WW2. For example, in Okinawa, there is such a program for "Ameriasians" which will allow participants to take a hard look at the war. No longer will graduates of the program consider Japan as just a victim because they get to learn of the experiences of a Japanese-American veteran of the Okinawa campaign, Takejiro Higa:
"I know I have responsibilities as an American citizen, but why do we have to invade the land of my ancestors?"
The sad memory will never fade for the Japanese-American, who was forced to fight in his own home. Mainichi
Well, perhaps Mainichi left a little out of the story. Or else the peace education program left a little out of the war, such as the reason for Mr. Higa having to invade his ancestors' homeland.
But that's all unimportant trivia.
I hadn't read the magazine Japan Echo for years, in fact, I had forgotten about it until it began publishing articles on-line recently. I won't be forgetting about it again.
In one interview, Japan's Disappearing Act, Professor Satoshi Ikeuchi covered a number of topics, but the most interesting is his take on the use of the atomic bombings on Hiroshima and Nagasaki as Japan's "trump cards" in regaining it's dwindling relevance in the world:
NHK Director and Interviewer: (After noting that Osama Bin Laden often refers to Hiroshima and Nagasaki in speeches and the fact that radical Muslims often tell the interviewer of their admiration for Japan standing up to the U.S. and wondering why Japan does not take revenge for the atomic bombings) ...I think Hiroshima and Nagasaki should be taken seriously as resources we can use in terms of getting our message across to the outside world...
Ikeuchi: I think if Japan were able to communicate its own version of what happened in Hiroshima and Nagasaki more effectively, it could become a winning card against the United States...
The learned professor suggests a different approach to apologizing for WW2 (though a rare few may quibble with the idea that the Japanese government has done much clear, unequivocal apologizing) and "and strike out ideologically by showing how high our moral position really is."
Then Ikeuchi suggests a vision for the future that does not as directly rely on reliving a version of the past. Stating that Asia needs somewhat different standards than the West:
...the best thing Japan can do in terms of communicating its message to the world would be to establish in itself in a position from which it can say, "When Western standards are not suitable for Asia, we will translate them for you."
Not sure if this will slow Japan's international disappearing act, but it might be useful. A declining Japan leading a surging Asia while not really being part of Asia could work as long as Asia thinks it needs Japan's leadership in translating Western standards. (Is China part of Asia?)
The interviewer expressed what he sees as a problem with Ikeuchi's ideas:
Included among the Western values is an acknowledgment that World War II was a just war in which the Allies, united by a shared belief in democracy and human rights, defeated the Axis powers, which were contemptuous of these values. Does Japan have the magnanimity to accept this view of history? The second question would whether Japan truly holds these values in the first place.
Ikeuchi was also critical of the full-page ad that rightists ran in the Washington Post a few years ago to support former PM Abe's claim that the Japanese Imperial Army did not force women in occupied countries into sexual slavery during WW2. Ikeuchi seems to believe that its credibility was undermined because it was a paid ad, not because of the contents.
They would have done better to have written in via the letters page, exposing the contradictions in their opponents' arguments, and putting their case in a way that would have struck American readers as reasonable and logical.
Perhaps so, but getting informed Americans (or anyone else) to believe Abe and the rightists' case of no Japanese Army involvement in recruiting/forcing women into sexual slavery might be a little difficult to do reasonably and logically.
Now why is it again that the world has so much trouble believing Japan's sincerity despite Ikeuchi's claim that: "...no country in the world that has issued as many apologies as Japan just for fighting a war."
"Just for fighting a war"???????!!!!!
Early in the interview Ikeuchi took the US to task for (supposedly) focusing on Japan as an economic interest instead of looking at it from a political perspective and asking questions such as:
"Is this country [Japan] likely to be a long-term partner?"
I am not sure that Professor Ikeuchi provided any confidence-building answers to that question.
*Professor Ikeuchi considers Obama's goal as a "PR strategy based on cool calculations in the face of a genuine threat from nuclear terrorism."
Labels: Abe, apology, Hiroshima, Nagasaki, sex slaves, WW2
Japan-Australia 1:15 PM
I have visited Hiroshima several times and have been to the bomb site and the center of the atomic blast. It is a very sad thing that happened and the effects will last forever. I will never forget that experience and hope the bomb will be banned.
Ojisanjake 6:27 PM
just checked out japan Echo and found this gem in the "japan Culture takes on The World" article... "In the years to come, it is likely that the "Cool Japan" phenomenon will continue to spread. Recently, Japanese-style izakaya restaurant-pubs have started to become common overseas. Previously, eating and drinking places were separate. A system that brings both of them together under the same roof is clearly convenient. User-friendly things like this that anyone can enjoy will spread quite naturally, just like anime and manga and high-tech toilets."
!!!!!!! I never knew that British Pubs and French cafes are mere copies of Izakayas......
D 11:41 PM
Japan-Australia: I agree that the bombings were "sad" to say the least---especially since women, children, and other non-combatants were killed. My problem is with folks such as the author of the article who view Japan as THE victim of the war it started and develop amnesia about why the world showed up rather angry on its doorstep. He goes even further...
Ojisanjake: I saw that too. The fellow who wrote it also mentioned that Hollywood only sent its good movies overseas and left the lightweight stuff at home. I thought overseas was where they got their money back for movies that flopped in the US. Plenty seem to make it to Japan anyway.
Edie Spencer 10:21 AM
1)Here what I was taught about WWII during the late eighties and ninieties growing up:
a) The Pacific side of WWII was marked by escalating trade agreements, the US push for minerals and trade and the expansion of Imperial Japan for the same issues.
b) The USA, just coming out of a Depression, had no issues with Japan's expansion into Manchuria and Korea.
c)However, there were serious tensions and issues. Roosevelt may had an inkling that there may have been a military threat, but it honestly did not seem that there would be war.
d) The Japanese Government decided to do something rather daring- destroy the fleet in the Pacific, and simply take over the Pacific.
e) Japan had the USA fighting REALLY HARD, for 3 years. Only in the 4th year was there a significant turn in the fighting. The culmination of the Manhattan Project was then used to secure an unconditional surrender from the Japanese.
f) The bomb as a weapon of war has not been used since. We (USA) helped the Japanese rebuild, given rights that we in the USA do not have (right to health care, women and men have equal rights). Japan is the 4th largest economy in the world.
This is what I was taught- not that WWII was a just war, but that this was a war that defined American know how, began the break down of racism in the States and gave our economy a heads up for 40 years.
All thing considered, had Japan simply signed a treaty like Stalin did at Yalta, Asian history would quite significantly different.
One thing: Children in the USA are also taught that Hiroshima and Nagaski were horrible yet necessary. I wonder if that is the objection?
D 6:12 PM
There was a big debate about Hiroshima on NBR forums just recently, and it is still an unresolved issue---were the bombs needed to get Japan to surrender and ultimately save lives? Or was the Russian intervention the deciding factor? Or were all of the above or none of the above necessary. The arguments for both sides are quite interesting. But yes, it certainly could have been avoided by the Japanese government.
Ikeuchi seems to be living in a dream word. Japan has no moral high ground in its WW2 actions that I can think of. Certainly not attempting to fight on after the first bomb, then continuing after Russia declared war, then after the second bomb, and even risking a third.
But who knows, today it is hard to defend dropping atomic bombs on civilian targets. The question is: What does he mean by "a winning card against the US?" And why does he seem to accept the Washington Post ad claiming the Japanese Army did not coerce women into sexual slavery?
Meaningless policy changes
Another perspective on Ozawa's rationale
And speaking of Twitter: Saoshi Kon's
Show Ozawa n' Loopy how you feel
Akiramemashita!
Ozawa to the rescue
国家の品格
I think anyone who is interested in Japan would be...
Back about 20 years ago (good lord I must be gett...
WSJ, Reason, and Nobel Paul dissed
Barely concealed contempt*
What would Tyler Brule do?
Japan has bowed to global pressure to end the p...
The LDP shows who and what it (still) represents
Sorry I am late in posting comments. Blogger does ...
Westerners tend to link Japan's workaholic society...


We are a full time, year-round, Christian Child Care Center serving children ages six weeks to five years of age.
Take Hwy 169 North to the 42nd Avenue (Rockford Road) exit and go East. Take a right on Winnetka Avenue North. Go down a couple blocks and take a left on Quebec Avenue. We are in the gray church.


When the holidays come around, we all go a little crazy trying to find the perfect gift for our loved ones and friends. But in all honesty, most people just want a gift certificate. A gift certificate is an ideal gift because the recipient can get something that they pick out. Even if the gift certificate is for a store they normally don't go to, they still will find something they need or want as long as they get to choose it.
Some people think a gift certificate is not personal, but the truth is that it can be. It shows you care about the person's time and you let them have a choice in their gift. You don't waste their time by putting the person through the after-holiday returning or exchanging. There is nothing worse than going to a store after the holidays and trying to return something that was never wanted in the first place. Plus, they have to wait in long lines and at times they are not able to return it without the receipt. So why not give a gift certificate from Budget Blinds®? They can update their home with custom window coverings or bedding and decorative pillows in any style they desire.
How Do I Purchase a Budget Blinds Gift Certificate?
Every Budget Blinds location serves a specific area, so, for a distant friend, visit our website to search for the local Budget Blinds where they live and arrange a gift certificate through their nearest location. Call the local Budget Blinds Style Consultant for all details and to purchase the gift certificate. The stylized gift packet includes a mini-brochure of design ideas along with the gift certificate in a custom envelope.
Drop a Hint for Your Very Own Budget Blinds Gift Certificate!
Faux wood blinds give your home a classic look that is extremely durable. They come in a variety of colors from whites to textured finishes to fit your home's décor.
Custom-fit shutters can be tailor-made to cover those uniquely shaped windows. They are ideal to cover those hard-to-reach windows, and some styles of shutters can be motorized for the ultimate convenience.
Shades are the most versatile window treatment and they come in over 80 contemporary prints and colors. They are very user-friendly and are available with cordless lift for a child-safe environment.
Drapery styles come in ready-made panels or completely custom design and range from trendy to modern to dress up your windows. Window treatments can be layered with drapery panels to complete your window fashion.
Call your local Budget Blinds Style Consultant today to help you purchase the perfect gift certificate for your loved ones and maybe one for yourself. Call 866-879-9730 today to schedule a FREE, in-home consultation or go online to www.budgetblinds.com to find the Style Consultant nearest you.


text:
Category: Skerrit, Roosevelt
Prince Charles Visits Dominica Nov 19: Royal Tweets and Video Updates from the Office of the Prime Minister
November 19, 2017 November 23, 2017 by Charles Alexander, posted in Dominica, HRH Charles, Prince of Wales, Hurricane Maria Dominica Aftermath, International Aid Post-Maria, Skerrit, Roosevelt
His Royal Highness Charles, Prince of Wales, recently toured Irma and Maria devastation in the Caribbean region over a three day official visit. After surveying damage to Antigua, Barbuda, and the British Virgin Islands Nov 17-18, Prince Charles arrived on Dominica on Sunday, November 19, inspecting Hurricane Maria's catastrophic impact, meeting island residents, and attending a government cabinet meeting with Prime Minister Roosevelt Skerrit.
Prior to departure, the Prince stated: "If I may say, I have been so full of admiration for the remarkable courage and resilience of people in Dominica…we are all trying to do our best to support this very important part of the Commonwealth, and I hope everybody has the happiest Christmas as possible. "
The UK's International Development Secretary Penny Mordaunt joined the Prince on his Caribbean visit, announcing that Britain will give Dominica an additional £12 million for recovery efforts.
"And so it was painful beyond words to see the devastation that was so cruelly wrought across the Caribbean by Hurricanes Irma and Maria in those few, terrible weeks in September."– HRH Charles, Prince of Wales
In Search of Paradise Lost
October 9, 2017 November 16, 2017 by Charles Alexander, posted in Amazona imperialis, Dominica, Dominica Healing of Eden, Hurricane Maria Dominica Aftermath, Parrot, Imperial, Sisserou, Skerrit, Roosevelt
Trafalgar Falls, Dominica, Pre-Maria
Welcome to Eden Is Broken, a personal narrative devoted to the fate of Caribbean nature in the Age of the Superstorm. An exploration of island paradises past and present, this website places special emphasis on the step-by-step recovery of Dominica's rainforest and wildlife in the wake of Hurricane Maria.
The site is named in honor of Dominica's Prime Minister Roosevelt Skerrit. The Prime Minister's seventeen-minute address to the United Nations General Assembly on September 23, 2017, just five days after Cat 5 Maria made landfall on the once-pristine Nature Island of the Caribbean, was delivered as an appeal for immediate disaster aid– as well as a global wake-up call in the face of catastrophic climate change. Key points of the address are excerpted here:
With physical and emotional difficulty, I have left my bleeding nation to be with you here today because these are moments for which the United Nations exist…In the case of Dominica, it has been two years since we lost lives and endured substantial physical and infrastructural damage from the ravages of the floods and mud slides of Tropical Storm Ericka.
To deny climate change is to procrastinate while the earth sinks; it is to deny a truth we have just lived.
It is to mock thousands who in a few hours, without a roof over their heads, will watch the night descend on Dominica in fear of sudden mud slides and what the next hurricane may bring…
But what is our reality at this moment? Pure devastation, as Dominicans bear the brunt of climate change. We are shouldering the consequences of the actions of others. Actions that endanger our very existence and all for the enrichment of a few elsewhere…
We dug graves today in Dominica. We buried loved ones yesterday and I am sure that as I return home tomorrow, we shall discover additional fatalities, as a consequence of this encounter. Our homes are flattened. Our buildings roofless. Our water pipes smashed and road infrastructure destroyed. Our hospital is without power and schools have disappeared beneath the rubble. Our crops are uprooted. Where there was green there is now only dust and dirt.
The desolation is beyond imagination. Mr. President, fellow leaders– the stars have fallen. Eden is broken.
The nation of Dominica has come here to declare an international humanitarian emergency. One that is centered in Dominica, but also encompasses many of our neighbors, including our sister isle Antigua, which had to evacuate its citizens from Barbuda.
The time has come for the international community to make a stand and to decide whether it will be shoulder to shoulder with those suffering the ravages of climate change worldwide. Whether we can mitigate the consequences of unprecendented increases in sea temperatures and levels; whether to help us rebuild sustainable livelihoods; or whether the international community will merely show some pity now, and then flee, relieved to know that this time it was not you.
We will rebuild our Garden of Eden again for our children and for future generations.
U.S. Navy photo by Mass Communication Specialist 3rd Class Michael Molina
Eden Is Broken is dedicated to everyone affected by Maria's wrath, to the long road toward recovery of the livelihoods and ecology of the island– and to Dominica's national bird: the Imperial amazon, a parrot species older than the island itself.
One of two parrots native to Dominica, the Imperial– known locally as the Sisserou– is the island jewel at the heart of this site, just as it comprises the center of Dominica's national flag. The fate of the Sisserou and the ecological health of its only island home are inextricably woven with the future prosperity of Dominica's people.
Dominica's flag with Sisserou as National Emblem
Please join me in search of the Caribbean's imperiled Edens, from the time before Columbus, to the aftermath of Maria– and beyond.
Continue reading "In Search of Paradise Lost" →


text:
Centaurus est une série de bande dessinée de science-fiction créée par  Leo et Rodolphe.

Description

Synopsis
Ils sont  d'origine, dernier espoir de l'humanité, à vivre à l'intérieur d'un vaisseau-monde, qui est pour la majorité d'entre-eux le seul monde qu'ils aient jamais connu sans même se douter de l'immense vide spatial qu'ils traversent. Ils arrivent à la fin d'un long voyage vers la planète Vera, située à  de la Terre, après un périple de  dans l'espace.

Une petite équipe est constituée pour partir en exploration, afin de vérifier si la planète est adaptée pour cette nouvelle colonie de la Terre. Ils découvrent rapidement la faune hostile et quelques surprenants habitants dont ils n'imaginaient pas l'existence. Et les surprises ne font que commencer.

Publications

Notes et références

Liens externes
 Centaurus 01. Terre promise sur Delcourt

Série de bande dessinée française
Série Delcourt
Série de bande dessinée de science-fiction
Bande dessinée franco-belge
Bande dessinée fantastique
Bande dessinée de Leo


text:
In 2015 the United Nations established 17 Sustainable Development Goals to transform our world. The University of Suffolk, with over 3430 students and 433 staff based across its campuses, is committed to working closely with key local and national partners to play its role in the realisation of these goals.
The University of Suffolk takes a strategic approach to sustainable development across all of its operations and activities. Meeting our sustainable development objectives is crucial to both students, staff, and the wider local community. Within this community, we share a vital academic and economic position across the region; coupled with an accountability to ensure the protection of the condition of our immediate and global environment through the pursuit of excellence in social and corporate responsibility.
We have a committed vision to educate current and future decision-makers and apply academic study to help solve many of the sustainability issues society faces; whilst improving the health and well being of the community we serve.
We are committed to sustainability throughout all of our activities, from the operation and management of our campuses, through to teaching and learning, research and knowledge exchange. Further realised through the external leadership work we conduct through the University's, Suffolk Sustainability Institute, in collaboration with our partnership organisations.
Implementing sustainability management programmes within our facilities and estate allows us to operate our campuses efficiently and innovatively; whilst minimising negative impacts on the wider environment and working towards environmental net benefit gains. In recent years the University of Suffolk has made significant progress in improving its own sustainability performance and is gaining national recognition, for it's leadership in developing and facilitating agenda setting conferences and events on emerging transformative practice.
The University of Suffolk is committed to the continual improvement of its sustainable responsibilities and it will manage this commitment through engagement of its senior leadership teams and annual planning rounds.
As such the University requires its activities to meet or exceed the conformance requirements of applicable environmental standards, regulations, and guidelines. Rising to this challenge it will:
Ensure compliance with all relevant legislation and regulations.
Ensure sustainability is fully understood by staff, students and stakeholders and is embedded within all aspects of University strategy, planning and activities.
Create partnerships at all levels within the University's sphere of influence that further the practice of sustainability, including prioritising working with partners and organisations that can help us achieve more sustainable outcomes.
Reduce carbon and greenhouse gas emissions through the reduction of energy usage in line with the University of Suffolk Carbon Management Plan and ensure the minimisation of waste and the recycling of materials wherever practicable.
Provide educational and research opportunities and carry out operational activities that seek to minimise negative impacts and promote sound sustainability practice.
Ensure that sustainability and biodiversity opportunities are identified and implemented when considering land use, development, and construction practices.
Regularly review our activities and operations and their impact, and where relevant put in place actions to address issues identified.
The University of Suffolk will seek to stimulate the transition towards sustainable organisational growth by positioning social wellbeing and environmental impact reduction at the heart of its strategic direction.
The University of Suffolk and all members of the University community will move towards supporting actions, decisions, and leadership that will:
Transit towards ensuring that social and environmental concerns are incorporated as a significant priority in decision-making
Identify the essential areas in which we should seek to strengthen our corporate and social responsibility and develop clear and focused plans of action.
This Policy Statement is fully supported by the Vice Chancellor's Executive Team, and all staff, students, and external stakeholders as well as visitors and contractors share this responsibility. This policy will be reviewed annually by the Vice Chancellor and the Executive in order to continue our progress toward significant and lasting organisational change.
helen sign.png
helen.jpg
Professor Helen Langton
Vice-Chancellor and CEO
University of Suffolk 2020
Additional supporting Policies of interest:
The University of Suffolk Travel Plan
The University of Suffolk Biodiversity Plan
Headline Metrics Report 2019
Page last modified: 30 September 2020
Page created: 05 July 2016


text:
Hammer at Home Kits
Made-to-Order Items
01/22/2021 (7PM) Ways To Say "I Love You" Workshop (Yadkin Valley)
Join us Friday, January 22nd at 7:00pmfor a DIY workshop to make one of our 8"x24" Signs! Customize your project in studio with your choice of stain and paint colors! This registration allows for one adult to make one project. Registration is required to attend.
1. Choose your project design style from the dropdown menu below.
Projects are defaulted to be without frames, if wanting to add make sure to "Add Frame"
2. Enter verbiage needed to complete your project in the personalization field.
If choosing a custom sound wave--you will need to voice record and send us a sound clip of the audio you wish to have shown to info@hammerandstainyvnc.com with your last name and order number in the e-mail subject.. E-mail MUST be received same day as order is placed. If not received same day, your registration will be cancelled and a 30% cancellation fee will apply.
If choosing a custom handwritten sign--you will need to send us a picture of handwritten piece to info@hammerandstainyvnc.com with your last name and order number in the e-mail subject.. E-mail MUST be received same day as order is placed. If not received same day, your registration will be cancelled and a 30% cancellation fee will apply.
3. Proceed with checkout.
We are excited to have everyone in studio again! Under this "new normal" we do have some additional policies we must put in place. By registering for this workshop, you agree to the following:
We have a strict maximum capacity of 8 people that we will be following for all indoor public events. One project per person. Only those registered for a workshop will be able to attend the workshop.
Masks are required per the executive order of our state government. Executive order exemptions are recognized. You must wash or sanitize your hands prior to touching your mask for any reason. This is to protect you as well as our staff and other guests from cross-contamination.
If you have had a fever in the past week leading up to the workshop, please do NOT attend this workshop. Contact us at info@hammerandstainyvnc.com if this is the case so we can prep your project for home completion and curbside pickup.
Please arrive no more than 10 minutes prior to your workshop start time. The workshop will start promptly at the time noted. Out of respect for other makers and our staff, please make sure to arrive on time. Failure to do so could result in forfeiting your project and payment. Our doors will remain closed and locked until 10 minutes prior to workshop time.
At this time we will not supply aprons to be worn. Please bring your own if needed or dress accordingly.
We will not allow any community shared food or drinks at this time. Personal drinks and snacks are permitted
Please understand that our policies are subject to change. This is a new time for everyone and we appreciate your understanding and are looking forward to a great workshop!
Design Option Braille "I Love You" Sound Wave "I Love You" Custom Sound Wave "I Love You" Cursive "I Love You" French "I Love You" Greek "I Love You" Handwritten "I Love You" Custom Handwritten "I Love You" Morse Code "I Love You" Music Note "I Love You" Sign Language "I Love You"
Braille "I Love You" Sound Wave "I Love You" Custom Sound Wave "I Love You" Cursive "I Love You" French "I Love You" Greek "I Love You" Handwritten "I Love You" Custom Handwritten "I Love You" Morse Code "I Love You" Music Note "I Love You" Sign Language "I Love You"
© 2021, Hammer & Stain -YVNC


text:
package ipc

import (
	"encoding/binary"
	"errors"
	"fmt"
	"io"
	"sort"

	"github.com/apache/arrow/go/v11/arrow"
	"github.com/apache/arrow/go/v11/arrow/endian"
	"github.com/apache/arrow/go/v11/arrow/internal/dictutils"
	"github.com/apache/arrow/go/v11/arrow/internal/flatbuf"
	"github.com/apache/arrow/go/v11/arrow/memory"
	flatbuffers "github.com/google/flatbuffers/go"
)

// Magic string identifying an Apache Arrow file.
var Magic = []byte("ARROW1")

const (
	currentMetadataVersion = MetadataV5
	minMetadataVersion     = MetadataV4

	// constants for the extension type metadata keys for the type name and
	// any extension metadata to be passed to deserialize.
	ExtensionTypeKeyName     = "ARROW:extension:name"
	ExtensionMetadataKeyName = "ARROW:extension:metadata"

	// ARROW-109: We set this number arbitrarily to help catch user mistakes. For
	// deeply nested schemas, it is expected the user will indicate explicitly the
	// maximum allowed recursion depth
	kMaxNestingDepth = 64
)

type startVecFunc func(b *flatbuffers.Builder, n int) flatbuffers.UOffsetT

type fieldMetadata struct {
	Len    int64
	Nulls  int64
	Offset int64
}

type bufferMetadata struct {
	Offset int64 // relative offset into the memory page to the starting byte of the buffer
	Len    int64 // absolute length in bytes of the buffer
}

type fileBlock struct {
	Offset int64
	Meta   int32
	Body   int64

	r   io.ReaderAt
	mem memory.Allocator
}

func fileBlocksToFB(b *flatbuffers.Builder, blocks []fileBlock, start startVecFunc) flatbuffers.UOffsetT {
	start(b, len(blocks))
	for i := len(blocks) - 1; i >= 0; i-- {
		blk := blocks[i]
		flatbuf.CreateBlock(b, blk.Offset, blk.Meta, blk.Body)
	}

	return b.EndVector(len(blocks))
}

func (blk fileBlock) NewMessage() (*Message, error) {
	var (
		err  error
		buf  []byte
		body *memory.Buffer
		meta *memory.Buffer
		r    = blk.section()
	)

	meta = memory.NewResizableBuffer(blk.mem)
	meta.Resize(int(blk.Meta))
	defer meta.Release()

	buf = meta.Bytes()
	_, err = io.ReadFull(r, buf)
	if err != nil {
		return nil, fmt.Errorf("arrow/ipc: could not read message metadata: %w", err)
	}

	prefix := 0
	switch binary.LittleEndian.Uint32(buf) {
	case 0:
	case kIPCContToken:
		prefix = 8
	default:
		// ARROW-6314: backwards compatibility for reading old IPC
		// messages produced prior to version 0.15.0
		prefix = 4
	}

	// drop buf-size already known from blk.Meta
	meta = memory.SliceBuffer(meta, prefix, int(blk.Meta)-prefix)
	defer meta.Release()

	body = memory.NewResizableBuffer(blk.mem)
	defer body.Release()
	body.Resize(int(blk.Body))
	buf = body.Bytes()
	_, err = io.ReadFull(r, buf)
	if err != nil {
		return nil, fmt.Errorf("arrow/ipc: could not read message body: %w", err)
	}

	return NewMessage(meta, body), nil
}

func (blk fileBlock) section() io.Reader {
	return io.NewSectionReader(blk.r, blk.Offset, int64(blk.Meta)+blk.Body)
}

func unitFromFB(unit flatbuf.TimeUnit) arrow.TimeUnit {
	switch unit {
	case flatbuf.TimeUnitSECOND:
		return arrow.Second
	case flatbuf.TimeUnitMILLISECOND:
		return arrow.Millisecond
	case flatbuf.TimeUnitMICROSECOND:
		return arrow.Microsecond
	case flatbuf.TimeUnitNANOSECOND:
		return arrow.Nanosecond
	default:
		panic(fmt.Errorf("arrow/ipc: invalid flatbuf.TimeUnit(%d) value", unit))
	}
}

func unitToFB(unit arrow.TimeUnit) flatbuf.TimeUnit {
	switch unit {
	case arrow.Second:
		return flatbuf.TimeUnitSECOND
	case arrow.Millisecond:
		return flatbuf.TimeUnitMILLISECOND
	case arrow.Microsecond:
		return flatbuf.TimeUnitMICROSECOND
	case arrow.Nanosecond:
		return flatbuf.TimeUnitNANOSECOND
	default:
		panic(fmt.Errorf("arrow/ipc: invalid arrow.TimeUnit(%d) value", unit))
	}
}

// initFB is a helper function to handle flatbuffers' polymorphism.
func initFB(t interface {
	Table() flatbuffers.Table
	Init([]byte, flatbuffers.UOffsetT)
}, f func(tbl *flatbuffers.Table) bool) {
	tbl := t.Table()
	if !f(&tbl) {
		panic(fmt.Errorf("arrow/ipc: could not initialize %T from flatbuffer", t))
	}
	t.Init(tbl.Bytes, tbl.Pos)
}

func fieldFromFB(field *flatbuf.Field, pos dictutils.FieldPos, memo *dictutils.Memo) (arrow.Field, error) {
	var (
		err error
		o   arrow.Field
	)

	o.Name = string(field.Name())
	o.Nullable = field.Nullable()
	o.Metadata, err = metadataFromFB(field)
	if err != nil {
		return o, err
	}

	n := field.ChildrenLength()
	children := make([]arrow.Field, n)
	for i := range children {
		var childFB flatbuf.Field
		if !field.Children(&childFB, i) {
			return o, fmt.Errorf("arrow/ipc: could not load field child %d", i)

		}
		child, err := fieldFromFB(&childFB, pos.Child(int32(i)), memo)
		if err != nil {
			return o, fmt.Errorf("arrow/ipc: could not convert field child %d: %w", i, err)
		}
		children[i] = child
	}

	o.Type, err = typeFromFB(field, pos, children, &o.Metadata, memo)
	if err != nil {
		return o, fmt.Errorf("arrow/ipc: could not convert field type: %w", err)
	}

	return o, nil
}

func fieldToFB(b *flatbuffers.Builder, pos dictutils.FieldPos, field arrow.Field, memo *dictutils.Mapper) flatbuffers.UOffsetT {
	var visitor = fieldVisitor{b: b, memo: memo, pos: pos, meta: make(map[string]string)}
	return visitor.result(field)
}

type fieldVisitor struct {
	b      *flatbuffers.Builder
	memo   *dictutils.Mapper
	pos    dictutils.FieldPos
	dtype  flatbuf.Type
	offset flatbuffers.UOffsetT
	kids   []flatbuffers.UOffsetT
	meta   map[string]string
}

func (fv *fieldVisitor) visit(field arrow.Field) {
	dt := field.Type
	switch dt := dt.(type) {
	case *arrow.NullType:
		fv.dtype = flatbuf.TypeNull
		flatbuf.NullStart(fv.b)
		fv.offset = flatbuf.NullEnd(fv.b)

	case *arrow.BooleanType:
		fv.dtype = flatbuf.TypeBool
		flatbuf.BoolStart(fv.b)
		fv.offset = flatbuf.BoolEnd(fv.b)

	case *arrow.Uint8Type:
		fv.dtype = flatbuf.TypeInt
		fv.offset = intToFB(fv.b, int32(dt.BitWidth()), false)

	case *arrow.Uint16Type:
		fv.dtype = flatbuf.TypeInt
		fv.offset = intToFB(fv.b, int32(dt.BitWidth()), false)

	case *arrow.Uint32Type:
		fv.dtype = flatbuf.TypeInt
		fv.offset = intToFB(fv.b, int32(dt.BitWidth()), false)

	case *arrow.Uint64Type:
		fv.dtype = flatbuf.TypeInt
		fv.offset = intToFB(fv.b, int32(dt.BitWidth()), false)

	case *arrow.Int8Type:
		fv.dtype = flatbuf.TypeInt
		fv.offset = intToFB(fv.b, int32(dt.BitWidth()), true)

	case *arrow.Int16Type:
		fv.dtype = flatbuf.TypeInt
		fv.offset = intToFB(fv.b, int32(dt.BitWidth()), true)

	case *arrow.Int32Type:
		fv.dtype = flatbuf.TypeInt
		fv.offset = intToFB(fv.b, int32(dt.BitWidth()), true)

	case *arrow.Int64Type:
		fv.dtype = flatbuf.TypeInt
		fv.offset = intToFB(fv.b, int32(dt.BitWidth()), true)

	case *arrow.Float16Type:
		fv.dtype = flatbuf.TypeFloatingPoint
		fv.offset = floatToFB(fv.b, int32(dt.BitWidth()))

	case *arrow.Float32Type:
		fv.dtype = flatbuf.TypeFloatingPoint
		fv.offset = floatToFB(fv.b, int32(dt.BitWidth()))

	case *arrow.Float64Type:
		fv.dtype = flatbuf.TypeFloatingPoint
		fv.offset = floatToFB(fv.b, int32(dt.BitWidth()))

	case *arrow.Decimal128Type:
		fv.dtype = flatbuf.TypeDecimal
		flatbuf.DecimalStart(fv.b)
		flatbuf.DecimalAddPrecision(fv.b, dt.Precision)
		flatbuf.DecimalAddScale(fv.b, dt.Scale)
		flatbuf.DecimalAddBitWidth(fv.b, 128)
		fv.offset = flatbuf.DecimalEnd(fv.b)

	case *arrow.Decimal256Type:
		fv.dtype = flatbuf.TypeDecimal
		flatbuf.DecimalStart(fv.b)
		flatbuf.DecimalAddPrecision(fv.b, dt.Precision)
		flatbuf.DecimalAddScale(fv.b, dt.Scale)
		flatbuf.DecimalAddBitWidth(fv.b, 256)
		fv.offset = flatbuf.DecimalEnd(fv.b)

	case *arrow.FixedSizeBinaryType:
		fv.dtype = flatbuf.TypeFixedSizeBinary
		flatbuf.FixedSizeBinaryStart(fv.b)
		flatbuf.FixedSizeBinaryAddByteWidth(fv.b, int32(dt.ByteWidth))
		fv.offset = flatbuf.FixedSizeBinaryEnd(fv.b)

	case *arrow.BinaryType:
		fv.dtype = flatbuf.TypeBinary
		flatbuf.BinaryStart(fv.b)
		fv.offset = flatbuf.BinaryEnd(fv.b)

	case *arrow.LargeBinaryType:
		fv.dtype = flatbuf.TypeLargeBinary
		flatbuf.LargeBinaryStart(fv.b)
		fv.offset = flatbuf.LargeBinaryEnd(fv.b)

	case *arrow.StringType:
		fv.dtype = flatbuf.TypeUtf8
		flatbuf.Utf8Start(fv.b)
		fv.offset = flatbuf.Utf8End(fv.b)

	case *arrow.LargeStringType:
		fv.dtype = flatbuf.TypeLargeUtf8
		flatbuf.LargeUtf8Start(fv.b)
		fv.offset = flatbuf.LargeUtf8End(fv.b)

	case *arrow.Date32Type:
		fv.dtype = flatbuf.TypeDate
		flatbuf.DateStart(fv.b)
		flatbuf.DateAddUnit(fv.b, flatbuf.DateUnitDAY)
		fv.offset = flatbuf.DateEnd(fv.b)

	case *arrow.Date64Type:
		fv.dtype = flatbuf.TypeDate
		flatbuf.DateStart(fv.b)
		flatbuf.DateAddUnit(fv.b, flatbuf.DateUnitMILLISECOND)
		fv.offset = flatbuf.DateEnd(fv.b)

	case *arrow.Time32Type:
		fv.dtype = flatbuf.TypeTime
		flatbuf.TimeStart(fv.b)
		flatbuf.TimeAddUnit(fv.b, unitToFB(dt.Unit))
		flatbuf.TimeAddBitWidth(fv.b, 32)
		fv.offset = flatbuf.TimeEnd(fv.b)

	case *arrow.Time64Type:
		fv.dtype = flatbuf.TypeTime
		flatbuf.TimeStart(fv.b)
		flatbuf.TimeAddUnit(fv.b, unitToFB(dt.Unit))
		flatbuf.TimeAddBitWidth(fv.b, 64)
		fv.offset = flatbuf.TimeEnd(fv.b)

	case *arrow.TimestampType:
		fv.dtype = flatbuf.TypeTimestamp
		unit := unitToFB(dt.Unit)
		var tz flatbuffers.UOffsetT
		if dt.TimeZone != "" {
			tz = fv.b.CreateString(dt.TimeZone)
		}
		flatbuf.TimestampStart(fv.b)
		flatbuf.TimestampAddUnit(fv.b, unit)
		flatbuf.TimestampAddTimezone(fv.b, tz)
		fv.offset = flatbuf.TimestampEnd(fv.b)

	case *arrow.StructType:
		fv.dtype = flatbuf.TypeStruct_
		offsets := make([]flatbuffers.UOffsetT, len(dt.Fields()))
		for i, field := range dt.Fields() {
			offsets[i] = fieldToFB(fv.b, fv.pos.Child(int32(i)), field, fv.memo)
		}
		flatbuf.Struct_Start(fv.b)
		for i := len(offsets) - 1; i >= 0; i-- {
			fv.b.PrependUOffsetT(offsets[i])
		}
		fv.offset = flatbuf.Struct_End(fv.b)
		fv.kids = append(fv.kids, offsets...)

	case *arrow.ListType:
		fv.dtype = flatbuf.TypeList
		fv.kids = append(fv.kids, fieldToFB(fv.b, fv.pos.Child(0), dt.ElemField(), fv.memo))
		flatbuf.ListStart(fv.b)
		fv.offset = flatbuf.ListEnd(fv.b)

	case *arrow.LargeListType:
		fv.dtype = flatbuf.TypeLargeList
		fv.kids = append(fv.kids, fieldToFB(fv.b, fv.pos.Child(0), dt.ElemField(), fv.memo))
		flatbuf.LargeListStart(fv.b)
		fv.offset = flatbuf.LargeListEnd(fv.b)

	case *arrow.FixedSizeListType:
		fv.dtype = flatbuf.TypeFixedSizeList
		fv.kids = append(fv.kids, fieldToFB(fv.b, fv.pos.Child(0), dt.ElemField(), fv.memo))
		flatbuf.FixedSizeListStart(fv.b)
		flatbuf.FixedSizeListAddListSize(fv.b, dt.Len())
		fv.offset = flatbuf.FixedSizeListEnd(fv.b)

	case *arrow.MonthIntervalType:
		fv.dtype = flatbuf.TypeInterval
		flatbuf.IntervalStart(fv.b)
		flatbuf.IntervalAddUnit(fv.b, flatbuf.IntervalUnitYEAR_MONTH)
		fv.offset = flatbuf.IntervalEnd(fv.b)

	case *arrow.DayTimeIntervalType:
		fv.dtype = flatbuf.TypeInterval
		flatbuf.IntervalStart(fv.b)
		flatbuf.IntervalAddUnit(fv.b, flatbuf.IntervalUnitDAY_TIME)
		fv.offset = flatbuf.IntervalEnd(fv.b)

	case *arrow.MonthDayNanoIntervalType:
		fv.dtype = flatbuf.TypeInterval
		flatbuf.IntervalStart(fv.b)
		flatbuf.IntervalAddUnit(fv.b, flatbuf.IntervalUnitMONTH_DAY_NANO)
		fv.offset = flatbuf.IntervalEnd(fv.b)

	case *arrow.DurationType:
		fv.dtype = flatbuf.TypeDuration
		unit := unitToFB(dt.Unit)
		flatbuf.DurationStart(fv.b)
		flatbuf.DurationAddUnit(fv.b, unit)
		fv.offset = flatbuf.DurationEnd(fv.b)

	case *arrow.MapType:
		fv.dtype = flatbuf.TypeMap
		fv.kids = append(fv.kids, fieldToFB(fv.b, fv.pos.Child(0), dt.ValueField(), fv.memo))
		flatbuf.MapStart(fv.b)
		flatbuf.MapAddKeysSorted(fv.b, dt.KeysSorted)
		fv.offset = flatbuf.MapEnd(fv.b)

	case arrow.ExtensionType:
		field.Type = dt.StorageType()
		fv.visit(field)
		fv.meta[ExtensionTypeKeyName] = dt.ExtensionName()
		fv.meta[ExtensionMetadataKeyName] = string(dt.Serialize())

	case *arrow.DictionaryType:
		field.Type = dt.ValueType
		fv.visit(field)

	case arrow.UnionType:
		fv.dtype = flatbuf.TypeUnion
		offsets := make([]flatbuffers.UOffsetT, len(dt.Fields()))
		for i, field := range dt.Fields() {
			offsets[i] = fieldToFB(fv.b, fv.pos.Child(int32(i)), field, fv.memo)
		}

		codes := dt.TypeCodes()
		flatbuf.UnionStartTypeIdsVector(fv.b, len(codes))

		for i := len(codes) - 1; i >= 0; i-- {
			fv.b.PlaceInt32(int32(codes[i]))
		}
		fbTypeIDs := fv.b.EndVector(len(dt.TypeCodes()))
		flatbuf.UnionStart(fv.b)
		switch dt.Mode() {
		case arrow.SparseMode:
			flatbuf.UnionAddMode(fv.b, flatbuf.UnionModeSparse)
		case arrow.DenseMode:
			flatbuf.UnionAddMode(fv.b, flatbuf.UnionModeDense)
		default:
			panic("invalid union mode")
		}
		flatbuf.UnionAddTypeIds(fv.b, fbTypeIDs)
		fv.offset = flatbuf.UnionEnd(fv.b)
		fv.kids = append(fv.kids, offsets...)

	default:
		err := fmt.Errorf("arrow/ipc: invalid data type %v", dt)
		panic(err) // FIXME(sbinet): implement all data-types.
	}
}

func (fv *fieldVisitor) result(field arrow.Field) flatbuffers.UOffsetT {
	nameFB := fv.b.CreateString(field.Name)

	fv.visit(field)

	flatbuf.FieldStartChildrenVector(fv.b, len(fv.kids))
	for i := len(fv.kids) - 1; i >= 0; i-- {
		fv.b.PrependUOffsetT(fv.kids[i])
	}
	kidsFB := fv.b.EndVector(len(fv.kids))

	storageType := field.Type
	if storageType.ID() == arrow.EXTENSION {
		storageType = storageType.(arrow.ExtensionType).StorageType()
	}

	var dictFB flatbuffers.UOffsetT
	if storageType.ID() == arrow.DICTIONARY {
		idxType := field.Type.(*arrow.DictionaryType).IndexType.(arrow.FixedWidthDataType)

		dictID, err := fv.memo.GetFieldID(fv.pos.Path())
		if err != nil {
			panic(err)
		}
		var signed bool
		switch idxType.ID() {
		case arrow.UINT8, arrow.UINT16, arrow.UINT32, arrow.UINT64:
			signed = false
		case arrow.INT8, arrow.INT16, arrow.INT32, arrow.INT64:
			signed = true
		}
		indexTypeOffset := intToFB(fv.b, int32(idxType.BitWidth()), signed)
		flatbuf.DictionaryEncodingStart(fv.b)
		flatbuf.DictionaryEncodingAddId(fv.b, dictID)
		flatbuf.DictionaryEncodingAddIndexType(fv.b, indexTypeOffset)
		flatbuf.DictionaryEncodingAddIsOrdered(fv.b, field.Type.(*arrow.DictionaryType).Ordered)
		dictFB = flatbuf.DictionaryEncodingEnd(fv.b)
	}

	var (
		metaFB flatbuffers.UOffsetT
		kvs    []flatbuffers.UOffsetT
	)
	for i, k := range field.Metadata.Keys() {
		v := field.Metadata.Values()[i]
		kk := fv.b.CreateString(k)
		vv := fv.b.CreateString(v)
		flatbuf.KeyValueStart(fv.b)
		flatbuf.KeyValueAddKey(fv.b, kk)
		flatbuf.KeyValueAddValue(fv.b, vv)
		kvs = append(kvs, flatbuf.KeyValueEnd(fv.b))
	}
	{
		keys := make([]string, 0, len(fv.meta))
		for k := range fv.meta {
			keys = append(keys, k)
		}
		sort.Strings(keys)
		for _, k := range keys {
			v := fv.meta[k]
			kk := fv.b.CreateString(k)
			vv := fv.b.CreateString(v)
			flatbuf.KeyValueStart(fv.b)
			flatbuf.KeyValueAddKey(fv.b, kk)
			flatbuf.KeyValueAddValue(fv.b, vv)
			kvs = append(kvs, flatbuf.KeyValueEnd(fv.b))
		}
	}
	if len(kvs) > 0 {
		flatbuf.FieldStartCustomMetadataVector(fv.b, len(kvs))
		for i := len(kvs) - 1; i >= 0; i-- {
			fv.b.PrependUOffsetT(kvs[i])
		}
		metaFB = fv.b.EndVector(len(kvs))
	}

	flatbuf.FieldStart(fv.b)
	flatbuf.FieldAddName(fv.b, nameFB)
	flatbuf.FieldAddNullable(fv.b, field.Nullable)
	flatbuf.FieldAddTypeType(fv.b, fv.dtype)
	flatbuf.FieldAddType(fv.b, fv.offset)
	flatbuf.FieldAddDictionary(fv.b, dictFB)
	flatbuf.FieldAddChildren(fv.b, kidsFB)
	flatbuf.FieldAddCustomMetadata(fv.b, metaFB)

	offset := flatbuf.FieldEnd(fv.b)

	return offset
}

func typeFromFB(field *flatbuf.Field, pos dictutils.FieldPos, children []arrow.Field, md *arrow.Metadata, memo *dictutils.Memo) (arrow.DataType, error) {
	var data flatbuffers.Table
	if !field.Type(&data) {
		return nil, fmt.Errorf("arrow/ipc: could not load field type data")
	}

	dt, err := concreteTypeFromFB(field.TypeType(), data, children)
	if err != nil {
		return dt, err
	}

	var (
		dictID        = int64(-1)
		dictValueType arrow.DataType
		encoding      = field.Dictionary(nil)
	)
	if encoding != nil {
		var idt flatbuf.Int
		encoding.IndexType(&idt)
		idxType, err := intFromFB(idt)
		if err != nil {
			return nil, err
		}

		dictValueType = dt
		dt = &arrow.DictionaryType{IndexType: idxType, ValueType: dictValueType, Ordered: encoding.IsOrdered()}
		dictID = encoding.Id()

		if err = memo.Mapper.AddField(dictID, pos.Path()); err != nil {
			return dt, err
		}
		if err = memo.AddType(dictID, dictValueType); err != nil {
			return dt, err
		}

	}

	// look for extension metadata in custom metadata field.
	if md.Len() > 0 {
		i := md.FindKey(ExtensionTypeKeyName)
		if i < 0 {
			return dt, err
		}

		extType := arrow.GetExtensionType(md.Values()[i])
		if extType == nil {
			// if the extension type is unknown, we do not error here.
			// simply return the storage type.
			return dt, err
		}

		var (
			data    string
			dataIdx int
		)

		if dataIdx = md.FindKey(ExtensionMetadataKeyName); dataIdx >= 0 {
			data = md.Values()[dataIdx]
		}

		dt, err = extType.Deserialize(dt, data)
		if err != nil {
			return dt, err
		}

		mdkeys := md.Keys()
		mdvals := md.Values()
		if dataIdx < 0 {
			// if there was no extension metadata, just the name, we only have to
			// remove the extension name metadata key/value to ensure roundtrip
			// metadata consistency
			*md = arrow.NewMetadata(append(mdkeys[:i], mdkeys[i+1:]...), append(mdvals[:i], mdvals[i+1:]...))
		} else {
			// if there was extension metadata, we need to remove both the type name
			// and the extension metadata keys and values.
			newkeys := make([]string, 0, md.Len()-2)
			newvals := make([]string, 0, md.Len()-2)
			for j := range mdkeys {
				if j != i && j != dataIdx { // copy everything except the extension metadata keys/values
					newkeys = append(newkeys, mdkeys[j])
					newvals = append(newvals, mdvals[j])
				}
			}
			*md = arrow.NewMetadata(newkeys, newvals)
		}
	}

	return dt, err
}

func concreteTypeFromFB(typ flatbuf.Type, data flatbuffers.Table, children []arrow.Field) (arrow.DataType, error) {
	switch typ {
	case flatbuf.TypeNONE:
		return nil, fmt.Errorf("arrow/ipc: Type metadata cannot be none")

	case flatbuf.TypeNull:
		return arrow.Null, nil

	case flatbuf.TypeInt:
		var dt flatbuf.Int
		dt.Init(data.Bytes, data.Pos)
		return intFromFB(dt)

	case flatbuf.TypeFloatingPoint:
		var dt flatbuf.FloatingPoint
		dt.Init(data.Bytes, data.Pos)
		return floatFromFB(dt)

	case flatbuf.TypeDecimal:
		var dt flatbuf.Decimal
		dt.Init(data.Bytes, data.Pos)
		return decimalFromFB(dt)

	case flatbuf.TypeBinary:
		return arrow.BinaryTypes.Binary, nil

	case flatbuf.TypeFixedSizeBinary:
		var dt flatbuf.FixedSizeBinary
		dt.Init(data.Bytes, data.Pos)
		return &arrow.FixedSizeBinaryType{ByteWidth: int(dt.ByteWidth())}, nil

	case flatbuf.TypeUtf8:
		return arrow.BinaryTypes.String, nil

	case flatbuf.TypeLargeBinary:
		return arrow.BinaryTypes.LargeBinary, nil

	case flatbuf.TypeLargeUtf8:
		return arrow.BinaryTypes.LargeString, nil

	case flatbuf.TypeBool:
		return arrow.FixedWidthTypes.Boolean, nil

	case flatbuf.TypeList:
		if len(children) != 1 {
			return nil, fmt.Errorf("arrow/ipc: List must have exactly 1 child field (got=%d)", len(children))
		}
		dt := arrow.ListOfField(children[0])
		return dt, nil

	case flatbuf.TypeLargeList:
		if len(children) != 1 {
			return nil, fmt.Errorf("arrow/ipc: LargeList must have exactly 1 child field (got=%d)", len(children))
		}
		dt := arrow.LargeListOfField(children[0])
		return dt, nil

	case flatbuf.TypeFixedSizeList:
		var dt flatbuf.FixedSizeList
		dt.Init(data.Bytes, data.Pos)
		if len(children) != 1 {
			return nil, fmt.Errorf("arrow/ipc: FixedSizeList must have exactly 1 child field (got=%d)", len(children))
		}
		ret := arrow.FixedSizeListOfField(dt.ListSize(), children[0])
		return ret, nil

	case flatbuf.TypeStruct_:
		return arrow.StructOf(children...), nil

	case flatbuf.TypeUnion:
		var dt flatbuf.Union
		dt.Init(data.Bytes, data.Pos)
		var (
			mode    arrow.UnionMode
			typeIDs []arrow.UnionTypeCode
		)

		switch dt.Mode() {
		case flatbuf.UnionModeSparse:
			mode = arrow.SparseMode
		case flatbuf.UnionModeDense:
			mode = arrow.DenseMode
		}

		typeIDLen := dt.TypeIdsLength()

		if typeIDLen == 0 {
			for i := range children {
				typeIDs = append(typeIDs, int8(i))
			}
		} else {
			for i := 0; i < typeIDLen; i++ {
				id := dt.TypeIds(i)
				code := arrow.UnionTypeCode(id)
				if int32(code) != id {
					return nil, errors.New("union type id out of bounds")
				}
				typeIDs = append(typeIDs, code)
			}
		}

		return arrow.UnionOf(mode, children, typeIDs), nil

	case flatbuf.TypeTime:
		var dt flatbuf.Time
		dt.Init(data.Bytes, data.Pos)
		return timeFromFB(dt)

	case flatbuf.TypeTimestamp:
		var dt flatbuf.Timestamp
		dt.Init(data.Bytes, data.Pos)
		return timestampFromFB(dt)

	case flatbuf.TypeDate:
		var dt flatbuf.Date
		dt.Init(data.Bytes, data.Pos)
		return dateFromFB(dt)

	case flatbuf.TypeInterval:
		var dt flatbuf.Interval
		dt.Init(data.Bytes, data.Pos)
		return intervalFromFB(dt)

	case flatbuf.TypeDuration:
		var dt flatbuf.Duration
		dt.Init(data.Bytes, data.Pos)
		return durationFromFB(dt)

	case flatbuf.TypeMap:
		if len(children) != 1 {
			return nil, fmt.Errorf("arrow/ipc: Map must have exactly 1 child field")
		}

		if children[0].Nullable || children[0].Type.ID() != arrow.STRUCT || len(children[0].Type.(*arrow.StructType).Fields()) != 2 {
			return nil, fmt.Errorf("arrow/ipc: Map's key-item pairs must be non-nullable structs")
		}

		pairType := children[0].Type.(*arrow.StructType)
		if pairType.Field(0).Nullable {
			return nil, fmt.Errorf("arrow/ipc: Map's keys must be non-nullable")
		}

		var dt flatbuf.Map
		dt.Init(data.Bytes, data.Pos)
		ret := arrow.MapOf(pairType.Field(0).Type, pairType.Field(1).Type)
		ret.KeysSorted = dt.KeysSorted()
		return ret, nil

	default:
		// FIXME(sbinet): implement all the other types.
		panic(fmt.Errorf("arrow/ipc: type %v not implemented", flatbuf.EnumNamesType[typ]))
	}
}

func intFromFB(data flatbuf.Int) (arrow.DataType, error) {
	bw := data.BitWidth()
	if bw > 64 {
		return nil, fmt.Errorf("arrow/ipc: integers with more than 64 bits not implemented (bits=%d)", bw)
	}
	if bw < 8 {
		return nil, fmt.Errorf("arrow/ipc: integers with less than 8 bits not implemented (bits=%d)", bw)
	}

	switch bw {
	case 8:
		if !data.IsSigned() {
			return arrow.PrimitiveTypes.Uint8, nil
		}
		return arrow.PrimitiveTypes.Int8, nil

	case 16:
		if !data.IsSigned() {
			return arrow.PrimitiveTypes.Uint16, nil
		}
		return arrow.PrimitiveTypes.Int16, nil

	case 32:
		if !data.IsSigned() {
			return arrow.PrimitiveTypes.Uint32, nil
		}
		return arrow.PrimitiveTypes.Int32, nil

	case 64:
		if !data.IsSigned() {
			return arrow.PrimitiveTypes.Uint64, nil
		}
		return arrow.PrimitiveTypes.Int64, nil
	default:
		return nil, fmt.Errorf("arrow/ipc: integers not in cstdint are not implemented")
	}
}

func intToFB(b *flatbuffers.Builder, bw int32, isSigned bool) flatbuffers.UOffsetT {
	flatbuf.IntStart(b)
	flatbuf.IntAddBitWidth(b, bw)
	flatbuf.IntAddIsSigned(b, isSigned)
	return flatbuf.IntEnd(b)
}

func floatFromFB(data flatbuf.FloatingPoint) (arrow.DataType, error) {
	switch p := data.Precision(); p {
	case flatbuf.PrecisionHALF:
		return arrow.FixedWidthTypes.Float16, nil
	case flatbuf.PrecisionSINGLE:
		return arrow.PrimitiveTypes.Float32, nil
	case flatbuf.PrecisionDOUBLE:
		return arrow.PrimitiveTypes.Float64, nil
	default:
		return nil, fmt.Errorf("arrow/ipc: floating point type with %d precision not implemented", p)
	}
}

func floatToFB(b *flatbuffers.Builder, bw int32) flatbuffers.UOffsetT {
	switch bw {
	case 16:
		flatbuf.FloatingPointStart(b)
		flatbuf.FloatingPointAddPrecision(b, flatbuf.PrecisionHALF)
		return flatbuf.FloatingPointEnd(b)
	case 32:
		flatbuf.FloatingPointStart(b)
		flatbuf.FloatingPointAddPrecision(b, flatbuf.PrecisionSINGLE)
		return flatbuf.FloatingPointEnd(b)
	case 64:
		flatbuf.FloatingPointStart(b)
		flatbuf.FloatingPointAddPrecision(b, flatbuf.PrecisionDOUBLE)
		return flatbuf.FloatingPointEnd(b)
	default:
		panic(fmt.Errorf("arrow/ipc: invalid floating point precision %d-bits", bw))
	}
}

func decimalFromFB(data flatbuf.Decimal) (arrow.DataType, error) {
	switch data.BitWidth() {
	case 128:
		return &arrow.Decimal128Type{Precision: data.Precision(), Scale: data.Scale()}, nil
	case 256:
		return &arrow.Decimal256Type{Precision: data.Precision(), Scale: data.Scale()}, nil
	default:
		return nil, fmt.Errorf("arrow/ipc: invalid decimal bitwidth: %d", data.BitWidth())
	}
}

func timeFromFB(data flatbuf.Time) (arrow.DataType, error) {
	bw := data.BitWidth()
	unit := unitFromFB(data.Unit())

	switch bw {
	case 32:
		switch unit {
		case arrow.Millisecond:
			return arrow.FixedWidthTypes.Time32ms, nil
		case arrow.Second:
			return arrow.FixedWidthTypes.Time32s, nil
		default:
			return nil, fmt.Errorf("arrow/ipc: Time32 type with %v unit not implemented", unit)
		}
	case 64:
		switch unit {
		case arrow.Nanosecond:
			return arrow.FixedWidthTypes.Time64ns, nil
		case arrow.Microsecond:
			return arrow.FixedWidthTypes.Time64us, nil
		default:
			return nil, fmt.Errorf("arrow/ipc: Time64 type with %v unit not implemented", unit)
		}
	default:
		return nil, fmt.Errorf("arrow/ipc: Time type with %d bitwidth not implemented", bw)
	}
}

func timestampFromFB(data flatbuf.Timestamp) (arrow.DataType, error) {
	unit := unitFromFB(data.Unit())
	tz := string(data.Timezone())
	return &arrow.TimestampType{Unit: unit, TimeZone: tz}, nil
}

func dateFromFB(data flatbuf.Date) (arrow.DataType, error) {
	switch data.Unit() {
	case flatbuf.DateUnitDAY:
		return arrow.FixedWidthTypes.Date32, nil
	case flatbuf.DateUnitMILLISECOND:
		return arrow.FixedWidthTypes.Date64, nil
	}
	return nil, fmt.Errorf("arrow/ipc: Date type with %d unit not implemented", data.Unit())
}

func intervalFromFB(data flatbuf.Interval) (arrow.DataType, error) {
	switch data.Unit() {
	case flatbuf.IntervalUnitYEAR_MONTH:
		return arrow.FixedWidthTypes.MonthInterval, nil
	case flatbuf.IntervalUnitDAY_TIME:
		return arrow.FixedWidthTypes.DayTimeInterval, nil
	case flatbuf.IntervalUnitMONTH_DAY_NANO:
		return arrow.FixedWidthTypes.MonthDayNanoInterval, nil
	}
	return nil, fmt.Errorf("arrow/ipc: Interval type with %d unit not implemented", data.Unit())
}

func durationFromFB(data flatbuf.Duration) (arrow.DataType, error) {
	switch data.Unit() {
	case flatbuf.TimeUnitSECOND:
		return arrow.FixedWidthTypes.Duration_s, nil
	case flatbuf.TimeUnitMILLISECOND:
		return arrow.FixedWidthTypes.Duration_ms, nil
	case flatbuf.TimeUnitMICROSECOND:
		return arrow.FixedWidthTypes.Duration_us, nil
	case flatbuf.TimeUnitNANOSECOND:
		return arrow.FixedWidthTypes.Duration_ns, nil
	}
	return nil, fmt.Errorf("arrow/ipc: Duration type with %d unit not implemented", data.Unit())
}

type customMetadataer interface {
	CustomMetadataLength() int
	CustomMetadata(*flatbuf.KeyValue, int) bool
}

func metadataFromFB(md customMetadataer) (arrow.Metadata, error) {
	var (
		keys = make([]string, md.CustomMetadataLength())
		vals = make([]string, md.CustomMetadataLength())
	)

	for i := range keys {
		var kv flatbuf.KeyValue
		if !md.CustomMetadata(&kv, i) {
			return arrow.Metadata{}, fmt.Errorf("arrow/ipc: could not read key-value %d from flatbuffer", i)
		}
		keys[i] = string(kv.Key())
		vals[i] = string(kv.Value())
	}

	return arrow.NewMetadata(keys, vals), nil
}

func metadataToFB(b *flatbuffers.Builder, meta arrow.Metadata, start startVecFunc) flatbuffers.UOffsetT {
	if meta.Len() == 0 {
		return 0
	}

	n := meta.Len()
	kvs := make([]flatbuffers.UOffsetT, n)
	for i := range kvs {
		k := b.CreateString(meta.Keys()[i])
		v := b.CreateString(meta.Values()[i])
		flatbuf.KeyValueStart(b)
		flatbuf.KeyValueAddKey(b, k)
		flatbuf.KeyValueAddValue(b, v)
		kvs[i] = flatbuf.KeyValueEnd(b)
	}

	start(b, n)
	for i := n - 1; i >= 0; i-- {
		b.PrependUOffsetT(kvs[i])
	}
	return b.EndVector(n)
}

func schemaFromFB(schema *flatbuf.Schema, memo *dictutils.Memo) (*arrow.Schema, error) {
	var (
		err    error
		fields = make([]arrow.Field, schema.FieldsLength())
		pos    = dictutils.NewFieldPos()
	)

	for i := range fields {
		var field flatbuf.Field
		if !schema.Fields(&field, i) {
			return nil, fmt.Errorf("arrow/ipc: could not read field %d from schema", i)
		}

		fields[i], err = fieldFromFB(&field, pos.Child(int32(i)), memo)
		if err != nil {
			return nil, fmt.Errorf("arrow/ipc: could not convert field %d from flatbuf: %w", i, err)
		}
	}

	md, err := metadataFromFB(schema)
	if err != nil {
		return nil, fmt.Errorf("arrow/ipc: could not convert schema metadata from flatbuf: %w", err)
	}

	return arrow.NewSchemaWithEndian(fields, &md, endian.Endianness(schema.Endianness())), nil
}

func schemaToFB(b *flatbuffers.Builder, schema *arrow.Schema, memo *dictutils.Mapper) flatbuffers.UOffsetT {
	fields := make([]flatbuffers.UOffsetT, len(schema.Fields()))
	pos := dictutils.NewFieldPos()
	for i, field := range schema.Fields() {
		fields[i] = fieldToFB(b, pos.Child(int32(i)), field, memo)
	}

	flatbuf.SchemaStartFieldsVector(b, len(fields))
	for i := len(fields) - 1; i >= 0; i-- {
		b.PrependUOffsetT(fields[i])
	}
	fieldsFB := b.EndVector(len(fields))

	metaFB := metadataToFB(b, schema.Metadata(), flatbuf.SchemaStartCustomMetadataVector)

	flatbuf.SchemaStart(b)
	flatbuf.SchemaAddEndianness(b, flatbuf.Endianness(schema.Endianness()))
	flatbuf.SchemaAddFields(b, fieldsFB)
	flatbuf.SchemaAddCustomMetadata(b, metaFB)
	offset := flatbuf.SchemaEnd(b)

	return offset
}

// payloadFromSchema returns a slice of payloads corresponding to the given schema.
// Callers of payloadFromSchema will need to call Release after use.
func payloadFromSchema(schema *arrow.Schema, mem memory.Allocator, memo *dictutils.Mapper) payloads {
	ps := make(payloads, 1)
	ps[0].msg = MessageSchema
	ps[0].meta = writeSchemaMessage(schema, mem, memo)

	return ps
}

func writeFBBuilder(b *flatbuffers.Builder, mem memory.Allocator) *memory.Buffer {
	raw := b.FinishedBytes()
	buf := memory.NewResizableBuffer(mem)
	buf.Resize(len(raw))
	copy(buf.Bytes(), raw)
	return buf
}

func writeMessageFB(b *flatbuffers.Builder, mem memory.Allocator, hdrType flatbuf.MessageHeader, hdr flatbuffers.UOffsetT, bodyLen int64) *memory.Buffer {

	flatbuf.MessageStart(b)
	flatbuf.MessageAddVersion(b, flatbuf.MetadataVersion(currentMetadataVersion))
	flatbuf.MessageAddHeaderType(b, hdrType)
	flatbuf.MessageAddHeader(b, hdr)
	flatbuf.MessageAddBodyLength(b, bodyLen)
	msg := flatbuf.MessageEnd(b)
	b.Finish(msg)

	return writeFBBuilder(b, mem)
}

func writeSchemaMessage(schema *arrow.Schema, mem memory.Allocator, dict *dictutils.Mapper) *memory.Buffer {
	b := flatbuffers.NewBuilder(1024)
	schemaFB := schemaToFB(b, schema, dict)
	return writeMessageFB(b, mem, flatbuf.MessageHeaderSchema, schemaFB, 0)
}

func writeFileFooter(schema *arrow.Schema, dicts, recs []fileBlock, w io.Writer) error {
	var (
		b    = flatbuffers.NewBuilder(1024)
		memo dictutils.Mapper
	)
	memo.ImportSchema(schema)

	schemaFB := schemaToFB(b, schema, &memo)
	dictsFB := fileBlocksToFB(b, dicts, flatbuf.FooterStartDictionariesVector)
	recsFB := fileBlocksToFB(b, recs, flatbuf.FooterStartRecordBatchesVector)

	flatbuf.FooterStart(b)
	flatbuf.FooterAddVersion(b, flatbuf.MetadataVersion(currentMetadataVersion))
	flatbuf.FooterAddSchema(b, schemaFB)
	flatbuf.FooterAddDictionaries(b, dictsFB)
	flatbuf.FooterAddRecordBatches(b, recsFB)
	footer := flatbuf.FooterEnd(b)

	b.Finish(footer)

	_, err := w.Write(b.FinishedBytes())
	return err
}

func writeRecordMessage(mem memory.Allocator, size, bodyLength int64, fields []fieldMetadata, meta []bufferMetadata, codec flatbuf.CompressionType) *memory.Buffer {
	b := flatbuffers.NewBuilder(0)
	recFB := recordToFB(b, size, bodyLength, fields, meta, codec)
	return writeMessageFB(b, mem, flatbuf.MessageHeaderRecordBatch, recFB, bodyLength)
}

func writeDictionaryMessage(mem memory.Allocator, id int64, isDelta bool, size, bodyLength int64, fields []fieldMetadata, meta []bufferMetadata, codec flatbuf.CompressionType) *memory.Buffer {
	b := flatbuffers.NewBuilder(0)
	recFB := recordToFB(b, size, bodyLength, fields, meta, codec)

	flatbuf.DictionaryBatchStart(b)
	flatbuf.DictionaryBatchAddId(b, id)
	flatbuf.DictionaryBatchAddData(b, recFB)
	flatbuf.DictionaryBatchAddIsDelta(b, isDelta)
	dictFB := flatbuf.DictionaryBatchEnd(b)
	return writeMessageFB(b, mem, flatbuf.MessageHeaderDictionaryBatch, dictFB, bodyLength)
}

func recordToFB(b *flatbuffers.Builder, size, bodyLength int64, fields []fieldMetadata, meta []bufferMetadata, codec flatbuf.CompressionType) flatbuffers.UOffsetT {
	fieldsFB := writeFieldNodes(b, fields, flatbuf.RecordBatchStartNodesVector)
	metaFB := writeBuffers(b, meta, flatbuf.RecordBatchStartBuffersVector)
	var bodyCompressFB flatbuffers.UOffsetT
	if codec != -1 {
		bodyCompressFB = writeBodyCompression(b, codec)
	}

	flatbuf.RecordBatchStart(b)
	flatbuf.RecordBatchAddLength(b, size)
	flatbuf.RecordBatchAddNodes(b, fieldsFB)
	flatbuf.RecordBatchAddBuffers(b, metaFB)
	if codec != -1 {
		flatbuf.RecordBatchAddCompression(b, bodyCompressFB)
	}

	return flatbuf.RecordBatchEnd(b)
}

func writeFieldNodes(b *flatbuffers.Builder, fields []fieldMetadata, start startVecFunc) flatbuffers.UOffsetT {

	start(b, len(fields))
	for i := len(fields) - 1; i >= 0; i-- {
		field := fields[i]
		if field.Offset != 0 {
			panic(fmt.Errorf("arrow/ipc: field metadata for IPC must have offset 0"))
		}
		flatbuf.CreateFieldNode(b, field.Len, field.Nulls)
	}

	return b.EndVector(len(fields))
}

func writeBuffers(b *flatbuffers.Builder, buffers []bufferMetadata, start startVecFunc) flatbuffers.UOffsetT {
	start(b, len(buffers))
	for i := len(buffers) - 1; i >= 0; i-- {
		buffer := buffers[i]
		flatbuf.CreateBuffer(b, buffer.Offset, buffer.Len)
	}
	return b.EndVector(len(buffers))
}

func writeBodyCompression(b *flatbuffers.Builder, codec flatbuf.CompressionType) flatbuffers.UOffsetT {
	flatbuf.BodyCompressionStart(b)
	flatbuf.BodyCompressionAddCodec(b, codec)
	flatbuf.BodyCompressionAddMethod(b, flatbuf.BodyCompressionMethodBUFFER)
	return flatbuf.BodyCompressionEnd(b)
}

func writeMessage(msg *memory.Buffer, alignment int32, w io.Writer) (int, error) {
	var (
		n   int
		err error
	)

	// ARROW-3212: we do not make any assumption on whether the output stream is aligned or not.
	paddedMsgLen := int32(msg.Len()) + 8
	remainder := paddedMsgLen % alignment
	if remainder != 0 {
		paddedMsgLen += alignment - remainder
	}

	tmp := make([]byte, 4)

	// write continuation indicator, to address 8-byte alignment requirement from FlatBuffers.
	binary.LittleEndian.PutUint32(tmp, kIPCContToken)
	_, err = w.Write(tmp)
	if err != nil {
		return 0, fmt.Errorf("arrow/ipc: could not write continuation bit indicator: %w", err)
	}

	// the returned message size includes the length prefix, the flatbuffer, + padding
	n = int(paddedMsgLen)

	// write the flatbuffer size prefix, including padding
	sizeFB := paddedMsgLen - 8
	binary.LittleEndian.PutUint32(tmp, uint32(sizeFB))
	_, err = w.Write(tmp)
	if err != nil {
		return n, fmt.Errorf("arrow/ipc: could not write message flatbuffer size prefix: %w", err)
	}

	// write the flatbuffer
	_, err = w.Write(msg.Bytes())
	if err != nil {
		return n, fmt.Errorf("arrow/ipc: could not write message flatbuffer: %w", err)
	}

	// write any padding
	padding := paddedMsgLen - int32(msg.Len()) - 8
	if padding > 0 {
		_, err = w.Write(paddingBytes[:padding])
		if err != nil {
			return n, fmt.Errorf("arrow/ipc: could not write message padding bytes: %w", err)
		}
	}

	return n, err
}

redpajama_set_name: RedPajamaGithub


text:
require 'test_helper'

class SchemasHelperTest < ActionView::TestCase
end


text:
Kenya – Floods Leave Dozens Dead and 211,000 Displaced
25 April, 2018 by FloodList News	in Africa, News
More than 211,000 people have been displaced by flooding in Kenya according to a report by the UN Office for the Coordination of Humanitarian Affairs (OCHA).
According to the OCHA report, 72 people have reportedly died and 33 injured in flooding since March 2018.
The current wave of flooding began around mid-April. In mid-March the country experienced flooding which left least 15 people dead and hundreds displaced. At the beginning of March at least 7 people died during a period of heavy rain.
According to the Kenya Red Cross Society (KRCS), the worst affected counties are Turkana, Tana River, Garissa, Isiolo, Kisumu, Taita, Mandera, Wajir, Marsabit, West Pokot, Samburu and Narok. About 50,000 people have had to leave their homes in Tana River County.
Flooding has damaged or destroyed homes and infrastructure. Livelihoods have been severely disrupted, in particular farming communities. Wide areas of farmland are underwater and thousands of livestock have been killed.
Dadaab refugee camps, which host over 225,000 refugees, have also been affected and there are concerns over cholera and other water-borne diseases.
OCHA said that about 50,000 people are reportedly stranded in several villages in Moyale, near the border with Ethiopia, after a road linking them to the border town was cut off by floods. They have reportedly not been able to access food and water supplies for 10 days.
Levels of the Masinga and Kamburu dams are now of major concern. Both are reaching dangerously high levels and if rains continue authorities may be forced to release water from the dams, which could have severe consequences for villages downstream in Tana River and Garissa.
The Kenya Red Cross Society, supported by the International Red Cross, Red Crescent Movement, UN agencies and NGOs partners, is assisting the national authorities to provide assistance and support to those most severely impacted by the floods. So far, more than 10,000 households have been assisted with shelter materials, and buckets, soap, blankets and some food items have been distributed to households in Turkana and Nandi counties.
Flood rescues in Tana River County, Kenya. Photo: Kenya Red Cross
Breaking NewsKenya
USA – Study Predicts 'Climate Whiplash' in California With Dramatic Shifts in Weather Extremes
Canada – Evacuations in Alberta After Snowmelt Flooding
Flood News in Africa by Country
Flood News in Africa by Country Select countryAlgeriaAngolaBeninBurkina FasoBurundiCameroonCongo-BrazzavilleCongo Democratic RepublicCote d'IvoireEthiopiaGhanaGuineaKenyaLibyaMadagascarMalawiMaliMauritaniaMauritiusMozambiqueNamibiaNigerNigeriaSeychellesSomaliaSierra LeoneSouth AfricaSouth SudanSudanSwazilandTanzaniaTogoTunisiaUgandaZambiaZimbabwe