tokenpockettokenpocketapp官方下载|rocket

作者: tokenpockettokenpocketapp官方下载
2024-03-07 20:53:32

rust基础学习——web框架Rocket简单入门 - 知乎

rust基础学习——web框架Rocket简单入门 - 知乎切换模式写文章登录/注册rust基础学习——web框架Rocket简单入门坏蛋Dan现役前端切图仔,互联网瓦房上漆工前言虽然说rust写web没有什么优势,但是来都来了,那顺便逛一下比较出名的Rust Web框架吧~ 另外文章同步到我的网站了:Serene Syllables,喜欢代码高亮的可以去这里看:rust基础学习——web框架Rocket简单入门提前准备rust基础知识:坏蛋Dan:rust基础学习--final: 章节索引rust异步基础知识: 坏蛋Dan:rust基础学习索引--异步tokio简单入门:坏蛋Dan:rust基础学习--tokio入门 Rocket[1]简介img_introduce一个异步的web框架话不多说,直接上手hello world[2]在开始之前,我们需要更新下我们当前rustup版本rustup default stable

然后创建我们的项目mkdir rocket_study

cd rocket_study

cargo init hello-rocket然后配置下根目录的Cargo.toml[workspace]

members = [

"hello-rocket"

] 然后打开hello-rocket文件夹里的Cargo.toml [dependencies]

rocket = "=0.5.0-rc.3"然后回到main.rs文件中#[macro_use] extern crate rocket;

#[get("/")]

fn index() -> &'static str {

"Hello, world!"

}

#[launch]

fn rocket() -> _ {

rocket::build().mount("/", routes![index])

}

#[get("/")]这个是声明宏,别给它外表欺骗了,用于注册对应的路由。build:创建服务示例。mount:注册基础请求路径以及路由。 routes!:是个属性宏,这个应该是用来搭配get这个声明宏的,用于建立联系。 #[macro_use]:这个主要是显性的将rocket里的宏全部导入,这样我们就可以在全局任意地方使用rocket的宏了。 这样就可以跑了,是的,你没看错,main函数都被干没了,主要是被宏直接隐藏了。然后直接cargo run -p hello-rocketimg_run_hello_world预览生命周期[3]Rocket主任务是监听请求,然后分配请求给你实现的处理器,返回响应给客户端。这里将监听到返回响应体的过程叫做生命周期。大体上可以分为以下四部分:Routing:解析一个HTTP请求并转换成我们可以间接操控的原生结构。然后通过我们定义的路由属性匹配对应的处理器(handler)来执行Validation:在处理器执行之前,会先验证处理器所需要的类型是否符合,如果检验失败,Rocket会继续往下找到下一个匹配到的处理器,如果找不到直接进入错误处理器(error handler)。Processing:处理器里面执行的逻辑就是我们开发者主要实现的部分,以返回一个Response为结束标志。Response:将process返回的Response整理一下发送给客户端。Routing[4]Rocket应用的中心是围绕路由(routes)和处理器(handlers)的。一个路由由以下两部分组成:用于匹配请求的一系列参数一个用于处理请求和返回响应体的处理器而处理器指的是一个简单的函数可以接收任意的参数和返回任意的响应。参数可以匹配到的包含静态路径、动态路径、路径片段(segments)、表单、查询语句(query strings)、请求格式说明符(request format specifiers)、请求体数据(body data)。Rocket将这些定义为“属性”,写法和其他语言中的装饰器类似。比如下面这样:#[get("/world")] // <- route attribute

fn world() -> &'static str { // <- request handler

"hello, world!"

}

一个路由属性搭配上一个路由处理器其中#[get]指的是一个get类型的请求,/world则是静态路径。除了get,自然还有post等,比如#[post]、#[put]或者#[catch]用于服务自定义错误页面。我们会在之后的章节里更深入的了解到。Mounting[5]在派发请求之前,需要先找到派发的对象。这就需要我们去注册或者说是挂载对应的路由。rocket::build()

.mount("/hello", routes![world])

.mount("/hi", routes![world]);

/hello:请求匹配到的路径的基础路径(base path),比如我们注册了world(routes![world]),那么这个时候请求路径就得是/hello/world才能识别到对应的处理器。routes!:前面说过这是一个宏,后面接入一组函数名,比如routes![fn_a, fn_b, fn_c]。build:创建一个新的Rocket实例。同一个路由可以在不同基础路径下注册。比如这里的/hello/world以及/hi/world。Launching[6]不过在开始创建实例之前,我们还需要launch,launch的作用是创建一个多线程异步服务器以及派发进来的请求给路由。launch有两种方式:第一个就是我们刚看到的#[launch],编译阶段它会展开成一个main函数搭配上异步的runtime然后开启服务。另外我们还需要提供返回的类型,一般设置_就行了,它会自动推断,如果你想,你也可以手动返回Rocket。#[macro_use] extern crate rocket;

#[get("/world")]

fn world() -> &'static str {

"Hello, world!"

}

#[launch]

fn rocket() -> _ {

rocket::build().mount("/hello", routes![world])

}

第二种方式就是使用#[rocket::main]路由属性。和#[launch]不同的是它允许我们自行开启服务。比如下面这样:#[rocket::main]

async fn main() -> Result<(), rocket::Error> {

let _rocket = rocket::build()

.mount("/hello", routes![world])

.launch()

.await?;

Ok(())

}

你可以用来获取launch的future,在这个过程中处理一些其它的事务。又或者你需要判断launch之后的错误场景做特殊处理,那么这个时候也是非常有用的。Future and Async[7]rocket使用Future来处理并发(concurrency)问题。一般情况下我们是更喜欢使用异步库而不是同步的。Rocket中存在异步的场景如下:路由和错误捕获器(Error Catchers)可以是异步的函数,那么在这里面我们就可以等待第三方库比如tokio等或者直接使用Rocket给的Future。部分Rocket的traits,比如FromData和FromRequest都有返回Future的方法。Data和DataStream、进来的请求携带的数据、Response以及Body、传输给客户端的响应体携带的数据都是基于tokio::io::AsyncRead的,而不是std::io::Read。需要注意的是Rocket v0.5使用了tokio runtime,我们通过#[launch]或者#[rocket::main]来开启的服务都是tokio runtime的,当然你也可以自定义。异步路由来看个例子use rocket::tokio::time::{sleep, Duration};

#[get("/delay/")]

async fn delay(seconds: u64) -> String {

sleep(Duration::from_secs(seconds)).await;

format!("Waited for {} seconds", seconds)

}

这里使用了tokio::time::sleep,是一个异步函数,所以需要.await。MultitaskingRust的Future是一组协作式多任务处理,一般情况下我们不应该去阻塞异步函数。不过我们会遇到一些万不得已的场景,比如相关api只有同步的,这种时候推荐使用tokio::task::spawn_blocking也就是提供一个wrapper包裹原来的方法。use std::io;

use rocket::tokio::task::spawn_blocking;

#[get("/blocking_task")]

async fn blocking_task() -> io::Result> {

// In a real app, use rocket::fs::NamedFile or tokio::fs::File.

let vec = spawn_blocking(|| std::fs::read("data.txt")).await

.map_err(|e| io::Error::new(io::ErrorKind::Interrupted, e))??;

Ok(vec)

}

Requests[8]Methods[9]我们前面已经接触过get了,实际上目前可以支持几乎所有的请求类型,比如post、put、delete、head、patch、options等。具体可以看这里:route in rocket - RustHEAD Requests当你的get请求中带有Head,Rocket会自动处理HEAD请求。当然,你也可以自定义一个HEAD的路由,Rocket并不会干扰程序显性的(explicitly)处理HEAD请求。Reinterpreting由于html那边定义了表单提交类型只支持GET和POST请求,Rocket“不得已”重新定义了部分场景下的请求类型,比如POST请求的Content-Type为application/x-www-form-urlencoded,并且form的第一个字段带有_method以及值是一个符合标准HTTP请求的比如PUT,那么这个请求类型就会变成对应_method值的类型。官方给的例子中就有用到这一点(不过恕我吐槽,还隔这传统SSR呢。。。):https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/todo/static/index.html.tera#L47Dynamic Path[10]动态路径比较常见的场景是动态id场景,比如:#[get("/hello/")]

fn hello(name: &str) -> String {

format!("Hello, {}!", name)

}

这个路由会匹配所有/hello/为基础路径的路由,然后将它匹配到的动态路径作为参数传递给处理器。语法是<${xxx}>。你可以传N个动态类型即你的动态路径有多层,只要你这个类型实现了FromParam[11]这个trait即可,他们管这叫做:参数保护,其实也就是trait bound。。比如:#[get("/hello///")]

fn hello(name: &str, age: u8, cool: bool) -> String {

if cool {

format!("You're a cool {} year old, {}!", age, name)

} else {

format!("{}, we need to talk about your coolness.", name)

}

}

Rocket默认给标准库里的一些常见类型以及Rocket自身的一些特殊类型实现了这个trait,具体可以看这里:https://api.rocket.rs/v0.5-rc/rocket/request/trait.FromParam.html多个片段(segments)你也可以通过的方式来匹配多个动态路径,这种类型的参数一般被叫做分段防护装置(segments guards),都必须先实现FromSegments这个trait。这个参数必须放到路径的最后面,不然会导致编译错误(可以参考python的*params和**params参数匹配)来看个例子:use std::path::PathBuf;

#[get("/page/")]

fn get_page(path: PathBuf) { /* ... */ }

PathBuf实现了FromSegments这个trait,所以你不用担心/page或者/page//导致的解析失败,另外因为实现了FromSegments,我们也不用担心路径遍历攻击(path traversal attacks)。基于这一点,我们可以简单的实现一个安全的静态文件服务器:use std::path::{Path, PathBuf};

use rocket::fs::NamedFile;

#[get("/")]

async fn files(file: PathBuf) -> Option {

NamedFile::open(Path::new("static/").join(file)).await.ok()

}

PS:如果你真的想要搞一个静态文件服务器,你可以使用FileServer,只需一行代码即可:rocket.mount("/public", FileServer::from("static/"))

Ignored Segments如果你的路径是动态的,但是你又不想要其中几个参数,那么这个时候你可以直接使用_占位符<_>占位即可,如果是多个可以使用<_..>。比如:#[get("/foo/<_>/bar")]

fn foo_bar() -> &'static str {

"Foo _____ bar!"

}

#[get("/<_..>")]

fn everything() -> &'static str {

"Hey, you're here."

}

Forwarding[12]回到我们前面匹配多个动态路径的路由例子:#[get("/hello///")]

fn hello(name: &str, age: u8, cool: bool) { /* ... */ }

如果这里的cool不是一个布尔值呢?又或者age不是u8呢?我们前面提到的生命周期的里有一个validation,这个时候就是invalid,那么就不会走这个handler,而是继续往下匹配,直到遇到了下一个匹配的上的或者找到最后找不到了走err handler。另外我们可以通过rank关键字调整同个路由下不同handler匹配的优先级。比如下面这个例子:#[get("/user/")]

fn user(id: usize) { /* ... */ }

#[get("/user/", rank = 2)]

fn user_int(id: isize) { /* ... */ }

#[get("/user/", rank = 3)]

fn user_str(id: &str) { /* ... */ }

#[launch]

fn rocket() -> _ {

rocket::build().mount("/", routes![user, user_int, user_str])

}

上面这个例子中首先匹配到的就是user这个处理器,如果不符合校验,接着匹配的是user_int,如果还不匹配则轮到user_str。这个rank我们可以在终端看到,比如img_handler_rankRocket的默认rank范围是-12 ~ -1之间,这一点后面会解释到。 如果你给处理器的动态参数类型设置为Result或者Option,那么这个时候这个处理器函数将不会再往下匹配,Ok拿到值,而Err则表示解析错误等。如果你确实存在多个同名路径路由,那么这个时候这个rank是不能省略的,不然编译的时候会直接报错。 img_error_collides_routes注意,这里是forward的场景下才会出现。什么意思呢?实际上就是上面这种场景,虽然是动态的,但是路径都长得一样。那么对于长得不一样但是也有可能相同的场景来说并且没有指定rank的情况下,这里就需要引入权重(优先权)这一点了。比如下面这个例子#[get("/foo/<_>/bar")]

fn foo_bar() { }

#[get("/<_..>")]

fn everything() { }

虽然长得不一样,但是肯定是在同一个forward中的。那么哪个优先级高呢? 很明显是/foo/<_>/bar高,因为它比较“静”也就是static。 而_..则是完全的“动”,即dynamic。简单地说就是以/分割那边字面量多哪边优先级高一些。 img_preference_table这里就是我们上面提到的rank的默认范围,数越小优先级越高。而path的权重则是高于query的(这里指的是路由的不同分类)。static:路径中全是静态的,即都是字面量,比如/a/b/c partial:部分是动态的,比如/root/<_>/bar wild:全是动态的,比如<_..> 这里简单了解下即可,正常情况下我们并不会遇到这类问题。Request Guards简单地说就是类似trait bound,也就是需要实现FromRequest[13]这个trait。实现了FromRequest的类型就都叫做请求守卫。 rocket内置给几乎所有基础类型以及部分rocket自己的类型实现了这个trait 来简单的看下源码和例子img_FromRequest_and_demo可以看到实际上就是每个类型自身去实现校验的逻辑,而rocket会在执行处理器之前进行校验。 对于没有命名的类型参数来说,你可以手动指定它们为请求守卫,比如:#[get("/")]

fn index(param: isize, a: A, b: B, c: C) { /* ... */ }

其中A, B, C三个类型都是请求守卫。 他们仨可以是任意类型,只要是实现了FromRequest即可。Custom Guards基于上面这一点,我们实际上可以实现自己想要的请求守卫,自定义校验逻辑,比如:use rocket::request::{FromRequest, Outcome, Request};

struct ApiKey {

_type: String,

content: String,

}

#[rocket::async_trait]

impl<'r> FromRequest<'r> for ApiKey {

type Error = String;

async fn from_request(request: &'r Request<'_>) -> Outcome {

if let Some(key) = request

.query_value::>>("key")

.take()

{

dbg!(key);

Outcome::Success(Self {

_type: "md5".to_string(),

content: "aioscnhasdjasdjwj".to_string(),

})

} else {

Outcome::Failure((

rocket::http::Status { code: 400 },

String::from("wrong key"),

))

}

}

}

#[get("/sensitive")]

fn sensitive(key: ApiKey) -> &'static str { /* .. */

return "哈嘿嗨"

}

img_success_get_response如果不传key就会报错img_failureGuard Transparency另外我们还可以基于守卫去实现访问权限的方式,rocket中如果需要实现这一块功能,那么就需要数据都通过FromRequest才行。如果某个类型是只能通过FromRequest实现创建的,那么我们就将这类型称之为"类型级证明"(type-level proof),证明当前的请求已经根据任意的策略进行了验证。而FromRequest则作为这个类型的见证者,rocket中称这一概念为守卫透明度(guard transparency)。 这一大段话就很绕了,我们来搞个具体的例子加深下理解。fn health_records(user: &SuperUser) -> Records { /* ... */ }

某个程序具有一个函数 health_records,该函数返回数据库中的所有健康记录。由于健康记录是敏感信息,因此只能由超级用户访问。超级用户请求保护对超级用户进行身份验证和授权,其 FromRequest 实现是可以构造超级用户的唯一方法。通过按如下方式声明health_records函数,可以保证在编译时防止违反健康记录的访问控制。原因如下:health_records函数需要&SuperUser这个trait。SuperUser的构造器只有一个FromRequest。只有Rocket可以通过FromRequest来传递request。那么这里就只能是通过FromRequest来访问request,而SuperUser又是可以唯一一个通过验证的,那么这个时候自然就只有这个SuperUser可以访问数据。不过这里代价则是生命周期,你可以看到我们前面写的代码,一连串的生命周期参数。通过牺牲一点可维护性来强化安全问题。Forwarding GuardsRequest Guards和Forwarding可以作为一套组合拳,至于组合啥,我们来通过一个例子来知晓组合的是啥。首先我们这里有两个Request guard:User:一个常规的、被授权的用户,我们给它实现FromRequest用来确认用户的cookie并且当确认无误的时候返回用户的信息,如果没有用户可以授权,这个守卫将forward。AdminUser:一个用户被授权为管理员。我们给它实现FromRequest用来确认是否是超级管理员并且确认无误之后返回管理员信息。如果没有管理员可以授权,这个守卫也会forward。use rocket::response::Redirect;

#[get("/login")]

fn login() -> Template { /* .. */ }

#[get("/admin")]

fn admin_panel(admin: AdminUser) -> &'static str {

"Hello, administrator. This is the admin panel!"

}

#[get("/admin", rank = 2)]

fn admin_panel_user(user: User) -> &'static str {

"Sorry, you must be an administrator to access this page."

}

#[get("/admin", rank = 3)]

fn admin_panel_redirect() -> Redirect {

Redirect::to(uri!(login))

}

我们使用这俩组合成一套用户身份验证的逻辑,优先验证是否是管理员,次之才是用户,最后则是游客,直接跳登录页面。这么写有函数重载那味儿了,代码会简洁非常多,不用在同一个处理器中用if去做判断,而是通过impl FromRequest去实现check。这么一看确实优雅了很多。Cookies[14]Cookie这玩意儿在Web中是绕不开了,而Rocket自然也考虑过这一点,所以它内置了相关的请求守卫:CookieJar[15],它允许我们对cookies的增删改。既然它是一个请求守卫,那它自然是可以直接用来作为处理器参数的。使用例子:use rocket::http::CookieJar;

#[get("/")]

fn index(cookies: &CookieJar<'_>) -> Option {

cookies.get("message").map(|crumb| format!("Message: {}", crumb.value()))

}

Private CookiesCookie有个问题就是你发送给客户端的数据是暴露的,用户可以通过某些方法去得到对应的信息,而对于一些敏感的信息来说,被用户拿到了是非常危险的。所以自然就需要做处理,Rocket中提供了私有cookie,和其他cookie唯一的不同点就是它们是加密过的。不过Rocket默认不导入这块,我们需要手动去添加features。## in Cargo.toml

rocket = { version = "=0.5.0-rc.3", features = ["secrets"] }这些方法的名字和之前的一样,只不过加上了_private的后缀,即get_private、set_private、add_private、remove_private等。来看个例子:use rocket::http::{Cookie, CookieJar};

use rocket::response::{Flash, Redirect};

/// Retrieve the user's ID, if any.

#[get("/user_id")]

fn user_id(cookies: &CookieJar<'_>) -> Option {

cookies.get_private("user_id")

.map(|crumb| format!("User ID: {}", crumb.value()))

}

/// Remove the `user_id` cookie.

#[post("/logout")]

fn logout(cookies: &CookieJar<'_>) -> Flash {

cookies.remove_private(Cookie::named("user_id"));

Flash::success(Redirect::to("/"), "Successfully logged out.")

}

Secret Key秘钥这玩意儿相信大家都知道是干啥的,简单地说就是用于加密时的一个私有变量。Rocket中加密采用的是secret_key配置中指定的 256位的key参数。在debug模式下,这个key会自动生成,而生产环境则需要我们开发者来定义。值也不一定是256位的base64,也有可能是hex字符串又或者32字节的切片。我们可以通过openssl等工具直接生成,我们本机连接远程服务器的方式之一就是通过它。openssl rand -base64 32关于配置这一块,具体可以看:https://rocket.rs/v0.5-rc/guide/configurationFormat[16]前面我们自己写的路由处理器获取到的数据或者返回的数据最终都变成了字符串,而真实开发中这并不是我们需要的,我们需要的是某些特定格式的,比如当header中的Content-Type为application/json时,拿到或者返回的格式我们希望是json的。作为Web框架,Rocket自然也兼顾到了这一点。我们可以在路由的路径参数中(从这里往后定义在#${method}[]里面的参数都叫做组件了)设置format组件来forward, 比如: #[post("/user", format = "application/json", data = "")]

fn new_user(user: User) { /* ... */ }

只有Content-Type是application/json时才会匹配成功。 format = "application/json"可以简写为format = "json",具体可见:ContentType in rocket::http - Rust。 这里有点需要注意:format组件对于支持负载(payload-supporting)的 POST/PUT/DELETE/CATCH四种method来说是验证Content-Type,而对于不支持的GET/HEAD/OPTIONS来说则是匹配Accept。 Body Data[17]上面Format中的例子带有一个data = 的组件,实际上这个就是定义的Body Data。这个组件同样会作为处理器的参数传入处理器中。来再看个例子:#[post("/", data = "")]

fn new(input: T) { /* .. */ }

这个参数需要实现FromData[18]这个trait ,一般管这叫做数据守卫(data guard).JSONJSON[19]可以将数据序列化成JSON结构,唯一的要求则是T需要实现serde[20]的Deserialize这个trait。来看个例子:use rocket::serde::{Deserialize, json::Json};

#[derive(Deserialize)]

#[serde(crate = "rocket::serde")]

struct Task<'r> {

description: &'r str,

complete: bool

}

#[post("/todo", data = "")]

fn new(task: Json>) { /* .. */ }

完整的例子可见:https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/serialization/src/json.rs 注意:这里使用的#[serde(crate = "rocket::serde")]是用来指向rocket导出的serde这个包,由于孤岛规则的原因,我们这么写是存在损耗的,所以如果不想导致损耗的话,可以直接修改Cargo.toml让它直接和rocket同级serde = { version = "1.0", features = ["derive"] }另外这里的支持json也需要修改Cargo.tomlrocket = { version = "=0.5.0-rc.3", features = ["json"] } 还有其他格式的,详情可见:rocket - RustTemporary Files看名字就知道是和文件操作相关的,这个TempFile数据守卫将数据流写入一个临时文件中,这样使得文件操作变得轻松很多。来看个例子use rocket::fs::TempFile;

#[post("/upload", format = "plain", data = "")]

async fn upload(mut file: TempFile<'_>) -> std::io::Result<()> {

file.persist_to(permanent_location).await

}

Streaming有的时候我们就是想自己操作进来的数据,那么这个时候我们就可以通过Data[21]这个类型来包裹参数,比如:use rocket::tokio;

use rocket::data::{Data, ToByteUnit};

#[post("/debug", data = "")]

async fn debug(data: Data<'_>) -> std::io::Result<()> {

// Stream at most 512KiB all of the body data to stdout.

data.open(512.kibibytes())

.stream_to(tokio::io::stdout())

.await?;

Ok(())

}

最多接收512KB的字节流,注意这里为了避免遭受到DoS的攻击,需要声明接收的最大值,这里使用的是rocket自带的ToByteUnit[22]的trait用来限制 Forms[23]前面我们用format限制了Content-Type等,但是我们的数据拿到手还是字符串类型的,这时就需要我们手动去实现这一类的功能,将数据转换成我们想要的格式,前面Body Data里JSON就是其中一种方法,不过Rocket中还内置了另一种数据守卫Form[24]以及FromForm[25]这个trait,可以让我们转换成更多的类型。 我们先来看个例子use rocket::form::Form;

#[derive(FromForm)]

struct Task<'r> {

complete: bool,

r#type: &'r str,

}

#[post("/todo", data = "")]

fn new(task: Form>) { /* .. */ }

Form作为一个数据守卫,要求它的泛型T得实现FromForm这个trait,我们这里直接使用派生宏给Task实现FromForm。FromForm可以用于给任何字段都实现了FromForm/FromFormField的数据机构实现。注意这里依旧是会校验Content-Type的,也就是说即使我们不使用format组件依旧没问题,当不匹配的时候就会forward。我们甚至可以用Option或者Result包裹参数,这样我们就可以让fail被捕获到了。#[post("/todo", data = "")]

fn new(task: Option>>) { /* .. */ }

MultipartMultipart表单会被无感知处理,也没有其余损耗。例子:use rocket::form::Form;

use rocket::fs::TempFile;

#[derive(FromForm)]

struct Upload<'r> {

save: bool,

file: TempFile<'r>,

}

#[post("/upload", data = "")]

fn upload_form(upload: Form>) { /* .. */ }

这就行了,大多数Multipart都有被内置处理,我们并不需要手动去处理Parsing Strategy对于FromForm来说,它并不会做严格限制,限制啥呢?字段,我们学Rust基础内容的时候如果实例多了或者少了字段就会导致编译报错,不过这里这段代码是跑在runtime的,所以并不会有编译上的问题。Form仅对当前类型的字段做处理,它不会去限制你的数据是否缺失字段或者多了字段,少了它自动帮你补全成默认值,多了它不理会。当然,你如果不想要这么宽松,你可以使用Form>[26]来严格限制,Strict也是实现了FromForm的,所以任何可以使用Form的地方都可以使用Form>。use rocket::form::{Form, Strict};

#[post("/todo", data = "")]

fn new(task: Form>>) { /* .. */ }

你也可以把它用于其中一个字段#[derive(FromForm)]

struct Input {

required: Strict,

uses_default: bool

}

#[post("/", data = "")]

fn new(input: Form) { /* .. */ }

比如必填。既然有严格,那自然就有宽松lenient[27] ,Form默认就是lenient的,所以请不要做Form>这种骚操作。 Defaults前面我们说过字段缺失会有补充默认值的行为,那么这个默认值我们是可以自定义的。#[derive(FromForm)]

struct MyForm {

// Set the default value to be `"hello"`.

//

// Note how an `&str` is automatically converted into a `String`.

#[field(default = "hello")]

greeting: String,

// Remove the default value of `false`, requiring all parses of `MyForm`

// to contain an `is_friendly` field.

#[field(default = None)]

is_friendly: bool,

}

#[field(default = expr)] 当这里的default为None的时候则不会作为这个字段的默认值,而是采用FromForm提供的。如果不是None,则会调用expr.into()将值作为字段的默认值,具体可看:FromForm in rocket - Rust。Field Renaming就如标题所说,这里还支持字段重命名,你可能觉得有些蛋疼,但实际上在一些场景下还是有用的,比如对于前端给的数据中给的字段是另一个名字,这个时候如果跟前端battle不过,你就可以用,当然,更建议是继续battle直到胜利,来看个例子:#[derive(FromForm)]

struct External<'r> {

#[field(name = uncased("firstName"))]

#[field(name = "first_name")]

first_name: &'r str

}

我们给first_name这个字段定义一个first-Name的大小写敏感名字,和一个firstName大小写敏感的名字。也就是说这里支持first-Name、firstName、FirstName或者FIRSTName。Ad-Hoc Validation除了设置默认值之外,我们还可以做验证,是的,针对于某个字段的校验。比如: #[derive(FromForm)]

struct Person {

#[field(validate = range(21..))]

age: u16

}

我们需要age > 21才行,所以这里给了个range(21..)。不过这里的range是rocket::form::validate::range[28] 除此之外,还可以使用validate模块里提供的其它函数,比如:#[derive(FromForm)]

struct Password<'r> {

#[field(name = "password")]

value: &'r str,

#[field(validate = eq(self.value))]

#[field(validate = omits("no"))]

confirm: &'r str,

}

当然,这也是可以自定义的,不过需要借助Rocket::form::Result来实现,比如:use rocket::time::Date;

use rocket::form::{self, Error};

#[derive(FromForm)]

struct CreditCard {

#[field(validate = luhn(self.cvv, &self.expiration))]

number: u64,

#[field(validate = range(..9999))]

cvv: u16,

expiration: Date,

}

fn luhn<'v>(number: &u64, cvv: u16, exp: &Date) -> form::Result<'v, ()> {

if !valid {

Err(Error::validation("invalid credit card number"))?;

}

Ok(())

}

Wrapping Validators如果很多地方都有用到同一种验证,那么我们最好是将这块逻辑抽取出来重复使用。Rocket也提供了这种功能比如这个Age的验证在很多地方都有用到,那么这个时候就可以这么封装#[derive(FromForm)]

#[field(validate = range(18..150))]

struct Age(u16);

#[derive(FromForm)]

struct Person {

#[field(validate = range(21..))]

age: Age

}

别忘了给它加上derive(FromForm),毕竟实现FromForm的前提是所有子字段都需要实现FromForm。 Rocket 的表单支持允许您的应用程序使用任何级别的嵌套和集合来表达任何结构,从而超越任何其他 Web 框架提供的表达能力。简单地说,就是通过.或者[]去访问嵌套结构等。比如:food.bart[bar:foo].blam[0_0][1000]=some-value&another_field=another_val

|-------------------------------| name

|--| |--| |-----| |--| |-| |--| keys

|--| |--| |-| |-| |--| |-| |--| indices

上面的格式不是一个引用,而是一个例子,用来加深理解。等号左边这个链式调用被.和[]分割成keys,然后keys可以通过:来分割为indices也就是常说的index。而等号右边则是一段key2=value2&key2=value2。注意如果.是跟在[]后面的,那么这里的.不是必要的,比如a[b].c和a[b]c是等效的。NestingForm是可以嵌套的,这一点我们前面的Age就是,我们再来看个例子:use rocket::form::FromForm;

#[derive(FromForm)]

struct MyForm<'r> {

owner: Person<'r>,

pet: Pet<'r>,

}

#[derive(FromForm)]

struct Person<'r> {

name: &'r str

}

#[derive(FromForm)]

struct Pet<'r> {

name: &'r str,

#[field(validate = eq(true))]

good_pet: bool,

}

上面的结构可能被编码成owner.name=Bob&pet.name=Sally&pet.good_pet=on这样,然后解析之后会变成下面这样MyForm {

owner: Person {

name: "Bob".into()

},

pet: Pet {

name: "Sally".into(),

good_pet: true,

}

}

Vectors也有支持Vectors的,而Vec里的元素也是可以使用.或者[]来赋值。比如下面这样:"numbers[]=1&numbers[]=2&numbers[]=3",

"numbers[a]=1&numbers[b]=2&numbers[c]=3",

"numbers[a]=1&numbers[b]=2&numbers[a]=3",

"numbers[]=1&numbers[b]=2&numbers[c]=3",

"numbers.0=1&numbers.1=2&numbers[c]=3",

"numbers=1&numbers=2&numbers=3",

这上面几种都是等效的,可能有些不好理解。对于空[]来说,直接push到vector的最后面,比如上面第一行,而对于同一个key来说,会按顺序往后放,比如上面第三行来说,等效于[a, b, a] = [1, 2, 3]。它们都会被解析为MyForm {

numbers: vec![1 ,2, 3]

}

其中"numbers=1&numbers=2&numbers=3"有些离谱,不过它等效于numbers[]=1&numbers[]=2&number3=[]。不过对于实现了FromFormField的类型来说,如果已经存在对应的key了就不会再继续push了。// These, on the other hand...

"numbers[0]=1&numbers[0]=2&numbers[]=3",

"numbers[]=1&numbers[b]=3&numbers[b]=2",

// ...parse as this struct:

MyForm {

numbers: vec![1, 3]

}

仅保留第一个key的值。 Nesting in Vectors既然是Vector,那自然可以放其它结构的数据类型,比如Struct,来看个例子// These form strings...

assert_form_parses! { MyForm,

"name=Bob&pets[0].name=Sally&pets[0].good_pet=on",

"name=Bob&pets[sally].name=Sally&pets[sally].good_pet=yes",

// ...parse as this struct:

MyForm {

name: "Bob".into(),

pets: vec![Pet { name: "Sally".into(), good_pet: true }],

}

这个就不用多说了,和前面分析的流程一样。需要提一下下面的场景是会导致解析失败的:// These, on the other hand, fail to parse:

"name=Bob&pets[0].name=Sally&pets[1].good_pet=on",

"name=Bob&pets[].name=Sally&pets[].good_pet=on",

不允许使用空[]或者key丢失。Nested Vectors既然Vec也实现了FromForm,那么它自然也可以作为Vec的元素类型。比如:#[derive(FromForm)]

struct MyForm {

v: Vec>,

}

然后我们来看下规则:"v=1&v=2&v=3" => MyForm { v: vec![vec![1], vec![2], vec![3]] },

"v[][]=1&v[][]=2&v[][]=3" => MyForm { v: vec![vec![1], vec![2], vec![3]] },

"v[0][]=1&v[0][]=2&v[][]=3" => MyForm { v: vec![vec![1, 2], vec![3]] },

"v[][]=1&v[0][]=2&v[0][]=3" => MyForm { v: vec![vec![1], vec![2, 3]] },

"v[0][]=1&v[0][]=2&v[0][]=3" => MyForm { v: vec![vec![1, 2, 3]] },

"v[0][0]=1&v[0][0]=2&v[0][]=3" => MyForm { v: vec![vec![1, 3]] },

"v[0][0]=1&v[0][0]=2&v[0][0]=3" => MyForm { v: vec![vec![1]] },

老实说这真的可读性极差极差,这就是灵活的代价。Maps一个表单还可以包含maps,比如:use std::collections::HashMap;

#[derive(FromForm)]

struct MyForm {

ids: HashMap,

}

和Vector不一样的是,对于Map来说,它的key是有意义的,同一个key永远指向同一个数据。来看个例子:// These form strings...

"ids[a]=1&ids[b]=2",

"ids[b]=2&ids[a]=1",

"ids[a]=1&ids[a]=2&ids[b]=2",

"ids.a=1&ids.b=2",

// ...parse as this struct:

MyForm {

ids: map! {

"a" => 1usize,

"b" => 2usize,

}

}

由于map的key和value可以是任意值,所以这里你把key设置为usize,那么你赋值时的表现完全可以和Vector的一样,但尽量不要这么做。// These form strings...

"ids[0]name=Bob&ids[0]age=3&ids[1]name=Sally&ids[1]age=10",

"ids[0]name=Bob&ids[1]age=10&ids[1]name=Sally&ids[0]age=3",

"ids[0]name=Bob&ids[1]name=Sally&ids[0]age=3&ids[1]age=10",

// ...which parse as this struct:

MyForm {

ids: map! {

0usize => Person { name: "Bob".into(), age: 3 },

1usize => Person { name: "Sally".into(), age: 10 },

}

}

由于key值需要比较,所以对于你设置的key类型来说,它需要实现Eq,另外还需要实现一个Hash,这个点和Rocket底层逻辑有关,这里就不分析了。 当然,别忘了实现FromForm。这里还有个问题,由于key可以是任意值,那么这里是可以塞入一个struct的,而struct又有多个字段,如果要写就得把所有字段再加上,这就很蛋疼了,而Rocket官方显然也知道这个问题,所以针对这个问题他们又提供了一个方案(这可读性真的。。。。) 来看个例子:#[derive(FromForm)]

struct MyForm {

m: HashMap,

}

#[derive(FromForm, PartialEq, Eq, Hash)]

struct Person {

name: String,

age: usize

}

#[derive(FromForm)]

struct Pet {

wags: bool

}

而针对于这种,写法这是:"m[k:alice]name=Alice&m[k:alice]age=30&m[v:alice].wags=no",

"m[k:alice]name=Alice&m[k:alice]age=30&m[alice].wags=no",

"m[k:123]name=Alice&m[k:123]age=30&m[123].wags=no",m[k:$key],其中k表示key,而$key可以是任意的,对于同一序列来说,$key一样的都算是同一个元素。 同理于m[v:$value] 另外如果不指明k:则表示是value。 上面的代码解析后相当于:MyForm {

m: map! {

Person { name: "Alice".into(), age: 30 } => Pet { wags: false }

}

}

Arbitrary Collections这个就不多解释了,简单地说就是自由~,但是自由的代价既是可读性差来看个类型:use std::collections::{BTreeMap, HashMap};

#[derive(FromForm, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]

struct Person {

name: String,

age: usize

}

HashMap>, HashMap>

|-[k:$k1]-----------|------|------| |-[$k1]-----------------|

|---[$i]-------|------|------| |-[k:$j]*|

|-[k:$k2]|------| ~~[$j]~~|name*|

|-name*| ~~[$j]~~|age-*|

|-age*-|

|~~~~~~~~~~~~~~~|v:$k2*|

根据上面的类型,我们可以搞个例子:type Foo = HashMap>, HashMap>;

// This (long, contrived) form string...

"[k:top_key][i][k:sub_key]name=Bobert&\

[k:top_key][i][k:sub_key]age=22&\

[k:top_key][i][sub_key]=1337&\

[top_key][7]name=Builder&\

[top_key][7]age=99",

你现在可以很好的分析这一块的意思吗?如果可以,那你基本上就学会了,但是如果还没,那也不急,咱以后实战磨练。再分析序列之前,我们先来分析下类型,是一个Map类型,然后它的key类型是一个Vector,value类型则是Map,它的key是usize,而value是struct。而key里的元素则是BTree也是一个Map,而这个Map的key则是struct,value是usize。很乱是吧,不过也不是不能理解。然后我们来分析下序列。top_key指的是Vector,也就是最外层Map的key。而i是Vector里的元素,是BtreeMap。sub_key则是BtreeMap里的key,也就是Persion。而后面没有k:则表示是同一个数据的value,也就是Persion。ContextContextual[29]是其它form guard的代理(proxy),记录所有表单提交的值和提供关联到对应字段名的错误。Contextual一般是用于表单的渲染回填,即上次填写的内容再次打开表单的时候可以看到,另外就是提供错误这一点了。我们可以使用Form>作为数据守卫,T则需要实现FromForm。context字段包含表单的上下文Context[30]。来看下用法:use rocket::form::{Form, Contextual};

#[post("/submit", data = "

")]

fn submit(form: Form>) {

if let Some(ref value) = form.value {

// The form parsed successfully. `value` is the `T`.

}

// We can retrieve raw field values and errors.

let raw_id_value = form.context.field_value("id");

let id_errors = form.context.field_errors("id");

}

错误收集是支持嵌套写法的,即a.b.c这种。另外Context会被序列化成一个map,所以它可以用于渲染在templates中,不过需要使用Serialize类型。具体可见:https://api.rocket.rs/v0.5-rc/rocket/form/struct.Context.html。而例子可见:https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/formsQuery Strings[31]前面我们分析的都属于path,那么这个Query是个啥呢?Query声明和path参数类似,但是处理方式则是和常规URL编码表单字段类似。来看张图:img_path_and_query除了实现的trait不同之外。。。。不过不用急,我们等会接触到例子就知道了Static Parameters和静态路径一样,也是强匹配,直接来看下例子:#[get("/?hello&cat=♥")]

fn cats() -> &'static str {

"Hello, kittens!"

}

// The following GET requests match `cats`. `%E2%99%A5` is encoded `♥`.

"/?cat=%E2%99%A5&hello"

"/?hello&cat=%E2%99%A5"

"/?dogs=amazing&hello&there&cat=%E2%99%A5"

注意是contains即是子集就行,并且不需要注意每个参数的顺序可以看到实际上就是在匹配参数,专注点不同。Dynamic Parameters用法相信大家也都猜出来了,这里咱就直接上例子了#[derive(Debug, PartialEq, FromFormField)]

enum Color {

Red,

Blue,

Green

}

#[derive(Debug, PartialEq, FromForm)]

struct Pet<'r> {

name: &'r str,

age: usize,

}

#[derive(Debug, PartialEq, FromForm)]

struct Person<'r> {

pet: Pet<'r>,

}

#[get("/?&&&")]

fn hello(name: &str, color: Vec, person: Person<'_>, other: Option) {

assert_eq!(name, "George");

assert_eq!(color, [Color::Red, Color::Green, Color::Green, Color::Blue]);

assert_eq!(other, None);

assert_eq!(person, Person {

pet: Pet { name: "Fi Fo Alex", age: 1 }

});

}

// A request with these query segments matches as above.

name=George&\

color=red&\

color=green&\

person.pet.name=Fi+Fo+Alex&\

color=green&\

person.pet.age=1&\

color=blue&\

extra=yes\

注意默认也是不敏感 + 宽容的Trailing Parameter也就是收尾参数,直接看例子:use rocket::form::Form;

#[derive(FromForm)]

struct User<'r> {

name: &'r str,

active: bool,

}

#[get("/?hello&&")]

fn user(id: usize, user: User<'_>) {

assert_eq!(id, 1337);

assert_eq!(user.name, "Bob Smith");

assert_eq!(user.active, true);

}

// A request with these query segments matches as above.

hello&\

name=Bob+Smith&\

id=1337&\

active=yes\

这里收集的包括static和dynamic的,另外只能放到最后不然也会有编译错误Error Catchers[32]一般错误的出现大多来自以下场景:守卫失败响应失败路由匹配失败而catcher捕获器就是用来捕获这些错误的,包含了错误码和错误引起的地方或者区域。捕获器和路由挺像的,不如说它也算是一种路由,但是比较特殊,专门用于处理出错误的场景。它有以下一些和路由不同的点:捕获器只设计错误的场景捕获器使用catch属性声明捕获器通过register()[33]而不是mount()[34]来注册在捕获器被执行之前,任何的cookies的修改都需要先处理完错误处理器无法使用守卫错误处理器返回的响应不能失败处理器的作用域是路径的前缀来看个例子:use rocket::Request;

#[catch(404)]

fn not_found(req: &Request) { /* .. */ }

表示捕获错误码为404的场景。这里参数实际上除了&Request之外可能还有一个Status。返回的响应类型得是实现Responder的。比如String#[catch(404)]

fn not_found(req: &Request) -> String {

format!("Sorry, '{}' is not a valid path.", req.uri())

}

当然,不要忘了注册fn main() {

rocket::build().register("/", catchers![not_found]);

}

Scoping前面说了捕获器的作用域是路由前缀,比如上面的例子中是/。我们来看个例子:#[catch(404)]

fn general_not_found() -> &'static str {

"General 404"

}

#[catch(404)]

fn foo_not_found() -> &'static str {

"Foo 404"

}

#[launch]

fn rocket() -> _ {

rocket::build()

.register("/", catchers![general_not_found])

.register("/foo", catchers![foo_not_found])

}

这里如果你请求的是/foo,它只会走foo_not_found,而不会再触发general_not_found,所以作用域是严格的。Default Catchers默认捕获器会捕获所有类型的状态码。你可以用它来作为一个回调,用于处理公共业务,来看个例子:use rocket::Request;

use rocket::http::Status;

#[catch(default)]

fn default_catcher(status: Status, request: &Request) { /* .. */ }

#[launch]

fn rocket() -> _ {

rocket::build().register("/", catchers![default_catcher])

}

推荐是通过路由路径限制,而不是状态码,这样要处理的业务比较单一,作用域也比较小。当然,看你个人喜好。Built-In CatcherRocket提供了内置的捕获器,返回的数据是HTML还是JSON取决于你说设置Header的Accept。具体可见:https://api.rocket.rs/v0.5-rc/rocket/catcher/struct.Catcher.htmlResponses[35]Request学的差不多了,我们来学下Response。Responder[36]我们在处理器中返回的内容最终会被rocket自动包装成一个标准的htttp responder[37],不过这是有代价的,我们的return type需要实现Responder这个trait。Wrapping有些情况下,我们的返回数据可能是一个多层嵌套的responder,即一个实现了Responder的类型包裹另外一个实现了Responder的类型,比如:struct WrappingResponder(R);

具体的例子:use rocket::http::Status;

use rocket::response::{content, status};

#[get("/")]

fn json() -> status::Custom> {

status::Custom(Status::ImATeapot, content::RawJson("{ \"hi\": \"world\" }"))

}

例子挺好懂的,就不多说了。Errors这里的Errors实际上有两种场景,一种是来自于业务,比如某些数据在业务逻辑中判断是无效的,那么这个时候就应该返回Error,但是状态一般都是200表示http响应正常。而另一种则是程序自己的错误,是开发的bug,这种情况一般是返回500,表示服务器内部出错,这种就是之前我们接触到的catcher来处理。Status我们可以利用Status[38]来forward,比如:use rocket::http::Status;

#[get("/")]

fn just_fail() -> Status {

Status::NotAcceptable

}

NotAcceptable对应的状态码是406,属于error status codes(范围是[400, 599]),它会直接forward到error catcher。其它可以跳catcher的还有以下的场景:img_error_status_codes_for_forwardingCustom Responder[39]直接来看个例子:use rocket::http::{Header, ContentType};

#[derive(Responder)]

#[response(status = 500, content_type = "json")]

struct MyResponder {

inner: OtherResponder,

header: ContentType,

more: Header<'static>,

#[response(ignore)]

unrelated: MyType,

}

上面的代码在包裹的过程中会经历下面的流程:将当前状态码设置成500;返回数据类型设置成application/json;插入self.header和self.more;执行self.inner返回组装好的response。这里注意inner这个字段作为内部的responder,而其他的(除了使用#[response(ignore)]的)都会作为header插入到response。具体可见:https://api.rocket.rs/v0.5-rc/rocket/derive.Responder.html一般情况下我们都是直接impl Responder来实现(具体可见:https://api.rocket.rs/v0.5-rc/rocket/response/trait.Responder.html),但是这里实际上还有另一种方式。如果你的类型包裹了一个Responder,那么你的这个类型会自动实现Responder。implementations[40]Rocket内置给String、&str、File、Option以及Result这些类型实现了Responder。Strings给Strings和&str实现的Responder的body是sized以及Content-Type是text/plain的。根据这点,相信大家自己都可以写一个,来看下源码的部分use std::io::Cursor;

use rocket::request::Request;

use rocket::response::{self, Response, Responder};

use rocket::http::ContentType;

#[rocket::async_trait]

impl<'r> Responder<'r, 'static> for String {

fn respond_to(self, _: &'r Request<'_>) -> response::Result<'static> {

Response::build()

.header(ContentType::Plain)

.sized_body(self.len(), Cursor::new(self))

.ok()

}

}

这没什么好说的了,大家想要自己定义的话可以参照这个例子。Option由于Option和Result都要接收泛型作为数据类型,所以它们的T都需要实现Responder才行。对于None的场景,会直接进入404的场景。来看个例子:use rocket::fs::NamedFile;

#[get("/")]

async fn files(file: PathBuf) -> Option {

NamedFile::open(Path::new("static/").join(file)).await.ok()

}

成功直接返回文件,失败直接404。Result由于Result需要接受两个泛型T和E,所以他俩都得实现Responder。还是fileserver,不过我们可以拓展下我们想要返回的内容:use rocket::fs::NamedFile;

use rocket::response::status::NotFound;

#[get("/")]

async fn files(file: PathBuf) -> Result> {

let path = Path::new("static/").join(file);

NamedFile::open(&path).await.map_err(|e| NotFound(e.to_string()))

}

Rocket Responders[41]Rocket自己的一些类型也都实现了Responder,来看下最常用的几个:NamedFile:返回给客户端的文件流,会自动根据文件的拓展名来设置Content-Type。Redirect:重定向。content:用于覆盖响应的Content-Type。status:用于覆盖响应的状态码。Flash:设置访问时删除的“闪存”cookie。Json:自动序列化值为JSON。MsgPack:自动序列化值为MessagePack。Template:使用Tera或者handlebars渲染一个动态的模板Async Streamsstream响应器允许无线的异步stream。一个stream可以通过任何的异步Stream或者AsyncRead类型或者宏stream![42]来创建。Streams是一块实时单向通信(unidirectional real-time communication)。比如通过EventStream[43]实现的一个聊天室[44](Server-Sent Events即SSE)。我们来看个例子,通过AsyncRead类型来创建的ReaderStream[45]:use std::io;

use std::net::SocketAddr;

use rocket::tokio::net::TcpStream;

use rocket::response::stream::ReaderStream;

#[get("/stream")]

async fn stream() -> io::Result {

let addr = SocketAddr::from(([127, 0, 0, 1], 9999));

let stream = TcpStream::connect(addr).await?;

Ok(ReaderStream::one(stream))

}

再来看个使用宏TextStream[46]的例子:use rocket::tokio::time::{Duration, interval};

use rocket::response::stream::TextStream;

/// Produce an infinite series of `"hello"`s, one per second.

#[get("/infinite-hellos")]

fn hello() -> TextStream![&'static str] {

TextStream! {

let mut interval = interval(Duration::from_secs(1));

loop {

yield "hello";

interval.tick().await;

}

}

}

JSON我们一般用这个来快速的返回一个JSON类型的数据,不过Json的泛型需要实现前面说过的来自serde[47]的Serialize[48]才行。例子:use rocket::serde::{Serialize, json::Json};

#[derive(Serialize)]

#[serde(crate = "rocket::serde")]

struct Task { /* .. */ }

#[get("/todo")]

fn todo() -> Json {

Json(Task { /* .. */ })

}

默认设置的Content-Type是JSON,如果序列化失败,错误的场景是500。序列化的例子:https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/serialization。Templates[49]直接来看个例子:use rocket_dyn_templates::Template;

#[get("/")]

fn index() -> Template {

let context = /* object-like value */;

Template::render("index", &context)

}

这里使用了rocket_dyn_templates的Template[50],渲染了一个名为index的模板。注意这里的context需要实现Serialize。如果是字面量,我们可以直接使用context!这个宏。use rocket_dyn_templates::Template;

#[get("/")]

fn index() -> Template {

Template::render("index", context! {

foo: 123,

})

}

模板需要先注册才行,我们可以使用Template::fairing()来让Template自动注册所有它接触到的template:use rocket_dyn_templates::Template;

#[launch]

fn rocket() -> _ {

rocket::build()

.mount("/", routes![/* .. */])

.attach(Template::fairing())

}

前面说过这里可以使用两种模型:handlerbars和tera,用哪个取决于你在template_dir文件夹中模板的后缀是.hbs还是.tera。至于如何配置,我们后面会接触到。Live Reloading局部热更新,在开发模式下修改模板不需要重启服务器。具体可见:https://api.rocket.rs/v0.5-rc/rocket_dyn_templates/struct.Template.html例子:https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/templatingTyped URIs[51]这个直接描述可能不太好理解,所以这里先来看例子:#[get("//?")]

fn person(id: Option, name: &str, age: Option) { /* .. */ }

// with unnamed parameters, in route path declaration order

let mike = uri!(person(101, "Mike Smith", Some(28)));

assert_eq!(mike.to_string(), "/101/Mike%20Smith?age=28");

// with named parameters, order irrelevant

let mike = uri!(person(name = "Mike", id = 101, age = Some(28)));

assert_eq!(mike.to_string(), "/101/Mike?age=28");

let mike = uri!(person(id = 101, age = Some(28), name = "Mike"));

assert_eq!(mike.to_string(), "/101/Mike?age=28");

// with a specific mount-point

let mike = uri!("/api", person(id = 101, name = "Mike", age = Some(28)));

assert_eq!(mike.to_string(), "/api/101/Mike?age=28");

// with optional (defaultable) query parameters ignored

let mike = uri!(person(101, "Mike", _));

assert_eq!(mike.to_string(), "/101/Mike");

let mike = uri!(person(id = 101, name = "Mike", age = _));

assert_eq!(mike.to_string(), "/101/Mike");

现在应该就很好理解了。简单地说,我们通过uri!这个宏来创建路由的URI。它会返回一个Origin的结构,将路由插入结构中作为返回的值,这个值实现了UriDisplay确保了它是类型安全的等。Origin实现了Into,所以它可以通过.into()以及传入Redirect::into()等方法的方式转换成一个Uri。Ignorables前面说过动态的参数可以通过_占位符来实现忽略(仅query,path不支持),而在这里自然需要兼容处理,要求URI必须实现Ignorable.Deriving UriDisplay前面说过返回的值需要实现UriDisplay这个trait才行,所以如果我们需要自定义某些路由参数的时候就需要手动去实现才行。对于path需要实现UriDisplayPath,而query的则是UriDisplayQuery。比如:use rocket::form::Form;

#[derive(FromForm, UriDisplayQuery)]

struct UserDetails<'r> {

age: Option,

nickname: &'r str,

}

#[post("/user/?")]

fn add_user(id: usize, details: UserDetails) { /* .. */ }

let link = uri!(add_user(120, UserDetails { age: Some(20), nickname: "Bob".into() }));

assert_eq!(link.to_string(), "/user/120?age=20&nickname=Bob");

它实际上是编译阶段自动帮我们实现UriDisplay。Typed URI Parts前面的UriDisplay实际上实现了Part这个trait,用来作为marker type,作用自然是用来标记数据是Path还是Query。这么做自然是为了传参的安全,我们传参也可以直接一套代码就行而不用做区分。ConversionsFromUriParam这个类型是用来在UriDisplay接收值之前转换传给uri!的值的。其中P自然就是Part,而S表示转换的目标类型。比如:impl<'a, P: Part> FromUriParam for String {

type Target = &'a str;

}

下面这些都是可以转的:&T => T&mut T => TString => &str&str => &Path&str => PathBufT => Form专属于path的:T => OptionT => Result专属于query的:Option => Result (for any E)Result => Option (for any E)另外是支持传递的,比如A => B, B => C,那么可以直接改成A => C。use std::path::PathBuf;

#[get("/person//")]

fn person(id: usize, details: Option) { /* .. */ }

uri!(person(id = 100, details = "a/b/c"));

&str先变成PathBuf,然后又变成Option。具体可见:https://api.rocket.rs/v0.5-rc/rocket/http/uri/fmt/trait.FromUriParam.htmlState[52]一个web应用基本都需要维护一些状态,比如访客量、任务队列以及多数据库。Rocket提供了工具用于安全的管理状态。Managed State[53]Rocket提供的状态管理是按类型来的,每个类型最多只会拥有一个值。上手很简单:调用manage,并且初始化。给任意处理器添加&State,其中T是提供给manage的值的类型。注意都得是Send和Sync的,得保证线程安全,因为Rocket会自动开多个线程。Adding State前面说的manage是一个方法,来自于Rocket实例。来看个例子:use std::sync::atomic::AtomicUsize;

struct HitCount {

count: AtomicUsize

}

rocket::build().manage(HitCount { count: AtomicUsize::new(0) });

我们直接传入了初始值。另外还可以多次调用:rocket::build()

.manage(HitCount { count: AtomicUsize::new(0) })

.manage(Config::from(user_input));

Retrieving State我们可以通过&State获取到T类型对应的值。&State是一个用于管理状态的请求守卫。来看个例子:use rocket::State;

#[get("/count")]

fn count(hit_count: &State) -> String {

let current_count = hit_count.count.load(Ordering::Relaxed);

format!("Number of visits: {}", current_count)

}

另外如果你想要获取的值之前并没有注册到manage中,那么在服务器启动的时候会直接失败。而针对于runtime的数据来说,也就是动态类型,Rocket会使用sentinels来判断是否符合要求,不符合会触发500。完整的例子:https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/statemanage细节:https://api.rocket.rs/v0.5-rc/rocket/struct.Rocket.html#method.manageState type:https://api.rocket.rs/v0.5-rc/rocket/struct.State.htmlWithin Guards由于&State自身是一个请求守卫,所以我们可以直接通过实现了Request::guard()[54]或者Rocket::state()[55]的方式获取到&State,不过使用Request::guard()的前提是实现了FromRequest。例子:use rocket::State;

use rocket::request::{self, Request, FromRequest};

use rocket::outcome::IntoOutcome;

struct Item<'r>(&'r str);

#[rocket::async_trait]

impl<'r> FromRequest<'r> for Item<'r> {

type Error = ();

async fn from_request(request: &'r Request<'_>) -> request::Outcome {

// Using `State` as a request guard. Use `inner()` to get an `'r`.

let outcome = request.guard::<&State>().await

.map(|my_config| Item(&my_config.user_val));

// Or alternatively, using `Rocket::state()`:

let outcome = request.rocket().state::()

.map(|my_config| Item(&my_config.user_val))

.or_forward(());

outcome

}

}

Request-Local State[56]根据前面manage方法来自于Rocket的实例我们可以知道前面的状态管理是在全局的,如果我们只想要在局部管理的话我们需要使用Request-local state,这种state随着请求的结束而被drop,注意这里的请求指的是一次http请求,包括了request、fairing、request guard、responder。这种局部状态是会被缓存的,这对于一些场景来说是很有用的,比如同一个http请求过程中多次触发的请求守卫等。来看个例子:use rocket::request::{self, Request, FromRequest};

/// A global atomic counter for generating IDs.

static ID_COUNTER: AtomicUsize = AtomicUsize::new(0);

/// A type that represents a request's ID.

struct RequestId(pub usize);

/// Returns the current request's ID, assigning one only as necessary.

#[rocket::async_trait]

impl<'r> FromRequest<'r> for &'r RequestId {

type Error = ();

async fn from_request(request: &'r Request<'_>) -> request::Outcome {

// The closure passed to `local_cache` will be executed at most once per

// request: the first time the `RequestId` guard is used. If it is

// requested again, `local_cache` will return the same value.

request::Outcome::Success(request.local_cache(|| {

RequestId(ID_COUNTER.fetch_add(1, Ordering::Relaxed))

}))

}

}

#[get("/")]

fn id(id: &RequestId) -> String {

format!("This is request #{}.", id.0)

}

每次请求都会返回同一个id,这么做可以省去参数传递,写起来比较方便。具体可见:https://api.rocket.rs/v0.5-rc/rocket/request/trait.FromRequest.html#request-local-stateDatabases[57]Rocket通过rocket_db_pools内置了对数据库的支持,通过连接池的方式访问多个数据库。至于如何配置我们之后会接触到。下面简单三步实现连接数据库:在这里选择一个支持的数据库驱动:rocket_db_pools - Rust。然后将rocket_db_pools引入项目中:[dependencies.rocket_db_pools]

version = "=0.1.0-rc.3"

features = ["sqlx_sqlite"]2. 设置一个数据区的名字,下面的例子中数据库名字是sqlite_logs。配置相关信息,其中数据库路径是必须的。[default.databases.sqlite_logs]

url = "/path/to/database.sqlite"

3. 引入数据库,首先需要定义数据库驱动的类型以及它指向的数据库名字。在创建实例的时候需要初始化数据库驱动。最后可以通过路由守卫Connection来获取数据库实例#[macro_use] extern crate rocket;

use rocket_db_pools::{Database, Connection};

use rocket_db_pools::sqlx::{self, Row};

#[derive(Database)]

#[database("sqlite_logs")]

struct Logs(sqlx::SqlitePool);

#[get("/")]

async fn read(mut db: Connection, id: i64) -> Option {

sqlx::query("SELECT content FROM logs WHERE id = ?").bind(id)

.fetch_one(&mut *db).await

.and_then(|r| Ok(r.try_get(0)?))

.ok()

}

#[launch]

fn rocket() -> _ {

rocket::build().attach(Logs::init()).mount("/", routes![read])

}

更多细节:https://api.rocket.rs/v0.5-rc/rocket_db_pools/index.htmlDriver Featuresrocket_db_pools默认只会导出必要的特性,如果需要拓展,我们得在Cargo.toml中引入:[dependencies.sqlx]

version = "0.6"

default-features = false

features = ["macros", "offline", "migrate"]

[dependencies.rocket_db_pools]

version = "=0.1.0-rc.3"

features = ["sqlx_sqlite"]

Synchronous ORMsrocket_db_pools是不堵塞的,如果你需要同步堵塞的话,你可以使用rocket_sync_db_pools。Examples例子:https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/databasesFairings[58]Fairings前面提过几次,但是都没说是个啥,实际上就是Rocket提供用来实现类似中间层(middleware)的方法。有了中间层,我们可以在一个http请求的生命周期中做很多事情。Overview[59]对于实现了Fairing这个trait的类型来说都叫fairing。虽然和其它框架中的中间层很像,但是几个关键点还是有区别的:Fairings无法直接对请求进行终结/响应。Fairings无法注入没有非request数据到一个请求中。Fairings可以阻止程序启动。Fairings可以修改程序配置。实际上其它框架中的中间层和请求守卫/数据守卫更像一些。根据上面几点,一个Fairings的作用更多的是和全局有关的,而不是局部。如果你的逻辑是局部的,建议使用请求守卫等。AttachingFairings是需要注册的,需要通过Rocket实例的attching方法注册。看下例子:#[launch]

fn rocket() -> _ {

rocket::build()

.attach(req_fairing)

.attach(res_fairing)

}

Fairings是按顺序触发的,所以你需要确保顺序是正确的。除了singleton fairings之外fairing都是允许触发多次的。callbacksfairing可以在下面几个事件中注册回调:Ignite(on_ignite):在Rocket实例构建的时候触发hook。一般用来校验和处理配置,或者处理全局状态。Liftoff(on_liftoff):在程序launch的瞬间触发。可以用来阻止Rocket实例launch。Request(on_request):当请求到达的时候触发。可以用来修改请求。Response(on_response):当一个响应已经准备好发送给客户端了的时候触发。可以用来修改响应。Shutdown(on_shutdown):在程序shutdown的时候触发。细节可见:https://api.rocket.rs/v0.5-rc/rocket/fairing/trait.Fairing.htmlimplementing[60]实现Fairing必须实现info这个方法,它会返回一个Info。这个Info会被用于Rocket指派fairing和触发回调。Requirements另外实现Fairing需要Send + Sync + 'static,也就是线程安全。Examples我们有好几个get/post请求,这里面有一些相同的操作,这里就可以抽出来放到全局。use std::io::Cursor;

use std::sync::atomic::{AtomicUsize, Ordering};

use rocket::{Request, Data, Response};

use rocket::fairing::{Fairing, Info, Kind};

use rocket::http::{Method, ContentType, Status};

struct Counter {

get: AtomicUsize,

post: AtomicUsize,

}

#[rocket::async_trait]

impl Fairing for Counter {

// This is a request and response fairing named "GET/POST Counter".

fn info(&self) -> Info {

Info {

name: "GET/POST Counter",

kind: Kind::Request | Kind::Response

}

}

// Increment the counter for `GET` and `POST` requests.

async fn on_request(&self, request: &mut Request<'_>, _: &mut Data<'_>) {

match request.method() {

Method::Get => self.get.fetch_add(1, Ordering::Relaxed),

Method::Post => self.post.fetch_add(1, Ordering::Relaxed),

_ => return

};

}

async fn on_response<'r>(&self, request: &'r Request<'_>, response: &mut Response<'r>) {

// Don't change a successful user's response, ever.

if response.status() != Status::NotFound {

return

}

// Rewrite the response to return the current counts.

if request.method() == Method::Get && request.uri().path() == "/counts" {

let get_count = self.get.load(Ordering::Relaxed);

let post_count = self.post.load(Ordering::Relaxed);

let body = format!("Get: {}\nPost: {}", get_count, post_count);

response.set_status(Status::Ok);

response.set_header(ContentType::Plain);

response.set_sized_body(body.len(), Cursor::new(body));

}

}

}

注册了on_request和on_response两个回调,用来插入请求值和修改响应值。完整的例子可见于:https://api.rocket.rs/v0.5-rc/rocket/fairing/trait.Fairing.html#exampleAd-Hoc Fairings[61]这里还提供了字面量的快捷方法,比如:use rocket::fairing::AdHoc;

use rocket::http::Method;

rocket::build()

.attach(AdHoc::on_liftoff("Liftoff Printer", |_| Box::pin(async move {

println!("...annnddd we have liftoff!");

})))

.attach(AdHoc::on_request("Put Rewriter", |req, _| Box::pin(async move {

req.set_method(Method::Put);

})))

.attach(AdHoc::on_shutdown("Shutdown Printer", |_| Box::pin(async move {

println!("...shutdown has commenced!");

})));

AdHoc是一个内置的实现了Fairing的结构体。Testing[62]Rocket还提供了单元/集成测试。不过这就需要我们模拟请求了。Local Dispatching[63]Rocket有一个local模块,它包含了一个Client结构体可以用来创建LocalRequest。使用例子:创建一个Rocket实例。let rocket = rocket::build();

2. 使用这个实例构建客户端。let client = Client::tracked(rocket).unwrap();

3. 使用客户端实例构建请求。let req = client.get("/");

4. 获取响应let response = req.dispatch();

Validating Response[64]上面第四步返回的response的类型是LocalResponse。我们可以用它来校验。status: 返回http状态码。content_type: 返回Content-Type。headers: 返回响应的header,是一个map。into_string: 将响应体数据转换成字符串。into_bytes: 将响应体数据转换成Vec。into_json: 转换成JSON格式。into_msgpack: 转换成MessagePack格式。来看个例子:use rocket::http::{ContentType, Status};

let mut response = client.get(uri!(hello)).dispatch();

assert_eq!(response.status(), Status::Ok);

assert_eq!(response.content_type(), Some(ContentType::Plain));

assert!(response.headers().get_one("X-Special").is_some());

assert_eq!(response.into_string().unwrap(), "Expected Body");

Testing demo[65]我们来搞个例子:首先搭建下基础:#[get("/")]

fn hello() -> &'static str {

"Hello, world!"

}

#[launch]

fn rocket() -> _ {

rocket::build().mount("/", routes![hello])

}

Setting Up然后来创建测试环境#[cfg(test)]

mod test {

use super::rocket;

use rocket::local::blocking::Client;

use rocket::http::Status;

#[test]

fn hello_world() {

/* .. */

}

}

然后完善测试逻辑Testing #[test]

fn hello_world() {

let client = Client::tracked(rocket()).expect("valid rocket instance");

let mut response = client.get(uri!(super::hello)).dispatch();

assert_eq!(response.status(), Status::Ok);

assert_eq!(response.into_string().unwrap(), "Hello, world!");

}

然后就可以直接cargo test了。最终代码:#[get("/")]

fn hello() -> &'static str {

"Hello, world!"

}

#[launch]

fn rocket() -> Rocket {

rocket::build().mount("/", routes![hello])

}

#[cfg(test)]

mod test {

use super::rocket;

use rocket::local::blocking::Client;

use rocket::http::Status;

#[test]

fn hello_world() {

let client = Client::tracked(rocket()).expect("valid rocket instance");

let mut response = client.get(uri!(super::hello)).dispatch();

assert_eq!(response.status(), Status::Ok);

assert_eq!(response.into_string().unwrap(), "Hello, world!");

}

}

Asynchronous Testing[66]上面的例子你应该注意到了blocking,是的,目前测试都是同步的,即使Rocket自身是异步的。同步测试比较简单,但是在某些场景就不太好用了,比如最常见的并发场景,需要模拟多个请求。而Rocket其实也提供了异步的api:rocket::local::asynchronous。例子:https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/testing/src/async_required.rs。Codegen Debug[67]我们可以通过设置参数ROCKET_CODEGEN_DEBUG=1环境变量来查看更详细的错误信息。比如:note: emitting Rocket code generation debug output

--> examples/hello/src/main.rs:14:1

|

14 | #[get("/world")]

| ^^^^^^^^^^^^^^^^

|

= note:

impl world {

fn into_info(self) -> rocket::StaticRouteInfo {

fn monomorphized_function<'_b>(

__req: &'_b rocket::request::Request<'_>,

__data: rocket::data::Data,

) -> ::rocket::route::BoxFuture<'_b> {

::std::boxed::Box::pin(async move {

let ___responder = world();

::rocket::handler::Outcome::from(__req, ___responder)

})

}

::rocket::StaticRouteInfo {

name: "world",

method: ::rocket::http::Method::Get,

path: "/world",

handler: monomorphized_function,

format: ::std::option::Option::None,

rank: ::std::option::Option::None,

sentinels: sentinels![&'static str],

}

}

}

Configuration[68]Rocket系统配置是基于Figment这个crate的。OverviewRocket的配置系统是基于Figment的 Provider的,它用于提供配置数据。Rocket的Config 、 Config::figment()、 Toml 以及 Json都是Providers的实例。多个provider可以合并成一个provider,不过需要实现Deserialize。下面是一些基础配置:keykinddescriptiondebug/release defaultaddressIpAddrIP服务地址127.0.0.1portu16服务的端口8000workers*usize用于处理futures的线程cpu core countmax_blocking*usize限制线程用于同步任务512identstring, false是否/如何通过 Server header.辨别"Rocket"ip_headerstring, falseIP header用于检测,获取通过 client's real IP."X-Real-IP"keep_aliveu32Keep-alive 时间; 为 0是禁止.5log_levelLogLevel最高支持多少层log(off/normal/debug/critical)normal/criticalcli_colorsbool是否在log中支持颜色和emoji.truesecret_keySecretKey密钥NonetlsTlsConfigTLS 的配置,如果有.NonelimitsLimitsStreaming读取长度的限制Limits::default()limits.$name&str/uint读取$name的长度限制form = "32KiB"ctrlcbool是否支持ctrl + c终止程序trueshutdown*Shutdown自定义终结程序方式Shutdown::default()*注意:这里的woekers、max_blocking以及shutdown.force在default provider中是只读的。Profiles配置文件可以通过 Profile设置任何的名字。开发模式下 Config 和 Config::figment()在开发模式下会自动设置为debug,而生产环境则是release,当然都是可以自定义的。比如我们可以通过ROCKET_PROFILE来覆盖default provider的基础配置。对于配置文件来说,这里有两个元(meta)配置文件:default和global,它们提供的值可以应用于所有配置文件。default的数据是兜底的,如果必要的数据没有配置就会直接拿default的,而global则是最顶级的,会覆盖任何的配置文件下同个配置项。Default ProviderRocket默认的配置provider是 Config::figment()。在rocket::build()的时候会被使用。配置文件的基础是key也就是配置项。下面配置内容的优先级逐级升高:通过Config::default()配置出来的,是兜底数据。Rocket.toml或者TOML文件路径配置在ROCKET_CONFIG的环境变量。ROCKET_前缀的环境变量。Rocket.toml根据前面的内容,我们可以通过三种方式来自定义配置文件。通过Rocket.toml的不需要我们去自定义路径,Rocket会自动去判断当前文件夹里是否存在,如果没有就会去父目录里找,如果还找不到就继续去父目录里找,直到根目录。通过相对路径配置的ROCKET_CONFIG的话同上。而如果通过ROCKET_CONFIG配置的路径是绝对路径的话,就不需要去递归查找。一个配置文件中可以包含多种配置文件,比如:## defaults for _all_ profiles

[default]

address = "0.0.0.0"

limits = { form = "64 kB", json = "1 MiB" }

## set only when compiled in debug mode, i.e, `cargo build`

[debug]

port = 8000

## only the `json` key from `default` will be overridden; `form` will remain

limits = { json = "10MiB" }

## set only when the `nyc` profile is selected

[nyc]

port = 9001

## set only when compiled in release mode, i.e, `cargo build --release`

[release]

port = 9999

ip_header = false

secret_key = "hPrYyЭRiMyµ5sBB1π+CMæ1køFsåqKvBiQJxBVHQk="而下面这个则是一个设置了所有项的配置文件[default]

address = "127.0.0.1"

port = 8000

workers = 16

max_blocking = 512

keep_alive = 5

ident = "Rocket"

ip_header = "X-Real-IP" # set to `false` to disable

log_level = "normal"

temp_dir = "/tmp"

cli_colors = true

secret_key = "hPrYyЭRiMyµ5sBB1π+CMæ1køFsåqKvBiQJxBVHQk="

[default.limits]

form = "64 kB"

json = "1 MiB"

msgpack = "2 MiB"

"file/jpg" = "5 MiB"

[default.tls]

certs = "path/to/cert-chain.pem"

key = "path/to/key.pem"

[default.shutdown]

ctrlc = true

signals = ["term", "hup"]

grace = 5

mercy = 5注意,如果不是必要的情况切勿去配置,用默认的即可。Environment Variables前面说过ROCKET_为前缀的配置项优先级是高于Rocket.toml的。Rocket会读取所有以ROCKET_为前缀的环境变量,然后将_后面的内容作为配置项的名字。比如:ROCKET_FLOAT=3.14

ROCKET_ARRAY=[1,"b",3.14]

ROCKET_STRING=Hello

ROCKET_STRING="Hello There"

ROCKET_KEEP_ALIVE=1

ROCKET_IDENT=Rocket

ROCKET_IDENT="Hello Rocket"

ROCKET_IDENT=false

ROCKET_TLS={certs="abc",key="foo/bar"}

ROCKET_LIMITS={form="64 KiB"}格式也是toml的。Configuration ParametersSecret Key这个前面私有cookies的那块介绍过了,这里就不多说了。Limits用于限制数据类型最大允许接收的量。这里需要传一个字段table,比如limits = { json = "10MiB" }带单位和不带都可以,默认是32KiB。TLSRocket内置支持TLS的,不过需要导入:[dependencies]

rocket = { version = "=0.5.0-rc.3", features = ["tls"] }可以通过tls.key 和 tls.certs两个配置项来配置,对于default provider来说,可以这样:[default.tls]

key = "path/to/key.pem" # Path or bytes to DER-encoded ASN.1 PKCS#1/#8 or SEC1 key.

certs = "path/to/certs.pem" # Path or bytes to DER-encoded X.509 TLS cert chain.tls的配置也是传一个字典,它会被反序列化成TlsConfig结构体。keyrequiredtypekey*yes*DER 编码的 ASN.1 PKCS#1/#8 或 SEC1 密钥的路径或字节。certs*yes*DER编码的X.509 TLS证书链的路径或字节。ciphersno启用CipherSuite数组.prefer_server_cipher_orderno布尔值表示是否首选服务器密码套件(prefer server cipher suites.)mutualno一个mutual TLS 的map配置每一个cipherSuite变体都会被转换成字符串,比如CipherSuite::TLS_AES_256_GCM_SHA384 变成 TLS_AES_256_GCM_SHA384。默认的配置如下:[default.tls]

certs = "/ssl/cert.pem"

key = "/ssl/key.pem"

prefer_server_cipher_order = false

ciphers = [

"TLS_CHACHA20_POLY1305_SHA256",

"TLS_AES_256_GCM_SHA384",

"TLS_AES_128_GCM_SHA256",

"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",

"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",

"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",

"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",

"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",

"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",

]Mutual TLSRocket也支持双向TLS客户端验证的模块mtls。它提供一个请求守卫用于校验和获取客户端证书。默认情况下,双向TLS是禁止的并且客户端证书是不必要的。如果想要支持,需要引入:[dependencies]

rocket = { version = "=0.5.0-rc.3", features = ["mtls"] }然后配置tls.mutual[default.tls.mutual]

ca_certs = "path/to/ca_certs.pem" # Path or bytes to DER-encoded X.509 TLS cert chain.

mandatory = truetls.mutual,ca_certs配置的是CA证书。tls.mutual也是要求传一个字典,最终也是会被反序列化成MutualTls结构体:keyrequiredtypeca_certs*yes*DER编码的X.509 TLS证书链的路径或字节。mandatoryno控制客户端是否必须进行身份验证的布尔值。当允许双向TLS时,mtls::Certificate请求守卫可以用来校验客户端证书。use rocket::mtls::Certificate;

#[get("/auth")]

fn auth(cert: Certificate<'_>) {

// This handler only runs when a valid certificate was presented.

}

例子:https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/tlsWorkerworker配置项前面说过,用于处理并行(parallel)任务执行,注意是并行,并发这里不做限制。补充下:并行可以理解为多个人处理多个事件,并发则是一个人处理多个事件。这个配置项只能通过ROCKET_WORKERS环境变量或者Rocket.toml来配置,其它都只能使用默认的。max_blocking参数限制异步runtime创建的线程的最大个数,和worker一样都不能配置默认的,不过和worker不一样的是,它空载(idling)的时候会终止。另外512的值一般不要去改动它,除非硬件不支持。Extracting Values我们可以自行拓展通过Rocket::figment()暴露出来的配置,不过前提是实现了 Deserialize 。比如:use rocket::serde::Deserialize;

#[launch]

fn rocket() -> _ {

let rocket = rocket::build();

let figment = rocket.figment();

#[derive(Deserialize)]

#[serde(crate = "rocket::serde")]

struct Config {

port: u16,

custom: Vec,

}

// extract the entire config any `Deserialize` value

let config: Config = figment.extract().expect("config");

// or a piece of it into any `Deserialize` value

let custom: Vec = figment.extract_inner("custom").expect("custom");

rocket

}

一般情况下,我们的配置项都是直接放到全局状态管理的,Rocket也考虑到了这一点,它提供了一个AdHoc fairing,这货我们前面接触过。它可以提取配置,输出错误以及存储到全局状态管理器中。比如:use rocket::{State, fairing::AdHoc};

#[get("/custom")]

fn custom(config: &State) -> String {

config.custom.get(0).cloned().unwrap_or("default".into())

}

#[launch]

fn rocket() -> _ {

rocket::build()

.mount("/", routes![custom])

.attach(AdHoc::config::())

}

Custom Providers我们可以通过rocket::custom()自定义provider,它替换了对 rocket::build()的调用。自定义provider可以基于Config::figment()或者 Config::default()。具体可见:https://docs.rs/figment/0.10/figment另外需要注意,你可能需要直接用到figment和serde它们。rocket默认导出了它俩,所以直接引用即可。不过rocket导出的它俩可能是阉割版的,所以如果要用到一些特性,可能还得从包自身引入:figment = { version = "0.10", features = ["env", "toml", "json"] }来看个自定义配置项的例子:use rocket::data::{Limits, ToByteUnit};

#[launch]

fn rocket() -> _ {

let figment = rocket::Config::figment()

.merge(("port", 1111))

.merge(("limits", Limits::new().limit("json", 2.mebibytes())));

rocket::custom(figment).mount("/", routes![/* .. */])

}

再来看个复杂一点的:use rocket::serde::{Serialize, Deserialize};

use rocket::fairing::AdHoc;

use figment::{Figment, Profile, providers::{Format, Toml, Serialized, Env}};

#[derive(Debug, Deserialize, Serialize)]

#[serde(crate = "rocket::serde")]

struct Config {

app_value: usize,

/* and so on.. */

}

impl Default for Config {

fn default() -> Config {

Config { app_value: 3, }

}

}

#[launch]

fn rocket() -> _ {

let figment = Figment::from(rocket::Config::default())

.merge(Serialized::defaults(Config::default()))

.merge(Toml::file("App.toml").nested())

.merge(Env::prefixed("APP_").global())

.select(Profile::from_env_or("APP_PROFILE", "default"));

rocket::custom(figment)

.mount("/", routes![/* .. */])

.attach(AdHoc::config::())

}

这里把能涉及到的配置文件都涉及到的,default的,global的,环境变量的。实战(Pastebin)接下来来搞个简单的文件存储系统,返回文件存储的路径。Pastebin指的是文件存储站点,可以上传文件。Finished Product线上体验:https://paste.rs/可以直接用curl来访问,比如:curl --data-binary @test.txt https://paste.rs/我们需要先设计接口:upload - #[post("/")]通过request的body获取原始数据并且返回文件存储的url。retrieve - #[get("/")]返回上传的文件内容,通过id访问。Getting Started先搭建环境cargo new --bin rocket-pastebin

​然后配置下根目录的Cargo.toml[workspace]

members = [

"hello-rocket",

"rocket-pastebin"

]然后回到rocket-pastebin中引入rocket[dependencies]

rocket = "=0.5.0-rc.3"然后到main.rs中:#[macro_use] extern crate rocket;

#[launch]

fn rocket() -> _ {

rocket::build()

}

然后试运行下cargo run -p rocket-pastebin,应该是正常运行了。Design在开始实现之前,我们需要确定俩问题:存储的文件放哪?一般情况下我们是需要单独买一个存储型服务器作为文件存储的地方,但是我们这个就只是一个demo,直接就放到项目里就行了,那么新建一个和src同级的文件夹upload作为静态资源。2. 如何命名,常见的就是根据当前时间戳来命名,或者根据时间戳再进一步hash处理。我们这里就简单的通过随机数创建id就行了。我们在src下创建一个paste_id.rs文件use std::borrow::Cow;

use std::path::{Path, PathBuf};

use rand::{self, Rng};

/// A _probably_ unique paste ID.

pub struct PasteId<'a>(Cow<'a, str>);

impl PasteId<'_> {

/// Generate a _probably_ unique ID with `size` characters. For readability,

/// the characters used are from the sets [0-9], [A-Z], [a-z]. The

/// probability of a collision depends on the value of `size` and the number

/// of IDs generated thus far.

pub fn new(size: usize) -> PasteId<'static> {

const BASE62: &[u8] = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

let mut id = String::with_capacity(size);

let mut rng = rand::thread_rng();

for _ in 0..size {

id.push(BASE62[rng.gen::() % 62] as char);

}

PasteId(Cow::Owned(id))

}

/// Returns the path to the paste in `upload/` corresponding to this ID.

pub fn file_path(&self) -> PathBuf {

let root = concat!(env!("CARGO_MANIFEST_DIR"), "/", "upload");

Path::new(root).join(self.0.as_ref())

}

}

随机生成一个数,然后创建PasteId实例自身存储id,到时候访问的时候直接从里面拿即可。别忘了在toml中引入rand [dependencies]

rocket = "=0.5.0-rc.3"

rand = "0.8"最后在main.rs中引入mod paste_id;

use paste_id::PasteId;

本来我们还需要一个index用来提供上传的入口,但是我们这里是基于curl的,所以就没必要了。Retrieving Pastes我们先来实现通过id获取上传内容的部分use std::path::Path;

use rocket::tokio::fs::File;

#[get("/")]

async fn retrieve(id: &str) -> Option {

let upload_dir = concat!(env!("CARGO_MANIFEST_DIR"), "/", "upload");

let filename = Path::new(upload_dir).join(id);

File::open(&filename).await.ok()

}

通过传入的id拼接存储目录,然后获取对应文件的内容,最后响应出去。别忘了注册:#[launch]

fn rocket() -> _ {

rocket::build().mount("/", routes![index, retrieve])

}

不过这里还有个问题:full path disclosure attack。如果我们的文件中有些文件是私有的,不允许外面访问的,或者说需要一定的权限才能访问,那么这个时候我们就有可能会被攻击。那么这个时候我们就需要搞个请求守卫用来解决这个问题,回到paste_id.rs文件中,我们需要给Paste实现FromParam:use rocket::request::FromParam;

/// Returns an instance of `PasteId` if the path segment is a valid ID.

/// Otherwise returns the invalid ID as the `Err` value.

impl<'a> FromParam<'a> for PasteId<'a> {

type Error = &'a str;

fn from_param(param: &'a str) -> Result {

param.chars().all(|c| c.is_ascii_alphanumeric())

.then(|| PasteId(param.into()))

.ok_or(param)

}

}

这里面的代码并没有体现出解决方案,实际上我们需要加上的代码是black list也就是黑名单,用来过滤需要权限访问的文件。然后别忘了修改路由,use rocket::tokio::fs::File;

#[get("/")]

async fn retrieve(id: PasteId<'_>) -> Option {

File::open(id.file_path()).await.ok()

}

这样看就舒服很多了。Uploading首先,我们需要接收的肯定是数据流Streaming Data我们需要使用前面说过的 Data来做数据守卫,限制获取的量。use rocket::data::{Data, ToByteUnit};

use rocket::http::uri::Absolute;

// In a real application, these would be retrieved dynamically from a config.

const ID_LENGTH: usize = 3;

const HOST: Absolute<'static> = uri!("http://localhost:8000");

#[post("/", data = "")]

async fn upload(paste: Data<'_>) -> std::io::Result {

let id = PasteId::new(ID_LENGTH);

paste.open(128.kibibytes()).into_file(id.file_path()).await?;

Ok(uri!(HOST, retrieve(id)).to_string())

}

限制为128K大小。然后通过uri!这个宏生成路由路径,不过根据我们前面学的知识,这里我们还需要给retrieve的参数id的类型PasteId实现UriDisplayPath才行:#[derive(UriDisplayPath)]

pub struct PasteId<'a>(Cow<'a, str>);

那么现在程序应该是可以跑了,我们运行下cargo run -p rocket-pastebin然后我们需要借助curl来实现上传,关于curl如何在win10/win11使用的,我之前go的一篇文件中有说到,这里就不多说了,可以去翻看下。我们现在rocket-pastebin根目录下创建一个test.txt文件,然后在里面随便写点东西curl.exe --data-binary @test.txt http://localhost:8000上传完之后我们再访问下curl http://localhost:8000/$filenameimg_test_successfully这样就可以了,虽然和粗糙。。。完整代码可见:https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/pastebinHelp又到了经典《I Need Help》(某褪色者口号)环节。还是那句话,能去github上找/问就尽量去github上,不过提issue前务必确认没有相同的缺陷:https://github.com/SergioBenitez/Rocket/issues。另外你还可以加入聊天:https://chat.mozilla.org/#/room/#rocket:mozilla.org或者: Matrix via Element又或者: Kiwi IRC client你还可以在这问问题:https://rocket.rs/v0.5-rc/guide/faq/例子https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples或者你也可以看源码(?):https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples总结让我想想。。。img_想个头参考^Rocket https://rocket.rs/v0.5-rc/guide/introduction/^hello world https://rocket.rs/v0.5-rc/guide/getting-started/#hello-world^LifeCycle https://rocket.rs/v0.5-rc/guide/overview/#lifecycle^Routing https://rocket.rs/v0.5-rc/guide/overview/#routing^mounting https://rocket.rs/v0.5-rc/guide/overview/#mounting^Launching https://rocket.rs/v0.5-rc/guide/overview/#launching^Future and Async https://rocket.rs/v0.5-rc/guide/overview/#futures-and-async^Requests https://rocket.rs/v0.5-rc/guide/requests/^Methods https://rocket.rs/v0.5-rc/guide/requests/#methods^Dynamic Paths https://rocket.rs/v0.5-rc/guide/requests/#dynamic-paths^FromParam https://api.rocket.rs/v0.5-rc/rocket/request/trait.FromParam.html^Forwarding https://rocket.rs/v0.5-rc/guide/requests/#forwarding^FromRequest https://api.rocket.rs/v0.5-rc/rocket/request/trait.FromRequest.html^Cookies https://rocket.rs/v0.5-rc/guide/requests/#cookies^CookieJar https://api.rocket.rs/v0.5-rc/rocket/http/struct.CookieJar.html^Format https://rocket.rs/v0.5-rc/guide/requests/#format^Body Data https://rocket.rs/v0.5-rc/guide/requests/#body-data^FromData https://api.rocket.rs/v0.5-rc/rocket/data/trait.FromData.html^JSON https://api.rocket.rs/v0.5-rc/rocket/serde/json/struct.Json.html^serde https://serde.rs/^data https://api.rocket.rs/v0.5-rc/rocket/data/struct.Data.html^ToByteUnit https://api.rocket.rs/v0.5-rc/rocket/data/trait.ToByteUnit.html^Forms https://rocket.rs/v0.5-rc/guide/requests/#forms^Form https://api.rocket.rs/v0.5-rc/rocket/form/struct.Form.html^FromForm https://api.rocket.rs/v0.5-rc/rocket/form/trait.FromForm.html^Form> https://api.rocket.rs/v0.5-rc/rocket/form/struct.Strict.html^lenient https://api.rocket.rs/v0.5-rc/rocket/form/struct.Lenient.html^Rocket::form::validate https://api.rocket.rs/v0.5-rc/rocket/form/validate/fn.range.html^Contextual https://api.rocket.rs/v0.5-rc/rocket/form/struct.Contextual.html^Context https://api.rocket.rs/v0.5-rc/rocket/form/struct.Context.html^Query Strings https://rocket.rs/v0.5-rc/guide/requests/#query-strings^Error Catchers https://rocket.rs/v0.5-rc/guide/requests/#error-catchers^register() https://api.rocket.rs/v0.5-rc/rocket/struct.Rocket.html#method.register^mount() https://api.rocket.rs/v0.5-rc/rocket/struct.Rocket.html#method.mount^Responses https://rocket.rs/v0.5-rc/guide/responses/^title-Responder https://rocket.rs/v0.5-rc/guide/responses/#responses^trait-Responder https://api.rocket.rs/v0.5-rc/rocket/response/trait.Responder.html^Status https://api.rocket.rs/v0.5-rc/rocket/response/status/^custom responder https://rocket.rs/v0.5-rc/guide/responses/#custom-responders^implementions https://rocket.rs/v0.5-rc/guide/responses/#implementations^Rocket Responders https://rocket.rs/v0.5-rc/guide/responses/#rocket-responders^stream! https://api.rocket.rs/v0.5-rc/rocket/response/stream/macro.stream.html^EventStream https://api.rocket.rs/v0.5-rc/rocket/response/stream/struct.EventStream.html^chat-demo https://github.com/SergioBenitez/Rocket/tree/v0.5-rc/examples/chat^ReaderStream https://api.rocket.rs/v0.5-rc/rocket/response/stream/struct.ReaderStream.html^TextStream https://docs.serde.rs/serde/trait.Serialize.html^serde https://serde.rs/^Serialize https://docs.serde.rs/serde/trait.Serialize.html^Templates https://rocket.rs/v0.5-rc/guide/responses/#templates^Template https://api.rocket.rs/v0.5-rc/rocket_dyn_templates/struct.Template.html^Typed URIs https://rocket.rs/v0.5-rc/guide/responses/#typed-uris^State https://rocket.rs/v0.5-rc/guide/state/^Managed State https://rocket.rs/v0.5-rc/guide/state/#managed-state^Request::guard() https://api.rocket.rs/v0.5-rc/rocket/struct.Request.html#method.guard^Rocket::state() https://api.rocket.rs/v0.5-rc/rocket/struct.Rocket.html#method.state^Request-Local State https://rocket.rs/v0.5-rc/guide/state/#request-local-state^Databases https://rocket.rs/v0.5-rc/guide/state/#databases^Fairings https://rocket.rs/v0.5-rc/guide/fairings/#fairings^overview https://rocket.rs/v0.5-rc/guide/fairings/#overview^implementing https://rocket.rs/v0.5-rc/guide/fairings/#implementing^Ad-Hoc Fairings https://rocket.rs/v0.5-rc/guide/fairings/#ad-hoc-fairings^testing https://rocket.rs/v0.5-rc/guide/testing/^Local Dispatching https://rocket.rs/v0.5-rc/guide/testing/#local-dispatching^validating response https://rocket.rs/v0.5-rc/guide/testing/#validating-responses^Testing "Hello World" https://rocket.rs/v0.5-rc/guide/testing/#testing-hello-world^Asynchronous Testing https://rocket.rs/v0.5-rc/guide/testing/#asynchronous-testing^Codegen Debug https://rocket.rs/v0.5-rc/guide/testing/#codegen-debug^Configuration https://rocket.rs/v0.5-rc/guide/configuration/#configuration编辑于 2024-01-22 21:23・IP 属地广东Rust(编程语言)Web 开发框架Web 开发​赞同 5​​2 条评论​分享​喜欢​收藏​申请

Rocket - Simple, Fast, Type-Safe Web Framework for Rust

Rocket - Simple, Fast, Type-Safe Web Framework for Rust Rocket Homepage overview guide faq news docs A web framework for Rust that makes it simple to write fast, type-safe, secure web applications with incredible usability, productivity and performance. Get Started Learn More Read FAQ Latest Release: 0.5.0 (Nov 17, 2023) Type Safe Type safety turned up to 11 means security and robustness come at compile-time. Learn More Boilerplate Free Spend your time writing code that really matters and let Rocket handle the rest. See Examples Easy To Use Simple, intuitive APIs make Rocket approachable, no matter your background. Get Started Extensible Create your own first-class primitives that any Rocket application can use. See How Hello, Rocket! This is a complete Rocket application. It does exactly what you would expect. If you were to visit /hello/John/58, you’d see: 1Hello, 58 year old named John!

If someone visits a path with an that isn’t a u8, Rocket doesn’t naively call hello. Instead, it tries other matching routes or returns a 404. 1

2

3

4

5

6

7

8

9

10

11#[macro_use] extern crate rocket;

#[get("/hello//")]

fn hello(name: &str, age: u8) -> String {

format!("Hello, {} year old named {}!", age, name)

}

#[launch]

fn rocket() -> _ {

rocket::build().mount("/", routes![hello])

}

Forms? Check! Form handling is simple, declarative, and complete: derive FromForm for your structure and set the data parameter to a Form type. Rocket automatically parses and validates the form data into your structure and calls your function. File uploads? A breeze with TempFile. Bad form request? Rocket doesn’t call your function! Need to know what went wrong? Use a data parameter of Result! Want to rerender the form with user input and errors? Use Context! 1

2

3

4

5

6

7

8

9

10

11#[derive(FromForm)]

struct Task<'r> {

#[field(validate = len(1..))]

description: &'r str,

completed: bool,

}

#[post("/", data = "")]

fn new(task: Form>) -> Flash {

Flash::success(Redirect::to(uri!(home)), "Task added.")

}

JSON, Always On Rocket has first-class support for JSON, right out of the box. Simply derive Deserialize or Serialize to receive or return JSON, respectively. Look familiar? Forms, JSON, and all kinds of body data types work through Rocket’s FromData trait, Rocket’s approach to deriving types from body data. A data route parameter can be any type that implements FromData. A value of that type will be deserialized automatically from the incoming request body. You can even implement FromData for your own types! 1

2

3

4

5

6

7

8

9

10

11

12

13

14#[derive(Serialize, Deserialize)]

struct Message<'r> {

contents: &'r str,

}

#[put("/", data = "")]

fn update(db: &Db, id: Id, msg: Json>) -> Value {

if db.contains_key(&id) {

db.insert(id, msg.contents);

json!({ "status": "ok" })

} else {

json!({ "status": "error" })

}

}

Rocket is ready to launch. Get Started Learn More Ins and Outs Discover how Rocket applications are built. Routing Dynamic Params Handling Data Request Guards Responders Launching Rocket's main task is to route incoming requests to the appropriate request handler using your application's declared routes. Routes are declared using Rocket's route attributes. The attribute describes the requests that match the route. The attribute is placed on top of a function that is the request handler for that route. As an example, consider the simple route below: 1

2

3

4#[get("/")]

fn index() -> &'static str {

"Hello, world!"

}

This index route matches any incoming HTTP GET request to /, the index. The handler returns a String. Rocket automatically converts the string into a well-formed HTTP response that includes the appropriate Content-Type and body encoding metadata. Rocket automatically parses dynamic data in path segments into any desired type. To illustrate, let's use the following route: 1

2

3

4#[get("/hello//")]

fn hello(name: &str, age: u8) -> String {

format!("Hello, {} year old named {}!", age, name)

}

This hello route has two dynamic parameters, identified with angle brackets, declared in the route URI: and . Rocket maps each parameter to an identically named function argument: name: &str and age: u8. The dynamic data in the incoming request is parsed automatically into a value of the argument's type. The route is called only when parsing succeeds. Parsing is directed by the FromParam trait. Rocket implements FromParam for many standard types, including both &str and u8. You can implement it for your own types, too! Rocket can automatically parse body data, too! 1

2

3

4#[post("/login", data = "")]

fn login(login: Form) -> String {

format!("Hello, {}!", login.name)

}

The dynamic parameter declared in the data route attribute parameter again maps to a function argument. Here, login maps to login: Form. Parsing is again trait-directed, this time by the FromData trait. The Form type is Rocket's robust form data parser. It automatically parses the request body into the internal type, here UserLogin. Other built-in FromData types include Data, Json, and MsgPack. As always, you can implement FromData for your own types, too! In addition to dynamic path and data parameters, request handlers can also contain a third type of parameter: request guards. Request guards aren't declared in the route attribute, and any number of them can appear in the request handler signature. Request guards protect the handler from running unless some set of conditions are met by the incoming request metadata. For instance, if you are writing an API that requires sensitive calls to be accompanied by an API key in the request header, Rocket can protect those calls via a custom ApiKey request guard: 1

2#[get("/sensitive")]

fn sensitive(key: ApiKey) { ... }

ApiKey protects the sensitive handler from running incorrectly. In order for Rocket to call the sensitive handler, the ApiKey type needs to be derived through a FromRequest implementation, which in this case, validates the API key header. Request guards are a powerful and unique Rocket concept; they centralize application policy and invariants through types. The return type of a request handler can be any type that implements Responder: 1

2#[get("/")]

fn route() -> T { ... }

Above, T must implement Responder. Rocket implements Responder for many of the standard library types including &str, String, File, Option, and Result. Rocket also implements custom responders such as Redirect, Flash, and Template. The task of a Responder is to generate a Response, if possible. Responders can fail with a status code. When they do, Rocket calls the corresponding error catcher, a catch route, which can be declared as follows: 1

2#[catch(404)]

fn not_found() -> T { ... }

Finally, we get to launch our application! Rocket begins dispatching requests to routes after they've been mounted and the application has been launched. These two steps, usually wrtten in a rocket function, look like: 1

2

3

4#[launch]

fn rocket() -> _ {

rocket::build().mount("/base", routes![index, another])

}

The mount call takes a base and a set of routes via the routes! macro. The base path (/base above) is prepended to the path of every route in the list, effectively namespacing the routes. #[launch] creates a main function that starts the server. In development, Rocket prints useful information to the console to let you know everything is okay. 1 Rocket has launched from http://127.0.0.1:8000

And so much more. An entire ecosystem, built in. Templating Rocket makes templating a breeze with built-in templating support. Learn More Cookies View, add, or remove cookies, with or without encryption, without hassle. Learn More WebSockets + Streams Create and return potentially infinite async streams of data with ease. Learn More Config Profiles Configure your application your way for debug, release, or anything else! Learn More Type-Checked URIs Never mistype or forget to update a URI again with Rocket's typed URIs. Learn More Structured Middleware Fairings are Rocket's simpler approach to structured middleware. Learn More Database Support Store data with ease with Rocket's built-in ORM agnostic database support. Learn More Testing Unit and integration test using the comprehensive, built-in testing library. Learn More Community Join an extensive community of 20,000+ Rocketeers that love Rocket. See Dependents Thank You ❤️ Your support makes Rocket possible. Diamond $500/month Kindness Gold $250/month ohne-makler RWF2 Bronze $50/month 1Password © 2016-2024 Sergio Benitez BACK TO TOP Δ

rocket science,不全指“火箭科学” - 知乎

rocket science,不全指“火箭科学” - 知乎首发于英语习语切换模式写文章登录/注册rocket science,不全指“火箭科学”驾驭信息纵横科技Live and learn.很多看似简单易懂的短语往往都有显而易见或意想不到的寓意,比如 in the bag 和 in the air 等等,它们不是简单的表示“在袋子里”和“在空中”,还有其他寓意。in the bag 还可以用来表示“稳操胜券,十拿九稳”等,例如:When the score got to 8 to 2 we knew the game was in the bag.当比分达到8比2时,我们就知道这场比赛已经十拿九稳了。With a three-goal lead and only ten minutes left to play, victory seemed in the bag.在领先三球的情况下,比赛只剩下10分钟了,胜利似乎十拿九稳。​in the air 还可以用来表示“可感觉到,可被意识到”,例如:There is such a feeling of joy in the air.空气中有一种喜悦的感觉。We felt a sense of tension in the air.我们感到空气中有一种紧张的感觉。类似的还有 rocket science,它的字面意思是“火箭科学 ”,是火箭的科学研究,例如:The technology encompasses rocket science and jet engines.这项技术包括火箭科学和喷气发动机。可想而知,rocket science 也可以用来比喻很困难的事,常用于否定句如 (it’s) not rocket science,意为“小事一桩、易如反掌或很容易”等,相当于 it's not brain surgery,例如:rocket science:Learning the mathematic is always equivalent of rocket science for me .对我来说,学数学总是难于登天。It’s not rocket science to work out that emails from someone you don’t know asking you to click the link, are obviously scams.从一个你不认识的人那里发来的让你点击链接的邮件,显然是骗局,这个很简单。The teacher insists that we can understand fractions. Apparently, it’s not rocket science.老师坚持认为我们能理解分数。显然,这易如反掌。My teacher would always say that there is nothing like rocket science in my life. I can do anything.我的老师总是说在我的生活中没有难事。我可以做任何事。it's not brain surgery:Just keep calm and do it. It's not brain surgery.保持冷静就行了。又不是脑部手术。跟 it's not rocket science 类似,a piece of cake 也可以用来比喻“小事一桩”,相当于 easy,simple 和 straightforward 等,例如:a piece of cake:For him, taking tests is a piece of cake.对他来说,参加考试是小菜一碟。Getting rid of him will be a piece of cake. 摆脱掉他就是小事一桩。easy/simple/straightforward:I can tell you how to do that - it's easy!我可以告诉你怎么做-很简单!The answer is really quite simple.实际上答案相当简单。It's quite straightforward to get here.来这儿相当容易。提到容易,总是少不了 easy 以及一些有“特色的” easy,如 (as) easy as pie,(as) easy as ABC,(as) easy as 123(1-2-3),(as) easy as winking,(as) easy as falling (or rolling) off a log 等等,例如:After so many years as an accountant, doing taxes is as easy as pie for me.做了这么多年会计后,对我来说,纳税是轻而易举的事。With our guide, planning your US fly-drive holiday will be as easy as ABC.有了我们的导游,计划您的美国飞车度假将易如反掌。That test was easy as falling off a log!那次考试非常简单!Don't worry, after some lessons and a bit of practice, driving is easy as winking!别担心,经过几节课和一点练习,开车很容易!当然还有一些不包含 easy 却能表示非常容易的表达方式,如 a walk in the park,at the push of a button 和 at the stroke of a pen 等,例如:He's used to hard physical work - this is a walk in the park to him.他习惯了艰苦的体力劳动,这对他来说简直是小菜一碟。You can't expect to get everything you need at the push of a button.你不能指望轻而易举就能得到你所需要的一切。Politicians know theycannotcreate a lawful society simply at the stroke of a pen.政治家们知道,他们不可能一下子就建立起一个合法的社会。当掌握了用多种表达方式表达同一个意思时,就能增强语感、思如泉涌、脱口而出和左右逢源,最终提高自信和英语口语水平。词或词组辨析:1. encompass [ɪnˈkʌmpəs] 意为“包含,包括,包围”等2. equivalent [ɪˈkwɪvələnt] 意为“相等的,相同的;相等的东西”等请关注外语行天下,后期更精彩。更多干货,请关注微信公众号“外语行天下”,全网唯一一个全方位多角度分享英语知识干货。发布于 2021-04-06 09:01英语英语语法习语​赞同 2​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录英语习语深入分析每个英语习语的含义或

超强超快的时间序列分类算法ROCKET:论文+代码详细解读 - 知乎

超强超快的时间序列分类算法ROCKET:论文+代码详细解读 - 知乎切换模式写文章登录/注册超强超快的时间序列分类算法ROCKET:论文+代码详细解读张浩彬​柯内特 首席数据科学家ROCKET(RandOm Convolutional KErnel Transform)是一种强大的时间序列特征提取工具,2020年的文章,提出一种基于随机卷积核变换的时间序列分类方法。它使用了随机生成的一组卷积核对时间序列进行变换,并提取变换后的特征。之后再使用这些变换后的特征,训练一个分类器(论文中,小数据使用岭回归分类器,大数据使用逻辑回归),完成分类。ROCKET参考资料论文:https://arxiv.org/pdf/1910.13051.pdfpyts工具包官网:https://pyts.readthedocs.io/en/stable/generated/pyts.transformation.ROCKET.html简介ROCKET(RandOm Convolutional KErnel Transform),2020年的文章,提出一种基于随机卷积核变换的时间序列分类方法。它使用了随机生成的一组卷积核对时间序列进行变换,并提取变换后的特征。之后再使用这些变换后的特征,训练一个分类器(论文中,小数据使用岭回归分类器,大数据使用逻辑回归),完成分类。实验表明,生成大量随机卷积核是有效的,这些随机卷积核结合起来捕获与时间序列分类相关的特征(尽管单独地,单个随机卷积核可能只能非常近似地捕获给定时间序列中的相关特征)。ROCKET的关键思想是通过计算变换后特征的各种统计量(如最大值、最小值、均值、方差等),将时间序列转化为一组固定维度的特征向量。这些特征向量可以用于训练常规的分类器进行分类。算法流程ROCKET的基本原理如下:随机生成卷积核:首先,从一个预定义的卷积核集合中随机选择一组卷积核。卷积核可以是任意大小的滤波器,例如一维卷积核或二维卷积核。应用卷积核变换:对于每个时间序列样本,将随机选择的卷积核应用于时间序列数据。具体操作是使用卷积运算,将卷积核与时间序列数据进行卷积操作,得到一组卷积结果。提取变换后的特征:针对每个卷积结果,计算一组统计量作为变换后的特征。这些统计量可以是最大值、最小值、均值、方差等。对于多个卷积核,可以为每个卷积核生成一组特征。构建****特征向量:将每个卷积核得到的特征组合成一个特征向量。特征向量的维度取决于选择的卷积核数量和每个卷积核提取的统计量数量。通过随机卷积核变换,时间序列数据可以转换为固定维度的特征向量,其中每个维度对应于一个卷积核提取的特征。这些特征向量可以作为输入数据,用于训练机器学习模型进行时间序列分类任务。随机卷积核变换的优点之一是它可以捕捉时间序列数据的局部和全局特征,因为不同大小和形状的卷积核可以捕捉不同时间尺度的信息。此外,由于卷积核的随机选择和变换的统计量计算,它具有较低的计算复杂度和存储需求,适用于大规模时间序列数据集的处理。本文档使用pyts提供的ROCKET算法为每个卷积核提取两个特征:最大值和正值比例。假设有一个长度为6的时间序列数据:[3, 6, 1, 2, 4, 5],并且我们采用长度为3的卷积核:[1, -1, 1]。使用卷积核[1, -1, 1]在时间序列上进行卷积运算,我们得到的结果是:[3-6+1, 6-1+2, 1-2+4, 2-4+5],即[-2, 7, 3, 3]。然后,我们取出卷积结果中的最大值和正值比例,得到 [7, \frac{3}{4}]作为使用该卷积核得到的两个特征值。Rocket与卷积神经网络的差异Rocket使用大量的核。由于只有单个“层”的核,并且没有学习内核权重,因此计算卷积的计算成本很低,并且可以使用相对较少的计算费用来使用大量内核。Rocket使用了大量不同的内核。与典型的卷积网络不同,在卷积网络中,内核组共享相同的大小、膨胀和填充是常见的,对于Rocket,每个内核都有随机长度、扩展和填充,以及随机权重和偏差。特别是,Rocket对核dilation进行了关键的利用。与卷积神经网络中dilation的典型使用相反,其中dilation随着深度呈指数增长,我们对每个内核随机采样膨胀,产生各种各样的内核dilation,捕捉不同频率和尺度的模式,这对该方法的性能至关重要。除了使用生成的特征图的最大值(广义上讲,类似于全局最大池化),Rocket还使用了一个额外的、据我们所知的新颖特征:正值(或ppv)的比例。这使得分类器能够对时间序列内给定模式的流行率进行加权。这是Rocket结构中对其卓越精度最为关键的单一元素。参数设置随机卷积核Rocket的唯一超参数是核数k。在设置k时,分类精度和计算时间之间存在折衷。一般来说,k的值越大,分类精度越高,但代价是按比例计算的时间越长。(变换的复杂度相对于k是线性的。)然而,即使有非常多的内核(默认使用10000个),Rocket也非常快。在具体实验当中,k越大,性能越好。但在CD图的检验当中,5000,10000和100000没有统计差异。当时,更多的核数,结果越稳定。卷积核长度:随机从\{7,9,11\}中随机选取,尽可能时间序列数据已经提前设置为标准化(均值为0,标准差为1)权重:卷积核的权重都是从标准正态分布中获得 \forall w \in W, w \sim \mathcal{N}(0,1)。但是通过标准正态分布生成初始全中后,还是会再重新做一次中心化,即有\omega=\boldsymbol{W}-\overline{\boldsymbol{W}}。后续的中心化会有更好的结果,虽然不存在显著性差异,但是稳定性更好偏置:偏置从U[-1,1]中生成;相比于不适用偏差,使用偏差有更高的精度。但是偏差服从均匀分布和正态分布,不存在统计学差异Dilation:膨胀的范围:膨胀是在指数尺度上随机采样的。具体来说,首先从均匀分布 \mathcal{U}(0, A) 中随机抽取一个 值 x ,然后计算 d=\left\lfloor 2^x\right\rfloor 作为膨胀值。这里, \lfloor\cdot\rfloor 表示向下取整函数。其中A的计算有:(1)A 的计算基于输入时间序列的长度 l_{\text {input }} 和卷积核的长度 l_{\text {kernel。 }};(2)具体地, A 被定义为 A=\log _2 \frac{l_{\text {input }}-1}{l_{\text {kernel }}-1} 。这确保了膨胀后的卷积核的有效长度不超过输 入时间序列的长度。此外,实验证明,指数膨胀比均匀膨胀更好,均匀膨胀比武膨胀更好,且都存在显著性差异Padding:当生成每个卷积核时,会随机决定(概率相等)在应用该卷积核时是否使用填充。如果使用填充,填充数量为\left(\left(l_{\text {kernel }}-1\right) \times d\right) / 2 ,其中 l_{kernel} 是卷积核的长度.使用填充后,卷积后的序列长度保持和卷积前保持一致。使用填充的话,将可以关注到整个序列。而不使用填充,将关心中心区域。实验证明,使用padding比不使用padding效果更好,但没有显著性差异特征图有卷积计算公式:X_i * \omega=\sum_{j=0}^{l_{\text {kernel }}-1} X_{i+(j \times d)} \times \omega_j . \\Rocket会对卷积后的序列进一步生成特征图其中包括:最大值(等于最大池化)PPV,正值的比例Rocket实验显示,PPV是有一个非常有效的特征如果在Rocket中使用了10000个卷积核,那么最后将会生成20000个特征。此外,实验证明了两个特征都非常重要,请别PPV特征比最大值特征更重要分类器ROCKET算法可以与任何分类器结合使用,但作者发现它与线性分类器(如逻辑回归和岭回 归) 结合使用特别有效。以下是原文中关于分类器选择和设定的详细说明:逻辑回归:ROCKET可以与逻辑回归和随机梯度下降 (SGD) 结合使用。 这种组合特别适合大型数据集,因为它提供了固定内存成本的快速训练(由每个小批量的大小决定) 。 变换可以在每个小批量上执行,或者在数据集的更大部分上执行,然后进一步将这些大部 分划分为用于训练的小批量。 2.岭回归: 对于UCR档案中的所有数据集,作者使用了岭回归分类器。 岭回归模型采用“一对剩余”的方式为每个类别进行训练,并使用 L_2 正则化。 一对剩余策略:“一对剩余”或“一对所有” (One-vs-Rest, OvR) 是一种常用的多类分类策略。在这种策略中, 对于有 k 个类别的数据集,我们会训练 k 个二元分类器。对于每个类别,我们训练一个分类 器将其与所有其他类别区分开来。例如: 对于类别 1 ,我们训练一个分类器将其与类别 2 、类别 3 、 \cdots. 类别 k 区分开。对于类别 2 ,我们训练一个分类器将其与类别 1 、类别 3 、 \cdots. 类别 k 区分开。依此类推,直到类别 k 。当我们要对一个新的样本进行分类时,所有 k 个分类器都会对其进行预测,然后选择置信度 最高的分类器的类别作为最终的预测类别。3正则化的重要性:当特征数量显著大于训练样本数量时,正则化变得至关重要。正则化允许优化线性模型,并防止迭代优化中的病态行为,例如逻辑回归中的行为。岭回归分类器可以利用广义交叉验证快速确定适当的正则化参数。实际观察:作者发现,对于较小的数据集,岭回归分类器在实践中比逻辑回归更快,同时仍然能够达 到高的分类精度。 综上所述,尽管ROCKET可以与任何分类器结合使用,但作者推荐使用线性分类器,特别是岭回归,因为它在实际应用中表现出色,同时具有计算效率。当特征数量显著大于训练样本数量时,正则化变得非常重要,因此,对于较小的数据集,岭回归与ROCKET结合使用是一 个很好的选择。代码读取数据,查看数据情况import pandas as pd

import os

# 定义读取数据的函数并输出每个数据集的信息

def dataset_info(dataset_path):

train_data = pd.read_csv(os.path.join(dataset_path, dataset_path.split('/')[-1] + "_TRAIN.tsv"), delimiter='\t', header=None)

test_data = pd.read_csv(os.path.join(dataset_path, dataset_path.split('/')[-1] + "_TEST.tsv"), delimiter='\t', header=None)

train_size = train_data.shape[0]

test_size = test_data.shape[0]

time_series_length = train_data.shape[1] - 1

unique_classes = len(train_data.iloc[:, 0].unique())

return train_size, test_size, time_series_length, unique_classes

# 输出每个数据集的信息

data_path = '.\Rocket\dataset'

info_list = []

for dataset_name in ['Phoneme', 'DiatomSizeReduction', 'Ham', 'SwedishLeaf', 'FordB', 'ECGFiveDays']:

dataset_path = os.path.join(data_path, dataset_name,dataset_name)

info = dataset_info(dataset_path)

info_list.append((dataset_name, info))

# 输出每个数据集的信息

# train_size, test_size, time_series_length, unique_classes

info_list

Rocket需要注意的是,为了比较结果,代码执行了多次循环。例如:n_kernels_options = [50,500,5000,10000,20000],首次执行 ,建议减少数量import pandas as pd

from sklearn.metrics import accuracy_score

from pyts.transformation import ROCKET

from sklearn.ensemble import RandomForestClassifier

from sklearn.linear_model import LogisticRegression

from sklearn.neural_network import MLPClassifier

from sklearn.linear_model import RidgeClassifier

from sklearn.svm import LinearSVC, SVC

import os

data_path = '.\\Rocket\\dataset'

# 设置待选模型

models = {

"Logistic Regression": LogisticRegression(),

"Random Forest": RandomForestClassifier(),

"Neural Network": MLPClassifier(),

"Ridge": RidgeClassifier(),

"SVM": SVC(),

"Linear_SVM": LinearSVC()

}

# 数据集名称

dataset_names = ['Phoneme', 'DiatomSizeReduction', 'Ham', 'SwedishLeaf', 'FordB', 'ECGFiveDays']

n_kernels_options = [50,500,5000,10000,20000]

# 初始化一个空的数据帧来存储结果

result_df = pd.DataFrame(columns=["Dataset", "Train Size", "Test Size", "Time Series Length", "Unique Classes", "n_kernels"] + list(models.keys()))

for n_kernels in n_kernels_options:

# 设置特征转换工具

feature_transformer = ROCKET(n_kernels=n_kernels, random_state=42)

# 初始化准确率字典

accuracies = {}

for dataset_name in dataset_names:

dataset_path = os.path.join(data_path, dataset_name)

train_data = pd.read_csv(os.path.join(dataset_path, dataset_name + "_TRAIN.tsv"), delimiter='\t', header=None)

test_data = pd.read_csv(os.path.join(dataset_path, dataset_name + "_TEST.tsv"), delimiter='\t', header=None)

X_train = train_data.iloc[:, 1:].values

y_train = train_data.iloc[:, 0].values

X_test = test_data.iloc[:, 1:].values

y_test = test_data.iloc[:, 0].values

print(f"Dataset: {dataset_name} | n_kernels: {n_kernels}")

# 先对数据进行ROCKET转换

X_train_transformed = feature_transformer.fit_transform(X_train)

X_test_transformed = feature_transformer.transform(X_test)

for model_name, model in models.items():

# 直接拟合分类器

model.fit(X_train_transformed, y_train)

y_pred = model.predict(X_test_transformed)

# 计算准确率并保存到字典中

accuracy = accuracy_score(y_test, y_pred)

formatted_accuracy = "{:.4f}".format(accuracy)

accuracies[model_name] = formatted_accuracy

# 将结果保存到数据帧中

result_row = [dataset_name, info_dict[dataset_name][0], info_dict[dataset_name][1], info_dict[dataset_name][2], info_dict[dataset_name][3], n_kernels] + list(accuracies.values())

result_df = result_df.append(pd.Series(result_row, index=result_df.columns), ignore_index=True)

# 进行排序

result_df = result_df.sort_values(by=['Unique Classes', 'Train Size', 'n_kernels'])

# 计算每个分类方法在不同数据集下的平均准确率

avg_accuracies = {}

for model_name in models.keys():

avg_accuracy = result_df[model_name].astype(float).mean()

avg_accuracies[model_name] = "{:.4f}".format(avg_accuracy)

# 在排序后的数据帧底部添加平均值信息

avg_accuracies_row = ['Average', None, None, None, None, 'All Datasets'] + list(avg_accuracies.values())

result_df = result_df.append(pd.Series(avg_accuracies_row, index=result_df.columns), ignore_index=True)

result_df发布于 2023-08-26 15:36・IP 属地广东算法时间序列分析论文​赞同 10​​6 条评论​分享​喜欢​收藏​申请

rocket是什么意思_rocket的翻译_音标_读音_用法_例句_爱词霸在线词典

et是什么意思_rocket的翻译_音标_读音_用法_例句_爱词霸在线词典首页翻译背单词写作校对词霸下载用户反馈专栏平台登录rocket是什么意思_rocket用英语怎么说_rocket的翻译_rocket翻译成_rocket的中文意思_rocket怎么读,rocket的读音,rocket的用法,rocket的例句翻译人工翻译试试人工翻译翻译全文简明柯林斯牛津rocket高中/CET4/CET6英 [ˈrɒkɪt]美 [ˈrɑːkɪt]释义常用高考讲解n.火箭(弹); 焰火,烟花; 芝麻菜v.猛增; 快速移动; 一举成名; 用火箭攻击点击 人工翻译,了解更多 人工释义词态变化复数: rockets;第三人称单数: rockets;过去式: rocketed;过去分词: rocketed;现在分词: rocketing;实用场景例句全部火箭火箭发射器火箭发动机芝麻菜急速上升a space rocket太空火箭牛津词典The rocket was launched in March 1980.这枚火箭发射于1980年3月。牛津词典The idea took off like a rocket (= it immediately became popular) .这种思想立即风靡一时。牛津词典a rocket attack火箭攻击牛津词典rocketing prices飞涨的价格牛津词典Unemployment has rocketed up again.失业人数再次猛增。牛津词典The total has rocketed from 376 to 532.总数从376猛增到532。牛津词典The car rocketed out of a side street.汽车从一条叉路上嗖的一下开了出来。牛津词典The band rocketed to stardom with their first single.这支乐队的第一首单曲就使他们一举成名。牛津词典There has been a renewed rocket attack on the capital.首都遭受了新一轮的火箭袭击。柯林斯高阶英语词典Fresh food is so scarce that prices have rocketed...新鲜食物非常匮乏,导致价格猛涨。柯林斯高阶英语词典The nation has experienced four years of rocketing crime.4年来,这个国家的犯罪率急剧上升。柯林斯高阶英语词典A train rocketed by, shaking the walls of the row houses...一辆火车疾驰而过,排屋的墙都摇晃起来。柯林斯高阶英语词典Dublin has rocketed up the charts to become one of Europe's most popular tourist destinations for city breaks.都柏林的排名飞速攀升,成为了欧洲最受欢迎的旅游度假城市之一。柯林斯高阶英语词典Afterward the Rocket exchanges him Magic and trades rye, hereafter he changes to Nikesidui.之后火箭队把他交换到魔术队并换来麦迪, 此后他又被转到尼克斯队.期刊摘选The first stage of rocket is thrown away only minutes after the rocket takes off.火箭的第一级在火箭起飞后仅仅几秒中就被扔掉.期刊摘选In 1993 a new space rocket with no wings was developed in the USA.1993年美国研制了一种新型的滑有机翼的太空火箭.期刊摘选As the rocket gets farther into space, the earth's atmosphere is left behind.随着火箭越来越远地进入空间, 地球的大气就被抛在后面.辞典例句An American, William Hale, assembled a vastly improved rocket in 1846.一个叫威廉·黑尔的美国人, 在1846年组装了一枚经过大大改进的火箭.辞典例句Outside clouds of smoke rose in the distance as troops fired rocket launchers.在外面,部队点燃火箭弹发射器后,远处硝烟升腾.期刊摘选The explosive mixture in a rocket consists of both a fuel and a supply of oxygen.火箭中的爆炸性混合物由燃料和氧气构成.《现代汉英综合大词典》The rocket boosts the astronaut into space.这火箭能把宇航员送入太空.《简明英汉词典》This space rocket carries two satellites.这枚宇宙火箭搭载了两颗卫星.《简明英汉词典》The rocket is due to lift off at noon on Friday.火箭定于星期五中午发射.《简明英汉词典》I saw the launch of the rocket yesterday.我昨天看了火箭发射.《简明英汉词典》The rocket penetrated the enemy's tank.火箭击穿了敌人的坦克.《现代汉英综合大词典》收起实用场景例句真题例句全部六级Cyrano was dead and buried for a good three centuries before the first manned rockets started to fly.出自-2013年12月阅读原文收起真题例句英英释义Noun1. any vehicle propelled by a rocket engine2. a jet engine containing its own propellant and driven by reaction propulsion3. erect European annual often grown as a salad crop to be harvested when young and tender4. propels bright light high in the sky, or used to propel a lifesaving line or harpoon5. sends a firework display high into the skyVerb1. shoot up abruptly, like a rocket;"prices skyrocketed"2. propel with a rocket收起英英释义词组搭配rise like a rocket (and fall like a stick)rise suddenly and dramatically (and subsequently fall in a similar manner)迅速崛起,迅速败落收起词组搭配行业词典体育急起猛冲   力学火箭   物理学火箭   航天火箭   航海科技火箭   释义词态变化实用场景例句真题例句英英释义词组搭配行

ROCKET中文(简体)翻译:剑桥词典

ROCKET中文(简体)翻译:剑桥词典

词典

翻译

语法

同义词词典

+Plus

剑桥词典+Plus

Shop

剑桥词典+Plus

我的主页

+Plus 帮助

退出

剑桥词典+Plus

我的主页

+Plus 帮助

退出

登录

/

注册

中文 (简体)

查找

查找

英语-中文(简体)

rocket 在英语-中文(简体)词典中的翻译

rocketnoun uk

Your browser doesn't support HTML5 audio

/ˈrɒk.ɪt/ us

Your browser doesn't support HTML5 audio

/ˈrɑː.kɪt/

rocket noun

(DEVICE)

Add to word list

Add to word list

B2 [ C ] a large cylinder-shaped object that moves very fast by forcing out burning gases, used for space travel or as a weapon

火箭;火箭发动机;火箭弹

They launched a rocket to the planet Venus.

他们向金星发射了一枚火箭。

The rebels were firing anti-tank rockets.

叛军在发射反坦克火箭弹。

[ C ] (also skyrocket) a type of firework that flies up into the air before exploding

焰火;烟花;火箭式空中大烟火

更多范例减少例句The countdown to the rocket launch will begin at 9.00 a.m.The rear sections of the rocket fell away.The rocket arced gracefully into the sky.The rocket blew up on the launch pad.If there's any doubt about the rocket's engines, we ought to cancel the launch.

rocket noun

(PLANT)

[ U ] UK (US arugula) a plant whose long green leaves are used in salads

芝麻菜;紫花南芥

习语

get/be given a rocket

rocketverb [ I often + adv/prep ]

  informal uk

Your browser doesn't support HTML5 audio

/ˈrɒk.ɪt/ us

Your browser doesn't support HTML5 audio

/ˈrɑː.kɪt/ (also skyrocket)

to rise extremely quickly or make extremely quick progress towards success

迅速上升;迅速成功,一举成功

House prices in the north are rocketing (up).

北部的房价正在飞涨。

Their team rocketed to the top of the League.

他们的球队在联赛上一举领先。

Sharon Stone rocketed to fame in the film "Basic Instinct".

莎朗.斯通凭借电影《本能》一举成名。

(rocket在剑桥英语-中文(简体)词典的翻译 © Cambridge University Press)

B2

rocket的翻译

中文(繁体)

裝置, 火箭, 火箭引擎…

查看更多内容

西班牙语

cohete, arúgula, dispararse…

查看更多内容

葡萄牙语

foguete, rúcula, foguete [masculine]…

查看更多内容

更多语言

in Marathi

日语

土耳其语

法语

加泰罗尼亚语

in Dutch

in Tamil

in Hindi

in Gujarati

丹麦语

in Swedish

马来语

德语

挪威语

in Urdu

in Ukrainian

俄语

in Telugu

阿拉伯语

in Bengali

捷克语

印尼语

泰语

越南语

波兰语

韩语

意大利语

रॉकेट…

查看更多内容

ロケット, 打(う)ち上(あ)げ花火(はなび)…

查看更多内容

roket, füze, bomba…

查看更多内容

fusée [feminine], fusée, roquette…

查看更多内容

coet…

查看更多内容

raket, omhoog vliegen…

查看更多内容

எரியும் வாயுக்களை கட்டாயப்படுத்துவதன் மூலம் மிக வேகமாக நகரும் ஒரு பெரிய சிலிண்டர் வடிவ பொருள், விண்வெளி பயணத்திற்கு அல்லது ஆயுதமாக பயன்படுத்தப்படுகிறது…

查看更多内容

रॉकेट…

查看更多内容

રોકેટ…

查看更多内容

raket, stige kraftigt…

查看更多内容

raket, skjuta i höjden…

查看更多内容

roket, kapal angkasa, naik mendadak…

查看更多内容

die Rakete, hochschnellen…

查看更多内容

rakettmotor [masculine], rakett [masculine], rakett…

查看更多内容

راکٹ…

查看更多内容

ракета, злітати…

查看更多内容

ракета, реактивный снаряд, резко подскакивать…

查看更多内容

రాకెట్ / అంతరిక్ష ప్రయాణానికి లేదా ఆయుధంగా ఉపయోగించడానికి, మండే వాయువులను బలవంతంగా బయటకు పంపడం ద్వారా చాలా వేగంగా కదిలే పెద్ద స్తూపాకారపు వస్తువు…

查看更多内容

صاروخ…

查看更多内容

মহাকাশ যাত্রার জন্যে বা অস্ত্র হিসেবে ব্যবহার করা হয় যে রকেট…

查看更多内容

raketa, prudce stoupat…

查看更多内容

roket, pesawat antariksa, melangit…

查看更多内容

จรวด, พลุ, ยานอวกาศ…

查看更多内容

pháo hoa, pháo sáng, tên lửa…

查看更多内容

rakieta, skoczyć w górę, wybić się…

查看更多内容

로켓…

查看更多内容

razzo, missile, (andare alle stelle)…

查看更多内容

需要一个翻译器吗?

获得快速、免费的翻译!

翻译器工具

rocket的发音是什么?

在英语词典中查看 rocket 的释义

浏览

rockabilly

rocker

rocker switch

rockery

rocket

rocket fuel

rocket science

rocket scientist

rocket ship

rocket更多的中文(简体)翻译

全部

rocket fuel

rocket ship

rocket science

rocket scientist

rocket, at arugula

rocket-propelled grenade

get/be given a rocket idiom

查看全部意思»

惯用语

get/be given a rocket idiom

it's not rocket science idiom

it doesn't take a rocket scientist, at it's not rocket science idiom

查看全部惯用语意思»

“每日一词”

veggie burger

UK

Your browser doesn't support HTML5 audio

/ˈvedʒ.i ˌbɜː.ɡər/

US

Your browser doesn't support HTML5 audio

/ˈvedʒ.i ˌbɝː.ɡɚ/

a type of food similar to a hamburger but made without meat, by pressing together small pieces of vegetables, seeds, etc. into a flat, round shape

关于这个

博客

Forget doing it or forget to do it? Avoiding common mistakes with verb patterns (2)

March 06, 2024

查看更多

新词

stochastic parrot

March 04, 2024

查看更多

已添加至 list

回到页面顶端

内容

英语-中文(简体)翻译

©剑桥大学出版社与评估2024

学习

学习

学习

新词

帮助

纸质书出版

Word of the Year 2021

Word of the Year 2022

Word of the Year 2023

开发

开发

开发

词典API

双击查看

搜索Widgets

执照数据

关于

关于

关于

无障碍阅读

剑桥英语教学

剑桥大学出版社与评估

授权管理

Cookies与隐私保护

语料库

使用条款

京ICP备14002226号-2

©剑桥大学出版社与评估2024

剑桥词典+Plus

我的主页

+Plus 帮助

退出

词典

定义

清晰解释自然的书面和口头英语

英语

学习词典

基础英式英语

基础美式英语

翻译

点击箭头改变翻译方向。

双语词典

英语-中文(简体)

Chinese (Simplified)–English

英语-中文(繁体)

Chinese (Traditional)–English

英语-荷兰语

荷兰语-英语

英语-法语

法语-英语

英语-德语

德语-英语

英语-印尼语

印尼语-英语

英语-意大利语

意大利语-英语

英语-日语

日语-英语

英语-挪威语

挪威语-英语

英语-波兰语

波兰语-英语

英语-葡萄牙语

葡萄牙语-英语

英语-西班牙语

西班牙语-英语

English–Swedish

Swedish–English

半双语词典

英语-阿拉伯语

英语-孟加拉语

英语-加泰罗尼亚语

英语-捷克语

英语-丹麦语

English–Gujarati

英语-印地语

英语-韩语

英语-马来语

英语-马拉地语

英语-俄语

English–Tamil

English–Telugu

英语-泰语

英语-土耳其语

英语-乌克兰语

English–Urdu

英语-越南语

翻译

语法

同义词词典

Pronunciation

剑桥词典+Plus

Shop

剑桥词典+Plus

我的主页

+Plus 帮助

退出

登录 /

注册

中文 (简体)  

Change

English (UK)

English (US)

Español

Русский

Português

Deutsch

Français

Italiano

中文 (简体)

正體中文 (繁體)

Polski

한국어

Türkçe

日本語

Tiếng Việt

हिंदी

தமிழ்

తెలుగు

关注我们

选择一本词典

最近的词和建议

定义

清晰解释自然的书面和口头英语

英语

学习词典

基础英式英语

基础美式英语

语法与同义词词典

对自然书面和口头英语用法的解释

英语语法

同义词词典

Pronunciation

British and American pronunciations with audio

English Pronunciation

翻译

点击箭头改变翻译方向。

双语词典

英语-中文(简体)

Chinese (Simplified)–English

英语-中文(繁体)

Chinese (Traditional)–English

英语-荷兰语

荷兰语-英语

英语-法语

法语-英语

英语-德语

德语-英语

英语-印尼语

印尼语-英语

英语-意大利语

意大利语-英语

英语-日语

日语-英语

英语-挪威语

挪威语-英语

英语-波兰语

波兰语-英语

英语-葡萄牙语

葡萄牙语-英语

英语-西班牙语

西班牙语-英语

English–Swedish

Swedish–English

半双语词典

英语-阿拉伯语

英语-孟加拉语

英语-加泰罗尼亚语

英语-捷克语

英语-丹麦语

English–Gujarati

英语-印地语

英语-韩语

英语-马来语

英语-马拉地语

英语-俄语

English–Tamil

English–Telugu

英语-泰语

英语-土耳其语

英语-乌克兰语

English–Urdu

英语-越南语

词典+Plus

词汇表

选择语言

中文 (简体)  

English (UK)

English (US)

Español

Русский

Português

Deutsch

Français

Italiano

正體中文 (繁體)

Polski

한국어

Türkçe

日本語

Tiếng Việt

हिंदी

தமிழ்

తెలుగు

内容

英语-中文(简体) 

 

Noun 

rocket (DEVICE)

rocket (PLANT)

Verb

Translations

语法

所有翻译

我的词汇表

把rocket添加到下面的一个词汇表中,或者创建一个新词汇表。

更多词汇表

前往词汇表

对该例句有想法吗?

例句中的单词与输入词条不匹配。

该例句含有令人反感的内容。

取消

提交

例句中的单词与输入词条不匹配。

该例句含有令人反感的内容。

取消

提交

商业火箭头部公司已然浮现,谁会成为中国的SpaceX?_澎湃号·媒体_澎湃新闻-The Paper

头部公司已然浮现,谁会成为中国的SpaceX?_澎湃号·媒体_澎湃新闻-The Paper下载客户端登录无障碍+1商业火箭头部公司已然浮现,谁会成为中国的SpaceX?2023-08-15 10:26来源:澎湃新闻·澎湃号·媒体字号以下文章来源于科工力量 ,作者陈蓝 科工力量.观察者网科技工业新闻小组官方账号文/观察者网专栏作者 陈蓝航天爱好者,英文电子杂志“Go Taikonauts”创办人之一 今年是中国商业火箭取得突破性进展的一年。天兵科技天龙二号成为国内民营液氧煤油入轨第一箭,蓝箭航天朱雀二号成为世界上甲烷入轨第一箭,极大地提振了民营航天的信心。中国商业航天进入了以液体火箭为主角的下半场。 另一方面,固体火箭的步伐也没有停止。星际荣耀复飞成功,星河动力七战七捷,中科宇航一箭26星,东方空间正在紧锣密鼓地准备世界上最大固体火箭的轨道发射。这一盛况甚至让仅有SpaceX一枝独秀的美国商业航天也相形见绌。朱雀二号遥二运载火箭发射圆满成功,系全球首枚成功入轨液氧甲烷火箭 然而,中国的商业航天仍然比较年轻。多年来,各种轻视、怀疑和争议从来没有中断过,人们对商业航天的认知也常常存在混乱甚至冲突,至今仍有很多人不看好商业航天。商业航天是一个充满理想主义和英雄主义的行业,是一个波澜壮阔、坡长雪厚的行业,更是一个不经深入必然雾里看花的行业。它不仅需要星辰大海的情怀,也需要脚踏实地的科学精神和商业价值判断。 笔者从Space X成立不久就开始关注美国商业航天,也第一时间跟踪国内商业航天企业的发展,一直在尝试从内在规律和底层逻辑去认知商业航天(尤其是火箭)。这篇文章就是试图深入商业火箭的研制规律和价值核心,来帮助我们审视这样一个硬科技行业。商业火箭的技术路线 火箭通常按照推进剂种类划分为液体和固体两类,其中液体燃料又包括甲烷、煤油、液氢和肼类推进剂等。液氢比冲值最高、无毒、无污染,是非常理想的航天燃料,但由于密度低且氢分子极易逃逸,液氢火箭的贮箱和增压输送装置工艺复杂、体积庞大、造价昂贵,难以商用;肼类推进剂虽然状态稳定,但毒性很大,对商用并不友好。 因此,商业火箭可选的推进剂路线只剩下甲烷、煤油和固体燃料。我国航天产业已经历几十年的发展,摆在中国商业火箭企业面前的现实情况是:固体火箭:结构简单、门槛较低,既有航天体系已有成熟的技术积累和型号产品,如快舟、捷龙系列。由于固体火箭动力系统技术成熟,同时又不向民营开放,固体商业火箭公司必然会采用外采/外包模式。这个模式对团队和资金的规模要求相对较低,更能加快研制步伐。在资源保障充分的情况下,商业火箭企业能在2年时间内就研制出一款固体火箭。煤油火箭:结构复杂,门槛较高,既有航天体系已有成熟的技术积累和型号产品。长五、长六、长七、长八都是液氧煤油火箭。如果基于自研发动机研制一款新型煤油火箭,那么对团队和资金的规模都很大,研制周期会很长,所需要的资源要远高于固体火箭。由于中国煤油火箭的积累较多,如果团队经验比较丰富,能一定程度上减少技术摸索的时间。甲烷火箭:代表了行业发展趋势,不仅燃料价格最低,而且不存在发动机积碳问题,使得它天然适合复用,还能实现煤油难以企及的全流量分级燃烧循环,应该说对商用最理想。但它结构复杂,门槛最高,既有航天体系在甲烷火箭方面的积累很少。如果商业火箭公司选择甲烷火箭,必须独立自主研制发动机,会涉及较多新技术、新工艺的摸索问题。甲烷火箭研制周期很长,对团队和资源保障要求较高。 顺便说,一般人们都认为固体火箭的研制周期要比液体火箭短。事实上这种说法并不完全准确。决定火箭研制周期的主要因素并非火箭类型,而是核心系统(主要是动力系统)的研制方式:自研或外采/外包。全部自研的火箭周期必然会更长。而我国的国情决定了固体火箭的主要工作(尤其是风险最大的装药)只能由特定资质企业从事。商业火箭公司必然采用外采/外包方式,至少是部分外包,所以能缩短研制周期,但另一方面也增加了制约因素。 目前的行业共识是:固体代表当下(容易实现),液体才是未来,单靠固体型号难以去支撑一家火箭公司的业务和估值。所以,不管实际研制进度如何,中国所有的商业火箭公司都有明确的液体火箭型号计划。 对于商业火箭企业来说,先固后液无疑是资源约束下的现实选择,可以帮助企业前期走的更稳,但后续向液体型号转型时,必然会面临固液型号共存的资源消耗问题,或者由固向液转型的自我革命问题。而对于选择直接攻坚液体火箭的企业,则会在长期的研制过程中面临持续的资源保障压力。当然,这条路一旦坚持下来并跑通,也将构建起来足够高的竞争壁垒。商业火箭头部公司已然浮现 如果从2014年翎客航天成立算起,中国民营商业火箭公司已经走过九个年头。到目前为止,已经有五家企业实现了入轨发射,还有一家(东方空间)将在年内首飞。这几家公司大概率将成为中国民营商业火箭的头部公司。有意思的是,他们似乎都有意无意地采取了“差异化竞争”的策略,做出了不尽相同的技术路线选择(以下按成立时间排序):图自新财富杂志蓝箭航天(技术路线:甲烷) 2015年6月成立,中国最早成立的民营运载火箭企业之一。蓝箭坚持自研发动机,2016年全面启动液氧甲烷发动机的研制,已建成湖州发动机生产制造基地、嘉兴全箭总装基地以及酒泉液氧甲烷专属发射基地。2023年7月,基于蓝箭航天自研发动机系统构建的朱雀二号遥二火箭成功发射,成为全球首枚成功入轨的液氧甲烷火箭,也是首枚民企自研动力系统中型液体火箭,一举奠定了蓝箭航天的行业地位。 朱雀二号的SSO运力1.5吨(后续改进型号提升至4吨),是目前已入轨的运载能力最大的民商火箭。蓝箭已经完成了发动机、总装基地以及发射场的全产业链布局,有着明确的商业运营计划,预计朱雀二号将是蓝箭航天未来几年的主力型号产品。 朱雀二号飞行成功后,蓝箭航天公开提到了后续的“可回收型号”,但未公布具体信息。考虑到朱雀二号的一级箭体直径和发动机布局,很难直接优化出一款可回收型号。后续可回收型号估计是一型大型运载火箭并大概率会沿用朱雀二号的80吨发动机,有较好的技术继承性和可靠性积累,有利于缩短复用型号的研制周期。2023年7月12日,朱雀二号遥二发射成功(图源:互联网)星际荣耀(技术路线:小固体+甲烷) 2016年成立。2019年7月双曲线一号遥一成功发射,成为中国民营航天首枚成功入轨的火箭,使星际荣耀一度成为社会关注度和资本认可度最高的商业火箭企业,所提出的“由固到液、由小到大、固液并举、小步快跑、快速迭代、持续进化”的经营理念具有广泛的传播度。但2021年2月后,双曲线一号连续三次发射失利,使星际荣耀的发展节奏受到了很大影响。 2023年4月,双曲线一号遥六成功发射。2023年7月,星际荣耀公布了后续型号图谱,其中液体火箭的主力型号为双曲线三号液氧甲烷火箭,直径4.2米,全箭69米,一级并联9台“焦点二号”百吨级液氧甲烷发动机,500公里SSO运力为10.4吨(不回收)/6.2吨(复用)。2021年6月,双曲线三号通过了方案论证转段评审。最新的相关进展是2022年9月,焦点二号完成了火炬式点火器+针栓喷注器燃气发生器联合点火试验。 按照公司规划,固体的双曲线一号预计到2025年实现10发/年的发射能力,意味着星际荣耀将坚持固液并举的路线。公司还有双曲线二号的飞行验证规划。作为一款自研动力系统、需要投入较多资源的大型液体火箭,双曲线三号的首飞还有待时日。2023年4月7日,双曲线一号复飞成功(图源:互联网)星河动力(技术路线:小固体+煤油) 2018年成立,团队风格低调务实,固液并举的发展路线。2020年11月至2023年8月,星河动力的谷神星一号固体火箭连续七次成功入轨,在小固体火箭领域建立了可靠的品牌形象。由于小固体火箭的盈利和发展空间都相对有限,星河动力也一直寻求在液体型号上的突破。 2018年12月份,星河动力就启动可复用液氧煤油火箭智神星一号的立项工作。智神星一号为两级液氧煤油运载火箭,直径3.35米,一级并联7台50吨级自研苍穹煤油发动机,LEO运力5吨。由于星河动力固液并举的路径选择,液体型号的优先级较低,智神星一号的研制最近才开始提速。 2022年3月苍穹发动机首次全系统试车成功。2023年5月,首枚智神星一号火箭在安徽池州工厂总装下线,同时发动机试车基地建成。预计该基地将承担动力系统一系列试车,逐步确定发动机状态。预计非回收型智神星一号在2025年前具备飞行验证条件。2023年8月10日,谷神星一号遥七发射成功(图源:互联网)中科宇航(技术路线:大固体+煤油) 2018年底成立,依托中国科学院力学研究所和空天飞行科技中心而设立的混合所有制商业航天企业,有着独特的资源和体制优势。中科宇航选择了大固体+液体的技术路线,2022年7月,力箭一号遥一火箭飞行验证成功,成为中国最大固体火箭。2023年6月,力箭一号遥二火箭成功完成了一箭26星的飞行任务,在固体火箭领域建立了差异化的竞争优势。 中科宇航也有明确的液体型号规划,在2019年即开始了液体发动机的研制,但和星河动力类似,中科宇航目前发展重心也在固体火箭型号上,因此液体型号的研制进度相对缓慢,公司所披露的进展信息也比较少。 2022年11月中科宇航曾公布了力箭二号的相关信息(小型液体火箭,动力系统采用80吨玄鸢二号+15吨玄鸢一号),但2023年6月份在巴黎航展上透露目前正全力研制液氧煤油火箭力箭三号,并未提及力箭二号的信息。力箭三号的研制进度和首飞时间也并不清晰。2022年7月27日,力箭一号首飞成功(图源:互联网)天兵科技(技术路线:煤油) 2019年成立。天兵科技刚成立时以小众推进剂HCP火箭起步,期间业内还传出要和九州云箭合作研制液氧甲烷火箭。2021技术路线切换至煤油火箭后,极速开发出液氧煤油火箭天龙二号并取得首飞成功,引起行业震动。天龙二号的研制周期约2年时间,比其他商业火箭公司固体火箭的研制周期还要短。 天龙二号并无后续飞行计划。目前天兵科技的研制工作主要都转向了“天龙三号”,天龙三号是目前中国商业火箭领域已发布的最强火箭,对标SpaceX的猎鹰九火箭,SSO运力达14吨,与长征五号的SSO运力(15吨)相近。天龙三号箭体直径从天龙二号的3.35米增加到3.8米,自研的110吨天火12煤油发动机取代了天龙二号外购的YF-102发动机,飞行过的二级发动机也宣告退役。这意味着天龙三号研制几乎需要从零开始。如果按公司计划2024年5月首飞,意味着长五级别的液体火箭研制周期从10年缩短至3年,挑战巨大! 有利的是,天兵通过天龙二号的成功积累了一定的液体型号研制经验,获取了阶段性所需的资金支持。天火12发动机可能深度借鉴了YF-102发动机,对于天龙三号的研制提供了一定基础。但作为一款采用新发动机、新动力布局、新箭体结构、需新建发射工位的大型火箭,如果能如期首飞,那必定可载入航天史并让猎鹰九号相形见绌。让我们拭目以待!2023年4月2日,天龙二号首飞成功(图源:互联网)东方空间(技术路线:捆绑固体+煤油) 2020年成立。可能是出于行业卡位和差异化竞争的考虑,东方空间以捆绑型超大固体火箭“引力一号”作为切入点。引力一号的SSO运力高达4.2吨,接近现役运力最强固体火箭欧空局织女星C的两倍,研制成功后将成为世界上起飞量级最大、运力最强的固体运载火箭。无论是从产品构型上还是市场定位上,引力一号都是一款极具话题性的产品。 东方空间同样公布了后续液体火箭的型号规划,但目前公司发展重心仍在引力一号的研制上,液体火箭的研制仍处于早期阶段。引力一号计划于2023年底首飞。“引力一号”海上发射示意图 下图是中国主要商业火箭公司近年的进展:参照系:SpaceX SpaceX对中国商业火箭企业的影响是非常深远的。回顾SpaceX的发展历程(下表),对评估中国商业火箭未来发展依然有着重要的参考价值。 SpaceX二十年来的成功经验有很多。但笔者认为最重要的可能是以下几条: 首先,SpaceX很早就将火箭复用作为发展方向,因为这是降低发射成本、航天大规模应用的唯一途径。这一点几乎是所有商业火箭公司的共识和共同目标,这里就不展开了。 第二,SpaceX从一开始就确定了液体火箭的技术路线,同时选择了自研发动机的研制方式。这是当时初创航天公司中是不多见的。“动力先行”一直是中国航天的座右铭。发动机对火箭的重要性怎么强调都不过分。商业航天虽然强调效率和成本控制,但也必须遵循科学,遵循火箭研制的内在规律和底层逻辑。前面已经说过,自研液体火箭已经成为中国商业航天的共识。而SpaceX在20年前就做对了这第一件事。 第三,SpaceX坚持“少而精”的发动机发展策略,20年只研制了两大系列发动机。它的前10年专注于梅林这一款发动机,不断优化改进衍生出多款性能优越的真空和海平面发动机,现有版本发动机推力比初版提升2.5倍!猛禽发动机也遵循了相同的发展轨迹,通过不断提高室压,在发动机自重基本不变的情况下,推力从185吨提升到了269吨。虽然这已属顶级技术,但真正在驱动的是结果导向的底层商业逻辑。 第四,它选择了甲烷作为星舰动力系统的燃料,研制了猛禽这款世界唯一的全流量分级燃烧火箭发动机。这也是商业航天的底层逻辑所决定的。既然复用是降低发射成本最根本的方式,那么选择最适合复用的甲烷做燃料便天然合理。此外,相比煤油,甲烷还可以实现全流量分级燃烧,可以前所未有地压榨发动机的性能,无疑也非常符合商业逻辑。SpaceX肯定权衡过甲烷机的难度、风险和开发周期。从猛禽目前的表现看,这个决策基本上已获成功。 你可能已经注意到,上述四条中三条都和发动机相关。的确,在航空航天领域,动力永远是第一位的,所谓力大飞砖、大力出奇迹等。只要动力问题解决,其他问题,无论是各种构型,还是火箭回收,都会迎刃而解。我下节还会详述。 事实证明,SpaceX的绝大多数选择都是正确的,迄今为止它没有走过太多弯路。它是中国商业航天的榜样,也是最好的参照系。火箭研制的内在规律:动力先行、厚积薄发 SpaceX取得现在的成就不是偶然的。尊重客观规律、持之以恒地向动力系统研发倾斜是它的成功秘诀之一。 火箭作为一种高复杂性、高可靠性、高精密性的系统集成产品,其研制过程是复杂的系统工程。影响火箭研制周期的主要因素包括动力系统的研制、全箭的总装和测试,以及配套基础设施的建设等。如果涉及新技术和新工艺,则更需要长时间的验证和反复优化。这是火箭研制的基本规律。火箭研制最困难的部分从来都不是理论设计,而是工程实现。所以,不管是什么类型的火箭,如果从发动机开始自主研制的话,周期都是很长的,因为发动机通常就是影响火箭研制周期的关键。 相比固体发动机,液体火箭发动机无论是结构还是工艺更为复杂。一款新型的液体发动机从开始立项到投产使用,期间需要反复经历“设计-制造-总装-试车-设计优化-制造-总装-试车-设计优化……”的循环。设计的优化需要底层数据,底层数据只能通过地面试车或者飞行试验来获取,而设计优化的实现往往又需要新工艺的配合,新工艺的摸索又需要时间来验证。 在单台发动机的性能和稳定性通过充分验证后,火箭企业还需要通过子级动力系统试车来验证多台发动机之间的协调性和一致性,以及增压输送系统的合理性和可靠性。由于火箭动力系统和结构等其他系统是深度耦合、相互影响的关系,在动力系统得到验证后,还需要通过多种测试,进一步验证动力系统和其他系统之间的匹配性,包括一系列的接口管理、震动管理和受力分析等,过程中则需要通过设计或工艺上的优化和调整,不断对火箭进行调试,这也是一个相对漫长的过程,进一步拉长了火箭的研制周期。 从行业规律来看,一款液体火箭发动机从立项研制到达到成熟状态,需要近10年的时间。以SpaceX的梅林发动机为例,发动机从开始研制到首次飞行验证(用于猎鹰一)耗时6年,从开始研制到应用于成熟型号(猎鹰九)耗时10年。梅林发动机在首飞验证后又用了近10年时间反复迭代更新,才达到目前的成熟稳定状态。 下面是全球范围内已进行过轨道发射(按首飞时间排列,含失败)的商业火箭。可见动力系统研制方式对研制周期的重大影响。自研液体发动机到成熟普遍需要10年左右的时间。 · 猎鹰一号(SpaceX):煤油,发动机自研,研制周期约6年(2002-2008) · 猎鹰九号(SpaceX):煤油,沿用猎鹰一号发动机,研制周期约5年(2005-2010) · 电子号(Rocket Lab):煤油,发动机自研,研制周期约7年(2012-2018) · 朱雀一号(蓝箭航天):固体,发动机外采,研制周期约1年(2017-2018) · 双曲线一号(星际荣耀):固体,发动机外采,研制周期约2.5年(2017-2019) · 谷神星一号(星河动力):固体,发动机部分外包,研制周期约2.5年(2018-2020) · 力箭一号(中科宇航):固体,发动机外采,研制周期约3年(2019-2022) · 朱雀二号(蓝箭航天):甲烷,发动机自研,研制周期约8年(2016-2023) · 人族一号(Relativity Space):甲烷,发动机自研,研制周期约8年(2015-2023) · 天龙二号(天兵科技):煤油,发动机外采,研制周期约2年(2021-2023) · 星舰-超重(SpaceX):甲烷,发动机自研,研制周期约11年(2012-2023) 正是因为液体火箭发动机研制周期漫长、投入巨大,基于一型发动机进行长时间的反复优化和验证,不断挖掘发动机的性能,同时提高可靠性,厚积薄发,也已成为航天发动机的基本研制规律。 在SpaceX率先实现火箭复用并做出了大幅降低发射费用的示范后,可回收火箭都成为了商业火箭公司的最终目标。国内头部商业火箭公司也无一例外地选择了液体火箭这条路线,但实现途径略有不同,比如固液并进、以固养液(星河动力、星际荣耀、中科宇航),或专注液发、稳步推进(蓝箭),又或借力加速、跨越发展(天兵科技)。但归根结底,都要尊重液体火箭研制的内在规律。关键依然是火箭的核心配套系统(动力系统)。事实上,可复用动力系统需要更多的时间来达到所需的成熟度和可靠性。这也是SpaceX梅林和猛禽两款发动机给予我们的宝贵经验。SpaceX 猛禽发动机点火测试机遇和挑战 中国商业航天经过近十年发展,正在渐入佳境,但面临的挑战也巨大。到目前为止,商业火箭还没有进入主流的大中型商业卫星市场,还没有一家商业火箭公司实现盈利并真正开始商业运营,市场占有率微不足道。国内商业火箭公司目前仍处于发展初期,商业航天整体市场和国内外大环境还有很大的不确定性,技术上也和SpaceX差距巨大。 我们要认识到这个差距,但也应该看到前面巨大的机遇。从历史的角度看,商业航天可能是二十一世纪最大的风口。而航天越来越成为中美两国的游戏,我们已经在商业航天领域做到了第二。此外,中国经济依然长期看好、商业航天市场正在成型、中国政府产业政策(包括商业航天)具有延续性和长期执行能力、中国民营企业蕴含巨大潜能,我们没有理由不乐观。 未来,中国商业航天头部公司中必定也会出现像SpaceX那样的巨头。谁会成为中国的SpaceX?那就要看企业领导人的远见、毅力和定力。只要遵循火箭产品的底层逻辑和火箭研制的内在规律,坚持不懈,就一定会取得成功。 这个历史性的机遇不仅是留给创业者和企业的,也是留给资本和投资者的。未来十年,依然会是中国商业航天发展的黄金期。对资本来说也一样,只要充分理解火箭研制的底层逻辑和内在规律,就能洞察到企业的本质和真正的能力,就能抓到机会。参照SpaceX对商业航天公司进行估值也许也是个聪明的做法。中国商业航天的发展需要资本的支持,这也是资本在“后房地产时代”应该做的正确事情。 人类进入太空已经半个多世纪,但最好的时代刚刚到来。再过十年,我们今天盘点的中国商业火箭先行者们还都会安好吗?历史的发展往往超过我们的想象力。也许,我们有机会见证奇迹的发生。原标题:《商业火箭头部公司已然浮现,谁会成为中国的SpaceX?》阅读原文特别声明本文为澎湃号作者或机构在澎湃新闻上传并发布,仅代表该作者或机构观点,不代表澎湃新闻的观点或立场,澎湃新闻仅提供信息发布平台。申请澎湃号请用电脑访问http://renzheng.thepaper.cn。+1收藏我要举报查看更多查看更多开始答题扫码下载澎湃新闻客户端Android版iPhone版iPad版关于澎湃加入澎湃联系我们广告合作法律声明隐私政策澎湃矩阵澎湃新闻微博澎湃新闻公众号澎湃新闻抖音号IP SHANGHAISIXTH TONE新闻报料报料热线: 021-962866报料邮箱: news@thepaper.cn沪ICP备14003370号沪公网安备31010602000299号互联网新闻信息服务许可证:31120170006增值电信业务经营许可证:沪B2-2017116© 2014-2024 上海东方报业有限公

SpaceX - Falcon 9

SpaceX - Falcon 9

SpaceX Logo

Falcon 9

Falcon Heavy

Dragon

Starship

Human Spaceflight

Rideshare

Starshield

Starlink

Shop

Falcon 9

Falcon Heavy

Dragon

Starship

Human Spaceflight

Rideshare

Starshield

Starlink

Mission

Launches

Careers

Updates

Shop

Falcon 9

First Orbital Class Rocket Capable of Reflight

Falcon 9 is a reusable, two-stage rocket designed and manufactured by SpaceX for the reliable and safe transport

of people and payloads into Earth orbit and beyond. Falcon 9 is the world’s first orbital class reusable rocket.

Reusability allows SpaceX to refly the most expensive parts of the rocket, which in turn drives down the cost of space access.

A rendering of a fully stacked Falcon 9 booster spinning around its vertical axis

Falcon 9

Overview

HEIGHT

70 m / 229.6 ft

DIAMETER

3.7 m / 12 ft

MASS

549,054 kg / 1,207,920 lb

PAYLOAD TO LEO

22,800 kg / 50,265 lb

PAYLOAD TO GTO

8,300 kg / 18,300 lb

PAYLOAD TO MARS

4,020 kg / 8,860 lb

Falcon 9

First stage

Overview|

Engines|

Landing legs

Falcon 9’s first stage incorporates nine Merlin engines and aluminum-lithium alloy tanks

containing liquid oxygen and rocket-grade kerosene (RP-1) propellant.

Falcon 9 generates more than 1.7 million pounds of thrust at sea level.

The nine Merlin engines on the first stage are gradually throttled near the end of first-stage flight

to limit launch vehicle acceleration as the rocket’s mass decreases with the burning of fuel. These

engines are also used to reorient the first stage prior to reentry and to decelerate the vehicle for landing.

NUMBER OF ENGINES

9

THRUST AT SEA LEVEL

7,607 kN / 1,710,000 lbf

THRUST IN VACUUM

8,227 kN / 1,849,500 lbf

The Falcon 9 first stage is equipped with four landing legs made of state-of-the-art

carbon fiber with aluminum honeycomb.

Placed symmetrically around the base of the rocket, they are stowed at the base of

the vehicle and deploy just prior to landing.

Learn more about SpaceX reusability

Falcon 9

Interstage

The interstage is a composite structure that connects the first and second stages, and houses

the pneumatic pushers that allow the first and second stage to separate during flight.

Grid fins

Falcon 9 is equipped with four hypersonic grid fins positioned at the base of the interstage.

They orient the rocket during reentry by moving the center of pressure.

Falcon 9

Second Stage

The second stage, powered by a single Merlin Vacuum Engine, delivers Falcon 9’s payload to the desired

orbit. The second stage engine ignites a few seconds after stage separation, and can be restarted

multiple times to place multiple payloads into different orbits.

NUMBER OF ENGINES

1 vacuum

BURN TIME

397 sec

THRUST

981 kN / 220,500 lbf

Falcon 9

Payload

Fairing|

Dragon

Made of a carbon composite material, the fairing protects satellites on their way to orbit.

The fairing is jettisoned approximately 3 minutes into flight, and SpaceX continues to recover

fairings for reuse on future missions.

HEIGHT

13.1 m / 43 ft

DIAMETER

5.2 m / 17.1 ft

Dragon is capable of carrying up to 7 people and/or cargo in the spacecraft’s pressurized section.

In addition, Dragon can carry cargo in the spacecraft’s unpressurized trunk, which can also

accommodate secondary payloads.

Learn more about Dragon

HEIGHT

8.1 m / 26.6 ft

DIAMETER

3.7 m / 12 ft

VIDEO

Falcon 9 In Flight

ENGINES

Merlin

SEA LEVEL|

VACUUM

Merlin is a family of rocket engines developed by SpaceX for use on its Falcon 1, Falcon 9 and Falcon Heavy

launch vehicles. Merlin engines use a rocket grade kerosene (RP-1) and liquid oxygen as rocket propellants

in a gas-generator power cycle. The Merlin engine was originally designed for recovery and reuse.

PROPELLANT

LOX / RP-1

THRUST

845 kN / 190,000 lbf

Merlin Vacuum features a larger exhaust section and a significantly larger expansion nozzle to maximize the engine’s

efficiency in the vacuum of space. Its combustion chamber is regeneratively cooled, while the expansion nozzle is

radiatively cooled. At full power, the Merlin Vacuum engine operates with the greatest efficiency ever for an

American-made hydrocarbon rocket engine.

PROPELLANT

LOX / RP-1

THRUST

981 kN / 220,500 lbf

Falcon 9 launches Dragon to the International Space Station from Launch Complex 39A

Falcon 9 first and second stages after separating in flight

Falcon 9 lifts off with its Iridium-5 payload

Falcon 9 lands on the droneship Just Read the Instructions

Close-up of Falcon 9's Merlin engines during liftoff

Falcon 9 leaves a trail of light as it lifts off from Vandenberg Air Force Base

Falcon 9 lifts off with Dragon for an in-flight test of the Crew Dragon abort system

Falcon 9 lifts off with its Iridium-8 payload

Falcon 9 with its Radarsat payload at sunset before launch

Falcon 9 lands at Cape Canaveral

Falcon 9 vertical with its Iridium payload at moonrise

For information about our launch services, contact sales@spacex.com

Download User's Guide

Capabilities and Services

SpaceX © 2024

PRIVACY POLICY

SUPPLIERS

How rockets work: A complete guide | Space

How rockets work: A complete guide | Space

Skip to main content

Open menu

Close menu

Space

Space

Search

Search Space

Subscribe

RSS

All About Space MagazineWhy subscribe?Mother's Day Special: Get a £10 VEX gift card when you subscribe!Jam packed issues filled with the latest cutting-edge research, technology and theories delivered in an entertaining and visually stunning way, aiming to educate and inspire readers of all agesEngaging articles, breathtaking images and expert knowledgeIssues delivered straight to your doorFrom$28.75View Deal

Space Exploration

The Universe

Stargazing

Launches & Spacecraft

Videos

The Moon

More

Solar System

Artemis

James Webb Space Telescope

Entertainment

Search for Life

Tech

Forums

Subscribe to "All about Space" magazine

Space.com Store

About Us

Web Notifications

TrendingCrew-8 live updatesNext Full MoonBest TelescopesBest BinocularsBest Star ProjectorsSpace CalendarLego Star Wars dealsBest DronesSolar System PlanetsNight Sky Tonight

When you purchase through links on our site, we may earn an affiliate commission. Here’s how it works.

Space Exploration

Launches & Spacecraft

How rockets work: A complete guide

References

By Giles Sparrow, All About Space magazine( myfavouritemagazines.co.uk ) last updated 30 June 2021

Rockets of all kinds are still our only way of reaching space — but how exactly do they work?

NASA's Space Launch System (SLS) will launch astronauts to the Moon.

(Image credit: Getty)

Rockets are our species' best way of escaping the atmosphere of Earth and reaching space. But the process behind getting these machines to work is far from simple. Here's what you need to know about getting a rocket into space. How rockets lift offWriters and inventors have dreamt of exploring the universe beyond Earth for centuries, but the real challenges of traveling into space only became clear in the 19th century. Experimental balloon flights showed that Earth's atmosphere thins out rapidly at high altitudes, and so even before powered flight became a reality, engineers knew that devices that create a forward or upward force by pushing against a surrounding medium like air — such as wings and propellers — would be of no use in space. Another problem was that combustion engines — machines such as steam or gasoline engines that generate power by burning fuel in the oxygen from Earth's atmosphere — would also fail in airless space.Fortunately, a device that solved the problem of generating force without a surrounding medium had already been invented — the rocket. Initially used as weapons of war or in fireworks, rockets generate a force in one direction, called thrust, by the principle of action and reaction: exhaust fumes released by explosive chemicals are pushed out of the back of the rocket at high speed, and as a result the rocket is pushed in the other direction, regardless of any surrounding medium, NASA explains in this primer (pdf). The key to using rockets in space is to carry a chemical called an oxidant that can perform the same role as oxygen in Earth's air and enable the fuel to combust.The Space Shuttle’s unique design channelled propellant from an external tank to the Shuttle’s main engines during launch, while two large solid rocket boosters assisted. (Image credit: NASA)The first person to seriously study the rocket's potential for space travel, Russian schoolteacher and amateur scientist Konstantin Tsiolkovsky, first published his conclusions in 1903. He correctly identified the launch as one of the biggest challenges — the moment where the rocket has to carry all the fuel and oxidant it needs to reach space — as its weight is at a maximum and a huge amount of thrust is needed just to get it moving.As the rocket gets underway it sheds mass through its exhaust, so its weight is reduced and the same amount of thrust will have a greater effect in terms of accelerating the rest of the rocket. Tsiolkovsky came up with various rocket designs and concluded that the most efficient setup was a vertically launched vehicle with several 'stages' — each a self-contained rocket that could carry the stages above it for a certain distance before exhausting its fuel, detaching and falling away. This principle, still widely used today, reduces the amount of dead weight that needs to be carried all the way into space. Tsiolkovsky devised a complex equation that revealed the necessary thrust force needed for any given rocket maneuver, and the "specific impulse" — how much thrust is generated per unit of fuel — needed for a rocket to reach space. He realized that the explosive rocket propellants of his time were far too inefficient to power a space rocket, and argued that liquid fuels and oxidants, such as liquid hydrogen and liquid oxygen, would ultimately be needed to reach orbit and beyond. Although he did not live to see his work recognized, Tsiolkovsky's principles still underpin modern rocketry.Taking flightRockets must delicately balance and control powerful forces in order to make it through Earth's atmosphere into space.A rocket generates thrust using a controlled explosion as the fuel and oxidant undergo a violent chemical reaction. Expanding gases from the explosion are pushed out of the back of the rocket through a nozzle. The nozzle is a specially shaped exhaust that channels the hot, high-pressure gas created by combustion into a stream that escapes from the back of the nozzle at hypersonic speeds, more than five times the speed of sound. Isaac Newton's third law of motion states that every action has an equal and opposite reaction, so the "action" force that drives the exhaust out of the rocket nozzle must be balanced by an equal and opposite force pushing the rocket forward. Specifically, this force acts on the upper wall of the combustion chamber, but because the rocket motor is integral to each rocket stage, we can think of it acting on the rocket as a whole.The Delta II rocket's first-stage core was assisted by nine separate solid-rocket boosters during launch. (Image credit: NASA)Although the forces acting in both directions are equal, their visible effects are different because of another of Newton's laws, which explains how objects with greater mass need more force to accelerate them by a given amount. So while the action force rapidly accelerates a small mass of exhaust gas to hypersonic speeds each second, the equal reaction force produces a far smaller acceleration in the opposite direction on the far greater mass of the rocket.As the rocket gains speed, keeping the direction of motion closely aligned with the direction of thrust is critical. Gradual adjustments are needed to steer the rocket towards an orbital trajectory, but a severe misalignment can send the rocket whirling out of control. Most rockets, including the Falcon and Titan series and the Saturn V moon rocket, steer using gimballed engines, mounted so that the entire rocket motor can pivot and vary the direction of its thrust from moment to moment. Other steering options include using external vanes to deflect the exhaust gases as they escape the rocket engine — most effective with solid-fueled rockets that lack a complex motor — and auxiliary engines, such as small thruster rockets mounted on the sides of the rocket stage.How a rocket's motors workModern rocket motors have come a long way from fireworks, the first in rocket history. Relatively simple solid rockets, most often used as boosters to provide extra thrust at launch, still rely on the same basic principle of igniting a tube containing a combustible mix of fuel and oxidant. Once ignited, a solid rocket will continue to burn until its fuel is exhausted, but the rate at which fuel is burnt — and therefore the amount of thrust — can be controlled by changing the amount of surface exposed to ignition during different times in the rocket's flight. This can be done by packing the fuel/oxidant mix with a hollow gap down the center, running along the length of the rocket. Depending on the profile of this gap, which may be circular or star-shape, for instance, the amount of exposed surface will change during the flight.All About Space(Image credit: Future)This article is brought to you by All About Space.All About Space magazine takes you on an awe-inspiring journey through our solar system and beyond, from the amazing technology and spacecraft that enables humanity to venture into orbit, to the complexities of space science.The more widespread liquid-fueled rockets are far more complex. Typically, they involve a pair of propellant tanks — one each for the fuel and the oxidant — connected to a combustion chamber through a complex maze of pipes. High-speed turbopumps driven by their own independent motor systems are used to deliver liquid propellant into the chamber through an injection system. The rate of supply can be throttled up or down depending on requirement, and fuel can be injected as a simple jet or a fine spray. Inside the combustion chamber an ignition mechanism is used to begin combustion — this may be a jet of high-temperature gas, an electric spark or a pyrotechnic explosion. Rapid ignition is critical — if too much fuel/oxidant mixture is allowed to build up in the combustion chamber than a delayed ignition can generate enough pressure to blow the rocket apart, a catastrophic event that rocket engineers laconically refer to as a "hard start" or "rapid unscheduled disassembly" (RUD).The detailed design of a liquid rocket stage can vary a lot depending on its fuel and other requirements. Some of the most efficient propellants are liquefied gases such as liquid hydrogen, which is only stable at very low temperatures — around minus 423 degrees Fahrenheit (minus 253 degrees Celsius). Once loaded aboard the rocket, these cryogenic propellants must be stored in heavily insulated tanks. Some rockets avoid the need for an ignition mechanism using hypergolic propellants that ignite spontaneously on contact with each other. Interplanetary travelRockets are the key to exploring our solar system, but how do they go from orbit to deep space?The first stage of any spaceflight involves launch from Earth's surface into a relatively low orbit around 124 miles (200 km) up, above the vast majority of the atmosphere. Here gravity is almost as strong as it is on the surface, but friction from Earth's upper atmosphere is very low, so if the uppermost stage of the rocket is moving fast enough it can maintain a stable, circular or elliptical trajectory where the pull of gravity and the vehicle's natural tendency to fly off in a straight line cancel each other out.Many spacecraft and satellites travel no further than this low Earth orbit (LEO), but those destined to leave Earth entirely and explore the wider solar system need a further boost in speed to reach escape velocity — the speed at which they can never be pulled back by our planet's gravity. The escape velocity at Earth's surface — 6.9 miles per second (11.2 km/s) — is about 50% faster than the typical speeds of objects in LEO. It gets lower at a greater distance from Earth, and probes bound for interplanetary space are often first injected into elongated or elliptical orbits by a carefully timed burst of thrust from an upper-stage rocket, which may remain attached to the spacecraft for the rest of its interplanetary flight. In such an orbit the spacecrafts' distance from Earth can range from hundreds to thousands of miles, and its velocity will also vary, reaching a maximum when the spacecraft is closest to Earth — a point called perigee — and slowing down further out. Nuclear thermal rockets are a hypothetical way of generating large amounts of thrust for sustained periods – they could one day shorten the journey time to other planets. (Image credit: NASA)Surprisingly, however, the critical rocket burn used to escape into interplanetary space is usually made when the spacecraft is near perigee. This is due to the so-called Oberth effect, an unexpected property of rocket equations that means a rocket is more efficient when it is moving at higher velocity. One way to understand this is that burning a spacecraft's fuel allows the engine to utilize not only its chemical energy, but also its kinetic energy, which is greater at higher speeds. On balance, the additional rocket thrust needed to reach escape velocity from a low altitude at higher speed is less than that needed to escape from a high altitude when moving at a lower speed.Spaceflight engineers and mission planners often refer to the "Delta-v" required to accomplish a specific flight maneuver, such as a change in orbit. Strictly speaking, the term Delta-v means change in velocity, but engineers use it specifically as a measure of the amount of impulse, or thrust force over time, needed to accomplish a maneuver. Broadly speaking, missions are planned around a "Delta-v budget" — how much thrust they can generate for how long using the spacecraft's onboard fuel supplies. Sending a spacecraft from one planet to another with minimum Delta-v requirements involves injecting it into an elliptical orbit around the sun, called a Hohmann transfer orbit. The spacecraft travels along a segment of the elliptical path that resembles a spiral track between the orbits of the two planets, and requires no further thrust along its journey. On arrival at its target object it may use gravity alone to enter its final orbit, or it may require a burst of rocket thrust in the opposite direction — usually accomplished by simply turning the spacecraft around in space and firing the motor — before it can achieve a stable orbit.

Join our Space Forums to keep talking space on the latest missions, night sky and more! And if you have a news tip, correction or comment, let us know at: community@space.com.

Get the Space.com NewsletterBreaking space news, the latest updates on rocket launches, skywatching events and more!Contact me with news and offers from other Future brandsReceive email from us on behalf of our trusted partners or sponsorsBy submitting your information you agree to the Terms & Conditions and Privacy Policy and are aged 16 or over.

Giles SparrowSocial Links NavigationContributorAfter studying astronomy at University College London and Science Communication at Imperial College, Giles set out on an Exciting Adventure with Illustrated Publishing. He's since written a string of beautiful and successful books on astronomy, science and other cool subjects, and is also a regular contributor to magazines. When he's not doing the day job, you’ll find him fanboying about Doctor Who or lost in some obscure corner of history…

More about spaceflightWhy ISS astronauts won't know where to look for next total solar eclipse for a whileChina names the spacecraft that will put its astronauts on the moon (video)LatestNASA's next astronaut class graduates March 5, and you can watch it live (video)See more latest ►

Most PopularJohannes Kepler: Everything you need to knowBy Keith CooperDecember 22, 2023Everything we know about the Alien TV series: Release date, plot, cast & moreBy Fran RuizDecember 20, 2023Everything we know about 'Alien: Romulus'By Fran RuizDecember 19, 2023Everything we know about Star Wars EclipseBy Fran RuizDecember 18, 2023Best external hard drives 2024: Top HDD and SSD modelsBy Tantse WalterDecember 18, 2023What are radio galaxies?By Robert LeaDecember 05, 2023Near-Earth asteroids: Hunting and tracking upcoming flybysBy Robert LeaDecember 04, 2023How to see and track the Tiangong Chinese space stationBy Robert LeaDecember 01, 2023What is the biggest planet ever found?By Rebecca SohnNovember 27, 2023Everything we know about 'Kingdom of the Planet of the Apes'By Fran RuizNovember 21, 2023Northern lights webcams: Watch the aurora borealis online for freeBy Daisy DobrijevicNovember 15, 2023

MORE FROM SPACE...1NASA's next astronaut class graduates March 5, and you can watch it live (video)2'Star Wars Battlefront Classic Collection' blasts its way into our galaxy on March 143SpaceX launches 23 Starlink satellites during 3rd launch in under 24 hours4SpaceX fuels up massive Starship megarocket in test for 3rd launch (photos) 5'Dune: Part Two' tries to find its pulse in a plodding sci-fi spectacle (review)

Space is part of Future US Inc, an international media group and leading digital publisher. Visit our corporate site.

About Us

Contact Future's experts

Terms and conditions

Privacy policy

Cookies policy

Accessibility Statement

Advertise with us

Web notifications

Careers

©

Future US, Inc. Full 7th Floor, 130 West 42nd Street,

New York,

NY 10036.

Rocket | Characteristics, Propulsion, Development, & Facts | Britannica

Rocket | Characteristics, Propulsion, Development, & Facts | Britannica

Search Britannica

Click here to search

Search Britannica

Click here to search

Login

Subscribe

Subscribe

Home

Games & Quizzes

History & Society

Science & Tech

Biographies

Animals & Nature

Geography & Travel

Arts & Culture

Money

Videos

On This Day

One Good Fact

Dictionary

New Articles

History & Society

Lifestyles & Social Issues

Philosophy & Religion

Politics, Law & Government

World History

Science & Tech

Health & Medicine

Science

Technology

Biographies

Browse Biographies

Animals & Nature

Birds, Reptiles & Other Vertebrates

Bugs, Mollusks & Other Invertebrates

Environment

Fossils & Geologic Time

Mammals

Plants

Geography & Travel

Geography & Travel

Arts & Culture

Entertainment & Pop Culture

Literature

Sports & Recreation

Visual Arts

Companions

Demystified

Image Galleries

Infographics

Lists

Podcasts

Spotlights

Summaries

The Forum

Top Questions

#WTFact

100 Women

Britannica Kids

Saving Earth

Space Next 50

Student Center

Home

Games & Quizzes

History & Society

Science & Tech

Biographies

Animals & Nature

Geography & Travel

Arts & Culture

Money

Videos

rocket

Table of Contents

rocket

Table of Contents

IntroductionGeneral characteristics and principles of operationChemical rocketsSolid-rocket motorsLiquid-propellant rocket enginesOther systemsDevelopment of rockets

References & Edit History

Related Topics

Images & Videos

For Students

rocket summary

Quizzes

All About Astronomy

36 Questions from Britannica’s Most Popular Science Quizzes

Read Next

12 Questions About the History of Space Exploration Answered

Discover

7 of History's Most Notorious Serial Killers 

America’s 5 Most Notorious Cold Cases (Including One You May Have Thought Was Already Solved)

7 Surprising Uses for Mummies

How Did Helen Keller Fly a Plane?

Inventors and Inventions of the Industrial Revolution

8 Animals That Suck (Blood)

9 Things You Might Not Know About Adolf Hitler

Home

Science

Astronomy

Science & Tech

rocket

jet-propulsion device and vehicle

Actions

Cite

verifiedCite

While every effort has been made to follow citation style rules, there may be some discrepancies.

Please refer to the appropriate style manual or other sources if you have any questions.

Select Citation Style

MLA

APA

Chicago Manual of Style

Copy Citation

Share

Share

Share to social media

Facebook

Twitter

URL

https://www.britannica.com/technology/rocket-jet-propulsion-device-and-vehicle

Give Feedback

External Websites

Feedback

Corrections? Updates? Omissions? Let us know if you have suggestions to improve this article (requires login).

Feedback Type

Select a type (Required)

Factual Correction

Spelling/Grammar Correction

Link Correction

Additional Information

Other

Your Feedback

Submit Feedback

Thank you for your feedback

Our editors will review what you’ve submitted and determine whether to revise the article.

External Websites

BCcampus Open Publishing - Rocket Propulsion

Physics LibreTexts - History of Rockets

Smithsonian National Air and Space Museum - How Things Fly - Rocket Propulsion

NASA - What is a Rocket?

Britannica Websites

Articles from Britannica Encyclopedias for elementary and high school students.

rocket - Children's Encyclopedia (Ages 8-11)

rocket - Student Encyclopedia (Ages 11 and up)

Print

print

Print

Please select which sections you would like to print:

Table Of Contents

Cite

verifiedCite

While every effort has been made to follow citation style rules, there may be some discrepancies.

Please refer to the appropriate style manual or other sources if you have any questions.

Select Citation Style

MLA

APA

Chicago Manual of Style

Copy Citation

Share

Share

Share to social media

Facebook

Twitter

URL

https://www.britannica.com/technology/rocket-jet-propulsion-device-and-vehicle

Feedback

External Websites

Feedback

Corrections? Updates? Omissions? Let us know if you have suggestions to improve this article (requires login).

Feedback Type

Select a type (Required)

Factual Correction

Spelling/Grammar Correction

Link Correction

Additional Information

Other

Your Feedback

Submit Feedback

Thank you for your feedback

Our editors will review what you’ve submitted and determine whether to revise the article.

External Websites

BCcampus Open Publishing - Rocket Propulsion

Physics LibreTexts - History of Rockets

Smithsonian National Air and Space Museum - How Things Fly - Rocket Propulsion

NASA - What is a Rocket?

Britannica Websites

Articles from Britannica Encyclopedias for elementary and high school students.

rocket - Children's Encyclopedia (Ages 8-11)

rocket - Student Encyclopedia (Ages 11 and up)

Written by

Edward W. Price

Regents' Professor Emeritus of Aerospace Engineering, Georgia Institute of Technology, Atlanta.

Edward W. Price,

Oscar Biblarz

Oscar BiblarzSee All

Fact-checked by

The Editors of Encyclopaedia Britannica

Encyclopaedia Britannica's editors oversee subject areas in which they have extensive knowledge, whether from years of experience gained by working on that content or via study for an advanced degree. They write new content and verify and edit content received from contributors.

The Editors of Encyclopaedia Britannica

Last Updated:

Feb 21, 2024

Article History

Table of Contents

Soviet launch vehicle rocket engines

See all media

Category:

Science & Tech

Key People:

Theodore von Kármán

Wernher von Braun

Robert Goddard

Hermann Oberth

Sergei Korolev

(Show more)

Related Topics:

launch vehicle

Ariane

sounding rocket

staged rocket

thrust-vector control

(Show more)

See all related content →

Recent News

Feb. 19, 2024, 3:30 AM ET (Jerusalem Post)

IDF soldiers eliminate terrorist minutes after rocket launch detected

rocket, any of a type of jet-propulsion device carrying either solid or liquid propellants that provide both the fuel and oxidizer required for combustion. The term is commonly applied to any of various vehicles, including firework skyrockets, guided missiles, and launch vehicles used in spaceflight, driven by any propulsive device that is independent of the atmosphere. General characteristics and principles of operation Ares I-X test rocket; Constellation programThe Constellation program's Ares I-X test rocket lifting off from Launch Complex 39-B at NASA's Kennedy Space Center at Cape Canaveral, Fla., Oct. 28, 2009.(more)The rocket differs from the turbojet and other “air-breathing” engines in that all of the exhaust jet consists of the gaseous combustion products of “propellants” carried on board. Like the turbojet engine, the rocket develops thrust by the rearward ejection of mass at very high velocity. Launch of the AC-6 Atlas-Centaur rocket from Cape Canaveral, Florida, Aug. 11, 1965, which placed a dynamic model of the Surveyor spacecraft into a simulated lunar transfer orbit.The fundamental physical principle involved in rocket propulsion was formulated by Sir Isaac Newton. According to his third law of motion, the rocket experiences an increase in momentum proportional to the momentum carried away in the exhaust,where M is the rocket mass, ΔvR is the increase in velocity of the rocket in a short time interval, Δt, m° is the rate of mass discharge in the exhaust, ve is the effective exhaust velocity (nearly equal to the jet velocity and taken relative to the rocket), and F is force. The quantity m°ve is the propulsive force, or thrust, produced on the rocket by exhausting the propellant,Evidently thrust can be made large by using a high mass discharge rate or high exhaust velocity. Employing high m° uses up the propellant supply quickly (or requires a large supply), and so it is preferable to seek high values of ve. The value of ve is limited by practical considerations, determined by how the exhaust is accelerated in the supersonic nozzle and what energy supply is available for the propellant heating.

Britannica Quiz

36 Questions from Britannica’s Most Popular Science Quizzes

Most rockets derive their energy in thermal form by combustion of condensed-phase propellants at elevated pressure. The gaseous combustion products are exhausted through the nozzle that converts most of the thermal energy to kinetic energy. The maximum amount of energy available is limited to that provided by combustion or by practical considerations imposed by the high temperature involved. Higher energies are possible if other energy sources (e.g., electric or microwave heating) are used in conjunction with the chemical propellants on board the rockets, and extremely high energies are achievable when the exhaust is accelerated by electromagnetic means. The effective exhaust velocity is the figure of merit for rocket propulsion because it is a measure of thrust per unit mass of propellant consumed—i.e.,

Get a Britannica Premium subscription and gain access to exclusive content.

Subscribe Now

Values of ve are in the range 2,000–5,000 metres (6,500–16,400 feet) per second for chemical propellants, while values two or three times that are claimed for electrically heated propellants. Values beyond 40,000 metres (131,000 feet) per second are predicted for systems using electromagnetic acceleration. In engineering circles, notably in the United States, the effective exhaust velocity is widely expressed in units of seconds, which is referred to as specific impulse. Values in seconds are obtained by dividing the effective exhaust velocities by the constant factor 9.81 metres per second squared (32.2 feet per second squared). In a typical chemical-rocket mission, anywhere from 50 to 95 percent or more of the takeoff mass is propellant. This can be put in perspective by the equation for burnout velocity (assuming gravity-free and drag-free flight),In this expression, Ms/Mp is the ratio of propulsion system and structure mass to propellant mass, with a typical value of 0.09 (the symbol ln represents natural logarithm). Mp/Mo is the ratio of propellant mass to all-up takeoff mass, with a typical value of 0.90. A typical value for ve for a hydrogen–oxygen system is 3,536 metres (11,601 feet) per second. From the above equation, the ratio of payload mass to takeoff mass (Mpay/Mo) can be calculated. For a low Earth orbit, vb is about 7,544 metres (24,751 feet) per second, which would require Mpay/Mo to be 0.0374. In other words, it would take a 1,337,000-kg (2,948,000-pound) takeoff system to put 50,000 kg (110,000 pounds) in a low orbit around Earth. This is an optimistic calculation because equation (4) does not take into account the effect of gravity, drag, or directional corrections during ascent, which would noticeably increase the takeoff mass. From equation (4) it is evident that there is a direct trade-off between Ms and Mpay, so that every effort is made to design for low structural mass, and Ms/Mp is a second figure of merit for the propulsion system. While the various mass ratios chosen depend strongly on the mission, rocket payloads generally represent a small part of the takeoff mass. Pegasus XL rocketThe second stage (right) of the Orbital Sciences Pegasus XL rocket ready to be mated to the first stage (left) for the launch of NASA's Aeronomy of Ice in the Mesosphere (AIM) spacecraft. (more)A technique called multiple staging is used in many missions to minimize the size of the takeoff vehicle. A launch vehicle carries a second rocket as its payload, to be fired after burnout of the first stage (which is left behind). In this way, the inert components of the first stage are not carried to final velocity, with the second-stage thrust being more effectively applied to the payload. Most spaceflights use at least two stages. The strategy is extended to more stages in missions calling for very high velocities. The U.S. Apollo manned lunar missions used a total of six stages. The unique features of rockets that make them useful include the following: 1. Rockets can operate in space as well as in the atmosphere of Earth. 2. They can be built to deliver very high thrust (a modern heavy space booster has a takeoff thrust of 3,800 kilonewtons (850,000 pounds). 3. The propulsion system can be relatively simple. 4. The propulsion system can be kept in a ready-to-fire state (important in military systems). 5. Small rockets can be fired from a variety of launch platforms, ranging from packing crates to shoulder launchers to aircraft (there is no recoil).

These features explain not only why all speed and distance records are set by rocket systems (air, land, space) but also why rockets are the exclusive choice for spaceflight. They also have led to a transformation of warfare, both strategic and tactical. Indeed, the emergence and advancement of modern rocket technology can be traced to weapon developments during and since World War II, with a substantial portion being funded through “space agency” initiatives such as the Ariane, Apollo, and space shuttle programs.

Linux容器家族之Rocket_rocket linux是什么-CSDN博客

>

Linux容器家族之Rocket_rocket linux是什么-CSDN博客

Linux容器家族之Rocket

VIP文章

jsky_studio

于 2015-05-09 12:20:28 发布

阅读量3.4k

收藏

点赞数

分类专栏:

资源隔离(Cgroup/Docker/Rocket)

文章标签:

go语言

rocket

rkt

docker

linux容器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/jsky_studio/article/details/45600297

版权

Rocket代码:  https://github.com/coreos/rkt

Rocket ( 也叫rkt,Go语言实现 ) 是一个类似Docker的命令行工具。她可以打包应用和依赖包到可移植容器中,简化搭环境等部署工作。

Rocket  的开发者认为,现在的Docker社区背离了当初设计Docker的初衷:即一个可复用的标准Linux容器。

Rocket设计目标就是希望再次实现这个初衷, 当然,它也兼容Docker(rkt可以执行 Docker镜像)。

"Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。"

虽然Docker和Rocket之争最近很火热,我觉得还是各有优点吧。

不同企业有各自的应用场景,或许有些企业认为Rocket就足够了,而不需要Docker那样复杂厚重的平台。

换个思路说,或许Docker已经威胁到某些巨头的云平台产品,所以他们要用Rocket来打击下Docker 。毕竟他们可以在自己的云平台产品中集成Rocket,  避免自家产品被Docker彻底取代了:-) 这个思路有点腹黑哈,各位看官见谅。

Go语言安装下载:

国内镜像:   

最低0.47元/天 解锁文章

优惠劵

jsky_studio

关注

关注

0

点赞

0

收藏

觉得还不错?

一键收藏

知道了

0

评论

Linux容器家族之Rocket

Rocket代码:  https://github.com/coreos/rktRocket ( 也叫rkt,Go预言实现 ) 是一个类似Docker的命令行工具。她可以打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket  的开发者认为,现在的Docker社区背离了当初设计Docker的初衷:即一个可复用的标准Linux容器。Rocket设计目标就是希望再次实现

复制链接

扫一扫

专栏目录

参与评论

您还未登录,请先

登录

后发表或查看评论

jsky_studio

CSDN认证博客专家

CSDN认证企业博客

码龄10年

暂无认证

55

原创

18万+

周排名

183万+

总排名

27万+

访问

等级

2798

积分

15

粉丝

14

获赞

10

评论

35

收藏

私信

关注

热门文章

elasticsearch去重计数(distinct)

45953

maven工程里编译运行main函数出错:“ You must specify a valid lifecycle phase or a goal in the format”

17396

Kafka重启出错:Corrupt index found,

15917

Spark通过YARN-client提交任务不成功

13025

Kafka源码中的Producer Record定义

10346

分类专栏

Hadoop

4篇

数据挖掘

2篇

Kafka

12篇

Storm

6篇

Spark

11篇

Flume

1篇

Web开发

11篇

资源隔离(Cgroup/Docker/Rocket)

1篇

开发语言/工具

9篇

文件系统

4篇

操作系统

5篇

zookeeper

2篇

Elasticsearch

3篇

hbase

2篇

最新评论

如何解决Kerberos问题: "Server has invalid Kerberos principal: hdfs/host2@****.COM"

骑着蜗牛向前跑:

你们这帮垃圾,抄答案的时候给别人钱了吗!还 vip,向钱想疯了吧

flume如何向kafka写数据

一个野生钢铁胖子:

213

Kafka重启出错:Corrupt index found,

TNTZS666:

博主你好,kafka启动时加载log这些步骤是必须的吗,环境数据较大的时候发现等待其加载完再注册到zk上耗时很久,请问下有什么办法可以优化吗

Spark应用如何访问带Kerberos认证的CDH Hadoop集群

shirely_missA:

说的太简单了

elasticsearch去重计数(distinct)

qq_35101639

回复

当初就不该下凡:

是的,不准确,很稳健

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

JVM原理及优化

elasticsearch去重计数(distinct)

elasticsearch扩容和机器下线

2016年8篇

2015年38篇

2014年23篇

目录

目录

分类专栏

Hadoop

4篇

数据挖掘

2篇

Kafka

12篇

Storm

6篇

Spark

11篇

Flume

1篇

Web开发

11篇

资源隔离(Cgroup/Docker/Rocket)

1篇

开发语言/工具

9篇

文件系统

4篇

操作系统

5篇

zookeeper

2篇

Elasticsearch

3篇

hbase

2篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

RocketMQ · 官方网站 | RocketMQ

RocketMQ · 官方网站 | RocketMQ

Skip to main contentApache RocketMQGitHubEnglish简体中文EnglishDocs5.04.xDownloadBlogUser CasesActivityChange LogRocketMQ NewsCommunityJoin CommunityOriginTeamsContributionsEnterprisesSearchApache RocketMQRocketMQ 5.0: A cloud-native "messaging, eventing, streaming" real-time data processing platform, covering cloud-edge-device collaboration scenariosStar  ForkQuick StartRocketMQ 5.0 IntroCore CapabilitiesCloud NativeBorn with the cloud, grow with the cloud, infinitely elastic expansion and contraction, K8s friendlyHigh ThroughputTrillion-level throughput guarantee to meet both microservice and big data scenariosStream ProcessingLightweight, high availability, high performance stream computing engineFinance OrientedFinancial-grade stability, widely used in transaction core linksLightweight ModelZero external dependencies, Shared-nothing architectureEco FriendlySeamlessly connects to microservices, real-time computing, data lake and other surrounding ecologiesEcosystemIoTSupports massive Topic requirements, covering cloud-edge-device collaboration scenariosConnectConfigurable and low-code way to integrate data, connect with any system, and build streaming ETL, data pipeline, data lake, etc.MicroserviceRich message type support and management to meet Serverless scenarios with message granularity load balancing Join CommunitySubscribe to email groups, follow blog posts and participate in eventsJoin CommunityContribute GuideLearnIntroductionInstallationMigration from 4.x to 5.0CommunityTwitterGithubHelpMoreBlogChangelogGitHubTwitterLegalLicensesSecurityThanksSponsorshipCopyright © 2022 The Apache Software Foundation. Licensed under the Apache License, Version 2.0.

rocket(英语单词)_百度百科

et(英语单词)_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心rocket是一个多义词,请在下列义项上选择浏览(共10个义项)展开添加义项rocket播报讨论上传视频英语单词收藏查看我的收藏0有用+10rocket,英语单词,名词、动词,作名词时意为“火箭;火箭武器;烟花;芝麻菜”。作动词时意为“迅速增加;飞速移动;迅速成功;用火箭武器攻击;用火箭运载”。外文名rocket词    性名词、动词目录1单词发音2短语搭配3双语例句单词发音播报编辑英[ˈrɒkɪt]美[ˈrɑːkɪt] [1]短语搭配播报编辑Rocket jumping火箭跳Rocket Knight火箭骑士 ; 英文名称 ; 硬盘版 ; 火箭Modular rocket公共核心助推器Relativistic rocket相对论火箭fusion rocket核聚变火箭 ; 热核火箭carrier rocket[航]运载火箭 ; 搭载火箭 ; 运载工具 [1]双语例句播报编辑But for me fame is like rocket fuel.但是对我来说,名气就像火箭燃料。I live far away. I live on a star. Take my rocket.我住的很远。我住在一个星星上。乘坐我的火箭吧。 [1]新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

Docker的对手来了:CoreOS发布新款容器引擎Rocket-coreos docker

Docker的对手来了:CoreOS发布新款容器引擎Rocket-coreos docker

51CTO首页内容精选博客学堂精品班直播训练营企业培训CTO训练营鸿蒙开发者社区WOT全球技术创新大会

公众号矩阵

移动端

注册/登录 短视频免费课程课程排行直播课软考学堂全部课程厂商认证IT技术2024年软考PMP项目管理软考资讯在线学习CTO训练营技术经理研习营LeaTech峰会文章资源问答课堂专栏直播 51CTO 鸿蒙开发者社区 51CTO技术栈 51CTO官微 51CTO学堂 51CTO博客 CTO训练营 鸿蒙开发者社区订阅号 51CTO题库小程序 51CTO学堂APP 51CTO学堂企业版APP 鸿蒙开发者社区视频号 账号设置 退出 内容精选视频话题短视频技术期刊活动 社区编辑申请 我关注的话题 我收藏的文章 账号设置 退出

注册/登录 Docker的对手来了:CoreOS发布新款容器引擎Rocket 作者:Retric 2014-12-03 10:13:01 云计算 Docker 刚问世就红透半边天,不仅拿了融资,还得到了Google等巨头的支持。CoreOS此前一直忙于为 Docker 提供技术支持服务,似乎准备好好沾沾 Docker 的光,现在看来它另有一番打算:据gigaom.com的消息,昨天 CoreOS在Github上发布了一款容器引擎竞争产品原型Rocket,意在和 Docker 抢抢风头。 [[123617]]

Docker 刚问世就红透半边天,不仅拿了融资,还得到了Google等巨头的支持。CoreOS此前一直忙于为 Docker 提供技术支持服务,似乎准备好好沾沾 Docker 的光,现在看来它另有一番打算:据gigaom.com的消息,昨天 CoreOS在Github上发布了一款容器引擎竞争产品原型Rocket,意在和 Docker 抢抢风头。

Rocket 是一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。CoreOS 的 CEO Alex Polvi 在官方博文里介绍道,Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。

Alex Polvi 认为,由于 Docker 貌似已经从原本做 " 业界标准容器 " 的初心转变成打造一款以容器为中心的企业服务平台,CoreOS 才决定开始推出自己的标准化产品。

CoreOS 把它的容器称为 App Containers,里面包含 app container image、runtime、container-discovery 协议等。其中,App Container Image 和 Docker 里的 Image 比较类似,包含应用必需的元素组成,如源代码和二进制文件。Rocket runtime 则是依照 App Container 标准规格打造的,旨在将容器真正的变成一款命令行工具。

Polvi 表示,Docker 在安全性和可组合性方面是有根本上的缺陷的,而 Rocket 的设计原型就是为了弥补这些缺陷。

事实上 Docker 在最近发布的几个版本里都关注于安全性上,但这对于一个旨在适应大规模企业应用的工具来说实在很正常。

CoreOS 的联合创始人兼 CTO Brandon Philips 目前是 Dcoker 管理委员会的成员,CoreOS 打算继续支持 Docker 项目,但是当 Rocket 逐渐成熟之后,他们将重新评估是否继续参与贡献。

在 CoreOS 这一官方博文发布之后,Docker 的 Ben Golub 写了一篇博文回应,称“虽然我们对 CoreOS 那篇文章里的某些观点和修辞不太同意,但我们还是希望大家可以一起朝着为开发者和用户做出真正***的产品的方向前进。”

原文出自:http://www.36kr.com/p/217466.html 责任编辑:Ophira

来源:

36Kr Docker容器技术RocketCoreOS 分享到微信 微信扫码分享 分享到微博 相关推荐 CoreOS 称 Docker 有根本性缺陷,推出自己的容器引擎 Rocket Docker容器是目前最热的容器技术之一,而CoreOS则是基于Linux的操作系统,主要用于大规模的服务器发布。CoreOS使用Docker容器构建其服务,并对Docker项目做出巨大贡献。但今天该公司宣布正在开发自己的容器引擎Rocket,因为其不同意Docker的发展方向。 2014-12-02 09:22:05 Docker容器技术Rocket Docker 在 CoreOS 的 Rocket 发布之后的一些最初想法 就像Docker是开源的,并遵守Apache开源协议,人们可以自由使用,修改,或者为了自己的需求进行改造。他们可以只把Docker作为一个简单的容器。他们可以自由的将更高级别的服务加入到Docker。当然他们也可以自由的推广另外一种概念作为新标准,就像Rocket团队已经做的那样。 2015-01-13 09:20:08 DockerCoreOSRocket Rocket 要以硬件隔离引潮流,Docker说” NO” CoreOS,利用Docker的许多idea,打造了另一个容器系统Rocket。一直高调宣传以安全和简单来标榜自己的容器特性,Rocket0.8(又名rkt)带来了基于Intel工程设计特性,CoreOS声称在其他容器上暂时还没有发现。 2015-08-25 10:59:34 Rocket 硬件隔离Docker 容器上使用Docker还是Rocket?为什么不一起用呢? 容器技术异军突起,在2014年接近尾声时,CoreOS在Docker发布了Rocket,声称Docker的流程模型有着“根本性的缺陷”。虽然CoreOS的创始人AlexPolvi尽量缓和语气,但是他坚持自己的基本观点,Docker不再是构建系统的最佳组件。不过,CoreOS的Plovi和Docker的创始人SolomonHykes在一点上有着共识:Rocket和Docker实际上不是竞争关系。 2015-01-08 09:18:25 DockerRocket容器技术 CoreOS发布开源容器漏洞分析工具Clair Quay的SecurityScanning(安全扫描)功能beta版本的就是基于Clair做的。这个新功能目前运行在Quay上,可以对Quay平台上存储的数百万计的容器的进行安全漏洞检查。现在,Quay用可以登录后台,在控制面板看到有关于SecureScanning的信息,信息包含仓库中可能有漏洞威胁的容器列表。QuaySecurityScanning的beta发布公告里面有对于Quay用户更详细的信息。 2015-11-17 09:46:29 CoreOS开源漏洞分析 Docker 1.3.3/1.4.0 发布,Linux 容器引擎 Docker1.3.3发布,此外在Github上同时也看到1.3.3版本之后的5个小时发布了Docker1.4.0版本。 2014-12-12 11:29:02 DockerLinux 为什么CoreOS和Docker的分手是命中注定 关于Docker是否应该扩大产品的边界以扩张CoreOS的集群管理范围的争论由来已久,这也直接导致了CoreOS开发了自己的容器Rocket来与Docker争雄。 2014-12-05 10:10:44 DockerRocketCoreOS 专访马全一: Docker正走在成为领域标准的路上 凭借其方便的可移植性和开源Linux容器引擎,Docker在云计算领域的人气飙升。最近CoreOS开发了自己的Linux容器项目Rocket,当Docker遇到Rocket,这两款AppContainer的产品到底谁能胜出?51CTO记者专访Docker中文社区&docker.cn创始人之一马全一老师,看看他预期中的Docker明天的故事,应该会落下怎样的一笔。 2014-12-25 23:15:57 docker中文社区docker容器 容器大战升级:Google宣布支持CoreOS容器 很多人都说Docker可能已经成为容器大战的胜利者,但CoreOS并不这么认为。在5月4日的举行的CoreOSFest大会上,CoreOS宣布了它的新的合作伙伴:RedHat、Google、Vmware及Apcera。随着这些大牌公司的加入,CoreOS也许会拥有更多的话语权,未来的世界是什么样的,让我们拭目以待。 2015-05-05 14:16:22 容器技术CoreOSGoogle Docker vs.Rocket vs.Odin:容器技术终极比拼 容器已经在网络领域掀起了一股潮流,其所带来的轻量化、更为灵活的效果足以作为传统虚拟机系统的替代方案。本文全面审视了Docker、Rocket、Odin这三种利用容器作为虚拟机系统替代方案的方式。 2015-08-10 09:21:23 技术选型之Docker容器引擎 最近对Docker和Kubernetes进行了一番学习,前两天做了一次技术分享,回去听了一遍自己演讲的录音,发现单单PPT做好还是远远不够的,没有提前准备好逻辑严谨的讲稿,在讲的时候出现了卡壳、漏掉技术点、逻辑矛盾的问题。 2019-12-12 10:58:37 Docker容器引擎 新容器引擎崛起,Docker地位不保 Podman是一种无守护进程的容器引擎,旨在使用开放容器倡议(OCI)容器和容器映像轻松查找、运行、构建、共享和部署应用程序。 2023-11-23 16:49:56 容器PodmanDocker Google Cloud Platform 加入支持 Docker 的容器引擎 在GoogleCloudPlatformLive会议上,刚从RedHat加入Google的副总裁BrianStevens公开了支持Docker的容器引擎。继Azure之后,Docker又顺利拿下一城,它会成为通用标准吗? 2014-11-06 10:18:10 googleDocker CoreOS,一款Linux容器发行版 CoreOS,一款最新的Linux发行版本,支持自动升级内核软件,提供各集群间配置的完全控制。 2017-08-11 10:38:12 LinuxCoreOS发行版 Radware发布业界新款攻击缓解系统 虚拟数据中心和云数据中心应用交付及应用安全解决方案提供商Radware(NASDAQ:RDWR)日前发布了业界首款全面集成的IT安全战略解决方案Radware攻击缓解系统(AttackMitigationSystem,AMS),实时保护基础设施和网络应用免受宕机、应用漏洞攻击、恶意软件传播、信息窃取、web服务攻击以及web篡改的困扰。 2011-09-23 18:12:41 Docker 1.6发布 面向Windows的Docker客户端来了! Docker1.6版本发布了,一同发布新版本的还有Registry2.0、Compose、Swarm、Machine以及DockerWindows客户端,这次的变更很赞,值得一试! 2015-04-17 16:00:57 Docker1.6Windows客户端 Linux开源容器Docker 0.7发布 出自PaaS服务dotCloud的Linux容器开源项目Docker,已经成为目前业界最关注的新兴开源项目之一,近来也是开源社区的重兵云集之地,开发进展迅速。 2013-12-02 10:50:17 开源Linux容器Docker 传谷歌下月将发布新款谷歌电视 北京时间4月30日凌晨消息,尽管第一代谷歌电视(GoogleTV)或许并不成功,但是谷歌日前已经研发出了新一代谷歌电视,并可能将在下个月举行的谷歌IO大会上正式推出。 2011-04-30 16:18:49 AndroidGoogle TV智能电视 苹果发布新款GPU加速工具Create ML 苹果于今天在加利福尼亚圣何塞举行了2018年度全球开发者大会,会上公布了四大系统更新+四大基础技术更新,四大系统iOS12、watchOS5、tvOS12、macOSMojave分别进行了不同程度的更新,Metal、CreateML、CoreML2、iOSmacOS四大基础技术也随之更新。 2018-06-05 11:32:21 CreateML人工智能GPU Fedora CoreOS 入门 FedoraCoreOS(FCOS)是由CoreOSContainerLinux和FedoraAtomicHost合并而来。它是一个专注于运行容器化应用程序的精简的独体操作系统。安全性是首要重点,FCOS提供了自动更新,并带有SELinux强化。 2020-12-13 08:25:32 FedoraCoreOSLinux 相似话题 IaaS 257内容 PaaS 373内容 SaaS 697内容 云原生 1355内容 全部话题 同话题下的热门内容 K8s 到底是什么,架构是怎么样的?CVPR 2024 满分论文 | Deformable 3D Gaussian:基于可变形3D高斯的高质量单目动态重建新方法如何基于Docker镜像逆向生成DockerfileKubernetes集群如何用Ipvs替换Iptables成功实施私有云战略的四个步骤CKA认证必备:掌握K8s网络策略的关键要点探索Kubernetes 1.28调度器OOM的根源2024年你应该关注的五个Kubernetes趋势 相关专题 更多 乘云 · 向未来:火山引擎公共云 · 城市分享会 点击获取2023年泛娱乐社交出海报告 2024-02-28 10:46:45 网络运维智能化?瞻博网络有奇招! 2023-12-18 11:43:34 我收藏的内容 微博 QQ 微信 复制链接 微信扫码分享 51CTO业务 媒体 51CTOCIOAgeHC3iTechplur社区 51CTO博客软考资讯鸿蒙开发者社区教育 51CTO学堂精培企业培训CTO训练营 51CTO学堂 51CTO学堂企业版 51CTO官微 51CTO 关于我们&条款 关于我们 站点地图 网站大事 意见反馈 English 用户协议 隐私协议

北京市海淀区中关村南1条甲1号ECO中科爱克大厦6-7层

北京市公安局海淀分局备案编号:110108002980号

营业执照

京ICP备09067568号

Copyright © 2005-2024 51CTO.COM

京ICP证060544 版权所有 未经许可 请勿转载

友情链接 新浪科技腾讯科技网易科技凤凰科技驱动科技科技行者TechWeb艾瑞网站长之家速途网中国经济新闻网IT之家工联网极客公园236视频会议中国IDC圈企业网D1Net投资界次方元火山引擎 51CTO技术栈公众号 51CTO技术栈公众号

业务

速览

在线客服 媒体 51CTO CIOAge HC3i 社区 51CTO博客 鸿蒙开发者社区 教育 51CTO学堂 精培 企业培训 CTO训练营

丁锋---中国科学院地质与地球物理研究所

丁锋---中国科学院地质与地球物理研究所

 

贵阳分部 │ 广州分部网站地图│联系我们│所长信箱│建议留言│内部网│English│中国科学院

 

 

首页 │ 概况简介 │ 机构设置 │ 研究队伍 │ 科研成果 │ 实验观测 │ 合作交流 │ 研究生教育 │ 学会学报 │ 图书馆 │ 党群工作 │ 创新文化 │ 科学传播 │ 信息公开

 

研究队伍

两院院士

杰出青年

优秀青年

青促会会员

科研系列

研究员

特聘副研究员

副研究员

技术系列

正高级工程师

副高级岗位

博士后

人才招聘

 

您现在的位置:首页 > 研究队伍

姓名:

丁锋

性别:

职称:

研究员

学位:

博士

电话:

010-82998799

传真:

010-62010846

Email:

dingf@mail.iggcas.ac.cn

邮编:

100029

地址:

北京朝阳区北土城西路19号,中科院地质与地球物理研究所

更多信息:

【English】 地球与行星物理院重点实验室 地球与行星电离层学科组

 

简历:

丁锋,研究员,博士生导师,中国科学院大学岗位教授。研究方向为电离层物理和中高层大气。湖北省麻城市人。2001年毕业于中科院武汉物理与数学研究所,获空间物理学博士学位;2003年进入中科院地质与地球物理研究所。

 

学科类别:

空间物理学

 

研究方向:

电离层物理

 

职务:

 

社会任职:

 

承担科研项目情况:

主持的在研课题:

电离层行进式扰动多波场结构观测研究,编号41974169,国家自然基金委面上项目,2020-2023年;

电离层对大气波动的响应,中科院重大科技基础设施开放研究项目课题,2017-2021年;

基于全球GNSS接收机布阵观测的电离层扰动精细结构研究,编号41574151,国家自然基金委面上项目,2016-2019年;

 

获奖及荣誉:

 

代表论著:

Ge Chen, Feng Ding*, Weixing Wan Lianhuan Hu, Xiukuan Zhao, Jianyong Li (2020), Structures of multiple large-scale traveling ionospheric disturbances observed by dense Global Navigation Satellite System networks in China, J. Geophys. Res. Space Physics, 125, e2019JA027032.  https://doi.org/10.1029/2019JA027032.

Liu Haitao*, Feng Ding*, Xinan Yue, Biqiang Zhao, Qian Song, Weixing Wan, and Keke Zhang  (2018), Depletion and traveling ionospheric disturbances generated by two launches of China’s Long March 4B rocket, J. Geophys. Res.: Space Physics, 123, 10,319–10,330. https://doi.org/10.1029/2018JA026096.

Liu Haitao, Feng Ding*, Biqiang Zhao, Jianyong Li, Lianhuan Hu, Weixing Wan, and Baiqi Ning (2017), Ionospheric response following the Mw 7.8 Gorkha earthquake on 25 April 2015, J. Geophys. Res. Space Physics, 122, 6495–6507, doi:10.1002/2016JA023079.

Ding Feng*, Tian Mao, Lianhuan Hu, Baiqi Ning, Weixing Wan, and YungangWang (2016), GPS network observation of traveling ionospheric disturbances following the Chelyabinsk meteorite blast, Ann. Geophys., 34, 1045–1051, doi:10.5194/angeo-34-1045-2016.

Song Qian, Feng Ding*, Tao Yu, Weixing Wan, Baiqi Ning, Libo Liu, and Biqiang Zhao (2015), GPS detection of the coseismic ionospheric disturbances following the 12 May 2008 M7.9 Wenchuan earthquake in China, Sci. China Earth Sci., 58(1): 151–158.

Ding F., W. Wan, T. Mao, M. Wang et al,. Ionospheric response to the shock and acoustic waves excited by the launch of the Shenzhou 10 spacecraft, Geophys. Res. Lett., 41, 3351–3358, doi: 10.1002/2014GL060107, 2014.

Ding, F., W. Wan, Q. Li, R. Zhang, Q. Song, B. Ning, L. Liu, B. Zhao, and B. Xiong, Comparative climatological study of large-scale traveling ionospheric disturbances over North America and China in 2011–2012, J. Geophys. Res., 119, 519–529, doi:10.1002/2013JA019523, 2014.

Ding F., W. Wan, B. Ning, B. Zhao, Q. Li, Y. Wang, L. Hu, R. Zhang, and B. Xiong, Observations of poleward-propagating large-scale traveling ionospheric disturbances in southern China, Ann. Geophys., 31, 377–385, 2013.

Ding F, Weixing Wan, Baiqi Ning, et al. Two-dimensional imaging of large-scale traveling ionospheric disturbances over China based on GPS data, J. Geophys. Res., 117,A08318, doi:10.1029/2012JA017546, 2012.

Ding, F., W. Wan, G. Xu, T. Yu, G. Yang, and J. Wang.  Climatology of medium‐scale traveling ionospheric disturbances observed by a GPS network in central China, J. Geophys. Res., 116, A09327, doi:10.1029/2011JA016545, 2011.

Ding F., W. Wan, B. Ning and L. Liu et al. GPS TEC response to the 22 July 2009 total solar eclipse in East Asia, J. Geophys. Res. 115, A07308, doi:10.1029/2009JA015113., 2010.

丁锋, 万卫星 (2010), 月球电离层探测与研究, 地球化学,39(1),11-14.

Ding, F., W. Wan, L. Liu, E. L. Afraimovich, S. V. Voeykov, and N. P. Perevalova, A statistical study of large-scale traveling ionospheric disturbances observed by GPS TEC during major magnetic storms over the years 2003–2005, J. Geophys. Res., 113, A00A01, doi:10.1029/2008JA013037, 2008.

Ding F., W. Wan, B. Ning and M. Wang, Large scale traveling ionospheric disturbances observed by GPS TEC during the magnetic storm of October 29-30, 2003, J. Geophys. Res. 112, A06309, doi:10.1029/2007JA012013, 2007

Ding, F., Yuan, H., Wan, W., Reid, I. M., and Woithe, J. M. (2004) Occurrence characteristics of medium-scale gravity waves observed in OH and OI nightglow over Adelaide (34.5°S, 138.5°E). J. Geophys. Res., 109, D14104, doi:10.1029/ 2003JD004096.

Ding F., W. Wan and H. Yuan, The influence of background winds and attenuation on the propagation of atmospheric gravity waves, J. Atmos. Solar Terr. Phys., 65, 857-869, 2003.

Song, Q., F. Ding, W. Wan, B. Ning, L. Liu, B. Zhao, Q. Li, and R. Zhang, Statistical study of large-scale traveling ionospheric disturbances generated by the solar terminator over China, J. Geophys. Res., 118, doi:10.1002/jgra.50423, 2013.

Song Q., F. Ding, W. Wan, B. Ning, and L. Liu, (2012) Global propagation features of large-scale traveling ionospheric disturbances during the magnetic storm of 710 November 2004, Ann. Geophys., 30, 683–694, 2012.

Song Q,F. Ding,W. Wan,et al.(2011) Monitoring nighttime medium-scale traveling ionospheric disturbances using the GPSnetwork over North America.Chinese J.Geophys.(in Chinese),  54(4):935- 941,DOI: 10. 3969/j. issn. 0001-5733. 2011. 04. 007.

Afraimovich E. L., F. Ding, Vladislav V. Kiryushkin1, and Elvira I. Astafyeva, Near-field TEC response to the main shock of the 2008 Wenchuan Earthquake, Earth Planets Space, 62, 899–904, 2010.

Afraimovich E.L., F. Ding, V. Kiryushkin, et al., TEC response to the 2008 Wenchuan earthquake in comparison with other strong earthquakes. International J. Remote Sensing, 31(13), DOI:10.1080/ 01431161003727747, 2010.

Wang Min, Ding Feng, and Wan Weixing et al. GPS observations of TID events generated by the moving solar terminator, Chinese Journal of Geophysics, 52(5):1146~1155, 2009.

Jiang Kui, Ding Feng, and Wan Weixing, The observations of atmospheric gravity waves in airglow over Adelaide (34.5oS,138.5oE), Chinese Journal of Space Science (in Chinese), 27(6): 496-502, 2007

Min Wang, Feng Ding, Weixing Wan, Baiqi Ning, and Biqiang Zhao. Monitoring global traveling ionospheric disturbances using the worldwide GPS network during the October 2003 storms, Earth, Planets and Space, 59, 1-13, 2007.

 

地址:北京市朝阳区北土城西路19号 邮 编:100029 电话:010-82998001 传真:010-62010846

版权所有© 2009 中国科学院地质与地球物理研究所

备案序号:京ICP备05029136号

时间序列分类-Rocket到MiniRocket再到MultiRocket - 知乎

时间序列分类-Rocket到MiniRocket再到MultiRocket - 知乎切换模式写文章登录/注册时间序列分类-Rocket到MiniRocket再到MultiRocketdaydaymoyu天天摸鱼时间序列分类(time series classification)一直是数据挖掘领域研究的主题之一,在工业中有广泛的应用,这里介绍三个近期的时序分类方法,Rocket、MiniRocket及MultiRocket。ROCKET: exceptionally fast and accurate time series classification using random convolutional kernelsData Mining and Knowledge Discovery, 2020Paper: https://link.springer.com/article/10.1007/s10618-020-00701-zCode: https:// github.com/angus924/rocket.[Abstract] 大多数存在的时序分类方法依赖于单一类型的特征,比如形状shape或者频率frequency。而最近使用随机卷积核的简单线性分类器方法(simple linear classifiers using random convolutional kernels)以较小的计算负担实现了最先进的精度。[Introduction] 提出一种方法,称为Rocket (RandOm Convolutional KErnel Transform)。该方法利用随机卷积核将时序数据首先进行变换,然后变换的特征训练一个线性分类器。这种方法首先在UCR archive 数据集上取得了最好的效果,其次需要的训练时间也比现有的方法更少。在85个数据集上的总共计算时间为1h40min,而cBOSS方法需要19h33min,而InceptionTime网络需要6days。[Method] Rocket使用大量随机卷积核变换时间序列,这里的随机卷积核表示随机的大小、权重、偏置等,然后利用转换后的特征训练线性分类器。相比与先前使用卷积核在时序数据中的工作,Rocket有几点不同:Rocket 使用了非常多的卷积核,由于不需要学习权重,因此计算卷积的成本很低,可以使用非常多的卷积核,而计算成本相对较低。Rocket 使用了大量不同的卷积核。与典型的卷积神经网络相比,内核卷积核共享相同的大小、扩展和填充是很常见的,对于 Rocket,每个卷积核具有随机长度、扩展和填充,以及随机权重和偏差。Rocket 关键地使用了kernel dilation。Rocket为每个卷积核的dilation进行随机采样,产生各种各样的kernel dilation,用于捕获不同频率和尺度的模式。除了使用生成的特征图的最大值(类似于全局最大池化)之外,Rocket 还使用了一个额外的特征:正值的比例(the proportion of positive values (or ppv))。这使分类器能够对时间序列中给定模式的出现频率进行加权计算。Rocket给出了随机设定卷积核的方式,具体参数包括{Length, Weights, Bias, Dilation, Padding, Stride}。具体的设定方式请看原文。其次Rocket 的每个卷积核产生两个特征,ppv and max 。具体是最大值(maximum value)和正直的比例(proportion of positive values),其中 ppv(Z)=\frac{1}{n}\sum_{i=0}^{n-1}{[z_i>0]} , Z 表示卷积操作的输出。Limitations: 首先是Rocket的限制是需要大量的卷积核才能取得较好的分类准确率。其次的限制是,在使用固定的随机卷积核时,对于非常大的数据集,学习可能会在某些时候“饱和”。猜测可能是随着数据集的增大,精度没有明显的提高。第三点是Rocket目前是仅仅为单变量的时序数据设计,而对多元时间序列的扩展以及 Rocket 在非常大的数据集上的应用是未来工作的重点。MiniRocket: A Very Fast (Almost) Deterministic Transform for Time Series Classification AngusKDD '21: Proceedings of the 27th ACM SIGKDD Conference on Knowledge Discovery & Data Mining, 2021Paper: Proceedings of the 27th ACM SIGKDD Conference on Knowledge Discovery & Data MiningCode: GitHub - angus924/minirocket: MINIROCKET: A Very Fast (Almost) Deterministic Transform for Time Series Classification[Abstract] 在Rocket的基础上进行改进,提出MiniRocket, MiniRocket 在更大的数据集上比 Rocket 快 75 倍,同时保持基本相同的准确性。使用这种方法,可以在 10 分钟内对来自 UCR 数据集的所有 109 个数据集的分类器进行训练和测试,以达到最先进的准确度。[Introduction] 与Rocket一致,MiniRocket 使用卷积核,并使用转换后的特征来训练线性分类器。然而,与 Rocket 不同的是,MiniRocket 使用一组小的、固定的卷积核,并且几乎完全是确定性的,而不是Rocket中的随机卷积核。MiniRocket保留了Rocket中的两个特征:ppv and max 。[Method]相比与Rocket,MiniRocket在一些参数的设定上进行了关键的调整,对比如下表所示。Summary ofchanges fromRocket to MiniRocketLength: 卷积核的长度统一设定为9;Weights: 权重被限制为两个数, \alpha=-1 和 \beta=2 。而卷积核表示为 \alpha 和 \beta 的组合,例如Bias: 偏置值是从卷积输出中提取的,对于一个随机选择的训练样本,给定一个卷积核,计算其输出 W_{d}\ast{X} ,然后取[0.25, 0.5, 0.75]分位数作为偏置的可选值。需要注意的是Bias是MiniRocket中唯一随机的值。通常在实验中,Bias的值利用整个训练数据集来计算得到;Dilation: 该值的范围为 D=\left\{ [2^0],...,[2^{max}] \right\} ,其中 [\cdot] 表示四舍五入, max=log_{2}(l_{input}-1)/(l_{kernel}-1) ,并且限制卷积核最大的dialtion为32;Padding: 使用标准的zero padding;MiniRocket的优点:可以同时计算W和-W的ppv值,W和-W表示两个数值相同,但是符号相反的卷积核,因此它们对原始序列进行卷积操作,只需要计算其中1个的输出,就可以获得另一个的输出;利用卷积操作的输出进行多个特征的计算,比如Biasd的值,这使得使用单个卷积运算的计算成本计算多个特征将内核权重限制为两个值允许我们实际上从卷积运算中“分解”乘法,并仅使用加法来执行卷积运算。使用仅有两个值的卷积核允许我们几乎可以用过一次运算计算所有的卷积核【存疑】MultiRocket: Effective summary statistics for convolutional outputs in time series classificationarXiv, 2021Paper MultiRocket: Effective summary statistics for convolutional outputs in time series classificationCode: https://github.com/ChangWeiTan/MultiRocket[Abstract] 在Rocket和MiniRocket的基础上进行改进,同一拨人提出了MultiRocket。Rocket 和 MiniRocket 是两种最快的时间序列分类方法,但都比当前最准确的方法(即 HIVE-COTE 及其变体)准确度低。文中表面通过扩展变换产生的特征集,可以显着提高 MiniRocket(和 Rocket)的准确性,同时增加一些额外的计算费用,使 MultiRocket 总体上成为 UCR 数据集上唯一最准确的方法。相比与MiniRocket, 速度大约慢了10倍。Average rank of our proposed algorithm[Introduction] 文中提到通过扩展作为变换的一部分计算的特征集,可以显着提高 Rocket 和 MiniRocket 的准确性,但需要一些额外的计算费用。我们称此方法为 MultiRocket。与 Rocket 和 MiniRocket 一样,MultiRocket 转换输入时间序列使用大量卷积核,并使用变换后的特征来训练线性分类器。MultiRocket 和 MiniRocket 或 Rocket 之间的主要区别在于从卷积输出中提取的特征。Rocket 应用 PPV(用于“正值的比例”)和全局最大池化 (Max),而 MiniRocket 仅应用 PPV。MultiRocket 除了计算PPV之外,还计算多种其他特征。[Method]MultiRocket采用和MiniRocket相同的卷积操作。但是增加了一个新的strong特征:LongStretch_above_0:计算了大于零的连续值的最长周期。此功能类似于 PPV,因为高于零的值越多,连续值高于零的可能运行时间越长。但是,它还捕获有关卷积输出的时间顺序的信息。本质上,MultiRocket通过更多的特征组合方式,取得了较好的分类精度。【The fixed feature combinations】固定特征组合方法将一组固定的特征应用于每个卷积核,即所有卷积核都生成相同的特征。例如在第一个表中,特征的数量提前给定,每个不同的的ID包含固定的特征组合,当ID=48时,包含特征PPV以及LongStretch_above_0;【The random feature combinations】随机特征组合方法是 MultiRocket 以较低的计算复杂度实现高分类精度的关键方面。与固定特征组合方法不同,它为每个卷积核随机分配特征。在 MultiRocket 中,将特征随机分配给每个卷积核,在从卷积内核创建的特征中创造了多样性,其特征比固定特征组合方法少,并且不会显着过度拟合训练数据集。例如后面的两个表格中,最终的特征是固定特征和可选特征组成,固定特征指的是strong features, 比如PPV和LongStretch_above_0,而可选特征则是剩下的特征;Final set of feature combinations used in MultiRocket发布于 2021-09-24 20:47时间序列分析特征工程深度学习(Deep Learning)​赞同 61​​12 条评论​分享​喜欢​收藏​申请

Rocket首页、文档和下载 - CoreOS 的容器引擎 - OSCHINA - 中文开源技术交流社区

Rocket首页、文档和下载 - CoreOS 的容器引擎 - OSCHINA - 中文开源技术交流社区

Gitee

资讯

专区

问答

活动

软件库

Tool

博客

培训

众包

登录

注册

开源软件库

/

PaaS系统/容器

/

Rocket

Rocket

CoreOS 的容器引擎

收藏109

评论0

分享

微信

QQ

微博

纠错

Rocket 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!

Rocket 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!

2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!

2021 年度 OSC 中国开源项目评选 >>> 中场回顾

Rocket 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !

授权协议

Apache

开发语言

Google Go

操作系统

Linux

软件类型

开源软件

所属分类

云计算、 PaaS系统/容器

开源组织

CoreOS

地区

不详

投 递 者

红薯

适用人群

未知

收录时间

2014-12-02

软件首页

软件文档

官方下载

极速下载

100.0

安全指数

概览

资讯

博客

问答

安全信息

软件简介

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告

Rocket (也叫 rkt)是一个用于在Linux上运行应用容器的 CLI。rkt 被设计成安全的、可组合的和基于标准的。目前该项目已停止开发。

rkt 的一些主要功能和目标包括:

Pod-native:rkt的基本执行单位是一个pod,可在独立的环境中将资源和用户应用程序链接在一起。

安全性:rkt是根据“默认安全”原则开发的,包括许多重要的安全功能,例如对SELinux的支持,TPM测量以及在硬件隔离的VM中运行应用程序容器。

可组合性:rkt设计用于与init系统(例如systemd,upstart)和集群协调工具(例如Kubernetes和Nomad)进行一流的集成,并支持可交换执行引擎。

开放标准和兼容性:rkt实现appc规范,支持容器网络接口规范,并且可以运行Docker映像和OCI映像。正在开发对OCI映像和运行时的更广泛的本机支持。

展开阅读全文

代码

的 Gitee 指数为

超过 的项目

评论

点击引领话题

发布并加入讨论

给软件打分:

周其

发表于云计算专区

2018/04/17 10:36

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt v1.30.0 发布,CoreOS 的容器引擎

rkt v1.30.0 发布了。Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。 更新内容: 新特性 status: added read from uuid-file (#3860). stage0/run: relax '...

0

1

微信

QQ

微博

举报

两味真火

发表了资讯

2017/06/20 07:40

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt v1.27.0 发布,CoreOS 的容器引擎

rkt v1.27.0 发布了。Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。 此次要版本包含错误修复,以及与测试和文档相关的改进。 新特性: stage1/kvm: add ar...

0

7

微信

QQ

微博

举报

发表了资讯

2017/05/16 07:19

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt 1.26.0 发布,CoreOS 的容器引擎

rkt 1.26.0 发布了,这次更新包含错误修复和其他改进。它增加了对 rkt 的 arm 架构更好的支持,因此现在可通过自动发现获取图像,并有正确的 seccomp 白名单来运行它们。另外值得注意的是,将额外的内核参数传递给 kvm 的可能性,最后同样重要的是在 stage0 的重要准备/运行加速。这也对卷名进行了更严格的验证,现在是拒绝重复的。 新特性 stage1: improve duplicate mount-volume detection (#3666). Breaking change: volum...

1

3

微信

QQ

微博

举报

发表了资讯

2017/02/21 07:24

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt 1.25.0 发布,CoreOS 的容器引擎

rkt 1.25.0 发布了,这个小版本包含与 KVM 风格相关的错误修复和其他改进,现在默认使用 qemu-kvm。 Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。 更新如...

1

0

微信

QQ

微博

举报

王练

发表了资讯

2017/02/05 05:38

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt 1.24.0 发布,CoreOS 的容器引擎

rkt 1.24.0 发布了, Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。 此版本包括对连接到正在运行的应用程序的输入和输出的实验性支持。 更新内容: 新特性...

0

1

微信

QQ

微博

举报

发表了资讯

2017/01/20 07:26

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt v1.23.0 发布,CoreOS 的容器引擎

rkt v1.23.0 发布了。该版本添加了大量有关 rkt fly flavor, garbage collection, kvm, 和 sandbox 的特性。 新的实验性 app 子命令现在遵循 CRI 的语义,如果应用程序失败或退出,不会过早退出。 最后,docker2aci 收到了一个重要的更新修复问题,os/arch 标签会导致 arm 架构出现问题。 新特性 沙盒:如果 app 失败不会退出(#3478)。与常规 rkt run 行为相反,如果所有或单个应用程序失败或退出,沙盒现在不会退出。 Bug 修复...

0

1

微信

QQ

微博

举报

发表了资讯

2016/12/09 07:20

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt v1.21.0 发布,CoreOS 的容器引擎

CoreOS 的容器引擎 rkt v1.21.0 发布了。此版本包括实验性 CRI 支持的错误修复,更稳定的集成测试和一些其他有趣的更改: 默认受限网络从 172.16.28.0/24 更改为 172.17.0.0/26 OCI 支持的详细路线图已经完成 新特性 Change the subnet for the default-restricted network (#3440), (#3459). Prepare for writable /proc/sys, and /sys (#3389). Documentation/proposals: add OCI Image Format roadmap (#3425). Bug 修复 st...

0

1

微信

QQ

微博

举报

达尔文

发表了资讯

2016/11/25 07:21

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt v1.20.0 发布,CoreOS 的容器引擎

rkt v1.20.0 发布了,此版本包含对 rkt 核心的多个更改,使其更符合 Kubernetes 的新容器运行时接口(CRI)。 已推出一个新的实验性应用子命令,允许创建“pod sandbox”并在运行时动态修改它。此功能尚未完全稳定,目前正处于实验的状态。 更新内容: Bug 修复: tests/build-and-run-test.sh: fix systemd revision parameter (#3395). namefetcher: Use ETag in fetchVerifiedURL() (#3374). rkt/run: validates pod manifes...

0

5

微信

QQ

微博

举报

发表了资讯

2016/11/11 07:17

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt v1.19.0 发布,CoreOS 的容器引擎

rkt v1.19.0 发布了,此版本包含对 rkt 核心的多个更改,使其更符合 Kubernetes 的新容器运行时接口(CRI)。 已推出一个新的实验性应用子命令,允许创建“pod sandbox”并在运行时动态修改它。此功能尚未完全稳定,目前正处于实验的状态。 该版本更新如下: 新功能 and UX 变化: rkt: experimental support for pod sandbox (#3318). This PR introduces an experimental appsubcommand and many additional app-level option...

0

1

微信

QQ

微博

举报

王练

发表了资讯

2016/10/28 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt 1.18.0 发布,CoreOS 的容器引擎

rkt 1.18.0 发布了,该版本包含错误修复,UX增强功能和其他改进。 Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。 UX 更正: rkt: gate diagnostic output b...

1

2

微信

QQ

微博

举报

达尔文

发表了资讯

2016/10/14 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt 1.17.0 发布,增加扩展DNS配置选项

rkt 1.17.0 发布了,这次发布带来了一些扩展DNS配置选项,QEMU公测支持,递归卷安装以及提升sd_notify支持。 Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。...

1

3

微信

QQ

微博

举报

发表了资讯

2016/09/16 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt 1.15.0 发布,增加扩展DNS配置选项

rkt 1.15.0 发布了,这次发布带来了一些扩展DNS配置选项,QEMU公测支持,递归卷安装以及提升sd_notify支持。 Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。...

0

2

微信

QQ

微博

举报

发表了资讯

2016/09/11 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt 1.14.0 发布,更新了 CoreOS

rkt 1.14.0 发布了。Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。 该版本更新了 coreos和kvm flavors,在 api-service中修复了一些bug以及更改了cgroups...

0

2

微信

QQ

微博

举报

发表了资讯

2016/08/19 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt 1.13.0 发布,CoreOS 的容器引擎

rkt 1.13.0 发布了。Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。 本次版本新特性和 UX 的改进: export: name flag for exporting multi-app pods (#303...

0

1

微信

QQ

微博

举报

oschina

发表了资讯

2016/08/05 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

Rocket v1.12.0 发布,支持​ seccomp 过滤

Rocket v1.12.0 发布了,Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。 该版本主要新增seccomp隔离器,支持seccomp过滤。同时,对API服务做了一些提升,修复一些已知问题。 改进记录如下: 新特性 & UX 改进 cli: rename --cap-retain and --cap-remove to --caps-* (#2994). stage1: apply seccomp isolators (#2753). This introduce...

1

3

微信

QQ

微博

举报

oschina

发表了资讯

2016/07/22 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

Rocket v1.11.0 发布,CoreOS 的容器引擎

Rocket v1.11.0 发布了,本次发布将带来全新的KVM模拟器,以及对ACI、rkt API 进行改进。 Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。 本次发布完整改进...

2

0

微信

QQ

微博

举报

oschina

发表了资讯

2016/07/13 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

Rocket v1.10.1 发布,CoreOS 容器引擎

Rocket v1.10.1 发布了,改进记录如下: Bug 修复 rkt/run: handle malformed environment files (#2901) stage1/enterexec: remove trailing \n in environment variables (#2901) 下载地址: Source code (zip) Source code (tar.gz) 其他下载地址,请访问:https://github.com/coreos/rkt/releases/tag/v1.10.1 Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中...

1

1

微信

QQ

微博

举报

oschina

发表了资讯

2016/07/08 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

Rocket v1.10.0 发布,CoreOS 容器引擎

Rocket v1.10.0 发布了,改进记录如下: 增强 ARM64 support A new subcommand rkt stop to gracefully stop running pods native Go vendoring with Glide rkt is now packaged for openSUSE Tumbleweed and Leap 新特性 Add ARM64 support (#2758). This enables ARM64 cross-compliation, fly, and stage1-coreos. Replace Godep with Glide, introduce native Go vendoring (#2735). rkt: rkt stop (#2438). Cleanly stops...

0

0

微信

QQ

微博

举报

oschina

发表了资讯

2016/06/25 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

rkt 1.9.1 发布,CoreOS 的容器引擎

rkt 1.9.1 发布了。Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。 这是一个bug修复版本,主要更新内容: Bug fixes Godeps: update go-systemd (#2837). g...

0

3

微信

QQ

微博

举报

oschina

发表了资讯

2016/06/24 00:00

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

Rocket v1.9.0 发布,新增特性 & UX 改进

Rocket v1.9.0 发布了,Rocket (也叫 rkt)是 CoreOS 推出的一款容器引擎,和 Docker 类似,帮助开发者打包应用和依赖包到可移植容器中,简化搭环境等部署工作。Rocket 和 Docker 不同的地方在于,Rocket 没有 Docker 那些为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来说,Rocket 想做的,是一个更纯粹的业界标准。 新增特性 & UX 改进: rkt/run: added --set-env-file switch and priorities for ...

0

6

微信

QQ

微博

举报

没有更多内容

加载失败,请刷新页面

点击加载更多

加载中

下一页

{{o.author.name}}

发表了博客

{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}

{{parseInt(o.viewCount) | bigNumberTransform}}

微信

QQ

微博

举报

没有更多内容

暂无内容

{{o.author.name}}

发表了问答

{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}

{{parseInt(o.viewCount) | bigNumberTransform}}

微信

QQ

微博

举报

没有更多内容

暂无内容

暂无内容

Awesome 软件

换一换

TigerBot - 多语言多任务大语言模型

Neutralinojs - 轻量级桌面应用开发框架

Ranger - 控制台下的文件管理器

ccrypt - 加密解密工具包

Shotcut - 视频编辑软件

CodeGPT - 用 ChatGPT 帮开发者写 Commit Message

PaLM 2 - 谷歌下一代大型语言模型

OpenCasCade - 三维建模工具

Miniflux 2 - 极简的新闻阅读器

隐语 - 可信隐私计算框架

BRL-CAD - 计算机辅助设计系统

Xapian - C++检索引擎

城市点击器 - 城市建设游戏

FinalCrypt - 开源文件加密工具

Saltcorn - 无代码数据库管理器 Web 应用程序

OpenROV - 机器人潜水项目

模拟虫群 - 放置型增量游戏

CINO - 少数民族语言预训练模型

FileCodeBox - 文件快递柜

Openfire - 即时消息传输平台

Ubuntu Kylin - 优麒麟操作系统

NocoBase - 无代码开发平台

Astro - 静态站点生成器

Mach - 游戏引擎和图形工具包

Postcat - 开源 API 管理工具

GLM - 用于自然语言理解和生成的通用预训练框架

Androl4b - 安卓安全虚拟机

NewsBlur - 新闻阅读器

Hitomi-Downloader - 全功能下载工具

Anolis OS - 支持多架构的 Linux 发行版

热门内容

更多精彩内容

前谷歌软件工程师被控窃取机密 AI 技术

LFOSSA 祝大家女神节快乐!助力女性开源职业发展!

我的历时一年的独立开发故事

GreptimeDB v0.7 发布 — 全面支持云原生监控场景

野火IM 1.2.3 已经发布,即时通讯系统

一个使用 Java 开发的 LLM 应用开发框架,Agents-Flex alpha.2 发布

EmbedXrpc V5.0.0 已经发布,用于单片机场景的“gRPC”

2023 年 DevOps 报告:文化、用户中心性和技术能力驱动组织成功

AI 加速引擎 PAI-TorchAcc:整体介绍与性能概述

KCL v0.8.0 重磅发布 - 融汇社区生态,助力配置体验!

快手启动鸿蒙原生应用开发

"Java 将继续存在",60% 的公司计划扩招 Java 开发人员

如果企图在人工智能上搞“小院高墙”,将会犯下新历史错误

星动纪元开源人形机器人训练框架 Humanoid-Gym

微信即将推出原生 Linux 版本

开源日报 | Google=开源,好评;Microsoft=闭源收入还低,差评

WFS 文件存储系统 v1.0.1 发布

Syncthing 1.27.4 发布,连续文件同步工具

【比较 ORM 操作数据】总结

Node.js 新版官网开启 Beta 测试:全新现代化 UI、优化交互

WorkPlus Meet私有化视频会议软件-构建安全高效的内网会议体验

WorkPlus Meet视频会议系统,支持局域网部署

基于大模型的低代码平台架构

「隐私计算黑客松」获奖代码全部开源!快去打卡~

【青梅资讯】VMware Greenplum 6.25.0 正式发布

开发者实战 | Intel® Developer Cloud Telemetry数据分析 (一)

你的开发套件已到货「GitHub 热点速览」

Databend 开源周报第 134 期

利用Prompt,高效调教大模型

OpenVINO™ DEVCON 中国 · 系列工作坊2023第二期:使用 OpenVINO™ 加速生成式 AI

GitHub Copilot的最佳免费平替:通义灵码

WorkPlus平台级定制,让您完全掌控业务与生态

Databend 开源周报第 117 期

WorkPlus移动数字化平台高定制化服务,贴身满足企业的个性化需求

StoneDB-8.0-V2.5.0 企业版正式发布!免费公测活动正在进行中,快来参加!

Databend 开源周报第 133 期

AutoMQ生态集成 - 从 AutoMQ Kafka 加载流数据到 Timeplus

开发者实战 | 基于 OpenVINO™ 和 LangChain 构建 RAG 问答系统

“数据驱动”时代,企业为什么需要实时湖仓?

倒计时 2 天!本周六,Apache Doris 年度技术盛会相约北京!

2023 年微服务后端开发的 11 个最佳工具

开源MQTT中间件 - BifroMQ 技术架构概览

Databend 开源周报第 111 期

快来报名啦,openKylin社区"源动力实习生计划"正式发布

开发者实战 | AI for Science:OpenVINO™ + 英特尔显卡解薛定谔方程

超越钉钉与企业微信:如何选择一款更适合企业的私有化即时通讯软件

李跳跳2.2正式版下载

生成式AI:引领网络安全新未来

雷军称小米汽车不可能卖 9 万 9;杭州破获重大勒索病毒案丨 RTE 开发者日报 Vol.116

同程数科基于 Apache Doris 构建统一实时数仓,查询提速数十倍!

AI大模型时代下运维开发探索第一篇:ReAct工程初探

PingCAP 入选 Gartner 《Hype Cycle for Data Management 2023》代表厂商

金融行业未来的关键技术

Java 21的StringBuilder和StringBuffer新增了一个repeat方法

开发者实战 | Linux Ubuntu 安装英特尔显卡驱动玩转 AIGC

使用全套开源工具构建 LLM 应用实战:在 Dify 调用 Baichuan 开源模型能力

Linux稳定运行30年背后的神秘力量

社区重要还是代码重要?

如何构建高效、可观的系统「GitHub 热点速览」

生成式AI:AI赋能新时代

重磅发布|《 AutoMQ 白皮书》与《 RocketMQ 实战精粹》正式上线

一文读懂苹果的差分隐私技术原理

火山引擎开源通用多媒体处理框架 BMF

企业APP混乱繁杂?WorkPlus助您实现统一入口管理

WorkPlus构建便捷高效的企业移动门户平台

PyTorch中的Transformer:强大模型与高效工具的完美结合

大模型训练的自动化与弹性管线解决方案

稀疏数组如何帮助我们节省内存,提升性能

苹果承认存在烧屏问题,但拒绝召回;英伟达显卡全网断货,最高涨至 5 万元;AI 耗电相当于一个国家年用电量 | EA周报

车企数据治理实践案例,实现数据生产、消费的闭环链路 | 数字化标杆

混合云案例:利用 Databend Cloud 高效加速私有 Databend 的策略与实施

使用 LF Edge eKuiper 将物联网流处理数据写入 Databend

生成式AI助力开发者创新

阿里云PAI-灵骏大模型训练工具Pai-Megatron-Patch正式开源!

流程图之美:手把手教你设计一个流程图

报告:互联网上,73%流量来自网络爬虫 | 恶意爬虫防控指南

ARHUD驾车导航技术概览

数据探索之道:查询Web API数据中的JSON字符串列

【ODPS新品发布第2期】实时数仓Hologres:推出计算组实例/支持JSON数据/向量计算+大模型等新能力

Graph RAG: 知识图谱结合 LLM 的检索增强

全议程公布丨涌现中重塑,PingCAP 用户峰会 2023 邀你共同引领创新力量!

引领Transformer时代的新型大模型架构

开发者实战 | 在英特尔开发者套件上用 OpenVINO™ 2023.0加速 YOLOv8-Pose 姿态估计模型

企业内部通讯,WorkPlus助您打造高效沟通平台

中国留学生被“虚拟绑架”?AI让电信诈骗更加逼真,我们该怎么识别?

局域网办公的重要性,如何选择企业IM即时通讯APP?

Apache Doris 巨大飞跃:存算分离新架构

快速认识,后端王者语言:Java

民宿管理中怎样通过系统来解决安全隐患

数据库分类、管理及应用:从关系型到云数据库

大模型训练,文本分类的未来之路

WorkPlus高效助力企业沟通的专业级即时通讯软件

金融科技降本增效的利器:数字化科技运营体系

开源 2 年、打磨 13 年、300 万行代码的开源项目

大象转身:支付宝资金技术 Serverless 提效总结

河北幸福消费金融基于 Apache Doris 构建实时数仓,查询提速 400 倍!

开发者实战 | 介绍OpenVINO™ 2023.1:在边缘端赋能生成式AI

深度学习平台与大模型的融合:夯实产业智能化基座

开发者实战 | 在英特尔开发套件上打造指哪识哪的OCR应用

全站热门评论

Yoona520 2024-02-24 17:44

国外那个P站的技术水准可不低,毕竟服务全世界除CN之外的人

skykainls 2024-03-07 16:13

还是逃不过东半球最强法务部的子弹

屮殖 2024-03-07 15:41

小米的新闻,主角却是华为,这说明谁更重要,以至于敌人想除之而后快呢?

闲大赋 2024-02-18 20:49

我对此专利的解读『 https://my.oschina.net/xiandafu/blog/11043929』

gmg 2024-02-26 22:23

有点好奇为什么发布这种表面看起来吸引眼球的标题。

大风起兮9527 2024-02-06 08:57

这事没啥好讨论的啊,代码如果开始的时候是开源,那么你有闭源的权利,但是要从声明之后的版本开始,不能回溯。文档也是如此,但是有一点,如果文档虽然没有声明开源,但是自己在公开场合发布过,你可以建议请求不要随意传播,但是不能强硬的禁止。关于白嫖,这个说法过分了,对于这些想要商业化的项目,开源伊始的初心,无非是面推广费、免费测试。各有所图,不要互相指责。

m

moon_red 2024-03-07 18:09

第一个Warning是在Wayland环境下用X11的qt出现的,不影响使用。libva和iHD_drv_video.so都是视频硬件加速,可能是你libva没配好

yl-yue 2024-02-18 13:49

操作也是相当炸裂,原来还可以这样玩,字太多了没读透,我的理解,就算是鸡肋专利也够他们吹嘘了,要是限制性专利,那是相当牛逼,开源行业要炸。

91winter 2024-03-07 17:03

可能是钓鱼的吧~

d

dwcz 2024-02-18 22:12

中国法治的水平:二创可以演绎原创,三创不能演绎二创。

dantezhu 2024-02-28 11:20

那,这就叫专业。

monkey_cici 2024-02-26 11:39

开源系统还是要看民企的深度统信和华为欧拉...

CheckStyle 2024-02-21 18:45

关键是什么业务?10个人,2023年,一年,赚2000多万,泼天的富贵啊

redblueme 2024-03-07 16:07

牛逼,有空试一下

有你何须仰望 2024-03-07 15:46

越看越像新版QQ NT

小xu中年 2024-03-07 16:31

……

fasiondog 2024-03-07 19:09

为啥,我觉得技术派和市场派的观点颠倒了

魔力猫 2024-02-01 09:35

这篇说的好听,但你心里,公有制就是白嫖,你之前公告写着“ioGame21 在线文档依旧采用自愿付费模式策略。简单的说,我们提供了最新在线文档的白嫖方式,如果你打算跟进框架最新版本的,依旧可以选择白嫖在线文档。”,“综上,想继续白嫖的,请跟进最新版本。”不是吗?这是什么理念?我看更像精神分裂的理念,伪君子和真小人之间来回切换,嘴上都不一致。

记得小蘋初见123 2024-02-29 16:53

百小僧,出列

小xu中年 2024-03-07 16:27

k

kylexy 2024-02-26 10:38

大实话。。。。

jobell 2024-03-07 17:02

微信开发工具赶紧推出linux版本吧

我的ID是jmjoy 2024-03-07 17:45

让市场说了算明显不行,某些企业利用资本先发优势大搞垄断,霸占生态位不干人事,店大欺客,早就应该治治了。

Yokesily 2024-03-07 19:07

笑掉牙的新闻又要发出来,又不让人评论,哈哈

小呆呆的星空 2024-03-07 17:19

有钱人当然不要做程序员,草根出身做程序员待遇是不错的

朋克 2024-02-28 11:36

这才是正常的盈利模式

o

osc_91229770 2024-02-18 12:03

这也申请专利,这个不是正常crud,常规操作吗

屮殖 2024-03-07 15:47

你说的很对,能源的确是另一个很重要的方面。但是AI和挖矿不一样,他的使用是要比训练少数量级差别的算力的。而AI能达到的功能是由训练实现的。目前情况下,电力很多国家都够支撑,但是芯片实现的算力全世界只有为数不多的AI公司才能有条件训练大模型了。对比小模型就能看出来,小模型是个人能训练的。

gitlinux 2024-03-07 16:12

postrm脚本,if语句忘写 fi 啦,手动修正一下即可

姜鹏飞 2024-03-07 17:15

漂亮

J

JK_STAR 2024-03-07 16:08

QT写的

天朝八阿哥 2024-02-29 10:32

虽然不懂,但表示很赞,比随便就冠以“国产”“自主研发”之类的让人舒心太多了

RobotPainter 2024-03-07 17:21

下意识navbar里找Pricing。。。

neou 2024-03-07 16:32

不要什么都让国家管,支不支持Linux要让企业说了算,让市场说了算。

老盖 2024-02-01 14:11

windows没希望了,一群阿三,越做越差

爱吃生梨 2024-01-31 15:35

百小僧果然是刷新中国开源底线里程碑式的人物,这不追随者来了。而且从.net扩散到java

小xu中年 2024-03-07 16:31

优秀

fyf187 2024-03-07 16:00

内容可能含有违规信息

小xu中年 2024-03-07 16:29

拥抱信创

屮殖 2024-03-07 15:38

我人品咋了?就事论事就是人品有问题?对我简介都这么关心?我都忘了自己写了什么了。是不是爱一点点国,就是眼中钉了?是不是爱国必须表现装给你们看才行?评论一个社会事件怎么搞到爱国程度了?我就事论事,让某些人不要总是用嫉妒心看待别人,只能害了自己,难道不对?

RobotPainter 2024-03-07 17:40

我感觉挺好的,这就是没有小院高墙的体现

osc_56137622 2024-03-07 17:34

赞:+1:

y

yfxuwork 2024-03-07 16:42

linuxmint下打开后扫码登录失败, 不过希望之后能像qq一样出个appimage的包。 多方便。

c

cassan 2024-03-01 22:19

开源了,我们国内的公司又可以申请知识产权了

simba_sailor 2024-03-07 17:03

有安装了今天更新的修复登陆问题的版本,可能 登陆,可以有聊天历史同步。现在主要的问题是中文输入不了。

Z生生不息 2024-01-31 18:33

没有人要求你必须要维护必须开源。但是你有权力要求用户“不得以任何形式传播及公开”吗?这是 AGPL 开源协议所允许的吗?如果你连开源协议都搞不清楚,早点把仓库归档吧。整得跟小学生耍流氓一样。

高排量低炭烧 2024-02-26 21:29

鸿蒙只是人家现学的,人家本来薪水就这么高,而不是新手培训完就值这个数

风一样的Man 2024-03-06 10:50

我还没开始用, 你就砍掉了

luwenhua 2024-03-05 18:18

其实用用惯了,比windows省心多了

小肥侠 2024-02-19 17:51

所以将开源软件打包到应用商店,是真的有市场。

osc_94406955 2024-03-01 09:29

预计该问题会在 24 小时内彻底解决............. 今天3月1日了,bug神奇的消失

屮殖 2024-03-07 15:42

啥意思?你看看大毛那样不就知道了?我们还有个任务没完成呢,毛子那种待遇我们几乎是必然的事,不要早做准备?

u

unameuname 2024-02-19 14:02

第一次钓鱼,别TM给我鱼竿,我只要鱼。

Yokesily 2024-03-07 18:43

看这截图,很多杀毒防火墙软件都很缺乏用户体验设计!又红色感叹号告诉危险,又绿色告诉已验证,所以这弹窗到底想告诉用户什么??从用户角度看,用户想知道的是~谁发起什么操作,就比如xx软件创建了test服务,或者用户主动创建了test服务,提示内容要关键到位啊

魔力猫 2024-02-01 09:48

开源不是不可以收费,基本上也没人认为开源项目里有收费项目是什么十恶不赦的罪过。问题在于,你要合理合法,要符合开源的道德。最近的事件,要么是某和尚绑票,不合理不合法更没道德,绑票拿赎金。要么就是这位,明明合法的事情,偏偏发个歧视公告,张嘴白嫖闭嘴白嫖,过嘴瘾有意思吗?开源生意,哪怕你心理一万个不愿意,但是既然你做了这个生意,伪君子人设好歹你不干的时候再扔呀,一会儿伪君子一会儿真小人,觉得不找骂才怪。

t

tedx53 2024-02-27 09:42

高考状元的试卷给我抄,我也能轻松上清华

J

Jason909 2024-03-07 15:43

“还有 84% 的 IntelliJ IDEA 用户表示,他们在 Java 开发实践中还使用过其他 IDE,其中 VSCode 是最常见的选择。”Eclipse的第二还能保多久?

2

2cong 2024-02-26 11:21

如果让我抄,我就会!

zhangjinsongok 2024-02-01 16:29

开源世界的孤胆英雄。

魔力猫 2024-02-01 14:19

最近这些事件的主角,初心绝对不是什么为了创造啥,为的只是赚钱。开源只是赚钱手段,而且是觉得自己为了钱放弃很多的那种心态,心理先把自己当成了牺牲者,然后认为所有人都应该补偿自己。不拿钱补偿就是忘恩负义的白眼狼!

软件作者

本软件还没有认证的作者

认证为作者

邀请作者认证

此软件还没有被作者认证,快来邀请作者认证吧!

成功邀请奖励:

开源伯乐勋章

专属邀请文案:

你的软件 “Rocket” 被开源中国社区收录啦,快点击 https://www.oschina.net/p/CoreOS-rocket 认证为软件作者吧!

复制邀请文案

同类软件推荐

更多

NestOS-Kubernetes-Deployer容器云集群与操作系统一体化运维工具

NKD,全称为 NestOS-Kubernetes-Deployer,是一套基于 NestOS 设计,NestOS for Container 上独有的容器云部署和运维工具,旨在为容器云业务和云...

SingularityCESingularity 的社区版

SingularityCE 是 Singularity 的社区版,Singularity 是一个开源容器平台,旨在简单、快速和安全。有许多容器平台可供使用,但 SingularityCE 的设计...

k0smotron统一 Kubernetes 集群管理

k0smotron 是一个用于统一集群管理的开源控制平面管理器。允许用户统一 Kubernetes 集群管理,以高效利用资源。它是为 k0s 设计的。 特性 控制平面即服务 k0smotron ...

Incus系统容器和虚拟机管理器

Incus 是一个现代、安全且强大的系统容器和虚拟机管理器。 它为在容器或虚拟机内运行和管理完整的 Linux 系统提供了统一的体验。Incus 支持大量 Linux 发行版的镜像(官方 Ubu...

TimoniKubernetes 包管理器

Timoni 是 Kubernetes 的软件包管理器,由 CUE 提供支持,灵感来自 Helm。 Timoni 项目致力于改善编写 Kubernetes 配置的用户体验。Timoni 没有像 ...

热门资讯

1

黄仁勋:别让你的孩子长大后成为程序员

2

Visual Studio Code 1.87 发布,语音听写

3

开源中国 APP 全新上线:“动弹”回归、集成大模型对话、畅读技术报告

4

马斯克起诉 OpenAI 及其 CEO 奥特曼,要求公司恢复开源状态

5

微信即将推出原生 Linux 版本

6

倒了一个 Yuzu,还有千千万万个“转世”开源模拟器

7

向使当时真开源,小人/君子有谁知?某开源账号引发众怒

8

全球最流行开源 Switch 模拟器 Yuzu 删除代码仓库、向任天堂支付 240 万美元

9

新款 MacBook Air:搭载 M3 芯片、可外接 2 台显示器、全球最好的 AI 消费级笔记本电脑

10

织梦 CMS “混沌”往事二十年

0 评论

109 收藏

微信

QQ

微博

分享

登录后可查看更多优质内容

使用微信快捷登录

OSCHINA 社区

关于我们

联系我们

加入我们

合作伙伴

Open API

在线工具

Gitee.com

企业研发管理

CopyCat-代码克隆检测

实用在线工具

国家反诈中心APP下载

攻略

项目运营

Awesome 软件(持续更新中)

QQ群

229767317

公众号

视频号

©OSCHINA(OSChina.NET)

工信部

开源软件推进联盟

指定官方社区

社区规范

深圳市奥思网络科技有限公司版权所有

粤ICP备12009483号

顶部

火箭实验室_百度百科

室_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心收藏查看我的收藏0有用+10火箭实验室播报讨论上传视频美国境内的私人火箭公司火箭实验室(Rocket Lab),是一家美国私人火箭公司,该公司创始人兼首席执行官为彼得·贝克 [1-2]。成立于2006年,总部位于加州长滩。 [8]2020年7月4日,美国私人火箭公司“火箭实验室”表示,该公司“电子”(Electron)号火箭携带7颗卫星从新西兰航天发射场的发射失败。 [3]北京时间2021年5月15日晚19点11分据媒体报道,美国航天私企Rocket Lab的Electron火箭发射失败。官方表示,火箭发动机遭遇意外停车,导致两枚卫星载荷报废。 [5]中文名火箭实验室外文名Rocket Lab成立时间2006年首次轨道发射2018年 [8]目录1公司简介2发展历程3发射情况4所获荣誉公司简介播报编辑Rocket Lab(火箭实验室)是一家研发小型运载火箭的初创航空航天公司。致力于自主新型火箭发动机的研发,这种发动机区别于传统的燃气循环发动机,利用新型电泵提供燃料循环,且主要部件由非常先进的真空3D电子束打印技术制成。发展历程播报编辑2006年,火箭实验室成立,总部设在美国加利福尼亚州,并在新西兰拥有一个子公司和发射场。2017年3月,火箭实验室获得了由风险投资公司Data Collective领投的7500万D轮融资,至此Rocket Lab(火箭实验室)的D轮融资总金额达到1.48亿美金,公司估值超过10亿美金。2021年6月15日消息, Rocket Lab(火箭实验室)正在开发两个基于其Photon卫星平台的航天器,用于环绕火星,研究该星球的磁层,以便更好地了解火星气候随时间变化的方式 [6]。2022年3月5日消息,美国太空初创企业火箭实验室(Rocket Lab)将在弗吉尼亚州东海岸为旗下“中子号”火箭建设制造工厂和发射场。 [7]发射情况播报编辑2017年5月25日,火箭实验室在新西兰东海岸,成功发射了世界首枚3D打印的电池动力火箭“Electron”(电子)。 [1-2]2020年7月4日,美国私人火箭公司“火箭实验室”表示,该公司“电子”(Electron)号火箭携带7颗卫星从新西兰航天发射场的发射失败。截至2020年07月,“电子”号火箭发射13枚,其中两枚失败。 [3]火箭发射北京时间2021年5月15日晚19点11分据媒体报道,美国航天私企Rocket Lab的Electron火箭发射失败。官方表示,火箭发动机遭遇意外停车,导致两枚卫星载荷报废。据悉,此次火箭发射在新西兰进行,是Electron火箭的第20次发射任务。报道称,两枚卫星来自BlackSky和Spaceflight。 [5]电子号火箭第26次发射电子号火箭第26次发射 [8]2022年5月3日消息,美商业航天企业火箭实验室(Rocket Lab),首次使用直升机从空中捕获火箭助推器。新西兰标准时间5月3日10时49分,火箭实验室电子号火箭在新西兰玛希亚半岛发射升空,执行“去而复返”任务,部署一箭34星。此次任务是电子号火箭第26次发射,火箭实验室电子号火箭已将146颗卫星送入轨。 [8]当地时间2022年6月28日,美国国家航空航天局(NASA)在新西兰通过火箭实验室的电子火箭向月球发射了一颗“CAPSTONE”卫星。 [9] Electron火箭第34次发射2023年3月消息,火箭实验室近日成功从大西洋区域航天港的 Launch Complex 2(LC-2)发射“Stronger Together”火箭任务。Rocket Lab 表示不会为这次任务尝试回收 Electron 火箭。 [10]所获荣誉播报编辑2020年8月4日,《苏州高新区·2020胡润全球独角兽榜》发布,火箭实验室排名第351位。 [4]新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

Rocket.Chat 使用指南:如何自建聊天平台 - 知乎

Rocket.Chat 使用指南:如何自建聊天平台 - 知乎切换模式写文章登录/注册Rocket.Chat 使用指南:如何自建聊天平台Xpitz文章首发于个人公号:「阿拉平平」大家好,我是安利狂魔平平。前段时间,我的一个朋友入职了一家初创公司,新手村的第一个任务就是架设公司的聊天平台。成熟的聊天平台其实有很多,但朋友却犯了难:由于公司刚刚搬迁,还未接入外网,各主机只能在局域网内通信。于是我向他安利了一个开源的聊天平台:Rocket.Chat。项目介绍Rocket.Chat[1]是一个基于 JavaScript 开发、可高度定制的聊天平台。通过部署 Rocket.Chat 服务,用户完全可以搭建一套供企业内部使用的聊天平台。项目的功能齐全,并配套了 App,本文将介绍 Rocket.Chat 安装和使用方法。下载安装Rocket.Chat 目前最新的版本为 4.0.1,可以通过手动或者容器的方式安装。这里我推荐使用容器,部署过程会方便不少。如果要用容器的方式部署,需要先安装 docker 和 docker-compose,再下载编排文件:# 创建并进入工作目录

mkdir /opt/rocketchat

cd /opt/rocketchat

# 下载编排文件

curl -L https://raw.githubusercontent.com/RocketChat/Rocket.Chat/develop/docker-compose.yml -o docker-compose.yml根据自己的需求来修改编排文件,修改完成后,运行以下命令启动服务:docker-compose up -d 服务启动后,在浏览器中输入 http://{ip}:3000 进行访问。使用说明第一次使用 Rocket.Chat 时,一些可能会不太习惯。不过不用担心,Rocket.Chat 用起来还是比较简单的。接下来,我会向大家演示 Rocket.Chat 的基本用法。安装向导我们第一次访问 Rocket.Chat 时,会被引导到安装向导,根据页面的提示来配置就好。首先是添加管理员,根据提示填写管理员的信息:接着是创建组织,可以根据实际情况填写信息:组织创建好后,再完善服务器的信息:最后是配置注册服务器信息:全部配置完成后,就可以用管理员账号登录 Rocket.Chat 了。注册用户安装向导配置完成后,我们再注册一个普通用户来看看 Rocket.Chat 的聊天功能。再次访问 http://{ip}:3000 进入登录页面,点击『注册一个新账号』:填好用户信息后,点击『注册一个新账号』按钮:填写注册用户名,点击『使用此用户名』:私聊消息不用多说,Rocket.Chat 的核心功能自然是聊天。通过刚刚注册的用户,我们来看看聊天的效果如何。点击左上角的图标,新建一个私聊消息:选择私聊的对象,点击『创建』按钮:Rocket.Chat 的聊天功能还是比较完善的,支持 Emoji,发送文件以及图片预览。创建讨论如果大家平时经常使用聊天工具,对讨论组肯定不会陌生,Rocket.Chat 同样支持创建讨论组。以刚刚私聊中的疑问为例,可以创建一个讨论组:填写讨论的名称,邀请需要参与的用户,点击『创建』按钮:Rocket.Chat 讨论组的显示效果如下:创建频道Rocket.Chat 的频道类似于我们平时使用的『群』,适用于多人聊天。点击左上角的图标,新建一个频道:填写名称、话题,选择成员,点击『创建』按钮:创建团队Rocket.Chat 是一套面向企业的开源方案,所以会有团队这个概念。团队主要是用于人员的划分,让公司的组织架构更为清晰,便于管理。创建团队与频道类似,依旧是点击左上角的图标,然后新建团队:填写团队的信息和人员进行创建:团队创建好后,我们还可以关联之前创建的频道:选择之前的频道,点击『添加』:勾选 『Auto-join』选项后,团队中的成员都会被添加到相应频道中:Hubot 机器人Hubot 是一个非常流行的开源聊天机器人,Rocket.Chat 对此进行了集成。因此,我们可以很方便地添加一个聊天机器人来为我们服务。如果你细心的话,你会发现当前 hubot 容器一直处于重启状态,而日志里其实已经给出了明确的报错:ERROR Unable to Login: {"isClientSafe":true,"error":403,"reason":"User not found","message":"User not found [403]","errorType":"Meteor.Error"} Reason: User not found 提示用户不存在,所以当务之急是要添加一个机器人账号,我们通过管理员账号来添加。首先点击管理员头像,点击『管理』并进入用户页面:添加一个新用户,填写对应信息。填写邮箱的时候,注意勾选『已验证』:用户名和密码需要和编排文件中的内容对应,Roles 选择 bot,其余的选项都不勾选:之后将机器人加到频道或者讨论组中,通过命令就可以调用了。Hubot 的玩法就比较多了,通过编写脚本可以定制自己想要的功能。不过本文主要是介绍 Rocket.Chat,这里就不展开了。写在最后Rocket.Chat 作为一个开源的聊天平台,部署简单,功能强大,官方的文档[2]写得也非常详细。如果你正好在寻找一个可以自建的聊天平台,那么 Rocket.Chat 值得一试。参考^Rocket.Chat https://github.com/RocketChat/Rocket.Chat^文档 https://docs.rocket.chat/发布于 2021-10-28 12:02聊天平台建设​赞同 21​​14 条评论​分享​喜欢​收藏​申请

在线翻译_翻译在线__英语翻译_英文翻译_日语翻译__fanyi_爱词霸

_翻译在线__英语翻译_英文翻译_日语翻译__fanyi_爱词霸首页翻译背单词写作校对词霸下载用户反馈专栏平台登录文本文档图片人

RISC-V的“Demo”级项目——Rocket-chip - 知乎

RISC-V的“Demo”级项目——Rocket-chip - 知乎首发于IA&C Lab@Fudan切换模式写文章登录/注册RISC-V的“Demo”级项目——Rocket-chip尹天宇本专栏早前的两篇文章介绍了Chisel的好处,并展示了使用Chisel快速搭建FFT电路的方法,充分证明了Chisel在敏捷开发方面的优势。 本文将继续延伸Chisel的脉络,为大家进一步介绍一下基于Chisel开发的“Demo”级RISC-V开源项目Rocket-chip,它是由RISC-V架构的创始单位——UC Berkeley开发的。Rocket-chip是一个SoC生成器在很多场景下我们常用Rocket指代Rocket“处理器”,而实际上Rocket-chip是一个SoC生成器(Generator),它用来根据不同的配置参数产生不同处理器的RTL代码,而后者才是一个真正的“处理器”。 下图为Rocket-chip的一种示例。一种典型的Rocket-Chip结构从图中可以看出,Rocket-Chip项目有六个组成部分:A为Core Generator,用于生成处理器核,支持Rocket-core和BOOM两种B为Cache,包括L1 Cache和L2 CacheC为RoCC,即Rocket的用户自定义加速器接口,用户可以使用Chisel自行编写加速器挂载到Rocket-chip中D为Tile,一个处理器核和一个L1 Cache(包括指令Cache和数据Cache)构成一个Tile,在Rocket-chip中通过复用各种Tile构建一个多核(同构或异构)的体系E为TileLink,为UC Berkeley自行开发的片上总线,用于连接处理器、缓存和外设F为Peripheral,包括AMBA兼容总线(AXI,AHB-Lite和APB)的发生器以及各种转换器和控制器。上图的具体示例包括了两个Tile,这些Tile连接到一个4-bank L2 Cache,该缓存本身通过AXI互连连接到外部I/O和存储系统。 Tile 1内是一个乱序的BOOM内核,它具有FPU,L1指令和数据缓存以及实现RoCC接口的加速器。 Tile 2和Tile 1类似,但是它使用的是顺序执行的Rocket-core内核,并且具有不同的L1数据缓存参数。Rocket-core和BOOM微架构简介通过上一节的介绍你应该已经知道了Rocket-chip和Rocket-core以及BOOM的关系。 本节介绍Rocket-core和BOOM的微架构,了解微架构对于体系结构工程师来说可以学习其设计思想,提升处理器设计的能力; 而对于处理器的用户而言也可以根据自己的需要选择合适的处理器来使用。Rocket的微架构Rocket-core是一个标准的五级流水处理器(下图1为其流水线示意图),它支持开源RV64GC RISC-V指令集,并使用Chisel硬件构造语言编写。 Rocket-core具有一个MMU,该MMU支持基于页面的虚拟内存,无阻塞数据缓存,同时支持分支预测功能。分支预测是可配置的,并由分支目标缓冲区(BTB),分支历史表(BHT)和返回地址堆栈(RAS)提供。 对于浮点运算,Rocket利用Berkeley的Chisel浮点运算单元实现。 Rocket还支持RISC-V的内核、管理员和用户三种特权等级,可以启动Linux操作系统。Rocket-Core的流水线BOOM的微架构BOOM的全称是Berkeley Out-of-Order Machine,顾名思义它是乱序执行的处理器(不过严格来讲,BOOM和上述的Rocket一样,也是一个处理器生成器,它可以根据配置生成一系列不同的BOOM Core)。BOOM的流水线如下图2所示。BOOM的流水线从上图中不难看出,BOOM的流水线分为10个阶段,分别是取指(Fetch),译码(Decode),寄存器重命名(Register Rename),派遣(Dispatch),发射(Issue),读寄存器(Register Read),执行(Execute),访存(Memory),写回(Writeback)和提交(Commit)。但是在实际实现过程中,重命名逻辑被分成两部分,分别与译码和派遣合并在一起;发射和读寄存器两个阶段也被合并在一起;而提交由于是异步行为,不算做在流水线中。因此10个阶段实际上被压缩在图中所示的7级流水线中。接下来分别介绍一下每个阶段的大致行为,对于乱序处理器不够熟悉的读者看过以后应该也能对一个典型的乱序处理器有一个直观的认识了。取指(Fetch)处理器将指令从指令存储器(一般是L1指令缓存)中取出来放到一个叫做Fetch Buffer的队列中,同时进行分支预测,必要时对取来的指令进行重定向。译码(Decode)在译码阶段处理器将指令从Fetch Buffer中取出,通过译码逻辑得到适当的微操作(UOP)用于放进流水线中。寄存器重命名(Register Rename)将RISC-V ISA规定的逻辑上的寄存器(即x1-x31)重命名为(即映射到)片上的物理寄存器中。派遣(Dispatch)将UOP写入到一组发射队列中。发射(Issue)处在发射队列中的指令等待其所有依赖的寄存器都可用(即前面的指令已经算出它们的值)之后,就可以进行发射。 从这个阶段起,指令开始乱序执行。读寄存器(Register Read)被发射的指令首先从寄存器堆或者从旁路逻辑中读取所需的寄存器。执行(Execute)指令的计算在这个阶段完成,访存指令也在这个阶段完成目标地址的计算。访存(Memory)加载/存储单元(Load/Store Unit)有三个队列,分别是加载地址队列(LAQ),存储地址队列(SAQ)和存储数据队列(SDQ)。 当地址进入LAQ时加载指令被发送到存储器中;而存储指令则要等到指令提交(Commit)阶段才能被发送到存储器。写回(Writeback)ALU操作和加载操作的结果写回到目标寄存器中。提交(Commit)重排序缓冲区(ROB)跟踪着流水线中每条指令的状态。当ROB的Header处于空闲状态时,ROB提交指令。 对于存储指令来说,ROB向位于存储队列(SAQ / SDQ)头的存储指令发出信号,它现在可以将其数据写入存储器中。使用Rocket-Chip进行实验本文接下来为大家演示一下如何使用Rocket-Chip(包括Rocket和BOOM)进行实验。 虽然Rocket-Chip的项目直接可以用来进行EDA仿真、FPGA(官方仅支持使用Firesim在AWS F1云FPGA上运行)和ASIC流程,但笔者还是建议大家使用chipyard项目开展实验。Chipyard是用于敏捷开发基于Chisel的SoC的开源框架。 它让用户能够利用Chisel HDL,Rocket-Chip SoC生成器和其他Berkeley项目来生产RISC-V SoC,它具有从MMIO映射的外设到定制加速器的所有功能。 Chipyard项目包含处理器内核(Rocket,BOOM,Ariane),加速器(Hwacha),存储器系统以及其他外围设备和工具,以帮助用户快速创建功能齐全的SoC。 Chipyard支持多种敏捷硬件开发流程,包括软件RTL仿真,FPGA加速仿真(FireSim),自动化VLSI流程(Hammer)以及针对裸机和基于Linux的系统的软件开发。本节接下来为大家演示在Chipyard项目中分别使用Rocket和BOOM运行典型的处理器跑分程序Dhrystone。 (本实验使用的环境为Ubuntu 16.04)部署Chipyard首先获取Chipyard项目,并进行初始化。git clone https://github.com/ucb-bar/chipyard.git

cd chipyard

./scripts/init-submodules-no-riscv-tools.sh上述步骤会clone Chipyard及其子模块,接下来的步骤是安装RISC-V Tools。 有些同学可能以前装过RISC-V tools,但这里最好使用它的脚本重新安装一下,因为版本不匹配后续可能会出现意外问题。 下面这个步骤就是安装RISC-V Tools,这一部分编译需要较长时间,可以开启并行选项export MAKEFLAGS=-j8以加快速度。./scripts/build-toolchains.sh上述脚本成功执行后会在当前目录下生成env.sh,以后每次新开启终端需要执行该脚本以设置环境变量:source ./env.sh仿真工具的选择Chipyard(包括Rocket-Chip)项目支持使用Verilator或Synopsys VCS进行精确到时钟周期的仿真。前者是可免费使用的开源软件,本文接下来介绍一下如何使用开源的Verilator进行仿真。请读者在进行下面操作之前先按照此文档以源码方式安装verilator(通过apt安装会有问题)。使用Rocket进行Dhrystone测试使用Verilator仿真,先进入sims/verilator目录cd sims/verilatorChipyard的仿真分成两个步骤,第一步是使用Chisel代码生成Verilog代码,然后用Verilator编译生成可执行文件; 第二步是执行可执行文件,这一步处理器就会仿真执行用户指定的软件代码。# 先选择RocketConfig进行编译

make CONFIG=RocketConfig

# 然后运行dhrystone程序

./simulator-chipyard-RocketConfig $RISCV/riscv64-unknown-elf/share/riscv-tests/benchmarks/dhrystone.riscv执行结果如下图所示(读者如果自行操作,显示的内容可能与图中不同,这是因为我修改了Dhrystone的代码,让它能显示周期数与CPI):可以看到Dhrystones per Second为1952(程序中假定频率为1MHz)。有些同学可能会比较疑惑上面的CONFIG=RocketConfig是什么意思,其实这是Chisel灵活配置的一个体现。 打开文件generators/chipyard/src/main/scala/config/RocketConfigs.scala可以发现有一个类名字叫做RocketConfig,如下图。RocketConig配置从这段代码中可以看到我们使用的RocketConfig配置了1个大Rocket核,带有L2Cache; 还有许多其他信息,读者可以从名称和注释上理解,这里就不一一解释了。读者也可以将make CONFIG=RocketConfig后面的内容换掉,换成这个文件里的其它配置,甚至可以自己编写配置,生成自己需要的配置。使用BOOM进行Dhrystone测试使用BOOM的方式和Rocket几乎一样,还是在sims/verilator目录中,这次我们将Config换一下,换成BOOM的默认配置。# 选择LargeBoomConfig进行编译

make CONFIG=LargeBoomConfig

# 然后运行dhrystone程序

./simulator-chipyard-LargeBoomConfig $RISCV/riscv64-unknown-elf/share/riscv-tests/benchmarks/dhrystone.riscv执行结果如下图所示(仿真所需时间可能较长):可以看到Dhrystones per Second为2735(程序中假定频率为1MHz),和顺序执行的Rocket相比还是有很大进步。BOOM的配置文件在generators/chipyard/src/main/scala/config/BoomConfigs.scala中,读者也可以自行编写Boom的其它配置项。总结本文介绍了笔者认为RISC-V开源处理器中最有代表性的Rocket和BOOM的微架构, 介绍了Chipyard项目的在EDA仿真流程中的使用方法,有了Chipyard,用户可以方便地使用UC Berkeley的众多项目(除了上述Rocket和BOOM外,还包括Hwacha RoCC、IceNet网络接口等项目),基于自己的需要构建自己的整个SoC平台。 通过这篇文章希望读者能学会快速上手使用Rocket和BOOM处理器,并对其大致情况与性能有了一个直接的认识。如果读者想了解更多有关Chipyard的信息,可查阅Chipyard官方文档。参考文献- [1] Rocket-chip Technical Report- [2] RISC-BOOM Document编辑于 2021-01-06 11:00RISC-V芯片(集成电路)精简指令集(RISC)​赞同 146​​34 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录IA&C Lab@Fudan智能体系架构与开源芯片

立讯精密工业股份有限公司_百度百科

工业股份有限公司_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心收藏查看我的收藏0有用+10立讯精密工业股份有限公司播报讨论上传视频东莞市一家装备制造公司立讯精密工业股份有限公司总部位于中国广东省东莞市, [30]于2004年05月24日在深圳市市场监督管理局宝安局登记成立。法定代表人王来春,公司经营范围包括生产经营连接线、连接器、电脑周边设备、塑胶五金制品等。2023年9月12日,全国工商联发布《2023中国民营企业500强榜单》,立讯精密工业股份有限公司以21402839万元营业收入位列榜单29位。 [1] [32-33]公司名称立讯精密工业股份有限公司成立时间2004年05月24日总部地点广东东莞 [30]公司类型股份有限公司(中外合资,上市)年营业额2140.28 亿元 [2-3] [19] [21] [27] [32](2022年)员工数54642人(2019年) [2]登记机关深圳市市场监督管理局宝安局发照时间2016年11月29日目录1发展历程2企业荣誉3社会责任发展历程播报编辑2014年,立讯精密在兴宁华丰工业园设立兴宁立讯精密工业有限公司。为进一步促进企业发展,2015年,该公司在兴宁市产业转移工业园建设区域中心,计划用工规模达到了3000至5000人。 [13]2021年4月,立讯精密工业股份有限公司计划投资实施兴宁立讯技术高速线缆制造基地项目,项目类别为计算机、通信和其他电子设备制造业,实施地为兴宁市工业园。立讯精密下属企业广东讯源实业集团有限公司计划投资实施半导体原材料生产项目,项目类别为工业,实施地为平远县石正镇。 [14]2022年3月,立讯精密旗下分公司兴宁立讯技术有限公司的首个新建分厂,在大坪镇正式投产,该厂共设8条生产线,大坪镇是兴宁立讯技术的第一个乡镇试点,分厂开设成功后,将把这个经验复制到兴宁的每个镇。 [17]2022年5月18日,EXEED星途与立讯精密的星途揽月交车仪式在丰顺县广东讯源营养科技有限公司举行,标志着立讯精密将携手奇瑞汽车,在新能源汽车的整车研发及制造方面开拓新的市场领域,推进丰顺县制造业高质量发展。 [15] [18]2023年7月6日,天眼查显示,立讯精密发生工商变更,注册资本由约70.8亿元人民币增至约71.3亿元人民币。 [26]企业荣誉播报编辑2019年8月29日,广东省企业联合会、广东省企业家协会联合公布2019广东企业500强榜单,立讯精密工业股份有限公司排名第67 [4];广东省企业联合会、广东省企业家协会联合公布2019广东制造业100强榜单,立讯精密工业股份有限公司排名第20 [4];广东省企业联合会、广东省企业家协会联合公布2019 年广东创新企业 100 强榜单(排名不分先后),立讯精密工业股份有限公司上榜。 [4]2019年9月1日,2019中国企业500强发布,立讯精密工业股份有限公司位列第471位; [5]2019中国制造业企业500强榜单发布,立讯精密工业股份有限公司名列第231位。 [1]2020年1月9日,胡润研究院发布《2019胡润中国500强民营企业》,立讯精密工业以市值1820亿元位列第28位。 [6]2020年1月11日,“2019中国企业社会责任500优榜单”发布,立讯精密工业股份有限公司位列第193位。 [7]2020年7月,2020年《财富》中国500强,立讯精密工业股份有限公司排名第164位。 [8]2020年9月10日,立讯精密工业股份有限公司位列“2020中国民营企业500强”第121位。 [3]2020年9月10日,立讯精密工业股份有限公司位列“2020中国制造业民营企业500强”第63位。 [9]2021年7月,2021年《财富》中国500强排行榜,立讯精密工业股份有限公司排名122位。 [10]2021年9月25日,立讯精密工业股份有限公司位列“2021中国民营企业500强”第89位。 [11]2021年9月25日,入选“2021中国企业500强”榜单,排名第239位。 [12]2022年4月,兴宁市公布的“2021年度纳税500万元以上的工业企业名单”中,立讯精密工业股份有限公司旗下分公司兴宁立讯技术有限公司名列其中。 [16-17]2022年6月8日,位列“2021广东省百强民营企业”第16位。 [19]2022年7月,上榜2022年《财富》中国500强排行榜,位列第90位。 [20]2022年8月,入选《2022世界品牌500强》榜单,位列403位。 [25]2022年9月,入选“2022中国企业500强”榜单,排名第171位。 [21]2022年9月,入选“2022中国民营企业500强”榜单,排名第50位。 [22]2022年9月,入选“2022中国制造业民营企业500强”榜单,排名第28位。 [23-24]2023年7月,2023年《财富》中国上市公司500强排行榜第66位。 [27]2023年7月,位列2023年《财富》中国500强排行榜第138位。 [28]2023年8月,以31,817.4 百万美元营收,入选2023年《财富》世界500强排行榜,排名第479位。 [29]2023年9月12日,全国工商联发布《2023中国民营企业500强榜单》,立讯精密工业股份有限公司以21402839万元营业收入位列榜单29位。 [32-33]2023年9月,入选福布斯“中国企业跨国经营50强”榜单 [34]。社会责任播报编辑2023年8月4日,立讯精密旗下立讯精密工业(保定)有限公司,通过中华慈善总会向灾区捐赠1000万元,用于河北涿州受灾严重地区的赈灾救援与灾后重建工作。 [31]新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

合格风水师必掌握的数据:各地磁偏角度数 - 知乎

合格风水师必掌握的数据:各地磁偏角度数 - 知乎首发于上清道院切换模式写文章登录/注册合格风水师必掌握的数据:各地磁偏角度数上清敏利王道长​王敏利道长国家地质局权威公布信息《全国各省市磁偏角数据》合格风水师必须掌握的数据--各地磁偏角度数广东省各市磁偏角市 磁偏角 市 磁偏角深圳 -3.0° 江门 -2.8°广州 -3.0° 揭阳 -3.6°潮州 -3.6° 茂名 -2.3°东莞 -3.0° 梅州 -3.7°佛山 -2.9° 清远 -3.0°河源 -3.3° 汕头 -3.6°惠州 -3.2° 汕尾 -3.3°韶关 -3.3° 阳江 -2.5°云浮 -2.7° 湛江 -2.2°肇庆 -2.8° 中山 -2.9°珠海 -2.9° 江西省各市磁偏角市 磁偏角 市 磁偏角赣州 -3.7° 九江 -4.7°南昌 -4.4° 萍乡 -3.8°抚州 -4.4° 上饶 -4.8°吉安 -4.0° 新余 -4.1°景德镇 -4.8° 宜春 -4.0°鹰潭 -4.6° 安徽省各市磁偏角市 磁偏角 市 磁偏角安庆 -5.1° 淮南 -5.5°蚌埠 -5.7° 黄山 -5.2°毫州 -5.4° 六安 -5.2°巢湖 -5.4° 马鞍山 -5.6°池州 -5.2° 宿州 -5.7°滁州 -5.7° 铜陵 -5.3°阜阳 -5.3° 芜湖 -5.5°合肥 -5.4° 宣城 -5.5°淮北 -5.7° 福建省各市磁偏角市 磁偏角 市 磁偏角福州 -4.5° 泉州 -4.2°龙岩 -4.0° 三明 -4.3°南平 -4.5° 厦门 -4.0°宁德 -4.7° 漳州 -4.0°莆田 -4.4°甘肃省各市磁偏角市 磁偏角 市 磁偏角白银 -2.5° 临夏 -2.2°定西 -2.6° 陇南 -2.5°甘南 -2.1° 平凉 -3.2°嘉谷关 -2.1° 庆阳 -3.5°金昌 -2.0° 天水 -2.8°酒泉 -0.9° 武威 -2.2°兰州 -2.4° 张掖 -1.5° 广西省各市洗偏角市 磁偏角 市 磁偏角百色 -1.9° 贺州 -2.9°北海 -2.0° 来宾 -2.3°崇左 -1.9° 柳州 -2.4°防城港 -1.9° 南宁 -2.1°贵港 -2.3° 钦州 -2.0°桂林 -2.7° 梧州 -2.7°河池 -2.3° 玉林 贵州市各市磁偏角市 磁偏角 市 磁偏角安顺 -2.0° 铜仁 -2.9°毕节 -2.0° 遵义 -2.4°贵阳 -2.2°六盘水 -1.9° 海南省各市的磁偏角市 磁偏角 市 磁偏角海口 -2.0° 三亚 -1.7°三沙市 -1.8° 儋州市 -1.8°琼海市 -1.9° 万宁市 -1.9°五指山市 -1.7°文昌市 -2.0° 东方市 -1.7° 河北省各市的磁偏角市 磁偏角 市 磁偏角保定 -6.4° 秦皇岛 -7.9°沧州 -6.7° 石家庄 -6.0°承德 -7.7° 唐山 -7.4°邯郸 -5.7° 邢台 -5.8°衡水 -6.3° 张家口 -6.7°廊坊 -7.0° 河南省各市的磁偏角市 磁偏角 市 磁偏角安阳 -5.6° 平顶山 -4.8°鹤壁 -5.5° 濮阳 -5.7°济源 -4.9° 三门峡 -4.4°焦作 -5.1° 商丘 -5.6°开封 -5.3° 新乡 -5.3°洛阳 -4.7° 信阳 -4.7°漯河 -4.7° 许昌 -5.0°南阳 -4.5° 郑州 -5.1°周口 -5.1° 驻马店 -4.9° 黑龙江省各市的磁偏角市 磁偏角 市 磁偏角大庆 -10.9° 牡丹江 -11.5°大兴安岭 -12.5° 七台河 -11.2°哈尔滨 -10.9° 齐齐哈尔 -10.9°鹤岗 -11.7° 双鸭山 -11.5°黑河 -12.3° 伊春 -11.7°鸡西 -11.1° 绥化 -11.2°佳木斯 -11.5° 湖南省各市的磁偏角市 磁偏角 市 磁偏角长沙 -3.7° 张家界 -3.3°株洲 -3.7° 益阳 -3.7°湘潭 -3.7° 永州 -3.2°衡阳 -3.4° 坏化 -3.0°邵阳 -3.3° 娄底 -3.5°岳阳 -4.0° 湘西 -3.1°常德 -3.6° 郴州 -3.3° 湖北省各市的磁偏角市 磁偏角 市 磁偏角鄂州 -4.6° 天门 -4.2°恩施 -3.3° 武汉 -4.5°黄冈 -4.6° 仙桃 -4.2°黄石 -4.6° 咸宁 -4.3°荆门 -4.0° 襄樊 -4.2°荆州 -3.9° 孝感 -4.4°潜江 -4.1° 宜昌 -3.8°神农架林区 -3.8°十堰 -3.9°随州 -4.5° 吉林省各市的磁偏角市 磁偏角 市 磁偏角白城 -10.2° 四平 -9.8°白山 -9.7° 松源 -3.8°长春 -10.1° 通化 -9.6°吉林 -10.1° 延边 -10.3°辽源 -9.8° 江苏省各市的磁偏角市 磁偏角 市 磁偏角常州 -5.9° 宿迁 -6.1°淮安 -6.2° 泰州 -6.1°连云港 -6.5° 无锡 -5.9°南京 -5.8° 徐州 -5.9°南通 -6.2° 盐城 -6.4°苏州 -5.9° 扬州 -6.0°镇江 -5.9° 辽宁省各市的磁偏角市 磁偏角 市 磁偏角鞍山 -8.9° 葫芦岛 -8.4°本溪 -9.1° 锦州 -8.5°朝阳 -8.5° 辽阳 -9.0°大连 -8.1° 盘锦 -8.7°丹东 -8.9° 沈阳 -9.2°抚顺 -9.3° 铁岭 -9.4°阜新 -8.9° 营口 -8.7° 内蒙古各市的磁偏角市 磁偏角 市 磁偏角阿拉善盟 -3.2° 呼伦贝尔 -10.3°巴彦卓尔 -4.0° 通辽 -9.5°包头 -4.9° 乌海 -3.7°赤峰 -8.3° 乌兰察布 -6.1°鄂尔多斯 -4.7° 锡林郭勒盟 -7.8°呼和浩特 -5.6° 兴安盟 -10.1° 宁夏省各市的磁偏角市 磁偏角 市 磁偏角固原 -3.1° 吴忠 -3.3°凉山 -1.5° 银川 -3.4°石嘴山 -3.5° 中卫 -2.9° 青海省各市的磁偏角市 磁偏角 市 磁偏角果洛 -1.3° 海西 -0.6°海北 -1.6° 黄南 -1.8°海东 -1.9° 西宁 -1.8°海南 -2.0° 玉树 -0.6° 山东省各市的磁偏角市 磁偏角 市 磁偏角滨州 -6.8° 青岛 -7.1°德州 -6.4° 日照 -6.7°东营 -7.0° 泰安 -6.3°菏泽 -5.7° 威海 -7.8°济南 -6.4° 潍坊 -6.9°济宁 -6.0° 烟台 -7.6°莱芜 -6.5° 枣庄 -6.1°聊城 -6.1° 淄博 -6.7°临沂 -6.4° 山西省各市的磁偏角市 磁偏角 市 磁偏角长治 -5.2° 太原 -5.3°大同 -6.0° 忻州 -5.5°晋城 -5.0° 阳泉 -5.7°临汾 -4.7° 运城 -4.4°吕梁 -4.8°朔州 -5.6° 陕西省各市的磁偏角市 磁偏角 市 磁偏角安康 -3.5° 渭南 -3.9°宝鸡 -3.2° 西安 -3.7°汉中 -3.0° 咸阳 -3.6°商洛 -3.9° 延安 -4.2°铜川 -3.8° 榆林 -4.5° 四川省各市的磁偏角市 磁偏角 市 磁偏角阿坝 -1.7° 眉山 -2.0°巴中 -2.8° 绵阳 -2.2°成都 -2.0° 内江 -2.2°达州 -2.9° 南充 -2.5°德阳 -2.2° 攀枝花 -1.3°甘孜 -1.6° 遂宁 -2.4°广安 -2.6° 雅安 -1.8°广元 -2.6° 宜宾 -2.0°乐山 -1.9° 资阳 -2.1°泸州 -2.2° 自贡 -2.1° 西藏省各市的磁偏角市 磁偏角 市 磁偏角阿里 1.8° 那曲 0.2°昌都 -0.7° 日喀则 0.4°拉萨 0.2° 山南 0.1°林芝 -0.2° 新疆省各市的磁偏角市 磁偏角 市 磁偏角阿克苏 3.9° 喀什 4.1°阿勒泰 3.7° 克拉玛依 4.2°巴州 2.9° 克州 2.9°博州 -1.9° 塔城 5.1°昌吉州 3.0° 吐鲁番 2.3°哈密 0.9° 乌鲁木齐 2.9°和田 2.9° 伊犁州直 4.6 云南省各市的磁偏角市 磁偏角 市 磁偏角版纳 -1.0° 昆明 -1.4°保山 -0.9° 丽江 -1.1°楚雄 -1.2° 临沧 -1.0°大理 -1.1° 怒江 -0.9°德宏 -0.8° 普洱 -1.0°迪庆 -1.1° 曲靖 -1.6°红河 -1.4° 文山 -1.5°玉溪 -1.3° 昭通 -1.7° 浙江省各市的磁偏角市 磁偏角 市 磁偏角杭州 -5.6° 衢州 -5.1°湖州 -5.8° 绍兴 -5.6°嘉兴 -5.8° 台州 -5.4°金华 -5.3° 温州 -5.2°丽水 -5.2° 舟山 -5.9°宁波 -5.8° 特别经济行政区市 磁偏角 市 磁偏角上海 -6.1° 北京 -7.0°重庆 -2.5° 深圳 -3.0°香港 -3.0° 台湾 -4.6°磁偏角及其在风水实践上的应用磁偏角的概念和定义— 指南针(也叫指北针)是我国四大发明之一,为人类的天文,航海和探险事业做出了突出的贡献。古人也很早就发现,磁针的南北方向和地球真正的南北极并没有完全百分之百的吻合,而是有一定的偏差,这个偏差的角度就叫磁偏角。— 定义:磁偏角是指地球上任一处的磁北方向和正北方向之间的夹角。当地磁北向实际偏东时,地磁偏角为正,反之为负。— 磁偏角在地球上不同的位置,数值是不同的,大小正负各不相同。而同一地点的磁偏角,随着时间的推移也在变化。— 地磁偏角在历史上最早由我国北宋科学家沈括发现并记录在著作《梦溪笔谈》中。而西方最早的记录则在此之后约400年。一些城市的磁偏角— 想知道某一地方的磁偏角,可以在网站上查到。— 网址:https://www.magn,etic-declin,http://ation.com/— 北京: -6° 37' WEST— 温哥华: +16.42 EAST— 深圳: -2° 37' WEST— 上海: -5° 35' WEST— 西藏: 0° 17' EAST— 西安: -3° 30' WEST— 南京: -5° 21' WEST— 多伦多: -10° 32' WEST— 我们看到同样是在加拿大,多伦多和温哥华就相差很多,一正一负。我国的特点是西藏接近于零,其他地方多为负值。磁偏角及其在风水实践上的应用 实际应用— 如北京和多伦多的磁偏角都是负值,在Google地图上量出方位后,要将这个方向顺时针移动。从角度大小上来看,是增加角度值。— 测量方法:可以在Google地图上直接用量角器量,也可以上http://goo.glecompass.com网,网络自带量角功能,后者会更准确。— 值得注意的是,磁偏角随着时间一直在变,如北京目前:-6°37',2000年为:-5°16',1900年为:-3°7'。再早的数据就查不到了,所以故宫初建时的磁偏角是多少我们不知道。— 北京目前的磁偏角是负的6°37度',向西移动(顺时针)6°37'度,为184°37'。即目前故宫坐北朝南偏西4°37'。有方便的朋友可以去现场量一下,不一定要专业的罗盘,可以用野营或者军用指南针质量也非常好。— 如果我们想知道某一建筑的座山朝向,我们可以在Google地图上量出来,也可以用罗盘去现场实际测量。如果两个方法都准确的话,两个数值的差就应该是磁偏角。— 故宫坐北向南,Googlecompass地图上量得其朝向为向南偏东约2度,即178度。据网络文章介绍,说中科院曾测过这个夹角为2度10分。看来基本对应的上。— 当代社会,特别是大都市,钢筋水泥结构的高楼林立,各种高压电缆和信号塔所产生的电磁信号互相干扰。有时用罗盘现场测量真的很难测准确,这时我们可以先在地图上量出这个角度,使自己心中有数,然后到现场去做实际测量和验证。如果两者能对应的上,基本上可以肯定这个结果是可靠的。— 换句话说,如果某些地方离得很远,一时无法到达,或者由于各种管制不允许靠近,我们想知道它的坐向,就可以在Google地图上量出来,然后再以磁偏角进行修正,因为风水上所要的角度是真正磁场的角度。发布于 2022-10-28 08:54风水风水相师​赞同 4​​2 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录上