text:
People promising to take action on climate change
Send a Video
Help Writing Message
Immersive Installation Now Open on Governors Island, NYC
A new installation by the climate storytelling project DearTomorrow opened on September 21 on Governors Island in New York City. The installation, titled "DearTomorrow: A Promise to the Future," presents fifty letters about climate change written by people from around the world to people they love living in the future.
Written between 2015 and 2019, the letters were selected by DearTomorrow co-founder and director Jill Kubit along with co-curators Korinna Knapp and Geof Victory. The letters are written to children, families, and future selves, and come from across the US and around the world, from California and Tennessee to Oman and Australia.
Visual artist Tara DePorte and sound artist Lemon Guo collaborated with Kubit to bring the digital collection to life. The letters are collaged and screen-printed onto sheer, billowing cotton, scattered in loose sheets of paper, and plastered across the walls, immersing viewers in the hopes, fears, and passions of the letter-writers as they grapple with the present and future effects of climate change and commit to take action. Excerpts from thirty-three of the letters are read aloud by their authors and presented as a 45-minute looped audio recording.
The letters testify to the broad range of personal responses to climate change, but coalesce around six themes: current and future impacts of climate change, feelings of regret, the value of nature, the power of legacy, love and action. The stairway leading to the letters showcases 20 images of people committing to take climate action in their own lives.
Visitors are invited to contribute their own message to the installation and to DearTomorrow's permanent digital archive.
"DearTomorrow: A Promise to the Future" is located at the House of Solutions, a collaboration between the Human Impacts Institute and the Climate Reality Project NYC Metro Region Chapter, at Nolan Park House 4B, 2nd Floor on Governors Island in New York Harbor, accessible by ferry from Brooklyn or Manhattan. The installation will be viewable on Saturdays and Sundays from 11 AM to 5 PM through October 20th.
DearTomorrow project concept by Jill Kubit and Trisha Shrum
Installation by Tara DePorte (visual) and Lemon Guo (audio)
Letters curation by Jill Kubit, Korinna Knapp, and Geof Victory
Photos by Elizabeth Cole, Kirsi Jansa, Jill Kubit, Trisha Shrum, Creatives4Climate Pittsburgh team, and Drawdown Marin team
Photos curation by Jill Kubit and Mustafa Önder
A very special thank you to Michelle Altman, Sofia Ibarra, and Elle Pak for donating their time and talent this exhibit, and to the Human Impacts Institute and Climate Reality NYC chapter for providing space through the House of Solution's Artist in Residency Program.
DearTomorrow is a digital and archive project for people to personally connect with the issue of climate change, to commit to taking stronger action and to share these stories with friends, family and their social networks.
The DearTomorrow project is made possible by financial support from the KR Foundation, individual donors and crowdfunding.
To see the full collection of 1500+ submissions from more than 50 countries and to write your own, please visit deartomorrow.org. To schedule an interview, please contact Jill Kubit at jill@deartomorrow.org.
Follow DearTomorrow on social: @deartomorrow (FB and IG) @deartmrw (Twitter) #deartomorrow
Photo credit: Mustafa Önder. High resolution photos available upon request.
Posted in Press
Previous: Reuters
Next: NPR Life
© 2018 by DearTomorrow
DearTomorrow is a fiscally sponsored program of United Charitable, a registered 501(c)(3) public charity.
Privacy Policy, State Fundraising and Disclosure Statement, and Nondiscrimination Policy
DearTomorrow


Since Aaron Gordon wowed us all with his jaw-dropping, gravity-defying dunks during February's NBA Slam Dunk Contest, most just expect him to continue jumping to the highest apex imaginable for our entertainment. Since we didn't see his team Orlando Magic in the playoffs, and now that the NBA Finals and Draft have past, "Air Gordon" still left us with a viral treat to share.
This isn't a ESPN Sports Science episode-like physics breakdown by any means, but let's just say that it takes damn near perfect rotation on the release for the ball to bounce back towards you away after precisely swishing it through the hoop. Let alone windmilling a dunk off one bounce to the ground after it goes through the hole from half-court. For those who can't get up this high, maybe try the half-court shot at least. If you want to do the second half of the challenge, make sure you have a trampoline handy because this is way hard. Good luck!


A thousand tears have fallen today... maybe more.
Memories flood along with them, and a soft smile sneaks in.
And just as I think that beauty might not be found today, it is.
I nod to thank Him for a sliver of peace in the valley... but I am not quite ready to have a conversation of words. For now I ask that He just hold on to me... in the quiet.
Prayers for you, sweet friend. Praying that you will feel God's gentle, loving touch on you life as you deal with your grief.
I pray that over time, more and more smiles creep in.


, we picks the top collections along with ideal image resolution only for you, and this photos is actually one among pictures libraries in this finest images gallery with regards to Best Of Modern Chandeliers for Dining Room. I hope you will like it.
placed by Eric Alvarez on 2019-04-14 14:14:17. To view almost all graphics in Best Of Modern Chandeliers for Dining Room photos gallery remember to adhere to this particular hyperlink.


text:
<?php
// Exit if accessed directly
if ( !defined( 'ABSPATH' ) ) exit;

class IntelliWidgetAdmin {

    var $form;
    var $menus;
    var $terms;
    var $templates;
    var $post_types;
    var $intelliwidgets;
    var $objecttype;
    var $tax_menu;
    var $metabox;       // backwards compatability
    var $post_admin;    // backwards compatability

    function iw() {
        return IntelliWidget::$instance;
    }
    /**
     * Configures the admin object for this request
     */
    function admin_init( $objecttype = '', $idfield = '' ) {
        // this property tells IW how to set/get options ( post uses post_meta, others use options table )
        $this->objecttype       = $objecttype;
        // cache post types
        $this->post_types       = $this->get_eligible_post_types();
        // cache menus
        $this->menus            = $this->get_nav_menus();
        // cache templates
        $this->templates        = $this->get_widget_templates();
        // cache intelliwidgets
        $this->intelliwidgets   = $this->get_intelliwidgets();
        // enqueue JS and CSS
        $this->admin_scripts( $idfield );
        // backward compatibility support for multi post ( pro ) < 1.1.0
        if ( 'IntelliWidgetMultiPostAdmin' == get_class( $this ) ):
            $this->post_admin = new IntelliWidgetPostAdmin();
        endif;
    }

    /**
     * Output scripts to the admin.
     */
    function admin_scripts( $idfield ) {
        if ( !wp_script_is( 'intelliwidget-js', 'enqueued' ) ): // prevent multiple initialization by other plugins
            wp_enqueue_style( 'intelliwidget-js', trailingslashit( INTELLIWIDGET_URL ) . 'templates/intelliwidget-admin.min.css', array(), INTELLIWIDGET_VERSION );
            wp_enqueue_script( 'intelliwidget-js', trailingslashit( INTELLIWIDGET_URL ) . 'js/intelliwidget.min.js', array( 'jquery-ui-tabs' ), INTELLIWIDGET_VERSION, FALSE );
            wp_localize_script( 'intelliwidget-js', 'IWAjax', array(
                'ajaxurl'   => admin_url( 'admin-ajax.php' ),
                'objtype'   => $this->objecttype,
                'idfield'   => $idfield,
            ) );
        endif;
    }

    function save_data( $id ) {
        // reset the data array
        $post_data = array();
        $prefix    = 'intelliwidget_';
        // since we can now save a single meta box via ajax post,
        // we need to manipulate the existing boxmap
        $box_map = $this->iw()->get_box_map( $id, $this->objecttype );
        // allow customization of input fields
        /***
         * Here is some perlesque string handling. Using grep gives us a subset of relevant data fields
         * quickly. We then iterate through the fields, parsing out the actual data field name and the
         * box_id from the input key.
         */
        foreach( preg_grep( '#^' . $prefix . '#', array_keys( $_POST ) ) as $field ):
            // find the box id and field name in the post key with a perl regex
            preg_match( '#^' . $prefix . '(preview|\d+)_(\d+)_([\w\-]+)$#', $field, $matches );
            if ( count( $matches ) ):
                if ( !( $id == $matches[ 1 ] ) || !( $box_id = $matches[ 2 ] ) ) continue;
                $name      = $matches[ 3 ];
            else:
                continue;
            endif;
            // organize this into a 2-dimensional array for later
            // raw html parser/cleaner-upper: see WP docs re: KSES
            if ( in_array( $name, IntelliWidgetStrings::get_fields( 'text' ) ) ):
                if ( current_user_can( 'unfiltered_html' ) ):
                    $post_data[ $box_id ][ $name ] = $_POST[ $field ];
                else:
                    $post_data[ $box_id ][ $name ] = stripslashes( wp_filter_post_kses( addslashes( $_POST[ $field ] ) ) );
                endif;
            else:
                $post_data[ $box_id ][ $name ] = $this->filter_sanitize_input( $_POST[ $field ] );
            endif;
        endforeach;
        // track meta boxes updated
        $boxcounter = 0;
        // additional processing for each box data segment
        foreach ( $post_data as $box_id => $new_instance ):
            // get current values
            $old_instance = $this->iw()->get_meta( $id, '_intelliwidget_data_', $this->objecttype, $box_id );
            foreach ( $new_instance as $name => $value ):
                $old_instance[ $name ] = $value;
                // make sure at least one post type exists
                if ( 'post_types' == $name && empty( $new_instance[ $name ] ) )
                    $old_instance[ 'post_types' ] = array( 'post' );
                if ( 'replace_widget' == $name ) $box_map[ $box_id ] = $new_instance[ 'replace_widget' ];
                // handle multi selects that may not be passed or may just be empty
                if ( 'page_multi' == $name && empty( $new_instance[ 'page' ] ) )
                    $old_instance[ 'page' ] = array();
                if ( 'terms_multi' == $name && empty( $new_instance[ 'terms' ] ) )
                    $old_instance[ 'terms' ] = array();
            endforeach;
            // special handling for checkboxes:
            foreach( IntelliWidgetStrings::get_fields( 'checkbox' ) as $name )
                $old_instance[ $name ] = isset( $new_instance[ $name ] );
            if ( isset( $old_instance[ 'custom_text' ] ) ) $old_instance[ 'custom_text' ] = base64_encode( $old_instance[ 'custom_text' ] );
            // update query cache // do not use for now (2.3.4)
            // $iwq = new IntelliWidgetQuery();
            // $old_instance[ 'querystr' ] = $iwq->iw_query( $old_instance );
            // save new data
            $this->update_meta( $id, '_intelliwidget_data_', $old_instance, $box_id );
            // increment box counter
            $boxcounter++;
        endforeach;
        if ( $boxcounter )
            // if we have updates, save new map
            $this->update_meta( $id, '_intelliwidget_', $box_map, 'map' );
    }

    function save_copy_id( $id ) {
        $copy_id = isset( $_POST[ 'intelliwidget_widget_page_id' ] ) ? intval( $_POST[ 'intelliwidget_widget_page_id' ] ) : NULL;
        if ( isset( $copy_id ) )
            $this->update_meta( $id, '_intelliwidget_', $copy_id, 'widget_page_id' );
    }

    function validate_post( $action, $noncefield, $capability, $is_ajax = FALSE, $post_id = NULL, $get = FALSE ) {

        return ( ( $get ? 'GET' : 'POST' ) == $_SERVER[ 'REQUEST_METHOD' ]
            && ( $is_ajax ? check_ajax_referer( $action, $noncefield, FALSE ) : check_admin_referer( $action, $noncefield, FALSE ) )
            && current_user_can( $capability, $post_id )
            );
    }

    function get_nonce_url( $id, $action, $box_id = NULL ) {
        global $pagenow;
        $val = 'delete' == $action ? $box_id : 1;
        return wp_nonce_url( admin_url( $pagenow . '?iw' . $action . '=' . $val . '&objid=' . $id ), 'iw' . $action );
    }

    function get_intelliwidgets() {
        global $wp_registered_sidebars;
        $widgets = array();
        foreach ( IntelliWidgetStrings::get_menu( 'replaces' ) as $value => $label ):
            $widgets[ $value ] = $label;
        endforeach;
        foreach( wp_get_sidebars_widgets() as $sidebar_id => $sidebar_widgets ):
            if ( FALSE === strpos( $sidebar_id, 'wp_inactive' )
                && FALSE === strpos( $sidebar_id, 'orphaned' )
                && is_array( $sidebar_widgets ) ):
                $count = 0;
                foreach ( $sidebar_widgets as $sidebar_widget_id ):
                    if ( FALSE !== strpos( $sidebar_widget_id, 'intelliwidget' ) && isset( $wp_registered_sidebars[ $sidebar_id ] ) ):
                        $widgets[ $sidebar_widget_id ] = $wp_registered_sidebars[ $sidebar_id ][ 'name' ] . ' [' . ++$count . ']';
                    endif;
                endforeach;
            endif;
        endforeach;
        return $widgets;
    }

    /**
     * Get list of posts as select options. Selects all posts of the type( s ) specified in the instance data
     * and returns them as a multi-select menu. To enable filtering, any selected posts must be passed back
     * with the return set.
     */
    function get_posts_list( $instance = NULL, $profiles = FALSE ) {
        $instance[ 'page' ]             = $this->val2array( isset( $instance[ 'page' ] ) ? $instance[ 'page' ] : '' );
        $instance[ 'profiles_only' ]    = $profiles;
        $iwq                            = new IntelliWidgetQuery();
        $posts                          = $iwq->post_list_query( $instance );
    	$output                         = '';
	    if ( ! empty( $posts ) ) {
            $args = array( $posts, 0, $instance );
            $walker = new IntelliWidgetWalker();
	        $output .= call_user_func_array( array( $walker, 'walk' ), $args );
	    }

	    return $output;
    }

    /**
     * All terms are retrieved and cached and then each instance is filtered by the Walker class.
     */
    function get_terms_list( $instance = NULL ) {
    	$output = '';
        $post_types = $this->val2array( isset( $instance[ 'post_types' ] ) ? $instance[ 'post_types' ] : '' );
        $instance[ 'terms' ]   = $this->val2array( isset( $instance[ 'terms' ] ) ? $instance[ 'terms' ] : '' );
        $this->load_terms();
        $terms = array();
        foreach ( $this->val2array( preg_grep( '/post_format/', get_object_taxonomies( $post_types ), PREG_GREP_INVERT ) ) as $tax ):
            if ( isset( $this->terms[ $tax ] ) )
                $terms = array_merge( $terms, $this->terms[ $tax ] );
        endforeach;
	    if ( ! empty( $terms ) ) {
            $args = array( $terms, 0, $instance );
            $walker = new IntelliWidgetWalkerTerms();

	        $output .= call_user_func_array( array( $walker, 'walk' ), $args );
	    }
	    return $output;
    }

    /**
     * Return a list of template files in the theme folder( s ) and plugin folder.
     * Templates actually render the output to the widget based on instance settings
     *
     * @return <array>
     */
    function get_widget_templates() {
        $templates  = array();
        $paths      = array();
        $parentPath = get_template_directory() . '/intelliwidget';
        $themePath  = get_stylesheet_directory() . '/intelliwidget';
        $paths[]    = INTELLIWIDGET_DIR . '/templates/';
        $paths[]    = $parentPath;
        if ( $parentPath != $themePath ) $paths[] = $themePath;
        foreach ( $paths as $path ):
            if ( file_exists( $path ) && ( $handle = opendir( $path ) ) ):
                while ( FALSE !== ( $file = readdir( $handle ) ) ):
                    if ( ! preg_match( "/^\./", $file ) && preg_match( '/\.php$/', $file ) ):
                        $file = str_replace( '.php', '', $file );
                        $name = str_replace( '-', ' ', $file );
                        $templates[ $file ] = ucfirst( $name );
                    endif;
                endwhile;
                closedir( $handle );
            endif;
        endforeach;
        // hook custom actions into templates menu
        $templates = apply_filters( 'intelliwidget_templates', $templates );
        asort( $templates, phpversion() < 5.4 ? NULL : SORT_NATURAL | SORT_FLAG_CASE );
        return $templates;
    }

    function get_eligible_post_types() {
        $eligible = array();
        if ( function_exists( 'get_post_types' ) ):
            $args   = array( 'public' => TRUE );
            $types  = get_post_types( $args );
        else:
            $types  = array( 'post', 'page' );
        endif;
        foreach( $types as $type ):
            if ( post_type_supports( $type, 'custom-fields' ) ):
                $eligible[] = $type;
            endif;
        endforeach;
        return apply_filters( 'intelliwidget_post_types', $eligible );
    }

    function delete_meta( $id, $optionname, $index = NULL ) {
        if ( !empty( $id ) && !empty( $optionname ) ):
            switch( $this->objecttype ):
                case 'post':
                    if ( isset( $index ) ) $optionname .= $index;
                    return delete_post_meta( $id, $optionname );
                default:
                    $optionname = 'intelliwidget_data_' . $this->objecttype . '_' . $id;
                    if ( isset( $index ) && ( $data = get_option( $optionname ) ) ):
                        unset( $data[ $index ] );
                        update_option( $optionname, $data );
                    endif;
            endswitch;
        endif;
    }

    function update_meta( $id, $optionname, $data, $index = NULL ) {
        if ( empty( $id ) || empty( $optionname ) ) return FALSE;
        switch( $this->objecttype ):
            case 'post':
                if ( isset( $index ) ) $optionname .= $index;
                $serialized = maybe_serialize( $data );

                update_post_meta( $id, $optionname, $serialized );
                break;
            default:
                $optionname = 'intelliwidget_data_' . $this->objecttype . '_' . $id;
                if ( isset( $index ) ):
                    if ( !( $option = get_option( $optionname ) ) )
                        $option = array();
                    $option[ $index ] = $data;
                    update_option( $optionname, $option );
                endif;
        endswitch;
    }

    function get_nav_menu() {
        $defaults = IntelliWidgetStrings::get_menu( 'default_nav' );
        return $defaults + $this->menus;
    }

    function get_nav_menus() {
        $nav_menus = array();
        $menus = get_terms( 'nav_menu', array( 'hide_empty' => FALSE ) );
        foreach ( $menus as $menu )
            $nav_menus[ $menu->term_id ] = $menu->name;
        return $nav_menus;
    }

    function get_tax_menu() {
        if ( isset( $this->tax_menu ) ) return $this->tax_menu;
        $this->load_terms();
        $menu = array( '' => __( 'None', 'intelliwidget' ) );
        foreach ( array_keys( $this->terms ) as $name ):
            $taxonomy = get_taxonomy( $name );
            $menu[ $name ] = $taxonomy->label;
        endforeach;
        $this->tax_menu = $menu;
        return $menu;
    }

    /**
     * Stub for data validation
     */
    function filter_sanitize_input( $unclean = NULL ) {
        if ( is_array( $unclean ) ):
            return array_map( array( $this, __FUNCTION__ ), $unclean );
        else:
            return sanitize_text_field( $unclean );
        endif;
    }

    // Backwards compatability: replaces original category value with new term taxonomy id value
    function map_category_to_tax( $category ) {
        $catarr = $this->val2array( $category );
        $tax = array( 'category' );
        if ( !isset( $this->terms ) ) $this->load_terms();
        return array_map( array( $this, 'lookup_term' ), $catarr, $tax );
    }

    function lookup_term( $id, $tax ) {
        foreach( $this->terms[ $tax ] as $term ):
            if ( $term->term_id == $id ) return $term->term_taxonomy_id;
        endforeach;
        return -1;
    }

    function load_terms() {
        // cache all available terms ( Lightweight IW objects )
        if ( isset( $this->terms ) ) return;
        $indexarray = array();
        if ( ( $terms = get_terms( array_intersect(
            preg_grep( '/post_format/', get_object_taxonomies( $this->post_types ), PREG_GREP_INVERT ),
                get_taxonomies( array( 'public' => TRUE, 'query_var' => TRUE ) )
            ), array( 'hide_empty' => FALSE ) ) ) ):
            foreach ( $terms as $object ):
                $indexarray[ $object->taxonomy ][] = $object;
            endforeach;
        endif;
        $this->terms = $indexarray;
    }

    function val2array( $value ) {
        $value = empty( $value ) ?
            array() : ( is_array( $value ) ?
                $value : explode( ',', $value ) );
        sort( $value );
        return $value;
    }

    function form_init() {
        if ( isset( $this->form ) ) return;
        $this->form = new IntelliWidgetForm();
    }

    /**
     * backward compatability functions
     */
    function metabox_init() {
        $this->post_admin->form_init();
        $this->metabox = $this->post_admin->form;
    }

    function render_tabbed_sections( $id ) {
        $this->post_admin->render_tabbed_sections( $id );
    }

    function get_tip( $key = '' ) {
        return $this->form->get_tip( $key );
    }

    function get_label( $key = '' ) {
        return $this->form->get_label( $key );
    }

}

redpajama_set_name: RedPajamaGithub


While I work I'm taking the opportunity to expand my horizons in non-procedural level design. I'm also taking opportunities for tangential learning in the process of world-building. This log will follow me as I make my design decisions, both mechanical/dynamic and otherwise. Video, then more screens and musings after the jump.
That video, as you'll see, is a little out of date aesthetically, but shows off some decent things. I have a few influences at the start, and I want to make sure that at least in general I have a notion of what I'm doing with the signs, symbols, and other cultural references that find their way into this thing. I don't want to say a lot yet about the world I'm setting it in, except that it involves a character who dreams lucidly, and will some of my tangential learning will involve French and German folklore and possibly some of the language as well. Even the project name is basically a placeholder.
Two of my chief influences in terms of games were Knytt and Demon's/Dark Souls. Knytt holds a much stronger atmospheric influence. Dark Souls holds influence more in terms of the way I want to handle lore and wanting combat to matter, though I'm not trying to make it "like" a Nifflas or From Software game by any means!
The last time I designed a platformer with more than 15 minutes of playtime, I didn't plan it well. Level design was almost malicious and the stamina mechanic was punishing. (I'm speaking of a game I'm not even mentioning here because I'm embarrassed.) Part of the issue was that I designed around the tools I gave the player, but I only had one beta tester besides me and the design was too "tight", not enough mercy given to the player.
I decided to use two fixed-height jumps that would vary depending on how long the jump key was held. This means I'll only have to design around those two jump heights, and I won't be tempted to make players pull off ridiculous maneuvers. There's also no stamina mechanic in this game.
I want the game to have a good atmosphere overall. You can hear some of the music it already has in that video; probably there will be at least four to six other distinct songs in the game with at least 3-4 more areas to come.
Ultimately, I'm hoping for an overall aesthetics of play emphasizing challenge and sense-pleasure, with narrative and discovery more subtle and under-the-surface.
I have the basics mapped out. Things will need refining, both individually and as a cohesive whole. So even when I'm 99% done I'm sure I'll have that infamous other 99% to go. I am hoping to have this done and ready for release by March 25th. One of my New Year's Resolutions is to branch out from MZX to a more professional development environment this year, and if I can get this version done, especially in that time-frame, it's likely I'll be doing it again with GameMaker: Studio or some-such.
Thanks for reading, or at least skimming through to the screenshots or watching the video. I hope you were entertained. Please feel free to message me, leave comments, questions, here, Facebook, etc. I'll probably update this thing about once weekly just to give a notion of where it's at. I'd better end this thing before I get past 850 words, I'm just about at the tolerance level for decent internet writing length.


Players of vastly different skill levels will no longer be able to group up in competitive, which is also for the best. It could sometimes lead to really odd matchups, and I am sure people of low skill level had probably resorted to paying people to raise them up in this way. And I am always against boosters.
I wrote about how Blizzard needed to take steps to stop online toxic behavior before it becomes the norm, as it is in "League of Legends." This minor tweak won't stop toxic behavior completely – only a drastic societal change would do that – but it will embarrass a few bad eggs, and that's a better defense than most games can muster.
When competitive mode was released, Blizzard promised four two-and-a-half month seasons per year, with two weeks of break time in between each. The first season only lasted about six weeks, so someone must have decided to cut things short early to implement these changes.
And that's a great sign.
The changes and the decision to expedite them show two important things: Blizzard is working diligently to make "Overwatch" better, and the creators are listening to player feedback.
The next competitive "Overwatch" season will begin Sept. 6.
I wasn't sure just how serious Blizzard would be about improving its shooter. Unlike "Dota 2" or "League," "Overwatch" is not free-to-play. Developers giving their game away for nothing have to retain players in the hopes they will buy a skin here and a boost there. These microtransactions are their main source of income. But we shelled out the traditional $60 ($40 on PC) upfront for "Overwatch." Blizzard made millions in a single day, so I worried about its commitment to keeping players who had already contributed plenty to the bottom line. Important, timely updates have calmed my fears.
If you're not an "Overwatch" fan, a lot of this is probably gibberish. Just understand a few things. First, "Overwatch" is an amazing game. You should be playing it daily. Even with the competitive mode flaws, it is top-tier. Second, Activision-Blizzard is a massive company. It has hundreds of ongoing video game projects, so taking time to fix an existing game and listen to its fans means something – even if you aren't an "Overwatch" fan. And third, competition is always good. Because "Overwatch" is so good, the creators of other upcoming games – "Titanfall 2," for example – know they have to step up their game.
The next few months are critical for "Overwatch." Are we look at a good game, the best game of 2016, or a once-in-a-decade online phenomenon? We'll see.


text:
Q: Dynamic scope for accessing Model Attributes I'm currently using the mass assignment security baked into rails 3 to scope what level of users can update about their model.  For example this code allows me to protect attributes based on the user level.
  class Customer
    attr_accessor :name, :credit_rating

    attr_accessible :name
    attr_accessible :name, :credit_rating, :as => :admin
  end

I would like to be able to use this same idea for which attributes appear when I do a find.  For example I would like to be able to say
Customer.all.as(:admin)

and get back the credit rating.  Compare this to doing
Customer.all

and getting back all the attributes except the credit_rating
Is this something rails supports and I've missed?

A: attr_accessible is used to filter incoming attributes on mass assignment. This is a convenience method created so that a developer does not need to manually clean the incoming hash of params, something he does not control.
When displaying information a developer is in full control of what he/she desires to show, so there seems to be no reason to limit the read functionality.
However, rails allows you to "select" the attributes you desire in a query: see http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
You could easily create a scope with the name admin that would limit the selected values.
If you do not desire to have the full models, but only the values, you could use the generated sql. e:g.
ActiveRecord::Base.connection.select_values(Customer.select('name').to_sql)

redpajama_set_name: RedPajamaStackExchange


text:
A place where you feel like family
The Rugby Senior Center is a place where people can get close to each other enough to feel like family. It is a warm welcoming oasis from the challenges of life.
People go to the center to visit, play cards, play bingo, have silent auctions just for fun, and other activities based on the interests of the members. The club has about 80 members of which 30-35 attend monthly meetings. The meetings usually feature an educational topic of interest to the group. In May this club has a special memorial service for the members who have passed away.
Officers of the senior center are Mary Jelsing, president, Joyce Meier, vice-president, Elaine Selensky, secretary and Dorothy Slaubaugh, treasurer.
The seniors have a spring fundraiser to supplement revenue that the organization receives from a county mill levy which is primarily used to support congregate meals at the center, meals on wheels for those who stay home, and frozen-ahead meals. Tri-County Senior Meals provides the food.
Myrna Muffenbier is the director of the Tri-County Senior Meals program which serves other towns and counties in the area along with Rugby. She spends a great part of her day providing information and referrals to callers. Providing information is an important part of her job.
The meals are good and meet all the requirements for a healthy meal. All are welcome to have a noon meal at the center. People of all ages come and the cost is more than reasonable. If a person needs a ride, there is a bus through the Pierce County Council on the Aging that can pick them up. One does not have to be a senior citizen to use this bus.
In order to keep getting this service, people need to use it, as funds are dispersed accordingly.
"We want to keep the program going so it is there when people need it," said Mary Jelsing.
"I go to get a real good meal," said Howard Thompson, as he walked in to the center with a gallon of milk. He had heard that they needed milk so he brought some.
Jelsing, who is the meal site manager, has worked at the senior center for the past 26 years.
"It is one of the best things I ever did," said Jelsing about coming to work for the center.
She enjoys all the people who frequent the center. Jelsing would like to see even more people use the center. She talks about some of the people who come to the center and it is clear she carries them in her heart.
"Four men sit at the same table every day," said Jelsing. "They consider themselves family and help each other out."
She goes on to say that there is a group of ladies who love to play rummy and have enjoyed a potluck meal with their game.
Elaine Selensky wandered into the center. "I think it is fun to get out of the house," she said. She keeps busy at home with sewing projects, alterations, and decorating cakes but comes to the senior center to visit.
Loretta Richard enjoys coming to the center, too. "I love being with people," she smiled.The Rugby Senior Center is a place where people can get close to each other enough to feel like family. It is a warm welcoming oasis from the challenges of life.
Loretta Richard enjoys coming to the center, too. "I love being with people," she smiled.

redpajama_set_name: RedPajamaCommonCrawl


text:
Kollupitiya, also known as Colpetty is a major neighbourhood of Colombo, Sri Lanka. The name Kollupitiya comes from the name of a chief from Kandy who had unsuccessfully attempted to dethrone the last king of Kandy. During the period of British and Dutch administration, a brewery had commenced in Kollupitiya which converted coconut treacle into liquor. Nowadays, the suburb is a thriving commercial area containing fashionable high-end shopping malls. Some foreign embassies are located in Kollupitiya. The Prime Minister's House (Colombo) is located in Colombo 3 just two blocks south of Maha Nuge Gardens; a prominent private laneway in Kollupitiya.

Demographic
Kollupitiya is a multi-religious and multi-ethnic area. The major ethnic communities in Kollupitiya are Sri Lankan Moors, Sinhalese, and Sri Lankan Tamils. There are also various minorities, such as Burghers. Religions include Buddhism, Hinduism, Islam, and Christianity.

Muslim traders form a large part of the Kollupitiya economy with many businesses being operated by the local Sri Lankan Moors. In recent years, the influx of Chinese expatriates to Colombo has led to an increase of Chinese shops and businesses in the area. Many Chinese expatriates have opened shops and other businesses that cater towards the Chinese expatriate community. Some Sri Lankan residents of Kollupitiya have also been influenced by the influx of Chinese people to the area by shopping at the Chinese-run businesses and even picking up aspects of Mandarin Chinese.

Schools
There are several government and private schools located in Kollupitiya. They are:
 Bishop's College
 Mahanama College
 Methodist College Colombo
 S. Thomas' Preparatory School

Diplomatic Missions
 Honorary Consulate General of Finland
 Embassy of Germany
 Honorary Consulate of Belgium (België/Belgique/Belgien)
 High Commission of the Republic of India
 High Commission of Malaysia
 Honorary Consulate of Malta
 Embassy of the United States of America and American Centre
 Honorary Consulate of Bosnia and Herzegovina
 Honorary Consulate of Botswana
 Honorary Consulate of Chile
Embassy of The Sultanate of Oman

Government Offices
 Temple Trees (presidential residence)
 National Savings Bank Head Office (Savings House)
 Sri Lanka Tourism headquarters
 Civil Aviation Authority of Sri Lanka
 Department of Economic Development

See also
 Marine Drive Tunnel

References

Districts of Colombo
Populated places in Western Province, Sri Lanka

redpajama_set_name: RedPajamaWikipedia


text:
Ancient Egypt: Foundations of a Civilization
Douglas J. Brewer
Ancient Egypt is a beautifully illustrated, easy-to-read book covering the formative era of the Egyptian civilization: the age before the pyramids. Douglas Brewer shows why an awareness of the earliest phase of Egyptian history is crucial to understanding of later Egyptian culture. Beginning with a quick review of the fields of Egyptology and archaeology, Ancient Egypt takes the reader on a compelling survey of Egypt's prehistoric past. The books tours the Nile Valley to explore its impact on all aspects of life, from day-to-day living to regional politics, and introduces the reader to the Nile Valley's earliest inhabitants and the very first "Egyptians".
1.Archaeology, Egyptology and Prehistory: How We Know What We Know 2. Archaeology and Egyptian Prehistory 3. Environmental Reflections 4. The Paleolithic: A Desert in Bloom 5. The Neolithic: An Agricultural Revolution and New Way of Life 6. The Predynastic Period: Egypt in its Infancy 7. The Late Predynastic: Naqada III and the Quest for Power 8. In Search of Egypt's First Pharoah 9. Early Dynastic Life 10. New Horizons
Douglas J Brewer is a Professor of Anthropology at the University of Illinois and Director of the Spurlock Museum. He has written many books including the bestselling Egypt and the Egyptians and articles on Egypt. He has also spent 20 years involved in fieldwork projects in Egpyt - from the eastern desert to the Nile Valley.


text:
"use strict";

const ClipboardJS = require("clipboard");
const XDate = require("xdate");

const render_message_edit_form = require("../templates/message_edit_form.hbs");
const render_topic_edit_form = require("../templates/topic_edit_form.hbs");

const currently_editing_messages = new Map();
let currently_deleting_messages = [];
let currently_topic_editing_messages = [];
const currently_echoing_messages = new Map();

// These variables are designed to preserve the user's most recent
// choices when editing a group of messages, to make it convenient to
// move several topics in a row with the same settings.
exports.notify_old_thread_default = true;
exports.notify_new_thread_default = true;

const editability_types = {
    NO: 1,
    NO_LONGER: 2,
    // Note: TOPIC_ONLY does not include stream messages with no topic sent
    // by someone else. You can edit the topic of such a message by editing
    // the topic of the whole recipient_row it appears in, but you can't
    // directly edit the topic of such a message.
    // Similar story for messages whose topic you can change only because
    // you are an admin.
    TOPIC_ONLY: 3,
    FULL: 4,
};
exports.editability_types = editability_types;

function is_topic_editable(message, edit_limit_seconds_buffer) {
    const now = new XDate();
    edit_limit_seconds_buffer = edit_limit_seconds_buffer || 0;

    if (!page_params.realm_allow_message_editing) {
        // If message editing is disabled, so is topic editing.
        return false;
    }
    // Organization admins and message senders can edit message topics indefinitely.
    if (page_params.is_admin) {
        return true;
    }
    if (message.sent_by_me) {
        return true;
    }

    if (!page_params.realm_allow_community_topic_editing) {
        // If you're another non-admin user, you need community topic editing enabled.
        return false;
    }

    // If you're using community topic editing, there's a deadline.
    return (
        page_params.realm_community_topic_editing_limit_seconds +
            edit_limit_seconds_buffer +
            now.diffSeconds(message.timestamp * 1000) >
        0
    );
}

function get_editability(message, edit_limit_seconds_buffer) {
    edit_limit_seconds_buffer = edit_limit_seconds_buffer || 0;
    if (!message) {
        return editability_types.NO;
    }
    if (!is_topic_editable(message, edit_limit_seconds_buffer)) {
        return editability_types.NO;
    }
    if (message.failed_request) {
        // TODO: For completely failed requests, we should be able
        //       to "edit" the message, but it won't really be like
        //       other message updates.  This commit changed the result
        //       from FULL to NO, since the prior implementation was
        //       buggy.
        return editability_types.NO;
    }

    // Locally echoed messages are not editable, since the message hasn't
    // finished being sent yet.
    if (message.locally_echoed) {
        return editability_types.NO;
    }

    if (!page_params.realm_allow_message_editing) {
        return editability_types.NO;
    }

    if (page_params.realm_message_content_edit_limit_seconds === 0 && message.sent_by_me) {
        return editability_types.FULL;
    }

    if (currently_echoing_messages.has(message.id)) {
        return editability_types.NO;
    }

    const now = new XDate();
    if (
        page_params.realm_message_content_edit_limit_seconds +
            edit_limit_seconds_buffer +
            now.diffSeconds(message.timestamp * 1000) >
            0 &&
        message.sent_by_me
    ) {
        return editability_types.FULL;
    }

    // time's up!
    if (message.type === "stream") {
        return editability_types.TOPIC_ONLY;
    }
    return editability_types.NO_LONGER;
}
exports.get_editability = get_editability;
exports.is_topic_editable = is_topic_editable;

exports.get_deletability = function (message) {
    if (page_params.is_admin) {
        return true;
    }

    if (!message.sent_by_me) {
        return false;
    }
    if (message.locally_echoed) {
        return false;
    }
    if (!page_params.realm_allow_message_deleting) {
        return false;
    }

    if (page_params.realm_message_content_delete_limit_seconds === 0) {
        // This means no time limit for message deletion.
        return true;
    }

    if (page_params.realm_allow_message_deleting) {
        const now = new XDate();
        if (
            page_params.realm_message_content_delete_limit_seconds +
                now.diffSeconds(message.timestamp * 1000) >
            0
        ) {
            return true;
        }
    }
    return false;
};

exports.update_message_topic_editing_pencil = function () {
    if (page_params.realm_allow_message_editing) {
        $(".on_hover_topic_edit, .always_visible_topic_edit").show();
    } else {
        $(".on_hover_topic_edit, .always_visible_topic_edit").hide();
    }
};

exports.hide_message_edit_spinner = function (row) {
    const spinner = row.find(".message_edit_spinner");
    loading.destroy_indicator(spinner);
    $("#message_edit_form .message_edit_save").show();
    $("#message_edit_form .message_edit_cancel").show();
};

exports.show_message_edit_spinner = function (row) {
    const spinner = row.find(".message_edit_spinner");
    loading.make_indicator(spinner);
    $("#message_edit_form .message_edit_save").hide();
    $("#message_edit_form .message_edit_cancel").hide();
};

exports.show_topic_edit_spinner = function (row) {
    const spinner = row.find(".topic_edit_spinner");
    loading.make_indicator(spinner);
    spinner.css({height: ""});
    $(".topic_edit_save").hide();
    $(".topic_edit_cancel").hide();
};

exports.hide_topic_move_spinner = function () {
    const spinner = $("#move_topic_modal .topic_move_spinner");
    loading.destroy_indicator(spinner);
    $("#move_topic_modal .modal-footer").show();
};

exports.show_topic_move_spinner = function () {
    const spinner = $("#move_topic_modal .topic_move_spinner");
    loading.make_indicator(spinner);
    $("#move_topic_modal .modal-footer").hide();
};

exports.end_if_focused_on_inline_topic_edit = function () {
    const focused_elem = $(".topic_edit_form").find(":focus");
    if (focused_elem.length === 1) {
        focused_elem.trigger("blur");
        const recipient_row = focused_elem.closest(".recipient_row");
        exports.end_inline_topic_edit(recipient_row);
    }
};

exports.end_if_focused_on_message_row_edit = function () {
    const focused_elem = $(".message_edit").find(":focus");
    if (focused_elem.length === 1) {
        focused_elem.trigger("blur");
        const row = focused_elem.closest(".message_row");
        exports.end_message_row_edit(row);
    }
};

function handle_message_row_edit_keydown(e) {
    const code = e.keyCode || e.which;
    switch (code) {
        case 13:
            if ($(e.target).hasClass("message_edit_content")) {
                // Pressing Enter to save edits is coupled with Enter to send
                if (composebox_typeahead.should_enter_send(e)) {
                    const row = $(".message_edit_content:focus").closest(".message_row");
                    const message_edit_save_button = row.find(".message_edit_save");
                    if (message_edit_save_button.prop("disabled")) {
                        // In cases when the save button is disabled
                        // we need to disable save on pressing Enter
                        // Prevent default to avoid new-line on pressing
                        // Enter inside the textarea in this case
                        e.preventDefault();
                        return;
                    }
                    exports.save_message_row_edit(row);
                    e.stopPropagation();
                    e.preventDefault();
                } else {
                    composebox_typeahead.handle_enter($(e.target), e);
                    return;
                }
            } else if (
                $(e.target).hasClass("message_edit_topic") ||
                $(e.target).hasClass("message_edit_topic_propagate")
            ) {
                const row = $(e.target).closest(".message_row");
                exports.save_message_row_edit(row);
                e.stopPropagation();
                e.preventDefault();
            }
            return;
        case 27: // Handle escape keys in the message_edit form.
            exports.end_if_focused_on_message_row_edit();
            e.stopPropagation();
            e.preventDefault();
            return;
        default:
            return;
    }
}

function handle_inline_topic_edit_keydown(e) {
    let row;
    const code = e.keyCode || e.which;
    switch (code) {
        case 13: // Handle Enter key in the recipient bar/inline topic edit form
            row = $(e.target).closest(".recipient_row");
            exports.save_inline_topic_edit(row);
            e.stopPropagation();
            e.preventDefault();
            return;
        case 27: // handle Esc
            exports.end_if_focused_on_inline_topic_edit();
            e.stopPropagation();
            e.preventDefault();
            return;
        default:
            return;
    }
}

function timer_text(seconds_left) {
    const minutes = Math.floor(seconds_left / 60);
    const seconds = seconds_left % 60;
    if (minutes >= 1) {
        return i18n.t("__minutes__ min to edit", {minutes: minutes.toString()});
    } else if (seconds_left >= 10) {
        return i18n.t("__seconds__ sec to edit", {seconds: (seconds - (seconds % 5)).toString()});
    }
    return i18n.t("__seconds__ sec to edit", {seconds: seconds.toString()});
}

function edit_message(row, raw_content) {
    row.find(".message_reactions").hide();
    condense.hide_message_expander(row);
    const content_top = row.find(".message_top_line")[0].getBoundingClientRect().top;

    const message = current_msg_list.get(rows.id(row));

    // We potentially got to this function by clicking a button that implied the
    // user would be able to edit their message.  Give a little bit of buffer in
    // case the button has been around for a bit, e.g. we show the
    // edit_content_button (hovering pencil icon) as long as the user would have
    // been able to click it at the time the mouse entered the message_row. Also
    // a buffer in case their computer is slow, or stalled for a second, etc
    // If you change this number also change edit_limit_buffer in
    // zerver.views.message_edit.update_message_backend
    const seconds_left_buffer = 5;
    const editability = get_editability(message, seconds_left_buffer);
    const is_editable =
        editability === exports.editability_types.TOPIC_ONLY ||
        editability === exports.editability_types.FULL;
    const max_file_upload_size = page_params.max_file_upload_size_mib;
    let file_upload_enabled = false;

    if (max_file_upload_size > 0) {
        file_upload_enabled = true;
    }

    const show_video_chat_button = compose.compute_show_video_chat_button();

    const show_edit_stream = message.is_stream && page_params.is_admin;
    // current message's stream has been already been added and selected in handlebar
    const available_streams = show_edit_stream
        ? stream_data.subscribed_subs().filter((s) => s.stream_id !== message.stream_id)
        : null;

    const form = $(
        render_message_edit_form({
            is_stream: message.type === "stream",
            message_id: message.id,
            is_editable,
            is_content_editable: editability === exports.editability_types.FULL,
            has_been_editable: editability !== editability_types.NO,
            topic: message.topic,
            content: raw_content,
            file_upload_enabled,
            show_video_chat_button,
            minutes_to_edit: Math.floor(page_params.realm_message_content_edit_limit_seconds / 60),
            show_edit_stream,
            available_streams,
            stream_id: message.stream_id,
            stream_name: message.stream,
            notify_new_thread: exports.notify_new_thread_default,
            notify_old_thread: exports.notify_old_thread_default,
        }),
    );

    const edit_obj = {form, raw_content};
    currently_editing_messages.set(message.id, edit_obj);
    current_msg_list.show_edit_message(row, edit_obj);

    form.on("keydown", handle_message_row_edit_keydown);

    upload.feature_check($("#attach_files_" + rows.id(row)));

    const message_edit_stream = row.find("#select_stream_id_" + message.id);
    const stream_header_colorblock = row.find(".stream_header_colorblock");
    const message_edit_content = row.find("textarea.message_edit_content");
    const message_edit_topic = row.find("input.message_edit_topic");
    const message_edit_topic_propagate = row.find("select.message_edit_topic_propagate");
    const message_edit_breadcrumb_messages = row.find("div.message_edit_breadcrumb_messages");
    const message_edit_countdown_timer = row.find(".message_edit_countdown_timer");
    const copy_message = row.find(".copy_message");

    ui_util.decorate_stream_bar(message.stream, stream_header_colorblock, false);
    message_edit_stream.on("change", function () {
        const stream_name = stream_data.maybe_get_stream_name(Number.parseInt(this.value, 10));
        ui_util.decorate_stream_bar(stream_name, stream_header_colorblock, false);
    });

    if (editability === editability_types.NO) {
        message_edit_content.attr("readonly", "readonly");
        message_edit_topic.attr("readonly", "readonly");
        new ClipboardJS(copy_message[0]);
    } else if (editability === editability_types.NO_LONGER) {
        // You can currently only reach this state in non-streams. If that
        // changes (e.g. if we stop allowing topics to be modified forever
        // in streams), then we'll need to disable
        // row.find('input.message_edit_topic') as well.
        message_edit_content.attr("readonly", "readonly");
        message_edit_countdown_timer.text(i18n.t("View source"));
        new ClipboardJS(copy_message[0]);
    } else if (editability === editability_types.TOPIC_ONLY) {
        message_edit_content.attr("readonly", "readonly");
        // Hint why you can edit the topic but not the message content
        message_edit_countdown_timer.text(i18n.t("Topic editing only"));
        new ClipboardJS(copy_message[0]);
    } else if (editability === editability_types.FULL) {
        copy_message.remove();
        const edit_id = "#message_edit_content_" + rows.id(row);
        const listeners = resize.watch_manual_resize(edit_id);
        if (listeners) {
            currently_editing_messages.get(rows.id(row)).listeners = listeners;
        }
        composebox_typeahead.initialize_compose_typeahead(edit_id);
        compose.handle_keyup(null, $(edit_id).expectOne());
        $(edit_id).on("keydown", function (event) {
            compose.handle_keydown(event, $(this).expectOne());
        });
        $(edit_id).on("keyup", function (event) {
            compose.handle_keyup(event, $(this).expectOne());
        });
    }

    // Add tooltip
    if (
        editability !== editability_types.NO &&
        page_params.realm_message_content_edit_limit_seconds > 0
    ) {
        row.find(".message-edit-timer-control-group").show();
        row.find("#message_edit_tooltip").tooltip({
            animation: false,
            placement: "left",
            template:
                '

' +
                '

',
        });
    }

    // add timer
    if (
        editability === editability_types.FULL &&
        page_params.realm_message_content_edit_limit_seconds > 0
    ) {
        // Give them at least 10 seconds.
        // If you change this number also change edit_limit_buffer in
        // zerver.views.message_edit.update_message_backend
        const min_seconds_to_edit = 10;
        const now = new XDate();
        let seconds_left =
            page_params.realm_message_content_edit_limit_seconds +
            now.diffSeconds(message.timestamp * 1000);
        seconds_left = Math.floor(Math.max(seconds_left, min_seconds_to_edit));

        // I believe this needs to be defined outside the countdown_timer, since
        // row just refers to something like the currently selected message, and
        // can change out from under us
        const message_edit_save = row.find("button.message_edit_save");
        // Do this right away, rather than waiting for the timer to do its first update,
        // since otherwise there is a noticeable lag
        message_edit_countdown_timer.text(timer_text(seconds_left));
        const countdown_timer = setInterval(() => {
            seconds_left -= 1;
            if (seconds_left <= 0) {
                clearInterval(countdown_timer);
                message_edit_content.prop("readonly", "readonly");
                if (message.type === "stream") {
                    message_edit_topic.prop("readonly", "readonly");
                    message_edit_topic_propagate.hide();
                    message_edit_breadcrumb_messages.hide();
                }
                // We don't go directly to a "TOPIC_ONLY" type state (with an active Save button),
                // since it isn't clear what to do with the half-finished edit. It's nice to keep
                // the half-finished edit around so that they can copy-paste it, but we don't want
                // people to think "Save" will save the half-finished edit.
                message_edit_save.addClass("disabled");
                message_edit_countdown_timer.text(i18n.t("Time's up!"));
            } else {
                message_edit_countdown_timer.text(timer_text(seconds_left));
            }
        }, 1000);
    }

    if (!is_editable) {
        row.find(".message_edit_close").trigger("focus");
    } else if (message.type === "stream" && message.topic === compose.empty_topic_placeholder()) {
        message_edit_topic.val("");
        message_edit_topic.trigger("focus");
    } else if (editability === editability_types.TOPIC_ONLY) {
        row.find(".message_edit_topic").trigger("focus");
    } else {
        message_edit_content.trigger("focus");
        // Put cursor at end of input.
        const contents = message_edit_content.val();
        message_edit_content.val("");
        message_edit_content.val(contents);
    }

    // Scroll to keep the top of the message content text in the same
    // place visually, adjusting for border and padding.
    const edit_top = message_edit_content[0].getBoundingClientRect().top;
    const scroll_by = edit_top - content_top + 5 - 14;

    edit_obj.scrolled_by = scroll_by;
    message_viewport.scrollTop(message_viewport.scrollTop() + scroll_by);

    const original_stream_id = message.stream_id;
    const original_topic = message.topic;
    function set_propagate_selector_display() {
        const new_topic = message_edit_topic.val();
        const new_stream_id = Number.parseInt(message_edit_stream.val(), 10);
        const is_topic_edited = new_topic !== original_topic && new_topic !== "";
        const is_stream_edited = new_stream_id !== original_stream_id;
        message_edit_topic_propagate.toggle(is_topic_edited || is_stream_edited);
        message_edit_breadcrumb_messages.toggle(is_stream_edited);
    }

    if (!message.locally_echoed) {
        message_edit_topic.on("keyup", () => {
            set_propagate_selector_display();
        });

        message_edit_stream.on("change", () => {
            set_propagate_selector_display();
        });
    }
}

function start_edit_maintaining_scroll(row, content) {
    edit_message(row, content);
    const row_bottom = row.height() + row.offset().top;
    const composebox_top = $("#compose").offset().top;
    if (row_bottom > composebox_top) {
        message_viewport.scrollTop(message_viewport.scrollTop() + row_bottom - composebox_top);
    }
}

function start_edit_with_content(row, content, edit_box_open_callback) {
    start_edit_maintaining_scroll(row, content);
    if (edit_box_open_callback) {
        edit_box_open_callback();
    }

    upload.setup_upload({
        mode: "edit",
        row: rows.id(row),
    });
}

exports.start = function (row, edit_box_open_callback) {
    const message = current_msg_list.get(rows.id(row));
    if (message === undefined) {
        blueslip.error("Couldn't find message ID for edit " + rows.id(row));
        return;
    }

    if (message.raw_content) {
        start_edit_with_content(row, message.raw_content, edit_box_open_callback);
        return;
    }

    const msg_list = current_msg_list;
    channel.get({
        url: "/json/messages/" + message.id,
        idempotent: true,
        success(data) {
            if (current_msg_list === msg_list) {
                message.raw_content = data.raw_content;
                start_edit_with_content(row, message.raw_content, edit_box_open_callback);
            }
        },
    });
};

exports.start_topic_edit = function (recipient_row) {
    const form = $(render_topic_edit_form());
    current_msg_list.show_edit_topic_on_recipient_row(recipient_row, form);
    form.on("keydown", handle_inline_topic_edit_keydown);
    const msg_id = rows.id_for_recipient_row(recipient_row);
    const message = current_msg_list.get(msg_id);
    let topic = message.topic;
    if (topic === compose.empty_topic_placeholder()) {
        topic = "";
    }
    form.find(".inline_topic_edit").val(topic).trigger("select").trigger("focus");
};

exports.is_editing = function (id) {
    return currently_editing_messages.has(id);
};

exports.end_inline_topic_edit = function (row) {
    current_msg_list.hide_edit_topic_on_recipient_row(row);
};

exports.end_message_row_edit = function (row) {
    const message = current_msg_list.get(rows.id(row));
    if (message !== undefined && currently_editing_messages.has(message.id)) {
        const scroll_by = currently_editing_messages.get(message.id).scrolled_by;
        message_viewport.scrollTop(message_viewport.scrollTop() - scroll_by);

        // Clean up resize event listeners
        const listeners = currently_editing_messages.get(message.id).listeners;
        const edit_box = document.querySelector("#message_edit_content_" + message.id);
        if (listeners !== undefined) {
            // Event listeners to cleanup are only set in some edit types
            edit_box.removeEventListener("mousedown", listeners[0]);
            document.body.removeEventListener("mouseup", listeners[1]);
        }

        currently_editing_messages.delete(message.id);
        current_msg_list.hide_edit_message(row);

        compose.abort_video_callbacks(message.id);
    }
    condense.show_message_expander(row);
    row.find(".message_reactions").show();

    // We have to blur out text fields, or else hotkeys.js
    // thinks we are still editing.
    row.find(".message_edit").trigger("blur");
};

exports.save_inline_topic_edit = function (row) {
    const msg_list = current_msg_list;
    let message_id = rows.id_for_recipient_row(row);
    const message = current_msg_list.get(message_id);

    const old_topic = message.topic;
    const new_topic = row.find(".inline_topic_edit").val();
    const topic_changed = new_topic !== old_topic && new_topic.trim() !== "";

    if (!topic_changed) {
        // this means the inline_topic_edit was opened and submitted without
        // changing anything, therefore, we should just close the inline topic edit.
        exports.end_inline_topic_edit(row);
        return;
    }

    exports.show_topic_edit_spinner(row);

    if (message.locally_echoed) {
        if (topic_changed) {
            echo.edit_locally(message, {new_topic});
            row = current_msg_list.get_row(message_id);
        }
        exports.end_inline_topic_edit(row);
        return;
    }

    const request = {
        message_id: message.id,
        topic: new_topic,
        propagate_mode: "change_later",
    };

    channel.patch({
        url: "/json/messages/" + message.id,
        data: request,
        success() {
            const spinner = row.find(".topic_edit_spinner");
            loading.destroy_indicator(spinner);
        },
        error(xhr) {
            const spinner = row.find(".topic_edit_spinner");
            loading.destroy_indicator(spinner);
            if (msg_list === current_msg_list) {
                message_id = rows.id_for_recipient_row(row);
                const message = channel.xhr_error_message(i18n.t("Error saving edit"), xhr);
                row.find(".edit_error").text(message).css("display", "inline-block");
            }
        },
    });
};

exports.save_message_row_edit = function (row) {
    const msg_list = current_msg_list;
    let message_id = rows.id(row);
    const message = current_msg_list.get(message_id);
    let changed = false;
    let edit_locally_echoed = false;

    const new_content = row.find(".message_edit_content").val();
    let topic_changed = false;
    let new_topic;
    const old_topic = message.topic;

    let stream_changed = false;
    let new_stream_id;
    const old_stream_id = message.stream_id;

    exports.show_message_edit_spinner(row);

    if (message.type === "stream") {
        new_topic = row.find(".message_edit_topic").val();
        topic_changed = new_topic !== old_topic && new_topic.trim() !== "";

        new_stream_id = Number.parseInt($("#select_stream_id_" + message_id).val(), 10);
        stream_changed = new_stream_id !== old_stream_id;
    }
    // Editing a not-yet-acked message (because the original send attempt failed)
    // just results in the in-memory message being changed
    if (message.locally_echoed) {
        if (new_content !== message.raw_content || topic_changed || stream_changed) {
            // `edit_locally` handles the case where `new_topic/new_stream_id` is undefined
            echo.edit_locally(message, {
                raw_content: new_content,
                new_topic,
                new_stream_id,
            });
            row = current_msg_list.get_row(message_id);
        }
        exports.end_message_row_edit(row);
        return;
    }

    const request = {message_id: message.id};

    if (topic_changed || stream_changed) {
        const selected_topic_propagation =
            row.find("select.message_edit_topic_propagate").val() || "change_later";
        const send_notification_to_old_thread = row
            .find(".send_notification_to_old_thread")
            .is(":checked");
        const send_notification_to_new_thread = row
            .find(".send_notification_to_new_thread")
            .is(":checked");
        request.propagate_mode = selected_topic_propagation;
        request.send_notification_to_old_thread = send_notification_to_old_thread;
        request.send_notification_to_new_thread = send_notification_to_new_thread;
        exports.notify_old_thread_default = send_notification_to_old_thread;
        exports.notify_new_thread_default = send_notification_to_new_thread;
        changed = true;
    }

    if (topic_changed) {
        request.topic = new_topic;
    }
    if (stream_changed) {
        request.stream_id = new_stream_id;
    }
    if (new_content !== message.raw_content) {
        request.content = new_content;
        changed = true;
    }

    if (!changed) {
        // If they didn't change anything, just cancel it.
        exports.end_message_row_edit(row);
        return;
    }

    if (
        changed &&
        !topic_changed &&
        !stream_changed &&
        !markdown.contains_backend_only_syntax(new_content)
    ) {
        // If the topic isn't changed, and the new message content
        // could have been locally echoed, than we can locally echo
        // the edit.
        currently_echoing_messages.set(message_id, {
            raw_content: new_content,
            orig_content: message.content,
            orig_raw_content: message.raw_content,

            // Store flags that are about user interaction with the
            // message so that echo.edit_locally() can restore these
            // flags.
            starred: message.starred,
            historical: message.historical,
            collapsed: message.collapsed,

            // These flags are rendering artifacts we'll want if the
            // edit fails and we need to revert to the original
            // rendering of the message.
            alerted: message.alerted,
            mentioned: message.mentioned,
            mentioned_me_directly: message.mentioned,
        });
        edit_locally_echoed = true;

        // Settings these attributes causes a "SAVING" notice to
        // briefly appear where "EDITED" would normally appear until
        // the message is acknowledged by the server.
        message.local_edit_timestamp = Math.round(new Date().getTime() / 1000);

        echo.edit_locally(message, currently_echoing_messages.get(message_id));

        row = current_msg_list.get_row(message_id);
        exports.end_message_row_edit(row);
    }

    channel.patch({
        url: "/json/messages/" + message.id,
        data: request,
        success() {
            if (edit_locally_echoed) {
                delete message.local_edit_timestamp;
                currently_echoing_messages.delete(message_id);
            }
            exports.hide_message_edit_spinner(row);
        },
        error(xhr) {
            if (msg_list === current_msg_list) {
                message_id = rows.id(row);

                if (edit_locally_echoed) {
                    const echoed_message = message_store.get(message_id);
                    const echo_data = currently_echoing_messages.get(message_id);

                    delete echoed_message.local_edit_timestamp;
                    currently_echoing_messages.delete(message_id);

                    // Restore the original content.
                    echo.edit_locally(echoed_message, {
                        content: echo_data.orig_content,
                        raw_content: echo_data.orig_raw_content,
                        mentioned: echo_data.mentioned,
                        mentioned_me_directly: echo_data.mentioned_me_directly,
                        alerted: echo_data.alerted,
                    });

                    row = current_msg_list.get_row(message_id);
                    if (!exports.is_editing(message_id)) {
                        // Return to the message editing open UI state.
                        start_edit_maintaining_scroll(row, echo_data.orig_raw_content);
                    }
                }

                exports.hide_message_edit_spinner(row);
                const message = channel.xhr_error_message(i18n.t("Error saving edit"), xhr);
                row.find(".edit_error").text(message).show();
            }
        },
    });
    // The message will automatically get replaced via message_list.update_message.
};

exports.maybe_show_edit = function (row, id) {
    if (currently_editing_messages.has(id)) {
        current_msg_list.show_edit_message(row, currently_editing_messages.get(id));
    }
};

exports.edit_last_sent_message = function () {
    const msg = current_msg_list.get_last_message_sent_by_me();

    if (!msg) {
        return;
    }

    if (!msg.id) {
        blueslip.error("Message has invalid id in edit_last_sent_message.");
        return;
    }

    const msg_editability_type = exports.get_editability(msg, 5);
    if (msg_editability_type !== editability_types.FULL) {
        return;
    }

    const msg_row = current_msg_list.get_row(msg.id);
    if (!msg_row) {
        // This should never happen, since we got the message above
        // from current_msg_list.
        blueslip.error("Could not find row for id " + msg.id);
        return;
    }

    current_msg_list.select_id(msg.id, {then_scroll: true, from_scroll: true});

    // Finally do the real work!
    compose_actions.cancel();
    exports.start(msg_row, () => {
        $("#message_edit_content").trigger("focus");
    });
};

function hide_delete_btn_show_spinner(deleting) {
    if (deleting) {
        $("do_delete_message_button").prop("disabled", true);
        $("#delete_message_modal > div.modal-footer > button").hide();
        const delete_spinner = $("#do_delete_message_spinner");
        loading.make_indicator(delete_spinner, {abs_positioned: true});
    } else {
        loading.destroy_indicator($("#do_delete_message_spinner"));
        $("#do_delete_message_button").prop("disabled", false);
        $("#delete_message_modal > div.modal-footer > button").show();
    }
}

exports.delete_message = function (msg_id) {
    $("#delete-message-error").html("");
    $("#delete_message_modal").modal("show");
    if (currently_deleting_messages.includes(msg_id)) {
        hide_delete_btn_show_spinner(true);
    } else {
        hide_delete_btn_show_spinner(false);
    }
    $("#do_delete_message_button")
        .off()
        .on("click", (e) => {
            e.stopPropagation();
            e.preventDefault();
            currently_deleting_messages.push(msg_id);
            hide_delete_btn_show_spinner(true);
            channel.del({
                url: "/json/messages/" + msg_id,
                success() {
                    $("#delete_message_modal").modal("hide");
                    currently_deleting_messages = currently_deleting_messages.filter(
                        (id) => id !== msg_id,
                    );
                    hide_delete_btn_show_spinner(false);
                },
                error(xhr) {
                    currently_deleting_messages = currently_deleting_messages.filter(
                        (id) => id !== msg_id,
                    );
                    hide_delete_btn_show_spinner(false);
                    ui_report.error(
                        i18n.t("Error deleting message"),
                        xhr,
                        $("#delete-message-error"),
                    );
                },
            });
        });
};

exports.delete_topic = function (stream_id, topic_name) {
    channel.post({
        url: "/json/streams/" + stream_id + "/delete_topic",
        data: {
            topic_name,
        },
        success() {
            $("#delete_topic_modal").modal("hide");
        },
    });
};

exports.handle_narrow_deactivated = function () {
    for (const [idx, elem] of currently_editing_messages) {
        if (current_msg_list.get(idx) !== undefined) {
            const row = current_msg_list.get_row(idx);
            current_msg_list.show_edit_message(row, elem);
        }
    }
};

exports.move_topic_containing_message_to_stream = function (
    message_id,
    new_stream_id,
    new_topic_name,
    send_notification_to_new_thread,
    send_notification_to_old_thread,
) {
    function reset_modal_ui() {
        currently_topic_editing_messages = currently_topic_editing_messages.filter(
            (id) => id !== message_id,
        );
        exports.hide_topic_move_spinner();
        $("#move_topic_modal").modal("hide");
    }
    if (currently_topic_editing_messages.includes(message_id)) {
        exports.hide_topic_move_spinner();
        $("#topic_stream_edit_form_error .error-msg").text(
            i18n.t("A Topic Move already in progress."),
        );
        $("#topic_stream_edit_form_error").show();
        return;
    }
    currently_topic_editing_messages.push(message_id);

    const request = {
        stream_id: new_stream_id,
        propagate_mode: "change_all",
        topic: new_topic_name,
        send_notification_to_old_thread,
        send_notification_to_new_thread,
    };
    exports.notify_old_thread_default = send_notification_to_old_thread;
    exports.notify_new_thread_default = send_notification_to_new_thread;
    channel.patch({
        url: "/json/messages/" + message_id,
        data: request,
        success() {
            // The main UI will update via receiving the event
            // from server_events.js.
            reset_modal_ui();
        },
        error(xhr) {
            reset_modal_ui();
            ui_report.error(i18n.t("Error moving the topic"), xhr, $("#home-error"), 4000);
        },
    });
};

window.message_edit = exports;


text:
10 Ways Tech Is Making Fast Food Personal
7 ways IT can help cut friction from the customer experience
Do Chief Digital Officers Spell Trouble for CIOs?
Chipotle doubles digital sales with loyalty program
The quick-service chain remade its mobile app and loyalty reward experience, which helped boost digital sales by 88 percent. Here's how CTO Curt Garner tackled the challenge.
Once a novelty, a strong digital presence has become table stakes for helping companies satisfy customers. There's no better example of this phenomenon than Chipotle Mexican Grill, whose revamped mobile application and loyalty program have helped the company nearly double digital sales in recent quarters.
"The thing that has been most exciting — and perhaps unexpected — was how many people are using the app and joining Rewards as their first Chipotle experience," Chipotle CTO Curt Garner tells CIO.com. The Tex-Mex chain, which operates more than 2,500 stores, has added 7 million customers to its loyalty rewards program since it launched in March. The company intends to harness transaction data collected through this digital product to strengthen its connection to customers.
[ Be sure to learn the secrets of highly effective digital transformations — and beware the 7 myths of digital transformation. | Get the latest on digital transformation by signing up for our CIO Leader newsletters. ]
Sixty-seven percent of IT executives surveyed for CIO.com's Digital Business 2019 Report have made improving customer experience (CX) their top transformation initiative. Organizations such as La-Z-Boy, Amtrak and Great Wolf Lodge have overhauled IT to address the CX imperative.
[ Take this mobile device management course from PluralSight and learn how to secure devices in your company without degrading the user experience. ]
Baby steps to a successful CX
On the CX front, Chipotle was ahead of its time in 2009 when it launched a mobile app that allowed consumers to order from their smartphones from most locations. But the app didn't incorporate mobile payment; consumers ordered in advance but waited in line to pay and pick up their food. Partly because of this friction, Chipotle's digital capabilities ultimately accounted for only 4 percent to 5 percent of total sales before Garner took the helm in 2015.
Under Garner, Chipotle overhauled its ordering systems. It replaced a text-based application with a visual display to show crew members what bins to take food from as they prepare meals. Chipotle also incorporated a "smarter pickup times" feature that lets users reserve a future pickup time for orders logged via iPhones, Android phones and the web. The system then provides customers with a wait time estimate based on current order volume, Garner says.
Curt Garner, CTO, Chipotle
But fortifying the front-end experience proved even more critical. Working with PwC, Chipotle remade its mobile app as a loyalty app. In addition to more appealing imagery, enhanced customization and mobile payment capability, Chipotle fashioned a new loyalty rewards program to make it easier for consumers to engage with the brand.
Working from a Chipotle command center in Columbus, Ohio, PwC consultants hunkered down with the chain's tech, operations and marketing staff to plan and co-design how to engage with customers, says Jon Glick, PwC partner of customer experience and loyalty, whom Garner worked with in his previous role as CIO of Starbucks. For example, Chipotle and PwC crafted 50 promotions to engage consumers. Glick says the synergies formed between the cross-functional teams were critical to the program's success. "A well-designed simple program that is integrated across digital channels can have a high impact for customers and for the company," Glick says.
Chipotle's app and rewards program refresh aligns technology, data and the company's CRM system. When a consumer opens the Chipotle app, the software scans the consumer's most recent and favorite orders, the closest location to the consumer and the quickest available pick-up times. The software also dynamically checks the consumer's rewards wallet to determine whether the items qualify for a reward or whether to recommend a promotion and invite the consumer to participate in bonus rewards. As the order grows, the software updates the pick-up or delivery time — Chipotle's delivery partner is DoorDash — to reflect the time it takes to prepare the meal.
Garner says that it was critical to build a bespoke app to manage the customer interaction, but Chipotle partners with Sparkfly to manage offers and SAP Gigya for customer identity and account management. It also built a custom API services library to connect with its delivery partners.
The loyalty app initiative is paying off. By the end of 2018, Chipotle banked 13 percent of its sales from digital (mobile and web). In October, Chipotle reported that digital sales grew 88 percent and accounted for 18 percent of Chipotle's sales of $1.4 billion for the third quarter 2019.
Despite the success, Garner attributes a critical operations change for enhancing the CX. Chipotle installed within its stores separate kitchens to make digital orders. "The technology is interesting and something where we're in the early innings, but the key point of difference is that we have dedicated kitchens to make digital orders," Garner says, adding that the fastest preparation, delivery and smart pick-up times helps augment the CX.
Jon Glick, partner of customer experience and loyalty, PwC
Chipotle's new digital ordering operations and loyalty app offered moderate change management hurdles. The visual ordering system required some new "muscle memory" for crew members accustomed to the text-based system, Garner says. Crew members also had to get accustomed to customizations consumers selected in the loyalty app. When a consumer orders at the counter, he or she can tell the person making their burrito how much or little of an ingredient to include. But when a consumer selects "light cheese" from the loyalty app on their phone, it may not translate as well to the crew member preparing the order.
As Chipotle collects more data from the app and web transactions it will use the information to issue highly personalized offers. For example, Garner says Chipotle could use consumers' previous orders to make diet-based "lifestyle" recommendations, such as vegetarian or paleo options. Timing is the critical factor for such personalization, Garner says, as Chipotle wants to catch consumers when they're ready to order rather than simply sending them a random text message or email.
Today the company uses Google Analytics to better understand how people navigate its website and apps, but it plans to build a more sophisticated data platform running in a public cloud, enabling Chipotle to scale as necessary.
"We have a tremendous opportunity to further engage people who enrolled in the platform," Garner says. "Being able to use data and insights to shape experience is part of our focus."
More on digital transformation:
7 secrets for getting digital transformation right
An inside look at 16 real-world digital transformations at today's leading organizations
7 skills of successful digital leaders
15 ways to salvage a troubled digital transformation
7 digital transformation myths
Digital KPIs: Your keys to measuring digital transformation success
6 hot digital transformation trends — and 4 going cold
4 things successful CIOs know about digital transformation
What is digital transformation? A necessary disruption
12 reasons why digital transformations fail
What is design thinking? The secret to digital success


Welcome to my website! I am so glad that you are here.
I design custom and bespoke wedding stationery for design conscious brides for their big day! The designs are minimal, clean and neat – with modern typography and minimal colors.
My Etsy store specializes in custom and edit-at-home wedding templates.
This is truly wedding stationery made easy!
The process of ordering and customizing wedding stationery is a really fun process. No need to stress or pull your hair out.
My method is fun, easy and super fast.
Begin by purchasing a design on my Etsy Store, and edit directly within Adobe Reader (free download link provided). The template is specifically designed for editing wedding stationery with ease.
Making it easy for you to personalize your own wedding invitations to your personal preference.
Visit the How it Works page for more information on editing your templates.
More than just a Graphic Designer from Johannesburg, South Africa and settled in Cambridge, United Kingdom. I want to help you to make your dreams and aspirations come true. Whether that is through wedding stationery design or bespoke services.
Not sure how to start or even where to start? Speak to me, I would love to help you.
Why choose make me digital?
Everything that you need for a complete look. From RSVPs and wedding suites to wedding signs.
Elegant, minimal and timeless designs that will impress your guests whilst you save thousands.
As easy as downloading, editing and printing. All templates come with Demo's to try out.
Subscribe to our mailers to receive the latest product updates, tips and tricks for printing your wedding stationery and freebies that I love to spoil you with! I respect your privacy and your information will not be shared.


text:
Harold G. McMaster
Service Date: December 12, 2021
Obituary Viewed 1615 times
Subscribe to updates for Harold McMaster
Harold Garnet McMaster passed quietly on December 1st. Survived by his loving wife of 65 years, Ann McMaster (Simpson) and sons Dave McMaster (Kim) and Joe McMaster (Marianna). Adored Papa and Grampa of Miklos, J.D., Harry, Zech, and Sam. Dear brother of Bernice Tattersall (the late Graham). Brother-in-law of the late Rosemary (the late Russell Uncles), Lorraine Yasher (the late Sherry), George Simpson (Marion), the late Gordon Simpson (Peggy), Don Simpson (Liz), and Sue Simpson. Uncle to many nieces and nephews. Predeceased by his parents Garnet and Marjorie (Harris), infant sister Audrey, his son Daniel and infant twins Justin and Jessica.
Harold was born March 5th 1934 and he lived his whole life on the farm in Grenfel. Growing up as an only son on the farm meant lots of hard work and a need for self reliance. This became even more the case with the passing of his parents far too early. Like many of the local family farmers, school education may not have been lengthy but life education was more than people living today would believe. There wasn't much Harold couldn't do. He raised and cared for beef cattle and many other livestock from birth, to treating illness to final processing. He grew mixed crops of grain, corn and hay for feed and sale. He worked for many years in the bush cutting firewood and harvesting trees for fencing and construction including working with horses which he really enjoyed. He saw himself as a steward of the land preserving and protecting it for future generations. This including reading and studying the latest trends in agriculture and always trying to do things better. His dedication to stewardship included protecting and preserving the wetlands and forests of the Minesing Swamp and working to preserve and improve historic Fort Willow.
He worked construction for many years as a carpenter. This was after he used his self taught skills to build the beautiful family home virtually by himself from drawings to completion. The implement sheds multiplied rapidly on the farm as he strived to maintain our often antique farm machinery for as long as possible. This meant being a mechanic, welder and engineer as he came up with imaginative ways to keep things running.
His hard work allowed him and the family to travel on many vacations both on the road and in the air. The pinnacle being after retirement when he and Ann took the camper to Alaska, the trip of a lifetime.
In addition to his work and family he was an avid sportsman playing multiple sports including hockey and especially fastball. He transitioned from his playing days into becoming a leader and coach. His contributions to the community were recognized with a volunteer award during the year of the 1988 Calgary Olympics, the John Graves Simcoe Medal of Excellence and induction into the Springwater Sports Hall of Fame.
His community leadership included being a lifetime member of Grenfel United Church and serving in many executive roles over the years. His loss leaves a big whole in the Grenfel community. His family and faith community helped sustain him through life's rough patches.
A visitation will be held at ADAMS FUNERAL HOME 445 St. Vincent Street, Barrie on Saturday, December 11 from 2 – 5 p.m. A Funeral Service will be held in the Chapel and also livestreamed through the following link for those unable to attend https://us02web.zoom.us/j/86056720237?pwd=WGtHcGJpaHo1U3dnQUc0N2RBcXdjdz09 on Sunday, December 12, 2021 at 1 o'clock. The family has requested that proof of vaccination is required in order to attend the visitation and Funeral Service.
The family would like to thank, Dr. Paul Howard for his care and guidance, the wonderful home care workers that allowed Dad to remain at home as long as he did, the paramedics and finally the amazing Doctors, Nurses and other staff at RVH for their kindness, compassion and wonderful care.
Donations in Harold's memory can be made to Grenfel United Church and the Alzheimer Society of Ontario.


text:
Q: iTunes Podcast feed doesn't show episodes I've created a RSS 2.0 feed for my podcast, but when I test it in iTunes (Advanced -> Subscribe to podcast..) no episodes are showing.
I haven't yet added iTunes specific tags, since I though they were not required. Are they? Is there any way to debug why it's not working? It is a valid RSS 2.0 feed according to W3C's feed validator.

A: The <link>s in your <item>s should be <enclosure>s instead.  See the feed specs example feed:
<enclosure url="http://example.com/podcasts/everything/AllAboutEverythingEpisode3.m4a" length="8727310" type="audio/x-m4a" />


We are soliciting your nominations for invited speakers for the 2012 American Conference on Neutron Scattering. We are mainly interested in nominations of speakers not affiliated with the nominee.
The 2012 American Conference on Neutron Scattering (ACNS) will be held at the Georgetown University Hotel and Conference Center in Washington DC from June 24-28, 2012. Hosted by the NIST Center for Neutron Research and sponsored by the Neutron Scattering Society of America, this sixth conference in the series will feature a combination of invited and contributed talks, posters sessions, tutorials and an industrial exhibit.
Sorting categories are listed below as well as on the conference Web site at www . mrs . org/acns-2012.
Please submit your nominations before November 30 to kriss at mrs.org.
We thank you for your assistance and hope to see you in Georgetown in June.
This message is being sent to you as a service of the Materials Research Society (www . mrs . org). If you do not wish to receive further messages by e-mail, contact MRS Member Services by phone at 724-779-3003, fax at 724-779-8313 or by e-mail at info at mrs.org.


text:
A leader in disruptive innovation
DEINOVE is a French biotechnology company, a leader in disruptive innovation, which aims to help meet the challenges of antibiotic resistance and the transition to a sustainable production model for the nutrition and cosmetics industries.
DEINOVE has developed a unique and comprehensive expertise in the field of rare bacteria that it can decipher, culture, and optimize to disclose unsuspected possibilities and induce them to produce biobased molecules with activities of interest on an industrial scale. To do so, DEINOVE has been building and documenting since its creation an unparalleled biodiversity bank that it exploits thanks to a unique technological platform in Europe.
DEINOVE is organized around two areas of expertise:
ANTIBIOTICS, new-generation anti-infective agents: DEINOVE is preparing to enter a first antibiotic candidate into Phase II. The Company is also pursuing the systematic exploration of biodiversity to supply its portfolio with new leads, drawing notably on partnerships with Naicons and bioMérieux (AGIR program supported by Bpifrance).
BIOACTIVES, Active ingredients of natural origin with cosmetics as the first market and potential in nutrition and health: DEINOVE is already marketing a first cosmetic active ingredient, a second in partnership with Greentech and plans to launch new proprietary assets in 2020. Several other cosmetic actives are in development, including with Oléos (Hallstar Group) and Dow. It also runs a program in animal nutrition with Groupe Avril.
Within the Euromedecine science park located in Montpellier, DEINOVE employs 62 employees, mainly researchers, engineers, and technicians, and has filed more than 300 patent applications internationally. The Company has been listed on EURONEXT GROWTH® since April 2010.
Discover what DEINOVE is doing in the search for new antibiotics.
Discover how DEINOVE develops innovative active molecules for the cosmetics industry.
Latest corporate releases
DEINOVE announces its financial calendar for 2020
DEINOVE (Euronext Growth Paris: ALDEI), a French biotech company that uses a disruptive approach to...
Evolution in DEINOVE's governance
Emmanuel PETIOT will resign as Chief Executive Officer ("CEO") as of December 31, 2019 Dr. Charles...
2019 Half-year consolidated results: Deinove's progress coming to fruition
Launch of the Phase II trial testing DNV3837 for first-line treatment of moderate to severe...
Investors, Corporate


text:
Carlo Allioni (23. září 1728 Turín – 30. července 1804 tamtéž) byl italský lékař a botanik.

Vyučoval botaniku na berlínské univerzitě a vedl botanickou zahradu v Turíně.

Dílo
Jeho nejvýznamnějším dílem bylo Flora Pedemontana, sive enumeratio methodica stirpium indigenarum Pedemontii, popis rostlinstva v Piemontu, s 2813 rostlinnými druhy, z toho 237 dosud neznámými. Roku 1766 vydal Manipulus Insectorum Tauriniensium.

 Rariorum Pedemontii stirpium. Specimen primum, 1755
 Stirpium preaecipuarium littoris et agri nicaeensis enumeratio methodica, 1757
 Flora Pedemontana, sive enumeratio methodica stirpium indigenarum Pedemontii, 1785
 Auctuarium ad Floram pedemontanam …, 1789

Švédský botanik Carl von Linné po něm pojmenoval rod Allionia z čeledi Nyctaginaceae. Tyto čtyři druhy nesou jeho jméno:
 Arabis allionii
 Jovibarba allioni
 Primula allioni
 Veronica allionii

Reference

Externí odkazy

Italští botanici
Italští lékaři
Italští vysokoškolští pedagogové
Členové Královské společnosti
Narození 23. září
Narození v roce 1728
Narození v Turíně
Úmrtí 30. července
Úmrtí v roce 1804
Úmrtí v Turíně
Muži


text:
Civil Rights & Social Justice
Working & The Economy
Estrella-Capital
#PennForward
Morning Coffee | Newsletter
The Lead | Blog
Pennsylvania Capital-Star
Why we must stand against American colonialism in the Middle East | Opinion
Capital-Star Op-Ed Contributor
Zeca Gonzalez speaks at a protest January 6 outside of the Federal Building in Downtown Pittsburgh. ( Pittsburgh Current photo by Jake Mysliwczyk)
By Zeca Gonzalez
I recently attended a protest aimed at condemning the possibility of military conflict with Iran. Considering our shameful history of interference in Iranian affairs, I believe we have a moral responsibility to speak out against this latest attempt at colonial slaughter.
The United States, in partnership with Great Britain, toppled the democratically elected prime minister of Iran in 1953. Prime Minister Mohammed Mossadegh's grand offense was attempting to nationalize an oil industry that was largely dominated by foreign companies. Shocking to think that Iranian national resources would be utilized to benefit its people. Following the ouster of Mossadegh, western forces installed the Shah, known as a brutal dictator.
The Shah wiped out most political opposition in the country, excluding forces organized by the Ayatollah Kohmeini. The Ayatollah was able to seize control of Iran in 1979, meaning that regime is younger than the band ABBA. Think about that. The end of foreign-imposed governance in Iran is a younger phenomenon than the song "Mamma Mia."
The United States responded to this defeat, by calmly and rationally reevaluating its position as a brutal imperialist force around the world.
We gave a bunch of chemical weapons to Iraq, so they could murder Iranian civillians in one of the most painful ways conceivable. Now you might be thinking to yourself, didn't Reagan also sell weapons to Iran so he could fund fascists in Central America?
Yup, we encouraged Iraq to attack Iran, and then made money by selling weapons to both sides.
Ignorance is not bliss: The dangerous politics of anti-intellectualism | Opinion
There's also that time in 1988, when we shot down a commercial airliner with hundreds of Iranian civilians aboard.
Yes, you read that right. Imagine the news coverage if they ever did that to us. Since the '80s, we've seen a smattering of proxy wars here and there.
Politicians have suggested full-scale invasion, occasionally using cutesy names like the "Axis of Evil" to bolster their cases. While, liberals have often presented the imposition of sanctions as the more humane option.
If you're unfamiliar with the concept of sanctions, that's when we attempt to starve a nation to encourage dissent among the local populace.
If you think that's an effective strategy for achieving our international goals as a country, then by all means make your case. I, for one, am opposed to letting people die of hunger or lack of medical care in the hopes that they will blame their government.
Furthermore, I am sick to death of allowing horrid policies to be sanitized by bland euphemisms.
This brings us to our current political moment. The president has committed an unprompted act of war and murdered the general of a country with whom we are not engaged in active hostilities. Some have speculated that this is a futile gesture to secure support during the 2020 election.
I find it absolutely believable that Trump would risk hundreds of thousands, if not millions, of people's lives for his own interest. However, these actions are also consistent with the historical perceptions of the United States toward the Middle East. The U.S. wants to own the Middle East, and Iran especially.
We have never forgiven them for escaping the orbit of our control, because we like to think that their resources are ours by birthright.
The U.S. is still in Iraq. Are we liberators? Or are we occupiers? The answer matters | Bruce Ledewitz
Let's be clear, this isn't about nuclear weapons. If we wanted to stop the proliferation of nuclear weapons in the Middle East, then we would have never given nukes to Israel.
There is no significant evidence that Iran is currently, nor have they ever, sought to develop nuclear weapons.
Even so, the best way to prevent the proliferation of nukes would have been to just leave in place the nuclear deal that Obama brokered with Iran.
You'll remember this as the deal conservatives absolutely hated, because their real goal isn't to peacefully negotiate nuclear non-proliferation. Conservatives, and many liberals, want any excuse possible to invade Iran.
This isn't about democracy. Our main allies in the Middle East include monarchies, military dictatorships, and apartheid states.
The United States does not actually care about democracy abroad, and we have only used that excuse when we sought to invade another country.
This is not about women's rights. How many women did we kill in our invasions of Iraq and Afghanistan? Two countries which, coincidentally, border Iran.
This is not about terrorism. If you want to stop the spread of terrorism, the most effective strategy would be to stop murdering civilians, which inspires their surviving family members to take up arms against us.
This is about maintaining colonial control in the region. The final excuse I hear often has to do with concern about "Iranian influence" in the Middle East.
Well then, let me end on a question about that: What makes Iranian influence so evil, and our's so good?
Zeca Gonzalez, of Pittsburgh, wrote this piece for the Pittsburgh Current, where it first appeared.
iran-attack
pittsburgh-current
pittsburgh-protests
A prayer for peace at the Pa. Capitol this weekend. It's a house we all live in | John L. Micek
Pa. Rep. Brendan Boyle pushes criminal investigation of Trump for Capitol attack
Pa. county commissioners roll out election reform wishlist; seek longer pre-canvassing window | Friday Morning Coffee
A Twitter List by Pennsylvania Capital-Star
Get the latest news and commentary from the Capital-Star, hot and fresh in your inbox M-F morning.
▪ You must give Pennsylvania Capital-Star credit, including https://www.penncapital-star.com/ and author.
▪ If you publish online, include the links from the story, and a link to Pennsylvania Capital-Star.
▪ You can publish our graphics and any photos that are credit to Pennsylvania Capital-Star with the stories with which they originally appeared. For any other uses, you must seek permission from us at [email protected]
▪ If you share the story on social media, please mention PennCapitalStar on Twitter and penncapitalstar on Facebook.
by Capital-Star Op-Ed Contributor, Pennsylvania Capital-Star

Why we must stand against American colonialism in the Middle East | Opinion

by Capital-Star Op-Ed Contributor, Pennsylvania Capital-Star
January 17, 2020

Pennsylvania Capital-Star is part of States Newsroom, a network of news outlets supported by grants and a coalition of donors as a 501c(3) public charity. Pennsylvania Capital-Star maintains editorial independence. Contact Editor John Micek for questions: info@penncapital-star.com. Follow Pennsylvania Capital-Star on Facebook and Twitter.
© Pennsylvania Capital-Star 2021
A prayer for peace at the Pa. Capitol this weekend. It's...
Pa. Rep. Brendan Boyle pushes criminal investigation of Trump for Capitol...
.sf-menu>li>a{ font-size: 13px; text-transform: none; font-weight: normal; padding:0 12px; } .td-header-menu-wrap{ border-top:solid 6px #3A4EA2; } .td-post-category { display: none !important; background-color: black !important; }