text:
<?php
/**
 * BuddyPress Messages Classes.
 *
 * @package BuddyPress
 * @subpackage MessagesClasses
 * @since 1.0.0
 */

// Exit if accessed directly.
defined( 'ABSPATH' ) || exit;

/**
 * BuddyPress Message Thread class.
 *
 * @since 1.0.0
 */
class BP_Messages_Thread {

	/**
	 * The message thread ID.
	 *
	 * @since 1.0.0
	 * @var int
	 */
	public $thread_id;

	/**
	 * The current messages.
	 *
	 * @since 1.0.0
	 * @var array
	 */
	public $messages;

	/**
	 * The current recipients in the message thread.
	 *
	 * @since 1.0.0
	 * @var array
	 */
	public $recipients;

	/**
	 * The user IDs of all messages in the message thread.
	 *
	 * @since 1.2.0
	 * @var array
	 */
	public $sender_ids;

	/**
	 * The unread count for the logged-in user.
	 *
	 * @since 1.2.0
	 * @var int
	 */
	public $unread_count;

	/**
	 * The content of the last message in this thread.
	 *
	 * @since 1.2.0
	 * @var string
	 */
	public $last_message_content;

	/**
	 * The date of the last message in this thread.
	 *
	 * @since 1.2.0
	 * @var string
	 */
	public $last_message_date;

	/**
	 * The ID of the last message in this thread.
	 *
	 * @since 1.2.0
	 * @var int
	 */
	public $last_message_id;

	/**
	 * The subject of the last message in this thread.
	 *
	 * @since 1.2.0
	 * @var string
	 */
	public $last_message_subject;

	/**
	 * The user ID of the author of the last message in this thread.
	 *
	 * @since 1.2.0
	 * @var int
	 */
	public $last_sender_id;

	/**
	 * Sort order of the messages in this thread (ASC or DESC).
	 *
	 * @since 1.5.0
	 * @var string
	 */
	public $messages_order;

	/**
	 * Constructor.
	 *
	 * @since 1.0.0
	 *
	 * @see BP_Messages_Thread::populate() for full description of parameters.
	 *
	 * @param bool   $thread_id ID for the message thread.
	 * @param string $order     Order to display the messages in.
	 * @param array  $args      Array of arguments for thread querying.
	 */
	public function __construct( $thread_id = false, $order = 'ASC', $args = array() ) {
		if ( $thread_id ) {
			$this->populate( $thread_id, $order, $args );
		}
	}

	/**
	 * Populate method.
	 *
	 * Used in constructor.
	 *
	 * @since 1.0.0
	 *
	 * @param int    $thread_id The message thread ID.
	 * @param string $order     The order to sort the messages. Either 'ASC' or 'DESC'.
	 * @param array  $args {
	 *     Array of arguments.
	 *     @type bool $update_meta_cache Whether to pre-fetch metadata for
	 *                                   queried message items. Default: true.
	 * }
	 * @return bool False on failure.
	 */
	public function populate( $thread_id = 0, $order = 'ASC', $args = array() ) {

		if ( 'ASC' !== $order && 'DESC' !== $order ) {
			$order = 'ASC';
		}

		// Merge $args with our defaults.
		$r = wp_parse_args( $args, array(
			'user_id'           => bp_loggedin_user_id(),
			'update_meta_cache' => true
		) );

		$this->messages_order = $order;
		$this->thread_id      = (int) $thread_id;

		// Get messages for thread.
		$this->messages = self::get_messages( $this->thread_id );

		if ( empty( $this->messages ) || is_wp_error( $this->messages ) ) {
			return false;
		}

		// Flip if order is DESC.
		if ( 'DESC' === $order ) {
			$this->messages = array_reverse( $this->messages );
		}

		$last_message_index         = count( $this->messages ) - 1;
		$this->last_message_id      = $this->messages[ $last_message_index ]->id;
		$this->last_message_date    = $this->messages[ $last_message_index ]->date_sent;
		$this->last_sender_id       = $this->messages[ $last_message_index ]->sender_id;
		$this->last_message_subject = $this->messages[ $last_message_index ]->subject;
		$this->last_message_content = $this->messages[ $last_message_index ]->message;

		foreach ( (array) $this->messages as $key => $message ) {
			$this->sender_ids[ $message->sender_id ] = $message->sender_id;
		}

		// Fetch the recipients.
		$this->recipients = $this->get_recipients();

		// Get the unread count for the logged in user.
		if ( isset( $this->recipients[ $r['user_id'] ] ) ) {
			$this->unread_count = $this->recipients[ $r['user_id'] ]->unread_count;
		}

		// Grab all message meta.
		if ( true === (bool) $r['update_meta_cache'] ) {
			bp_messages_update_meta_cache( wp_list_pluck( $this->messages, 'id' ) );
		}

		/**
		 * Fires after a BP_Messages_Thread object has been populated.
		 *
		 * @since 2.2.0
		 *
		 * @param BP_Messages_Thread $this Message thread object.
		 */
		do_action( 'bp_messages_thread_post_populate', $this );
	}

	/**
	 * Mark a thread initialized in this class as read.
	 *
	 * @since 1.0.0
	 *
	 * @see BP_Messages_Thread::mark_as_read()
	 */
	public function mark_read() {
		BP_Messages_Thread::mark_as_read( $this->thread_id );
	}

	/**
	 * Mark a thread initialized in this class as unread.
	 *
	 * @since 1.0.0
	 *
	 * @see BP_Messages_Thread::mark_as_unread()
	 */
	public function mark_unread() {
		BP_Messages_Thread::mark_as_unread( $this->thread_id );
	}

	/**
	 * Returns recipients for a message thread.
	 *
	 * @since 1.0.0
	 * @since 2.3.0 Added $thread_id as a parameter.
	 *
	 * @param int $thread_id The thread ID.
	 * @return array
	 */
	public function get_recipients( $thread_id = 0 ) {
		global $wpdb;

		if ( empty( $thread_id ) ) {
			$thread_id = $this->thread_id;
		}

		$thread_id = (int) $thread_id;

		$recipients = wp_cache_get( 'thread_recipients_' . $thread_id, 'bp_messages' );
		if ( false === $recipients ) {
			$bp = buddypress();

			$recipients = array();
			$sql        = $wpdb->prepare( "SELECT * FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d", $thread_id );
			$results    = $wpdb->get_results( $sql );

			foreach ( (array) $results as $recipient ) {
				$recipients[ $recipient->user_id ] = $recipient;
			}

			wp_cache_set( 'thread_recipients_' . $thread_id, $recipients, 'bp_messages' );
		}

		/**
		 * Filters the recipients of a message thread.
		 *
		 * @since 2.2.0
		 *
		 * @param array $recipients Array of recipient objects.
		 * @param int   $thread_id  ID of the current thread.
		 */
		return apply_filters( 'bp_messages_thread_get_recipients', $recipients, $thread_id );
	}

	/** Static Functions ******************************************************/

	/**
	 * Get all messages associated with a thread.
	 *
	 * @since 2.3.0
	 *
	 * @param int $thread_id The message thread ID.
	 *
	 * @return object List of messages associated with a thread.
	 */
	public static function get_messages( $thread_id = 0 ) {
		$thread_id = (int) $thread_id;
		$messages  = wp_cache_get( $thread_id, 'bp_messages_threads' );

		if ( false === $messages ) {
			global $wpdb;

			$bp = buddypress();

			// Always sort by ASC by default.
			$messages = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$bp->messages->table_name_messages} WHERE thread_id = %d ORDER BY date_sent ASC", $thread_id ) );

			wp_cache_set( $thread_id, (array) $messages, 'bp_messages_threads' );
		}

		return $messages;
	}

	/**
	 * Static method to get message recipients by thread ID.
	 *
	 * @since 2.3.0
	 *
	 * @param int $thread_id The thread ID.
	 * @return array
	 */
	public static function get_recipients_for_thread( $thread_id = 0 ) {
		$thread = new self( false );
		return $thread->get_recipients( $thread_id );
	}

	/**
	 * Mark messages in a thread as deleted or delete all messages in a thread.
	 *
	 * Note: All messages in a thread are deleted once every recipient in a thread
	 * has marked the thread as deleted.
	 *
	 * @since 1.0.0
	 *
	 * @param int $thread_id The message thread ID.
	 * @return bool
	 */
	public static function delete( $thread_id = 0 ) {
		global $wpdb;

		$thread_id = (int) $thread_id;

		/**
		 * Fires before a message thread is marked as deleted.
		 *
		 * @since 2.2.0
		 *
		 * @param int $thread_id ID of the thread being deleted.
		 */
		do_action( 'bp_messages_thread_before_mark_delete', $thread_id );

		$bp = buddypress();

		// Mark messages as deleted
		//
		// @todo the reliance on bp_loggedin_user_id() sucks for plugins
		// refactor this method to accept a $user_id parameter.
		$wpdb->query( $wpdb->prepare( "UPDATE {$bp->messages->table_name_recipients} SET is_deleted = 1 WHERE thread_id = %d AND user_id = %d", $thread_id, bp_loggedin_user_id() ) );

		// Get the message ids in order to pass to the action.
		$message_ids = $wpdb->get_col( $wpdb->prepare( "SELECT id FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) );

		// Check to see if any more recipients remain for this message.
		$recipients = $wpdb->get_results( $wpdb->prepare( "SELECT id FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d AND is_deleted = 0", $thread_id ) );

		// No more recipients so delete all messages associated with the thread.
		if ( empty( $recipients ) ) {

			/**
			 * Fires before an entire message thread is deleted.
			 *
			 * @since 2.2.0
			 *
			 * @param int   $thread_id   ID of the thread being deleted.
			 * @param array $message_ids IDs of messages being deleted.
			 */
			do_action( 'bp_messages_thread_before_delete', $thread_id, $message_ids );

			// Delete all the messages.
			$wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) );

			// Do something for each message ID.
			foreach ( $message_ids as $message_id ) {

				// Delete message meta.
				bp_messages_delete_meta( $message_id );

				/**
				 * Fires after a message is deleted. This hook is poorly named.
				 *
				 * @since 1.0.0
				 *
				 * @param int $message_id ID of the message.
				 */
				do_action( 'messages_thread_deleted_thread', $message_id );
			}

			// Delete all the recipients.
			$wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d", $thread_id ) );
		}

		/**
		 * Fires after a message thread is either marked as deleted or deleted.
		 *
		 * @since 2.2.0
		 *
		 * @param int   $thread_id   ID of the thread being deleted.
		 * @param array $message_ids IDs of messages being deleted.
		 */
		do_action( 'bp_messages_thread_after_delete', $thread_id, $message_ids );

		return true;
	}

	/**
	 * Get current message threads for a user.
	 *
	 * @since 1.0.0
	 *
	 * @param array $args {
	 *     Array of arguments.
	 *     @type int    $user_id      The user ID.
	 *     @type string $box          The type of mailbox to get. Either 'inbox' or 'sentbox'.
	 *                                Defaults to 'inbox'.
	 *     @type string $type         The type of messages to get. Either 'all' or 'unread'
	 *                                or 'read'. Defaults to 'all'.
	 *     @type int    $limit        The number of messages to get. Defaults to null.
	 *     @type int    $page         The page number to get. Defaults to null.
	 *     @type string $search_terms The search term to use. Defaults to ''.
	 *     @type array  $meta_query   Meta query arguments. See WP_Meta_Query for more details.
	 * }
	 * @return array|bool Array on success. Boolean false on failure.
	 */
	public static function get_current_threads_for_user( $args = array() ) {
		global $wpdb;

		// Backward compatibility with old method of passing arguments.
		if ( ! is_array( $args ) || func_num_args() > 1 ) {
			_deprecated_argument( __METHOD__, '2.2.0', sprintf( __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) );

			$old_args_keys = array(
				0 => 'user_id',
				1 => 'box',
				2 => 'type',
				3 => 'limit',
				4 => 'page',
				5 => 'search_terms',
			);

			$func_args = func_get_args();
			$args      = bp_core_parse_args_array( $old_args_keys, $func_args );
		}

		$r = bp_parse_args( $args, array(
			'user_id'      => false,
			'box'          => 'inbox',
			'type'         => 'all',
			'limit'        => null,
			'page'         => null,
			'search_terms' => '',
			'meta_query'   => array()
		) );

		$pag_sql = $type_sql = $search_sql = $user_id_sql = $sender_sql = '';
		$meta_query_sql = array(
			'join'  => '',
			'where' => ''
		);

		if ( $r['limit'] && $r['page'] ) {
			$pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $r['page'] - 1 ) * $r['limit'] ), intval( $r['limit'] ) );
		}

		if ( $r['type'] == 'unread' ) {
			$type_sql = " AND r.unread_count != 0 ";
		} elseif ( $r['type'] == 'read' ) {
			$type_sql = " AND r.unread_count = 0 ";
		}

		if ( ! empty( $r['search_terms'] ) ) {
			$search_terms_like = '%' . bp_esc_like( $r['search_terms'] ) . '%';
			$search_sql        = $wpdb->prepare( "AND ( subject LIKE %s OR message LIKE %s )", $search_terms_like, $search_terms_like );
		}

		$r['user_id'] = (int) $r['user_id'];

		// Default deleted SQL.
		$deleted_sql = 'r.is_deleted = 0';

		switch ( $r['box'] ) {
			case 'sentbox' :
				$user_id_sql = 'AND ' . $wpdb->prepare( 'm.sender_id = %d', $r['user_id'] );
				$sender_sql  = 'AND m.sender_id = r.user_id';
				break;

			case 'inbox' :
				$user_id_sql = 'AND ' . $wpdb->prepare( 'r.user_id = %d', $r['user_id'] );
				$sender_sql  = 'AND r.sender_only = 0';
				break;

			default :
				// Omit user-deleted threads from all other custom message boxes.
				$deleted_sql = $wpdb->prepare( '( r.user_id = %d AND r.is_deleted = 0 )', $r['user_id'] );
				break;
		}

		// Process meta query into SQL.
		$meta_query = self::get_meta_query_sql( $r['meta_query'] );
		if ( ! empty( $meta_query['join'] ) ) {
			$meta_query_sql['join'] = $meta_query['join'];
		}
		if ( ! empty( $meta_query['where'] ) ) {
			$meta_query_sql['where'] = $meta_query['where'];
		}

		$bp = buddypress();

		// Set up SQL array.
		$sql = array();
		$sql['select'] = 'SELECT m.thread_id, MAX(m.date_sent) AS date_sent';
		$sql['from']   = "FROM {$bp->messages->table_name_recipients} r INNER JOIN {$bp->messages->table_name_messages} m ON m.thread_id = r.thread_id {$meta_query_sql['join']}";
		$sql['where']  = "WHERE {$deleted_sql} {$user_id_sql} {$sender_sql} {$type_sql} {$search_sql} {$meta_query_sql['where']}";
		$sql['misc']   = "GROUP BY m.thread_id ORDER BY date_sent DESC {$pag_sql}";

		// Get thread IDs.
		$thread_ids = $wpdb->get_results( implode( ' ', $sql ) );
		if ( empty( $thread_ids ) ) {
			return false;
		}

		// Adjust $sql to work for thread total.
		$sql['select'] = 'SELECT COUNT( DISTINCT m.thread_id )';
		unset( $sql['misc'] );
		$total_threads = $wpdb->get_var( implode( ' ', $sql ) );

		// Sort threads by date_sent.
		foreach( (array) $thread_ids as $thread ) {
			$sorted_threads[ $thread->thread_id ] = strtotime( $thread->date_sent );
		}

		arsort( $sorted_threads );

		$threads = array();
		foreach ( (array) $sorted_threads as $thread_id => $date_sent ) {
			$threads[] = new BP_Messages_Thread( $thread_id, 'ASC', array(
				'update_meta_cache' => false
			) );
		}

		/**
		 * Filters the results of the query for a user's message threads.
		 *
		 * @since 2.2.0
		 *
		 * @param array $value {
		 *     @type array $threads       Array of threads. Passed by reference.
		 *     @type int   $total_threads Number of threads found by the query.
		 * }
		 */
		return apply_filters( 'bp_messages_thread_current_threads', array(
			'threads' => &$threads,
			'total'   => (int) $total_threads
		) );
	}

	/**
	 * Get the SQL for the 'meta_query' param in BP_Messages_Thread::get_current_threads_for_user().
	 *
	 * We use WP_Meta_Query to do the heavy lifting of parsing the meta_query array
	 * and creating the necessary SQL clauses.
	 *
	 * @since 2.2.0
	 *
	 * @param array $meta_query An array of meta_query filters. See the
	 *                          documentation for WP_Meta_Query for details.
	 * @return array $sql_array 'join' and 'where' clauses.
	 */
	public static function get_meta_query_sql( $meta_query = array() ) {
		global $wpdb;

		$sql_array = array(
			'join'  => '',
			'where' => '',
		);

		if ( ! empty( $meta_query ) ) {
			$meta_query = new WP_Meta_Query( $meta_query );

			// WP_Meta_Query expects the table name at
			// $wpdb->messagemeta.
			$wpdb->messagemeta = buddypress()->messages->table_name_meta;

			return $meta_query->get_sql( 'message', 'm', 'id' );
		}

		return $sql_array;
	}

	/**
	 * Mark a thread as read.
	 *
	 * @since 1.0.0
	 *
	 * @param int $thread_id The message thread ID.
	 */
	public static function mark_as_read( $thread_id = 0 ) {
		global $wpdb;

		$bp  = buddypress();
		$sql = $wpdb->prepare( "UPDATE {$bp->messages->table_name_recipients} SET unread_count = 0 WHERE user_id = %d AND thread_id = %d", bp_loggedin_user_id(), $thread_id );
		$wpdb->query( $sql );

		wp_cache_delete( 'thread_recipients_' . $thread_id, 'bp_messages' );
		wp_cache_delete( bp_loggedin_user_id(), 'bp_messages_unread_count' );
	}

	/**
	 * Mark a thread as unread.
	 *
	 * @since 1.0.0
	 *
	 * @param int $thread_id The message thread ID.
	 */
	public static function mark_as_unread( $thread_id = 0 ) {
		global $wpdb;

		$bp  = buddypress();
		$sql = $wpdb->prepare( "UPDATE {$bp->messages->table_name_recipients} SET unread_count = 1 WHERE user_id = %d AND thread_id = %d", bp_loggedin_user_id(), $thread_id );
		$wpdb->query( $sql );

		wp_cache_delete( 'thread_recipients_' . $thread_id, 'bp_messages' );
		wp_cache_delete( bp_loggedin_user_id(), 'bp_messages_unread_count' );
	}

	/**
	 * Returns the total number of message threads for a user.
	 *
	 * @since 1.0.0
	 *
	 * @param int    $user_id The user ID.
	 * @param string $box     The type of mailbox to get. Either 'inbox' or 'sentbox'.
	 *                        Defaults to 'inbox'.
	 * @param string $type    The type of messages to get. Either 'all' or 'unread'.
	 *                        or 'read'. Defaults to 'all'.
	 * @return int $value Total thread count for the provided user.
	 */
	public static function get_total_threads_for_user( $user_id, $box = 'inbox', $type = 'all' ) {
		global $wpdb;

		$exclude_sender = $type_sql = '';
		if ( $box !== 'sentbox' ) {
			$exclude_sender = 'AND sender_only != 1';
		}

		if ( $type === 'unread' ) {
			$type_sql = 'AND unread_count != 0';
		} elseif ( $type === 'read' ) {
			$type_sql = 'AND unread_count = 0';
		}

		$bp = buddypress();

		return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(thread_id) FROM {$bp->messages->table_name_recipients} WHERE user_id = %d AND is_deleted = 0 {$exclude_sender} {$type_sql}", $user_id ) );
	}

	/**
	 * Determine if the logged-in user is a sender of any message in a thread.
	 *
	 * @since 1.0.0
	 *
	 * @param int $thread_id The message thread ID.
	 * @return bool
	 */
	public static function user_is_sender( $thread_id ) {
		global $wpdb;

		$bp = buddypress();

		$sender_ids = $wpdb->get_col( $wpdb->prepare( "SELECT sender_id FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) );

		if ( empty( $sender_ids ) ) {
			return false;
		}

		return in_array( bp_loggedin_user_id(), $sender_ids );
	}

	/**
	 * Returns the userlink of the last sender in a message thread.
	 *
	 * @since 1.0.0
	 *
	 * @param int $thread_id The message thread ID.
	 * @return string|bool The user link on success. Boolean false on failure.
	 */
	public static function get_last_sender( $thread_id ) {
		global $wpdb;

		$bp = buddypress();

		if ( ! $sender_id = $wpdb->get_var( $wpdb->prepare( "SELECT sender_id FROM {$bp->messages->table_name_messages} WHERE thread_id = %d GROUP BY sender_id ORDER BY date_sent LIMIT 1", $thread_id ) ) ) {
			return false;
		}

		return bp_core_get_userlink( $sender_id, true );
	}

	/**
	 * Gets the unread message count for a user.
	 *
	 * @since 1.0.0
	 *
	 * @param int $user_id The user ID.
	 * @return int $unread_count Total inbox unread count for user.
	 */
	public static function get_inbox_count( $user_id = 0 ) {
		global $wpdb;

		if ( empty( $user_id ) ) {
			$user_id = bp_loggedin_user_id();
		}

		$unread_count = wp_cache_get( $user_id, 'bp_messages_unread_count' );

		if ( false === $unread_count ) {
			$bp = buddypress();

			$unread_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT SUM(unread_count) FROM {$bp->messages->table_name_recipients} WHERE user_id = %d AND is_deleted = 0 AND sender_only = 0", $user_id ) );

			wp_cache_set( $user_id, $unread_count, 'bp_messages_unread_count' );
		}

		/**
		 * Filters a user's unread message count.
		 *
		 * @since 2.2.0
		 *
		 * @param int $unread_count Unread message count.
		 * @param int $user_id      ID of the user.
		 */
		return apply_filters( 'messages_thread_get_inbox_count', (int) $unread_count, $user_id );
	}

	/**
	 * Checks whether a user is a part of a message thread discussion.
	 *
	 * @since 1.0.0
	 *
	 * @param int $thread_id The message thread ID.
	 * @param int $user_id   The user ID.
	 * @return int|null The recorded recipient ID on success, null on failure.
	 */
	public static function check_access( $thread_id, $user_id = 0 ) {

		if ( empty( $user_id ) ) {
			$user_id = bp_loggedin_user_id();
		}

		$recipients = self::get_recipients_for_thread( $thread_id );

		if ( isset( $recipients[ $user_id ] ) && 0 == $recipients[ $user_id ]->is_deleted ) {
			return $recipients[ $user_id ]->id;
		} else {
			return null;
		}
	}

	/**
	 * Checks whether a message thread exists.
	 *
	 * @since 1.0.0
	 *
	 * @param int $thread_id The message thread ID.
	 * @return int|null The message thread ID on success, null on failure.
	 */
	public static function is_valid( $thread_id = 0 ) {

		// Bail if no thread ID is passed.
		if ( empty( $thread_id ) ) {
			return false;
		}

		$thread = self::get_messages( $thread_id );

		if ( ! empty( $thread ) ) {
			return $thread_id;
		} else {
			return null;
		}
	}

	/**
	 * Returns a string containing all the message recipient userlinks.
	 *
	 * String is comma-delimited.
	 *
	 * If a message thread has more than four users, the returned string is simply
	 * "X Recipients" where "X" is the number of recipients in the message thread.
	 *
	 * @since 1.0.0
	 *
	 * @param array $recipients Array containing the message recipients (array of objects).
	 * @return string $value String of message recipent userlinks.
	 */
	public static function get_recipient_links( $recipients ) {

		if ( count( $recipients ) >= 5 ) {
			return sprintf( __( '%s Recipients', 'buddypress' ), number_format_i18n( count( $recipients ) ) );
		}

		$recipient_links = array();

		foreach ( (array) $recipients as $recipient ) {
			$recipient_link = bp_core_get_userlink( $recipient->user_id );

			if ( empty( $recipient_link ) ) {
				$recipient_link = __( 'Deleted User', 'buddypress' );
			}

			$recipient_links[] = $recipient_link;
		}

		return implode( ', ', (array) $recipient_links );
	}

	/**
	 * Upgrade method for the older BP message thread DB table.
	 *
	 * @since 1.2.0
	 *
	 * @todo We should remove this.  No one is going to upgrade from v1.1, right?
	 * @return bool
	 */
	public static function update_tables() {
		global $wpdb;

		$bp_prefix = bp_core_get_table_prefix();
		$errors    = false;
		$threads   = $wpdb->get_results( "SELECT * FROM {$bp_prefix}bp_messages_threads" );

		// Nothing to update, just return true to remove the table.
		if ( empty( $threads ) ) {
			return true;
		}

		$bp = buddypress();

		foreach( (array) $threads as $thread ) {
			$message_ids = maybe_unserialize( $thread->message_ids );

			if ( ! empty( $message_ids ) ) {
				$message_ids = implode( ',', $message_ids );

				// Add the thread_id to the messages table.
				if ( ! $wpdb->query( $wpdb->prepare( "UPDATE {$bp->messages->table_name_messages} SET thread_id = %d WHERE id IN ({$message_ids})", $thread->id ) ) ) {
					$errors = true;
				}
			}
		}

		return (bool) ! $errors;
	}
}


When EJ experimented on his haircut, hubby had to fix it through shaving his hair. After the hair cut and a bath, EJ felt pretty good about his hair, wore my sunglasses and kept asking us "How do I look now?".
Parents are so blessed when they have kids because there's always joy in most of the things they do.
Their laughter brings harmony in every family's home.
I thank God all the time for giving us the best opportunity and the most challenging job there is.. being Parents!


text:
Future Talent Forum: What will be your legacy?
Changeboard Team
24 Aug 2016 • by Changeboard Team
Robert Rowland-Smith, faculty member at The School of Life, facilitated the conversation, honing in on three key areas: politics, philosophy and business.
First, members were invited to consider the point at which legacy should be identified. "Aristotle argued that your legacy should be called when you're dead, but a symptom of the modern world is that we are quick to call people's legacies," Rowland-Smith suggested.
Political figures, including former UK prime ministers Tony Blair and Margaret Thatcher, and former South African president Nelson Mandela, were discussed, with one delegate suggesting that worrying about your own legacy could be considered an hubristic act.
Rowland-Smith urged attendees to discuss how people might be negatively affected and overshadowed by legacy. "If you try to be like someone else, you just become a poor interpretation of yourself," he argued.
He concluded the evening by inviting members to discuss legacy in business, questioning whether it is simply a cult of personality, spin and PR. Delegates agreed that many leaders attach too much importance to the legacy of individuals rather than to the legacy of the work they do, and concurred that the best-performing companies have leaders who do not care about themselves.
Interested in joining our Future Talent Forum? Find out more about our events, topics and networking opportunities here.
By Changeboard Team

redpajama_set_name: RedPajamaCommonCrawl


Johnson City Press: What is the future of Bitcoin?
Local entrepreneur and Symply Health CEO John Cannon thinks Bitcoin and other cryptocurrencies have the potential to radically change commerce, monetary policy and the way we see money.
Innovation Lab at East Tennessee State University will host Cannon's forum, "Bitcoin and Cryptocurrencies: Myths vs. Reality," on Feb. 13 at 6 p.m. Cannon plans to discuss his research into alternative currencies and teach people who are new to cryptocurrencies more about how they work and what makes them different from traditional currencies.
"I got into Bitcoin around six months ago and found the lack of information that was easy to understand and accurate really troubling," he said. "So I pursued a project to research this myself and the presentation is to share that information.
Even after Bitcoin tumbled Friday, bringing the total market value of cryptocurrencies down to around $400 billion — half the high it reached in January — Cannon is still optimistic about the future of this new technology.
"When people ask me about the price fluctuations, it doesn't bother me at all, because I'm looking at it as a long-term thing. When the price goes down, that just means more people will be able to buy into it," he said.
Cannon said it once took him weeks to send money to Istanbul for a business transaction. The money traveled from a bank in Johnson City, to a bank in New York, then a bank in Switzerland and finally to Istanbul. But when the money made it to Istanbul, he said it was posted in the form of Swiss francs. "Somebody screwed up somewhere," he said.
"You don't have any of those issues with Bitcoin. If I want to send Bitcoin to someone in Turkey, it'll be a matter of minutes," he said.
To Cannon, it isn't just about streamlining transactions — it's also about fundamentally changing the way money works.
"There was clearly a strong libertarian influence in the early days, but I would say anyone who cares about the value of their currency is drawn to it," he said. "Bitcoin is not owned by anyone, it is not controlled by anyone, there is no central bank, there is no monetary policy.
Cannon's forum is free and open to the public. Space is limited, so call 423-439-8500 or 423-930-6541 to register. For disability accommodations, call the ETSU Office of Disability Services at 423-439-8346.
For more information about the ETSU Innovation Lab, visit www.etsu.edu/ilab.


Took the GA5 to see Oli today, as he knows a bunch more about amps than I do and I was sorting and IDing a load of old (and I mean old) Warhammer stuff for him.
Turns out the problem is the power amp valve (EL84)... which it had occured to me it might be but without any other valves to test it with I couldn't be sure. Just glad it wasn't the power transformer really, as apparently those can be expensive.
So next thing is to get a new valve, I might replace the 12AX7 at the same time just so then it's full of all new valves. Oli tested it with Mullards, but I suspect those'll be a bit out of my price range.


I see supervision as a collaborative experience and aim to provide a space where you can reflect on your relationship with your client and how this is impacting you, while feeling supported and perhaps challenged too, with the aim of enhancing your practice and enabling you as a therapist to work towards the best possible practice for your clients.
I provide clinical supervision for trainee as well as experienced counsellors and psychotherapists and have experience of working with Integrative, Gestalt as well as TA therapists, on both a group and individual basis. I am a group supervisor for the Olive Branch in Winchester.
I take an integrative approach to supervision combining my Transactional Analysis training with a relational approach.
I am fully qualified and hold an Advanced Diploma in Relational Supervision.
If, having read the above you, are interested in meeting me, please feel free to get in touch to arrange an initial half hour, informal session to see if we might work together, choosing your supervisor is important. I look forward to hearing from you.
(Please mention which practice: Christchurch or Winchester).
I charge £45 per 50 minute session.
My practice is located near Christchurch in Dorset, within easy reach of Southbourne, Bournemouth, Ringwood, New Milton, Lymington, Brockenhurst and The New Forest.
I also work in Winchester city centre.


A French cardinal was given a six-month suspended sentence at a civil trial after he was found guilty of covering up abuses committed decades ago by a priest.
Lyon Cardinal Philippe Barbarin, 68, was convicted March 7 of covering up abuse by Rev. Bernard Preynat, who confessed to abusing minors at Lyon's Saint-Luc Parish, where he ran a large Catholic Scout group in the 1970s and 1980s.
In a brief statement to journalists following the verdict March 7, Cardinal Barbarin expressed his "compassion for the victims" and said he would meet with Pope Francis to hand in his resignation.
While he was not allowed to lead any scout groups, he still taught children, according to Agence France-Presse. Father Preynat was suspended and ordered to not work with children in 2015. He has been charged with sexual abuse and is expected to face trial this year.
"It will be up to the pope to decide the action he deems appropriate," the conference's statement said.
Although the abuses occurred before Cardinal Barbarin led the Archdiocese of Lyon, Father Preynat's victims accused the cardinal of having been aware of the accusations from at least 2010 and covering them up with orders from the Vatican.
Among the officials named in the trial was Spanish Cardinal Francisco Ladaria Ferrer, then secretary and now prefect of the Vatican's doctrinal congregation.
The cardinal took the stand at the civil trial Jan. 7 and maintained his innocence. According to AP, Cardinal Barbarin's lawyer argued that his client never obstructed justice because the statute of limitations had passed on the acts in question by the time he was informed.
At the trial, Cardinal Barbarin said when he initially heard of the accusations, he encouraged one of the alleged victims to contact other victims and, "thanks to that," the case against Father Preynat was able to be built, the Associated Press reported.


text:
Q: Rails - Adding to an array in db I have a column, called "plan selection", of arrays in a table called "Current Plans" that I want to be able to add additional values to these arrays.
For Example: If the array is currently ["a", "b", "c"], I want to be able to add a fourth element, "d", to the array.
So far I have created a new action in my Current Plans controller:
def addplan
    p = CurrentPlan.find(12)
    p.plan_selection << "Test"
    p.save
    redirect_to:back
end

However, while the code doesn't break, it also doesn't do anything at all except redirect me back to the same page.
Started POST "/clients/1/quotes/36/current_plans/12/addplan" for 66.186.164.130 at 2015-07-23 17:03:43 +0000
Processing by CurrentPlansController#addplan as HTML
  Parameters: {"authenticity_token"=>"83OuJJLivjOCXgzoKkPnzqz8HBk=", "client_id"=>"1", "quote_id"=>"36", "current_plan_id"=>"12"}
  CurrentPlan Load (30.6ms)  SELECT  "current_plans".* FROM "current_plans"  WHERE "current_plans"."id" = $1 LIMIT 1  [["id", 12]]
   (30.5ms)  BEGIN
   (30.3ms)  COMMIT
Redirected to http://crossing-mmiller.c9.io/clients/1/quotes/36/current_plans/12/
Completed 302 Found in 240ms (ActiveRecord: 213.1ms)

Route:
resources :current_plans do
    collection { post :planselection }
    post :addplan
end

Any help would be greatly appreciated!
Current Plans Schema:
create_table "current_plans", force: true do |t|
    t.integer  "client_id"
    t.string   "client_name"
    t.string   "plan_name"
    t.integer  "plan_year"
    t.string   "classification"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "plan_number"
    t.date     "effective_date"
    t.string   "quote_name"
    t.string   "plan_selection", default: [], array: true
    t.integer  "quote_id"
    t.integer  "benefit_detail_id"
    t.float    "group_premium"
end

Current Plan Model:
class CurrentPlan < ActiveRecord::Base
   belongs_to :quote
   belongs_to :client
end

A: The problem is that the statement you're using doesn't mark the field as dirty so the record is not updated. This is a known problem with serialized fields in Rails.
The solution is using a different syntax:

p.plan_selection = p.plan_selection.push("Test")

By the way, the table field is an array, which Rails is already aware of by reading the schema so you don't need and should not flag it as serialized in the model.

A: @boulder was correct in that the field wasn't being marked as dirty but the solution that turned out to work was adding this line p.plan_selection_will_change! before pushing "Test" into the array.

redpajama_set_name: RedPajamaStackExchange


text:
Humanities Center (EN)
Montaño, Julián
M.B.A., IE Business School (ES). M.A. in Philosophy, University of Glasgow (GB). B.A. in Philosophy, Universidad de Sevilla (ES).
Professor Julián Montaño's research engages in central issues in epistemology (the nature of justification, relativism, testimony), social philosophy (cultural relativism, the concept of tradition, social & common goods) and philosophy of education (the concept of innovation, the place of humanities in higher education, the nature of educational institutions). Among his interests are subjects like Frege, P. T. Geach, Saint Thomas Aquinas, Analytical Thomism and Scottish Enlightenment. His current research project focuses on the epistemology of testimony and the account provided by the XVIII c. philosopher Thomas Reid. Other topics of interest include: logic and argumentation, Iris Murdoch and T.S. Eliot. Currently he is Academic Advisor in the Admissions Department. He has developed his professional career in marketing, in industries different to higher education, especially media and entertainment, with positions in Pearson Group and Walt Disney Television international.
IE LAW SCHOOL
IE SCHOOL OF ARCHITECTURE AND DESIGN
IE SCHOOL OF HUMAN SCIENCES AND TECHNOLOGY
IE SCHOOL OF GLOBAL AND PUBLIC AFFAIRS
IE EXPONENTIAL LEARNING
Legal Notice | Privacy policy | Cookies policy | International Offices | Contact
INQUIRY -
We use both our own and third-party cookies to enhance our services and to offer you the content that most suits your preferences by analysing your browsing habits. Your continued use of the site means that you accept these cookies. You may change your settings and obtain more information here. Accept


text:
Q: Formatting Cells within a Selection Loop I have a loop macro that changes a row of dates based on cells I have selected. Is there an easy way to format these cells without complicating the code. My company has policies around keeping Macros as simple as possible.
I have tried the below at the top of the code but this formats the whole sheet, not the relevant cells.
cells.HorizontalAlignment = xlRight
cells.NumberFormat = "mmm-yy"

I can do it via the below but it adds 100 lines to the code
cell.Offset(0, 0) = "1-Jul-19"
cell.Offset(0, 0).HorizontalAlignment = xlRight
cell.Offset(0, 0).NumberFormat = "mmm-yy"

Is there a way to do this on one line i.e.
cell.Offset(0, 0) = "1-Jul-19".HorizontalAlignment = xlRight.NumberFormat = "mmm-yy"

Help would be much appreciated.
Scott

**Sub CHANGE_MONTH_LOOP()
Dim rngMyRange As range
Dim cell As range
Set rngMyRange = Selection
For Each cell In rngMyRange.Cells
cell.Offset(0, 0) = "1-Jul-19"

cell.Offset(0, 1) = "1-Aug-19"

cell.Offset(0, 2) = "1-Sep-19"

Next cell

End Sub**

A: Sub test()

    Dim LastRow As Long
    Dim irow As Long
    Dim jrow As Long
    Dim StartCol As Long
    Dim StartRow As Long

    For Each ws In ActiveWorkbook.Worksheets
        With ws.Select
            LastRow = ws.Range("G" & Rows.Count).End(xlUp).Row

            Set StartDate = Cells.Find(What:="Jul-17", After:=ws.Range("A1"), LookIn:=xlValues _
                        , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
            StartCol = StartDate.Column
            StartRow = StartDate.Row

                For irow = StartRow To LastRow
                    Set Rng = ws.Range(Cells(irow, StartCol), Cells(irow, StartCol + 11))
                        For Each Cell In Rng
                            Cell.Value = DateAdd("yyyy", 1, Cell)
                        Next Cell

                    Rng.HorizontalAlignment = xlRight
                    Rng.NumberFormat = "mmm-yy"

                    irow = irow + 2
                Next irow

                For jrow = StartRow To LastRow
                    Set Rng = ws.Range(Cells(jrow, StartCol + 12), Cells(jrow, StartCol + 12))
                        For Each Cell In Rng
                            Cell.Value = "FY19 Total"
                        Next Cell
                    jrow = jrow + 2
                Next jrow
        End With
    Next ws

End Sub

A: ANSWER FROM ANONYMOUS BELOW
cell.Offset(0, 0).HorizontalAlignment = xlRight : cell.Offset(0,1).NumberFormat = "mm-yy" :  cell.Offset(0, 0) = "1-Jul-19"

A: Back again, so if in @alowflyingpig and your boss' world less lines necessarily means more simple please see below a code that does exactly what your "full code" does... but in less lines...
Sub DATE_MONTHLY_LOOP()
Dim cell As Range, i As Integer
For Each cell In Selection.Cells: For i = 0 To 11: With cell.Offset(0, i): .Value = DateAdd("m", 1 + i, 43617): .HorizontalAlignment = xlRight: .NumberFormat = "mmm-yy": End With: Next i:    With cell.Offset(0, 12): .Value = "FY20 TOTAL": .ColumnWidth = 11.3: .HorizontalAlignment = xlRight: .NumberFormat = "mmm-yy": End With: Next cell
End Sub


Will you please ask your business department not to send any mail3 to me at Toronto4? The Hambourgs5 are going abroad to live,—to Paris6,—and the house there is closed.
Perhaps my autumn statement7 was sent to Toronto, as it has not yet reached me.
Greenslet noted in his response of 13 October 1921 that he could only determine her current presence in Red Cloud, NE, from the postmark to this letter.
Greenslet sent Cather's semi-annual statement on 27 October 1921.


text:
Saratoga Springs Police Department: July 1
PUBLISHED: July 1, 2019 at 9:45 a.m. | UPDATED: July 22, 2021 at 10:24 a.m.
Saratoga Springs Police Department
Rape: Matthew Grosky, 19, of Gansevoort, was arrested at 2:00 p.m. on June 28 at 5 Lake Avenue and charged with rape third degree.
Drug Possession: Flenteno Best, 32, of Albany, was arrested at 8 p.m. on June 29 on Broadway following a traffic stop and charged with criminal possession fifth degree of more than 25 grams of marijuana, a misdemeanor.
DWI: Katelyn Babson, 20, of Saratoga Springs, was arrested at 12 a.m. on June 30 on Rt. 50 and Rock Street following a traffic stop and charged with driving while intoxicated on alcohol or drugs first offense, a misdemeanor.
DWI: Tory Cameron, 43, of Saratoga Springs, was arrested at 2:14 a.m. on June 30 on Union Avenue and Clark Street after a traffic stop and charged with driving while intoxicated first offense and operating a vehicle with a blood-alcohol content of .08 percent or more, first offense, both misdemeanors.
Robbery Causing Physical Injury: Victor Maffetone, 33, of Saratoga Springs, was arrested at 8:52 p.m. on June 30 on Vanderbilt Terrace and charged with robbery, causing a physical injury, a felony.
Criminal mischief: Corey Grassi, 36, of Syracuse, was arrested at 10:34 p.m. on June 30 on Broadway and charged with criminal mischief with intent to damage property, a misdemeanor.


text:
Kepler-95b es un planeta extrasolar que forma parte un sistema planetario. Orbita la estrella denominada Kepler-95. Fue descubierto en el año 2014 por el telescopio espacial Kepler por medio de tránsito astronómico. Se confirmó utilizando una combinación de formación de imágenes de alta resolución y espectroscopía y espectroscopia Doppler. Este análisis empuja la falsa probabilidad por debajo del 1 por ciento.

Referencias

Enlaces externos
 SIMBAD Base de datos astronómicos (Inglés)
 The Extrasolar Planet Catalogue: Kepler-95b (Inglés)

Planetas extrasolares descubiertos en 2014

redpajama_set_name: RedPajamaWikipedia


text:
Home News Breaking News The Despicable Return of Casualty Statistics as a Moral Barometer
The Despicable Return of Casualty Statistics as a Moral Barometer
By Alex Margolin
During the 2014 Gaza War, nearly every news report contained an obligatory paragraph listing the number of Palestinians and Israelis killed in action. The figures, which invariably showed a substantially higher number of Palestinian casualties, ultimately served as justification for those who wished to claim that Israel was the real aggressor in the war — since so many more Palestinians had been killed.
It didn't matter that the violence really began when three Israeli teens and a Palestinian teen had been murdered, followed by a sustained barrage of rockets from Hamas aimed at Israeli civilians. The raw numbers, stripped entirely of context, were pushed as the moral truth behind the headlines.
It also made no difference to the media that Israel took extensive steps to protect its citizens while Hamas used Palestinians as human shields. Some media outlets presented the numbers as a "scoreboard." HonestReporting called it "casualties as a moral barometer," and named it one of the five media fails of the Gaza War.
The current wave of terror engulfing Israel looks to be following the same pattern.Reuters, for example, has begun including a "death tally" in its reports on the conflict:
Four Israelis and 26 Palestinians, including eight alleged attackers and eight children, have died in 12 days of bloodshed, the worst spell of street violence for years, stirred in part by Muslim anger over increasing Jewish visits to the al-Aqsa mosque compound in Jerusalem.
The Reuters report focused mostly on stabbing attacks in Tel Aviv and Ra'anana. The presentation of the numbers, however, leaves out more than it includes. What is clearly a Palestinian onslaught against an innocent population of Israelis looks like Israeli aggression. Why are so many more Palestinians being killed — one may ask.
The raw numbers ignore the facts on the ground. Palestinian attackers are often killed but their victims merely sustain life-threatening injuries and are not included in the tally. Some aggressors were killed before they reached their Israeli victims.
The reference to children may be the most distorted of all. As presented, the numbers give the impression of innocent children who died as collateral damage. But that's not the case. The number ostensibly includes a 15-year-old Palestinian who was killed by police after he, along with another 13-year old Palestinian, stabbed and critically wounded a 13-year-old Israeli boy riding his bicycle. Other Palestinian minors have been involved in carrying out attacks.
Ultimately, the numbers fail to show what's really important — that Israel is facing a relentless wave of Palestinian terror. The moral high ground does not belong to the side that loses more people if those people are killed trying to murder innocent civilians. The media has a responsibility to present the situation as it really is. And the raw numbers of people killed create a distorted picture.
This article was originally published by HonestReporting.
Previous articleBody Language Expert Warned of Terrorist Who Killed Rav Yeshayahu Krishevsky Hy"d
Next articleIsraeli Activist Against Facebook: 'You've Got Blood on Your Hands'
cyrano October 19, 2015 at 9:10 am
Indeed, using the same methodology as Reuters, one might conclude that in its conflict with Nazi Germany, the United States should be considered the aggressor because fewer Americans were casualties of that war than were Germans.
Mendel October 19, 2015 at 4:59 pm
When Moshiach comes our enemies will publicly eat their words.
Leave a Reply to cyrano Cancel reply


Punch : MS pine branch,Jeff :small butterfly and nellie snellen branch punch out from a friend.
Beautiful, Linda! I adore that little purse and it's so beautifully decorated. Thanks so much for playing in our "Ribbon and Lace" challenge at Lexi's Creations. Good luck in the draw and I hope we see you again for our next challenge starting on Monday.
Marvelous creation, love the construction and all the beautiful embellishments. Beautiful little purse. Thanks for joining us at Lexi's Creations for our 'ribbons/lace' challenge!
This bag is so gorgeous !! Love it.


The commitment from online colleges Texas comes in various shapes. Depending on the program that student enrolled, students can audit the courses, earning credits towards the degree. This means the effective online college that regardless of location.
Here are the best 5 online colleges in Texas that you can choose from many online colleges you can find.
• Le Tourneau University. This is known as one of the best online colleges in Texas which offer a degree program in criminal justice, education, business, aviation, psychology and many more. The online courses last 3-7 weeks. Several programs allow accelerated format and allow online students to finish the course and earn a degree in fast.
• Dallas Baptist University. This university offers several programs to gain a certificate, graduate, undergraduate degrees with online. The unique features of DBU online programs are using advanced technology in online learning interactive, mobile platform, research tools, online assessment and web conferencing.
• Texas Tech University. This University offer graduate level, bachelor, master and doctoral degree program full online with its worldwide eLearning. There are some programs that need face-to-face meeting and other are fully completely offers with Blackboard. The online program support 24/7 tech chat support, portal articles, and phone support.
• The University of Texas in Arlington. This is an online college that offers flexibility for the online nursing program, education, public affairs, and urban program. This college offer guarantee of tuition that means students pay similar tuition rate throughout the enrollment as they have paid at the beginning of the program provided and as they remain to continuously remained and complete the degree program.
• Northwood University. Texas. This university offers unique online programs. There are major and minor programs available. The courses are 8 weeks with exceptions with summer semester that comes in 6 weeks. The open registration starts at the end of the year and the online courses are handled by the on-campus faculty. The tuition discount is available for that military personnel and the dependents, prior learning portfolio detailing previous professional and academic work.
Narrow down your options from many online college options can be daunting for you. This tricks and tips can help you to make decisions before applying for online college.
• The ease of credit transfer.
With these considerations, you can easier choose the best online colleges Texas that fit with your requirement, path, and budget.
0 Response to "The Best Online Colleges Texas"


text:
AISAdventures In Sexuality
a Barak & Sheba Article
The Confession...
Sunday Dec 24, 2017
It wasn't their first date. This time, it was her turn to pick. She had chosen an out of the way place, just for tonight's conversation. It was the right one for tonight, she thought. The food was good, but the booths had walls, and the ambient music was just loud enough that no one outside the booth could hear their conversation. She needed to talk, to tell him, and she needed him to hear.
They had been dating for a while. That is to say they had been out together, but not very long. They certainly hadn't had sex. Not that both of them didn't want to. But the anticipation of, and the small hints that were thrown about over the evening, kept their desire piqued.
He was gentle, at least with her, but he gave her space to be who she was. And he was a gentleman. Not the puffed or patronizing kind, no. He cared about her. Not too much. Enough. She spoke, he listened. Not just being silent waiting for her to finish what she was saying. He heard, he thought about it, then if she had asked, commented or acknowledged.
Their relationship was blooming, taking shape. They learned each other's edges. He was very patient. Never pushing, always respecting her as the strong independent woman she was. He encouraged. She was waiting to make sure. She so wanted to trust him with... all of it.
She really liked him. He was intelligent, not too much so, but some might say street smart. Tall and broad, capable and… He didn't miss much. Eyes that surveyed, saw deeper. He walked with purpose, not fast, not slow. Deliberate.
And she knew exactly how he moved. Watching, from the edges of her vision. Efficiency of movement, smooth and assured. Once, as they held hands and walked, she had turned and barely glimpsed the bulge. Turning quickly, she avoided the subject. It wasn't just that she wanted that. No. She wanted something more, something particular.
She knew she had to tell him. About all those books and videos and toys she kept. Hidden away from even her closest friends. What would they think? What would he think? She was hoping this time it would be different. But that had been months and months ago.
Looking across the table she could see his lips moving. Her eyes following each movement; wishing, wanting, wondering. That quirky smile, the occasional mischievous sparkle in his eyes that would so quickly disappear. He leaned forward slightly, asking, then waiting.
Silence. Drawing out, and on. She started, momentarily surprised. Was he waiting for her? What had he said? Her breath came faster for one, then again. He grinned widely and pointedly asked again. "What is it? You seem distracted."
Her voice faded, caught, started again. "I, uhh. Ummm.." His hand came up, held her chin. Their eyes met. He leaned in, his soft, warm lips capturing hers… It was the same as their first. She melted. Her cunt twitched. Once. Twice. She could feel it building. She wanted, so badly to let go. Tumbling into the kiss, her tongue answered his. Strong arms pulled her closer. Pulled her to him. She gasped and drew back.
He released her instantly. She sat back into her chair, moved the lock of hair that had fallen into her eyes. Blinking, he asked. She reassured him. She was going to have to open herself. It was time. She knew. Praying this wouldn't be like the last.
She started, about the box with the toys, and the books, and the videos hidden in her secret place. She poured out her desires, explained her fantasies, about dominance and submission, and she watched him closely. His face impassive, listening, absorbing everything. Just for a second, that twinkle and then back to receptive.
Hoping this wouldn't be like the other. That one had sat, with a shocked look. Judgement. Condemnation. Finally, with a hateful, cutting remark, left her sitting. Alone. Exposed. Abandoned. Sobbing. It had taken almost a year to venture out. She couldn't bear that again.
She was almost done. She had one more confession. His unreadable face had dissolved and in its place was a warmth, care and safety. He waited, patiently, affectionately. Their eyes met. Had he always known? She leaped into the abyss. She whispered, softly, "I want… I need… to be owned – mind, body and soul."
Sitting stock still, wanting to run, hide, she looked down at her trembling hands. Sensing his movement, she lifted her head slightly. Her breath trapped by the lump in her throat as he stood. Slowly, and without looking down, he put on his coat.
Fighting back tears, she could feel her hands start toward her brimming eyes. His hand, a firm grip on her wrist cut her short. The slight pressure brought her to her feet. A quick flip with his other, splayed some bills on the table. Out through the other diners, through the front door, and into the night.
With his hand still in place, she followed him closely. He released her, as the door to the car swung open. She wasn't sure… His guiding hand on her shoulder, she sunk into the seat. Her mind was spinning, thoughts here, there everywhere. Was he taking her home? Could he be the one? Or… no. Please. No.
She could sense his determination. But for what? She didn't want to speak. She had done enough. Spilling her life onto the table for his … Approval? Judgement? Acceptance? Worse… Rejection.
His hand on hers, a calming gesture. Was he just taking it all in? What was that she had seen when their eyes met? Could it be happening? Or… But he didn't speak. And neither did she. The road dragged on. Her thoughts chaotic, frantic. The headlights from onrushing cars illuminating the shimmering tears of her exposed life.
Finally, the ride was over. He pulled into her driveway and came around to her side. Opening the door, he helped her up and out. She stepped each leg, wooden. He opened the front door, and in she walked. The lights were still dim, but the streetlight shone in from the front window. Her living room in stark relief. His hands lifting her coat, the rustling onto the rack. She stood, numb.
He moved away, silently. What now? Minutes, like hours, passed. The tick of the clock. The hum of the fridge. He returned. Pulled her close. Speaking in her ear, firm yet softly "shoes." She was wide awake. Alert. Her cunt thrummed, feeling the wetness as she removed her shoes one, then the other.
He was behind her now. She could feel the texture of her area rug under her feet. His hand in her hair. His hard cock just brushing the back of her thigh. His voice filled with… control. Command. Desire. She spasmed. He whispered, "the dress." Her hands pulling it up. He stopped her with a word.
"Neatly." She paused. Folding the silken cloth, placing it with purpose, returning to him. She stood. He admired the red matching bra & garter set and the stockings that came up to the clasped bows. His gaze swept up and down, she felt him linger briefly on the dampness that soaked through her panties.
He spoke, "You dressed for me." She blushed, and nodded. Their eyes met again. She saw it. What she had been waiting for. For years. For a lifetime. She looked down. He smiled, his pleasure radiating from him. His hand on her shoulder, easing her down. She knelt.
His fingers entwined in her silky locks, he quietly sighed, "You're Mine." The lush carpet soft on her knees, welcoming her to the place she belonged. Finally. As she lay her head against his thigh, the tears flowed… "Yes, Sir."
©2017 Barak & Brat Sheba
(return to main library page)
Copyright © 2017 AIS
Main AIS Contact


XOLO Q700 Club Android Smartphone was launched in January 2015. It is priced in India at Rs. 4999 ($73.51), running on the Mediatek MT6582M processor with Mali-400MP2 GPU. The phone has 1 GB RAM and 8 GB of internal storage which is expandable using microSD, up to 32 GB.
The XOLO Q700 Club has a 4.5 inches FWVGA, 480 x 854 pixels IPS display with a pixel density of 218 ppi. Coming to cameras, it has a 5 MP rear camera and a VGA front camera for selfies. It has a microUSB port for data syncing and charging. There is a accelerometer sensor present on the XOLO Q700 Club. It is a dual SIM smartphone with support for 3G, USB OTG, Wi-Fi, FM Radio, Bluetooth and GPS too.
The XOLO Q700 Club runs on Android OS, v4.4.2 (KitKat) and all this is powered by a 2000 mAh battery. It measures 134.6 x 67 x 10.8 mm (height x width x thickness).


text:
Breaking News Industry News Music Publishing
The Music of 2022's Highest Grossing Films
(Tima Miroshnichenko)
Hypebot Contact MePosted on 19 December, 2022, 01:40 PM EST
(Hypebot) — Here are all the stats on the soundtracks of 2022's most successful movies from top genres, moods, composers, and more.
by WILL BETTS from the MUSIIO Blog
The next time anyone idly opines that Hollywood has run out of ideas, don't be so quick to back them up. Fifty-nine of the top 100 grossing films this year were completely original, and not part of any franchise.
However, it's an easy mental trap to fall into because the 10 biggest films of the year were all franchise movies. In fact, there's only one film among the top 10 that isn't a sequel, and that's Matt Reeves' The Batman. It's merely a reboot.
But beyond the long-standing trend for sequels, what can we learn about the sound of the year's top films using our music-tagging AI?
1. Classic Rock and Metal were big in sync
Top Gun: Maverick, the highest-grossing film of 2022, didn't just bring beach sports back onto the silver screen. It also returned to its musical roots, harnessing classic rock to invoke US patriotism and serve up some unironic mustachioed masculinity.
Here, we see the sync tracks leaning heavily into Classic Rock and Rock territory. But, while Classic Rock peppered the film's soundtrack, interestingly, it was OneRepublic's Indie Pop track 'I Ain't Worried' that was the commercial breakout. (Sorry, Kenny Loggins, you've done your dash.) This renewed interest in throwback Rock is something we've seen elsewhere in 2022, with Metallica in Stranger Things and even more recently with The Cramps being featured in Netflix's Wednesday.
This use of Rock is in contrast to the film's score, which primarily serves to add modern blockbuster drama to the high-speed aircraft action scenes. Interestingly, the genre breakdown for the score looks a lot like the genre mix we tend to see for Hans Zimmer. It's no surprise, then, to learn that Zimmer had a hand in the new score, even if it was helmed by the 1985 original's composer Harold Faltermeyer.
If Classic Rock embodies straight-down-the-line patriotism in Top Gun: Maverick, 80s Hair Metal embodies over-the-top machismo with a streak of the absurd. That's why Guns N' Roses and Dio were perfect sync choices for Taika Waititi's riotously daft Thor movie.
2. Composer Michael Giacchino set the tone for scores
2022 was a banner year for Giacchino, with three of this year's seven top-grossing films being scored by the American composer. In recent years, Giacchino has risen the ranks to film-scoring A-List, gaining 56 awards along the way. Giacchino's background is relatively unusual. He started out soundtracking games such as Medal of Honour, and even composed for the Jurassic Park games in the late 90s, which would be some dramatic foreshadowing.
His musical range and orchestral-meets-electronic scores have struck exactly the right mood for huge franchise movies, including Jurassic Park: Dominion, The Batman and Thor: Love and Thunder.
How similar are his three biggest scores this year, though?
In genre, it's no surprise to see that Electronic, Classical and Ambient come out on top. These are modern blockbusters, for which there's an expected sound. Interestingly, we can see that Classical is more prominent in Jurassic World: Dominion – more in keeping with the sweeping classical roots of John Williams' original Jurassic Park score.
We can see the similarity in moods within Giacchino's scores with Jurassic World: Dominion and Thor: Love And Thunder sharing the same top three: Inspiring, Mysterious and Dark.
The Batman, by contrast, has Mysterious moods out in front, which is fitting for the crime noir style of the movie. We also see much higher percentages of Dark and Scary mood tags, which is reflective of the film's darker aesthetic, compared even to other Batman movies.
Finally, we can see how similar his scores are in terms of energy.
These three scores all have a very similar distribution of energies. This data points to these three Giacchino scores being more brooding than the other movies we analysed.
For contrast, here are the other four scores in our dataset:
Scores by Harold Faltermeyer (Top Gun), Danny Elfman (Doctor Strange), Heitor Pereira (Minions) and Ludwig Göranssen (Black Panther), all had very different energy distributions.
Danny Elfman's score for Doctor Strange in the Multiverse of Madness had the highest energy, but that could be because it didn't have any sync music to bring the average energy up. It's also a frenetic action-horror movie, for which this energy distribution makes perfect sense.
3. Minions syncs are TikTok-ready
For Minions: The Rise of Gru and Black Panther: Wakanda Forever, we see a lot of medium energy tracks in the score. Intriguingly, that energy distribution is mirrored for sync tracks, and it tells us a couple of things.
These soundtracks are also suited for use outside of film, specifically TikTok.
Take the Minions: Rise of Gru soundtrack, for example. It has 23 sync tracks, which is the most of any film in the top seven. With it being a kids' film, Illumination/Universal also appears to have had the good sense to distribute Minions imagery, and coordinate uploads among those artists featured to maximise discoverability on YouTube.
When we dig into the data on the Minions sync tracks, the dominant moods are Soulful and Playful, along with Funk and Soul genres more closely align with TikTok trends than the other movies in the top seven.
Moreover, when you take energy and tempo into account, the syncs have all the hallmarks of those tracks that were big on TikTok this year. They have danceable tempos, mostly between 100 and 119 BPM, and both medium and high energies.
The genre make-up – as determined by our tagging AI – is, in fact, very similar to the sound of Pharrell Williams' 'Happy', which partnered with Despicable Me 2, an earlier film in the Minions franchise.
4. Black Panther: Wakanda Forever had the most chart-friendly syncs
Of those soundtracks we looked at, we found the sync choices on Black Panther were most in keeping with wider streaming trends in the US and UK for 2022.
Seductive, Bold and Confident are all mood tags that we see a lot among chart-topping tracks. In the US, the streaming charts are dominated by Hip Hop and Pop, and these are perfectly represented by tracks on the Wakanda Forever soundtrack, such as Stormzy's 'Interlude'.
It's also interesting to note that Electronic is the top genre tag among soundtrack syncs for this movie. Electronic music has been huge in the UK and around the world this year. And with the inclusion of tracks from Nigerian artist CKay and breakthrough Mexican-American singer Blue Rojo, it demonstrates the growing awareness of global music trends from Marvel.
We look forward to seeing more international artists featured in movies as the Marvel Cinematic Universe opens out from here.
#Soundtracks
Luger and Live Nation Launch 'The Shuffle Ticket' For Events in Stockholm, Gothenburg, & Malmö
+1 Records Announces Partnership With Exceleration Music


Located in the 77006 zip code, Montrose is minutes from River Oaks, Midtown Houston, Rice Military, and Downtown Houston.
Listed below are luxury Montrose Houston townhomes for sale between $300,000 to $600,000.
The neighborhood of Montrose is perfect for families who want to live in one of the best areas in Houston. Buyers looking for Montrose Houston townhomes for sale will be surprised with the community's tree-lined streets, colorful townhomes, and positive and vibrant atmosphere. Dubbed as "Heart of Houston," Montrose embodies the diverse culture that makes Houston one of the best cities in the country.
Because of Montrose's strategic location at the heart of the city, it is the most ideal residence for families who want the best learning institutions in the city. Aside from serving as a home to University of St. Thomas, Montrose is also close to other colleges such as University of Houston, Texas Southern University, and Rice University. Currently zoned in Montrose are four elementary schools, two middle schools, and one high school.
Living in Montrose means giving your senses a feast because of the wide assortment of activities to do and places to visit. Let your eyes marvel at dozens of art galleries and installations by budding artists from the city. For foodies who want to experience an explosion of flavors in Houston, Montrose serves as a home to some of the best restaurants in the city. At night, dive bars and music clubs fill the city with energetic music from the city's aspiring artists. Whether you go out during the day or night, there's always something for you in Montrose.
While the majority of housing units in Montrose consist of bungalows and single-family units, newer townhomes are currently on the rise during the turn of the century. The median appraised value of Houston Montrose townhomes for sale is $354,000 for an average two-bedroom one-bathroom home.
Paige works with a tremendous number of buyers and sellers in Houston Montrose, earning praises such "Paige Martin is the best Houston Montrose realtor" along the way. You can check more client feedback about Paige as well as her list of awards and client ratings here: Client Testimonials.


text:
The Free Internet Project
Project Safeguarding Elections
Map of Internet Protections
Section 230 protections for Internet platforms come under attack in U.S.
Section 230 of the Communications Decency Act [text] was enacted in 1996. Many commentators have hailed Section 230 as providing the legal landscape that facilitated the explosion of expression, businesses, social media, applications, and user-generated content on the Internet. The reason is that Section 230 shielded Internet platforms from potentially business-ending liability, while facilitating the development of new applications enabling individuals to publish their own content online--instantaneously and without the need for preclearance. As Wired's Matt Reynolds puts it, "It is hard to overstate how foundational Section 230 has been for enabling all kinds of online innovations. It's why Amazon can exist, even when third-party sellers flog Nazi memorabilia and dangerous medical misinformation. It's why YouTube can exist, even when paedophiles flood the comment sections of videos. And it's why Facebook can exist even when a terrorist uses the platform to stream the massacre of innocent people. It allows for the removal of all of these bad things, without forcing the platforms to be legally responsible for them."
More recently, however, Section 230 has become a lightning rod, criticized by the Trump administration and others who disagree with shielding Internet platforms for the potentially unlawful or harmful content posted by their users. The Trump administration and conservative Republicans contend that Twitter and Google, for example, are engaging in biased content moderation that disfavors them for more liberal positions or politicians. Others criticize Section 230 as being too permissive in letting social media companies off the hook, even though there is so much disturbing and potentially dangerous content shared on their platforms. This article explains Section 230 and then the recent criticisms that the Trump administration and others have raised.
A. Brief Explanation of Section 230
In subsection (c), Section 230 provides 2 different protections for Internet platforms (defined in the statute as "interactive computer services"). The provision is meant to protect from civil liability Internet companies engaging in so-called "Good Samaritan" blocking and screening of offensive material. The law was enacted in 1996 to address the perceived deficiencies of defamation law in exposing an Internet platform to defamation claims arising from content posted by its users if the Internet platform had engaged in some review and removal of objectionable user content on its platform. By contrast, if the Internet platform did nothing, and allowed all material to remain online without any review, the Internet platform could escape defamation claims because it would not be a publisher of the content, a requirement for a defamation claim under the now notorious Prodigy decision.
First, Section 230(c)(1) states in 26 words: "Treatment of publisher or speaker. No provider or user of an interactive computer service shall be treated as the publisher or speaker of any information provided by another information content provider." Thus, for a user's post on an Internet platform, such as a blog, the person who posted the blog is the publisher or speaker of the post. But the provider of the blog service (e.g., Wordpess) is not also considered a publisher of the post. In effect, this definition of publisher or speaker of online posts creates a kind of immunity for the Internet platform from defamation claims based on the content posted by users. To state a defamation claim, the defendant must have published the defamatory content. (Copyright infringement is handled by a different safe harbor, the DMCA safe harbor, which operates under a notice-and-takedown system for ISPs.)
Second, Section 230(c)(2), the lesser known provision, states:
Civil liability. No provider or user of an interactive computer service shall be held liable on account of—
(A) any action voluntarily taken in good faith to restrict access to or availability of material that the provider or user considers to be obscene, lewd, lascivious, filthy, excessively violent, harassing, or otherwise objectionable, whether or not such material is constitutionally protected; or
(B) any action taken to enable or make available to information content providers or others the technical means to restrict access to material described in paragraph (1).
This section creates a second kind of immunity from civil liability for Internet platforms' voluntary efforts to take "in good faith to restrict access to or availability of material that the provider or user considers to be obscene, lewd, lascivious, filthy, excessively violent, harassing, or otherwise objectionable, whether or not such material is constitutionally protected." This activity is now called "content moderation" by an Internet platform. And it has become a politically charged issue in the United States.
B. Trump Administration Efforts to (Re)interpret or Reform Section 230
On May 26, 2020, Twitter added a fact-checking note to one of Donald Trump's tweets asserting that "There is NO WAY (ZERO!) Main-In Ballots will be anything less than substantially fraudulent" and claiming such fraud will occur in California. [link] Twitter then added a note "Get the facts about mail-in ballots" that stated: "Trump falsely claimed that mail-in ballots would lead to 'a Rigged Election.' However, fact-checkers say there is no evidence that mail-in ballots are linked to voter fraud."
Trump responded by issuing an Executive Order on May 28, 2020 that purports to (re)interpret Section 230 to deny immunity to Internet platforms under subsections (c)(1) and (c)(2) if the Internet platforms to "censor content and silence viewpoints that they dislike." The Executive Order ties its interpretation to the "good faith" requirement in (c)(2) for "any action voluntarily taken in good faith to restrict access."
On May 29, 2020, Twitter flagged one of Donald Trump's tweets for violating its rules. Following protests by people in Minneapolis and other cities over the brutal death of George Floyd by police officer Derek Chauvin, Trump tweeted: "These THUGS are dishonoring the memory of George Floyd, and I won't let that happen. Just spoke to Governor Tim Walz and told him that the Military is with him all the way. Any difficulty and we will assume control but, when the looting starts, the shooting starts. Thank you!" Above the tweet, Twitter added the following notation: "This Tweet violated the Twitter Rules about glorifying violence. However, Twitter has determined that it may be in the public's interest for the Tweet to remain accessible." [link]
On June 17, 2020, the Department of Justice under Attorney General William Barr issued "Recommendations for Section 230 Reform." The Recommendations identify four areas for future reform of Section 230: (1) incentivizing online platforms to address illicit content, (2) clarifying federal government enforcement capabilities to address unlawful content, (3) promoting competition, and (4) promoting open discourse and greater transparency. Interestingly, the DOJ proposal stops short of adopting the same approach as Trump's Executive Order. Instead, DOJ recommends that Section 230 be amended to include a definition of good faith: "Second, the Department proposes adding a statutory definition of 'good faith,' which would limit immunity for content moderation decisions to those done in accordance with plain and particular terms of service and accompanied by a reasonable explanation, unless such notice would impede law enforcement or risk imminent harm to others. Clarifying the meaning of 'good faith' should encourage platforms to be more transparent and accountable to their users, rather than hide behind blanket Section 230 protections." DOJ's recommendation tacitly seems to indicate that, contrary to Trump's Executive Order, the meaning of "good faith" is not so clear.
C. Other Critics of Section 230
Other critics of Section 230 content that Section 230 gives Internet platforms or no incentive to moderate unlawful or harmful content. In contrast with Trump's criticism of political bias, this criticism is based on the view that Internet platforms should be removing more content--content that critics say is harmful or objectionable, such as revenge porn or illegal gun sales.
While it may well be time to examine whether Section 230 needs updating or refinements, the politically charged nature of today's debate creates the risk that sound policy will be lost amidst all the politics. We will preview some of the proposed bills in Congress to revise Section 230 in a subsequent article.
- Select Month -October 2020 (1)September 2020 (3)August 2020 (18)July 2020 (14)June 2020 (8)August 2019 (3)July 2019 (8)June 2019 (1)May 2019 (2)April 2019 (2)March 2019 (1)February 2019 (2)January 2019 (1)May 2018 (1)March 2018 (1)December 2017 (1)July 2017 (1)June 2017 (2)November 2016 (4)October 2016 (3)September 2016 (1)July 2016 (2)June 2016 (1)March 2016 (1)February 2016 (2)January 2016 (3)September 2015 (2)August 2015 (1)July 2015 (4)June 2015 (4)May 2015 (3)March 2015 (6)February 2015 (1)January 2015 (2)December 2014 (4)November 2014 (4)October 2014 (4)September 2014 (1)August 2014 (3)
- Select Category - Facebook (24) content moderation (14) Trump (13) right to be forgotten (12) Russian interference (12) censorship (11) Twitter (10) Google (9) net neutrality (8) Russia (7)


text:
Hard Science — August 24, 2016
NASA Is Putting Its Research Papers Online For Free
NASA will be putting most of the research it funds online for free in policy of open access to science.
Paul Ratner
Copy a link to the article entitled http://NASA%20Is%20Putting%20Its%20Research%20Papers%20Online%20For%20Free
Share NASA Is Putting Its Research Papers Online For Free on Facebook
Share NASA Is Putting Its Research Papers Online For Free on Twitter
Share NASA Is Putting Its Research Papers Online For Free on LinkedIn
NASA announced that it's making most of its publicly-funded research available online free of charge. It's using a site called Pubspace where you can search peer-reviewed papers resulting from NASA-funded research on a wide variety of topics.
Do you want or need to read studies about the origins of life on Mars? Maybe you'd like to draw your own conclusions about the "Grand challenges in space synthetic biology?" Or learn about exercising in space? Previously you would have had to pay for access to this work, but today is your day as Pubspace already has over 850 articles posted, with more to come.
NASA Chief Scientist Ellen Stofan explained the reasoning involved in releasing the papers to the public:
"Making our research data easier to access will greatly magnify the impact of our research. As scientists and engineers, we work by building upon a foundation laid by others."
NASA's move is in response to a general worldwide trend towards making scientific knowledge more available as well as a 2013 directive from the White House Office of Science and Technology Policy to increase access to their research. NASA's new policy will be to post all agency-funded research papers on Pubspace within a year of their publication.
The one big exception is any research related to national security.
In a press release, NASA Deputy Administrator Dava Newman further expounded on the far-reaching implications of the new scientific openness:
"At NASA, we are celebrating this opportunity to extend access to our extensive portfolio of scientific and technical publications. Through open access and innovation we invite the global community to join us in exploring Earth, air and space."
So if you're up for investigating the workings of "Stereoscopic Integrated Imaging Goggles for Multimodal Intraoperative Image Guidance" or have been wondering about the cardiovascular disease mortality of the Apollo lunar astronauts, you know where to go.
freenasaonlinepubspaceResearch
Cracking a mystery about Vesta, our solar system's second largest asteroid
How did the troughs form?
Earth's first puff of oxygen may be thanks to volcanoes
Scientists track down a puzzling early burst of oxygen on Earth.
NASA wants future humans to find this time capsule in space
NASA will use energy from Earth's gravity to launch the Lucy spacecraft in October of this year.
Which countries are going to Mars this decade?
We are likely to see the first humans walk on Mars this decade.
Why so gassy? Mysterious methane detected on Saturn's moon
Scientists do not know what is causing the overabundance of the gas.
Are Strict Schools and Parents Creating Dishonest Children?
An intriguing new study inspires a psychotherapist to blame strict parents for creating little liars. But is she right?


I went to bed with a headache and woke up at 3:30 am with a full on migraine. It was the kind of migraine that induced vomiting, which unfortunately did nothing to relieve the pain. I have not even been able to keep medication down, until now - 4:00pm. I have been able to do nothing except put my head down and close my eyes, even the simplest of hair clips seems like a torture device.
thank you, lisa. I finally feel human again.


text:
2016-17 NBA Team Previews: Minnesota Timberwolves
July 26, 2016	| Team Previews	| 35 Comments
by: JB Gilpin
As we prepare for the 2016-17 Fantasy Basketball Season, I'll be taking a look at each NBA team with their major adds and drops to see if we can pan for any surprise rotational gold. This open is especially witty for the Nuggets. We'll be counting down from worst NBA regular season to the best, mainly because I'm still figuring out how to rank the Warriors…
Minnesota Timberwolves (29-53)
Key Acquisitions:
G Kris Dunn (Rookie)
C Cole Aldrich
F/C Jordan Hill
G/F Brandon Rush
COACH TIBBY TIBS!
Key Losses:
G Kevin Martin
G Andre Miller
Mayyyyybe Kevin Garnett, which would dramatically drop their average age…
Wow, this is going to be one of the most similar looking teams from last year to this season, with their only overhaul at the head coaching position. And yet, I think they're going to be a popular sleeper playoff pick after finishing 5th worst in the NBA last year.
The Wolves will presumably roll out the same starting 5 that ended 15-16, and it's a mad fun team. Rubio with the passes, LaVine with dunks, KAT with the post game, Wiggins with the isos, Dieng with the D, lions and tigers and bears, OH MY! And they add into the fold another combo guard who easily looks ready for the NBA, not to mention the Summer League MVP. Plus some underrated vet backups to get this young crew through their run at making the playoffs. Here's how their roster is shaping up:
The Odds Are Ever NOT In Your Favor
by: Peter Kap
A record-breaking $1.5 billion jackpot was up for grabs in the latest powerball drawing on Wednesday. While I didn't buy a ticket, winning that kind of money is very tempting, despite the terrible odds. The odds are so bad that Bartolo Colon is more likely to hit an inside-the-park homerun than you are at winning the big jackpot. (Interesting fact: Colon also shares a nickname with JB: Big Sexy.) Even with the odds, hopefully your number was called!
The odds of Russell Westbrook scoring 0 points is definitely better than winning the jackpot, but it's still rare. He was ejected after 15 minutes of playing time with nary a point. Fortunately, he still contributed 7 rebounds, 8 assists, and 2 steals before departing.
Another rarity: Mavericks big man Salah Mejri came off the bench to post 17 points, 9 rebounds, and 1 block in 25 minutes. Zaza Pachulia and Dirk Nowitzki were rested, but still. Mejri had played a combined 20 minutes all season coming into the game!
Stephen Curry scored 38 points. Not that surprising. Well, how about the Nuggets beating the Warriors? Now that's unexpected. The Warriors were playing without Draymond Green (scheduled rest day), but the Nuggets were just 14-24 coming into the game! In addition to his 38 points, Curry also added 9 assists, 5 rebounds, 5 threes, and 3 steals.
Those were some of the stranger games of the night. Here are the rest of Wednesday night's daily notes:
Early in the day on Wednesday, Major League Baseball announced that All-Star Todd Frazier was traded from the Cincinnati Reds to the Los Angeles Dodgers in a seven-player trade. Wait, I thought this was a basketball blog! Well, one of those guys involved in the trade was Trayce Thompson. Not quite a Splash Brother, but the biological brother of the Golden State Warriors' Klay Thompson and former NBA player, Mychel Thompson, who now plays in Italy.
As brothers, it's pretty common to be competitive with each other. We may not be on as big of a stage as the Thompson brothers, but my older brother and I make almost everything a competition between each other, whether it's games of one-on-one, 10-mile races, or Settlers of Catan.
While Trayce was gaining popularity as a new member of the Dodgers in California, Klay went off for 27 points in the 3rd on his way to a game high 43 points (15-22 FG, 8-13 3PT). It must be a happy time for the Thompson family!
Coming off their first loss of the season, the Warriors blew out the Suns by 25, leading by 40 after the 3rd quarter.
With the game in hand, Thompson, Draymond Green, and Stephen Curry weren't even needed in the 4th quarter. That was enough minutes for Green to go for a triple double (16/11/10/5) and Curry to drop 25 points and 7 assists. So much for feeling sad about their first loss.
NBA Basketball > Politics? Debatable
by: Matty
On an unusually quiet Tuesday night in the NBA that saw only four games, the most remarkable item is just how unremarkable everything was. Truth be told, I watched a lot more of the Republican debate on CNN than I did professional basketball. (I'll withhold political commentary for the most part as Razzball isn't the appropriate forum, but holy heck is the RNC ever in a pickle.)
The usual suspects (James Harden, LeBron James, DeMarcus Cousins) were all solid for their owners, but it's not like somebody dropped a 40-burger. Nobody poured in a ton of 3-pointers or threw a massive block party. There were no catastrophic injuries (thankfully) and no statement performances. Just a whole lot of "meh." You can actually count on one hand the number of players who even saw 36 minutes.
Each of the two early games were decided by a dozen points and offered little in the way of drama or uncertainty about the outcome. The late games followed suit as the Greg Monroe-less Bucks got creamed by the Los Angeles Kobes, while Sacramento took care of Houston by 10 in a matchup of what might be the two most unhappy rosters in the league. Only four of the eight teams even managed to hit the century mark.
I guess what I'm ultimately trying to say is that nobody on Tuesday jumped up and said, "Hey Matty! I want the lead. I deserve the lead!" So take notice, NBA – the lead is not simply given, it must be earned. Be better than Donald Trump, basketball.
Matt Barnes Finishes Too Early
Matt Barnes capped off the Memphis Grizzlies comeback victory over the Pistons, by drilling a half court shot with 1.1 seconds left in the game. It's probably the best mood that Barnes has been in all season. I don't think Derek Fisher will have to worry about getting punched this week..
I was a bit surprised that Barnes took the shot considering there were still a few ticks on the clock when he chucked it up. Either way, it was a nice finish to a nice game from Barnes (8 points, 11 rebounds, and 3 assists in 30 minutes). The journeyman forward has always been a borderline fantasy player for his ability to do a little bit of everything.
Barnes had a nice string of games at the end of November, but now that Zach Randolph is back (21 points and 16 rebounds), Barnes has seen his minutes decrease. He should probably be dropped in 10 and 12 team leagues, but should continue to be monitored, should he see around 30 minutes a night.
Elite Assist Sources Give You A Thursday Kick To The Groin
November 13, 2015	| Fantasy Basketball Daily Notes	| 154 Comments
After a pretty quiet first week, we're all the sudden getting ravaged by injuries and late DNP scratches. LET STEROIDS BE ALLOWED AGAIN DAMMIT! No one wants to see Austin Rivers start an NBA game… And then to top it off, the Clippers started a backcourt with daddy's boy Austin alongside Pablo Prigioni… Who is certainly old enough to be Rivers' daddy too…
But before that travesty in Phoenix, the Wolves decided to scratch Ricky Rubio after calling him probable. To be fair, it was probable they were going to get bludgeoned by the Warriors, then again they played Golden State pretty close… Mitchell probably thought this was a loss anyway, but who knows if Rubio would've made a difference over the Zach LaVine start and the out-of-nowhere minutes for Andre Miller. Then to just make assists even more a lost cause for fantasy owners, Chris Paul was suddenly questionable then ruled out with his groin strain. Maybe his groin injury is some sort of cosmic karma for punching Julius Hodge in the nuts when at Wake Forest… Isn't cosmic karma an ice cream flavor…? Whatever, anything to keep me from saying groin again! There isn't much of a fantasy spin on these frustrating-as-hell DNPs, other than Rubio indeed looked like a massive sell-high after that opener and CP-3 needs to re-nicknamed CP-DNP. Both will be managed and it will hurt their overall value, so if you can sell for per-start stats, I would. And just like the trend we're seeing in all the other major sports, players will be managed through minor bumps and bruises, especially injury-prone and older players. LET STEROIDS BE ALLOWED AGAIN DAMMIT! Here's what else went down last night in fantasy basketball action:
Mo Williams, Less Problems
Well, that was a bit of a bloodbath.
On what should have been a relatively quiet evening in the NBA, there sure wound up being a lot of noise. And not a lot of it was good noise. For a lot of fantasy owners, Tuesday probably sounded a bit like this.
Mid-game injuries, late-breaking inactives, and low minutes due to a few blowouts seemed to be the consistent narrative of the night.
We'll get to all that depressing stuff, but let's start out on a high note – Mo Williams had himself a game. On nearly perfect shooting (8-9 FGs, 9-10 FTs, 4-4 from 3-point range), Mo helped the Cavaliers slip past the Utah Jazz 118-114 in the best game of the night. In addition to the stellar percentages, Williams chipped in six boards, six dimes, and stole the ball twice just for funzies. Five turnovers took a bit of shine off an otherwise brilliant outing, but this still goes down as one of the top fantasy lines of the evening. Mo Williams will continue to be a must-start player until Kyrie Irving comes back, and common sense would suggest that if Mo keeps balling at a high level and the Cavs keep winning, there's no reason to rush Kyrie back anytime soon. So it's a bit of a snowball effect in that the immediate returns are great, but they're also likely to help extend Mo's opportunity for a 30+ MPG role on a title contending team. People waiting on Irving to return won't enjoy hearing that, but it's championship-or-bust in Cleveland, so Kyrie isn't coming back with health a single percentage point below 100.
Not to be outdone, LeBron James had himself a phenomenal fourth quarter, scoring 17 points (6-8 FGs), 4 rebounds, 3 assists and a steal as the Cavs scored 38 points in the final frame against one heck of a good defensive team. LBJ finished the game with 31/7/8/2/0 and dropped in a three pointer. He matched Mo Will's five giveaways and missed four of his 12 freebies, but for all intents and purposes this was a win for LeBron owners as he made it out of the game healthy after soldiering through an owwy on his thigh.
Let's get on to the rest of the notables…
Patience Is An Andrew …and the 7 Ahead
November 9, 2015	| Fantasy Basketball Daily Notes, The 7 Ahead	| 190 Comments
When you go out on a limb on a guy and it starts slow, at least I can pull the "it's a long season" card. Or the "his back has been a little spasmy" card. Hah, little Pod joke there…
I gotta say, I love you commenters here on Razzball. A lot of Andrew Wiggins frustration has been thrown around, like "he single-handedly killed my FG%", and "he's why I started 1-8", and "Wiggins must be dating yet another one of those Kardashians". But I was really honored to say almost all of the vitriol wasn't at me. Hell, I was expecting to be served on the coals for that one! Or some sort of cliche that works… Maybe it was out of the decency of your hearts since I obviously own him on several teams with this rank. I got way more hate for saying Nate Robinson was a good opening night streamer/last draft pick in 12ers! But like the worst drunken one night stand in history, I got rid of Nate about 4 or 5 minutes in. While with Wiggins, I'm entrenched in a life-long relationship. Hope my wife isn't reading this! After a really rocky start, Wiggins finally looked like the breakout talent I was hoping for on Saturday night against the Bulls, going 31/3/2/0/1 with only 1 TO and hit 4 treys. Of course it wouldn't be a pristine line, but then again what relationship is suddenly perfect?! Except my marriage of course! Wiggy still shot like poo (11-27) and had an odd 5-10 FT game. He's usually gonna be a high-volume 80% guy from the stripe, plus he hit 4-5 from deep, so there's still hope the FG% climbs as his bum back gets healthier and he shoots his way out of it. Of course you can point to Kevin Martin not playing (personal) for the burst in treys, but big picture we still think K-Mart gets moved. Even with K-Mart, they're using him as a 6th man and Wiggy is the only real perimeter option in the starting 5 anyway. I also think with a little more health, he'll play more aggressive on D. The one swat he had was a legit one, not a lazy strip that's scored a block, WHICH STILL FRUSTRATES ME! The buy low window is closing rapidly, so if you're still hoping to buy in on Wiggy, I'd wait until tonight and see if he has another rough shooting game before opening the floodgates. If you own Wiggy, definitely hold, particularly with the Wolves playing 5 games this week. Here's what else went down over the weekend in NBA action, plus The 7 Ahead for week 3:
C.J. Stands For "Calm The Juck Down!"
October 29, 2015	| Fantasy Basketball Daily Notes	| 129 Comments
Flashy player. Ridiculous opportunity. Buzzy preseason. A lot of times it ends up fizzling out, sometimes it works out OK, and one time it's C.J. McCollum.
C.J. went absolutely bonkers in his 15-16 debut, hitting 14-22 from the field including 6-9 3PTM for 37/6/1/1/0 and no TO. Video game numbers! So he's a shooter, and he does what NBA shooters do – keeps draining em when they hot! But I think we need to take a step back and consider a few things: Other than massive Pts and treys it was fairly empty. This was against the Pelicans, who without Brow, might look worse than the Sixers; they look horrific. And the third thing that no one seemed to mention while anointing McCollum the next big thing in combo guards this preseason – he's got a pretty extensive injury history. He's at the pinnacle of a sell high for me. Do I think he'll be hot garbage all the sudden? Of course not. But do I think he scores 37 again this year? I don't. Well, unless they faced the Pelicans every night… I'd shop around in the 40-50 range of ADP and see if you can get lucky. As with all fantasy takeaways off one game, it's always good to keep from overreacting. Compared to fantasy football, we're at the same point as about 9 minutes into the first quarter of week 1. Still a long way to go. Here's what else went down during the first full slate of fantasy basketball action:
Drew's Premier RCL League Recap! (Early Draft)
October 14, 2015	| Razzball Commenter Leagues	| 24 Comments
by: Drew
The regular season approaches — fewer than three weeks before our lives finally have meaning again! My RCL had a draft last weekend, and I wanted to share the results with all of you wonderful readers as a fascinating case study and (perhaps) cautionary tale! This was an excellent draft– I think all managers were drafting live, making some ballsy and brilliant picks. I've included a grade and a few words on each of their teams after my pick-by-pick blow-by-blow. Off we go!
[editor's note – we still have leagues open to join the RCL fun, plus we need more leagues! Hop over to the RCL sign-ups and start a league today!]


The natural convection air pellet stoves, also known as stoves without ventilation, are equipped by a system of propagation of the heating that needs any new plumbing, nor air ducting. Unlike the standard forced ventilation pellet stoves, in these models, the diffusion of the heat happens for motion convective disposition and radiation, assuring a continue air recycling that will avoid to ash and dust to collect. Thanks to the new auto-cleaning Brazier®, patented by Karmek One, the cleaning of these stoves can be performed once a month, unlike other models, in which cleaning is necessary before every lighting.