Landing Page
Special Projects
This story is part of a series of specially designed stories that represents some of the best journalism The Post has to offer. Check out the rest of the special projects here.
8/23/2018
Over the summer, the Ohio University Board of Trustees welcomed a new member and approved resolutions related to the budget. Here is what you need to know to get caught up to speed for the academic year.
At the Board of Trustees meeting in June, board members approved a resolution that gave both the president and first lady pay increases, effective July 1.
President Duane Nellis received a 1.5 percent pay raise of $7,125 and a bonus of $71,250, which is 15 percent of his annual salary, while First Lady Ruthie Nellis received a pay increase of $525.
The president’s annual salary is $475,000, which is consistent with the university-wide raise pool for the year.
“The terms of Dr. Nellis’ contract, including the housing allowance, reflect national trends in higher education executive compensation,” Board of Trustees Chair Dave Scholl said in an email.
The Board’s resolution defined Nellis’ accomplishments, including his work on renewing a focus on financial sustainability, strategic pathways and plotting a new direction to make OU a leading institution in higher education.
During the June meeting in Chillicothe, the board approved the university budget for fiscal year 2019.
Total revenues are up $15.3 million from fiscal year 2018 at $811 million, while $770 million in expense allocations will in part go toward university employee compensation and interest on the university’s loans and debt.
The university and the OU Foundation have $610 million in outstanding debt as of June 30, according to the Board’s budget memo; however, for the next four fiscal years, OU will pay off 11 percent of the principal debt portfolio, which is $64 million.
The 2019 budget will use $17 million in reserves, which will cover capital improvements, a new regional campus strategy and funding of strategic priorities and programs.
“We want to figure out how we can create a sustainable and more enhanced model for regional higher education as part of the system of Ohio University,” Nellis said at the June meeting.
Blake Nissen | PHOTO EDITOR
Ohio University President, Duane Nellis, opens up the Board of Trustee's meeting on January 19, 2017.
Updates to the Capital Improvement Plan were approved by the board in June. The total budget for those projects between fiscal years 2019 and 2024 is $78.9 million.
The board approved several capital project budget updates, including the construction of several “prioritized” campus roads. OU and the City of Athens are partnering to repave sections of West Green Drive, South Green Drive, Race Street, Rufus Street and East Union Street at Jeff Hill by the end of September.
That project will cost $584,000.
The preliminary stage of the repairs are scheduled to be completed on Aug. 17, according to a university press release from the Office of Facilities Management and Safety.
“We don’t want to interfere with any of the move-in activities or anything like that,” Associate Vice President for Architecture, Design and Construction Greg Robertson said.
The repairs in August are intended to prepare the roadways for asphalt mill and overlay paving, which are scheduled to take place in September.
Eileen M. Sheil was appointed as the newest member of the OU Board of Trustees by Gov. John Kasich in May.
Sheil works as the executive director of corporate communications at Cleveland Clinic, according to a previous Post report.
With a Bachelor of Science degree in journalism from OU and 22 years of experience in communications, Sheil aims to give back to the university through the volunteer position.
“I want to (help) the university be the best it can be and attract the best and brightest students,” she said.
Sheil's daughter, Lauren, is a sophomore studying strategic communication at OU and a Post columnist.
Landing Page
This story is part of a series of specially designed stories that represents some of the best journalism The Post has to offer. Check out the rest of the special projects here.


Thu Nov 21, 2013
I am a professional writer. And like most professional writers, my income comes from writing non-fiction. For me, it’s mostly technical documents and magazine articles. For others it may be reports, press releases, proposals, business plans and so on - the usual corporate stuff that makes for a gratifying career but doesn’t really scratch the creative itch. Very few writers make money writing fiction. I once heard that only a couple of hundred authors in the world actually live off their royalties. When we read stories in the press about J.K. Rowling being richer than the Queen of England, I think people assume this number would be higher.
Successful authors are maddening flukes - more often a book eclipses its author. The Catcher in the Rye is such a book. Its success turned J.D. Salinger into a recluse. But that book, published in 1951, went from mass censorship to a staple in the high-school curriculum and still sells 250000 copies a year. Regardless of whether it’s objectively even a good book, nobody can deny that The Catcher in the Rye is a cultural phenomenon, like the Bible.
Even if you publish with an indie publisher with a generous 50⁄50 split, being on the bestseller list won’t make you rich. Patrick Wensink spent a week on Amazon’s bestseller list and only made $12,000 after selling 4000 copies. If you sign with a mainstream publisher you will get far far less.
I recently finished Hugh Howey’s excellent Wool Omnibus. Howey is a poster boy for the burgeoning self-publishing movement where the author keeps all the rights. He claims that most of his months are six-figure months. I believe it - his work is solid and I was happy to cut out the middleman and give the guy $4. And for a book that is far superior to the utter drivel that publishers sometimes push on us with their marketing muscle. In a blog post (and it’s worth reading the whole thing), he admits that writing to become rich is a bad idea. So no newsflash there. He goes on to extol the virtues of habit and so on, which I’ve heard before from other writers.
But the nugget in Howey’s post for me was this:
When I finished my first novel, I was on a complete high.  You’re gonna be rich!
This feeling lasted a few days. That’s when I started writing my next work. My father at the time wondered why I wasn’t spending all of my time promoting that first book. I told him I had my entire life to promote my works. I only had now to write…
My father now agrees with this approach and sees the value of having a dozen titles available. This is going to sound strange, but you are MUCH better off with your 10th work exploding than your 1st work. You’ll never have quiet time to crank out quality material ever again. And when your backlist matches the growth of your first breakout, you’ll do very well for yourself. Be patient. It’s been said by many others, but I’ll repeat it here: self-publishing is a marathon.
What Howey doesn’t admit here is that his first book was probably not very good. But he kept at it and wrote ten more. I’ve always thought that just managing to write one book would be the crowning achievement for a creative writer. But writing one book doesn’t mean you’ve crossed the finishing line. In fact, your magnum opus may be ten books away, or it may be a fever dream, inspiring you to keep going. Too many authors give up after writing one book and failing to find an audience for it. But what if the only audience that matters for that first book is you? And you can still publish that book. Even if you never sell a single copy, you will be a published author!
So, I’m not giving up my day job and nor should you. But the good news is that all of us have at least one shitty book in them. So excuse me, I’m off to work on mine.


Dangerous remnants of warfare | Honolulu Star-Advertiser
Even now, some seven decades after World War II, we are reminded how much of a battle zone Hawaii has been — during the war, and after. And some of the evidence is underwater. Read more
Mahalo for reading the Honolulu Star-Advertiser!
You're reading a premium story. Read the full story with our Print & Digital Subscription.
Already a subscriber? Log in now to continue reading this story.
Print subscriber but without online access? Activate your Digital Account now.


Usage Use the affix plugin via data attributes or manually with your own JavaScript. In both situations, you must provide CSS for the positioning and width of your affixed content. Positioning via CSS The affix plugin toggles between three classes, each representing a particular state: .affix, .affix-top, and .affix-bottom. You must provide the styles for these classes yourself (independent of this plugin) to handle the actual positions. Here's how the affix plugin works: To start, the plugin adds .affix-top to indicate the element is in its top-most position. At this point no CSS positioning is required. Scrolling past the element you want affixed should trigger the actual affixing. This is where .affix replaces .affix-top and sets position: fixed; (provided by Bootstrap's CSS). If a bottom offset is defined, scrolling past it should replace .affix with .affix-bottom. Since offsets are optional, setting one requires you to set the appropriate CSS. In this case, add position: absolute; when necessary. The plugin uses the data attribute or JavaScript option to determine where to position the element from there. Follow the above steps to set your CSS for either of the usage options below. Via data attributes To easily add affix behavior to any element, just add data-spy="affix" to the element you want to spy on. Use offsets to define when to toggle the pinning of an element. Copy Via JavaScript Call the affix plugin via JavaScript: Copy $('#myAffix').affix({ offset: { top: 100, bottom: function () { return (this.bottom = $('.footer').outerHeight(true)) } } }) Options Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-offset-top="200". Name type default description offset number | function | object 10 Pixels to offset from screen when calculating position of scroll. If a single number is provided, the offset will be applied in both top and bottom directions. To provide a unique, bottom and top offset just provide an object offset: { top: 10 } or offset: { top: 10, bottom: 5 }. Use a function when you need to dynamically calculate an offset. target selector | node | jQuery element the window object Specifies the target element of the affix. Events Bootstrap's affix plugin exposes a few events for hooking into affix functionality. Event Type Description affix.bs.affix This event fires immediately before the element has been affixed. affixed.bs.affix This event is fired after the element has been affixed. affix-top.bs.affix This event fires immediately before the element has been affixed-top. affixed-top.bs.affix This event is fired after the element has been affixed-top. affix-bottom.bs.affix This event fires immediately before the element has been affixed-bottom. affixed-bottom.bs.affix This event is fired after the element has been affixed-bottom.
Usage Use the affix plugin via data attributes or manually with your own JavaScript. In both situations, you must provide CSS for the positioning and width of your affixed content. Positioning via CSS The affix plugin toggles between three classes, each representing a particular state: .affix, .affix-top, and .affix-bottom. You must provide the styles for these classes yourself (independent of this plugin) to handle the actual positions. Here's how the affix plugin works: To start, the plugin adds .affix-top to indicate the element is in its top-most position. At this point no CSS positioning is required. Scrolling past the element you want affixed should trigger the actual affixing. This is where .affix replaces .affix-top and sets position: fixed; (provided by Bootstrap's CSS). If a bottom offset is defined, scrolling past it should replace .affix with .affix-bottom. Since offsets are optional, setting one requires you to set the appropriate CSS. In this case, add position: absolute; when necessary. The plugin uses the data attribute or JavaScript option to determine where to position the element from there. Follow the above steps to set your CSS for either of the usage options below. Via data attributes To easily add affix behavior to any element, just add data-spy="affix" to the element you want to spy on. Use offsets to define when to toggle the pinning of an element. Copy Via JavaScript Call the affix plugin via JavaScript: Copy $('#myAffix').affix({ offset: { top: 100, bottom: function () { return (this.bottom = $('.footer').outerHeight(true)) } } }) Options Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-offset-top="200". Name type default description offset number | function | object 10 Pixels to offset from screen when calculating position of scroll. If a single number is provided, the offset will be applied in both top and bottom directions. To provide a unique, bottom and top offset just provide an object offset: { top: 10 } or offset: { top: 10, bottom: 5 }. Use a function when you need to dynamically calculate an offset. target selector | node | jQuery element the window object Specifies the target element of the affix. Events Bootstrap's affix plugin exposes a few events for hooking into affix functionality. Event Type Description affix.bs.affix This event fires immediately before the element has been affixed. affixed.bs.affix This event is fired after the element has been affixed. affix-top.bs.affix This event fires immediately before the element has been affixed-top. affixed-top.bs.affix This event is fired after the element has been affixed-top. affix-bottom.bs.affix This event fires immediately before the element has been affixed-bottom. affixed-bottom.bs.affix This event is fired after the element has been affixed-bottom.


Flailing Boris Johnson struggles to explain his 'made up' crime and HS2 figures
Boris Johnson was challenged live on LBC over "made up" figures from Home Secretary Priti Patel about an alleged violent crimewave that would follow a Labour victory in this week's general election
by Joshua Taylor, https://www.facebook.com/dailymirror/Boris Johnson struggled to explain the Conservative Party's "made up" crime and HS2 figures during a flailing interview.
The Prime Minister was grilled over Home Secretary Priti Patel's claims that a Labour win in this week's general election would spark a violent crimewave.
She said there would be 4,000 more violent assaults, 150 extra sex assaults and 52 more murders each year under Labour - because of the party's opposition to police stop-and-search powers.
LBC radio presenter Nick Ferrari asked Mr Johnson to explain the source of the figures.
He said during the live interview: "How does she come by these figures?
"You're a journalist, I'm a journalist, where'd she get those figures?"
In a rambling reply, the Tory leader said: "The answer, very simply, is that to tackle crime you need not just (to support) the police by putting the police out on the street, which is what we're doing."
When pinned down on the figures once again, Mr Johnson said: "Forgive me Nick, I haven't been able to..." before Mr Ferrari shot back: "She's made them up, Prime Minister, hasn't she?"
Ms Patel's original Daily Telegraph article claimed the figures were from the Conservative research department.
During the LBC interview, Mr Ferrari also suggested the Prime Minister had "made up" figures about the total cost of HS2.
Mr Johnson says HS2 will probably cost "north of £100 billion" even though the current estimate is £88 billion.
Questioned on why he was using the £100 billion figure, he said: "It's a figure I've used many times in the past."


Ukrainian artist strikes a chord with matchsticks
A holder of three national records, artist Bogdan Senchukov is hoping for a spot in the Guinness Book of World Records.
Ukrainian Bogdan Senchukov wants to carve his way into the Guinness Records: by making the world's biggest collection of musical instruments from matchsticks.
Already, 15 of his real-sized instruments, including two guitars, accordions, violin, and drums, are played by a band of musicians which prides itself as the only "match music band" in Ukraine.
More:
-
Caught in Ukraine's violence, war and identity crisis
-
Preserving the memory of Ukraine's uprising
-
The Truth in Numbers: Redefining Data Journalism Through Art
Senchukov's hobby started at school and he has since then handcrafted items recreated in minute detail, including a tank from The World of Tanks computer game and a miniature Eiffel Tower, but his real passion is musical instruments.
"[What I love] is to carve, to glue, to make it hold the shape, to take into account microns of a millimetre and to make it play in the end," Senchukov, 29, told Reuters as he worked on his second violin."When the instrument plays ... I cannot find words to express my feelings when something made of these tiny sticks plays as an ordinary musical instrument does."
While most modern musical instruments are made of beech or acacia wood, Senchukov's instruments are made of what experts say is the least "musical" wood, aspen, commonly used to make matches.
It took Senchukov six months and 27,000 matchsticks to create a bass musical instrument in the shape of a trident, the Ukrainian coat of arms, which he now plays in the band.
He said the most challenging part of his work was when some elements require more than 10 hours of continuous work. For example, a violin or guitar string plate has to be produced in one sitting, otherwise, it will lose its shape.
Another time-consuming process was cleaning the match heads, but Senchukov's art and efforts did not go unnoticed, and one Ukrainian factory now provides him with matchwood.
A holder of three national records, Senchukov is collecting documents to prove to the Guinness World Records that he has the biggest collection of musical instruments made of matchsticks.


There are no results matching your search:{{$ctrl.getSearchTerm()}}
{{$ctrl.getSearchTerm()}}
Try again searching items held at other libraries?
Check the spelling of your search terms
Click Expand My Results
Try different keywords
Try more general keywords
Try fewer keywords
Try your search in one of our Databases


Nairobi
Nairobi (/naɪˈroʊbi/) is the capital and the largest city of Kenya. The name comes from the Maasai phrase Enkare Nairobi, which translates to "cool water", a reference to the Nairobi River which flows through the city. The city proper had a population of 4,397,073 in the 2019 census, while the metropolitan area has a population of 9,354,580. The city is popularly referred to as the Green City in the Sun.[4]
Nairobi was founded in 1899 by the colonial authorities in British East Africa, as a rail depot on the Uganda Railway.[5] The town quickly grew to replace Mombasa as the capital of Kenya in 1907.[6] After independence in 1963, Nairobi became the capital of the Republic of Kenya.[7] During Kenya's colonial period, the city became a centre for the colony's coffee, tea and sisal industry.[8][9] The city lies on the River Athi in the southern part of the country, and has an elevation of 1,795 metres (5,889 ft) above sea level.[10]
According to the 2019 census, in the administrative area of Nairobi, 4,397,073 inhabitants lived within 696 km2 (269 sq mi).[11]
Home to thousands of Kenyan businesses and over 100 major international companies and organizations, including the United Nations Environment Programme (UN Environment) and the United Nations Office at Nairobi (UNON), Nairobi is an established hub for business and culture. The Nairobi Securities Exchange (NSE) is one of the largest in Africa and the second-oldest exchange on the continent. It is Africa's fourth-largest exchange in terms of trading volume, capable of making 10 million trades a day.[12]


wiki / wayland / install-wayland Edit this page
Edited (3f3d3e2) at 2021-04-03 by Dilyn Corner
Wayland
________________________________________________________________________________
Wayland [0] is a display protocol that aims to be a simpler and modern
replacement for the X Window System. [1] The Wayland protocol follows a
client–server model in which clients are the graphical applications requesting
the display of pixel buffers on the screen, and the server (compositor) is the
service provider controlling the display of these buffers. [2]
Unlike Xorg, which is at the center of the universe (and everyone must talk to),
Wayland puts the Linux kernel and its components (DRI, DRM, etc) in the middle.
This effectively leaves the Wayland compositor off in the corner as its little
more than a special application. [3]
Wayland has been in development since September of 2008 [4] and is usable today
for a large number of use-cases. Some hardware configurations (namely NVIDIA
GPUs) [5] [6] and a number of features are not currently supported by
compositors.
Caveats
________________________________________________________________________________
While the Wayland protocol is more or less done, the growing list of compositors
are in differing stages of completeness. Xorg is still in wide use and a lot of
software still requires it.
The major downside to Wayland (compositors) is the reduction in choice. While
the Wayland protocol does not define what a compositor shall depend on, they
typically lock the user into udev, libinput and systemd/logind.
The lack of standardized, desktop-oriented protocols has created a situation
where software may only work in some compositors and not others. This should
improve over time as more protocols become standardized.
- Limited hardware and driver support. [5] [6] [7] [8]
- Non-standard and compositor specific software. [10] [11] [12]
- No Wayland support in SDL 1 (must use XWayland). [13]
- Starting compositors without logind requires SUID permissions. [14]
- Locked into using udev. [15]
Benefits
________________________________________________________________________________
Wayland has a large number of benefits and improvements over Xorg. The above
caveats do not apply to everyone (or every system). Those unaffected or willing
to live with the caveats will have no problem swapping over.
- Less moving parts [13], although some software still heavily relies on the
Xorg libraries (Mesa [16], Firefox [17], etc).
- No screen tearing by design [18].
- Hardware accelerated video playback in Firefox [19] and Webkit2GTK [20]
Prerequisites
________________________________________________________________________________
Though KISS does not support Wayland officially there is no problem in making it
capable through personal or 3rd party repositories. The official
repositories satisfy all dependencies. After "wayland" and "wayland-protocols"
are installed, some package adjustments are required to make them to known
citizens of your system.
NOTE: From this point it is expected that "wayland" and "wayland-protocols" are
installed and you have forked the required packages with modified
configure flags at the beginning of KISS_PATH. [21] Managing repositories
* Packages which need to be forked [23]:
firefox --enable-default-toolkit=cairo-gtk3-wayland
gtk+3 --enable-wayland-backend
mesa -Dplatforms=x11,drm,wayland
* Packages which pick up Wayland automatically at compile time [23]:
[needs expansion and verification]
cairo
intel-vaapi-driver
libva
mpv
pango
sdl2
webkit2gtk
Install Wayland on top Xorg KISS
________________________________________________________________________________
Mesa must be rebuilt first, followed by the aforementioned packages [22] in
a dependency given ascending order.

Install Wayland on top base KISS
________________________________________________________________________________
Starting off a fresh base installation there is no manual intervention needed as
everything _should_ be autoconfigured.
[needs reproduction]
Post installation
________________________________________________________________________________
* In environments without systemd/elogind/consolekit the XDG_RUNTIME_DIR
variable must be set manually. [23] Export this in your shellrc.
+------------------------------------------------------------------------------+
| .ashrc, .bashrc, .zshrc, etc |
+------------------------------------------------------------------------------+
| |
| export XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR:-/tmp/$(id -u)-runtime-dir} |
| |
| [ -d "$XDG_RUNTIME_DIR" ] || { |
| mkdir -p "$XDG_RUNTIME_DIR" |
| chmod 0700 "$XDG_RUNTIME_DIR" |
| } |
| |
+------------------------------------------------------------------------------+
* Install a Compositor of your choosing.
References
________________________________________________________________________________
[0] https://wayland.freedesktop.org/
[1] https://wayland.freedesktop.org/faq.html#heading_toc_j_4
[2] https://en.wikipedia.org/wiki/Wayland_(display_server_protocol)
[3] https://lwn.net/Articles/413335/
[4] https://cgit.freedesktop.org/wayland/wayland/commit/?id=97f1ebe8d5c2e166fabf757182c289fed266a45a
[5] https://github.com/swaywm/sway/issues/490
[6] https://drewdevault.com/2017/10/26/Fuck-you-nvidia.html
[7] $/swaywm/sway/wiki#nvidia-users
[8] https://wayland.freedesktop.org/building.html (Hardware / Drivers)
[10] $/Alexays/Waybar
[11] $/any1/wayvnc
[12] $/fzwoch/obs-gnome-screencast
[13] https://hansdegoede.livejournal.com/22212.html
[14] $/swaywm/sway/wiki/Running-Sway-without-systemd
[15] $/swaywm/wlroots#building #udev
[16] $/kiss-community/repo/blob/master/extra/mesa/depends
[17] $/kiss-community/repo-bin/blob/main/bin/firefox/depends
[18] https://people.freedesktop.org/~daniels/lca2013-wayland-x11.pdf
[19] https://bugzilla.mozilla.org/show_bug.cgi?id=1610199
[20] (webkit2gtk VAAPI source needed)
[21] #/kiss/managing-repositories
[22] https://wiki.gentoo.org/wiki/Sway#Other
________________________________________________________________________________
Dylan Araps (C) 2019-2020
kiss-community (C) 2020-2021
Dilyn Corner (C) 2021
Linux(R) is the registered trademark of Linus Torvalds in the U.S. and
other countries.


Boards under scrutiny as new rules turn up the pressure for more diversity
by David MilsteadCanadian companies have steadily, but slowly, added women to their boards and executive ranks over the past decade as they respond to pressure from shareholders. The shift has been due in large part to regulations that forced them to disclose their gender diversity and explain how they intend to improve it.
Next spring, the conversation will be bigger and broader. New federal rules will extend the diversity disclosure rules to race, disabilities and Indigenous heritage, requiring companies to include that information in circulars to shareholders. Canada is believed to be the first country to mandate companies to expand diversity disclosure beyond gender to other groups.
Advocates are hopeful that this is another step on the path to corporate leadership that does a better job of resembling Canada’s population. The Globe and Mail talked to leaders in corporate governance on the issue of diversity as part of its annual Board Games survey, which measures Canadian companies in the S&P/TSX Composite on their board composition and governance processes.
Still, the Canadian government can only force federally incorporated companies, not provincial ones, to adhere to the new regime. And the new law stops short of mandating that companies adopt targets for its board or executives for any group, including women. Instead, Canada uses a model of disclosure called “comply or explain" – if a company does not have a policy to identify and add directors who are part of these groups, it needs to explain why.
“There’s many ways to get this work done – we do believe targets are effective because in all things business, what gets measured gets done," says Tanya van Biesen, the Canadian executive director of Catalyst, a group that promotes the progress of women in the workplace. “Yet comply-or-explain, without a doubt, has helped move this conversation forward.”
governance trends
2019
2014
Pctg. with no women
on their boards
1%
32%
Pctg. with at least one
quarter women on the board
60
19
Pctg. of female directors
on S&P/TSX boards
27
15
Avg. Board Games score
77
70
Pctg. scoring below 50
4.5
11
Pctg. scoring 80 or higher
50
28
Pctg. with a majority
of related* directors
2.2
3
Pctg. that do not split
roles of chair and CEO
14
16
Pctg. with dual-class shares
or unequal voting rights
15
13
Pctg. with ‘say on pay’ votes
75
46
*Related as defined by Board Games criteria,
available online at tgam.ca/boardgames2019
JOHN SOPINSKI/THE GLOBE AND MAIL
governance trends
2019
2014
Pctg. with no women
on their boards
1%
32%
Pctg. with at least one
quarter women on the board
60
19
Pctg. of female directors
on S&P/TSX boards
27
15
Avg. Board Games score
77
70
Pctg. scoring below 50
4.5
11
Pctg. scoring 80 or higher
50
28
Pctg. with a majority
of related* directors
2.2
3
Pctg. that do not split
roles of chair and CEO
14
16
Pctg. with dual-class shares
or unequal voting rights
15
13
Pctg. with ‘say on pay’ votes
75
46
*Related as defined by Board Games criteria,
available online at tgam.ca/boardgames2019
JOHN SOPINSKI/THE GLOBE AND MAIL
governance trends
2019
2014
1
Percentage with no women on their boards
32
60
Pctg. with at least one quarter women on the board
19
27
Percentage of female directors on S&P/TSX boards
15
77
Average Board Games score
70
4.5
Percentage scoring below 50
11
50
Percentage scoring 80 or higher
28
2.2
Percentage with a majority of related* directors
3
14
Percentage that do not split roles of chair and CEO
16
15
Pctg. with dual-class shares or unequal voting rights
13
75
Percentage with ‘say on pay’ votes
46
*Related as defined by Board Games criteria, available online at tgam.ca/boardgames2019
JOHN SOPINSKI/THE GLOBE AND MAIL
The Canada Business Corporations Act (CBCA) changes do several new things: One, they extend the rules to Indigenous persons, persons with disabilities and members of visible minority groups. Two, they make clear which types of executive positions companies must report data for. And three, they will apply to any company with a federal incorporation, even if they list on the smaller TSX Venture Exchange. Some of those companies hadn’t even been subject to a gender-disclosure rules; now, they’ll have to ramp up their disclosure to include the additional groups as well. Law firm Osler Hoskins & Harcourt LLP estimates there are about 250 CBCA companies listed on the venture exchange which will now be subject to the new disclosure obligation.
In many ways, the comply-or-explain method is similar to the approach many, but not all, Canadian companies take. Most provinces, as well as the Toronto Stock Exchange, require publicly traded companies to quantify the women on their board and in executive management and explain their approach to gender diversity in their annual proxy statement to shareholders. If there’s no formal target for the number or proportion of women on the board, the company must explain why.
The gender rules, rolled out in 2015, have coincided with a steady increase in women on boards, even without requiring companies to adopt formal targets for representation. An annual study conducted by the Canadian Securities Administrators showed the total number of board seats occupied by women in a sample of more than 600 companies increased to 17 per cent in 2019, compared to 11 per cent in 2015, and found 73 per cent of companies had at least one woman on their board, an increase from 49 per cent in 2015.
Studies that examine larger companies, which exclude the tiny energy and mining companies that have historically lagged in the number of women on boards, have shown better progress. As of September, none of the roughly 230 companies in the S&P/TSX Composite Index have all-male boards, according to governance consultant Kingsdale Advisors. (Two companies had all-male boards in their circulars this spring, but later added female directors. One, Barrick Gold, had its sole female director die shortly before it prepared its proxy.)
Osler says women now hold 30.2 per cent of board seats in the S&P/TSX 60 Index of the largest companies in Canada, which was a key goal of the 30% Club of Canada, a group that aims to increase the proportion of women in board seats and top executive roles by 2022.
Raymond Chan, a director at Telus Corp. and the former CEO of Baytex Energy Corp., hopes we are at the beginning of a similar arc in the number of visible minorities, but says the conversation about these broader elements of diversity has barely begun.
Mr. Chan personally reviewed the proxy circulars of all the TSX/S&P 60 companies and believes that there are just two dozen visible minorities, or about 4 per cent of all directors. He counted just three directors of Chinese origin when he did his study, including himself, at a time when every major company needs to be considering how to do business with China.
“It seems like there must be a lot of qualified visible minority business people around this country – these are just shocking statistics to me,” he said, saying he is speaking in a personal capacity, not for Telus. “The Canadian corporate boardrooms appear to be still very much a closed shop. It is not consistent with the multicultural and diversified communities most Canadians experienced and treasured in their everyday lives.”
Similarly, there is virtually no representation on corporate boards by people with disabilities.
The Shareholder Association for Research & Education, known as SHARE Canada, has for years helped institutional investors place proposals calling for greater board diversity. Executive Director Kevin Thomas calls the 2015 comply-or-explain gender rules a “milestone” and hopes to see similar progress from the new federal rules.
“It really helped to fan the fire and give us a bit more of an impetus to move this because the data was finally being collected in a consistent way," he said. “One of the things we’ve been able to do is to highlight the companies where they really are laggards on this, compared to their peers in the Canadian market, and file shareholder proposals that have a way of moving that market along.”
For example, Mr. Thomas said, “when we looked a bit closer, we found that the boards that had an explicit recognition of Indigenous heritage as a criterion in their board diversity policies were also the only ones that actually had Indigenous directors on the boards. So we went to a few more companies and asked them to adjust their diversity policies and add that as a criterion. And we found that in some cases those are the ones that then subsequently added Indigenous people to their boards."
Catherine McCall, executive director of the Canadian Coalition for Good Governance, a group representing institutional investors, says her group “doesn’t just think [diversity] stops at gender. And when we meet with directors in our engagement process, they will often point out that gender isn’t the be all and end all of diversity.”
Canadian institutional investors, many of them members of the 30% Club, have also been ratcheting up their gender diversity voting policies. For example, Canada Pension Plan Investment Board increased its requirement in 2019 for Canadian companies to have at least two female directors. British Columbia Investment Management Corp. (BCI) now expects a minimum of either three female directors, or 25 per cent of the board, to be represented by women.
When the pension funds feel the companies have violated their guidelines, they withhold votes for the director who chairs the nominating committee – the board committee responsible for director recruitment and nominations. Sometimes they vote against all the committee members for repeat offenders. BCI voted against 200 directors globally for gender diversity issues in 2019, while CPPIB voted against 626.
The pension plans typically say, however, that they won’t be making changes in their policies in 2020 to match the new broader federal rules. Instead, they’ll be looking at the 2020 disclosures, consulting with governance leaders and seeing what needs to be done if companies fall short. Healthcare of Ontario Pension Plan spokeswoman Judy Mann says, “We look forward to seeing how companies address the increased requirements on diversity disclosure, and will review our policies as we see how companies explain their approaches to diversity beyond gender."
In the meantime, companies must prepare for the new disclosure regime. Rima Ramchandani of law firm Torys LLP says “some of our clients, like the financial institutions who are early adopters of best practices from a corporate governance perspective are ahead of these rules.”
But others new to the rules may struggle, says Jennifer Longhurst of law firm Davies Ward Phillips & Vineberg LLP.
“It could be quite difficult if people aren’t willing to self identify and share that information for privacy reasons,” she says. "... I think many companies are going to find themselves challenged to really provide the information that investors are probably looking for.”
Your time is valuable. Have the Top Business Headlines newsletter conveniently delivered to your inbox in the morning or evening. Sign up today .


Creates an easy way to use expression templates with R semantics on any iterator based structure.
| Version: | 0.1.7 |
| Imports: | Rcpp (≥ 0.12.12) |
| LinkingTo: | Rcpp |
| Suggests: | RUnit, knitr, rmarkdown |
| Published: | 2017-11-18 |
| Author: | Daniel C. Dillon |
| Maintainer: | Daniel C. Dillon <dcdillon at gmail.com> |
| BugReports: | https://github.com/dcdillon/RcppHoney/issues |
| License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] |
| URL: | https://github.com/dcdillon/RcppHoney |
| NeedsCompilation: | yes |
| CRAN checks: | RcppHoney results |
| Reference manual: | RcppHoney.pdf |
| Vignettes: |
RcppHoney - Custom Functions RcppHoney Introduction |
| Package source: | RcppHoney_0.1.7.tar.gz |
| Windows binaries: | r-devel: RcppHoney_0.1.7.zip, r-release: RcppHoney_0.1.7.zip, r-oldrel: RcppHoney_0.1.7.zip |
| OS X binaries: | r-release: RcppHoney_0.1.7.tgz, r-oldrel: RcppHoney_0.1.7.tgz |
| Old sources: | RcppHoney archive |
Please use the canonical form https://CRAN.R-project.org/package=RcppHoney to link to this page.


We are one of the leading bodies of educational growth. Students across the globe use this platform to communicate with the greatest experts on our platform and get their queries cleared. We assure students with a bright career and there is 24x7 instant support.
There is an online resource of almost billions of books. As an unsubscribed customer you can get through the samples and then if you want to get enrolled in any of the course, you may sign up with our page and stay tuned with us.
You can contact us in our mail-id<EMAIL_ADDRESS>Also you can call us up at<PHONE_NUMBER>1222


|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.objectstyle.cayenne.access.DataContext
public class DataContext
Class that provides applications with access to Cayenne persistence features. In most cases this is the only access class directly used in the application.
Most common DataContext use pattern is to create one DataContext per session. "Session" may be a an HttpSession in a web application, or any other similar concept in a multiuser application.
DataObjects are registered with DataContext either implicitly when they are fetched via
a query, or read via a relationship from another object, or explicitly via calling
createAndRegisterNewObject(Class)
during new DataObject creation. DataContext
tracks changes made to its DataObjects in memory, and flushes them to the database when
commitChanges()
is called. Until DataContext is committed, changes made to its
objects are not visible in other DataContexts.
Each DataObject can belong only to a single DataContext. To create a replica of an
object from a different DataContext in a local context, use
localObject(ObjectId, Persistent)
method.
For more information see Cayenne User Guide.
Note that all QueryEngine interface methods are deprecated in the DataContext. Since 1.2 release DataContext implements ObjectContext and DataChannel interfaces.
| Field Summary | |
|---|---|
protected DataChannel |
channel
|
static EventSubject |
DID_COMMIT
|
static EventSubject |
DID_ROLLBACK
|
protected EntityResolver |
entityResolver
|
protected java.lang.String |
lazyInitParentDomainName
Stores the name of parent DataDomain. |
protected org.objectstyle.cayenne.access.DataContextMergeHandler |
mergeHandler
|
protected ObjectStore |
objectStore
|
protected static java.lang.ThreadLocal |
threadDataContext
A holder of a DataContext bound to the current thread. |
protected java.util.Map |
userProperties
Stores user defined properties associated with this DataContext. |
protected boolean |
usingSharedSnaphsotCache
|
protected boolean |
validatingObjectsOnCommit
|
static EventSubject |
WILL_COMMIT
|
| Fields inherited from interface org.objectstyle.cayenne.DataChannel |
|---|
FLUSH_CASCADE_SYNC, FLUSH_NOCASCADE_SYNC, GRAPH_CHANGED_SUBJECT, GRAPH_FLUSHED_SUBJECT, GRAPH_ROLLEDBACK_SUBJECT, ROLLBACK_CASCADE_SYNC |
| Constructor Summary | |
|---|---|
DataContext()
Creates a new DataContext that is not attached to the Cayenne stack. |
|
DataContext(DataChannel channel,
ObjectStore objectStore)
Creates a new DataContext with parent DataChannel and ObjectStore. |
|
DataContext(QueryEngine parent,
ObjectStore objectStore)
Deprecated. since 1.2 - use DataContext(DataChannel, ObjectStore)
constructor instead. Note that DataDomain is both a DataChannel and a
QueryEngine, so you may need to do a cast:
new DataContext((DataChannel) domain, objectStore) . |
| Method Summary | |
|---|---|
static void |
bindThreadDataContext(DataContext context)
Binds a DataContext to the current thread. |
void |
commitChanges()
Synchronizes object graph with the database. |
void |
commitChanges(org.apache.log4j.Level logLevel)
Deprecated. Since 1.2, use commitChanges() instead. |
void |
commitChangesToParent()
"Flushes" the changes to the parent DataChannel . |
DataObject |
createAndRegisterNewObject(java.lang.Class objectClass)
Instantiates new object and registers it with itself. |
DataObject |
createAndRegisterNewObject(java.lang.String objEntityName)
Instantiates new object and registers it with itself. |
DataContext |
createChildDataContext()
Creates and returns a new child DataContext. |
static DataContext |
createDataContext()
Factory method that creates and returns a new instance of DataContext based on default domain. |
static DataContext |
createDataContext(boolean useSharedCache)
Factory method that creates and returns a new instance of DataContext based on default domain. |
static DataContext |
createDataContext(java.lang.String domainName)
Factory method that creates and returns a new instance of DataContext using named domain as its parent. |
static DataContext |
createDataContext(java.lang.String domainName,
boolean useSharedCache)
Creates and returns new DataContext that will use a named DataDomain as its parent. |
DataRow |
currentSnapshot(DataObject object)
Returns a DataRow reflecting current, possibly uncommitted, object state. |
java.util.Collection |
deletedObjects()
Returns a list of objects that are registered with this DataContext and have a state PersistenceState.DELETED |
void |
deleteObject(Persistent object)
Schedules an object for deletion on the next commit of this DataContext. |
void |
deleteObjects(java.util.Collection objects)
Schedules all objects in the collection for deletion on the next commit of this DataContext. |
DataChannel |
getChannel()
Returns parent DataChannel, that is normally a DataDomain or another DataContext. |
java.util.Collection |
getDataMaps()
Deprecated. since 1.2. Use 'getEntityResolver().getDataMaps()' instead. |
DataContextDelegate |
getDelegate()
Returns a delegate currently associated with this DataContext. |
EntityResolver |
getEntityResolver()
Returns EntityResolver. |
EventManager |
getEventManager()
Returns EventManager associated with the ObjectStore. |
GraphManager |
getGraphManager()
Returns this context's ObjectStore. |
ObjectStore |
getObjectStore()
Returns ObjectStore associated with this DataContext. |
QueryEngine |
getParent()
Deprecated. since 1.2. Use 'getParentDataDomain()' or 'getChannel()' instead. |
DataDomain |
getParentDataDomain()
Returns a DataDomain used by this DataContext. |
static DataContext |
getThreadDataContext()
Returns the DataContext bound to the current thread. |
protected java.util.Map |
getUserProperties()
Returns a map of user-defined properties associated with this DataContext. |
java.lang.Object |
getUserProperty(java.lang.String key)
Returns a user-defined property previously set via 'setUserProperty'. |
boolean |
hasChanges()
Returns true if there are any modified, deleted or new objects
registered with this DataContext, false otherwise. |
void |
invalidateObjects(java.util.Collection dataObjects)
"Invalidates" a Collection of DataObject. |
boolean |
isTransactionEventsEnabled()
|
boolean |
isUsingSharedSnapshotCache()
Returns true if the ObjectStore uses shared cache of a parent
DataDomain. |
boolean |
isValidatingObjectsOnCommit()
Returns whether this DataContext performs object validation before commit is executed. |
Persistent |
localObject(ObjectId id,
Persistent prototype)
Returns an object local to this DataContext and matching the ObjectId. |
java.util.List |
localObjects(java.util.List objects)
Deprecated. since 1.2 - use localObject(ObjectId, Persistent) to specify
how each local object should be handled. |
DataNode |
lookupDataNode(DataMap dataMap)
Deprecated. since 1.2 DataContext's QueryEngine implementation is replaced by DataChannel. Use "getParentDataDomain().lookupDataNode(..)". |
java.util.Collection |
modifiedObjects()
Returns a list of objects that are registered with this DataContext and have a state PersistenceState.MODIFIED |
Persistent |
newObject(java.lang.Class persistentClass)
Creates and registers new persistent object. |
java.util.Collection |
newObjects()
Returns a list of objects that are registered with this DataContext and have a state PersistenceState.NEW |
DataObject |
objectFromDataRow(java.lang.Class objectClass,
DataRow dataRow,
boolean refresh)
Creates a DataObject from DataRow. |
java.util.List |
objectsFromDataRows(java.lang.Class objectClass,
java.util.List dataRows,
boolean refresh,
boolean resolveInheritanceHierarchy)
Converts a list of DataRows to a List of DataObject registered with this DataContext. |
java.util.List |
objectsFromDataRows(ObjEntity entity,
java.util.List dataRows,
boolean refresh,
boolean resolveInheritanceHierarchy)
Converts a list of data rows to a list of DataObjects. |
QueryResponse |
onQuery(ObjectContext context,
Query query)
An implementation of a DataChannel method that is used by child contexts to
execute queries. |
GraphDiff |
onSync(ObjectContext originatingContext,
GraphDiff changes,
int syncType)
An implementation of a DataChannel method that is used by child contexts to
synchronize state with this context. |
QueryResponse |
performGenericQuery(Query query)
Executes a query returning a generic response. |
ResultIterator |
performIteratedQuery(Query query)
Performs a single database select query returning result as a ResultIterator. |
int[] |
performNonSelectingQuery(Query query)
Performs a single database query that does not select rows. |
int[] |
performNonSelectingQuery(java.lang.String queryName)
Performs a named mapped query that does not select rows. |
int[] |
performNonSelectingQuery(java.lang.String queryName,
java.util.Map parameters)
Performs a named mapped non-selecting query using a map of parameters. |
void |
performQueries(java.util.Collection queries,
OperationObserver callback)
Deprecated. since 1.2 DataContext's QueryEngine implementation is replaced by DataChannel. |
void |
performQueries(java.util.Collection queries,
OperationObserver callback,
Transaction transaction)
Deprecated. since 1.2. Use Transaction.bindThreadTransaction(..) to provide custom transactions, besides DataContext's QueryEngine implementation is replaced by DataChannel. |
java.util.List |
performQuery(Query query)
Performs a single selecting query. |
java.util.List |
performQuery(java.lang.String queryName,
boolean expireCachedLists)
Returns a list of objects or DataRows for a named query stored in one of the DataMaps. |
java.util.List |
performQuery(java.lang.String queryName,
java.util.Map parameters,
boolean expireCachedLists)
Returns a list of objects or DataRows for a named query stored in one of the DataMaps. |
void |
prefetchRelationships(SelectQuery query,
java.util.List objects)
Deprecated. Since 1.2. This is a utility method that handles a very specific case. It shouldn't be in DataContext. |
void |
prepareForAccess(Persistent object,
java.lang.String property)
Resolves object fault if needed. |
void |
propertyChanged(Persistent object,
java.lang.String property,
java.lang.Object oldValue,
java.lang.Object newValue)
Retains DataObject snapshot and changes its state if needed. |
DataObject |
refetchObject(ObjectId oid)
Refetches object data for ObjectId. |
DataObject |
registeredObject(ObjectId id)
Deprecated. since 1.2 use 'localObject(id, null)' |
void |
registerNewObject(DataObject object)
Registers a transient object with the context, recursively registering all transient DataObjects attached to this object via relationships. |
void |
rollbackChanges()
Reverts any changes that have occurred to objects registered with DataContext; also performs cascading rollback of all parent DataContexts. |
void |
rollbackChangesLocally()
If the parent channel is a DataContext, reverts local changes to make this context look like the parent, if the parent channel is a DataDomain, reverts all changes. |
void |
setChannel(DataChannel channel)
|
void |
setDelegate(DataContextDelegate delegate)
Sets a DataContextDelegate for this context. |
void |
setParent(QueryEngine parent)
Deprecated. since 1.2, use setChannel instead. |
void |
setTransactionEventsEnabled(boolean flag)
Enables or disables posting of transaction events by this DataContext. |
static void |
setTransactionEventsEnabledDefault(boolean flag)
Sets default for posting transaction events by new DataContexts. |
void |
setUserProperty(java.lang.String key,
java.lang.Object value)
Sets a user-defined property. |
void |
setValidatingObjectsOnCommit(boolean flag)
Sets the property defining whether this DataContext should perform object validation before commit is executed. |
java.util.Collection |
uncommittedObjects()
Returns a collection of all uncommitted registered objects. |
void |
unregisterObjects(java.util.Collection dataObjects)
Unregisters a Collection of DataObjects from the DataContext and the underlying ObjectStore. |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
public static final EventSubject WILL_COMMIT
public static final EventSubject DID_COMMIT
public static final EventSubject DID_ROLLBACK
protected static final java.lang.ThreadLocal threadDataContext
protected boolean usingSharedSnaphsotCache
protected boolean validatingObjectsOnCommit
protected ObjectStore objectStore
protected transient DataChannel channel
protected transient EntityResolver entityResolver
protected transient org.objectstyle.cayenne.access.DataContextMergeHandler mergeHandler
protected java.util.Map userProperties
protected transient java.lang.String lazyInitParentDomainName
| Constructor Detail |
|---|
public DataContext()
public DataContext(QueryEngine parent, ObjectStore objectStore)
DataContext(DataChannel, ObjectStore)
constructor instead. Note that DataDomain is both a DataChannel and a
QueryEngine, so you may need to do a cast:
new DataContext((DataChannel) domain, objectStore)
.
parent
- parent QueryEngine used to communicate with the data source.objectStore
- ObjectStore used by DataContext.public DataContext(DataChannel channel, ObjectStore objectStore)
| Method Detail |
|---|
public static DataContext getThreadDataContext() throws java.lang.IllegalStateException
java.lang.IllegalStateException
- if there is no DataContext bound to the current
thread.WebApplicationContextFilter
public static void bindThreadDataContext(DataContext context)
getThreadDataContext()
.
Using null parameter will unbind currently bound DataContext.
public static DataContext createDataContext()
createDataContext(String)
must be used instead. ObjectStore
associated with created DataContext will have a cache stack configured using parent
domain settings.
public static DataContext createDataContext(boolean useSharedCache)
createDataContext(String, boolean)
must be used instead.
ObjectStore associated with newly created DataContext will have a cache stack
configured according to the specified policy, overriding a parent domain setting.
public static DataContext createDataContext(java.lang.String domainName)
public static DataContext createDataContext(java.lang.String domainName, boolean useSharedCache)
protected java.util.Map getUserProperties()
public DataContext createChildDataContext()
public java.lang.Object getUserProperty(java.lang.String key)
public void setUserProperty(java.lang.String key, java.lang.Object value)
public QueryEngine getParent()
public void setParent(QueryEngine parent)
public DataChannel getChannel()
getChannel
in interface ObjectContext
public void setChannel(DataChannel channel)
public DataDomain getParentDataDomain()
public void setDelegate(DataContextDelegate delegate)
public DataContextDelegate getDelegate()
public ObjectStore getObjectStore()
public boolean hasChanges()
true
if there are any modified, deleted or new objects
registered with this DataContext, false
otherwise.
public java.util.Collection newObjects()
newObjects
in interface ObjectContext
public java.util.Collection deletedObjects()
deletedObjects
in interface ObjectContext
public java.util.Collection modifiedObjects()
modifiedObjects
in interface ObjectContext
public java.util.Collection uncommittedObjects()
uncommittedObjects
in interface ObjectContext
public DataObject registeredObject(ObjectId id)
public DataRow currentSnapshot(DataObject object)
Warning: This method will return a partial snapshot if an object or one of its related objects that propagate their keys to this object have temporary ids. DO NOT USE this method if you expect a DataRow to represent a complete object state.
public java.util.List localObjects(java.util.List objects)
localObject(ObjectId, Persistent)
to specify
how each local object should be handled.
Note that the objects in the list do not have to be of the same type or even from the same DataContext.
public java.util.List objectsFromDataRows(ObjEntity entity, java.util.List dataRows, boolean refresh, boolean resolveInheritanceHierarchy)
public java.util.List objectsFromDataRows(java.lang.Class objectClass, java.util.List dataRows, boolean refresh, boolean resolveInheritanceHierarchy)
objectsFromDataRows(ObjEntity,List,boolean,boolean)
.
DataRow
,
DataObject
public DataObject objectFromDataRow(java.lang.Class objectClass, DataRow dataRow, boolean refresh)
objectsFromDataRows(Class,java.util.List,boolean,boolean)
.
DataRow
,
DataObject
public DataObject createAndRegisterNewObject(java.lang.String objEntityName)
Note: preferred way to create new objects is via
createAndRegisterNewObject(Class)
method. It works exactly the same way,
but makes the application type-safe.
createAndRegisterNewObject(Class)
public Persistent newObject(java.lang.Class persistentClass)
newObject
in interface ObjectContext
public DataObject createAndRegisterNewObject(java.lang.Class objectClass)
public void registerNewObject(DataObject object)
object
- new object that needs to be made persistent.public void unregisterObjects(java.util.Collection dataObjects)
invalidateObjects(Collection)
public void invalidateObjects(java.util.Collection dataObjects)
unregisterObjects(Collection)
public void deleteObjects(java.util.Collection objects)
"Nullify" delete rule side effect: passing a collection representing to-many relationship with nullify delete rule may result in objects being removed from collection.
public void deleteObject(Persistent object) throws DeleteDenyException
deleteObject
in interface ObjectContext
object
- a persistent object that we want to delete.
DeleteDenyException
- if a DENY delete rule is applicable for object
deletion.
java.lang.NullPointerException
- if object is null.
DeleteDenyException
public DataObject refetchObject(ObjectId oid)
PersistenceState.HOLLOW
. It can also be
used to refresh certain objects.
CayenneRuntimeException
- if object id doesn't match any records, or if there
is more than one object is fetched.public DataNode lookupDataNode(DataMap dataMap)
lookupDataNode
in interface QueryEngine
public void rollbackChangesLocally()
rollbackChangesLocally
in interface ObjectContext
public void rollbackChanges()
rollbackChanges
in interface ObjectContext
public void commitChangesToParent()
DataChannel
. If the parent channel is
a DataContext, it updates its objects with this context's changes, without a
database update. If it is a DataDomain (the most common case), the changes are
written to the database. To cause cascading commit all the way to the database, one
must use commitChanges()
.
commitChangesToParent
in interface ObjectContext
commitChanges()
public void commitChanges(org.apache.log4j.Level logLevel) throws CayenneRuntimeException
commitChanges()
instead.
CayenneRuntimeException
public void commitChanges() throws CayenneRuntimeException
commitChanges
in interface ObjectContext
CayenneRuntimeException
public EventManager getEventManager()
getEventManager
in interface DataChannel
public GraphDiff onSync(ObjectContext originatingContext, GraphDiff changes, int syncType)
DataChannel
method that is used by child contexts to
synchronize state with this context. Not intended for direct use.
onSync
in interface DataChannel
originatingContext
- an ObjectContext that initiated the sync. Can be null.changes
- diff from the context that initiated the sync.syncType
- One of DataChannel.FLUSH_NOCASCADE_SYNC
, DataChannel.FLUSH_CASCADE_SYNC
,
DataChannel.ROLLBACK_CASCADE_SYNC
.public ResultIterator performIteratedQuery(Query query) throws CayenneException
CayenneException
public QueryResponse performGenericQuery(Query query)
performGenericQuery
in interface ObjectContext
public java.util.List performQuery(Query query)
Since 1.2 takes any Query parameter, not just GenericSelectQuery
performQuery
in interface ObjectContext
QueryMetadata.isFetchingDataRows()
.public QueryResponse onQuery(ObjectContext context, Query query)
DataChannel
method that is used by child contexts to
execute queries. Not intended for direct use.
onQuery
in interface DataChannel
context
- an ObjectContext that originated the query, used to
register result objects.
public int[] performNonSelectingQuery(Query query)
public int[] performNonSelectingQuery(java.lang.String queryName)
public int[] performNonSelectingQuery(java.lang.String queryName, java.util.Map parameters)
public void performQueries(java.util.Collection queries, OperationObserver callback)
performQueries
in interface QueryEngine
public void performQueries(java.util.Collection queries, OperationObserver callback, Transaction transaction)
performQueries
in interface QueryEngine
public void prefetchRelationships(SelectQuery query, java.util.List objects)
WARNING: Currently supports only "one-step" to one relationships. This is an arbitrary limitation and will be removed eventually.
public java.util.List performQuery(java.lang.String queryName, boolean expireCachedLists)
queryName
- a name of a GenericSelectQuery defined in one of the DataMaps. If
no such query is defined, this method will throw a
CayenneRuntimeException.expireCachedLists
- A flag that determines whether refresh of cached lists
is required in case a query uses caching.public java.util.List performQuery(java.lang.String queryName, java.util.Map parameters, boolean expireCachedLists)
queryName
- a name of a GenericSelectQuery defined in one of the DataMaps. If
no such query is defined, this method will throw a
CayenneRuntimeException.parameters
- A map of parameters to use with stored query.expireCachedLists
- A flag that determines whether refresh of cached lists
is required in case a query uses caching.public EntityResolver getEntityResolver()
getEntityResolver
in interface QueryEngine
getEntityResolver
in interface DataChannel
getEntityResolver
in interface ObjectContext
public static void setTransactionEventsEnabledDefault(boolean flag)
public void setTransactionEventsEnabled(boolean flag)
public boolean isTransactionEventsEnabled()
public boolean isUsingSharedSnapshotCache()
true
if the ObjectStore uses shared cache of a parent
DataDomain.
public boolean isValidatingObjectsOnCommit()
public void setValidatingObjectsOnCommit(boolean flag)
public java.util.Collection getDataMaps()
QueryEngine
getDataMaps
in interface QueryEngine
public void prepareForAccess(Persistent object, java.lang.String property)
prepareForAccess
in interface ObjectContext
public void propertyChanged(Persistent object, java.lang.String property, java.lang.Object oldValue, java.lang.Object newValue)
propertyChanged
in interface ObjectContext
public GraphManager getGraphManager()
getGraphManager
in interface ObjectContext
public Persistent localObject(ObjectId id, Persistent prototype)
prototype
is not null, local object is refreshed with the prototype
values.
In case you pass a non-null second parameter, you are responsible for setting correct persistence state of the returned local object, as generally there is no way for Cayenne to determine the resulting local object state.
localObject
in interface ObjectContext
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


Java Script API Layer
How to run in your machine
--Prerequisites
- npm (node)
- http-server
Steps
-Clone project from https://gitlab.infotraxsys.com/prathapk/javascript-api-layer.git
-At root, run npm install
. This will install all dependencies in package.json file
-At root, run http-server .
This will start localhost server like below
Starting up http-server, serving .
Available on:
http://<IP_ADDRESS>:8080
http://<IP_ADDRESS>:8080
http://<IP_ADDRESS>:8080
-Open http://localhost:8080/
in Google chrome.
You may face
Cross-Origin
issue as we are reaching different servers from localhost. you can see issue in console like belowCross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://dev-evo-dtsrest.myvoffice.com/index.cfm/v1/commissions/qualifications/volumes/undefined/function(t)%7Bconsole.log(%22Data%20:%20%22,t)%7D?0=function(t)%7Bconsole.log(%22Error+:+%22,t)%7D. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).[Learn More]
#How to fix Cross-Origin
Open Google Chrome with below command
C:\Program Files (x86)\Google\Chrome\Application>chrome.exe --disable-web-security --user-data-dir
This will disable web security for us to make calls from different servers from localhost. Above command automaticall open Chrome istance for us to use.
-Now we can use API from in html or js file as mentioned below
Inside JS files
import Api from 'frontend_sdk';
Api.getRanks();
Api.getVolumes(3);
Api.getPersonalVolume(3);
How to use from Node Package Manger
Install
npm install --save frontend_sdk
Usage
Inside html file
<script src="user.js"></script>
<script>
Api.getRanks();
Api.getVolumes(3);
Api.getPersonalVolume(3);
</script>
Inside JS files
import Api from 'frontend_sdk';
Api.getRanks();
Api.getVolumes(3);
Api.getPersonalVolume(3);
License
MIT © prathapk


Travis' Coding Journal
New Entry
New Journal Entry
×
Entry Title:
Syntax Learned:
Journal Entry:
Journal Entry:
×
Date Entered:
Methods Learned:
Journal Entry Notes:
Delete Entry


This graph takes a randomized group of 500 cities and separates for those that are in the Southern Hemisphere. I then plotted their teperature against their latitude. In this chart we can see a strong positive correlation. As you move closer to the equator (0 degrees Latitude), you can expect the temperature to increase.


--- layout: simple title: Résumé --- # Michael Tolan
Associate Engineering Manager
February 2019 – Present
Boston, MA
Principal Software Engineer: Platform
June 2016 – February 2019
Boston, MA
Sr. Software Engineer
January 2011 – June 2016
Boston, MA
Sr. Software Developer
August 2009 – December 2010
Cambridge, MA
Sr. Software Developer
June 2008 - August 2009
Cambridge, MA
Contract Software Developer
April 2008 – June 2008
Charlestown, MA
Software Developer
August 2007 - February 2008
Boston, MA


@* * Copyright 2023 HM Revenue & Customs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @import config.AppConfig @import models.request.AuthenticatedRequest @import views.html.partials._ @import models.viewmodels.correspondence.CaseDetailsViewModel @(caseDetails: CaseDetailsViewModel, startAtTabIndex: Int = 0)(implicit request: AuthenticatedRequest[_], messages: Messages, appConfig: AppConfig) @tab_heading("correspondence", messages("case.v2.correspondence.case-details.heading")) @if(request.hasPermission(Permission.EDIT_CORRESPONDENCE)) {
}


Cluster Sense
Home
Documentation
Cluster Sense
A real-time API for interacting with clusters of servers.
Status
Output


HammerPricer
Art Auction Pricing
Deux Personnages (1969)
| Consideration | Price |
|---|---|
| Low: | {{ prediction['low'] }} |
| Predicted Value: | {{ prediction['value'] }} |
| High: | {{ prediction['high'] }} |
| Information | |
|---|---|
| Title: | Deux Personnages |
| Artist: | Karel Appel |
| Creation Year: | 1969 |
| Dimensions: | 50.8 cm x 66 cm |
| Auction Date: | 2014-09-23 |
| Low Estimate: | $20,000 |
| High Estimate: | $30,000 |


{% extends 'layouts/base_layout.html' %} {% block css %} {%endblock%} {% block body %}
{{_('We\'ve received your order, you\'ll receive an email with further details.')}}
{{_('Leave a review, it will help us to improve!')}}
{{_('GO TO THE OFFICIAL SHOP')}}


Toggle navigation
Feather Feed
Report Match
Play Match
Dropdown
Action
Another action
Something else here
Separated link
One more separated link
Submit
Welcome
Log Out
Log Out
×
Submit a Match
Winner:
Select the Winner
Loser:
Select the Loser
Points:
Points:
×
Create a Match
Player 1:
Select a player
Player 2:
Select a player
Max Score?
Max Points?
11 Pts
15 Pts
21 Pts
Ranked?
Ranked Match?
Yes
No


Come book a Room! It's easy and affordable.
The house to the right is the one you will be settling in. We offer breakfast in the morning (8am-11am), and we have free room service!. Prices vary depending on how long your stay is, refer to the table below.
The house to the right is the one you will be settling in. We offer breakfast in the morning (8am-11am), and we have free room service!. Prices vary depending on how long your stay is, refer to the table below.
| Days | Price |
| 1 day | $80 USD |
| 2 days | $160 USD |
| 3 days | $240 USD |
| 4 days | $320 USD |


The armidale application launcher provides a simple interface to start armidale applications running on servers around the internet or an intranet. It also provides a simple application bookmark management facility.
The armidale launcher is started using the following command:
java -jar <install_dir>/jars/armidale.jar
where:
<install_dir> is the name of the directory in which armidale is installed.
If all is well, the following window should appear.
Start Application
Bookmarks
Home Application
Exiting the launcher
Options Tab
About Tab
Using the command line
The start application function starts an application on a remote armidale server or locally. The function is used by first entering the URL of an application into the edit box on the launcher tool bar. To start the specified application, use the Bookmarks.Start URL menu item or click the button on the toolbar.
The URL of an armidale application running on a remote server has the following form:
arm://<host_name>[:<port>][/<application_name>] {<arguments>}
where:
<host_name> is the name of a machine running an armidale server (eg. armidale.anu.edu.au).
<port> (optional) specifies the port number that the server machine is listening on for armidale connections. If not specified the port number is assumed to be 3000.
<application_name> (optional) specifies the name of an armidale application available on the specified server. If <application_name> is not specified, then the launcher will attempt to start an application called "Home".
Some examples of armidale URLs for remote applications include:
arm://my-airline.com/BookFlight
arm://my-university.edu/student.CheckMarks
arm://my-bank.com/accounts.TransferFunds
arm://my-search-engine.com/web.Search
arm://my-search-engine.com/news.Search
arm://my-company.com:3010/testing.TestArmidale
arm://some-company.com
To run a local application (ie. one that is installed on the local machine), the URL is simply the name of the armidale application as shown in the following examples.
BookFlight
student.CheckMarks
accounts.TransferFunds
web.Search
news.Search
testing.TestArmidale
The application URL entered into the URL edit box can be bookmarked by using the Bookmarks.Bookmark URL menu item or by clicking the button on the toolbar.
Bookmarked applications are listed on the bookmarks tab located at the bottom of the launcher window. When an application on the bookmark tab is selected, its URL will be entered into the URL Edit box. The Start Application function described above can then be used to start the selected application.
Bookmarks can be deleted by using the Bookmarks.Delete Selected Bookmark and Bookmarks.Delete All Bookmarks menu items.
In addition to bookmarked applications, the armidale launcher allows the user to specify a 'home' application by entering its URL into the URL edit box and then using the Bookmarks.Set Home URL menu item or clicking the button on the toolbar.
This home application can then be started in one step by using the Launcher.Start Home URL menu item or by clicking the button on the toolbar.
The armidale launcher can be closed down by using the File.Exit menu item or by clicking the button on the toolbar.
When the launcher closes down, its state (current URL, home URL, bookmarks, and selected tab) is saved. When the launcher is restarted, its state will be set to that saved after the previous shutdown.
The Options tab provides some control over debugging functions built into armidale. They should not be changed by end users and are intended for use by armidale application developers.
The About tab shows a copyright notice, the launcher version and details about the platform on which it is running.
As an alternative to using the armidale launcher, remote armidale applications can be started using the following command (described here).
java -cp <armidale_home_dir>/jars/armidale.jar armidale.api.RemoteApplication <url> {<arguments>}
It should not surprise you to learn that the armidale launcher is itself an armidale application and can therefore be run remotely. For example, the latest version of the launcher could be started using a command like:
java -cp armidale.jar armidale.api.RemoteApplication arm://armidale.anu.edu.au/armidale.launcher.Main


--- layout: post title: NServiceBus v4 - Beta1 is out date: 2013-03-27 16:44:30.000000000 +01:00 categories: - NServiceBus tags: [] status: publish type: post published: true meta: dsq_thread_id: '1168533286' _edit_last: '1' author: login: andreas.ohlund email<EMAIL_ADDRESS>display_name: Andreas Öhlund first_name: Andreas last_name: "Öhlund" ---
I just want to let you know that we released the first beta of the upcoming v4 of NServiceBus last friday. The main focus for v4 has been to make NServiceBus run on a wider range of queuing infrastructures while still giving you the same developer experience.
Out of the box v4 will support ActiveMq, RabbitMq, WebSphereMq and SqlServer, yes using your old and trusty database as a queuing platform. While adding support for all those new transports we had to do quite a lot of refactoring deep in the bowels of NServiceBus and the end result is a much cleaner codebase and its my hope that adding new transports should be a breeze going forwards. There is already a Redis transport in the works by our amazing community.
We have of course made a lot of other improvements as well so please take a look in the release notes for the full scope.
From now on we'll be focusing on stabilizing the release and ramp up on documentation so hopefully you'll see an increase in v4 related blog post here as well.
You can grab the new bits either as a msi download over at our site or via nuget.
If all goes well we hope to get the final version out of the door within the next 3-4 weeks.
Go ahead and take it for a spin!


Schedule Basic
Schedule provides an Outlook, iCal like JSF component to manage events which is based on FullCalendar. Schedule is highly customizable featuring various views (month, day, week), built-in I18N, drag-drop, resize, customizable event dialog, ajax listeners for every user interaction and more.


Owner
Life is just one big meme.
Support and web dev
OwO whats this
Support
// 15 // weeb // dev //
ffffffffffffffffffffffffffffffffffffffffffffffffffff
So anything I say can be put here? Cool.
A tech enthusiast from the UK.


Write a short paragraph about yourself or some placeholder text.
A second short paragraph about yourself or some placeholder text.
| Books | Movies | Games |
|---|---|---|
| Freakonomics | How to change your mind | Braiding Sweetgrass |
| The Lives of Others | Pulp Fiction | Whiplash |
| Grand theft auto V | The Witcher | Infamous |


Please wait...
Products Details
Add New
Upload Products
×
Upload Products
Choose File
Submit
Cancel
×
New Product
Name:
Minimum purchase Qty.:
Maximum purchase Qty.:
Save
×
Edit Products
Name:
Minimum purchase Qty.:
Maximum purchase Qty.:
Save
{{currentPage+1}} / {{numberOfPages()}}
Select All
Name
Minimum purchase Qty.
Maximum Purchase Qty.
Action
{{data.name}}
{{data.minpoqty}}
{{data.maxpo}}
Edit
|
Delete
Delete


GlyphBrowser for RoboFont
The GlyphBrowser tool for RoboFont shows a list of unicode values and glyphnames from the GlyphNameFormatter project. You can search and select names and then create these glyphs in the current font. GlyphBrowser contains a copy of the latest GlyphNameFormatter GNUFL list, but they're separate projects.
Usage
- You can copy / paste / type text in the big bar at the top. The relevant unicode characters are listed
- Use the search field for glyph names, partial names or unicode values
- For Arabic glyph names, the joining types data from Unicode will be used to construct appropriate variants. For instance,
0x00628
, beh, will generate /beh /beh.init /beh.medi /beh.fina
- Please note that additional support may be needed to make the selected characters into working fonts. RoboFont does not automatically support everything.
- Control-click on one or a selection of glyphs gives you a contextual menu to copy the names in different formats, as well as add the glyphs to a specific, or all open UFOs.
Reporting
GlyphNameFormatter and GlyphBrowser are very much community projects and they rely on your feedback.


Changelog¶
(0.3.10) -¶
Change¶
Corrected the
to_dict
function in the Model class to correctly exclude functions that require parameters.
(0.3.9) -¶
Change¶
Updated setup file to indicate the range of Python versions to 3.9.
(0.3.8) -¶
Change¶
Changed requirements.txt to require the version of SQLAlchemy to be less than 1.4.
(0.3.7) -¶
Change¶
Corrected an error that occurred using properties on fields in Model. Also, added a more complete account to
Base.doc_table
of properties. A check is made on a property to determine if a setter is available. An example illustrates the issue:
… python
- class Table1(db.Model):
__tablename__ = “table1”
id = db.Column(db.Integer, primary_key=True)
- def __init__(self, id=None, writable=None):
self.id = id self._writable = writable
@property def writable(self) -> str:
return self._writable
@writable.setter def writable(self, text) -> str:
self._writable(text)
@property def not_writable(self) -> str:
return “this is not writable”
…
Two properties have been created, one writable and one not. So you would want a doc_table
decription to reflect that detail.
… python
- {
- “Table1”: {
“type”: “object”, “properties”: {
- “id”: {
“type”: “integer”, “format”: “int32”, “primary_key”: True, “nullable”: False, “info”: {},
}, “writable”: {
“property”: True, “readOnly”: False, “type”: “str”,
}, “not_writable”: {
“property”: True, “readOnly”: True, “type”: “str”,
},
}, “xml”: “Table1”,
}
}
…
(0.3.6) -¶
Change¶
Corrected an error that occurred in
Base.doc_table
where self-referencing tables descended into recursive hole.
(0.3.5) -¶
Change¶
Changed
Model.deserialize
foronly_columns=True
. Added an additional check when iterating model properties, correcting an error.
(0.3.4) -¶
Change¶
Added a paramater,
only_columns=True
, toModel.deserialize
for filtering data to only data that pertains to columns. Up to now,deserialize
for any class provided a generic means to convert JSON data into dictionaries with the option of converting the data from camel case to snake case. With this added parameter,only_columns=True
, it is slightly easier to add dictionary data to create a model.
… python
# example: id, and long_name are columns, other is something else data = {
“id”: 1, “longName”: “this is a name”, “other”: “This is a test”,
}
# this would fail because ‘other’ is not a column my_object = MyModel(
**MyModel.deserialize(data)
)
# this would work due to the only_columns=True my_object = MyModel(
**MyModel.deserialize(data, only_columns=True)
)
…
(0.3.3) -¶
Add¶
Added a utility function
get_model_defaults
. With this function a dictionary of keys and instanced default variables can be created. The intent of this function derives from wanting some portability and avoidance of interacting with a remote database until it is absolutely necessary, yet avoid rewriting class functions that are already written.
The idea is that use of the model instances would have all the methods, functionality, and comforts of home except for anything that connects to the database. One way to do this:
… python
from datetime import datetime import requests
from dbbase import DB from dbbase.utils import get_model_defaults
# we use db only for creating the model # this results are sent to an API. db = DB(‘:memory:’)
- class Table1(db.Model):
__tablename__ = “table1”
id = db.Column(db.Integer, primary_key=True) start_time = db.Column(
db.DateTime, default=datetime.now nullable=False
)
- def myMethod(self):
# does something useful returns answer
db.create_all()
defaults = get_model_defaults(Table1) # results in {“start_time”: datetime obj here}
table = Table1(**defaults)
# so there is a scaffolding in the form of the # table in which to use the object.
# now it is time to send to the API. post_res = requests.post(
url=TABLE_URL, json=table.to_dict(), headers={“Content-type”: “application/json”}
)
…
Once the object is posted, the object will become part of the database with such things as the id
assigned, any server defaults, etc will be created.
(0.3.2) -¶
Change¶
Corrected an issue when recursively documenting relationship variables that occasionally resulted in skipped variables.
(0.3.1) -¶
Change¶
Changed the documentation function for tables. Relationships settings. In the case of a relationship that is a single, not a list, the readOnly setting has been changed back to True.
In the case of a Parent model having a list of children, marking a related Child as not readOnly makes sense because a child object can be appended to a children. Upon saving such as model, both parent and children that have been appended will be commited.
In the case of a child relationship that is ‘single’, the append method is not possible, nor would the assigned id of a child make its way to the child_id of the parent. Therefore, for practical purposes it is marked readOnly: True.
(0.3.0) -¶
Change¶
Changed the documentation function for tables. Relationships had been treated as read-only for documentation purposes in the sense that an update process would naturally be focused on the explicit column variables for any given table. However, this neglects the possibility for bidirectional updates when the
back_populates
andbackref
feature is used.doc_tables
now show readOnly True or False for related tables depending on how the relations are set. Since this breaks the previousdoc_table
function, the version has been bumped to 0.3.0.
(0.2.8) -¶
Added greater depth to documentation functions for relationships.
(0.2.7) -¶
Add¶
Added
Model.filter_columns
to better address filtering columns for various characteristics. This function ties in with the documentation functions found inDB
. Also, the column property to be selected can also be a negative. ex: !nullable would return all the required fields.
Changed¶
Changed test formatting.
Removed¶
Removed column_props from
DB.doc_table
as unhelpful.
(0.2.5) -¶
Changed¶
Changed treatment of serial fields and serial field relations to class methods solely to reduce ambiguity.
(0.2.4) -¶
Added¶
Added args and kwargs to passthrough functions to SQLAlchemy in base.py.
Added provision for evaluating dynamic relationships for
Model.to_dict()
. This was necessary due to the need to trigger a resolve on the relationship query.
Changed¶
Changed the way some utility functions such as inspect are pulled in to
Model
. Importing them directly instead of using the functions ondb
enables theModel
class to be used separately from theDB
class. This comes into play when integrating with Flask-SQLAlchemy.
(0.2.4) -¶
Added¶
Added an option of a write-only column. With the ability to document fields of tables, it is useful to be able to identify fields that are write-only, such as password fields. The
Model.to_dict()
function outputs the contents of a record. If the output provides the basis for forms in the front-end, including the password field is natural and desirable. Once, the password has been added, however, encrypted or not, it should be excluded.
… python
- class Table1(db.Model):
__tablename__ = “table1”
id = db.Column(db.Integer, primary_key=True) password = db.WriteOnlyColumn(db.String, nullable=False)
db.create_all()
…
When use the documentation dictionary featuure, we now get:
… json
- {
- “Table1”: {
“type”: “object”, “properties”: {
- “id”: {
“type”: “integer”, “format”: “int32”, “primary_key”: true, “nullable”: false, “info”: {}
}, “password”: {
“type”: “string”, “nullable”: false, “info”: {
“writeOnly”: true
}
}
}, “xml”: “Table1”
}
}
…
Using this we create two records, with and without a password.
… python
table1 = Table1(id=1) table2 = Table1(id=2, password=”some encrypted value”)
>>> print(table1.to_dict()){‘id’: 1, ‘password’: None},
>>> print(table2.to_dict()){‘id’: 2}
…
The write-only field is thereby excluded. The basis for this functionality stems from the use of the info field.
(0.2.3) -¶
Changed¶
Changed the name of SERIAL_LIST to SERIAL_FIELDS, and RELATION_SERIAL_LISTS to SERIAL_FIELD_RELATIONS to better describe what they are. The parameters associated with using these variables are changed as well.
(0.2.2) -¶
Added¶
Added
db.doc_column
function that returns the documentation dictionary for a specific column.Added checking for valid foreign keys in
Model.validate_record
. Prior to attempting a save, the columns that cannot be null, and require foreign key validation are verified against the foreign table.
(0.2.1) -¶
Added¶
Added model documentation properties for functions, properties, and relationships. All of these are marked as readOnly: True. This additional feature gives a more complete picture of the characteristics of the model. Just as serialization is shaped by the function,
Model._get_serial_stop_list()
, only those items which pass that hurdle will be documented. That filter ensures that only meaningful items will be documented.Added model documentation properties for table constraints
Fixed¶
Added
__repr__
and__table__
to default stop lists
(0.2.0) -¶
Added¶
Added
db.doc_table()
anddb.doc_tables()
function to help build documentation for table objects in a way that is reminiscent of Swagger / OpenApi.For example, here is the output in JSON format using the approach that OpenApi takes. In fact, there are some differences. These differences stem from the more nuanced approach that SQLAlchemy takes for things like defaults. For example, server side defaults are specified. Also, on update functions are detailed as well.
Usage:
doc_table(
cls, # the class
to_camel_case=False, # convert column names to camel case
serial_list=None, # select only specific columns
column_props=None # select only certain column properties
)
Some uses for this function:
Detail on the tables can be part of a larger communication with developers using an API.
Meta information can be resourced about particular views.
Unit / integration tests can use the output to ensure that table columns are created to specifications.
Here is an example of some of the column types that are tested.
{
"SampleTable": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int32",
"primary_key": true,
"nullable": true,
"comment": "Primary key with a value assigned by the database",
"info": {
"extra": "info here"
}
},
"name1": {
"type": "string",
"maxLength": 50,
"nullable": false,
"comment": "This field is required",
"info": {}
},
"indexValue": {
"type": "integer",
"format": "int32",
"nullable": true,
"server_default": {
"for_update": false,
"arg": "db.text(\"0\")",
"reflected": false
},
"comment": "This field defaults to an integer on the server.",
"info": {}
},
"createdAt1": {
"type": "date-time",
"nullable": true,
"default": {
"for_update": false,
"arg": "datetime.now"
},
"comment": "This field defaults to now, created at model level",
"info": {}
},
"updateTime1": {
"name": "update_time1",
"type": "date-time",
"nullable": true,
"onupdate": {
"for_update": true,
"arg": "datetime.now"
},
"comment": "This field defaults only on updates",
"info": {}
},
"uniqueCol": {
"type": "string",
"maxLength": 20,
"nullable": true,
"unique": true,
"comment": "This must be a unique value in the database.",
"info": {}
},
"name2": {
"type": "string",
"maxLength": 50,
"nullable": true,
"comment": "This field is not required",
"info": {}
},
"fkId": {
"type": "integer",
"format": "int32",
"nullable": false,
"foreign_key": "other_table.id",
"comment": "This field is constrained by a foreign key on another table",
"info": {}
},
"someSmallInt": {
"type": "integer",
"format": "int8",
"nullable": false,
"default": {
"for_update": false,
"arg": 0
},
"comment": "This field is a small integer",
"info": {}
},
"someInt": {
"type": "integer",
"format": "int32",
"nullable": false,
"default": {
"for_update": false,
"arg": 0
},
"comment": "This field is a 32 bit integer",
"info": {}
},
"today": {
"type": "date",
"nullable": true,
"default": {
"for_update": false,
"arg": "date.today"
},
"doc": "this is a test",
"comment": "This field defaults to today, created at model level",
"info": {
"test": "this is"
}
},
"someBigInt": {
"name": "some_big_int",
"type": "integer",
"format": "int64",
"nullable": false,
"default": {
"for_update": false,
"arg": 0
},
"comment": "This field is a big integer",
"info": {}
},
"statusId": {
"type": "integer",
"format": "int32",
"choices": {
"0": "New",
"1": "Active",
"2": "Suspended",
"3": "Inactive"
},
"nullable": false,
"comment": "Choices from a list. String descriptors change to integer upon saving. Enums without the headache.",
"info": {}
},
"name3": {
"type": "text",
"nullable": false,
"default": {
"for_update": false,
"arg": "test"
},
"index": true,
"comment": "This field has a default value",
"info": {}
},
"itemLength": {
"type": "float",
"nullable": false,
"comment": "This field is a float value",
"info": {}
},
"abc": {
"type": "string",
"maxLength": 20,
"nullable": true,
"server_default": {
"for_update": false,
"arg": "abc",
"reflected": false
},
"comment": "This field defaults to text but on the server.",
"info": {}
},
"itemAmount": {
"name": "item_amount",
"type": "numeric(17, 6)",
"nullable": true,
"default": {
"for_update": false,
"arg": 0.0
},
"info": {}
},
"updateTime2": {
"type": "date-time",
"nullable": true,
"server_onupdate": {
"for_update": true,
"arg": "db.func.now()",
"reflected": false
},
"comment": "This field defaults only on updates, but on the server",
"info": {}
},
"createdAt2": {
"type": "date-time",
"nullable": true,
"server_default": {
"for_update": false,
"arg": "db.func.now()",
"reflected": false
},
"comment": "This field defaults to now, created at the server level",
"info": {}
}
},
"xml": "SampleTable"
}
}
[0.1.15] -¶
Changed¶
Changed conversion of UUIDs conversion to strings to remove hyphens. A serialized uuid is shortened from
1f4fdf7e-6f8d-4a7e-b0bd-7ae0722b324d
to1f4fdf7e6f8d4a7eb0bd7ae0722b324d
.
[0.1.14] -¶
Added¶
Added a function
validate_record
to the Model class. The initial version evaluates a record by comparing columns defined as required that do not have default values filled in. Of course more issues can contribute to a failure to save a record, but it is a start. It also has the ability to return the error message in camel case for front end use. The expected usage:
status, errors = self.validate_record()
if status:
self.save()
else:
return errors
Added a
delete
function to the Model class.
# dbbase
user = User(name='Bob')
User.save()
# then delete
user.delete()
[0.1.13] -¶
Added¶
Added conversion from bytes as well as strings for the deserialization function. This aids in conversion for query_strings received, eliminating a step.
[0.1.12] -¶
Removed¶
Removed tests again. Included more thorough approach.
[0.1.11] -¶
Removed¶
Removed tests, docs, docsrc from setup.py
[0.1.10] -¶
Changed¶
Changed base._apply_db to recognize materialized views as well as regular tables.
[0.1.9] -¶
Added¶
Added to
Model.to_dict
andModel.serialize
a parameter,serial_list
,serial_list
enables displacing the classSERIAL_LIST
attribute for on an ad hoc basis to the fields that are included in serialization.Added a class attribute,
RELATION_SERIAL_LISTS
, to better control the output of relations. The new variable is a dict where the key is a relationship field and the value is the explicit list of fields that would be included in serialization. The advantage is that a standard list of fields for the secondary relationship variable does not have to define the output for the primary serialization. Just as aserial_list
parameter has been added to Model.to_dict and Model.serialize, arelation_serial_lists
has been added as well for convenience.
Changed¶
Trivially changed utils._xlate_from_js to utils._xlate_from_camel_case for clarity.
Changed
Model._get_serial_stop_list
from a class method. It is only useful with an instance.
Fixed¶
Fixed
Model._class()
function. When used as part of a Python package, it identified the class as DeclarativeMeta rather than the correct class name. Also, it now works for Postgres materialized views.
[0.1.8] - 2020-04-01¶
Added¶
Add support for uuids to strings in serialization.
Added exposure of engine as an attribute of DB
Added CHANGELOG file.
Changed¶
Separated functions
create_database
anddrop_database
from base to maint moduleReworked how Model gets updated upon instantiating with DB.
Fixed¶
Cleaned up typos in documentation.
Removed¶
Removed an unnecessary test,
verify_requireds
, from tests – fixture_base It was unnecessary for a base installation.
[0.1.8] - 2020-03-23¶
Added¶
Initial public release


xgqfrms
xgqfrms's github blog pages!
View on GitHub
hello world!
https://xgqfrms.github.io/xgqfrms
More contents coming soon...


Evaluate the baby after stimulation by asking the following question: Is the baby breathing well?
A baby who is breathing well may be
- Crying OR
- Breathing quietly and regularly
A baby who is not breathing well may be
- Gasping - taking a single deep breath followed by a long pause or several deep, irregular breaths followed by a pause OR
- Not breathing at all
Some babies will have shallow, irregular, slow, or noisy breathing immediately after birth. Others may have chest indrawing (retractions). These babies with abnormal breathing will require continued monitoring of their breathing, heart rate, and color to decide if they need more help to breathe.
Decide what care the baby needs after clearing the airway and stimulation.
If the baby is breathing well, the baby can receive routine care. Continue to check the breathing. Clamp or tie and cut the umbilical cord. Encourage breastfeeding in the first hour.
If the baby is not breathing well (gasping or not breathing at all), begin ventilation with bag and mask.Quickly move the baby to the area for ventilation. Delaying ventilation may result in death or brain damage.
Practice key skills
Practice in pairs
Use a neonatal simulator or mannequin to show
- Crying
- Breathing quietly and regularly
- Gasping
- Not breathing at all


Delhi's Khan Market in top 20 most expensive retail locations in world: report
by BusinessToday.InLast year, Khan market was at 21st spot with a rent of $237 (Rs 17,014.85 ) per sq ft a year.
Delhi's posh 'Khan Market' has made its entry into the list of world's top-20 most expensive retail locations in the world, according to global property consultant Cushman & Wakefield.
In its latest report 'Main Streets Across the World 2019', Khan market is ranked 20th with an annual rent of $243 (Rs 17,445.60) per sq ft.
On the India market, the report said that "rental trends over the past year have largely been pointing upwards, with the lack of availability in the best shopping malls pushing more brands to seek out prominent, high footfall locations in the main commercial corridors".
Last year, Khan market was at 21st spot with a rent of $237 (Rs 17,014.85 ) per sq ft a year.
Causeway Bay in Hong Kong retains the number one ranking, with an annual rent of $2,745 (Rs 1.97 lakh) per sq ft.
Other expensive retail locations appearing in the list are - New York's Upper 5th Avenue at second position ($ 2,250 {Rs 1.61 lakh} per sq ft), followed by London's New Bond Street ($1,714 {Rs 1.23 lakh}per sq ft) and Avenue des Champs Elysees in Paris ($1,478 {Rs 1.06 lakh} per sq ft).
Via Montenapoleone in Milan, Italy ranks fifth with an annual rent of $1,447 {Rs 1.03 lakh} per sq ft, the report said.
The rankings are based on rentals during the second quarter of 2019. The Cushman & Wakefield report tracked 448 locations across 68 countries.
(With PTI inputs)


Vyartha
व्यर्थ // વ્યર્થ // vyarth (in vain)
We called it Vyartha because this is the feeling that made us compose the book. It is an existential story of one Utc Singhal who did not fear the emotions and looked through the reality to find deeper meanings. He is a man of questions, and a courage to find answers. He does not shy away from the medium or the message. This is a story of Malay who was always curious about what goes in the mind of Utc. This is the compilation of emotions and discussions of these two boys who were in the graduating year of their engineering course.
Colophon of the book
The book was made using image collection of Utc Singhal and myself. Well, mostly of Utc. He has a better sense of aesthetics than me, also I think he feels and thinks more than I do. The images are reposts from our tumblr accounts. The angst and dissatisfaction we had towards what we were learning, what kind of world we were in, our emotional incompetencies and ourselves; the reposts on the web represented the feeble connection we experienced with fellow sense8s whom we have never met or we do not know if we have met.
The book is made with an existential love towards philosophy, a tendency of finding right connections, music of infected mushroom and limited desktop publishing skills. Locating myself From the chapter संक्रमित // સંક્રમિત // sankramit (Infected) The book is made using Photoshop, each page is crafted with patience on a 2GB Dell machine running windows with a lot of support from a 500GB seagate HDD. We remember the times when we had to delete our beloved movies and songs on the machine to increase the scratch disk space for photoshop to process these images and still have room for remembering history of our actions.
The book is divided into four parts; each representing the topics we discussed, the confusions we experienced, the emotions we felt during our four year stay at the engineering school.
This is to those times when we felt no need for validation, when we were okay with being astray. The explorations were random, but not un-directional… Just like us, the book might seem random, but is not un-directional. We do not consider this as art, but we consider this as reflective design of a memoir.
Discrepancy in energy distribution From the chapter अस्तित्ववाद // અસ્તિત્વવાદ // astitvavaad (Existentialism)
I would say, to know me and Utc, this book is the best description of where and when we come from. Thanks to Utc for the all the discussions we had and are going to have!
Chapters
Links take to invidual chapters
- अस्तित्ववाद // અસ્તિત્વવાદ // astitvavaad (Existentialism)
- भ्रम // ભ્રમ // bhram (Illusion)
- संक्रमित // સંક્રમિત // sankramit (Infected)
- व्यर्थ // વ્યર્થ // vyarth (in vain)
Complete book:


Super Mario Bros. is a 2D platform game released by Nintendo in 1985. The game features one or two player action where player 2 takes on the role of Mario's younger brother, Luigi. The goal of the game is to travel through the Mushroom Kingdom in order to rescue Princess Toadstool. The player(s) may only move left to right, and may not re-visit areas that have already passed off-screen. The player(s) progress through each level in order to reach a flag at the end of the level. In each level, there are coins Mario may collect in order to earn points, with more coins and items hidden in the bricks. The game is beaten when Mario rescues the princess.