博客

  • 销量下滑+竞争加剧,为缩减开支,特斯拉据悉放弃下一代“一体化压铸”制造工艺

    Reblog via 抽屉新热榜

    销量下滑+竞争加剧,为缩减开支,特斯拉据悉放弃下一代“一体化压铸”制造工艺
    dig.chouti.com/link/42293391

  • Lambda和Kappa的架构的区别

    Lambda 架构和 Kappa 架构是处理大数据流和数据处理的两种不同架构模式。它们各自有不同的设计理念和应用场景,下面我将详细介绍这两种架构的特点和区别。

    Lambda 架构

    设计理念

    Lambda 架构由Nathan Marz提出,旨在解决大规模数据系统的复杂性问题,通过提供一种同时处理批处理和流处理的架构。Lambda 架构主要包含三个层次:

    1. 批处理层(Batch Layer):负责处理大量的存储数据,进行历史数据的分析处理。这一层通常使用MapReduce等批处理技术来实现。
    2. 速度层(Speed Layer):对实时数据进行流式处理,以便快速响应和更新。这一层通常使用如Apache Storm、Apache Flink等流处理技术。
    3. 服务层(Serving Layer):将批处理层和速度层的结果合并,提供一个统一的数据视图供外部查询和分析。

    优点

    • 能够处理和存储大量数据。
    • 结合批处理和实时流处理优势。

    缺点

    • 架构复杂,维护成本高。
    • 需要同步维护两套逻辑。

    Kappa 架构

    设计理念

    Kappa 架构由Jay Kreps提出,是对Lambda架构的简化,主要用于简化实时数据流处理。Kappa 架构只包含一个主要的处理层:

    1. 流处理层:所有数据,无论是实时的还是历史的,都通过同一个流处理系统处理。这意味着批处理在Kappa架构中通过在流处理系统上运行长时间窗口的操作来模拟。

    优点

    • 架构简单,只需要维护一套系统和逻辑。
    • 更容易维护和扩展。

    缺点

    • 对流处理系统的依赖性较高。
    • 需要流处理技术能够有效处理大规模的历史数据重新处理。

    Lambda 与 Kappa 的区别

    • 架构复杂性:Lambda 架构比较复杂,需要维护批处理和流处理两套系统;Kappa 架构更为简洁,全部数据处理都在一个统一的流处理层完成。
    • 数据处理:Lambda 架构通过两个层面独立处理实时和非实时数据,而Kappa架构通过一个统一的流处理层处理所有数据。
    • 系统维护:Lambda 架构的维护成本和复杂性较高,因为需要同步管理两种技术栈;Kappa 架构由于只有一种处理层,因此维护更为简单。

    选择哪种架构取决于具体的业务需求、团队的技术栈以及预期的系统复杂度。Lambda架构适合那些需要强大批处理能力的场景,而Kappa架构更适合追求架构简洁和实时处理的场景。

  • /**
    	 * Parses the request to find the correct WordPress query.
    	 *
    	 * Sets up the query variables based on the request. There are also many
    	 * filters and actions that can be used to further manipulate the result.
    	 *
    	 * @since 2.0.0
    	 * @since 6.0.0 A return value was added.
    	 *
    	 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
    	 *
    	 * @param array|string $extra_query_vars Set the extra query variables.
    	 * @return bool Whether the request was parsed.
    	 */
    	public function parse_request( $extra_query_vars = '' ) {
    		global $wp_rewrite;
    
    		/**
    		 * Filters whether to parse the request.
    		 *
    		 * @since 3.5.0
    		 *
    		 * @param bool         $bool             Whether or not to parse the request. Default true.
    		 * @param WP           $wp               Current WordPress environment instance.
    		 * @param array|string $extra_query_vars Extra passed query variables.
    		 */
    		if ( ! apply_filters( 'do_parse_request', true, $this, $extra_query_vars ) ) {
    			return false;
    		}
    
    		$this->query_vars     = array();
    		$post_type_query_vars = array();
    
    		if ( is_array( $extra_query_vars ) ) {
    			$this->extra_query_vars = & $extra_query_vars;
    		} elseif ( ! empty( $extra_query_vars ) ) {
    			parse_str( $extra_query_vars, $this->extra_query_vars );
    		}
    		// Process PATH_INFO, REQUEST_URI, and 404 for permalinks.
    
    		// Fetch the rewrite rules.
    		$rewrite = $wp_rewrite->wp_rewrite_rules();
    
    		if ( ! empty( $rewrite ) ) {
    			// If we match a rewrite rule, this will be cleared.
    			$error               = '404';
    			$this->did_permalink = true;
    
    			$pathinfo         = isset( $_SERVER['PATH_INFO'] ) ? $_SERVER['PATH_INFO'] : '';
    			list( $pathinfo ) = explode( '?', $pathinfo );
    			$pathinfo         = str_replace( '%', '%25', $pathinfo );
    
    			list( $req_uri ) = explode( '?', $_SERVER['REQUEST_URI'] );
    			$self            = $_SERVER['PHP_SELF'];
    
    			$home_path       = parse_url( home_url(), PHP_URL_PATH );
    			$home_path_regex = '';
    			if ( is_string( $home_path ) && '' !== $home_path ) {
    				$home_path       = trim( $home_path, '/' );
    				$home_path_regex = sprintf( '|^%s|i', preg_quote( $home_path, '|' ) );
    			}
    
    			/*
    			 * Trim path info from the end and the leading home path from the front.
    			 * For path info requests, this leaves us with the requesting filename, if any.
    			 * For 404 requests, this leaves us with the requested permalink.
    			 */
    			$req_uri  = str_replace( $pathinfo, '', $req_uri );
    			$req_uri  = trim( $req_uri, '/' );
    			$pathinfo = trim( $pathinfo, '/' );
    			$self     = trim( $self, '/' );
    
    			if ( ! empty( $home_path_regex ) ) {
    				$req_uri  = preg_replace( $home_path_regex, '', $req_uri );
    				$req_uri  = trim( $req_uri, '/' );
    				$pathinfo = preg_replace( $home_path_regex, '', $pathinfo );
    				$pathinfo = trim( $pathinfo, '/' );
    				$self     = preg_replace( $home_path_regex, '', $self );
    				$self     = trim( $self, '/' );
    			}
    
    			// The requested permalink is in $pathinfo for path info requests and $req_uri for other requests.
    			if ( ! empty( $pathinfo ) && ! preg_match( '|^.*' . $wp_rewrite->index . '$|', $pathinfo ) ) {
    				$requested_path = $pathinfo;
    			} else {
    				// If the request uri is the index, blank it out so that we don't try to match it against a rule.
    				if ( $req_uri === $wp_rewrite->index ) {
    					$req_uri = '';
    				}
    
    				$requested_path = $req_uri;
    			}
    
    			$requested_file = $req_uri;
    
    			$this->request = $requested_path;
    
    			// Look for matches.
    			$request_match = $requested_path;
    			if ( empty( $request_match ) ) {
    				// An empty request could only match against ^$ regex.
    				if ( isset( $rewrite['$'] ) ) {
    					$this->matched_rule = '$';
    					$query              = $rewrite['$'];
    					$matches            = array( '' );
    				}
    			} else {
    				foreach ( (array) $rewrite as $match => $query ) {
    					// If the requested file is the anchor of the match, prepend it to the path info.
    					if ( ! empty( $requested_file )
    						&& str_starts_with( $match, $requested_file )
    						&& $requested_file !== $requested_path
    					) {
    						$request_match = $requested_file . '/' . $requested_path;
    					}
    
    					if ( preg_match( "#^$match#", $request_match, $matches )
    						|| preg_match( "#^$match#", urldecode( $request_match ), $matches )
    					) {
    
    						if ( $wp_rewrite->use_verbose_page_rules
    							&& preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch )
    						) {
    							// This is a verbose page match, let's check to be sure about it.
    							$page = get_page_by_path( $matches[ $varmatch[1] ] );
    
    							if ( ! $page ) {
    								continue;
    							}
    
    							$post_status_obj = get_post_status_object( $page->post_status );
    
    							if ( ! $post_status_obj->public && ! $post_status_obj->protected
    								&& ! $post_status_obj->private && $post_status_obj->exclude_from_search
    							) {
    								continue;
    							}
    						}
    
    						// Got a match.
    						$this->matched_rule = $match;
    						break;
    					}
    				}
    			}
    
    			if ( ! empty( $this->matched_rule ) ) {
    				// Trim the query of everything up to the '?'.
    				$query = preg_replace( '!^.+\?!', '', $query );
    
    				// Substitute the substring matches into the query.
    				$query = addslashes( WP_MatchesMapRegex::apply( $query, $matches ) );
    
    				$this->matched_query = $query;
    
    				// Parse the query.
    				parse_str( $query, $perma_query_vars );
    
    				// If we're processing a 404 request, clear the error var since we found something.
    				if ( '404' === $error ) {
    					unset( $error, $_GET['error'] );
    				}
    			}
    
    			// If req_uri is empty or if it is a request for ourself, unset error.
    			if ( empty( $requested_path ) || $requested_file === $self
    				|| str_contains( $_SERVER['PHP_SELF'], 'wp-admin/' )
    			) {
    				unset( $error, $_GET['error'] );
    
    				if ( isset( $perma_query_vars ) && str_contains( $_SERVER['PHP_SELF'], 'wp-admin/' ) ) {
    					unset( $perma_query_vars );
    				}
    
    				$this->did_permalink = false;
    			}
    		}
    
    		/**
    		 * Filters the query variables allowed before processing.
    		 *
    		 * Allows (publicly allowed) query vars to be added, removed, or changed prior
    		 * to executing the query. Needed to allow custom rewrite rules using your own arguments
    		 * to work, or any other custom query variables you want to be publicly available.
    		 *
    		 * @since 1.5.0
    		 *
    		 * @param string[] $public_query_vars The array of allowed query variable names.
    		 */
    		$this->public_query_vars = apply_filters( 'query_vars', $this->public_query_vars );
    
    		foreach ( get_post_types( array(), 'objects' ) as $post_type => $t ) {
    			if ( is_post_type_viewable( $t ) && $t->query_var ) {
    				$post_type_query_vars[ $t->query_var ] = $post_type;
    			}
    		}
    
    		foreach ( $this->public_query_vars as $wpvar ) {
    			if ( isset( $this->extra_query_vars[ $wpvar ] ) ) {
    				$this->query_vars[ $wpvar ] = $this->extra_query_vars[ $wpvar ];
    			} elseif ( isset( $_GET[ $wpvar ] ) && isset( $_POST[ $wpvar ] )
    				&& $_GET[ $wpvar ] !== $_POST[ $wpvar ]
    			) {
    				wp_die(
    					__( 'A variable mismatch has been detected.' ),
    					__( 'Sorry, you are not allowed to view this item.' ),
    					400
    				);
    			} elseif ( isset( $_POST[ $wpvar ] ) ) {
    				$this->query_vars[ $wpvar ] = $_POST[ $wpvar ];
    			} elseif ( isset( $_GET[ $wpvar ] ) ) {
    				$this->query_vars[ $wpvar ] = $_GET[ $wpvar ];
    			} elseif ( isset( $perma_query_vars[ $wpvar ] ) ) {
    				$this->query_vars[ $wpvar ] = $perma_query_vars[ $wpvar ];
    			}
    
    			if ( ! empty( $this->query_vars[ $wpvar ] ) ) {
    				if ( ! is_array( $this->query_vars[ $wpvar ] ) ) {
    					$this->query_vars[ $wpvar ] = (string) $this->query_vars[ $wpvar ];
    				} else {
    					foreach ( $this->query_vars[ $wpvar ] as $vkey => $v ) {
    						if ( is_scalar( $v ) ) {
    							$this->query_vars[ $wpvar ][ $vkey ] = (string) $v;
    						}
    					}
    				}
    
    				if ( isset( $post_type_query_vars[ $wpvar ] ) ) {
    					$this->query_vars['post_type'] = $post_type_query_vars[ $wpvar ];
    					$this->query_vars['name']      = $this->query_vars[ $wpvar ];
    				}
    			}
    		}
    
    		// Convert urldecoded spaces back into '+'.
    		foreach ( get_taxonomies( array(), 'objects' ) as $taxonomy => $t ) {
    			if ( $t->query_var && isset( $this->query_vars[ $t->query_var ] ) ) {
    				$this->query_vars[ $t->query_var ] = str_replace( ' ', '+', $this->query_vars[ $t->query_var ] );
    			}
    		}
    
    		// Don't allow non-publicly queryable taxonomies to be queried from the front end.
    		if ( ! is_admin() ) {
    			foreach ( get_taxonomies( array( 'publicly_queryable' => false ), 'objects' ) as $taxonomy => $t ) {
    				/*
    				 * Disallow when set to the 'taxonomy' query var.
    				 * Non-publicly queryable taxonomies cannot register custom query vars. See register_taxonomy().
    				 */
    				if ( isset( $this->query_vars['taxonomy'] ) && $taxonomy === $this->query_vars['taxonomy'] ) {
    					unset( $this->query_vars['taxonomy'], $this->query_vars['term'] );
    				}
    			}
    		}
    
    		// Limit publicly queried post_types to those that are 'publicly_queryable'.
    		if ( isset( $this->query_vars['post_type'] ) ) {
    			$queryable_post_types = get_post_types( array( 'publicly_queryable' => true ) );
    
    			if ( ! is_array( $this->query_vars['post_type'] ) ) {
    				if ( ! in_array( $this->query_vars['post_type'], $queryable_post_types, true ) ) {
    					unset( $this->query_vars['post_type'] );
    				}
    			} else {
    				$this->query_vars['post_type'] = array_intersect( $this->query_vars['post_type'], $queryable_post_types );
    			}
    		}
    
    		// Resolve conflicts between posts with numeric slugs and date archive queries.
    		$this->query_vars = wp_resolve_numeric_slug_conflicts( $this->query_vars );
    
    		foreach ( (array) $this->private_query_vars as $var ) {
    			if ( isset( $this->extra_query_vars[ $var ] ) ) {
    				$this->query_vars[ $var ] = $this->extra_query_vars[ $var ];
    			}
    		}
    
    		if ( isset( $error ) ) {
    			$this->query_vars['error'] = $error;
    		}
    
    		/**
    		 * Filters the array of parsed query variables.
    		 *
    		 * @since 2.1.0
    		 *
    		 * @param array $query_vars The array of requested query variables.
    		 */
    		$this->query_vars = apply_filters( 'request', $this->query_vars );
    
    		/**
    		 * Fires once all query variables for the current request have been parsed.
    		 *
    		 * @since 2.1.0
    		 *
    		 * @param WP $wp Current WordPress environment instance (passed by reference).
    		 */
    		do_action_ref_array( 'parse_request', array( &$this ) );
    
    		return true;
    	}
    

    上述代码是WordPress核心类WPparse_request方法的详细实现。这个方法负责解析传入的URL或请求,以确定应执行哪个WordPress查询。以下是对此方法的作用和工作方式的解释,分解为其关键组件:

    parse_request的目的

    parse_request方法旨在根据传入请求设置查询变量。它确定请求应如何处理——无论是渲染文章、页面、类别列表还是处理404错误。

    关键步骤和操作

    1. 过滤提前退出:方法首先检查是否应继续解析请求,使用do_parse_request过滤器。插件可以使用此过滤器来跳过解析过程。
    2. 初始化
    • 清除任何之前的查询变量。
    • 初始化本地变量以处理URL的不同组件。
    1. 处理额外的查询变量:如果提供了任何额外的查询变量,它们将被整合到查询处理中。
    2. 应用重写规则
    • $wp_rewrite检索WordPress重写规则。
    • 处理请求URI和路径信息,去除家庭URL路径,留下将与重写规则匹配的相对路径或查询字符串。
    1. 与重写规则匹配
    • 迭代重写规则以找到与处理后的请求路径的匹配项。
    • 如果找到匹配,相应的WordPress查询变量将根据重写规则设置。
    1. 文章类型和分类法处理
    • 将与文章类型或分类法相关的任何查询变量映射到其相应的查询。
    • 确保只能查询公开可查询的文章类型和分类法。
    1. 安全和清洁
    • 处理GET和POST请求之间潜在的变量冲突。
    • 过滤查询变量以确保最终查询中只包含允许的键。
    1. 最终查询变量准备
    • 应用过滤器以修改或验证查询变量列表。
    • 解决URL中的数字slug冲突。
    1. 动作钩子
    • 执行操作,允许插件在解析查询变量后执行操作。

    结论

    parse_request函数是WordPress解释和响应URL的能力的核心部分。它使用重写规则将URL映射到查询变量,处理来自GET和POST请求的传入变量,并确保只执行允许的查询。这个方法对于确保WordPress可以为不同的URL提供正确的内容至关重要,无论这些URL指向文章、页面、存档还是自定义文章类型和分类法。

    开发中的使用

    开发人员可以使用提供的钩子(do_parse_requestquery_varsrequestparse_request)来扩展或修改这种行为,以定制WordPress对不同请求的响应,这对于需要专门路由的自定义插件或主题特别有用。

  • 【WordPress】function wp_validate_auth_cookie( $cookie = ”, $scheme = ” )

    function wp_validate_auth_cookie( $cookie = '', $scheme = '' ) {
    		$cookie_elements = wp_parse_auth_cookie( $cookie, $scheme );
    		if ( ! $cookie_elements ) {
    			/**
    			 * Fires if an authentication cookie is malformed.
    			 *
    			 * @since 2.7.0
    			 *
    			 * @param string $cookie Malformed auth cookie.
    			 * @param string $scheme Authentication scheme. Values include 'auth', 'secure_auth',
    			 *                       or 'logged_in'.
    			 */
    			do_action( 'auth_cookie_malformed', $cookie, $scheme );
    			return false;
    		}
    
    		$scheme     = $cookie_elements['scheme'];
    		$username   = $cookie_elements['username'];
    		$hmac       = $cookie_elements['hmac'];
    		$token      = $cookie_elements['token'];
    		$expired    = $cookie_elements['expiration'];
    		$expiration = $cookie_elements['expiration'];
    
    		// Allow a grace period for POST and Ajax requests.
    		if ( wp_doing_ajax() || 'POST' === $_SERVER['REQUEST_METHOD'] ) {
    			$expired += HOUR_IN_SECONDS;
    		}
    
    		// Quick check to see if an honest cookie has expired.
    		if ( $expired < time() ) {
    			/**
    			 * Fires once an authentication cookie has expired.
    			 *
    			 * @since 2.7.0
    			 *
    			 * @param string[] $cookie_elements {
    			 *     Authentication cookie components. None of the components should be assumed
    			 *     to be valid as they come directly from a client-provided cookie value.
    			 *
    			 *     @type string $username   User's username.
    			 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
    			 *     @type string $token      User's session token used.
    			 *     @type string $hmac       The security hash for the cookie.
    			 *     @type string $scheme     The cookie scheme to use.
    			 * }
    			 */
    			do_action( 'auth_cookie_expired', $cookie_elements );
    			return false;
    		}
    
    		$user = get_user_by( 'login', $username );
    		if ( ! $user ) {
    			/**
    			 * Fires if a bad username is entered in the user authentication process.
    			 *
    			 * @since 2.7.0
    			 *
    			 * @param string[] $cookie_elements {
    			 *     Authentication cookie components. None of the components should be assumed
    			 *     to be valid as they come directly from a client-provided cookie value.
    			 *
    			 *     @type string $username   User's username.
    			 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
    			 *     @type string $token      User's session token used.
    			 *     @type string $hmac       The security hash for the cookie.
    			 *     @type string $scheme     The cookie scheme to use.
    			 * }
    			 */
    			do_action( 'auth_cookie_bad_username', $cookie_elements );
    			return false;
    		}
    
    		$pass_frag = substr( $user->user_pass, 8, 4 );
    
    		$key = wp_hash( $username . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme );
    
    		// If ext/hash is not present, compat.php's hash_hmac() does not support sha256.
    		$algo = function_exists( 'hash' ) ? 'sha256' : 'sha1';
    		$hash = hash_hmac( $algo, $username . '|' . $expiration . '|' . $token, $key );
    
    		if ( ! hash_equals( $hash, $hmac ) ) {
    			/**
    			 * Fires if a bad authentication cookie hash is encountered.
    			 *
    			 * @since 2.7.0
    			 *
    			 * @param string[] $cookie_elements {
    			 *     Authentication cookie components. None of the components should be assumed
    			 *     to be valid as they come directly from a client-provided cookie value.
    			 *
    			 *     @type string $username   User's username.
    			 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
    			 *     @type string $token      User's session token used.
    			 *     @type string $hmac       The security hash for the cookie.
    			 *     @type string $scheme     The cookie scheme to use.
    			 * }
    			 */
    			do_action( 'auth_cookie_bad_hash', $cookie_elements );
    			return false;
    		}
    
    		$manager = WP_Session_Tokens::get_instance( $user->ID );
    		if ( ! $manager->verify( $token ) ) {
    			/**
    			 * Fires if a bad session token is encountered.
    			 *
    			 * @since 4.0.0
    			 *
    			 * @param string[] $cookie_elements {
    			 *     Authentication cookie components. None of the components should be assumed
    			 *     to be valid as they come directly from a client-provided cookie value.
    			 *
    			 *     @type string $username   User's username.
    			 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
    			 *     @type string $token      User's session token used.
    			 *     @type string $hmac       The security hash for the cookie.
    			 *     @type string $scheme     The cookie scheme to use.
    			 * }
    			 */
    			do_action( 'auth_cookie_bad_session_token', $cookie_elements );
    			return false;
    		}
    
    		// Ajax/POST grace period set above.
    		if ( $expiration < time() ) {
    			$GLOBALS['login_grace_period'] = 1;
    		}
    
    		/**
    		 * Fires once an authentication cookie has been validated.
    		 *
    		 * @since 2.7.0
    		 *
    		 * @param string[] $cookie_elements {
    		 *     Authentication cookie components.
    		 *
    		 *     @type string $username   User's username.
    		 *     @type string $expiration The time the cookie expires as a UNIX timestamp.
    		 *     @type string $token      User's session token used.
    		 *     @type string $hmac       The security hash for the cookie.
    		 *     @type string $scheme     The cookie scheme to use.
    		 * }
    		 * @param WP_User  $user            User object.
    		 */
    		do_action( 'auth_cookie_valid', $cookie_elements, $user );
    
    		return $user->ID;
    	}

    这个PHP函数 wp_validate_auth_cookie() 是WordPress的身份验证系统的一部分。它用于验证用户登录时每个请求发送的身份验证cookie。该函数有两个可选参数:$cookie$scheme

    函数首先使用 wp_parse_auth_cookie() 函数解析身份验证cookie。如果cookie格式错误或不存在,函数会触发 auth_cookie_malformed 动作并返回 false

    接下来,它从解析的cookie中提取各种元素,包括方案、用户名、HMAC(用于数据完整性的一种加密哈希)、令牌和过期时间。

    然后,函数检查请求是否为AJAX或POST请求。如果是,它会将cookie的过期时间延长一小时。这是一个宽限期,用于允许长时间运行的操作。

    接着,函数检查cookie是否已过期。如果已过期,它会触发 auth_cookie_expired 动作并返回 false

    接下来,它检索与cookie中的用户名关联的用户。如果不存在这样的用户,它会触发 auth_cookie_bad_username 动作并返回 false

    然后,函数通过哈希cookie和用户密码的各种元素来生成一个密钥。它使用这个密钥来生成用户名、过期时间和令牌的哈希。如果生成的哈希与cookie中的HMAC不匹配,它会触发 auth_cookie_bad_hash 动作并返回 false

    接下来,它使用 WP_Session_Tokens::get_instance() 方法验证会话令牌。如果令牌无效,它会触发 auth_cookie_bad_session_token 动作并返回 false

    如果此时cookie的过期时间已过(只有在请求是AJAX或POST请求并且已应用宽限期的情况下才可能发生),它会将全局 login_grace_period 变量设置为 1

    最后,如果所有检查都通过,函数会触发 auth_cookie_valid 动作并返回用户的ID,表示身份验证cookie有效。

  • 短剧作为一个流量高速变现的生意,不是创作,而是商品

    Reblog via 抽屉新热榜

    【短剧编剧,被流量操控】刘笑天将短剧作为一个流量高速变现的生意,不是创作,而是商品,“这个商品和衣服袜子没有什么区别。”他将自己视为一个产品经理而不是文学创作者,“说白了我们就是服务业,肯定要找准用户痛点,把客户服务好……用户需要什么,我们生产什么。”
    dig.chouti.com/link/42290228

  • 生物实验室搬迁:安全重于泰山,慎之又慎

    近期,“睡在实验室门口的病毒学家”张永振事件引发了公众对生物实验室搬迁的关注。事件背后,折射出的是生物实验室搬迁的复杂性和潜在风险,以及对安全的高度重视。

    搬迁的风险:潜在的生物安全隐患

    生物实验室,尤其是高等级实验室,储存着各种病原体,稍有不慎,就可能造成泄露,引发公共卫生安全问题。搬迁过程中,涉及到样本的运输、设备的消毒、环境的处理等多个环节,任何一个环节出现疏漏,都可能导致严重后果。

    案例分析:张永振事件

    张永振教授的实验室为P2级别,虽然并非最高级别,但仍然存在潜在风险。实验室中储存着“在研项目包括新冠病毒等多个生物安全项目和一批病原未知样本”,这些样本的处理需要格外谨慎。

    专家的观点:慎重处理,安全第一

    特约专家庄时利和认为,无论出于什么理由关闭张永振教授的实验室,涉及到生物实验室改造、搬迁和关闭的事情,还是要非常慎重。他指出,搬迁过程对正在进行的实验会产生很大影响,一些病毒学实验需要在特定的实验室进行,一旦没有处理好,出现实验室泄漏,后果不堪设想。

    生物安全实验室的分级

    • P1实验室: 基础实验室,研究对公众健康危害风险较低的病原体。
    • P2实验室: 基础实验室,研究对人类或动物造成疾病,但不构成严重危害的病原体。
    • P3实验室: 生物防护实验室,研究对个人健康有高度风险的病原体。
    • P4实验室: 专用于烈性传染病研究与利用的大型装置,研究对人体具有高度危险性、尚无预防和治疗方法的病毒。

    搬迁的规范流程

    • 高等级实验室: 由于其特殊性,极少搬迁,更多是“携菌携毒入住”。
    • 个别搬迁: 需要对原有实验室所有污染物进行处理,设备进行消毒,解除感染风险。
    • 样本运输: 必须符合《病原微生物实验室生物安全管理条例》的规定。

    结语:安全重于泰山

    生物实验室搬迁是一项复杂而严谨的工作,需要充分考虑安全因素,严格按照规范流程操作,确保万无一失。任何侥幸心理和疏忽大意都可能导致严重后果。

    我们应该:

    • 提高对生物安全的认识: 认识到生物实验室搬迁的潜在风险,并予以高度重视。
    • 加强监管: 完善相关法律法规,加强对生物实验室搬迁的监管力度。
    • 提升技术水平: 研发更安全、更可靠的样本运输和实验室消毒技术。

    只有这样,才能确保生物实验室搬迁的安全,保障公众健康和社会安全。

  • Reblog of 抽屉新热榜:

    Reblog via 抽屉新热榜

    病毒学家张永振事件的背后:生物实验室为何不能随便搬迁?
    dig.chouti.com/link/42288370

  • 【WordPress】wp-load.php

    <?php
    /**
     * Bootstrap file for setting the ABSPATH constant
     * and loading the wp-config.php file. The wp-config.php
     * file will then load the wp-settings.php file, which
     * will then set up the WordPress environment.
     *
     * If the wp-config.php file is not found then an error
     * will be displayed asking the visitor to set up the
     * wp-config.php file.
     *
     * Will also search for wp-config.php in WordPress' parent
     * directory to allow the WordPress directory to remain
     * untouched.
     *
     * @package WordPress
     */
    
    /** Define ABSPATH as this file's directory */
    if ( ! defined( 'ABSPATH' ) ) {
    	define( 'ABSPATH', __DIR__ . '/' );
    }
    
    /*
     * The error_reporting() function can be disabled in php.ini. On systems where that is the case,
     * it's best to add a dummy function to the wp-config.php file, but as this call to the function
     * is run prior to wp-config.php loading, it is wrapped in a function_exists() check.
     */
    if ( function_exists( 'error_reporting' ) ) {
    	/*
    	 * Initialize error reporting to a known set of levels.
    	 *
    	 * This will be adapted in wp_debug_mode() located in wp-includes/load.php based on WP_DEBUG.
    	 * @see https://www.php.net/manual/en/errorfunc.constants.php List of known error levels.
    	 */
    	error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
    }
    
    /*
     * If wp-config.php exists in the WordPress root, or if it exists in the root and wp-settings.php
     * doesn't, load wp-config.php. The secondary check for wp-settings.php has the added benefit
     * of avoiding cases where the current directory is a nested installation, e.g. / is WordPress(a)
     * and /blog/ is WordPress(b).
     *
     * If neither set of conditions is true, initiate loading the setup process.
     */
    if ( file_exists( ABSPATH . 'wp-config.php' ) ) {
    
    	/** The config file resides in ABSPATH */
    	require_once ABSPATH . 'wp-config.php';
    
    } elseif ( @file_exists( dirname( ABSPATH ) . '/wp-config.php' ) && ! @file_exists( dirname( ABSPATH ) . '/wp-settings.php' ) ) {
    
    	/** The config file resides one level above ABSPATH but is not part of another installation */
    	require_once dirname( ABSPATH ) . '/wp-config.php';
    
    } else {
    
    	// A config file doesn't exist.
    
    	define( 'WPINC', 'wp-includes' );
    	require_once ABSPATH . WPINC . '/version.php';
    	require_once ABSPATH . WPINC . '/compat.php';
    	require_once ABSPATH . WPINC . '/load.php';
    
    	// Check for the required PHP version and for the MySQL extension or a database drop-in.
    	wp_check_php_mysql_versions();
    
    	// Standardize $_SERVER variables across setups.
    	wp_fix_server_vars();
    
    	define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
    	require_once ABSPATH . WPINC . '/functions.php';
    
    	$path = wp_guess_url() . '/wp-admin/setup-config.php';
    
    	// Redirect to setup-config.php.
    	if ( ! str_contains( $_SERVER['REQUEST_URI'], 'setup-config' ) ) {
    		header( 'Location: ' . $path );
    		exit;
    	}
    
    	wp_load_translations_early();
    
    	// Die with an error message.
    	$die = '<p>' . sprintf(
    		/* translators: %s: wp-config.php */
    		__( "There doesn't seem to be a %s file. It is needed before the installation can continue." ),
    		'<code>wp-config.php</code>'
    	) . '</p>';
    	$die .= '<p>' . sprintf(
    		/* translators: 1: Documentation URL, 2: wp-config.php */
    		__( 'Need more help? <a href="%1$s">Read the support article on %2$s</a>.' ),
    		__( 'https://wordpress.org/documentation/article/editing-wp-config-php/' ),
    		'<code>wp-config.php</code>'
    	) . '</p>';
    	$die .= '<p>' . sprintf(
    		/* translators: %s: wp-config.php */
    		__( "You can create a %s file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file." ),
    		'<code>wp-config.php</code>'
    	) . '</p>';
    	$die .= '<p><a href="' . $path . '" class="button button-large">' . __( 'Create a Configuration File' ) . '</a></p>';
    
    	wp_die( $die, __( 'WordPress &rsaquo; Error' ) );
    }
    

    这段PHP脚本是WordPress应用的一部分,它的主要目的是加载一些必要的文件,并进行一些基本的环境检查。

    首先,它加载了一些核心的WordPress文件,包括版本信息(version.php)、兼容性函数(compat.php)和加载函数(load.php)。

    然后,它调用wp_check_php_mysql_versions()函数来检查当前环境的PHP版本以及是否安装了MySQL扩展或者数据库插件。

    接着,它调用wp_fix_server_vars()函数来标准化$_SERVER变量,以确保在不同的环境下这些变量的行为是一致的。

    然后,它定义了WP_CONTENT_DIR常量,这个常量指向WordPress的内容目录,然后加载了一些基本的WordPress函数(functions.php)。

    接下来,它构造了一个指向setup-config.php的URL,并检查当前的请求URL是否包含setup-config,如果不包含,那么就会重定向到setup-config.php

    然后,它调用wp_load_translations_early()函数来加载早期的翻译。

    最后,如果wp-config.php文件不存在,它会显示一个错误信息,告诉用户需要wp-config.php文件才能继续安装,并提供了一个链接到编辑wp-config.php文件的支持文章,以及一个创建配置文件的按钮。如果用户点击这个按钮,就会被重定向到setup-config.php

    如果所有的检查都通过,那么WordPress的安装过程就可以开始了。