It's not too late to ditch the ad-based business model and build a better web.
Cegłowski's speech explains why Tripod's story sounds familiar. Advertising became the default business model on the web, "the entire economic foundation of our industry," because it was the easiest model for a web startup to implement, and the easiest to market to investors. Web startups could contract their revenue growth to an ad network and focus on building an audience. If revenues were insufficient to cover the costs of providing the content or service, it didn't matter—what mattered was audience growth, as a site with tens of millions of loyal users would surely find a way to generate revenue.
A back of the envelope analysis from Felix Stalder gives a sense of how little these ads are worth. Last quarter, Facebook reported that it had 1.32 billion users, collected $2.91 billion in revenue and made a profit of $791 million, for a profit margin of 27 percent. Facebook is clearly doing a great job making money from ads. But the profit per user is just under $0.60. That's a fascinating figure, because Facebook reports that users spend 40 minutes per day on the site, or roughly 60 hours per quarter.
Demonstrating that you're going to target more and better than Facebook requires moving deeper into the world of surveillance—tracking users' mobile devices as they move through the physical world, assembling more complex user profiles by trading information between data brokers.
In 1996, we noticed that the majority of our users were coming from four countries: the United States, Canada, the U.K., and Malaysia. Since none of our content was in Bahasa Malay and since we'd never done any outreach to Malaysian users, this was a surprise. I started printing out heavily trafficked webpages posted by Malaysian users and brought a sheaf of them to a professor at nearby Williams College, who read them over and informed me that we had become a major vehicle for expression for Malaysia's opposition political group, Anwar Ibrahim's Reformasi movement.
Ethan Zuckerman is the director of the Center for Civic Media at MIT and an associate professor in the Practice at MIT Media Lab. He is the author of Rewire: Digital Cosmopolitans in the Age of Connection.


text:
HomeNewsTemple community welcomes Hart at inauguration
Temple community welcomes Hart at inauguration
var uslide_show_id = "d2ee6817-06fd-4587-b1a7-c3e3a0a5c597";var slideshowwidth = "468";var linktext = "Click here to open our slideshow"; President Ann Weaver Hart was officially installed as Temple's ninth president today. More than 130 delegates from universities, academic societies
22 March 2007 News
var uslide_show_id = "d2ee6817-06fd-4587-b1a7-c3e3a0a5c597";var slideshowwidth = "468";var linktext = "Click here to open our slideshow";
President Ann Weaver Hart was officially installed as Temple's ninth president today.
More than 130 delegates from universities, academic societies and professional organizations throughout the country attended the inauguration in the Liacouras Center.
In her remarks, Temple's first woman president announced that Dr. Lisa Staiano-Coico will become Temple's new provost July 1. Staiano-Coico is the Dean of the College of Human Ecology at Cornell University. The announcement comes six months after the search for a new provost began.
Temple is the first college in Philadelphia to have women in the president and provost positions simultaneously, said Daniel H. Polett, chair of the Board of Trustees.
Hart outlined the goals she hopes to accomplish throughout her presidency and asked the Temple community "to be more active partners in shaping Temple's future."
Hart also discussed Temple's actions to create an environmentally responsible campus.
"Temple will be a full partner in developing innovative ways to practice and demonstrate environmental citizenship," she said.
Hart also appealed to Temple's trustees, neighbors, alumni and friends to "do more" through philanthropy. Temple cannot continuously rely on state funding and tuition, mostly because 76 percent of undergraduates "demonstrate serious financial need in order to pay that tuition," she said. "This is a challenge, particularly since Temple does not enjoy the large endowment incomes of other institutions, nor their long traditions of private giving by alumni and friends," she said. "We must create that tradition now."
To encourage students to study abroad, Hart announced that she and her husband will start a fund through the Office of International Programs to pay for the passports of first-time buyers.
"I am so convinced that this experience is essential to your education that my husband Randy and I will pay your passport fee," she said.
The ceremony featured many guest speakers representing the university's different schools and departments. Polett, chairman of the Board of Trustees, officially began the inauguration.
"Under her leadership, I am confident Temple will continue to thrive as one of the leading universities in the nation," Polett said. "We look forward to continuing the achievements of this university … under the leadership of President Hart."
Temple alumna and writer Sonia Sanchez, a former English professor, recited her poem, "For Interdependence Day". Temple Student Government Vice President of Academic Affairs Priya Patel and graduate student Ruth Marie Garcia spoke on behalf of the student body.
"We look forward to working with you as you lead this already-great institution to even greater heights," Patel said to Hart.
Dr. Jane Evans, president of the Faculty Senate, said Hart's experiences in other leadership positions has given her a sensitivity to diversity and the "ability to establish a sense of community" among the staff.
Enthusiastic staff members at Temple, represented by Facilities Management Supervisor Rodney Timmons, thanked Hart for creating an "atmosphere of excellence."
"We the staff welcome you, we the staff encourage you and we the staff applaud you," Timmons said.
Hart also received warm welcomes and congratulations in the form of videos from student and faculty from Temple's international programs in London, Rome and Tokyo.
As part of the inauguration process, Hart received the original charter of the university. Chancellor Peter J. Liacouras, former president of Temple, passed the mace – a ceremonial staff – to Hart. She also received a specially-designed medallion which represents Temple "in its entirety," Polett said.
Former President Marvin Wachman was scheduled to take part in the investiture, but could not travel due to health reasons, said Director of Communications Ray Betzner.
The inauguration celebration continues tomorrow with "Great Universities, Great Cities: A Day of Conversation at Temple University." A day of poetry, art and educational exhibits and discussions will be held throughout campus.
Hart received multiple standing ovations throughout the ceremony. She stressed the importance of providing educational access to students around the world and a sense of community to the surrounding neighborhoods.
"Temple is Philadelphia's university. Temple is the world's university," she said. "Our hearts as well as our heads will be dedicated to its future."
Chris Stover can be reached at chris.stover@temple.edu.
Q & A: Terrence Howard

redpajama_set_name: RedPajamaCommonCrawl


WHERE DID DOODLE SOUP BEGIN?
It is unclear as to the origin of "doodle soup" but is thought to date back as early as the 1800s when it was served to the soldiers in the Civil War. Some believe the name may have been derived from the "doodle wagons" that traveled through West Tennessee selling a variety of goods.
Today, there are many variations of the soup. In the late 1970s and early 1980s, the Bradford Chamber of Commerce designated Mrs. Vivian Pierce's version of the soup as the official recipe of the Doodle Soup Festival during celebrations of that time.
Doodle Soup Days is an annual event held in Bradford, Tennessee. The town became known for its "doodle soup" in 1957 and was tagged as "Doodle Soup Capital of the World" after a reporter asked the school principal what made Bradford famous.
Doodle soup gained recognition in the 1970s in Bradford when Millard R. Hampton would cook large vats of his special recipe soup and his fellow Lions Club members transported and sold the soup at the City Park. It became a huge success and the Doodle Soup Festival was born.
The first official Bradford Doodle Soup Festival was held on July 20, 1980. Over 30 gallons of doodle soup along with broiled chicken, barbecue, sauce, crackers, and biscuits. Main attractions still include a parade, singings, cake walk and, of course, the serving of doodle soup.
For most of the 1990s, the festival was discontinued, but never forgotten. In 2000, the Bradford Lions and Lioness Clubs reestablished the festival as Bradford Doodle Soup Days and organized the event until 2014. In 2015, a newly formed committee took over the festival after many of the founding Lions Club members passed away. Visit our Contact Us page to connect with a committee member if you have a question or inquiring about a specific event.


McCarthy, who headed the EPA's air and radiation office during President Obama's first term, has played a key role in the administration's efforts to address global warming as well as curb traditional pollutants such as soot and mercury. Environmentalists see her as a key ally in efforts to limit greenhouse gas emissions from power plants over the next few years, but she has also won praise from business officials who view her as open to compromise.
Appointed by President Obama in 2009 as assistant administrator for EPA's Office of Air and Radiation, McCarthy has been a leading advocate for common-sense strategies to protect public health and the environment.


text:
Students among 11 killed in school shooting in Russia – reports
At least 11 people including students have been killed and several injured in a shooting at a school in southwest Russia, according to reports.
The RIA news agency said a blast was heard at the school in the city of Kazan and a teenage gunman has been detained.
Footage posted on social media showed a large crowd outside the school after the premises had been evacuated, and emergency services including police officers and paramedics at the scene, it reported.
Around 20 ambulances were sent to the site, with local officials also turning up, Ria added.
Interfax news agency cited a source as saying that there were two attackers and the second could still be in the building.
A witness told TASS news agency there was an explosion before the attack was carried out.
A teacher is believed to be among the dead, it reported, while some students were seen jumping out of the windows to escape the shooting.


Build your dream home on world-class Salishan Golf Course. Beautiful golf course frontage lot with expansive green fairway views. Buyer's choice of Mascord. Com home plan included in sale (example shown)*. Enjoy the many amenities of highly desirable Salishan Hills: privacy, golf, tennis, nature trails, Salishan Resort, and access to miles of beach on Salishan Spit. Visit Salishanhills. Org for HOA and CCandR information. Seller has an innactive real estate license. Buyer to confirm utilites with county and do own due diligence. *note: modification, engineering, and permits not included with home plan.
Directions Highway 101, go east on Salishan Hills Dr. Left at Y and up to gate, after gate turn right and follow Fairway Drive to 552, lot is on right. Contact Listing agent for gate access.


Should we coach young sprint hurdlers to lead with one side only?
I find a lot of young athletes are being told to lead with the same leg over every hurdle in a sprint hurdles race. I presume that this is what people see advanced sprint hurdlers do.
Very good sprint hurdlers will lead with the same leg over every hurdle. This is because these athletes take three strides between the hurdles.
In other words, once the athlete puts the foot of their lead leg down on the track after clearing a hurdle, they will then take three running strides before leading over the next hurdle with the same leg. This will occur over every hurdle.
People see good hurdlers doing this and assume this is what beginners should be taught. But trying to emulate elite athletes is not always suitable for beginners and may even be detrimental to them.
Trying to emulate elite athletes is not always suitable for beginners.
For example, in the 60m hurdles, the Little Athletics Australia standards see the hurdles seven metres apart. For an Under 9 athlete, the hurdles are 45cm high.
It is very rare that an Under 9 athlete can take three strides between hurdles that are seven metres apart. Most youngsters at this age are able to take five strides which will see them lead with the same leg; but some can take four strides, which means that they will have to alternate lead legs.
If an athlete who has the ability to take four strides is being told that they should lead with the same leg, they will most likely add an extra stride in between the hurdles to achieve this. i.e. Take five strides.
Adding the additional stride will probably result in the athlete slowing down, hesitating or taking stutter steps between the hurdles.
My opinion is that coaches of young athletes should not insist that young athletes lead with the same leg. Simply teach them to run without hesitating or slowing down and to lead with whichever leg happens be in the position to do so when they reach the hurdle.
Don't insist that young athletes lead with the same leg.
Therefore, we need to teach young athletes to hurdle with both sides of the body. Not only will this teach them the very important concept of running without slowing, it will promote a balanced physical development and is vital for any circular hurdling that they may later participate in – which often requires a switching of lead legs.
Do you agree? What is your experience with this issue? Do you have another viewpoint or anything to add? Let me know by leaving a reply/comment or by contacting me using the details below.
This post is very relevant to our situation.
My daughter is in the under 9's and and the hurdle specs are as described in this post.
She's quite a good hurdler but one issue I notice is that she's hurdling too high.
However, upon review of her action on video, I can see that this is happening because she is getting cramped for room and taking off from what I would consider too close to the hurdle and this sends her on a slightly upward trajectory as the lead leg gets cramped for room.
I've noticed that her strides, (4 steps), between hurdles get a bit choppy to fit them in.
The form on her first hurdle is very good as she has more room to get into a more appropriate take off position.
Do you think it would be worth trying to stretch her strides out to 3 steps?
My only concern here is that she may end up overstriding and may actually become slower this way. Or, it may oscillate between 3 and 4 steps because of how deep the landing point is into the next flight.
I'm ok with the 4 slightly shorter than normal stride lengths between hurdles as the stride frequency naturally increases slightly, but I don't like that she is getting cramped for room when taking off for the next hurdle and causing unnecessary height and air time.
Do you have any thoughts on the best approach here?


Music Together is an early childhood music and movement program for children from birth through age 4—and the grownups who love them. First offered to the public in 1987, it pioneered the concept of a research-based, developmentally appropriate early childhood music curriculum that strongly emphasizes and facilitates adult involvement.
Music is a universal language.
"Hello Song" ©1987, "Obwisana" ©2000, "This Train" ©1988, and "Biddy Biddy" ©1988. All songs copyrighted Music Together LLC. All rights reserved. Sound clips used by permission of the copyright holder.
Copyright © 2011 Music Together in the Keys. All rights reserved.


text:
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @constructor
 * @extends {WebInspector.VBox}
 */
WebInspector.DeviceModeView = function()
{
    WebInspector.VBox.call(this, true);
    this.setMinimumSize(150, 150);
    this.element.classList.add("device-mode-view");
    this.registerRequiredCSS("emulation/deviceModeView.css");
    WebInspector.Tooltip.addNativeOverrideContainer(this.contentElement);

    this._model = new WebInspector.DeviceModeModel(this._updateUI.bind(this));
    this._mediaInspector = new WebInspector.MediaQueryInspector(() => this._model.appliedDeviceSize().width, this._model.setWidth.bind(this._model));
    // TODO(dgozman): remove CountUpdated event.
    this._showMediaInspectorSetting = WebInspector.settings.createSetting("showMediaQueryInspector", false);
    this._showMediaInspectorSetting.addChangeListener(this._updateUI, this);
    this._showRulersSetting = WebInspector.settings.createSetting("emulation.showRulers", false);
    this._showRulersSetting.addChangeListener(this._updateUI, this);

    this._topRuler = new WebInspector.DeviceModeView.Ruler(true, this._model.setWidthAndScaleToFit.bind(this._model));
    this._topRuler.element.classList.add("device-mode-ruler-top");
    this._leftRuler = new WebInspector.DeviceModeView.Ruler(false, this._model.setHeightAndScaleToFit.bind(this._model));
    this._leftRuler.element.classList.add("device-mode-ruler-left");
    this._createUI();
    WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged, this._zoomChanged, this);
};

WebInspector.DeviceModeView.prototype = {
    _createUI: function()
    {
        this._toolbar = new WebInspector.DeviceModeToolbar(this._model, this._showMediaInspectorSetting, this._showRulersSetting);
        this.contentElement.appendChild(this._toolbar.element());

        this._contentClip = this.contentElement.createChild("div", "device-mode-content-clip vbox");
        this._responsivePresetsContainer = this._contentClip.createChild("div", "device-mode-presets-container");
        this._populatePresetsContainer();
        this._mediaInspectorContainer = this._contentClip.createChild("div", "device-mode-media-container");
        this._contentArea = this._contentClip.createChild("div", "device-mode-content-area");

        this._screenArea = this._contentArea.createChild("div", "device-mode-screen-area");
        this._screenImage = this._screenArea.createChild("img", "device-mode-screen-image hidden");
        this._screenImage.addEventListener("load", this._onScreenImageLoaded.bind(this, true), false);
        this._screenImage.addEventListener("error", this._onScreenImageLoaded.bind(this, false), false);

        this._bottomRightResizerElement = this._screenArea.createChild("div", "device-mode-resizer device-mode-bottom-right-resizer");
        this._bottomRightResizerElement.createChild("div", "");
        this._createResizer(this._bottomRightResizerElement, 2, 1);

        this._bottomLeftResizerElement = this._screenArea.createChild("div", "device-mode-resizer device-mode-bottom-left-resizer");
        this._bottomLeftResizerElement.createChild("div", "");
        this._createResizer(this._bottomLeftResizerElement, -2, 1);

        this._rightResizerElement = this._screenArea.createChild("div", "device-mode-resizer device-mode-right-resizer");
        this._rightResizerElement.createChild("div", "");
        this._createResizer(this._rightResizerElement, 2, 0);

        this._leftResizerElement = this._screenArea.createChild("div", "device-mode-resizer device-mode-left-resizer");
        this._leftResizerElement.createChild("div", "");
        this._createResizer(this._leftResizerElement, -2, 0);

        this._bottomResizerElement = this._screenArea.createChild("div", "device-mode-resizer device-mode-bottom-resizer");
        this._bottomResizerElement.createChild("div", "");
        this._createResizer(this._bottomResizerElement, 0, 1);
        this._bottomResizerElement.addEventListener("dblclick", this._model.setHeight.bind(this._model, 0), false);
        this._bottomResizerElement.title = WebInspector.UIString("Double-click for full height");

        this._pageArea = this._screenArea.createChild("div", "device-mode-page-area");
        this._pageArea.createChild("content");
    },

    _populatePresetsContainer: function()
    {
        var sizes = [320, 375, 425, 768, 1024, 1440, 2560];
        var titles = [WebInspector.UIString("Mobile S"),
                      WebInspector.UIString("Mobile M"),
                      WebInspector.UIString("Mobile L"),
                      WebInspector.UIString("Tablet"),
                      WebInspector.UIString("Laptop"),
                      WebInspector.UIString("Laptop L"),
                      WebInspector.UIString("4K")]
        this._presetBlocks = [];
        var inner = this._responsivePresetsContainer.createChild("div", "device-mode-presets-container-inner")
        for (var i = sizes.length - 1; i >= 0; --i) {
            var outer = inner.createChild("div", "fill device-mode-preset-bar-outer");
            var block = outer.createChild("div", "device-mode-preset-bar");
            block.createChild("span").textContent = titles[i] + " \u2013 " + sizes[i] + "px";
            block.addEventListener("click", applySize.bind(this, sizes[i]), false);
            block.__width = sizes[i];
            this._presetBlocks.push(block);
        }

        /**
         * @param {number} width
         * @param {!Event} e
         * @this {WebInspector.DeviceModeView}
         */
        function applySize(width, e)
        {
            this._model.emulate(WebInspector.DeviceModeModel.Type.Responsive, null, null);
            this._model.setSizeAndScaleToFit(width, 0);
            e.consume();
        }
    },

    toggleDeviceMode: function()
    {
        this._toolbar.toggleDeviceMode();
    },

    /**
     * @param {!Element} element
     * @param {number} widthFactor
     * @param {number} heightFactor
     * @return {!WebInspector.ResizerWidget}
     */
    _createResizer: function(element, widthFactor, heightFactor)
    {
        var resizer = new WebInspector.ResizerWidget();
        resizer.addElement(element);
        var cursor = widthFactor ? "ew-resize" : "ns-resize";
        if (widthFactor * heightFactor > 0)
            cursor = "nwse-resize";
        if (widthFactor * heightFactor < 0)
            cursor = "nesw-resize";
        resizer.setCursor(cursor);
        resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeStart, this._onResizeStart, this);
        resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeUpdate, this._onResizeUpdate.bind(this, widthFactor, heightFactor));
        resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeEnd, this._onResizeEnd, this);
        return resizer;
    },

    /**
     * @param {!WebInspector.Event} event
     */
    _onResizeStart: function(event)
    {
        this._slowPositionStart = null;
        /** @type {!Size} */
        this._resizeStart = this._model.screenRect().size();
    },

    /**
     * @param {number} widthFactor
     * @param {number} heightFactor
     * @param {!WebInspector.Event} event
     */
    _onResizeUpdate: function(widthFactor, heightFactor, event)
    {
        if (event.data.shiftKey !== !!this._slowPositionStart)
            this._slowPositionStart = event.data.shiftKey ? {x: event.data.currentX, y: event.data.currentY} : null;

        var cssOffsetX = event.data.currentX - event.data.startX;
        var cssOffsetY = event.data.currentY - event.data.startY;
        if (this._slowPositionStart) {
            cssOffsetX = (event.data.currentX - this._slowPositionStart.x) / 10 + this._slowPositionStart.x - event.data.startX;
            cssOffsetY = (event.data.currentY - this._slowPositionStart.y) / 10 + this._slowPositionStart.y - event.data.startY;
        }

        if (widthFactor) {
            var dipOffsetX = cssOffsetX * WebInspector.zoomManager.zoomFactor();
            var newWidth = this._resizeStart.width + dipOffsetX * widthFactor;
            newWidth = Math.round(newWidth / this._model.scale());
            if (newWidth >= WebInspector.DeviceModeModel.MinDeviceSize && newWidth <= WebInspector.DeviceModeModel.MaxDeviceSize)
                this._model.setWidth(newWidth);
        }

        if (heightFactor) {
            var dipOffsetY = cssOffsetY * WebInspector.zoomManager.zoomFactor();
            var newHeight = this._resizeStart.height + dipOffsetY * heightFactor;
            newHeight = Math.round(newHeight / this._model.scale());
            if (newHeight >= WebInspector.DeviceModeModel.MinDeviceSize && newHeight <= WebInspector.DeviceModeModel.MaxDeviceSize)
                this._model.setHeight(newHeight);
        }
    },

    /**
     * @param {!WebInspector.Event} event
     */
    _onResizeEnd: function(event)
    {
        delete this._resizeStart;
        WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.ResizedViewInResponsiveMode);
    },

    _updateUI: function()
    {
        if (!this.isShowing())
            return;

        var zoomFactor = WebInspector.zoomManager.zoomFactor();
        var callDoResize = false;
        var showRulers = this._showRulersSetting.get() && this._model.type() !== WebInspector.DeviceModeModel.Type.None;
        var contentAreaResized = false;
        var updateRulers = false;

        var cssScreenRect = this._model.screenRect().scale(1 / zoomFactor);
        if (!cssScreenRect.isEqual(this._cachedCssScreenRect)) {
            this._screenArea.style.left = cssScreenRect.left + "px";
            this._screenArea.style.top = cssScreenRect.top + "px";
            this._screenArea.style.width = cssScreenRect.width + "px";
            this._screenArea.style.height = cssScreenRect.height + "px";
            this._leftRuler.element.style.left = cssScreenRect.left + "px";
            updateRulers = true;
            callDoResize = true;
            this._cachedCssScreenRect = cssScreenRect;
        }

        var cssVisiblePageRect = this._model.visiblePageRect().scale(1 / zoomFactor);
        if (!cssVisiblePageRect.isEqual(this._cachedCssVisiblePageRect)) {
            this._pageArea.style.left = cssVisiblePageRect.left + "px";
            this._pageArea.style.top = cssVisiblePageRect.top + "px";
            this._pageArea.style.width = cssVisiblePageRect.width + "px";
            this._pageArea.style.height = cssVisiblePageRect.height + "px";
            callDoResize = true;
            this._cachedCssVisiblePageRect = cssVisiblePageRect;
        }

        var resizable = this._model.type() === WebInspector.DeviceModeModel.Type.Responsive;
        if (resizable !== this._cachedResizable) {
            this._rightResizerElement.classList.toggle("hidden", !resizable);
            this._leftResizerElement.classList.toggle("hidden", !resizable);
            this._bottomResizerElement.classList.toggle("hidden", !resizable);
            this._bottomRightResizerElement.classList.toggle("hidden", !resizable);
            this._bottomLeftResizerElement.classList.toggle("hidden", !resizable);
            this._cachedResizable = resizable;
        }

        var mediaInspectorVisible = this._showMediaInspectorSetting.get() && this._model.type() !== WebInspector.DeviceModeModel.Type.None;
        if (mediaInspectorVisible !== this._cachedMediaInspectorVisible) {
            if (mediaInspectorVisible)
                this._mediaInspector.show(this._mediaInspectorContainer);
            else
                this._mediaInspector.detach();
            contentAreaResized = true;
            callDoResize = true;
            this._cachedMediaInspectorVisible = mediaInspectorVisible;
        }

        if (showRulers !== this._cachedShowRulers) {
            this._contentClip.classList.toggle("device-mode-rulers-visible", showRulers);
            if (showRulers) {
                this._topRuler.show(this._contentClip, this._contentArea);
                this._leftRuler.show(this._contentArea);
            } else {
                this._topRuler.detach();
                this._leftRuler.detach();
            }
            contentAreaResized = true;
            callDoResize = true;
            this._cachedShowRulers = showRulers;
        }

        if (this._model.scale() !== this._cachedScale) {
            updateRulers = true;
            callDoResize = true;
            for (var block of this._presetBlocks)
                block.style.width = block.__width * this._model.scale() + "px";
            this._cachedScale = this._model.scale();
        }

        this._toolbar.update();
        this._loadScreenImage(this._model.screenImage());
        this._mediaInspector.setAxisTransform(this._model.scale());
        if (callDoResize)
            this.doResize();
        if (updateRulers) {
            this._topRuler.render(this._cachedCssScreenRect ? this._cachedCssScreenRect.left : 0, this._model.scale());
            this._leftRuler.render(0, this._model.scale());
        }
        if (contentAreaResized)
            this._contentAreaResized();
    },

    /**
     * @param {string} srcset
     */
    _loadScreenImage: function(srcset)
    {
        if (this._screenImage.getAttribute("srcset") === srcset)
            return;
        this._screenImage.setAttribute("srcset", srcset);
        if (!srcset)
            this._screenImage.classList.toggle("hidden", true);
    },

    /**
     * @param {boolean} success
     */
    _onScreenImageLoaded: function(success)
    {
        this._screenImage.classList.toggle("hidden", !success);
    },

    _contentAreaResized: function()
    {
        var zoomFactor = WebInspector.zoomManager.zoomFactor();
        var rect = this._contentArea.getBoundingClientRect();
        var availableSize = new Size(Math.max(rect.width * zoomFactor, 1), Math.max(rect.height * zoomFactor, 1));
        var preferredSize = new Size(Math.max((rect.width - 2 * this._handleWidth) * zoomFactor, 1), Math.max((rect.height - this._handleHeight) * zoomFactor, 1));
        this._model.setAvailableSize(availableSize, preferredSize);
    },

    _measureHandles: function()
    {
        var hidden = this._rightResizerElement.classList.contains("hidden");
        this._rightResizerElement.classList.toggle("hidden", false);
        this._bottomResizerElement.classList.toggle("hidden", false);
        this._handleWidth = this._rightResizerElement.offsetWidth;
        this._handleHeight = this._bottomResizerElement.offsetHeight;
        this._rightResizerElement.classList.toggle("hidden", hidden);
        this._bottomResizerElement.classList.toggle("hidden", hidden);
    },

    _zoomChanged: function()
    {
        delete this._handleWidth;
        delete this._handleHeight;
        if (this.isShowing()) {
            this._measureHandles();
            this._contentAreaResized();
        }
    },

    /**
     * @override
     */
    onResize: function()
    {
        if (this.isShowing())
            this._contentAreaResized();
    },

    /**
     * @override
     */
    wasShown: function()
    {
        this._measureHandles();
        this._toolbar.restore();
    },

    /**
     * @override
     */
    willHide: function()
    {
        this._model.emulate(WebInspector.DeviceModeModel.Type.None, null, null);
    },

    __proto__: WebInspector.VBox.prototype
}

/**
 * @constructor
 * @extends {WebInspector.VBox}
 * @param {boolean} horizontal
 * @param {function(number)} applyCallback
 */
WebInspector.DeviceModeView.Ruler = function(horizontal, applyCallback)
{
    WebInspector.VBox.call(this);
    this._contentElement = this.element.createChild("div", "device-mode-ruler flex-auto");
    this._horizontal = horizontal;
    this._scale = 1;
    this._offset = 0;
    this._count = 0;
    this._throttler = new WebInspector.Throttler(0);
    this._applyCallback = applyCallback;
}

WebInspector.DeviceModeView.Ruler.prototype = {
    /**
     * @param {number} offset
     * @param {number} scale
     */
    render: function(offset, scale)
    {
        this._scale = scale;
        this._offset = offset;
        if (this._horizontal)
            this.element.style.paddingLeft = this._offset + "px";
        else
            this.element.style.paddingTop = this._offset + "px";
        this._throttler.schedule(this._update.bind(this));
    },

    /**
     * @override
     */
    onResize: function()
    {
        this._throttler.schedule(this._update.bind(this));
    },

    /**
     * @return {!Promise.<?>}
     */
    _update: function()
    {
        var zoomFactor = WebInspector.zoomManager.zoomFactor();
        var size = this._horizontal ? this._contentElement.offsetWidth : this._contentElement.offsetHeight;

        if (this._scale !== this._renderedScale || zoomFactor !== this._renderedZoomFactor) {
            this._contentElement.removeChildren();
            this._count = 0;
            this._renderedScale = this._scale;
            this._renderedZoomFactor = zoomFactor;
        }

        var dipSize = size * zoomFactor / this._scale;
        var count = Math.ceil(dipSize / 5);
        var step = 1;
        if (this._scale < 0.8)
            step = 2;
        if (this._scale < 0.6)
            step = 4;
        if (this._scale < 0.4)
            step = 8;

        for (var i = count; i < this._count; i++) {
            if (!(i % step))
                this._contentElement.lastChild.remove();
        }

        for (var i = this._count; i < count; i++) {
            if (i % step)
                continue;
            var marker = this._contentElement.createChild("div", "device-mode-ruler-marker");
            if (i) {
                if (this._horizontal)
                    marker.style.left = (5 * i) * this._scale / zoomFactor + "px";
                else
                    marker.style.top = (5 * i) * this._scale / zoomFactor + "px";
                if (!(i % 20)) {
                    var text = marker.createChild("div", "device-mode-ruler-text");
                    text.textContent = i * 5;
                    text.addEventListener("click", this._onMarkerClick.bind(this, i * 5), false);
                }
            }
            if (!(i % 10))
                marker.classList.add("device-mode-ruler-marker-large");
            else if (!(i % 5))
                marker.classList.add("device-mode-ruler-marker-medium");
        }

        this._count = count;
        return Promise.resolve();
    },

    /**
     * @param {number} size
     */
    _onMarkerClick: function(size)
    {
        this._applyCallback.call(null, size);
    },

    __proto__: WebInspector.VBox.prototype
}

redpajama_set_name: RedPajamaGithub


Inspired by Billy Barrett's 'Edinburgh Fringe Bingo', I feel compelled to share a new game with you. Here are some of my personal bugbears that I find cropping up time and time again in reviews of circus productions.
First to a full-house wins!
'Makes you want to run away with the circus' – You may be right, but the phrase crops up with such regularity that it's become an irritating cliché. And remember, you can only speak for yourself. You can't tell if it'll make US want to run away with the circus.
'Indescribable' – Lazy lazy lazy. It might be difficult if you've never seen this sort of work before, but if you're going to the effort of writing the review, the least you can do is try to explain what you saw. A little research wouldn't hurt either.
Physical skills focus – Sound and design elements are a part of the show too. How do they impact on your total experience?
'Achieving the impossible' – Yes, that's an oxymoronic statement.
'No scary clowns' – If 'No scary clowns' is becoming a critical cliché, then surely people should stop expecting them and referencing them? We no longer expect troupes of 30 polar bears either, but critics don't feel the need to note their absence! And again, your fears are unlikely to be the same as those of your readers, so do try and be clear about what you mean.
Reference to writer's own fitness levels – Is this really relevant? Please.
'Unbelievable' – You honestly didn't believe what you were seeing?
'Defying Gravity' – No, it's not Wicked. No-one really defies gravity. Circus artists work with it, and their muscular control, in a very specific way to do things most of us haven't the patience, tenacity or pain thresholds for.
'Mind-blowing' – If they're all 'mind-blowing', great, but how do we gain any sense of perspective? Watch the accuracy and relativity of superlatives.
'A performer' (no credits) – If someone tried to review a ballet company and referred to the stars as 'a dancer', or 'a female dancer' (no, I'm not sure why we need the distinction either) someone would be up in arms that the principles weren't getting their due. Same here. It's not always easy to find names, but that's our job.
'Doing things that most of us can only dream of' – Would be more apt to say, 'Doing things that most of us WILL only dream of'. The thing about dreams is that you generally need will and dedication to make them happen. Then you too could be up in the air or throwing things and people around.
Comparison to Cirque Du Soleil – Does every theatre company get compared to the RSC? No! Don't do it, unless there's a very specific reason.
'Unique' – A lot of people haven't seen a lot of circus. So something that seems unique to you may not actually be so. Research can help here too.
Generic categories for disciplines – If it's juggling, what sort of juggling? Contact, bounce, toss… What props were used? If it's aerial, what equipment? There's a lot of variety out there… Possibly my least favourite phrase of all time is 'all the usual circus stuff'.
What it's not – I'd rather hear about what it IS.
I love it when I find new people writing about circus, so hope this can be a bit of encouraging fun rather than a damning blow. And remember, be honest in your subjectivity. One reviewer can never speak for the world, or know all there is to know, so don't attempt to write like you do!
Tagged as Arts, arts journalism, bingo, Circus, cliche, criticism, critique, culture, Performing Arts, review, writing.
Also the constant mentions of 'physical theatre' or 'physical comedy'.
Good to note, cheers Jon! Probably fallen foul of the 'physical comedy' one myself before now; thinking about it, I guess the difficulty is with the non-specific nature of the term instead of detailing the how/what/why of performance that would be more useful?
Actually in here in Sweden I have been seeing some posters starting with "Forget sad animals in cages…" When announcing for Cirkus Cirkör. Usually this lack of animals is used to decribe contemporary circus here.