-
【案例共创】基于仓颉编程语言+DeepSeek实现模拟课堂讨论助手项目概述本项目旨在通过华为开发者空间云主机,结合仓颉编程语言和DeepSeek API,开发一个简单的模拟课堂讨论助手。用户可以通过命令行输入相关知识点或问题,应用会返回该知识点的详细解释和记忆方法。这个助手可以用诙谐幽默的方式学习各种知识。适用对象喜欢用诙谐幽默的方式学习知识的爱好者。案例流程说明:① 使用CodeArts IDE for Cangjie编辑器开发仓颉程序调用;② 领取免费 DeepSeeK Tokens;③ 仓颉对接DeepSeek接口。开发步骤1. 环境准备注册并登录华为开发者空间:访问华为开发者空间官网,注册并登录账户。创建云主机实例:在华为开发者空间中创建一个新的云主机实例,选择默认的配置。使用开箱即用的云主机实例开发,点击 打开云主机 再点击打开远程桌面。图示即可看出是开箱即用的CodeArts IDE for Cangjie编辑器2. 项目初始化创建新项目:首先我们进入到开发者空间后,双击打开CodeArts IDE for Cangjie,在CodeArts IDE for Cangjie中创建一个新的项目,命名为“demo”(随便你怎么命名)。名称和位置可以自定义,产物类型选择executable。产物类型说明: executable,可执行文件;static,静态库,是一组预先编译好的目标文件的集合;dynamic,动态库,是一种在程序运行时才被加载到内存中的库文件,多个程序共享一个动态库副本,而不是像静态库那样每个程序都包含一份完整的副本。配置项目结构:设置项目的基本目录结构,包括源代码文件、配置文件等。创建项目后,打开src目录下main.cj文件,在预置代码中增加函数和函数调用代码(没有的话可以自己新建一份,代码内容下文我有附上)。然后点击右上的运行按钮运行项目,在终端中查看输出内容。如果遇到弹窗提示运行/调试配置,点击确定继续操作。修改后的main.cj文件代码:package demo func println_add(a: Int64, b:Int64): Int64 { let number: Int64 = a+b println(number) return number } main(): Int64 { println("hello world") println_add(3,4) println("hello Cangjie") return 0 } 调试项目:点击右上调试按钮,首次会提示配置调试,点击新增配置项,选择Cangjie(cjdb)Debug——launch。调试模式说明:Launch模式,启动调试器的同时加载被调程序;Attach,针对正在运行的程序,附加到已启动的程序。然后可以在main.cj代码中设置断点,再次点击调试按钮。可以在顶部看到调试按钮,在左侧看到调试过程中的变量、监视、调用堆栈、断点信息。2.1 版本管理 可选 (链接到gitcode)点完之后会要求你填入访问密钥先登录gitcode 然后点访问令牌 新建访问令牌 一直下一步即可 会得到一串令牌 然后将令牌输入即可。然后新建一个仓库 名字你自己取当前项目代码仓是空仓库你可以通过克隆仓库开始或使用以下方式为你的项目添加文件:或为你的项目添加以下文件: 添加 README.md添加 LICENSE添加 .gitignore命令行指引你还可以按照以下说明从你的电脑中上传现有文件或项目。Git 全局设置git config --global [user.name](http://user.name/) "weixin_41024010" git config --global user.email "[weixin_41024010@noreply.gitcode.com](mailto:weixin_41024010@noreply.gitcode.com)" 创建一个新仓库git clone [https://gitcode.com/weixin_41024010/test.git](https://gitcode.com/weixin_41024010/test.git) cd test echo "# test" >> [README.md](http://readme.md/) git add [README.md](http://readme.md/) git commit -m "add README" git branch -m main git push -u origin main推送现有的文件cd existing_folder git init git remote add origin [https://gitcode.com/weixin_41024010/test.git](https://gitcode.com/weixin_41024010/test.git) git add . git commit -m "Initial commit" git branch -m main git push -u origin main推送现有的 Git 仓库cd existing_repo git remote rename origin old-origin git remote add origin [https://gitcode.com/weixin_41024010/test.git](https://gitcode.com/weixin_41024010/test.git) git push -u origin --all git push -u origin --tags � 配置好git 就可以使用了 ,但是有个地方要先设置一下:提交文件限制改大一些 ,不然如果没有配置好GIT忽略文件的话 ,会推送不上去。改动可以从这里提交 ,这样就完成了代码的版本控制3. Cangjie对接DeepSeek接口华为云提供了单模型200万免费Tokens,包含DeepSeek-R1&V3满血版,我们可以登录华为云ModelArts Studio(MaaS)控制台领取免费额度,这里我们选择DeepSeek-R1满血版来搭建我们的工程。在云主机桌面底部菜单栏,点击打开火狐浏览器。用火狐浏览器访问ModelArts Studio首页:https://www.huaweicloud.com/product/modelarts/studio.html,点击ModelArts Studio控制台跳转到登录界面,按照登录界面提示登录,即可进入ModelArts Studio控制台。你也可以在本地浏览器打开进行相关操作。领取后点击调用说明,可以获取到对应的API地址、模型名称。当然API Key也要创建下,这里创建很简单,按提示跳转过去就成,我这里就不介绍了。记录对应的API地址、模型名称、API Key留作下面步骤使用。4. Cangjie对接DeepSeek编写代码进入云主机桌面,右键选择Open Terminal Here打开终端命令窗口,克隆仓颉示例代码仓库。git clone https://gitcode.com/CaseDeveloper/Cangjie-Examples.git 使用CodeArts IDE for Cangjie打开AIChat示例项目。左上点击文件—打开项目,选择前面克隆的示例代码目录Cangjie-Examples下的AIChat打开。修改配置config.json配置文件,配置DeepSeek的API信息。配置项:model、model、base_url{ "model": "DeepSeek-V3", "api_key": "Your KEY", "base_url": "[https://maas-cn-southwest-2.modelarts-maas.com/v1/infers/8a062fd4-7367-4ab4-a936-5eeb8c4/v1/chat/completions](https://maas-cn-southwest-2.modelarts-maas.com/v1/infers/8a062fd4-7367-4ab4-a936-5eeb8fb821c4/v1/chat/completions)", "system_prompt": "模拟课堂讨论 - Simulated Classroom Discussion,I need you to help me memorize the noun explanation, after I type a noun, you will simulate 5 students in the class to generate their speeches about the noun. The discussion must be humorous, and easy to understand. The entire conversation and instructions should be provided in Chinese. The first term is: 主题是" } 打开main.cj,运行项目,我们就可跟AI助手进行聊天了。(* 注意:打开main.cj可能提示Console标红,不影响程序运行,可以忽略。亦可以删除import std.console.Console重新编写该导入语句)至此,基于仓颉编程语言+DeepSeek实现模拟课堂讨论助手开发就完成了。接下来我们在聊天项目基础上,改编成“模拟课堂讨论助手”助手,有时候英文提示词会更有效其实超级简单,我们只需要再修改 “system_prompt” 即可。修改内容如下:"system_prompt": "模拟课堂讨论 - Simulated Classroom Discussion,I need you to help me memorize the noun explanation, after I type a noun, you will simulate 5 students in the class to generate their speeches about the noun. The discussion must be humorous, and easy to understand. The entire conversation and instructions should be provided in Chinese. The first term is: 主题是" 运行程序:最后我把代码完整的给大家呈现下(chat.cj):所有代码开源在git clone [https://gitcode.com/weixin_41024010/HUAWEIDEMO.git](https://gitcode.com/weixin_41024010/HUAWEIDEMO.git) 大家可以克隆我的代码使用。使用时要根目录是CHATDEEPSEEK (就是如图所示)不然编译会有问题。具体代码如下:package openai_chat import encoding.json.stream.* import net.http.ClientBuilder import net.http.HttpHeaders import net.http.HttpRequestBuilder import net.tls.TlsClientConfig import net.tls.CertificateVerifyMode import std.collection.ArrayList import std.io.ByteArrayStream import std.time.Duration public struct FunctionCall <: JsonDeserializable<FunctionCall> & JsonSerializable { public let name: String public let arguments: String public init(name: String, arguments: String) { this.name = name this.arguments = arguments } public static func fromJson(r: JsonReader): FunctionCall { var temp_name: String = "" var temp_arguments: String = "" while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "name" => temp_name = r.readValue<String>() case "arguments" => temp_arguments = r.readValue<String>() case _ => r.skip() } } r.endObject() break case _ => throw Exception("can't deserialize for FunctionCall") } } return FunctionCall(temp_name, temp_arguments) } public func toJson(w: JsonWriter) { w.startObject() w.writeName("name").writeValue<String>(this.name) w.writeName("arguments").writeValue<String>(this.arguments) w.endObject() w.flush() } } public enum RoleType { User | Assistant | System | Function | NULL } public func role_type_to_str(role: RoleType): Option<String> { return match(role) { case RoleType.User => Some("user") case RoleType.Assistant => Some("assistant") case RoleType.System => Some("system") case RoleType.Function => Some("function") case RoleType.NULL => None } } public func str_to_role_type(role_option_str: Option<String>): RoleType { return match(role_option_str) { case Some(role_option) => match (role_option) { case "user" => RoleType.User case "assistant" => RoleType.Assistant case "system" => RoleType.System case "function" => RoleType.Function case x => throw Exception("unknow enum ${x} for RoleType") } case None => RoleType.NULL } } public struct Message<: JsonDeserializable<Message> & JsonSerializable { public let role: RoleType public var content: String public let function_call: Option<FunctionCall> public init(role: RoleType, content: String) { this.role = role this.content = content this.function_call = None } public init(role: RoleType, content: String, function_call: Option<FunctionCall>) { this.role = role this.content = content this.function_call = function_call } public static func fromJson(r: JsonReader): Message { var temp_role: Option<String> = None // role may null in stream chat var temp_content: String = "" var temp_functional_call: Option<FunctionCall> = None while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "role" => temp_role = r.readValue<Option<String>>() case "content" => temp_content = r.readValue<String>() case "function_call" => temp_functional_call = r.readValue<Option<FunctionCall>>() case _ => r.skip() } } r.endObject() break case _ => throw Exception("can't deserialize for Message") } } let role_type: RoleType = str_to_role_type(temp_role) return Message(role_type, temp_content) } public func toJson(w: JsonWriter) { w.startObject() w.writeName("role").writeValue<Option<String>>(role_type_to_str(this.role)) w.writeName("content").writeValue<String>(this.content) w.endObject() w.flush() } } public struct ChatRequest <: JsonSerializable { private let model: String private let messages: ArrayList<Message> private let max_tokens: Int64 private let temperature: Float64 private let top_p: Float64 private let n: Int32 private let stream: Bool public init( model: String, messages: ArrayList<Message>, max_tokens: Int64, temperature: Float64, top_p: Float64, n: Int32, stream: Bool ) { // construction function with messages this.model = model this.messages = messages this.max_tokens = max_tokens this.temperature = temperature this.top_p = top_p this.n = n this.stream = stream } public init( model: String, prompt: String, history: ArrayList<(String, String)>, system_prompt: String, max_tokens: Int64, temperature: Float64, top_p: Float64, n: Int32, stream: Bool ){ // construction function with prompt and system_prompt this.model = model this.messages = ArrayList<Message>([ Message(RoleType.System, system_prompt) ]) for ((use_msg, bot_msg) in history) { this.messages.append(Message(RoleType.User, use_msg)) this.messages.append(Message(RoleType.Assistant, bot_msg)) } this.messages.append(Message(RoleType.User, prompt)) this.max_tokens = max_tokens this.temperature = temperature this.top_p = top_p this.n = n this.stream = stream } public init( model: String, prompt: String, history: ArrayList<(String, String)>, system_prompt: String, stream: Bool ){ // construction function with prompt and default arguments this.model = model this.messages = ArrayList<Message>([ Message(RoleType.System, system_prompt) ]) for ((use_msg, bot_msg) in history) { this.messages.append(Message(RoleType.User, use_msg)) this.messages.append(Message(RoleType.Assistant, bot_msg)) } this.messages.append(Message(RoleType.User, prompt)) this.max_tokens = 2000 this.temperature = 0.7 this.top_p = 1.0 this.n = 1 this.stream = stream } public func toJson(w: JsonWriter) { w.startObject() w.writeName("model").writeValue<String>(this.model) w.writeName("messages").writeValue<ArrayList<Message>>(this.messages) w.writeName("max_tokens").writeValue<Int64>(this.max_tokens) w.writeName("temperature").writeValue<Float64>(this.temperature) w.writeName("top_p").writeValue<Float64>(this.top_p) w.writeName("n").writeValue<Int32>(this.n) w.writeName("stream").writeValue<Bool>(this.stream) w.endObject() w.flush() } } public struct Choice <: JsonDeserializable<Choice> & JsonSerializable { public let index: Int32 public let message: Option<Message> public let delta: Option<Message> public let finish_reason: Option<String> public let logprobs: Option<Float64> // dashscope for qwen need public init( index: Int32, message: Option<Message>, delta: Option<Message>, finish_reason: Option<String>, logprobs: Option<Float64> ) { this.index = index this.message = message this.delta = delta this.finish_reason = finish_reason this.logprobs = logprobs } public static func fromJson(r: JsonReader): Choice { var temp_index: Int32 = -1 var temp_message: Option<Message> = None var temp_delta: Option<Message> = None var temp_finish_reason: Option<String> = None var temp_logprobs: Option<Float64> = None while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "index" => temp_index = r.readValue<Int32>() case "message" => temp_message = r.readValue<Option<Message>>() case "delta" => temp_delta = r.readValue<Option<Message>>() case "finish_reason" => temp_finish_reason = r.readValue<Option<String>>() case "logprobs" => temp_logprobs = r.readValue<Option<Float64>>() case _ => r.skip() } } r.endObject() break case _ => throw Exception("can't deserialize for Choice") } } return Choice(temp_index, temp_message, temp_delta, temp_finish_reason, temp_logprobs) } public func toJson(w: JsonWriter) { w.startObject() w.writeName("index").writeValue<Int32>(this.index) w.writeName("message").writeValue<Option<Message>>(this.message) w.writeName("delta").writeValue<Option<Message>>(this.delta) w.writeName("finish_reason").writeValue<Option<String>>(this.finish_reason) w.writeName("logprobs").writeValue<Option<Float64>>(this.logprobs) w.endObject() w.flush() } } public struct Usage <: JsonDeserializable<Usage> & JsonSerializable { public let prompt_tokens: UInt64 public let completion_tokens: UInt64 public let total_tokens: UInt64 public init(prompt_tokens: UInt64, completion_tokens: UInt64, total_tokens: UInt64) { this.prompt_tokens = prompt_tokens this.completion_tokens = completion_tokens this.total_tokens = total_tokens } public static func fromJson(r: JsonReader): Usage { var temp_prompt_tokens: UInt64 = 0 var temp_completion_tokens: UInt64 = 0 var temp_total_tokens: UInt64 = 0 while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "prompt_tokens" => temp_prompt_tokens = r.readValue<UInt64>() case "completion_tokens" => temp_completion_tokens = r.readValue<UInt64>() case "total_tokens" => temp_total_tokens = r.readValue<UInt64>() case _ => r.skip() } } r.endObject() break case _ => throw Exception("can't deserialize for Usage") } } return Usage(temp_prompt_tokens, temp_completion_tokens, temp_total_tokens) } public func toJson(w: JsonWriter) { w.startObject() w.writeName("prompt_tokens").writeValue<UInt64>(this.prompt_tokens) w.writeName("completion_tokens").writeValue<UInt64>(this.completion_tokens) w.writeName("total_tokens").writeValue<UInt64>(this.total_tokens) w.endObject() w.flush() } } public struct ChatResponse <: JsonDeserializable<ChatResponse> { // some api names `id`, and some names `request_id` public let id: Option<String> public let request_id: Option<String> public let system_fingerprint: Option<String> public let model: String public let object: String public let created: UInt64 public let choices: ArrayList<Choice> public let usage: Option<Usage> public init( id: Option<String>, request_id: Option<String>, system_fingerprint: Option<String>, model: String, object: String, created: UInt64, choices: ArrayList<Choice>, usage: Option<Usage> ) { this.id = id this.request_id = request_id this.system_fingerprint = system_fingerprint this.model = model this.object = object this.created = created this.choices = choices this.usage = usage } public static func fromJson(r: JsonReader): ChatResponse { var temp_id: Option<String> = None var temp_request_id: Option<String> = None var temp_system_fingerprint: Option<String> = None var temp_model: String = "" var temp_object: String = "" var temp_created: UInt64 = 0 var temp_choices: ArrayList<Choice> = ArrayList<Choice>([]) var temp_usage: Option<Usage> = None while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "id" => temp_id = r.readValue<Option<String>>() case "request_id" => temp_request_id = r.readValue<Option<String>>() case "system_fingerprint" => temp_system_fingerprint = r.readValue<Option<String>>() case "model" => temp_model = r.readValue<String>() case "object" => temp_object = r.readValue<String>() case "created" => temp_created = r.readValue<UInt64>() case "choices" => temp_choices = r.readValue<ArrayList<Choice>>() case "usage" => temp_usage = r.readValue<Option<Usage>>() case _ => r.skip() } } r.endObject() break case _ => throw Exception("can't deserialize for ChatResponse") } } return ChatResponse( temp_id, temp_request_id, temp_system_fingerprint, temp_model, temp_object, temp_created, temp_choices, temp_usage ) } } public func get_domain( url: String ): String { var temp_url = url if (temp_url.startsWith("https://")) { temp_url = temp_url["https://".size..] } else if (temp_url.startsWith("http://")) { temp_url = temp_url["http://".size..] } let domain: String = temp_url.split("?")[0].split("/")[0] return domain } public func build_http_client( prompt: String, env_info: EnvInfo, history: ArrayList<(String, String)>, stream!: Bool ){ // prepare input data var array_stream = ByteArrayStream() let json_writer = JsonWriter(array_stream) let chat_res = ChatRequest( env_info.model, prompt, history, env_info.system_prompt, stream ) chat_res.toJson(json_writer) let post_data: Array<UInt8> = array_stream.readToEnd() var headers: HttpHeaders = HttpHeaders() headers.add("Authorization", "Bearer ${env_info.api_key}") headers.add("Content-Type", "application/json") if (stream) { headers.add("Accept", "text/event-stream") } let request = HttpRequestBuilder() .url(env_info.base_url) .method("POST") .body(post_data) .readTimeout(Duration.second * 120) .addHeaders(headers) .build() let client = if (env_info.base_url.startsWith("https")) { var tls_client_config = TlsClientConfig() tls_client_config.verifyMode = CertificateVerifyMode.TrustAll tls_client_config.domain = get_domain(env_info.base_url) ClientBuilder() .tlsConfig(tls_client_config) .build() } else { ClientBuilder().build() } return (request, client) } public func chat( prompt: String, env_info: EnvInfo, history: ArrayList<(String, String)> ): Option<String> { let (request, client) = build_http_client( prompt, env_info, history, stream: false ) var result_message: Option<String> = None var res_text = "" try { // call api let response = client.send( request ) // read result (support max revice 100k data) let buffer = Array<Byte>(102400, item: 0) let length = response.body.read(buffer) res_text = String.fromUtf8(buffer[..length]) // println("res_text: ${res_text}") var input_stream = ByteArrayStream() input_stream.write(res_text.toArray()) // convert text to ChatResponse object let json_reader = JsonReader(input_stream) let res_object = ChatResponse.fromJson(json_reader) let choices: ArrayList<Choice> = res_object.choices if (choices.size > 0) { let message = choices[0].message.getOrThrow() // println("message: ${message.content}") result_message = Some(message.content) } else { println("can't found any response") } } catch (e: Exception) { println("ERROR: ${e.message}, reviced text is ${res_text}") } client.close() return result_message } public func stream_chat( prompt: String, env_info: EnvInfo, history: ArrayList<(String, String)> ): Option<String> { let (request, client) = build_http_client( prompt, env_info, history, stream: true ) var result_response: String = "" var temp_text2 = "" try { // call api let response = client.send( request ) // read result let buffer = Array<Byte>(10240, item: 0) var finish_reason: Option<String> = None while(finish_reason.isNone() && temp_text2 != "[DONE]") { let length = response.body.read(buffer) let res_text = String.fromUtf8(buffer[..length]) for (temp_text in res_text.split("\n")) { temp_text2 = if (temp_text.startsWith("data: ")) { temp_text["data: ".size..] } else { temp_text } if (temp_text2.size == 0) { continue } if (temp_text2 == "[DONE]") { break } // println("========================") // println("temp_text: ${temp_text2}") // println("========================") var input_stream = ByteArrayStream() input_stream.write(temp_text2.toArray()) // convert text to ChatResponse object let json_reader = JsonReader(input_stream) let res_object = ChatResponse.fromJson(json_reader) let choices: ArrayList<Choice> = res_object.choices if (choices.size > 0) { finish_reason = choices[0].finish_reason if (finish_reason.isNone()) { let delta = choices[0].delta.getOrThrow() print("${delta.content}", flush: true) result_response += delta.content } } else { println("can't found any response") } } } } catch (e: Exception) { println("ERROR: ${e.message}, reviced text is ${temp_text2}") } client.close() if (result_response.size > 0) { return Some(result_response) } else { return None } } 5. 运行和测试最后我们测试下DeepSeek,如下图:到此整个项目案例创建完成,可见是非常简单且实用的,希望能给大家带来帮助。我正在参加【案例共创】第4期 基于华为开发者空间+仓颉/DeepSeek/MCP完成应用构建开发实践 cid:link_1参考链接https://gitcode.com/weixin_41024010/HUAWEIDEMOhttps://gitcode.com/Cangjie/Cangjie-Examples
-
数据库上云有多轻松?华为云技术专家带你玩转云数据库API,智能数据底座手到擒来。 本期直播内容聚焦在华为云数据库开发者平台能力展开,重点围绕GaussDB与GaussDB(for MySQL)服务,深入浅出产品核心能力,解读开发者指南,实践一站式可视化开发者平台,助力开发者快速上手数据库服务API。直播链接:cid:link_0Q:GaussDB是如何实现故障转移和高可用的?能否详细介绍一下其故障恢复机制?A:云数据库GaussDB服务是国内首个双集群强一致方案,核心业务高可用。 双集群强一致:基于存算分离,GaussDB+鲲鹏+NOF网络+Dorado存储,全栈组合调优,集群级故障完全隔离,双AZ双活,保障RPO=0 应用无损透明倒换:故障切换快速连接、SQL操作断点继续,实现数据库HA切换时连接不断、事务自动回放,业务无感知 数据可靠:数据持久性高达99.9999999999%,保证数据安全可靠,保护业务免受故障影响 详细请参考官网:cid:link_1Q:对于没有丰富数据库开发经验的开发者来说,华为云数据库 API 的学习曲线是怎样的?有哪些资源和工具可以帮助他们快速掌握?A:开放着官网丰富的API资源和开发者资料,可以满足开发者快速学习。 参考开发者官网:https://developer.huaweicloud.com/Q:华为云数据库服务API支持哪些类型的数据库?如MySQL、PostgreSQL、MongoDB等。A:华为云官网上的已提供服务的数据库均已提供丰富的api能力。Q:华为云数据库API支持哪些编程语言,并且如何进行接口调用?A:API是基于http对外提供接口请求,任何语言都可以支持。可参考GaussDB官网如何调用API章节:https://support.huaweicloud.com/productdesc-gaussdb/gaussdb_01_057.html Q:GaussDB在处理大规模数据时的性能优化方法有哪些?A:参考官网SQL调优指南:https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0246.htmlQ:华为云数据库服务API如何与云上其他服务(如云存储、云缓存)集成?A:数据库服务API由开发者进行编排和集成,可以和其他云服务集成配套。Q:在GaussDB中如何实现细粒度的访问控制和权限管理?A:云数据库GaussDB服务支持角色和策略权限管理,角色以服务为粒度。策略以API接口为粒度进行权限拆分,授权更加精细,可以精确到某个操作、资源和条件,能够满足企业对权限最小化的安全管控要求。 详细请参考官网:https://support.huaweicloud.com/api-gaussdb/gaussdb_api_190.htmlQ:GaussDB(for MySQL)支持并行查询的话,和MySQL的innodb的引擎最大的差异在哪里?A:并行查询是GaussDB(for MySQL)服务自研特性,将查询任务进行切分并分发到多个CPU核上进行计算,充分利用CPU的多核计算资源来缩短查询时间。并行查询的性能提升倍数理论上与CPU的核数正相关。 详细请参考官网:https://support.huaweicloud.com/kerneldesc-gaussdbformysql/gaussdbformysql_20_0005.htmlQ:在开发过程中,如何利用华为云数据库进行有效的性能测试和压力测试?A:可以使用业务通用的sysbench或者benchmark基准测试工具。Q:GaussDB数据库服务 API 可以支持哪些编程语言?A:数据库服务API是通用的Restful接口,允许不同软件系统之间进行交互,支持任何语言。数据库服务API为开发者提供了对应的SDK工具,支持主流的7种语言的能力。Q:如何通过华为云数据库服务API实现数据库实例的自动扩展?A:数据库服务API支持相关场景自动扩展,如:云数据库GaussDB(for MySQL)支持自动扩缩容(Autoscaling),按需实例支持根据cpu使用率自动扩大或者缩小规格,也可以支持增加或者减少只读节点,包周期实例支持根据cpu使用率自动扩大或者缩小规格。 详细请参考官网:https://www.huaweicloud.com/product/gaussdbformysql/features.html 云数据库GaussDB支持自动扩容实例磁盘,详细请参考官网:https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_471.htmlQ:业务量提升后,GaussDB是如何扩展的A:这个需要看具体的场景,是需要扩规格还是需要扩分片。Q:华为云数据库服务API的调用费用是如何计算的?A:数据库服务按照开通资源用量收费,API调用不涉及费用。Q:GaussDB支不支持使用SQL命令修改全局参数?A:用户界面不支持。Q:发生故障以后,数据库服务的自动恢复机制是怎样的,备份恢复的操作流程是什么样的A:数据库服务提供强大的高可用能力,如部署时多副本部署,单个副本异常不影响服务正常使用等,即使数据库实例完全不可用,我们提供了丰富的恢复能力如基于时间点恢复等能力。 参考官网:https://www.huaweicloud.com/product/gaussdbformysql/features.htmlQ:如何获取华为云数据库服务API的访问权限?A:数据库服务API支持如下两种认证鉴权,可以选择其中一种进行认证鉴权。推荐使用AK/SK认证,其安全性比Token认证要高。 Token认证:通过Token认证通用请求。 AK/SK认证:通过AK(Access Key ID)/SK(Secret Access Key)加密调用请求。 详细请参考官网:https://support.huaweicloud.com/api-gaussdbformysql/gaussdbformysql_03_0001.htmlQ:GaussDB哪些监控工具可以检查数据库的健康状况?A:GaussDB云服务采集了丰富的指标并上报到了云监控服务。Q:多台弹性云服务器云主机是否可以使用同一个GaussDB数据库A:可以的。Q:华为云数据库如何支持SQL和NoSQL的混合使用?A:可以了解下HTAP数据库场景。Q:如何将现有的MySQL数据库迁移到GaussDB(for MySQL),是否有自动迁移工具?A:华为云数据复制服务(DRS)可以很方便的完成实例迁移,支持多种主流数据源,实现数据安全、稳定、实时、高速传输,提供极致交互体验。 详细请参考官网:https://www.huaweicloud.com/product/drs.htmlQ:如何使用华为云数据库服务API进行数据传输?A:数据库服务API针对数据库的管理场景提供接口服务,并不具备数据传输能力。Q:GaussDB是否兼容现有的MySQL应用?A:GaussDB的M兼容性,兼容MySQL协议。Q:华为云数据库服务API支持哪些编程语言?A:数据库服务API是通用的Restful接口,允许不同软件系统之间进行交互,支持任何语言。数据库服务API为开发者提供了对应的SDK工具,支持主流的7种语言的能力。Q:GaussDB支持自动扩展吗?如何配置?A:云数据库GaussDB服务API支持相关场景自动扩展,详细请参考官网:https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_471.htmlQ:使用云数据库相比传统数据库,在成本上有哪些优势?A:云数据库服务相比传统的数据库,云数据库即用即买,随时退订。Q:GaussDB(for MySQL)垂直集成能力的具体实现方式是什么,它如何提升云环境下的扩展性和性能?A:包周期实例可以通过容量变更功能实现磁盘扩容可以通过规格变更到更高的CPU和内容提升性能可以通过添加只读节点的方式实现扩展性Q:在使用GaussDB时,有哪些最佳实践可以提升数据库性能?A:云数据库GaussDB服务性能调优过程需要综合考虑多方面因素,具体详情请参考GaussDB官网性能调优章节https://support.huaweicloud.com/distributed-devg-v2-gaussdb/gaussdb_v5r2c10_0221.htmlQ:华为云如何保证数据的安全性?A:华为云数据库服务采用多重防护安全方案,如:身份认证、访问控制、数据保护、监控以及恢复等,是业务数据存储和使用更加放心。Q:如何将现有的数据库迁移到华为云数据库?A:华为云数据复制服务(DRS)可以很方便的完成实例迁移,支持多种主流数据源,实现数据安全、稳定、实时、高速传输,提供极致交互体验。 详细请参考官网:https://www.huaweicloud.com/product/drs.htmlQ:华为云的GaussDB有哪些独特的优势?A:云数据库GaussDB服务主要有四个优势。1、高安全GaussDB拥有TOP级的商业数据库安全特性,如下所示,能够满足政企和金融级客户的核心安全诉求。数据动态脱敏,行级访问控制,密态计算。2、健全的工具与服务化能力GaussDB已经拥有华为云,商用服务化部署能力,同时支持DAS、DRS等生态工具。有效保障用户开发、运维、优化、监控、迁移等日常工作需要。3、全栈自研GaussDB基于鲲鹏生态,是当前国内唯一能够做到全栈自主可控的国产品牌。同时GaussDB能够基于硬件优势在底层不断进行优化,提升产品综合性能。4、开源生态GaussDB已经支持开源社区,并提供主备版版本下载。Q:GaussDB(for MySQL)支持的最大存储容量是多少,与GaussDB相比如何实现这一目标?A:云数据库GaussDB(for MySQL)服务基于华为最新一代DFV 存储,采用计算存储分离架构,支持1主15只读的高扩展性、128T的海量存储。Q:华为云数据库服务API有哪些限制?A:每一个API使用的场景约束们在API文档上有详细的说明。Q:使用华为云数据库服务API时,如何确保数据的安全性和稳定性?A:华为云api提供了两种件鉴权方式,分别为token和ak,sk的方式。在版本迭代过程中api会做到100%向前兼容。Q:GaussDB的密态计算功能是如何实现的,与其他数据库相比有何优势?A:云数据库GaussDB服务支持全密态能力,密文数据检索计算。1、数据在存储、传输、查询整个生命周期过程中均以密文形态存在。2、密钥掌握在用户自己手上,数据库管理员无法获取,加解密过程仅在客户侧完成。3、语法自动解析,应用无感知,将语法解析内置到驱动中,不需要修改原有的SQL语句、数据类型等。4、通过软硬结合可以将部分算法不进行加解密过程传递,减少硬件IO。5、通过数学算法,直接对密文进行查询,极大减少加解密时的性能损耗。详细请参考官网:cid:link_1Q:华为云数据库服务API有哪些应用场景?A:能力和控制台齐平,控制台能做的能力,api可以代替。Q:如何解决GaussDB(for MySQL)中长事务导致的锁超时问题?A:云数据库GaussDB(for MySQL)服务通过非阻塞DDL对该问题进行了相关特性的优化,详细请参考官网: https://support.huaweicloud.com/kerneldesc-gaussdbformysql/gaussdbformysql_20_0015.htmlQ:默认是一主多备的话,数据都是多副本的对吧A:是的。GaussDB(for MySQL)跨3AZ高可用部署,集群内数据3副本。Q:有没有关于数据库监控的优化A:参考官网:https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_238.htmlQ:有类似于oracle的“完全恢复”功能吗A:数据库服务支持PITR恢复,可以恢复到具体时间点。 参考官网:https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_646.htmlQ:在性能方面,GaussDB 和 GaussDB (for MySQL) 有哪些突出表现?与传统数据库相比有何优势?还有这两个的区别和核心能力呢?A:采用计算与存储分离,日志即数据架构,性能提升至开源MySQL的7倍。详情请看文档:https://support.huaweicloud.com/productdesc-gaussdbformysql/introduction.htmlQ:GaussDB for mysql,如果要把mysql的实例迁移过来,有专属软件吗A:通过华为云DRS(数据复制服务)可以很方便的完成实例迁移。Q:能否通过API获取GaussDB的实时负载,以及同时多少个连接正在查询修改。以及当前服务器资源使用率A:GaussDB提供了丰富的指标堆在在华为云监控服务上,可调用云监控服务进行查询。Q:GaussDB的API是否支持完整的CRUD操作,以及是否能够通过API实现数据库的自动化运维?A:数据库服务API接口支持数据库管理操作,不支持数据类CRUD操作。Q:认证有考试报名费用吗?A:需要的想要了解更多数据库相关知识,欢迎观看DTSE Tech Talk 系列技术直播
-
活动完成标准请注册华为云账号并完成实名认证,实验过程中请使用Chrome浏览器完成相关操作。华为云账号注册步骤请参考:cid:link_4实名认证操作步骤请参考:cid:link_21 通过CodeArts API设计语音合成接口1.1 进入CodeArts API官网,点击网页版体验并登录cid:link_51.2 创建项目1.2.1 登录后点击页面右上角的“创建项目”按钮1.2.2 在创建项目弹窗中输入项目名称:语音合成,并点击保存1.2.3 提示保存成功,点击API设计页签,进入到API设计页面1.3 设计接口1.3.1 点击页面上的“新建API接口”卡片1.3.2 显示新建标签页1.3.3 输入接口的URL:/tts1.3.4 输入接口名称:语音合成1.3.5 下拉滚动条到请求体区域,将请求的格式修改为:application/json1.3.6 显示请求体的数据结构模板,默认根节点类型为“object”1.3.7 点击根节点最右侧的“+”操作1.3.8 页面上在根节点下新增一条参数(可以通过滚动条左右拖动)1.3.9 将参数名param2修改为text,描述param2修改为待合成的文本1.3.10 下拉页面,看到返回响应区域1.3.11 同样点击根节点最右侧的“+”操作(可以通过滚动条拖动到最右侧),在根节点下显示一条新的参数1.3.12 将参数名param2修改为result,将描述修改为合成结果1.3.13 点击右上角的保存按钮1.3.14 保存成功,设计完成2 通过API Explorer调试语音合成接口,生成5段音频2.1 语音合成(API Explorer部分)链接:cid:link_32.1.1 生成语音格式为wav,采样率:8000,标准女音,语速0,音高0图1.1.1 wav标准女音2.1.2 生成语音格式为wav,采样率:16000,标准男声,语速0,音高0图1..12 wav标准男音2.1.3 生成语音格式为mp3,采样率:8000,标准女音,语速100,音高100图1.1.3 mp3标准女音2.1.4 生成语音格式为mp3,采样率:16000,标准男声,语速100,音高100图1.1.4 mp3标准男声2.1.5 生成语音格式为pcm,采样率:16000,标准男声,语速100,音高100图1.1.5 标准男声3 基于华为云自研CodeArts IDE,实现数据流转换为音频的功能3.1 打开CodeArts IDE ONLINE链接:cid:link_6点击免费体验云开发3.2 实现数据流转换为音频3.2.1 将实验用Demo工程上传到CodeArts IDE OnlineDemo工程下载链接:cid:link_11)打开CodeArts IDE Online后,左上角点击“文件”->“上传文件”:2)上传“CodeArtsProject.zip”,点击“终端”对工程进行解压3)左上角->文件->打开,打开解压后的工程目录3.2.2 在华为云控制台新增访问秘钥,配置AK/SK1)登录华为云控制台:https://console.huaweicloud.com/iam/?agencyId=599e2ee1492f48e9b69a0a682d435fb8®ion=cn-north-4&locale=zh-cn#/mine/accessKey选择“我的凭证”->“访问秘钥”->新增访问秘钥注:如果已经有AK/SK秘钥,不需要新增访问秘钥创建秘钥成功后点击“立即下载”,即可获得“credentials.csv”文件,里面可以查看到AK(Access Key Id)和SK(Secret Access Key)2)进入工程,src/main/resources下选择credentials.properties,讲AK/SK配置上3.2.3 将API Explorer上调试成功的流数据文件配置到APIResponse.json中在2.1语音合成章节,我们在API Explorer完成接口的调试cid:link_3最终生成“SIS_RunTts_ResponseBody_xxxxxxxxxxxxx.json”文件,打开json文件,复制响应体内容打开工程,进入src/main/resources中,选择APIResponse.json,将json文件的内容复制到APIResponse.json中。3.2.4 执行“should_return_audio_when_response_json”,生成mps格式音频文件:找到test目录下的测试类SisServiceTest.java,点击找到方法“should_return_audio_when_response_json()”,点击Run Test,最后可以看到目录下生成的音频文件。目录下生成“devkit.mps”文件右击下载,可以获得转换后的音频文件,实验结束
-
开发是用windows开发的,发版是Linux环境,Windows环境发版没有问题【主库】Next recovery time: 2024/1/15 17:50:50 (ERROR [01000] [unixODBC][Driver Manager]Can't open lib '/usr/lib64/psqlodbcw.so' : file not found)【主库】Next recovery time: 2024/1/15 17:41:38 (ERROR [01000] [unixODBC][Driver Manager]Can't open lib 'PostgreSQL Unicode' : file not found)
-
报错如下:/usr/bin/ld: cannot find -lavdevice /usr/bin/ld: cannot find -lavfilter collect2: error: ld returned 1 exit status make: *** [out/x86_64/libacllite.so] Error 1 在路径下THIRDPART_PATH,目前只有安装好的ffmpeg包,/usr/local/Ascend/thirdpart/aarch64/ffmpeg/环境变量如下:开发端--x86export INSTALL_DIR=/usr/local/Ascend/ascend-toolkit/latest export INSTALL_DIR_ARM=/usr/local/Ascend/ascend-toolkit/ascend-toolkit_arm/latest/aarch64-linux export PATH=$PATH:/usr/local/bin/cmake:${INSTALL_DIR}/atc/ccec_compiler/bin:${INSTALL_DIR}/atc/bin:${INSTALL_DIR}/bin:${INSTALL_DIR}/compiler/ccec_compiler/bin export LD_LIBRARY_PATH=${INSTALL_DIR}/acllib/lib64:${INSTALL_DIR}/atc/lib64:/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/runtime/lib64/stub:$LD_LIBRARY_PATH export ASCEND_OPP_PATH=${INSTALL_DIR}/opp export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest/aarch64-linux export PYTHONPATH=${INSTALL_DIR}/atc/python/site-packages:${INSTALL_DIR}/opp/built-in/op_impl/ai_core/tbe:$PYTHONPATH export TOOLCHAIN_HOME=${INSTALL_DIR}/toolkit export ASCEND_HOME_PATH=${INSTALL_DIR} export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest/arm64-linux export NPU_HOST_LIB=${DDK_PATH}/runtime/lib64/stub export CPU_ARCH=`arch` export THIRDPART_PATH=/usr/local/Ascend/thirdpart/${CPU_ARCH}
-
报错代码如下:void* AtlasEngine::CopyDataToDevice(void* data, uint32_t dataSize, aclrtMemcpyKind policy) { void* buffer = nullptr; aclError aclRet = aclrtMalloc(&buffer, dataSize, ACL_MEM_MALLOC_HUGE_FIRST); if (aclRet != ACL_SUCCESS) { ERROR_LOG("malloc device data buffer failed, aclRet is %d", aclRet); return nullptr; }根据错误码,也检查了context,返回的是create context success,是创建成功的;aclrtSetDevice(deviceId_);也是成功的, ret = aclrtCreateContext(&context_, deviceId_); if (ret != ACL_SUCCESS) { ERROR_LOG("acl create context failed, deviceId = %d, errorCode = %d", deviceId_, static_cast<int32_t>(ret)); return FAILED; } INFO_LOG("create context success");
-
重庆工程学院HCSD活动复盘总结HCSD名称:重庆工程学院校园大使姓名:肖宏城所在学校:重庆工程学院活动背景介绍活动目的及意义为进一步加强计算机专业学生的综合实力,增强计算机专业的技术水平,提高社会竞争力,以学致用,学用结合,重庆工程学院联合多专业社团开展了“华为云HCSD码上服务”活动。邀请华为云专家到场解读行业最新动态,向同学们分享前沿技术知识,热门的实验分享,场景化的动手实践,让大家充分体验到华为云产品的技术魅力。通过宣讲,以及教师团队的协助,给未接触和接触较浅的同学和老师进行宣讲,让其了解和深入学习我们华为云的一些技术,了解我们华为云的产品以及好处,加大师生对华为云的认知度,认可度以及能通过此次活动吸取更多优秀的人才进入到我们的组织。活动预期目标活动宣传辐射人数全校计算机专业同学、活动参与人数力争200余人,通过介绍华为云的技术以及产品,吸引更多的开发者使用华为API、开发工具以及一些云服务,了解华为云带来的功能以及对于自身带来的好处。活动效果目标达成情况:宣传实际辐射人数达到300余人、活动实际参与人数120余人、体验平台人数预计80人活动现场情况:活动现场学生积极进行互动和提问,对于未来个人就业发展以及行业发展趋势有一定的自我认知,扩展了对于计算机行业的多职务的认识;现场氛围良好,工作人员细心的对学生进行引导,活跃现场气氛,积极组织现场秩序,带动现场的趣味性;华为云DTSE专家热情的回答大家的问题,给大家讲解华为云以及华为的业务范围,打破大众化认知。优缺点及改进方案活动亮点现场活动氛围良好,学生富有积极性,踊跃参加开发者认证申请,积极提出华为云存在的一些不足点,帮助华为云后续的发展。活动不足及改进方案对于宣传的方式以及途径有待改进,活动的整个申请到开展以及结束过程含有多方面沟通问题,对于活动开展的校方人员等时间安排和沟通上存在不足,校方的人员因为各种活动未到场进行一定的积极作用引导,对于一些因素仍未考虑到位。活动现场照片资源的投入及使用情况资源名称数量单价总价已发放数量结余数量荣耀体脂秤511055041数据线20011220096104定制T恤1550750150ModelArts人工智能应用开发指南30501500273帆布包1525375132
-
了不起的开发者们,华为开发者大会2023已开启!7月9日,我们携手产品专家、行业大咖,和开发者们一起开创以API为核心的数字化变革,实现API全生命周期一体化协作!API是数字化转型的基石,构建一个可靠的API全生命周期管理底座是数字化企业务实之选。API运行时决定企业生存发展的质量,APIG云原生网关为API的安全、稳定、高效、智能运行全方位保驾护航。
-
【问题来源】 百信银行 【问题简要】获取指定日期内的坐席维度监控指标接接口中的数据比如接通量,外呼量,等外呼统计数据是什么逻辑计算的【问题类别】【必填】 坐席【AICC解决方案版本】【必填】 AICC 8.12.0【期望解决时间】2023/05/23【问题现象描述】【必填】 获取指定日期内的坐席维度监控指标接接口中的数据比如接通量,外呼量,等外呼统计数据,目前是不准确的,想问下具体是什么逻辑计算的
-
华为云开发者插件(Huawei Cloud Toolkit)是围绕华为云开发者生态工具体系打造的一系列IDE插件,支持华为云API能力对接、自然语言一键转换成C++、Java等标准代码、一键部署到云端等等。一、账号准备点击链接进入产品页面,点击右上角登录/注册华为云账号,查看产品介绍、帮助文档等。cid:link_3华为云API插件是Huawei Cloud Toolkit系列插件的一员,使用API插件我们可以对接华为云丰富的API能力。API插件支持当下IDE平台(IntelliJ IDEA、VS Code)以及华为IDE CodeArts。二、IDE平台支持平台:IntelliJ系列IDE或者VS Code IDE基本操作流程:API插件安装-->华为云账号登录(请提前安装底座插件)-->API插件体验API插件安装IntelliJ IDEA安装:在IntelliJ IDEA顶部菜单栏中选择File > Settings,在Settings对话框的左侧导航栏中单击Plugins。Plugins区域单击Marketplace,在搜索栏中输入Huawei Cloud API。Search Results区域会出现Huawei Cloud API,单击Install,完成后重启IDE。VS Code IDE安装:在Visual Studio Code顶部菜单栏中选择File > Preferences > Extensions,弹出VS Code IDE的Marketplace的插件列表。在搜索栏中输入Huawei Cloud API。找到Huawei Cloud API插件,选择install,完成后重启IDE。华为云账号登录使用前:请先在IDE中安装底座插件Huawei Cloud Toolkit Platform,并完成华为云账号登录。IntelliJ IDEA登录:点击左侧菜单中的Huawei Cloud Toolkit图标,打开插件主面板,选择右上角的用户头像按钮,在弹出的页面选择华为云AK/SK登录、华为账号登录或者CSDN账号登录。若选择AK/SK登录,会进入Setting面板,填入AK、SK后点击apply进行登录操作。(AK/SK获取请点击)若选择华为账号或者CSDN账号登录,会打开浏览器进入登录页面,IDE侧会同步登录结果(华为云账号注册请点击)。VS Code IDE登录:点击左侧菜单中的Huawei Cloud Toolkit图标,打开插件主面板,选择右上角的用户头像按钮,在弹出的页面选择华为云AK/SK登录或者华为账号登录。若选择AK/SK登录,则输入之前准备好的AK、SK登录华为云。(AK/SK获取请点击)若选择华为账号登录,则会跳至浏览器在web页面登录华为云账号,IDE侧会同步登录结果(华为云账号注册请点击)。API插件体验打开插件左侧主面板:点击IDEA或者VSCode左侧工具框中的"Huawei Cloud Toolkit"工具按钮、点击插件主面板中的API主页,则可打开华为云API插件主面板 。选择任意一个云服务,查看该云服务下的提供的相关API、示例代码等,详情能力请参考API插件能力。三、华为CodeArts IDE点击进入CodeArts IDE在线免费体验(需要完成华为云账号登录操作)。2)点击左侧工具栏中的华为云API图标,则可打开华为云API插件主面板。点击查看更多。
-
文章审核未通过,请给出具体原因,如何修改?内容所属频道:博客内容标题名称:Eolink Apikit 智能 Mock 解析内容链接:https://bbs.huaweicloud.com/blogs/397063
-
文章审核未通过,请给出具体原因,如何修改?发帖正文:内容所属频道:博客内容标题名称:如何在 DevOps 中进行 API 全生命周期管理?内容链接:https://bbs.huaweicloud.com/blogs/396728
-
【问题来源】【必填】 百信 问题来源这一项如果涉及隐私,可以不填 【问题简要】【必填】 查询外呼活动重试策略,返回码是401【问题类别】【必填】 座席【AICC解决方案版本】【必填】 【AICC可选择版本:AICC 8.12.0,AICC 8.13.0等】【期望解决时间】2023/04/13【问题现象描述】【必填】 调用查询外呼活动重试策略,返回码是401
-
修改外呼互动v2https://ip:port/rest/isales/v2/openapi/campaigns/{vdnId}在接口文档 表14中 retryPolicyId 重试策略id 怎么获取
-
C++使用Vector导致判题器崩溃问题描述只需要在main.cpp中加入如下代码,即会出现判题器崩溃。#include <vector> class Crash{ std::vector<int> a; }; Crash crash;运行环境及报错使用的编译指令如下为 g++ main.cpp -o main.exe使用的执行指令为 Robot_gui.exe -f SDK/c++/main.exe -m maps\1.txt使用的编译器为 MinGW64报错信息如下[INFO]D:\Project\CodeCraft2023\Robot\Game.cpp:53|Game::Init|frame[1]|Loaded workbench : 37 ReadFileEx err. 管道已结束。 [ERR]D:\Project\CodeCraft2023\Robot\Player.cpp:214|Player::HandleIOError|frame[1]|Handle IO Error [ERR]D:\Project\CodeCraft2023\Robot\Player.cpp:72|Player::PlayerCrash|frame[1]|Player crashed. [ERR]D:\Project\CodeCraft2023\Robot\Game.cpp:285|Game::Run|frame[1]|WaitForPlayerReady err. [INFO]D:\Project\CodeCraft2023\Robot\Game.cpp:528|Game::GameOver|frame[1]|player skipped frames:0 {"status":"Runtime error.","score":0}PS:由于该问题在编译过程中不会有任何报错和警告,也未查询到可能的报错原因,只有运行判题器的时候会崩溃。因此恳请主办方帮忙调查一下原因。附录附上完整的main.cpp内容。#include <iostream> using namespace std; #include <vector> class Crash{ std::vector<int> a; }; Crash crash; bool readUntilOK() { char line[1024]; while (fgets(line, sizeof line, stdin)) { if (line[0] == 'O' && line[1] == 'K') { return true; } //do something } return false; } int main() { readUntilOK(); puts("OK"); fflush(stdout); int frameID; while (scanf("%d", &frameID) != EOF) { readUntilOK(); printf("Ó55616c3-2de7-4283-8218-d1e008d73ce2n", frameID); int lineSpeed = 3; double angleSpeed = 1.5; for(int robotId = 0; robotId < 4; robotId++){ printf("forward %d Ó55616c3-2de7-4283-8218-d1e008d73ce2n", robotId, lineSpeed); printf("rotate %d ó55616c3-2de7-4283-8218-d1e008d73ce2n", robotId, angleSpeed); } printf("OK\n", frameID); fflush(stdout); } return 0; }
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签